@stamprally/admin-ui 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx"],"names":["useState","condition","jsx","jsxs","Fragment","resolveLocalizedText","updateLocalizedField","safeParseAdminConfig"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n AdminRallyConfig,\n CheckInCondition,\n LocaleDictionary,\n Reward,\n RewardUnlockCondition,\n SpotItem,\n SupportedLocale,\n} from \"@stamprally/core\";\nimport { resolveLocalizedText, safeParseAdminConfig, updateLocalizedField } from \"@stamprally/core\";\nimport { type Dispatch, type ReactElement, type SetStateAction, useState } from \"react\";\n\nexport interface AdminRallyEditorProps<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly config: AdminRallyConfig<TLocale, TMeta>;\n readonly onChange: (config: AdminRallyConfig<TLocale, TMeta>) => void;\n readonly locale?: string;\n readonly dictionary?: LocaleDictionary<TLocale>;\n}\n\nexport interface UseAdminRallyEditorOptions<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly onChange?: (config: AdminRallyConfig<TLocale, TMeta>) => void;\n}\nexport interface UseAdminRallyEditorReturn<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly config: AdminRallyConfig<TLocale, TMeta>;\n readonly setConfig: Dispatch<SetStateAction<AdminRallyConfig<TLocale, TMeta>>>;\n readonly update: (patch: Partial<AdminRallyConfig<TLocale, TMeta>>) => void;\n readonly updateSpot: (spotId: string, patch: Partial<SpotItem<TLocale, TMeta>>) => void;\n readonly updateReward: (rewardId: string, patch: Partial<Reward<TLocale>>) => void;\n readonly reset: () => void;\n readonly isDirty: boolean;\n}\n\n/** Headless state and immutable update helpers for CMS integrations. */\nexport function useAdminRallyEditor<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>(\n initialConfig: AdminRallyConfig<TLocale, TMeta>,\n options: UseAdminRallyEditorOptions<TLocale, TMeta> = {},\n): UseAdminRallyEditorReturn<TLocale, TMeta> {\n const [config, setConfig] = useState(initialConfig);\n const update = (patch: Partial<AdminRallyConfig<TLocale, TMeta>>): void => {\n setConfig((current) => {\n const next = { ...current, ...patch };\n options.onChange?.(next);\n return next;\n });\n };\n const updateSpot = (spotId: string, patch: Partial<SpotItem<TLocale, TMeta>>): void => {\n update({\n spots: config.spots.map((spot) => (spot.id === spotId ? { ...spot, ...patch } : spot)),\n });\n };\n const updateReward = (rewardId: string, patch: Partial<Reward<TLocale>>): void => {\n update({\n rewards: config.rewards.map((reward) =>\n reward.id === rewardId ? { ...reward, ...patch } : reward,\n ),\n });\n };\n return {\n config,\n setConfig,\n update,\n updateSpot,\n updateReward,\n reset: () => setConfig(initialConfig),\n isDirty: config !== initialConfig,\n };\n}\n\nexport interface EntityEditorOptions<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> extends UseAdminRallyEditorOptions<TLocale, TMeta> {\n readonly config?: AdminRallyConfig<TLocale, TMeta>;\n readonly initialConfig?: AdminRallyConfig<TLocale, TMeta>;\n}\nexport interface SpotEditorReturn<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly config: AdminRallyConfig<TLocale, TMeta> | undefined;\n readonly spot: SpotItem<TLocale, TMeta> | undefined;\n readonly setConfig: Dispatch<SetStateAction<AdminRallyConfig<TLocale, TMeta> | undefined>>;\n readonly update: (patch: Partial<SpotItem<TLocale, TMeta>>) => void;\n readonly remove: () => void;\n}\n\nexport function useSpotEditor<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>(\n spotId: string,\n options: EntityEditorOptions<TLocale, TMeta> = {},\n): SpotEditorReturn<TLocale, TMeta> {\n const [config, setConfig] = useState<AdminRallyConfig<TLocale, TMeta> | undefined>(\n options.config ?? options.initialConfig,\n );\n const commit = (next: AdminRallyConfig<TLocale, TMeta>): void => {\n setConfig(next);\n options.onChange?.(next);\n };\n const spot = config?.spots.find((item) => item.id === spotId);\n return {\n config,\n spot,\n setConfig,\n update: (patch) => {\n if (config === undefined || spot === undefined) return;\n commit({\n ...config,\n spots: config.spots.map((item) => (item.id === spotId ? { ...item, ...patch } : item)),\n });\n },\n remove: () => {\n if (config === undefined || spot === undefined) return;\n commit({ ...config, spots: config.spots.filter((item) => item.id !== spotId) });\n },\n };\n}\n\nexport function useRewardEditor<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>(\n rewardId: string,\n options: EntityEditorOptions<TLocale, TMeta> = {},\n): {\n readonly config: AdminRallyConfig<TLocale, TMeta> | undefined;\n readonly reward: Reward<TLocale> | undefined;\n readonly setConfig: Dispatch<SetStateAction<AdminRallyConfig<TLocale, TMeta> | undefined>>;\n readonly update: (patch: Partial<Reward<TLocale>>) => void;\n readonly remove: () => void;\n} {\n const [config, setConfig] = useState<AdminRallyConfig<TLocale, TMeta> | undefined>(\n options.config ?? options.initialConfig,\n );\n const reward = config?.rewards.find((item) => item.id === rewardId);\n const commit = (next: AdminRallyConfig<TLocale, TMeta>): void => {\n setConfig(next);\n options.onChange?.(next);\n };\n return {\n config,\n reward,\n setConfig,\n update: (patch) => {\n if (config === undefined || reward === undefined) return;\n commit({\n ...config,\n rewards: config.rewards.map((item) =>\n item.id === rewardId ? { ...item, ...patch } : item,\n ),\n });\n },\n remove: () => {\n if (config === undefined || reward === undefined) return;\n commit({ ...config, rewards: config.rewards.filter((item) => item.id !== rewardId) });\n },\n };\n}\n\ntype DictionaryProps<TLocale extends string> = {\n readonly locale?: NoInfer<TLocale>;\n readonly dictionary?: LocaleDictionary<TLocale>;\n};\n\nfunction text<TLocale extends string>(\n dictionary: LocaleDictionary<TLocale> | undefined,\n locale: TLocale,\n key: string,\n fallback: string,\n): string {\n return dictionary?.[locale]?.[key] ?? fallback;\n}\n\nconst condition = (): CheckInCondition => ({ type: \"passcode\", code: \"\" });\nconst newSpot = <TLocale extends string, TMeta extends Record<string, unknown>>(\n index: number,\n): SpotItem<TLocale, TMeta> => ({\n id: `spot-${index + 1}`,\n orderIndex: index,\n name: `Spot ${index + 1}`,\n conditions: [condition()],\n});\nconst newReward = (index: number): Reward => ({\n id: `reward-${index + 1}`,\n title: `Reward ${index + 1}`,\n type: \"digital\",\n redemptionMethod: \"server_claim\",\n requiredStampCount: index + 1,\n});\n\nfunction move<T>(items: ReadonlyArray<T>, index: number, direction: -1 | 1): ReadonlyArray<T> {\n const target = index + direction;\n if (target < 0 || target >= items.length) return items;\n const next = [...items];\n const [item] = next.splice(index, 1);\n if (item !== undefined) next.splice(target, 0, item);\n return next;\n}\n\nexport interface ConditionEditorProps<TLocale extends string = SupportedLocale>\n extends DictionaryProps<TLocale> {\n readonly condition: CheckInCondition;\n readonly onChange: (condition: CheckInCondition) => void;\n readonly onRemove?: () => void;\n}\n\nexport function ConditionEditor<TLocale extends string = SupportedLocale>({\n condition,\n onChange,\n onRemove,\n locale,\n dictionary,\n}: ConditionEditorProps<TLocale>): ReactElement {\n const activeLocale = locale ?? (\"en\" as TLocale);\n const field = (key: string, fallback: string): string =>\n text(dictionary, activeLocale, key, fallback);\n return (\n <fieldset>\n <legend>{field(\"condition\", \"Condition\")}</legend>\n <label>\n {field(\"conditionType\", \"Type\")}\n <select\n value={condition.type}\n onChange={(event) => {\n const type = event.target.value as CheckInCondition[\"type\"];\n onChange(\n type === \"qr\"\n ? { type, secretToken: \"\" }\n : type === \"passcode\"\n ? { type, code: \"\", caseSensitive: false }\n : type === \"gps\"\n ? { type, latitude: 0, longitude: 0, radiusMeters: 100 }\n : type === \"nfc\"\n ? { type, tagId: \"\" }\n : { type, validatorName: \"\" },\n );\n }}\n >\n {([\"qr\", \"passcode\", \"gps\", \"nfc\", \"custom\"] as const).map((type) => (\n <option key={type} value={type}>\n {field(`condition.${type}`, type.toUpperCase())}\n </option>\n ))}\n </select>\n </label>\n {condition.type === \"qr\" && (\n <>\n <label>\n {field(\"secretToken\", \"QR token\")}\n <input\n value={condition.secretToken}\n onChange={(event) => onChange({ ...condition, secretToken: event.target.value })}\n />\n </label>\n <label>\n {field(\"qrEntryUrl\", \"QR entry URL\")}\n <input\n value={condition.qrEntryUrl ?? \"\"}\n onChange={(event) => onChange({ ...condition, qrEntryUrl: event.target.value })}\n />\n </label>\n </>\n )}\n {condition.type === \"passcode\" && (\n <>\n <label>\n {field(\"passcode\", \"Passcode\")}\n <input\n value={condition.code}\n onChange={(event) => onChange({ ...condition, code: event.target.value })}\n />\n </label>\n <label>\n <input\n type=\"checkbox\"\n checked={condition.caseSensitive ?? false}\n onChange={(event) => onChange({ ...condition, caseSensitive: event.target.checked })}\n />\n {field(\"caseSensitive\", \"Case sensitive\")}\n </label>\n </>\n )}\n {condition.type === \"gps\" && (\n <div>\n {([\"latitude\", \"longitude\", \"radiusMeters\"] as const).map((key) => (\n <label key={key}>\n {field(key, key)}\n <input\n type=\"number\"\n value={condition[key]}\n onChange={(event) => onChange({ ...condition, [key]: Number(event.target.value) })}\n />\n </label>\n ))}\n </div>\n )}\n {condition.type === \"nfc\" && (\n <label>\n {field(\"tagId\", \"NFC tag ID\")}\n <input\n value={condition.tagId}\n onChange={(event) => onChange({ ...condition, tagId: event.target.value })}\n />\n </label>\n )}\n {condition.type === \"custom\" && (\n <label>\n {field(\"validatorName\", \"Validator name\")}\n <input\n value={condition.validatorName}\n onChange={(event) => onChange({ ...condition, validatorName: event.target.value })}\n />\n </label>\n )}\n {onRemove !== undefined && (\n <button type=\"button\" onClick={onRemove}>\n {field(\"removeCondition\", \"Remove condition\")}\n </button>\n )}\n </fieldset>\n );\n}\n\nexport interface SpotItemFormProps<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> extends DictionaryProps<TLocale> {\n readonly spot: SpotItem<TLocale, TMeta>;\n readonly onChange: (spot: SpotItem<TLocale, TMeta>) => void;\n readonly onRemove?: () => void;\n}\n\nexport function SpotItemForm<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>({\n spot,\n onChange,\n onRemove,\n locale,\n dictionary,\n}: SpotItemFormProps<TLocale, TMeta>): ReactElement {\n const activeLocale = locale ?? (\"en\" as TLocale);\n const field = (key: string, fallback: string): string =>\n text(dictionary, activeLocale, key, fallback);\n const update = (patch: Partial<SpotItem<TLocale, TMeta>>): void =>\n onChange({ ...spot, ...patch });\n return (\n <fieldset>\n <legend>{resolveLocalizedText(spot.name, activeLocale)}</legend>\n <label>\n {field(\"spotName\", \"Spot name\")}\n <input\n value={resolveLocalizedText(spot.name, activeLocale)}\n onChange={(event) =>\n update({ name: updateLocalizedField(spot.name, activeLocale, event.target.value) })\n }\n />\n </label>\n {([\"description\", \"hint\"] as const).map((key) => (\n <label key={key}>\n {field(key, key)}\n <textarea\n value={resolveLocalizedText(spot[key] ?? \"\", activeLocale)}\n onChange={(event) =>\n update({\n [key]: updateLocalizedField(spot[key] ?? \"\", activeLocale, event.target.value),\n })\n }\n />\n </label>\n ))}\n {([\"imageUrl\", \"iconUrl\", \"redirectUrlAfterClaim\"] as const).map((key) => (\n <label key={key}>\n {field(key, key)}\n <input\n value={spot[key] ?? \"\"}\n onChange={(event) => update({ [key]: event.target.value })}\n />\n </label>\n ))}\n <label>\n {field(\"prerequisites\", \"Prerequisite spots\")}\n <input\n value={spot.prerequisites?.join(\", \") ?? \"\"}\n onChange={(event) =>\n update({\n prerequisites: event.target.value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean),\n })\n }\n />\n </label>\n <label>\n {field(\"externalReferences\", \"External references\")}\n <textarea\n value={JSON.stringify(spot.externalReferences ?? [], null, 2)}\n onChange={(event) => {\n try {\n const parsed: unknown = JSON.parse(event.target.value);\n if (Array.isArray(parsed)) update({ externalReferences: parsed });\n } catch {\n // Keep the text editable until the JSON is complete.\n }\n }}\n />\n </label>\n <label>\n {field(\"metadata\", \"Metadata\")}\n <textarea\n value={JSON.stringify(spot.metadata ?? {}, null, 2)}\n onChange={(event) => {\n try {\n const parsed: unknown = JSON.parse(event.target.value);\n if (parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed))\n update({ metadata: parsed as TMeta });\n } catch {\n // Keep the text editable until the JSON is complete.\n }\n }}\n />\n </label>\n {spot.conditions.map((item, index) => (\n <ConditionEditor\n key={`${spot.id}-condition-${JSON.stringify(item)}`}\n condition={item}\n locale={activeLocale}\n {...(dictionary === undefined ? {} : { dictionary })}\n onChange={(next) =>\n update({\n conditions: spot.conditions.map((current, itemIndex) =>\n itemIndex === index ? next : current,\n ),\n })\n }\n {...(spot.conditions.length <= 1\n ? {}\n : {\n onRemove: () =>\n update({\n conditions: spot.conditions.filter((_, itemIndex) => itemIndex !== index),\n }),\n })}\n />\n ))}\n <button\n type=\"button\"\n onClick={() => update({ conditions: [...spot.conditions, condition()] })}\n >\n {field(\"addCondition\", \"Add condition\")}\n </button>\n {onRemove !== undefined && (\n <button type=\"button\" onClick={onRemove}>\n {field(\"removeSpot\", \"Remove spot\")}\n </button>\n )}\n </fieldset>\n );\n}\n\nfunction RewardItemForm<TLocale extends string = SupportedLocale>({\n reward,\n locale,\n dictionary,\n onChange,\n onRemove,\n}: {\n readonly reward: Reward<TLocale>;\n readonly locale: TLocale;\n readonly dictionary?: LocaleDictionary<TLocale>;\n readonly onChange: (reward: Reward<TLocale>) => void;\n readonly onRemove: () => void;\n}): ReactElement {\n const field = (key: string, fallback: string): string => text(dictionary, locale, key, fallback);\n return (\n <fieldset>\n <legend>{resolveLocalizedText(reward.title, locale)}</legend>\n <label>\n {field(\"rewardTitle\", \"Reward title\")}\n <input\n value={resolveLocalizedText(reward.title, locale)}\n onChange={(event) =>\n onChange({\n ...reward,\n title: updateLocalizedField(reward.title, locale, event.target.value),\n })\n }\n />\n </label>\n <label>\n {field(\"description\", \"Description\")}\n <textarea\n value={resolveLocalizedText(reward.description ?? \"\", locale)}\n onChange={(event) =>\n onChange({\n ...reward,\n description: updateLocalizedField(\n reward.description ?? \"\",\n locale,\n event.target.value,\n ),\n })\n }\n />\n </label>\n <label>\n {field(\"requiredSpotCount\", \"Required spot count\")}\n <input\n type=\"number\"\n min={0}\n value={reward.requiredStampCount}\n onChange={(event) =>\n onChange({ ...reward, requiredStampCount: Number(event.target.value) })\n }\n />\n </label>\n <label>\n {field(\"rewardType\", \"Reward type\")}\n <select\n value={reward.type}\n onChange={(event) => onChange({ ...reward, type: event.target.value as Reward[\"type\"] })}\n >\n <option value=\"digital\">{field(\"rewardType.digital\", \"Digital\")}</option>\n <option value=\"in_person\">{field(\"rewardType.inPerson\", \"In person\")}</option>\n </select>\n </label>\n <label>\n {field(\"redemptionMethod\", \"Redemption method\")}\n <select\n value={reward.redemptionMethod}\n onChange={(event) =>\n onChange({\n ...reward,\n redemptionMethod: event.target.value as Reward[\"redemptionMethod\"],\n })\n }\n >\n <option value=\"server_claim\">{field(\"redemption.serverClaim\", \"Server claim\")}</option>\n <option value=\"manual_slide\">{field(\"redemption.manualSlide\", \"Manual slide\")}</option>\n <option value=\"staff_passcode\">\n {field(\"redemption.staffPasscode\", \"Staff passcode\")}\n </option>\n <option value=\"view_only\">{field(\"redemption.viewOnly\", \"View only\")}</option>\n </select>\n </label>\n <label>\n {field(\"unlockConditions\", \"Unlock conditions\")}\n <textarea\n value={JSON.stringify(reward.conditions ?? [], null, 2)}\n onChange={(event) => {\n try {\n const parsed: unknown = JSON.parse(event.target.value);\n if (Array.isArray(parsed))\n onChange({ ...reward, conditions: parsed as ReadonlyArray<RewardUnlockCondition> });\n } catch {\n // Keep the text editable until the JSON is complete.\n }\n }}\n />\n </label>\n {([\"stockLimit\", \"userClaimLimit\"] as const).map((key) => (\n <label key={key}>\n {field(key, key)}\n <input\n type=\"number\"\n min={0}\n value={reward[key] ?? \"\"}\n onChange={(event) => {\n if (event.target.value === \"\") {\n const { [key]: _removed, ...withoutLimit } = reward;\n onChange(withoutLimit);\n } else onChange({ ...reward, [key]: Number(event.target.value) });\n }}\n />\n </label>\n ))}\n <label>\n {field(\"digitalContentUrl\", \"Digital content URL\")}\n <input\n value={reward.digitalContentUrl ?? \"\"}\n onChange={(event) => onChange({ ...reward, digitalContentUrl: event.target.value })}\n />\n </label>\n <label>\n {field(\"staffPasscode\", \"Staff passcode\")}\n <input\n value={reward.staffPasscode ?? \"\"}\n onChange={(event) => onChange({ ...reward, staffPasscode: event.target.value })}\n />\n </label>\n <label>\n {field(\"validUntil\", \"Valid until\")}\n <input\n type=\"datetime-local\"\n value={reward.validUntil?.slice(0, 16) ?? \"\"}\n onChange={(event) => {\n if (event.target.value === \"\") {\n const { validUntil: _removed, ...withoutDate } = reward;\n onChange(withoutDate);\n } else onChange({ ...reward, validUntil: new Date(event.target.value).toISOString() });\n }}\n />\n </label>\n <button type=\"button\" onClick={onRemove}>\n {field(\"removeReward\", \"Remove reward\")}\n </button>\n </fieldset>\n );\n}\n\nexport function AdminRallyEditor<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>({ config, onChange, locale, dictionary }: AdminRallyEditorProps<TLocale, TMeta>): ReactElement {\n const activeLocale = (locale ?? \"en\") as TLocale;\n const field = (key: string, fallback: string): string =>\n text(dictionary, activeLocale, key, fallback);\n const update = (next: Partial<AdminRallyConfig<TLocale, TMeta>>): void =>\n onChange({ ...config, ...next });\n const updateSpots = (spots: ReadonlyArray<SpotItem<TLocale, TMeta>>): void =>\n update({ spots: spots.map((spot, index) => ({ ...spot, orderIndex: index })) });\n return (\n <section aria-label={field(\"rallyEditor\", \"Rally editor\")}>\n <h1>{resolveLocalizedText(config.title, activeLocale)}</h1>\n <label>\n {field(\"title\", \"Title\")}\n <input\n value={resolveLocalizedText(config.title, activeLocale)}\n onChange={(event) =>\n update({ title: updateLocalizedField(config.title, activeLocale, event.target.value) })\n }\n />\n </label>\n <label>\n {field(\"description\", \"Description\")}\n <textarea\n value={resolveLocalizedText(config.description ?? \"\", activeLocale)}\n onChange={(event) =>\n update({\n description: updateLocalizedField(\n config.description ?? \"\",\n activeLocale,\n event.target.value,\n ),\n })\n }\n />\n </label>\n <label>\n {field(\"theme\", \"Theme (JSON)\")}\n <textarea\n aria-label={field(\"theme\", \"Theme (JSON)\")}\n value={JSON.stringify(config.theme ?? {}, null, 2)}\n onChange={(event) => {\n try {\n const parsed: unknown = JSON.parse(event.target.value);\n if (parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed))\n update({ theme: parsed as NonNullable<AdminRallyConfig[\"theme\"]> });\n } catch {\n // Keep the text editable until the JSON is complete.\n }\n }}\n />\n </label>\n {([\"serverEndpoint\", \"publicMetadata\", \"serverMetadata\"] as const).map((key) => (\n <label key={key}>\n {field(key, key)}\n <textarea\n value={\n key === \"serverEndpoint\"\n ? (config.serverEndpoint ?? \"\")\n : JSON.stringify(config[key] ?? {}, null, 2)\n }\n onChange={(event) => {\n if (key === \"serverEndpoint\") {\n update({ serverEndpoint: event.target.value });\n return;\n }\n try {\n const parsed: unknown = JSON.parse(event.target.value);\n if (parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed))\n update({ [key]: parsed });\n } catch {\n // Keep the text editable until the JSON is complete.\n }\n }}\n />\n </label>\n ))}\n <button\n type=\"button\"\n onClick={() => updateSpots([...config.spots, newSpot<TLocale, TMeta>(config.spots.length)])}\n >\n {field(\"addSpot\", \"Add spot\")}\n </button>\n <div>\n {config.spots.map((spot, index) => (\n <div key={spot.id}>\n <SpotItemForm<TLocale, TMeta>\n spot={spot}\n locale={activeLocale}\n {...(dictionary === undefined ? {} : { dictionary })}\n onChange={(next) =>\n updateSpots(\n config.spots.map((current) => (current.id === spot.id ? next : current)),\n )\n }\n onRemove={() => updateSpots(config.spots.filter((current) => current.id !== spot.id))}\n />\n <button\n type=\"button\"\n disabled={index === 0}\n onClick={() => updateSpots(move(config.spots, index, -1))}\n >\n {field(\"moveUp\", \"Move up\")}\n </button>\n <button\n type=\"button\"\n disabled={index === config.spots.length - 1}\n onClick={() => updateSpots(move(config.spots, index, 1))}\n >\n {field(\"moveDown\", \"Move down\")}\n </button>\n </div>\n ))}\n </div>\n <button\n type=\"button\"\n onClick={() => update({ rewards: [...config.rewards, newReward(config.rewards.length)] })}\n >\n {field(\"addReward\", \"Add reward\")}\n </button>\n <div>\n {config.rewards.map((reward) => (\n <RewardItemForm\n key={reward.id}\n reward={reward}\n locale={activeLocale}\n {...(dictionary === undefined ? {} : { dictionary })}\n onChange={(next) =>\n update({\n rewards: config.rewards.map((current) =>\n current.id === reward.id ? next : current,\n ),\n })\n }\n onRemove={() =>\n update({ rewards: config.rewards.filter((current) => current.id !== reward.id) })\n }\n />\n ))}\n </div>\n </section>\n );\n}\n\nexport const RallyEditor = AdminRallyEditor;\n\nexport interface GeneralSettingsFormProps<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> extends DictionaryProps<TLocale> {\n readonly config: AdminRallyConfig<TLocale, TMeta>;\n readonly onChange: (config: AdminRallyConfig<TLocale, TMeta>) => void;\n}\nexport function GeneralSettingsForm<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>({\n config,\n onChange,\n locale,\n dictionary,\n}: GeneralSettingsFormProps<TLocale, TMeta>): ReactElement {\n const activeLocale = locale ?? (\"en\" as TLocale);\n return (\n <label>\n {text(dictionary, activeLocale, \"title\", \"Rally title\")}\n <input\n value={resolveLocalizedText(config.title, activeLocale)}\n onChange={(event) =>\n onChange({\n ...config,\n title: updateLocalizedField(config.title, activeLocale, event.target.value),\n })\n }\n />\n </label>\n );\n}\n\nexport interface JsonConfigIOProps<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> extends DictionaryProps<TLocale> {\n readonly config: AdminRallyConfig<TLocale, TMeta>;\n readonly onImport: (config: AdminRallyConfig<TLocale, TMeta>) => void;\n}\nexport function JsonConfigIO<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>({ config, onImport, locale, dictionary }: JsonConfigIOProps<TLocale, TMeta>): ReactElement {\n const activeLocale = locale ?? (\"en\" as TLocale);\n const [value, setValue] = useState(() => JSON.stringify(config, null, 2));\n const [errors, setErrors] = useState<\n ReadonlyArray<{ readonly path: string; readonly message: string }>\n >([]);\n const field = (key: string, fallback: string): string =>\n text(dictionary, activeLocale, key, fallback);\n return (\n <div>\n <textarea\n aria-label={field(\"jsonConfig\", \"JSON configuration\")}\n value={value}\n onChange={(event) => {\n setValue(event.target.value);\n setErrors([]);\n }}\n />\n <button\n type=\"button\"\n onClick={() => {\n try {\n const result = safeParseAdminConfig(JSON.parse(value));\n if (!result.success) {\n setErrors(result.errors);\n return;\n }\n onImport(result.data as AdminRallyConfig<TLocale, TMeta>);\n setErrors([]);\n } catch {\n setErrors([{ path: \"$\", message: field(\"invalidJson\", \"Invalid JSON.\") }]);\n }\n }}\n >\n {field(\"import\", \"Import\")}\n </button>\n {errors.length > 0 && (\n <ul role=\"alert\">\n {errors.map((error) => (\n <li key={`${error.path}-${error.message}`}>\n {error.path}: {error.message}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/index.tsx"],"names":["updateLocalizedField","useRef","useState","useCallback","field","condition","jsx","jsxs","Fragment","resolveLocalizedText","DEFAULT_SHEET_THEME","safeParseAdminConfig"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n AdminRallyConfig,\n CheckInCondition,\n ExternalReference,\n LocaleDictionary,\n LocalizedText,\n Reward,\n RewardUnlockCondition,\n SheetTheme,\n SpotItem,\n SupportedLocale,\n} from \"@stamprally/core\";\nimport {\n DEFAULT_SHEET_THEME,\n resolveLocalizedText,\n safeParseAdminConfig,\n updateLocalizedField,\n} from \"@stamprally/core\";\nimport {\n type Dispatch,\n type ReactElement,\n type SetStateAction,\n useCallback,\n useRef,\n useState,\n} from \"react\";\n\nexport interface AdminRallyEditorProps<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly config: AdminRallyConfig<TLocale, TMeta>;\n readonly onChange: (config: AdminRallyConfig<TLocale, TMeta>) => void;\n readonly locale?: string;\n readonly dictionary?: LocaleDictionary<TLocale>;\n}\n\nexport interface UseAdminRallyEditorOptions<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly onChange?: (config: AdminRallyConfig<TLocale, TMeta>) => void;\n}\nexport interface UseAdminRallyEditorReturn<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly config: AdminRallyConfig<TLocale, TMeta>;\n readonly setConfig: Dispatch<SetStateAction<AdminRallyConfig<TLocale, TMeta>>>;\n readonly update: (patch: Partial<AdminRallyConfig<TLocale, TMeta>>) => void;\n readonly updateSpot: (spotId: string, patch: Partial<SpotItem<TLocale, TMeta>>) => void;\n readonly updateReward: (rewardId: string, patch: Partial<Reward<TLocale>>) => void;\n readonly addSpot: (spotData?: Partial<SpotItem<TLocale, TMeta>>) => void;\n readonly removeSpot: (spotId: string) => void;\n readonly reorderSpots: (fromIndex: number, toIndex: number) => void;\n readonly duplicateSpot: (spotId: string) => void;\n readonly addReward: (rewardData?: Partial<Reward<TLocale>>) => void;\n readonly removeReward: (rewardId: string) => void;\n readonly duplicateReward: (rewardId: string) => void;\n readonly addCondition: (spotId: string, nextCondition: CheckInCondition) => void;\n readonly removeCondition: (spotId: string, conditionIndex: number) => void;\n readonly updateLocalizedField: (path: string, locale: TLocale, value: string) => void;\n readonly undo: () => void;\n readonly redo: () => void;\n readonly canUndo: boolean;\n readonly canRedo: boolean;\n readonly resetConfig: (newConfig: AdminRallyConfig<TLocale, TMeta>) => void;\n readonly reset: () => void;\n readonly isDirty: boolean;\n}\n\ntype EditorHistory<T> = {\n readonly past: ReadonlyArray<T>;\n readonly present: T;\n readonly future: ReadonlyArray<T>;\n};\n\nfunction nextEntityId(prefix: string, ids: ReadonlySet<string>): string {\n let index = ids.size + 1;\n let candidate = `${prefix}-${index}`;\n while (ids.has(candidate)) {\n index += 1;\n candidate = `${prefix}-${index}`;\n }\n return candidate;\n}\n\nfunction pathParts(path: string): string[] {\n return path\n .replaceAll(\"[\", \".\")\n .replaceAll(\"]\", \"\")\n .split(\".\")\n .filter((part) => part !== \"\");\n}\n\nfunction localizedValue<TLocale extends string>(\n value: unknown,\n locale: TLocale,\n nextValue: string,\n): LocalizedText<TLocale> {\n return updateLocalizedField(\n typeof value === \"string\" || (typeof value === \"object\" && value !== null)\n ? (value as LocalizedText<TLocale>)\n : \"\",\n locale,\n nextValue,\n );\n}\n\n/** Headless state and immutable update helpers for CMS integrations. */\nexport function useAdminRallyEditor<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>(\n initialConfig: AdminRallyConfig<TLocale, TMeta>,\n options: UseAdminRallyEditorOptions<TLocale, TMeta> = {},\n): UseAdminRallyEditorReturn<TLocale, TMeta> {\n const initialRef = useRef(initialConfig);\n const [history, setHistory] = useState<EditorHistory<AdminRallyConfig<TLocale, TMeta>>>({\n past: [],\n present: initialConfig,\n future: [],\n });\n const config = history.present;\n const commit = useCallback(\n (value: SetStateAction<AdminRallyConfig<TLocale, TMeta>>): void => {\n setHistory((current) => {\n const next = typeof value === \"function\" ? value(current.present) : value;\n if (next === current.present) return current;\n options.onChange?.(next);\n return { past: [...current.past, current.present], present: next, future: [] };\n });\n },\n [options.onChange],\n );\n const setConfig: Dispatch<SetStateAction<AdminRallyConfig<TLocale, TMeta>>> = commit;\n const update = (patch: Partial<AdminRallyConfig<TLocale, TMeta>>): void =>\n commit((current) => ({ ...current, ...patch }));\n const updateSpot = (spotId: string, patch: Partial<SpotItem<TLocale, TMeta>>): void =>\n commit((current) => ({\n ...current,\n spots: current.spots.map((spot) => (spot.id === spotId ? { ...spot, ...patch } : spot)),\n }));\n const updateReward = (rewardId: string, patch: Partial<Reward<TLocale>>): void =>\n commit((current) => ({\n ...current,\n rewards: current.rewards.map((reward) =>\n reward.id === rewardId ? { ...reward, ...patch } : reward,\n ),\n }));\n const addSpot = (spotData: Partial<SpotItem<TLocale, TMeta>> = {}): void =>\n commit((current) => {\n const id = spotData.id ?? nextEntityId(\"spot\", new Set(current.spots.map((spot) => spot.id)));\n const base = newSpot<TLocale, TMeta>(current.spots.length);\n return {\n ...current,\n spots: [...current.spots, { ...base, ...spotData, id, orderIndex: current.spots.length }],\n };\n });\n const removeSpot = (spotId: string): void =>\n commit((current) => ({\n ...current,\n spots: current.spots\n .filter((spot) => spot.id !== spotId)\n .map((spot, index) => ({ ...spot, orderIndex: index })),\n }));\n const reorderSpots = (fromIndex: number, toIndex: number): void =>\n commit((current) => ({ ...current, spots: moveTo(current.spots, fromIndex, toIndex) }));\n const duplicateSpot = (spotId: string): void =>\n commit((current) => {\n const source = current.spots.find((spot) => spot.id === spotId);\n if (source === undefined) return current;\n const id = nextEntityId(\"spot-copy\", new Set(current.spots.map((spot) => spot.id)));\n const copy = { ...structuredClone(source), id, orderIndex: current.spots.length };\n return { ...current, spots: [...current.spots, copy] };\n });\n const addReward = (rewardData: Partial<Reward<TLocale>> = {}): void =>\n commit((current) => {\n const id =\n rewardData.id ?? nextEntityId(\"reward\", new Set(current.rewards.map((item) => item.id)));\n return {\n ...current,\n rewards: [...current.rewards, { ...newReward(current.rewards.length), ...rewardData, id }],\n };\n });\n const removeReward = (rewardId: string): void =>\n commit((current) => ({\n ...current,\n rewards: current.rewards.filter((item) => item.id !== rewardId),\n }));\n const duplicateReward = (rewardId: string): void =>\n commit((current) => {\n const source = current.rewards.find((reward) => reward.id === rewardId);\n if (source === undefined) return current;\n const id = nextEntityId(\"reward-copy\", new Set(current.rewards.map((item) => item.id)));\n return { ...current, rewards: [...current.rewards, { ...structuredClone(source), id }] };\n });\n const addCondition = (spotId: string, nextCondition: CheckInCondition): void =>\n commit((current) => ({\n ...current,\n spots: current.spots.map((spot) =>\n spot.id !== spotId\n ? spot\n : { ...spot, conditions: [...spot.conditions, structuredClone(nextCondition)] },\n ),\n }));\n const removeCondition = (spotId: string, conditionIndex: number): void =>\n commit((current) => ({\n ...current,\n spots: current.spots.map((spot) =>\n spot.id !== spotId\n ? spot\n : { ...spot, conditions: spot.conditions.filter((_, index) => index !== conditionIndex) },\n ),\n }));\n const updateLocalized = (path: string, locale: TLocale, value: string): void =>\n commit((current) => {\n const parts = pathParts(path);\n if (parts[0] === \"spots\" && parts.length >= 3) {\n const requestedIndex = parts[1];\n const index =\n requestedIndex !== undefined && /^\\d+$/.test(requestedIndex)\n ? Number(requestedIndex)\n : current.spots.findIndex((spot) => spot.id === requestedIndex);\n const field = parts[2];\n if (index < 0 || field === undefined || current.spots[index] === undefined) return current;\n return {\n ...current,\n spots: current.spots.map((spot, spotIndex) =>\n spotIndex === index\n ? {\n ...spot,\n [field]: localizedValue(spot[field as keyof typeof spot], locale, value),\n }\n : spot,\n ),\n };\n }\n if (parts[0] === \"rewards\" && parts.length >= 3) {\n const requestedIndex = parts[1];\n const index =\n requestedIndex !== undefined && /^\\d+$/.test(requestedIndex)\n ? Number(requestedIndex)\n : current.rewards.findIndex((reward) => reward.id === requestedIndex);\n const field = parts[2];\n if (index < 0 || field === undefined || current.rewards[index] === undefined)\n return current;\n return {\n ...current,\n rewards: current.rewards.map((reward, rewardIndex) =>\n rewardIndex === index\n ? {\n ...reward,\n [field]: localizedValue(reward[field as keyof typeof reward], locale, value),\n }\n : reward,\n ),\n };\n }\n const field = parts[0];\n if (field === undefined) return current;\n return {\n ...current,\n [field]: localizedValue(current[field as keyof typeof current], locale, value),\n };\n });\n const undo = (): void =>\n setHistory((current) => {\n const previous = current.past.at(-1);\n if (previous === undefined) return current;\n options.onChange?.(previous);\n return {\n past: current.past.slice(0, -1),\n present: previous,\n future: [current.present, ...current.future],\n };\n });\n const redo = (): void =>\n setHistory((current) => {\n const next = current.future[0];\n if (next === undefined) return current;\n options.onChange?.(next);\n return {\n past: [...current.past, current.present],\n present: next,\n future: current.future.slice(1),\n };\n });\n const resetConfig = (newConfig: AdminRallyConfig<TLocale, TMeta>): void => {\n initialRef.current = newConfig;\n setHistory({ past: [], present: newConfig, future: [] });\n options.onChange?.(newConfig);\n };\n return {\n config,\n setConfig,\n update,\n updateSpot,\n updateReward,\n addSpot,\n removeSpot,\n reorderSpots: (fromIndex, toIndex) => reorderSpots(fromIndex, toIndex),\n duplicateSpot,\n addReward,\n removeReward,\n duplicateReward,\n addCondition,\n removeCondition,\n updateLocalizedField: updateLocalized,\n undo,\n redo,\n canUndo: history.past.length > 0,\n canRedo: history.future.length > 0,\n resetConfig,\n reset: () => resetConfig(initialRef.current),\n isDirty: config !== initialRef.current,\n };\n}\n\nexport interface EntityEditorOptions<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> extends UseAdminRallyEditorOptions<TLocale, TMeta> {\n readonly config?: AdminRallyConfig<TLocale, TMeta>;\n readonly initialConfig?: AdminRallyConfig<TLocale, TMeta>;\n}\nexport interface SpotEditorReturn<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly config: AdminRallyConfig<TLocale, TMeta> | undefined;\n readonly spot: SpotItem<TLocale, TMeta> | undefined;\n readonly setConfig: Dispatch<SetStateAction<AdminRallyConfig<TLocale, TMeta> | undefined>>;\n readonly update: (patch: Partial<SpotItem<TLocale, TMeta>>) => void;\n readonly remove: () => void;\n}\n\nexport function useSpotEditor<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>(\n spotId: string,\n options: EntityEditorOptions<TLocale, TMeta> = {},\n): SpotEditorReturn<TLocale, TMeta> {\n const [config, setConfig] = useState<AdminRallyConfig<TLocale, TMeta> | undefined>(\n options.config ?? options.initialConfig,\n );\n const commit = (next: AdminRallyConfig<TLocale, TMeta>): void => {\n setConfig(next);\n options.onChange?.(next);\n };\n const spot = config?.spots.find((item) => item.id === spotId);\n return {\n config,\n spot,\n setConfig,\n update: (patch) => {\n if (config === undefined || spot === undefined) return;\n commit({\n ...config,\n spots: config.spots.map((item) => (item.id === spotId ? { ...item, ...patch } : item)),\n });\n },\n remove: () => {\n if (config === undefined || spot === undefined) return;\n commit({ ...config, spots: config.spots.filter((item) => item.id !== spotId) });\n },\n };\n}\n\nexport function useRewardEditor<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>(\n rewardId: string,\n options: EntityEditorOptions<TLocale, TMeta> = {},\n): {\n readonly config: AdminRallyConfig<TLocale, TMeta> | undefined;\n readonly reward: Reward<TLocale> | undefined;\n readonly setConfig: Dispatch<SetStateAction<AdminRallyConfig<TLocale, TMeta> | undefined>>;\n readonly update: (patch: Partial<Reward<TLocale>>) => void;\n readonly remove: () => void;\n} {\n const [config, setConfig] = useState<AdminRallyConfig<TLocale, TMeta> | undefined>(\n options.config ?? options.initialConfig,\n );\n const reward = config?.rewards.find((item) => item.id === rewardId);\n const commit = (next: AdminRallyConfig<TLocale, TMeta>): void => {\n setConfig(next);\n options.onChange?.(next);\n };\n return {\n config,\n reward,\n setConfig,\n update: (patch) => {\n if (config === undefined || reward === undefined) return;\n commit({\n ...config,\n rewards: config.rewards.map((item) =>\n item.id === rewardId ? { ...item, ...patch } : item,\n ),\n });\n },\n remove: () => {\n if (config === undefined || reward === undefined) return;\n commit({ ...config, rewards: config.rewards.filter((item) => item.id !== rewardId) });\n },\n };\n}\n\ntype DictionaryProps<TLocale extends string> = {\n readonly locale?: NoInfer<TLocale>;\n readonly dictionary?: LocaleDictionary<TLocale>;\n};\n\nfunction text<TLocale extends string>(\n dictionary: LocaleDictionary<TLocale> | undefined,\n locale: TLocale,\n key: string,\n fallback: string,\n): string {\n return dictionary?.[locale]?.[key] ?? fallback;\n}\n\nconst condition = (): CheckInCondition => ({ type: \"passcode\", code: \"\" });\nconst newSpot = <TLocale extends string, TMeta extends Record<string, unknown>>(\n index: number,\n): SpotItem<TLocale, TMeta> => ({\n id: `spot-${index + 1}`,\n orderIndex: index,\n name: `Spot ${index + 1}`,\n conditions: [condition()],\n});\nconst newReward = (index: number): Reward => ({\n id: `reward-${index + 1}`,\n title: `Reward ${index + 1}`,\n type: \"digital\",\n redemptionMethod: \"server_claim\",\n requiredStampCount: index + 1,\n});\n\nfunction move<T>(items: ReadonlyArray<T>, index: number, direction: -1 | 1): ReadonlyArray<T> {\n const target = index + direction;\n if (target < 0 || target >= items.length) return items;\n const next = [...items];\n const [item] = next.splice(index, 1);\n if (item !== undefined) next.splice(target, 0, item);\n return next;\n}\n\nfunction moveTo<T>(items: ReadonlyArray<T>, fromIndex: number, toIndex: number): ReadonlyArray<T> {\n if (\n fromIndex < 0 ||\n fromIndex >= items.length ||\n toIndex < 0 ||\n toIndex >= items.length ||\n fromIndex === toIndex\n )\n return items;\n const next = [...items];\n const [item] = next.splice(fromIndex, 1);\n if (item !== undefined) next.splice(toIndex, 0, item);\n return next.map((entry, index) =>\n typeof entry === \"object\" && entry !== null && \"orderIndex\" in entry\n ? ({ ...entry, orderIndex: index } as T)\n : entry,\n );\n}\n\nexport interface ConditionEditorProps<TLocale extends string = SupportedLocale>\n extends DictionaryProps<TLocale> {\n readonly condition: CheckInCondition;\n readonly onChange: (condition: CheckInCondition) => void;\n readonly onRemove?: () => void;\n}\n\nexport function ConditionEditor<TLocale extends string = SupportedLocale>({\n condition,\n onChange,\n onRemove,\n locale,\n dictionary,\n}: ConditionEditorProps<TLocale>): ReactElement {\n const activeLocale = locale ?? (\"en\" as TLocale);\n const field = (key: string, fallback: string): string =>\n text(dictionary, activeLocale, key, fallback);\n return (\n <fieldset>\n <legend>{field(\"condition\", \"Condition\")}</legend>\n <label>\n {field(\"conditionType\", \"Type\")}\n <select\n value={condition.type}\n onChange={(event) => {\n const type = event.target.value as CheckInCondition[\"type\"];\n onChange(\n type === \"qr\"\n ? { type, secretToken: \"\" }\n : type === \"passcode\"\n ? { type, code: \"\", caseSensitive: false }\n : type === \"gps\"\n ? { type, latitude: 0, longitude: 0, radiusMeters: 100 }\n : type === \"nfc\"\n ? { type, tagId: \"\" }\n : { type, validatorName: \"\" },\n );\n }}\n >\n {([\"qr\", \"passcode\", \"gps\", \"nfc\", \"custom\"] as const).map((type) => (\n <option key={type} value={type}>\n {field(`condition.${type}`, type.toUpperCase())}\n </option>\n ))}\n </select>\n </label>\n {condition.type === \"qr\" && (\n <>\n <label>\n {field(\"secretToken\", \"QR token\")}\n <input\n value={condition.secretToken}\n onChange={(event) => onChange({ ...condition, secretToken: event.target.value })}\n />\n </label>\n <label>\n {field(\"qrEntryUrl\", \"QR entry URL\")}\n <input\n value={condition.qrEntryUrl ?? \"\"}\n onChange={(event) => onChange({ ...condition, qrEntryUrl: event.target.value })}\n />\n </label>\n </>\n )}\n {condition.type === \"passcode\" && (\n <>\n <label>\n {field(\"passcode\", \"Passcode\")}\n <input\n value={condition.code}\n onChange={(event) => onChange({ ...condition, code: event.target.value })}\n />\n </label>\n <label>\n <input\n type=\"checkbox\"\n checked={condition.caseSensitive ?? false}\n onChange={(event) => onChange({ ...condition, caseSensitive: event.target.checked })}\n />\n {field(\"caseSensitive\", \"Case sensitive\")}\n </label>\n </>\n )}\n {condition.type === \"gps\" && (\n <div>\n {([\"latitude\", \"longitude\", \"radiusMeters\"] as const).map((key) => (\n <label key={key}>\n {field(key, key)}\n <input\n type=\"number\"\n value={condition[key]}\n onChange={(event) => onChange({ ...condition, [key]: Number(event.target.value) })}\n />\n </label>\n ))}\n </div>\n )}\n {condition.type === \"nfc\" && (\n <label>\n {field(\"tagId\", \"NFC tag ID\")}\n <input\n value={condition.tagId}\n onChange={(event) => onChange({ ...condition, tagId: event.target.value })}\n />\n </label>\n )}\n {condition.type === \"custom\" && (\n <label>\n {field(\"validatorName\", \"Validator name\")}\n <input\n value={condition.validatorName}\n onChange={(event) => onChange({ ...condition, validatorName: event.target.value })}\n />\n </label>\n )}\n {onRemove !== undefined && (\n <button type=\"button\" onClick={onRemove}>\n {field(\"removeCondition\", \"Remove condition\")}\n </button>\n )}\n </fieldset>\n );\n}\n\nexport interface SpotItemFormProps<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> extends DictionaryProps<TLocale> {\n readonly spot: SpotItem<TLocale, TMeta>;\n readonly onChange: (spot: SpotItem<TLocale, TMeta>) => void;\n readonly onRemove?: () => void;\n}\n\nexport function SpotItemForm<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>({\n spot,\n onChange,\n onRemove,\n locale,\n dictionary,\n}: SpotItemFormProps<TLocale, TMeta>): ReactElement {\n const activeLocale = locale ?? (\"en\" as TLocale);\n const field = (key: string, fallback: string): string =>\n text(dictionary, activeLocale, key, fallback);\n const update = (patch: Partial<SpotItem<TLocale, TMeta>>): void =>\n onChange({ ...spot, ...patch });\n return (\n <fieldset>\n <legend>{resolveLocalizedText(spot.name, activeLocale)}</legend>\n <label>\n {field(\"spotName\", \"Spot name\")}\n <input\n value={resolveLocalizedText(spot.name, activeLocale)}\n onChange={(event) =>\n update({ name: updateLocalizedField(spot.name, activeLocale, event.target.value) })\n }\n />\n </label>\n {([\"description\", \"hint\"] as const).map((key) => (\n <label key={key}>\n {field(key, key)}\n <textarea\n value={resolveLocalizedText(spot[key] ?? \"\", activeLocale)}\n onChange={(event) =>\n update({\n [key]: updateLocalizedField(spot[key] ?? \"\", activeLocale, event.target.value),\n })\n }\n />\n </label>\n ))}\n {([\"imageUrl\", \"iconUrl\", \"redirectUrlAfterClaim\"] as const).map((key) => (\n <label key={key}>\n {field(key, key)}\n <input\n value={spot[key] ?? \"\"}\n onChange={(event) => update({ [key]: event.target.value })}\n />\n </label>\n ))}\n <label>\n {field(\"prerequisites\", \"Prerequisite spots\")}\n <input\n value={spot.prerequisites?.join(\", \") ?? \"\"}\n onChange={(event) =>\n update({\n prerequisites: event.target.value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean),\n })\n }\n />\n </label>\n <ExternalReferencesEditor\n references={spot.externalReferences ?? []}\n onChange={(externalReferences) => update({ externalReferences })}\n label={field(\"externalReferences\", \"External references\")}\n />\n <MetadataSection\n name={`spot-${spot.id}`}\n values={spot.metadata ?? {}}\n onChange={(metadata) => update({ metadata: metadata as TMeta })}\n label={field(\"metadata\", \"Metadata\")}\n />\n {spot.conditions.map((item, index) => (\n <ConditionEditor\n key={`${spot.id}-condition-${JSON.stringify(item)}`}\n condition={item}\n locale={activeLocale}\n {...(dictionary === undefined ? {} : { dictionary })}\n onChange={(next) =>\n update({\n conditions: spot.conditions.map((current, itemIndex) =>\n itemIndex === index ? next : current,\n ),\n })\n }\n {...(spot.conditions.length <= 1\n ? {}\n : {\n onRemove: () =>\n update({\n conditions: spot.conditions.filter((_, itemIndex) => itemIndex !== index),\n }),\n })}\n />\n ))}\n <button\n type=\"button\"\n onClick={() => update({ conditions: [...spot.conditions, condition()] })}\n >\n {field(\"addCondition\", \"Add condition\")}\n </button>\n {onRemove !== undefined && (\n <button type=\"button\" onClick={onRemove}>\n {field(\"removeSpot\", \"Remove spot\")}\n </button>\n )}\n </fieldset>\n );\n}\n\nexport interface RewardItemFormProps<TLocale extends string = SupportedLocale>\n extends DictionaryProps<TLocale> {\n readonly reward: Reward<TLocale>;\n readonly onChange: (reward: Reward<TLocale>) => void;\n readonly onRemove: () => void;\n}\n\nfunction newUnlockCondition(type: RewardUnlockCondition[\"type\"]): RewardUnlockCondition {\n if (type === \"stamp_count\") return { type, count: 1 };\n if (type === \"stamps\") return { type, stampIds: [] };\n return { type, conditions: [] };\n}\n\nexport interface RewardUnlockConditionEditorProps extends DictionaryProps<SupportedLocale> {\n readonly condition: RewardUnlockCondition;\n readonly onChange: (condition: RewardUnlockCondition) => void;\n readonly onRemove?: () => void;\n}\n\nexport function RewardUnlockConditionEditor({\n condition: unlock,\n onChange,\n onRemove,\n}: RewardUnlockConditionEditorProps): ReactElement {\n return (\n <fieldset>\n <legend>Unlock condition</legend>\n <label>\n Type\n <select\n value={unlock.type}\n onChange={(event) =>\n onChange(newUnlockCondition(event.target.value as RewardUnlockCondition[\"type\"]))\n }\n >\n <option value=\"stamp_count\">Stamp count</option>\n <option value=\"stamps\">Specific stamps</option>\n <option value=\"all\">All conditions</option>\n <option value=\"any\">Any condition</option>\n </select>\n </label>\n {unlock.type === \"stamp_count\" && (\n <label>\n Count\n <input\n type=\"number\"\n min={0}\n value={unlock.count}\n onChange={(event) => onChange({ ...unlock, count: Number(event.target.value) })}\n />\n </label>\n )}\n {unlock.type === \"stamps\" && (\n <label>\n Stamp IDs\n <input\n value={unlock.stampIds.join(\", \")}\n onChange={(event) =>\n onChange({\n ...unlock,\n stampIds: event.target.value\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean),\n })\n }\n />\n </label>\n )}\n {(unlock.type === \"all\" || unlock.type === \"any\") && (\n <>\n {unlock.conditions.map((child, index) => (\n <RewardUnlockConditionEditor\n key={`${unlock.type}-${JSON.stringify(child)}`}\n condition={child}\n onChange={(next) =>\n onChange({\n ...unlock,\n conditions: unlock.conditions.map((current, childIndex) =>\n childIndex === index ? next : current,\n ),\n })\n }\n onRemove={() =>\n onChange({\n ...unlock,\n conditions: unlock.conditions.filter((_, childIndex) => childIndex !== index),\n })\n }\n />\n ))}\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...unlock,\n conditions: [...unlock.conditions, newUnlockCondition(\"stamp_count\")],\n })\n }\n >\n Add nested condition\n </button>\n </>\n )}\n {onRemove !== undefined && (\n <button type=\"button\" onClick={onRemove}>\n Remove condition\n </button>\n )}\n </fieldset>\n );\n}\n\nexport function RewardItemForm<TLocale extends string = SupportedLocale>({\n reward,\n locale,\n dictionary,\n onChange,\n onRemove,\n}: RewardItemFormProps<TLocale> & { readonly locale: TLocale }): ReactElement {\n const field = (key: string, fallback: string): string => text(dictionary, locale, key, fallback);\n return (\n <fieldset>\n <legend>{resolveLocalizedText(reward.title, locale)}</legend>\n <label>\n {field(\"rewardTitle\", \"Reward title\")}\n <input\n value={resolveLocalizedText(reward.title, locale)}\n onChange={(event) =>\n onChange({\n ...reward,\n title: updateLocalizedField(reward.title, locale, event.target.value),\n })\n }\n />\n </label>\n <label>\n {field(\"description\", \"Description\")}\n <textarea\n value={resolveLocalizedText(reward.description ?? \"\", locale)}\n onChange={(event) =>\n onChange({\n ...reward,\n description: updateLocalizedField(\n reward.description ?? \"\",\n locale,\n event.target.value,\n ),\n })\n }\n />\n </label>\n <label>\n {field(\"requiredSpotCount\", \"Required spot count\")}\n <input\n type=\"number\"\n min={0}\n value={reward.requiredStampCount}\n onChange={(event) =>\n onChange({ ...reward, requiredStampCount: Number(event.target.value) })\n }\n />\n </label>\n <label>\n {field(\"rewardType\", \"Reward type\")}\n <select\n value={reward.type}\n onChange={(event) => onChange({ ...reward, type: event.target.value as Reward[\"type\"] })}\n >\n <option value=\"digital\">{field(\"rewardType.digital\", \"Digital\")}</option>\n <option value=\"in_person\">{field(\"rewardType.inPerson\", \"In person\")}</option>\n </select>\n </label>\n <label>\n {field(\"redemptionMethod\", \"Redemption method\")}\n <select\n value={reward.redemptionMethod}\n onChange={(event) =>\n onChange({\n ...reward,\n redemptionMethod: event.target.value as Reward[\"redemptionMethod\"],\n })\n }\n >\n <option value=\"server_claim\">{field(\"redemption.serverClaim\", \"Server claim\")}</option>\n <option value=\"manual_slide\">{field(\"redemption.manualSlide\", \"Manual slide\")}</option>\n <option value=\"staff_passcode\">\n {field(\"redemption.staffPasscode\", \"Staff passcode\")}\n </option>\n <option value=\"view_only\">{field(\"redemption.viewOnly\", \"View only\")}</option>\n </select>\n </label>\n <fieldset>\n <legend>{field(\"unlockConditions\", \"Unlock conditions\")}</legend>\n {(reward.conditions ?? []).map((unlock, index) => (\n <RewardUnlockConditionEditor\n key={`${reward.id}-unlock-${JSON.stringify(unlock)}`}\n condition={unlock}\n onChange={(next) =>\n onChange({\n ...reward,\n conditions: (reward.conditions ?? []).map((current, conditionIndex) =>\n conditionIndex === index ? next : current,\n ),\n })\n }\n onRemove={() =>\n onChange({\n ...reward,\n conditions: (reward.conditions ?? []).filter(\n (_, conditionIndex) => conditionIndex !== index,\n ),\n })\n }\n />\n ))}\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...reward,\n conditions: [...(reward.conditions ?? []), newUnlockCondition(\"stamp_count\")],\n })\n }\n >\n {field(\"addUnlockCondition\", \"Add unlock condition\")}\n </button>\n </fieldset>\n {([\"stockLimit\", \"userClaimLimit\"] as const).map((key) => (\n <label key={key}>\n {field(key, key)}\n <input\n type=\"number\"\n min={0}\n value={reward[key] ?? \"\"}\n onChange={(event) => {\n if (event.target.value === \"\") {\n const { [key]: _removed, ...withoutLimit } = reward;\n onChange(withoutLimit);\n } else onChange({ ...reward, [key]: Number(event.target.value) });\n }}\n />\n </label>\n ))}\n <label>\n {field(\"digitalContentUrl\", \"Digital content URL\")}\n <input\n value={reward.digitalContentUrl ?? \"\"}\n onChange={(event) => onChange({ ...reward, digitalContentUrl: event.target.value })}\n />\n </label>\n <label>\n {field(\"staffPasscode\", \"Staff passcode\")}\n <input\n value={reward.staffPasscode ?? \"\"}\n onChange={(event) => onChange({ ...reward, staffPasscode: event.target.value })}\n />\n </label>\n <label>\n {field(\"validUntil\", \"Valid until\")}\n <input\n type=\"datetime-local\"\n value={reward.validUntil?.slice(0, 16) ?? \"\"}\n onChange={(event) => {\n if (event.target.value === \"\") {\n const { validUntil: _removed, ...withoutDate } = reward;\n onChange(withoutDate);\n } else onChange({ ...reward, validUntil: new Date(event.target.value).toISOString() });\n }}\n />\n </label>\n <button type=\"button\" onClick={onRemove}>\n {field(\"removeReward\", \"Remove reward\")}\n </button>\n </fieldset>\n );\n}\n\nexport interface ThemeEditorProps<TLocale extends string = SupportedLocale>\n extends DictionaryProps<TLocale> {\n readonly theme: SheetTheme;\n readonly onChange: (theme: SheetTheme) => void;\n}\n\nexport function ThemeEditor<TLocale extends string = SupportedLocale>({\n theme,\n onChange,\n locale,\n dictionary,\n}: ThemeEditorProps<TLocale>): ReactElement {\n const activeLocale = locale ?? (\"en\" as TLocale);\n const field = (key: string, fallback: string): string =>\n text(dictionary, activeLocale, key, fallback);\n const update = <K extends keyof SheetTheme>(key: K, value: SheetTheme[K]): void =>\n onChange({ ...theme, [key]: value });\n return (\n <fieldset>\n <legend>{field(\"theme\", \"Theme\")}</legend>\n {(\n [\n \"primaryColor\",\n \"backgroundColor\",\n \"cardBackgroundColor\",\n \"textColor\",\n \"backgroundImageUrl\",\n \"completedStampColor\",\n ] as const\n ).map((key) => (\n <label key={key}>\n {field(key, key)}\n <input\n type={key.toLowerCase().includes(\"color\") ? \"color\" : \"url\"}\n value={theme[key] ?? \"\"}\n onChange={(event) => update(key, event.target.value)}\n />\n </label>\n ))}\n <label>\n {field(\"slotShape\", \"Slot shape\")}\n <select\n value={theme.slotShape}\n onChange={(event) => update(\"slotShape\", event.target.value as SheetTheme[\"slotShape\"])}\n >\n {([\"circle\", \"square\", \"rounded\"] as const).map((shape) => (\n <option key={shape} value={shape}>\n {field(`slotShape.${shape}`, shape)}\n </option>\n ))}\n </select>\n </label>\n <label>\n {field(\"gridColumns\", \"Grid columns\")}\n <input\n type=\"number\"\n min={1}\n max={12}\n value={theme.gridColumns}\n onChange={(event) => update(\"gridColumns\", Number(event.target.value))}\n />\n </label>\n <label>\n {field(\"fontFamily\", \"Font family\")}\n <select\n value={theme.fontFamily ?? \"system-ui\"}\n onChange={(event) => update(\"fontFamily\", event.target.value as SheetTheme[\"fontFamily\"])}\n >\n {([\"system-ui\", \"serif\", \"rounded-sans\", \"monospace\", \"handwritten\"] as const).map(\n (font) => (\n <option key={font} value={font}>\n {font}\n </option>\n ),\n )}\n </select>\n </label>\n <label>\n {field(\"unclaimedOpacity\", \"Unclaimed opacity\")}\n <input\n type=\"number\"\n min={0}\n max={1}\n step={0.05}\n value={theme.unclaimedOpacity ?? 1}\n onChange={(event) => update(\"unclaimedOpacity\", Number(event.target.value))}\n />\n </label>\n </fieldset>\n );\n}\n\nfunction metadataValue(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nexport interface ExternalReferencesEditorProps {\n readonly references: ReadonlyArray<ExternalReference>;\n readonly onChange: (references: ReadonlyArray<ExternalReference>) => void;\n readonly label?: string;\n}\n\nexport function ExternalReferencesEditor({\n references,\n onChange,\n label = \"External references\",\n}: ExternalReferencesEditorProps): ReactElement {\n return (\n <fieldset>\n <legend>{label}</legend>\n {references.map((reference) => (\n <div key={`${reference.type}-${reference.id}-${reference.url ?? \"\"}`}>\n <label>\n Type\n <input\n value={reference.type}\n onChange={(event) =>\n onChange(\n references.map((current) =>\n current === reference ? { ...current, type: event.target.value } : current,\n ),\n )\n }\n />\n </label>\n <label>\n ID\n <input\n value={reference.id}\n onChange={(event) =>\n onChange(\n references.map((current) =>\n current === reference ? { ...current, id: event.target.value } : current,\n ),\n )\n }\n />\n </label>\n <label>\n URL\n <input\n type=\"url\"\n value={reference.url ?? \"\"}\n onChange={(event) =>\n onChange(\n references.map((current) =>\n current === reference ? { ...current, url: event.target.value } : current,\n ),\n )\n }\n />\n </label>\n <button\n type=\"button\"\n onClick={() => onChange(references.filter((current) => current !== reference))}\n >\n Remove reference\n </button>\n </div>\n ))}\n <button type=\"button\" onClick={() => onChange([...references, { type: \"\", id: \"\" }])}>\n Add reference\n </button>\n </fieldset>\n );\n}\n\nfunction MetadataSection({\n name,\n values,\n onChange,\n label,\n}: {\n readonly name: string;\n readonly values: Readonly<Record<string, unknown>>;\n readonly onChange: (values: Readonly<Record<string, unknown>>) => void;\n readonly label: string;\n}): ReactElement {\n const entries = Object.entries(values);\n return (\n <fieldset>\n <legend>{label}</legend>\n {entries.map(([key, value]) => (\n <div key={`${name}-${key}`}>\n <label>\n Key\n <input\n value={key}\n onChange={(event) => {\n const next = { ...values };\n delete next[key];\n next[event.target.value] = value;\n onChange(next);\n }}\n />\n </label>\n <label>\n Value\n <input\n value={metadataValue(value)}\n onChange={(event) => {\n let nextValue: unknown = event.target.value;\n try {\n nextValue = JSON.parse(event.target.value) as unknown;\n } catch {\n /* plain text */\n }\n onChange({ ...values, [key]: nextValue });\n }}\n />\n </label>\n <button\n type=\"button\"\n onClick={() => {\n const next = { ...values };\n delete next[key];\n onChange(next);\n }}\n >\n Remove\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n let index = entries.length + 1;\n let key = `key${index}`;\n while (key in values) {\n index += 1;\n key = `key${index}`;\n }\n onChange({ ...values, [key]: \"\" });\n }}\n >\n Add field\n </button>\n </fieldset>\n );\n}\n\nexport interface MetadataEditorProps<TLocale extends string = SupportedLocale>\n extends DictionaryProps<TLocale> {\n readonly publicMetadata?: Readonly<Record<string, unknown>>;\n readonly serverMetadata?: Readonly<Record<string, unknown>>;\n readonly onPublicMetadataChange: (metadata: Readonly<Record<string, unknown>>) => void;\n readonly onServerMetadataChange: (metadata: Readonly<Record<string, unknown>>) => void;\n}\n\nexport function MetadataEditor<TLocale extends string = SupportedLocale>({\n publicMetadata = {},\n serverMetadata = {},\n onPublicMetadataChange,\n onServerMetadataChange,\n locale,\n dictionary,\n}: MetadataEditorProps<TLocale>): ReactElement {\n const activeLocale = locale ?? (\"en\" as TLocale);\n return (\n <section aria-label={text(dictionary, activeLocale, \"metadata\", \"Metadata\")}>\n <MetadataSection\n name=\"public\"\n values={publicMetadata}\n onChange={onPublicMetadataChange}\n label=\"Public metadata\"\n />\n <MetadataSection\n name=\"server\"\n values={serverMetadata}\n onChange={onServerMetadataChange}\n label=\"Server metadata\"\n />\n </section>\n );\n}\n\nexport function AdminRallyEditor<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>({ config, onChange, locale, dictionary }: AdminRallyEditorProps<TLocale, TMeta>): ReactElement {\n const activeLocale = (locale ?? \"en\") as TLocale;\n const field = (key: string, fallback: string): string =>\n text(dictionary, activeLocale, key, fallback);\n const update = (next: Partial<AdminRallyConfig<TLocale, TMeta>>): void =>\n onChange({ ...config, ...next });\n const updateSpots = (spots: ReadonlyArray<SpotItem<TLocale, TMeta>>): void =>\n update({ spots: spots.map((spot, index) => ({ ...spot, orderIndex: index })) });\n return (\n <section aria-label={field(\"rallyEditor\", \"Rally editor\")}>\n <h1>{resolveLocalizedText(config.title, activeLocale)}</h1>\n <label>\n {field(\"title\", \"Title\")}\n <input\n value={resolveLocalizedText(config.title, activeLocale)}\n onChange={(event) =>\n update({ title: updateLocalizedField(config.title, activeLocale, event.target.value) })\n }\n />\n </label>\n <label>\n {field(\"description\", \"Description\")}\n <textarea\n value={resolveLocalizedText(config.description ?? \"\", activeLocale)}\n onChange={(event) =>\n update({\n description: updateLocalizedField(\n config.description ?? \"\",\n activeLocale,\n event.target.value,\n ),\n })\n }\n />\n </label>\n <ThemeEditor\n theme={config.theme ?? DEFAULT_SHEET_THEME}\n locale={activeLocale}\n {...(dictionary === undefined ? {} : { dictionary })}\n onChange={(theme) => update({ theme })}\n />\n <label>\n {field(\"serverEndpoint\", \"Server endpoint\")}\n <input\n value={config.serverEndpoint ?? \"\"}\n onChange={(event) => update({ serverEndpoint: event.target.value })}\n />\n </label>\n <MetadataEditor\n publicMetadata={config.publicMetadata ?? config.metadata ?? {}}\n serverMetadata={config.serverMetadata ?? {}}\n locale={activeLocale}\n {...(dictionary === undefined ? {} : { dictionary })}\n onPublicMetadataChange={(metadata) => update({ publicMetadata: metadata as TMeta })}\n onServerMetadataChange={(metadata) => update({ serverMetadata: metadata })}\n />\n <button\n type=\"button\"\n onClick={() => updateSpots([...config.spots, newSpot<TLocale, TMeta>(config.spots.length)])}\n >\n {field(\"addSpot\", \"Add spot\")}\n </button>\n <div>\n {config.spots.map((spot, index) => (\n <div key={spot.id}>\n <SpotItemForm<TLocale, TMeta>\n spot={spot}\n locale={activeLocale}\n {...(dictionary === undefined ? {} : { dictionary })}\n onChange={(next) =>\n updateSpots(\n config.spots.map((current) => (current.id === spot.id ? next : current)),\n )\n }\n onRemove={() => updateSpots(config.spots.filter((current) => current.id !== spot.id))}\n />\n <button\n type=\"button\"\n disabled={index === 0}\n onClick={() => updateSpots(move(config.spots, index, -1))}\n >\n {field(\"moveUp\", \"Move up\")}\n </button>\n <button\n type=\"button\"\n disabled={index === config.spots.length - 1}\n onClick={() => updateSpots(move(config.spots, index, 1))}\n >\n {field(\"moveDown\", \"Move down\")}\n </button>\n </div>\n ))}\n </div>\n <button\n type=\"button\"\n onClick={() => update({ rewards: [...config.rewards, newReward(config.rewards.length)] })}\n >\n {field(\"addReward\", \"Add reward\")}\n </button>\n <div>\n {config.rewards.map((reward) => (\n <RewardItemForm\n key={reward.id}\n reward={reward}\n locale={activeLocale}\n {...(dictionary === undefined ? {} : { dictionary })}\n onChange={(next) =>\n update({\n rewards: config.rewards.map((current) =>\n current.id === reward.id ? next : current,\n ),\n })\n }\n onRemove={() =>\n update({ rewards: config.rewards.filter((current) => current.id !== reward.id) })\n }\n />\n ))}\n </div>\n </section>\n );\n}\n\nexport const RallyEditor = AdminRallyEditor;\n\nexport interface GeneralSettingsFormProps<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> extends DictionaryProps<TLocale> {\n readonly config: AdminRallyConfig<TLocale, TMeta>;\n readonly onChange: (config: AdminRallyConfig<TLocale, TMeta>) => void;\n}\nexport function GeneralSettingsForm<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>({\n config,\n onChange,\n locale,\n dictionary,\n}: GeneralSettingsFormProps<TLocale, TMeta>): ReactElement {\n const activeLocale = locale ?? (\"en\" as TLocale);\n return (\n <label>\n {text(dictionary, activeLocale, \"title\", \"Rally title\")}\n <input\n value={resolveLocalizedText(config.title, activeLocale)}\n onChange={(event) =>\n onChange({\n ...config,\n title: updateLocalizedField(config.title, activeLocale, event.target.value),\n })\n }\n />\n </label>\n );\n}\n\nexport interface JsonConfigIOProps<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> extends DictionaryProps<TLocale> {\n readonly config: AdminRallyConfig<TLocale, TMeta>;\n readonly onImport: (config: AdminRallyConfig<TLocale, TMeta>) => void;\n}\nexport function JsonConfigIO<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>({ config, onImport, locale, dictionary }: JsonConfigIOProps<TLocale, TMeta>): ReactElement {\n const activeLocale = locale ?? (\"en\" as TLocale);\n const [value, setValue] = useState(() => JSON.stringify(config, null, 2));\n const [errors, setErrors] = useState<\n ReadonlyArray<{ readonly path: string; readonly message: string }>\n >([]);\n const field = (key: string, fallback: string): string =>\n text(dictionary, activeLocale, key, fallback);\n return (\n <div>\n <textarea\n aria-label={field(\"jsonConfig\", \"JSON configuration\")}\n value={value}\n onChange={(event) => {\n setValue(event.target.value);\n setErrors([]);\n }}\n />\n <button\n type=\"button\"\n onClick={() => {\n try {\n const result = safeParseAdminConfig(JSON.parse(value));\n if (!result.success) {\n setErrors(result.errors);\n return;\n }\n onImport(result.data as AdminRallyConfig<TLocale, TMeta>);\n setErrors([]);\n } catch {\n setErrors([{ path: \"$\", message: field(\"invalidJson\", \"Invalid JSON.\") }]);\n }\n }}\n >\n {field(\"import\", \"Import\")}\n </button>\n {errors.length > 0 && (\n <ul role=\"alert\">\n {errors.map((error) => (\n <li key={`${error.path}-${error.message}`}>\n {error.path}: {error.message}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { SupportedLocale, AdminRallyConfig, LocaleDictionary, CheckInCondition, SpotItem, Reward } from '@stamprally/core';
1
+ import { SupportedLocale, AdminRallyConfig, LocaleDictionary, CheckInCondition, ExternalReference, Reward, RewardUnlockCondition, SpotItem, SheetTheme } from '@stamprally/core';
2
2
  import { ReactElement, Dispatch, SetStateAction } from 'react';
