@liorian/sdk 0.28.0-alpha.56010ca

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 (362) hide show
  1. package/README.md +483 -0
  2. package/package.json +94 -0
  3. package/schemas/module.schema.json +818 -0
  4. package/src/application/index.ts +3 -0
  5. package/src/application/module-instance.ts +36 -0
  6. package/src/application/service/auth-api-service.ts +291 -0
  7. package/src/application/service/auth-user.service.ts +108 -0
  8. package/src/application/service/index.ts +12 -0
  9. package/src/application/service/module-activation-api.service.ts +105 -0
  10. package/src/application/service/notifications-api-service.ts +38 -0
  11. package/src/application/service/notifications-push.service.ts +299 -0
  12. package/src/application/service/notifications-socket-service.ts +76 -0
  13. package/src/application/service/organizations-api-service.ts +104 -0
  14. package/src/application/service/otp-api-service.ts +11 -0
  15. package/src/application/service/storage-api-service.ts +77 -0
  16. package/src/application/service/storefront-api.service.ts +72 -0
  17. package/src/application/service/user-preferences-api.service.ts +57 -0
  18. package/src/domain/config/app.config.ts +35 -0
  19. package/src/domain/config/auth.config.ts +30 -0
  20. package/src/domain/config/index.ts +4 -0
  21. package/src/domain/config/logo.config.ts +17 -0
  22. package/src/domain/entities/activities.interface.ts +18 -0
  23. package/src/domain/entities/catalog.interface.ts +96 -0
  24. package/src/domain/entities/index.ts +13 -0
  25. package/src/domain/entities/media.ts +22 -0
  26. package/src/domain/entities/module-activation.interface.ts +173 -0
  27. package/src/domain/entities/module.interface.ts +101 -0
  28. package/src/domain/entities/notification.interface.ts +23 -0
  29. package/src/domain/entities/objectable.type.ts +3 -0
  30. package/src/domain/entities/organization.interface.ts +81 -0
  31. package/src/domain/entities/user-auth.interface.ts +17 -0
  32. package/src/domain/entities/user-phone.interface.ts +11 -0
  33. package/src/domain/entities/user-profile.interface.ts +23 -0
  34. package/src/domain/entities/user.interface.ts +79 -0
  35. package/src/domain/enums/coloring.enum.ts +6 -0
  36. package/src/domain/enums/domains.enum.ts +282 -0
  37. package/src/domain/enums/index.ts +8 -0
  38. package/src/domain/enums/module-category.enum.ts +57 -0
  39. package/src/domain/enums/module.enum.ts +97 -0
  40. package/src/domain/enums/routine.enum.ts +12 -0
  41. package/src/domain/enums/user-profile.enum.ts +25 -0
  42. package/src/domain/enums/user-status.enum.ts +7 -0
  43. package/src/domain/index.ts +6 -0
  44. package/src/domain/typing/auth-caches.ts +12 -0
  45. package/src/domain/typing/auth-oauth.types.ts +172 -0
  46. package/src/domain/typing/devise.ts +2 -0
  47. package/src/domain/typing/index.ts +10 -0
  48. package/src/domain/typing/response.ts +30 -0
  49. package/src/domain/typing/routine.types.ts +113 -0
  50. package/src/domain/typing/session.interface.ts +28 -0
  51. package/src/domain/typing/statisticals.ts +11 -0
  52. package/src/domain/typing/user-media-upload.ts +9 -0
  53. package/src/domain/typing/values.ts +6 -0
  54. package/src/index.tsx +168 -0
  55. package/src/infrastructure/capabilities/cache-storage/capability.ts +129 -0
  56. package/src/infrastructure/capabilities/cache-storage/enum.ts +5 -0
  57. package/src/infrastructure/capabilities/cache-storage/index.ts +4 -0
  58. package/src/infrastructure/capabilities/cache-storage/types.ts +13 -0
  59. package/src/infrastructure/capabilities/index.ts +3 -0
  60. package/src/infrastructure/capabilities/stackable/capability.ts +55 -0
  61. package/src/infrastructure/capabilities/stackable/index.ts +3 -0
  62. package/src/infrastructure/capabilities/stackable/types.ts +24 -0
  63. package/src/infrastructure/common-classname.constant.ts +4 -0
  64. package/src/infrastructure/data/countries.ts +208 -0
  65. package/src/infrastructure/data/gender.ts +5 -0
  66. package/src/infrastructure/data/index.ts +3 -0
  67. package/src/infrastructure/dataset/index.ts +3 -0
  68. package/src/infrastructure/dataset/sign-in.dataset.ts +21 -0
  69. package/src/infrastructure/dataset/sign-up.dataset.ts +64 -0
  70. package/src/infrastructure/hooks/index.ts +10 -0
  71. package/src/infrastructure/hooks/use-activity-lock-draft.ts +69 -0
  72. package/src/infrastructure/hooks/use-auth.ts +24 -0
  73. package/src/infrastructure/hooks/use-elastic-interaction.ts +180 -0
  74. package/src/infrastructure/hooks/use-is-desktop.ts +25 -0
  75. package/src/infrastructure/hooks/use-is-tauri.ts +17 -0
  76. package/src/infrastructure/hooks/use-mobile.ts +19 -0
  77. package/src/infrastructure/hooks/use-notifications.ts +128 -0
  78. package/src/infrastructure/hooks/use-recent-colors.ts +113 -0
  79. package/src/infrastructure/hooks/use-recent-modules.ts +76 -0
  80. package/src/infrastructure/index.tsx +11 -0
  81. package/src/infrastructure/library/design-system.ts +95 -0
  82. package/src/infrastructure/library/index.tsx +5 -0
  83. package/src/infrastructure/library/motion-utils.ts +77 -0
  84. package/src/infrastructure/library/motion.tsx +31 -0
  85. package/src/infrastructure/library/scroll-progress.tsx +93 -0
  86. package/src/infrastructure/providers/auth-guard.provider.tsx +47 -0
  87. package/src/infrastructure/providers/auth.provider.tsx +168 -0
  88. package/src/infrastructure/providers/index.tsx +8 -0
  89. package/src/infrastructure/providers/module-usage.provider.tsx +95 -0
  90. package/src/infrastructure/providers/modules-guard.provider.tsx +64 -0
  91. package/src/infrastructure/providers/modules-routines.provider.tsx +33 -0
  92. package/src/infrastructure/providers/modules-switcher.provider.tsx +25 -0
  93. package/src/infrastructure/providers/query.provider.tsx +27 -0
  94. package/src/infrastructure/routines/__tests__/routine.test.ts +368 -0
  95. package/src/infrastructure/routines/index.tsx +3 -0
  96. package/src/infrastructure/routines/routine.hook.ts +121 -0
  97. package/src/infrastructure/routines/routine.ts +283 -0
  98. package/src/infrastructure/routines/routine.tsx +283 -0
  99. package/src/infrastructure/stores/activity-lock.store.ts +22 -0
  100. package/src/infrastructure/stores/auth-user-connected.store.ts +24 -0
  101. package/src/infrastructure/stores/dataset.store.ts +106 -0
  102. package/src/infrastructure/stores/index.ts +6 -0
  103. package/src/infrastructure/stores/module.store.ts +266 -0
  104. package/src/infrastructure/stores/upload.store.ts +198 -0
  105. package/src/infrastructure/utilities/access-label.util.ts +158 -0
  106. package/src/infrastructure/utilities/activities.util.tsx +54 -0
  107. package/src/infrastructure/utilities/activity-lock.service.ts +263 -0
  108. package/src/infrastructure/utilities/activity-tracker.service.ts +205 -0
  109. package/src/infrastructure/utilities/api-service.ts +237 -0
  110. package/src/infrastructure/utilities/auth-logout.util.ts +23 -0
  111. package/src/infrastructure/utilities/classname.util.ts +7 -0
  112. package/src/infrastructure/utilities/encryption.service.ts +125 -0
  113. package/src/infrastructure/utilities/form-snapshot.service.ts +304 -0
  114. package/src/infrastructure/utilities/format.util.ts +40 -0
  115. package/src/infrastructure/utilities/index.tsx +23 -0
  116. package/src/infrastructure/utilities/media-label.service.ts +47 -0
  117. package/src/infrastructure/utilities/modules.ts +11 -0
  118. package/src/infrastructure/utilities/permission.util.ts +22 -0
  119. package/src/infrastructure/utilities/push-permission.util.ts +43 -0
  120. package/src/infrastructure/utilities/route-access.ts +38 -0
  121. package/src/infrastructure/utilities/socket-service.ts +123 -0
  122. package/src/infrastructure/utilities/sso-auth.util.ts +188 -0
  123. package/src/infrastructure/utilities/stringable.util.ts +16 -0
  124. package/src/infrastructure/utilities/strings.util.ts +18 -0
  125. package/src/infrastructure/utilities/tauri.util.ts +15 -0
  126. package/src/infrastructure/utilities/utils.ts +6 -0
  127. package/src/infrastructure/utilities/values.ts +5 -0
  128. package/src/presentation/8starlabs-ui/button.tsx +94 -0
  129. package/src/presentation/8starlabs-ui/flip-clock.tsx +368 -0
  130. package/src/presentation/8starlabs-ui/heatmap.tsx +430 -0
  131. package/src/presentation/8starlabs-ui/hooks/index.tsx +2 -0
  132. package/src/presentation/8starlabs-ui/hooks/use-mobile.ts +21 -0
  133. package/src/presentation/8starlabs-ui/index.tsx +20 -0
  134. package/src/presentation/8starlabs-ui/json-viewer.tsx +972 -0
  135. package/src/presentation/8starlabs-ui/marquee.tsx +134 -0
  136. package/src/presentation/8starlabs-ui/partition-bar.tsx +198 -0
  137. package/src/presentation/8starlabs-ui/scroll-fade.tsx +158 -0
  138. package/src/presentation/8starlabs-ui/status-indicator.tsx +86 -0
  139. package/src/presentation/8starlabs-ui/system-banner.tsx +50 -0
  140. package/src/presentation/8starlabs-ui/timeline.tsx +576 -0
  141. package/src/presentation/8starlabs-ui/transport-badge.tsx +249 -0
  142. package/src/presentation/8starlabs-ui/ui/copy-button.tsx +60 -0
  143. package/src/presentation/8starlabs-ui/ui/index.tsx +2 -0
  144. package/src/presentation/analytics-section.tsx +85 -0
  145. package/src/presentation/app-sidebar.tsx +234 -0
  146. package/src/presentation/charts/area-widget.chart-skeleton.tsx +61 -0
  147. package/src/presentation/charts/area-widget.chart.tsx +128 -0
  148. package/src/presentation/charts/chart-widgets.types.ts +81 -0
  149. package/src/presentation/charts/index.tsx +16 -0
  150. package/src/presentation/charts/line-widget.chart-skeleton.tsx +64 -0
  151. package/src/presentation/charts/line-widget.chart.tsx +105 -0
  152. package/src/presentation/charts/pie-widget.chart-skeleton.tsx +56 -0
  153. package/src/presentation/charts/pie-widget.chart.tsx +168 -0
  154. package/src/presentation/charts/radar-widget.chart-skeleton.tsx +67 -0
  155. package/src/presentation/charts/radar-widget.chart.tsx +80 -0
  156. package/src/presentation/charts/radial-stacked-widget.chart-skeleton.tsx +66 -0
  157. package/src/presentation/charts/radial-stacked-widget.chart.tsx +120 -0
  158. package/src/presentation/charts/radial-widget.chart-skeleton.tsx +61 -0
  159. package/src/presentation/charts/radial-widget.chart.tsx +87 -0
  160. package/src/presentation/charts/tooltip-widget.chart-skeleton.tsx +64 -0
  161. package/src/presentation/charts/tooltip-widget.chart.tsx +89 -0
  162. package/src/presentation/components/activity-actions.tsx +20 -0
  163. package/src/presentation/components/activity-container.tsx +55 -0
  164. package/src/presentation/components/activity-content.tsx +20 -0
  165. package/src/presentation/components/activity-descriptor-parser.tsx +37 -0
  166. package/src/presentation/components/activity-header.tsx +20 -0
  167. package/src/presentation/components/activity-loader.tsx +19 -0
  168. package/src/presentation/components/activity-title.tsx +32 -0
  169. package/src/presentation/components/activity.tsx +22 -0
  170. package/src/presentation/components/auth/index.tsx +4 -0
  171. package/src/presentation/components/auth/sso-callback.view.tsx +44 -0
  172. package/src/presentation/components/auth/sso-disconnect.view.tsx +41 -0
  173. package/src/presentation/components/auth/sso-sign-in.view.tsx +29 -0
  174. package/src/presentation/components/auth-lock-screen.tsx +309 -0
  175. package/src/presentation/components/auth-session.view.tsx +17 -0
  176. package/src/presentation/components/data-table.tsx +814 -0
  177. package/src/presentation/components/dynamic-icon.tsx +16 -0
  178. package/src/presentation/components/floating-upload.tsx +291 -0
  179. package/src/presentation/components/index.tsx +40 -0
  180. package/src/presentation/components/local-time.tsx +170 -0
  181. package/src/presentation/components/markdown-parser.tsx +201 -0
  182. package/src/presentation/components/message-scroller.tsx +131 -0
  183. package/src/presentation/components/module-first-access-config.view.tsx +181 -0
  184. package/src/presentation/components/module-first-access-pending.view.tsx +38 -0
  185. package/src/presentation/components/module-guard.tsx +34 -0
  186. package/src/presentation/components/modules-first-access.guard.tsx +88 -0
  187. package/src/presentation/components/modules-guard-forbidden.tsx +46 -0
  188. package/src/presentation/components/notification-details.modal.tsx +145 -0
  189. package/src/presentation/components/notification-item.tsx +127 -0
  190. package/src/presentation/components/notifications-popover.tsx +128 -0
  191. package/src/presentation/components/push-notifications.provider.tsx +65 -0
  192. package/src/presentation/components/upload-progress-dialog.tsx +140 -0
  193. package/src/presentation/components/waiting-bar.tsx +22 -0
  194. package/src/presentation/components/waiting-section.tsx +15 -0
  195. package/src/presentation/components/waiting.tsx +14 -0
  196. package/src/presentation/data-grid/data-grid-empty.tsx +24 -0
  197. package/src/presentation/data-grid/data-grid-search-engine.tsx +32 -0
  198. package/src/presentation/data-grid/data-grid.tsx +892 -0
  199. package/src/presentation/data-grid/index.tsx +4 -0
  200. package/src/presentation/form-screen.tsx +95 -0
  201. package/src/presentation/icons/custom.tsx +20 -0
  202. package/src/presentation/icons/glyphIcons.tsx +53 -0
  203. package/src/presentation/icons/icons.enum.ts +4 -0
  204. package/src/presentation/icons/icons.util.ts +6 -0
  205. package/src/presentation/icons/index.tsx +8 -0
  206. package/src/presentation/icons/lucide.tsx +17 -0
  207. package/src/presentation/icons/remix.tsx +33 -0
  208. package/src/presentation/icons/types.ts +27 -0
  209. package/src/presentation/index.tsx +45 -0
  210. package/src/presentation/modals/components/ModalBox.tsx +74 -0
  211. package/src/presentation/modals/components/ModalPortal.tsx +31 -0
  212. package/src/presentation/modals/components/ModalStepper.tsx +319 -0
  213. package/src/presentation/modals/components/ModalWrapper.tsx +65 -0
  214. package/src/presentation/modals/components/index.tsx +5 -0
  215. package/src/presentation/modals/hooks/index.ts +2 -0
  216. package/src/presentation/modals/hooks/useModal.ts +38 -0
  217. package/src/presentation/modals/index.tsx +5 -0
  218. package/src/presentation/modals/stores/index.ts +2 -0
  219. package/src/presentation/modals/stores/useModalStore.ts +90 -0
  220. package/src/presentation/modals/types/index.ts +2 -0
  221. package/src/presentation/modals/types/modal.type.ts +33 -0
  222. package/src/presentation/module-menubar.tsx +300 -0
  223. package/src/presentation/module-widget.tsx +233 -0
  224. package/src/presentation/nav-documents.tsx +89 -0
  225. package/src/presentation/nav-main.tsx +62 -0
  226. package/src/presentation/nav-secondary.tsx +41 -0
  227. package/src/presentation/nav-user.tsx +109 -0
  228. package/src/presentation/permission-action-badge.tsx +35 -0
  229. package/src/presentation/reui/index.tsx +3 -0
  230. package/src/presentation/reui/stepper.tsx +508 -0
  231. package/src/presentation/reui/timeline.tsx +226 -0
  232. package/src/presentation/sheets/index.tsx +2 -0
  233. package/src/presentation/sheets/legacy-sheet-header.tsx +0 -0
  234. package/src/presentation/sheets/legacy-sheet.tsx +37 -0
  235. package/src/presentation/size.enum.ts +19 -0
  236. package/src/presentation/system/index.tsx +3 -0
  237. package/src/presentation/system/logo.theme.tsx +21 -0
  238. package/src/presentation/system/types.ts +10 -0
  239. package/src/presentation/theme/index.tsx +6 -0
  240. package/src/presentation/theme/prefer-color-scheme.tsx +50 -0
  241. package/src/presentation/theme/switch-color-scheme.tsx +16 -0
  242. package/src/presentation/theme/theme-switcher-button.tsx +20 -0
  243. package/src/presentation/theme/theme.enum.ts +4 -0
  244. package/src/presentation/theme/theme.store.ts +87 -0
  245. package/src/presentation/themes/index.tsx +2 -0
  246. package/src/presentation/themes/katon/dashboard-layout.tsx +1080 -0
  247. package/src/presentation/themes/katon/edge-section.tsx +19 -0
  248. package/src/presentation/themes/katon/header-menubar.tsx +270 -0
  249. package/src/presentation/themes/katon/header-modules-available.tsx +44 -0
  250. package/src/presentation/themes/katon/header-modules-recents.tsx +52 -0
  251. package/src/presentation/themes/katon/header-modules-store.tsx +25 -0
  252. package/src/presentation/themes/katon/header-options.tsx +13 -0
  253. package/src/presentation/themes/katon/header-organization-select.tsx +146 -0
  254. package/src/presentation/themes/katon/header-routines.tsx +74 -0
  255. package/src/presentation/themes/katon/header-tasks-connected-user.tsx +150 -0
  256. package/src/presentation/themes/katon/index.tsx +16 -0
  257. package/src/presentation/themes/katon/main-wrapper.tsx +34 -0
  258. package/src/presentation/themes/katon/module-item-link.tsx +32 -0
  259. package/src/presentation/themes/katon/view-frame.tsx +25 -0
  260. package/src/presentation/themes/katon/view-helmet.tsx +53 -0
  261. package/src/presentation/themes/katon/view-status.tsx +32 -0
  262. package/src/presentation/themes/katon/view-wrapper.tsx +15 -0
  263. package/src/presentation/themes/katon/view.tsx +42 -0
  264. package/src/presentation/ui/accordion-multiselect.tsx +206 -0
  265. package/src/presentation/ui/accordion.tsx +81 -0
  266. package/src/presentation/ui/alert-dialog.tsx +199 -0
  267. package/src/presentation/ui/alert.tsx +76 -0
  268. package/src/presentation/ui/aspect-ratio.tsx +11 -0
  269. package/src/presentation/ui/attachment.tsx +204 -0
  270. package/src/presentation/ui/avatar.tsx +112 -0
  271. package/src/presentation/ui/badge.tsx +49 -0
  272. package/src/presentation/ui/breadcrumb.tsx +122 -0
  273. package/src/presentation/ui/bubble.tsx +125 -0
  274. package/src/presentation/ui/button-group.tsx +83 -0
  275. package/src/presentation/ui/button.tsx +87 -0
  276. package/src/presentation/ui/calendar.tsx +222 -0
  277. package/src/presentation/ui/card.tsx +106 -0
  278. package/src/presentation/ui/carousel.tsx +242 -0
  279. package/src/presentation/ui/chart.tsx +373 -0
  280. package/src/presentation/ui/checkbox.tsx +33 -0
  281. package/src/presentation/ui/clickable.tsx +58 -0
  282. package/src/presentation/ui/collapsible.tsx +33 -0
  283. package/src/presentation/ui/color-swatch-selector.tsx +81 -0
  284. package/src/presentation/ui/combobox.tsx +299 -0
  285. package/src/presentation/ui/command.tsx +195 -0
  286. package/src/presentation/ui/context-menu.tsx +263 -0
  287. package/src/presentation/ui/dialog.tsx +168 -0
  288. package/src/presentation/ui/direction.tsx +22 -0
  289. package/src/presentation/ui/drawer.tsx +134 -0
  290. package/src/presentation/ui/dropdown-menu.tsx +269 -0
  291. package/src/presentation/ui/empty.tsx +104 -0
  292. package/src/presentation/ui/field.tsx +238 -0
  293. package/src/presentation/ui/granularity-selector.tsx +58 -0
  294. package/src/presentation/ui/hover-card.tsx +44 -0
  295. package/src/presentation/ui/index.tsx +74 -0
  296. package/src/presentation/ui/input-group.tsx +156 -0
  297. package/src/presentation/ui/input-otp.tsx +87 -0
  298. package/src/presentation/ui/input.tsx +19 -0
  299. package/src/presentation/ui/item.tsx +196 -0
  300. package/src/presentation/ui/kpi-card.tsx +203 -0
  301. package/src/presentation/ui/label-selector.tsx +100 -0
  302. package/src/presentation/ui/label.tsx +24 -0
  303. package/src/presentation/ui/legacy-birth-date-input.tsx +43 -0
  304. package/src/presentation/ui/legacy-color-picker/index.tsx +42 -0
  305. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.content.tsx +37 -0
  306. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.context.tsx +42 -0
  307. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.hex-input.tsx +97 -0
  308. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.picker.tsx +266 -0
  309. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.presets.ts +22 -0
  310. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.quick-list.tsx +49 -0
  311. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.recent.tsx +43 -0
  312. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.swatches.tsx +111 -0
  313. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.trigger.tsx +128 -0
  314. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.tsx +110 -0
  315. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.types.ts +1 -0
  316. package/src/presentation/ui/legacy-color-picker/legacy-color-picker.utils.ts +114 -0
  317. package/src/presentation/ui/legacy-country-input.tsx +171 -0
  318. package/src/presentation/ui/legacy-gender-input.tsx +22 -0
  319. package/src/presentation/ui/legacy-input.tsx +106 -0
  320. package/src/presentation/ui/legacy-phone-input.tsx +213 -0
  321. package/src/presentation/ui/legacy-select-input.tsx +114 -0
  322. package/src/presentation/ui/legacy-text-area.tsx +111 -0
  323. package/src/presentation/ui/list-items.tsx +59 -0
  324. package/src/presentation/ui/marker.tsx +69 -0
  325. package/src/presentation/ui/media-player/index.tsx +12 -0
  326. package/src/presentation/ui/media-player/media-player.context.tsx +36 -0
  327. package/src/presentation/ui/media-player/media-player.tsx +167 -0
  328. package/src/presentation/ui/media-player/player-controls.tsx +207 -0
  329. package/src/presentation/ui/media-player/players/audio-player.tsx +78 -0
  330. package/src/presentation/ui/media-player/players/index.tsx +4 -0
  331. package/src/presentation/ui/media-player/players/video-player.tsx +193 -0
  332. package/src/presentation/ui/media-player/players/voice-note-player.tsx +108 -0
  333. package/src/presentation/ui/media-player/use-media-player.hook.ts +263 -0
  334. package/src/presentation/ui/menubar.tsx +281 -0
  335. package/src/presentation/ui/message.tsx +92 -0
  336. package/src/presentation/ui/navigation-menu.tsx +172 -0
  337. package/src/presentation/ui/pagination.tsx +129 -0
  338. package/src/presentation/ui/popover.tsx +89 -0
  339. package/src/presentation/ui/progress.tsx +31 -0
  340. package/src/presentation/ui/resizable.tsx +50 -0
  341. package/src/presentation/ui/select.tsx +192 -0
  342. package/src/presentation/ui/separator.tsx +28 -0
  343. package/src/presentation/ui/sheet.tsx +147 -0
  344. package/src/presentation/ui/sidebar.tsx +702 -0
  345. package/src/presentation/ui/skeleton.tsx +13 -0
  346. package/src/presentation/ui/slide-to-confirm.tsx +129 -0
  347. package/src/presentation/ui/slider.tsx +59 -0
  348. package/src/presentation/ui/sonner.tsx +58 -0
  349. package/src/presentation/ui/switch.tsx +33 -0
  350. package/src/presentation/ui/table.tsx +116 -0
  351. package/src/presentation/ui/tabs.tsx +90 -0
  352. package/src/presentation/ui/text-gradient.tsx +84 -0
  353. package/src/presentation/ui/textarea.tsx +18 -0
  354. package/src/presentation/ui/timeline-steps.tsx +235 -0
  355. package/src/presentation/ui/toggle-group.tsx +89 -0
  356. package/src/presentation/ui/toggle.tsx +47 -0
  357. package/src/presentation/ui/tooltip.tsx +57 -0
  358. package/src/presentation/uploading/index.tsx +3 -0
  359. package/src/presentation/uploading/media-upload-field.tsx +152 -0
  360. package/src/presentation/uploading/storage-media.tsx +210 -0
  361. package/src/styles.css +403 -0
  362. package/src/themes.css +1038 -0
