@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.
Files changed (94) hide show
  1. package/dist/{AppDownloadScreen-B-JdFulZ.cjs → AppDownloadScreen-BcpYbAZo.cjs} +4 -4
  2. package/dist/{AppDownloadScreen-CaTNCtzb.cjs → AppDownloadScreen-DQOgNOQY.cjs} +2 -2
  3. package/dist/{AppDownloadScreen-CaTNCtzb.cjs.map → AppDownloadScreen-DQOgNOQY.cjs.map} +1 -1
  4. package/dist/{AppDownloadScreen-BE6M8WxN.mjs → AppDownloadScreen-DsKIUmDP.mjs} +2 -2
  5. package/dist/{AppDownloadScreen-BE6M8WxN.mjs.map → AppDownloadScreen-DsKIUmDP.mjs.map} +1 -1
  6. package/dist/{CarouselWidget-v1NWYsQe.mjs → CarouselWidget-BSUwgJQ3.mjs} +3 -3
  7. package/dist/CarouselWidget-BSUwgJQ3.mjs.map +1 -0
  8. package/dist/{CarouselWidget-A4_pvjCL.cjs → CarouselWidget-BWHWH48S.cjs} +1 -1
  9. package/dist/{CarouselWidget-DDW8GqoX.cjs → CarouselWidget-srEpxcKU.cjs} +3 -3
  10. package/dist/CarouselWidget-srEpxcKU.cjs.map +1 -0
  11. package/dist/{ContactsScreen-DvmqkXOu.cjs → ContactsScreen-1DC328FQ.cjs} +2 -2
  12. package/dist/{ContactsScreen-DvmqkXOu.cjs.map → ContactsScreen-1DC328FQ.cjs.map} +1 -1
  13. package/dist/{ContactsScreen-DrkHWPMm.mjs → ContactsScreen-Bs3DtjXw.mjs} +2 -2
  14. package/dist/{ContactsScreen-DrkHWPMm.mjs.map → ContactsScreen-Bs3DtjXw.mjs.map} +1 -1
  15. package/dist/{ContactsScreen-Du9M90zi.cjs → ContactsScreen-C-v5Yrxn.cjs} +4 -4
  16. package/dist/{FluidProvider-BSBLJp15.cjs → FluidProvider-DGm9zaDs.cjs} +5 -5
  17. package/dist/{FluidProvider-BSBLJp15.cjs.map → FluidProvider-DGm9zaDs.cjs.map} +1 -1
  18. package/dist/{FluidProvider-CwkMUOoy.mjs → FluidProvider-DpiMY5TW.mjs} +5 -5
  19. package/dist/{FluidProvider-CwkMUOoy.mjs.map → FluidProvider-DpiMY5TW.mjs.map} +1 -1
  20. package/dist/{MessagingScreen-Cg2XvQZF.mjs → MessagingScreen-BI8BzJKm.mjs} +3 -3
  21. package/dist/{MessagingScreen-Cg2XvQZF.mjs.map → MessagingScreen-BI8BzJKm.mjs.map} +1 -1
  22. package/dist/{MessagingScreen-C4-8_bvB.mjs → MessagingScreen-CSkPf1fv.mjs} +4 -4
  23. package/dist/{MessagingScreen-BlN6KjV-.cjs → MessagingScreen-CVAFDLsZ.cjs} +4 -4
  24. package/dist/{MessagingScreen-Lc81OXIN.cjs → MessagingScreen-GijHV-DQ.cjs} +3 -3
  25. package/dist/{MessagingScreen-Lc81OXIN.cjs.map → MessagingScreen-GijHV-DQ.cjs.map} +1 -1
  26. package/dist/{MySiteScreen-BedF13nt.mjs → MySiteScreen-Bg6LNzsn.mjs} +2 -2
  27. package/dist/{MySiteScreen-BedF13nt.mjs.map → MySiteScreen-Bg6LNzsn.mjs.map} +1 -1
  28. package/dist/{MySiteScreen-DEOKI32H.cjs → MySiteScreen-CrLr2D4S.cjs} +4 -4
  29. package/dist/{MySiteScreen-B-I4V3Cc.cjs → MySiteScreen-D8HSLknT.cjs} +2 -2
  30. package/dist/{MySiteScreen-B-I4V3Cc.cjs.map → MySiteScreen-D8HSLknT.cjs.map} +1 -1
  31. package/dist/{OrdersScreen-BE_E1QGL.cjs → OrdersScreen-DiQTxyIy.cjs} +4 -4
  32. package/dist/{OrdersScreen-CfAmUUN3.mjs → OrdersScreen-Dn0fEtdh.mjs} +3 -3
  33. package/dist/{OrdersScreen-CfAmUUN3.mjs.map → OrdersScreen-Dn0fEtdh.mjs.map} +1 -1
  34. package/dist/{OrdersScreen-C-rU9cx6.cjs → OrdersScreen-DuGMu--7.cjs} +3 -3
  35. package/dist/{OrdersScreen-C-rU9cx6.cjs.map → OrdersScreen-DuGMu--7.cjs.map} +1 -1
  36. package/dist/{PointsWidget-D8U2k-_A.cjs → PointsWidget-Bgl95R-6.cjs} +2 -2
  37. package/dist/PointsWidget-Bgl95R-6.cjs.map +1 -0
  38. package/dist/{PointsWidget-CYesuDDG.mjs → PointsWidget-C05iCMne.mjs} +2 -2
  39. package/dist/PointsWidget-C05iCMne.mjs.map +1 -0
  40. package/dist/{ProductsScreen-Csw96ete.cjs → ProductsScreen--1YW_UgE.cjs} +3 -3
  41. package/dist/{ProductsScreen-Csw96ete.cjs.map → ProductsScreen--1YW_UgE.cjs.map} +1 -1
  42. package/dist/{ProductsScreen-DUPhUJ7p.cjs → ProductsScreen-C6vvURBQ.cjs} +4 -4
  43. package/dist/{ProductsScreen-CgG79XW9.mjs → ProductsScreen-COd2v64K.mjs} +5 -4
  44. package/dist/{ProductsScreen-CGo9KQ9L.mjs → ProductsScreen-Cp0Ca5fO.mjs} +3 -3
  45. package/dist/{ProductsScreen-CGo9KQ9L.mjs.map → ProductsScreen-Cp0Ca5fO.mjs.map} +1 -1
  46. package/dist/{ProfileScreen-CANmoFsP.cjs → ProfileScreen-BbMzMV7N.cjs} +3 -3
  47. package/dist/{ProfileScreen-CANmoFsP.cjs.map → ProfileScreen-BbMzMV7N.cjs.map} +1 -1
  48. package/dist/{ProfileScreen-BSZLS9hY.cjs → ProfileScreen-CuCgYLYg.cjs} +4 -4
  49. package/dist/{ProfileScreen-C4g7ZGPo.mjs → ProfileScreen-WigtmiOv.mjs} +3 -3
  50. package/dist/{ProfileScreen-C4g7ZGPo.mjs.map → ProfileScreen-WigtmiOv.mjs.map} +1 -1
  51. package/dist/{ShareablesScreen-loETsu9v.cjs → ShareablesScreen-CECBa_sH.cjs} +4 -4
  52. package/dist/{ShareablesScreen-BK0H5fb2.mjs → ShareablesScreen-Ceb5wUmc.mjs} +4 -4
  53. package/dist/{ShareablesScreen-BK0H5fb2.mjs.map → ShareablesScreen-Ceb5wUmc.mjs.map} +1 -1
  54. package/dist/{ShareablesScreen-D0kIiW8S.cjs → ShareablesScreen-D5_P3VVk.cjs} +4 -4
  55. package/dist/{ShareablesScreen-D0kIiW8S.cjs.map → ShareablesScreen-D5_P3VVk.cjs.map} +1 -1
  56. package/dist/{ShareablesScreen-BmKYYRZq.mjs → ShareablesScreen-Ds-a4dSK.mjs} +5 -4
  57. package/dist/{ShopScreen-CDwCW5Go.cjs → ShopScreen-BG2O9grs.cjs} +93 -74
  58. package/dist/ShopScreen-BG2O9grs.cjs.map +1 -0
  59. package/dist/{ShopScreen-CaTpU5go.cjs → ShopScreen-CfriRC8H.cjs} +4 -4
  60. package/dist/{ShopScreen-B0Pr0CTu.mjs → ShopScreen-DjXzkEHA.mjs} +94 -75
  61. package/dist/{ShopScreen-B0Pr0CTu.mjs.map → ShopScreen-DjXzkEHA.mjs.map} +1 -1
  62. package/dist/{SubscriptionsScreen-D3LAx25s.mjs → SubscriptionsScreen-Bc1L9w_R.mjs} +3 -3
  63. package/dist/{SubscriptionsScreen-D3LAx25s.mjs.map → SubscriptionsScreen-Bc1L9w_R.mjs.map} +1 -1
  64. package/dist/{SubscriptionsScreen-CfvaEuTS.cjs → SubscriptionsScreen-CntycOyp.cjs} +3 -3
  65. package/dist/{SubscriptionsScreen-CfvaEuTS.cjs.map → SubscriptionsScreen-CntycOyp.cjs.map} +1 -1
  66. package/dist/{SubscriptionsScreen-Dpn0YuDb.cjs → SubscriptionsScreen-DCUFhSbh.cjs} +4 -4
  67. package/dist/index.cjs +36 -36
  68. package/dist/index.d.cts +1 -0
  69. package/dist/index.d.cts.map +1 -1
  70. package/dist/index.d.mts +1 -0
  71. package/dist/index.d.mts.map +1 -1
  72. package/dist/index.mjs +36 -36
  73. package/dist/{use-account-clients-62dZrh9E.cjs → use-account-clients-C9UjVcyo.cjs} +2 -2
  74. package/dist/{use-account-clients-62dZrh9E.cjs.map → use-account-clients-C9UjVcyo.cjs.map} +1 -1
  75. package/dist/{use-account-clients-Cf_6sxeC.mjs → use-account-clients-oKk8PvPK.mjs} +2 -2
  76. package/dist/{use-account-clients-Cf_6sxeC.mjs.map → use-account-clients-oKk8PvPK.mjs.map} +1 -1
  77. package/dist/{use-current-user-Bl9nPNFt.mjs → use-current-user-CoGu5DT7.mjs} +3 -3
  78. package/dist/{use-current-user-Bl9nPNFt.mjs.map → use-current-user-CoGu5DT7.mjs.map} +1 -1
  79. package/dist/{use-current-user-SFCzJt0q.cjs → use-current-user-D2YUKSpk.cjs} +3 -3
  80. package/dist/{use-current-user-SFCzJt0q.cjs.map → use-current-user-D2YUKSpk.cjs.map} +1 -1
  81. package/dist/{use-customer-account-BoobPvSQ.cjs → use-customer-account-B-eDvs2m.cjs} +3 -3
  82. package/dist/{use-customer-account-BoobPvSQ.cjs.map → use-customer-account-B-eDvs2m.cjs.map} +1 -1
  83. package/dist/{use-customer-account-Dt3kO7ti.mjs → use-customer-account-CQr2JJOY.mjs} +3 -3
  84. package/dist/{use-customer-account-Dt3kO7ti.mjs.map → use-customer-account-CQr2JJOY.mjs.map} +1 -1
  85. package/dist/{use-fluid-api-DPhr-9Jv.mjs → use-fluid-api-B6740M-8.mjs} +2 -2
  86. package/dist/{use-fluid-api-DPhr-9Jv.mjs.map → use-fluid-api-B6740M-8.mjs.map} +1 -1
  87. package/dist/{use-fluid-api-DwRQk00z.cjs → use-fluid-api-LVdptjW2.cjs} +2 -2
  88. package/dist/{use-fluid-api-DwRQk00z.cjs.map → use-fluid-api-LVdptjW2.cjs.map} +1 -1
  89. package/package.json +10 -10
  90. package/dist/CarouselWidget-DDW8GqoX.cjs.map +0 -1
  91. package/dist/CarouselWidget-v1NWYsQe.mjs.map +0 -1
  92. package/dist/PointsWidget-CYesuDDG.mjs.map +0 -1
  93. package/dist/PointsWidget-D8U2k-_A.cjs.map +0 -1
  94. package/dist/ShopScreen-CDwCW5Go.cjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  require("./chunk-9hOWP6kD.cjs");
