@ai-matrx/media 0.8.0 → 0.9.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.
- package/CHANGELOG.md +21 -0
- package/dist/files/engine/api/assets.d.ts +223 -0
- package/dist/files/engine/api/assets.js +124 -0
- package/dist/files/engine/api/assets.js.map +1 -0
- package/dist/files/engine/api/direct.d.ts +43 -0
- package/dist/files/engine/api/direct.js +73 -0
- package/dist/files/engine/api/direct.js.map +1 -0
- package/dist/files/engine/api/fileOrganization.d.ts +34 -0
- package/dist/files/engine/api/fileOrganization.js +38 -0
- package/dist/files/engine/api/fileOrganization.js.map +1 -0
- package/dist/files/engine/api/files.d.ts +249 -0
- package/dist/files/engine/api/files.js +231 -0
- package/dist/files/engine/api/files.js.map +1 -0
- package/dist/files/engine/api/folders.d.ts +63 -0
- package/dist/files/engine/api/folders.js +56 -0
- package/dist/files/engine/api/folders.js.map +1 -0
- package/dist/files/engine/api/office.d.ts +27 -0
- package/dist/files/engine/api/office.js +19 -0
- package/dist/files/engine/api/office.js.map +1 -0
- package/dist/files/engine/api/permissions.d.ts +37 -0
- package/dist/files/engine/api/permissions.js +109 -0
- package/dist/files/engine/api/permissions.js.map +1 -0
- package/dist/files/engine/api/versions.d.ts +26 -0
- package/dist/files/engine/api/versions.js +37 -0
- package/dist/files/engine/api/versions.js.map +1 -0
- package/dist/files/engine/cache/idb-store.d.ts +95 -0
- package/dist/files/engine/cache/idb-store.js +172 -0
- package/dist/files/engine/cache/idb-store.js.map +1 -0
- package/dist/files/engine/cache/policy.d.ts +14 -0
- package/dist/files/engine/cache/policy.js +40 -0
- package/dist/files/engine/cache/policy.js.map +1 -0
- package/dist/files/engine/cache/register-service-worker.d.ts +57 -0
- package/dist/files/engine/cache/register-service-worker.js +80 -0
- package/dist/files/engine/cache/register-service-worker.js.map +1 -0
- package/dist/files/engine/db-types.d.ts +48865 -0
- package/dist/files/engine/db-types.js +1 -0
- package/dist/files/engine/db-types.js.map +1 -0
- package/dist/files/engine/filesDb.d.ts +1913 -0
- package/dist/files/engine/filesDb.js +28 -0
- package/dist/files/engine/filesDb.js.map +1 -0
- package/dist/files/engine/handler/handler.d.ts +82 -0
- package/dist/files/engine/handler/handler.js +124 -0
- package/dist/files/engine/handler/handler.js.map +1 -0
- package/dist/files/engine/handler/hooks/useFile.d.ts +17 -0
- package/dist/files/engine/handler/hooks/useFile.js +75 -0
- package/dist/files/engine/handler/hooks/useFile.js.map +1 -0
- package/dist/files/engine/handler/hooks/useFileUpload.d.ts +76 -0
- package/dist/files/engine/handler/hooks/useFileUpload.js +67 -0
- package/dist/files/engine/handler/hooks/useFileUpload.js.map +1 -0
- package/dist/files/engine/handler/input/normalize.d.ts +14 -0
- package/dist/files/engine/handler/input/normalize.js +365 -0
- package/dist/files/engine/handler/input/normalize.js.map +1 -0
- package/dist/files/engine/handler/intelligence/access.d.ts +35 -0
- package/dist/files/engine/handler/intelligence/access.js +85 -0
- package/dist/files/engine/handler/intelligence/access.js.map +1 -0
- package/dist/files/engine/handler/intelligence/magic-bytes.d.ts +21 -0
- package/dist/files/engine/handler/intelligence/magic-bytes.js +67 -0
- package/dist/files/engine/handler/intelligence/magic-bytes.js.map +1 -0
- package/dist/files/engine/handler/output/target.d.ts +19 -0
- package/dist/files/engine/handler/output/target.js +222 -0
- package/dist/files/engine/handler/output/target.js.map +1 -0
- package/dist/files/engine/handler/resolver.d.ts +34 -0
- package/dist/files/engine/handler/resolver.js +133 -0
- package/dist/files/engine/handler/resolver.js.map +1 -0
- package/dist/files/engine/handler/types.d.ts +367 -0
- package/dist/files/engine/handler/types.js +1 -0
- package/dist/files/engine/handler/types.js.map +1 -0
- package/dist/files/engine/handler/upload.d.ts +32 -0
- package/dist/files/engine/handler/upload.js +295 -0
- package/dist/files/engine/handler/upload.js.map +1 -0
- package/dist/files/engine/handler/utils/classify.d.ts +14 -0
- package/dist/files/engine/handler/utils/classify.js +27 -0
- package/dist/files/engine/handler/utils/classify.js.map +1 -0
- package/dist/files/engine/handler/utils/prefer-locator.d.ts +32 -0
- package/dist/files/engine/handler/utils/prefer-locator.js +34 -0
- package/dist/files/engine/handler/utils/prefer-locator.js.map +1 -0
- package/dist/files/engine/handler/utils/python-base.d.ts +129 -0
- package/dist/files/engine/handler/utils/python-base.js +60 -0
- package/dist/files/engine/handler/utils/python-base.js.map +1 -0
- package/dist/files/engine/hooks/blob-cache.d.ts +130 -0
- package/dist/files/engine/hooks/blob-cache.js +162 -0
- package/dist/files/engine/hooks/blob-cache.js.map +1 -0
- package/dist/files/engine/hooks/office-extraction-cache.d.ts +28 -0
- package/dist/files/engine/hooks/office-extraction-cache.js +67 -0
- package/dist/files/engine/hooks/office-extraction-cache.js.map +1 -0
- package/dist/files/engine/host/configure.d.ts +166 -0
- package/dist/files/engine/host/configure.js +31 -0
- package/dist/files/engine/host/configure.js.map +1 -0
- package/dist/files/engine/host/org.d.ts +8 -0
- package/dist/files/engine/host/org.js +16 -0
- package/dist/files/engine/host/org.js.map +1 -0
- package/dist/files/engine/host/python-client.d.ts +60 -0
- package/dist/files/engine/host/python-client.js +46 -0
- package/dist/files/engine/host/python-client.js.map +1 -0
- package/dist/files/engine/host/share-links.d.ts +20 -0
- package/dist/files/engine/host/share-links.js +32 -0
- package/dist/files/engine/host/share-links.js.map +1 -0
- package/dist/files/engine/host/store.d.ts +24 -0
- package/dist/files/engine/host/store.js +23 -0
- package/dist/files/engine/host/store.js.map +1 -0
- package/dist/files/engine/host/supabase.d.ts +3808 -0
- package/dist/files/engine/host/supabase.js +33 -0
- package/dist/files/engine/host/supabase.js.map +1 -0
- package/dist/files/engine/host/toast.d.ts +14 -0
- package/dist/files/engine/host/toast.js +20 -0
- package/dist/files/engine/host/toast.js.map +1 -0
- package/dist/files/engine/host/typed-client.d.ts +136 -0
- package/dist/files/engine/host/typed-client.js +66 -0
- package/dist/files/engine/host/typed-client.js.map +1 -0
- package/dist/files/engine/index.d.ts +22 -0
- package/dist/files/engine/index.js +49 -0
- package/dist/files/engine/index.js.map +1 -0
- package/dist/files/engine/media/our-file-sources.d.ts +39 -0
- package/dist/files/engine/media/our-file-sources.js +83 -0
- package/dist/files/engine/media/our-file-sources.js.map +1 -0
- package/dist/files/engine/media/signed-url.d.ts +1 -0
- package/dist/files/engine/media/signed-url.js +6 -0
- package/dist/files/engine/media/signed-url.js.map +1 -0
- package/dist/files/engine/redux/converters.d.ts +73 -0
- package/dist/files/engine/redux/converters.js +286 -0
- package/dist/files/engine/redux/converters.js.map +1 -0
- package/dist/files/engine/redux/file-hydration.d.ts +15 -0
- package/dist/files/engine/redux/file-hydration.js +46 -0
- package/dist/files/engine/redux/file-hydration.js.map +1 -0
- package/dist/files/engine/redux/file-tree-auth-boundary.d.ts +5 -0
- package/dist/files/engine/redux/file-tree-auth-boundary.js +28 -0
- package/dist/files/engine/redux/file-tree-auth-boundary.js.map +1 -0
- package/dist/files/engine/redux/file-tree-timeout.d.ts +32 -0
- package/dist/files/engine/redux/file-tree-timeout.js +73 -0
- package/dist/files/engine/redux/file-tree-timeout.js.map +1 -0
- package/dist/files/engine/redux/mutation-toast-middleware.d.ts +27 -0
- package/dist/files/engine/redux/mutation-toast-middleware.js +103 -0
- package/dist/files/engine/redux/mutation-toast-middleware.js.map +1 -0
- package/dist/files/engine/redux/realtime-middleware.d.ts +61 -0
- package/dist/files/engine/redux/realtime-middleware.js +431 -0
- package/dist/files/engine/redux/realtime-middleware.js.map +1 -0
- package/dist/files/engine/redux/request-ledger.d.ts +68 -0
- package/dist/files/engine/redux/request-ledger.js +66 -0
- package/dist/files/engine/redux/request-ledger.js.map +1 -0
- package/dist/files/engine/redux/selectors.d.ts +3254 -0
- package/dist/files/engine/redux/selectors.js +428 -0
- package/dist/files/engine/redux/selectors.js.map +1 -0
- package/dist/files/engine/redux/slice.d.ts +157 -0
- package/dist/files/engine/redux/slice.js +836 -0
- package/dist/files/engine/redux/slice.js.map +1 -0
- package/dist/files/engine/redux/thunks.d.ts +449 -0
- package/dist/files/engine/redux/thunks.js +1684 -0
- package/dist/files/engine/redux/thunks.js.map +1 -0
- package/dist/files/engine/redux/tree-utils.d.ts +90 -0
- package/dist/files/engine/redux/tree-utils.js +200 -0
- package/dist/files/engine/redux/tree-utils.js.map +1 -0
- package/dist/files/engine/support/claimsUser.d.ts +77 -0
- package/dist/files/engine/support/claimsUser.js +48 -0
- package/dist/files/engine/support/claimsUser.js.map +1 -0
- package/dist/files/engine/support/datetime.d.ts +6 -0
- package/dist/files/engine/support/datetime.js +15 -0
- package/dist/files/engine/support/datetime.js.map +1 -0
- package/dist/files/engine/support/document-visibility.d.ts +14 -0
- package/dist/files/engine/support/document-visibility.js +28 -0
- package/dist/files/engine/support/document-visibility.js.map +1 -0
- package/dist/files/engine/support/logger.d.ts +28 -0
- package/dist/files/engine/support/logger.js +36 -0
- package/dist/files/engine/support/logger.js.map +1 -0
- package/dist/files/engine/types.d.ts +1081 -0
- package/dist/files/engine/types.js +30 -0
- package/dist/files/engine/types.js.map +1 -0
- package/dist/files/engine/upload/cloudUpload.d.ts +182 -0
- package/dist/files/engine/upload/cloudUpload.js +418 -0
- package/dist/files/engine/upload/cloudUpload.js.map +1 -0
- package/dist/files/engine/upload/tusUpload.d.ts +100 -0
- package/dist/files/engine/upload/tusUpload.js +258 -0
- package/dist/files/engine/upload/tusUpload.js.map +1 -0
- package/dist/files/engine/upload/uploadDedupGuard.d.ts +58 -0
- package/dist/files/engine/upload/uploadDedupGuard.js +41 -0
- package/dist/files/engine/upload/uploadDedupGuard.js.map +1 -0
- package/dist/files/engine/upload/uploadGuardOpeners.d.ts +70 -0
- package/dist/files/engine/upload/uploadGuardOpeners.js +54 -0
- package/dist/files/engine/upload/uploadGuardOpeners.js.map +1 -0
- package/dist/files/engine/utils/file-types.d.ts +243 -0
- package/dist/files/engine/utils/file-types.js +1722 -0
- package/dist/files/engine/utils/file-types.js.map +1 -0
- package/dist/files/engine/utils/user-visible.d.ts +133 -0
- package/dist/files/engine/utils/user-visible.js +115 -0
- package/dist/files/engine/utils/user-visible.js.map +1 -0
- package/package.json +392 -8
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { createSelector } from "reselect";
|
|
3
|
+
import {
|
|
4
|
+
EMPTY_TREE_CHILDREN,
|
|
5
|
+
sortChildren as sortChildrenUtil
|
|
6
|
+
} from "./tree-utils.js";
|
|
7
|
+
const EMPTY_CLOUD_FILE_PERMISSIONS = [];
|
|
8
|
+
const EMPTY_CLOUD_SHARE_LINKS = [];
|
|
9
|
+
const EMPTY_CLOUD_FILE_VERSIONS = [];
|
|
10
|
+
const EMPTY_PENDING_REQUEST_IDS = [];
|
|
11
|
+
const selectSlice = (state) => state.cloudFiles;
|
|
12
|
+
const selectAllFilesMap = createSelector(
|
|
13
|
+
[selectSlice],
|
|
14
|
+
(slice) => slice.filesById
|
|
15
|
+
);
|
|
16
|
+
const selectAllFilesArray = createSelector(
|
|
17
|
+
[selectAllFilesMap],
|
|
18
|
+
(map) => Object.values(map)
|
|
19
|
+
);
|
|
20
|
+
const selectFileById = createSelector(
|
|
21
|
+
[selectAllFilesMap, (_state, id) => id],
|
|
22
|
+
(map, id) => map[id]
|
|
23
|
+
);
|
|
24
|
+
const selectFileCurrentVersion = createSelector(
|
|
25
|
+
[selectAllFilesMap, (_state, id) => id],
|
|
26
|
+
(map, id) => map[id]?.currentVersion
|
|
27
|
+
);
|
|
28
|
+
function getFileFromState(state, id) {
|
|
29
|
+
return state.cloudFiles.filesById[id];
|
|
30
|
+
}
|
|
31
|
+
const selectFileName = createSelector(
|
|
32
|
+
[selectFileById],
|
|
33
|
+
(record) => record?.fileName ?? null
|
|
34
|
+
);
|
|
35
|
+
const selectFilePath = createSelector(
|
|
36
|
+
[selectFileById],
|
|
37
|
+
(record) => record?.filePath ?? null
|
|
38
|
+
);
|
|
39
|
+
const selectFileVisibility = createSelector(
|
|
40
|
+
[selectFileById],
|
|
41
|
+
(record) => record?.visibility ?? "personal"
|
|
42
|
+
);
|
|
43
|
+
const selectFileIsDirty = createSelector(
|
|
44
|
+
[selectFileById],
|
|
45
|
+
(record) => record?._dirty ?? false
|
|
46
|
+
);
|
|
47
|
+
const selectFileIsLoading = createSelector(
|
|
48
|
+
[selectFileById],
|
|
49
|
+
(record) => record?._loading ?? false
|
|
50
|
+
);
|
|
51
|
+
const selectFileError = createSelector(
|
|
52
|
+
[selectFileById],
|
|
53
|
+
(record) => record?._error ?? null
|
|
54
|
+
);
|
|
55
|
+
const selectFilePendingRequestIds = createSelector(
|
|
56
|
+
[selectFileById],
|
|
57
|
+
(record) => record?._pendingRequestIds ?? EMPTY_PENDING_REQUEST_IDS
|
|
58
|
+
);
|
|
59
|
+
const selectFileDefinition = createSelector(
|
|
60
|
+
[selectFileById],
|
|
61
|
+
(record) => {
|
|
62
|
+
if (!record) return void 0;
|
|
63
|
+
const {
|
|
64
|
+
_dirty: _a,
|
|
65
|
+
_dirtyFields: _b,
|
|
66
|
+
_fieldHistory: _c,
|
|
67
|
+
_loadedFields: _d,
|
|
68
|
+
_loading: _e,
|
|
69
|
+
_error: _f,
|
|
70
|
+
_pendingRequestIds: _g,
|
|
71
|
+
...definition
|
|
72
|
+
} = record;
|
|
73
|
+
return definition;
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
const selectAllFoldersMap = createSelector(
|
|
77
|
+
[selectSlice],
|
|
78
|
+
(slice) => slice.foldersById
|
|
79
|
+
);
|
|
80
|
+
const selectAllFoldersArray = createSelector(
|
|
81
|
+
[selectAllFoldersMap],
|
|
82
|
+
(map) => Object.values(map)
|
|
83
|
+
);
|
|
84
|
+
const selectFolderById = createSelector(
|
|
85
|
+
[selectAllFoldersMap, (_state, id) => id],
|
|
86
|
+
(map, id) => map[id]
|
|
87
|
+
);
|
|
88
|
+
function getFolderFromState(state, id) {
|
|
89
|
+
return state.cloudFiles.foldersById[id];
|
|
90
|
+
}
|
|
91
|
+
const selectFolderDefinition = createSelector(
|
|
92
|
+
[selectFolderById],
|
|
93
|
+
(record) => {
|
|
94
|
+
if (!record) return void 0;
|
|
95
|
+
const {
|
|
96
|
+
_dirty: _a,
|
|
97
|
+
_dirtyFields: _b,
|
|
98
|
+
_fieldHistory: _c,
|
|
99
|
+
_loadedFields: _d,
|
|
100
|
+
_loading: _e,
|
|
101
|
+
_error: _f,
|
|
102
|
+
_pendingRequestIds: _g,
|
|
103
|
+
...definition
|
|
104
|
+
} = record;
|
|
105
|
+
return definition;
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
const selectTreeSlice = createSelector([selectSlice], (slice) => slice.tree);
|
|
109
|
+
const selectTreeStatus = createSelector(
|
|
110
|
+
[selectTreeSlice],
|
|
111
|
+
(tree) => tree.status
|
|
112
|
+
);
|
|
113
|
+
const selectTreeError = createSelector(
|
|
114
|
+
[selectTreeSlice],
|
|
115
|
+
(tree) => tree.error
|
|
116
|
+
);
|
|
117
|
+
const selectRootFolderIds = createSelector(
|
|
118
|
+
[selectTreeSlice],
|
|
119
|
+
(tree) => tree.rootFolderIds
|
|
120
|
+
);
|
|
121
|
+
const selectRootFileIds = createSelector(
|
|
122
|
+
[selectTreeSlice],
|
|
123
|
+
(tree) => tree.rootFileIds
|
|
124
|
+
);
|
|
125
|
+
const selectChildrenByFolderId = createSelector(
|
|
126
|
+
[selectTreeSlice],
|
|
127
|
+
(tree) => tree.childrenByFolderId
|
|
128
|
+
);
|
|
129
|
+
const selectChildrenOfFolder = createSelector(
|
|
130
|
+
[
|
|
131
|
+
selectChildrenByFolderId,
|
|
132
|
+
(_state, folderId) => folderId
|
|
133
|
+
],
|
|
134
|
+
(byId, folderId) => byId[folderId] ?? EMPTY_TREE_CHILDREN
|
|
135
|
+
);
|
|
136
|
+
const selectIsFolderFullyLoaded = createSelector(
|
|
137
|
+
[
|
|
138
|
+
selectTreeSlice,
|
|
139
|
+
(_state, folderId) => folderId
|
|
140
|
+
],
|
|
141
|
+
(tree, folderId) => tree.fullyLoadedFolderIds[folderId] === true
|
|
142
|
+
);
|
|
143
|
+
const selectUiSlice = createSelector([selectSlice], (slice) => slice.ui);
|
|
144
|
+
const selectViewMode = createSelector(
|
|
145
|
+
[selectUiSlice],
|
|
146
|
+
(ui) => ui.viewMode
|
|
147
|
+
);
|
|
148
|
+
const selectSortBy = createSelector([selectUiSlice], (ui) => ui.sortBy);
|
|
149
|
+
const selectSortDir = createSelector(
|
|
150
|
+
[selectUiSlice],
|
|
151
|
+
(ui) => ui.sortDir
|
|
152
|
+
);
|
|
153
|
+
const selectSort = createSelector(
|
|
154
|
+
[selectSortBy, selectSortDir],
|
|
155
|
+
(sortBy, sortDir) => ({ sortBy, sortDir })
|
|
156
|
+
);
|
|
157
|
+
const selectKindFilter = createSelector(
|
|
158
|
+
[selectUiSlice],
|
|
159
|
+
(ui) => ui.kindFilter
|
|
160
|
+
);
|
|
161
|
+
const selectDetailsLevel = createSelector(
|
|
162
|
+
[selectUiSlice],
|
|
163
|
+
(ui) => ui.detailsLevel
|
|
164
|
+
);
|
|
165
|
+
const selectColumnFilters = createSelector(
|
|
166
|
+
[selectUiSlice],
|
|
167
|
+
(ui) => ui.columnFilters
|
|
168
|
+
);
|
|
169
|
+
const selectHasActiveColumnFilters = createSelector(
|
|
170
|
+
[selectColumnFilters],
|
|
171
|
+
(cf) => cf.name.length > 0 || cf.type.length > 0 || cf.extension.length > 0 || cf.mime.length > 0 || cf.path.length > 0 || cf.owner.length > 0 || cf.modified !== "any" || cf.created !== "any" || cf.size !== "any" || cf.access !== "any" || cf.rag.length > 0
|
|
172
|
+
);
|
|
173
|
+
const selectVisibleColumns = createSelector(
|
|
174
|
+
[selectUiSlice],
|
|
175
|
+
(ui) => ui.visibleColumns
|
|
176
|
+
);
|
|
177
|
+
const selectSearchQuery = createSelector(
|
|
178
|
+
[selectUiSlice],
|
|
179
|
+
(ui) => ui.searchQuery
|
|
180
|
+
);
|
|
181
|
+
const selectChipFilter = createSelector(
|
|
182
|
+
[selectUiSlice],
|
|
183
|
+
(ui) => ui.chipFilter
|
|
184
|
+
);
|
|
185
|
+
const selectActiveFileId = createSelector(
|
|
186
|
+
[selectUiSlice],
|
|
187
|
+
(ui) => ui.activeFileId
|
|
188
|
+
);
|
|
189
|
+
const selectActiveFolderId = createSelector(
|
|
190
|
+
[selectUiSlice],
|
|
191
|
+
(ui) => ui.activeFolderId
|
|
192
|
+
);
|
|
193
|
+
const selectActiveFile = createSelector(
|
|
194
|
+
[selectAllFilesMap, selectActiveFileId],
|
|
195
|
+
(map, id) => id ? map[id] ?? null : null
|
|
196
|
+
);
|
|
197
|
+
const selectActiveFolder = createSelector(
|
|
198
|
+
[selectAllFoldersMap, selectActiveFolderId],
|
|
199
|
+
(map, id) => id ? map[id] ?? null : null
|
|
200
|
+
);
|
|
201
|
+
const selectFocusedId = createSelector(
|
|
202
|
+
[selectUiSlice],
|
|
203
|
+
(ui) => ui.focusedId
|
|
204
|
+
);
|
|
205
|
+
const selectSortedChildrenOfFolder = createSelector(
|
|
206
|
+
[
|
|
207
|
+
selectChildrenOfFolder,
|
|
208
|
+
selectAllFilesMap,
|
|
209
|
+
selectAllFoldersMap,
|
|
210
|
+
selectSortBy,
|
|
211
|
+
selectSortDir
|
|
212
|
+
],
|
|
213
|
+
(children, filesById, foldersById, sortBy, sortDir) => sortChildrenUtil(children, filesById, foldersById, sortBy, sortDir)
|
|
214
|
+
);
|
|
215
|
+
const selectSortedRootChildren = createSelector(
|
|
216
|
+
[
|
|
217
|
+
selectRootFolderIds,
|
|
218
|
+
selectRootFileIds,
|
|
219
|
+
selectAllFilesMap,
|
|
220
|
+
selectAllFoldersMap,
|
|
221
|
+
selectSortBy,
|
|
222
|
+
selectSortDir
|
|
223
|
+
],
|
|
224
|
+
(folderIds, fileIds, filesById, foldersById, sortBy, sortDir) => sortChildrenUtil(
|
|
225
|
+
{ folderIds, fileIds },
|
|
226
|
+
filesById,
|
|
227
|
+
foldersById,
|
|
228
|
+
sortBy,
|
|
229
|
+
sortDir
|
|
230
|
+
)
|
|
231
|
+
);
|
|
232
|
+
const selectSelection = createSelector(
|
|
233
|
+
[selectSlice],
|
|
234
|
+
(slice) => slice.selection
|
|
235
|
+
);
|
|
236
|
+
const selectIsSelected = createSelector(
|
|
237
|
+
[selectSelection, (_s, id) => id],
|
|
238
|
+
(selection, id) => selection.selectedIds.includes(id)
|
|
239
|
+
);
|
|
240
|
+
const selectSelectedCount = createSelector(
|
|
241
|
+
[selectSelection],
|
|
242
|
+
(selection) => selection.selectedIds.length
|
|
243
|
+
);
|
|
244
|
+
const selectVersionsForFile = createSelector(
|
|
245
|
+
[selectSlice, (_s, fileId) => fileId],
|
|
246
|
+
(slice, fileId) => slice.versionsByFileId[fileId] ?? EMPTY_CLOUD_FILE_VERSIONS
|
|
247
|
+
);
|
|
248
|
+
const selectPermissionsForResource = createSelector(
|
|
249
|
+
[selectSlice, (_s, resourceId) => resourceId],
|
|
250
|
+
(slice, resourceId) => slice.permissionsByResourceId[resourceId]
|
|
251
|
+
);
|
|
252
|
+
const selectEffectivePermissionForFile = createSelector(
|
|
253
|
+
[
|
|
254
|
+
selectFileById,
|
|
255
|
+
selectPermissionsForResource,
|
|
256
|
+
(_s, _fileId, userId) => userId
|
|
257
|
+
],
|
|
258
|
+
(file, permissions, userId) => {
|
|
259
|
+
if (!file) return null;
|
|
260
|
+
if (file.ownerId === userId) return "admin";
|
|
261
|
+
const order = {
|
|
262
|
+
read: 1,
|
|
263
|
+
write: 2,
|
|
264
|
+
admin: 3
|
|
265
|
+
};
|
|
266
|
+
let best = file.visibility === "public" ? "read" : null;
|
|
267
|
+
if (!permissions) return best;
|
|
268
|
+
for (const perm of permissions) {
|
|
269
|
+
if (perm.granteeId !== userId) continue;
|
|
270
|
+
if (perm.expiresAt && new Date(perm.expiresAt).getTime() < Date.now())
|
|
271
|
+
continue;
|
|
272
|
+
if (!best || order[perm.permissionLevel] > order[best]) {
|
|
273
|
+
best = perm.permissionLevel;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return best;
|
|
277
|
+
}
|
|
278
|
+
);
|
|
279
|
+
const selectShareLinksForResource = createSelector(
|
|
280
|
+
[selectSlice, (_s, resourceId) => resourceId],
|
|
281
|
+
(slice, resourceId) => slice.shareLinksByResourceId[resourceId]
|
|
282
|
+
);
|
|
283
|
+
const selectActiveShareLinksForResource = createSelector(
|
|
284
|
+
[selectShareLinksForResource],
|
|
285
|
+
(links) => {
|
|
286
|
+
if (!links?.length) return EMPTY_CLOUD_SHARE_LINKS;
|
|
287
|
+
const active = links.filter((l) => l.isActive);
|
|
288
|
+
return active.length ? active : EMPTY_CLOUD_SHARE_LINKS;
|
|
289
|
+
}
|
|
290
|
+
);
|
|
291
|
+
const selectAllUploads = createSelector(
|
|
292
|
+
[selectSlice],
|
|
293
|
+
(slice) => slice.uploads
|
|
294
|
+
);
|
|
295
|
+
const selectUploadByRequestId = createSelector(
|
|
296
|
+
[selectAllUploads, (_s, requestId) => requestId],
|
|
297
|
+
(uploads, requestId) => uploads[requestId]
|
|
298
|
+
);
|
|
299
|
+
const selectActiveUploads = createSelector(
|
|
300
|
+
[selectAllUploads],
|
|
301
|
+
(uploads) => Object.values(uploads).filter(
|
|
302
|
+
(u) => u.status === "uploading" || u.status === "pending"
|
|
303
|
+
)
|
|
304
|
+
);
|
|
305
|
+
const selectVisibleUploads = createSelector(
|
|
306
|
+
[selectAllUploads],
|
|
307
|
+
(uploads) => Object.values(uploads).slice().sort((a, b) => a.startedAt - b.startedAt)
|
|
308
|
+
);
|
|
309
|
+
const selectFailedUploadsForFolderPath = createSelector(
|
|
310
|
+
[
|
|
311
|
+
selectAllUploads,
|
|
312
|
+
(_s, folderPath) => folderPath
|
|
313
|
+
],
|
|
314
|
+
(uploads, folderPath) => Object.values(uploads).filter((u) => u.status === "error" && u.folderPath === folderPath).sort((a, b) => a.startedAt - b.startedAt)
|
|
315
|
+
);
|
|
316
|
+
const selectOverallUploadProgress = createSelector(
|
|
317
|
+
[selectActiveUploads],
|
|
318
|
+
(active) => {
|
|
319
|
+
let loaded = 0;
|
|
320
|
+
let total = 0;
|
|
321
|
+
for (const u of active) {
|
|
322
|
+
loaded += u.bytesUploaded;
|
|
323
|
+
total += u.fileSize;
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
loaded,
|
|
327
|
+
total,
|
|
328
|
+
percent: total > 0 ? Math.round(loaded / total * 100) : 0
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
);
|
|
332
|
+
const selectRagStatusSlice = createSelector(
|
|
333
|
+
[selectSlice],
|
|
334
|
+
(slice) => slice.ragStatus
|
|
335
|
+
);
|
|
336
|
+
const selectRagStatuses = createSelector(
|
|
337
|
+
[selectRagStatusSlice],
|
|
338
|
+
(rag) => rag.byFileId
|
|
339
|
+
);
|
|
340
|
+
const selectRagStatusForFile = createSelector(
|
|
341
|
+
[selectRagStatuses, (_s, fileId) => fileId],
|
|
342
|
+
(byId, fileId) => byId[fileId]
|
|
343
|
+
);
|
|
344
|
+
const selectIsRagFetching = createSelector(
|
|
345
|
+
[selectRagStatusSlice],
|
|
346
|
+
(rag) => rag.isFetching
|
|
347
|
+
);
|
|
348
|
+
const selectRagLastFetchedAt = createSelector(
|
|
349
|
+
[selectRagStatusSlice],
|
|
350
|
+
(rag) => rag.lastFetchedAt
|
|
351
|
+
);
|
|
352
|
+
const selectRealtime = createSelector(
|
|
353
|
+
[selectSlice],
|
|
354
|
+
(slice) => slice.realtime
|
|
355
|
+
);
|
|
356
|
+
const selectRealtimeStatus = createSelector(
|
|
357
|
+
[selectRealtime],
|
|
358
|
+
(rt) => rt.status
|
|
359
|
+
);
|
|
360
|
+
export {
|
|
361
|
+
EMPTY_CLOUD_FILE_PERMISSIONS,
|
|
362
|
+
EMPTY_CLOUD_SHARE_LINKS,
|
|
363
|
+
EMPTY_TREE_CHILDREN,
|
|
364
|
+
getFileFromState,
|
|
365
|
+
getFolderFromState,
|
|
366
|
+
selectActiveFile,
|
|
367
|
+
selectActiveFileId,
|
|
368
|
+
selectActiveFolder,
|
|
369
|
+
selectActiveFolderId,
|
|
370
|
+
selectActiveShareLinksForResource,
|
|
371
|
+
selectActiveUploads,
|
|
372
|
+
selectAllFilesArray,
|
|
373
|
+
selectAllFilesMap,
|
|
374
|
+
selectAllFoldersArray,
|
|
375
|
+
selectAllFoldersMap,
|
|
376
|
+
selectAllUploads,
|
|
377
|
+
selectChildrenByFolderId,
|
|
378
|
+
selectChildrenOfFolder,
|
|
379
|
+
selectChipFilter,
|
|
380
|
+
selectColumnFilters,
|
|
381
|
+
selectDetailsLevel,
|
|
382
|
+
selectEffectivePermissionForFile,
|
|
383
|
+
selectFailedUploadsForFolderPath,
|
|
384
|
+
selectFileById,
|
|
385
|
+
selectFileCurrentVersion,
|
|
386
|
+
selectFileDefinition,
|
|
387
|
+
selectFileError,
|
|
388
|
+
selectFileIsDirty,
|
|
389
|
+
selectFileIsLoading,
|
|
390
|
+
selectFileName,
|
|
391
|
+
selectFilePath,
|
|
392
|
+
selectFilePendingRequestIds,
|
|
393
|
+
selectFileVisibility,
|
|
394
|
+
selectFocusedId,
|
|
395
|
+
selectFolderById,
|
|
396
|
+
selectFolderDefinition,
|
|
397
|
+
selectHasActiveColumnFilters,
|
|
398
|
+
selectIsFolderFullyLoaded,
|
|
399
|
+
selectIsRagFetching,
|
|
400
|
+
selectIsSelected,
|
|
401
|
+
selectKindFilter,
|
|
402
|
+
selectOverallUploadProgress,
|
|
403
|
+
selectPermissionsForResource,
|
|
404
|
+
selectRagLastFetchedAt,
|
|
405
|
+
selectRagStatusForFile,
|
|
406
|
+
selectRagStatuses,
|
|
407
|
+
selectRealtime,
|
|
408
|
+
selectRealtimeStatus,
|
|
409
|
+
selectRootFileIds,
|
|
410
|
+
selectRootFolderIds,
|
|
411
|
+
selectSearchQuery,
|
|
412
|
+
selectSelectedCount,
|
|
413
|
+
selectSelection,
|
|
414
|
+
selectShareLinksForResource,
|
|
415
|
+
selectSort,
|
|
416
|
+
selectSortBy,
|
|
417
|
+
selectSortDir,
|
|
418
|
+
selectSortedChildrenOfFolder,
|
|
419
|
+
selectSortedRootChildren,
|
|
420
|
+
selectTreeError,
|
|
421
|
+
selectTreeStatus,
|
|
422
|
+
selectUploadByRequestId,
|
|
423
|
+
selectVersionsForFile,
|
|
424
|
+
selectViewMode,
|
|
425
|
+
selectVisibleColumns,
|
|
426
|
+
selectVisibleUploads
|
|
427
|
+
};
|
|
428
|
+
//# sourceMappingURL=selectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/files/engine/redux/selectors.ts"],"sourcesContent":["/**\n * features/files/redux/selectors.ts\n *\n * Memoized selectors over the cloudFiles slice. Follow the agent-shortcuts\n * pattern: every read path is wrapped in createSelector; imperative accessors\n * (for middleware / thunks) are named `get...FromState`.\n */\n\n\"use client\";\n\nimport { createSelector } from \"reselect\";\nimport {\n EMPTY_TREE_CHILDREN,\n sortChildren as sortChildrenUtil,\n} from \"./tree-utils\";\nimport type { CloudFilesState } from \"../types\";\n\n// Minimal local state shape — avoids importing from store.ts (which imports\n// this module), which would create a type-level circular dependency.\ntype StateWithCloudFiles = { cloudFiles: CloudFilesState };\nimport type {\n CloudFile,\n CloudFileRecord,\n CloudFilePermission,\n CloudFileVersion,\n CloudFolder,\n CloudFolderRecord,\n CloudShareLink,\n PermissionLevel,\n RagStatus,\n TreeChildren,\n UploadState,\n} from \"../types\";\n\n/** Stable empties — never use `?? []` in selector outputs (new ref every run → Reselect stability warnings). */\nexport const EMPTY_CLOUD_FILE_PERMISSIONS: CloudFilePermission[] = [];\nexport const EMPTY_CLOUD_SHARE_LINKS: CloudShareLink[] = [];\nconst EMPTY_CLOUD_FILE_VERSIONS: CloudFileVersion[] = [];\nconst EMPTY_PENDING_REQUEST_IDS: string[] = [];\n\n/** Re-export for consumers that import cloud-files selectors from one module. */\nexport { EMPTY_TREE_CHILDREN };\n\n// ---------------------------------------------------------------------------\n// Slice root\n// ---------------------------------------------------------------------------\n\nconst selectSlice = (state: StateWithCloudFiles) => state.cloudFiles;\n\n// ---------------------------------------------------------------------------\n// Files\n// ---------------------------------------------------------------------------\n\nexport const selectAllFilesMap = createSelector(\n [selectSlice],\n (slice) => slice.filesById,\n);\n\nexport const selectAllFilesArray = createSelector(\n [selectAllFilesMap],\n (map): CloudFileRecord[] => Object.values(map),\n);\n\nexport const selectFileById = createSelector(\n [selectAllFilesMap, (_state: StateWithCloudFiles, id: string) => id],\n (map, id): CloudFileRecord | undefined => map[id],\n);\n\n/** The file's current version number (undefined when the row is not loaded). */\nexport const selectFileCurrentVersion = createSelector(\n [selectAllFilesMap, (_state: StateWithCloudFiles, id: string) => id],\n (map, id): number | undefined => map[id]?.currentVersion,\n);\n\n/** Imperative — middleware / thunks. */\nexport function getFileFromState(\n state: StateWithCloudFiles,\n id: string,\n): CloudFileRecord | undefined {\n return state.cloudFiles.filesById[id];\n}\n\nexport const selectFileName = createSelector(\n [selectFileById],\n (record): string | null => record?.fileName ?? null,\n);\n\nexport const selectFilePath = createSelector(\n [selectFileById],\n (record): string | null => record?.filePath ?? null,\n);\n\nexport const selectFileVisibility = createSelector(\n [selectFileById],\n (record) => record?.visibility ?? \"personal\",\n);\n\nexport const selectFileIsDirty = createSelector(\n [selectFileById],\n (record): boolean => record?._dirty ?? false,\n);\n\nexport const selectFileIsLoading = createSelector(\n [selectFileById],\n (record): boolean => record?._loading ?? false,\n);\n\nexport const selectFileError = createSelector(\n [selectFileById],\n (record): string | null => record?._error ?? null,\n);\n\nexport const selectFilePendingRequestIds = createSelector(\n [selectFileById],\n (record): string[] => record?._pendingRequestIds ?? EMPTY_PENDING_REQUEST_IDS,\n);\n\n/** Strip runtime fields — for components that only render domain fields. */\nexport const selectFileDefinition = createSelector(\n [selectFileById],\n (record): CloudFile | undefined => {\n if (!record) return undefined;\n const {\n _dirty: _a,\n _dirtyFields: _b,\n _fieldHistory: _c,\n _loadedFields: _d,\n _loading: _e,\n _error: _f,\n _pendingRequestIds: _g,\n ...definition\n } = record;\n return definition;\n },\n);\n\n// ---------------------------------------------------------------------------\n// Folders\n// ---------------------------------------------------------------------------\n\nexport const selectAllFoldersMap = createSelector(\n [selectSlice],\n (slice) => slice.foldersById,\n);\n\nexport const selectAllFoldersArray = createSelector(\n [selectAllFoldersMap],\n (map): CloudFolderRecord[] => Object.values(map),\n);\n\nexport const selectFolderById = createSelector(\n [selectAllFoldersMap, (_state: StateWithCloudFiles, id: string) => id],\n (map, id): CloudFolderRecord | undefined => map[id],\n);\n\nexport function getFolderFromState(\n state: StateWithCloudFiles,\n id: string,\n): CloudFolderRecord | undefined {\n return state.cloudFiles.foldersById[id];\n}\n\nexport const selectFolderDefinition = createSelector(\n [selectFolderById],\n (record): CloudFolder | undefined => {\n if (!record) return undefined;\n const {\n _dirty: _a,\n _dirtyFields: _b,\n _fieldHistory: _c,\n _loadedFields: _d,\n _loading: _e,\n _error: _f,\n _pendingRequestIds: _g,\n ...definition\n } = record;\n return definition;\n },\n);\n\n// ---------------------------------------------------------------------------\n// Tree\n// ---------------------------------------------------------------------------\n\nconst selectTreeSlice = createSelector([selectSlice], (slice) => slice.tree);\n\nexport const selectTreeStatus = createSelector(\n [selectTreeSlice],\n (tree) => tree.status,\n);\n\nexport const selectTreeError = createSelector(\n [selectTreeSlice],\n (tree) => tree.error,\n);\n\nexport const selectRootFolderIds = createSelector(\n [selectTreeSlice],\n (tree) => tree.rootFolderIds,\n);\n\nexport const selectRootFileIds = createSelector(\n [selectTreeSlice],\n (tree) => tree.rootFileIds,\n);\n\nexport const selectChildrenByFolderId = createSelector(\n [selectTreeSlice],\n (tree) => tree.childrenByFolderId,\n);\n\nexport const selectChildrenOfFolder = createSelector(\n [\n selectChildrenByFolderId,\n (_state: StateWithCloudFiles, folderId: string) => folderId,\n ],\n (byId, folderId): TreeChildren => byId[folderId] ?? EMPTY_TREE_CHILDREN,\n);\n\nexport const selectIsFolderFullyLoaded = createSelector(\n [\n selectTreeSlice,\n (_state: StateWithCloudFiles, folderId: string) => folderId,\n ],\n (tree, folderId): boolean => tree.fullyLoadedFolderIds[folderId] === true,\n);\n\n// ---------------------------------------------------------------------------\n// Tree — sorted children (respects UI sort settings)\n// ---------------------------------------------------------------------------\n\nconst selectUiSlice = createSelector([selectSlice], (slice) => slice.ui);\n\nexport const selectViewMode = createSelector(\n [selectUiSlice],\n (ui) => ui.viewMode,\n);\n\n/** Primitive sort inputs — prefer these inside other selectors over `selectSort`'s object. */\nexport const selectSortBy = createSelector([selectUiSlice], (ui) => ui.sortBy);\n\nexport const selectSortDir = createSelector(\n [selectUiSlice],\n (ui) => ui.sortDir,\n);\n\nexport const selectSort = createSelector(\n [selectSortBy, selectSortDir],\n (sortBy, sortDir) => ({ sortBy, sortDir }),\n);\n\nexport const selectKindFilter = createSelector(\n [selectUiSlice],\n (ui) => ui.kindFilter,\n);\n\nexport const selectDetailsLevel = createSelector(\n [selectUiSlice],\n (ui) => ui.detailsLevel,\n);\n\nexport const selectColumnFilters = createSelector(\n [selectUiSlice],\n (ui) => ui.columnFilters,\n);\n\n/** Convenience: true iff any column filter is set away from its default. */\nexport const selectHasActiveColumnFilters = createSelector(\n [selectColumnFilters],\n (cf) =>\n cf.name.length > 0 ||\n cf.type.length > 0 ||\n cf.extension.length > 0 ||\n cf.mime.length > 0 ||\n cf.path.length > 0 ||\n cf.owner.length > 0 ||\n cf.modified !== \"any\" ||\n cf.created !== \"any\" ||\n cf.size !== \"any\" ||\n cf.access !== \"any\" ||\n cf.rag.length > 0,\n);\n\nexport const selectVisibleColumns = createSelector(\n [selectUiSlice],\n (ui) => ui.visibleColumns,\n);\n\n/** Tree-wide search box value (mirrors the URL `?q=…`). */\nexport const selectSearchQuery = createSelector(\n [selectUiSlice],\n (ui) => ui.searchQuery,\n);\n\n/** Active sticky chip (Recents / Starred); null when no chip is active. */\nexport const selectChipFilter = createSelector(\n [selectUiSlice],\n (ui) => ui.chipFilter,\n);\n\nexport const selectActiveFileId = createSelector(\n [selectUiSlice],\n (ui) => ui.activeFileId,\n);\n\nexport const selectActiveFolderId = createSelector(\n [selectUiSlice],\n (ui) => ui.activeFolderId,\n);\n\nexport const selectActiveFile = createSelector(\n [selectAllFilesMap, selectActiveFileId],\n (map, id): CloudFileRecord | null => (id ? (map[id] ?? null) : null),\n);\n\nexport const selectActiveFolder = createSelector(\n [selectAllFoldersMap, selectActiveFolderId],\n (map, id): CloudFolderRecord | null => (id ? (map[id] ?? null) : null),\n);\n\n/** The id of the single item (file or folder) that has visual focus — used to\n * drive the highlight ring and scroll-into-view after create / upload. */\nexport const selectFocusedId = createSelector(\n [selectUiSlice],\n (ui) => ui.focusedId,\n);\n\nexport const selectSortedChildrenOfFolder = createSelector(\n [\n selectChildrenOfFolder,\n selectAllFilesMap,\n selectAllFoldersMap,\n selectSortBy,\n selectSortDir,\n ],\n (children, filesById, foldersById, sortBy, sortDir): TreeChildren =>\n sortChildrenUtil(children, filesById, foldersById, sortBy, sortDir),\n);\n\nexport const selectSortedRootChildren = createSelector(\n [\n selectRootFolderIds,\n selectRootFileIds,\n selectAllFilesMap,\n selectAllFoldersMap,\n selectSortBy,\n selectSortDir,\n ],\n (folderIds, fileIds, filesById, foldersById, sortBy, sortDir): TreeChildren =>\n sortChildrenUtil(\n { folderIds, fileIds },\n filesById,\n foldersById,\n sortBy,\n sortDir,\n ),\n);\n\n// ---------------------------------------------------------------------------\n// Selection\n// ---------------------------------------------------------------------------\n\nexport const selectSelection = createSelector(\n [selectSlice],\n (slice) => slice.selection,\n);\n\nexport const selectIsSelected = createSelector(\n [selectSelection, (_s: StateWithCloudFiles, id: string) => id],\n (selection, id): boolean => selection.selectedIds.includes(id),\n);\n\nexport const selectSelectedCount = createSelector(\n [selectSelection],\n (selection): number => selection.selectedIds.length,\n);\n\n// ---------------------------------------------------------------------------\n// Versions\n// ---------------------------------------------------------------------------\n\nexport const selectVersionsForFile = createSelector(\n [selectSlice, (_s: StateWithCloudFiles, fileId: string) => fileId],\n (slice, fileId): CloudFileVersion[] =>\n slice.versionsByFileId[fileId] ?? EMPTY_CLOUD_FILE_VERSIONS,\n);\n\n// ---------------------------------------------------------------------------\n// Permissions\n// ---------------------------------------------------------------------------\n\nexport const selectPermissionsForResource = createSelector(\n [selectSlice, (_s: StateWithCloudFiles, resourceId: string) => resourceId],\n (slice, resourceId): CloudFilePermission[] | undefined =>\n slice.permissionsByResourceId[resourceId],\n);\n\n/**\n * Returns the highest permission the given user has on the given file.\n * Ownership returns 'admin'; otherwise derives from the canonical\n * `public.permissions` grants (mapped into the slice) where the grantee\n * matches. Caller must provide userId.\n */\nexport const selectEffectivePermissionForFile = createSelector(\n [\n selectFileById,\n selectPermissionsForResource,\n (_s: StateWithCloudFiles, _fileId: string, userId: string) => userId,\n ],\n (file, permissions, userId): PermissionLevel | null => {\n if (!file) return null;\n if (file.ownerId === userId) return \"admin\";\n const order: Record<PermissionLevel, number> = {\n read: 1,\n write: 2,\n admin: 3,\n };\n let best: PermissionLevel | null =\n file.visibility === \"public\" ? \"read\" : null;\n if (!permissions) return best;\n for (const perm of permissions) {\n if (perm.granteeId !== userId) continue;\n if (perm.expiresAt && new Date(perm.expiresAt).getTime() < Date.now())\n continue;\n if (!best || order[perm.permissionLevel] > order[best]) {\n best = perm.permissionLevel;\n }\n }\n return best;\n },\n);\n\n// ---------------------------------------------------------------------------\n// Share links\n// ---------------------------------------------------------------------------\n\nexport const selectShareLinksForResource = createSelector(\n [selectSlice, (_s: StateWithCloudFiles, resourceId: string) => resourceId],\n (slice, resourceId): CloudShareLink[] | undefined =>\n slice.shareLinksByResourceId[resourceId],\n);\n\nexport const selectActiveShareLinksForResource = createSelector(\n [selectShareLinksForResource],\n (links): CloudShareLink[] => {\n if (!links?.length) return EMPTY_CLOUD_SHARE_LINKS;\n const active = links.filter((l) => l.isActive);\n return active.length ? active : EMPTY_CLOUD_SHARE_LINKS;\n },\n);\n\n// ---------------------------------------------------------------------------\n// Uploads\n// ---------------------------------------------------------------------------\n\nexport const selectAllUploads = createSelector(\n [selectSlice],\n (slice) => slice.uploads,\n);\n\nexport const selectUploadByRequestId = createSelector(\n [selectAllUploads, (_s: StateWithCloudFiles, requestId: string) => requestId],\n (uploads, requestId): UploadState | undefined => uploads[requestId],\n);\n\nexport const selectActiveUploads = createSelector(\n [selectAllUploads],\n (uploads): UploadState[] =>\n (Object.values(uploads) as UploadState[]).filter(\n (u) => u.status === \"uploading\" || u.status === \"pending\",\n ),\n);\n\n/**\n * Every tracked upload — active AND recently completed (success/error) that\n * hasn't been cleared yet — ordered oldest-first so the tray reads top-to-\n * bottom in upload order. The tray auto-dismisses successful entries after a\n * delay, so this map stays bounded. Completed entries are what let a user see\n * WHAT they just uploaded (and jump to it) instead of watching the progress\n * card vanish into a paginated list.\n */\nexport const selectVisibleUploads = createSelector(\n [selectAllUploads],\n (uploads): UploadState[] =>\n (Object.values(uploads) as UploadState[])\n .slice()\n .sort((a, b) => a.startedAt - b.startedAt),\n);\n\n/**\n * 🚨 A FAILED UPLOAD, FOUND AGAIN BY THE SURFACE THAT STARTED IT.\n *\n * `state.uploads` is one flat, app-wide map — every uploader in the app\n * shares it. A container-scoped card (the Rulebook Resources card, a chat\n * attachment tray, …) that wants \"the uploads I sent, that failed\" gives\n * itself a `folderPath` nothing else uses and reads back exactly the entries\n * that match it — see `UploadState.folderPath`. `error` entries are never\n * auto-cleared (unlike `success`/`cancelled`, see `clearCompletedUploads`),\n * so this stays populated until the caller retries or dismisses each one.\n */\nexport const selectFailedUploadsForFolderPath = createSelector(\n [\n selectAllUploads,\n (_s: StateWithCloudFiles, folderPath: string) => folderPath,\n ],\n (uploads, folderPath): UploadState[] =>\n (Object.values(uploads) as UploadState[])\n .filter((u) => u.status === \"error\" && u.folderPath === folderPath)\n .sort((a, b) => a.startedAt - b.startedAt),\n);\n\nexport const selectOverallUploadProgress = createSelector(\n [selectActiveUploads],\n (active): { loaded: number; total: number; percent: number } => {\n let loaded = 0;\n let total = 0;\n for (const u of active) {\n loaded += u.bytesUploaded;\n total += u.fileSize;\n }\n return {\n loaded,\n total,\n percent: total > 0 ? Math.round((loaded / total) * 100) : 0,\n };\n },\n);\n\n// ---------------------------------------------------------------------------\n// Knowledge status (per-file indexing)\n// ---------------------------------------------------------------------------\n\nconst selectRagStatusSlice = createSelector(\n [selectSlice],\n (slice) => slice.ragStatus,\n);\n\n/** Map of fileId → current RagStatus. Empty until the prefetch thunk runs. */\nexport const selectRagStatuses = createSelector(\n [selectRagStatusSlice],\n (rag) => rag.byFileId,\n);\n\nexport const selectRagStatusForFile = createSelector(\n [selectRagStatuses, (_s: StateWithCloudFiles, fileId: string) => fileId],\n (byId, fileId): RagStatus | undefined => byId[fileId],\n);\n\nexport const selectIsRagFetching = createSelector(\n [selectRagStatusSlice],\n (rag): boolean => rag.isFetching,\n);\n\nexport const selectRagLastFetchedAt = createSelector(\n [selectRagStatusSlice],\n (rag): number | null => rag.lastFetchedAt,\n);\n\n// ---------------------------------------------------------------------------\n// Realtime\n// ---------------------------------------------------------------------------\n\nexport const selectRealtime = createSelector(\n [selectSlice],\n (slice) => slice.realtime,\n);\n\nexport const selectRealtimeStatus = createSelector(\n [selectRealtime],\n (rt) => rt.status,\n);\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* features/files/redux/slice.ts
|
|
3
|
+
*
|
|
4
|
+
* Normalized cloud-files slice. Pattern: copied from
|
|
5
|
+
* features/agents/redux/agent-shortcuts/slice.ts — dirty-tracking via
|
|
6
|
+
* FieldFlags, optimistic + rollback via _fieldHistory, RTK reducers only
|
|
7
|
+
* (async logic lives in thunks.ts).
|
|
8
|
+
*/
|
|
9
|
+
import type { CloudFile, CloudFileFieldSnapshot, CloudFilePermission, CloudFileRecord, CloudFilesState, CloudFileVersion, CloudFolder, CloudFolderFieldSnapshot, CloudFolderRecord, CloudShareLink, AccessFilter, ChipFilter, ColumnId, DetailsLevel, KindFilter, ModifiedFilter, OwnerFilter, RagFilter, RagStatus, SelectionState, SizeFilter, SortBy, SortDirection, TreeChildren, TypeFilter, UiState, UploadStatus, ViewMode, Visibility } from "../types.js";
|
|
10
|
+
declare function emptyFileRecord(id: string): CloudFileRecord;
|
|
11
|
+
declare function emptyFolderRecord(id: string): CloudFolderRecord;
|
|
12
|
+
export declare const upsertFile: import("@reduxjs/toolkit").ActionCreatorWithPayload<Partial<CloudFile>, "cloudFiles/upsertFile">, upsertFiles: import("@reduxjs/toolkit").ActionCreatorWithPayload<Partial<CloudFile>[], "cloudFiles/upsertFiles">, setFileField: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
13
|
+
id: string;
|
|
14
|
+
field: keyof CloudFile;
|
|
15
|
+
value: CloudFile[keyof CloudFile];
|
|
16
|
+
}, "cloudFiles/setFileField">, resetFileField: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
17
|
+
id: string;
|
|
18
|
+
field: keyof CloudFile;
|
|
19
|
+
}, "cloudFiles/resetFileField">, markFileSaved: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
20
|
+
id: string;
|
|
21
|
+
}, "cloudFiles/markFileSaved">, rollbackFileOptimisticUpdate: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
22
|
+
id: string;
|
|
23
|
+
snapshot: CloudFileFieldSnapshot;
|
|
24
|
+
}, "cloudFiles/rollbackFileOptimisticUpdate">, removeFile: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
25
|
+
id: string;
|
|
26
|
+
}, "cloudFiles/removeFile">, addFilePendingRequest: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
27
|
+
id: string;
|
|
28
|
+
requestId: string;
|
|
29
|
+
}, "cloudFiles/addFilePendingRequest">, removeFilePendingRequest: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
30
|
+
id: string;
|
|
31
|
+
requestId: string;
|
|
32
|
+
}, "cloudFiles/removeFilePendingRequest">, setFileLoading: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
33
|
+
id: string;
|
|
34
|
+
loading: boolean;
|
|
35
|
+
}, "cloudFiles/setFileLoading">, setFileError: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
36
|
+
id: string;
|
|
37
|
+
error: string | null;
|
|
38
|
+
}, "cloudFiles/setFileError">, upsertFolder: import("@reduxjs/toolkit").ActionCreatorWithPayload<Partial<CloudFolder>, "cloudFiles/upsertFolder">, upsertFolders: import("@reduxjs/toolkit").ActionCreatorWithPayload<Partial<CloudFolder>[], "cloudFiles/upsertFolders">, setFolderField: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
39
|
+
id: string;
|
|
40
|
+
field: keyof CloudFolder;
|
|
41
|
+
value: CloudFolder[keyof CloudFolder];
|
|
42
|
+
}, "cloudFiles/setFolderField">, markFolderSaved: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
43
|
+
id: string;
|
|
44
|
+
}, "cloudFiles/markFolderSaved">, rollbackFolderOptimisticUpdate: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
45
|
+
id: string;
|
|
46
|
+
snapshot: CloudFolderFieldSnapshot;
|
|
47
|
+
}, "cloudFiles/rollbackFolderOptimisticUpdate">, removeFolder: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
48
|
+
id: string;
|
|
49
|
+
}, "cloudFiles/removeFolder">, upsertVersionsForFile: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
50
|
+
fileId: string;
|
|
51
|
+
versions: CloudFileVersion[];
|
|
52
|
+
}, "cloudFiles/upsertVersionsForFile">, upsertPermissionsForResource: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
53
|
+
resourceId: string;
|
|
54
|
+
permissions: CloudFilePermission[];
|
|
55
|
+
}, "cloudFiles/upsertPermissionsForResource">, removePermissionForResource: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
56
|
+
resourceId: string;
|
|
57
|
+
granteeId: string;
|
|
58
|
+
granteeType?: "user" | "group";
|
|
59
|
+
}, "cloudFiles/removePermissionForResource">, upsertShareLinksForResource: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
60
|
+
resourceId: string;
|
|
61
|
+
shareLinks: CloudShareLink[];
|
|
62
|
+
}, "cloudFiles/upsertShareLinksForResource">, removeShareLink: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
63
|
+
linkId: string;
|
|
64
|
+
}, "cloudFiles/removeShareLink">, setTreeStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
65
|
+
status: "idle" | "loading" | "loaded" | "error";
|
|
66
|
+
error?: string | null;
|
|
67
|
+
}, "cloudFiles/setTreeStatus">, replaceTree: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
68
|
+
rootFolderIds: string[];
|
|
69
|
+
rootFileIds: string[];
|
|
70
|
+
childrenByFolderId: Record<string, TreeChildren>;
|
|
71
|
+
fullyLoadedFolderIds?: Record<string, true>;
|
|
72
|
+
}, "cloudFiles/replaceTree">, markFolderFullyLoaded: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
73
|
+
folderId: string;
|
|
74
|
+
}, "cloudFiles/markFolderFullyLoaded">, attachVirtualRoot: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
75
|
+
adapterId: string;
|
|
76
|
+
rootId: string;
|
|
77
|
+
label: string;
|
|
78
|
+
}, "cloudFiles/attachVirtualRoot">, attachChildToFolder: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
79
|
+
parentFolderId: string | null;
|
|
80
|
+
kind: "file" | "folder";
|
|
81
|
+
id: string;
|
|
82
|
+
}, "cloudFiles/attachChildToFolder">, detachChildFromFolder: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
83
|
+
parentFolderId: string | null;
|
|
84
|
+
kind: "file" | "folder";
|
|
85
|
+
id: string;
|
|
86
|
+
}, "cloudFiles/detachChildFromFolder">, setSelection: import("@reduxjs/toolkit").ActionCreatorWithPayload<SelectionState, "cloudFiles/setSelection">, clearSelection: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cloudFiles/clearSelection">, toggleSelection: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
87
|
+
id: string;
|
|
88
|
+
}, "cloudFiles/toggleSelection">, setViewMode: import("@reduxjs/toolkit").ActionCreatorWithPayload<ViewMode, "cloudFiles/setViewMode">, setSort: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
89
|
+
sortBy: SortBy;
|
|
90
|
+
sortDir: SortDirection;
|
|
91
|
+
}, "cloudFiles/setSort">, setKindFilter: import("@reduxjs/toolkit").ActionCreatorWithPayload<KindFilter, "cloudFiles/setKindFilter">, setDetailsLevel: import("@reduxjs/toolkit").ActionCreatorWithPayload<DetailsLevel, "cloudFiles/setDetailsLevel">, setColumnFilter: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
92
|
+
column: "name";
|
|
93
|
+
value: string;
|
|
94
|
+
} | {
|
|
95
|
+
column: "type";
|
|
96
|
+
value: TypeFilter;
|
|
97
|
+
} | {
|
|
98
|
+
column: "extension";
|
|
99
|
+
value: string;
|
|
100
|
+
} | {
|
|
101
|
+
column: "mime";
|
|
102
|
+
value: string;
|
|
103
|
+
} | {
|
|
104
|
+
column: "path";
|
|
105
|
+
value: string;
|
|
106
|
+
} | {
|
|
107
|
+
column: "owner";
|
|
108
|
+
value: OwnerFilter;
|
|
109
|
+
} | {
|
|
110
|
+
column: "modified";
|
|
111
|
+
value: ModifiedFilter;
|
|
112
|
+
} | {
|
|
113
|
+
column: "created";
|
|
114
|
+
value: ModifiedFilter;
|
|
115
|
+
} | {
|
|
116
|
+
column: "size";
|
|
117
|
+
value: SizeFilter;
|
|
118
|
+
} | {
|
|
119
|
+
column: "access";
|
|
120
|
+
value: AccessFilter;
|
|
121
|
+
} | {
|
|
122
|
+
column: "rag";
|
|
123
|
+
value: RagFilter;
|
|
124
|
+
}, "cloudFiles/setColumnFilter">, clearColumnFilters: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cloudFiles/clearColumnFilters">, setColumnVisibility: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
125
|
+
column: ColumnId;
|
|
126
|
+
visible: boolean;
|
|
127
|
+
}, "cloudFiles/setColumnVisibility">, resetColumnVisibility: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cloudFiles/resetColumnVisibility">, setActiveFileId: import("@reduxjs/toolkit").ActionCreatorWithPayload<string | null, "cloudFiles/setActiveFileId">, setActiveFolderId: import("@reduxjs/toolkit").ActionCreatorWithPayload<string | null, "cloudFiles/setActiveFolderId">, setSearchQuery: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "cloudFiles/setSearchQuery">, setChipFilter: import("@reduxjs/toolkit").ActionCreatorWithPayload<ChipFilter | null, "cloudFiles/setChipFilter">, setUiBatch: import("@reduxjs/toolkit").ActionCreatorWithPayload<Partial<UiState>, "cloudFiles/setUiBatch">, setFocusedId: import("@reduxjs/toolkit").ActionCreatorWithPayload<string | null, "cloudFiles/setFocusedId">, trackUploadStart: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
128
|
+
requestId: string;
|
|
129
|
+
fileName: string;
|
|
130
|
+
fileSize: number;
|
|
131
|
+
parentFolderId: string | null;
|
|
132
|
+
folderPath?: string | null;
|
|
133
|
+
}, "cloudFiles/trackUploadStart">, updateUploadProgress: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
134
|
+
requestId: string;
|
|
135
|
+
bytesUploaded: number;
|
|
136
|
+
}, "cloudFiles/updateUploadProgress">, updateUploadStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
137
|
+
requestId: string;
|
|
138
|
+
status: UploadStatus;
|
|
139
|
+
fileId?: string | null;
|
|
140
|
+
error?: string | null;
|
|
141
|
+
}, "cloudFiles/updateUploadStatus">, clearUpload: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
142
|
+
requestId: string;
|
|
143
|
+
}, "cloudFiles/clearUpload">, clearCompletedUploads: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cloudFiles/clearCompletedUploads">, setRagStatusForFile: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
144
|
+
fileId: string;
|
|
145
|
+
status: RagStatus;
|
|
146
|
+
}, "cloudFiles/setRagStatusForFile">, setRagStatusBatch: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
147
|
+
entries: Record<string, RagStatus>;
|
|
148
|
+
}, "cloudFiles/setRagStatusBatch">, setRagStatusFetching: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "cloudFiles/setRagStatusFetching">, clearRagStatuses: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cloudFiles/clearRagStatuses">, setRealtimeStatus: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
|
|
149
|
+
status: CloudFilesState["realtime"]["status"];
|
|
150
|
+
userId?: string | null;
|
|
151
|
+
error?: string | null;
|
|
152
|
+
}, "cloudFiles/setRealtimeStatus">, touchRealtime: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cloudFiles/touchRealtime">, resetCloudFilesState: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cloudFiles/resetCloudFilesState">;
|
|
153
|
+
export declare const cloudFilesReducer: import("@reduxjs/toolkit").Reducer<CloudFilesState>;
|
|
154
|
+
declare const _default: import("@reduxjs/toolkit").Reducer<CloudFilesState>;
|
|
155
|
+
export default _default;
|
|
156
|
+
export { emptyFileRecord, emptyFolderRecord };
|
|
157
|
+
export type { Visibility };
|