@stamprally/admin-ui 0.9.0 → 0.10.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.
- package/dist/index.cjs +454 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +13 -0
- package/dist/index.d.cts +24 -13
- package/dist/index.d.ts +24 -13
- package/dist/index.js +456 -40
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx"],"names":["jsxs","jsx","resolveLocalizedText","useState"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n AdminRallyConfig,\n CheckInCondition,\n LocaleDictionary,\n Reward,\n SpotItem,\n SupportedLocale,\n} from \"@stamprally/core\";\nimport { resolveLocalizedText } from \"@stamprally/core\";\nimport { type ChangeEvent, type ReactElement, 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?: TLocale;\n readonly dictionary?: LocaleDictionary<TLocale>;\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});\nexport function AdminRallyEditor<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>({\n config,\n onChange,\n locale = \"en\" as TLocale,\n}: AdminRallyEditorProps<TLocale, TMeta>): ReactElement {\n const update = (next: Partial<AdminRallyConfig<TLocale, TMeta>>): void =>\n onChange({ ...config, ...next });\n return (\n <section aria-label=\"Rally editor\">\n <h1>{resolveLocalizedText(config.title, locale)}</h1>\n <label>\n Title\n <input\n value={resolveLocalizedText(config.title, locale)}\n onChange={(event) => update({ title: event.target.value })}\n />\n </label>\n <button\n type=\"button\"\n onClick={() =>\n update({ spots: [...config.spots, newSpot<TLocale, TMeta>(config.spots.length)] })\n }\n >\n Add spot\n </button>\n <button\n type=\"button\"\n onClick={() => update({ rewards: [...config.rewards, newReward(config.rewards.length)] })}\n >\n Add reward\n </button>\n <ul>\n {config.spots.map((spot) => (\n <li key={spot.id}>{resolveLocalizedText(spot.name, locale)}</li>\n ))}\n </ul>\n </section>\n );\n}\nexport const RallyEditor = AdminRallyEditor;\nexport interface SpotItemFormProps<TLocale extends string = SupportedLocale> {\n readonly spot: SpotItem<TLocale>;\n readonly onChange: (spot: SpotItem<TLocale>) => void;\n}\nexport function SpotItemForm<TLocale extends string = SupportedLocale>({\n spot,\n onChange,\n}: SpotItemFormProps<TLocale>): ReactElement {\n return (\n <label>\n Spot name\n <input\n value={resolveLocalizedText(spot.name, \"en\")}\n onChange={(event) => onChange({ ...spot, name: event.target.value })}\n />\n </label>\n );\n}\nexport interface GeneralSettingsFormProps<\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}\nexport function GeneralSettingsForm<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>({ config, onChange }: GeneralSettingsFormProps<TLocale, TMeta>): ReactElement {\n return (\n <label>\n Rally title\n <input\n value={resolveLocalizedText(config.title, \"en\")}\n onChange={(event) => onChange({ ...config, title: event.target.value })}\n />\n </label>\n );\n}\nexport interface JsonConfigIOProps<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\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 }: JsonConfigIOProps<TLocale, TMeta>): ReactElement {\n const [value, setValue] = useState(() => JSON.stringify(config, null, 2));\n const parse = (event: ChangeEvent<HTMLTextAreaElement>): void => {\n setValue(event.target.value);\n };\n return (\n <div>\n <textarea value={value} onChange={parse} />\n <button\n type=\"button\"\n onClick={() => {\n try {\n onImport(JSON.parse(value) as AdminRallyConfig<TLocale, TMeta>);\n } catch {\n /* invalid JSON remains local */\n }\n }}\n >\n Import\n </button>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx"],"names":["condition","jsx","jsxs","Fragment","resolveLocalizedText","updateLocalizedField","useState","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 ReactElement, 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\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 {([\"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(\"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(\"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 <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.css
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
display: grid;
|
|
3
3
|
gap: 1rem;
|
|
4
4
|
}
|
|
5
|
+
.stamprally-admin fieldset {
|
|
6
|
+
display: grid;
|
|
7
|
+
gap: 0.75rem;
|
|
8
|
+
margin-block: 1rem;
|
|
9
|
+
padding: 1rem;
|
|
10
|
+
border: 1px solid #ccd3dc;
|
|
11
|
+
border-radius: 0.5rem;
|
|
12
|
+
}
|
|
13
|
+
.stamprally-admin input,
|
|
14
|
+
.stamprally-admin select,
|
|
15
|
+
.stamprally-admin textarea {
|
|
16
|
+
max-width: 36rem;
|
|
17
|
+
}
|
|
5
18
|
.stamprally-admin-card {
|
|
6
19
|
display: grid;
|
|
7
20
|
gap: 0.75rem;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,28 +1,39 @@
|
|
|
1
|
-
import { SupportedLocale, AdminRallyConfig, LocaleDictionary, SpotItem } from '@stamprally/core';
|
|
1
|
+
import { SupportedLocale, AdminRallyConfig, LocaleDictionary, CheckInCondition, SpotItem } from '@stamprally/core';
|
|
2
2
|
import { ReactElement } from 'react';
|
|
3
3
|
|
|
4
4
|
interface AdminRallyEditorProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> {
|
|
5
5
|
readonly config: AdminRallyConfig<TLocale, TMeta>;
|
|
6
6
|
readonly onChange: (config: AdminRallyConfig<TLocale, TMeta>) => void;
|
|
7
|
-
readonly locale?:
|
|
7
|
+
readonly locale?: string;
|
|
8
8
|
readonly dictionary?: LocaleDictionary<TLocale>;
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
type DictionaryProps<TLocale extends string> = {
|
|
11
|
+
readonly locale?: NoInfer<TLocale>;
|
|
12
|
+
readonly dictionary?: LocaleDictionary<TLocale>;
|
|
13
|
+
};
|
|
14
|
+
interface ConditionEditorProps<TLocale extends string = SupportedLocale> extends DictionaryProps<TLocale> {
|
|
15
|
+
readonly condition: CheckInCondition;
|
|
16
|
+
readonly onChange: (condition: CheckInCondition) => void;
|
|
17
|
+
readonly onRemove?: () => void;
|
|
15
18
|
}
|
|
16
|
-
declare function
|
|
17
|
-
interface
|
|
19
|
+
declare function ConditionEditor<TLocale extends string = SupportedLocale>({ condition, onChange, onRemove, locale, dictionary, }: ConditionEditorProps<TLocale>): ReactElement;
|
|
20
|
+
interface SpotItemFormProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> extends DictionaryProps<TLocale> {
|
|
21
|
+
readonly spot: SpotItem<TLocale, TMeta>;
|
|
22
|
+
readonly onChange: (spot: SpotItem<TLocale, TMeta>) => void;
|
|
23
|
+
readonly onRemove?: () => void;
|
|
24
|
+
}
|
|
25
|
+
declare function SpotItemForm<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ spot, onChange, onRemove, locale, dictionary, }: SpotItemFormProps<TLocale, TMeta>): ReactElement;
|
|
26
|
+
declare function AdminRallyEditor<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onChange, locale, dictionary }: AdminRallyEditorProps<TLocale, TMeta>): ReactElement;
|
|
27
|
+
declare const RallyEditor: typeof AdminRallyEditor;
|
|
28
|
+
interface GeneralSettingsFormProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> extends DictionaryProps<TLocale> {
|
|
18
29
|
readonly config: AdminRallyConfig<TLocale, TMeta>;
|
|
19
30
|
readonly onChange: (config: AdminRallyConfig<TLocale, TMeta>) => void;
|
|
20
31
|
}
|
|
21
|
-
declare function GeneralSettingsForm<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onChange }: GeneralSettingsFormProps<TLocale, TMeta>): ReactElement;
|
|
22
|
-
interface JsonConfigIOProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> {
|
|
32
|
+
declare function GeneralSettingsForm<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onChange, locale, dictionary, }: GeneralSettingsFormProps<TLocale, TMeta>): ReactElement;
|
|
33
|
+
interface JsonConfigIOProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> extends DictionaryProps<TLocale> {
|
|
23
34
|
readonly config: AdminRallyConfig<TLocale, TMeta>;
|
|
24
35
|
readonly onImport: (config: AdminRallyConfig<TLocale, TMeta>) => void;
|
|
25
36
|
}
|
|
26
|
-
declare function JsonConfigIO<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onImport }: JsonConfigIOProps<TLocale, TMeta>): ReactElement;
|
|
37
|
+
declare function JsonConfigIO<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onImport, locale, dictionary }: JsonConfigIOProps<TLocale, TMeta>): ReactElement;
|
|
27
38
|
|
|
28
|
-
export { AdminRallyEditor, type AdminRallyEditorProps, GeneralSettingsForm, type GeneralSettingsFormProps, JsonConfigIO, type JsonConfigIOProps, RallyEditor, SpotItemForm, type SpotItemFormProps };
|
|
39
|
+
export { AdminRallyEditor, type AdminRallyEditorProps, ConditionEditor, type ConditionEditorProps, GeneralSettingsForm, type GeneralSettingsFormProps, JsonConfigIO, type JsonConfigIOProps, RallyEditor, SpotItemForm, type SpotItemFormProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,28 +1,39 @@
|
|
|
1
|
-
import { SupportedLocale, AdminRallyConfig, LocaleDictionary, SpotItem } from '@stamprally/core';
|
|
1
|
+
import { SupportedLocale, AdminRallyConfig, LocaleDictionary, CheckInCondition, SpotItem } from '@stamprally/core';
|
|
2
2
|
import { ReactElement } from 'react';
|
|
3
3
|
|
|
4
4
|
interface AdminRallyEditorProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> {
|
|
5
5
|
readonly config: AdminRallyConfig<TLocale, TMeta>;
|
|
6
6
|
readonly onChange: (config: AdminRallyConfig<TLocale, TMeta>) => void;
|
|
7
|
-
readonly locale?:
|
|
7
|
+
readonly locale?: string;
|
|
8
8
|
readonly dictionary?: LocaleDictionary<TLocale>;
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
type DictionaryProps<TLocale extends string> = {
|
|
11
|
+
readonly locale?: NoInfer<TLocale>;
|
|
12
|
+
readonly dictionary?: LocaleDictionary<TLocale>;
|
|
13
|
+
};
|
|
14
|
+
interface ConditionEditorProps<TLocale extends string = SupportedLocale> extends DictionaryProps<TLocale> {
|
|
15
|
+
readonly condition: CheckInCondition;
|
|
16
|
+
readonly onChange: (condition: CheckInCondition) => void;
|
|
17
|
+
readonly onRemove?: () => void;
|
|
15
18
|
}
|
|
16
|
-
declare function
|
|
17
|
-
interface
|
|
19
|
+
declare function ConditionEditor<TLocale extends string = SupportedLocale>({ condition, onChange, onRemove, locale, dictionary, }: ConditionEditorProps<TLocale>): ReactElement;
|
|
20
|
+
interface SpotItemFormProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> extends DictionaryProps<TLocale> {
|
|
21
|
+
readonly spot: SpotItem<TLocale, TMeta>;
|
|
22
|
+
readonly onChange: (spot: SpotItem<TLocale, TMeta>) => void;
|
|
23
|
+
readonly onRemove?: () => void;
|
|
24
|
+
}
|
|
25
|
+
declare function SpotItemForm<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ spot, onChange, onRemove, locale, dictionary, }: SpotItemFormProps<TLocale, TMeta>): ReactElement;
|
|
26
|
+
declare function AdminRallyEditor<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onChange, locale, dictionary }: AdminRallyEditorProps<TLocale, TMeta>): ReactElement;
|
|
27
|
+
declare const RallyEditor: typeof AdminRallyEditor;
|
|
28
|
+
interface GeneralSettingsFormProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> extends DictionaryProps<TLocale> {
|
|
18
29
|
readonly config: AdminRallyConfig<TLocale, TMeta>;
|
|
19
30
|
readonly onChange: (config: AdminRallyConfig<TLocale, TMeta>) => void;
|
|
20
31
|
}
|
|
21
|
-
declare function GeneralSettingsForm<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onChange }: GeneralSettingsFormProps<TLocale, TMeta>): ReactElement;
|
|
22
|
-
interface JsonConfigIOProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> {
|
|
32
|
+
declare function GeneralSettingsForm<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onChange, locale, dictionary, }: GeneralSettingsFormProps<TLocale, TMeta>): ReactElement;
|
|
33
|
+
interface JsonConfigIOProps<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>> extends DictionaryProps<TLocale> {
|
|
23
34
|
readonly config: AdminRallyConfig<TLocale, TMeta>;
|
|
24
35
|
readonly onImport: (config: AdminRallyConfig<TLocale, TMeta>) => void;
|
|
25
36
|
}
|
|
26
|
-
declare function JsonConfigIO<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onImport }: JsonConfigIOProps<TLocale, TMeta>): ReactElement;
|
|
37
|
+
declare function JsonConfigIO<TLocale extends string = SupportedLocale, TMeta extends Record<string, unknown> = Record<string, unknown>>({ config, onImport, locale, dictionary }: JsonConfigIOProps<TLocale, TMeta>): ReactElement;
|
|
27
38
|
|
|
28
|
-
export { AdminRallyEditor, type AdminRallyEditorProps, GeneralSettingsForm, type GeneralSettingsFormProps, JsonConfigIO, type JsonConfigIOProps, RallyEditor, SpotItemForm, type SpotItemFormProps };
|
|
39
|
+
export { AdminRallyEditor, type AdminRallyEditorProps, ConditionEditor, type ConditionEditorProps, GeneralSettingsForm, type GeneralSettingsFormProps, JsonConfigIO, type JsonConfigIOProps, RallyEditor, SpotItemForm, type SpotItemFormProps };
|