3
3
 
4
4
  interface AdminRallyEditorProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> {
@@ -16,6 +16,21 @@ interface UseAdminRallyEditorReturn<TLocale extends string = SupportedLocale, TM
16
16
  readonly update: (patch: Partial<AdminRallyConfig<TLocale, TMeta>>) => void;
17
17
  readonly updateSpot: (spotId: string, patch: Partial<SpotItem<TLocale, TMeta>>) => void;
18
18
  readonly updateReward: (rewardId: string, patch: Partial<Reward<TLocale>>) => void;
19
+ readonly addSpot: (spotData?: Partial<SpotItem<TLocale, TMeta>>) => void;
20
+ readonly removeSpot: (spotId: string) => void;
21
+ readonly reorderSpots: (fromIndex: number, toIndex: number) => void;
22
+ readonly duplicateSpot: (spotId: string) => void;
23
+ readonly addReward: (rewardData?: Partial<Reward<TLocale>>) => void;
24
+ readonly removeReward: (rewardId: string) => void;
25
+ readonly duplicateReward: (rewardId: string) => void;
26
+ readonly addCondition: (spotId: string, nextCondition: CheckInCondition) => void;
27
+ readonly removeCondition: (spotId: string, conditionIndex: number) => void;
28
+ readonly updateLocalizedField: (path: string, locale: TLocale, value: string) => void;
29
+ readonly undo: () => void;
30
+ readonly redo: () => void;
31
+ readonly canUndo: boolean;
32
+ readonly canRedo: boolean;
33
+ readonly resetConfig: (newConfig: AdminRallyConfig<TLocale, TMeta>) => void;
19
34
  readonly reset: () => void;
20
35
  readonly isDirty: boolean;
21
36
  }