2
- require("./FluidProvider-BSBLJp15.cjs");
3
- require("./PointsWidget-D8U2k-_A.cjs");
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-DDW8GqoX.cjs");
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-D0kIiW8S.cjs");
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-CwkMUOoy.mjs";
2
- import { i as useSdkClient, o as useFluidAuth } from "./use-account-clients-Cf_6sxeC.mjs";
3
- import { n as useCurrentUser } from "./use-current-user-Bl9nPNFt.mjs";
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-BK0H5fb2.mjs.map
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-BSBLJp15.cjs");
3
- const require_use_account_clients = require("./use-account-clients-62dZrh9E.cjs");
4
- const require_use_current_user = require("./use-current-user-SFCzJt0q.cjs");
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-D0kIiW8S.cjs.map
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-CwkMUOoy.mjs";
2
- import "./PointsWidget-CYesuDDG.mjs";
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-v1NWYsQe.mjs";
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-BK0H5fb2.mjs";
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-BSBLJp15.cjs");
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-62dZrh9E.cjs");
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-SFCzJt0q.cjs");
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.jsx)(PurchaseOptions, {
1460
- showBuyOnce,
1461
- showSubscribe,
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: "flex-1 gap-2 py-2 text-base font-medium",
1516
- onClick: onAddToCart ? handleAddToCart : void 0,
1517
- ...!onAddToCart && {
1518
- "data-fluid-add-to-cart": String(currentVariant?.id ?? ""),
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.ShoppingCart, { className: "h-4 w-4" }), isSubscribe ? "Subscribe" : "Add to Cart"]
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-CDwCW5Go.cjs.map
1790
+ //# sourceMappingURL=ShopScreen-BG2O9grs.cjs.map