@burdenoff/microfe-files 2026.1014.11 → 2026.1016.1

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 (215) hide show
  1. package/README.md +37 -0
  2. package/dist/config/index.js.map +1 -1
  3. package/dist/files/FilesRoot.js +17 -10
  4. package/dist/files/FilesRoot.js.map +1 -1
  5. package/dist/files/FilesRoutes.d.ts +1 -1
  6. package/dist/files/FilesRoutes.js.map +1 -1
  7. package/dist/files/components/ActionMenu.js.map +1 -1
  8. package/dist/files/components/ConfirmDialog.d.ts +1 -1
  9. package/dist/files/components/ConfirmDialog.js.map +1 -1
  10. package/dist/files/components/ContextMenu.d.ts +1 -1
  11. package/dist/files/components/ContextMenu.js.map +1 -1
  12. package/dist/files/components/CopyDialog.js.map +1 -1
  13. package/dist/files/components/EmptyState.d.ts +1 -1
  14. package/dist/files/components/EmptyState.js.map +1 -1
  15. package/dist/files/components/FileBrowser.js +2 -1
  16. package/dist/files/components/FileBrowser.js.map +1 -1
  17. package/dist/files/components/FileCard.d.ts.map +1 -1
  18. package/dist/files/components/FileCard.js +150 -142
  19. package/dist/files/components/FileCard.js.map +1 -1
  20. package/dist/files/components/FileInfoPanel.d.ts +1 -1
  21. package/dist/files/components/FileInfoPanel.d.ts.map +1 -1
  22. package/dist/files/components/FileInfoPanel.js +3 -7
  23. package/dist/files/components/FileInfoPanel.js.map +1 -1
  24. package/dist/files/components/FileListItem.d.ts.map +1 -1
  25. package/dist/files/components/FileListItem.js +1 -1
  26. package/dist/files/components/FileListItem.js.map +1 -1
  27. package/dist/files/components/FilePreviewModal.d.ts +1 -1
  28. package/dist/files/components/FilePreviewModal.d.ts.map +1 -1
  29. package/dist/files/components/FilePreviewModal.js +5 -0
  30. package/dist/files/components/FilePreviewModal.js.map +1 -1
  31. package/dist/files/components/FileVersionPanel.d.ts.map +1 -1
  32. package/dist/files/components/FileVersionPanel.js +122 -121
  33. package/dist/files/components/FileVersionPanel.js.map +1 -1
  34. package/dist/files/components/FolderCard.d.ts.map +1 -1
  35. package/dist/files/components/FolderCard.js +1 -1
  36. package/dist/files/components/FolderCard.js.map +1 -1
  37. package/dist/files/components/MoveDialog.js +2 -2
  38. package/dist/files/components/MoveDialog.js.map +1 -1
  39. package/dist/files/components/SearchBar.d.ts +1 -1
  40. package/dist/files/components/SearchBar.d.ts.map +1 -1
  41. package/dist/files/components/SearchBar.js +132 -128
  42. package/dist/files/components/SearchBar.js.map +1 -1
  43. package/dist/files/components/ShareDialog.d.ts +1 -1
  44. package/dist/files/components/ShareDialog.js.map +1 -1
  45. package/dist/files/components/StorageBanner.js.map +1 -1
  46. package/dist/files/components/TabBar.d.ts +1 -1
  47. package/dist/files/components/TabBar.js.map +1 -1
  48. package/dist/files/components/Toast.d.ts +1 -1
  49. package/dist/files/components/Toast.js.map +1 -1
  50. package/dist/files/components/UploadQueue.d.ts +1 -1
  51. package/dist/files/components/UploadQueue.js +1 -1
  52. package/dist/files/components/UploadQueue.js.map +1 -1
  53. package/dist/files/components/contextMenuItems.d.ts +4 -4
  54. package/dist/files/components/contextMenuItems.js.map +1 -1
  55. package/dist/files/components/viewers/AudioPlayer.d.ts +1 -1
  56. package/dist/files/components/viewers/AudioPlayer.js.map +1 -1
  57. package/dist/files/components/viewers/CodeViewer.d.ts +1 -1
  58. package/dist/files/components/viewers/CodeViewer.js.map +1 -1
  59. package/dist/files/components/viewers/ImageViewer.d.ts +1 -1
  60. package/dist/files/components/viewers/ImageViewer.js.map +1 -1
  61. package/dist/files/components/viewers/PDFViewer.d.ts +1 -1
  62. package/dist/files/components/viewers/PDFViewer.js.map +1 -1
  63. package/dist/files/components/viewers/TextViewer.d.ts +1 -1
  64. package/dist/files/components/viewers/TextViewer.js.map +1 -1
  65. package/dist/files/components/viewers/VideoPlayer.d.ts +1 -1
  66. package/dist/files/components/viewers/VideoPlayer.js.map +1 -1
  67. package/dist/files/graphql-types.d.ts +2 -17
  68. package/dist/files/graphql-types.d.ts.map +1 -1
  69. package/dist/files/hooks/useBatchOperations.d.ts +6 -1
  70. package/dist/files/hooks/useBatchOperations.d.ts.map +1 -1
  71. package/dist/files/hooks/useBatchOperations.js +8 -7
  72. package/dist/files/hooks/useBatchOperations.js.map +1 -1
  73. package/dist/files/hooks/useBinItems.d.ts.map +1 -1
  74. package/dist/files/hooks/useBinItems.js +14 -12
  75. package/dist/files/hooks/useBinItems.js.map +1 -1
  76. package/dist/files/hooks/useBrowsePage.d.ts +131 -8
  77. package/dist/files/hooks/useBrowsePage.d.ts.map +1 -1
  78. package/dist/files/hooks/useBrowsePage.js +23 -22
  79. package/dist/files/hooks/useBrowsePage.js.map +1 -1
  80. package/dist/files/hooks/useCopyFile.d.ts +22 -1
  81. package/dist/files/hooks/useCopyFile.d.ts.map +1 -1
  82. package/dist/files/hooks/useCopyFile.js +9 -8
  83. package/dist/files/hooks/useCopyFile.js.map +1 -1
  84. package/dist/files/hooks/useCreateFolder.d.ts +23 -1
  85. package/dist/files/hooks/useCreateFolder.d.ts.map +1 -1
  86. package/dist/files/hooks/useCreateFolder.js +16 -9
  87. package/dist/files/hooks/useCreateFolder.js.map +1 -1
  88. package/dist/files/hooks/useCreateFolderShare.d.ts +20 -1
  89. package/dist/files/hooks/useCreateFolderShare.d.ts.map +1 -1
  90. package/dist/files/hooks/useCreateFolderShare.js +22 -7
  91. package/dist/files/hooks/useCreateFolderShare.js.map +1 -1
  92. package/dist/files/hooks/useCreateShare.d.ts +19 -1
  93. package/dist/files/hooks/useCreateShare.d.ts.map +1 -1
  94. package/dist/files/hooks/useCreateShare.js +22 -7
  95. package/dist/files/hooks/useCreateShare.js.map +1 -1
  96. package/dist/files/hooks/useDeleteFile.d.ts +1 -1
  97. package/dist/files/hooks/useDeleteFile.d.ts.map +1 -1
  98. package/dist/files/hooks/useDeleteFile.js +8 -7
  99. package/dist/files/hooks/useDeleteFile.js.map +1 -1
  100. package/dist/files/hooks/useDeleteFolder.d.ts +1 -1
  101. package/dist/files/hooks/useDeleteFolder.d.ts.map +1 -1
  102. package/dist/files/hooks/useDeleteFolder.js +9 -8
  103. package/dist/files/hooks/useDeleteFolder.js.map +1 -1
  104. package/dist/files/hooks/useDragDrop.js.map +1 -1
  105. package/dist/files/hooks/useFileVersions.d.ts +36 -9
  106. package/dist/files/hooks/useFileVersions.d.ts.map +1 -1
  107. package/dist/files/hooks/useFileVersions.js +14 -13
  108. package/dist/files/hooks/useFileVersions.js.map +1 -1
  109. package/dist/files/hooks/useFoldersQuery.d.ts +8 -4
  110. package/dist/files/hooks/useFoldersQuery.d.ts.map +1 -1
  111. package/dist/files/hooks/useFoldersQuery.js +7 -6
  112. package/dist/files/hooks/useFoldersQuery.js.map +1 -1
  113. package/dist/files/hooks/useKeyboardNavigation.js +7 -8
  114. package/dist/files/hooks/useKeyboardNavigation.js.map +1 -1
  115. package/dist/files/hooks/useMoveFile.d.ts +22 -1
  116. package/dist/files/hooks/useMoveFile.d.ts.map +1 -1
  117. package/dist/files/hooks/useMoveFile.js +9 -8
  118. package/dist/files/hooks/useMoveFile.js.map +1 -1
  119. package/dist/files/hooks/useMoveFolder.d.ts +22 -1
  120. package/dist/files/hooks/useMoveFolder.d.ts.map +1 -1
  121. package/dist/files/hooks/useMoveFolder.js +9 -8
  122. package/dist/files/hooks/useMoveFolder.js.map +1 -1
  123. package/dist/files/hooks/usePermanentlyDeleteFile.d.ts +1 -1
  124. package/dist/files/hooks/usePermanentlyDeleteFile.d.ts.map +1 -1
  125. package/dist/files/hooks/usePermanentlyDeleteFile.js +8 -7
  126. package/dist/files/hooks/usePermanentlyDeleteFile.js.map +1 -1
  127. package/dist/files/hooks/usePermanentlyDeleteFolder.d.ts +1 -1
  128. package/dist/files/hooks/usePermanentlyDeleteFolder.d.ts.map +1 -1
  129. package/dist/files/hooks/usePermanentlyDeleteFolder.js +8 -7
  130. package/dist/files/hooks/usePermanentlyDeleteFolder.js.map +1 -1
  131. package/dist/files/hooks/useRecentFiles.d.ts.map +1 -1
  132. package/dist/files/hooks/useRecentFiles.js +13 -11
  133. package/dist/files/hooks/useRecentFiles.js.map +1 -1
  134. package/dist/files/hooks/useRenameFile.d.ts +22 -1
  135. package/dist/files/hooks/useRenameFile.d.ts.map +1 -1
  136. package/dist/files/hooks/useRenameFile.js +9 -8
  137. package/dist/files/hooks/useRenameFile.js.map +1 -1
  138. package/dist/files/hooks/useRenameFolder.d.ts +22 -1
  139. package/dist/files/hooks/useRenameFolder.d.ts.map +1 -1
  140. package/dist/files/hooks/useRenameFolder.js +9 -8
  141. package/dist/files/hooks/useRenameFolder.js.map +1 -1
  142. package/dist/files/hooks/useRestoreFile.d.ts +22 -1
  143. package/dist/files/hooks/useRestoreFile.d.ts.map +1 -1
  144. package/dist/files/hooks/useRestoreFile.js +8 -7
  145. package/dist/files/hooks/useRestoreFile.js.map +1 -1
  146. package/dist/files/hooks/useRestoreFolder.d.ts +22 -1
  147. package/dist/files/hooks/useRestoreFolder.d.ts.map +1 -1
  148. package/dist/files/hooks/useRestoreFolder.js +8 -7
  149. package/dist/files/hooks/useRestoreFolder.js.map +1 -1
  150. package/dist/files/hooks/useSearch.d.ts +2 -3
  151. package/dist/files/hooks/useSearch.d.ts.map +1 -1
  152. package/dist/files/hooks/useSearch.js +14 -12
  153. package/dist/files/hooks/useSearch.js.map +1 -1
  154. package/dist/files/hooks/useStarredItems.d.ts +2 -3
  155. package/dist/files/hooks/useStarredItems.d.ts.map +1 -1
  156. package/dist/files/hooks/useStarredItems.js +12 -10
  157. package/dist/files/hooks/useStarredItems.js.map +1 -1
  158. package/dist/files/hooks/useStorageQuota.d.ts.map +1 -1
  159. package/dist/files/hooks/useStorageQuota.js +17 -16
  160. package/dist/files/hooks/useStorageQuota.js.map +1 -1
  161. package/dist/files/hooks/useToast.js.map +1 -1
  162. package/dist/files/hooks/useToggleStar.d.ts +43 -1
  163. package/dist/files/hooks/useToggleStar.d.ts.map +1 -1
  164. package/dist/files/hooks/useToggleStar.js +9 -8
  165. package/dist/files/hooks/useToggleStar.js.map +1 -1
  166. package/dist/files/hooks/useUploadFile.d.ts +23 -1
  167. package/dist/files/hooks/useUploadFile.d.ts.map +1 -1
  168. package/dist/files/hooks/useUploadFile.js +28 -27
  169. package/dist/files/hooks/useUploadFile.js.map +1 -1
  170. package/dist/files/hooks/useUploadQueueState.d.ts +32 -0
  171. package/dist/files/hooks/useUploadQueueState.d.ts.map +1 -0
  172. package/dist/files/hooks/useUploadQueueState.js +61 -0
  173. package/dist/files/hooks/useUploadQueueState.js.map +1 -0
  174. package/dist/files/index.js +4 -3
  175. package/dist/files/pages/BrowserPage.d.ts +1 -1
  176. package/dist/files/pages/BrowserPage.d.ts.map +1 -1
  177. package/dist/files/pages/BrowserPage.js +383 -387
  178. package/dist/files/pages/BrowserPage.js.map +1 -1
  179. package/dist/files/pages/ShareAccessPage.d.ts +1 -1
  180. package/dist/files/pages/ShareAccessPage.js.map +1 -1
  181. package/dist/files/providers/FilesProvider.js.map +1 -1
  182. package/dist/files/store/filesStore.js.map +1 -1
  183. package/dist/files/types.d.ts.map +1 -1
  184. package/dist/files/utils/events.js.map +1 -1
  185. package/dist/files/utils/fileViewModel.d.ts +7 -0
  186. package/dist/files/utils/fileViewModel.d.ts.map +1 -0
  187. package/dist/files/utils/fileViewModel.js +34 -0
  188. package/dist/files/utils/fileViewModel.js.map +1 -0
  189. package/dist/files/utils/i18n.js.map +1 -1
  190. package/dist/files/utils/index.js +19 -19
  191. package/dist/files/utils/index.js.map +1 -1
  192. package/dist/files/utils/quotaUtils.js +1 -2
  193. package/dist/files/utils/thumbnail.js +19 -23
  194. package/dist/files/utils/thumbnail.js.map +1 -1
  195. package/dist/files/utils/uploadDigest.js +1 -1
  196. package/dist/files/utils/uploadDigest.js.map +1 -1
  197. package/dist/generated/global-operations.d.ts +4 -1
  198. package/dist/generated/global-operations.d.ts.map +1 -1
  199. package/dist/generated/global-types.d.ts +16 -21
  200. package/dist/generated/global-types.d.ts.map +1 -1
  201. package/dist/generated/wspace-operations.d.ts +503 -1784
  202. package/dist/generated/wspace-operations.d.ts.map +1 -1
  203. package/dist/generated/wspace-operations.js +15278 -1110
  204. package/dist/generated/wspace-operations.js.map +1 -1
  205. package/dist/generated/wspace-types.d.ts +90013 -24889
  206. package/dist/generated/wspace-types.d.ts.map +1 -1
  207. package/dist/generated/wspace-types.js +16 -0
  208. package/dist/generated/wspace-types.js.map +1 -0
  209. package/dist/index.d.ts +1 -1
  210. package/dist/index.d.ts.map +1 -1
  211. package/dist/shared/hooks/useTr.js.map +1 -1
  212. package/dist/translations/en.js.map +1 -1
  213. package/dist/utils/nativeBridge.js +1 -2
  214. package/package.json +24 -22
  215. package/dist/files.d.ts +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ShareAccessPage.js","names":[],"sources":["../../../src/files/pages/ShareAccessPage.tsx"],"sourcesContent":["import {\n type FormEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useLocation, useNavigate, useParams } from \"react-router\";\nimport { ArrowLeft, Loader2, Lock } from \"lucide-react\";\nimport { print } from \"graphql\";\nimport { AccessShareDocument } from \"../../generated/wspace-operations\";\nimport type {\n AccessShareMutation,\n AccessShareMutationVariables,\n} from \"../../generated/wspace-operations\";\nimport { buildGraphQLEndpoint, config } from \"../../config\";\nimport { FilePreviewModal } from \"../components/FilePreviewModal\";\nimport type { FileItem } from \"../types\";\nimport { useFilesContext } from \"../providers/FilesProvider\";\nimport { emitFilesEvent } from \"../utils/events\";\nimport { nativeImpact, nativeOpenUrl } from \"../../utils/nativeBridge\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { GlassCard, PagePurpose } from \"@burdenoff/fe-libs/ui\";\nimport { tWithFallback } from \"../utils/i18n\";\n\ntype GraphQLResponse<TData> = {\n data?: TData;\n errors?: Array<{ message?: string }>;\n};\n\nfunction resolveWorkspaceGraphQLEndpoint(apiGatewayUrl?: string): string {\n const configuredUrl = apiGatewayUrl || config.apiGatewayUrl;\n\n if (!configuredUrl) {\n throw new Error(\"Files API gateway URL is not configured\");\n }\n\n return configuredUrl.includes(\"/graphql\")\n ? configuredUrl\n : buildGraphQLEndpoint(configuredUrl, \"workspaces\");\n}\n\nasync function requestPublicGraphQL<TData, TVariables>(\n endpoint: string,\n query: string,\n variables: TVariables,\n): Promise<TData> {\n const response = await fetch(endpoint, {\n method: \"POST\",\n credentials: \"omit\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ query, variables }),\n });\n\n const payload = (await response.json()) as GraphQLResponse<TData>;\n const errorMessage = payload.errors?.[0]?.message;\n\n if (!response.ok || errorMessage || !payload.data) {\n throw new Error(errorMessage || \"Unable to access shared file\");\n }\n\n return payload.data;\n}\n\nfunction buildSharedFile(payload: {\n id: string;\n name: string;\n workspaceId: string;\n mimeType: string;\n size: string;\n s3Key: string;\n downloadUrl?: string | null;\n}): FileItem {\n const extension = payload.name.includes(\".\")\n ? payload.name.split(\".\").pop() || \"\"\n : \"\";\n\n return {\n id: payload.id,\n name: payload.name,\n workspaceId: payload.workspaceId,\n mimeType: payload.mimeType,\n extension,\n size: Number(payload.size),\n s3Key: payload.s3Key,\n url: payload.downloadUrl ?? \"\",\n downloadUrl: payload.downloadUrl ?? undefined,\n starred: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport function ShareAccessPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { pathname } = useLocation();\n const { token: routeToken } = useParams<{ token: string }>();\n const token = useMemo(() => {\n if (routeToken) {\n return routeToken;\n }\n\n const match = pathname.match(/\\/share\\/([^/]+)/);\n return match?.[1] ? decodeURIComponent(match[1]) : \"\";\n }, [pathname, routeToken]);\n const filesContext = useFilesContext();\n const { apiGatewayUrl } = filesContext;\n const endpoint = useMemo(\n () => resolveWorkspaceGraphQLEndpoint(apiGatewayUrl),\n [apiGatewayUrl],\n );\n const [loading, setLoading] = useState(false);\n const [password, setPassword] = useState(\"\");\n const [requiresPassword, setRequiresPassword] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [sharedFile, setSharedFile] = useState<FileItem | null>(null);\n\n const loadShare = useCallback(\n async (sharePassword?: string) => {\n if (!token) {\n throw new Error(\"Share token is missing\");\n }\n\n setLoading(true);\n\n try {\n const data = await requestPublicGraphQL<\n AccessShareMutation,\n AccessShareMutationVariables\n >(endpoint, print(AccessShareDocument), {\n input: {\n token,\n password: sharePassword || undefined,\n },\n });\n\n const payload = data.accessShare;\n if (!payload?.file || !payload.share) {\n throw new Error(payload?.message || \"Shared file is unavailable\");\n }\n\n setRequiresPassword(Boolean(payload.share.requiresPassword));\n setSharedFile(buildSharedFile(payload.file));\n setErrorMessage(null);\n } finally {\n setLoading(false);\n }\n },\n [endpoint, token],\n );\n\n useEffect(() => {\n loadShare().catch((error) => {\n const message =\n error instanceof Error ? error.message : \"Unable to access shared file\";\n setErrorMessage(message);\n setRequiresPassword(message.toLowerCase().includes(\"password\"));\n });\n }, [loadShare]);\n\n const handleDownload = async () => {\n if (!sharedFile) {\n return;\n }\n\n const downloadUrl = sharedFile.downloadUrl || sharedFile.url;\n if (downloadUrl) {\n nativeImpact(\"light\");\n await nativeOpenUrl(downloadUrl);\n emitFilesEvent(filesContext, \"files.share.downloaded\", {\n fileId: sharedFile.id,\n fileName: sharedFile.name,\n });\n }\n };\n\n const handlePasswordSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n try {\n await loadShare(password);\n } catch (error) {\n setErrorMessage(\n error instanceof Error ? error.message : \"Unable to unlock shared file\",\n );\n }\n };\n\n if (sharedFile) {\n return (\n <FilePreviewModal\n file={sharedFile}\n onClose={() => navigate(\"/files/browse\")}\n onDownload={handleDownload}\n />\n );\n }\n\n return (\n <div className=\"flex min-h-[70vh] items-center justify-center bg-hero-mesh px-4 py-10\">\n <GlassCard treatment=\"glass\" className=\"w-full max-w-md p-6\">\n <button\n type=\"button\"\n onClick={() => navigate(\"/files/browse\")}\n className=\"mb-6 inline-flex items-center gap-2 text-sm font-medium text-text-secondary transition-colors hover:text-text-primary\"\n >\n <ArrowLeft className=\"size-4\" />\n {tWithFallback(t, \"files.share.back\", \"Back to files\")}\n </button>\n\n <div className=\"mb-6\">\n <h1 className=\"text-xl font-semibold text-text-primary\">\n {tWithFallback(t, \"files.share.title\", \"Shared file access\")}\n </h1>\n <PagePurpose className=\"mt-2\">\n {tWithFallback(\n t,\n \"files.share.subtitle\",\n \"Someone shared a file with you via a link. Preview and download it here — if the link is password-protected, enter the password the sender gave you to unlock it.\",\n )}\n </PagePurpose>\n </div>\n\n {loading ? (\n <div className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-sunken px-4 py-3 text-sm text-text-secondary\">\n <Loader2 className=\"size-4 animate-spin text-action-primary-bg\" />\n {tWithFallback(\n t,\n \"files.share.verifying\",\n \"Verifying share access…\",\n )}\n </div>\n ) : requiresPassword ? (\n <form className=\"space-y-4\" onSubmit={handlePasswordSubmit}>\n <label className=\"block text-sm font-medium text-text-primary\">\n {tWithFallback(t, \"files.share.password.label\", \"Share password\")}\n <div className=\"mt-2 flex items-center gap-2 rounded-lg border border-border-seam px-3 py-2\">\n <Lock className=\"size-4 text-text-tertiary\" />\n <input\n type=\"password\"\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n aria-label={tWithFallback(\n t,\n \"files.share.password.label\",\n \"Share password\",\n )}\n className=\"w-full bg-transparent text-sm text-text-primary outline-none\"\n placeholder={tWithFallback(\n t,\n \"files.share.password.placeholder\",\n \"Enter the share password\",\n )}\n />\n </div>\n </label>\n\n {errorMessage && (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {errorMessage}\n </div>\n )}\n\n <button\n type=\"submit\"\n disabled={!password.trim()}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2.5 text-sm font-medium text-text-inverse transition-colors hover:bg-action-primary-bg-hover disabled:cursor-not-allowed disabled:bg-bg-sunken disabled:text-text-tertiary\"\n >\n {tWithFallback(t, \"files.share.unlock\", \"Unlock shared file\")}\n </button>\n </form>\n ) : (\n <div className=\"space-y-4\">\n {errorMessage && (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {errorMessage}\n </div>\n )}\n <button\n type=\"button\"\n onClick={() => loadShare()}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2.5 text-sm font-medium text-text-inverse transition-colors hover:bg-action-primary-bg-hover\"\n >\n {tWithFallback(\n t,\n \"files.share.retry\",\n \"Retry shared file access\",\n )}\n </button>\n </div>\n )}\n </GlassCard>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ShareAccessPage.js","names":["resolveWorkspaceGraphQLEndpoint","configuredUrl","apiGatewayUrl","config","buildGraphQLEndpoint","requestPublicGraphQL","response","endpoint","payload","errorMessage","buildSharedFile","extension","ShareAccessPage","useI18n","navigate","useNavigate","useLocation","routeToken","useParams","token","useMemo","match","pathname","filesContext","useFilesContext","loading","setLoading","useState","password","setPassword","requiresPassword","setRequiresPassword","setErrorMessage","sharedFile","setSharedFile","loadShare","useCallback","print","AccessShareDocument","sharePassword","useEffect","message","error","FilePreviewModal","downloadUrl","nativeImpact","nativeOpenUrl","emitFilesEvent","GlassCard","ArrowLeft","tWithFallback","t","PagePurpose","Loader2","Lock","event"],"sources":["../../../src/files/pages/ShareAccessPage.tsx"],"sourcesContent":["import {\n type FormEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useLocation, useNavigate, useParams } from \"react-router\";\nimport { ArrowLeft, Loader2, Lock } from \"lucide-react\";\nimport { print } from \"graphql\";\nimport { AccessShareDocument } from \"../../generated/wspace-operations\";\nimport type {\n AccessShareMutation,\n AccessShareMutationVariables,\n} from \"../../generated/wspace-operations\";\nimport { buildGraphQLEndpoint, config } from \"../../config\";\nimport { FilePreviewModal } from \"../components/FilePreviewModal\";\nimport type { FileItem } from \"../types\";\nimport { useFilesContext } from \"../providers/FilesProvider\";\nimport { emitFilesEvent } from \"../utils/events\";\nimport { nativeImpact, nativeOpenUrl } from \"../../utils/nativeBridge\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { GlassCard, PagePurpose } from \"@burdenoff/fe-libs/ui\";\nimport { tWithFallback } from \"../utils/i18n\";\n\ntype GraphQLResponse<TData> = {\n data?: TData;\n errors?: Array<{ message?: string }>;\n};\n\nfunction resolveWorkspaceGraphQLEndpoint(apiGatewayUrl?: string): string {\n const configuredUrl = apiGatewayUrl || config.apiGatewayUrl;\n\n if (!configuredUrl) {\n throw new Error(\"Files API gateway URL is not configured\");\n }\n\n return configuredUrl.includes(\"/graphql\")\n ? configuredUrl\n : buildGraphQLEndpoint(configuredUrl, \"workspaces\");\n}\n\nasync function requestPublicGraphQL<TData, TVariables>(\n endpoint: string,\n query: string,\n variables: TVariables,\n): Promise<TData> {\n const response = await fetch(endpoint, {\n method: \"POST\",\n credentials: \"omit\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ query, variables }),\n });\n\n const payload = (await response.json()) as GraphQLResponse<TData>;\n const errorMessage = payload.errors?.[0]?.message;\n\n if (!response.ok || errorMessage || !payload.data) {\n throw new Error(errorMessage || \"Unable to access shared file\");\n }\n\n return payload.data;\n}\n\nfunction buildSharedFile(payload: {\n id: string;\n name: string;\n workspaceId: string;\n mimeType: string;\n size: string;\n s3Key: string;\n downloadUrl?: string | null;\n}): FileItem {\n const extension = payload.name.includes(\".\")\n ? payload.name.split(\".\").pop() || \"\"\n : \"\";\n\n return {\n id: payload.id,\n name: payload.name,\n workspaceId: payload.workspaceId,\n mimeType: payload.mimeType,\n extension,\n size: Number(payload.size),\n s3Key: payload.s3Key,\n url: payload.downloadUrl ?? \"\",\n downloadUrl: payload.downloadUrl ?? undefined,\n starred: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport function ShareAccessPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { pathname } = useLocation();\n const { token: routeToken } = useParams<{ token: string }>();\n const token = useMemo(() => {\n if (routeToken) {\n return routeToken;\n }\n\n const match = pathname.match(/\\/share\\/([^/]+)/);\n return match?.[1] ? decodeURIComponent(match[1]) : \"\";\n }, [pathname, routeToken]);\n const filesContext = useFilesContext();\n const { apiGatewayUrl } = filesContext;\n const endpoint = useMemo(\n () => resolveWorkspaceGraphQLEndpoint(apiGatewayUrl),\n [apiGatewayUrl],\n );\n const [loading, setLoading] = useState(false);\n const [password, setPassword] = useState(\"\");\n const [requiresPassword, setRequiresPassword] = useState(false);\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [sharedFile, setSharedFile] = useState<FileItem | null>(null);\n\n const loadShare = useCallback(\n async (sharePassword?: string) => {\n if (!token) {\n throw new Error(\"Share token is missing\");\n }\n\n setLoading(true);\n\n try {\n const data = await requestPublicGraphQL<\n AccessShareMutation,\n AccessShareMutationVariables\n >(endpoint, print(AccessShareDocument), {\n input: {\n token,\n password: sharePassword || undefined,\n },\n });\n\n const payload = data.accessShare;\n if (!payload?.file || !payload.share) {\n throw new Error(payload?.message || \"Shared file is unavailable\");\n }\n\n setRequiresPassword(Boolean(payload.share.requiresPassword));\n setSharedFile(buildSharedFile(payload.file));\n setErrorMessage(null);\n } finally {\n setLoading(false);\n }\n },\n [endpoint, token],\n );\n\n useEffect(() => {\n loadShare().catch((error) => {\n const message =\n error instanceof Error ? error.message : \"Unable to access shared file\";\n setErrorMessage(message);\n setRequiresPassword(message.toLowerCase().includes(\"password\"));\n });\n }, [loadShare]);\n\n const handleDownload = async () => {\n if (!sharedFile) {\n return;\n }\n\n const downloadUrl = sharedFile.downloadUrl || sharedFile.url;\n if (downloadUrl) {\n nativeImpact(\"light\");\n await nativeOpenUrl(downloadUrl);\n emitFilesEvent(filesContext, \"files.share.downloaded\", {\n fileId: sharedFile.id,\n fileName: sharedFile.name,\n });\n }\n };\n\n const handlePasswordSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n try {\n await loadShare(password);\n } catch (error) {\n setErrorMessage(\n error instanceof Error ? error.message : \"Unable to unlock shared file\",\n );\n }\n };\n\n if (sharedFile) {\n return (\n <FilePreviewModal\n file={sharedFile}\n onClose={() => navigate(\"/files/browse\")}\n onDownload={handleDownload}\n />\n );\n }\n\n return (\n <div className=\"flex min-h-[70vh] items-center justify-center bg-hero-mesh px-4 py-10\">\n <GlassCard treatment=\"glass\" className=\"w-full max-w-md p-6\">\n <button\n type=\"button\"\n onClick={() => navigate(\"/files/browse\")}\n className=\"mb-6 inline-flex items-center gap-2 text-sm font-medium text-text-secondary transition-colors hover:text-text-primary\"\n >\n <ArrowLeft className=\"size-4\" />\n {tWithFallback(t, \"files.share.back\", \"Back to files\")}\n </button>\n\n <div className=\"mb-6\">\n <h1 className=\"text-xl font-semibold text-text-primary\">\n {tWithFallback(t, \"files.share.title\", \"Shared file access\")}\n </h1>\n <PagePurpose className=\"mt-2\">\n {tWithFallback(\n t,\n \"files.share.subtitle\",\n \"Someone shared a file with you via a link. Preview and download it here — if the link is password-protected, enter the password the sender gave you to unlock it.\",\n )}\n </PagePurpose>\n </div>\n\n {loading ? (\n <div className=\"flex items-center gap-3 rounded-lg border border-border-seam bg-bg-sunken px-4 py-3 text-sm text-text-secondary\">\n <Loader2 className=\"size-4 animate-spin text-action-primary-bg\" />\n {tWithFallback(\n t,\n \"files.share.verifying\",\n \"Verifying share access…\",\n )}\n </div>\n ) : requiresPassword ? (\n <form className=\"space-y-4\" onSubmit={handlePasswordSubmit}>\n <label className=\"block text-sm font-medium text-text-primary\">\n {tWithFallback(t, \"files.share.password.label\", \"Share password\")}\n <div className=\"mt-2 flex items-center gap-2 rounded-lg border border-border-seam px-3 py-2\">\n <Lock className=\"size-4 text-text-tertiary\" />\n <input\n type=\"password\"\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n aria-label={tWithFallback(\n t,\n \"files.share.password.label\",\n \"Share password\",\n )}\n className=\"w-full bg-transparent text-sm text-text-primary outline-none\"\n placeholder={tWithFallback(\n t,\n \"files.share.password.placeholder\",\n \"Enter the share password\",\n )}\n />\n </div>\n </label>\n\n {errorMessage && (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {errorMessage}\n </div>\n )}\n\n <button\n type=\"submit\"\n disabled={!password.trim()}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2.5 text-sm font-medium text-text-inverse transition-colors hover:bg-action-primary-bg-hover disabled:cursor-not-allowed disabled:bg-bg-sunken disabled:text-text-tertiary\"\n >\n {tWithFallback(t, \"files.share.unlock\", \"Unlock shared file\")}\n </button>\n </form>\n ) : (\n <div className=\"space-y-4\">\n {errorMessage && (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-2 text-sm text-status-error-text\">\n {errorMessage}\n </div>\n )}\n <button\n type=\"button\"\n onClick={() => loadShare()}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2.5 text-sm font-medium text-text-inverse transition-colors hover:bg-action-primary-bg-hover\"\n >\n {tWithFallback(\n t,\n \"files.share.retry\",\n \"Retry shared file access\",\n )}\n </button>\n </div>\n )}\n </GlassCard>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FilesProvider.js","names":[],"sources":["../../../src/files/providers/FilesProvider.tsx"],"sourcesContent":["import {\n type FC,\n type PropsWithChildren,\n createContext,\n useContext,\n} from \"react\";\nimport type { FilesRootProps } from \"../types\";\nimport { buildGraphQLEndpoint } from \"../../config\";\n\n/**\n * Context value for Files microfrontend\n */\ntype FilesContextValue = Omit<FilesRootProps, \"children\">;\n\nconst FilesContext = createContext<FilesContextValue | null>(null);\n\n/**\n * Hook to access Files context\n */\nexport const useFilesContext = () => {\n const context = useContext(FilesContext);\n if (!context) {\n throw new Error(\"useFilesContext must be used within FilesProvider\");\n }\n return context;\n};\n\n/**\n * Provider component for Files microfrontend\n * Sets up context for child components.\n *\n * NOTE: Apollo client is provided by the app shell's MultiGatewayProvider.\n * Files is a workspace-layer MFE; the shell's default ApolloProvider provides\n * the workspace client automatically. This MFE does NOT create its own client.\n *\n * SECURITY FIX: Previously injected x-actor-id, x-actor-type, x-workspace-id,\n * x-tenant-id headers from the frontend. These headers are now set by the API\n * Gateway after token validation — frontends must NOT set them directly.\n */\nexport const FilesProvider: FC<PropsWithChildren<FilesRootProps>> = ({\n children,\n ...props\n}) => {\n const contextValue: FilesContextValue = { ...props };\n\n return (\n <FilesContext.Provider value={contextValue}>\n {children}\n </FilesContext.Provider>\n );\n};\n"],"mappings":";;;AAcA,IAAM,IAAe,EAAwC,KAAK,EAKrD,UAAwB;CACnC,IAAM,IAAU,EAAW,EAAa;AACxC,KAAI,CAAC,EACH,OAAU,MAAM,oDAAoD;AAEtE,QAAO;GAeI,KAAwD,EACnE,aACA,GAAG,QACC;CACJ,IAAM,IAAkC,EAAE,GAAG,GAAO;AAEpD,QACE,kBAAC,EAAa,UAAd;EAAuB,OAAO;EAC3B;EACqB,CAAA"}