@@ -0,0 +1,299 @@
1
+ "use client"
2
+
3
+ import {AppConfig} from "../../domain/config/app.config";
4
+ import {ActivityTrackerService} from "../../infrastructure/utilities/activity-tracker.service";
5
+ import {isTauri} from "../../infrastructure/utilities/tauri.util";
6
+ import {NotificationsApiService} from "./notifications-api-service";
7
+ import {NotificationsSocketService} from "./notifications-socket-service";
8
+
9
+ export class NotificationsPushService {
10
+
11
+ protected static swPath = "/sw.js";
12
+ protected static trackingStarted = false;
13
+ protected static visibilityHandler = (): void => undefined;
14
+ protected static stopTracking: (() => void) | undefined;
15
+ protected static pollingTimer: ReturnType<typeof setInterval> | undefined;
16
+ protected static seenNotificationIds = new Set<string>();
17
+
18
+ public static readonly PUSH_PREFERENCE_LABEL = "notifications_push_enabled";
19
+ protected static readonly SEEN_IDS_STORAGE_KEY = "liorian_push_seen_notification_ids";
20
+ protected static readonly SEEN_IDS_MAX = 200;
21
+ protected static readonly POLL_FALLBACK_INTERVAL = 30000;
22
+
23
+ static get isSupported(): boolean {
24
+ return typeof window !== "undefined"
25
+ && "serviceWorker" in navigator
26
+ && "PushManager" in window
27
+ && "Notification" in window;
28
+ }
29
+
30
+ static async register(): Promise<ServiceWorkerRegistration | undefined> {
31
+ if (!this.isSupported) return undefined;
32
+ return navigator.serviceWorker.register(this.swPath, {
33
+ scope: "/",
34
+ updateViaCache: "none",
35
+ });
36
+ }
37
+
38
+ static async getSubscription(): Promise<PushSubscription | null> {
39
+ if (!this.isSupported) return null;
40
+ const registration = await navigator.serviceWorker.ready;
41
+ return registration.pushManager.getSubscription();
42
+ }
43
+
44
+ static async subscribe(): Promise<PushSubscription | null> {
45
+ if (!this.isSupported) return null;
46
+
47
+ const permission = await Notification.requestPermission();
48
+ if (permission !== "granted") return null;
49
+
50
+ const registration = await navigator.serviceWorker.ready;
51
+ const existing = await registration.pushManager.getSubscription();
52
+ if (existing) return existing;
53
+
54
+ const subscription = await registration.pushManager.subscribe({
55
+ userVisibleOnly: true,
56
+ applicationServerKey: this.urlBase64ToUint8Array(AppConfig.VAPID_PUBLIC_KEY),
57
+ });
58
+
59
+ await this.saveSubscription(subscription);
60
+
61
+ return subscription;
62
+ }
63
+
64
+ static async unsubscribe(): Promise<boolean> {
65
+ const subscription = await this.getSubscription();
66
+ if (!subscription) return false;
67
+
68
+ await this.removeSubscription(subscription);
69
+
70
+ return subscription.unsubscribe();
71
+ }
72
+
73
+ static async connect(): Promise<void> {
74
+ NotificationsSocketService.connectNotifications();
75
+ }
76
+
77
+ static async getNotifications<T = any>(page = 1, limit = 10): Promise<T> {
78
+ return NotificationsSocketService.getUserNotifications<T>(page, limit);
79
+ }
80
+
81
+ static async getOrganizationNotifications<T = any>(organizationId?: string, page = 1, limit = 10): Promise<T> {
82
+ return NotificationsSocketService.getOrganizationNotifications<T>(organizationId, page, limit);
83
+ }
84
+
85
+ static get clientState() {
86
+ return {
87
+ active: ActivityTrackerService.isActive,
88
+ visible: document.visibilityState === "visible",
89
+ focused: document.hasFocus(),
90
+ };
91
+ }
92
+
93
+ static startActivityTracking(): void {
94
+ if (!this.isSupported || this.trackingStarted) return;
95
+
96
+ this.trackingStarted = true;
97
+ this.visibilityHandler = () => this.syncClientState();
98
+
99
+ // Souscription au tracker partagé : libérer cette souscription n'arrête
100
+ // PAS le suivi si un autre consommateur (verrouillage automatique) l'utilise.
101
+ this.stopTracking = ActivityTrackerService.start({onStateChange: () => this.syncClientState()});
102
+ document.addEventListener("visibilitychange", this.visibilityHandler);
103
+
104
+ this.syncClientState();
105
+ }
106
+
107
+ static stopActivityTracking(): void {
108
+ if (!this.trackingStarted) return;
109
+
110
+ this.trackingStarted = false;
111
+ document.removeEventListener("visibilitychange", this.visibilityHandler);
112
+
113
+ this.stopTracking?.();
114
+ this.stopTracking = undefined;
115
+ }
116
+
117
+ static onInAppNotification(callback: (payload: any) => void): () => void {
118
+ const handler = (event: MessageEvent) => {
119
+ if (event.data && event.data.type === "NOTIFICATION_RECEIVED") {
120
+ callback(event.data.payload);
121
+ }
122
+ };
123
+
124
+ navigator.serviceWorker.addEventListener("message", handler);
125
+
126
+ return () => navigator.serviceWorker.removeEventListener("message", handler);
127
+ }
128
+
129
+ static get isPolling(): boolean {
130
+ return this.pollingTimer !== undefined;
131
+ }
132
+
133
+ /**
134
+ * Canal de secours REST : interroge périodiquement les notifications non lues
135
+ * et affiche une notification native pour les nouvelles entrées.
136
+ * Utilisé lorsque le Web Push n'est pas disponible (ex: Tauri).
137
+ */
138
+ static async startPolling(): Promise<void> {
139
+ if (this.isPolling || typeof window === "undefined") return;
140
+
141
+ this.hydrateSeenIds();
142
+ await this.seedSeenIds();
143
+
144
+ this.pollingTimer = setInterval(() => {
145
+ void this.poll();
146
+ }, AppConfig.APP_REFRESH_UI || this.POLL_FALLBACK_INTERVAL);
147
+ }
148
+
149
+ static stopPolling(): void {
150
+ if (!this.pollingTimer) return;
151
+
152
+ clearInterval(this.pollingTimer);
153
+ this.pollingTimer = undefined;
154
+ }
155
+
156
+ protected static async seedSeenIds(): Promise<void> {
157
+ const notifications = await this.fetchUnreadNotifications().catch(() => []);
158
+ notifications.forEach((notification) => this.seenNotificationIds.add(notification.id));
159
+ }
160
+
161
+ protected static async poll(): Promise<void> {
162
+ try {
163
+ const notifications = await this.fetchUnreadNotifications();
164
+
165
+ if (!notifications.length) {
166
+ this.seenNotificationIds.clear();
167
+ return;
168
+ }
169
+
170
+ const fresh = notifications
171
+ .filter((notification) => !this.seenNotificationIds.has(notification.id))
172
+ .reverse();
173
+
174
+ this.seenNotificationIds.clear();
175
+ notifications.forEach((notification) => this.seenNotificationIds.add(notification.id));
176
+ this.persistSeenIds();
177
+
178
+ for (const notification of fresh) {
179
+ await this.displayNativeNotification(notification.title, notification.content);
180
+ }
181
+ } catch {
182
+ // Silencieux : le polling reprendra au prochain tick
183
+ }
184
+ }
185
+
186
+ protected static async fetchUnreadNotifications(): Promise<{ id: string, title?: string, content?: string }[]> {
187
+ if (typeof window === "undefined") return [];
188
+
189
+ const response = await NotificationsApiService.getAll({read: false, limit: 10});
190
+ const payload = response?.data as any;
191
+ const data = Array.isArray(payload)
192
+ ? payload
193
+ : Array.isArray(payload?.data) ? payload.data : [];
194
+
195
+ return data.filter((notification: any) => notification && notification.id);
196
+ }
197
+
198
+ protected static async displayNativeNotification(title?: string, body?: string): Promise<void> {
199
+ // Instance visible au premier plan : pas de notification système (le badge/popover suffit)
200
+ if (document.visibilityState === "visible" && document.hasFocus()) return;
201
+
202
+ const displayTitle = title || "Nouvelle notification";
203
+ const displayBody = body || "Vous avez reçu une nouvelle notification";
204
+
205
+ if (isTauri()) {
206
+ try {
207
+ const plugin = await import("@tauri-apps/plugin-notification");
208
+ if (!(await plugin.isPermissionGranted())) return;
209
+ await plugin.sendNotification({title: displayTitle, body: displayBody});
210
+ } catch {
211
+ // Plugin indisponible
212
+ }
213
+ return;
214
+ }
215
+
216
+ if (typeof Notification !== "undefined" && Notification.permission === "granted") {
217
+ new Notification(displayTitle, {body: displayBody, icon: "/assets/logo/icon.png"});
218
+ }
219
+ }
220
+
221
+ protected static hydrateSeenIds(): void {
222
+ try {
223
+ const raw = localStorage.getItem(this.SEEN_IDS_STORAGE_KEY);
224
+ const ids = raw ? JSON.parse(raw) : [];
225
+ if (Array.isArray(ids)) ids.forEach((id) => this.seenNotificationIds.add(String(id)));
226
+ } catch {
227
+ // Stockage indisponible
228
+ }
229
+ }
230
+
231
+ protected static persistSeenIds(): void {
232
+ try {
233
+ if (this.seenNotificationIds.size > this.SEEN_IDS_MAX) {
234
+ const keep = Array.from(this.seenNotificationIds).slice(-this.SEEN_IDS_MAX);
235
+ this.seenNotificationIds = new Set(keep);
236
+ }
237
+
238
+ localStorage.setItem(this.SEEN_IDS_STORAGE_KEY, JSON.stringify(Array.from(this.seenNotificationIds)));
239
+ } catch {
240
+ // Stockage indisponible
241
+ }
242
+ }
243
+
244
+ protected static syncClientState(): void {
245
+ const controller = navigator.serviceWorker.controller;
246
+ if (!controller) return;
247
+ controller.postMessage({type: "CLIENT_STATE", ...this.clientState});
248
+ }
249
+
250
+ protected static async saveSubscription(subscription: PushSubscription): Promise<void> {
251
+ const payload = {
252
+ endpoint: subscription.endpoint,
253
+ keys: {
254
+ p256dh: this.toBase64Url(subscription.getKey("p256dh")),
255
+ auth: this.toBase64Url(subscription.getKey("auth")),
256
+ },
257
+ };
258
+
259
+ try {
260
+ await NotificationsApiService.savePushSubscription(payload);
261
+ } catch (error) {
262
+ console.error("Push subscription could not be saved", error);
263
+ }
264
+ }
265
+
266
+ protected static async removeSubscription(subscription: PushSubscription): Promise<void> {
267
+ try {
268
+ await NotificationsApiService.removePushSubscription(subscription.endpoint);
269
+ } catch (error) {
270
+ console.error("Push subscription could not be removed", error);
271
+ }
272
+ }
273
+
274
+ protected static urlBase64ToUint8Array(base64String: string): Uint8Array<ArrayBuffer> {
275
+ const padding = "=".repeat((4 - (base64String.length % 4)) % 4);
276
+ const base64 = (base64String + padding).replace(/-/g, "+").replace(/_/g, "/");
277
+ const rawData = window.atob(base64);
278
+ const outputArray = new Uint8Array(rawData.length);
279
+
280
+ for (let i = 0; i < rawData.length; ++i) {
281
+ outputArray[i] = rawData.charCodeAt(i);
282
+ }
283
+
284
+ return outputArray;
285
+ }
286
+
287
+ protected static toBase64Url(buffer: ArrayBuffer | null): string {
288
+ if (!buffer) return "";
289
+
290
+ const bytes = new Uint8Array(buffer);
291
+ let binary = "";
292
+ for (let i = 0; i < bytes.length; ++i) {
293
+ binary += String.fromCharCode(bytes[i]);
294
+ }
295
+
296
+ return window.btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
297
+ }
298
+
299
+ }
@@ -0,0 +1,76 @@
1
+ "use client"
2
+
3
+ import {SocketService} from "../../infrastructure/utilities/socket-service";
4
+ import {AuthUserService} from "./auth-user.service";
5
+
6
+ export interface SocketNotificationResponse<T = any> {
7
+ message: string;
8
+ statusCode: number;
9
+ data: T;
10
+ }
11
+
12
+ export class NotificationsSocketService extends SocketService {
13
+
14
+ protected static _listening: boolean = false;
15
+ protected static _pending: Map<string, Array<(response: SocketNotificationResponse) => void>> = new Map();
16
+
17
+ static connectNotifications(): WebSocket {
18
+ const socket = this.instance;
19
+ if (socket && (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)) {
20
+ return socket;
21
+ }
22
+ return this.connect('/socket/notifications');
23
+ }
24
+
25
+ static getUserNotifications<T = any>(page = 1, limit = 10): Promise<T> {
26
+ return this.emit<T>('user-notifications', {page, limit});
27
+ }
28
+
29
+ static getOrganizationNotifications<T = any>(organizationId?: string, page = 1, limit = 10): Promise<T> {
30
+ return this.emit<T>('organization-notifications', organizationId
31
+ ? {organizationId, page, limit}
32
+ : {page, limit});
33
+ }
34
+
35
+ protected static emit<T = any>(event: string, extra?: Record<string, any>): Promise<T> {
36
+ return new Promise<T>((resolve, reject) => {
37
+ const token = AuthUserService.getToken();
38
+ if (!token) {
39
+ reject(new Error('Token manquant'));
40
+ return;
41
+ }
42
+
43
+ this.connectNotifications();
44
+ this.listen();
45
+
46
+ const queue = this._pending.get(event) ?? [];
47
+ queue.push((response) => {
48
+ if (response.statusCode === 200) resolve(response.data as T);
49
+ else reject(response);
50
+ });
51
+ this._pending.set(event, queue);
52
+
53
+ this.send({event, data: {token, ...extra}});
54
+ });
55
+ }
56
+
57
+ protected static listen(): void {
58
+ if (this._listening) return;
59
+ this._listening = true;
60
+ this.on('message', (payload) => this.resolve(payload));
61
+ }
62
+
63
+ protected static resolve(payload: any): void {
64
+ const response = payload as SocketNotificationResponse;
65
+ if (!response || typeof response !== 'object' || !('statusCode' in response)) return;
66
+
67
+ for (const [event, queue] of this._pending.entries()) {
68
+ const resolve = queue.shift();
69
+ if (!resolve) continue;
70
+ if (queue.length === 0) this._pending.delete(event);
71
+ resolve(response);
72
+ return;
73
+ }
74
+ }
75
+
76
+ }
@@ -0,0 +1,104 @@
1
+ import {ApiService} from "../../infrastructure/utilities/api-service";
2
+ import {FetchResponseInterface} from "../../domain/typing/response";
3
+ import {OrganizationApiAccessResponseInterface} from "../../domain/entities/organization.interface";
4
+
5
+ export class OrganizationsApiService extends ApiService {
6
+ // Organizations
7
+ static async create(payload: any) {
8
+ return await this.post('/organizations/', payload);
9
+ }
10
+
11
+ static async getAll() {
12
+ return await this.get('/organizations/');
13
+ }
14
+
15
+ static async getById(id: string) {
16
+ return await this.get(`/organizations/${id}`);
17
+ }
18
+
19
+ static async updateOrganization(id: string, payload: any) {
20
+ return await this.put(`/organizations/${id}`, payload);
21
+ }
22
+
23
+ static async deleteOrganization(id: string) {
24
+ return await this.delete(`/organizations/${id}`);
25
+ }
26
+
27
+ static async updateModules(id: string, modules: string[]) {
28
+ return await this.put(`/organizations/${id}/modules`, { modules });
29
+ }
30
+
31
+ static async getModulesList() {
32
+ return await this.get('/organizations/modules/list');
33
+ }
34
+
35
+ static async addMember(id: string, member: any) {
36
+ return await this.post(`/organizations/${id}/members`, member);
37
+ }
38
+
39
+ static async getMembers(id: string) {
40
+ return await this.get(`/organizations/${id}/members`);
41
+ }
42
+
43
+ static async removeMember(id: string, userId: string) {
44
+ return await this.delete(`/organizations/${id}/members/${userId}`);
45
+ }
46
+
47
+ static async createApiKey(id: string, data: any) {
48
+ return await this.post(`/organizations/${id}/api-keys`, data);
49
+ }
50
+
51
+ static async getApiKeys(id: string) {
52
+ return await this.get(`/organizations/${id}/api-keys`);
53
+ }
54
+
55
+ static async getApiAccess(id: string) {
56
+ return await this.get<FetchResponseInterface<OrganizationApiAccessResponseInterface>>(`/organizations/public/${id}/api/access`);
57
+ }
58
+
59
+ static async deleteApiKey(keyId: string) {
60
+ return await this.delete(`/organizations/api-keys/${keyId}`);
61
+ }
62
+
63
+ static async verifyApiKey(data: any) {
64
+ return await this.post('/organizations/api-keys/verify', data);
65
+ }
66
+
67
+ // Organization Preferences
68
+ static async createPreference(payload: any) {
69
+ return await this.post('/organization-preferences/', payload);
70
+ }
71
+
72
+ static async getAllPreferences() {
73
+ return await this.get('/organization-preferences/');
74
+ }
75
+
76
+ static async getPreferenceByOrgId(organizationId: string) {
77
+ return await this.get(`/organization-preferences/organization/${organizationId}`);
78
+ }
79
+
80
+ static async updatePreference(id: string, payload: any) {
81
+ return await this.put(`/organization-preferences/${id}`, payload);
82
+ }
83
+
84
+ static async deletePreference(id: string) {
85
+ return await this.delete(`/organization-preferences/${id}`);
86
+ }
87
+
88
+ // Organization Document Types
89
+ static async createDocumentType(payload: any) {
90
+ return await this.post('/organization-document-types/', payload);
91
+ }
92
+
93
+ static async getDocumentTypesByOrg(organizationId: string) {
94
+ return await this.get(`/organization-document-types/organization/${organizationId}`);
95
+ }
96
+
97
+ static async updateDocumentType(id: string, payload: any) {
98
+ return await this.put(`/organization-document-types/${id}`, payload);
99
+ }
100
+
101
+ static async deleteDocumentType(id: string) {
102
+ return await this.delete(`/organization-document-types/${id}`);
103
+ }
104
+ }
@@ -0,0 +1,11 @@
1
+ import {ApiService} from "../../infrastructure/utilities/api-service";
2
+
3
+ export class OtpApiService extends ApiService {
4
+ static async createOtp(payload: { phone: string; domain?: string }) {
5
+ return await this.post('/otp/create', payload);
6
+ }
7
+
8
+ static async validateOtp(payload: { phone: string; code: string; domain?: string }) {
9
+ return await this.post('/otp/validate', payload);
10
+ }
11
+ }
@@ -0,0 +1,77 @@
1
+ import {ApiService} from "../../infrastructure/utilities/api-service";
2
+ import {MediaLabelService} from "../../infrastructure/utilities/media-label.service";
3
+ import type {MediaSection, MediaUploadOptions} from "../../domain/entities/media";
4
+ import type {AxiosProgressEvent, AxiosRequestConfig} from "axios";
5
+
6
+ export class StorageApiService extends ApiService {
7
+ static async uploadFile(file: File, options?: MediaUploadOptions, onUploadProgress?: (progressEvent: AxiosProgressEvent) => void, config?: AxiosRequestConfig<any>) {
8
+ const formData = new FormData();
9
+ formData.append("file", file);
10
+ // Type déclaré par le navigateur : prioritaire sur le reniflement du
11
+ // parseur multipart côté API (cf. UploadFileDto.mimeType).
12
+ if (file.type) formData.append("mimeType", file.type);
13
+
14
+ if (options?.module) formData.append("module", options.module);
15
+ if (options?.type) formData.append("type", options.type);
16
+
17
+ const section: MediaSection = options?.isDocument
18
+ ? "document"
19
+ : (options?.section as MediaSection | undefined) ?? MediaLabelService.sectionFor({mime: file.type, extension: file.name.split(".").pop()});
20
+ const label = MediaLabelService.build(options?.module ?? "", section, options?.type);
21
+ formData.append("label", label);
22
+
23
+ return await super.upload('/storages/upload', formData, onUploadProgress, config);
24
+ }
25
+
26
+ static async getAll() {
27
+ return await this.get('/storages/');
28
+ }
29
+
30
+ static async getById(id: string) {
31
+ return await this.get(`/storages/${id}`);
32
+ }
33
+
34
+ static async updateStorage(id: string, payload: Record<string, any>) {
35
+ return await this.put(`/storages/${id}`, payload);
36
+ }
37
+
38
+ static async deleteStorage(id: string) {
39
+ return await this.delete(`/storages/${id}`);
40
+ }
41
+
42
+ static async getFile(id: string, config?: AxiosRequestConfig<any>) {
43
+ return await this.get(`/storages/${id}/file`, undefined, config);
44
+ }
45
+
46
+ static async getPublicFile(id: string) {
47
+ return await this.get(`/storages/public/${id}/file`);
48
+ }
49
+
50
+ static async createDocument(userId: string, payload: Record<string, any>) {
51
+ return await this.post(`/storages/documents/${userId}`, payload);
52
+ }
53
+
54
+ static async getDocumentsByUser(userId: string) {
55
+ return await this.get(`/storages/documents/${userId}`);
56
+ }
57
+
58
+ static async getDocument(userId: string, documentId: string) {
59
+ return await this.get(`/storages/documents/${userId}/${documentId}`);
60
+ }
61
+
62
+ static async updateDocument(userId: string, documentId: string, payload: Record<string, any>) {
63
+ return await this.put(`/storages/documents/${userId}/${documentId}`, payload);
64
+ }
65
+
66
+ static async deleteDocument(userId: string, documentId: string) {
67
+ return await this.delete(`/storages/documents/${userId}/${documentId}`);
68
+ }
69
+
70
+ static async hasDocument(type: string) {
71
+ return await this.get('/storages/documents/me/has-document', { type });
72
+ }
73
+
74
+ static async hasDocumentForUser(userId: string, type: string) {
75
+ return await this.get(`/storages/documents/${userId}/has-document`, { type });
76
+ }
77
+ }
@@ -0,0 +1,72 @@
1
+ import {ApiService} from "../../infrastructure/utilities/api-service";
2
+ import {AppConfig} from "../../domain/config/app.config";
3
+ import {FetchResponseInterface} from "../../domain/typing/response";
4
+ import {
5
+ CatalogCategoryInterface,
6
+ CatalogModuleInterface,
7
+ CreateCatalogCategoryPayloadInterface,
8
+ CreateCatalogModulePayloadInterface,
9
+ UpdateCatalogCategoryPayloadInterface,
10
+ UpdateCatalogModulePayloadInterface
11
+ } from "../../domain/entities/catalog.interface";
12
+
13
+ /**
14
+ * Service API du catalogue public (storefront).
15
+ *
16
+ * Cible `liorian-api-store` (base `/catalog`). Lecture publique du catalogue
17
+ * sans auth ; les mutations (fiche produit / catégorie) sont réservées au
18
+ * SuperAdmin (JWT partagé émis par core).
19
+ */
20
+ export class StorefrontApiService extends ApiService {
21
+
22
+ protected static baseUrl: string = (AppConfig.STORE_API_HOST || AppConfig.CORE_API_HOST) as string;
23
+
24
+ // ─── Catalogue : modules ────────────────────────────────────────
25
+
26
+ /** Récupérer tous les modules du catalogue */
27
+ static async getCatalogModules() {
28
+ return await this.get<FetchResponseInterface<CatalogModuleInterface[]>>('/catalog/modules');
29
+ }
30
+
31
+ /** Récupérer un module du catalogue par son ID */
32
+ static async getCatalogModule(moduleId: string) {
33
+ return await this.get<FetchResponseInterface<CatalogModuleInterface>>(`/catalog/modules/${moduleId}`);
34
+ }
35
+
36
+ /** Créer une fiche produit (SuperAdmin) */
37
+ static async createCatalogModule(payload: CreateCatalogModulePayloadInterface) {
38
+ return await this.post<FetchResponseInterface<CatalogModuleInterface>>('/catalog/modules', payload);
39
+ }
40
+
41
+ /** Mettre à jour une fiche produit (SuperAdmin) */
42
+ static async updateCatalogModule(moduleId: string, payload: UpdateCatalogModulePayloadInterface) {
43
+ return await this.put<FetchResponseInterface<CatalogModuleInterface>>(`/catalog/modules/${moduleId}`, payload);
44
+ }
45
+
46
+ /** Supprimer une fiche produit (SuperAdmin) */
47
+ static async deleteCatalogModule(moduleId: string) {
48
+ return await this.delete(`/catalog/modules/${moduleId}`);
49
+ }
50
+
51
+ // ─── Catalogue : catégories ─────────────────────────────────────
52
+
53
+ /** Récupérer toutes les catégories du catalogue */
54
+ static async getCatalogCategories() {
55
+ return await this.get<FetchResponseInterface<CatalogCategoryInterface[]>>('/catalog/categories');
56
+ }
57
+
58
+ /** Créer une catégorie (SuperAdmin) */
59
+ static async createCatalogCategory(payload: CreateCatalogCategoryPayloadInterface) {
60
+ return await this.post<FetchResponseInterface<CatalogCategoryInterface>>('/catalog/categories', payload);
61
+ }
62
+
63
+ /** Mettre à jour une catégorie (SuperAdmin) */
64
+ static async updateCatalogCategory(categoryId: string, payload: UpdateCatalogCategoryPayloadInterface) {
65
+ return await this.put<FetchResponseInterface<CatalogCategoryInterface>>(`/catalog/categories/${categoryId}`, payload);
66
+ }
67
+
68
+ /** Supprimer une catégorie (SuperAdmin) */
69
+ static async deleteCatalogCategory(categoryId: string) {
70
+ return await this.delete(`/catalog/categories/${categoryId}`);
71
+ }
72
+ }