@pyric/ui 0.1.0-alpha.10
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/LICENSE +216 -0
- package/README.md +79 -0
- package/dist/agents/ContextWindowUsage.d.ts +67 -0
- package/dist/agents/ContextWindowUsage.d.ts.map +1 -0
- package/dist/agents/ContextWindowUsage.js +115 -0
- package/dist/agents/ContextWindowUsage.js.map +1 -0
- package/dist/agents/EmptyState.d.ts +18 -0
- package/dist/agents/EmptyState.d.ts.map +1 -0
- package/dist/agents/EmptyState.js +11 -0
- package/dist/agents/EmptyState.js.map +1 -0
- package/dist/agents/Fold.d.ts +37 -0
- package/dist/agents/Fold.d.ts.map +1 -0
- package/dist/agents/Fold.js +18 -0
- package/dist/agents/Fold.js.map +1 -0
- package/dist/agents/Modal.d.ts +25 -0
- package/dist/agents/Modal.d.ts.map +1 -0
- package/dist/agents/Modal.js +28 -0
- package/dist/agents/Modal.js.map +1 -0
- package/dist/agents/PulsingDot.d.ts +21 -0
- package/dist/agents/PulsingDot.d.ts.map +1 -0
- package/dist/agents/PulsingDot.js +18 -0
- package/dist/agents/PulsingDot.js.map +1 -0
- package/dist/agents/index.d.ts +15 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +15 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/auth/authApi.d.ts +32 -0
- package/dist/auth/authApi.d.ts.map +1 -0
- package/dist/auth/authApi.js +27 -0
- package/dist/auth/authApi.js.map +1 -0
- package/dist/auth/claims.d.ts +27 -0
- package/dist/auth/claims.d.ts.map +1 -0
- package/dist/auth/claims.js +58 -0
- package/dist/auth/claims.js.map +1 -0
- package/dist/auth/components/AuthProviderToggles.d.ts +31 -0
- package/dist/auth/components/AuthProviderToggles.d.ts.map +1 -0
- package/dist/auth/components/AuthProviderToggles.js +48 -0
- package/dist/auth/components/AuthProviderToggles.js.map +1 -0
- package/dist/auth/components/AuthSignInHelper.d.ts +57 -0
- package/dist/auth/components/AuthSignInHelper.d.ts.map +1 -0
- package/dist/auth/components/AuthSignInHelper.js +69 -0
- package/dist/auth/components/AuthSignInHelper.js.map +1 -0
- package/dist/auth/components/AuthUserForm.d.ts +84 -0
- package/dist/auth/components/AuthUserForm.d.ts.map +1 -0
- package/dist/auth/components/AuthUserForm.js +89 -0
- package/dist/auth/components/AuthUserForm.js.map +1 -0
- package/dist/auth/components/AuthUserList.d.ts +62 -0
- package/dist/auth/components/AuthUserList.d.ts.map +1 -0
- package/dist/auth/components/AuthUserList.js +46 -0
- package/dist/auth/components/AuthUserList.js.map +1 -0
- package/dist/auth/components/ClaimsField.d.ts +22 -0
- package/dist/auth/components/ClaimsField.d.ts.map +1 -0
- package/dist/auth/components/ClaimsField.js +11 -0
- package/dist/auth/components/ClaimsField.js.map +1 -0
- package/dist/auth/components/confirmActions.d.ts +40 -0
- package/dist/auth/components/confirmActions.d.ts.map +1 -0
- package/dist/auth/components/confirmActions.js +49 -0
- package/dist/auth/components/confirmActions.js.map +1 -0
- package/dist/auth/controller.d.ts +73 -0
- package/dist/auth/controller.d.ts.map +1 -0
- package/dist/auth/controller.js +139 -0
- package/dist/auth/controller.js.map +1 -0
- package/dist/auth/hooks/index.d.ts +7 -0
- package/dist/auth/hooks/index.d.ts.map +1 -0
- package/dist/auth/hooks/index.js +7 -0
- package/dist/auth/hooks/index.js.map +1 -0
- package/dist/auth/hooks/useAuthFlowHelper.d.ts +30 -0
- package/dist/auth/hooks/useAuthFlowHelper.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthFlowHelper.js +30 -0
- package/dist/auth/hooks/useAuthFlowHelper.js.map +1 -0
- package/dist/auth/hooks/useAuthProviderConfig.d.ts +37 -0
- package/dist/auth/hooks/useAuthProviderConfig.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthProviderConfig.js +98 -0
- package/dist/auth/hooks/useAuthProviderConfig.js.map +1 -0
- package/dist/auth/hooks/useAuthUserEditor.d.ts +30 -0
- package/dist/auth/hooks/useAuthUserEditor.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthUserEditor.js +27 -0
- package/dist/auth/hooks/useAuthUserEditor.js.map +1 -0
- package/dist/auth/hooks/useAuthUsers.d.ts +38 -0
- package/dist/auth/hooks/useAuthUsers.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthUsers.js +111 -0
- package/dist/auth/hooks/useAuthUsers.js.map +1 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +13 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/providers.d.ts +11 -0
- package/dist/auth/providers.d.ts.map +1 -0
- package/dist/auth/providers.js +28 -0
- package/dist/auth/providers.js.map +1 -0
- package/dist/auth/reducers/userEditor.d.ts +55 -0
- package/dist/auth/reducers/userEditor.d.ts.map +1 -0
- package/dist/auth/reducers/userEditor.js +136 -0
- package/dist/auth/reducers/userEditor.js.map +1 -0
- package/dist/events/components/ActivityActionItems.d.ts +45 -0
- package/dist/events/components/ActivityActionItems.d.ts.map +1 -0
- package/dist/events/components/ActivityActionItems.js +68 -0
- package/dist/events/components/ActivityActionItems.js.map +1 -0
- package/dist/events/components/ActivityGrid.d.ts +65 -0
- package/dist/events/components/ActivityGrid.d.ts.map +1 -0
- package/dist/events/components/ActivityGrid.js +61 -0
- package/dist/events/components/ActivityGrid.js.map +1 -0
- package/dist/events/components/ActivityGridRow.d.ts +31 -0
- package/dist/events/components/ActivityGridRow.d.ts.map +1 -0
- package/dist/events/components/ActivityGridRow.js +23 -0
- package/dist/events/components/ActivityGridRow.js.map +1 -0
- package/dist/events/components/ProposedChangeDiff.d.ts +46 -0
- package/dist/events/components/ProposedChangeDiff.d.ts.map +1 -0
- package/dist/events/components/ProposedChangeDiff.js +60 -0
- package/dist/events/components/ProposedChangeDiff.js.map +1 -0
- package/dist/events/components/format.d.ts +11 -0
- package/dist/events/components/format.d.ts.map +1 -0
- package/dist/events/components/format.js +26 -0
- package/dist/events/components/format.js.map +1 -0
- package/dist/events/components/index.d.ts +6 -0
- package/dist/events/components/index.d.ts.map +1 -0
- package/dist/events/components/index.js +6 -0
- package/dist/events/components/index.js.map +1 -0
- package/dist/events/digest.d.ts +167 -0
- package/dist/events/digest.d.ts.map +1 -0
- package/dist/events/digest.js +426 -0
- package/dist/events/digest.js.map +1 -0
- package/dist/events/hooks/index.d.ts +3 -0
- package/dist/events/hooks/index.d.ts.map +1 -0
- package/dist/events/hooks/index.js +3 -0
- package/dist/events/hooks/index.js.map +1 -0
- package/dist/events/hooks/useActivityDigest.d.ts +27 -0
- package/dist/events/hooks/useActivityDigest.d.ts.map +1 -0
- package/dist/events/hooks/useActivityDigest.js +18 -0
- package/dist/events/hooks/useActivityDigest.js.map +1 -0
- package/dist/events/hooks/useActivityStream.d.ts +44 -0
- package/dist/events/hooks/useActivityStream.d.ts.map +1 -0
- package/dist/events/hooks/useActivityStream.js +38 -0
- package/dist/events/hooks/useActivityStream.js.map +1 -0
- package/dist/events/index.d.ts +15 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +14 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +160 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +21 -0
- package/dist/events/types.js.map +1 -0
- package/dist/firestore/components/CollectionList.d.ts +22 -0
- package/dist/firestore/components/CollectionList.d.ts.map +1 -0
- package/dist/firestore/components/CollectionList.js +21 -0
- package/dist/firestore/components/CollectionList.js.map +1 -0
- package/dist/firestore/components/DeleteWithConfirm.d.ts +38 -0
- package/dist/firestore/components/DeleteWithConfirm.d.ts.map +1 -0
- package/dist/firestore/components/DeleteWithConfirm.js +33 -0
- package/dist/firestore/components/DeleteWithConfirm.js.map +1 -0
- package/dist/firestore/components/DocumentEditor.d.ts +47 -0
- package/dist/firestore/components/DocumentEditor.d.ts.map +1 -0
- package/dist/firestore/components/DocumentEditor.js +176 -0
- package/dist/firestore/components/DocumentEditor.js.map +1 -0
- package/dist/firestore/components/DocumentList.d.ts +63 -0
- package/dist/firestore/components/DocumentList.d.ts.map +1 -0
- package/dist/firestore/components/DocumentList.js +53 -0
- package/dist/firestore/components/DocumentList.js.map +1 -0
- package/dist/firestore/components/DocumentPreview.d.ts +68 -0
- package/dist/firestore/components/DocumentPreview.d.ts.map +1 -0
- package/dist/firestore/components/DocumentPreview.js +76 -0
- package/dist/firestore/components/DocumentPreview.js.map +1 -0
- package/dist/firestore/components/FieldRenderer.d.ts +17 -0
- package/dist/firestore/components/FieldRenderer.d.ts.map +1 -0
- package/dist/firestore/components/FieldRenderer.js +16 -0
- package/dist/firestore/components/FieldRenderer.js.map +1 -0
- package/dist/firestore/components/QueryBuilder.d.ts +25 -0
- package/dist/firestore/components/QueryBuilder.d.ts.map +1 -0
- package/dist/firestore/components/QueryBuilder.js +78 -0
- package/dist/firestore/components/QueryBuilder.js.map +1 -0
- package/dist/firestore/components/ReferencePicker.d.ts +33 -0
- package/dist/firestore/components/ReferencePicker.d.ts.map +1 -0
- package/dist/firestore/components/ReferencePicker.js +42 -0
- package/dist/firestore/components/ReferencePicker.js.map +1 -0
- package/dist/firestore/components/TreeEntry.d.ts +15 -0
- package/dist/firestore/components/TreeEntry.d.ts.map +1 -0
- package/dist/firestore/components/TreeEntry.js +23 -0
- package/dist/firestore/components/TreeEntry.js.map +1 -0
- package/dist/firestore/components/context.d.ts +18 -0
- package/dist/firestore/components/context.d.ts.map +1 -0
- package/dist/firestore/components/context.js +7 -0
- package/dist/firestore/components/context.js.map +1 -0
- package/dist/firestore/fieldEditors/array.d.ts +3 -0
- package/dist/firestore/fieldEditors/array.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/array.js +16 -0
- package/dist/firestore/fieldEditors/array.js.map +1 -0
- package/dist/firestore/fieldEditors/boolean.d.ts +3 -0
- package/dist/firestore/fieldEditors/boolean.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/boolean.js +13 -0
- package/dist/firestore/fieldEditors/boolean.js.map +1 -0
- package/dist/firestore/fieldEditors/bytes.d.ts +4 -0
- package/dist/firestore/fieldEditors/bytes.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/bytes.js +31 -0
- package/dist/firestore/fieldEditors/bytes.js.map +1 -0
- package/dist/firestore/fieldEditors/geopoint.d.ts +4 -0
- package/dist/firestore/fieldEditors/geopoint.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/geopoint.js +32 -0
- package/dist/firestore/fieldEditors/geopoint.js.map +1 -0
- package/dist/firestore/fieldEditors/map.d.ts +3 -0
- package/dist/firestore/fieldEditors/map.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/map.js +19 -0
- package/dist/firestore/fieldEditors/map.js.map +1 -0
- package/dist/firestore/fieldEditors/null.d.ts +3 -0
- package/dist/firestore/fieldEditors/null.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/null.js +17 -0
- package/dist/firestore/fieldEditors/null.js.map +1 -0
- package/dist/firestore/fieldEditors/number.d.ts +3 -0
- package/dist/firestore/fieldEditors/number.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/number.js +24 -0
- package/dist/firestore/fieldEditors/number.js.map +1 -0
- package/dist/firestore/fieldEditors/reference.d.ts +4 -0
- package/dist/firestore/fieldEditors/reference.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/reference.js +49 -0
- package/dist/firestore/fieldEditors/reference.js.map +1 -0
- package/dist/firestore/fieldEditors/registry.d.ts +16 -0
- package/dist/firestore/fieldEditors/registry.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/registry.js +42 -0
- package/dist/firestore/fieldEditors/registry.js.map +1 -0
- package/dist/firestore/fieldEditors/string.d.ts +3 -0
- package/dist/firestore/fieldEditors/string.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/string.js +13 -0
- package/dist/firestore/fieldEditors/string.js.map +1 -0
- package/dist/firestore/fieldEditors/timestamp.d.ts +4 -0
- package/dist/firestore/fieldEditors/timestamp.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/timestamp.js +52 -0
- package/dist/firestore/fieldEditors/timestamp.js.map +1 -0
- package/dist/firestore/fieldEditors/types.d.ts +64 -0
- package/dist/firestore/fieldEditors/types.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/types.js +2 -0
- package/dist/firestore/fieldEditors/types.js.map +1 -0
- package/dist/firestore/fieldEditors/vector.d.ts +29 -0
- package/dist/firestore/fieldEditors/vector.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/vector.js +93 -0
- package/dist/firestore/fieldEditors/vector.js.map +1 -0
- package/dist/firestore/firestoreApi.d.ts +35 -0
- package/dist/firestore/firestoreApi.d.ts.map +1 -0
- package/dist/firestore/firestoreApi.js +29 -0
- package/dist/firestore/firestoreApi.js.map +1 -0
- package/dist/firestore/hooks/coerceError.d.ts +17 -0
- package/dist/firestore/hooks/coerceError.d.ts.map +1 -0
- package/dist/firestore/hooks/coerceError.js +41 -0
- package/dist/firestore/hooks/coerceError.js.map +1 -0
- package/dist/firestore/hooks/index.d.ts +10 -0
- package/dist/firestore/hooks/index.d.ts.map +1 -0
- package/dist/firestore/hooks/index.js +10 -0
- package/dist/firestore/hooks/index.js.map +1 -0
- package/dist/firestore/hooks/useCollectionList.d.ts +37 -0
- package/dist/firestore/hooks/useCollectionList.d.ts.map +1 -0
- package/dist/firestore/hooks/useCollectionList.js +51 -0
- package/dist/firestore/hooks/useCollectionList.js.map +1 -0
- package/dist/firestore/hooks/useDocumentEditor.d.ts +61 -0
- package/dist/firestore/hooks/useDocumentEditor.d.ts.map +1 -0
- package/dist/firestore/hooks/useDocumentEditor.js +71 -0
- package/dist/firestore/hooks/useDocumentEditor.js.map +1 -0
- package/dist/firestore/hooks/useDocumentList.d.ts +50 -0
- package/dist/firestore/hooks/useDocumentList.d.ts.map +1 -0
- package/dist/firestore/hooks/useDocumentList.js +162 -0
- package/dist/firestore/hooks/useDocumentList.js.map +1 -0
- package/dist/firestore/hooks/useDocumentSubcollections.d.ts +29 -0
- package/dist/firestore/hooks/useDocumentSubcollections.d.ts.map +1 -0
- package/dist/firestore/hooks/useDocumentSubcollections.js +48 -0
- package/dist/firestore/hooks/useDocumentSubcollections.js.map +1 -0
- package/dist/firestore/hooks/useFirestoreCollection.d.ts +14 -0
- package/dist/firestore/hooks/useFirestoreCollection.d.ts.map +1 -0
- package/dist/firestore/hooks/useFirestoreCollection.js +36 -0
- package/dist/firestore/hooks/useFirestoreCollection.js.map +1 -0
- package/dist/firestore/hooks/useFirestoreDoc.d.ts +17 -0
- package/dist/firestore/hooks/useFirestoreDoc.d.ts.map +1 -0
- package/dist/firestore/hooks/useFirestoreDoc.js +35 -0
- package/dist/firestore/hooks/useFirestoreDoc.js.map +1 -0
- package/dist/firestore/hooks/useQueryBuilder.d.ts +51 -0
- package/dist/firestore/hooks/useQueryBuilder.d.ts.map +1 -0
- package/dist/firestore/hooks/useQueryBuilder.js +110 -0
- package/dist/firestore/hooks/useQueryBuilder.js.map +1 -0
- package/dist/firestore/hooks/useRecursiveDelete.d.ts +40 -0
- package/dist/firestore/hooks/useRecursiveDelete.d.ts.map +1 -0
- package/dist/firestore/hooks/useRecursiveDelete.js +44 -0
- package/dist/firestore/hooks/useRecursiveDelete.js.map +1 -0
- package/dist/firestore/hooks/useReferencePicker.d.ts +70 -0
- package/dist/firestore/hooks/useReferencePicker.d.ts.map +1 -0
- package/dist/firestore/hooks/useReferencePicker.js +140 -0
- package/dist/firestore/hooks/useReferencePicker.js.map +1 -0
- package/dist/firestore/import/parseImport.d.ts +55 -0
- package/dist/firestore/import/parseImport.d.ts.map +1 -0
- package/dist/firestore/import/parseImport.js +101 -0
- package/dist/firestore/import/parseImport.js.map +1 -0
- package/dist/firestore/index.d.ts +21 -0
- package/dist/firestore/index.d.ts.map +1 -0
- package/dist/firestore/index.js +29 -0
- package/dist/firestore/index.js.map +1 -0
- package/dist/firestore/reducers/defaults.d.ts +10 -0
- package/dist/firestore/reducers/defaults.d.ts.map +1 -0
- package/dist/firestore/reducers/defaults.js +37 -0
- package/dist/firestore/reducers/defaults.js.map +1 -0
- package/dist/firestore/reducers/documentEditor.d.ts +23 -0
- package/dist/firestore/reducers/documentEditor.d.ts.map +1 -0
- package/dist/firestore/reducers/documentEditor.js +201 -0
- package/dist/firestore/reducers/documentEditor.js.map +1 -0
- package/dist/firestore/reducers/tree.d.ts +28 -0
- package/dist/firestore/reducers/tree.d.ts.map +1 -0
- package/dist/firestore/reducers/tree.js +129 -0
- package/dist/firestore/reducers/tree.js.map +1 -0
- package/dist/firestore/reducers/types.d.ts +115 -0
- package/dist/firestore/reducers/types.d.ts.map +1 -0
- package/dist/firestore/reducers/types.js +2 -0
- package/dist/firestore/reducers/types.js.map +1 -0
- package/dist/firestore/reducers/validation.d.ts +25 -0
- package/dist/firestore/reducers/validation.d.ts.map +1 -0
- package/dist/firestore/reducers/validation.js +121 -0
- package/dist/firestore/reducers/validation.js.map +1 -0
- package/dist/firestore/types.d.ts +77 -0
- package/dist/firestore/types.d.ts.map +1 -0
- package/dist/firestore/types.js +196 -0
- package/dist/firestore/types.js.map +1 -0
- package/dist/firestore/validation/ids.d.ts +23 -0
- package/dist/firestore/validation/ids.d.ts.map +1 -0
- package/dist/firestore/validation/ids.js +46 -0
- package/dist/firestore/validation/ids.js.map +1 -0
- package/dist/firestore/valueEquality.d.ts +4 -0
- package/dist/firestore/valueEquality.d.ts.map +1 -0
- package/dist/firestore/valueEquality.js +44 -0
- package/dist/firestore/valueEquality.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/Badge.d.ts +28 -0
- package/dist/primitives/Badge.d.ts.map +1 -0
- package/dist/primitives/Badge.js +11 -0
- package/dist/primitives/Badge.js.map +1 -0
- package/dist/primitives/ConfirmDialog.d.ts +42 -0
- package/dist/primitives/ConfirmDialog.d.ts.map +1 -0
- package/dist/primitives/ConfirmDialog.js +61 -0
- package/dist/primitives/ConfirmDialog.js.map +1 -0
- package/dist/primitives/CopyButton.d.ts +28 -0
- package/dist/primitives/CopyButton.d.ts.map +1 -0
- package/dist/primitives/CopyButton.js +27 -0
- package/dist/primitives/CopyButton.js.map +1 -0
- package/dist/primitives/JsonView.d.ts +29 -0
- package/dist/primitives/JsonView.d.ts.map +1 -0
- package/dist/primitives/JsonView.js +56 -0
- package/dist/primitives/JsonView.js.map +1 -0
- package/dist/primitives/SegmentedControl.d.ts +37 -0
- package/dist/primitives/SegmentedControl.d.ts.map +1 -0
- package/dist/primitives/SegmentedControl.js +18 -0
- package/dist/primitives/SegmentedControl.js.map +1 -0
- package/dist/primitives/Toast.d.ts +48 -0
- package/dist/primitives/Toast.d.ts.map +1 -0
- package/dist/primitives/Toast.js +60 -0
- package/dist/primitives/Toast.js.map +1 -0
- package/dist/primitives/VirtualList.d.ts +37 -0
- package/dist/primitives/VirtualList.d.ts.map +1 -0
- package/dist/primitives/VirtualList.js +47 -0
- package/dist/primitives/VirtualList.js.map +1 -0
- package/dist/primitives/hooks/useContainerSize.d.ts +29 -0
- package/dist/primitives/hooks/useContainerSize.d.ts.map +1 -0
- package/dist/primitives/hooks/useContainerSize.js +45 -0
- package/dist/primitives/hooks/useContainerSize.js.map +1 -0
- package/dist/primitives/hooks/useUpdateHighlights.d.ts +18 -0
- package/dist/primitives/hooks/useUpdateHighlights.d.ts.map +1 -0
- package/dist/primitives/hooks/useUpdateHighlights.js +84 -0
- package/dist/primitives/hooks/useUpdateHighlights.js.map +1 -0
- package/dist/primitives/index.d.ts +11 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +11 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/useConfirm.d.ts +34 -0
- package/dist/primitives/useConfirm.d.ts.map +1 -0
- package/dist/primitives/useConfirm.js +63 -0
- package/dist/primitives/useConfirm.js.map +1 -0
- package/dist/rtdb/components/RtdbPathBar.d.ts +31 -0
- package/dist/rtdb/components/RtdbPathBar.d.ts.map +1 -0
- package/dist/rtdb/components/RtdbPathBar.js +47 -0
- package/dist/rtdb/components/RtdbPathBar.js.map +1 -0
- package/dist/rtdb/components/RtdbTree.d.ts +38 -0
- package/dist/rtdb/components/RtdbTree.d.ts.map +1 -0
- package/dist/rtdb/components/RtdbTree.js +104 -0
- package/dist/rtdb/components/RtdbTree.js.map +1 -0
- package/dist/rtdb/editor.d.ts +25 -0
- package/dist/rtdb/editor.d.ts.map +1 -0
- package/dist/rtdb/editor.js +79 -0
- package/dist/rtdb/editor.js.map +1 -0
- package/dist/rtdb/hooks/useRtdbTree.d.ts +33 -0
- package/dist/rtdb/hooks/useRtdbTree.d.ts.map +1 -0
- package/dist/rtdb/hooks/useRtdbTree.js +67 -0
- package/dist/rtdb/hooks/useRtdbTree.js.map +1 -0
- package/dist/rtdb/index.d.ts +17 -0
- package/dist/rtdb/index.d.ts.map +1 -0
- package/dist/rtdb/index.js +21 -0
- package/dist/rtdb/index.js.map +1 -0
- package/dist/rtdb/pathInput.d.ts +28 -0
- package/dist/rtdb/pathInput.d.ts.map +1 -0
- package/dist/rtdb/pathInput.js +40 -0
- package/dist/rtdb/pathInput.js.map +1 -0
- package/dist/rtdb/reducers/tree.d.ts +86 -0
- package/dist/rtdb/reducers/tree.d.ts.map +1 -0
- package/dist/rtdb/reducers/tree.js +131 -0
- package/dist/rtdb/reducers/tree.js.map +1 -0
- package/dist/rtdb/rtdbApi.d.ts +20 -0
- package/dist/rtdb/rtdbApi.d.ts.map +1 -0
- package/dist/rtdb/rtdbApi.js +2 -0
- package/dist/rtdb/rtdbApi.js.map +1 -0
- package/dist/rtdb/values.d.ts +50 -0
- package/dist/rtdb/values.d.ts.map +1 -0
- package/dist/rtdb/values.js +186 -0
- package/dist/rtdb/values.js.map +1 -0
- package/dist/rules/components/DenialInspector.d.ts +18 -0
- package/dist/rules/components/DenialInspector.d.ts.map +1 -0
- package/dist/rules/components/DenialInspector.js +58 -0
- package/dist/rules/components/DenialInspector.js.map +1 -0
- package/dist/rules/components/format.d.ts +56 -0
- package/dist/rules/components/format.d.ts.map +1 -0
- package/dist/rules/components/format.js +137 -0
- package/dist/rules/components/format.js.map +1 -0
- package/dist/rules/components/index.d.ts +4 -0
- package/dist/rules/components/index.d.ts.map +1 -0
- package/dist/rules/components/index.js +4 -0
- package/dist/rules/components/index.js.map +1 -0
- package/dist/rules/components/scope.d.ts +10 -0
- package/dist/rules/components/scope.d.ts.map +1 -0
- package/dist/rules/components/scope.js +72 -0
- package/dist/rules/components/scope.js.map +1 -0
- package/dist/rules/hooks/index.d.ts +2 -0
- package/dist/rules/hooks/index.d.ts.map +1 -0
- package/dist/rules/hooks/index.js +2 -0
- package/dist/rules/hooks/index.js.map +1 -0
- package/dist/rules/hooks/useDenialTrace.d.ts +51 -0
- package/dist/rules/hooks/useDenialTrace.d.ts.map +1 -0
- package/dist/rules/hooks/useDenialTrace.js +58 -0
- package/dist/rules/hooks/useDenialTrace.js.map +1 -0
- package/dist/rules/index.d.ts +14 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +13 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/types.d.ts +75 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +2 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/storage/collisionRename.d.ts +73 -0
- package/dist/storage/collisionRename.d.ts.map +1 -0
- package/dist/storage/collisionRename.js +113 -0
- package/dist/storage/collisionRename.js.map +1 -0
- package/dist/storage/components/DeleteSelectionWithConfirm.d.ts +66 -0
- package/dist/storage/components/DeleteSelectionWithConfirm.d.ts.map +1 -0
- package/dist/storage/components/DeleteSelectionWithConfirm.js +82 -0
- package/dist/storage/components/DeleteSelectionWithConfirm.js.map +1 -0
- package/dist/storage/components/ObjectBrowser.d.ts +78 -0
- package/dist/storage/components/ObjectBrowser.d.ts.map +1 -0
- package/dist/storage/components/ObjectBrowser.js +60 -0
- package/dist/storage/components/ObjectBrowser.js.map +1 -0
- package/dist/storage/components/ObjectInspector.d.ts +43 -0
- package/dist/storage/components/ObjectInspector.d.ts.map +1 -0
- package/dist/storage/components/ObjectInspector.js +92 -0
- package/dist/storage/components/ObjectInspector.js.map +1 -0
- package/dist/storage/components/PathBreadcrumb.d.ts +30 -0
- package/dist/storage/components/PathBreadcrumb.d.ts.map +1 -0
- package/dist/storage/components/PathBreadcrumb.js +26 -0
- package/dist/storage/components/PathBreadcrumb.js.map +1 -0
- package/dist/storage/components/UploadDropzone.d.ts +50 -0
- package/dist/storage/components/UploadDropzone.d.ts.map +1 -0
- package/dist/storage/components/UploadDropzone.js +109 -0
- package/dist/storage/components/UploadDropzone.js.map +1 -0
- package/dist/storage/folderPlaceholder.d.ts +20 -0
- package/dist/storage/folderPlaceholder.d.ts.map +1 -0
- package/dist/storage/folderPlaceholder.js +34 -0
- package/dist/storage/folderPlaceholder.js.map +1 -0
- package/dist/storage/hooks/index.d.ts +9 -0
- package/dist/storage/hooks/index.d.ts.map +1 -0
- package/dist/storage/hooks/index.js +9 -0
- package/dist/storage/hooks/index.js.map +1 -0
- package/dist/storage/hooks/useMetadataEditor.d.ts +114 -0
- package/dist/storage/hooks/useMetadataEditor.d.ts.map +1 -0
- package/dist/storage/hooks/useMetadataEditor.js +193 -0
- package/dist/storage/hooks/useMetadataEditor.js.map +1 -0
- package/dist/storage/hooks/useObjectUpload.d.ts +105 -0
- package/dist/storage/hooks/useObjectUpload.d.ts.map +1 -0
- package/dist/storage/hooks/useObjectUpload.js +134 -0
- package/dist/storage/hooks/useObjectUpload.js.map +1 -0
- package/dist/storage/hooks/usePathState.d.ts +43 -0
- package/dist/storage/hooks/usePathState.d.ts.map +1 -0
- package/dist/storage/hooks/usePathState.js +42 -0
- package/dist/storage/hooks/usePathState.js.map +1 -0
- package/dist/storage/hooks/useStorageDelete.d.ts +74 -0
- package/dist/storage/hooks/useStorageDelete.d.ts.map +1 -0
- package/dist/storage/hooks/useStorageDelete.js +120 -0
- package/dist/storage/hooks/useStorageDelete.js.map +1 -0
- package/dist/storage/hooks/useStorageList.d.ts +72 -0
- package/dist/storage/hooks/useStorageList.d.ts.map +1 -0
- package/dist/storage/hooks/useStorageList.js +164 -0
- package/dist/storage/hooks/useStorageList.js.map +1 -0
- package/dist/storage/hooks/useStorageObject.d.ts +33 -0
- package/dist/storage/hooks/useStorageObject.d.ts.map +1 -0
- package/dist/storage/hooks/useStorageObject.js +114 -0
- package/dist/storage/hooks/useStorageObject.js.map +1 -0
- package/dist/storage/hooks/useStorageRulesGate.d.ts +116 -0
- package/dist/storage/hooks/useStorageRulesGate.d.ts.map +1 -0
- package/dist/storage/hooks/useStorageRulesGate.js +150 -0
- package/dist/storage/hooks/useStorageRulesGate.js.map +1 -0
- package/dist/storage/hooks/useStorageSelection.d.ts +32 -0
- package/dist/storage/hooks/useStorageSelection.d.ts.map +1 -0
- package/dist/storage/hooks/useStorageSelection.js +55 -0
- package/dist/storage/hooks/useStorageSelection.js.map +1 -0
- package/dist/storage/index.d.ts +11 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +17 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/pendingPrefixes.d.ts +77 -0
- package/dist/storage/pendingPrefixes.d.ts.map +1 -0
- package/dist/storage/pendingPrefixes.js +104 -0
- package/dist/storage/pendingPrefixes.js.map +1 -0
- package/dist/storage/previews.d.ts +51 -0
- package/dist/storage/previews.d.ts.map +1 -0
- package/dist/storage/previews.js +73 -0
- package/dist/storage/previews.js.map +1 -0
- package/dist/storage/storageApi.d.ts +30 -0
- package/dist/storage/storageApi.d.ts.map +1 -0
- package/dist/storage/storageApi.js +20 -0
- package/dist/storage/storageApi.js.map +1 -0
- package/dist/traffic/components/RuleHeatmap.d.ts +34 -0
- package/dist/traffic/components/RuleHeatmap.d.ts.map +1 -0
- package/dist/traffic/components/RuleHeatmap.js +40 -0
- package/dist/traffic/components/RuleHeatmap.js.map +1 -0
- package/dist/traffic/components/TrafficDetail.d.ts +33 -0
- package/dist/traffic/components/TrafficDetail.d.ts.map +1 -0
- package/dist/traffic/components/TrafficDetail.js +28 -0
- package/dist/traffic/components/TrafficDetail.js.map +1 -0
- package/dist/traffic/components/TrafficGroupRow.d.ts +28 -0
- package/dist/traffic/components/TrafficGroupRow.d.ts.map +1 -0
- package/dist/traffic/components/TrafficGroupRow.js +25 -0
- package/dist/traffic/components/TrafficGroupRow.js.map +1 -0
- package/dist/traffic/components/TrafficLineChart.d.ts +37 -0
- package/dist/traffic/components/TrafficLineChart.d.ts.map +1 -0
- package/dist/traffic/components/TrafficLineChart.js +49 -0
- package/dist/traffic/components/TrafficLineChart.js.map +1 -0
- package/dist/traffic/components/TrafficLog.d.ts +52 -0
- package/dist/traffic/components/TrafficLog.d.ts.map +1 -0
- package/dist/traffic/components/TrafficLog.js +34 -0
- package/dist/traffic/components/TrafficLog.js.map +1 -0
- package/dist/traffic/components/TrafficMetricCards.d.ts +26 -0
- package/dist/traffic/components/TrafficMetricCards.d.ts.map +1 -0
- package/dist/traffic/components/TrafficMetricCards.js +24 -0
- package/dist/traffic/components/TrafficMetricCards.js.map +1 -0
- package/dist/traffic/components/TrafficRow.d.ts +40 -0
- package/dist/traffic/components/TrafficRow.d.ts.map +1 -0
- package/dist/traffic/components/TrafficRow.js +27 -0
- package/dist/traffic/components/TrafficRow.js.map +1 -0
- package/dist/traffic/components/TrafficStats.d.ts +18 -0
- package/dist/traffic/components/TrafficStats.d.ts.map +1 -0
- package/dist/traffic/components/TrafficStats.js +19 -0
- package/dist/traffic/components/TrafficStats.js.map +1 -0
- package/dist/traffic/components/TrafficTimeline.d.ts +88 -0
- package/dist/traffic/components/TrafficTimeline.d.ts.map +1 -0
- package/dist/traffic/components/TrafficTimeline.js +86 -0
- package/dist/traffic/components/TrafficTimeline.js.map +1 -0
- package/dist/traffic/components/format.d.ts +13 -0
- package/dist/traffic/components/format.d.ts.map +1 -0
- package/dist/traffic/components/format.js +24 -0
- package/dist/traffic/components/format.js.map +1 -0
- package/dist/traffic/components/index.d.ts +11 -0
- package/dist/traffic/components/index.d.ts.map +1 -0
- package/dist/traffic/components/index.js +11 -0
- package/dist/traffic/components/index.js.map +1 -0
- package/dist/traffic/hooks/index.d.ts +8 -0
- package/dist/traffic/hooks/index.d.ts.map +1 -0
- package/dist/traffic/hooks/index.js +8 -0
- package/dist/traffic/hooks/index.js.map +1 -0
- package/dist/traffic/hooks/useRuleHeatmap.d.ts +33 -0
- package/dist/traffic/hooks/useRuleHeatmap.d.ts.map +1 -0
- package/dist/traffic/hooks/useRuleHeatmap.js +54 -0
- package/dist/traffic/hooks/useRuleHeatmap.js.map +1 -0
- package/dist/traffic/hooks/useTrafficBuckets.d.ts +71 -0
- package/dist/traffic/hooks/useTrafficBuckets.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficBuckets.js +74 -0
- package/dist/traffic/hooks/useTrafficBuckets.js.map +1 -0
- package/dist/traffic/hooks/useTrafficFilter.d.ts +40 -0
- package/dist/traffic/hooks/useTrafficFilter.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficFilter.js +33 -0
- package/dist/traffic/hooks/useTrafficFilter.js.map +1 -0
- package/dist/traffic/hooks/useTrafficGroups.d.ts +47 -0
- package/dist/traffic/hooks/useTrafficGroups.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficGroups.js +73 -0
- package/dist/traffic/hooks/useTrafficGroups.js.map +1 -0
- package/dist/traffic/hooks/useTrafficMetrics.d.ts +66 -0
- package/dist/traffic/hooks/useTrafficMetrics.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficMetrics.js +156 -0
- package/dist/traffic/hooks/useTrafficMetrics.js.map +1 -0
- package/dist/traffic/hooks/useTrafficMonitor.d.ts +56 -0
- package/dist/traffic/hooks/useTrafficMonitor.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficMonitor.js +58 -0
- package/dist/traffic/hooks/useTrafficMonitor.js.map +1 -0
- package/dist/traffic/hooks/useTrafficStats.d.ts +32 -0
- package/dist/traffic/hooks/useTrafficStats.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficStats.js +45 -0
- package/dist/traffic/hooks/useTrafficStats.js.map +1 -0
- package/dist/traffic/index.d.ts +4 -0
- package/dist/traffic/index.d.ts.map +1 -0
- package/dist/traffic/index.js +3 -0
- package/dist/traffic/index.js.map +1 -0
- package/dist/traffic/types.d.ts +72 -0
- package/dist/traffic/types.d.ts.map +1 -0
- package/dist/traffic/types.js +10 -0
- package/dist/traffic/types.js.map +1 -0
- package/package.json +127 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { useStorageList, } from './useStorageList.js';
|
|
2
|
+
export { usePathState, normalizeStoragePath, } from './usePathState.js';
|
|
3
|
+
export { useStorageObject, } from './useStorageObject.js';
|
|
4
|
+
export { useMetadataEditor, metadataEditorReducer, initMetadataEditorState, } from './useMetadataEditor.js';
|
|
5
|
+
export { useStorageSelection, } from './useStorageSelection.js';
|
|
6
|
+
export { useStorageDelete, createListAllDeleteImpl, } from './useStorageDelete.js';
|
|
7
|
+
export { useStorageRulesGate, } from './useStorageRulesGate.js';
|
|
8
|
+
export { useObjectUpload, } from './useObjectUpload.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAIf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,oBAAoB,GAGrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,gBAAgB,GAGjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,GAMxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,GAGpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,GAOxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,mBAAmB,GAMpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,eAAe,GAOhB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { type FirebaseStorage, type FullMetadata, type SettableMetadata } from 'pyric/storage';
|
|
2
|
+
/** One `customMetadata` row. `id` is a stable render key — keys are
|
|
3
|
+
* user-editable, so they can't key the rows themselves. */
|
|
4
|
+
export interface CustomMetadataEntry {
|
|
5
|
+
id: string;
|
|
6
|
+
key: string;
|
|
7
|
+
value: string;
|
|
8
|
+
/** Validation error (`'Key is required'` / `'Duplicate key'`). */
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
interface MetadataDraft {
|
|
12
|
+
contentType: string;
|
|
13
|
+
cacheControl: string;
|
|
14
|
+
custom: CustomMetadataEntry[];
|
|
15
|
+
}
|
|
16
|
+
export interface MetadataEditorState {
|
|
17
|
+
draft: MetadataDraft;
|
|
18
|
+
/** Snapshot for `isDirty` / `reset` — same reference-compare
|
|
19
|
+
* semantics as the document editor's `tree !== initial`. */
|
|
20
|
+
initial: MetadataDraft;
|
|
21
|
+
errorCount: number;
|
|
22
|
+
}
|
|
23
|
+
export type MetadataEditorAction = {
|
|
24
|
+
type: 'setContentType';
|
|
25
|
+
value: string;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'setCacheControl';
|
|
28
|
+
value: string;
|
|
29
|
+
} | {
|
|
30
|
+
type: 'setCustomKey';
|
|
31
|
+
id: string;
|
|
32
|
+
key: string;
|
|
33
|
+
} | {
|
|
34
|
+
type: 'setCustomValue';
|
|
35
|
+
id: string;
|
|
36
|
+
value: string;
|
|
37
|
+
} | {
|
|
38
|
+
type: 'addCustomEntry';
|
|
39
|
+
key?: string;
|
|
40
|
+
value?: string;
|
|
41
|
+
} | {
|
|
42
|
+
type: 'removeCustomEntry';
|
|
43
|
+
id: string;
|
|
44
|
+
} | {
|
|
45
|
+
type: 'reset';
|
|
46
|
+
}
|
|
47
|
+
/** Internal — a successful save makes the draft the new baseline. */
|
|
48
|
+
| {
|
|
49
|
+
type: 'commit';
|
|
50
|
+
};
|
|
51
|
+
/** Pure reducer — exported (with {@link initMetadataEditorState}) so
|
|
52
|
+
* the edit state is testable without React, mirroring the document
|
|
53
|
+
* editor's reducer/hook split. */
|
|
54
|
+
export declare function metadataEditorReducer(state: MetadataEditorState, action: MetadataEditorAction): MetadataEditorState;
|
|
55
|
+
/** Build the edit state from the metadata a `getMetadata` /
|
|
56
|
+
* `useStorageObject` read returned. */
|
|
57
|
+
export declare function initMetadataEditorState(initial: SettableMetadata | undefined): MetadataEditorState;
|
|
58
|
+
export interface UseMetadataEditorOptions {
|
|
59
|
+
/** The metadata being edited — the same shape `useStorageObject`'s
|
|
60
|
+
* `metadata` carries. Read once on mount (the editor is a
|
|
61
|
+
* stateful workspace, like the document editor); `reset()` +
|
|
62
|
+
* remount to re-initialize. */
|
|
63
|
+
initial?: SettableMetadata;
|
|
64
|
+
}
|
|
65
|
+
export interface UseMetadataEditorResult {
|
|
66
|
+
contentType: string;
|
|
67
|
+
cacheControl: string;
|
|
68
|
+
custom: CustomMetadataEntry[];
|
|
69
|
+
/** Convenience: `errorCount === 0`. */
|
|
70
|
+
isValid: boolean;
|
|
71
|
+
/** `true` once any modifying action fired since the last
|
|
72
|
+
* `reset`/successful `save`. Reference-compare semantics — manual
|
|
73
|
+
* re-entry of the original values does NOT clear it. */
|
|
74
|
+
isDirty: boolean;
|
|
75
|
+
errorCount: number;
|
|
76
|
+
/** Raw dispatch — prefer the named helpers. */
|
|
77
|
+
dispatch: (action: MetadataEditorAction) => void;
|
|
78
|
+
setContentType: (value: string) => void;
|
|
79
|
+
setCacheControl: (value: string) => void;
|
|
80
|
+
setCustomKey: (id: string, key: string) => void;
|
|
81
|
+
setCustomValue: (id: string, value: string) => void;
|
|
82
|
+
addCustomEntry: (key?: string, value?: string) => void;
|
|
83
|
+
removeCustomEntry: (id: string) => void;
|
|
84
|
+
/** Restore the initial values. Clears `isDirty`. */
|
|
85
|
+
reset: () => void;
|
|
86
|
+
/**
|
|
87
|
+
* Serialize the draft to an `updateMetadata` patch. Empty
|
|
88
|
+
* `contentType`/`cacheControl` become `undefined` — which LEAVES
|
|
89
|
+
* the previous value (the sandbox doesn't model null-clears; see
|
|
90
|
+
* `pyric/storage`'s `updateMetadata` doc). `customMetadata` is
|
|
91
|
+
* always included and replaces wholesale, so row removal works.
|
|
92
|
+
*/
|
|
93
|
+
toPatch: () => SettableMetadata;
|
|
94
|
+
/**
|
|
95
|
+
* `updateMetadata(ref(storage, path), toPatch())`. Errors surface
|
|
96
|
+
* via `saveError` (typed `StorageError`), not throws — resolves
|
|
97
|
+
* `undefined` on failure or when the draft is invalid. On success
|
|
98
|
+
* the draft becomes the new baseline (`isDirty` clears) and the
|
|
99
|
+
* fresh `FullMetadata` is returned.
|
|
100
|
+
*/
|
|
101
|
+
save: () => Promise<FullMetadata | undefined>;
|
|
102
|
+
isSaving: boolean;
|
|
103
|
+
saveError: Error | undefined;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Headless metadata editor — the `useDocumentEditor` reducer pattern
|
|
107
|
+
* over `updateMetadata`: a pure reducer owns the draft (contentType,
|
|
108
|
+
* cacheControl, customMetadata k/v rows with stable ids +
|
|
109
|
+
* empty/duplicate-key validation); the hook adds named dispatch
|
|
110
|
+
* helpers and the save half.
|
|
111
|
+
*/
|
|
112
|
+
export declare function useMetadataEditor(storage: FirebaseStorage | null | undefined, path: string | null | undefined, options?: UseMetadataEditorOptions): UseMetadataEditorResult;
|
|
113
|
+
export {};
|
|
114
|
+
//# sourceMappingURL=useMetadataEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMetadataEditor.d.ts","sourceRoot":"","sources":["../../../src/storage/hooks/useMetadataEditor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { useCallback, useMemo, useReducer, useRef, useState } from 'react';
|
|
2
|
+
import { ref as refFn, updateMetadata, } from 'pyric/storage';
|
|
3
|
+
import { normalizeStoragePath } from './usePathState.js';
|
|
4
|
+
/** Re-validate the k/v rows: empty keys and duplicate keys error. */
|
|
5
|
+
function validateCustom(custom) {
|
|
6
|
+
const counts = new Map();
|
|
7
|
+
for (const entry of custom) {
|
|
8
|
+
counts.set(entry.key, (counts.get(entry.key) ?? 0) + 1);
|
|
9
|
+
}
|
|
10
|
+
let errorCount = 0;
|
|
11
|
+
const next = custom.map((entry) => {
|
|
12
|
+
let error;
|
|
13
|
+
if (entry.key.trim() === '')
|
|
14
|
+
error = 'Key is required';
|
|
15
|
+
else if ((counts.get(entry.key) ?? 0) > 1)
|
|
16
|
+
error = 'Duplicate key';
|
|
17
|
+
if (error)
|
|
18
|
+
errorCount++;
|
|
19
|
+
if (error === entry.error)
|
|
20
|
+
return entry;
|
|
21
|
+
return { ...entry, error };
|
|
22
|
+
});
|
|
23
|
+
return { custom: next, errorCount };
|
|
24
|
+
}
|
|
25
|
+
function applyDraft(state, mutate) {
|
|
26
|
+
const mutated = mutate(state.draft);
|
|
27
|
+
const { custom, errorCount } = validateCustom(mutated.custom);
|
|
28
|
+
return { ...state, draft: { ...mutated, custom }, errorCount };
|
|
29
|
+
}
|
|
30
|
+
/** Pure reducer — exported (with {@link initMetadataEditorState}) so
|
|
31
|
+
* the edit state is testable without React, mirroring the document
|
|
32
|
+
* editor's reducer/hook split. */
|
|
33
|
+
export function metadataEditorReducer(state, action) {
|
|
34
|
+
switch (action.type) {
|
|
35
|
+
case 'setContentType':
|
|
36
|
+
return applyDraft(state, (d) => ({ ...d, contentType: action.value }));
|
|
37
|
+
case 'setCacheControl':
|
|
38
|
+
return applyDraft(state, (d) => ({ ...d, cacheControl: action.value }));
|
|
39
|
+
case 'setCustomKey':
|
|
40
|
+
return applyDraft(state, (d) => ({
|
|
41
|
+
...d,
|
|
42
|
+
custom: d.custom.map((e) => (e.id === action.id ? { ...e, key: action.key } : e)),
|
|
43
|
+
}));
|
|
44
|
+
case 'setCustomValue':
|
|
45
|
+
return applyDraft(state, (d) => ({
|
|
46
|
+
...d,
|
|
47
|
+
custom: d.custom.map((e) => e.id === action.id ? { ...e, value: action.value } : e),
|
|
48
|
+
}));
|
|
49
|
+
case 'addCustomEntry':
|
|
50
|
+
return applyDraft(state, (d) => ({
|
|
51
|
+
...d,
|
|
52
|
+
custom: [
|
|
53
|
+
...d.custom,
|
|
54
|
+
{ id: crypto.randomUUID(), key: action.key ?? '', value: action.value ?? '' },
|
|
55
|
+
],
|
|
56
|
+
}));
|
|
57
|
+
case 'removeCustomEntry':
|
|
58
|
+
return applyDraft(state, (d) => ({
|
|
59
|
+
...d,
|
|
60
|
+
custom: d.custom.filter((e) => e.id !== action.id),
|
|
61
|
+
}));
|
|
62
|
+
case 'reset':
|
|
63
|
+
return {
|
|
64
|
+
draft: state.initial,
|
|
65
|
+
initial: state.initial,
|
|
66
|
+
errorCount: validateCustom(state.initial.custom).errorCount,
|
|
67
|
+
};
|
|
68
|
+
case 'commit':
|
|
69
|
+
return { ...state, initial: state.draft };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Build the edit state from the metadata a `getMetadata` /
|
|
73
|
+
* `useStorageObject` read returned. */
|
|
74
|
+
export function initMetadataEditorState(initial) {
|
|
75
|
+
const draft = {
|
|
76
|
+
contentType: initial?.contentType ?? '',
|
|
77
|
+
cacheControl: initial?.cacheControl ?? '',
|
|
78
|
+
custom: Object.entries(initial?.customMetadata ?? {}).map(([key, value]) => ({
|
|
79
|
+
id: crypto.randomUUID(),
|
|
80
|
+
key,
|
|
81
|
+
value,
|
|
82
|
+
})),
|
|
83
|
+
};
|
|
84
|
+
const { custom, errorCount } = validateCustom(draft.custom);
|
|
85
|
+
// One shared object: `isDirty` is `draft !== initial` by reference.
|
|
86
|
+
const validated = { ...draft, custom };
|
|
87
|
+
return { draft: validated, initial: validated, errorCount };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Headless metadata editor — the `useDocumentEditor` reducer pattern
|
|
91
|
+
* over `updateMetadata`: a pure reducer owns the draft (contentType,
|
|
92
|
+
* cacheControl, customMetadata k/v rows with stable ids +
|
|
93
|
+
* empty/duplicate-key validation); the hook adds named dispatch
|
|
94
|
+
* helpers and the save half.
|
|
95
|
+
*/
|
|
96
|
+
export function useMetadataEditor(storage, path, options = {}) {
|
|
97
|
+
// Computed once — the reducer owns the live draft from here on
|
|
98
|
+
// (same `useRef` seed as `useDocumentEditor`).
|
|
99
|
+
const initialRef = useRef(null);
|
|
100
|
+
if (initialRef.current == null) {
|
|
101
|
+
initialRef.current = initMetadataEditorState(options.initial);
|
|
102
|
+
}
|
|
103
|
+
const [state, dispatch] = useReducer(metadataEditorReducer, initialRef.current);
|
|
104
|
+
const [isSaving, setIsSaving] = useState(false);
|
|
105
|
+
const [saveError, setSaveError] = useState(undefined);
|
|
106
|
+
// Stale-run protection for overlapping saves (generation token,
|
|
107
|
+
// house style).
|
|
108
|
+
const generationRef = useRef(0);
|
|
109
|
+
const setContentType = useCallback((value) => dispatch({ type: 'setContentType', value }), []);
|
|
110
|
+
const setCacheControl = useCallback((value) => dispatch({ type: 'setCacheControl', value }), []);
|
|
111
|
+
const setCustomKey = useCallback((id, key) => dispatch({ type: 'setCustomKey', id, key }), []);
|
|
112
|
+
const setCustomValue = useCallback((id, value) => dispatch({ type: 'setCustomValue', id, value }), []);
|
|
113
|
+
const addCustomEntry = useCallback((key, value) => dispatch({ type: 'addCustomEntry', key, value }), []);
|
|
114
|
+
const removeCustomEntry = useCallback((id) => dispatch({ type: 'removeCustomEntry', id }), []);
|
|
115
|
+
const reset = useCallback(() => dispatch({ type: 'reset' }), []);
|
|
116
|
+
const { draft, initial, errorCount } = state;
|
|
117
|
+
const toPatch = useCallback(() => {
|
|
118
|
+
return {
|
|
119
|
+
contentType: draft.contentType.trim() === '' ? undefined : draft.contentType,
|
|
120
|
+
cacheControl: draft.cacheControl.trim() === '' ? undefined : draft.cacheControl,
|
|
121
|
+
customMetadata: Object.fromEntries(draft.custom.filter((e) => e.key.trim() !== '').map((e) => [e.key, e.value])),
|
|
122
|
+
};
|
|
123
|
+
}, [draft]);
|
|
124
|
+
const save = useCallback(async () => {
|
|
125
|
+
const myGen = ++generationRef.current;
|
|
126
|
+
if (storage == null || path == null) {
|
|
127
|
+
setSaveError(new Error('useMetadataEditor: storage or path is null'));
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
if (errorCount > 0) {
|
|
131
|
+
setSaveError(new Error('useMetadataEditor: draft has validation errors'));
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
setSaveError(undefined);
|
|
135
|
+
setIsSaving(true);
|
|
136
|
+
try {
|
|
137
|
+
const next = await updateMetadata(refFn(storage, normalizeStoragePath(path)), toPatch());
|
|
138
|
+
if (myGen === generationRef.current) {
|
|
139
|
+
dispatch({ type: 'commit' });
|
|
140
|
+
}
|
|
141
|
+
return next;
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
if (myGen === generationRef.current) {
|
|
145
|
+
setSaveError(e instanceof Error ? e : new Error(String(e)));
|
|
146
|
+
}
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
if (myGen === generationRef.current)
|
|
151
|
+
setIsSaving(false);
|
|
152
|
+
}
|
|
153
|
+
}, [storage, path, errorCount, toPatch]);
|
|
154
|
+
const isDirty = draft !== initial;
|
|
155
|
+
const isValid = errorCount === 0;
|
|
156
|
+
return useMemo(() => ({
|
|
157
|
+
contentType: draft.contentType,
|
|
158
|
+
cacheControl: draft.cacheControl,
|
|
159
|
+
custom: draft.custom,
|
|
160
|
+
isValid,
|
|
161
|
+
isDirty,
|
|
162
|
+
errorCount,
|
|
163
|
+
dispatch,
|
|
164
|
+
setContentType,
|
|
165
|
+
setCacheControl,
|
|
166
|
+
setCustomKey,
|
|
167
|
+
setCustomValue,
|
|
168
|
+
addCustomEntry,
|
|
169
|
+
removeCustomEntry,
|
|
170
|
+
reset,
|
|
171
|
+
toPatch,
|
|
172
|
+
save,
|
|
173
|
+
isSaving,
|
|
174
|
+
saveError,
|
|
175
|
+
}), [
|
|
176
|
+
draft,
|
|
177
|
+
isValid,
|
|
178
|
+
isDirty,
|
|
179
|
+
errorCount,
|
|
180
|
+
setContentType,
|
|
181
|
+
setCacheControl,
|
|
182
|
+
setCustomKey,
|
|
183
|
+
setCustomValue,
|
|
184
|
+
addCustomEntry,
|
|
185
|
+
removeCustomEntry,
|
|
186
|
+
reset,
|
|
187
|
+
toPatch,
|
|
188
|
+
save,
|
|
189
|
+
isSaving,
|
|
190
|
+
saveError,
|
|
191
|
+
]);
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=useMetadataEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMetadataEditor.js","sourceRoot":"","sources":["../../../src/storage/hooks/useMetadataEditor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { FirebaseStorage, FullMetadata, SettableMetadata } from 'pyric/storage';
|
|
2
|
+
import type { UseStorageListResult } from './useStorageList.js';
|
|
3
|
+
export type UploadTaskStatus = 'running' | 'success' | 'error';
|
|
4
|
+
/**
|
|
5
|
+
* One file's upload, TASK-SHAPED for resumable forward-compat: the
|
|
6
|
+
* byte counters and the `onProgress` callback are in the type NOW so
|
|
7
|
+
* a future `uploadBytesResumable`-backed implementation emits real
|
|
8
|
+
* intermediate snapshots without a breaking change. Today
|
|
9
|
+
* (`pyric/storage` has no resumable uploads — COMPAT) a task
|
|
10
|
+
* completes in one tick: `onProgress` fires once at 0 bytes and once
|
|
11
|
+
* at `totalBytes`.
|
|
12
|
+
*/
|
|
13
|
+
export interface UploadTask {
|
|
14
|
+
/** Stable id — key task rows on this, not on `fullPath` (two
|
|
15
|
+
* uploads can target the same path). */
|
|
16
|
+
id: string;
|
|
17
|
+
/** Bucket-rooted destination path. */
|
|
18
|
+
fullPath: string;
|
|
19
|
+
status: UploadTaskStatus;
|
|
20
|
+
bytesTransferred: number;
|
|
21
|
+
totalBytes: number;
|
|
22
|
+
/** Populated on `'success'`. */
|
|
23
|
+
metadata?: FullMetadata;
|
|
24
|
+
/** Populated on `'error'` — a typed `StorageError` from the
|
|
25
|
+
* sandbox (`.code` is `storage/<code>`, e.g.
|
|
26
|
+
* `storage/unauthorized` for a rules-denied write). */
|
|
27
|
+
error?: Error;
|
|
28
|
+
}
|
|
29
|
+
/** Explicit-path upload input. `path` is relative to the hook's
|
|
30
|
+
* `path` option (the destination folder). */
|
|
31
|
+
export interface UploadEntry {
|
|
32
|
+
path: string;
|
|
33
|
+
data: Blob | Uint8Array | ArrayBuffer;
|
|
34
|
+
metadata?: SettableMetadata;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* `upload()` accepts plain `File`s (destination = the file's
|
|
38
|
+
* `webkitRelativePath` when present — folder drops keep their
|
|
39
|
+
* structure — else its `name`) or explicit {@link UploadEntry}s.
|
|
40
|
+
*/
|
|
41
|
+
export type UploadInput = File | UploadEntry;
|
|
42
|
+
export interface UseObjectUploadOptions {
|
|
43
|
+
/** Destination folder, bucket-rooted. Default `''` (root). Wire to
|
|
44
|
+
* `usePathState().path` so uploads land in the browsed folder. */
|
|
45
|
+
path?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Optimistic seam from `useStorageList`: each upload inserts its
|
|
48
|
+
* path immediately and rolls back via `removeItem` on failure.
|
|
49
|
+
* Caveat: rolling back an upload that was OVERWRITING an existing
|
|
50
|
+
* object drops that object's row locally (the seam can't tell an
|
|
51
|
+
* optimistic row from a listed one) — `refresh()` restores server
|
|
52
|
+
* truth.
|
|
53
|
+
*/
|
|
54
|
+
list?: Pick<UseStorageListResult, 'insertItem' | 'removeItem'>;
|
|
55
|
+
/** Task-shaped progress callback (see {@link UploadTask}). */
|
|
56
|
+
onProgress?: (task: UploadTask) => void;
|
|
57
|
+
/** Fired once per task reaching `'success'`. */
|
|
58
|
+
onComplete?: (task: UploadTask) => void;
|
|
59
|
+
/** Fired once per task reaching `'error'`. */
|
|
60
|
+
onError?: (task: UploadTask) => void;
|
|
61
|
+
}
|
|
62
|
+
export interface UseObjectUploadResult {
|
|
63
|
+
/** Every task started by this hook instance, oldest first. */
|
|
64
|
+
tasks: UploadTask[];
|
|
65
|
+
/** `true` while any task is `'running'`. */
|
|
66
|
+
isUploading: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Upload one or many files. Tasks run concurrently; the promise
|
|
69
|
+
* resolves with the settled tasks once ALL finish and never
|
|
70
|
+
* rejects — per-file failures land on `task.error` (and
|
|
71
|
+
* `onError`), so one bad file doesn't mask the others.
|
|
72
|
+
*/
|
|
73
|
+
upload: (input: UploadInput | UploadInput[]) => Promise<UploadTask[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Create an empty folder under the hook's `path`: writes the GCS
|
|
76
|
+
* placeholder convention — a zero-byte object named `<path>/`
|
|
77
|
+
* (trailing slash). `listAll` hides the placeholder from `items`
|
|
78
|
+
* at every level (it only surfaces as a prefix), so the folder
|
|
79
|
+
* appears in the browser with no phantom file inside.
|
|
80
|
+
*
|
|
81
|
+
* `ref()` normalizes the trailing slash away, so the placeholder is
|
|
82
|
+
* written through a structural value-object reference the sandbox
|
|
83
|
+
* accepts. Throws the underlying error after rolling back the
|
|
84
|
+
* optimistic prefix insert.
|
|
85
|
+
*
|
|
86
|
+
* ALTERNATIVE: when the store must stay free of placeholder
|
|
87
|
+
* objects (Pyric Studio's choice), use the client-side
|
|
88
|
+
* pending-prefix mechanism instead — see `pendingPrefixes.ts`
|
|
89
|
+
* for the reducer and the recorded tradeoff.
|
|
90
|
+
*/
|
|
91
|
+
createFolder: (name: string) => Promise<void>;
|
|
92
|
+
/** Drop settled (`success`/`error`) tasks from `tasks`. */
|
|
93
|
+
clearCompleted: () => void;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Multi-file upload over the package's single Storage handle prop.
|
|
97
|
+
* Headless: returns task state; render it however you like (the
|
|
98
|
+
* `<UploadDropzone>` component is one producer of `upload()` calls).
|
|
99
|
+
*
|
|
100
|
+
* Optimistic-with-rollback: with the `list` seam wired, each upload's
|
|
101
|
+
* row appears in `useStorageList` immediately and disappears again if
|
|
102
|
+
* the write fails (typed `StorageError` on `task.error`).
|
|
103
|
+
*/
|
|
104
|
+
export declare function useObjectUpload(storage: FirebaseStorage | null | undefined, options?: UseObjectUploadOptions): UseObjectUploadResult;
|
|
105
|
+
//# sourceMappingURL=useObjectUpload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useObjectUpload.d.ts","sourceRoot":"","sources":["../../../src/storage/hooks/useObjectUpload.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/D;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB;6CACyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB;;4DAEwD;IACxD,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED;8CAC8C;AAC9C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,WAAW,CAAC;IACtC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,WAAW,CAAC;AAE7C,MAAM,WAAW,sBAAsB;IACrC;uEACmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,YAAY,GAAG,YAAY,CAAC,CAAC;IAC/D,8DAA8D;IAC9D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,gDAAgD;IAChD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,8CAA8C;IAC9C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,qBAAqB;IACpC,8DAA8D;IAC9D,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,4CAA4C;IAC5C,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,EAAE,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACtE;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,2DAA2D;IAC3D,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAwBD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC3C,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAsHvB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { useCallback, useRef, useState } from 'react';
|
|
2
|
+
import { folderPlaceholderRef } from '../folderPlaceholder.js';
|
|
3
|
+
import { useStorageApi } from '../storageApi.js';
|
|
4
|
+
import { normalizeStoragePath } from './usePathState.js';
|
|
5
|
+
function joinPath(base, child) {
|
|
6
|
+
if (base === '')
|
|
7
|
+
return child;
|
|
8
|
+
if (child === '')
|
|
9
|
+
return base;
|
|
10
|
+
return `${base}/${child}`;
|
|
11
|
+
}
|
|
12
|
+
function sizeOf(data) {
|
|
13
|
+
if (data instanceof Blob)
|
|
14
|
+
return data.size;
|
|
15
|
+
return data.byteLength;
|
|
16
|
+
}
|
|
17
|
+
function toEntry(input) {
|
|
18
|
+
if (input instanceof Blob) {
|
|
19
|
+
// File (the only Blob subtype `UploadInput` admits). Folder
|
|
20
|
+
// drops carry `webkitRelativePath`; plain picks carry `name`.
|
|
21
|
+
const file = input;
|
|
22
|
+
const rel = file.webkitRelativePath;
|
|
23
|
+
return { path: rel || file.name, data: file };
|
|
24
|
+
}
|
|
25
|
+
return input;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Multi-file upload over the package's single Storage handle prop.
|
|
29
|
+
* Headless: returns task state; render it however you like (the
|
|
30
|
+
* `<UploadDropzone>` component is one producer of `upload()` calls).
|
|
31
|
+
*
|
|
32
|
+
* Optimistic-with-rollback: with the `list` seam wired, each upload's
|
|
33
|
+
* row appears in `useStorageList` immediately and disappears again if
|
|
34
|
+
* the write fails (typed `StorageError` on `task.error`).
|
|
35
|
+
*/
|
|
36
|
+
export function useObjectUpload(storage, options = {}) {
|
|
37
|
+
// Injected backend (in-process `pyric/storage` by default, the
|
|
38
|
+
// SharedWorker client bundle in Studio served mode) — uploads follow
|
|
39
|
+
// the same seam the browse hooks read through. The worker leg caps a
|
|
40
|
+
// payload at 8 MiB (base64 `storage.putBytes`); in-process writes are
|
|
41
|
+
// uncapped. An over-cap file fails as a normal per-file task error.
|
|
42
|
+
const { ref: refFn, uploadBytes } = useStorageApi();
|
|
43
|
+
const base = normalizeStoragePath(options.path ?? '');
|
|
44
|
+
const [tasks, setTasks] = useState([]);
|
|
45
|
+
// Latest-value refs so `upload`/`createFolder` stay referentially
|
|
46
|
+
// stable across option changes (same pattern as the house hooks'
|
|
47
|
+
// generation tokens — the callbacks read current options at call
|
|
48
|
+
// time).
|
|
49
|
+
const optionsRef = useRef(options);
|
|
50
|
+
optionsRef.current = options;
|
|
51
|
+
const patchTask = useCallback((next) => {
|
|
52
|
+
setTasks((prev) => prev.map((t) => (t.id === next.id ? next : t)));
|
|
53
|
+
}, []);
|
|
54
|
+
const upload = useCallback(async (input) => {
|
|
55
|
+
if (storage == null) {
|
|
56
|
+
throw new Error('useObjectUpload: storage handle is null');
|
|
57
|
+
}
|
|
58
|
+
const inputs = Array.isArray(input) ? input : [input];
|
|
59
|
+
const started = inputs.map((raw) => {
|
|
60
|
+
const entry = toEntry(raw);
|
|
61
|
+
const task = {
|
|
62
|
+
id: crypto.randomUUID(),
|
|
63
|
+
fullPath: joinPath(base, normalizeStoragePath(entry.path)),
|
|
64
|
+
status: 'running',
|
|
65
|
+
bytesTransferred: 0,
|
|
66
|
+
totalBytes: sizeOf(entry.data),
|
|
67
|
+
};
|
|
68
|
+
return { task, entry };
|
|
69
|
+
});
|
|
70
|
+
setTasks((prev) => [...prev, ...started.map((s) => s.task)]);
|
|
71
|
+
for (const { task } of started) {
|
|
72
|
+
optionsRef.current.list?.insertItem(task.fullPath);
|
|
73
|
+
optionsRef.current.onProgress?.(task);
|
|
74
|
+
}
|
|
75
|
+
return Promise.all(started.map(async ({ task, entry }) => {
|
|
76
|
+
try {
|
|
77
|
+
const result = await uploadBytes(refFn(storage, task.fullPath), entry.data, entry.metadata);
|
|
78
|
+
const done = {
|
|
79
|
+
...task,
|
|
80
|
+
status: 'success',
|
|
81
|
+
bytesTransferred: task.totalBytes,
|
|
82
|
+
metadata: result.metadata,
|
|
83
|
+
};
|
|
84
|
+
patchTask(done);
|
|
85
|
+
optionsRef.current.onProgress?.(done);
|
|
86
|
+
optionsRef.current.onComplete?.(done);
|
|
87
|
+
return done;
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
const failed = {
|
|
91
|
+
...task,
|
|
92
|
+
status: 'error',
|
|
93
|
+
error: e instanceof Error ? e : new Error(String(e)),
|
|
94
|
+
};
|
|
95
|
+
// Roll the optimistic row back before surfacing.
|
|
96
|
+
optionsRef.current.list?.removeItem(task.fullPath);
|
|
97
|
+
patchTask(failed);
|
|
98
|
+
optionsRef.current.onError?.(failed);
|
|
99
|
+
return failed;
|
|
100
|
+
}
|
|
101
|
+
}));
|
|
102
|
+
}, [storage, base, patchTask, refFn, uploadBytes]);
|
|
103
|
+
const createFolder = useCallback(async (name) => {
|
|
104
|
+
if (storage == null) {
|
|
105
|
+
throw new Error('useObjectUpload: storage handle is null');
|
|
106
|
+
}
|
|
107
|
+
const folderPath = joinPath(base, normalizeStoragePath(name));
|
|
108
|
+
if (folderPath === '') {
|
|
109
|
+
throw new Error('createFolder: folder name is empty');
|
|
110
|
+
}
|
|
111
|
+
// Trailing slash → the seam inserts a prefix, not an item.
|
|
112
|
+
optionsRef.current.list?.insertItem(`${folderPath}/`);
|
|
113
|
+
try {
|
|
114
|
+
await uploadBytes(folderPlaceholderRef(storage, folderPath), new Blob([]),
|
|
115
|
+
// Matches the emulator UI's placeholder content type.
|
|
116
|
+
{ contentType: 'text/plain' });
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
optionsRef.current.list?.removeItem(folderPath);
|
|
120
|
+
throw e;
|
|
121
|
+
}
|
|
122
|
+
}, [storage, base, uploadBytes]);
|
|
123
|
+
const clearCompleted = useCallback(() => {
|
|
124
|
+
setTasks((prev) => prev.filter((t) => t.status === 'running'));
|
|
125
|
+
}, []);
|
|
126
|
+
return {
|
|
127
|
+
tasks,
|
|
128
|
+
isUploading: tasks.some((t) => t.status === 'running'),
|
|
129
|
+
upload,
|
|
130
|
+
createFolder,
|
|
131
|
+
clearCompleted,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=useObjectUpload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useObjectUpload.js","sourceRoot":"","sources":["../../../src/storage/hooks/useObjectUpload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Strip leading/trailing slashes and collapse repeats — mirrors
|
|
2
|
+
* `pyric/storage`'s reference normalization so `usePathState` and
|
|
3
|
+
* `useStorageList` always agree on what a path is. */
|
|
4
|
+
export declare function normalizeStoragePath(path: string): string;
|
|
5
|
+
export interface UsePathStateOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Controlled value. When provided, the hook derives everything
|
|
8
|
+
* from it and navigation calls only fire `onPathChange` — the
|
|
9
|
+
* owner owns the state (e.g. a router binding `?path=`).
|
|
10
|
+
*/
|
|
11
|
+
path?: string;
|
|
12
|
+
/** Fired with the normalized next path on every navigation. Called
|
|
13
|
+
* in both modes. */
|
|
14
|
+
onPathChange?: (path: string) => void;
|
|
15
|
+
/** Uncontrolled initial value. Default `''` (bucket root). */
|
|
16
|
+
defaultPath?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface UsePathStateResult {
|
|
19
|
+
/** Current normalized path. `''` is the bucket root. */
|
|
20
|
+
path: string;
|
|
21
|
+
/** Path split into segments. `[]` at root. */
|
|
22
|
+
segments: string[];
|
|
23
|
+
/** Jump to an absolute path (normalized). */
|
|
24
|
+
setPath: (path: string) => void;
|
|
25
|
+
/** Descend into a child folder — accepts a bare name (`'sub'`) or
|
|
26
|
+
* an absolute path (`'docs/sub'`, e.g. a prefix's `fullPath`). */
|
|
27
|
+
enter: (nameOrPath: string) => void;
|
|
28
|
+
/** Ascend one level. No-op at root. */
|
|
29
|
+
up: () => void;
|
|
30
|
+
/**
|
|
31
|
+
* Jump to the ancestor ending at `segments[index]` — the breadcrumb
|
|
32
|
+
* click. `navigateToIndex(-1)` (or any negative) is the root.
|
|
33
|
+
*/
|
|
34
|
+
navigateToIndex: (index: number) => void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Path navigation state for the storage browser. Controlled when
|
|
38
|
+
* `path` is provided (the owner re-renders with the next value),
|
|
39
|
+
* uncontrolled otherwise — standard React value/defaultValue
|
|
40
|
+
* semantics. All emitted paths are normalized (`normalizeStoragePath`).
|
|
41
|
+
*/
|
|
42
|
+
export declare function usePathState(options?: UsePathStateOptions): UsePathStateResult;
|
|
43
|
+
//# sourceMappingURL=usePathState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePathState.d.ts","sourceRoot":"","sources":["../../../src/storage/hooks/usePathState.ts"],"names":[],"mappings":"AAEA;;uDAEuD;AACvD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;yBACqB;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6CAA6C;IAC7C,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC;uEACmE;IACnE,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,uCAAuC;IACvC,EAAE,EAAE,MAAM,IAAI,CAAC;IACf;;;OAGG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CA2CpB"}
|