@swishapp/react 0.90.4 → 0.119.0-unstable.20260302112819
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.d.mts +10 -10
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +25 -20
- package/dist/index.mjs.map +1 -1
- package/package.json +44 -43
- package/README.md +0 -64
- package/dist/index.cjs +0 -369
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -120
- package/dist/index.d.cts.map +0 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as _swishapp_sdk0 from "@swishapp/sdk";
|
|
2
|
+
import { ApiError, ApiResponse, EditItemListsSuccessResponse, EditItemVariantSuccessResponse, EventName, Intent, IntentResponse, IntentToData, Item, PageInfo, PaginatedApiResponse, SaveItemSuccessResponse, SwishApp, SwishOptions, UnsaveItemSuccessResponse } from "@swishapp/sdk";
|
|
2
3
|
import { ReactNode } from "react";
|
|
3
4
|
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
|
-
import * as _swishapp_api_client3 from "@swishapp/api-client";
|
|
5
5
|
export * from "@swishapp/sdk";
|
|
6
6
|
|
|
7
7
|
//#region src/types.d.ts
|
|
@@ -57,8 +57,8 @@ declare const useSwishIntent: <I extends Intent = Intent>(intent: I, ...args: In
|
|
|
57
57
|
//#region src/hooks/use-swish-lists.d.ts
|
|
58
58
|
declare const useSwishLists: () => {
|
|
59
59
|
loading: boolean;
|
|
60
|
-
lists:
|
|
61
|
-
error:
|
|
60
|
+
lists: _swishapp_sdk0.ListDetail[] | null;
|
|
61
|
+
error: _swishapp_sdk0.ApiError | null;
|
|
62
62
|
reset: () => void;
|
|
63
63
|
};
|
|
64
64
|
//#endregion
|
|
@@ -73,8 +73,8 @@ declare const useSwishItems: ({
|
|
|
73
73
|
}?: UseSwishItemsOptions) => {
|
|
74
74
|
loading: boolean;
|
|
75
75
|
data: Item[];
|
|
76
|
-
pageInfo:
|
|
77
|
-
error:
|
|
76
|
+
pageInfo: _swishapp_sdk0.PageInfo | null;
|
|
77
|
+
error: _swishapp_sdk0.ApiError | null;
|
|
78
78
|
reset: () => void;
|
|
79
79
|
hasMore: boolean;
|
|
80
80
|
loadMore: () => void;
|
|
@@ -85,8 +85,8 @@ interface UseSwishItemProps {
|
|
|
85
85
|
productId: string | number;
|
|
86
86
|
variantId?: string | number;
|
|
87
87
|
itemId?: string;
|
|
88
|
-
onSave?: (data:
|
|
89
|
-
onUnsave?: (data:
|
|
88
|
+
onSave?: (data: SaveItemSuccessResponse["data"]) => void;
|
|
89
|
+
onUnsave?: (data: UnsaveItemSuccessResponse["data"]) => void;
|
|
90
90
|
onListsUpdate?: (data: EditItemListsSuccessResponse["data"]) => void;
|
|
91
91
|
onVariantUpdate?: (data: EditItemVariantSuccessResponse["data"]) => void;
|
|
92
92
|
}
|
|
@@ -101,7 +101,7 @@ declare const useSwishItem: ({
|
|
|
101
101
|
}: UseSwishItemProps) => {
|
|
102
102
|
saved: boolean;
|
|
103
103
|
loading: boolean;
|
|
104
|
-
error:
|
|
104
|
+
error: _swishapp_sdk0.ApiError | null;
|
|
105
105
|
save: () => Promise<void>;
|
|
106
106
|
unsave: () => Promise<void>;
|
|
107
107
|
updateLists: () => Promise<void>;
|
|
@@ -113,7 +113,7 @@ declare const useSwishItem: ({
|
|
|
113
113
|
declare const useSwishItemCount: () => {
|
|
114
114
|
count: number;
|
|
115
115
|
loading: boolean;
|
|
116
|
-
error:
|
|
116
|
+
error: _swishapp_sdk0.ApiError | null;
|
|
117
117
|
};
|
|
118
118
|
//#endregion
|
|
119
119
|
export { SwishContextValue, SwishProvider, type SwishProviderProps, useSwish, useSwishIntent, useSwishItem, useSwishItemCount, useSwishItems, useSwishLists, useSwishQuery };
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +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;;;;
|
|
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;WACD;;EDVM,CAAA;;iBCaD,aAAA;;;;;;GAGb,qBAAkB,kBAAA,CAAA,GAAA,CAAA;;;iBCdL,QAAA,CAAA,GAAY;;;KCOhB,yCACH,6BACK,eACT,QAAQ;KAeR,YAAY;;;cAEJ,kCACO,mBAAmB,8CAG9B,QAAQ,WAAW;cAEZ;;EHnCC,OAAA,CAAA,EAAA,OAAA,GGqCO,SHrCU,EACzB;;;;ECOQ,KAAA,UAAA,GAAA,IAAkB;EAKnB,OAAA,EAAA,OAAa;EAC3B,KAAA,EAAA,GAAA,GAAA,IAAA;EACW,OAAA,EAAA,GAAA,GAAA,IAAA;EACV,UAAA,EAAA,OAAA;CAAkB;;;cGdR,2BAA4B,SAAS,gBACxC,YACC,aAAa,sCAAsC,aAAa;gBAUpC,QAAQ,eAAe;;;;;cCbjD;;SAyBZ,cAAA,CAAA,UAAA;SAAA,cAAA,CAAA,QAAA;;;;;UCxBgB,oBAAA;;;;cAKJ;;;IAGV;;;ENVc,QAAA,4BAGR,IAAK;;;;ECKG,QAAA,EAAA,GAAA,GAAA,IAAA;AAKjB,CAAA;;;UMJU,iBAAA;;;;kBAIQ;oBACE;yBACK;EPfR,eAAA,CAAA,EAAA,CAAA,IAAiB,EOgBP,8BPbb,CAAA,MAAA,CAAA,EAAA,GAAA,IAAA;;cOgBD;;;;;;;;GAQV;;ENnBc,OAAA,EAAA,OAAA;EAKD,KAAA,EMcI,cAAA,CAAA,QAAA,GNdS,IAAA;EAC3B,IAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EACW,MAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EACV,WAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EAAkB,aAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EAAA,MAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;;;;cOfR;;;SAYZ,cAAA,CAAA,QAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -3,11 +3,7 @@ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, use
|
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
|
|
5
5
|
//#region src/context.tsx
|
|
6
|
-
const SwishContext = createContext(
|
|
7
|
-
swish: null,
|
|
8
|
-
isLoading: false,
|
|
9
|
-
error: null
|
|
10
|
-
});
|
|
6
|
+
const SwishContext = createContext(null);
|
|
11
7
|
function SwishProvider({ children, options: { swishSdkUrl: swishSdkUrl$1 = swishSdkUrl, ...options } }) {
|
|
12
8
|
const [swish, setSwish] = useState(null);
|
|
13
9
|
const [isLoading, setIsLoading] = useState(typeof window !== "undefined");
|
|
@@ -54,7 +50,7 @@ function SwishProvider({ children, options: { swishSdkUrl: swishSdkUrl$1 = swish
|
|
|
54
50
|
function useSwish() {
|
|
55
51
|
const context = useContext(SwishContext);
|
|
56
52
|
if (typeof window !== "undefined" && window.swish) return window.swish;
|
|
57
|
-
if (!context) throw new Error("
|
|
53
|
+
if (!context) throw new Error("useSwish must be used within a SwishProvider");
|
|
58
54
|
return context.swish;
|
|
59
55
|
}
|
|
60
56
|
|
|
@@ -89,11 +85,10 @@ const useSwishQuery = (fetch, options) => {
|
|
|
89
85
|
}, []);
|
|
90
86
|
const deps = options?.variables ? Object.values(options.variables) : [];
|
|
91
87
|
const skip = !!options?.skip;
|
|
92
|
-
const refetchEvents =
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}, [options?.refetch]);
|
|
88
|
+
const refetchEvents = options?.refetch === true ? defaultRefetchEvents : Array.isArray(options?.refetch) ? [...options.refetch, tokenUpdateEvent] : [];
|
|
89
|
+
const refetchEventsRef = useRef(refetchEvents);
|
|
90
|
+
refetchEventsRef.current = refetchEvents;
|
|
91
|
+
const refetchEventsKey = refetchEvents.join(",");
|
|
97
92
|
const executeFetch = useCallback(() => {
|
|
98
93
|
if (!swish || skip) return;
|
|
99
94
|
setLoading(true);
|
|
@@ -116,11 +111,15 @@ const useSwishQuery = (fetch, options) => {
|
|
|
116
111
|
useEffect(() => {
|
|
117
112
|
if (!swish) return;
|
|
118
113
|
executeFetch();
|
|
119
|
-
const unsubscribe = swish.events.subscribe(
|
|
114
|
+
const unsubscribe = swish.events.subscribe(refetchEventsRef.current, () => {
|
|
120
115
|
refetch();
|
|
121
116
|
});
|
|
122
117
|
return () => unsubscribe();
|
|
123
|
-
}, [
|
|
118
|
+
}, [
|
|
119
|
+
executeFetch,
|
|
120
|
+
refetch,
|
|
121
|
+
refetchEventsKey
|
|
122
|
+
]);
|
|
124
123
|
return useMemo(() => ({
|
|
125
124
|
data,
|
|
126
125
|
pageInfo,
|
|
@@ -153,9 +152,11 @@ const useSwishIntent = (intent, ...args) => {
|
|
|
153
152
|
invoke: useCallback(async () => {
|
|
154
153
|
if (!swish) throw new Error("Swish SDK not initialized");
|
|
155
154
|
setPending(true);
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
155
|
+
try {
|
|
156
|
+
return await (await swish.intents.invoke(intent, ...dataRef.current)).complete;
|
|
157
|
+
} finally {
|
|
158
|
+
setPending(false);
|
|
159
|
+
}
|
|
159
160
|
}, [swish]),
|
|
160
161
|
pending
|
|
161
162
|
};
|
|
@@ -244,7 +245,7 @@ const useSwishItem = ({ productId, variantId, itemId, onSave, onUnsave, onListsU
|
|
|
244
245
|
onSaveRef.current = onSave;
|
|
245
246
|
onListsUpdateRef.current = onListsUpdate;
|
|
246
247
|
onVariantUpdateRef.current = onVariantUpdate;
|
|
247
|
-
const { invoke: saveItem, pending: creatingItem } = useSwishIntent("
|
|
248
|
+
const { invoke: saveItem, pending: creatingItem } = useSwishIntent("save:item", {
|
|
248
249
|
productId,
|
|
249
250
|
variantId
|
|
250
251
|
});
|
|
@@ -254,7 +255,7 @@ const useSwishItem = ({ productId, variantId, itemId, onSave, onUnsave, onListsU
|
|
|
254
255
|
productId,
|
|
255
256
|
variantId
|
|
256
257
|
});
|
|
257
|
-
const { invoke: unsaveItem } = useSwishIntent("
|
|
258
|
+
const { invoke: unsaveItem } = useSwishIntent("unsave:item", { itemId: savedItemId ?? "" });
|
|
258
259
|
const { data: savedItems, loading: savedItemsLoading, error: savedItemsError } = useSwishQuery((api, variables) => api.items.list(variables), {
|
|
259
260
|
refetch: [
|
|
260
261
|
"item-create",
|
|
@@ -289,7 +290,7 @@ const useSwishItem = ({ productId, variantId, itemId, onSave, onUnsave, onListsU
|
|
|
289
290
|
const updateLists = useCallback(async () => {
|
|
290
291
|
const response = await editItemLists();
|
|
291
292
|
if (response.code !== "ok") return;
|
|
292
|
-
if (response.intent === "
|
|
293
|
+
if (response.intent === "unsave:item") {
|
|
293
294
|
const data = response.data;
|
|
294
295
|
setSavedItemId(null);
|
|
295
296
|
onUnsaveRef.current?.(data);
|
|
@@ -316,7 +317,11 @@ const useSwishItem = ({ productId, variantId, itemId, onSave, onUnsave, onListsU
|
|
|
316
317
|
const toggle = useCallback(async () => {
|
|
317
318
|
if (saved) await unsave();
|
|
318
319
|
else await save();
|
|
319
|
-
}, [
|
|
320
|
+
}, [
|
|
321
|
+
saved,
|
|
322
|
+
save,
|
|
323
|
+
unsave
|
|
324
|
+
]);
|
|
320
325
|
return useMemo(() => {
|
|
321
326
|
return {
|
|
322
327
|
saved,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["defaultSwishSdkUrl","swishSdkUrl","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 {\n type SwishApp,\n type SwishOptions,\n swishSdkUrl as defaultSwishSdkUrl,\n} 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 & { swishSdkUrl?: string };\n}\n\nexport function SwishProvider({\n children,\n options: { swishSdkUrl = defaultSwishSdkUrl, ...options },\n}: 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 swishSdkUrl\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) {\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 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, IntentToData } from \"@swishapp/sdk\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useSwish } from \"./use-swish\";\n\nexport const useSwishIntent = <I extends Intent = Intent>(\n intent: I,\n ...args: IntentToData<I> extends void ? [] | [undefined] : [IntentToData<I>]\n) => {\n const swish = useSwish();\n const [pending, setPending] = useState(false);\n const dataRef = useRef(args);\n\n useEffect(() => {\n dataRef.current = args;\n }, [args]);\n\n const invoke = useCallback(async (): Promise<IntentResponse<I>> => {\n if (!swish) {\n throw new Error(\"Swish SDK not initialized\");\n }\n\n setPending(true);\n const activity = await swish.intents.invoke(intent, ...dataRef.current);\n const response = await activity.complete;\n setPending(false);\n return response as IntentResponse<I>;\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 type {\n CreateItemSuccessResponse,\n DeleteItemSuccessResponse,\n EditItemListsSuccessResponse,\n EditItemVariantSuccessResponse,\n} from \"@swishapp/sdk\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { gidToId } from \"../utils/shopify-utils\";\nimport { useSwishIntent } from \"./use-swish-intent\";\nimport { useSwishQuery } from \"./use-swish-query\";\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 onListsUpdate?: (data: EditItemListsSuccessResponse[\"data\"]) => void;\n onVariantUpdate?: (data: EditItemVariantSuccessResponse[\"data\"]) => void;\n}\n\nexport const useSwishItem = ({\n productId,\n variantId,\n itemId,\n onSave,\n onUnsave,\n onListsUpdate,\n onVariantUpdate,\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 onListsUpdateRef =\n useRef<NonNullable<UseSwishItemProps[\"onListsUpdate\"]>>(onListsUpdate);\n const onVariantUpdateRef =\n useRef<NonNullable<UseSwishItemProps[\"onVariantUpdate\"]>>(onVariantUpdate);\n\n onUnsaveRef.current = onUnsave;\n onSaveRef.current = onSave;\n onListsUpdateRef.current = onListsUpdate;\n onVariantUpdateRef.current = onVariantUpdate;\n\n const { invoke: saveItem, pending: creatingItem } = useSwishIntent(\n \"create:item\",\n {\n productId,\n variantId,\n }\n );\n\n const { invoke: editItemLists } = useSwishIntent(\"edit:item-lists\", {\n itemId: savedItemId ?? \"\",\n });\n\n const { invoke: editItemVariant } = useSwishIntent(\"edit:item-variant\", {\n itemId: savedItemId ?? \"\",\n productId,\n variantId,\n });\n\n const { invoke: unsaveItem } = useSwishIntent(\"delete:item\", {\n itemId: savedItemId ?? \"\",\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 updateLists = useCallback(async () => {\n const response = await editItemLists();\n if (response.code !== \"ok\") {\n return;\n }\n if (response.intent === \"delete:item\") {\n // Item was unsaved from list-select\n const data = response.data as DeleteItemSuccessResponse[\"data\"];\n setSavedItemId(null);\n onUnsaveRef.current?.(data);\n } else {\n const data = response.data as EditItemListsSuccessResponse[\"data\"];\n onListsUpdateRef.current?.(data);\n }\n }, [editItemLists]);\n\n const updateVariant = useCallback(async () => {\n const response = await editItemVariant();\n if (response.code === \"ok\") {\n const data = response.data;\n onVariantUpdateRef.current?.(data);\n }\n }, [editItemVariant]);\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]);\n\n return useMemo(() => {\n return {\n saved,\n loading,\n error,\n save,\n unsave,\n updateLists,\n updateVariant,\n toggle,\n };\n }, [saved, loading, error, save, unsave, updateLists, updateVariant, 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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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["defaultSwishSdkUrl","swishSdkUrl","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 {\n type SwishApp,\n type SwishOptions,\n swishSdkUrl as defaultSwishSdkUrl,\n} from \"@swishapp/sdk\";\nimport { createContext, ReactNode, useEffect, useRef, useState } from \"react\";\nimport type { SwishContextValue } from \"./types\";\n\nexport const SwishContext = createContext<SwishContextValue | null>(null);\n\nexport interface SwishProviderProps {\n children: ReactNode;\n options: SwishOptions & { swishSdkUrl?: string };\n}\n\nexport function SwishProvider({\n children,\n options: { swishSdkUrl = defaultSwishSdkUrl, ...options },\n}: 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 swishSdkUrl\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) {\n throw new Error(\"useSwish 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 = options?.refetch === true\n ? defaultRefetchEvents\n : Array.isArray(options?.refetch)\n ? [...options.refetch, tokenUpdateEvent]\n : [];\n\n const refetchEventsRef = useRef(refetchEvents);\n refetchEventsRef.current = refetchEvents;\n\n // Stable string key so the effect re-subscribes only when events actually change\n const refetchEventsKey = refetchEvents.join(\",\");\n\n const executeFetch = useCallback(() => {\n if (!swish || skip) {\n return;\n }\n\n setLoading(true);\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(refetchEventsRef.current, () => {\n refetch();\n });\n\n return () => unsubscribe();\n }, [executeFetch, refetch, refetchEventsKey]);\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, IntentToData } from \"@swishapp/sdk\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useSwish } from \"./use-swish\";\n\nexport const useSwishIntent = <I extends Intent = Intent>(\n intent: I,\n ...args: IntentToData<I> extends void ? [] | [undefined] : [IntentToData<I>]\n) => {\n const swish = useSwish();\n const [pending, setPending] = useState(false);\n const dataRef = useRef(args);\n\n useEffect(() => {\n dataRef.current = args;\n }, [args]);\n\n const invoke = useCallback(async (): Promise<IntentResponse<I>> => {\n if (!swish) {\n throw new Error(\"Swish SDK not initialized\");\n }\n\n setPending(true);\n try {\n const activity = await swish.intents.invoke(intent, ...dataRef.current);\n const response = await activity.complete;\n return response as IntentResponse<I>;\n } finally {\n setPending(false);\n }\n }, [swish]);\n\n return { invoke, pending };\n};\n","import { useMemo } from \"react\";\nimport { useSwishQuery } from \"./use-swish-query\";\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","import type {\n SaveItemSuccessResponse,\n UnsaveItemSuccessResponse,\n EditItemListsSuccessResponse,\n EditItemVariantSuccessResponse,\n} from \"@swishapp/sdk\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { gidToId } from \"../utils/shopify-utils\";\nimport { useSwishIntent } from \"./use-swish-intent\";\nimport { useSwishQuery } from \"./use-swish-query\";\n\ninterface UseSwishItemProps {\n productId: string | number;\n variantId?: string | number;\n itemId?: string;\n onSave?: (data: SaveItemSuccessResponse[\"data\"]) => void;\n onUnsave?: (data: UnsaveItemSuccessResponse[\"data\"]) => void;\n onListsUpdate?: (data: EditItemListsSuccessResponse[\"data\"]) => void;\n onVariantUpdate?: (data: EditItemVariantSuccessResponse[\"data\"]) => void;\n}\n\nexport const useSwishItem = ({\n productId,\n variantId,\n itemId,\n onSave,\n onUnsave,\n onListsUpdate,\n onVariantUpdate,\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 onListsUpdateRef =\n useRef<NonNullable<UseSwishItemProps[\"onListsUpdate\"]>>(onListsUpdate);\n const onVariantUpdateRef =\n useRef<NonNullable<UseSwishItemProps[\"onVariantUpdate\"]>>(onVariantUpdate);\n\n onUnsaveRef.current = onUnsave;\n onSaveRef.current = onSave;\n onListsUpdateRef.current = onListsUpdate;\n onVariantUpdateRef.current = onVariantUpdate;\n\n const { invoke: saveItem, pending: creatingItem } = useSwishIntent(\n \"save:item\",\n {\n productId,\n variantId,\n }\n );\n\n const { invoke: editItemLists } = useSwishIntent(\"edit:item-lists\", {\n itemId: savedItemId ?? \"\",\n });\n\n const { invoke: editItemVariant } = useSwishIntent(\"edit:item-variant\", {\n itemId: savedItemId ?? \"\",\n productId,\n variantId,\n });\n\n const { invoke: unsaveItem } = useSwishIntent(\"unsave:item\", {\n itemId: savedItemId ?? \"\",\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 updateLists = useCallback(async () => {\n const response = await editItemLists();\n if (response.code !== \"ok\") {\n return;\n }\n if (response.intent === \"unsave:item\") {\n // Item was unsaved from list-select\n const data = response.data as UnsaveItemSuccessResponse[\"data\"];\n setSavedItemId(null);\n onUnsaveRef.current?.(data);\n } else {\n const data = response.data as EditItemListsSuccessResponse[\"data\"];\n onListsUpdateRef.current?.(data);\n }\n }, [editItemLists]);\n\n const updateVariant = useCallback(async () => {\n const response = await editItemVariant();\n if (response.code === \"ok\") {\n const data = response.data;\n onVariantUpdateRef.current?.(data);\n }\n }, [editItemVariant]);\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, unsave]);\n\n return useMemo(() => {\n return {\n saved,\n loading,\n error,\n save,\n unsave,\n updateLists,\n updateVariant,\n toggle,\n };\n }, [saved, loading, error, save, unsave, updateLists, updateVariant, 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,39 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swishapp/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.119.0-unstable.20260302112819",
|
|
4
|
+
"description": "React bindings for Swish SDK",
|
|
5
|
+
"author": "Swish",
|
|
6
|
+
"license": "UNLICENSED",
|
|
7
|
+
"homepage": "https://developers.swish.app/libraries/react",
|
|
8
|
+
"type": "module",
|
|
4
9
|
"publishConfig": {
|
|
5
10
|
"access": "public"
|
|
6
11
|
},
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
"module": "./dist/index.mjs",
|
|
10
|
-
"types": "./dist/index.d.ts",
|
|
11
|
-
"exports": {
|
|
12
|
-
".": {
|
|
13
|
-
"types": "./dist/index.d.ts",
|
|
14
|
-
"import": "./dist/index.mjs",
|
|
15
|
-
"require": "./dist/index.js"
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
"files": [
|
|
19
|
-
"dist"
|
|
20
|
-
],
|
|
21
|
-
"scripts": {
|
|
22
|
-
"build": "tsdown",
|
|
23
|
-
"dev": "tsdown --watch",
|
|
24
|
-
"type-check": "tsc --noEmit",
|
|
25
|
-
"lint": "eslint src --ext .ts,.tsx",
|
|
26
|
-
"prepublishOnly": "npm run build"
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@swishapp/sdk": "0.119.0-unstable.20260302112819"
|
|
27
14
|
},
|
|
28
|
-
"keywords": [
|
|
29
|
-
"react",
|
|
30
|
-
"preact",
|
|
31
|
-
"swish",
|
|
32
|
-
"sdk",
|
|
33
|
-
"typescript"
|
|
34
|
-
],
|
|
35
|
-
"author": "Swish",
|
|
36
|
-
"license": "UNLICENSED",
|
|
37
15
|
"peerDependencies": {
|
|
38
16
|
"react": ">=16.8.0 || >=17.0.0 || >=18.0.0",
|
|
39
17
|
"react-dom": ">=16.8.0 || >=17.0.0 || >=18.0.0"
|
|
@@ -43,25 +21,48 @@
|
|
|
43
21
|
"optional": true
|
|
44
22
|
}
|
|
45
23
|
},
|
|
46
|
-
"dependencies": {
|
|
47
|
-
"@swishapp/sdk": "^0.90.2"
|
|
48
|
-
},
|
|
49
24
|
"devDependencies": {
|
|
50
25
|
"@types/react": "^19.2.6",
|
|
51
26
|
"@types/react-dom": "^19.2.3",
|
|
52
|
-
"@typescript-eslint/eslint-plugin": "^8.47.0",
|
|
53
|
-
"@typescript-eslint/parser": "^8.47.0",
|
|
54
|
-
"eslint": "^9.39.1",
|
|
55
|
-
"eslint-plugin-react": "^7.37.5",
|
|
56
|
-
"eslint-plugin-react-hooks": "^7.0.1",
|
|
57
|
-
"preact": "^10.27.2",
|
|
58
27
|
"react": "^19.2.0",
|
|
59
28
|
"react-dom": "^19.2.0",
|
|
29
|
+
"rimraf": "^6.1.2",
|
|
60
30
|
"tsdown": "^0.16.6",
|
|
61
31
|
"typescript": "^5.9.3"
|
|
62
32
|
},
|
|
63
|
-
"
|
|
64
|
-
|
|
65
|
-
|
|
33
|
+
"main": "./dist/index.mjs",
|
|
34
|
+
"module": "./dist/index.mjs",
|
|
35
|
+
"types": "./dist/index.d.mts",
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"module": {
|
|
39
|
+
"types": "./dist/index.d.mts",
|
|
40
|
+
"default": "./dist/index.mjs"
|
|
41
|
+
},
|
|
42
|
+
"import": {
|
|
43
|
+
"types": "./dist/index.d.mts",
|
|
44
|
+
"default": "./dist/index.mjs"
|
|
45
|
+
},
|
|
46
|
+
"default": "./dist/index.mjs"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"files": [
|
|
50
|
+
"dist/**/*.*",
|
|
51
|
+
"README.md"
|
|
52
|
+
],
|
|
53
|
+
"keywords": [
|
|
54
|
+
"react",
|
|
55
|
+
"swish",
|
|
56
|
+
"sdk",
|
|
57
|
+
"shopify",
|
|
58
|
+
"wishlist",
|
|
59
|
+
"typescript"
|
|
60
|
+
],
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "tsdown",
|
|
63
|
+
"dev": "tsdown --watch",
|
|
64
|
+
"clean": "rimraf dist",
|
|
65
|
+
"type-check": "tsc --noEmit",
|
|
66
|
+
"test": "echo \"No test specified\""
|
|
66
67
|
}
|
|
67
|
-
}
|
|
68
|
+
}
|
package/README.md
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# Swish React
|
|
2
|
-
|
|
3
|
-
Lightweight React/Preact bindings for the Swish SDK.
|
|
4
|
-
Use Swish’s features directly in your React app with simple hooks and a provider-based setup.
|
|
5
|
-
|
|
6
|
-
## Installation
|
|
7
|
-
|
|
8
|
-
```bash
|
|
9
|
-
npm install @swishapp/react
|
|
10
|
-
# or
|
|
11
|
-
yarn add @swishapp/react
|
|
12
|
-
# or
|
|
13
|
-
pnpm add @swishapp/react
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Quick Start
|
|
17
|
-
|
|
18
|
-
### 1. Wrap your app with SwishProvider
|
|
19
|
-
|
|
20
|
-
```tsx
|
|
21
|
-
import { SwishProvider } from "@swishapp/react";
|
|
22
|
-
|
|
23
|
-
const config = {
|
|
24
|
-
// your Swish SDK config
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
function App() {
|
|
28
|
-
return (
|
|
29
|
-
<SwishProvider config={config}>
|
|
30
|
-
<YourApp />
|
|
31
|
-
</SwishProvider>
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### 2. Use Swish hooks in your components
|
|
37
|
-
|
|
38
|
-
```tsx
|
|
39
|
-
import { useSwishItem } from "@swishapp/react";
|
|
40
|
-
|
|
41
|
-
interface SaveButtonProps {
|
|
42
|
-
productId: string;
|
|
43
|
-
variantId?: string;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function SaveButton({ productId, variantId }: SaveButtonProps) {
|
|
47
|
-
const { saved, toggle, loading } = useSwishItem({
|
|
48
|
-
productId,
|
|
49
|
-
variantId,
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
return (
|
|
53
|
-
<button type="button" onClick={toggle} disabled={loading}>
|
|
54
|
-
{saved ? "Saved" : "Save"}
|
|
55
|
-
</button>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## Documentation
|
|
61
|
-
|
|
62
|
-
Full documentation, examples, and API reference are available at:
|
|
63
|
-
|
|
64
|
-
👉 https://swish.app/docs/react
|
package/dist/index.cjs
DELETED
|
@@ -1,369 +0,0 @@
|
|
|
1
|
-
let __swishapp_sdk = require("@swishapp/sdk");
|
|
2
|
-
let react = require("react");
|
|
3
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
|
-
|
|
5
|
-
//#region src/context.tsx
|
|
6
|
-
const SwishContext = (0, react.createContext)({
|
|
7
|
-
swish: null,
|
|
8
|
-
isLoading: false,
|
|
9
|
-
error: null
|
|
10
|
-
});
|
|
11
|
-
function SwishProvider({ children, options: { swishSdkUrl = __swishapp_sdk.swishSdkUrl, ...options } }) {
|
|
12
|
-
const [swish, setSwish] = (0, react.useState)(null);
|
|
13
|
-
const [isLoading, setIsLoading] = (0, react.useState)(typeof window !== "undefined");
|
|
14
|
-
const [error, setError] = (0, react.useState)(null);
|
|
15
|
-
const optionsRef = (0, react.useRef)(options);
|
|
16
|
-
(0, react.useEffect)(() => {
|
|
17
|
-
if (typeof window === "undefined") return;
|
|
18
|
-
let cancelled = false;
|
|
19
|
-
const initializeSdk = async () => {
|
|
20
|
-
try {
|
|
21
|
-
setIsLoading(true);
|
|
22
|
-
setError(null);
|
|
23
|
-
const { createSwish } = await import(
|
|
24
|
-
/* webpackIgnore: true */
|
|
25
|
-
swishSdkUrl
|
|
26
|
-
);
|
|
27
|
-
const swish$1 = await createSwish(optionsRef.current);
|
|
28
|
-
if (!cancelled) setSwish(swish$1);
|
|
29
|
-
} catch (err) {
|
|
30
|
-
console.error("Failed to initialize Swish", err);
|
|
31
|
-
if (!cancelled) setError(err instanceof Error ? err : /* @__PURE__ */ new Error("Failed to initialize Swish"));
|
|
32
|
-
} finally {
|
|
33
|
-
if (!cancelled) setIsLoading(false);
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
initializeSdk();
|
|
37
|
-
return () => {
|
|
38
|
-
cancelled = true;
|
|
39
|
-
};
|
|
40
|
-
}, []);
|
|
41
|
-
const value = {
|
|
42
|
-
swish,
|
|
43
|
-
isLoading,
|
|
44
|
-
error
|
|
45
|
-
};
|
|
46
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SwishContext.Provider, {
|
|
47
|
-
value,
|
|
48
|
-
children
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
//#endregion
|
|
53
|
-
//#region src/hooks/use-swish.ts
|
|
54
|
-
function useSwish() {
|
|
55
|
-
const context = (0, react.useContext)(SwishContext);
|
|
56
|
-
if (typeof window !== "undefined" && window.swish) return window.swish;
|
|
57
|
-
if (!context) throw new Error("useSwishContext must be used within a SwishProvider");
|
|
58
|
-
return context.swish;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
//#endregion
|
|
62
|
-
//#region src/hooks/use-swish-query.ts
|
|
63
|
-
const defaultRefetchEvents = [
|
|
64
|
-
"item-create",
|
|
65
|
-
"item-update",
|
|
66
|
-
"item-delete",
|
|
67
|
-
"item-lists-update",
|
|
68
|
-
"list-create",
|
|
69
|
-
"list-update",
|
|
70
|
-
"list-delete",
|
|
71
|
-
"token-update"
|
|
72
|
-
];
|
|
73
|
-
const tokenUpdateEvent = "token-update";
|
|
74
|
-
const useSwishQuery = (fetch, options) => {
|
|
75
|
-
const swish = useSwish();
|
|
76
|
-
const fetchRef = (0, react.useRef)(fetch);
|
|
77
|
-
const [data, setData] = (0, react.useState)(null);
|
|
78
|
-
const [pageInfo, setPageInfo] = (0, react.useState)(null);
|
|
79
|
-
const [error, setError] = (0, react.useState)(null);
|
|
80
|
-
const [loading, setLoading] = (0, react.useState)(!options?.skip);
|
|
81
|
-
const [initialized, setInitialized] = (0, react.useState)(false);
|
|
82
|
-
const refetching = loading && initialized;
|
|
83
|
-
const reset = (0, react.useCallback)(() => {
|
|
84
|
-
setData(null);
|
|
85
|
-
setPageInfo(null);
|
|
86
|
-
setError(null);
|
|
87
|
-
setLoading(false);
|
|
88
|
-
setInitialized(false);
|
|
89
|
-
}, []);
|
|
90
|
-
const deps = options?.variables ? Object.values(options.variables) : [];
|
|
91
|
-
const skip = !!options?.skip;
|
|
92
|
-
const refetchEvents = (0, react.useMemo)(() => {
|
|
93
|
-
if (options?.refetch === true) return defaultRefetchEvents;
|
|
94
|
-
if (Array.isArray(options?.refetch)) return [...options.refetch, tokenUpdateEvent];
|
|
95
|
-
return [];
|
|
96
|
-
}, [options?.refetch]);
|
|
97
|
-
const executeFetch = (0, react.useCallback)(() => {
|
|
98
|
-
if (!swish || skip) return;
|
|
99
|
-
setLoading(true);
|
|
100
|
-
fetchRef.current(swish.api, options?.variables).then((response) => {
|
|
101
|
-
setError("error" in response ? response.error : null);
|
|
102
|
-
setData("data" in response ? response.data : null);
|
|
103
|
-
setPageInfo("pageInfo" in response ? response.pageInfo : null);
|
|
104
|
-
}).catch((error$1) => setError(error$1)).finally(() => {
|
|
105
|
-
setLoading(false);
|
|
106
|
-
setInitialized(true);
|
|
107
|
-
});
|
|
108
|
-
}, [
|
|
109
|
-
swish,
|
|
110
|
-
skip,
|
|
111
|
-
...deps
|
|
112
|
-
]);
|
|
113
|
-
const refetch = (0, react.useCallback)(() => {
|
|
114
|
-
executeFetch();
|
|
115
|
-
}, [executeFetch]);
|
|
116
|
-
(0, react.useEffect)(() => {
|
|
117
|
-
if (!swish) return;
|
|
118
|
-
executeFetch();
|
|
119
|
-
const unsubscribe = swish.events.subscribe(refetchEvents, () => {
|
|
120
|
-
refetch();
|
|
121
|
-
});
|
|
122
|
-
return () => unsubscribe();
|
|
123
|
-
}, [executeFetch, refetch]);
|
|
124
|
-
return (0, react.useMemo)(() => ({
|
|
125
|
-
data,
|
|
126
|
-
pageInfo,
|
|
127
|
-
error,
|
|
128
|
-
loading,
|
|
129
|
-
reset,
|
|
130
|
-
refetch,
|
|
131
|
-
refetching
|
|
132
|
-
}), [
|
|
133
|
-
data,
|
|
134
|
-
pageInfo,
|
|
135
|
-
error,
|
|
136
|
-
loading,
|
|
137
|
-
reset,
|
|
138
|
-
refetch,
|
|
139
|
-
refetching
|
|
140
|
-
]);
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
//#endregion
|
|
144
|
-
//#region src/hooks/use-swish-intent.ts
|
|
145
|
-
const useSwishIntent = (intent, ...args) => {
|
|
146
|
-
const swish = useSwish();
|
|
147
|
-
const [pending, setPending] = (0, react.useState)(false);
|
|
148
|
-
const dataRef = (0, react.useRef)(args);
|
|
149
|
-
(0, react.useEffect)(() => {
|
|
150
|
-
dataRef.current = args;
|
|
151
|
-
}, [args]);
|
|
152
|
-
return {
|
|
153
|
-
invoke: (0, react.useCallback)(async () => {
|
|
154
|
-
if (!swish) throw new Error("Swish SDK not initialized");
|
|
155
|
-
setPending(true);
|
|
156
|
-
const response = await (await swish.intents.invoke(intent, ...dataRef.current)).complete;
|
|
157
|
-
setPending(false);
|
|
158
|
-
return response;
|
|
159
|
-
}, [swish]),
|
|
160
|
-
pending
|
|
161
|
-
};
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
//#endregion
|
|
165
|
-
//#region src/hooks/use-swish-lists.ts
|
|
166
|
-
const useSwishLists = () => {
|
|
167
|
-
const { data: lists, loading, error, reset } = useSwishQuery((api) => api.lists.list(), { refetch: [
|
|
168
|
-
"item-lists-update",
|
|
169
|
-
"item-delete",
|
|
170
|
-
"list-create",
|
|
171
|
-
"list-update",
|
|
172
|
-
"list-delete"
|
|
173
|
-
] });
|
|
174
|
-
return (0, react.useMemo)(() => ({
|
|
175
|
-
loading,
|
|
176
|
-
lists,
|
|
177
|
-
error,
|
|
178
|
-
reset
|
|
179
|
-
}), [
|
|
180
|
-
lists,
|
|
181
|
-
loading,
|
|
182
|
-
error,
|
|
183
|
-
reset
|
|
184
|
-
]);
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
//#endregion
|
|
188
|
-
//#region src/hooks/use-swish-items.ts
|
|
189
|
-
const useSwishItems = ({ listId, limit = 24 } = {}) => {
|
|
190
|
-
const [nextPage, setNextPage] = (0, react.useState)(null);
|
|
191
|
-
const [data, setData] = (0, react.useState)([]);
|
|
192
|
-
const { data: remoteData, pageInfo, loading, error, reset: resetRemoteData } = useSwishQuery((api, variables) => api.items.list(variables), {
|
|
193
|
-
variables: {
|
|
194
|
-
page: nextPage ?? void 0,
|
|
195
|
-
limit,
|
|
196
|
-
listId
|
|
197
|
-
},
|
|
198
|
-
refetch: false
|
|
199
|
-
});
|
|
200
|
-
const reset = (0, react.useCallback)(() => {
|
|
201
|
-
setData([]);
|
|
202
|
-
setNextPage(null);
|
|
203
|
-
resetRemoteData();
|
|
204
|
-
}, [resetRemoteData]);
|
|
205
|
-
(0, react.useEffect)(() => {
|
|
206
|
-
if (remoteData) setData((prev) => [...prev, ...remoteData]);
|
|
207
|
-
}, [remoteData]);
|
|
208
|
-
const loadMore = (0, react.useCallback)(() => {
|
|
209
|
-
if (pageInfo?.next) setNextPage(pageInfo.next);
|
|
210
|
-
}, [pageInfo?.next]);
|
|
211
|
-
return (0, react.useMemo)(() => ({
|
|
212
|
-
loading,
|
|
213
|
-
data,
|
|
214
|
-
pageInfo,
|
|
215
|
-
error,
|
|
216
|
-
reset,
|
|
217
|
-
hasMore: !!pageInfo?.next,
|
|
218
|
-
loadMore
|
|
219
|
-
}), [
|
|
220
|
-
data,
|
|
221
|
-
pageInfo,
|
|
222
|
-
loading,
|
|
223
|
-
error,
|
|
224
|
-
reset,
|
|
225
|
-
loadMore
|
|
226
|
-
]);
|
|
227
|
-
};
|
|
228
|
-
|
|
229
|
-
//#endregion
|
|
230
|
-
//#region src/utils/shopify-utils.ts
|
|
231
|
-
const gidToId = (gid) => {
|
|
232
|
-
return gid?.split("/").pop();
|
|
233
|
-
};
|
|
234
|
-
|
|
235
|
-
//#endregion
|
|
236
|
-
//#region src/hooks/use-swish-item.ts
|
|
237
|
-
const useSwishItem = ({ productId, variantId, itemId, onSave, onUnsave, onListsUpdate, onVariantUpdate }) => {
|
|
238
|
-
const [savedItemId, setSavedItemId] = (0, react.useState)(itemId ?? null);
|
|
239
|
-
const onUnsaveRef = (0, react.useRef)(onUnsave);
|
|
240
|
-
const onSaveRef = (0, react.useRef)(onSave);
|
|
241
|
-
const onListsUpdateRef = (0, react.useRef)(onListsUpdate);
|
|
242
|
-
const onVariantUpdateRef = (0, react.useRef)(onVariantUpdate);
|
|
243
|
-
onUnsaveRef.current = onUnsave;
|
|
244
|
-
onSaveRef.current = onSave;
|
|
245
|
-
onListsUpdateRef.current = onListsUpdate;
|
|
246
|
-
onVariantUpdateRef.current = onVariantUpdate;
|
|
247
|
-
const { invoke: saveItem, pending: creatingItem } = useSwishIntent("create:item", {
|
|
248
|
-
productId,
|
|
249
|
-
variantId
|
|
250
|
-
});
|
|
251
|
-
const { invoke: editItemLists } = useSwishIntent("edit:item-lists", { itemId: savedItemId ?? "" });
|
|
252
|
-
const { invoke: editItemVariant } = useSwishIntent("edit:item-variant", {
|
|
253
|
-
itemId: savedItemId ?? "",
|
|
254
|
-
productId,
|
|
255
|
-
variantId
|
|
256
|
-
});
|
|
257
|
-
const { invoke: unsaveItem } = useSwishIntent("delete:item", { itemId: savedItemId ?? "" });
|
|
258
|
-
const { data: savedItems, loading: savedItemsLoading, error: savedItemsError } = useSwishQuery((api, variables) => api.items.list(variables), {
|
|
259
|
-
refetch: [
|
|
260
|
-
"item-create",
|
|
261
|
-
"item-update",
|
|
262
|
-
"item-delete"
|
|
263
|
-
],
|
|
264
|
-
variables: {
|
|
265
|
-
limit: 1,
|
|
266
|
-
query: (0, react.useMemo)(() => {
|
|
267
|
-
if (variantId) return `variant:${gidToId(variantId.toString())}`;
|
|
268
|
-
return `product:${gidToId(productId.toString())}`;
|
|
269
|
-
}, [productId, variantId])
|
|
270
|
-
},
|
|
271
|
-
skip: Boolean(itemId) || !productId
|
|
272
|
-
});
|
|
273
|
-
const saved = (0, react.useMemo)(() => Boolean(savedItemId), [savedItemId]);
|
|
274
|
-
const error = (0, react.useMemo)(() => savedItemsError, [savedItemsError]);
|
|
275
|
-
const loading = (0, react.useMemo)(() => savedItemsLoading || creatingItem, [savedItemsLoading, creatingItem]);
|
|
276
|
-
(0, react.useEffect)(() => {
|
|
277
|
-
if (itemId) return;
|
|
278
|
-
if (savedItems?.[0]) setSavedItemId(savedItems[0].id);
|
|
279
|
-
else setSavedItemId(null);
|
|
280
|
-
}, [savedItems, itemId]);
|
|
281
|
-
const unsave = (0, react.useCallback)(async () => {
|
|
282
|
-
const response = await unsaveItem();
|
|
283
|
-
if (response.code === "ok") {
|
|
284
|
-
const data = response.data;
|
|
285
|
-
setSavedItemId(null);
|
|
286
|
-
onUnsaveRef.current?.(data);
|
|
287
|
-
}
|
|
288
|
-
}, [unsaveItem]);
|
|
289
|
-
const updateLists = (0, react.useCallback)(async () => {
|
|
290
|
-
const response = await editItemLists();
|
|
291
|
-
if (response.code !== "ok") return;
|
|
292
|
-
if (response.intent === "delete:item") {
|
|
293
|
-
const data = response.data;
|
|
294
|
-
setSavedItemId(null);
|
|
295
|
-
onUnsaveRef.current?.(data);
|
|
296
|
-
} else {
|
|
297
|
-
const data = response.data;
|
|
298
|
-
onListsUpdateRef.current?.(data);
|
|
299
|
-
}
|
|
300
|
-
}, [editItemLists]);
|
|
301
|
-
const updateVariant = (0, react.useCallback)(async () => {
|
|
302
|
-
const response = await editItemVariant();
|
|
303
|
-
if (response.code === "ok") {
|
|
304
|
-
const data = response.data;
|
|
305
|
-
onVariantUpdateRef.current?.(data);
|
|
306
|
-
}
|
|
307
|
-
}, [editItemVariant]);
|
|
308
|
-
const save = (0, react.useCallback)(async () => {
|
|
309
|
-
const response = await saveItem();
|
|
310
|
-
if (response.code === "ok") {
|
|
311
|
-
const data = response.data;
|
|
312
|
-
setSavedItemId(data.item.id);
|
|
313
|
-
onSaveRef.current?.(data);
|
|
314
|
-
}
|
|
315
|
-
}, [saveItem]);
|
|
316
|
-
const toggle = (0, react.useCallback)(async () => {
|
|
317
|
-
if (saved) await unsave();
|
|
318
|
-
else await save();
|
|
319
|
-
}, [saved, save]);
|
|
320
|
-
return (0, react.useMemo)(() => {
|
|
321
|
-
return {
|
|
322
|
-
saved,
|
|
323
|
-
loading,
|
|
324
|
-
error,
|
|
325
|
-
save,
|
|
326
|
-
unsave,
|
|
327
|
-
updateLists,
|
|
328
|
-
updateVariant,
|
|
329
|
-
toggle
|
|
330
|
-
};
|
|
331
|
-
}, [
|
|
332
|
-
saved,
|
|
333
|
-
loading,
|
|
334
|
-
error,
|
|
335
|
-
save,
|
|
336
|
-
unsave,
|
|
337
|
-
updateLists,
|
|
338
|
-
updateVariant,
|
|
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
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["defaultSwishSdkUrl","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 {\n type SwishApp,\n type SwishOptions,\n swishSdkUrl as defaultSwishSdkUrl,\n} 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 & { swishSdkUrl?: string };\n}\n\nexport function SwishProvider({\n children,\n options: { swishSdkUrl = defaultSwishSdkUrl, ...options },\n}: 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 swishSdkUrl\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) {\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 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, IntentToData } from \"@swishapp/sdk\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useSwish } from \"./use-swish\";\n\nexport const useSwishIntent = <I extends Intent = Intent>(\n intent: I,\n ...args: IntentToData<I> extends void ? [] | [undefined] : [IntentToData<I>]\n) => {\n const swish = useSwish();\n const [pending, setPending] = useState(false);\n const dataRef = useRef(args);\n\n useEffect(() => {\n dataRef.current = args;\n }, [args]);\n\n const invoke = useCallback(async (): Promise<IntentResponse<I>> => {\n if (!swish) {\n throw new Error(\"Swish SDK not initialized\");\n }\n\n setPending(true);\n const activity = await swish.intents.invoke(intent, ...dataRef.current);\n const response = await activity.complete;\n setPending(false);\n return response as IntentResponse<I>;\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 type {\n CreateItemSuccessResponse,\n DeleteItemSuccessResponse,\n EditItemListsSuccessResponse,\n EditItemVariantSuccessResponse,\n} from \"@swishapp/sdk\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { gidToId } from \"../utils/shopify-utils\";\nimport { useSwishIntent } from \"./use-swish-intent\";\nimport { useSwishQuery } from \"./use-swish-query\";\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 onListsUpdate?: (data: EditItemListsSuccessResponse[\"data\"]) => void;\n onVariantUpdate?: (data: EditItemVariantSuccessResponse[\"data\"]) => void;\n}\n\nexport const useSwishItem = ({\n productId,\n variantId,\n itemId,\n onSave,\n onUnsave,\n onListsUpdate,\n onVariantUpdate,\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 onListsUpdateRef =\n useRef<NonNullable<UseSwishItemProps[\"onListsUpdate\"]>>(onListsUpdate);\n const onVariantUpdateRef =\n useRef<NonNullable<UseSwishItemProps[\"onVariantUpdate\"]>>(onVariantUpdate);\n\n onUnsaveRef.current = onUnsave;\n onSaveRef.current = onSave;\n onListsUpdateRef.current = onListsUpdate;\n onVariantUpdateRef.current = onVariantUpdate;\n\n const { invoke: saveItem, pending: creatingItem } = useSwishIntent(\n \"create:item\",\n {\n productId,\n variantId,\n }\n );\n\n const { invoke: editItemLists } = useSwishIntent(\"edit:item-lists\", {\n itemId: savedItemId ?? \"\",\n });\n\n const { invoke: editItemVariant } = useSwishIntent(\"edit:item-variant\", {\n itemId: savedItemId ?? \"\",\n productId,\n variantId,\n });\n\n const { invoke: unsaveItem } = useSwishIntent(\"delete:item\", {\n itemId: savedItemId ?? \"\",\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 updateLists = useCallback(async () => {\n const response = await editItemLists();\n if (response.code !== \"ok\") {\n return;\n }\n if (response.intent === \"delete:item\") {\n // Item was unsaved from list-select\n const data = response.data as DeleteItemSuccessResponse[\"data\"];\n setSavedItemId(null);\n onUnsaveRef.current?.(data);\n } else {\n const data = response.data as EditItemListsSuccessResponse[\"data\"];\n onListsUpdateRef.current?.(data);\n }\n }, [editItemLists]);\n\n const updateVariant = useCallback(async () => {\n const response = await editItemVariant();\n if (response.code === \"ok\") {\n const data = response.data;\n onVariantUpdateRef.current?.(data);\n }\n }, [editItemVariant]);\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]);\n\n return useMemo(() => {\n return {\n saved,\n loading,\n error,\n save,\n unsave,\n updateLists,\n updateVariant,\n toggle,\n };\n }, [saved, loading, error, save, unsave, updateLists, updateVariant, 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
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from "react";
|
|
2
|
-
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
|
-
import { ApiError, ApiResponse, CreateItemSuccessResponse, DeleteItemSuccessResponse, EditItemListsSuccessResponse, EditItemVariantSuccessResponse, EventName, Intent, IntentResponse, IntentToData, Item, PageInfo, PaginatedApiResponse, SwishApp, SwishOptions } from "@swishapp/sdk";
|
|
4
|
-
import * as _swishapp_api_client2 from "@swishapp/api-client";
|
|
5
|
-
export * from "@swishapp/sdk";
|
|
6
|
-
|
|
7
|
-
//#region src/types.d.ts
|
|
8
|
-
interface SwishContextValue {
|
|
9
|
-
swish: SwishApp | null;
|
|
10
|
-
isLoading: boolean;
|
|
11
|
-
error: Error | null;
|
|
12
|
-
}
|
|
13
|
-
//#endregion
|
|
14
|
-
//#region src/context.d.ts
|
|
15
|
-
interface SwishProviderProps {
|
|
16
|
-
children: ReactNode;
|
|
17
|
-
options: SwishOptions & {
|
|
18
|
-
swishSdkUrl?: string;
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
declare function SwishProvider({
|
|
22
|
-
children,
|
|
23
|
-
options: {
|
|
24
|
-
swishSdkUrl,
|
|
25
|
-
...options
|
|
26
|
-
}
|
|
27
|
-
}: SwishProviderProps): react_jsx_runtime0.JSX.Element;
|
|
28
|
-
//#endregion
|
|
29
|
-
//#region src/hooks/use-swish.d.ts
|
|
30
|
-
declare function useSwish(): SwishApp | null;
|
|
31
|
-
//#endregion
|
|
32
|
-
//#region src/hooks/use-swish-query.d.ts
|
|
33
|
-
type FetchFn<TResponse, TVariables> = (swish: SwishApp["api"], variables?: TVariables) => Promise<TResponse>;
|
|
34
|
-
type DataOf<T> = T extends {
|
|
35
|
-
data: infer D;
|
|
36
|
-
} ? D : never;
|
|
37
|
-
declare const useSwishQuery: <TResponse extends ApiResponse<any> | PaginatedApiResponse<any>, TVariables>(fetch: FetchFn<TResponse, TVariables>, options?: {
|
|
38
|
-
variables?: TVariables;
|
|
39
|
-
skip?: boolean;
|
|
40
|
-
refetch?: boolean | EventName[];
|
|
41
|
-
}) => {
|
|
42
|
-
data: DataOf<TResponse> | null;
|
|
43
|
-
pageInfo: PageInfo | null;
|
|
44
|
-
error: ApiError | null;
|
|
45
|
-
loading: boolean;
|
|
46
|
-
reset: () => void;
|
|
47
|
-
refetch: () => void;
|
|
48
|
-
refetching: boolean;
|
|
49
|
-
};
|
|
50
|
-
//#endregion
|
|
51
|
-
//#region src/hooks/use-swish-intent.d.ts
|
|
52
|
-
declare const useSwishIntent: <I extends Intent = Intent>(intent: I, ...args: IntentToData<I> extends void ? [] | [undefined] : [IntentToData<I>]) => {
|
|
53
|
-
invoke: () => Promise<IntentResponse<I>>;
|
|
54
|
-
pending: boolean;
|
|
55
|
-
};
|
|
56
|
-
//#endregion
|
|
57
|
-
//#region src/hooks/use-swish-lists.d.ts
|
|
58
|
-
declare const useSwishLists: () => {
|
|
59
|
-
loading: boolean;
|
|
60
|
-
lists: _swishapp_api_client2.ListDetail[] | null;
|
|
61
|
-
error: _swishapp_api_client2.ApiError | null;
|
|
62
|
-
reset: () => void;
|
|
63
|
-
};
|
|
64
|
-
//#endregion
|
|
65
|
-
//#region src/hooks/use-swish-items.d.ts
|
|
66
|
-
interface UseSwishItemsOptions {
|
|
67
|
-
listId?: string;
|
|
68
|
-
limit?: number;
|
|
69
|
-
}
|
|
70
|
-
declare const useSwishItems: ({
|
|
71
|
-
listId,
|
|
72
|
-
limit
|
|
73
|
-
}?: UseSwishItemsOptions) => {
|
|
74
|
-
loading: boolean;
|
|
75
|
-
data: Item[];
|
|
76
|
-
pageInfo: _swishapp_api_client2.PageInfo | null;
|
|
77
|
-
error: _swishapp_api_client2.ApiError | null;
|
|
78
|
-
reset: () => void;
|
|
79
|
-
hasMore: boolean;
|
|
80
|
-
loadMore: () => void;
|
|
81
|
-
};
|
|
82
|
-
//#endregion
|
|
83
|
-
//#region src/hooks/use-swish-item.d.ts
|
|
84
|
-
interface UseSwishItemProps {
|
|
85
|
-
productId: string | number;
|
|
86
|
-
variantId?: string | number;
|
|
87
|
-
itemId?: string;
|
|
88
|
-
onSave?: (data: CreateItemSuccessResponse["data"]) => void;
|
|
89
|
-
onUnsave?: (data: DeleteItemSuccessResponse["data"]) => void;
|
|
90
|
-
onListsUpdate?: (data: EditItemListsSuccessResponse["data"]) => void;
|
|
91
|
-
onVariantUpdate?: (data: EditItemVariantSuccessResponse["data"]) => void;
|
|
92
|
-
}
|
|
93
|
-
declare const useSwishItem: ({
|
|
94
|
-
productId,
|
|
95
|
-
variantId,
|
|
96
|
-
itemId,
|
|
97
|
-
onSave,
|
|
98
|
-
onUnsave,
|
|
99
|
-
onListsUpdate,
|
|
100
|
-
onVariantUpdate
|
|
101
|
-
}: UseSwishItemProps) => {
|
|
102
|
-
saved: boolean;
|
|
103
|
-
loading: boolean;
|
|
104
|
-
error: _swishapp_api_client2.ApiError | null;
|
|
105
|
-
save: () => Promise<void>;
|
|
106
|
-
unsave: () => Promise<void>;
|
|
107
|
-
updateLists: () => Promise<void>;
|
|
108
|
-
updateVariant: () => Promise<void>;
|
|
109
|
-
toggle: () => Promise<void>;
|
|
110
|
-
};
|
|
111
|
-
//#endregion
|
|
112
|
-
//#region src/hooks/use-swish-item-count.d.ts
|
|
113
|
-
declare const useSwishItemCount: () => {
|
|
114
|
-
count: number;
|
|
115
|
-
loading: boolean;
|
|
116
|
-
error: _swishapp_api_client2.ApiError | null;
|
|
117
|
-
};
|
|
118
|
-
//#endregion
|
|
119
|
-
export { SwishContextValue, SwishProvider, type SwishProviderProps, useSwish, useSwishIntent, useSwishItem, useSwishItemCount, useSwishItems, useSwishLists, useSwishQuery };
|
|
120
|
-
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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;;;;UCSQ,kBAAA;YACL;WACD;;EDdM,CAAA;;iBCiBD,aAAA;;;;;;GAGb,qBAAkB,kBAAA,CAAA,GAAA,CAAA;;;iBClBL,QAAA,CAAA,GAAY;;;KCOhB,yCACH,6BACK,eACT,QAAQ;KAeR,YAAY;;IAA8B;cAElC,kCACO,mBAAmB,8CAG9B,QAAQ,WAAW;cAEZ;;EHnCC,OAAA,CAAA,EAAA,OAAA,GGqCO,SHrCU,EACzB;;;;ECWQ,KAAA,UAAA,GAAA,IAAkB;EAKnB,OAAA,EAAA,OAAa;EAC3B,KAAA,EAAA,GAAA,GAAA,IAAA;EACW,OAAA,EAAA,GAAA,GAAA,IAAA;EACV,UAAA,EAAA,OAAA;CAAkB;;;cGlBR,2BAA4B,SAAS,gBACxC,YACC,aAAa,sCAAsC,aAAa;gBAUpC,QAAQ,eAAe;;;;;cCTjD;;SAyBZ,qBAAA,CAAA,UAAA;SAAA,qBAAA,CAAA,QAAA;;AL9BD,CAAA;;;UMEiB,oBAAA;;;;cAKJ;;;IAGV;;;ENVc,QAAA,mCAGH,IAAA;;;;ECSG,QAAA,EAAA,GAAA,GAAA,IAAA;AAKjB,CAAA;;;UMRU,iBAAA;;;;kBAIQ;oBACE;yBACK;EPfR,eAAA,CAAA,EAAA,CAAA,IAAiB,EOgBP,8BPbb,CAAA,MAAA,CAAA,EAAA,GAAA,IAAA;;cOgBD;;;;;;;;GAQV;;ENfc,OAAA,EAAA,OAAA;EAKD,KAAA,EMUI,qBAAA,CAAA,QAAA,GNVS,IAAA;EAC3B,IAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EACW,MAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EACV,WAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EAAkB,aAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;EAAA,MAAA,EAAA,GAAA,UAAA,CAAA,IAAA,CAAA;;;;cOnBR;;;SAYZ,qBAAA,CAAA,QAAA"}
|