@burdenoff/microfe-files 2026.527.1 → 2026.527.3

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 (49) hide show
  1. package/dist/files/components/ActionMenu.js +44 -40
  2. package/dist/files/components/ActionMenu.js.map +1 -1
  3. package/dist/files/components/ConfirmDialog.js +42 -40
  4. package/dist/files/components/ConfirmDialog.js.map +1 -1
  5. package/dist/files/components/CopyDialog.js +1 -0
  6. package/dist/files/components/CopyDialog.js.map +1 -1
  7. package/dist/files/components/FileBrowser.js +186 -170
  8. package/dist/files/components/FileBrowser.js.map +1 -1
  9. package/dist/files/components/FileCard.js.map +1 -1
  10. package/dist/files/components/FileInfoPanel.js +102 -102
  11. package/dist/files/components/FileInfoPanel.js.map +1 -1
  12. package/dist/files/components/FileListItem.js.map +1 -1
  13. package/dist/files/components/FolderCard.js +147 -161
  14. package/dist/files/components/FolderCard.js.map +1 -1
  15. package/dist/files/components/MoveDialog.js +9 -12
  16. package/dist/files/components/MoveDialog.js.map +1 -1
  17. package/dist/files/components/SearchBar.js +125 -117
  18. package/dist/files/components/SearchBar.js.map +1 -1
  19. package/dist/files/components/ShareDialog.js +5 -0
  20. package/dist/files/components/ShareDialog.js.map +1 -1
  21. package/dist/files/components/Toast.js +27 -24
  22. package/dist/files/components/Toast.js.map +1 -1
  23. package/dist/files/components/UploadQueue.js +1 -1
  24. package/dist/files/components/UploadQueue.js.map +1 -1
  25. package/dist/files/components/viewers/AudioPlayer.js +3 -0
  26. package/dist/files/components/viewers/AudioPlayer.js.map +1 -1
  27. package/dist/files/components/viewers/TextViewer.js +1 -0
  28. package/dist/files/components/viewers/TextViewer.js.map +1 -1
  29. package/dist/files/components/viewers/VideoPlayer.js +3 -0
  30. package/dist/files/components/viewers/VideoPlayer.js.map +1 -1
  31. package/dist/files/hooks/useCreateFolder.js +15 -7
  32. package/dist/files/hooks/useCreateFolder.js.map +1 -1
  33. package/dist/files/hooks/useKeyboardNavigation.js +51 -51
  34. package/dist/files/hooks/useKeyboardNavigation.js.map +1 -1
  35. package/dist/files/hooks/useMoveFile.js +1 -2
  36. package/dist/files/hooks/useMoveFile.js.map +1 -1
  37. package/dist/files/hooks/useMoveFolder.js +0 -2
  38. package/dist/files/hooks/useMoveFolder.js.map +1 -1
  39. package/dist/files/hooks/useStarredItems.js +4 -3
  40. package/dist/files/hooks/useStarredItems.js.map +1 -1
  41. package/dist/files/hooks/useToggleStar.js +10 -10
  42. package/dist/files/hooks/useToggleStar.js.map +1 -1
  43. package/dist/files/pages/BrowserPage.js +312 -302
  44. package/dist/files/pages/BrowserPage.js.map +1 -1
  45. package/dist/files/pages/ShareAccessPage.js +1 -0
  46. package/dist/files/pages/ShareAccessPage.js.map +1 -1
  47. package/dist/files/utils/quotaUtils.js +14 -0
  48. package/dist/files/utils/quotaUtils.js.map +1 -0
  49. package/package.json +2 -2
@@ -1,105 +1,105 @@
1
1
  import { useFilesStore as e } from "../store/filesStore.js";
2
- import { useCallback as t, useEffect as n, useRef as r } from "react";
2
+ import { useCallback as t, useEffect as n, useMemo as r, useRef as i } from "react";
3
3
  //#region src/files/hooks/useKeyboardNavigation.ts
