@swishapp/react 0.89.2 → 0.89.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 CHANGED
@@ -55,7 +55,7 @@ function SwishProvider({ children, options }) {
55
55
  function useSwish() {
56
56
  const context = (0, react.useContext)(SwishContext);
57
57
  if (typeof window !== "undefined" && window.swish) return window.swish;
58
- if (!context?.swish) throw new Error("useSwishContext must be used within a SwishProvider");
58
+ if (!context) throw new Error("useSwishContext must be used within a SwishProvider");
59
59
  return context.swish;
60
60
  }
61
61
 
@@ -98,7 +98,6 @@ const useSwishQuery = (fetch, options) => {
98
98
  const executeFetch = (0, react.useCallback)(() => {
99
99
  if (!swish || skip) return;
100
100
  setLoading(true);
101
- console.log("executeFetch", fetchRef.current, options?.variables);
102
101
  fetchRef.current(swish.api, options?.variables).then((response) => {
103
102
  setError("error" in response ? response.error : null);
104
103
  setData("data" in response ? response.data : null);
@@ -153,6 +152,8 @@ const useSwishIntent = (intent, ...args) => {
153
152
  }, [args]);
154
153
  return {
155
154
  invoke: (0, react.useCallback)(async () => {
155
+ if (!swish) throw new Error("Swish SDK not initialized");
156
+ console.log("invoke", intent, ...dataRef.current);
156
157
  setPending(true);
157
158
  const response = await (await swish.intents.invoke(intent, ...dataRef.current)).complete;
158
159
  setPending(false);
@@ -291,7 +292,9 @@ const useSwishItem = ({ productId, variantId, itemId, onSave, onUnsave, onUpdate
291
292
  }
292
293
  }, [editItemLists]);
293
294
  const save = (0, react.useCallback)(async () => {
295
+ console.log("save called");
294
296
  const response = await saveItem();
297
+ console.log("save response", response);
295
298
  if (response.code === "ok") {
296
299
  const data = response.data;
297
300
  setSavedItemId(data.item.id);
@@ -299,6 +302,7 @@ const useSwishItem = ({ productId, variantId, itemId, onSave, onUnsave, onUpdate
299
302
  }
300
303
  }, [saveItem]);
301
304
  const toggle = (0, react.useCallback)(async () => {
305
+ console.log("toggle", saved);
302
306
  if (saved) await unsave();
303
307
  else await save();
304
308
  }, [
@@ -1 +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.89.1\";\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 {\n const context = useContext(SwishContext);\n\n if (typeof window !== \"undefined\" && window.swish) {\n return window.swish;\n }\n\n if (!context?.swish) {\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, 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 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 { 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 \"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: 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 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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"}
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.89.1\";\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) {\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 console.log(\"invoke\", intent, ...dataRef.current);\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 { 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 \"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: 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 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 console.log(\"save called\");\n const response = await saveItem();\n\n console.log(\"save response\", response);\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 console.log(\"toggle\", saved);\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 CHANGED
@@ -21,7 +21,7 @@ declare function SwishProvider({
21
21
  }: SwishProviderProps): react_jsx_runtime0.JSX.Element;
22
22
  //#endregion
23
23
  //#region src/hooks/use-swish.d.ts
24
- declare function useSwish(): SwishApp$1;
24
+ declare function useSwish(): SwishApp$1 | null;
25
25
  //#endregion
26
26
  //#region src/hooks/use-swish-query.d.ts
27
27
  type FetchFn<TResponse, TVariables> = (swish: SwishApp$1["api"], variables?: TVariables) => Promise<TResponse>;
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ReactNode } from "react";
2
2
  import * as react_jsx_runtime0 from "react/jsx-runtime";
3
3
  import { ApiError, ApiResponse, CreateItemSuccessResponse, DeleteItemSuccessResponse, EditItemListsSuccessResponse, EventName, Intent, IntentResponse, IntentToData, 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";
4
+ import * as _swishapp_api_client0 from "@swishapp/api-client";
5
5
 
6
6
  //#region src/types.d.ts
7
7
  interface SwishContextValue {
@@ -21,7 +21,7 @@ declare function SwishProvider({
21
21
  }: SwishProviderProps): react_jsx_runtime0.JSX.Element;
22
22
  //#endregion
23
23
  //#region src/hooks/use-swish.d.ts
24
- declare function useSwish(): SwishApp$1;
24
+ declare function useSwish(): SwishApp$1 | null;
25
25
  //#endregion
26
26
  //#region src/hooks/use-swish-query.d.ts
27
27
  type FetchFn<TResponse, TVariables> = (swish: SwishApp$1["api"], variables?: TVariables) => Promise<TResponse>;
@@ -51,8 +51,8 @@ declare const useSwishIntent: <I extends Intent = Intent>(intent: I, ...args: In
51
51
  //#region src/hooks/use-swish-lists.d.ts
52
52
  declare const useSwishLists: () => {
53
53
  loading: boolean;
54
- lists: _swishapp_api_client2.ListDetail[] | null;
55
- error: _swishapp_api_client2.ApiError | null;
54
+ lists: _swishapp_api_client0.ListDetail[] | null;
55
+ error: _swishapp_api_client0.ApiError | null;
56
56
  reset: () => void;
57
57
  };
58
58
  //#endregion
@@ -67,8 +67,8 @@ declare const useSwishItems: ({
67
67
  }?: UseSwishItemsOptions) => {
68
68
  loading: boolean;
69
69
  data: Item[];
70
- pageInfo: _swishapp_api_client2.PageInfo | null;
71
- error: _swishapp_api_client2.ApiError | null;
70
+ pageInfo: _swishapp_api_client0.PageInfo | null;
71
+ error: _swishapp_api_client0.ApiError | null;
72
72
  reset: () => void;
73
73
  hasMore: boolean;
74
74
  loadMore: () => void;
@@ -93,7 +93,7 @@ declare const useSwishItem: ({
93
93
  }: UseSwishItemProps) => {
94
94
  saved: boolean;
95
95
  loading: boolean;
96
- error: _swishapp_api_client2.ApiError | null;
96
+ error: _swishapp_api_client0.ApiError | null;
97
97
  save: () => Promise<void>;
98
98
  unsave: () => Promise<void>;
99
99
  update: () => Promise<void>;
@@ -104,7 +104,7 @@ declare const useSwishItem: ({
104
104
  declare const useSwishItemCount: () => {
105
105
  count: number;
106
106
  loading: boolean;
107
- error: _swishapp_api_client2.ApiError | null;
107
+ error: _swishapp_api_client0.ApiError | null;
108
108
  };
109
109
  //#endregion
110
110
  export { type SwishApp, type SwishContextValue, type SwishOptions, SwishProvider, type SwishProviderProps, useSwish, useSwishIntent, useSwishItem, useSwishItemCount, useSwishItems, useSwishLists, useSwishQuery };
package/dist/index.mjs CHANGED
@@ -55,7 +55,7 @@ function SwishProvider({ children, options }) {
55
55
  function useSwish() {
56
56
  const context = useContext(SwishContext);
57
57
  if (typeof window !== "undefined" && window.swish) return window.swish;
58
- if (!context?.swish) throw new Error("useSwishContext must be used within a SwishProvider");
58
+ if (!context) throw new Error("useSwishContext must be used within a SwishProvider");
59
59
  return context.swish;
60
60
  }
61
61
 
@@ -98,7 +98,6 @@ const useSwishQuery = (fetch, options) => {
98
98
  const executeFetch = useCallback(() => {
99
99
  if (!swish || skip) return;
100
100
  setLoading(true);
101
- console.log("executeFetch", fetchRef.current, options?.variables);
102
101
  fetchRef.current(swish.api, options?.variables).then((response) => {
103
102
  setError("error" in response ? response.error : null);
104
103
  setData("data" in response ? response.data : null);
@@ -153,6 +152,8 @@ const useSwishIntent = (intent, ...args) => {
153
152
  }, [args]);
154
153
  return {
155
154
  invoke: useCallback(async () => {
155
+ if (!swish) throw new Error("Swish SDK not initialized");
156
+ console.log("invoke", intent, ...dataRef.current);
156
157
  setPending(true);
157
158
  const response = await (await swish.intents.invoke(intent, ...dataRef.current)).complete;
158
159
  setPending(false);
@@ -291,7 +292,9 @@ const useSwishItem = ({ productId, variantId, itemId, onSave, onUnsave, onUpdate
291
292
  }
292
293
  }, [editItemLists]);
293
294
  const save = useCallback(async () => {
295
+ console.log("save called");
294
296
  const response = await saveItem();
297
+ console.log("save response", response);
295
298
  if (response.code === "ok") {
296
299
  const data = response.data;
297
300
  setSavedItemId(data.item.id);
@@ -299,6 +302,7 @@ const useSwishItem = ({ productId, variantId, itemId, onSave, onUnsave, onUpdate
299
302
  }
300
303
  }, [saveItem]);
301
304
  const toggle = useCallback(async () => {
305
+ console.log("toggle", saved);
302
306
  if (saved) await unsave();
303
307
  else await save();
304
308
  }, [
@@ -1 +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.89.1\";\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 {\n const context = useContext(SwishContext);\n\n if (typeof window !== \"undefined\" && window.swish) {\n return window.swish;\n }\n\n if (!context?.swish) {\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, 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 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 { 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 \"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: 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 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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"}
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.89.1\";\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) {\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 console.log(\"invoke\", intent, ...dataRef.current);\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 { 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 \"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: 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 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 console.log(\"save called\");\n const response = await saveItem();\n\n console.log(\"save response\", response);\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 console.log(\"toggle\", saved);\n if (saved) {\n await unsave();\n } else {\n await save();\n }\n }, [saved, save, update]);\n\n return useMemo(() => {\n return { saved, loading, error, save, unsave, update, toggle };\n }, [saved, loading, error, save, unsave, update, toggle]);\n};\n","import { useMemo } from \"react\";\nimport { useSwishQuery } from \"./use-swish-query\";\n\nexport const useSwishItemCount = () => {\n const { data, loading, error } = useSwishQuery((api) => api.items.count(), {\n refetch: [\"item-create\", \"item-delete\"],\n });\n\n return useMemo(() => {\n return {\n count: data?.count ?? 0,\n loading,\n error,\n };\n }, [data, loading, error]);\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swishapp/react",
3
- "version": "0.89.2",
3
+ "version": "0.89.4",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },