@fluid-app/portal-sdk 0.1.83 → 0.1.84

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 (99) hide show
  1. package/dist/{AppNavigationContext-Du3Qq0yc.mjs → AppNavigationContext-BSnbFILQ.mjs} +1 -1
  2. package/dist/{AppNavigationContext-Du3Qq0yc.mjs.map → AppNavigationContext-BSnbFILQ.mjs.map} +1 -1
  3. package/dist/{AppNavigationContext-Agp0UkCQ.cjs → AppNavigationContext-DnwdUAjn.cjs} +1 -1
  4. package/dist/{AppNavigationContext-Agp0UkCQ.cjs.map → AppNavigationContext-DnwdUAjn.cjs.map} +1 -1
  5. package/dist/{ContactsScreen-FJUtn2_G.mjs → ContactsScreen-DrkHWPMm.mjs} +4 -4
  6. package/dist/{ContactsScreen-FJUtn2_G.mjs.map → ContactsScreen-DrkHWPMm.mjs.map} +1 -1
  7. package/dist/{ContactsScreen-aPH9Xaim.cjs → ContactsScreen-Du9M90zi.cjs} +5 -5
  8. package/dist/{ContactsScreen-6gXKTN61.cjs → ContactsScreen-DvmqkXOu.cjs} +4 -4
  9. package/dist/{ContactsScreen-6gXKTN61.cjs.map → ContactsScreen-DvmqkXOu.cjs.map} +1 -1
  10. package/dist/{CustomersScreen-9f10-_AZ.cjs → CustomersScreen-Bd9eK18y.cjs} +1 -1
  11. package/dist/{CustomersScreen-9f10-_AZ.cjs.map → CustomersScreen-Bd9eK18y.cjs.map} +1 -1
  12. package/dist/{CustomersScreen-xAauAB-B.mjs → CustomersScreen-DEFY3mRL.mjs} +1 -1
  13. package/dist/{CustomersScreen-xAauAB-B.mjs.map → CustomersScreen-DEFY3mRL.mjs.map} +1 -1
  14. package/dist/{MessagingScreen-CWJA4usG.cjs → MessagingScreen-BlN6KjV-.cjs} +3 -3
  15. package/dist/{MessagingScreen-DWNe8VFM.mjs → MessagingScreen-C4-8_bvB.mjs} +3 -3
  16. package/dist/{MessagingScreen-7_YhiLVY.mjs → MessagingScreen-Cg2XvQZF.mjs} +3 -3
  17. package/dist/{MessagingScreen-7_YhiLVY.mjs.map → MessagingScreen-Cg2XvQZF.mjs.map} +1 -1
  18. package/dist/{MessagingScreen-B_5Ci5s-.cjs → MessagingScreen-Lc81OXIN.cjs} +3 -3
  19. package/dist/{MessagingScreen-B_5Ci5s-.cjs.map → MessagingScreen-Lc81OXIN.cjs.map} +1 -1
  20. package/dist/{MySiteScreen-CtVL7wfc.cjs → MySiteScreen-B-I4V3Cc.cjs} +2 -2
  21. package/dist/{MySiteScreen-CtVL7wfc.cjs.map → MySiteScreen-B-I4V3Cc.cjs.map} +1 -1
  22. package/dist/{MySiteScreen-Cspeq0cy.mjs → MySiteScreen-BedF13nt.mjs} +2 -2
  23. package/dist/{MySiteScreen-Cspeq0cy.mjs.map → MySiteScreen-BedF13nt.mjs.map} +1 -1
  24. package/dist/{MySiteScreen-D5tr7TdT.cjs → MySiteScreen-DEOKI32H.cjs} +1 -1
  25. package/dist/{OrdersScreen-DiKPQvwJ.cjs → OrdersScreen-BE_E1QGL.cjs} +2 -2
  26. package/dist/{OrdersScreen-Bu82RCok.cjs → OrdersScreen-C-rU9cx6.cjs} +4 -4
  27. package/dist/{OrdersScreen-Bu82RCok.cjs.map → OrdersScreen-C-rU9cx6.cjs.map} +1 -1
  28. package/dist/{OrdersScreen-DrCPl7uv.mjs → OrdersScreen-CfAmUUN3.mjs} +4 -4
  29. package/dist/{OrdersScreen-DrCPl7uv.mjs.map → OrdersScreen-CfAmUUN3.mjs.map} +1 -1
  30. package/dist/{ProductsScreen-BHHo6Wen.mjs → ProductsScreen-CGo9KQ9L.mjs} +3 -3
  31. package/dist/{ProductsScreen-BHHo6Wen.mjs.map → ProductsScreen-CGo9KQ9L.mjs.map} +1 -1
  32. package/dist/{ProductsScreen-CoyGeILD.mjs → ProductsScreen-CgG79XW9.mjs} +5 -5
  33. package/dist/{ProductsScreen-Doc9tmAQ.cjs → ProductsScreen-Csw96ete.cjs} +3 -3
  34. package/dist/{ProductsScreen-Doc9tmAQ.cjs.map → ProductsScreen-Csw96ete.cjs.map} +1 -1
  35. package/dist/{ProductsScreen-CCNyLHqR.cjs → ProductsScreen-DUPhUJ7p.cjs} +5 -5
  36. package/dist/{ShareablesScreen-CNMWSoKY.mjs → ShareablesScreen-BK0H5fb2.mjs} +30 -9
  37. package/dist/ShareablesScreen-BK0H5fb2.mjs.map +1 -0
  38. package/dist/{ShareablesScreen-BRxLz3zn.mjs → ShareablesScreen-BmKYYRZq.mjs} +5 -5
  39. package/dist/{ShareablesScreen-Dp3BcjuA.cjs → ShareablesScreen-D0kIiW8S.cjs} +34 -7
  40. package/dist/ShareablesScreen-D0kIiW8S.cjs.map +1 -0
  41. package/dist/{ShareablesScreen-C5GJg1EP.cjs → ShareablesScreen-loETsu9v.cjs} +5 -5
  42. package/dist/{ShopScreen-CVxmqfmN.mjs → ShopScreen-B0Pr0CTu.mjs} +3 -3
  43. package/dist/{ShopScreen-CVxmqfmN.mjs.map → ShopScreen-B0Pr0CTu.mjs.map} +1 -1
  44. package/dist/{ShopScreen-CPWZhKgE.cjs → ShopScreen-CDwCW5Go.cjs} +3 -3
  45. package/dist/{ShopScreen-CPWZhKgE.cjs.map → ShopScreen-CDwCW5Go.cjs.map} +1 -1
  46. package/dist/{ShopScreen-nJhut901.cjs → ShopScreen-CaTpU5go.cjs} +1 -1
  47. package/dist/{SubscriptionsScreen-CSKVsakI.cjs → SubscriptionsScreen-CfvaEuTS.cjs} +4 -4
  48. package/dist/{SubscriptionsScreen-CSKVsakI.cjs.map → SubscriptionsScreen-CfvaEuTS.cjs.map} +1 -1
  49. package/dist/{SubscriptionsScreen-CJdcyH-e.mjs → SubscriptionsScreen-D3LAx25s.mjs} +4 -4
  50. package/dist/{SubscriptionsScreen-CJdcyH-e.mjs.map → SubscriptionsScreen-D3LAx25s.mjs.map} +1 -1
  51. package/dist/{SubscriptionsScreen-C1UWxvQk.cjs → SubscriptionsScreen-Dpn0YuDb.cjs} +3 -3
  52. package/dist/{dist-B4Ke7bHH.cjs → dist-BK4mvUPm.cjs} +2 -2
  53. package/dist/{dist-B4Ke7bHH.cjs.map → dist-BK4mvUPm.cjs.map} +1 -1
  54. package/dist/{dist-Cl4FsM3V.mjs → dist-C9vpl_rR.mjs} +2 -2
  55. package/dist/{dist-Cl4FsM3V.mjs.map → dist-C9vpl_rR.mjs.map} +1 -1
  56. package/dist/{dist-CMGXkSgZ.mjs → dist-CkIGP8my.mjs} +1 -1
  57. package/dist/{dist-CMGXkSgZ.mjs.map → dist-CkIGP8my.mjs.map} +1 -1
  58. package/dist/{dist-BbS_7TvS.cjs → dist-thaj08s5.cjs} +1 -1
  59. package/dist/{dist-BbS_7TvS.cjs.map → dist-thaj08s5.cjs.map} +1 -1
  60. package/dist/{es-1KItbbYg.mjs → es-Dlib2eNY.mjs} +1 -1
  61. package/dist/{es-1KItbbYg.mjs.map → es-Dlib2eNY.mjs.map} +1 -1
  62. package/dist/{es-BSkb3AZk.cjs → es-xQF-WIMq.cjs} +1 -1
  63. package/dist/{es-BSkb3AZk.cjs.map → es-xQF-WIMq.cjs.map} +1 -1
  64. package/dist/index.cjs +140 -45
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.d.cts +21 -1
  67. package/dist/index.d.cts.map +1 -1
  68. package/dist/index.d.mts +21 -1
  69. package/dist/index.d.mts.map +1 -1
  70. package/dist/index.mjs +137 -44
  71. package/dist/index.mjs.map +1 -1
  72. package/dist/{order-detail-Cj68hbgK.cjs → order-detail-06VbWJjw.cjs} +1 -1
  73. package/dist/{order-detail-Cj68hbgK.cjs.map → order-detail-06VbWJjw.cjs.map} +1 -1
  74. package/dist/{order-detail-B-4hsupW.mjs → order-detail-B5X_QRpi.mjs} +1 -1
  75. package/dist/{order-detail-B-4hsupW.mjs.map → order-detail-B5X_QRpi.mjs.map} +1 -1
  76. package/dist/{products-BKZ1siXg.cjs → products-CjZof7c2.cjs} +1 -1
  77. package/dist/{products-BKZ1siXg.cjs.map → products-CjZof7c2.cjs.map} +1 -1
  78. package/dist/{products-DOO1TBcm.mjs → products-Dkwd_Bh0.mjs} +1 -1
  79. package/dist/{products-DOO1TBcm.mjs.map → products-Dkwd_Bh0.mjs.map} +1 -1
  80. package/dist/{src-nhqydD53.mjs → src-BjmyVJoe.mjs} +21 -20
  81. package/dist/src-BjmyVJoe.mjs.map +1 -0
  82. package/dist/{src-Dzexc0vw.cjs → src-Dt66UB0B.cjs} +1 -1
  83. package/dist/{src-Dzexc0vw.cjs.map → src-Dt66UB0B.cjs.map} +1 -1
  84. package/dist/{src-fXyI4AWk.cjs → src-bzRRiTN4.cjs} +21 -20
  85. package/dist/src-bzRRiTN4.cjs.map +1 -0
  86. package/dist/{src-DfVbSKm5.mjs → src-p8DA1dH0.mjs} +1 -1
  87. package/dist/{src-DfVbSKm5.mjs.map → src-p8DA1dH0.mjs.map} +1 -1
  88. package/dist/{use-customer-account-Dysq4hpT.cjs → use-customer-account-BoobPvSQ.cjs} +1 -1
  89. package/dist/{use-customer-account-Dysq4hpT.cjs.map → use-customer-account-BoobPvSQ.cjs.map} +1 -1
  90. package/dist/{use-customer-account-B0DeL6m0.mjs → use-customer-account-Dt3kO7ti.mjs} +1 -1
  91. package/dist/{use-customer-account-B0DeL6m0.mjs.map → use-customer-account-Dt3kO7ti.mjs.map} +1 -1
  92. package/package.json +9 -9
  93. package/dist/ShareablesScreen-CNMWSoKY.mjs.map +0 -1
  94. package/dist/ShareablesScreen-Dp3BcjuA.cjs.map +0 -1
  95. package/dist/src-fXyI4AWk.cjs.map +0 -1
  96. package/dist/src-nhqydD53.mjs.map +0 -1
  97. /package/dist/{ProfileScreen-BKKIMZiD.cjs → ProfileScreen-BSZLS9hY.cjs} +0 -0
  98. /package/dist/{src-BakNjVTk.mjs → src-B7j_mfeS.mjs} +0 -0
  99. /package/dist/{src-C_kOrGdZ.cjs → src-Bp-dRR29.cjs} +0 -0
@@ -235,4 +235,4 @@ Object.defineProperty(exports, "updatePlaylist", {
235
235
  }
236
236
  });
237
237
 
238
- //# sourceMappingURL=src-Dzexc0vw.cjs.map
238
+ //# sourceMappingURL=src-Dt66UB0B.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"src-Dzexc0vw.cjs","names":[],"sources":["../../../shareables/api-client/src/namespaces/playlists.ts","../../../shareables/api-client/src/namespaces/media.ts","../../../shareables/api-client/src/namespaces/file-resources.ts","../../../shareables/api-client/src/namespaces/product-media.ts","../../../shareables/api-client/src/namespaces/share.ts","../../../shareables/api-client/src/index.ts"],"sourcesContent":["import type { FetchClient } from \"../lib/fetch-client\";\nimport type { shareables } from \"../generated/shareables\";\n\nconst PLAYLISTS_URL = \"/v2025-06/playlists\";\n\n// ============================================================================\n// Playlists - List & Get\n// ============================================================================\n\nexport type PlaylistsQuery = {\n \"filter[title]\"?: string;\n \"filter[status]\"?: string;\n \"page[cursor]\"?: string;\n \"page[limit]\"?: number;\n sort?: string;\n};\n\nexport async function getPlaylists(\n client: FetchClient,\n options?: PlaylistsQuery,\n): Promise<shareables.GetPlaylistsResponse> {\n const input = options\n ? Object.fromEntries(\n Object.entries(options).filter(([, value]) => value !== undefined),\n )\n : undefined;\n return client.get(PLAYLISTS_URL, input);\n}\n\nexport async function getPlaylistById(\n client: FetchClient,\n id: number,\n): Promise<shareables.GetPlaylistResponse> {\n return client.get(`${PLAYLISTS_URL}/${id}`);\n}\n\n// ============================================================================\n// Playlists - Create & Update\n// ============================================================================\n\nexport async function createPlaylist(\n client: FetchClient,\n data: shareables.CreatePlaylistInput,\n): Promise<shareables.GetPlaylistResponse> {\n return client.post(PLAYLISTS_URL, data);\n}\n\nexport async function updatePlaylist(\n client: FetchClient,\n id: number,\n data: shareables.UpdatePlaylistInput,\n): Promise<shareables.GetPlaylistResponse> {\n return client.patch(`${PLAYLISTS_URL}/${id}`, data);\n}\n\nexport async function addItemToPlaylist(\n client: FetchClient,\n id: number,\n data: shareables.AddItemToPlaylistInput,\n): Promise<shareables.Playlist> {\n return client.post(`${PLAYLISTS_URL}/${id}/items`, data);\n}\n\n// ============================================================================\n// Playlists - Delete\n// ============================================================================\n\nexport async function deletePlaylist(\n client: FetchClient,\n id: number,\n): Promise<void> {\n return client.delete(`${PLAYLISTS_URL}/${id}`);\n}\n\nexport async function deletePlaylists(\n client: FetchClient,\n ids: number[],\n): Promise<void[]> {\n return Promise.all(ids.map((id) => deletePlaylist(client, id)));\n}\n\nexport async function deletePlaylistItem(\n client: FetchClient,\n id: number,\n item_ids: number[],\n): Promise<{\n deleted_at: string;\n meta: { request_id: string; timestamp: string };\n}> {\n return client.request(`${PLAYLISTS_URL}/${id}/items`, {\n method: \"DELETE\",\n body: item_ids,\n });\n}\n\n// ============================================================================\n// Playlists - Remove Items\n// ============================================================================\n\nexport async function removeItemsFromPlaylist(\n client: FetchClient,\n playlistId: number,\n data: shareables.RemoveItemsFromPlaylistInput,\n): Promise<shareables.Playlist> {\n return client.request(`${PLAYLISTS_URL}/${playlistId}/items`, {\n method: \"DELETE\",\n body: data,\n });\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { shareables } from \"../generated/shareables\";\n\n// ============================================================================\n// Media - Helper\n// ============================================================================\n\nfunction transformMediaListItem(\n item: shareables.MediaListItem,\n): shareables.MediumResponse {\n return {\n ...item,\n description: item.description,\n created_at: item.description?.created_at || item.created_at,\n };\n}\n\n// ============================================================================\n// Media - List & Get\n// ============================================================================\n\ninterface RepMediaResponse {\n media: shareables.MediaListItem[];\n meta: {\n request_id: string;\n timestamp: string;\n current_page: number;\n total_pages: number;\n total_count: number;\n };\n}\n\nexport async function getMedia(\n client: FetchClient,\n options: shareables.MediaFilters = {},\n repContext?: boolean,\n): Promise<shareables.MediaListResponseWithMeta> {\n if (repContext) {\n const response = await client.get<RepMediaResponse>(\n \"/users/v2025-06/media\",\n options as Record<string, unknown>,\n );\n\n const transformedItems = response.media.map(transformMediaListItem);\n const perPage = options.per_page || 10;\n\n return {\n data: transformedItems,\n status: \"success\",\n media: transformedItems,\n meta: {\n total_count: response.meta.total_count,\n current: response.meta.current_page,\n per_page: perPage,\n pages: response.meta.total_pages,\n next:\n response.meta.current_page < response.meta.total_pages\n ? response.meta.current_page + 1\n : null,\n previous:\n response.meta.current_page > 1\n ? response.meta.current_page - 1\n : null,\n },\n };\n }\n\n const response = await client.get<shareables.MediaListResponseNew>(\n \"/company/media\",\n options as Record<string, unknown>,\n );\n\n let mediaItems: shareables.MediaListItem[] = [];\n let pagination: shareables.MediaPagination = {\n count: 0,\n previous: null,\n next: null,\n pages: 0,\n per_page: 10,\n current: 1,\n };\n\n response.forEach((item) => {\n if (\"items\" in item && Array.isArray(item.items)) {\n mediaItems = item.items;\n }\n if (\"pagination\" in item && item.pagination?.count) {\n pagination = item.pagination;\n }\n });\n\n const transformedItems = mediaItems.map(transformMediaListItem);\n\n return {\n data: transformedItems,\n status: \"success\",\n media: transformedItems,\n meta: {\n ...pagination,\n total_count: pagination.count || mediaItems.length,\n },\n };\n}\n\nexport async function getMediaById(\n client: FetchClient,\n id: number,\n language_iso?: string,\n repContext?: boolean,\n): Promise<shareables.MediaResponseWithMeta> {\n if (repContext) {\n const response = await client.get<{ medium: shareables.MediumResponse }>(\n `/users/v2025-06/media/${id}`,\n );\n return {\n data: response.medium,\n status: \"success\",\n media: response.medium,\n };\n }\n\n const endpoint = language_iso\n ? `/company/media/${id}?language_iso=${language_iso}`\n : `/company/media/${id}`;\n\n const response = await client.get<shareables.MediumResponse>(endpoint);\n\n return {\n data: response,\n status: \"success\",\n media: response,\n };\n}\n\nexport async function getAnnouncementById(\n client: FetchClient,\n id: number,\n): Promise<shareables.AnnouncementResponse> {\n return client.get(`/company/announcements/${id}`);\n}\n\nexport async function getTrainings(\n client: FetchClient,\n options: {\n category_id?: number;\n page?: number;\n per_page?: number;\n } = {},\n): Promise<shareables.MediaListResponseWithMeta> {\n const params: Record<string, string> = {};\n\n if (options.category_id) {\n params[\"filterrific[with_category_id]\"] = options.category_id.toString();\n }\n if (options.page) {\n params.page = options.page.toString();\n }\n if (options.per_page) {\n params.per_page = options.per_page.toString();\n }\n\n const response = await client.get<shareables.MediaListResponseNew>(\n \"/v1/trainings\",\n params,\n );\n\n let mediaItems: shareables.MediaListItem[] = [];\n let pagination: shareables.MediaPagination = {\n count: 0,\n previous: null,\n next: null,\n pages: 0,\n per_page: 20,\n current: 1,\n };\n\n response.forEach((item) => {\n if (\"items\" in item && Array.isArray(item.items)) {\n mediaItems = item.items;\n }\n if (\"pagination\" in item && item.pagination?.count) {\n pagination = item.pagination;\n }\n });\n\n const transformedItems = mediaItems.map(transformMediaListItem);\n\n return {\n data: transformedItems,\n status: \"success\",\n media: transformedItems,\n meta: {\n ...pagination,\n total_count: pagination.count || mediaItems.length,\n },\n };\n}\n\n// ============================================================================\n// Media - Create\n// ============================================================================\n\nexport async function createMedia(\n client: FetchClient,\n mediaData: shareables.MediumUpdate,\n repContext?: boolean,\n): Promise<shareables.MediumResponse> {\n if (repContext) {\n const response = await client.post<{ medium: shareables.MediumResponse }>(\n \"/users/v2025-06/media\",\n mediaData,\n );\n return response.medium;\n }\n\n const response = await client.post<shareables.NewCreateMediaResponse>(\n \"/company/media\",\n mediaData,\n );\n return response.medium;\n}\n\nexport async function createAnnouncement(\n client: FetchClient,\n announcementData: shareables.AnnouncementUpdate,\n): Promise<shareables.AnnouncementResponse> {\n return client.post(\"/company/announcements\", announcementData);\n}\n\n// ============================================================================\n// Media - Update\n// ============================================================================\n\nexport async function updateMedia(\n client: FetchClient,\n id: number,\n mediaData: shareables.MediumUpdate,\n language_iso?: string,\n repContext?: boolean,\n): Promise<shareables.MediumResponse> {\n if (repContext) {\n const response = await client.request<{\n medium: shareables.MediumResponse;\n }>(`/users/v2025-06/media/${id}`, {\n method: \"PATCH\",\n body: mediaData,\n });\n return response.medium;\n }\n\n const endpoint = language_iso\n ? `/company/media/${id}?language_iso=${language_iso}`\n : `/company/media/${id}`;\n\n const response = await client.put<shareables.MediaResponse>(endpoint, {\n medium: mediaData,\n });\n\n if (\n response &&\n typeof response === \"object\" &&\n \"data\" in response &&\n response.data\n ) {\n return response.data as shareables.MediumResponse;\n }\n return response as shareables.MediumResponse;\n}\n\nexport async function updateAnnouncement(\n client: FetchClient,\n id: number,\n announcementData: shareables.AnnouncementUpdate,\n): Promise<shareables.AnnouncementResponse> {\n const response = await client.put<shareables.AnnouncementResponse>(\n `/company/announcements/${id}`,\n announcementData,\n );\n\n if (\n response &&\n typeof response === \"object\" &&\n \"data\" in response &&\n response.data\n ) {\n return response.data as shareables.AnnouncementResponse;\n }\n return response;\n}\n\n// ============================================================================\n// Media - Delete\n// ============================================================================\n\n/**\n * Delete a media item. The API returns a text response, so we use\n * client.delete and ignore the response body.\n */\nexport async function deleteMedia(\n client: FetchClient,\n id: number,\n repContext?: boolean,\n): Promise<{ success: boolean }> {\n if (repContext) {\n await client.delete(`/users/v2025-06/media/${id}`);\n } else {\n await client.delete(`/company/media/${id}`);\n }\n return { success: true };\n}\n\nexport async function deleteAnnouncement(\n client: FetchClient,\n id: number,\n): Promise<{ success: boolean }> {\n await client.delete(`/company/announcements/${id}`);\n return { success: true };\n}\n\nexport async function bulkDeleteAnnouncements(\n client: FetchClient,\n ids: number[],\n): Promise<{ success: boolean }> {\n await client.request(`/company/announcements/bulk_destroy`, {\n method: \"DELETE\",\n body: { ids },\n });\n return { success: true };\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { shareables } from \"../generated/shareables\";\n\n// ============================================================================\n// File Resources - List\n// ============================================================================\n\nexport async function getFileResources(\n client: FetchClient,\n params: {\n search_query?: string;\n pageParam?: string;\n pageSize?: string;\n fileTypes?: string[];\n sizeGreaterThan?: number;\n sizeLessThan?: number;\n sortedBy?: string;\n },\n): Promise<shareables.FileResourcesResponse> {\n const qp = new URLSearchParams({\n ...(params.search_query && { search_query: params.search_query }),\n ...(params.pageParam && { page: params.pageParam }),\n ...(params.pageSize && { per_page: params.pageSize }),\n ...(params.sizeGreaterThan && {\n size_greater_than: params.sizeGreaterThan.toString(),\n }),\n ...(params.sizeLessThan && {\n size_less_than: params.sizeLessThan.toString(),\n }),\n ...(params.sortedBy && { sorted_by: params.sortedBy }),\n });\n params.fileTypes?.forEach((type) => {\n qp.append(\"with_types[]\", type);\n });\n\n return client.get(`/file_resources?${qp.toString()}`);\n}\n\n// ============================================================================\n// File Resources - Create\n// ============================================================================\n\nexport async function createFileResource(\n client: FetchClient,\n data: shareables.CreateFileResourceInput,\n): Promise<shareables.CreateFileResourceResponse> {\n return client.post(\"/file_resources\", data);\n}\n\n// ============================================================================\n// File Resources - Update\n// ============================================================================\n\nexport async function updateFileResource(\n client: FetchClient,\n id: number,\n fileResource: shareables.UpdateFileResourceInput,\n): Promise<shareables.FileResource> {\n return client.patch(`/file_resources/${id}`, {\n id: id.toString(),\n file_resource: fileResource,\n });\n}\n\n// ============================================================================\n// File Resources - Delete\n// ============================================================================\n\nexport async function deleteFileResource(\n client: FetchClient,\n id: number,\n): Promise<{ id: number; meta: { request_id: string; timestamp: string } }> {\n return client.delete(`/file_resources/${id}`);\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { shareables } from \"../generated/shareables\";\n\n// ============================================================================\n// Product Media - Get\n// ============================================================================\n\nexport async function getProductMedia(\n client: FetchClient,\n productId: number,\n): Promise<shareables.ProductMediaResponse> {\n return client.get(`/v2025-06/products/${productId}/media`);\n}\n\n// ============================================================================\n// Product Media - Type Guards\n// ============================================================================\n\nexport const isWidgetItem = (\n item: shareables.ModalItem,\n): item is { type: \"widget\"; data: shareables.ShareableItem } => {\n return item.type === \"widget\";\n};\n\nexport const isProductItem = (\n item: shareables.ModalItem,\n): item is { type: \"product\"; data: shareables.ProductRef } => {\n return item.type === \"product\";\n};\n\nexport const isMediaItem = (\n item: shareables.ModalItem,\n): item is { type: \"media\"; data: shareables.ProductMedia } => {\n return item.type === \"media\";\n};\n\n// ============================================================================\n// Product Media - Display Helpers\n// ============================================================================\n\nexport const getDisplayTitle = (item: shareables.ModalItem): string => {\n switch (item.type) {\n case \"widget\":\n return item.data.relateable?.title || item.data.title || \"Untitled\";\n case \"product\":\n return item.data.title;\n case \"media\":\n return item.data.title;\n default:\n return \"Untitled\";\n }\n};\n\nexport const getDisplayImage = (item: shareables.ModalItem): string => {\n switch (item.type) {\n case \"widget\":\n return item.data.relateable?.image_url || item.data.image_url || \"\";\n case \"product\":\n return item.data.image_url || \"\";\n case \"media\":\n return item.data.image_url || \"\";\n default:\n return \"\";\n }\n};\n\nexport const getDisplayVideo = (\n item: shareables.ModalItem,\n): string | undefined => {\n switch (item.type) {\n case \"widget\":\n return item.data.relateable?.video_url || item.data.video || undefined;\n case \"product\":\n return undefined;\n case \"media\":\n return item.data.video_url || undefined;\n default:\n return undefined;\n }\n};\n\ntype DescriptionField = string | { body: string } | null | undefined;\n\nexport const getDisplayDescription = (item: shareables.ModalItem): string => {\n switch (item.type) {\n case \"widget\": {\n const widgetDesc = item.data.relateable?.description as DescriptionField;\n if (typeof widgetDesc === \"object\" && widgetDesc?.body) {\n return widgetDesc.body;\n }\n return (\n (typeof widgetDesc === \"string\" ? widgetDesc : \"\") ||\n item.data.description ||\n \"\"\n );\n }\n case \"product\": {\n const productDesc = item.data.description as DescriptionField;\n if (typeof productDesc === \"object\" && productDesc?.body) {\n return productDesc.body;\n }\n return (\n (typeof productDesc === \"string\" ? productDesc : \"\") ||\n item.data.stripped ||\n \"\"\n );\n }\n case \"media\":\n return item.data.description || \"\";\n default:\n return \"\";\n }\n};\n\nexport const isProductType = (item: shareables.ModalItem): boolean => {\n if (isProductItem(item)) {\n return true;\n }\n\n if (isWidgetItem(item)) {\n const relateableType = item.data.relateable_type?.toLowerCase();\n return (\n relateableType === \"product\" ||\n relateableType === \"products\" ||\n relateableType === \"enrollmentpack\" ||\n relateableType === \"enrollment_packs\"\n );\n }\n\n return false;\n};\n\nexport const getProductIds = (item: shareables.ModalItem): number[] => {\n if (isProductItem(item)) {\n return [item.data.id];\n }\n\n if (isWidgetItem(item)) {\n const data = item.data;\n\n const type = data.relateable_type?.toLowerCase();\n if (\n (type === \"enrollmentpack\" || type === \"enrollment_packs\") &&\n data.relateable\n ) {\n const membershipIds =\n data.relateable.membership_products?.map((p) => p.id) || [];\n const subscriptionIds =\n data.relateable.subscription_products?.map((p) => p.id) || [];\n return [...membershipIds, ...subscriptionIds];\n }\n\n if (data.id && data.id !== 0) {\n return [data.id];\n } else if (data.relateable?.id && typeof data.relateable.id === \"number\") {\n return [data.relateable.id];\n }\n return [];\n }\n\n return [];\n};\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { shareables } from \"../generated/shareables\";\n\n// ============================================================================\n// Share - List\n// ============================================================================\n\nexport async function getShares(\n client: FetchClient,\n input?: shareables.GetSharesInput,\n): Promise<shareables.SharesListResponse> {\n return client.get(\"/shares.json\", (input || {}) as Record<string, unknown>);\n}\n\n// ============================================================================\n// Share - Create Link\n// ============================================================================\n\nexport async function createShareLink(\n client: FetchClient,\n input: shareables.CreateShareLinkInput,\n): Promise<string> {\n const requestBody = {\n locale: input.locale,\n relateable_type: input.relateableType,\n ...(input.contactId && { contact_id: input.contactId }),\n ...(input.relateableId && { relateable_id: input.relateableId }),\n };\n\n const result = await client.post<shareables.ShareLinkResponse>(\n \"/shares.json\",\n requestBody,\n );\n\n return result.link;\n}\n","/**\n * @fluid-app/shareables-api-client\n * Type-safe API client for Fluid shareable content services\n */\n\n// Core fetch client (re-exported from @fluid-app/api-client-core for convenience)\nexport {\n createFetchClient,\n ApiError,\n isApiError,\n type FetchClient,\n type FetchClientConfig,\n type RequestOptions,\n} from \"./lib/fetch-client\";\n\n// Export types\nexport type { shareables } from \"./generated/shareables\";\n\n// Export namespace clients\nexport * as playlists from \"./namespaces/playlists\";\nexport * as media from \"./namespaces/media\";\nexport * as fileResources from \"./namespaces/file-resources\";\nexport * as files from \"./namespaces/files\";\nexport * as shareablesWidget from \"./namespaces/shareables\";\nexport * as productMedia from \"./namespaces/product-media\";\nexport * as share from \"./namespaces/share\";\nexport * as publicMedia from \"./namespaces/public-media\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"src-Dt66UB0B.cjs","names":[],"sources":["../../../shareables/api-client/src/namespaces/playlists.ts","../../../shareables/api-client/src/namespaces/media.ts","../../../shareables/api-client/src/namespaces/file-resources.ts","../../../shareables/api-client/src/namespaces/product-media.ts","../../../shareables/api-client/src/namespaces/share.ts","../../../shareables/api-client/src/index.ts"],"sourcesContent":["import type { FetchClient } from \"../lib/fetch-client\";\nimport type { shareables } from \"../generated/shareables\";\n\nconst PLAYLISTS_URL = \"/v2025-06/playlists\";\n\n// ============================================================================\n// Playlists - List & Get\n// ============================================================================\n\nexport type PlaylistsQuery = {\n \"filter[title]\"?: string;\n \"filter[status]\"?: string;\n \"page[cursor]\"?: string;\n \"page[limit]\"?: number;\n sort?: string;\n};\n\nexport async function getPlaylists(\n client: FetchClient,\n options?: PlaylistsQuery,\n): Promise<shareables.GetPlaylistsResponse> {\n const input = options\n ? Object.fromEntries(\n Object.entries(options).filter(([, value]) => value !== undefined),\n )\n : undefined;\n return client.get(PLAYLISTS_URL, input);\n}\n\nexport async function getPlaylistById(\n client: FetchClient,\n id: number,\n): Promise<shareables.GetPlaylistResponse> {\n return client.get(`${PLAYLISTS_URL}/${id}`);\n}\n\n// ============================================================================\n// Playlists - Create & Update\n// ============================================================================\n\nexport async function createPlaylist(\n client: FetchClient,\n data: shareables.CreatePlaylistInput,\n): Promise<shareables.GetPlaylistResponse> {\n return client.post(PLAYLISTS_URL, data);\n}\n\nexport async function updatePlaylist(\n client: FetchClient,\n id: number,\n data: shareables.UpdatePlaylistInput,\n): Promise<shareables.GetPlaylistResponse> {\n return client.patch(`${PLAYLISTS_URL}/${id}`, data);\n}\n\nexport async function addItemToPlaylist(\n client: FetchClient,\n id: number,\n data: shareables.AddItemToPlaylistInput,\n): Promise<shareables.Playlist> {\n return client.post(`${PLAYLISTS_URL}/${id}/items`, data);\n}\n\n// ============================================================================\n// Playlists - Delete\n// ============================================================================\n\nexport async function deletePlaylist(\n client: FetchClient,\n id: number,\n): Promise<void> {\n return client.delete(`${PLAYLISTS_URL}/${id}`);\n}\n\nexport async function deletePlaylists(\n client: FetchClient,\n ids: number[],\n): Promise<void[]> {\n return Promise.all(ids.map((id) => deletePlaylist(client, id)));\n}\n\nexport async function deletePlaylistItem(\n client: FetchClient,\n id: number,\n item_ids: number[],\n): Promise<{\n deleted_at: string;\n meta: { request_id: string; timestamp: string };\n}> {\n return client.request(`${PLAYLISTS_URL}/${id}/items`, {\n method: \"DELETE\",\n body: item_ids,\n });\n}\n\n// ============================================================================\n// Playlists - Remove Items\n// ============================================================================\n\nexport async function removeItemsFromPlaylist(\n client: FetchClient,\n playlistId: number,\n data: shareables.RemoveItemsFromPlaylistInput,\n): Promise<shareables.Playlist> {\n return client.request(`${PLAYLISTS_URL}/${playlistId}/items`, {\n method: \"DELETE\",\n body: data,\n });\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { shareables } from \"../generated/shareables\";\n\n// ============================================================================\n// Media - Helper\n// ============================================================================\n\nfunction transformMediaListItem(\n item: shareables.MediaListItem,\n): shareables.MediumResponse {\n return {\n ...item,\n description: item.description,\n created_at: item.description?.created_at || item.created_at,\n };\n}\n\n// ============================================================================\n// Media - List & Get\n// ============================================================================\n\ninterface RepMediaResponse {\n media: shareables.MediaListItem[];\n meta: {\n request_id: string;\n timestamp: string;\n current_page: number;\n total_pages: number;\n total_count: number;\n };\n}\n\nexport async function getMedia(\n client: FetchClient,\n options: shareables.MediaFilters = {},\n repContext?: boolean,\n): Promise<shareables.MediaListResponseWithMeta> {\n if (repContext) {\n const response = await client.get<RepMediaResponse>(\n \"/users/v2025-06/media\",\n options as Record<string, unknown>,\n );\n\n const transformedItems = response.media.map(transformMediaListItem);\n const perPage = options.per_page || 10;\n\n return {\n data: transformedItems,\n status: \"success\",\n media: transformedItems,\n meta: {\n total_count: response.meta.total_count,\n current: response.meta.current_page,\n per_page: perPage,\n pages: response.meta.total_pages,\n next:\n response.meta.current_page < response.meta.total_pages\n ? response.meta.current_page + 1\n : null,\n previous:\n response.meta.current_page > 1\n ? response.meta.current_page - 1\n : null,\n },\n };\n }\n\n const response = await client.get<shareables.MediaListResponseNew>(\n \"/company/media\",\n options as Record<string, unknown>,\n );\n\n let mediaItems: shareables.MediaListItem[] = [];\n let pagination: shareables.MediaPagination = {\n count: 0,\n previous: null,\n next: null,\n pages: 0,\n per_page: 10,\n current: 1,\n };\n\n response.forEach((item) => {\n if (\"items\" in item && Array.isArray(item.items)) {\n mediaItems = item.items;\n }\n if (\"pagination\" in item && item.pagination?.count) {\n pagination = item.pagination;\n }\n });\n\n const transformedItems = mediaItems.map(transformMediaListItem);\n\n return {\n data: transformedItems,\n status: \"success\",\n media: transformedItems,\n meta: {\n ...pagination,\n total_count: pagination.count || mediaItems.length,\n },\n };\n}\n\nexport async function getMediaById(\n client: FetchClient,\n id: number,\n language_iso?: string,\n repContext?: boolean,\n): Promise<shareables.MediaResponseWithMeta> {\n if (repContext) {\n const response = await client.get<{ medium: shareables.MediumResponse }>(\n `/users/v2025-06/media/${id}`,\n );\n return {\n data: response.medium,\n status: \"success\",\n media: response.medium,\n };\n }\n\n const endpoint = language_iso\n ? `/company/media/${id}?language_iso=${language_iso}`\n : `/company/media/${id}`;\n\n const response = await client.get<shareables.MediumResponse>(endpoint);\n\n return {\n data: response,\n status: \"success\",\n media: response,\n };\n}\n\nexport async function getAnnouncementById(\n client: FetchClient,\n id: number,\n): Promise<shareables.AnnouncementResponse> {\n return client.get(`/company/announcements/${id}`);\n}\n\nexport async function getTrainings(\n client: FetchClient,\n options: {\n category_id?: number;\n page?: number;\n per_page?: number;\n } = {},\n): Promise<shareables.MediaListResponseWithMeta> {\n const params: Record<string, string> = {};\n\n if (options.category_id) {\n params[\"filterrific[with_category_id]\"] = options.category_id.toString();\n }\n if (options.page) {\n params.page = options.page.toString();\n }\n if (options.per_page) {\n params.per_page = options.per_page.toString();\n }\n\n const response = await client.get<shareables.MediaListResponseNew>(\n \"/v1/trainings\",\n params,\n );\n\n let mediaItems: shareables.MediaListItem[] = [];\n let pagination: shareables.MediaPagination = {\n count: 0,\n previous: null,\n next: null,\n pages: 0,\n per_page: 20,\n current: 1,\n };\n\n response.forEach((item) => {\n if (\"items\" in item && Array.isArray(item.items)) {\n mediaItems = item.items;\n }\n if (\"pagination\" in item && item.pagination?.count) {\n pagination = item.pagination;\n }\n });\n\n const transformedItems = mediaItems.map(transformMediaListItem);\n\n return {\n data: transformedItems,\n status: \"success\",\n media: transformedItems,\n meta: {\n ...pagination,\n total_count: pagination.count || mediaItems.length,\n },\n };\n}\n\n// ============================================================================\n// Media - Create\n// ============================================================================\n\nexport async function createMedia(\n client: FetchClient,\n mediaData: shareables.MediumUpdate,\n repContext?: boolean,\n): Promise<shareables.MediumResponse> {\n if (repContext) {\n const response = await client.post<{ medium: shareables.MediumResponse }>(\n \"/users/v2025-06/media\",\n mediaData,\n );\n return response.medium;\n }\n\n const response = await client.post<shareables.NewCreateMediaResponse>(\n \"/company/media\",\n mediaData,\n );\n return response.medium;\n}\n\nexport async function createAnnouncement(\n client: FetchClient,\n announcementData: shareables.AnnouncementUpdate,\n): Promise<shareables.AnnouncementResponse> {\n return client.post(\"/company/announcements\", announcementData);\n}\n\n// ============================================================================\n// Media - Update\n// ============================================================================\n\nexport async function updateMedia(\n client: FetchClient,\n id: number,\n mediaData: shareables.MediumUpdate,\n language_iso?: string,\n repContext?: boolean,\n): Promise<shareables.MediumResponse> {\n if (repContext) {\n const response = await client.request<{\n medium: shareables.MediumResponse;\n }>(`/users/v2025-06/media/${id}`, {\n method: \"PATCH\",\n body: mediaData,\n });\n return response.medium;\n }\n\n const endpoint = language_iso\n ? `/company/media/${id}?language_iso=${language_iso}`\n : `/company/media/${id}`;\n\n const response = await client.put<shareables.MediaResponse>(endpoint, {\n medium: mediaData,\n });\n\n if (\n response &&\n typeof response === \"object\" &&\n \"data\" in response &&\n response.data\n ) {\n return response.data as shareables.MediumResponse;\n }\n return response as shareables.MediumResponse;\n}\n\nexport async function updateAnnouncement(\n client: FetchClient,\n id: number,\n announcementData: shareables.AnnouncementUpdate,\n): Promise<shareables.AnnouncementResponse> {\n const response = await client.put<shareables.AnnouncementResponse>(\n `/company/announcements/${id}`,\n announcementData,\n );\n\n if (\n response &&\n typeof response === \"object\" &&\n \"data\" in response &&\n response.data\n ) {\n return response.data as shareables.AnnouncementResponse;\n }\n return response;\n}\n\n// ============================================================================\n// Media - Delete\n// ============================================================================\n\n/**\n * Delete a media item. The API returns a text response, so we use\n * client.delete and ignore the response body.\n */\nexport async function deleteMedia(\n client: FetchClient,\n id: number,\n repContext?: boolean,\n): Promise<{ success: boolean }> {\n if (repContext) {\n await client.delete(`/users/v2025-06/media/${id}`);\n } else {\n await client.delete(`/company/media/${id}`);\n }\n return { success: true };\n}\n\nexport async function deleteAnnouncement(\n client: FetchClient,\n id: number,\n): Promise<{ success: boolean }> {\n await client.delete(`/company/announcements/${id}`);\n return { success: true };\n}\n\nexport async function bulkDeleteAnnouncements(\n client: FetchClient,\n ids: number[],\n): Promise<{ success: boolean }> {\n await client.request(`/company/announcements/bulk_destroy`, {\n method: \"DELETE\",\n body: { ids },\n });\n return { success: true };\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { shareables } from \"../generated/shareables\";\n\n// ============================================================================\n// File Resources - List\n// ============================================================================\n\nexport async function getFileResources(\n client: FetchClient,\n params: {\n search_query?: string;\n pageParam?: string;\n pageSize?: string;\n fileTypes?: string[];\n sizeGreaterThan?: number;\n sizeLessThan?: number;\n sortedBy?: string;\n },\n): Promise<shareables.FileResourcesResponse> {\n const qp = new URLSearchParams({\n ...(params.search_query && { search_query: params.search_query }),\n ...(params.pageParam && { page: params.pageParam }),\n ...(params.pageSize && { per_page: params.pageSize }),\n ...(params.sizeGreaterThan && {\n size_greater_than: params.sizeGreaterThan.toString(),\n }),\n ...(params.sizeLessThan && {\n size_less_than: params.sizeLessThan.toString(),\n }),\n ...(params.sortedBy && { sorted_by: params.sortedBy }),\n });\n params.fileTypes?.forEach((type) => {\n qp.append(\"with_types[]\", type);\n });\n\n return client.get(`/file_resources?${qp.toString()}`);\n}\n\n// ============================================================================\n// File Resources - Create\n// ============================================================================\n\nexport async function createFileResource(\n client: FetchClient,\n data: shareables.CreateFileResourceInput,\n): Promise<shareables.CreateFileResourceResponse> {\n return client.post(\"/file_resources\", data);\n}\n\n// ============================================================================\n// File Resources - Update\n// ============================================================================\n\nexport async function updateFileResource(\n client: FetchClient,\n id: number,\n fileResource: shareables.UpdateFileResourceInput,\n): Promise<shareables.FileResource> {\n return client.patch(`/file_resources/${id}`, {\n id: id.toString(),\n file_resource: fileResource,\n });\n}\n\n// ============================================================================\n// File Resources - Delete\n// ============================================================================\n\nexport async function deleteFileResource(\n client: FetchClient,\n id: number,\n): Promise<{ id: number; meta: { request_id: string; timestamp: string } }> {\n return client.delete(`/file_resources/${id}`);\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { shareables } from \"../generated/shareables\";\n\n// ============================================================================\n// Product Media - Get\n// ============================================================================\n\nexport async function getProductMedia(\n client: FetchClient,\n productId: number,\n): Promise<shareables.ProductMediaResponse> {\n return client.get(`/v2025-06/products/${productId}/media`);\n}\n\n// ============================================================================\n// Product Media - Type Guards\n// ============================================================================\n\nexport const isWidgetItem = (\n item: shareables.ModalItem,\n): item is { type: \"widget\"; data: shareables.ShareableItem } => {\n return item.type === \"widget\";\n};\n\nexport const isProductItem = (\n item: shareables.ModalItem,\n): item is { type: \"product\"; data: shareables.ProductRef } => {\n return item.type === \"product\";\n};\n\nexport const isMediaItem = (\n item: shareables.ModalItem,\n): item is { type: \"media\"; data: shareables.ProductMedia } => {\n return item.type === \"media\";\n};\n\n// ============================================================================\n// Product Media - Display Helpers\n// ============================================================================\n\nexport const getDisplayTitle = (item: shareables.ModalItem): string => {\n switch (item.type) {\n case \"widget\":\n return item.data.relateable?.title || item.data.title || \"Untitled\";\n case \"product\":\n return item.data.title;\n case \"media\":\n return item.data.title;\n default:\n return \"Untitled\";\n }\n};\n\nexport const getDisplayImage = (item: shareables.ModalItem): string => {\n switch (item.type) {\n case \"widget\":\n return item.data.relateable?.image_url || item.data.image_url || \"\";\n case \"product\":\n return item.data.image_url || \"\";\n case \"media\":\n return item.data.image_url || \"\";\n default:\n return \"\";\n }\n};\n\nexport const getDisplayVideo = (\n item: shareables.ModalItem,\n): string | undefined => {\n switch (item.type) {\n case \"widget\":\n return item.data.relateable?.video_url || item.data.video || undefined;\n case \"product\":\n return undefined;\n case \"media\":\n return item.data.video_url || undefined;\n default:\n return undefined;\n }\n};\n\ntype DescriptionField = string | { body: string } | null | undefined;\n\nexport const getDisplayDescription = (item: shareables.ModalItem): string => {\n switch (item.type) {\n case \"widget\": {\n const widgetDesc = item.data.relateable?.description as DescriptionField;\n if (typeof widgetDesc === \"object\" && widgetDesc?.body) {\n return widgetDesc.body;\n }\n return (\n (typeof widgetDesc === \"string\" ? widgetDesc : \"\") ||\n item.data.description ||\n \"\"\n );\n }\n case \"product\": {\n const productDesc = item.data.description as DescriptionField;\n if (typeof productDesc === \"object\" && productDesc?.body) {\n return productDesc.body;\n }\n return (\n (typeof productDesc === \"string\" ? productDesc : \"\") ||\n item.data.stripped ||\n \"\"\n );\n }\n case \"media\":\n return item.data.description || \"\";\n default:\n return \"\";\n }\n};\n\nexport const isProductType = (item: shareables.ModalItem): boolean => {\n if (isProductItem(item)) {\n return true;\n }\n\n if (isWidgetItem(item)) {\n const relateableType = item.data.relateable_type?.toLowerCase();\n return (\n relateableType === \"product\" ||\n relateableType === \"products\" ||\n relateableType === \"enrollmentpack\" ||\n relateableType === \"enrollment_packs\"\n );\n }\n\n return false;\n};\n\nexport const getProductIds = (item: shareables.ModalItem): number[] => {\n if (isProductItem(item)) {\n return [item.data.id];\n }\n\n if (isWidgetItem(item)) {\n const data = item.data;\n\n const type = data.relateable_type?.toLowerCase();\n if (\n (type === \"enrollmentpack\" || type === \"enrollment_packs\") &&\n data.relateable\n ) {\n const membershipIds =\n data.relateable.membership_products?.map((p) => p.id) || [];\n const subscriptionIds =\n data.relateable.subscription_products?.map((p) => p.id) || [];\n return [...membershipIds, ...subscriptionIds];\n }\n\n if (data.id && data.id !== 0) {\n return [data.id];\n } else if (data.relateable?.id && typeof data.relateable.id === \"number\") {\n return [data.relateable.id];\n }\n return [];\n }\n\n return [];\n};\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { shareables } from \"../generated/shareables\";\n\n// ============================================================================\n// Share - List\n// ============================================================================\n\nexport async function getShares(\n client: FetchClient,\n input?: shareables.GetSharesInput,\n): Promise<shareables.SharesListResponse> {\n return client.get(\"/shares.json\", (input || {}) as Record<string, unknown>);\n}\n\n// ============================================================================\n// Share - Create Link\n// ============================================================================\n\nexport async function createShareLink(\n client: FetchClient,\n input: shareables.CreateShareLinkInput,\n): Promise<string> {\n const requestBody = {\n locale: input.locale,\n relateable_type: input.relateableType,\n ...(input.contactId && { contact_id: input.contactId }),\n ...(input.relateableId && { relateable_id: input.relateableId }),\n };\n\n const result = await client.post<shareables.ShareLinkResponse>(\n \"/shares.json\",\n requestBody,\n );\n\n return result.link;\n}\n","/**\n * @fluid-app/shareables-api-client\n * Type-safe API client for Fluid shareable content services\n */\n\n// Core fetch client (re-exported from @fluid-app/api-client-core for convenience)\nexport {\n createFetchClient,\n ApiError,\n isApiError,\n type FetchClient,\n type FetchClientConfig,\n type RequestOptions,\n} from \"./lib/fetch-client\";\n\n// Export types\nexport type { shareables } from \"./generated/shareables\";\n\n// Export namespace clients\nexport * as playlists from \"./namespaces/playlists\";\nexport * as media from \"./namespaces/media\";\nexport * as fileResources from \"./namespaces/file-resources\";\nexport * as files from \"./namespaces/files\";\nexport * as shareablesWidget from \"./namespaces/shareables\";\nexport * as productMedia from \"./namespaces/product-media\";\nexport * as share from \"./namespaces/share\";\nexport * as publicMedia from \"./namespaces/public-media\";\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  const require_chunk = require("./chunk-9hOWP6kD.cjs");
2
2
  const require_src = require("./src-DGjAAfmN.cjs");
