@stamprally/react 0.20.1 → 0.22.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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # @stamprally/react v0.20.1
1
+ # @stamprally/react v0.22.0
2
2
 
3
3
  React integration for `@stamprally/core`. `useStampRally` subscribes to immutable client state and exposes check-in, reward-claim, synchronization, and user-switching operations.
4
4
 
@@ -9,7 +9,7 @@ import { useStampRally } from "@stamprally/react";
9
9
 
10
10
  const config: PublicRallyConfig = {
11
11
  id: "city-tour",
12
- version: "0.20.1",
12
+ version: "0.22.0",
13
13
  title: "City Tour",
14
14
  spots: [{ id: "station", orderIndex: 0, name: "Station", conditions: [{ type: "passcode" }] }],
15
15
  rewards: [],
@@ -35,6 +35,11 @@ state, removes permanently rejected operations, and retains `FAILED_RETRYABLE`
35
35
  operations for retry. `syncState.storageCapability` and
36
36
  `syncState.rejectedHistory` can be passed to a status component.
37
37
 
38
+ The hook exposes the legacy string `queueCapability` (`indexeddb`,
39
+ `localstorage`, `memory`, `custom`, or `disabled`) for direct compatibility
40
+ checks. Detailed information is available through `queueCapabilities`, with
41
+ `storageType`, `isPersistent`, and `multiTabSync` fields.
42
+
38
43
  ## License
39
44
 
40
45
  MIT
package/dist/index.cjs CHANGED
@@ -88,12 +88,14 @@ function useStampRally(client, options = {}) {
88
88
  pendingCount: client.pendingCount,
89
89
  rejectedHistory: client.rejectedHistory,
90
90
  storageCapability: client.storageCapability,
91
- isStoragePersistent: client.isStoragePersistent
91
+ isStoragePersistent: client.isStoragePersistent,
92
+ queueCapabilities: client.queueCapabilities
92
93
  },
93
94
  syncStatus: client.syncState,
94
95
  isSyncing: client.syncState === "syncing",
95
96
  pendingCount: client.pendingCount,
96
97
  queueCapability: client.queueCapability,
98
+ queueCapabilities: client.queueCapabilities,
97
99
  storageCapability: client.storageCapability,
98
100
  isStoragePersistent: client.isStoragePersistent,
99
101
  rejectedHistory: client.rejectedHistory,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useStampRally.ts"],"names":["useCallback","useSyncExternalStore","useState","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CheckInOptions,\n CheckInResult,\n ClaimOptions,\n ClaimResult,\n OfflineQueueCapability,\n OfflineStorageCapability,\n RejectedOperationHistoryEntry,\n StampRallyClient,\n SyncEventListener,\n SyncState,\n UserRallyState,\n} from \"@stamprally/core\";\nimport { useCallback, useEffect, useState, useSyncExternalStore } from \"react\";\n\nexport interface UseStampRallyOptions {\n readonly initialize?: boolean;\n readonly onSyncEvent?: SyncEventListener;\n}\nexport interface UseStampRallySyncState {\n readonly isSyncing: boolean;\n readonly pendingCount: number;\n readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;\n readonly storageCapability: OfflineStorageCapability;\n readonly isStoragePersistent: boolean;\n}\nexport interface UseStampRallyReturn {\n readonly state: UserRallyState | null;\n readonly config: ReturnType<StampRallyClient[\"getConfig\"]>;\n readonly isLoading: boolean;\n readonly error: Error | null;\n readonly onCheckIn: (\n spotId: string,\n proof: unknown,\n options?: CheckInOptions,\n ) => Promise<CheckInResult>;\n readonly onClaimReward: (rewardId: string, options?: ClaimOptions) => Promise<ClaimResult>;\n readonly onSync: () => Promise<void>;\n readonly retrySync: () => Promise<void>;\n readonly syncState: UseStampRallySyncState;\n readonly syncStatus: SyncState;\n readonly isSyncing: boolean;\n readonly pendingCount: number;\n readonly queueCapability: OfflineQueueCapability;\n readonly storageCapability: OfflineStorageCapability;\n readonly isStoragePersistent: boolean;\n readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;\n readonly discardRejected: (operationId: string) => Promise<boolean>;\n readonly retryRejected: (operationId: string) => Promise<boolean>;\n readonly retryOperation: (operationId: string) => Promise<boolean>;\n readonly dismissRejectedOperation: (operationId: string) => Promise<boolean>;\n readonly onSyncEvent: (listener: SyncEventListener) => () => void;\n readonly anonymousSessionId: string;\n readonly switchUser: (userId: string | null) => Promise<UserRallyState>;\n readonly clearUserState: (userId?: string) => Promise<void>;\n}\nfunction serverSnapshot(): null {\n return null;\n}\nfunction errorFrom(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\nexport function useStampRally(\n client: StampRallyClient,\n options: UseStampRallyOptions = {},\n): UseStampRallyReturn {\n const subscribe = useCallback((listener: () => void) => client.subscribe(listener), [client]);\n const getSnapshot = useCallback(() => client.getState(), [client]);\n const state = useSyncExternalStore(subscribe, getSnapshot, serverSnapshot);\n const syncSubscribe = useCallback(\n (listener: () => void) => client.subscribeSyncState(listener),\n [client],\n );\n const syncRevision = useSyncExternalStore(\n syncSubscribe,\n () => client.getSyncRevision(),\n () => 0,\n );\n const [error, setError] = useState<Error | null>(null);\n useEffect(() => {\n if (options.initialize === false || client.getState() !== null) return;\n let active = true;\n void client.init().catch((reason: unknown) => {\n if (active) setError(errorFrom(reason));\n });\n return () => {\n active = false;\n };\n }, [client, options.initialize]);\n useEffect(() => {\n return client.subscribeEvents((event) => {\n if (event.type === \"error\") setError(errorFrom(event.error));\n });\n }, [client]);\n useEffect(() => {\n if (options.onSyncEvent === undefined) return;\n return client.subscribeSyncEvents(options.onSyncEvent);\n }, [client, options.onSyncEvent]);\n const onCheckIn = useCallback(\n (spotId: string, proof: unknown, checkInOptions: CheckInOptions = {}) => {\n setError(null);\n return client.checkIn(spotId, proof, checkInOptions).then((result) => {\n if (!result.ok) setError(errorFrom(result.error));\n return result;\n });\n },\n [client],\n );\n const onClaimReward = useCallback(\n (rewardId: string, claimOptions: ClaimOptions = {}) => {\n setError(null);\n return client.claimReward(rewardId, claimOptions).then((result) => {\n if (!result.ok) setError(errorFrom(result.error));\n return result;\n });\n },\n [client],\n );\n const onSync = useCallback(() => {\n setError(null);\n return client.sync().catch((reason: unknown) => {\n const next = errorFrom(reason);\n setError(next);\n throw next;\n });\n }, [client]);\n const onSyncEvent = useCallback(\n (listener: SyncEventListener) => client.subscribeSyncEvents(listener),\n [client],\n );\n void syncRevision;\n return {\n state,\n config: client.getConfig(),\n isLoading: state === null,\n error,\n onCheckIn,\n onClaimReward,\n onSync,\n retrySync: onSync,\n syncState: {\n isSyncing: client.syncState === \"syncing\",\n pendingCount: client.pendingCount,\n rejectedHistory: client.rejectedHistory,\n storageCapability: client.storageCapability,\n isStoragePersistent: client.isStoragePersistent,\n },\n syncStatus: client.syncState,\n isSyncing: client.syncState === \"syncing\",\n pendingCount: client.pendingCount,\n queueCapability: client.queueCapability,\n storageCapability: client.storageCapability,\n isStoragePersistent: client.isStoragePersistent,\n rejectedHistory: client.rejectedHistory,\n discardRejected: client.discardRejected.bind(client),\n retryRejected: client.retryRejected.bind(client),\n retryOperation: client.retryOperation.bind(client),\n dismissRejectedOperation: client.dismissRejectedOperation.bind(client),\n onSyncEvent,\n anonymousSessionId: client.getAnonymousSessionId(),\n switchUser: client.switchUser.bind(client),\n clearUserState: client.clearUserState.bind(client),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/useStampRally.ts"],"names":["useCallback","useSyncExternalStore","useState","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CheckInOptions,\n CheckInResult,\n ClaimOptions,\n ClaimResult,\n LegacyQueueCapabilityString,\n OfflineStorageCapability,\n QueueCapabilitiesDetail,\n RejectedOperationHistoryEntry,\n StampRallyClient,\n SyncEventListener,\n SyncState,\n UserRallyState,\n} from \"@stamprally/core\";\nimport { useCallback, useEffect, useState, useSyncExternalStore } from \"react\";\n\nexport interface UseStampRallyOptions {\n readonly initialize?: boolean;\n readonly onSyncEvent?: SyncEventListener;\n}\nexport interface UseStampRallySyncState {\n readonly isSyncing: boolean;\n readonly pendingCount: number;\n readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;\n readonly storageCapability: OfflineStorageCapability;\n readonly isStoragePersistent: boolean;\n readonly queueCapabilities: QueueCapabilitiesDetail;\n}\nexport interface UseStampRallyReturn {\n readonly state: UserRallyState | null;\n readonly config: ReturnType<StampRallyClient[\"getConfig\"]>;\n readonly isLoading: boolean;\n readonly error: Error | null;\n readonly onCheckIn: (\n spotId: string,\n proof: unknown,\n options?: CheckInOptions,\n ) => Promise<CheckInResult>;\n readonly onClaimReward: (rewardId: string, options?: ClaimOptions) => Promise<ClaimResult>;\n readonly onSync: () => Promise<void>;\n readonly retrySync: () => Promise<void>;\n readonly syncState: UseStampRallySyncState;\n readonly syncStatus: SyncState;\n readonly isSyncing: boolean;\n readonly pendingCount: number;\n readonly queueCapability: LegacyQueueCapabilityString;\n readonly queueCapabilities: QueueCapabilitiesDetail;\n readonly storageCapability: OfflineStorageCapability;\n readonly isStoragePersistent: boolean;\n readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;\n readonly discardRejected: (operationId: string) => Promise<boolean>;\n readonly retryRejected: (operationId: string) => Promise<boolean>;\n readonly retryOperation: (operationId: string) => Promise<boolean>;\n readonly dismissRejectedOperation: (operationId: string) => Promise<boolean>;\n readonly onSyncEvent: (listener: SyncEventListener) => () => void;\n readonly anonymousSessionId: string;\n readonly switchUser: (userId: string | null) => Promise<UserRallyState>;\n readonly clearUserState: (userId?: string) => Promise<void>;\n}\nfunction serverSnapshot(): null {\n return null;\n}\nfunction errorFrom(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\nexport function useStampRally(\n client: StampRallyClient,\n options: UseStampRallyOptions = {},\n): UseStampRallyReturn {\n const subscribe = useCallback((listener: () => void) => client.subscribe(listener), [client]);\n const getSnapshot = useCallback(() => client.getState(), [client]);\n const state = useSyncExternalStore(subscribe, getSnapshot, serverSnapshot);\n const syncSubscribe = useCallback(\n (listener: () => void) => client.subscribeSyncState(listener),\n [client],\n );\n const syncRevision = useSyncExternalStore(\n syncSubscribe,\n () => client.getSyncRevision(),\n () => 0,\n );\n const [error, setError] = useState<Error | null>(null);\n useEffect(() => {\n if (options.initialize === false || client.getState() !== null) return;\n let active = true;\n void client.init().catch((reason: unknown) => {\n if (active) setError(errorFrom(reason));\n });\n return () => {\n active = false;\n };\n }, [client, options.initialize]);\n useEffect(() => {\n return client.subscribeEvents((event) => {\n if (event.type === \"error\") setError(errorFrom(event.error));\n });\n }, [client]);\n useEffect(() => {\n if (options.onSyncEvent === undefined) return;\n return client.subscribeSyncEvents(options.onSyncEvent);\n }, [client, options.onSyncEvent]);\n const onCheckIn = useCallback(\n (spotId: string, proof: unknown, checkInOptions: CheckInOptions = {}) => {\n setError(null);\n return client.checkIn(spotId, proof, checkInOptions).then((result) => {\n if (!result.ok) setError(errorFrom(result.error));\n return result;\n });\n },\n [client],\n );\n const onClaimReward = useCallback(\n (rewardId: string, claimOptions: ClaimOptions = {}) => {\n setError(null);\n return client.claimReward(rewardId, claimOptions).then((result) => {\n if (!result.ok) setError(errorFrom(result.error));\n return result;\n });\n },\n [client],\n );\n const onSync = useCallback(() => {\n setError(null);\n return client.sync().catch((reason: unknown) => {\n const next = errorFrom(reason);\n setError(next);\n throw next;\n });\n }, [client]);\n const onSyncEvent = useCallback(\n (listener: SyncEventListener) => client.subscribeSyncEvents(listener),\n [client],\n );\n void syncRevision;\n return {\n state,\n config: client.getConfig(),\n isLoading: state === null,\n error,\n onCheckIn,\n onClaimReward,\n onSync,\n retrySync: onSync,\n syncState: {\n isSyncing: client.syncState === \"syncing\",\n pendingCount: client.pendingCount,\n rejectedHistory: client.rejectedHistory,\n storageCapability: client.storageCapability,\n isStoragePersistent: client.isStoragePersistent,\n queueCapabilities: client.queueCapabilities,\n },\n syncStatus: client.syncState,\n isSyncing: client.syncState === \"syncing\",\n pendingCount: client.pendingCount,\n queueCapability: client.queueCapability,\n queueCapabilities: client.queueCapabilities,\n storageCapability: client.storageCapability,\n isStoragePersistent: client.isStoragePersistent,\n rejectedHistory: client.rejectedHistory,\n discardRejected: client.discardRejected.bind(client),\n retryRejected: client.retryRejected.bind(client),\n retryOperation: client.retryOperation.bind(client),\n dismissRejectedOperation: client.dismissRejectedOperation.bind(client),\n onSyncEvent,\n anonymousSessionId: client.getAnonymousSessionId(),\n switchUser: client.switchUser.bind(client),\n clearUserState: client.clearUserState.bind(client),\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { SyncEventListener, UserRallyState, StampRallyClient, CheckInOptions, CheckInResult, ClaimOptions, ClaimResult, RejectedOperationHistoryEntry, OfflineStorageCapability, SyncState, OfflineQueueCapability } from '@stamprally/core';
1
+ import { SyncEventListener, UserRallyState, StampRallyClient, CheckInOptions, CheckInResult, ClaimOptions, ClaimResult, RejectedOperationHistoryEntry, OfflineStorageCapability, QueueCapabilitiesDetail, SyncState, LegacyQueueCapabilityString } from '@stamprally/core';
2
2
 
3
3
  interface UseStampRallyOptions {
4
4
  readonly initialize?: boolean;
@@ -10,6 +10,7 @@ interface UseStampRallySyncState {
10
10
  readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;
11
11
  readonly storageCapability: OfflineStorageCapability;
12
12
  readonly isStoragePersistent: boolean;
13
+ readonly queueCapabilities: QueueCapabilitiesDetail;
13
14
  }
14
15
  interface UseStampRallyReturn {
15
16
  readonly state: UserRallyState | null;
@@ -24,7 +25,8 @@ interface UseStampRallyReturn {
24
25
  readonly syncStatus: SyncState;
25
26
  readonly isSyncing: boolean;
26
27
  readonly pendingCount: number;
27
- readonly queueCapability: OfflineQueueCapability;
28
+ readonly queueCapability: LegacyQueueCapabilityString;
29
+ readonly queueCapabilities: QueueCapabilitiesDetail;
28
30
  readonly storageCapability: OfflineStorageCapability;
29
31
  readonly isStoragePersistent: boolean;
30
32
  readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { SyncEventListener, UserRallyState, StampRallyClient, CheckInOptions, CheckInResult, ClaimOptions, ClaimResult, RejectedOperationHistoryEntry, OfflineStorageCapability, SyncState, OfflineQueueCapability } from '@stamprally/core';
1
+ import { SyncEventListener, UserRallyState, StampRallyClient, CheckInOptions, CheckInResult, ClaimOptions, ClaimResult, RejectedOperationHistoryEntry, OfflineStorageCapability, QueueCapabilitiesDetail, SyncState, LegacyQueueCapabilityString } from '@stamprally/core';
2
2
 
3
3
  interface UseStampRallyOptions {
4
4
  readonly initialize?: boolean;
@@ -10,6 +10,7 @@ interface UseStampRallySyncState {
10
10
  readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;
11
11
  readonly storageCapability: OfflineStorageCapability;
12
12
  readonly isStoragePersistent: boolean;
13
+ readonly queueCapabilities: QueueCapabilitiesDetail;
13
14
  }
14
15
  interface UseStampRallyReturn {
15
16
  readonly state: UserRallyState | null;
@@ -24,7 +25,8 @@ interface UseStampRallyReturn {
24
25
  readonly syncStatus: SyncState;
25
26
  readonly isSyncing: boolean;
26
27
  readonly pendingCount: number;
27
- readonly queueCapability: OfflineQueueCapability;
28
+ readonly queueCapability: LegacyQueueCapabilityString;
29
+ readonly queueCapabilities: QueueCapabilitiesDetail;
28
30
  readonly storageCapability: OfflineStorageCapability;
29
31
  readonly isStoragePersistent: boolean;
30
32
  readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;
package/dist/index.js CHANGED
@@ -86,12 +86,14 @@ function useStampRally(client, options = {}) {
86
86
  pendingCount: client.pendingCount,
87
87
  rejectedHistory: client.rejectedHistory,
88
88
  storageCapability: client.storageCapability,
89
- isStoragePersistent: client.isStoragePersistent
89
+ isStoragePersistent: client.isStoragePersistent,
90
+ queueCapabilities: client.queueCapabilities
90
91
  },
91
92
  syncStatus: client.syncState,
92
93
  isSyncing: client.syncState === "syncing",
93
94
  pendingCount: client.pendingCount,
94
95
  queueCapability: client.queueCapability,
96
+ queueCapabilities: client.queueCapabilities,
95
97
  storageCapability: client.storageCapability,
96
98
  isStoragePersistent: client.isStoragePersistent,
97
99
  rejectedHistory: client.rejectedHistory,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useStampRally.ts"],"names":[],"mappings":";;AAwDA,SAAS,cAAA,GAAuB;AAC9B,EAAA,OAAO,IAAA;AACT;AACA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,OAAO,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACjE;AACO,SAAS,aAAA,CACd,MAAA,EACA,OAAA,GAAgC,EAAC,EACZ;AACrB,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAC,QAAA,KAAyB,MAAA,CAAO,UAAU,QAAQ,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC5F,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM,MAAA,CAAO,UAAS,EAAG,CAAC,MAAM,CAAC,CAAA;AACjE,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,cAAc,CAAA;AACzE,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,QAAA,KAAyB,MAAA,CAAO,kBAAA,CAAmB,QAAQ,CAAA;AAAA,IAC5D,CAAC,MAAM;AAAA,GACT;AACA,EAAqB,oBAAA;AAAA,IACnB,aAAA;AAAA,IACA,MAAM,OAAO,eAAA,EAAgB;AAAA,IAC7B,MAAM;AAAA;AAER,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAuB,IAAI,CAAA;AACrD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAQ,UAAA,KAAe,KAAA,IAAS,MAAA,CAAO,QAAA,OAAe,IAAA,EAAM;AAChE,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAK,MAAA,CAAO,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,MAAA,KAAoB;AAC5C,MAAA,IAAI,MAAA,EAAQ,QAAA,CAAS,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,IACxC,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,GAAS,KAAA;AAAA,IACX,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,CAAQ,UAAU,CAAC,CAAA;AAC/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAA,CAAO,eAAA,CAAgB,CAAC,KAAA,KAAU;AACvC,MAAA,IAAI,MAAM,IAAA,KAAS,OAAA,WAAkB,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IAC7D,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACvC,IAAA,OAAO,MAAA,CAAO,mBAAA,CAAoB,OAAA,CAAQ,WAAW,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,CAAQ,WAAW,CAAC,CAAA;AAChC,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,MAAA,EAAgB,KAAA,EAAgB,cAAA,GAAiC,EAAC,KAAM;AACvE,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,OAAO,MAAA,CAAO,QAAQ,MAAA,EAAQ,KAAA,EAAO,cAAc,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AACpE,QAAA,IAAI,CAAC,MAAA,CAAO,EAAA,WAAa,SAAA,CAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAChD,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,QAAA,EAAkB,YAAA,GAA6B,EAAC,KAAM;AACrD,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,OAAO,OAAO,WAAA,CAAY,QAAA,EAAU,YAAY,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AACjE,QAAA,IAAI,CAAC,MAAA,CAAO,EAAA,WAAa,SAAA,CAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAChD,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAO,MAAA,CAAO,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,MAAA,KAAoB;AAC9C,MAAA,MAAM,IAAA,GAAO,UAAU,MAAM,CAAA;AAC7B,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,MAAM,IAAA;AAAA,IACR,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,QAAA,KAAgC,MAAA,CAAO,mBAAA,CAAoB,QAAQ,CAAA;AAAA,IACpE,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA,EAAQ,OAAO,SAAA,EAAU;AAAA,IACzB,WAAW,KAAA,KAAU,IAAA;AAAA,IACrB,KAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA,EAAW,MAAA;AAAA,IACX,SAAA,EAAW;AAAA,MACT,SAAA,EAAW,OAAO,SAAA,KAAc,SAAA;AAAA,MAChC,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,MAC1B,qBAAqB,MAAA,CAAO;AAAA,KAC9B;AAAA,IACA,YAAY,MAAA,CAAO,SAAA;AAAA,IACnB,SAAA,EAAW,OAAO,SAAA,KAAc,SAAA;AAAA,IAChC,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,IAC1B,qBAAqB,MAAA,CAAO,mBAAA;AAAA,IAC5B,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,eAAA,EAAiB,MAAA,CAAO,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAA;AAAA,IACnD,aAAA,EAAe,MAAA,CAAO,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AAAA,IAC/C,cAAA,EAAgB,MAAA,CAAO,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AAAA,IACjD,wBAAA,EAA0B,MAAA,CAAO,wBAAA,CAAyB,IAAA,CAAK,MAAM,CAAA;AAAA,IACrE,WAAA;AAAA,IACA,kBAAA,EAAoB,OAAO,qBAAA,EAAsB;AAAA,IACjD,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAAA,IACzC,cAAA,EAAgB,MAAA,CAAO,cAAA,CAAe,IAAA,CAAK,MAAM;AAAA,GACnD;AACF","file":"index.js","sourcesContent":["import type {\n CheckInOptions,\n CheckInResult,\n ClaimOptions,\n ClaimResult,\n OfflineQueueCapability,\n OfflineStorageCapability,\n RejectedOperationHistoryEntry,\n StampRallyClient,\n SyncEventListener,\n SyncState,\n UserRallyState,\n} from \"@stamprally/core\";\nimport { useCallback, useEffect, useState, useSyncExternalStore } from \"react\";\n\nexport interface UseStampRallyOptions {\n readonly initialize?: boolean;\n readonly onSyncEvent?: SyncEventListener;\n}\nexport interface UseStampRallySyncState {\n readonly isSyncing: boolean;\n readonly pendingCount: number;\n readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;\n readonly storageCapability: OfflineStorageCapability;\n readonly isStoragePersistent: boolean;\n}\nexport interface UseStampRallyReturn {\n readonly state: UserRallyState | null;\n readonly config: ReturnType<StampRallyClient[\"getConfig\"]>;\n readonly isLoading: boolean;\n readonly error: Error | null;\n readonly onCheckIn: (\n spotId: string,\n proof: unknown,\n options?: CheckInOptions,\n ) => Promise<CheckInResult>;\n readonly onClaimReward: (rewardId: string, options?: ClaimOptions) => Promise<ClaimResult>;\n readonly onSync: () => Promise<void>;\n readonly retrySync: () => Promise<void>;\n readonly syncState: UseStampRallySyncState;\n readonly syncStatus: SyncState;\n readonly isSyncing: boolean;\n readonly pendingCount: number;\n readonly queueCapability: OfflineQueueCapability;\n readonly storageCapability: OfflineStorageCapability;\n readonly isStoragePersistent: boolean;\n readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;\n readonly discardRejected: (operationId: string) => Promise<boolean>;\n readonly retryRejected: (operationId: string) => Promise<boolean>;\n readonly retryOperation: (operationId: string) => Promise<boolean>;\n readonly dismissRejectedOperation: (operationId: string) => Promise<boolean>;\n readonly onSyncEvent: (listener: SyncEventListener) => () => void;\n readonly anonymousSessionId: string;\n readonly switchUser: (userId: string | null) => Promise<UserRallyState>;\n readonly clearUserState: (userId?: string) => Promise<void>;\n}\nfunction serverSnapshot(): null {\n return null;\n}\nfunction errorFrom(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\nexport function useStampRally(\n client: StampRallyClient,\n options: UseStampRallyOptions = {},\n): UseStampRallyReturn {\n const subscribe = useCallback((listener: () => void) => client.subscribe(listener), [client]);\n const getSnapshot = useCallback(() => client.getState(), [client]);\n const state = useSyncExternalStore(subscribe, getSnapshot, serverSnapshot);\n const syncSubscribe = useCallback(\n (listener: () => void) => client.subscribeSyncState(listener),\n [client],\n );\n const syncRevision = useSyncExternalStore(\n syncSubscribe,\n () => client.getSyncRevision(),\n () => 0,\n );\n const [error, setError] = useState<Error | null>(null);\n useEffect(() => {\n if (options.initialize === false || client.getState() !== null) return;\n let active = true;\n void client.init().catch((reason: unknown) => {\n if (active) setError(errorFrom(reason));\n });\n return () => {\n active = false;\n };\n }, [client, options.initialize]);\n useEffect(() => {\n return client.subscribeEvents((event) => {\n if (event.type === \"error\") setError(errorFrom(event.error));\n });\n }, [client]);\n useEffect(() => {\n if (options.onSyncEvent === undefined) return;\n return client.subscribeSyncEvents(options.onSyncEvent);\n }, [client, options.onSyncEvent]);\n const onCheckIn = useCallback(\n (spotId: string, proof: unknown, checkInOptions: CheckInOptions = {}) => {\n setError(null);\n return client.checkIn(spotId, proof, checkInOptions).then((result) => {\n if (!result.ok) setError(errorFrom(result.error));\n return result;\n });\n },\n [client],\n );\n const onClaimReward = useCallback(\n (rewardId: string, claimOptions: ClaimOptions = {}) => {\n setError(null);\n return client.claimReward(rewardId, claimOptions).then((result) => {\n if (!result.ok) setError(errorFrom(result.error));\n return result;\n });\n },\n [client],\n );\n const onSync = useCallback(() => {\n setError(null);\n return client.sync().catch((reason: unknown) => {\n const next = errorFrom(reason);\n setError(next);\n throw next;\n });\n }, [client]);\n const onSyncEvent = useCallback(\n (listener: SyncEventListener) => client.subscribeSyncEvents(listener),\n [client],\n );\n void syncRevision;\n return {\n state,\n config: client.getConfig(),\n isLoading: state === null,\n error,\n onCheckIn,\n onClaimReward,\n onSync,\n retrySync: onSync,\n syncState: {\n isSyncing: client.syncState === \"syncing\",\n pendingCount: client.pendingCount,\n rejectedHistory: client.rejectedHistory,\n storageCapability: client.storageCapability,\n isStoragePersistent: client.isStoragePersistent,\n },\n syncStatus: client.syncState,\n isSyncing: client.syncState === \"syncing\",\n pendingCount: client.pendingCount,\n queueCapability: client.queueCapability,\n storageCapability: client.storageCapability,\n isStoragePersistent: client.isStoragePersistent,\n rejectedHistory: client.rejectedHistory,\n discardRejected: client.discardRejected.bind(client),\n retryRejected: client.retryRejected.bind(client),\n retryOperation: client.retryOperation.bind(client),\n dismissRejectedOperation: client.dismissRejectedOperation.bind(client),\n onSyncEvent,\n anonymousSessionId: client.getAnonymousSessionId(),\n switchUser: client.switchUser.bind(client),\n clearUserState: client.clearUserState.bind(client),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/useStampRally.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n CheckInOptions,\n CheckInResult,\n ClaimOptions,\n ClaimResult,\n LegacyQueueCapabilityString,\n OfflineStorageCapability,\n QueueCapabilitiesDetail,\n RejectedOperationHistoryEntry,\n StampRallyClient,\n SyncEventListener,\n SyncState,\n UserRallyState,\n} from \"@stamprally/core\";\nimport { useCallback, useEffect, useState, useSyncExternalStore } from \"react\";\n\nexport interface UseStampRallyOptions {\n readonly initialize?: boolean;\n readonly onSyncEvent?: SyncEventListener;\n}\nexport interface UseStampRallySyncState {\n readonly isSyncing: boolean;\n readonly pendingCount: number;\n readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;\n readonly storageCapability: OfflineStorageCapability;\n readonly isStoragePersistent: boolean;\n readonly queueCapabilities: QueueCapabilitiesDetail;\n}\nexport interface UseStampRallyReturn {\n readonly state: UserRallyState | null;\n readonly config: ReturnType<StampRallyClient[\"getConfig\"]>;\n readonly isLoading: boolean;\n readonly error: Error | null;\n readonly onCheckIn: (\n spotId: string,\n proof: unknown,\n options?: CheckInOptions,\n ) => Promise<CheckInResult>;\n readonly onClaimReward: (rewardId: string, options?: ClaimOptions) => Promise<ClaimResult>;\n readonly onSync: () => Promise<void>;\n readonly retrySync: () => Promise<void>;\n readonly syncState: UseStampRallySyncState;\n readonly syncStatus: SyncState;\n readonly isSyncing: boolean;\n readonly pendingCount: number;\n readonly queueCapability: LegacyQueueCapabilityString;\n readonly queueCapabilities: QueueCapabilitiesDetail;\n readonly storageCapability: OfflineStorageCapability;\n readonly isStoragePersistent: boolean;\n readonly rejectedHistory: ReadonlyArray<RejectedOperationHistoryEntry>;\n readonly discardRejected: (operationId: string) => Promise<boolean>;\n readonly retryRejected: (operationId: string) => Promise<boolean>;\n readonly retryOperation: (operationId: string) => Promise<boolean>;\n readonly dismissRejectedOperation: (operationId: string) => Promise<boolean>;\n readonly onSyncEvent: (listener: SyncEventListener) => () => void;\n readonly anonymousSessionId: string;\n readonly switchUser: (userId: string | null) => Promise<UserRallyState>;\n readonly clearUserState: (userId?: string) => Promise<void>;\n}\nfunction serverSnapshot(): null {\n return null;\n}\nfunction errorFrom(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\nexport function useStampRally(\n client: StampRallyClient,\n options: UseStampRallyOptions = {},\n): UseStampRallyReturn {\n const subscribe = useCallback((listener: () => void) => client.subscribe(listener), [client]);\n const getSnapshot = useCallback(() => client.getState(), [client]);\n const state = useSyncExternalStore(subscribe, getSnapshot, serverSnapshot);\n const syncSubscribe = useCallback(\n (listener: () => void) => client.subscribeSyncState(listener),\n [client],\n );\n const syncRevision = useSyncExternalStore(\n syncSubscribe,\n () => client.getSyncRevision(),\n () => 0,\n );\n const [error, setError] = useState<Error | null>(null);\n useEffect(() => {\n if (options.initialize === false || client.getState() !== null) return;\n let active = true;\n void client.init().catch((reason: unknown) => {\n if (active) setError(errorFrom(reason));\n });\n return () => {\n active = false;\n };\n }, [client, options.initialize]);\n useEffect(() => {\n return client.subscribeEvents((event) => {\n if (event.type === \"error\") setError(errorFrom(event.error));\n });\n }, [client]);\n useEffect(() => {\n if (options.onSyncEvent === undefined) return;\n return client.subscribeSyncEvents(options.onSyncEvent);\n }, [client, options.onSyncEvent]);\n const onCheckIn = useCallback(\n (spotId: string, proof: unknown, checkInOptions: CheckInOptions = {}) => {\n setError(null);\n return client.checkIn(spotId, proof, checkInOptions).then((result) => {\n if (!result.ok) setError(errorFrom(result.error));\n return result;\n });\n },\n [client],\n );\n const onClaimReward = useCallback(\n (rewardId: string, claimOptions: ClaimOptions = {}) => {\n setError(null);\n return client.claimReward(rewardId, claimOptions).then((result) => {\n if (!result.ok) setError(errorFrom(result.error));\n return result;\n });\n },\n [client],\n );\n const onSync = useCallback(() => {\n setError(null);\n return client.sync().catch((reason: unknown) => {\n const next = errorFrom(reason);\n setError(next);\n throw next;\n });\n }, [client]);\n const onSyncEvent = useCallback(\n (listener: SyncEventListener) => client.subscribeSyncEvents(listener),\n [client],\n );\n void syncRevision;\n return {\n state,\n config: client.getConfig(),\n isLoading: state === null,\n error,\n onCheckIn,\n onClaimReward,\n onSync,\n retrySync: onSync,\n syncState: {\n isSyncing: client.syncState === \"syncing\",\n pendingCount: client.pendingCount,\n rejectedHistory: client.rejectedHistory,\n storageCapability: client.storageCapability,\n isStoragePersistent: client.isStoragePersistent,\n queueCapabilities: client.queueCapabilities,\n },\n syncStatus: client.syncState,\n isSyncing: client.syncState === \"syncing\",\n pendingCount: client.pendingCount,\n queueCapability: client.queueCapability,\n queueCapabilities: client.queueCapabilities,\n storageCapability: client.storageCapability,\n isStoragePersistent: client.isStoragePersistent,\n rejectedHistory: client.rejectedHistory,\n discardRejected: client.discardRejected.bind(client),\n retryRejected: client.retryRejected.bind(client),\n retryOperation: client.retryOperation.bind(client),\n dismissRejectedOperation: client.dismissRejectedOperation.bind(client),\n onSyncEvent,\n anonymousSessionId: client.getAnonymousSessionId(),\n switchUser: client.switchUser.bind(client),\n clearUserState: client.clearUserState.bind(client),\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stamprally/react",
3
- "version": "0.20.1",
3
+ "version": "0.22.0",
4
4
  "description": "React hooks for @stamprally/core.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -34,7 +34,7 @@
34
34
  }
35
35
  },
36
36
  "dependencies": {
37
- "@stamprally/core": "0.20.1"
37
+ "@stamprally/core": "0.22.0"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "react": "^18.0.0 || ^19.0.0",