@@ -56,6 +71,38 @@ interface SpotItemFormProps<TLocale extends string = SupportedLocale, TMeta exte
56
71
  readonly onRemove?: () => void;
57
72
  }
58
73
  declare function SpotItemForm<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ spot, onChange, onRemove, locale, dictionary, }: SpotItemFormProps<TLocale, TMeta>): ReactElement;
74
+ interface RewardItemFormProps<TLocale extends string = SupportedLocale> extends DictionaryProps<TLocale> {
75
+ readonly reward: Reward<TLocale>;
76
+ readonly onChange: (reward: Reward<TLocale>) => void;
77
+ readonly onRemove: () => void;
78
+ }
79
+ interface RewardUnlockConditionEditorProps extends DictionaryProps<SupportedLocale> {
80
+ readonly condition: RewardUnlockCondition;
81
+ readonly onChange: (condition: RewardUnlockCondition) => void;
82
+ readonly onRemove?: () => void;
83
+ }
84
+ declare function RewardUnlockConditionEditor({ condition: unlock, onChange, onRemove, }: RewardUnlockConditionEditorProps): ReactElement;
85
+ declare function RewardItemForm<TLocale extends string = SupportedLocale>({ reward, locale, dictionary, onChange, onRemove, }: RewardItemFormProps<TLocale> & {
86
+ readonly locale: TLocale;
87
+ }): ReactElement;
88
+ interface ThemeEditorProps<TLocale extends string = SupportedLocale> extends DictionaryProps<TLocale> {
89
+ readonly theme: SheetTheme;
90
+ readonly onChange: (theme: SheetTheme) => void;
91
+ }
92
+ declare function ThemeEditor<TLocale extends string = SupportedLocale>({ theme, onChange, locale, dictionary, }: ThemeEditorProps<TLocale>): ReactElement;
93
+ interface ExternalReferencesEditorProps {
94
+ readonly references: ReadonlyArray<ExternalReference>;
95
+ readonly onChange: (references: ReadonlyArray<ExternalReference>) => void;
96
+ readonly label?: string;
97
+ }
98
+ declare function ExternalReferencesEditor({ references, onChange, label, }: ExternalReferencesEditorProps): ReactElement;
99
+ interface MetadataEditorProps<TLocale extends string = SupportedLocale> extends DictionaryProps<TLocale> {
100
+ readonly publicMetadata?: Readonly<Record<string, unknown>>;
101
+ readonly serverMetadata?: Readonly<Record<string, unknown>>;
102
+ readonly onPublicMetadataChange: (metadata: Readonly<Record<string, unknown>>) => void;
103
+ readonly onServerMetadataChange: (metadata: Readonly<Record<string, unknown>>) => void;
104
+ }
105
+ declare function MetadataEditor<TLocale extends string = SupportedLocale>({ publicMetadata, serverMetadata, onPublicMetadataChange, onServerMetadataChange, locale, dictionary, }: MetadataEditorProps<TLocale>): ReactElement;
59
106
  declare function AdminRallyEditor<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onChange, locale, dictionary }: AdminRallyEditorProps<TLocale, TMeta>): ReactElement;
