@swishapp/react 0.80.3 → 0.80.4

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 ADDED
@@ -0,0 +1,369 @@
1
+ let react = require("react");
2
+ let react_jsx_runtime = require("react/jsx-runtime");
3
+
4
+ //#region src/context.tsx
5
+ const SwishContext = (0, react.createContext)({
6
+ swish: null,
7
+ isLoading: false,
8
+ error: null
9
+ });
10
+ const swishCdnBaseUrl = "https://swish.app/cdn";
11
+ const swishSdkVersion = "0.80.3";
12
+ function SwishProvider({ children, options }) {
13
+ const [swish, setSwish] = (0, react.useState)(null);
14
+ const [isLoading, setIsLoading] = (0, react.useState)(typeof window !== "undefined");
15
+ const [error, setError] = (0, react.useState)(null);
16
+ const optionsRef = (0, react.useRef)(options);
17
+ (0, react.useEffect)(() => {
18
+ if (typeof window === "undefined") return;
19
+ let cancelled = false;
20
+ const initializeSdk = async () => {
21
+ try {
22
+ setIsLoading(true);
23
+ setError(null);
24
+ const { createSwish } = await import(
25
+ /* webpackIgnore: true */
26
+ `${swishCdnBaseUrl}/sdk@${swishSdkVersion}/swish.js`
27
+ );
28
+ const swish$1 = await createSwish(optionsRef.current);
29
+ if (!cancelled) setSwish(swish$1);
30
+ } catch (err) {
31
+ console.error("Failed to initialize Swish", err);
32
+ if (!cancelled) setError(err instanceof Error ? err : /* @__PURE__ */ new Error("Failed to initialize Swish"));
33
+ } finally {
34
+ if (!cancelled) setIsLoading(false);
35
+ }
36
+ };
37
+ initializeSdk();
38
+ return () => {
39
+ cancelled = true;
40
+ };
41
+ }, []);
42
+ const value = {
43
+ swish,
44
+ isLoading,
45
+ error
46
+ };
47
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SwishContext.Provider, {
48
+ value,
49
+ children
50
+ });
51
+ }
52
+
53
+ //#endregion
54
+ //#region src/hooks/use-swish.ts
55
+ function useSwish() {
56
+ const context = (0, react.useContext)(SwishContext);
57
+ if (typeof window !== "undefined" && window.swish) return window.swish;
58
+ if (context === void 0) throw new Error("useSwishContext must be used within a SwishProvider");
59
+ return context.swish;
60
+ }
61
+
62
+ //#endregion
63
+ //#region src/hooks/use-swish-query.ts
64
+ const defaultRefetchEvents = [
65
+ "item-create",
66
+ "item-update",
67
+ "item-delete",
68
+ "item-lists-update",
69
+ "list-create",
70
+ "list-update",
71
+ "list-delete",
72
+ "token-update"
73
+ ];
74
+ const tokenUpdateEvent = "token-update";
75
+ const useSwishQuery = (fetch, options) => {
76
+ const swish = useSwish();
77
+ const fetchRef = (0, react.useRef)(fetch);
78
+ const [data, setData] = (0, react.useState)(null);
79
+ const [pageInfo, setPageInfo] = (0, react.useState)(null);
80
+ const [error, setError] = (0, react.useState)(null);
81
+ const [loading, setLoading] = (0, react.useState)(!options?.skip);
82
+ const [initialized, setInitialized] = (0, react.useState)(false);
83
+ const refetching = loading && initialized;
84
+ const reset = (0, react.useCallback)(() => {
85
+ setData(null);
86
+ setPageInfo(null);
87
+ setError(null);
88
+ setLoading(false);
89
+ setInitialized(false);
90
+ }, []);
91
+ const deps = options?.variables ? Object.values(options.variables) : [];
92
+ const skip = !!options?.skip;
93
+ const refetchEvents = (0, react.useMemo)(() => {
94
+ if (options?.refetch === true) return defaultRefetchEvents;
95
+ if (Array.isArray(options?.refetch)) return [...options.refetch, tokenUpdateEvent];
96
+ return [];
97
+ }, [options?.refetch]);
98
+ const executeFetch = (0, react.useCallback)(() => {
99
+ if (!swish || skip) return;
100
+ setLoading(true);
101
+ console.log("executeFetch", fetchRef.current, options?.variables);
102
+ fetchRef.current(swish.api, options?.variables).then((response) => {
103
+ setError("error" in response ? response.error : null);
104
+ setData("data" in response ? response.data : null);
105
+ setPageInfo("pageInfo" in response ? response.pageInfo : null);
106
+ }).catch((error$1) => setError(error$1)).finally(() => {
107
+ setLoading(false);
108
+ setInitialized(true);
109
+ });
110
+ }, [
111
+ swish,
112
+ skip,
113
+ ...deps
114
+ ]);
115
+ const refetch = (0, react.useCallback)(() => {
116
+ executeFetch();
117
+ }, [executeFetch]);
118
+ (0, react.useEffect)(() => {
119
+ if (!swish) return;
120
+ executeFetch();
121
+ const unsubscribe = swish.events.subscribe(refetchEvents, () => {
122
+ refetch();
123
+ });
124
+ return () => unsubscribe();
125
+ }, [executeFetch, refetch]);
126
+ return (0, react.useMemo)(() => ({
127
+ data,
128
+ pageInfo,
129
+ error,
130
+ loading,
131
+ reset,
132
+ refetch,
133
+ refetching
134
+ }), [
135
+ data,
136
+ pageInfo,
137
+ error,
138
+ loading,
139
+ reset,
140
+ refetch,
141
+ refetching
142
+ ]);
143
+ };
144
+
145
+ //#endregion
146
+ //#region src/hooks/use-swish-intent.ts
147
+ const useSwishIntent = (intent) => {
148
+ const swish = useSwish();
149
+ const [pending, setPending] = (0, react.useState)(false);
150
+ const intentRef = (0, react.useRef)(intent);
151
+ (0, react.useEffect)(() => {
152
+ intentRef.current = intent;
153
+ }, [intent]);
154
+ return {
155
+ invoke: (0, react.useCallback)(async () => {
156
+ if (!swish) throw new Error("Swish SDK not initialized");
157
+ setPending(true);
158
+ const response = await (await swish.intents.invoke(intentRef.current)).complete;
159
+ setPending(false);
160
+ return response;
161
+ }, [swish]),
162
+ pending
163
+ };
164
+ };
165
+
166
+ //#endregion
167
+ //#region src/hooks/use-swish-lists.ts
168
+ const useSwishLists = () => {
169
+ const { data: lists, loading, error, reset } = useSwishQuery((api) => api.lists.list(), { refetch: [
170
+ "item-lists-update",
171
+ "item-delete",
172
+ "list-create",
173
+ "list-update",
174
+ "list-delete"
175
+ ] });
176
+ return (0, react.useMemo)(() => ({
177
+ loading,
178
+ lists,
179
+ error,
180
+ reset
181
+ }), [
182
+ lists,
183
+ loading,
184
+ error,
185
+ reset
186
+ ]);
187
+ };
188
+
189
+ //#endregion
190
+ //#region src/hooks/use-swish-items.ts
191
+ const useSwishItems = ({ listId, limit = 24 } = {}) => {
192
+ const [nextPage, setNextPage] = (0, react.useState)(null);
193
+ const [data, setData] = (0, react.useState)([]);
194
+ const { data: remoteData, pageInfo, loading, error, reset: resetRemoteData } = useSwishQuery((api, variables) => api.items.list(variables), {
195
+ variables: {
196
+ page: nextPage ?? void 0,
197
+ limit,
198
+ listId
199
+ },
200
+ refetch: false
201
+ });
202
+ const reset = (0, react.useCallback)(() => {
203
+ setData([]);
204
+ setNextPage(null);
205
+ resetRemoteData();
206
+ }, [resetRemoteData]);
207
+ (0, react.useEffect)(() => {
208
+ if (remoteData) setData((prev) => [...prev, ...remoteData]);
209
+ }, [remoteData]);
210
+ const loadMore = (0, react.useCallback)(() => {
211
+ if (pageInfo?.next) setNextPage(pageInfo.next);
212
+ }, [pageInfo?.next]);
213
+ return (0, react.useMemo)(() => ({
214
+ loading,
215
+ data,
216
+ pageInfo,
217
+ error,
218
+ reset,
219
+ hasMore: !!pageInfo?.next,
220
+ loadMore
221
+ }), [
222
+ data,
223
+ pageInfo,
224
+ loading,
225
+ error,
226
+ reset,
227
+ loadMore
228
+ ]);
229
+ };
230
+
231
+ //#endregion
232
+ //#region src/utils/shopify-utils.ts
233
+ const gidToId = (gid) => {
234
+ return gid?.split("/").pop();
235
+ };
236
+
237
+ //#endregion
238
+ //#region src/hooks/use-swish-item.ts
239
+ const useSwishItem = ({ productId, variantId, itemId, onSave, onUnsave, onUpdate }) => {
240
+ const [savedItemId, setSavedItemId] = (0, react.useState)(itemId ?? null);
241
+ const onUnsaveRef = (0, react.useRef)(onUnsave);
242
+ const onSaveRef = (0, react.useRef)(onSave);
243
+ const onUpdateRef = (0, react.useRef)(onUpdate);
244
+ onUnsaveRef.current = onUnsave;
245
+ onSaveRef.current = onSave;
246
+ onUpdateRef.current = onUpdate;
247
+ const { invoke: saveItem, pending: creatingItem } = useSwishIntent({
248
+ action: "create",
249
+ type: "swish/Item",
250
+ data: {
251
+ productId,
252
+ variantId
253
+ }
254
+ });
255
+ const { invoke: editItemLists } = useSwishIntent({
256
+ action: "edit",
257
+ type: "swish/ItemLists",
258
+ data: { itemId: savedItemId ?? "" }
259
+ });
260
+ const { invoke: unsaveItem } = useSwishIntent({
261
+ action: "delete",
262
+ type: "swish/Item",
263
+ data: { itemId: savedItemId ?? "" }
264
+ });
265
+ const { data: savedItems, loading: savedItemsLoading, error: savedItemsError } = useSwishQuery((api, variables) => api.items.list(variables), {
266
+ refetch: [
267
+ "item-create",
268
+ "item-update",
269
+ "item-delete"
270
+ ],
271
+ variables: {
272
+ limit: 1,
273
+ query: (0, react.useMemo)(() => {
274
+ if (variantId) return `variant:${gidToId(variantId.toString())}`;
275
+ return `product:${gidToId(productId.toString())}`;
276
+ }, [productId, variantId])
277
+ },
278
+ skip: Boolean(itemId) || !productId
279
+ });
280
+ const saved = (0, react.useMemo)(() => Boolean(savedItemId), [savedItemId]);
281
+ const error = (0, react.useMemo)(() => savedItemsError, [savedItemsError]);
282
+ const loading = (0, react.useMemo)(() => savedItemsLoading || creatingItem, [savedItemsLoading, creatingItem]);
283
+ (0, react.useEffect)(() => {
284
+ if (itemId) return;
285
+ if (savedItems?.[0]) setSavedItemId(savedItems[0].id);
286
+ else setSavedItemId(null);
287
+ }, [savedItems, itemId]);
288
+ const unsave = (0, react.useCallback)(async () => {
289
+ const response = await unsaveItem();
290
+ if (response.code === "ok") {
291
+ const data = response.data;
292
+ setSavedItemId(null);
293
+ onUnsaveRef.current?.(data);
294
+ }
295
+ }, [unsaveItem]);
296
+ const update = (0, react.useCallback)(async () => {
297
+ const response = await editItemLists();
298
+ if (response.code === "ok") {
299
+ const data = response.data;
300
+ if ("itemId" in data) {
301
+ setSavedItemId(null);
302
+ onUnsaveRef.current?.(data);
303
+ } else onUpdateRef.current?.(data);
304
+ }
305
+ }, [editItemLists]);
306
+ const save = (0, react.useCallback)(async () => {
307
+ const response = await saveItem();
308
+ if (response.code === "ok") {
309
+ const data = response.data;
310
+ setSavedItemId(data.item.id);
311
+ onSaveRef.current?.(data);
312
+ }
313
+ }, [saveItem]);
314
+ const toggle = (0, react.useCallback)(async () => {
315
+ if (saved) await unsave();
316
+ else await save();
317
+ }, [
318
+ saved,
319
+ save,
320
+ update
321
+ ]);
322
+ return (0, react.useMemo)(() => {
323
+ return {
324
+ saved,
325
+ loading,
326
+ error,
327
+ save,
328
+ unsave,
329
+ update,
330
+ toggle
331
+ };
332
+ }, [
333
+ saved,
334
+ loading,
335
+ error,
336
+ save,
337
+ unsave,
338
+ update,
339
+ toggle
340
+ ]);
341
+ };
342
+
343
+ //#endregion
344
+ //#region src/hooks/use-swish-item-count.ts
345
+ const useSwishItemCount = () => {
346
+ const { data, loading, error } = useSwishQuery((api) => api.items.count(), { refetch: ["item-create", "item-delete"] });
347
+ return (0, react.useMemo)(() => {
348
+ return {
349
+ count: data?.count ?? 0,
350
+ loading,
351
+ error
352
+ };
353
+ }, [
354
+ data,
355
+ loading,
356
+ error
357
+ ]);
358
+ };
359
+
360
+ //#endregion
361
+ exports.SwishProvider = SwishProvider;
362
+ exports.useSwish = useSwish;
363
+ exports.useSwishIntent = useSwishIntent;
364
+ exports.useSwishItem = useSwishItem;
365
+ exports.useSwishItemCount = useSwishItemCount;
366
+ exports.useSwishItems = useSwishItems;
367
+ exports.useSwishLists = useSwishLists;
368
+ exports.useSwishQuery = useSwishQuery;
369
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["swish","value: SwishContextValue","defaultRefetchEvents: EventName[]","tokenUpdateEvent: EventName","error"],"sources":["../src/context.tsx","../src/hooks/use-swish.ts","../src/hooks/use-swish-query.ts","../src/hooks/use-swish-intent.ts","../src/hooks/use-swish-lists.ts","../src/hooks/use-swish-items.ts","../src/utils/shopify-utils.ts","../src/hooks/use-swish-item.ts","../src/hooks/use-swish-item-count.ts"],"sourcesContent":["import type { SwishApp, SwishOptions } from \"@swishapp/sdk\";\nimport { createContext, ReactNode, useEffect, useRef, useState } from \"react\";\nimport type { SwishContextValue } from \"./types\";\n\nexport const SwishContext = createContext<SwishContextValue>({\n swish: null,\n isLoading: false,\n error: null,\n});\n\nexport interface SwishProviderProps {\n children: ReactNode;\n options: SwishOptions;\n}\n\nconst swishCdnBaseUrl = \"https://swish.app/cdn\";\nconst swishSdkVersion = \"0.80.3\";\n\nexport function SwishProvider({ children, options }: SwishProviderProps) {\n const [swish, setSwish] = useState<SwishApp | null>(null);\n const [isLoading, setIsLoading] = useState(typeof window !== \"undefined\");\n const [error, setError] = useState<Error | null>(null);\n const optionsRef = useRef<SwishOptions>(options);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n let cancelled = false;\n\n const initializeSdk = async () => {\n try {\n setIsLoading(true);\n setError(null);\n\n const { createSwish } = await import(\n /* webpackIgnore: true */\n `${swishCdnBaseUrl}/sdk@${swishSdkVersion}/swish.js`\n );\n const swish = await createSwish(optionsRef.current);\n\n if (!cancelled) {\n setSwish(swish);\n }\n } catch (err) {\n console.error(\"Failed to initialize Swish\", err);\n if (!cancelled) {\n setError(\n err instanceof Error ? err : new Error(\"Failed to initialize Swish\")\n );\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n initializeSdk();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n const value: SwishContextValue = {\n swish,\n isLoading,\n error,\n };\n\n return (\n <SwishContext.Provider value={value}>{children}</SwishContext.Provider>\n );\n}\n","import type { SwishApp } from \"@swishapp/sdk\";\nimport { useContext } from \"react\";\nimport { SwishContext } from \"../context\";\n\nexport function useSwish(): SwishApp | null {\n const context = useContext(SwishContext);\n\n if (typeof window !== \"undefined\" && window.swish) {\n return window.swish;\n }\n\n if (context === undefined) {\n throw new Error(\"useSwishContext must be used within a SwishProvider\");\n }\n\n return context.swish;\n}\n","import type {\n SwishApp,\n ApiResponse,\n ApiError,\n PageInfo,\n EventName,\n PaginatedApiResponse,\n} from \"@swishapp/sdk\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useSwish } from \"./use-swish\";\n\nexport type FetchFn<TResponse, TVariables> = (\n swish: SwishApp[\"api\"],\n variables?: TVariables\n) => Promise<TResponse>;\n\nconst defaultRefetchEvents: EventName[] = [\n \"item-create\",\n \"item-update\",\n \"item-delete\",\n \"item-lists-update\",\n \"list-create\",\n \"list-update\",\n \"list-delete\",\n \"token-update\",\n];\n\nconst tokenUpdateEvent: EventName = \"token-update\";\n\ntype DataOf<T> = T extends { data: infer D } ? D : never;\n\nexport const useSwishQuery = <\n TResponse extends ApiResponse<any> | PaginatedApiResponse<any>,\n TVariables\n>(\n fetch: FetchFn<TResponse, TVariables>,\n options?: {\n variables?: TVariables;\n skip?: boolean;\n refetch?: boolean | EventName[];\n }\n) => {\n const swish = useSwish();\n const fetchRef = useRef<FetchFn<TResponse, TVariables>>(fetch);\n\n const [data, setData] = useState<DataOf<TResponse> | null>(null);\n const [pageInfo, setPageInfo] = useState<PageInfo | null>(null);\n const [error, setError] = useState<ApiError | null>(null);\n const [loading, setLoading] = useState(!options?.skip);\n const [initialized, setInitialized] = useState(false);\n const refetching = loading && initialized;\n\n const reset = useCallback(() => {\n setData(null);\n setPageInfo(null);\n setError(null);\n setLoading(false);\n setInitialized(false);\n }, []);\n\n const deps = options?.variables ? Object.values(options.variables) : [];\n const skip = !!options?.skip;\n const refetchEvents = useMemo(() => {\n if (options?.refetch === true) {\n return defaultRefetchEvents;\n }\n\n if (Array.isArray(options?.refetch)) {\n return [...options.refetch, tokenUpdateEvent];\n }\n\n return [];\n }, [options?.refetch]);\n\n const executeFetch = useCallback(() => {\n if (!swish || skip) {\n return;\n }\n\n setLoading(true);\n\n console.log(\"executeFetch\", fetchRef.current, options?.variables);\n\n fetchRef\n .current(swish.api, options?.variables)\n .then((response) => {\n setError(\"error\" in response ? response.error : null);\n setData(\"data\" in response ? response.data : null);\n setPageInfo(\"pageInfo\" in response ? response.pageInfo : null);\n })\n .catch((error) => setError(error))\n .finally(() => {\n setLoading(false);\n setInitialized(true);\n });\n }, [swish, skip, ...deps]);\n\n const refetch = useCallback(() => {\n executeFetch();\n }, [executeFetch]);\n\n useEffect(() => {\n if (!swish) {\n return;\n }\n\n executeFetch();\n\n const unsubscribe = swish.events.subscribe(refetchEvents, () => {\n refetch();\n });\n\n return () => unsubscribe();\n }, [executeFetch, refetch]);\n\n return useMemo(\n () => ({\n data,\n pageInfo,\n error,\n loading,\n reset,\n refetch,\n refetching,\n }),\n [data, pageInfo, error, loading, reset, refetch, refetching]\n );\n};\n","import type { Intent, IntentResponse } from \"@swishapp/sdk\";\nimport { useSwish } from \"./use-swish\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport const useSwishIntent = <T extends Intent = Intent>(intent: T) => {\n const swish = useSwish();\n const [pending, setPending] = useState(false);\n\n const intentRef = useRef<T>(intent);\n\n useEffect(() => {\n intentRef.current = intent;\n }, [intent]);\n\n const invoke = useCallback(async (): Promise<IntentResponse<T>> => {\n if (!swish) {\n throw new Error(\"Swish SDK not initialized\");\n }\n\n setPending(true);\n const activity = await swish.intents.invoke(intentRef.current);\n const response = await activity.complete;\n setPending(false);\n\n return response as IntentResponse<T>;\n }, [swish]);\n\n return { invoke, pending };\n};\n","import { useMemo } from \"react\";\nimport { useSwishQuery } from \"./use-swish-query\";\n\nexport interface UseSwishListsOptions {\n limit?: number;\n}\n\nexport const useSwishLists = () => {\n const {\n data: lists,\n loading,\n error,\n reset,\n } = useSwishQuery((api) => api.lists.list(), {\n refetch: [\n \"item-lists-update\",\n \"item-delete\",\n \"list-create\",\n \"list-update\",\n \"list-delete\",\n ],\n });\n\n return useMemo(\n () => ({\n loading,\n lists,\n error,\n reset,\n }),\n [lists, loading, error, reset]\n );\n};\n","import type { Item } from \"@swishapp/sdk\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useSwishQuery } from \"./use-swish-query\";\n\nexport interface UseSwishItemsOptions {\n listId?: string;\n limit?: number;\n}\n\nexport const useSwishItems = ({\n listId,\n limit = 24,\n}: UseSwishItemsOptions = {}) => {\n const [nextPage, setNextPage] = useState<string | null>(null);\n const [data, setData] = useState<Item[]>([]);\n\n const {\n data: remoteData,\n pageInfo,\n loading,\n error,\n reset: resetRemoteData,\n } = useSwishQuery((api, variables) => api.items.list(variables), {\n variables: {\n page: nextPage ?? undefined,\n limit,\n listId,\n },\n refetch: false,\n });\n\n const reset = useCallback(() => {\n setData([]);\n setNextPage(null);\n resetRemoteData();\n }, [resetRemoteData]);\n\n useEffect(() => {\n if (remoteData) {\n setData((prev) => [...prev, ...remoteData]);\n }\n }, [remoteData]);\n\n const loadMore = useCallback(() => {\n if (pageInfo?.next) {\n setNextPage(pageInfo.next);\n }\n }, [pageInfo?.next]);\n\n return useMemo(\n () => ({\n loading,\n data,\n pageInfo,\n error,\n reset,\n hasMore: !!pageInfo?.next,\n loadMore,\n }),\n [data, pageInfo, loading, error, reset, loadMore]\n );\n};\n","export const gidToId = (gid: string) => {\n return gid?.split(\"/\").pop();\n};\n\nexport const idToGid = (id: string | number, type: string) => {\n return `gid://shopify/${type}/${id}`;\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useSwishQuery } from \"./use-swish-query\";\nimport { gidToId } from \"../utils/shopify-utils\";\nimport type {\n CreateItemSuccessResponse,\n DeleteItemSuccessResponse,\n EditItemListsSuccessResponse,\n} from \"@swishapp/sdk\";\nimport { useSwishIntent } from \"./use-swish-intent\";\n\ninterface UseSwishItemProps {\n productId: string | number;\n variantId?: string | number;\n itemId?: string;\n onSave?: (data: CreateItemSuccessResponse[\"data\"]) => void;\n onUnsave?: (data: DeleteItemSuccessResponse[\"data\"]) => void;\n onUpdate?: (data: EditItemListsSuccessResponse[\"data\"]) => void;\n}\n\nexport const useSwishItem = ({\n productId,\n variantId,\n itemId,\n onSave,\n onUnsave,\n onUpdate,\n}: UseSwishItemProps) => {\n const [savedItemId, setSavedItemId] = useState<string | null>(itemId ?? null);\n\n const onUnsaveRef =\n useRef<NonNullable<UseSwishItemProps[\"onUnsave\"]>>(onUnsave);\n const onSaveRef = useRef<NonNullable<UseSwishItemProps[\"onSave\"]>>(onSave);\n const onUpdateRef =\n useRef<NonNullable<UseSwishItemProps[\"onUpdate\"]>>(onUpdate);\n\n onUnsaveRef.current = onUnsave;\n onSaveRef.current = onSave;\n onUpdateRef.current = onUpdate;\n\n const { invoke: saveItem, pending: creatingItem } = useSwishIntent({\n action: \"create\",\n type: \"swish/Item\",\n data: {\n productId,\n variantId,\n },\n });\n\n const { invoke: editItemLists } = useSwishIntent({\n action: \"edit\",\n type: \"swish/ItemLists\",\n data: {\n itemId: savedItemId ?? \"\",\n },\n });\n\n const { invoke: unsaveItem } = useSwishIntent({\n action: \"delete\",\n type: \"swish/Item\",\n data: {\n itemId: savedItemId ?? \"\",\n },\n });\n\n const query = useMemo(() => {\n if (variantId) {\n return `variant:${gidToId(variantId.toString())}`;\n }\n return `product:${gidToId(productId.toString())}`;\n }, [productId, variantId]);\n\n // Load saved items for the product or variant\n const {\n data: savedItems,\n loading: savedItemsLoading,\n error: savedItemsError,\n } = useSwishQuery((api, variables) => api.items.list(variables), {\n refetch: [\"item-create\", \"item-update\", \"item-delete\"],\n variables: {\n limit: 1,\n query,\n },\n skip: Boolean(itemId) || !productId,\n });\n\n const saved = useMemo(() => Boolean(savedItemId), [savedItemId]);\n const error = useMemo(() => savedItemsError, [savedItemsError]);\n const loading = useMemo(\n () => savedItemsLoading || creatingItem,\n [savedItemsLoading, creatingItem]\n );\n\n useEffect(() => {\n if (itemId) return;\n\n if (savedItems?.[0]) {\n setSavedItemId(savedItems[0].id);\n } else {\n setSavedItemId(null);\n }\n }, [savedItems, itemId]);\n\n const unsave = useCallback(async () => {\n const response = await unsaveItem();\n\n if (response.code === \"ok\") {\n const data = response.data;\n setSavedItemId(null);\n onUnsaveRef.current?.(data);\n }\n }, [unsaveItem]);\n\n const update = useCallback(async () => {\n const response = await editItemLists();\n if (response.code === \"ok\") {\n const data = response.data;\n if (\"itemId\" in data) {\n // Item was unsaved from list-select\n setSavedItemId(null);\n onUnsaveRef.current?.(data);\n } else {\n onUpdateRef.current?.(data);\n }\n }\n }, [editItemLists]);\n\n const save = useCallback(async () => {\n const response = await saveItem();\n\n if (response.code === \"ok\") {\n const data = response.data;\n setSavedItemId(data.item.id);\n onSaveRef.current?.(data);\n }\n }, [saveItem]);\n\n const toggle = useCallback(async () => {\n if (saved) {\n await unsave();\n } else {\n await save();\n }\n }, [saved, save, update]);\n\n return useMemo(() => {\n return { saved, loading, error, save, unsave, update, toggle };\n }, [saved, loading, error, save, unsave, update, toggle]);\n};\n","import { useMemo } from \"react\";\nimport { useSwishQuery } from \"./use-swish-query\";\n\nexport const useSwishItemCount = () => {\n const { data, loading, error } = useSwishQuery((api) => api.items.count(), {\n refetch: [\"item-create\", \"item-delete\"],\n });\n\n return useMemo(() => {\n return {\n count: data?.count ?? 0,\n loading,\n error,\n };\n }, [data, loading, error]);\n};\n"],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import { ReactNode } from "react";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import { ApiError, ApiResponse, CreateItemSuccessResponse, DeleteItemSuccessResponse, EditItemListsSuccessResponse, EventName, Intent, IntentResponse, Item, PageInfo, PaginatedApiResponse, SwishApp, SwishApp as SwishApp$1, SwishOptions, SwishOptions as SwishOptions$1 } from "@swishapp/sdk";
4
+ import * as _swishapp_api_client2 from "@swishapp/api-client";
5
+
6
+ //#region src/types.d.ts
7
+ interface SwishContextValue {
8
+ swish: SwishApp$1 | null;
9
+ isLoading: boolean;
10
+ error: Error | null;
11
+ }
12
+ //#endregion
13
+ //#region src/context.d.ts
14
+ interface SwishProviderProps {
15
+ children: ReactNode;
16
+ options: SwishOptions$1;
17
+ }
18
+ declare function SwishProvider({
19
+ children,
20
+ options
21
+ }: SwishProviderProps): react_jsx_runtime0.JSX.Element;
22
+ //#endregion
23
+ //#region src/hooks/use-swish.d.ts
24
+ declare function useSwish(): SwishApp$1 | null;
25
+ //#endregion
26
+ //#region src/hooks/use-swish-query.d.ts
27
+ type FetchFn<TResponse, TVariables> = (swish: SwishApp$1["api"], variables?: TVariables) => Promise<TResponse>;
28
+ type DataOf<T> = T extends {
29
+ data: infer D;
30
+ } ? D : never;
31
+ declare const useSwishQuery: <TResponse extends ApiResponse<any> | PaginatedApiResponse<any>, TVariables>(fetch: FetchFn<TResponse, TVariables>, options?: {
32
+ variables?: TVariables;
33
+ skip?: boolean;
34
+ refetch?: boolean | EventName[];
35
+ }) => {
36
+ data: DataOf<TResponse> | null;
37
+ pageInfo: PageInfo | null;
38
+ error: ApiError | null;
39
+ loading: boolean;
40
+ reset: () => void;
41
+ refetch: () => void;
42
+ refetching: boolean;
43
+ };
44
+ //#endregion
45
+ //#region src/hooks/use-swish-intent.d.ts
46
+ declare const useSwishIntent: <T extends Intent = Intent>(intent: T) => {
47
+ invoke: () => Promise<IntentResponse<T>>;
48
+ pending: boolean;
49
+ };
50
+ //#endregion
51
+ //#region src/hooks/use-swish-lists.d.ts
52
+ declare const useSwishLists: () => {
53
+ loading: boolean;
54
+ lists: _swishapp_api_client2.ListDetail[] | null;
55
+ error: _swishapp_api_client2.ApiError | null;
56
+ reset: () => void;
57
+ };
58
+ //#endregion
59
+ //#region src/hooks/use-swish-items.d.ts
60
+ interface UseSwishItemsOptions {
61
+ listId?: string;
62
+ limit?: number;
63
+ }
64
+ declare const useSwishItems: ({
65
+ listId,
66
+ limit
67
+ }?: UseSwishItemsOptions) => {
68
+ loading: boolean;
69
+ data: Item[];
70
+ pageInfo: _swishapp_api_client2.PageInfo | null;
71
+ error: _swishapp_api_client2.ApiError | null;
72
+ reset: () => void;
73
+ hasMore: boolean;
74
+ loadMore: () => void;
75
+ };
76
+ //#endregion
77
+ //#region src/hooks/use-swish-item.d.ts
78
+ interface UseSwishItemProps {
79
+ productId: string | number;
80
+ variantId?: string | number;
81
+ itemId?: string;
82
+ onSave?: (data: CreateItemSuccessResponse["data"]) => void;
83
+ onUnsave?: (data: DeleteItemSuccessResponse["data"]) => void;
84
+ onUpdate?: (data: EditItemListsSuccessResponse["data"]) => void;
85
+ }
86
+ declare const useSwishItem: ({
87
+ productId,
88
+ variantId,
89
+ itemId,
90
+ onSave,
91
+ onUnsave,
92
+ onUpdate
93
+ }: UseSwishItemProps) => {
94
+ saved: boolean;
95
+ loading: boolean;
96
+ error: _swishapp_api_client2.ApiError | null;
97
+ save: () => Promise<void>;
98
+ unsave: () => Promise<void>;
99
+ update: () => Promise<void>;
100
+ toggle: () => Promise<void>;
101
+ };
102
+ //#endregion
103
+ //#region src/hooks/use-swish-item-count.d.ts
104
+ declare const useSwishItemCount: () => {
105
+ count: number;
106
+ loading: boolean;
107
+ error: _swishapp_api_client2.ApiError | null;
108
+ };
109
+ //#endregion
110
+ export { type SwishApp, type SwishContextValue, type SwishOptions, SwishProvider, type SwishProviderProps, useSwish, useSwishIntent, useSwishItem, useSwishItemCount, useSwishItems, useSwishLists, useSwishQuery };
111
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/context.tsx","../src/hooks/use-swish.ts","../src/hooks/use-swish-query.ts","../src/hooks/use-swish-intent.ts","../src/hooks/use-swish-lists.ts","../src/hooks/use-swish-items.ts","../src/hooks/use-swish-item.ts","../src/hooks/use-swish-item-count.ts"],"sourcesContent":[],"mappings":";;;;;;UAEiB,iBAAA;SACR;;SAEA;;;;UCKQ,kBAAA;YACL;EDTK,OAAA,ECUN,cDVuB;;iBCgBlB,aAAA;;;GAAqC,qBAAkB,kBAAA,CAAA,GAAA,CAAA;;;iBCdvD,QAAA,CAAA,GAAY;;;KCOhB,yCACH,+BACK,eACT,QAAQ;KAeR,YAAY;;IAA8B;cAElC,kCACO,mBAAmB,8CAG9B,QAAQ,WAAW;EHjCX,SAAA,CAAA,EGmCD,UHnCkB;;sBGqCV;;EF7BP,IAAA,QAAA,UAAkB,CAAA,GAAA,IAAA;EAQnB,QAAA,UAAa,GAAA,IAAA;EAAG,KAAA,UAAA,GAAA,IAAA;EAAU,OAAA,EAAA,OAAA;EAAW,KAAA,EAAA,GAAA,GAAA,IAAA;EAAkB,OAAA,EAAA,GAAA,GAAA,IAAA;EAAA,UAAA,EAAA,OAAA;;;;cGd1D,2BAA4B,SAAS,gBAAgB;gBAU3B,QAAQ,eAAe;;;;;cCPjD;;SAyBZ,qBAAA,CAAA,UAAA;EL9BgB,KAAA,EK8BhB,qBAAA,CAAA,QAAA,GL3Ba,IAAA;;;;;UMDG,oBAAA;;;;cAKJ;;;IAGV;ENVc,OAAA,EAAA,OAAA;;;;ECQA,KAAA,EAAA,GAAA,GAAA,IAAA;EAQD,OAAA,EAAA,OAAa;EAAG,QAAA,EAAA,GAAA,GAAA,IAAA;CAAU;;;UMRhC,iBAAA;;;;kBAIQ;EPZD,QAAA,CAAA,EAAA,CAAA,IAAA,EOaG,yBPVX,CAAA,MAAK,CAAA,EAAA,GAAA,IAAA;oBOWM;;cAGP;;;;;;;GAOV;ENhBc,KAAA,EAAA,OAAA;EAQD,OAAA,EAAA,OAAa;EAAG,KAAA,EMQZ,qBAAA,CAAA,QAAA,GNRY,IAAA;EAAU,IAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EAAW,MAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EAAkB,MAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EAAA,MAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;;;;cOf1D;;;SAYZ,qBAAA,CAAA,QAAA"}
@@ -0,0 +1,111 @@
1
+ import { ReactNode } from "react";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import { ApiError, ApiResponse, CreateItemSuccessResponse, DeleteItemSuccessResponse, EditItemListsSuccessResponse, EventName, Intent, IntentResponse, Item, PageInfo, PaginatedApiResponse, SwishApp, SwishApp as SwishApp$1, SwishOptions, SwishOptions as SwishOptions$1 } from "@swishapp/sdk";
4
+ import * as _swishapp_api_client0 from "@swishapp/api-client";
5
+
6
+ //#region src/types.d.ts
7
+ interface SwishContextValue {
8
+ swish: SwishApp$1 | null;
9
+ isLoading: boolean;
10
+ error: Error | null;
11
+ }
12
+ //#endregion
13
+ //#region src/context.d.ts
14
+ interface SwishProviderProps {
15
+ children: ReactNode;
16
+ options: SwishOptions$1;
17
+ }
18
+ declare function SwishProvider({
19
+ children,
20
+ options
21
+ }: SwishProviderProps): react_jsx_runtime0.JSX.Element;
22
+ //#endregion
23
+ //#region src/hooks/use-swish.d.ts
24
+ declare function useSwish(): SwishApp$1 | null;
25
+ //#endregion
26
+ //#region src/hooks/use-swish-query.d.ts
27
+ type FetchFn<TResponse, TVariables> = (swish: SwishApp$1["api"], variables?: TVariables) => Promise<TResponse>;
28
+ type DataOf<T> = T extends {
29
+ data: infer D;
30
+ } ? D : never;
31
+ declare const useSwishQuery: <TResponse extends ApiResponse<any> | PaginatedApiResponse<any>, TVariables>(fetch: FetchFn<TResponse, TVariables>, options?: {
32
+ variables?: TVariables;
33
+ skip?: boolean;
34
+ refetch?: boolean | EventName[];
35
+ }) => {
36
+ data: DataOf<TResponse> | null;
37
+ pageInfo: PageInfo | null;
38
+ error: ApiError | null;
39
+ loading: boolean;
40
+ reset: () => void;
41
+ refetch: () => void;
42
+ refetching: boolean;
43
+ };
44
+ //#endregion
45
+ //#region src/hooks/use-swish-intent.d.ts
46
+ declare const useSwishIntent: <T extends Intent = Intent>(intent: T) => {
47
+ invoke: () => Promise<IntentResponse<T>>;
48
+ pending: boolean;
49
+ };
50
+ //#endregion
51
+ //#region src/hooks/use-swish-lists.d.ts
52
+ declare const useSwishLists: () => {
53
+ loading: boolean;
54
+ lists: _swishapp_api_client0.ListDetail[] | null;
55
+ error: _swishapp_api_client0.ApiError | null;
56
+ reset: () => void;
57
+ };
58
+ //#endregion
59
+ //#region src/hooks/use-swish-items.d.ts
60
+ interface UseSwishItemsOptions {
61
+ listId?: string;
62
+ limit?: number;
63
+ }
64
+ declare const useSwishItems: ({
65
+ listId,
66
+ limit
67
+ }?: UseSwishItemsOptions) => {
68
+ loading: boolean;
69
+ data: Item[];
70
+ pageInfo: _swishapp_api_client0.PageInfo | null;
71
+ error: _swishapp_api_client0.ApiError | null;
72
+ reset: () => void;
73
+ hasMore: boolean;
74
+ loadMore: () => void;
75
+ };
76
+ //#endregion
77
+ //#region src/hooks/use-swish-item.d.ts
78
+ interface UseSwishItemProps {
79
+ productId: string | number;
80
+ variantId?: string | number;
81
+ itemId?: string;
82
+ onSave?: (data: CreateItemSuccessResponse["data"]) => void;
83
+ onUnsave?: (data: DeleteItemSuccessResponse["data"]) => void;
84
+ onUpdate?: (data: EditItemListsSuccessResponse["data"]) => void;
85
+ }
86
+ declare const useSwishItem: ({
87
+ productId,
88
+ variantId,
89
+ itemId,
90
+ onSave,
91
+ onUnsave,
92
+ onUpdate
93
+ }: UseSwishItemProps) => {
94
+ saved: boolean;
95
+ loading: boolean;
96
+ error: _swishapp_api_client0.ApiError | null;
97
+ save: () => Promise<void>;
98
+ unsave: () => Promise<void>;
99
+ update: () => Promise<void>;
100
+ toggle: () => Promise<void>;
101
+ };
102
+ //#endregion
103
+ //#region src/hooks/use-swish-item-count.d.ts
104
+ declare const useSwishItemCount: () => {
105
+ count: number;
106
+ loading: boolean;
107
+ error: _swishapp_api_client0.ApiError | null;
108
+ };
109
+ //#endregion
110
+ export { type SwishApp, type SwishContextValue, type SwishOptions, SwishProvider, type SwishProviderProps, useSwish, useSwishIntent, useSwishItem, useSwishItemCount, useSwishItems, useSwishLists, useSwishQuery };
111
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/context.tsx","../src/hooks/use-swish.ts","../src/hooks/use-swish-query.ts","../src/hooks/use-swish-intent.ts","../src/hooks/use-swish-lists.ts","../src/hooks/use-swish-items.ts","../src/hooks/use-swish-item.ts","../src/hooks/use-swish-item-count.ts"],"sourcesContent":[],"mappings":";;;;;;UAEiB,iBAAA;SACR;;SAEA;;;;UCKQ,kBAAA;YACL;EDTK,OAAA,ECUN,cDVuB;;iBCgBlB,aAAA;;;GAAqC,qBAAkB,kBAAA,CAAA,GAAA,CAAA;;;iBCdvD,QAAA,CAAA,GAAY;;;KCOhB,yCACH,+BACK,eACT,QAAQ;KAeR,YAAY;;IAA8B;cAElC,kCACO,mBAAmB,8CAG9B,QAAQ,WAAW;EHjCX,SAAA,CAAA,EGmCD,UHnCkB;;sBGqCV;;EF7BP,IAAA,QAAA,UAAkB,CAAA,GAAA,IAAA;EAQnB,QAAA,UAAa,GAAA,IAAA;EAAG,KAAA,UAAA,GAAA,IAAA;EAAU,OAAA,EAAA,OAAA;EAAW,KAAA,EAAA,GAAA,GAAA,IAAA;EAAkB,OAAA,EAAA,GAAA,GAAA,IAAA;EAAA,UAAA,EAAA,OAAA;;;;cGd1D,2BAA4B,SAAS,gBAAgB;gBAU3B,QAAQ,eAAe;;;;;cCPjD;;SAyBZ,qBAAA,CAAA,UAAA;EL9BgB,KAAA,EK8BhB,qBAAA,CAAA,QAAA,GL3Ba,IAAA;;;;;UMDG,oBAAA;;;;cAKJ;;;IAGV;ENVc,OAAA,EAAA,OAAA;;;;ECQA,KAAA,EAAA,GAAA,GAAA,IAAA;EAQD,OAAA,EAAA,OAAa;EAAG,QAAA,EAAA,GAAA,GAAA,IAAA;CAAU;;;UMRhC,iBAAA;;;;kBAIQ;EPZD,QAAA,CAAA,EAAA,CAAA,IAAA,EOaG,yBPVX,CAAA,MAAK,CAAA,EAAA,GAAA,IAAA;oBOWM;;cAGP;;;;;;;GAOV;ENhBc,KAAA,EAAA,OAAA;EAQD,OAAA,EAAA,OAAa;EAAG,KAAA,EMQZ,qBAAA,CAAA,QAAA,GNRY,IAAA;EAAU,IAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EAAW,MAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EAAkB,MAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EAAA,MAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;;;;cOf1D;;;SAYZ,qBAAA,CAAA,QAAA"}
package/dist/index.mjs ADDED
@@ -0,0 +1,362 @@
1
+ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
2
+ import { jsx } from "react/jsx-runtime";
3
+
4
+ //#region src/context.tsx
5
+ const SwishContext = createContext({
6
+ swish: null,
7
+ isLoading: false,
8
+ error: null
9
+ });
10
+ const swishCdnBaseUrl = "https://swish.app/cdn";
11
+ const swishSdkVersion = "0.80.3";
12
+ function SwishProvider({ children, options }) {
13
+ const [swish, setSwish] = useState(null);
14
+ const [isLoading, setIsLoading] = useState(typeof window !== "undefined");
15
+ const [error, setError] = useState(null);
16
+ const optionsRef = useRef(options);
17
+ useEffect(() => {
18
+ if (typeof window === "undefined") return;
19
+ let cancelled = false;
20
+ const initializeSdk = async () => {
21
+ try {
22
+ setIsLoading(true);
23
+ setError(null);
24
+ const { createSwish } = await import(
25
+ /* webpackIgnore: true */
26
+ `${swishCdnBaseUrl}/sdk@${swishSdkVersion}/swish.js`
27
+ );
28
+ const swish$1 = await createSwish(optionsRef.current);
29
+ if (!cancelled) setSwish(swish$1);
30
+ } catch (err) {
31
+ console.error("Failed to initialize Swish", err);
32
+ if (!cancelled) setError(err instanceof Error ? err : /* @__PURE__ */ new Error("Failed to initialize Swish"));
33
+ } finally {
34
+ if (!cancelled) setIsLoading(false);
35
+ }
36
+ };
37
+ initializeSdk();
38
+ return () => {
39
+ cancelled = true;
40
+ };
41
+ }, []);
42
+ const value = {
43
+ swish,
44
+ isLoading,
45
+ error
46
+ };
47
+ return /* @__PURE__ */ jsx(SwishContext.Provider, {
48
+ value,
49
+ children
50
+ });
51
+ }
52
+
53
+ //#endregion
54
+ //#region src/hooks/use-swish.ts
55
+ function useSwish() {
56
+ const context = useContext(SwishContext);
57
+ if (typeof window !== "undefined" && window.swish) return window.swish;
58
+ if (context === void 0) throw new Error("useSwishContext must be used within a SwishProvider");
59
+ return context.swish;
60
+ }
61
+
62
+ //#endregion
63
+ //#region src/hooks/use-swish-query.ts
64
+ const defaultRefetchEvents = [
65
+ "item-create",
66
+ "item-update",
67
+ "item-delete",
68
+ "item-lists-update",
69
+ "list-create",
70
+ "list-update",
71
+ "list-delete",
72
+ "token-update"
73
+ ];
74
+ const tokenUpdateEvent = "token-update";
75
+ const useSwishQuery = (fetch, options) => {
76
+ const swish = useSwish();
77
+ const fetchRef = useRef(fetch);
78
+ const [data, setData] = useState(null);
79
+ const [pageInfo, setPageInfo] = useState(null);
80
+ const [error, setError] = useState(null);
81
+ const [loading, setLoading] = useState(!options?.skip);
82
+ const [initialized, setInitialized] = useState(false);
83
+ const refetching = loading && initialized;
84
+ const reset = useCallback(() => {
85
+ setData(null);
86
+ setPageInfo(null);
87
+ setError(null);
88
+ setLoading(false);
89
+ setInitialized(false);
90
+ }, []);
91
+ const deps = options?.variables ? Object.values(options.variables) : [];
92
+ const skip = !!options?.skip;
93
+ const refetchEvents = useMemo(() => {
94
+ if (options?.refetch === true) return defaultRefetchEvents;
95
+ if (Array.isArray(options?.refetch)) return [...options.refetch, tokenUpdateEvent];
96
+ return [];
97
+ }, [options?.refetch]);
98
+ const executeFetch = useCallback(() => {
99
+ if (!swish || skip) return;
100
+ setLoading(true);
101
+ console.log("executeFetch", fetchRef.current, options?.variables);
102
+ fetchRef.current(swish.api, options?.variables).then((response) => {
103
+ setError("error" in response ? response.error : null);
104
+ setData("data" in response ? response.data : null);
105
+ setPageInfo("pageInfo" in response ? response.pageInfo : null);
106
+ }).catch((error$1) => setError(error$1)).finally(() => {
107
+ setLoading(false);
108
+ setInitialized(true);
109
+ });
110
+ }, [
111
+ swish,
112
+ skip,
113
+ ...deps
114
+ ]);
115
+ const refetch = useCallback(() => {
116
+ executeFetch();
117
+ }, [executeFetch]);
118
+ useEffect(() => {
119
+ if (!swish) return;
120
+ executeFetch();
121
+ const unsubscribe = swish.events.subscribe(refetchEvents, () => {
122
+ refetch();
123
+ });
124
+ return () => unsubscribe();
125
+ }, [executeFetch, refetch]);
126
+ return useMemo(() => ({
127
+ data,
128
+ pageInfo,
129
+ error,
130
+ loading,
131
+ reset,
132
+ refetch,
133
+ refetching
134
+ }), [
135
+ data,
136
+ pageInfo,
137
+ error,
138
+ loading,
139
+ reset,
140
+ refetch,
141
+ refetching
142
+ ]);
143
+ };
144
+
145
+ //#endregion
146
+ //#region src/hooks/use-swish-intent.ts
147
+ const useSwishIntent = (intent) => {
148
+ const swish = useSwish();
149
+ const [pending, setPending] = useState(false);
150
+ const intentRef = useRef(intent);
151
+ useEffect(() => {
152
+ intentRef.current = intent;
153
+ }, [intent]);
154
+ return {
155
+ invoke: useCallback(async () => {
156
+ if (!swish) throw new Error("Swish SDK not initialized");
157
+ setPending(true);
158
+ const response = await (await swish.intents.invoke(intentRef.current)).complete;
159
+ setPending(false);
160
+ return response;
161
+ }, [swish]),
162
+ pending
163
+ };
164
+ };
165
+
166
+ //#endregion
167
+ //#region src/hooks/use-swish-lists.ts
168
+ const useSwishLists = () => {
169
+ const { data: lists, loading, error, reset } = useSwishQuery((api) => api.lists.list(), { refetch: [
170
+ "item-lists-update",
171
+ "item-delete",
172
+ "list-create",
173
+ "list-update",
174
+ "list-delete"
175
+ ] });
176
+ return useMemo(() => ({
177
+ loading,
178
+ lists,
179
+ error,
180
+ reset
181
+ }), [
182
+ lists,
183
+ loading,
184
+ error,
185
+ reset
186
+ ]);
187
+ };
188
+
189
+ //#endregion
190
+ //#region src/hooks/use-swish-items.ts
191
+ const useSwishItems = ({ listId, limit = 24 } = {}) => {
192
+ const [nextPage, setNextPage] = useState(null);
193
+ const [data, setData] = useState([]);
194
+ const { data: remoteData, pageInfo, loading, error, reset: resetRemoteData } = useSwishQuery((api, variables) => api.items.list(variables), {
195
+ variables: {
196
+ page: nextPage ?? void 0,
197
+ limit,
198
+ listId
199
+ },
200
+ refetch: false
201
+ });
202
+ const reset = useCallback(() => {
203
+ setData([]);
204
+ setNextPage(null);
205
+ resetRemoteData();
206
+ }, [resetRemoteData]);
207
+ useEffect(() => {
208
+ if (remoteData) setData((prev) => [...prev, ...remoteData]);
209
+ }, [remoteData]);
210
+ const loadMore = useCallback(() => {
211
+ if (pageInfo?.next) setNextPage(pageInfo.next);
212
+ }, [pageInfo?.next]);
213
+ return useMemo(() => ({
214
+ loading,
215
+ data,
216
+ pageInfo,
217
+ error,
218
+ reset,
219
+ hasMore: !!pageInfo?.next,
220
+ loadMore
221
+ }), [
222
+ data,
223
+ pageInfo,
224
+ loading,
225
+ error,
226
+ reset,
227
+ loadMore
228
+ ]);
229
+ };
230
+
231
+ //#endregion
232
+ //#region src/utils/shopify-utils.ts
233
+ const gidToId = (gid) => {
234
+ return gid?.split("/").pop();
235
+ };
236
+
237
+ //#endregion
238
+ //#region src/hooks/use-swish-item.ts
239
+ const useSwishItem = ({ productId, variantId, itemId, onSave, onUnsave, onUpdate }) => {
240
+ const [savedItemId, setSavedItemId] = useState(itemId ?? null);
241
+ const onUnsaveRef = useRef(onUnsave);
242
+ const onSaveRef = useRef(onSave);
243
+ const onUpdateRef = useRef(onUpdate);
244
+ onUnsaveRef.current = onUnsave;
245
+ onSaveRef.current = onSave;
246
+ onUpdateRef.current = onUpdate;
247
+ const { invoke: saveItem, pending: creatingItem } = useSwishIntent({
248
+ action: "create",
249
+ type: "swish/Item",
250
+ data: {
251
+ productId,
252
+ variantId
253
+ }
254
+ });
255
+ const { invoke: editItemLists } = useSwishIntent({
256
+ action: "edit",
257
+ type: "swish/ItemLists",
258
+ data: { itemId: savedItemId ?? "" }
259
+ });
260
+ const { invoke: unsaveItem } = useSwishIntent({
261
+ action: "delete",
262
+ type: "swish/Item",
263
+ data: { itemId: savedItemId ?? "" }
264
+ });
265
+ const { data: savedItems, loading: savedItemsLoading, error: savedItemsError } = useSwishQuery((api, variables) => api.items.list(variables), {
266
+ refetch: [
267
+ "item-create",
268
+ "item-update",
269
+ "item-delete"
270
+ ],
271
+ variables: {
272
+ limit: 1,
273
+ query: useMemo(() => {
274
+ if (variantId) return `variant:${gidToId(variantId.toString())}`;
275
+ return `product:${gidToId(productId.toString())}`;
276
+ }, [productId, variantId])
277
+ },
278
+ skip: Boolean(itemId) || !productId
279
+ });
280
+ const saved = useMemo(() => Boolean(savedItemId), [savedItemId]);
281
+ const error = useMemo(() => savedItemsError, [savedItemsError]);
282
+ const loading = useMemo(() => savedItemsLoading || creatingItem, [savedItemsLoading, creatingItem]);
283
+ useEffect(() => {
284
+ if (itemId) return;
285
+ if (savedItems?.[0]) setSavedItemId(savedItems[0].id);
286
+ else setSavedItemId(null);
287
+ }, [savedItems, itemId]);
288
+ const unsave = useCallback(async () => {
289
+ const response = await unsaveItem();
290
+ if (response.code === "ok") {
291
+ const data = response.data;
292
+ setSavedItemId(null);
293
+ onUnsaveRef.current?.(data);
294
+ }
295
+ }, [unsaveItem]);
296
+ const update = useCallback(async () => {
297
+ const response = await editItemLists();
298
+ if (response.code === "ok") {
299
+ const data = response.data;
300
+ if ("itemId" in data) {
301
+ setSavedItemId(null);
302
+ onUnsaveRef.current?.(data);
303
+ } else onUpdateRef.current?.(data);
304
+ }
305
+ }, [editItemLists]);
306
+ const save = useCallback(async () => {
307
+ const response = await saveItem();
308
+ if (response.code === "ok") {
309
+ const data = response.data;
310
+ setSavedItemId(data.item.id);
311
+ onSaveRef.current?.(data);
312
+ }
313
+ }, [saveItem]);
314
+ const toggle = useCallback(async () => {
315
+ if (saved) await unsave();
316
+ else await save();
317
+ }, [
318
+ saved,
319
+ save,
320
+ update
321
+ ]);
322
+ return useMemo(() => {
323
+ return {
324
+ saved,
325
+ loading,
326
+ error,
327
+ save,
328
+ unsave,
329
+ update,
330
+ toggle
331
+ };
332
+ }, [
333
+ saved,
334
+ loading,
335
+ error,
336
+ save,
337
+ unsave,
338
+ update,
339
+ toggle
340
+ ]);
341
+ };
342
+
343
+ //#endregion
344
+ //#region src/hooks/use-swish-item-count.ts
345
+ const useSwishItemCount = () => {
346
+ const { data, loading, error } = useSwishQuery((api) => api.items.count(), { refetch: ["item-create", "item-delete"] });
347
+ return useMemo(() => {
348
+ return {
349
+ count: data?.count ?? 0,
350
+ loading,
351
+ error
352
+ };
353
+ }, [
354
+ data,
355
+ loading,
356
+ error
357
+ ]);
358
+ };
359
+
360
+ //#endregion
361
+ export { SwishProvider, useSwish, useSwishIntent, useSwishItem, useSwishItemCount, useSwishItems, useSwishLists, useSwishQuery };
362
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["swish","value: SwishContextValue","defaultRefetchEvents: EventName[]","tokenUpdateEvent: EventName","error"],"sources":["../src/context.tsx","../src/hooks/use-swish.ts","../src/hooks/use-swish-query.ts","../src/hooks/use-swish-intent.ts","../src/hooks/use-swish-lists.ts","../src/hooks/use-swish-items.ts","../src/utils/shopify-utils.ts","../src/hooks/use-swish-item.ts","../src/hooks/use-swish-item-count.ts"],"sourcesContent":["import type { SwishApp, SwishOptions } from \"@swishapp/sdk\";\nimport { createContext, ReactNode, useEffect, useRef, useState } from \"react\";\nimport type { SwishContextValue } from \"./types\";\n\nexport const SwishContext = createContext<SwishContextValue>({\n swish: null,\n isLoading: false,\n error: null,\n});\n\nexport interface SwishProviderProps {\n children: ReactNode;\n options: SwishOptions;\n}\n\nconst swishCdnBaseUrl = \"https://swish.app/cdn\";\nconst swishSdkVersion = \"0.80.3\";\n\nexport function SwishProvider({ children, options }: SwishProviderProps) {\n const [swish, setSwish] = useState<SwishApp | null>(null);\n const [isLoading, setIsLoading] = useState(typeof window !== \"undefined\");\n const [error, setError] = useState<Error | null>(null);\n const optionsRef = useRef<SwishOptions>(options);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n let cancelled = false;\n\n const initializeSdk = async () => {\n try {\n setIsLoading(true);\n setError(null);\n\n const { createSwish } = await import(\n /* webpackIgnore: true */\n `${swishCdnBaseUrl}/sdk@${swishSdkVersion}/swish.js`\n );\n const swish = await createSwish(optionsRef.current);\n\n if (!cancelled) {\n setSwish(swish);\n }\n } catch (err) {\n console.error(\"Failed to initialize Swish\", err);\n if (!cancelled) {\n setError(\n err instanceof Error ? err : new Error(\"Failed to initialize Swish\")\n );\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n initializeSdk();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n const value: SwishContextValue = {\n swish,\n isLoading,\n error,\n };\n\n return (\n <SwishContext.Provider value={value}>{children}</SwishContext.Provider>\n );\n}\n","import type { SwishApp } from \"@swishapp/sdk\";\nimport { useContext } from \"react\";\nimport { SwishContext } from \"../context\";\n\nexport function useSwish(): SwishApp | null {\n const context = useContext(SwishContext);\n\n if (typeof window !== \"undefined\" && window.swish) {\n return window.swish;\n }\n\n if (context === undefined) {\n throw new Error(\"useSwishContext must be used within a SwishProvider\");\n }\n\n return context.swish;\n}\n","import type {\n SwishApp,\n ApiResponse,\n ApiError,\n PageInfo,\n EventName,\n PaginatedApiResponse,\n} from \"@swishapp/sdk\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useSwish } from \"./use-swish\";\n\nexport type FetchFn<TResponse, TVariables> = (\n swish: SwishApp[\"api\"],\n variables?: TVariables\n) => Promise<TResponse>;\n\nconst defaultRefetchEvents: EventName[] = [\n \"item-create\",\n \"item-update\",\n \"item-delete\",\n \"item-lists-update\",\n \"list-create\",\n \"list-update\",\n \"list-delete\",\n \"token-update\",\n];\n\nconst tokenUpdateEvent: EventName = \"token-update\";\n\ntype DataOf<T> = T extends { data: infer D } ? D : never;\n\nexport const useSwishQuery = <\n TResponse extends ApiResponse<any> | PaginatedApiResponse<any>,\n TVariables\n>(\n fetch: FetchFn<TResponse, TVariables>,\n options?: {\n variables?: TVariables;\n skip?: boolean;\n refetch?: boolean | EventName[];\n }\n) => {\n const swish = useSwish();\n const fetchRef = useRef<FetchFn<TResponse, TVariables>>(fetch);\n\n const [data, setData] = useState<DataOf<TResponse> | null>(null);\n const [pageInfo, setPageInfo] = useState<PageInfo | null>(null);\n const [error, setError] = useState<ApiError | null>(null);\n const [loading, setLoading] = useState(!options?.skip);\n const [initialized, setInitialized] = useState(false);\n const refetching = loading && initialized;\n\n const reset = useCallback(() => {\n setData(null);\n setPageInfo(null);\n setError(null);\n setLoading(false);\n setInitialized(false);\n }, []);\n\n const deps = options?.variables ? Object.values(options.variables) : [];\n const skip = !!options?.skip;\n const refetchEvents = useMemo(() => {\n if (options?.refetch === true) {\n return defaultRefetchEvents;\n }\n\n if (Array.isArray(options?.refetch)) {\n return [...options.refetch, tokenUpdateEvent];\n }\n\n return [];\n }, [options?.refetch]);\n\n const executeFetch = useCallback(() => {\n if (!swish || skip) {\n return;\n }\n\n setLoading(true);\n\n console.log(\"executeFetch\", fetchRef.current, options?.variables);\n\n fetchRef\n .current(swish.api, options?.variables)\n .then((response) => {\n setError(\"error\" in response ? response.error : null);\n setData(\"data\" in response ? response.data : null);\n setPageInfo(\"pageInfo\" in response ? response.pageInfo : null);\n })\n .catch((error) => setError(error))\n .finally(() => {\n setLoading(false);\n setInitialized(true);\n });\n }, [swish, skip, ...deps]);\n\n const refetch = useCallback(() => {\n executeFetch();\n }, [executeFetch]);\n\n useEffect(() => {\n if (!swish) {\n return;\n }\n\n executeFetch();\n\n const unsubscribe = swish.events.subscribe(refetchEvents, () => {\n refetch();\n });\n\n return () => unsubscribe();\n }, [executeFetch, refetch]);\n\n return useMemo(\n () => ({\n data,\n pageInfo,\n error,\n loading,\n reset,\n refetch,\n refetching,\n }),\n [data, pageInfo, error, loading, reset, refetch, refetching]\n );\n};\n","import type { Intent, IntentResponse } from \"@swishapp/sdk\";\nimport { useSwish } from \"./use-swish\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport const useSwishIntent = <T extends Intent = Intent>(intent: T) => {\n const swish = useSwish();\n const [pending, setPending] = useState(false);\n\n const intentRef = useRef<T>(intent);\n\n useEffect(() => {\n intentRef.current = intent;\n }, [intent]);\n\n const invoke = useCallback(async (): Promise<IntentResponse<T>> => {\n if (!swish) {\n throw new Error(\"Swish SDK not initialized\");\n }\n\n setPending(true);\n const activity = await swish.intents.invoke(intentRef.current);\n const response = await activity.complete;\n setPending(false);\n\n return response as IntentResponse<T>;\n }, [swish]);\n\n return { invoke, pending };\n};\n","import { useMemo } from \"react\";\nimport { useSwishQuery } from \"./use-swish-query\";\n\nexport interface UseSwishListsOptions {\n limit?: number;\n}\n\nexport const useSwishLists = () => {\n const {\n data: lists,\n loading,\n error,\n reset,\n } = useSwishQuery((api) => api.lists.list(), {\n refetch: [\n \"item-lists-update\",\n \"item-delete\",\n \"list-create\",\n \"list-update\",\n \"list-delete\",\n ],\n });\n\n return useMemo(\n () => ({\n loading,\n lists,\n error,\n reset,\n }),\n [lists, loading, error, reset]\n );\n};\n","import type { Item } from \"@swishapp/sdk\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useSwishQuery } from \"./use-swish-query\";\n\nexport interface UseSwishItemsOptions {\n listId?: string;\n limit?: number;\n}\n\nexport const useSwishItems = ({\n listId,\n limit = 24,\n}: UseSwishItemsOptions = {}) => {\n const [nextPage, setNextPage] = useState<string | null>(null);\n const [data, setData] = useState<Item[]>([]);\n\n const {\n data: remoteData,\n pageInfo,\n loading,\n error,\n reset: resetRemoteData,\n } = useSwishQuery((api, variables) => api.items.list(variables), {\n variables: {\n page: nextPage ?? undefined,\n limit,\n listId,\n },\n refetch: false,\n });\n\n const reset = useCallback(() => {\n setData([]);\n setNextPage(null);\n resetRemoteData();\n }, [resetRemoteData]);\n\n useEffect(() => {\n if (remoteData) {\n setData((prev) => [...prev, ...remoteData]);\n }\n }, [remoteData]);\n\n const loadMore = useCallback(() => {\n if (pageInfo?.next) {\n setNextPage(pageInfo.next);\n }\n }, [pageInfo?.next]);\n\n return useMemo(\n () => ({\n loading,\n data,\n pageInfo,\n error,\n reset,\n hasMore: !!pageInfo?.next,\n loadMore,\n }),\n [data, pageInfo, loading, error, reset, loadMore]\n );\n};\n","export const gidToId = (gid: string) => {\n return gid?.split(\"/\").pop();\n};\n\nexport const idToGid = (id: string | number, type: string) => {\n return `gid://shopify/${type}/${id}`;\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useSwishQuery } from \"./use-swish-query\";\nimport { gidToId } from \"../utils/shopify-utils\";\nimport type {\n CreateItemSuccessResponse,\n DeleteItemSuccessResponse,\n EditItemListsSuccessResponse,\n} from \"@swishapp/sdk\";\nimport { useSwishIntent } from \"./use-swish-intent\";\n\ninterface UseSwishItemProps {\n productId: string | number;\n variantId?: string | number;\n itemId?: string;\n onSave?: (data: CreateItemSuccessResponse[\"data\"]) => void;\n onUnsave?: (data: DeleteItemSuccessResponse[\"data\"]) => void;\n onUpdate?: (data: EditItemListsSuccessResponse[\"data\"]) => void;\n}\n\nexport const useSwishItem = ({\n productId,\n variantId,\n itemId,\n onSave,\n onUnsave,\n onUpdate,\n}: UseSwishItemProps) => {\n const [savedItemId, setSavedItemId] = useState<string | null>(itemId ?? null);\n\n const onUnsaveRef =\n useRef<NonNullable<UseSwishItemProps[\"onUnsave\"]>>(onUnsave);\n const onSaveRef = useRef<NonNullable<UseSwishItemProps[\"onSave\"]>>(onSave);\n const onUpdateRef =\n useRef<NonNullable<UseSwishItemProps[\"onUpdate\"]>>(onUpdate);\n\n onUnsaveRef.current = onUnsave;\n onSaveRef.current = onSave;\n onUpdateRef.current = onUpdate;\n\n const { invoke: saveItem, pending: creatingItem } = useSwishIntent({\n action: \"create\",\n type: \"swish/Item\",\n data: {\n productId,\n variantId,\n },\n });\n\n const { invoke: editItemLists } = useSwishIntent({\n action: \"edit\",\n type: \"swish/ItemLists\",\n data: {\n itemId: savedItemId ?? \"\",\n },\n });\n\n const { invoke: unsaveItem } = useSwishIntent({\n action: \"delete\",\n type: \"swish/Item\",\n data: {\n itemId: savedItemId ?? \"\",\n },\n });\n\n const query = useMemo(() => {\n if (variantId) {\n return `variant:${gidToId(variantId.toString())}`;\n }\n return `product:${gidToId(productId.toString())}`;\n }, [productId, variantId]);\n\n // Load saved items for the product or variant\n const {\n data: savedItems,\n loading: savedItemsLoading,\n error: savedItemsError,\n } = useSwishQuery((api, variables) => api.items.list(variables), {\n refetch: [\"item-create\", \"item-update\", \"item-delete\"],\n variables: {\n limit: 1,\n query,\n },\n skip: Boolean(itemId) || !productId,\n });\n\n const saved = useMemo(() => Boolean(savedItemId), [savedItemId]);\n const error = useMemo(() => savedItemsError, [savedItemsError]);\n const loading = useMemo(\n () => savedItemsLoading || creatingItem,\n [savedItemsLoading, creatingItem]\n );\n\n useEffect(() => {\n if (itemId) return;\n\n if (savedItems?.[0]) {\n setSavedItemId(savedItems[0].id);\n } else {\n setSavedItemId(null);\n }\n }, [savedItems, itemId]);\n\n const unsave = useCallback(async () => {\n const response = await unsaveItem();\n\n if (response.code === \"ok\") {\n const data = response.data;\n setSavedItemId(null);\n onUnsaveRef.current?.(data);\n }\n }, [unsaveItem]);\n\n const update = useCallback(async () => {\n const response = await editItemLists();\n if (response.code === \"ok\") {\n const data = response.data;\n if (\"itemId\" in data) {\n // Item was unsaved from list-select\n setSavedItemId(null);\n onUnsaveRef.current?.(data);\n } else {\n onUpdateRef.current?.(data);\n }\n }\n }, [editItemLists]);\n\n const save = useCallback(async () => {\n const response = await saveItem();\n\n if (response.code === \"ok\") {\n const data = response.data;\n setSavedItemId(data.item.id);\n onSaveRef.current?.(data);\n }\n }, [saveItem]);\n\n const toggle = useCallback(async () => {\n if (saved) {\n await unsave();\n } else {\n await save();\n }\n }, [saved, save, update]);\n\n return useMemo(() => {\n return { saved, loading, error, save, unsave, update, toggle };\n }, [saved, loading, error, save, unsave, update, toggle]);\n};\n","import { useMemo } from \"react\";\nimport { useSwishQuery } from \"./use-swish-query\";\n\nexport const useSwishItemCount = () => {\n const { data, loading, error } = useSwishQuery((api) => api.items.count(), {\n refetch: [\"item-create\", \"item-delete\"],\n });\n\n return useMemo(() => {\n return {\n count: data?.count ?? 0,\n loading,\n error,\n };\n }, [data, loading, error]);\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swishapp/react",
3
- "version": "0.80.3",
3
+ "version": "0.80.4",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
package/LICENSE DELETED
@@ -1,22 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 swish-react contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
22
-