4
- function i({ files: i, folders: a, onFilePreview: o, onFileDelete: s, onFolderOpen: c, onFolderDelete: l, activeTab: u }) {
5
- let d = r(-1), { selectedFiles: f, selectedFolders: p, clearSelection: m, selectFile: h, selectFolder: g, toggleFileSelection: _, toggleFolderSelection: v, selectAllFiles: y, selectAllFolders: b } = e(), x = [...a, ...i], S = x.length, C = t((e) => {
6
- d.current = Math.max(-1, Math.min(e, S - 1));
7
- }, [S]), w = t(() => d.current >= 0 && d.current < S ? x[d.current] : null, [x, S]), T = t((e) => e < a.length, [a.length]), E = t((e) => e >= a.length, [a.length]), D = t(() => {
8
- let e = d.current;
9
- return E(e) ? i[e - a.length] ?? null : null;
4
+ function a({ files: a, folders: o, onFilePreview: s, onFileDelete: c, onFolderOpen: l, onFolderDelete: u, activeTab: d }) {
5
+ let f = i(-1), { selectedFiles: p, selectedFolders: m, clearSelection: h, selectFile: g, selectFolder: _, toggleFileSelection: v, toggleFolderSelection: y, selectAllFiles: b, selectAllFolders: x } = e(), S = r(() => [...o, ...a], [o, a]), C = S.length, w = t((e) => {
6
+ f.current = Math.max(-1, Math.min(e, C - 1));
7
+ }, [C]), T = t(() => f.current >= 0 && f.current < C ? S[f.current] : null, [S, C]), E = t((e) => e < o.length, [o.length]), D = t((e) => e >= o.length, [o.length]), O = t(() => {
8
+ let e = f.current;
9
+ return D(e) ? a[e - o.length] ?? null : null;
10
10
  }, [
11
- i,
12
- a.length,
13
- E
14
- ]), O = t(() => {
15
- let e = d.current;
16
- return T(e) ? a[e] ?? null : null;
17
- }, [a, T]), k = t((e) => {
11
+ a,
12
+ o.length,
13
+ D
14
+ ]), k = t(() => {
15
+ let e = f.current;
16
+ return E(e) ? o[e] ?? null : null;
17
+ }, [o, E]), A = t((e) => {
18
18
  let t = e.target;
19
19
  if (t.tagName === "INPUT" || t.tagName === "TEXTAREA" || t.isContentEditable) return;
20
- let n = u === "bin";
20
+ let n = d === "bin";
21
21
  switch (e.key) {
22
22
  case "ArrowDown":
23
- e.preventDefault(), C(d.current + 1);
23
+ e.preventDefault(), w(f.current + 1);
24
24
  break;
25
25
  case "ArrowUp":
26
- e.preventDefault(), C(d.current - 1);
26
+ e.preventDefault(), w(f.current - 1);
27
27
  break;
28
28
  case "ArrowRight":
29
- e.preventDefault(), C(d.current + 1);
29
+ e.preventDefault(), w(f.current + 1);
30
30
  break;
31
31
  case "ArrowLeft":
32
- e.preventDefault(), C(d.current - 1);
32
+ e.preventDefault(), w(f.current - 1);
33
33
  break;
34
34
  case "Enter": {
35
35
  e.preventDefault();
36
- let t = O();
37
- if (t) c?.(t);
36
+ let t = k();
37
+ if (t) l?.(t);
38
38
  else {
39
- let e = D();
40
- e && o?.(e);
39
+ let e = O();
40
+ e && s?.(e);
41
41
  }
42
42
  break;
43
43
  }
44
44
  case " ": {
45
45
  e.preventDefault();
46
- let t = O();
47
- if (t) v(t.id);
46
+ let t = k();
47
+ if (t) y(t.id);
48
48
  else {
49
- let e = D();
50
- e && _(e.id);
49
+ let e = O();
50
+ e && v(e.id);
51
51
  }
52
52
  break;
53
53
  }
54
54
  case "Delete":
55
55
  case "Backspace": {
56
56
  if (e.preventDefault(), n) return;
57
- let t = O();
58
- if (t) l?.(t);
57
+ let t = k();
58
+ if (t) u?.(t);
59
59
  else {
60
- let e = D();
61
- e && s?.(e);
60
+ let e = O();
61
+ e && c?.(e);
62
62
  }
63
63
  break;
64
64
  }
65
65
  case "Escape":
66
- e.preventDefault(), m(), C(-1);
66
+ e.preventDefault(), h(), w(-1);
67
67
  break;
68
68
  case "a":
69
69
  case "A":
70
70
  if (e.ctrlKey || e.metaKey) {
71
71
  e.preventDefault();
72
- let t = i.map((e) => e.id), n = a.map((e) => e.id);
73
- y(t), b(n);
72
+ let t = a.map((e) => e.id), n = o.map((e) => e.id);
73
+ b(t), x(n);
74
74
  }
75
75
  break;
76
76
  }
77
77
  }, [
78
- u,
79
- m,
80
- i,
78
+ d,
79
+ h,
81
80
  a,
82
- D,
81
+ o,
83
82
  O,
83
+ k,
84
+ c,
84
85
  s,
85
- o,
86
+ u,
86
87
  l,
87
- c,
88
- y,
89
88
  b,
90
- C,
91
- _,
92
- v
89
+ x,
90
+ w,
91
+ v,
92
+ y
93
93
  ]);
94
- return n(() => (document.addEventListener("keydown", k), () => {
95
- document.removeEventListener("keydown", k);
96
- }), [k]), {
97
- focusedIndex: d.current,
98
- setFocusedIndex: C,
99
- getFocusedItem: w
94
+ return n(() => (document.addEventListener("keydown", A), () => {
95
+ document.removeEventListener("keydown", A);
96
+ }), [A]), {
97
+ focusedIndex: f.current,
98
+ setFocusedIndex: w,
99
+ getFocusedItem: T
100
100
  };
101
101
  }
102
102
  //#endregion
103
- export { i as useKeyboardNavigation };
103
+ export { a as useKeyboardNavigation };
104
104
 
105
105
  //# sourceMappingURL=useKeyboardNavigation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useKeyboardNavigation.js","names":[],"sources":["../../../src/files/hooks/useKeyboardNavigation.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from \"react\";\nimport type { FileItem, FolderItem } from \"../types\";\nimport { useFilesStore } from \"../store/filesStore\";\n\ninterface UseKeyboardNavigationOptions {\n files: FileItem[];\n folders: FolderItem[];\n onFilePreview?: (file: FileItem) => void;\n onFileDelete?: (file: FileItem) => void;\n onFolderOpen?: (folder: FolderItem) => void;\n onFolderDelete?: (folder: FolderItem) => void;\n activeTab: string;\n}\n\nexport function useKeyboardNavigation({\n files,\n folders,\n onFilePreview,\n onFileDelete,\n onFolderOpen,\n onFolderDelete,\n activeTab,\n}: UseKeyboardNavigationOptions) {\n const focusedIndexRef = useRef<number>(-1);\n const {\n selectedFiles,\n selectedFolders,\n clearSelection,\n selectFile,\n selectFolder,\n toggleFileSelection,\n toggleFolderSelection,\n selectAllFiles,\n selectAllFolders,\n } = useFilesStore();\n\n const allItems = [...folders, ...files];\n const totalItems = allItems.length;\n\n const setFocusedIndex = useCallback(\n (index: number) => {\n const clampedIndex = Math.max(-1, Math.min(index, totalItems - 1));\n focusedIndexRef.current = clampedIndex;\n },\n [totalItems],\n );\n\n const getFocusedItem = useCallback(() => {\n if (focusedIndexRef.current >= 0 && focusedIndexRef.current < totalItems) {\n return allItems[focusedIndexRef.current];\n }\n return null;\n }, [allItems, totalItems]);\n\n const isFocusedFolder = useCallback(\n (index: number): boolean => {\n return index < folders.length;\n },\n [folders.length],\n );\n\n const isFocusedFile = useCallback(\n (index: number): boolean => {\n return index >= folders.length;\n },\n [folders.length],\n );\n\n const getFocusedFile = useCallback((): FileItem | null => {\n const idx = focusedIndexRef.current;\n if (isFocusedFile(idx)) {\n return files[idx - folders.length] ?? null;\n }\n return null;\n }, [files, folders.length, isFocusedFile]);\n\n const getFocusedFolder = useCallback((): FolderItem | null => {\n const idx = focusedIndexRef.current;\n if (isFocusedFolder(idx)) {\n return folders[idx] ?? null;\n }\n return null;\n }, [folders, isFocusedFolder]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n const target = event.target as HTMLElement;\n const isInputFocused =\n target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.isContentEditable;\n\n if (isInputFocused) {\n return;\n }\n\n const isBinTab = activeTab === \"bin\";\n\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current + 1);\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current - 1);\n break;\n }\n case \"ArrowRight\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current + 1);\n break;\n }\n case \"ArrowLeft\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current - 1);\n break;\n }\n case \"Enter\": {\n event.preventDefault();\n const folder = getFocusedFolder();\n if (folder) {\n onFolderOpen?.(folder);\n } else {\n const file = getFocusedFile();\n if (file) {\n onFilePreview?.(file);\n }\n }\n break;\n }\n case \" \": {\n event.preventDefault();\n const folder = getFocusedFolder();\n if (folder) {\n toggleFolderSelection(folder.id);\n } else {\n const file = getFocusedFile();\n if (file) {\n toggleFileSelection(file.id);\n }\n }\n break;\n }\n case \"Delete\":\n case \"Backspace\": {\n event.preventDefault();\n if (isBinTab) {\n return;\n }\n const folder = getFocusedFolder();\n if (folder) {\n onFolderDelete?.(folder);\n } else {\n const file = getFocusedFile();\n if (file) {\n onFileDelete?.(file);\n }\n }\n break;\n }\n case \"Escape\": {\n event.preventDefault();\n clearSelection();\n setFocusedIndex(-1);\n break;\n }\n case \"a\":\n case \"A\": {\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n const fileIds = files.map((f) => f.id);\n const folderIds = folders.map((f) => f.id);\n selectAllFiles(fileIds);\n selectAllFolders(folderIds);\n }\n break;\n }\n }\n },\n [\n activeTab,\n clearSelection,\n files,\n folders,\n getFocusedFile,\n getFocusedFolder,\n onFileDelete,\n onFilePreview,\n onFolderDelete,\n onFolderOpen,\n selectAllFiles,\n selectAllFolders,\n setFocusedIndex,\n toggleFileSelection,\n toggleFolderSelection,\n ],\n );\n\n useEffect(() => {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleKeyDown]);\n\n return {\n focusedIndex: focusedIndexRef.current,\n setFocusedIndex,\n getFocusedItem,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useKeyboardNavigation.js","names":[],"sources":["../../../src/files/hooks/useKeyboardNavigation.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport type { FileItem, FolderItem } from \"../types\";\nimport { useFilesStore } from \"../store/filesStore\";\n\ninterface UseKeyboardNavigationOptions {\n files: FileItem[];\n folders: FolderItem[];\n onFilePreview?: (file: FileItem) => void;\n onFileDelete?: (file: FileItem) => void;\n onFolderOpen?: (folder: FolderItem) => void;\n onFolderDelete?: (folder: FolderItem) => void;\n activeTab: string;\n}\n\nexport function useKeyboardNavigation({\n files,\n folders,\n onFilePreview,\n onFileDelete,\n onFolderOpen,\n onFolderDelete,\n activeTab,\n}: UseKeyboardNavigationOptions) {\n const focusedIndexRef = useRef<number>(-1);\n const {\n selectedFiles,\n selectedFolders,\n clearSelection,\n selectFile,\n selectFolder,\n toggleFileSelection,\n toggleFolderSelection,\n selectAllFiles,\n selectAllFolders,\n } = useFilesStore();\n\n const allItems = useMemo(() => [...folders, ...files], [folders, files]);\n const totalItems = allItems.length;\n\n const setFocusedIndex = useCallback(\n (index: number) => {\n const clampedIndex = Math.max(-1, Math.min(index, totalItems - 1));\n focusedIndexRef.current = clampedIndex;\n },\n [totalItems],\n );\n\n const getFocusedItem = useCallback(() => {\n if (focusedIndexRef.current >= 0 && focusedIndexRef.current < totalItems) {\n return allItems[focusedIndexRef.current];\n }\n return null;\n }, [allItems, totalItems]);\n\n const isFocusedFolder = useCallback(\n (index: number): boolean => {\n return index < folders.length;\n },\n [folders.length],\n );\n\n const isFocusedFile = useCallback(\n (index: number): boolean => {\n return index >= folders.length;\n },\n [folders.length],\n );\n\n const getFocusedFile = useCallback((): FileItem | null => {\n const idx = focusedIndexRef.current;\n if (isFocusedFile(idx)) {\n return files[idx - folders.length] ?? null;\n }\n return null;\n }, [files, folders.length, isFocusedFile]);\n\n const getFocusedFolder = useCallback((): FolderItem | null => {\n const idx = focusedIndexRef.current;\n if (isFocusedFolder(idx)) {\n return folders[idx] ?? null;\n }\n return null;\n }, [folders, isFocusedFolder]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n const target = event.target as HTMLElement;\n const isInputFocused =\n target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.isContentEditable;\n\n if (isInputFocused) {\n return;\n }\n\n const isBinTab = activeTab === \"bin\";\n\n switch (event.key) {\n case \"ArrowDown\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current + 1);\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current - 1);\n break;\n }\n case \"ArrowRight\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current + 1);\n break;\n }\n case \"ArrowLeft\": {\n event.preventDefault();\n setFocusedIndex(focusedIndexRef.current - 1);\n break;\n }\n case \"Enter\": {\n event.preventDefault();\n const folder = getFocusedFolder();\n if (folder) {\n onFolderOpen?.(folder);\n } else {\n const file = getFocusedFile();\n if (file) {\n onFilePreview?.(file);\n }\n }\n break;\n }\n case \" \": {\n event.preventDefault();\n const folder = getFocusedFolder();\n if (folder) {\n toggleFolderSelection(folder.id);\n } else {\n const file = getFocusedFile();\n if (file) {\n toggleFileSelection(file.id);\n }\n }\n break;\n }\n case \"Delete\":\n case \"Backspace\": {\n event.preventDefault();\n if (isBinTab) {\n return;\n }\n const folder = getFocusedFolder();\n if (folder) {\n onFolderDelete?.(folder);\n } else {\n const file = getFocusedFile();\n if (file) {\n onFileDelete?.(file);\n }\n }\n break;\n }\n case \"Escape\": {\n event.preventDefault();\n clearSelection();\n setFocusedIndex(-1);\n break;\n }\n case \"a\":\n case \"A\": {\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n const fileIds = files.map((f) => f.id);\n const folderIds = folders.map((f) => f.id);\n selectAllFiles(fileIds);\n selectAllFolders(folderIds);\n }\n break;\n }\n }\n },\n [\n activeTab,\n clearSelection,\n files,\n folders,\n getFocusedFile,\n getFocusedFolder,\n onFileDelete,\n onFilePreview,\n onFolderDelete,\n onFolderOpen,\n selectAllFiles,\n selectAllFolders,\n setFocusedIndex,\n toggleFileSelection,\n toggleFolderSelection,\n ],\n );\n\n useEffect(() => {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleKeyDown]);\n\n return {\n focusedIndex: focusedIndexRef.current,\n setFocusedIndex,\n getFocusedItem,\n };\n}\n"],"mappings":"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"}
@@ -4,8 +4,7 @@ var t = () => {
4
4
  let [t, { loading: n, error: r }] = e({ refetchQueries: [
5
5
  "GetFilesRootBrowsePage",
6
6
  "GetFilesFolderBrowsePage",
7
- "GetFilesRecentPage",
8
- "GetFiles"
7
+ "GetFilesRecentPage"
9
8
  ] });
10
9
  return {
11
10
  mutateAsync: async ({ fileId: e, targetFolderId: n }) => (await t({ variables: { input: {
@@ -1 +1 @@
1
- {"version":3,"file":"useMoveFile.js","names":[],"sources":["../../../src/files/hooks/useMoveFile.ts"],"sourcesContent":["import { useMoveFileMutation } from \"../../generated/wspace-operations\";\n\nexport interface MoveFileInput {\n fileId: string;\n targetFolderId: string | null;\n}\n\nexport const useMoveFile = () => {\n const [moveFileMutation, { loading, error }] = useMoveFileMutation({\n refetchQueries: [\n \"GetFilesRootBrowsePage\",\n \"GetFilesFolderBrowsePage\",\n \"GetFilesRecentPage\",\n \"GetFiles\",\n ],\n });\n\n return {\n mutateAsync: async ({ fileId, targetFolderId }: MoveFileInput) => {\n const result = await moveFileMutation({\n variables: {\n input: {\n fileId,\n targetFolderId,\n },\n },\n });\n return result.data?.moveFile;\n },\n isPending: loading,\n error,\n };\n};\n"],"mappings":";;AAOA,IAAa,UAAoB;CAC/B,IAAM,CAAC,GAAkB,EAAE,YAAS,cAAW,EAAoB,EACjE,gBAAgB;EACd;EACA;EACA;EACA;EACD,EACF,CAAC;AAEF,QAAO;EACL,aAAa,OAAO,EAAE,WAAQ,yBACb,MAAM,EAAiB,EACpC,WAAW,EACT,OAAO;GACL;GACA;GACD,EACF,EACF,CAAC,EACY,MAAM;EAEtB,WAAW;EACX;EACD"}
1
+ {"version":3,"file":"useMoveFile.js","names":[],"sources":["../../../src/files/hooks/useMoveFile.ts"],"sourcesContent":["import { useMoveFileMutation } from \"../../generated/wspace-operations\";\n\nexport interface MoveFileInput {\n fileId: string;\n targetFolderId: string | null;\n}\n\nexport const useMoveFile = () => {\n const [moveFileMutation, { loading, error }] = useMoveFileMutation({\n refetchQueries: [\n \"GetFilesRootBrowsePage\",\n \"GetFilesFolderBrowsePage\",\n \"GetFilesRecentPage\",\n ],\n });\n\n return {\n mutateAsync: async ({ fileId, targetFolderId }: MoveFileInput) => {\n const result = await moveFileMutation({\n variables: {\n input: {\n fileId,\n targetFolderId,\n },\n },\n });\n return result.data?.moveFile;\n },\n isPending: loading,\n error,\n };\n};\n"],"mappings":";;AAOA,IAAa,UAAoB;CAC/B,IAAM,CAAC,GAAkB,EAAE,YAAS,cAAW,EAAoB,EACjE,gBAAgB;EACd;EACA;EACA;EACD,EACF,CAAC;AAEF,QAAO;EACL,aAAa,OAAO,EAAE,WAAQ,yBACb,MAAM,EAAiB,EACpC,WAAW,EACT,OAAO;GACL;GACA;GACD,EACF,EACF,CAAC,EACY,MAAM;EAEtB,WAAW;EACX;EACD"}
@@ -4,8 +4,6 @@ var t = () => {
4
4
  let [t, { loading: n, error: r }] = e({ refetchQueries: [
5
5
  "GetFilesRootBrowsePage",
6
6
  "GetFilesFolderBrowsePage",
7
- "GetFoldersRootBrowsePage",
8
- "GetFoldersFolderBrowsePage",
9
7
  "GetFilesRecentPage",
10
8
  "GetFolders"
11
9
  ] });
@@ -1 +1 @@
1
- {"version":3,"file":"useMoveFolder.js","names":[],"sources":["../../../src/files/hooks/useMoveFolder.ts"],"sourcesContent":["import { useMoveFolderMutation } from \"../../generated/wspace-operations\";\n\nexport interface MoveFolderInput {\n folderId: string;\n targetParentFolderId: string | null;\n}\n\nexport const useMoveFolder = () => {\n const [moveFolderMutation, { loading, error }] = useMoveFolderMutation({\n refetchQueries: [\n \"GetFilesRootBrowsePage\",\n \"GetFilesFolderBrowsePage\",\n \"GetFoldersRootBrowsePage\",\n \"GetFoldersFolderBrowsePage\",\n \"GetFilesRecentPage\",\n \"GetFolders\",\n ],\n });\n\n return {\n mutateAsync: async ({\n folderId,\n targetParentFolderId,\n }: MoveFolderInput) => {\n const result = await moveFolderMutation({\n variables: {\n input: {\n folderId,\n targetParentFolderId,\n },\n },\n });\n\n return result.data?.moveFolder;\n },\n isPending: loading,\n error,\n };\n};\n"],"mappings":";;AAOA,IAAa,UAAsB;CACjC,IAAM,CAAC,GAAoB,EAAE,YAAS,cAAW,EAAsB,EACrE,gBAAgB;EACd;EACA;EACA;EACA;EACA;EACA;EACD,EACF,CAAC;AAEF,QAAO;EACL,aAAa,OAAO,EAClB,aACA,+BAEe,MAAM,EAAmB,EACtC,WAAW,EACT,OAAO;GACL;GACA;GACD,EACF,EACF,CAAC,EAEY,MAAM;EAEtB,WAAW;EACX;EACD"}
1
+ {"version":3,"file":"useMoveFolder.js","names":[],"sources":["../../../src/files/hooks/useMoveFolder.ts"],"sourcesContent":["import { useMoveFolderMutation } from \"../../generated/wspace-operations\";\n\nexport interface MoveFolderInput {\n folderId: string;\n targetParentFolderId: string | null;\n}\n\nexport const useMoveFolder = () => {\n const [moveFolderMutation, { loading, error }] = useMoveFolderMutation({\n refetchQueries: [\n \"GetFilesRootBrowsePage\",\n \"GetFilesFolderBrowsePage\",\n \"GetFilesRecentPage\",\n \"GetFolders\",\n ],\n });\n\n return {\n mutateAsync: async ({\n folderId,\n targetParentFolderId,\n }: MoveFolderInput) => {\n const result = await moveFolderMutation({\n variables: {\n input: {\n folderId,\n targetParentFolderId,\n },\n },\n });\n\n return result.data?.moveFolder;\n },\n isPending: loading,\n error,\n };\n};\n"],"mappings":";;AAOA,IAAa,UAAsB;CACjC,IAAM,CAAC,GAAoB,EAAE,YAAS,cAAW,EAAsB,EACrE,gBAAgB;EACd;EACA;EACA;EACA;EACD,EACF,CAAC;AAEF,QAAO;EACL,aAAa,OAAO,EAClB,aACA,+BAEe,MAAM,EAAmB,EACtC,WAAW,EACT,OAAO;GACL;GACA;GACD,EACF,EACF,CAAC,EAEY,MAAM;EAEtB,WAAW;EACX;EACD"}
@@ -3,13 +3,14 @@ import { useGetFilesStarredPageQuery as e } from "../../generated/wspace-operati
3
3
  var t = (t) => {
4
4
  let n = e({
5
5
  variables: { pagination: { limit: 100 } },
6
- skip: t?.skip
7
- });
6
+ skip: t?.skip,
7
+ errorPolicy: "all"
8
+ }), r = (n.error?.message ?? "").includes("FEATURE_DISABLED");
8
9
  return {
9
10
  files: n.data?.getStarredFiles?.files || [],
10
11
  folders: n.data?.getStarredFolders?.folders || [],
11
12
  isLoading: n.loading,
12
- error: n.error ?? null
13
+ error: r ? null : n.error ?? null
13
14
  };
14
15
  };
15
16
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useStarredItems.js","names":[],"sources":["../../../src/files/hooks/useStarredItems.ts"],"sourcesContent":["/**\n * Starred Items Hook\n *\n * Fetches starred files and folders for the starred view.\n * Uses one page-owned query for both starred files and folders.\n */\n\nimport { useGetFilesStarredPageQuery } from \"../../generated/wspace-operations\";\nimport type { FileItem, FolderItem } from \"../types\";\n\nexport const useStarredItems = (options?: { skip?: boolean }) => {\n const query = useGetFilesStarredPageQuery({\n variables: {\n pagination: { limit: 100 },\n },\n skip: options?.skip,\n });\n\n return {\n files: (query.data?.getStarredFiles?.files || []) as FileItem[],\n folders: (query.data?.getStarredFolders?.folders || []) as FolderItem[],\n isLoading: query.loading,\n error: query.error ?? null,\n };\n};\n"],"mappings":";;AAUA,IAAa,KAAmB,MAAiC;CAC/D,IAAM,IAAQ,EAA4B;EACxC,WAAW,EACT,YAAY,EAAE,OAAO,KAAK,EAC3B;EACD,MAAM,GAAS;EAChB,CAAC;AAEF,QAAO;EACL,OAAQ,EAAM,MAAM,iBAAiB,SAAS,EAAE;EAChD,SAAU,EAAM,MAAM,mBAAmB,WAAW,EAAE;EACtD,WAAW,EAAM;EACjB,OAAO,EAAM,SAAS;EACvB"}
1
+ {"version":3,"file":"useStarredItems.js","names":[],"sources":["../../../src/files/hooks/useStarredItems.ts"],"sourcesContent":["/**\n * Starred Items Hook\n *\n * Fetches starred files and folders for the starred view.\n * Uses one page-owned query for both starred files and folders.\n */\n\nimport { useGetFilesStarredPageQuery } from \"../../generated/wspace-operations\";\nimport type { FileItem, FolderItem } from \"../types\";\n\nexport const useStarredItems = (options?: { skip?: boolean }) => {\n const query = useGetFilesStarredPageQuery({\n variables: {\n pagination: { limit: 100 },\n },\n skip: options?.skip,\n errorPolicy: \"all\",\n });\n\n // ApolloError serialises all graphQL error messages into its top-level\n // message, so checking for the code string is a reliable way to detect\n // FEATURE_DISABLED without depending on Apollo 4's restricted ErrorLike type.\n const isFeatureDisabled = (query.error?.message ?? \"\").includes(\n \"FEATURE_DISABLED\",\n );\n\n return {\n files: (query.data?.getStarredFiles?.files || []) as FileItem[],\n folders: (query.data?.getStarredFolders?.folders || []) as FolderItem[],\n isLoading: query.loading,\n error: isFeatureDisabled ? null : (query.error ?? null),\n };\n};\n"],"mappings":";;AAUA,IAAa,KAAmB,MAAiC;CAC/D,IAAM,IAAQ,EAA4B;EACxC,WAAW,EACT,YAAY,EAAE,OAAO,KAAK,EAC3B;EACD,MAAM,GAAS;EACf,aAAa;EACd,CAAC,EAKI,KAAqB,EAAM,OAAO,WAAW,IAAI,SACrD,mBACD;AAED,QAAO;EACL,OAAQ,EAAM,MAAM,iBAAiB,SAAS,EAAE;EAChD,SAAU,EAAM,MAAM,mBAAmB,WAAW,EAAE;EACtD,WAAW,EAAM;EACjB,OAAO,IAAoB,OAAQ,EAAM,SAAS;EACnD"}
@@ -2,17 +2,17 @@ import { useToggleFileStarredMutation as e, useToggleFolderStarredMutation as t
2
2
  //#region src/files/hooks/useToggleStar.ts
3
3
  var n = () => {
4
4
  let [n, { loading: r, error: i }] = e({ refetchQueries: [
5
- "GetFiles",
6
- "GetFolders",
7
- "GetStarredFiles",
8
- "GetStarredFolders",
9
- "GetRecentFiles"
5
+ "GetFilesRootBrowsePage",
6
+ "GetFilesFolderBrowsePage",
7
+ "GetFilesStarredPage",
8
+ "GetFilesRecentPage",
9
+ "GetFolders"
10
10
  ] }), [a, { loading: o, error: s }] = t({ refetchQueries: [
11
- "GetFiles",
12
- "GetFolders",
13
- "GetStarredFiles",
14
- "GetStarredFolders",
15
- "GetRecentFiles"
11
+ "GetFilesRootBrowsePage",
12
+ "GetFilesFolderBrowsePage",
13
+ "GetFilesStarredPage",
14
+ "GetFilesRecentPage",
15
+ "GetFolders"
16
16
  ] });
17
17
  return {
18
18
  mutateAsync: async ({ id: e, type: t }) => t === "file" ? (await n({ variables: { id: e } })).data?.toggleFileStarred : (await a({ variables: { id: e } })).data?.toggleFolderStarred,
@@ -1 +1 @@
1
- {"version":3,"file":"useToggleStar.js","names":[],"sources":["../../../src/files/hooks/useToggleStar.ts"],"sourcesContent":["import {\n useToggleFileStarredMutation,\n useToggleFolderStarredMutation,\n} from \"../../generated/wspace-operations\";\n\nexport interface ToggleStarInput {\n id: string;\n type: \"file\" | \"folder\";\n}\n\nexport const useToggleStar = () => {\n const [\n toggleFileStarredMutation,\n { loading: fileLoading, error: fileError },\n ] = useToggleFileStarredMutation({\n refetchQueries: [\n \"GetFiles\",\n \"GetFolders\",\n \"GetStarredFiles\",\n \"GetStarredFolders\",\n \"GetRecentFiles\",\n ],\n });\n\n const [\n toggleFolderStarredMutation,\n { loading: folderLoading, error: folderError },\n ] = useToggleFolderStarredMutation({\n refetchQueries: [\n \"GetFiles\",\n \"GetFolders\",\n \"GetStarredFiles\",\n \"GetStarredFolders\",\n \"GetRecentFiles\",\n ],\n });\n\n return {\n mutateAsync: async ({ id, type }: ToggleStarInput) => {\n if (type === \"file\") {\n const result = await toggleFileStarredMutation({\n variables: { id },\n });\n return result.data?.toggleFileStarred;\n } else {\n const result = await toggleFolderStarredMutation({\n variables: { id },\n });\n return result.data?.toggleFolderStarred;\n }\n },\n isPending: fileLoading || folderLoading,\n error: fileError || folderError,\n };\n};\n"],"mappings":";;AAUA,IAAa,UAAsB;CACjC,IAAM,CACJ,GACA,EAAE,SAAS,GAAa,OAAO,OAC7B,EAA6B,EAC/B,gBAAgB;EACd;EACA;EACA;EACA;EACA;EACD,EACF,CAAC,EAEI,CACJ,GACA,EAAE,SAAS,GAAe,OAAO,OAC/B,EAA+B,EACjC,gBAAgB;EACd;EACA;EACA;EACA;EACA;EACD,EACF,CAAC;AAEF,QAAO;EACL,aAAa,OAAO,EAAE,OAAI,cACpB,MAAS,UACI,MAAM,EAA0B,EAC7C,WAAW,EAAE,OAAI,EAClB,CAAC,EACY,MAAM,qBAEL,MAAM,EAA4B,EAC/C,WAAW,EAAE,OAAI,EAClB,CAAC,EACY,MAAM;EAGxB,WAAW,KAAe;EAC1B,OAAO,KAAa;EACrB"}
1
+ {"version":3,"file":"useToggleStar.js","names":[],"sources":["../../../src/files/hooks/useToggleStar.ts"],"sourcesContent":["import {\n useToggleFileStarredMutation,\n useToggleFolderStarredMutation,\n} from \"../../generated/wspace-operations\";\n\nexport interface ToggleStarInput {\n id: string;\n type: \"file\" | \"folder\";\n}\n\nexport const useToggleStar = () => {\n const [\n toggleFileStarredMutation,\n { loading: fileLoading, error: fileError },\n ] = useToggleFileStarredMutation({\n refetchQueries: [\n \"GetFilesRootBrowsePage\",\n \"GetFilesFolderBrowsePage\",\n \"GetFilesStarredPage\",\n \"GetFilesRecentPage\",\n \"GetFolders\",\n ],\n });\n\n const [\n toggleFolderStarredMutation,\n { loading: folderLoading, error: folderError },\n ] = useToggleFolderStarredMutation({\n refetchQueries: [\n \"GetFilesRootBrowsePage\",\n \"GetFilesFolderBrowsePage\",\n \"GetFilesStarredPage\",\n \"GetFilesRecentPage\",\n \"GetFolders\",\n ],\n });\n\n return {\n mutateAsync: async ({ id, type }: ToggleStarInput) => {\n if (type === \"file\") {\n const result = await toggleFileStarredMutation({\n variables: { id },\n });\n return result.data?.toggleFileStarred;\n } else {\n const result = await toggleFolderStarredMutation({\n variables: { id },\n });\n return result.data?.toggleFolderStarred;\n }\n },\n isPending: fileLoading || folderLoading,\n error: fileError || folderError,\n };\n};\n"],"mappings":";;AAUA,IAAa,UAAsB;CACjC,IAAM,CACJ,GACA,EAAE,SAAS,GAAa,OAAO,OAC7B,EAA6B,EAC/B,gBAAgB;EACd;EACA;EACA;EACA;EACA;EACD,EACF,CAAC,EAEI,CACJ,GACA,EAAE,SAAS,GAAe,OAAO,OAC/B,EAA+B,EACjC,gBAAgB;EACd;EACA;EACA;EACA;EACA;EACD,EACF,CAAC;AAEF,QAAO;EACL,aAAa,OAAO,EAAE,OAAI,cACpB,MAAS,UACI,MAAM,EAA0B,EAC7C,WAAW,EAAE,OAAI,EAClB,CAAC,EACY,MAAM,qBAEL,MAAM,EAA4B,EAC/C,WAAW,EAAE,OAAI,EAClB,CAAC,EACY,MAAM;EAGxB,WAAW,KAAe;EAC1B,OAAO,KAAa;EACrB"}