@fluid-app/portal-sdk 0.1.84 → 0.1.86
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/{AppDownloadScreen-B-JdFulZ.cjs → AppDownloadScreen-BcpYbAZo.cjs} +4 -4
- package/dist/{AppDownloadScreen-CaTNCtzb.cjs → AppDownloadScreen-DQOgNOQY.cjs} +2 -2
- package/dist/{AppDownloadScreen-CaTNCtzb.cjs.map → AppDownloadScreen-DQOgNOQY.cjs.map} +1 -1
- package/dist/{AppDownloadScreen-BE6M8WxN.mjs → AppDownloadScreen-DsKIUmDP.mjs} +2 -2
- package/dist/{AppDownloadScreen-BE6M8WxN.mjs.map → AppDownloadScreen-DsKIUmDP.mjs.map} +1 -1
- package/dist/{CarouselWidget-v1NWYsQe.mjs → CarouselWidget-BSUwgJQ3.mjs} +3 -3
- package/dist/CarouselWidget-BSUwgJQ3.mjs.map +1 -0
- package/dist/{CarouselWidget-A4_pvjCL.cjs → CarouselWidget-BWHWH48S.cjs} +1 -1
- package/dist/{CarouselWidget-DDW8GqoX.cjs → CarouselWidget-srEpxcKU.cjs} +3 -3
- package/dist/CarouselWidget-srEpxcKU.cjs.map +1 -0
- package/dist/{ContactsScreen-DvmqkXOu.cjs → ContactsScreen-1DC328FQ.cjs} +2 -2
- package/dist/{ContactsScreen-DvmqkXOu.cjs.map → ContactsScreen-1DC328FQ.cjs.map} +1 -1
- package/dist/{ContactsScreen-DrkHWPMm.mjs → ContactsScreen-Bs3DtjXw.mjs} +2 -2
- package/dist/{ContactsScreen-DrkHWPMm.mjs.map → ContactsScreen-Bs3DtjXw.mjs.map} +1 -1
- package/dist/{ContactsScreen-Du9M90zi.cjs → ContactsScreen-C-v5Yrxn.cjs} +4 -4
- package/dist/{FluidProvider-BSBLJp15.cjs → FluidProvider-DGm9zaDs.cjs} +5 -5
- package/dist/{FluidProvider-BSBLJp15.cjs.map → FluidProvider-DGm9zaDs.cjs.map} +1 -1
- package/dist/{FluidProvider-CwkMUOoy.mjs → FluidProvider-DpiMY5TW.mjs} +5 -5
- package/dist/{FluidProvider-CwkMUOoy.mjs.map → FluidProvider-DpiMY5TW.mjs.map} +1 -1
- package/dist/{MessagingScreen-Cg2XvQZF.mjs → MessagingScreen-BI8BzJKm.mjs} +3 -3
- package/dist/{MessagingScreen-Cg2XvQZF.mjs.map → MessagingScreen-BI8BzJKm.mjs.map} +1 -1
- package/dist/{MessagingScreen-C4-8_bvB.mjs → MessagingScreen-CSkPf1fv.mjs} +4 -4
- package/dist/{MessagingScreen-BlN6KjV-.cjs → MessagingScreen-CVAFDLsZ.cjs} +4 -4
- package/dist/{MessagingScreen-Lc81OXIN.cjs → MessagingScreen-GijHV-DQ.cjs} +3 -3
- package/dist/{MessagingScreen-Lc81OXIN.cjs.map → MessagingScreen-GijHV-DQ.cjs.map} +1 -1
- package/dist/{MySiteScreen-BedF13nt.mjs → MySiteScreen-Bg6LNzsn.mjs} +2 -2
- package/dist/{MySiteScreen-BedF13nt.mjs.map → MySiteScreen-Bg6LNzsn.mjs.map} +1 -1
- package/dist/{MySiteScreen-DEOKI32H.cjs → MySiteScreen-CrLr2D4S.cjs} +4 -4
- package/dist/{MySiteScreen-B-I4V3Cc.cjs → MySiteScreen-D8HSLknT.cjs} +2 -2
- package/dist/{MySiteScreen-B-I4V3Cc.cjs.map → MySiteScreen-D8HSLknT.cjs.map} +1 -1
- package/dist/{OrdersScreen-BE_E1QGL.cjs → OrdersScreen-DiQTxyIy.cjs} +4 -4
- package/dist/{OrdersScreen-CfAmUUN3.mjs → OrdersScreen-Dn0fEtdh.mjs} +3 -3
- package/dist/{OrdersScreen-CfAmUUN3.mjs.map → OrdersScreen-Dn0fEtdh.mjs.map} +1 -1
- package/dist/{OrdersScreen-C-rU9cx6.cjs → OrdersScreen-DuGMu--7.cjs} +3 -3
- package/dist/{OrdersScreen-C-rU9cx6.cjs.map → OrdersScreen-DuGMu--7.cjs.map} +1 -1
- package/dist/{PointsWidget-D8U2k-_A.cjs → PointsWidget-Bgl95R-6.cjs} +2 -2
- package/dist/PointsWidget-Bgl95R-6.cjs.map +1 -0
- package/dist/{PointsWidget-CYesuDDG.mjs → PointsWidget-C05iCMne.mjs} +2 -2
- package/dist/PointsWidget-C05iCMne.mjs.map +1 -0
- package/dist/{ProductsScreen-Csw96ete.cjs → ProductsScreen--1YW_UgE.cjs} +3 -3
- package/dist/{ProductsScreen-Csw96ete.cjs.map → ProductsScreen--1YW_UgE.cjs.map} +1 -1
- package/dist/{ProductsScreen-DUPhUJ7p.cjs → ProductsScreen-C6vvURBQ.cjs} +4 -4
- package/dist/{ProductsScreen-CgG79XW9.mjs → ProductsScreen-COd2v64K.mjs} +5 -4
- package/dist/{ProductsScreen-CGo9KQ9L.mjs → ProductsScreen-Cp0Ca5fO.mjs} +3 -3
- package/dist/{ProductsScreen-CGo9KQ9L.mjs.map → ProductsScreen-Cp0Ca5fO.mjs.map} +1 -1
- package/dist/{ProfileScreen-CANmoFsP.cjs → ProfileScreen-BbMzMV7N.cjs} +3 -3
- package/dist/{ProfileScreen-CANmoFsP.cjs.map → ProfileScreen-BbMzMV7N.cjs.map} +1 -1
- package/dist/{ProfileScreen-BSZLS9hY.cjs → ProfileScreen-CuCgYLYg.cjs} +4 -4
- package/dist/{ProfileScreen-C4g7ZGPo.mjs → ProfileScreen-WigtmiOv.mjs} +3 -3
- package/dist/{ProfileScreen-C4g7ZGPo.mjs.map → ProfileScreen-WigtmiOv.mjs.map} +1 -1
- package/dist/{ShareablesScreen-loETsu9v.cjs → ShareablesScreen-CECBa_sH.cjs} +4 -4
- package/dist/{ShareablesScreen-BK0H5fb2.mjs → ShareablesScreen-Ceb5wUmc.mjs} +4 -4
- package/dist/{ShareablesScreen-BK0H5fb2.mjs.map → ShareablesScreen-Ceb5wUmc.mjs.map} +1 -1
- package/dist/{ShareablesScreen-D0kIiW8S.cjs → ShareablesScreen-D5_P3VVk.cjs} +4 -4
- package/dist/{ShareablesScreen-D0kIiW8S.cjs.map → ShareablesScreen-D5_P3VVk.cjs.map} +1 -1
- package/dist/{ShareablesScreen-BmKYYRZq.mjs → ShareablesScreen-Ds-a4dSK.mjs} +5 -4
- package/dist/{ShopScreen-CDwCW5Go.cjs → ShopScreen-BG2O9grs.cjs} +93 -74
- package/dist/ShopScreen-BG2O9grs.cjs.map +1 -0
- package/dist/{ShopScreen-CaTpU5go.cjs → ShopScreen-CfriRC8H.cjs} +4 -4
- package/dist/{ShopScreen-B0Pr0CTu.mjs → ShopScreen-DjXzkEHA.mjs} +94 -75
- package/dist/{ShopScreen-B0Pr0CTu.mjs.map → ShopScreen-DjXzkEHA.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-D3LAx25s.mjs → SubscriptionsScreen-Bc1L9w_R.mjs} +3 -3
- package/dist/{SubscriptionsScreen-D3LAx25s.mjs.map → SubscriptionsScreen-Bc1L9w_R.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-CfvaEuTS.cjs → SubscriptionsScreen-CntycOyp.cjs} +3 -3
- package/dist/{SubscriptionsScreen-CfvaEuTS.cjs.map → SubscriptionsScreen-CntycOyp.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-Dpn0YuDb.cjs → SubscriptionsScreen-DCUFhSbh.cjs} +4 -4
- package/dist/index.cjs +36 -36
- package/dist/index.d.cts +1 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +36 -36
- package/dist/{use-account-clients-62dZrh9E.cjs → use-account-clients-C9UjVcyo.cjs} +2 -2
- package/dist/{use-account-clients-62dZrh9E.cjs.map → use-account-clients-C9UjVcyo.cjs.map} +1 -1
- package/dist/{use-account-clients-Cf_6sxeC.mjs → use-account-clients-oKk8PvPK.mjs} +2 -2
- package/dist/{use-account-clients-Cf_6sxeC.mjs.map → use-account-clients-oKk8PvPK.mjs.map} +1 -1
- package/dist/{use-current-user-Bl9nPNFt.mjs → use-current-user-CoGu5DT7.mjs} +3 -3
- package/dist/{use-current-user-Bl9nPNFt.mjs.map → use-current-user-CoGu5DT7.mjs.map} +1 -1
- package/dist/{use-current-user-SFCzJt0q.cjs → use-current-user-D2YUKSpk.cjs} +3 -3
- package/dist/{use-current-user-SFCzJt0q.cjs.map → use-current-user-D2YUKSpk.cjs.map} +1 -1
- package/dist/{use-customer-account-BoobPvSQ.cjs → use-customer-account-B-eDvs2m.cjs} +3 -3
- package/dist/{use-customer-account-BoobPvSQ.cjs.map → use-customer-account-B-eDvs2m.cjs.map} +1 -1
- package/dist/{use-customer-account-Dt3kO7ti.mjs → use-customer-account-CQr2JJOY.mjs} +3 -3
- package/dist/{use-customer-account-Dt3kO7ti.mjs.map → use-customer-account-CQr2JJOY.mjs.map} +1 -1
- package/dist/{use-fluid-api-DPhr-9Jv.mjs → use-fluid-api-B6740M-8.mjs} +2 -2
- package/dist/{use-fluid-api-DPhr-9Jv.mjs.map → use-fluid-api-B6740M-8.mjs.map} +1 -1
- package/dist/{use-fluid-api-DwRQk00z.cjs → use-fluid-api-LVdptjW2.cjs} +2 -2
- package/dist/{use-fluid-api-DwRQk00z.cjs.map → use-fluid-api-LVdptjW2.cjs.map} +1 -1
- package/package.json +10 -10
- package/dist/CarouselWidget-DDW8GqoX.cjs.map +0 -1
- package/dist/CarouselWidget-v1NWYsQe.mjs.map +0 -1
- package/dist/PointsWidget-CYesuDDG.mjs.map +0 -1
- package/dist/PointsWidget-D8U2k-_A.cjs.map +0 -1
- package/dist/ShopScreen-CDwCW5Go.cjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require("./chunk-9hOWP6kD.cjs");
|
|
2
|
-
require("./FluidProvider-
|
|
3
|
-
require("./PointsWidget-
|
|
2
|
+
require("./FluidProvider-DGm9zaDs.cjs");
|
|
3
|
+
require("./PointsWidget-Bgl95R-6.cjs");
|
|
4
4
|
require("./error-state-BDBF2JrB.cjs");
|
|
5
5
|
require("./ScreenRenderer-D65AsKjr.cjs");
|
|
6
6
|
require("./WidgetInteractionContext-GLPlhAfT.cjs");
|
|
@@ -17,7 +17,7 @@ require("./purify.es-DenAxEWJ.cjs");
|
|
|
17
17
|
require("./src-DGjAAfmN.cjs");
|
|
18
18
|
require("./scroll-arrows-BhGegGRH.cjs");
|
|
19
19
|
require("./MediaRenderer-Y4TsIPBm.cjs");
|
|
20
|
-
require("./CarouselWidget-
|
|
20
|
+
require("./CarouselWidget-srEpxcKU.cjs");
|
|
21
21
|
require("./CatchUpWidget-B1cIV3qS.cjs");
|
|
22
22
|
require("./ChartWidget-CsgeXvTk.cjs");
|
|
23
23
|
require("./ContainerWidget-CcKBkPRM.cjs");
|
|
@@ -34,7 +34,7 @@ require("./TableWidget-Duw_7iyh.cjs");
|
|
|
34
34
|
require("./ToDoWidget-eGB9cfou.cjs");
|
|
35
35
|
require("./VideoWidget-CNHJrY7I.cjs");
|
|
36
36
|
require("./ScreenHeaderContext-wrJlkhgN.cjs");
|
|
37
|
-
const require_ShareablesScreen = require("./ShareablesScreen-
|
|
37
|
+
const require_ShareablesScreen = require("./ShareablesScreen-D5_P3VVk.cjs");
|
|
38
38
|
require("./dist-thaj08s5.cjs");
|
|
39
39
|
require("./es-xQF-WIMq.cjs");
|
|
40
40
|
require("./dist-BK4mvUPm.cjs");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { pt as USER_TYPES } from "./FluidProvider-
|
|
2
|
-
import { i as useSdkClient, o as useFluidAuth } from "./use-account-clients-
|
|
3
|
-
import { n as useCurrentUser } from "./use-current-user-
|
|
1
|
+
import { pt as USER_TYPES } from "./FluidProvider-DpiMY5TW.mjs";
|
|
2
|
+
import { i as useSdkClient, o as useFluidAuth } from "./use-account-clients-oKk8PvPK.mjs";
|
|
3
|
+
import { n as useCurrentUser } from "./use-current-user-CoGu5DT7.mjs";
|
|
4
4
|
import { n as useAppNavigation } from "./AppNavigationContext-BSnbFILQ.mjs";
|
|
5
5
|
import { i as ShareablesCoreProvider, n as ShareablesApp, r as ShareablesUIProvider } from "./src-BjmyVJoe.mjs";
|
|
6
6
|
import { useCallback, useMemo } from "react";
|
|
@@ -151,4 +151,4 @@ const shareablesScreenPropertySchema = {
|
|
|
151
151
|
//#endregion
|
|
152
152
|
export { shareablesScreenPropertySchema as n, useUserType as r, ShareablesScreen as t };
|
|
153
153
|
|
|
154
|
-
//# sourceMappingURL=ShareablesScreen-
|
|
154
|
+
//# sourceMappingURL=ShareablesScreen-Ceb5wUmc.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShareablesScreen-BK0H5fb2.mjs","names":[],"sources":["../src/hooks/use-user-type.ts","../../../file-picker/api-client/src/client.ts","../src/screens/ShareablesScreen.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useFluidAuth } from \"./use-fluid-auth\";\nimport { USER_TYPES, type UserType } from \"../auth/types\";\n\nexport interface UseUserTypeResult {\n userType: UserType | null;\n isCustomer: boolean;\n isRep: boolean;\n isAdmin: boolean;\n}\n\n/**\n * Convenience hook for user-type checks in the portal SDK.\n */\nexport function useUserType(): UseUserTypeResult {\n const { user } = useFluidAuth();\n\n return useMemo(() => {\n const userType = user?.user_type ?? null;\n return {\n userType,\n isCustomer: userType === USER_TYPES.customer,\n isRep: userType === USER_TYPES.rep,\n isAdmin:\n userType === USER_TYPES.admin || userType === USER_TYPES.root_admin,\n };\n }, [user?.user_type]);\n}\n","import type { FetchClientInstance } from \"@fluid-app/api-client-core\";\nimport type { DamAssetCreateResponse } from \"@fluid-app/file-picker-core\";\n\nexport interface DamUploadStrategy {\n uploadFile(params: {\n file: File;\n name: string;\n description?: string;\n tags?: string[];\n onProgress?: (progress: number) => void;\n companyId?: number;\n }): Promise<DamAssetCreateResponse>;\n}\n\nexport interface FilePickerClientConfig {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint?: string; // defaults to \"/api/proxy-url\"\n}\n\nexport interface FilePickerClient {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint: string;\n}\n\nexport function createFilePickerClient(\n config: FilePickerClientConfig,\n): FilePickerClient {\n return {\n fetchClient: config.fetchClient,\n uploadStrategy: config.uploadStrategy,\n unsplashAccessKey: config.unsplashAccessKey,\n proxyEndpoint: config.proxyEndpoint ?? \"/api/proxy-url\",\n };\n}\n","import { useCallback, useMemo, type ComponentProps } from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { ShareablesCoreProvider } from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ShareablesApp } from \"@fluid-app/shareables-ui\";\nimport { createFilePickerClient } from \"@fluid-app/file-picker-api-client\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useSdkClient } from \"../account/use-account-clients\";\nimport { useUserType } from \"../hooks/use-user-type\";\n\ntype ShareablesScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n};\n\n/**\n * Parse the current shareables sub-route from the full slug.\n *\n * System nav slugs are \"share/products\", \"share/media\", \"share/playlists\".\n * Detail pages append an ID: \"share/products/123\", \"share/media/456\".\n *\n * \"share/products\" → screen=\"products\", detailId=null\n * \"share/products/123\" → screen=\"products\", detailId=\"123\"\n * \"share/media/456\" → screen=\"media\", detailId=\"456\"\n * \"share/playlists\" → screen=\"playlists\", detailId=null\n * \"share/playlists/789\" → screen=\"playlists\", detailId=\"789\"\n * \"share/files\" → screen=\"files\", detailId=null\n * \"share\" → screen=null (default to products)\n */\nfunction parseShareablesRoute(currentSlug: string): {\n screen: string | null;\n detailId: string | null;\n action: string | null;\n} {\n // Strip the \"share\" prefix\n const slugWithoutPrefix = currentSlug.replace(/^share\\/?/, \"\");\n if (!slugWithoutPrefix) {\n return { screen: null, detailId: null, action: null };\n }\n\n const parts = slugWithoutPrefix.split(\"/\");\n const screen = parts[0] || null;\n const detailId = parts[1] || null;\n const action = parts[2] || null;\n return { screen, detailId, action };\n}\n\nexport function ShareablesScreen({\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ShareablesScreenProps): React.JSX.Element {\n const domainClient = useSdkClient();\n const { data: userData } = useCurrentUser();\n const { currentSlug, navigate } = useAppNavigation();\n const { isCustomer } = useUserType();\n\n const { screen, detailId, action } = parseShareablesRoute(currentSlug);\n\n const handleNavigate = useCallback(\n (subScreen: string, id?: string) => {\n const path = id ? `share/${subScreen}/${id}` : `share/${subScreen}`;\n navigate(path);\n },\n [navigate],\n );\n\n const handleBack = useCallback(() => {\n if (detailId && screen) {\n // Navigate back to the listing for the current screen\n navigate(`share/${screen}`);\n } else {\n // Navigate to the default shareables screen\n navigate(\"share/products\");\n }\n }, [navigate, detailId, screen]);\n\n const coreConfig = useMemo(\n () => ({\n client: domainClient,\n user: userData ? { id: userData.id } : null,\n repContext: true,\n }),\n [domainClient, userData],\n );\n\n const filePickerClient = useMemo(\n () => createFilePickerClient({ fetchClient: domainClient }),\n [domainClient],\n );\n\n const uiConfig = useMemo(\n () => ({\n user: userData\n ? {\n id: userData.id,\n company: userData.company\n ? { logo_url: userData.company.logo_url }\n : null,\n }\n : undefined,\n affiliateId:\n (userData as { affiliate_id?: number } | undefined)?.affiliate_id ??\n null,\n basePath: \"\",\n navigate: (path: string) => {\n // Strip leading slash — cards generate paths like \"/share/product/123\"\n const cleanPath = path.replace(/^\\//, \"\");\n // Ensure share/ prefix — screen components pass relative paths like \"media/new\"\n const prefixed = cleanPath.startsWith(\"share/\")\n ? cleanPath\n : `share/${cleanPath}`;\n navigate(prefixed);\n },\n showToast: (opts: {\n title: string;\n type: \"success\" | \"error\" | \"warning\";\n }) => {\n console.warn(`[Shareables] ${opts.type}: ${opts.title}`);\n },\n filePickerClient,\n onToggleFavorite: async (params: {\n favoriteableId: number;\n favoriteableType: string;\n }) => {\n const affiliateId = (userData as { affiliate_id?: number } | undefined)\n ?.affiliate_id;\n if (!affiliateId) throw new Error(\"No affiliate ID\");\n return domainClient.post<{ is_favorited: boolean }>(\n `/user_companies/${affiliateId}/favorites/toggle.json`,\n {\n favoriteable_id: params.favoriteableId,\n favoriteable_type: params.favoriteableType,\n },\n );\n },\n onDeletePlaylist: isCustomer\n ? undefined\n : async (playlistId: number) => {\n const { playlists: playlistsApi } =\n await import(\"@fluid-app/shareables-api-client\");\n await playlistsApi.deletePlaylist(domainClient, playlistId);\n },\n readOnly: isCustomer,\n }),\n [userData, navigate, filePickerClient, domainClient, isCustomer],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\n <ShareablesUIProvider config={uiConfig}>\n <ShareablesApp\n screen={screen}\n detailId={detailId}\n action={action}\n companyLogoUrl={userData?.company?.logo_url}\n countryCode={userData?.country?.iso}\n onNavigate={handleNavigate}\n onBack={handleBack}\n />\n </ShareablesUIProvider>\n </ShareablesCoreProvider>\n </div>\n );\n}\n\nexport const shareablesScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ShareablesScreen\",\n displayName: \"Shareables Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ShareablesScreen-Ceb5wUmc.mjs","names":[],"sources":["../src/hooks/use-user-type.ts","../../../file-picker/api-client/src/client.ts","../src/screens/ShareablesScreen.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useFluidAuth } from \"./use-fluid-auth\";\nimport { USER_TYPES, type UserType } from \"../auth/types\";\n\nexport interface UseUserTypeResult {\n userType: UserType | null;\n isCustomer: boolean;\n isRep: boolean;\n isAdmin: boolean;\n}\n\n/**\n * Convenience hook for user-type checks in the portal SDK.\n */\nexport function useUserType(): UseUserTypeResult {\n const { user } = useFluidAuth();\n\n return useMemo(() => {\n const userType = user?.user_type ?? null;\n return {\n userType,\n isCustomer: userType === USER_TYPES.customer,\n isRep: userType === USER_TYPES.rep,\n isAdmin:\n userType === USER_TYPES.admin || userType === USER_TYPES.root_admin,\n };\n }, [user?.user_type]);\n}\n","import type { FetchClientInstance } from \"@fluid-app/api-client-core\";\nimport type { DamAssetCreateResponse } from \"@fluid-app/file-picker-core\";\n\nexport interface DamUploadStrategy {\n uploadFile(params: {\n file: File;\n name: string;\n description?: string;\n tags?: string[];\n onProgress?: (progress: number) => void;\n companyId?: number;\n }): Promise<DamAssetCreateResponse>;\n}\n\nexport interface FilePickerClientConfig {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint?: string; // defaults to \"/api/proxy-url\"\n}\n\nexport interface FilePickerClient {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint: string;\n}\n\nexport function createFilePickerClient(\n config: FilePickerClientConfig,\n): FilePickerClient {\n return {\n fetchClient: config.fetchClient,\n uploadStrategy: config.uploadStrategy,\n unsplashAccessKey: config.unsplashAccessKey,\n proxyEndpoint: config.proxyEndpoint ?? \"/api/proxy-url\",\n };\n}\n","import { useCallback, useMemo, type ComponentProps } from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { ShareablesCoreProvider } from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ShareablesApp } from \"@fluid-app/shareables-ui\";\nimport { createFilePickerClient } from \"@fluid-app/file-picker-api-client\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useSdkClient } from \"../account/use-account-clients\";\nimport { useUserType } from \"../hooks/use-user-type\";\n\ntype ShareablesScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n};\n\n/**\n * Parse the current shareables sub-route from the full slug.\n *\n * System nav slugs are \"share/products\", \"share/media\", \"share/playlists\".\n * Detail pages append an ID: \"share/products/123\", \"share/media/456\".\n *\n * \"share/products\" → screen=\"products\", detailId=null\n * \"share/products/123\" → screen=\"products\", detailId=\"123\"\n * \"share/media/456\" → screen=\"media\", detailId=\"456\"\n * \"share/playlists\" → screen=\"playlists\", detailId=null\n * \"share/playlists/789\" → screen=\"playlists\", detailId=\"789\"\n * \"share/files\" → screen=\"files\", detailId=null\n * \"share\" → screen=null (default to products)\n */\nfunction parseShareablesRoute(currentSlug: string): {\n screen: string | null;\n detailId: string | null;\n action: string | null;\n} {\n // Strip the \"share\" prefix\n const slugWithoutPrefix = currentSlug.replace(/^share\\/?/, \"\");\n if (!slugWithoutPrefix) {\n return { screen: null, detailId: null, action: null };\n }\n\n const parts = slugWithoutPrefix.split(\"/\");\n const screen = parts[0] || null;\n const detailId = parts[1] || null;\n const action = parts[2] || null;\n return { screen, detailId, action };\n}\n\nexport function ShareablesScreen({\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ShareablesScreenProps): React.JSX.Element {\n const domainClient = useSdkClient();\n const { data: userData } = useCurrentUser();\n const { currentSlug, navigate } = useAppNavigation();\n const { isCustomer } = useUserType();\n\n const { screen, detailId, action } = parseShareablesRoute(currentSlug);\n\n const handleNavigate = useCallback(\n (subScreen: string, id?: string) => {\n const path = id ? `share/${subScreen}/${id}` : `share/${subScreen}`;\n navigate(path);\n },\n [navigate],\n );\n\n const handleBack = useCallback(() => {\n if (detailId && screen) {\n // Navigate back to the listing for the current screen\n navigate(`share/${screen}`);\n } else {\n // Navigate to the default shareables screen\n navigate(\"share/products\");\n }\n }, [navigate, detailId, screen]);\n\n const coreConfig = useMemo(\n () => ({\n client: domainClient,\n user: userData ? { id: userData.id } : null,\n repContext: true,\n }),\n [domainClient, userData],\n );\n\n const filePickerClient = useMemo(\n () => createFilePickerClient({ fetchClient: domainClient }),\n [domainClient],\n );\n\n const uiConfig = useMemo(\n () => ({\n user: userData\n ? {\n id: userData.id,\n company: userData.company\n ? { logo_url: userData.company.logo_url }\n : null,\n }\n : undefined,\n affiliateId:\n (userData as { affiliate_id?: number } | undefined)?.affiliate_id ??\n null,\n basePath: \"\",\n navigate: (path: string) => {\n // Strip leading slash — cards generate paths like \"/share/product/123\"\n const cleanPath = path.replace(/^\\//, \"\");\n // Ensure share/ prefix — screen components pass relative paths like \"media/new\"\n const prefixed = cleanPath.startsWith(\"share/\")\n ? cleanPath\n : `share/${cleanPath}`;\n navigate(prefixed);\n },\n showToast: (opts: {\n title: string;\n type: \"success\" | \"error\" | \"warning\";\n }) => {\n console.warn(`[Shareables] ${opts.type}: ${opts.title}`);\n },\n filePickerClient,\n onToggleFavorite: async (params: {\n favoriteableId: number;\n favoriteableType: string;\n }) => {\n const affiliateId = (userData as { affiliate_id?: number } | undefined)\n ?.affiliate_id;\n if (!affiliateId) throw new Error(\"No affiliate ID\");\n return domainClient.post<{ is_favorited: boolean }>(\n `/user_companies/${affiliateId}/favorites/toggle.json`,\n {\n favoriteable_id: params.favoriteableId,\n favoriteable_type: params.favoriteableType,\n },\n );\n },\n onDeletePlaylist: isCustomer\n ? undefined\n : async (playlistId: number) => {\n const { playlists: playlistsApi } =\n await import(\"@fluid-app/shareables-api-client\");\n await playlistsApi.deletePlaylist(domainClient, playlistId);\n },\n readOnly: isCustomer,\n }),\n [userData, navigate, filePickerClient, domainClient, isCustomer],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\n <ShareablesUIProvider config={uiConfig}>\n <ShareablesApp\n screen={screen}\n detailId={detailId}\n action={action}\n companyLogoUrl={userData?.company?.logo_url}\n countryCode={userData?.country?.iso}\n onNavigate={handleNavigate}\n onBack={handleBack}\n />\n </ShareablesUIProvider>\n </ShareablesCoreProvider>\n </div>\n );\n}\n\nexport const shareablesScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ShareablesScreen\",\n displayName: \"Shareables Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require("./chunk-9hOWP6kD.cjs");
|
|
2
|
-
const require_FluidProvider = require("./FluidProvider-
|
|
3
|
-
const require_use_account_clients = require("./use-account-clients-
|
|
4
|
-
const require_use_current_user = require("./use-current-user-
|
|
2
|
+
const require_FluidProvider = require("./FluidProvider-DGm9zaDs.cjs");
|
|
3
|
+
const require_use_account_clients = require("./use-account-clients-C9UjVcyo.cjs");
|
|
4
|
+
const require_use_current_user = require("./use-current-user-D2YUKSpk.cjs");
|
|
5
5
|
const require_AppNavigationContext = require("./AppNavigationContext-DnwdUAjn.cjs");
|
|
6
6
|
const require_src = require("./src-bzRRiTN4.cjs");
|
|
7
7
|
let react = require("react");
|
|
@@ -169,4 +169,4 @@ Object.defineProperty(exports, "useUserType", {
|
|
|
169
169
|
}
|
|
170
170
|
});
|
|
171
171
|
|
|
172
|
-
//# sourceMappingURL=ShareablesScreen-
|
|
172
|
+
//# sourceMappingURL=ShareablesScreen-D5_P3VVk.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShareablesScreen-D0kIiW8S.cjs","names":["useFluidAuth","USER_TYPES","useSdkClient","useCurrentUser","useAppNavigation","ShareablesCoreProvider","ShareablesUIProvider","ShareablesApp"],"sources":["../src/hooks/use-user-type.ts","../../../file-picker/api-client/src/client.ts","../src/screens/ShareablesScreen.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useFluidAuth } from \"./use-fluid-auth\";\nimport { USER_TYPES, type UserType } from \"../auth/types\";\n\nexport interface UseUserTypeResult {\n userType: UserType | null;\n isCustomer: boolean;\n isRep: boolean;\n isAdmin: boolean;\n}\n\n/**\n * Convenience hook for user-type checks in the portal SDK.\n */\nexport function useUserType(): UseUserTypeResult {\n const { user } = useFluidAuth();\n\n return useMemo(() => {\n const userType = user?.user_type ?? null;\n return {\n userType,\n isCustomer: userType === USER_TYPES.customer,\n isRep: userType === USER_TYPES.rep,\n isAdmin:\n userType === USER_TYPES.admin || userType === USER_TYPES.root_admin,\n };\n }, [user?.user_type]);\n}\n","import type { FetchClientInstance } from \"@fluid-app/api-client-core\";\nimport type { DamAssetCreateResponse } from \"@fluid-app/file-picker-core\";\n\nexport interface DamUploadStrategy {\n uploadFile(params: {\n file: File;\n name: string;\n description?: string;\n tags?: string[];\n onProgress?: (progress: number) => void;\n companyId?: number;\n }): Promise<DamAssetCreateResponse>;\n}\n\nexport interface FilePickerClientConfig {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint?: string; // defaults to \"/api/proxy-url\"\n}\n\nexport interface FilePickerClient {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint: string;\n}\n\nexport function createFilePickerClient(\n config: FilePickerClientConfig,\n): FilePickerClient {\n return {\n fetchClient: config.fetchClient,\n uploadStrategy: config.uploadStrategy,\n unsplashAccessKey: config.unsplashAccessKey,\n proxyEndpoint: config.proxyEndpoint ?? \"/api/proxy-url\",\n };\n}\n","import { useCallback, useMemo, type ComponentProps } from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { ShareablesCoreProvider } from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ShareablesApp } from \"@fluid-app/shareables-ui\";\nimport { createFilePickerClient } from \"@fluid-app/file-picker-api-client\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useSdkClient } from \"../account/use-account-clients\";\nimport { useUserType } from \"../hooks/use-user-type\";\n\ntype ShareablesScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n};\n\n/**\n * Parse the current shareables sub-route from the full slug.\n *\n * System nav slugs are \"share/products\", \"share/media\", \"share/playlists\".\n * Detail pages append an ID: \"share/products/123\", \"share/media/456\".\n *\n * \"share/products\" → screen=\"products\", detailId=null\n * \"share/products/123\" → screen=\"products\", detailId=\"123\"\n * \"share/media/456\" → screen=\"media\", detailId=\"456\"\n * \"share/playlists\" → screen=\"playlists\", detailId=null\n * \"share/playlists/789\" → screen=\"playlists\", detailId=\"789\"\n * \"share/files\" → screen=\"files\", detailId=null\n * \"share\" → screen=null (default to products)\n */\nfunction parseShareablesRoute(currentSlug: string): {\n screen: string | null;\n detailId: string | null;\n action: string | null;\n} {\n // Strip the \"share\" prefix\n const slugWithoutPrefix = currentSlug.replace(/^share\\/?/, \"\");\n if (!slugWithoutPrefix) {\n return { screen: null, detailId: null, action: null };\n }\n\n const parts = slugWithoutPrefix.split(\"/\");\n const screen = parts[0] || null;\n const detailId = parts[1] || null;\n const action = parts[2] || null;\n return { screen, detailId, action };\n}\n\nexport function ShareablesScreen({\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ShareablesScreenProps): React.JSX.Element {\n const domainClient = useSdkClient();\n const { data: userData } = useCurrentUser();\n const { currentSlug, navigate } = useAppNavigation();\n const { isCustomer } = useUserType();\n\n const { screen, detailId, action } = parseShareablesRoute(currentSlug);\n\n const handleNavigate = useCallback(\n (subScreen: string, id?: string) => {\n const path = id ? `share/${subScreen}/${id}` : `share/${subScreen}`;\n navigate(path);\n },\n [navigate],\n );\n\n const handleBack = useCallback(() => {\n if (detailId && screen) {\n // Navigate back to the listing for the current screen\n navigate(`share/${screen}`);\n } else {\n // Navigate to the default shareables screen\n navigate(\"share/products\");\n }\n }, [navigate, detailId, screen]);\n\n const coreConfig = useMemo(\n () => ({\n client: domainClient,\n user: userData ? { id: userData.id } : null,\n repContext: true,\n }),\n [domainClient, userData],\n );\n\n const filePickerClient = useMemo(\n () => createFilePickerClient({ fetchClient: domainClient }),\n [domainClient],\n );\n\n const uiConfig = useMemo(\n () => ({\n user: userData\n ? {\n id: userData.id,\n company: userData.company\n ? { logo_url: userData.company.logo_url }\n : null,\n }\n : undefined,\n affiliateId:\n (userData as { affiliate_id?: number } | undefined)?.affiliate_id ??\n null,\n basePath: \"\",\n navigate: (path: string) => {\n // Strip leading slash — cards generate paths like \"/share/product/123\"\n const cleanPath = path.replace(/^\\//, \"\");\n // Ensure share/ prefix — screen components pass relative paths like \"media/new\"\n const prefixed = cleanPath.startsWith(\"share/\")\n ? cleanPath\n : `share/${cleanPath}`;\n navigate(prefixed);\n },\n showToast: (opts: {\n title: string;\n type: \"success\" | \"error\" | \"warning\";\n }) => {\n console.warn(`[Shareables] ${opts.type}: ${opts.title}`);\n },\n filePickerClient,\n onToggleFavorite: async (params: {\n favoriteableId: number;\n favoriteableType: string;\n }) => {\n const affiliateId = (userData as { affiliate_id?: number } | undefined)\n ?.affiliate_id;\n if (!affiliateId) throw new Error(\"No affiliate ID\");\n return domainClient.post<{ is_favorited: boolean }>(\n `/user_companies/${affiliateId}/favorites/toggle.json`,\n {\n favoriteable_id: params.favoriteableId,\n favoriteable_type: params.favoriteableType,\n },\n );\n },\n onDeletePlaylist: isCustomer\n ? undefined\n : async (playlistId: number) => {\n const { playlists: playlistsApi } =\n await import(\"@fluid-app/shareables-api-client\");\n await playlistsApi.deletePlaylist(domainClient, playlistId);\n },\n readOnly: isCustomer,\n }),\n [userData, navigate, filePickerClient, domainClient, isCustomer],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\n <ShareablesUIProvider config={uiConfig}>\n <ShareablesApp\n screen={screen}\n detailId={detailId}\n action={action}\n companyLogoUrl={userData?.company?.logo_url}\n countryCode={userData?.country?.iso}\n onNavigate={handleNavigate}\n onBack={handleBack}\n />\n </ShareablesUIProvider>\n </ShareablesCoreProvider>\n </div>\n );\n}\n\nexport const shareablesScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ShareablesScreen\",\n displayName: \"Shareables Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ShareablesScreen-D5_P3VVk.cjs","names":["useFluidAuth","USER_TYPES","useSdkClient","useCurrentUser","useAppNavigation","ShareablesCoreProvider","ShareablesUIProvider","ShareablesApp"],"sources":["../src/hooks/use-user-type.ts","../../../file-picker/api-client/src/client.ts","../src/screens/ShareablesScreen.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useFluidAuth } from \"./use-fluid-auth\";\nimport { USER_TYPES, type UserType } from \"../auth/types\";\n\nexport interface UseUserTypeResult {\n userType: UserType | null;\n isCustomer: boolean;\n isRep: boolean;\n isAdmin: boolean;\n}\n\n/**\n * Convenience hook for user-type checks in the portal SDK.\n */\nexport function useUserType(): UseUserTypeResult {\n const { user } = useFluidAuth();\n\n return useMemo(() => {\n const userType = user?.user_type ?? null;\n return {\n userType,\n isCustomer: userType === USER_TYPES.customer,\n isRep: userType === USER_TYPES.rep,\n isAdmin:\n userType === USER_TYPES.admin || userType === USER_TYPES.root_admin,\n };\n }, [user?.user_type]);\n}\n","import type { FetchClientInstance } from \"@fluid-app/api-client-core\";\nimport type { DamAssetCreateResponse } from \"@fluid-app/file-picker-core\";\n\nexport interface DamUploadStrategy {\n uploadFile(params: {\n file: File;\n name: string;\n description?: string;\n tags?: string[];\n onProgress?: (progress: number) => void;\n companyId?: number;\n }): Promise<DamAssetCreateResponse>;\n}\n\nexport interface FilePickerClientConfig {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint?: string; // defaults to \"/api/proxy-url\"\n}\n\nexport interface FilePickerClient {\n fetchClient: FetchClientInstance;\n uploadStrategy?: DamUploadStrategy;\n unsplashAccessKey?: string;\n proxyEndpoint: string;\n}\n\nexport function createFilePickerClient(\n config: FilePickerClientConfig,\n): FilePickerClient {\n return {\n fetchClient: config.fetchClient,\n uploadStrategy: config.uploadStrategy,\n unsplashAccessKey: config.unsplashAccessKey,\n proxyEndpoint: config.proxyEndpoint ?? \"/api/proxy-url\",\n };\n}\n","import { useCallback, useMemo, type ComponentProps } from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { ShareablesCoreProvider } from \"@fluid-app/shareables-core\";\nimport { ShareablesUIProvider, ShareablesApp } from \"@fluid-app/shareables-ui\";\nimport { createFilePickerClient } from \"@fluid-app/file-picker-api-client\";\nimport { useCurrentUser } from \"../hooks/use-current-user\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useSdkClient } from \"../account/use-account-clients\";\nimport { useUserType } from \"../hooks/use-user-type\";\n\ntype ShareablesScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n};\n\n/**\n * Parse the current shareables sub-route from the full slug.\n *\n * System nav slugs are \"share/products\", \"share/media\", \"share/playlists\".\n * Detail pages append an ID: \"share/products/123\", \"share/media/456\".\n *\n * \"share/products\" → screen=\"products\", detailId=null\n * \"share/products/123\" → screen=\"products\", detailId=\"123\"\n * \"share/media/456\" → screen=\"media\", detailId=\"456\"\n * \"share/playlists\" → screen=\"playlists\", detailId=null\n * \"share/playlists/789\" → screen=\"playlists\", detailId=\"789\"\n * \"share/files\" → screen=\"files\", detailId=null\n * \"share\" → screen=null (default to products)\n */\nfunction parseShareablesRoute(currentSlug: string): {\n screen: string | null;\n detailId: string | null;\n action: string | null;\n} {\n // Strip the \"share\" prefix\n const slugWithoutPrefix = currentSlug.replace(/^share\\/?/, \"\");\n if (!slugWithoutPrefix) {\n return { screen: null, detailId: null, action: null };\n }\n\n const parts = slugWithoutPrefix.split(\"/\");\n const screen = parts[0] || null;\n const detailId = parts[1] || null;\n const action = parts[2] || null;\n return { screen, detailId, action };\n}\n\nexport function ShareablesScreen({\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ShareablesScreenProps): React.JSX.Element {\n const domainClient = useSdkClient();\n const { data: userData } = useCurrentUser();\n const { currentSlug, navigate } = useAppNavigation();\n const { isCustomer } = useUserType();\n\n const { screen, detailId, action } = parseShareablesRoute(currentSlug);\n\n const handleNavigate = useCallback(\n (subScreen: string, id?: string) => {\n const path = id ? `share/${subScreen}/${id}` : `share/${subScreen}`;\n navigate(path);\n },\n [navigate],\n );\n\n const handleBack = useCallback(() => {\n if (detailId && screen) {\n // Navigate back to the listing for the current screen\n navigate(`share/${screen}`);\n } else {\n // Navigate to the default shareables screen\n navigate(\"share/products\");\n }\n }, [navigate, detailId, screen]);\n\n const coreConfig = useMemo(\n () => ({\n client: domainClient,\n user: userData ? { id: userData.id } : null,\n repContext: true,\n }),\n [domainClient, userData],\n );\n\n const filePickerClient = useMemo(\n () => createFilePickerClient({ fetchClient: domainClient }),\n [domainClient],\n );\n\n const uiConfig = useMemo(\n () => ({\n user: userData\n ? {\n id: userData.id,\n company: userData.company\n ? { logo_url: userData.company.logo_url }\n : null,\n }\n : undefined,\n affiliateId:\n (userData as { affiliate_id?: number } | undefined)?.affiliate_id ??\n null,\n basePath: \"\",\n navigate: (path: string) => {\n // Strip leading slash — cards generate paths like \"/share/product/123\"\n const cleanPath = path.replace(/^\\//, \"\");\n // Ensure share/ prefix — screen components pass relative paths like \"media/new\"\n const prefixed = cleanPath.startsWith(\"share/\")\n ? cleanPath\n : `share/${cleanPath}`;\n navigate(prefixed);\n },\n showToast: (opts: {\n title: string;\n type: \"success\" | \"error\" | \"warning\";\n }) => {\n console.warn(`[Shareables] ${opts.type}: ${opts.title}`);\n },\n filePickerClient,\n onToggleFavorite: async (params: {\n favoriteableId: number;\n favoriteableType: string;\n }) => {\n const affiliateId = (userData as { affiliate_id?: number } | undefined)\n ?.affiliate_id;\n if (!affiliateId) throw new Error(\"No affiliate ID\");\n return domainClient.post<{ is_favorited: boolean }>(\n `/user_companies/${affiliateId}/favorites/toggle.json`,\n {\n favoriteable_id: params.favoriteableId,\n favoriteable_type: params.favoriteableType,\n },\n );\n },\n onDeletePlaylist: isCustomer\n ? undefined\n : async (playlistId: number) => {\n const { playlists: playlistsApi } =\n await import(\"@fluid-app/shareables-api-client\");\n await playlistsApi.deletePlaylist(domainClient, playlistId);\n },\n readOnly: isCustomer,\n }),\n [userData, navigate, filePickerClient, domainClient, isCustomer],\n );\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <ShareablesCoreProvider config={coreConfig}>\n <ShareablesUIProvider config={uiConfig}>\n <ShareablesApp\n screen={screen}\n detailId={detailId}\n action={action}\n companyLogoUrl={userData?.company?.logo_url}\n countryCode={userData?.country?.iso}\n onNavigate={handleNavigate}\n onBack={handleBack}\n />\n </ShareablesUIProvider>\n </ShareablesCoreProvider>\n </div>\n );\n}\n\nexport const shareablesScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ShareablesScreen\",\n displayName: \"Shareables Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import "./FluidProvider-
|
|
2
|
-
import "./PointsWidget-
|
|
1
|
+
import "./FluidProvider-DpiMY5TW.mjs";
|
|
2
|
+
import "./PointsWidget-C05iCMne.mjs";
|
|
3
3
|
import "./error-state-C9MqwdW7.mjs";
|
|
4
4
|
import "./ScreenRenderer-DoVfmxCl.mjs";
|
|
5
5
|
import "./WidgetInteractionContext-1AMQFvCN.mjs";
|
|
@@ -16,7 +16,7 @@ import "./purify.es-D4F6PAAZ.mjs";
|
|
|
16
16
|
import "./src-77nf0QPD.mjs";
|
|
17
17
|
import "./scroll-arrows-CjjaRceq.mjs";
|
|
18
18
|
import "./MediaRenderer-BKgR0Nd5.mjs";
|
|
19
|
-
import "./CarouselWidget-
|
|
19
|
+
import "./CarouselWidget-BSUwgJQ3.mjs";
|
|
20
20
|
import "./CatchUpWidget-CMRwgEcX.mjs";
|
|
21
21
|
import "./ChartWidget-DZYGhLye.mjs";
|
|
22
22
|
import "./ContainerWidget-BIMMO6W4.mjs";
|
|
@@ -33,7 +33,8 @@ import "./TableWidget-Nkzz38xS.mjs";
|
|
|
33
33
|
import "./ToDoWidget-D52-GT7f.mjs";
|
|
34
34
|
import "./VideoWidget-4DRASBWA.mjs";
|
|
35
35
|
import "./ScreenHeaderContext-NdrJ58Mg.mjs";
|
|
36
|
-
import { n as shareablesScreenPropertySchema, t as ShareablesScreen } from "./ShareablesScreen-
|
|
36
|
+
import { n as shareablesScreenPropertySchema, t as ShareablesScreen } from "./ShareablesScreen-Ceb5wUmc.mjs";
|
|
37
|
+
import "./AppNavigationContext-BSnbFILQ.mjs";
|
|
37
38
|
import "./dist-CkIGP8my.mjs";
|
|
38
39
|
import "./es-Dlib2eNY.mjs";
|
|
39
40
|
import "./dist-C9vpl_rR.mjs";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-9hOWP6kD.cjs");
|
|
2
|
-
const require_FluidProvider = require("./FluidProvider-
|
|
2
|
+
const require_FluidProvider = require("./FluidProvider-DGm9zaDs.cjs");
|
|
3
3
|
const require_src = require("./src-DGjAAfmN.cjs");
|
|
4
|
-
const require_use_account_clients = require("./use-account-clients-
|
|
4
|
+
const require_use_account_clients = require("./use-account-clients-C9UjVcyo.cjs");
|
|
5
5
|
const require_ScreenHeaderContext = require("./ScreenHeaderContext-wrJlkhgN.cjs");
|
|
6
|
-
const require_use_current_user = require("./use-current-user-
|
|
6
|
+
const require_use_current_user = require("./use-current-user-D2YUKSpk.cjs");
|
|
7
7
|
const require_AppNavigationContext = require("./AppNavigationContext-DnwdUAjn.cjs");
|
|
8
8
|
const require_products = require("./products-CjZof7c2.cjs");
|
|
9
9
|
let react = require("react");
|
|
@@ -1346,7 +1346,7 @@ function ProductListing({ countryCode, companyLogoUrl, renderImage, onSelectProd
|
|
|
1346
1346
|
})]
|
|
1347
1347
|
});
|
|
1348
1348
|
}
|
|
1349
|
-
function ProductDetail({ productId, countryCode, renderImage, onBack, onAddToCart, cartButton }) {
|
|
1349
|
+
function ProductDetail({ productId, countryCode, renderImage, onBack, onAddToCart, cartButton, companyName }) {
|
|
1350
1350
|
const { product, isLoading, error, currentVariant, productOptions, effectiveSelectedOptions, handleOptionChange, quantity, setQuantity, isSubscribe, userSelectedSubscribe, setUserSelectedSubscribe, showBuyOnce, showSubscribe, selectedSubscriptionPlan, setSelectedSubscriptionPlan, displayPrice, displayWholesalePrice, displayWholesaleSubscriptionPrice, wholesaleCv, wholesaleQv, currentVariantCountry } = useProductDetail({
|
|
1351
1351
|
productId,
|
|
1352
1352
|
countryCode
|
|
@@ -1362,6 +1362,8 @@ function ProductDetail({ productId, countryCode, renderImage, onBack, onAddToCar
|
|
|
1362
1362
|
currentVariant?.images,
|
|
1363
1363
|
coverImage
|
|
1364
1364
|
]);
|
|
1365
|
+
const isBundle = product?.bundle === true;
|
|
1366
|
+
const bundleUrl = isBundle && product?.canonical_url ? product.canonical_url : null;
|
|
1365
1367
|
const handleAddToCart = () => {
|
|
1366
1368
|
if (!onAddToCart || !currentVariant?.id) return;
|
|
1367
1369
|
onAddToCart(currentVariant.id, quantity, isSubscribe, selectedSubscriptionPlan?.subscription_plan?.id?.toString());
|
|
@@ -1436,7 +1438,7 @@ function ProductDetail({ productId, countryCode, renderImage, onBack, onAddToCar
|
|
|
1436
1438
|
className: "text-foreground text-3xl font-bold",
|
|
1437
1439
|
children: title
|
|
1438
1440
|
}),
|
|
1439
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1441
|
+
!isBundle && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1440
1442
|
className: "mb-2 flex items-center gap-2",
|
|
1441
1443
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
1442
1444
|
className: "text-foreground text-sm",
|
|
@@ -1456,81 +1458,96 @@ function ProductDetail({ productId, countryCode, renderImage, onBack, onAddToCar
|
|
|
1456
1458
|
dangerouslySetInnerHTML: { __html: sanitizeHtml(product.description ?? "") }
|
|
1457
1459
|
})]
|
|
1458
1460
|
}),
|
|
1459
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
isSubscribe,
|
|
1463
|
-
userSelectedSubscribe,
|
|
1464
|
-
onSubscribeChange: setUserSelectedSubscribe,
|
|
1465
|
-
wholesalePrice: currentVariantCountry?.wholesale,
|
|
1466
|
-
wholesaleSubscriptionPrice: currentVariantCountry?.wholesale_subscription_price,
|
|
1467
|
-
product_subscription_plans: product.product_subscription_plans || [],
|
|
1468
|
-
selectedSubscriptionPlan,
|
|
1469
|
-
onSubscriptionPlanChange: setSelectedSubscriptionPlan
|
|
1470
|
-
}),
|
|
1471
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1472
|
-
className: "text-muted-foreground mb-3 text-sm",
|
|
1473
|
-
children: [
|
|
1474
|
-
"CV ",
|
|
1475
|
-
countryCode && wholesaleCv != null ? wholesaleCv : "-",
|
|
1476
|
-
" | QV",
|
|
1477
|
-
" ",
|
|
1478
|
-
countryCode && wholesaleQv != null ? wholesaleQv : "-"
|
|
1479
|
-
]
|
|
1480
|
-
}),
|
|
1481
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "flex items-center border-t" }),
|
|
1482
|
-
productOptions.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1483
|
-
className: "mb-4 pt-4",
|
|
1484
|
-
children: productOptions.map((option) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1485
|
-
className: "mb-3 flex items-center",
|
|
1486
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
|
|
1487
|
-
className: "text-md text-foreground w-24 font-bold",
|
|
1488
|
-
children: option.name.charAt(0).toUpperCase() + option.name.slice(1)
|
|
1489
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_src.Select, {
|
|
1490
|
-
value: effectiveSelectedOptions[option.id] || "",
|
|
1491
|
-
onValueChange: (value) => handleOptionChange(option.id, value),
|
|
1492
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.SelectTrigger, {
|
|
1493
|
-
className: "w-48 max-w-full",
|
|
1494
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.SelectValue, { placeholder: `Select ${option.name}` })
|
|
1495
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.SelectContent, { children: option.values.map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.SelectItem, {
|
|
1496
|
-
value,
|
|
1497
|
-
children: value
|
|
1498
|
-
}, value)) })]
|
|
1499
|
-
})]
|
|
1500
|
-
}, option.id))
|
|
1501
|
-
}),
|
|
1502
|
-
currentVariant?.subscription_only && !currentVariant.allow_subscription && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1503
|
-
className: "text-muted-foreground text-sm",
|
|
1504
|
-
children: "This product is unavailable for purchase."
|
|
1505
|
-
}),
|
|
1506
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "mb-3" }),
|
|
1507
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1508
|
-
className: "flex items-center gap-3 pb-3",
|
|
1509
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QuantitySelector, {
|
|
1510
|
-
quantity,
|
|
1511
|
-
setQuantity
|
|
1512
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_src.Button, {
|
|
1513
|
-
disabled: !currentVariant?.id || currentVariant?.subscription_only && !currentVariant.allow_subscription,
|
|
1461
|
+
isBundle ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1462
|
+
className: "pt-4",
|
|
1463
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_src.Button, {
|
|
1514
1464
|
variant: "default",
|
|
1515
|
-
className: "
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
"data-fluid-quantity": quantity,
|
|
1520
|
-
"data-fluid-subscribe": isSubscribe,
|
|
1521
|
-
"data-fluid-subscription-plan-id": isSubscribe ? selectedSubscriptionPlan?.subscription_plan?.id?.toString() || product.product_subscription_plans?.find((plan) => plan.default)?.subscription_plan.id.toString() || product.product_subscription_plans?.[0]?.subscription_plan.id.toString() || "" : "",
|
|
1522
|
-
"data-fluid-open-cart-after-add": "false"
|
|
1465
|
+
className: "w-full gap-2 py-2 text-base font-medium",
|
|
1466
|
+
disabled: !bundleUrl,
|
|
1467
|
+
onClick: () => {
|
|
1468
|
+
if (bundleUrl) window.open(bundleUrl, "_blank", "noopener,noreferrer");
|
|
1523
1469
|
},
|
|
1524
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.
|
|
1470
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Link, { className: "h-5 w-5" }), companyName ? `Purchase at ${companyName}` : "Purchase Bundle"]
|
|
1471
|
+
}), !bundleUrl && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
1472
|
+
className: "text-muted-foreground mt-2 text-center text-xs",
|
|
1473
|
+
children: "Bundle configuration is unavailable. Please contact support."
|
|
1525
1474
|
})]
|
|
1526
|
-
})
|
|
1475
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
1476
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PurchaseOptions, {
|
|
1477
|
+
showBuyOnce,
|
|
1478
|
+
showSubscribe,
|
|
1479
|
+
isSubscribe,
|
|
1480
|
+
userSelectedSubscribe,
|
|
1481
|
+
onSubscribeChange: setUserSelectedSubscribe,
|
|
1482
|
+
wholesalePrice: currentVariantCountry?.wholesale,
|
|
1483
|
+
wholesaleSubscriptionPrice: currentVariantCountry?.wholesale_subscription_price,
|
|
1484
|
+
product_subscription_plans: product.product_subscription_plans || [],
|
|
1485
|
+
selectedSubscriptionPlan,
|
|
1486
|
+
onSubscriptionPlanChange: setSelectedSubscriptionPlan
|
|
1487
|
+
}),
|
|
1488
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1489
|
+
className: "text-muted-foreground mb-3 text-sm",
|
|
1490
|
+
children: [
|
|
1491
|
+
"CV ",
|
|
1492
|
+
countryCode && wholesaleCv != null ? wholesaleCv : "-",
|
|
1493
|
+
" | QV ",
|
|
1494
|
+
countryCode && wholesaleQv != null ? wholesaleQv : "-"
|
|
1495
|
+
]
|
|
1496
|
+
}),
|
|
1497
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "flex items-center border-t" }),
|
|
1498
|
+
productOptions.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1499
|
+
className: "mb-4 pt-4",
|
|
1500
|
+
children: productOptions.map((option) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1501
|
+
className: "mb-3 flex items-center",
|
|
1502
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
|
|
1503
|
+
className: "text-md text-foreground w-24 font-bold",
|
|
1504
|
+
children: option.name.charAt(0).toUpperCase() + option.name.slice(1)
|
|
1505
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_src.Select, {
|
|
1506
|
+
value: effectiveSelectedOptions[option.id] || "",
|
|
1507
|
+
onValueChange: (value) => handleOptionChange(option.id, value),
|
|
1508
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.SelectTrigger, {
|
|
1509
|
+
className: "w-48 max-w-full",
|
|
1510
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.SelectValue, { placeholder: `Select ${option.name}` })
|
|
1511
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.SelectContent, { children: option.values.map((value) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.SelectItem, {
|
|
1512
|
+
value,
|
|
1513
|
+
children: value
|
|
1514
|
+
}, value)) })]
|
|
1515
|
+
})]
|
|
1516
|
+
}, option.id))
|
|
1517
|
+
}),
|
|
1518
|
+
currentVariant?.subscription_only && !currentVariant.allow_subscription && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
1519
|
+
className: "text-muted-foreground text-sm",
|
|
1520
|
+
children: "This product is unavailable for purchase."
|
|
1521
|
+
}),
|
|
1522
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "mb-3" }),
|
|
1523
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
1524
|
+
className: "flex items-center gap-3 pb-3",
|
|
1525
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(QuantitySelector, {
|
|
1526
|
+
quantity,
|
|
1527
|
+
setQuantity
|
|
1528
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_src.Button, {
|
|
1529
|
+
disabled: !currentVariant?.id || currentVariant?.subscription_only && !currentVariant.allow_subscription,
|
|
1530
|
+
variant: "default",
|
|
1531
|
+
className: "flex-1 gap-2 py-2 text-base font-medium",
|
|
1532
|
+
onClick: onAddToCart ? handleAddToCart : void 0,
|
|
1533
|
+
...!onAddToCart && {
|
|
1534
|
+
"data-fluid-add-to-cart": String(currentVariant?.id ?? ""),
|
|
1535
|
+
"data-fluid-quantity": quantity,
|
|
1536
|
+
"data-fluid-subscribe": isSubscribe,
|
|
1537
|
+
"data-fluid-subscription-plan-id": isSubscribe ? selectedSubscriptionPlan?.subscription_plan?.id?.toString() || product.product_subscription_plans?.find((plan) => plan.default)?.subscription_plan.id.toString() || product.product_subscription_plans?.[0]?.subscription_plan.id.toString() || "" : "",
|
|
1538
|
+
"data-fluid-open-cart-after-add": "false"
|
|
1539
|
+
},
|
|
1540
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ShoppingCart, { className: "h-4 w-4" }), isSubscribe ? "Subscribe" : "Add to Cart"]
|
|
1541
|
+
})]
|
|
1542
|
+
})
|
|
1543
|
+
] })
|
|
1527
1544
|
]
|
|
1528
1545
|
})]
|
|
1529
1546
|
})
|
|
1530
1547
|
})]
|
|
1531
1548
|
});
|
|
1532
1549
|
}
|
|
1533
|
-
function ShopApp({ countryCode, companyLogoUrl, renderImage, onAddToCart, productId: controlledProductId, onSelectProduct: onSelectProductProp, onBack: onBackProp, cartButton }) {
|
|
1550
|
+
function ShopApp({ countryCode, companyLogoUrl, renderImage, onAddToCart, productId: controlledProductId, onSelectProduct: onSelectProductProp, onBack: onBackProp, cartButton, companyName }) {
|
|
1534
1551
|
const [internalProductId, setInternalProductId] = (0, react.useState)(null);
|
|
1535
1552
|
const activeProductId = controlledProductId !== void 0 ? controlledProductId : internalProductId;
|
|
1536
1553
|
const handleSelectProduct = onSelectProductProp ?? setInternalProductId;
|
|
@@ -1541,7 +1558,8 @@ function ShopApp({ countryCode, companyLogoUrl, renderImage, onAddToCart, produc
|
|
|
1541
1558
|
renderImage,
|
|
1542
1559
|
onBack: handleBack,
|
|
1543
1560
|
onAddToCart,
|
|
1544
|
-
cartButton
|
|
1561
|
+
cartButton,
|
|
1562
|
+
companyName
|
|
1545
1563
|
});
|
|
1546
1564
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ProductListing, {
|
|
1547
1565
|
countryCode,
|
|
@@ -1739,7 +1757,8 @@ function ShopScreen({ background, textColor, accentColor, padding, borderRadius,
|
|
|
1739
1757
|
companyLogoUrl: userData?.company?.logo_url,
|
|
1740
1758
|
productId,
|
|
1741
1759
|
onSelectProduct: (id) => navigate(`shop/${id}`),
|
|
1742
|
-
onBack: () => navigate("shop")
|
|
1760
|
+
onBack: () => navigate("shop"),
|
|
1761
|
+
companyName: userData?.company?.name
|
|
1743
1762
|
})
|
|
1744
1763
|
})
|
|
1745
1764
|
})
|
|
@@ -1768,4 +1787,4 @@ Object.defineProperty(exports, "shopScreenPropertySchema", {
|
|
|
1768
1787
|
}
|
|
1769
1788
|
});
|
|
1770
1789
|
|
|
1771
|
-
//# sourceMappingURL=ShopScreen-
|
|
1790
|
+
//# sourceMappingURL=ShopScreen-BG2O9grs.cjs.map
|