60
107
  declare const RallyEditor: typeof AdminRallyEditor;
61
108
  interface GeneralSettingsFormProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> extends DictionaryProps<TLocale> {
@@ -69,4 +116,4 @@ interface JsonConfigIOProps<TLocale extends string = SupportedLocale, TMeta exte
69
116
  }
70
117
  declare function JsonConfigIO<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onImport, locale, dictionary }: JsonConfigIOProps<TLocale, TMeta>): ReactElement;
71
118
 
72
- export { AdminRallyEditor, type AdminRallyEditorProps, ConditionEditor, type ConditionEditorProps, type EntityEditorOptions, GeneralSettingsForm, type GeneralSettingsFormProps, JsonConfigIO, type JsonConfigIOProps, RallyEditor, type SpotEditorReturn, SpotItemForm, type SpotItemFormProps, type UseAdminRallyEditorOptions, type UseAdminRallyEditorReturn, useAdminRallyEditor, useRewardEditor, useSpotEditor };
119
+ export { AdminRallyEditor, type AdminRallyEditorProps, ConditionEditor, type ConditionEditorProps, type EntityEditorOptions, ExternalReferencesEditor, type ExternalReferencesEditorProps, GeneralSettingsForm, type GeneralSettingsFormProps, JsonConfigIO, type JsonConfigIOProps, MetadataEditor, type MetadataEditorProps, RallyEditor, RewardItemForm, type RewardItemFormProps, RewardUnlockConditionEditor, type RewardUnlockConditionEditorProps, type SpotEditorReturn, SpotItemForm, type SpotItemFormProps, ThemeEditor, type ThemeEditorProps, type UseAdminRallyEditorOptions, type UseAdminRallyEditorReturn, useAdminRallyEditor, useRewardEditor, useSpotEditor };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { SupportedLocale, AdminRallyConfig, LocaleDictionary, CheckInCondition, SpotItem, Reward } from '@stamprally/core';
1
+ import { SupportedLocale, AdminRallyConfig, LocaleDictionary, CheckInCondition, ExternalReference, Reward, RewardUnlockCondition, SpotItem, SheetTheme } from '@stamprally/core';
2
2
  import { ReactElement, Dispatch, SetStateAction } from 'react';
3
3
 
4
4
  interface AdminRallyEditorProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> {
@@ -16,6 +16,21 @@ interface UseAdminRallyEditorReturn<TLocale extends string = SupportedLocale, TM
16
16
  readonly update: (patch: Partial<AdminRallyConfig<TLocale, TMeta>>) => void;
17
17
  readonly updateSpot: (spotId: string, patch: Partial<SpotItem<TLocale, TMeta>>) => void;
18
18
  readonly updateReward: (rewardId: string, patch: Partial<Reward<TLocale>>) => void;
19
+ readonly addSpot: (spotData?: Partial<SpotItem<TLocale, TMeta>>) => void;
20
+ readonly removeSpot: (spotId: string) => void;
21
+ readonly reorderSpots: (fromIndex: number, toIndex: number) => void;
22
+ readonly duplicateSpot: (spotId: string) => void;
23
+ readonly addReward: (rewardData?: Partial<Reward<TLocale>>) => void;
24
+ readonly removeReward: (rewardId: string) => void;
25
+ readonly duplicateReward: (rewardId: string) => void;
26
+ readonly addCondition: (spotId: string, nextCondition: CheckInCondition) => void;
27
+ readonly removeCondition: (spotId: string, conditionIndex: number) => void;
28
+ readonly updateLocalizedField: (path: string, locale: TLocale, value: string) => void;
29
+ readonly undo: () => void;
30
+ readonly redo: () => void;
31
+ readonly canUndo: boolean;
32
+ readonly canRedo: boolean;
33
+ readonly resetConfig: (newConfig: AdminRallyConfig<TLocale, TMeta>) => void;
19
34
  readonly reset: () => void;
20
35
  readonly isDirty: boolean;
21
36
  }
