@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 +369 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +111 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +111 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +362 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +1 -1
- package/LICENSE +0 -22
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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"}
|
package/dist/index.d.cts
ADDED
|
@@ -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"}
|
package/dist/index.d.mts
ADDED
|
@@ -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
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
|
-
|