3
3
  const require_ScreenHeaderContext = require("./ScreenHeaderContext-wrJlkhgN.cjs");
4
- const require_dist$3 = require("./dist-BbS_7TvS.cjs");
5
- const require_es = require("./es-BSkb3AZk.cjs");
6
- const require_dist$4 = require("./dist-B4Ke7bHH.cjs");
7
- const require_src$1 = require("./src-Dzexc0vw.cjs");
8
- const require_products = require("./products-BKZ1siXg.cjs");
4
+ const require_dist$3 = require("./dist-thaj08s5.cjs");
5
+ const require_es = require("./es-xQF-WIMq.cjs");
6
+ const require_dist$4 = require("./dist-BK4mvUPm.cjs");
7
+ const require_src$1 = require("./src-Dt66UB0B.cjs");
8
+ const require_products = require("./products-CjZof7c2.cjs");
9
9
  const require_dist$5 = require("./dist-lO2OG0T5.cjs");
10
10
  let react = require("react");
11
11
  react = require_chunk.__toESM(react);
@@ -1291,12 +1291,12 @@ function getMediaKindLabel(kind) {
1291
1291
  function MediaListingScreen({ onNavigate }) {
1292
1292
  const client = useShareablesClient();
1293
1293
  const repContext = useRepContext();
1294
- const { navigate } = useShareablesUI();
1295
- require_ScreenHeaderContext.useScreenHeaderActions((0, react.useMemo)(() => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_src.Button, {
1294
+ const { navigate, readOnly } = useShareablesUI();
1295
+ require_ScreenHeaderContext.useScreenHeaderActions((0, react.useMemo)(() => readOnly ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_src.Button, {
1296
1296
  onClick: () => navigate("media/new"),
1297
1297
  size: "sm",
1298
1298
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Plus, { className: "mr-1 h-4 w-4" }), "Add Media"]
1299
- }), [navigate]));
1299
+ }), [navigate, readOnly]));
1300
1300
  require_ScreenHeaderContext.useScreenHeaderBreadcrumbs((0, react.useMemo)(() => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.Breadcrumb, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbList, {
1301
1301
  className: "text-lg",
1302
1302
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbItem, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbPage, {
@@ -6930,13 +6930,13 @@ const PAGE_SIZE$1 = 12;
6930
6930
  const GRID_CLASS$1 = "grid grid-cols-1 gap-8 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4";
6931
6931
  function PlaylistsListingScreen(_props) {
6932
6932
  const client = useShareablesClient();
6933
- const { navigate, showToast, user, onToggleFavorite, onDeletePlaylist } = useShareablesUI();
6933
+ const { navigate, showToast, user, onToggleFavorite, onDeletePlaylist, readOnly } = useShareablesUI();
6934
6934
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
6935
- require_ScreenHeaderContext.useScreenHeaderActions((0, react.useMemo)(() => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_src.Button, {
6935
+ require_ScreenHeaderContext.useScreenHeaderActions((0, react.useMemo)(() => readOnly ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_src.Button, {
6936
6936
  onClick: () => navigate("playlists/new"),
6937
6937
  size: "sm",
6938
6938
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Plus, { className: "mr-1 h-4 w-4" }), "Create Playlist"]
6939
- }), [navigate]));
6939
+ }), [navigate, readOnly]));
6940
6940
  require_ScreenHeaderContext.useScreenHeaderBreadcrumbs((0, react.useMemo)(() => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.Breadcrumb, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbList, {
6941
6941
  className: "text-lg",
6942
6942
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbItem, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_src.BreadcrumbPage, {
@@ -7129,7 +7129,7 @@ function PlaylistsListingScreen(_props) {
7129
7129
  const firstItem = playlist.items?.[0];
7130
7130
  const imageUrl = playlist.image_url || firstItem?.relateable?.image_url || firstItem?.relateable?.compressed_image_url;
7131
7131
  const itemCount = playlist.items?.length ?? 0;
7132
- const canEdit = playlist.user_id === user?.id;
7132
+ const canEdit = !readOnly && playlist.user_id === user?.id;
7133
7133
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlaylistCard, {
7134
7134
  title: playlist.title || "Untitled Playlist",
7135
7135
  imageUrl,
@@ -7430,7 +7430,7 @@ function PlaylistItemsList({ items, onSelectItem, selectedItemIndex = 0, onNavig
7430
7430
  const DEFAULT_IMAGE$1 = "https://assets.fluid.app/fluid-admin/images/we-commerce/we-commerce.png";
7431
7431
  function PlaylistDetailScreen({ playlistId, onNavigate }) {
7432
7432
  const client = useShareablesClient();
7433
- const { navigate, showToast, onDeletePlaylist, user } = useShareablesUI();
7433
+ const { navigate, showToast, onDeletePlaylist, user, readOnly } = useShareablesUI();
7434
7434
  const [isDescriptionExpanded, setIsDescriptionExpanded] = (0, react.useState)(false);
7435
7435
  const [selectedPlaylistItemIndex, setSelectedPlaylistItemIndex] = (0, react.useState)(0);
7436
7436
  const [isDeleteOpen, setIsDeleteOpen] = (0, react.useState)(false);
@@ -7441,7 +7441,7 @@ function PlaylistDetailScreen({ playlistId, onNavigate }) {
7441
7441
  });
7442
7442
  const { shareLink, loading: shareLinkLoading, error: shareLinkError } = useShareLink({ id: Number(playlistId) }, "Library");
7443
7443
  const playlist = playlistResponse?.playlist;
7444
- const canEdit = playlist?.user_id === user?.id;
7444
+ const canEdit = !readOnly && playlist?.user_id === user?.id;
7445
7445
  const displayTitle = playlist?.title || "";
7446
7446
  require_ScreenHeaderContext.useScreenHeaderActions((0, react.useMemo)(() => {
7447
7447
  if (!canEdit) return null;
@@ -8934,14 +8934,15 @@ function FilesListingScreen({ onNavigate }) {
8934
8934
  //#endregion
8935
8935
  //#region ../../shareables/ui/src/components/ShareablesApp.tsx
8936
8936
  function ShareablesApp({ screen, detailId, action, onNavigate, onBack, countryCode }) {
8937
+ const { readOnly } = useShareablesUI();
8937
8938
  let content;
8938
8939
  switch (screen) {
8939
8940
  case "media":
8940
- if (detailId === "new") content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MediaCreateScreen, {
8941
+ if (detailId === "new" && !readOnly) content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MediaCreateScreen, {
8941
8942
  onBack,
8942
8943
  onNavigate
8943
8944
  });
8944
- else if (detailId) content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MediaDetailScreen, {
8945
+ else if (detailId && detailId !== "new") content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MediaDetailScreen, {
8945
8946
  mediaId: detailId,
8946
8947
  onNavigate,
8947
8948
  onBack
@@ -8950,12 +8951,12 @@ function ShareablesApp({ screen, detailId, action, onNavigate, onBack, countryCo
8950
8951
  break;
8951
8952
  case "playlists":
8952
8953
  case "playlist":
8953
- if (detailId === "new") content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlaylistCreateScreen, { onBack });
8954
- else if (detailId && action === "edit") content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlaylistCreateScreen, {
8954
+ if (detailId === "new" && !readOnly) content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlaylistCreateScreen, { onBack });
8955
+ else if (detailId && action === "edit" && !readOnly) content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlaylistCreateScreen, {
8955
8956
  playlistId: detailId,
8956
8957
  onBack
8957
8958
  });
8958
- else if (detailId) content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlaylistDetailScreen, {
8959
+ else if (detailId && detailId !== "new") content = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlaylistDetailScreen, {
8959
8960
  playlistId: detailId,
8960
8961
  onNavigate,
8961
8962
  onBack
@@ -9028,4 +9029,4 @@ Object.defineProperty(exports, "ShareablesUIProvider", {
9028
9029
  }
9029
9030
  });
9030
9031
 
9031
- //# sourceMappingURL=src-fXyI4AWk.cjs.map
9032
+ //# sourceMappingURL=src-bzRRiTN4.cjs.map