1
+ {"version":3,"file":"FilesProvider.js","names":["FilesContext","createContext","useFilesContext","context","useContext","FilesProvider","props","contextValue"],"sources":["../../../src/files/providers/FilesProvider.tsx"],"sourcesContent":["import {\n type FC,\n type PropsWithChildren,\n createContext,\n useContext,\n} from \"react\";\nimport type { FilesRootProps } from \"../types\";\nimport { buildGraphQLEndpoint } from \"../../config\";\n\n/**\n * Context value for Files microfrontend\n */\ntype FilesContextValue = Omit<FilesRootProps, \"children\">;\n\nconst FilesContext = createContext<FilesContextValue | null>(null);\n\n/**\n * Hook to access Files context\n */\nexport const useFilesContext = () => {\n const context = useContext(FilesContext);\n if (!context) {\n throw new Error(\"useFilesContext must be used within FilesProvider\");\n }\n return context;\n};\n\n/**\n * Provider component for Files microfrontend\n * Sets up context for child components.\n *\n * NOTE: Apollo client is provided by the app shell's MultiGatewayProvider.\n * Files is a workspace-layer MFE; the shell's default ApolloProvider provides\n * the workspace client automatically. This MFE does NOT create its own client.\n *\n * SECURITY FIX: Previously injected x-actor-id, x-actor-type, x-workspace-id,\n * x-tenant-id headers from the frontend. These headers are now set by the API\n * Gateway after token validation — frontends must NOT set them directly.\n */\nexport const FilesProvider: FC<PropsWithChildren<FilesRootProps>> = ({\n children,\n ...props\n}) => {\n const contextValue: FilesContextValue = { ...props };\n\n return (\n <FilesContext.Provider value={contextValue}>\n {children}\n </FilesContext.Provider>\n );\n};\n"],"mappings":";;;AAcA,IAAMA,IAAeC,EAAwC,IAAI,GAKpDC,UAAwB;CACnC,IAAMC,IAAUC,EAAWJ,CAAY;CACvC,IAAI,CAACG,GACH,MAAU,MAAM,mDAAmD;CAErE,OAAOA;AACT,GAcaE,KAAwD,EACnE,aACA,GAAGC,QACC;CACJ,IAAMC,IAAkC,EAAE,GAAGD,EAAM;CAEnD,OACE,kBAACN,EAAa,UAAd;EAAuB,OAAOO;EAC3B;CACoB,CAAA;AAE3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"filesStore.js","names":[],"sources":["../../../src/files/store/filesStore.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools, persist } from \"zustand/middleware\";\nimport { createProfileScopedStorage } from \"@burdenoff/fe-libs/shared/utils\";\nimport type {\n FileViewMode,\n FileSortBy,\n FileSortDirection,\n FolderItem,\n FileItem,\n UploadItem,\n FileFilters,\n} from \"../types\";\n\ninterface FilesState {\n // View state\n currentFolder: FolderItem | null;\n viewMode: FileViewMode;\n sortBy: FileSortBy;\n sortDirection: FileSortDirection;\n\n // Selection state\n selectedFiles: Set<string>;\n selectedFolders: Set<string>;\n\n // Upload state\n uploadQueue: UploadItem[];\n isUploadPanelOpen: boolean;\n\n // Preview state\n previewFile: FileItem | null;\n isPreviewOpen: boolean;\n\n // Filter state\n filters: FileFilters;\n\n // Breadcrumb state\n breadcrumbs: Array<{ id: string; name: string }>;\n\n // UI state\n isSidebarOpen: boolean;\n isShareDialogOpen: boolean;\n shareDialogFile: FileItem | null;\n\n // Actions - Folder navigation\n setCurrentFolder: (folder: FolderItem | null) => void;\n setBreadcrumbs: (breadcrumbs: Array<{ id: string; name: string }>) => void;\n navigateToFolder: (folderId: string, folderName: string) => void;\n navigateUp: () => void;\n navigateToRoot: () => void;\n\n // Actions - View\n setViewMode: (mode: FileViewMode) => void;\n setSortBy: (sortBy: FileSortBy) => void;\n toggleSortDirection: () => void;\n\n // Actions - Selection\n selectFile: (fileId: string) => void;\n deselectFile: (fileId: string) => void;\n toggleFileSelection: (fileId: string) => void;\n selectAllFiles: (fileIds: string[]) => void;\n clearFileSelection: () => void;\n selectFolder: (folderId: string) => void;\n deselectFolder: (folderId: string) => void;\n toggleFolderSelection: (folderId: string) => void;\n selectAllFolders: (folderIds: string[]) => void;\n clearSelection: () => void;\n\n // Actions - Upload\n addToUploadQueue: (items: UploadItem[]) => void;\n updateUploadItem: (id: string, updates: Partial<UploadItem>) => void;\n removeFromUploadQueue: (id: string) => void;\n clearUploadQueue: () => void;\n setUploadPanelOpen: (open: boolean) => void;\n\n // Actions - Preview\n openPreview: (file: FileItem) => void;\n closePreview: () => void;\n previewNextFile: (files: FileItem[]) => void;\n previewPreviousFile: (files: FileItem[]) => void;\n\n // Actions - Filters\n setFilters: (filters: Partial<FileFilters>) => void;\n clearFilters: () => void;\n\n // Actions - UI\n toggleSidebar: () => void;\n setSidebarOpen: (open: boolean) => void;\n openShareDialog: (file: FileItem) => void;\n closeShareDialog: () => void;\n\n // Actions - Reset\n reset: () => void;\n}\n\nconst initialState = {\n currentFolder: null,\n viewMode: \"grid\" as FileViewMode,\n sortBy: \"date\" as FileSortBy,\n sortDirection: \"desc\" as FileSortDirection,\n selectedFiles: new Set<string>(),\n selectedFolders: new Set<string>(),\n uploadQueue: [],\n isUploadPanelOpen: false,\n previewFile: null,\n isPreviewOpen: false,\n filters: {},\n breadcrumbs: [],\n isSidebarOpen: true,\n isShareDialogOpen: false,\n shareDialogFile: null,\n};\n\nexport const useFilesStore = create<FilesState>()(\n devtools(\n persist(\n (set, get) => ({\n ...initialState,\n\n // Folder navigation\n setCurrentFolder: (folder) => set({ currentFolder: folder }),\n\n setBreadcrumbs: (breadcrumbs) => set({ breadcrumbs }),\n\n navigateToFolder: (folderId, folderName) =>\n set((state) => ({\n breadcrumbs: [\n ...state.breadcrumbs,\n { id: folderId, name: folderName },\n ],\n })),\n\n navigateUp: () =>\n set((state) => ({\n breadcrumbs: state.breadcrumbs.slice(0, -1),\n })),\n\n navigateToRoot: () =>\n set({\n breadcrumbs: [],\n currentFolder: null,\n }),\n\n // View\n setViewMode: (mode) => set({ viewMode: mode }),\n setSortBy: (sortBy) => set({ sortBy }),\n toggleSortDirection: () =>\n set((state) => ({\n sortDirection: state.sortDirection === \"asc\" ? \"desc\" : \"asc\",\n })),\n\n // Selection\n selectFile: (fileId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFiles);\n newSelected.add(fileId);\n return { selectedFiles: newSelected };\n }),\n\n deselectFile: (fileId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFiles);\n newSelected.delete(fileId);\n return { selectedFiles: newSelected };\n }),\n\n toggleFileSelection: (fileId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFiles);\n if (newSelected.has(fileId)) {\n newSelected.delete(fileId);\n } else {\n newSelected.add(fileId);\n }\n return { selectedFiles: newSelected };\n }),\n\n selectAllFiles: (fileIds) => set({ selectedFiles: new Set(fileIds) }),\n\n clearFileSelection: () => set({ selectedFiles: new Set() }),\n\n selectFolder: (folderId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFolders);\n newSelected.add(folderId);\n return { selectedFolders: newSelected };\n }),\n\n deselectFolder: (folderId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFolders);\n newSelected.delete(folderId);\n return { selectedFolders: newSelected };\n }),\n\n toggleFolderSelection: (folderId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFolders);\n if (newSelected.has(folderId)) {\n newSelected.delete(folderId);\n } else {\n newSelected.add(folderId);\n }\n return { selectedFolders: newSelected };\n }),\n\n selectAllFolders: (folderIds) =>\n set({ selectedFolders: new Set(folderIds) }),\n\n clearSelection: () =>\n set({\n selectedFiles: new Set(),\n selectedFolders: new Set(),\n }),\n\n // Upload\n addToUploadQueue: (items) =>\n set((state) => ({\n uploadQueue: [...state.uploadQueue, ...items],\n isUploadPanelOpen: true,\n })),\n\n updateUploadItem: (id, updates) =>\n set((state) => ({\n uploadQueue: state.uploadQueue.map((item) =>\n item.id === id ? { ...item, ...updates } : item,\n ),\n })),\n\n removeFromUploadQueue: (id) =>\n set((state) => ({\n uploadQueue: state.uploadQueue.filter((item) => item.id !== id),\n })),\n\n clearUploadQueue: () => set({ uploadQueue: [] }),\n\n setUploadPanelOpen: (open) => set({ isUploadPanelOpen: open }),\n\n // Preview\n openPreview: (file) =>\n set({\n previewFile: file,\n isPreviewOpen: true,\n }),\n\n closePreview: () =>\n set({\n previewFile: null,\n isPreviewOpen: false,\n }),\n\n previewNextFile: (files) =>\n set((state) => {\n if (!state.previewFile) return {};\n const currentIndex = files.findIndex(\n (f) => f.id === state.previewFile?.id,\n );\n const nextIndex = currentIndex + 1;\n if (nextIndex < files.length) {\n return { previewFile: files[nextIndex] };\n }\n return {};\n }),\n\n previewPreviousFile: (files) =>\n set((state) => {\n if (!state.previewFile) return {};\n const currentIndex = files.findIndex(\n (f) => f.id === state.previewFile?.id,\n );\n const prevIndex = currentIndex - 1;\n if (prevIndex >= 0) {\n return { previewFile: files[prevIndex] };\n }\n return {};\n }),\n\n // Filters\n setFilters: (filters) =>\n set((state) => ({\n filters: { ...state.filters, ...filters },\n })),\n\n clearFilters: () => set({ filters: {} }),\n\n // UI\n toggleSidebar: () =>\n set((state) => ({ isSidebarOpen: !state.isSidebarOpen })),\n\n setSidebarOpen: (open) => set({ isSidebarOpen: open }),\n\n openShareDialog: (file) =>\n set({\n isShareDialogOpen: true,\n shareDialogFile: file,\n }),\n\n closeShareDialog: () =>\n set({\n isShareDialogOpen: false,\n shareDialogFile: null,\n }),\n\n // Reset\n reset: () => set(initialState),\n }),\n {\n name: \"burdenoff-files-storage\",\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n viewMode: state.viewMode,\n sortBy: state.sortBy,\n sortDirection: state.sortDirection,\n isSidebarOpen: state.isSidebarOpen,\n }),\n },\n ),\n { name: \"Files Store\", enabled: import.meta.env.DEV },\n ),\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"filesStore.js","names":["initialState","useFilesStore","create","devtools","persist","set","folder","state","folderId","folderName","mode","newSelected","fileId","fileIds","folderIds","items","item","id","updates","open","file","nextIndex","files","f","prevIndex","filters","createProfileScopedStorage"],"sources":["../../../src/files/store/filesStore.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools, persist } from \"zustand/middleware\";\nimport { createProfileScopedStorage } from \"@burdenoff/fe-libs/shared/utils\";\nimport type {\n FileViewMode,\n FileSortBy,\n FileSortDirection,\n FolderItem,\n FileItem,\n UploadItem,\n FileFilters,\n} from \"../types\";\n\ninterface FilesState {\n // View state\n currentFolder: FolderItem | null;\n viewMode: FileViewMode;\n sortBy: FileSortBy;\n sortDirection: FileSortDirection;\n\n // Selection state\n selectedFiles: Set<string>;\n selectedFolders: Set<string>;\n\n // Upload state\n uploadQueue: UploadItem[];\n isUploadPanelOpen: boolean;\n\n // Preview state\n previewFile: FileItem | null;\n isPreviewOpen: boolean;\n\n // Filter state\n filters: FileFilters;\n\n // Breadcrumb state\n breadcrumbs: Array<{ id: string; name: string }>;\n\n // UI state\n isSidebarOpen: boolean;\n isShareDialogOpen: boolean;\n shareDialogFile: FileItem | null;\n\n // Actions - Folder navigation\n setCurrentFolder: (folder: FolderItem | null) => void;\n setBreadcrumbs: (breadcrumbs: Array<{ id: string; name: string }>) => void;\n navigateToFolder: (folderId: string, folderName: string) => void;\n navigateUp: () => void;\n navigateToRoot: () => void;\n\n // Actions - View\n setViewMode: (mode: FileViewMode) => void;\n setSortBy: (sortBy: FileSortBy) => void;\n toggleSortDirection: () => void;\n\n // Actions - Selection\n selectFile: (fileId: string) => void;\n deselectFile: (fileId: string) => void;\n toggleFileSelection: (fileId: string) => void;\n selectAllFiles: (fileIds: string[]) => void;\n clearFileSelection: () => void;\n selectFolder: (folderId: string) => void;\n deselectFolder: (folderId: string) => void;\n toggleFolderSelection: (folderId: string) => void;\n selectAllFolders: (folderIds: string[]) => void;\n clearSelection: () => void;\n\n // Actions - Upload\n addToUploadQueue: (items: UploadItem[]) => void;\n updateUploadItem: (id: string, updates: Partial<UploadItem>) => void;\n removeFromUploadQueue: (id: string) => void;\n clearUploadQueue: () => void;\n setUploadPanelOpen: (open: boolean) => void;\n\n // Actions - Preview\n openPreview: (file: FileItem) => void;\n closePreview: () => void;\n previewNextFile: (files: FileItem[]) => void;\n previewPreviousFile: (files: FileItem[]) => void;\n\n // Actions - Filters\n setFilters: (filters: Partial<FileFilters>) => void;\n clearFilters: () => void;\n\n // Actions - UI\n toggleSidebar: () => void;\n setSidebarOpen: (open: boolean) => void;\n openShareDialog: (file: FileItem) => void;\n closeShareDialog: () => void;\n\n // Actions - Reset\n reset: () => void;\n}\n\nconst initialState = {\n currentFolder: null,\n viewMode: \"grid\" as FileViewMode,\n sortBy: \"date\" as FileSortBy,\n sortDirection: \"desc\" as FileSortDirection,\n selectedFiles: new Set<string>(),\n selectedFolders: new Set<string>(),\n uploadQueue: [],\n isUploadPanelOpen: false,\n previewFile: null,\n isPreviewOpen: false,\n filters: {},\n breadcrumbs: [],\n isSidebarOpen: true,\n isShareDialogOpen: false,\n shareDialogFile: null,\n};\n\nexport const useFilesStore = create<FilesState>()(\n devtools(\n persist(\n (set, get) => ({\n ...initialState,\n\n // Folder navigation\n setCurrentFolder: (folder) => set({ currentFolder: folder }),\n\n setBreadcrumbs: (breadcrumbs) => set({ breadcrumbs }),\n\n navigateToFolder: (folderId, folderName) =>\n set((state) => ({\n breadcrumbs: [\n ...state.breadcrumbs,\n { id: folderId, name: folderName },\n ],\n })),\n\n navigateUp: () =>\n set((state) => ({\n breadcrumbs: state.breadcrumbs.slice(0, -1),\n })),\n\n navigateToRoot: () =>\n set({\n breadcrumbs: [],\n currentFolder: null,\n }),\n\n // View\n setViewMode: (mode) => set({ viewMode: mode }),\n setSortBy: (sortBy) => set({ sortBy }),\n toggleSortDirection: () =>\n set((state) => ({\n sortDirection: state.sortDirection === \"asc\" ? \"desc\" : \"asc\",\n })),\n\n // Selection\n selectFile: (fileId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFiles);\n newSelected.add(fileId);\n return { selectedFiles: newSelected };\n }),\n\n deselectFile: (fileId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFiles);\n newSelected.delete(fileId);\n return { selectedFiles: newSelected };\n }),\n\n toggleFileSelection: (fileId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFiles);\n if (newSelected.has(fileId)) {\n newSelected.delete(fileId);\n } else {\n newSelected.add(fileId);\n }\n return { selectedFiles: newSelected };\n }),\n\n selectAllFiles: (fileIds) => set({ selectedFiles: new Set(fileIds) }),\n\n clearFileSelection: () => set({ selectedFiles: new Set() }),\n\n selectFolder: (folderId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFolders);\n newSelected.add(folderId);\n return { selectedFolders: newSelected };\n }),\n\n deselectFolder: (folderId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFolders);\n newSelected.delete(folderId);\n return { selectedFolders: newSelected };\n }),\n\n toggleFolderSelection: (folderId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFolders);\n if (newSelected.has(folderId)) {\n newSelected.delete(folderId);\n } else {\n newSelected.add(folderId);\n }\n return { selectedFolders: newSelected };\n }),\n\n selectAllFolders: (folderIds) =>\n set({ selectedFolders: new Set(folderIds) }),\n\n clearSelection: () =>\n set({\n selectedFiles: new Set(),\n selectedFolders: new Set(),\n }),\n\n // Upload\n addToUploadQueue: (items) =>\n set((state) => ({\n uploadQueue: [...state.uploadQueue, ...items],\n isUploadPanelOpen: true,\n })),\n\n updateUploadItem: (id, updates) =>\n set((state) => ({\n uploadQueue: state.uploadQueue.map((item) =>\n item.id === id ? { ...item, ...updates } : item,\n ),\n })),\n\n removeFromUploadQueue: (id) =>\n set((state) => ({\n uploadQueue: state.uploadQueue.filter((item) => item.id !== id),\n })),\n\n clearUploadQueue: () => set({ uploadQueue: [] }),\n\n setUploadPanelOpen: (open) => set({ isUploadPanelOpen: open }),\n\n // Preview\n openPreview: (file) =>\n set({\n previewFile: file,\n isPreviewOpen: true,\n }),\n\n closePreview: () =>\n set({\n previewFile: null,\n isPreviewOpen: false,\n }),\n\n previewNextFile: (files) =>\n set((state) => {\n if (!state.previewFile) return {};\n const currentIndex = files.findIndex(\n (f) => f.id === state.previewFile?.id,\n );\n const nextIndex = currentIndex + 1;\n if (nextIndex < files.length) {\n return { previewFile: files[nextIndex] };\n }\n return {};\n }),\n\n previewPreviousFile: (files) =>\n set((state) => {\n if (!state.previewFile) return {};\n const currentIndex = files.findIndex(\n (f) => f.id === state.previewFile?.id,\n );\n const prevIndex = currentIndex - 1;\n if (prevIndex >= 0) {\n return { previewFile: files[prevIndex] };\n }\n return {};\n }),\n\n // Filters\n setFilters: (filters) =>\n set((state) => ({\n filters: { ...state.filters, ...filters },\n })),\n\n clearFilters: () => set({ filters: {} }),\n\n // UI\n toggleSidebar: () =>\n set((state) => ({ isSidebarOpen: !state.isSidebarOpen })),\n\n setSidebarOpen: (open) => set({ isSidebarOpen: open }),\n\n openShareDialog: (file) =>\n set({\n isShareDialogOpen: true,\n shareDialogFile: file,\n }),\n\n closeShareDialog: () =>\n set({\n isShareDialogOpen: false,\n shareDialogFile: null,\n }),\n\n // Reset\n reset: () => set(initialState),\n }),\n {\n name: \"burdenoff-files-storage\",\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n viewMode: state.viewMode,\n sortBy: state.sortBy,\n sortDirection: state.sortDirection,\n isSidebarOpen: state.isSidebarOpen,\n }),\n },\n ),\n { name: \"Files Store\", enabled: import.meta.env.DEV },\n ),\n);\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/files/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/files/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","names":[],"sources":["../../../src/files/utils/events.ts"],"sourcesContent":["import type { FilesRootProps } from \"../types\";\n\nexport type FilesEventName =\n | \"files.file.uploaded\"\n | \"files.file.deleted\"\n | \"files.file.restored\"\n | \"files.file.downloaded\"\n | \"files.file.starred\"\n | \"files.file.moved\"\n | \"files.file.copied\"\n | \"files.file.renamed\"\n | \"files.folder.created\"\n | \"files.folder.deleted\"\n | \"files.folder.restored\"\n | \"files.folder.starred\"\n | \"files.folder.moved\"\n | \"files.folder.renamed\"\n | \"files.share.created\"\n | \"files.share.downloaded\"\n | \"files.api.failed\";\n\ntype FilesEventPayload = Record<string, unknown>;\n\nexport function emitFilesEvent(\n context: Pick<FilesRootProps, \"eventBus\" | \"workspaceId\">,\n name: FilesEventName,\n payload: FilesEventPayload = {},\n): void {\n const eventPayload = {\n workspaceId: context.workspaceId,\n ...payload,\n };\n\n context.eventBus?.emit?.(name, eventPayload);\n\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent(\"burdenoff:mfe-event\", {\n detail: {\n name,\n source: { mfe: \"microfe-files\" },\n payload: eventPayload,\n },\n }),\n );\n }\n}\n"],"mappings":";AAuBA,SAAgB,EACd,GACA,GACA,IAA6B,EAAE,EACzB;CACN,IAAM,IAAe;EACnB,aAAa,EAAQ;EACrB,GAAG;EACJ;AAID,CAFA,EAAQ,UAAU,OAAO,GAAM,EAAa,EAExC,OAAO,SAAW,OACpB,OAAO,cACL,IAAI,YAAY,uBAAuB,EACrC,QAAQ;EACN;EACA,QAAQ,EAAE,KAAK,iBAAiB;EAChC,SAAS;EACV,EACF,CAAC,CACH"}
1
+ {"version":3,"file":"events.js","names":["emitFilesEvent","eventPayload","context","payload","name"],"sources":["../../../src/files/utils/events.ts"],"sourcesContent":["import type { FilesRootProps } from \"../types\";\n\nexport type FilesEventName =\n | \"files.file.uploaded\"\n | \"files.file.deleted\"\n | \"files.file.restored\"\n | \"files.file.downloaded\"\n | \"files.file.starred\"\n | \"files.file.moved\"\n | \"files.file.copied\"\n | \"files.file.renamed\"\n | \"files.folder.created\"\n | \"files.folder.deleted\"\n | \"files.folder.restored\"\n | \"files.folder.starred\"\n | \"files.folder.moved\"\n | \"files.folder.renamed\"\n | \"files.share.created\"\n | \"files.share.downloaded\"\n | \"files.api.failed\";\n\ntype FilesEventPayload = Record<string, unknown>;\n\nexport function emitFilesEvent(\n context: Pick<FilesRootProps, \"eventBus\" | \"workspaceId\">,\n name: FilesEventName,\n payload: FilesEventPayload = {},\n): void {\n const eventPayload = {\n workspaceId: context.workspaceId,\n ...payload,\n };\n\n context.eventBus?.emit?.(name, eventPayload);\n\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent(\"burdenoff:mfe-event\", {\n detail: {\n name,\n source: { mfe: \"microfe-files\" },\n payload: eventPayload,\n },\n }),\n );\n }\n}\n"],"mappings":";AAuBA,SAAgBA,EACd,GACA,GACA,IAA6B,CAAC,GACxB;CACN,IAAMC,IAAe;EACnB,aAAaC,EAAQ;EACrB,GAAGC;CACL;CAIA,AAFAD,EAAQ,UAAU,OAAOE,GAAMH,CAAY,GAEvC,OAAO,SAAW,OACpB,OAAO,cACL,IAAI,YAAY,uBAAuB,EACrC,QAAQ;EACN;EACA,QAAQ,EAAE,KAAK,gBAAgB;EAC/B,SAASA;CACX,EACF,CAAC,CACH;AAEJ"}
@@ -0,0 +1,7 @@
1
+ import { FileCard_FileFragment, FilePreviewModal_FileFragment, FolderCard_FolderFragment } from '../../generated/wspace-operations';
2
+ import { FileItem, FolderItem } from '../types';
3
+ /** Browser sizes use numbers; refuse an unrepresentable BigInt rather than round it. */
4
+ export declare function browserFileSize(size: string): number;
5
+ export declare function fileViewModel(file: FileCard_FileFragment & FilePreviewModal_FileFragment): FileItem;
6
+ export declare function folderViewModel(folder: FolderCard_FolderFragment): FolderItem;
7
+ //# sourceMappingURL=fileViewModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileViewModel.d.ts","sourceRoot":"","sources":["../../../src/files/utils/fileViewModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,6BAA6B,EAC7B,yBAAyB,EAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAErD,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,qBAAqB,GAAG,6BAA6B,GAC1D,QAAQ,CAaV;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,yBAAyB,GAAG,UAAU,CAY7E"}
@@ -0,0 +1,34 @@
1
+ //#region src/files/utils/fileViewModel.ts
2
+ function e(e) {
3
+ if (!/^(0|[1-9][0-9]*)$/.test(e) || BigInt(e) > BigInt(2 ** 53 - 1)) throw Error("File size cannot be represented safely");
4
+ return Number(e);
5
+ }
6
+ function t(t) {
7
+ return {
8
+ ...t,
9
+ size: e(t.size),
10
+ description: t.description ?? void 0,
11
+ url: t.downloadUrl ?? "",
12
+ downloadUrl: t.downloadUrl ?? void 0,
13
+ canRead: t.canRead ?? void 0,
14
+ canUpdate: t.canUpdate ?? void 0,
15
+ canDelete: t.canDelete ?? void 0
16
+ };
17
+ }
18
+ function n(e) {
19
+ return {
20
+ ...e,
21
+ description: e.description ?? void 0,
22
+ color: e.color ?? void 0,
23
+ filesCount: e.filesCount ?? void 0,
24
+ subfoldersCount: e.subfoldersCount ?? void 0,
25
+ icon: e.icon ?? void 0,
26
+ canRead: e.canRead ?? void 0,
27
+ canUpdate: e.canUpdate ?? void 0,
28
+ canDelete: e.canDelete ?? void 0
29
+ };
30
+ }
31
+ //#endregion
32
+ export { e as browserFileSize, t as fileViewModel, n as folderViewModel };
33
+
34
+ //# sourceMappingURL=fileViewModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileViewModel.js","names":["browserFileSize","size","fileViewModel","file","folderViewModel","folder"],"sources":["../../../src/files/utils/fileViewModel.ts"],"sourcesContent":["import type {\n FileCard_FileFragment,\n FilePreviewModal_FileFragment,\n FolderCard_FolderFragment,\n} from \"../../generated/wspace-operations\";\nimport type { FileItem, FolderItem } from \"../types\";\n\n/** Browser sizes use numbers; refuse an unrepresentable BigInt rather than round it. */\nexport function browserFileSize(size: string): number {\n if (\n !/^(0|[1-9][0-9]*)$/.test(size) ||\n BigInt(size) > BigInt(Number.MAX_SAFE_INTEGER)\n ) {\n throw new Error(\"File size cannot be represented safely\");\n }\n return Number(size);\n}\n\nexport function fileViewModel(\n file: FileCard_FileFragment & FilePreviewModal_FileFragment,\n): FileItem {\n return {\n ...file,\n size: browserFileSize(file.size),\n description: file.description ?? undefined,\n // Empty is an unavailable URL, never a synthesized location. Preview/download\n // callers must refuse it before creating a viewer, link, or native open request.\n url: file.downloadUrl ?? \"\",\n downloadUrl: file.downloadUrl ?? undefined,\n canRead: file.canRead ?? undefined,\n canUpdate: file.canUpdate ?? undefined,\n canDelete: file.canDelete ?? undefined,\n };\n}\n\nexport function folderViewModel(folder: FolderCard_FolderFragment): FolderItem {\n return {\n ...folder,\n description: folder.description ?? undefined,\n color: folder.color ?? undefined,\n filesCount: folder.filesCount ?? undefined,\n subfoldersCount: folder.subfoldersCount ?? undefined,\n icon: folder.icon ?? undefined,\n canRead: folder.canRead ?? undefined,\n canUpdate: folder.canUpdate ?? undefined,\n canDelete: folder.canDelete ?? undefined,\n };\n}\n"],"mappings":";AAQA,SAAgBA,EAAgB,GAAsB;CACpD,IACE,CAAC,oBAAoB,KAAKC,CAAI,KAC9B,OAAOA,CAAI,IAAI,kBAA8B,GAE7C,MAAU,MAAM,wCAAwC;CAE1D,OAAO,OAAOA,CAAI;AACpB;AAEA,SAAgBC,EACd,GACU;CACV,OAAO;EACL,GAAGC;EACH,MAAMH,EAAgBG,EAAK,IAAI;EAC/B,aAAaA,EAAK,eAAe,KAAA;EAGjC,KAAKA,EAAK,eAAe;EACzB,aAAaA,EAAK,eAAe,KAAA;EACjC,SAASA,EAAK,WAAW,KAAA;EACzB,WAAWA,EAAK,aAAa,KAAA;EAC7B,WAAWA,EAAK,aAAa,KAAA;CAC/B;AACF;AAEA,SAAgBC,EAAgB,GAA+C;CAC7E,OAAO;EACL,GAAGC;EACH,aAAaA,EAAO,eAAe,KAAA;EACnC,OAAOA,EAAO,SAAS,KAAA;EACvB,YAAYA,EAAO,cAAc,KAAA;EACjC,iBAAiBA,EAAO,mBAAmB,KAAA;EAC3C,MAAMA,EAAO,QAAQ,KAAA;EACrB,SAASA,EAAO,WAAW,KAAA;EAC3B,WAAWA,EAAO,aAAa,KAAA;EAC/B,WAAWA,EAAO,aAAa,KAAA;CACjC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.js","names":[],"sources":["../../../src/files/utils/i18n.ts"],"sourcesContent":["import type { I18nContextValue } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\n\ntype TranslationParams = Record<string, string | number>;\n\nfunction interpolateFallback(\n fallback: string,\n params?: TranslationParams,\n): string {\n if (!params) {\n return fallback;\n }\n\n return fallback.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (_, key: string) => {\n const value = params[key];\n return value === undefined ? `{{${key}}}` : String(value);\n });\n}\n\nexport function tWithFallback(\n t: I18nContextValue[\"t\"],\n key: string,\n fallback: string,\n params?: TranslationParams,\n): string {\n const translated = t(key, params);\n if (translated === key) {\n return interpolateFallback(fallback, params);\n }\n\n return translated;\n}\n"],"mappings":";AAIA,SAAS,EACP,GACA,GACQ;AAKR,QAJK,IAIE,EAAS,QAAQ,yBAAyB,GAAG,MAAgB;EAClE,IAAM,IAAQ,EAAO;AACrB,SAAO,MAAU,KAAA,IAAY,KAAK,EAAI,MAAM,OAAO,EAAM;GACzD,GANO;;AASX,SAAgB,EACd,GACA,GACA,GACA,GACQ;CACR,IAAM,IAAa,EAAE,GAAK,EAAO;AAKjC,QAJI,MAAe,IACV,EAAoB,GAAU,EAAO,GAGvC"}
1
+ {"version":3,"file":"i18n.js","names":["interpolateFallback","params","fallback","value","key","tWithFallback","translated"],"sources":["../../../src/files/utils/i18n.ts"],"sourcesContent":["import type { I18nContextValue } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\n\ntype TranslationParams = Record<string, string | number>;\n\nfunction interpolateFallback(\n fallback: string,\n params?: TranslationParams,\n): string {\n if (!params) {\n return fallback;\n }\n\n return fallback.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (_, key: string) => {\n const value = params[key];\n return value === undefined ? `{{${key}}}` : String(value);\n });\n}\n\nexport function tWithFallback(\n t: I18nContextValue[\"t\"],\n key: string,\n fallback: string,\n params?: TranslationParams,\n): string {\n const translated = t(key, params);\n if (translated === key) {\n return interpolateFallback(fallback, params);\n }\n\n return translated;\n}\n"],"mappings":";AAIA,SAASA,EACP,GACA,GACQ;CAKR,OAJKC,IAIEC,EAAS,QAAQ,yBAAyB,GAAG,MAAgB;EAClE,IAAMC,IAAQF,EAAOG;EACrB,OAAOD,MAAU,KAAA,IAAY,KAAKC,EAAI,MAAM,OAAOD,CAAK;CAC1D,CAAC,IANQD;AAOX;AAEA,SAAgBG,EACd,GACA,GACA,GACA,GACQ;CACR,IAAMC,IAAa,EAAEF,GAAKH,CAAM;CAKhC,OAJIK,MAAeF,IACVJ,EAAoBE,GAAUD,CAAM,IAGtCK;AACT"}
@@ -1,27 +1,27 @@
1
- import "./thumbnail.js";
2
- import { Code as e, File as t, FileText as n, Film as r, Image as i, Music as a } from "lucide-react";
3
- import { formatBytes as o, formatRelativeTime as s } from "@burdenoff/fe-libs/shared/utils";
1
+ import { generateThumbnail as e, isImageType as t } from "./thumbnail.js";
2
+ import { Code as n, File as r, FileText as i, Film as a, Image as o, Music as s } from "lucide-react";
3
+ import { formatBytes as c, formatRelativeTime as l } from "@burdenoff/fe-libs/shared/utils";
4
4
  //#region src/files/utils/index.ts