@@ -56,6 +71,38 @@ interface SpotItemFormProps<TLocale extends string = SupportedLocale, TMeta exte
56
71
  readonly onRemove?: () => void;
57
72
  }
58
73
  declare function SpotItemForm<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ spot, onChange, onRemove, locale, dictionary, }: SpotItemFormProps<TLocale, TMeta>): ReactElement;
74
+ interface RewardItemFormProps<TLocale extends string = SupportedLocale> extends DictionaryProps<TLocale> {
75
+ readonly reward: Reward<TLocale>;
76
+ readonly onChange: (reward: Reward<TLocale>) => void;
77
+ readonly onRemove: () => void;
78
+ }
79
+ interface RewardUnlockConditionEditorProps extends DictionaryProps<SupportedLocale> {
80
+ readonly condition: RewardUnlockCondition;
81
+ readonly onChange: (condition: RewardUnlockCondition) => void;
82
+ readonly onRemove?: () => void;
83
+ }
84
+ declare function RewardUnlockConditionEditor({ condition: unlock, onChange, onRemove, }: RewardUnlockConditionEditorProps): ReactElement;
85
+ declare function RewardItemForm<TLocale extends string = SupportedLocale>({ reward, locale, dictionary, onChange, onRemove, }: RewardItemFormProps<TLocale> & {
86
+ readonly locale: TLocale;
87
+ }): ReactElement;
88
+ interface ThemeEditorProps<TLocale extends string = SupportedLocale> extends DictionaryProps<TLocale> {
89
+ readonly theme: SheetTheme;
90
+ readonly onChange: (theme: SheetTheme) => void;
91
+ }
92
+ declare function ThemeEditor<TLocale extends string = SupportedLocale>({ theme, onChange, locale, dictionary, }: ThemeEditorProps<TLocale>): ReactElement;
93
+ interface ExternalReferencesEditorProps {
94
+ readonly references: ReadonlyArray<ExternalReference>;
95
+ readonly onChange: (references: ReadonlyArray<ExternalReference>) => void;
96
+ readonly label?: string;
97
+ }
98
+ declare function ExternalReferencesEditor({ references, onChange, label, }: ExternalReferencesEditorProps): ReactElement;
99
+ interface MetadataEditorProps<TLocale extends string = SupportedLocale> extends DictionaryProps<TLocale> {
100
+ readonly publicMetadata?: Readonly<Record<string, unknown>>;
101
+ readonly serverMetadata?: Readonly<Record<string, unknown>>;
102
+ readonly onPublicMetadataChange: (metadata: Readonly<Record<string, unknown>>) => void;
103
+ readonly onServerMetadataChange: (metadata: Readonly<Record<string, unknown>>) => void;
104
+ }
105
+ declare function MetadataEditor<TLocale extends string = SupportedLocale>({ publicMetadata, serverMetadata, onPublicMetadataChange, onServerMetadataChange, locale, dictionary, }: MetadataEditorProps<TLocale>): ReactElement;
59
106
  declare function AdminRallyEditor<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onChange, locale, dictionary }: AdminRallyEditorProps<TLocale, TMeta>): ReactElement;