5
- var c = o;
6
- function l(e) {
5
+ var u = c;
6
+ function d(e) {
7
7
  let t = e.split(".");
8
8
  return t.length > 1 ? t[t.length - 1].toLowerCase() : "";
9
9
  }
10
- function u(e) {
10
+ function f(e) {
11
11
  return e.startsWith("image/") ? "image" : e === "application/pdf" ? "pdf" : e.startsWith("video/") ? "video" : e.startsWith("audio/") ? "audio" : e.startsWith("text/") || e === "application/json" || e === "application/xml" ? "text" : e.includes("javascript") || e.includes("typescript") || e.includes("python") || e.includes("java") ? "code" : "unsupported";
12
12
  }
13
- function d(o) {
14
- switch (u(o)) {
15
- case "image": return i;
16
- case "pdf": return n;
17
- case "video": return r;
18
- case "audio": return a;
19
- case "code": return e;
20
- case "text": return n;
21
- default: return t;
13
+ function p(e) {
14
+ switch (f(e)) {
15
+ case "image": return o;
16
+ case "pdf": return i;
17
+ case "video": return a;
18
+ case "audio": return s;
19
+ case "code": return n;
20
+ case "text": return i;
21
+ default: return r;
22
22
  }
23
23
  }
24
- function f(e, t, n = "asc") {
24
+ function m(e, t, n = "asc") {
25
25
  return e.toSorted((e, r) => {
26
26
  let i = 0;
27
27
  switch (t) {
@@ -35,7 +35,7 @@ function f(e, t, n = "asc") {
35
35
  i = (e.size || 0) - (r.size || 0);
36
36
  break;
37
37
  case "type": {
38
- let t = l(e.name), n = l(r.name);
38
+ let t = d(e.name), n = d(r.name);
39
39
  i = t.localeCompare(n);
40
40
  break;
41
41
  }
@@ -43,8 +43,8 @@ function f(e, t, n = "asc") {
43
43
  return n === "asc" ? i : -i;
44
44
  });
45
45
  }
46
- var p = s;
46
+ var h = l;
47
47
  //#endregion
48
- export { p as formatFileDate, c as formatFileSize, d as getFileIcon, f as sortFiles };
48
+ export { h as formatFileDate, u as formatFileSize, e as generateThumbnail, p as getFileIcon, t as isImageType, m as sortFiles };
49
49
 
50
50
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/files/utils/index.ts"],"sourcesContent":["import type { LucideIcon } from \"lucide-react\";\nimport { File, Image, FileText, Film, Music, Code } from \"lucide-react\";\nimport {\n formatBytes,\n formatRelativeTime,\n} from \"@burdenoff/fe-libs/shared/utils\";\nimport type { FilePreviewType } from \"../types\";\nexport { isImageType, generateThumbnail } from \"./thumbnail\";\n\nexport const formatFileSize = formatBytes;\n\nfunction getFileExtension(filename: string): string {\n const parts = filename.split(\".\");\n return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : \"\";\n}\n\nfunction getFilePreviewType(mimeType: string): FilePreviewType {\n if (mimeType.startsWith(\"image/\")) {\n return \"image\";\n }\n if (mimeType === \"application/pdf\") {\n return \"pdf\";\n }\n if (mimeType.startsWith(\"video/\")) {\n return \"video\";\n }\n if (mimeType.startsWith(\"audio/\")) {\n return \"audio\";\n }\n if (\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\"\n ) {\n return \"text\";\n }\n if (\n mimeType.includes(\"javascript\") ||\n mimeType.includes(\"typescript\") ||\n mimeType.includes(\"python\") ||\n mimeType.includes(\"java\")\n ) {\n return \"code\";\n }\n return \"unsupported\";\n}\n\nexport function getFileIcon(mimeType: string): LucideIcon {\n const previewType = getFilePreviewType(mimeType);\n\n switch (previewType) {\n case \"image\":\n return Image;\n case \"pdf\":\n return FileText;\n case \"video\":\n return Film;\n case \"audio\":\n return Music;\n case \"code\":\n return Code;\n case \"text\":\n return FileText;\n default:\n return File;\n }\n}\n\nexport function sortFiles<\n T extends { name: string; createdAt: string; size?: number },\n>(\n files: T[],\n sortBy: \"name\" | \"date\" | \"size\" | \"type\",\n direction: \"asc\" | \"desc\" = \"asc\",\n): T[] {\n const sorted = files.toSorted((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case \"name\":\n comparison = a.name.localeCompare(b.name);\n break;\n case \"date\":\n comparison =\n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();\n break;\n case \"size\":\n comparison = (a.size || 0) - (b.size || 0);\n break;\n case \"type\": {\n const extA = getFileExtension(a.name);\n const extB = getFileExtension(b.name);\n comparison = extA.localeCompare(extB);\n break;\n }\n }\n\n return direction === \"asc\" ? comparison : -comparison;\n });\n\n return sorted;\n}\n\nexport const formatFileDate = formatRelativeTime;\n"],"mappings":";;;;AASA,IAAa,IAAiB;AAE9B,SAAS,EAAiB,GAA0B;CAClD,IAAM,IAAQ,EAAS,MAAM,IAAI;AACjC,QAAO,EAAM,SAAS,IAAI,EAAM,EAAM,SAAS,GAAG,aAAa,GAAG;;AAGpE,SAAS,EAAmB,GAAmC;AA4B7D,QA3BI,EAAS,WAAW,SAAS,GACxB,UAEL,MAAa,oBACR,QAEL,EAAS,WAAW,SAAS,GACxB,UAEL,EAAS,WAAW,SAAS,GACxB,UAGP,EAAS,WAAW,QAAQ,IAC5B,MAAa,sBACb,MAAa,oBAEN,SAGP,EAAS,SAAS,aAAa,IAC/B,EAAS,SAAS,aAAa,IAC/B,EAAS,SAAS,SAAS,IAC3B,EAAS,SAAS,OAAO,GAElB,SAEF;;AAGT,SAAgB,EAAY,GAA8B;AAGxD,SAFoB,EAAmB,EAAS,EAEhD;EACE,KAAK,QACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAgB,EAGd,GACA,GACA,IAA4B,OACvB;AA0BL,QAzBe,EAAM,UAAU,GAAG,MAAM;EACtC,IAAI,IAAa;AAEjB,UAAQ,GAAR;GACE,KAAK;AACH,QAAa,EAAE,KAAK,cAAc,EAAE,KAAK;AACzC;GACF,KAAK;AACH,QACE,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS;AACnE;GACF,KAAK;AACH,SAAc,EAAE,QAAQ,MAAM,EAAE,QAAQ;AACxC;GACF,KAAK,QAAQ;IACX,IAAM,IAAO,EAAiB,EAAE,KAAK,EAC/B,IAAO,EAAiB,EAAE,KAAK;AACrC,QAAa,EAAK,cAAc,EAAK;AACrC;;;AAIJ,SAAO,MAAc,QAAQ,IAAa,CAAC;GAC3C;;AAKJ,IAAa,IAAiB"}
1
+ {"version":3,"file":"index.js","names":["formatFileSize","formatBytes","getFileExtension","parts","filename","getFilePreviewType","mimeType","getFileIcon","Image","FileText","Film","Music","Code","File","sortFiles","files","comparison","sortBy","a","b","extA","extB","direction","formatFileDate","formatRelativeTime","generateThumbnail","isImageType"],"sources":["../../../src/files/utils/index.ts"],"sourcesContent":["import type { LucideIcon } from \"lucide-react\";\nimport { File, Image, FileText, Film, Music, Code } from \"lucide-react\";\nimport {\n formatBytes,\n formatRelativeTime,\n} from \"@burdenoff/fe-libs/shared/utils\";\nimport type { FilePreviewType } from \"../types\";\nexport { isImageType, generateThumbnail } from \"./thumbnail\";\n\nexport const formatFileSize = formatBytes;\n\nfunction getFileExtension(filename: string): string {\n const parts = filename.split(\".\");\n return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : \"\";\n}\n\nfunction getFilePreviewType(mimeType: string): FilePreviewType {\n if (mimeType.startsWith(\"image/\")) {\n return \"image\";\n }\n if (mimeType === \"application/pdf\") {\n return \"pdf\";\n }\n if (mimeType.startsWith(\"video/\")) {\n return \"video\";\n }\n if (mimeType.startsWith(\"audio/\")) {\n return \"audio\";\n }\n if (\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\"\n ) {\n return \"text\";\n }\n if (\n mimeType.includes(\"javascript\") ||\n mimeType.includes(\"typescript\") ||\n mimeType.includes(\"python\") ||\n mimeType.includes(\"java\")\n ) {\n return \"code\";\n }\n return \"unsupported\";\n}\n\nexport function getFileIcon(mimeType: string): LucideIcon {\n const previewType = getFilePreviewType(mimeType);\n\n switch (previewType) {\n case \"image\":\n return Image;\n case \"pdf\":\n return FileText;\n case \"video\":\n return Film;\n case \"audio\":\n return Music;\n case \"code\":\n return Code;\n case \"text\":\n return FileText;\n default:\n return File;\n }\n}\n\nexport function sortFiles<\n T extends { name: string; createdAt: string; size?: number },\n>(\n files: T[],\n sortBy: \"name\" | \"date\" | \"size\" | \"type\",\n direction: \"asc\" | \"desc\" = \"asc\",\n): T[] {\n const sorted = files.toSorted((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case \"name\":\n comparison = a.name.localeCompare(b.name);\n break;\n case \"date\":\n comparison =\n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();\n break;\n case \"size\":\n comparison = (a.size || 0) - (b.size || 0);\n break;\n case \"type\": {\n const extA = getFileExtension(a.name);\n const extB = getFileExtension(b.name);\n comparison = extA.localeCompare(extB);\n break;\n }\n }\n\n return direction === \"asc\" ? comparison : -comparison;\n });\n\n return sorted;\n}\n\nexport const formatFileDate = formatRelativeTime;\n"],"mappings":";;;;AASA,IAAaA,IAAiBC;AAE9B,SAASC,EAAiB,GAA0B;CAClD,IAAMC,IAAQC,EAAS,MAAM,GAAG;CAChC,OAAOD,EAAM,SAAS,IAAIA,EAAMA,EAAM,SAAS,EAAE,CAAC,YAAY,IAAI;AACpE;AAEA,SAASE,EAAmB,GAAmC;CA4B7D,OA3BIC,EAAS,WAAW,QAAQ,IACvB,UAELA,MAAa,oBACR,QAELA,EAAS,WAAW,QAAQ,IACvB,UAELA,EAAS,WAAW,QAAQ,IACvB,UAGPA,EAAS,WAAW,OAAO,KAC3BA,MAAa,sBACbA,MAAa,oBAEN,SAGPA,EAAS,SAAS,YAAY,KAC9BA,EAAS,SAAS,YAAY,KAC9BA,EAAS,SAAS,QAAQ,KAC1BA,EAAS,SAAS,MAAM,IAEjB,SAEF;AACT;AAEA,SAAgBC,EAAY,GAA8B;CAGxD,QAFoBF,EAAmBC,CAE/B,GAAR;EACE,KAAK,SACH,OAAOE;EACT,KAAK,OACH,OAAOC;EACT,KAAK,SACH,OAAOC;EACT,KAAK,SACH,OAAOC;EACT,KAAK,QACH,OAAOC;EACT,KAAK,QACH,OAAOH;EACT,SACE,OAAOI;CACX;AACF;AAEA,SAAgBC,EAGd,GACA,GACA,IAA4B,OACvB;CA0BL,OAzBeC,EAAM,UAAU,GAAG,MAAM;EACtC,IAAIC,IAAa;EAEjB,QAAQC,GAAR;GACE,KAAK;IACH,IAAaC,EAAE,KAAK,cAAcC,EAAE,IAAI;IACxC;GACF,KAAK;IACH,IACE,IAAI,KAAKD,EAAE,SAAS,CAAC,CAAC,QAAQ,IAAI,IAAI,KAAKC,EAAE,SAAS,CAAC,CAAC,QAAQ;IAClE;GACF,KAAK;IACH,KAAcD,EAAE,QAAQ,MAAMC,EAAE,QAAQ;IACxC;GACF,KAAK,QAAQ;IACX,IAAMC,IAAOlB,EAAiBgB,EAAE,IAAI,GAC9BG,IAAOnB,EAAiBiB,EAAE,IAAI;IACpC,IAAaC,EAAK,cAAcC,CAAI;IACpC;GACF;EACF;EAEA,OAAOC,MAAc,QAAQN,IAAa,CAACA;CAC7C,CAEO;AACT;AAEA,IAAaO,IAAiBC"}
@@ -1,2 +1 @@
1
- import { isQuotaExhaustedError as e } from "@burdenoff/fe-libs/shared/utils";
2
- export { e as isQuotaExhaustedError };
1
+ export { isQuotaExhaustedError } from "@burdenoff/fe-libs/shared/utils";
@@ -1,5 +1,5 @@
1
1
  //#region src/files/utils/thumbnail.ts
2
- var e = 200, t = .8, n = "image/jpeg", r = new Set([
2
+ var e = /* @__PURE__ */ new Set([
3
3
  "image/jpeg",
4
4
  "image/png",
5
5
  "image/gif",
@@ -7,33 +7,29 @@ var e = 200, t = .8, n = "image/jpeg", r = new Set([
7
7
  "image/bmp",
8
8
  "image/tiff"
9
9
  ]);
10
- function i(e) {
11
- return r.has(e.toLowerCase());
10
+ function t(t) {
11
+ return e.has(t.toLowerCase());
12
12
  }
13
- async function a(r, a = e) {
14
- return i(r.type) ? new Promise((e) => {
15
- let i = new Image(), o = URL.createObjectURL(r);
16
- i.onload = () => {
17
- URL.revokeObjectURL(o);
18
- let r = document.createElement("canvas"), s = r.getContext("2d");
19
- if (!s) {
20
- e(null);
13
+ async function n(e, n = 200) {
14
+ return t(e.type) ? new Promise((t) => {
15
+ let r = new Image(), i = URL.createObjectURL(e);
16
+ r.onload = () => {
17
+ URL.revokeObjectURL(i);
18
+ let e = document.createElement("canvas"), a = e.getContext("2d");
19
+ if (!a) {
20
+ t(null);
21
21
  return;
22
22
  }
23
- let { width: c, height: l } = i;
24
- c > l ? c > a && (l = Math.round(l * a / c), c = a) : l > a && (c = Math.round(c * a / l), l = a), r.width = c, r.height = l, s.drawImage(i, 0, 0, c, l), r.toBlob((t) => {
25
- if (!t) {
26
- e(null);
27
- return;
28
- }
29
- e(URL.createObjectURL(t));
30
- }, n, t);
31
- }, i.onerror = () => {
32
- URL.revokeObjectURL(o), e(null);
33
- }, i.src = o;
23
+ let { width: o, height: s } = r;
24
+ o > s ? o > n && (s = Math.round(s * n / o), o = n) : s > n && (o = Math.round(o * n / s), s = n), e.width = o, e.height = s, a.drawImage(r, 0, 0, o, s), e.toBlob((e) => {
25
+ t(e ? URL.createObjectURL(e) : null);
26
+ }, "image/jpeg", .8);
27
+ }, r.onerror = () => {
28
+ URL.revokeObjectURL(i), t(null);
29
+ }, r.src = i;
34
30
  }) : null;
35
31
  }
36
32
  //#endregion
37
- export { a as generateThumbnail, i as isImageType };
33
+ export { n as generateThumbnail, t as isImageType };
38
34
 
39
35
  //# sourceMappingURL=thumbnail.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"thumbnail.js","names":[],"sources":["../../../src/files/utils/thumbnail.ts"],"sourcesContent":["const MAX_THUMBNAIL_SIZE = 200;\nconst THUMBNAIL_QUALITY = 0.8;\nconst MIME_TYPE = \"image/jpeg\";\n\nconst imageTypes = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"image/bmp\",\n \"image/tiff\",\n]);\n\nexport function isImageType(mimeType: string): boolean {\n return imageTypes.has(mimeType.toLowerCase());\n}\n\nexport async function generateThumbnail(\n file: File,\n maxSize: number = MAX_THUMBNAIL_SIZE,\n): Promise<string | null> {\n if (!isImageType(file.type)) {\n return null;\n }\n\n return new Promise((resolve) => {\n const img = new Image();\n const url = URL.createObjectURL(file);\n\n img.onload = () => {\n URL.revokeObjectURL(url);\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n resolve(null);\n return;\n }\n\n let { width, height } = img;\n\n if (width > height) {\n if (width > maxSize) {\n height = Math.round((height * maxSize) / width);\n width = maxSize;\n }\n } else {\n if (height > maxSize) {\n width = Math.round((width * maxSize) / height);\n height = maxSize;\n }\n }\n\n canvas.width = width;\n canvas.height = height;\n\n ctx.drawImage(img, 0, 0, width, height);\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n resolve(null);\n return;\n }\n resolve(URL.createObjectURL(blob));\n },\n MIME_TYPE,\n THUMBNAIL_QUALITY,\n );\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(null);\n };\n\n img.src = url;\n });\n}\n"],"mappings":";AAAA,IAAM,IAAqB,KACrB,IAAoB,IACpB,IAAY,cAEZ,IAAa,IAAI,IAAI;CACzB;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,EAAY,GAA2B;AACrD,QAAO,EAAW,IAAI,EAAS,aAAa,CAAC;;AAG/C,eAAsB,EACpB,GACA,IAAkB,GACM;AAKxB,QAJK,EAAY,EAAK,KAAK,GAIpB,IAAI,SAAS,MAAY;EAC9B,IAAM,IAAM,IAAI,OAAO,EACjB,IAAM,IAAI,gBAAgB,EAAK;AAiDrC,EA/CA,EAAI,eAAe;AACjB,OAAI,gBAAgB,EAAI;GAExB,IAAM,IAAS,SAAS,cAAc,SAAS,EACzC,IAAM,EAAO,WAAW,KAAK;AACnC,OAAI,CAAC,GAAK;AACR,MAAQ,KAAK;AACb;;GAGF,IAAI,EAAE,UAAO,cAAW;AAmBxB,GAjBI,IAAQ,IACN,IAAQ,MACV,IAAS,KAAK,MAAO,IAAS,IAAW,EAAM,EAC/C,IAAQ,KAGN,IAAS,MACX,IAAQ,KAAK,MAAO,IAAQ,IAAW,EAAO,EAC9C,IAAS,IAIb,EAAO,QAAQ,GACf,EAAO,SAAS,GAEhB,EAAI,UAAU,GAAK,GAAG,GAAG,GAAO,EAAO,EAEvC,EAAO,QACJ,MAAS;AACR,QAAI,CAAC,GAAM;AACT,OAAQ,KAAK;AACb;;AAEF,MAAQ,IAAI,gBAAgB,EAAK,CAAC;MAEpC,GACA,EACD;KAGH,EAAI,gBAAgB;AAElB,GADA,IAAI,gBAAgB,EAAI,EACxB,EAAQ,KAAK;KAGf,EAAI,MAAM;GACV,GAvDO"}
1
+ {"version":3,"file":"thumbnail.js","names":["imageTypes","isImageType","mimeType","generateThumbnail","file","img","url","canvas","ctx","width","height","maxSize","resolve","blob"],"sources":["../../../src/files/utils/thumbnail.ts"],"sourcesContent":["const MAX_THUMBNAIL_SIZE = 200;\nconst THUMBNAIL_QUALITY = 0.8;\nconst MIME_TYPE = \"image/jpeg\";\n\nconst imageTypes = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"image/bmp\",\n \"image/tiff\",\n]);\n\nexport function isImageType(mimeType: string): boolean {\n return imageTypes.has(mimeType.toLowerCase());\n}\n\nexport async function generateThumbnail(\n file: File,\n maxSize: number = MAX_THUMBNAIL_SIZE,\n): Promise<string | null> {\n if (!isImageType(file.type)) {\n return null;\n }\n\n return new Promise((resolve) => {\n const img = new Image();\n const url = URL.createObjectURL(file);\n\n img.onload = () => {\n URL.revokeObjectURL(url);\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n resolve(null);\n return;\n }\n\n let { width, height } = img;\n\n if (width > height) {\n if (width > maxSize) {\n height = Math.round((height * maxSize) / width);\n width = maxSize;\n }\n } else {\n if (height > maxSize) {\n width = Math.round((width * maxSize) / height);\n height = maxSize;\n }\n }\n\n canvas.width = width;\n canvas.height = height;\n\n ctx.drawImage(img, 0, 0, width, height);\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n resolve(null);\n return;\n }\n resolve(URL.createObjectURL(blob));\n },\n MIME_TYPE,\n THUMBNAIL_QUALITY,\n );\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(null);\n };\n\n img.src = url;\n });\n}\n"],"mappings":";AAAA,IAIMA,oBAAa,IAAI,IAAI;CACzB;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgBC,EAAY,GAA2B;CACrD,OAAOD,EAAW,IAAIE,EAAS,YAAY,CAAC;AAC9C;AAEA,eAAsBC,EACpB,GACA,IAAkB,KACM;CAKxB,OAJKF,EAAYG,EAAK,IAAI,IAInB,IAAI,SAAS,MAAY;EAC9B,IAAMC,IAAM,IAAI,MAAM,GAChBC,IAAM,IAAI,gBAAgBF,CAAI;EAiDpC,AA/CA,EAAI,eAAe;GACjB,IAAI,gBAAgBE,CAAG;GAEvB,IAAMC,IAAS,SAAS,cAAc,QAAQ,GACxCC,IAAMD,EAAO,WAAW,IAAI;GAClC,IAAI,CAACC,GAAK;IACR,EAAQ,IAAI;IACZ;GACF;GAEA,IAAI,EAAE,UAAO,cAAWH;GAmBxB,AAjBII,IAAQC,IACND,IAAQE,MACV,IAAS,KAAK,MAAOD,IAASC,IAAWF,CAAK,GAC9C,IAAQE,KAGND,IAASC,MACX,IAAQ,KAAK,MAAOF,IAAQE,IAAWD,CAAM,GAC7C,IAASC,IAIb,EAAO,QAAQF,GACf,EAAO,SAASC,GAEhBF,EAAI,UAAUH,GAAK,GAAG,GAAGI,GAAOC,CAAM,GAEtCH,EAAO,QACJ,MAAS;IACR,AAIAK,EAJKC,IAIG,IAAI,gBAAgBA,CAAI,IAHtB,IAEV;GAEF,GACA,cACA,EACF;EACF,GAEA,EAAI,gBAAgB;GAElB,AADA,IAAI,gBAAgBP,CAAG,GACvBM,EAAQ,IAAI;EACd,GAEA,EAAI,MAAMN;CACZ,CAAC,IAvDQ;AAwDX"}
@@ -1,6 +1,6 @@
1
1
  import { sha256 as e } from "@noble/hashes/sha2.js";
2
2
  //#region src/files/utils/uploadDigest.ts
3
- var t = 1024 * 1024;
3
+ var t = 1048576;
4
4
  async function n(n, r = () => !1) {
5
5
  let i = e.create();
6
6
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"uploadDigest.js","names":[],"sources":["../../../src/files/utils/uploadDigest.ts"],"sourcesContent":["import { sha256 } from \"@noble/hashes/sha2.js\";\n\nconst CHUNK_BYTES = 1024 * 1024;\n\n/** Hash selected bytes with bounded reads; declaration alone does not verify storage. */\nexport async function computeUploadSha256(\n file: Blob,\n isCancelled: () => boolean = () => false,\n): Promise<string> {\n const hash = sha256.create();\n try {\n if (isCancelled()) throw new Error(\"Upload paused\");\n for (let offset = 0; offset < file.size; offset += CHUNK_BYTES) {\n if (isCancelled()) throw new Error(\"Upload paused\");\n const end = Math.min(offset + CHUNK_BYTES, file.size);\n const bytes = await file.slice(offset, end).arrayBuffer();\n if (isCancelled()) throw new Error(\"Upload paused\");\n if (bytes.byteLength !== end - offset) {\n throw new Error(\"Unable to read complete file bytes\");\n }\n hash.update(new Uint8Array(bytes));\n }\n return Array.from(hash.digest(), (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n } finally {\n hash.destroy();\n }\n}\n"],"mappings":";;AAEA,IAAM,IAAc,OAAO;AAG3B,eAAsB,EACpB,GACA,UAAmC,IAClB;CACjB,IAAM,IAAO,EAAO,QAAQ;AAC5B,KAAI;AACF,MAAI,GAAa,CAAE,OAAU,MAAM,gBAAgB;AACnD,OAAK,IAAI,IAAS,GAAG,IAAS,EAAK,MAAM,KAAU,GAAa;AAC9D,OAAI,GAAa,CAAE,OAAU,MAAM,gBAAgB;GACnD,IAAM,IAAM,KAAK,IAAI,IAAS,GAAa,EAAK,KAAK,EAC/C,IAAQ,MAAM,EAAK,MAAM,GAAQ,EAAI,CAAC,aAAa;AACzD,OAAI,GAAa,CAAE,OAAU,MAAM,gBAAgB;AACnD,OAAI,EAAM,eAAe,IAAM,EAC7B,OAAU,MAAM,qCAAqC;AAEvD,KAAK,OAAO,IAAI,WAAW,EAAM,CAAC;;AAEpC,SAAO,MAAM,KAAK,EAAK,QAAQ,GAAG,MAChC,EAAK,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CACnC,CAAC,KAAK,GAAG;WACF;AACR,IAAK,SAAS"}
1
+ {"version":3,"file":"uploadDigest.js","names":["CHUNK_BYTES","computeUploadSha256","hash","sha256","isCancelled","offset","file","end","bytes","byte"],"sources":["../../../src/files/utils/uploadDigest.ts"],"sourcesContent":["import { sha256 } from \"@noble/hashes/sha2.js\";\n\nconst CHUNK_BYTES = 1024 * 1024;\n\n/** Hash selected bytes with bounded reads; declaration alone does not verify storage. */\nexport async function computeUploadSha256(\n file: Blob,\n isCancelled: () => boolean = () => false,\n): Promise<string> {\n const hash = sha256.create();\n try {\n if (isCancelled()) throw new Error(\"Upload paused\");\n for (let offset = 0; offset < file.size; offset += CHUNK_BYTES) {\n if (isCancelled()) throw new Error(\"Upload paused\");\n const end = Math.min(offset + CHUNK_BYTES, file.size);\n const bytes = await file.slice(offset, end).arrayBuffer();\n if (isCancelled()) throw new Error(\"Upload paused\");\n if (bytes.byteLength !== end - offset) {\n throw new Error(\"Unable to read complete file bytes\");\n }\n hash.update(new Uint8Array(bytes));\n }\n return Array.from(hash.digest(), (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n } finally {\n hash.destroy();\n }\n}\n"],"mappings":";;AAEA,IAAMA,IAAc;AAGpB,eAAsBC,EACpB,GACA,UAAmC,IAClB;CACjB,IAAMC,IAAOC,EAAO,OAAO;CAC3B,IAAI;EACF,IAAIC,EAAY,GAAG,MAAU,MAAM,eAAe;EAClD,KAAK,IAAIC,IAAS,GAAGA,IAASC,EAAK,MAAM,KAAUN,GAAa;GAC9D,IAAII,EAAY,GAAG,MAAU,MAAM,eAAe;GAClD,IAAMG,IAAM,KAAK,IAAIF,IAASL,GAAaM,EAAK,IAAI,GAC9CE,IAAQ,MAAMF,EAAK,MAAMD,GAAQE,CAAG,CAAC,CAAC,YAAY;GACxD,IAAIH,EAAY,GAAG,MAAU,MAAM,eAAe;GAClD,IAAII,EAAM,eAAeD,IAAMF,GAC7B,MAAU,MAAM,oCAAoC;GAEtD,EAAK,OAAO,IAAI,WAAWG,CAAK,CAAC;EACnC;EACA,OAAO,MAAM,KAAKN,EAAK,OAAO,IAAI,MAChCO,EAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CACnC,CAAC,CAAC,KAAK,EAAE;CACX,UAAU;EACR,EAAK,QAAQ;CACf;AACF"}
@@ -1,2 +1,5 @@
1
- export {};
1
+ /** Internal type. DO NOT USE DIRECTLY. */
2
+ export type Incremental<T> = T | {
3
+ [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never;
4
+ };
2
5
  //# sourceMappingURL=global-operations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"global-operations.d.ts","sourceRoot":"","sources":["../../src/generated/global-operations.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"global-operations.d.ts","sourceRoot":"","sources":["../../src/generated/global-operations.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,gBAAgB,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;CAAE,CAAC"}
@@ -1,24 +1,5 @@
1
1
  export type Maybe<T> = T | null;
2
2
  export type InputMaybe<T> = Maybe<T>;
3
- export type Exact<T extends {
4
- [key: string]: unknown;
5
- }> = {
6
- [K in keyof T]: T[K];
7
- };
8
- export type MakeOptional<T, K extends keyof T> = Omit<T, K> & {
9
- [SubKey in K]?: Maybe<T[SubKey]>;
10
- };
11
- export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {
12
- [SubKey in K]: Maybe<T[SubKey]>;
13
- };
14
- export type MakeEmpty<T extends {
15
- [key: string]: unknown;
16
- }, K extends keyof T> = {
17
- [_ in K]?: never;
18
- };
19
- export type Incremental<T> = T | {
20
- [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never;
21
- };
22
3
  /** All built-in and custom scalars, mapped to their actual values */
23
4
  export type Scalars = {
24
5
  ID: {
@@ -68,8 +49,8 @@ export type Scalars = {
68
49
  output: File;
69
50
  };
70
51
  _SubscriptionsPlaceholder: {
71
- input: any;
72
- output: any;
52
+ input: unknown;
53
+ output: unknown;
73
54
  };
74
55
  };
75
56
  /** API Key for programmatic access */
@@ -14157,6 +14138,14 @@ export type NotificationReadFilterInput = {
14157
14138
  type?: InputMaybe<NotificationType>;
14158
14139
  userId: Scalars['ID']['input'];
14159
14140
  };
14141
+ /** Sender-owned processing status only; provider acknowledgement is not delivery certification. */
14142
+ export type NotificationSendStatus = {
14143
+ __typename?: 'NotificationSendStatus';
14144
+ deliveryStatus?: Maybe<NotificationDeliveryStatus>;
14145
+ id: Scalars['ID']['output'];
14146
+ status: NotificationStatus;
14147
+ triggerStatus: TriggerStatus;
14148
+ };
14160
14149
  export type NotificationStats = {
14161
14150
  __typename?: 'NotificationStats';
14162
14151
  byChannel: Scalars['JSON']['output'];
@@ -16663,6 +16652,8 @@ export type Query = {
16663
16652
  myNotificationCountsByApp: Scalars['JSON']['output'];
16664
16653
  /** Get notification counts by channel for authenticated user */
16665
16654
  myNotificationCountsByChannel: NotificationChannelCounts;
16655
+ /** Status of a notification created by the authenticated sender in the current tenant. */
16656
+ myNotificationSendStatus: NotificationSendStatus;
16666
16657
  /** Get all orders for the authenticated user */
16667
16658
  myOrders: Array<StoreOrder>;
16668
16659
  /** Get a SINGLE invite addressed to the current authenticated user, by id. Backs the per-invite acceptance page reached from the invite email link. Self-scoped: the resolver only returns an invite addressed to the caller's own email (or already resolved to their userId); otherwise it returns NOT_FOUND (existence of another account's invite is never revealed). */
@@ -18659,6 +18650,10 @@ export type QueryMyEntitlementsArgs = {
18659
18650
  offset?: InputMaybe<Scalars['Int']['input']>;
18660
18651
  };
18661
18652
  /** Root query type */
18653
+ export type QueryMyNotificationSendStatusArgs = {
18654
+ id: Scalars['ID']['input'];
18655
+ };
18656
+ /** Root query type */
18662
18657
  export type QueryMyOrdersArgs = {
18663
18658
  limit?: InputMaybe<Scalars['Int']['input']>;
18664
18659
  offset?: InputMaybe<Scalars['Int']['input']>;