60
107
  declare const RallyEditor: typeof AdminRallyEditor;
61
108
  interface GeneralSettingsFormProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> extends DictionaryProps<TLocale> {
@@ -69,4 +116,4 @@ interface JsonConfigIOProps<TLocale extends string = SupportedLocale, TMeta exte
69
116
  }
70
117
  declare function JsonConfigIO<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onImport, locale, dictionary }: JsonConfigIOProps<TLocale, TMeta>): ReactElement;
71
118
 
72
- export { AdminRallyEditor, type AdminRallyEditorProps, ConditionEditor, type ConditionEditorProps, type EntityEditorOptions, GeneralSettingsForm, type GeneralSettingsFormProps, JsonConfigIO, type JsonConfigIOProps, RallyEditor, type SpotEditorReturn, SpotItemForm, type SpotItemFormProps, type UseAdminRallyEditorOptions, type UseAdminRallyEditorReturn, useAdminRallyEditor, useRewardEditor, useSpotEditor };
119
+ export { AdminRallyEditor, type AdminRallyEditorProps, ConditionEditor, type ConditionEditorProps, type EntityEditorOptions, ExternalReferencesEditor, type ExternalReferencesEditorProps, GeneralSettingsForm, type GeneralSettingsFormProps, JsonConfigIO, type JsonConfigIOProps, MetadataEditor, type MetadataEditorProps, RallyEditor, RewardItemForm, type RewardItemFormProps, RewardUnlockConditionEditor, type RewardUnlockConditionEditorProps, type SpotEditorReturn, SpotItemForm, type SpotItemFormProps, ThemeEditor, type ThemeEditorProps, type UseAdminRallyEditorOptions, type UseAdminRallyEditorReturn, useAdminRallyEditor, useRewardEditor, useSpotEditor };