convex-cms 0.0.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/dist/cli/commands/admin.d.ts +16 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +88 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +18 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/detectConvexUrl.d.ts +13 -0
- package/dist/cli/utils/detectConvexUrl.d.ts.map +1 -0
- package/dist/cli/utils/detectConvexUrl.js +48 -0
- package/dist/cli/utils/detectConvexUrl.js.map +1 -0
- package/dist/cli/utils/openBrowser.d.ts +7 -0
- package/dist/cli/utils/openBrowser.d.ts.map +1 -0
- package/dist/cli/utils/openBrowser.js +17 -0
- package/dist/cli/utils/openBrowser.js.map +1 -0
- package/dist/client/admin-config.d.ts +126 -0
- package/dist/client/admin-config.d.ts.map +1 -0
- package/dist/client/admin-config.js +117 -0
- package/dist/client/admin-config.js.map +1 -0
- package/dist/client/adminApi.d.ts +2273 -0
- package/dist/client/adminApi.d.ts.map +1 -0
- package/dist/client/adminApi.js +716 -0
- package/dist/client/adminApi.js.map +1 -0
- package/dist/client/agentTools.d.ts +933 -0
- package/dist/client/agentTools.d.ts.map +1 -0
- package/dist/client/agentTools.js +1004 -0
- package/dist/client/agentTools.js.map +1 -0
- package/dist/client/argTypes.d.ts +212 -0
- package/dist/client/argTypes.d.ts.map +1 -0
- package/dist/client/argTypes.js +5 -0
- package/dist/client/argTypes.js.map +1 -0
- package/dist/client/field-types.d.ts +55 -0
- package/dist/client/field-types.d.ts.map +1 -0
- package/dist/client/field-types.js +152 -0
- package/dist/client/field-types.js.map +1 -0
- package/dist/client/index.d.ts +189 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +668 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/queryBuilder.d.ts +765 -0
- package/dist/client/queryBuilder.d.ts.map +1 -0
- package/dist/client/queryBuilder.js +970 -0
- package/dist/client/queryBuilder.js.map +1 -0
- package/dist/client/schema/codegen.d.ts +128 -0
- package/dist/client/schema/codegen.d.ts.map +1 -0
- package/dist/client/schema/codegen.js +318 -0
- package/dist/client/schema/codegen.js.map +1 -0
- package/dist/client/schema/defineContentType.d.ts +221 -0
- package/dist/client/schema/defineContentType.d.ts.map +1 -0
- package/dist/client/schema/defineContentType.js +380 -0
- package/dist/client/schema/defineContentType.js.map +1 -0
- package/dist/client/schema/index.d.ts +85 -0
- package/dist/client/schema/index.d.ts.map +1 -0
- package/dist/client/schema/index.js +92 -0
- package/dist/client/schema/index.js.map +1 -0
- package/dist/client/schema/schemaDrift.d.ts +199 -0
- package/dist/client/schema/schemaDrift.d.ts.map +1 -0
- package/dist/client/schema/schemaDrift.js +340 -0
- package/dist/client/schema/schemaDrift.js.map +1 -0
- package/dist/client/schema/typedClient.d.ts +401 -0
- package/dist/client/schema/typedClient.d.ts.map +1 -0
- package/dist/client/schema/typedClient.js +269 -0
- package/dist/client/schema/typedClient.js.map +1 -0
- package/dist/client/schema/types.d.ts +477 -0
- package/dist/client/schema/types.d.ts.map +1 -0
- package/dist/client/schema/types.js +39 -0
- package/dist/client/schema/types.js.map +1 -0
- package/dist/client/types.d.ts +449 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +149 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/workflows.d.ts +51 -0
- package/dist/client/workflows.d.ts.map +1 -0
- package/dist/client/workflows.js +103 -0
- package/dist/client/workflows.js.map +1 -0
- package/dist/client/wrapper.d.ts +2198 -0
- package/dist/client/wrapper.d.ts.map +1 -0
- package/dist/client/wrapper.js +2651 -0
- package/dist/client/wrapper.js.map +1 -0
- package/dist/component/_generated/api.d.ts +124 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +4321 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +121 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +78 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/auditLog.d.ts +410 -0
- package/dist/component/auditLog.d.ts.map +1 -0
- package/dist/component/auditLog.js +607 -0
- package/dist/component/auditLog.js.map +1 -0
- package/dist/component/authorization.d.ts +323 -0
- package/dist/component/authorization.d.ts.map +1 -0
- package/dist/component/authorization.js +464 -0
- package/dist/component/authorization.js.map +1 -0
- package/dist/component/authorizationHooks.d.ts +184 -0
- package/dist/component/authorizationHooks.d.ts.map +1 -0
- package/dist/component/authorizationHooks.js +521 -0
- package/dist/component/authorizationHooks.js.map +1 -0
- package/dist/component/bulkOperations.d.ts +200 -0
- package/dist/component/bulkOperations.d.ts.map +1 -0
- package/dist/component/bulkOperations.js +568 -0
- package/dist/component/bulkOperations.js.map +1 -0
- package/dist/component/contentEntries.d.ts +719 -0
- package/dist/component/contentEntries.d.ts.map +1 -0
- package/dist/component/contentEntries.js +1617 -0
- package/dist/component/contentEntries.js.map +1 -0
- package/dist/component/contentEntryMutations.d.ts +505 -0
- package/dist/component/contentEntryMutations.d.ts.map +1 -0
- package/dist/component/contentEntryMutations.js +1009 -0
- package/dist/component/contentEntryMutations.js.map +1 -0
- package/dist/component/contentEntryValidation.d.ts +115 -0
- package/dist/component/contentEntryValidation.d.ts.map +1 -0
- package/dist/component/contentEntryValidation.js +546 -0
- package/dist/component/contentEntryValidation.js.map +1 -0
- package/dist/component/contentLock.d.ts +328 -0
- package/dist/component/contentLock.d.ts.map +1 -0
- package/dist/component/contentLock.js +471 -0
- package/dist/component/contentLock.js.map +1 -0
- package/dist/component/contentTypeMigration.d.ts +411 -0
- package/dist/component/contentTypeMigration.d.ts.map +1 -0
- package/dist/component/contentTypeMigration.js +805 -0
- package/dist/component/contentTypeMigration.js.map +1 -0
- package/dist/component/contentTypeMutations.d.ts +975 -0
- package/dist/component/contentTypeMutations.d.ts.map +1 -0
- package/dist/component/contentTypeMutations.js +768 -0
- package/dist/component/contentTypeMutations.js.map +1 -0
- package/dist/component/contentTypes.d.ts +538 -0
- package/dist/component/contentTypes.d.ts.map +1 -0
- package/dist/component/contentTypes.js +304 -0
- package/dist/component/contentTypes.js.map +1 -0
- package/dist/component/convex.config.d.ts +42 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +43 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/documentTypes.d.ts +186 -0
- package/dist/component/documentTypes.d.ts.map +1 -0
- package/dist/component/documentTypes.js +23 -0
- package/dist/component/documentTypes.js.map +1 -0
- package/dist/component/eventEmitter.d.ts +281 -0
- package/dist/component/eventEmitter.d.ts.map +1 -0
- package/dist/component/eventEmitter.js +300 -0
- package/dist/component/eventEmitter.js.map +1 -0
- package/dist/component/exportImport.d.ts +1120 -0
- package/dist/component/exportImport.d.ts.map +1 -0
- package/dist/component/exportImport.js +931 -0
- package/dist/component/exportImport.js.map +1 -0
- package/dist/component/index.d.ts +28 -0
- package/dist/component/index.d.ts.map +1 -0
- package/dist/component/index.js +142 -0
- package/dist/component/index.js.map +1 -0
- package/dist/component/lib/deepReferenceResolver.d.ts +252 -0
- package/dist/component/lib/deepReferenceResolver.d.ts.map +1 -0
- package/dist/component/lib/deepReferenceResolver.js +601 -0
- package/dist/component/lib/deepReferenceResolver.js.map +1 -0
- package/dist/component/lib/errors.d.ts +306 -0
- package/dist/component/lib/errors.d.ts.map +1 -0
- package/dist/component/lib/errors.js +407 -0
- package/dist/component/lib/errors.js.map +1 -0
- package/dist/component/lib/index.d.ts +10 -0
- package/dist/component/lib/index.d.ts.map +1 -0
- package/dist/component/lib/index.js +33 -0
- package/dist/component/lib/index.js.map +1 -0
- package/dist/component/lib/mediaReferenceResolver.d.ts +217 -0
- package/dist/component/lib/mediaReferenceResolver.d.ts.map +1 -0
- package/dist/component/lib/mediaReferenceResolver.js +326 -0
- package/dist/component/lib/mediaReferenceResolver.js.map +1 -0
- package/dist/component/lib/metadataExtractor.d.ts +245 -0
- package/dist/component/lib/metadataExtractor.d.ts.map +1 -0
- package/dist/component/lib/metadataExtractor.js +548 -0
- package/dist/component/lib/metadataExtractor.js.map +1 -0
- package/dist/component/lib/mutationAuth.d.ts +95 -0
- package/dist/component/lib/mutationAuth.d.ts.map +1 -0
- package/dist/component/lib/mutationAuth.js +146 -0
- package/dist/component/lib/mutationAuth.js.map +1 -0
- package/dist/component/lib/queries.d.ts +17 -0
- package/dist/component/lib/queries.d.ts.map +1 -0
- package/dist/component/lib/queries.js +49 -0
- package/dist/component/lib/queries.js.map +1 -0
- package/dist/component/lib/ragContentChunker.d.ts +423 -0
- package/dist/component/lib/ragContentChunker.d.ts.map +1 -0
- package/dist/component/lib/ragContentChunker.js +897 -0
- package/dist/component/lib/ragContentChunker.js.map +1 -0
- package/dist/component/lib/referenceResolver.d.ts +175 -0
- package/dist/component/lib/referenceResolver.d.ts.map +1 -0
- package/dist/component/lib/referenceResolver.js +293 -0
- package/dist/component/lib/referenceResolver.js.map +1 -0
- package/dist/component/lib/slugGenerator.d.ts +71 -0
- package/dist/component/lib/slugGenerator.d.ts.map +1 -0
- package/dist/component/lib/slugGenerator.js +207 -0
- package/dist/component/lib/slugGenerator.js.map +1 -0
- package/dist/component/lib/slugUniqueness.d.ts +131 -0
- package/dist/component/lib/slugUniqueness.d.ts.map +1 -0
- package/dist/component/lib/slugUniqueness.js +229 -0
- package/dist/component/lib/slugUniqueness.js.map +1 -0
- package/dist/component/lib/softDelete.d.ts +18 -0
- package/dist/component/lib/softDelete.d.ts.map +1 -0
- package/dist/component/lib/softDelete.js +29 -0
- package/dist/component/lib/softDelete.js.map +1 -0
- package/dist/component/localeFallbackChain.d.ts +410 -0
- package/dist/component/localeFallbackChain.d.ts.map +1 -0
- package/dist/component/localeFallbackChain.js +467 -0
- package/dist/component/localeFallbackChain.js.map +1 -0
- package/dist/component/localeFields.d.ts +508 -0
- package/dist/component/localeFields.d.ts.map +1 -0
- package/dist/component/localeFields.js +592 -0
- package/dist/component/localeFields.js.map +1 -0
- package/dist/component/mediaAssetMutations.d.ts +235 -0
- package/dist/component/mediaAssetMutations.d.ts.map +1 -0
- package/dist/component/mediaAssetMutations.js +558 -0
- package/dist/component/mediaAssetMutations.js.map +1 -0
- package/dist/component/mediaAssets.d.ts +168 -0
- package/dist/component/mediaAssets.d.ts.map +1 -0
- package/dist/component/mediaAssets.js +618 -0
- package/dist/component/mediaAssets.js.map +1 -0
- package/dist/component/mediaFolderMutations.d.ts +642 -0
- package/dist/component/mediaFolderMutations.d.ts.map +1 -0
- package/dist/component/mediaFolderMutations.js +849 -0
- package/dist/component/mediaFolderMutations.js.map +1 -0
- package/dist/component/mediaUploadMutations.d.ts +136 -0
- package/dist/component/mediaUploadMutations.d.ts.map +1 -0
- package/dist/component/mediaUploadMutations.js +205 -0
- package/dist/component/mediaUploadMutations.js.map +1 -0
- package/dist/component/mediaVariantMutations.d.ts +468 -0
- package/dist/component/mediaVariantMutations.d.ts.map +1 -0
- package/dist/component/mediaVariantMutations.js +737 -0
- package/dist/component/mediaVariantMutations.js.map +1 -0
- package/dist/component/mediaVariants.d.ts +525 -0
- package/dist/component/mediaVariants.d.ts.map +1 -0
- package/dist/component/mediaVariants.js +661 -0
- package/dist/component/mediaVariants.js.map +1 -0
- package/dist/component/ragContentIndexer.d.ts +595 -0
- package/dist/component/ragContentIndexer.d.ts.map +1 -0
- package/dist/component/ragContentIndexer.js +794 -0
- package/dist/component/ragContentIndexer.js.map +1 -0
- package/dist/component/rateLimitHooks.d.ts +266 -0
- package/dist/component/rateLimitHooks.d.ts.map +1 -0
- package/dist/component/rateLimitHooks.js +412 -0
- package/dist/component/rateLimitHooks.js.map +1 -0
- package/dist/component/roles.d.ts +649 -0
- package/dist/component/roles.d.ts.map +1 -0
- package/dist/component/roles.js +884 -0
- package/dist/component/roles.js.map +1 -0
- package/dist/component/scheduledPublish.d.ts +182 -0
- package/dist/component/scheduledPublish.d.ts.map +1 -0
- package/dist/component/scheduledPublish.js +304 -0
- package/dist/component/scheduledPublish.js.map +1 -0
- package/dist/component/schema.d.ts +4114 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +469 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/component/taxonomies.d.ts +476 -0
- package/dist/component/taxonomies.d.ts.map +1 -0
- package/dist/component/taxonomies.js +785 -0
- package/dist/component/taxonomies.js.map +1 -0
- package/dist/component/taxonomyMutations.d.ts +206 -0
- package/dist/component/taxonomyMutations.d.ts.map +1 -0
- package/dist/component/taxonomyMutations.js +1001 -0
- package/dist/component/taxonomyMutations.js.map +1 -0
- package/dist/component/trash.d.ts +265 -0
- package/dist/component/trash.d.ts.map +1 -0
- package/dist/component/trash.js +621 -0
- package/dist/component/trash.js.map +1 -0
- package/dist/component/types.d.ts +4 -0
- package/dist/component/types.d.ts.map +1 -0
- package/dist/component/types.js +2 -0
- package/dist/component/types.js.map +1 -0
- package/dist/component/userContext.d.ts +508 -0
- package/dist/component/userContext.d.ts.map +1 -0
- package/dist/component/userContext.js +615 -0
- package/dist/component/userContext.js.map +1 -0
- package/dist/component/validation.d.ts +387 -0
- package/dist/component/validation.d.ts.map +1 -0
- package/dist/component/validation.js +1052 -0
- package/dist/component/validation.js.map +1 -0
- package/dist/component/validators.d.ts +4645 -0
- package/dist/component/validators.d.ts.map +1 -0
- package/dist/component/validators.js +641 -0
- package/dist/component/validators.js.map +1 -0
- package/dist/component/versionMutations.d.ts +216 -0
- package/dist/component/versionMutations.d.ts.map +1 -0
- package/dist/component/versionMutations.js +321 -0
- package/dist/component/versionMutations.js.map +1 -0
- package/dist/component/webhookTrigger.d.ts +770 -0
- package/dist/component/webhookTrigger.d.ts.map +1 -0
- package/dist/component/webhookTrigger.js +1413 -0
- package/dist/component/webhookTrigger.js.map +1 -0
- package/dist/react/index.d.ts +316 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +558 -0
- package/dist/react/index.js.map +1 -0
- package/dist/test.d.ts +2230 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +1107 -0
- package/dist/test.js.map +1 -0
- package/package.json +95 -0
- package/src/cli/commands/admin.ts +104 -0
- package/src/cli/index.ts +21 -0
- package/src/cli/utils/detectConvexUrl.ts +54 -0
- package/src/cli/utils/openBrowser.ts +16 -0
- package/src/client/admin-config.ts +138 -0
- package/src/client/adminApi.ts +942 -0
- package/src/client/agentTools.ts +1311 -0
- package/src/client/argTypes.ts +316 -0
- package/src/client/field-types.ts +187 -0
- package/src/client/index.ts +1301 -0
- package/src/client/queryBuilder.ts +1100 -0
- package/src/client/schema/codegen.ts +500 -0
- package/src/client/schema/defineContentType.ts +501 -0
- package/src/client/schema/index.ts +169 -0
- package/src/client/schema/schemaDrift.ts +574 -0
- package/src/client/schema/typedClient.ts +688 -0
- package/src/client/schema/types.ts +666 -0
- package/src/client/types.ts +723 -0
- package/src/client/workflows.ts +141 -0
- package/src/client/wrapper.ts +4304 -0
- package/src/component/_generated/api.ts +140 -0
- package/src/component/_generated/component.ts +5029 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +156 -0
- package/src/component/authorization.ts +647 -0
- package/src/component/authorizationHooks.ts +668 -0
- package/src/component/bulkOperations.ts +687 -0
- package/src/component/contentEntries.ts +1976 -0
- package/src/component/contentEntryMutations.ts +1223 -0
- package/src/component/contentEntryValidation.ts +707 -0
- package/src/component/contentLock.ts +550 -0
- package/src/component/contentTypeMigration.ts +1064 -0
- package/src/component/contentTypeMutations.ts +969 -0
- package/src/component/contentTypes.ts +346 -0
- package/src/component/convex.config.ts +44 -0
- package/src/component/documentTypes.ts +240 -0
- package/src/component/eventEmitter.ts +485 -0
- package/src/component/exportImport.ts +1169 -0
- package/src/component/index.ts +491 -0
- package/src/component/lib/deepReferenceResolver.ts +999 -0
- package/src/component/lib/errors.ts +816 -0
- package/src/component/lib/index.ts +145 -0
- package/src/component/lib/mediaReferenceResolver.ts +495 -0
- package/src/component/lib/metadataExtractor.ts +792 -0
- package/src/component/lib/mutationAuth.ts +199 -0
- package/src/component/lib/queries.ts +79 -0
- package/src/component/lib/ragContentChunker.ts +1371 -0
- package/src/component/lib/referenceResolver.ts +430 -0
- package/src/component/lib/slugGenerator.ts +262 -0
- package/src/component/lib/slugUniqueness.ts +333 -0
- package/src/component/lib/softDelete.ts +44 -0
- package/src/component/localeFallbackChain.ts +673 -0
- package/src/component/localeFields.ts +896 -0
- package/src/component/mediaAssetMutations.ts +725 -0
- package/src/component/mediaAssets.ts +932 -0
- package/src/component/mediaFolderMutations.ts +1046 -0
- package/src/component/mediaUploadMutations.ts +224 -0
- package/src/component/mediaVariantMutations.ts +900 -0
- package/src/component/mediaVariants.ts +793 -0
- package/src/component/ragContentIndexer.ts +1067 -0
- package/src/component/rateLimitHooks.ts +572 -0
- package/src/component/roles.ts +1360 -0
- package/src/component/scheduledPublish.ts +358 -0
- package/src/component/schema.ts +617 -0
- package/src/component/taxonomies.ts +949 -0
- package/src/component/taxonomyMutations.ts +1210 -0
- package/src/component/trash.ts +724 -0
- package/src/component/userContext.ts +898 -0
- package/src/component/validation.ts +1388 -0
- package/src/component/validators.ts +949 -0
- package/src/component/versionMutations.ts +392 -0
- package/src/component/webhookTrigger.ts +1922 -0
- package/src/react/index.ts +898 -0
- package/src/test.ts +1580 -0
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @convex-cms/core/react
|
|
3
|
+
*
|
|
4
|
+
* React hooks and utilities for using Convex CMS in React applications.
|
|
5
|
+
* These hooks provide convenient wrappers around Convex's React hooks
|
|
6
|
+
* specifically designed for CMS use cases.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* import { useContentEntries, useContentEntry, useMediaAssets } from "@convex-cms/core/react";
|
|
11
|
+
* import { api } from "../convex/_generated/api";
|
|
12
|
+
*
|
|
13
|
+
* function BlogList() {
|
|
14
|
+
* const { entries, isLoading, loadMore, hasMore } = useContentEntries(
|
|
15
|
+
* api.example.listBlogPosts,
|
|
16
|
+
* { status: "published" }
|
|
17
|
+
* );
|
|
18
|
+
*
|
|
19
|
+
* return (
|
|
20
|
+
* <div>
|
|
21
|
+
* {entries.map(entry => <BlogCard key={entry._id} entry={entry} />)}
|
|
22
|
+
* {hasMore && <button onClick={loadMore}>Load More</button>}
|
|
23
|
+
* </div>
|
|
24
|
+
* );
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
// Re-export core Convex React hooks for convenience
|
|
29
|
+
export { useQuery, useMutation, useAction, usePaginatedQuery, useConvex, useConvexAuth, Authenticated, Unauthenticated, AuthLoading, } from "convex/react";
|
|
30
|
+
// Re-export Convex React provider
|
|
31
|
+
export { ConvexProvider, ConvexProviderWithAuth } from "convex/react";
|
|
32
|
+
import { useMemo, useCallback, useState, useRef, useReducer, useEffect } from "react";
|
|
33
|
+
import { useQuery, usePaginatedQuery, useMutation } from "convex/react";
|
|
34
|
+
// =============================================================================
|
|
35
|
+
// Upload Utilities
|
|
36
|
+
// =============================================================================
|
|
37
|
+
function generateUploadId() {
|
|
38
|
+
return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
39
|
+
}
|
|
40
|
+
function getImageDimensions(file, timeoutMs = 5000) {
|
|
41
|
+
if (!file.type.startsWith("image/"))
|
|
42
|
+
return Promise.resolve(undefined);
|
|
43
|
+
return new Promise((resolve) => {
|
|
44
|
+
const img = new Image();
|
|
45
|
+
let objectUrl = null;
|
|
46
|
+
const timeoutId = setTimeout(() => {
|
|
47
|
+
if (objectUrl)
|
|
48
|
+
URL.revokeObjectURL(objectUrl);
|
|
49
|
+
resolve(undefined);
|
|
50
|
+
}, timeoutMs);
|
|
51
|
+
img.onload = () => {
|
|
52
|
+
clearTimeout(timeoutId);
|
|
53
|
+
if (objectUrl)
|
|
54
|
+
URL.revokeObjectURL(objectUrl);
|
|
55
|
+
resolve({ width: img.naturalWidth, height: img.naturalHeight });
|
|
56
|
+
};
|
|
57
|
+
img.onerror = () => {
|
|
58
|
+
clearTimeout(timeoutId);
|
|
59
|
+
if (objectUrl)
|
|
60
|
+
URL.revokeObjectURL(objectUrl);
|
|
61
|
+
resolve(undefined);
|
|
62
|
+
};
|
|
63
|
+
objectUrl = URL.createObjectURL(file);
|
|
64
|
+
img.src = objectUrl;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function uploadWithXHR(url, file, signal, onProgress) {
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
const xhr = new XMLHttpRequest();
|
|
70
|
+
const abortHandler = () => {
|
|
71
|
+
xhr.abort();
|
|
72
|
+
reject(new DOMException("Upload aborted", "AbortError"));
|
|
73
|
+
};
|
|
74
|
+
signal.addEventListener("abort", abortHandler);
|
|
75
|
+
xhr.upload.onprogress = (event) => {
|
|
76
|
+
if (event.lengthComputable) {
|
|
77
|
+
const percent = Math.round((event.loaded / event.total) * 80);
|
|
78
|
+
onProgress(10 + percent);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
xhr.onload = () => {
|
|
82
|
+
signal.removeEventListener("abort", abortHandler);
|
|
83
|
+
if (xhr.status >= 200 && xhr.status < 300) {
|
|
84
|
+
try {
|
|
85
|
+
const response = JSON.parse(xhr.responseText);
|
|
86
|
+
resolve(response.storageId);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
reject(new Error("Invalid response from upload server"));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
reject(new Error(`Upload failed: ${xhr.statusText || `HTTP ${xhr.status}`}`));
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
xhr.onerror = () => {
|
|
97
|
+
signal.removeEventListener("abort", abortHandler);
|
|
98
|
+
reject(new Error("Network error during upload"));
|
|
99
|
+
};
|
|
100
|
+
xhr.ontimeout = () => {
|
|
101
|
+
signal.removeEventListener("abort", abortHandler);
|
|
102
|
+
reject(new Error("Upload timed out"));
|
|
103
|
+
};
|
|
104
|
+
xhr.open("POST", url);
|
|
105
|
+
xhr.setRequestHeader("Content-Type", file.type);
|
|
106
|
+
xhr.send(file);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// =============================================================================
|
|
110
|
+
// Content Entry Hooks
|
|
111
|
+
// =============================================================================
|
|
112
|
+
/**
|
|
113
|
+
* Hook for fetching paginated content entries with automatic cursor management.
|
|
114
|
+
*
|
|
115
|
+
* @param queryFn - The Convex query function for listing entries
|
|
116
|
+
* @param args - Arguments to pass to the query (excluding pagination)
|
|
117
|
+
* @param options - Hook options like page size
|
|
118
|
+
* @returns Paginated entries with loading state and load more function
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```tsx
|
|
122
|
+
* const { entries, isLoading, loadMore, hasMore } = useContentEntries(
|
|
123
|
+
* api.example.listBlogPosts,
|
|
124
|
+
* { contentTypeId: blogTypeId, status: "published" },
|
|
125
|
+
* { pageSize: 10 }
|
|
126
|
+
* );
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
export function useContentEntries(queryFn, args, options = {}) {
|
|
130
|
+
const { pageSize = 20 } = options;
|
|
131
|
+
const result = usePaginatedQuery(queryFn, args, { initialNumItems: pageSize });
|
|
132
|
+
const entries = useMemo(() => {
|
|
133
|
+
if (!result.results)
|
|
134
|
+
return [];
|
|
135
|
+
return result.results;
|
|
136
|
+
}, [result.results]);
|
|
137
|
+
const loadMore = useCallback((numItems) => {
|
|
138
|
+
result.loadMore(numItems ?? pageSize);
|
|
139
|
+
}, [result, pageSize]);
|
|
140
|
+
return {
|
|
141
|
+
entries,
|
|
142
|
+
isLoading: result.status === "LoadingFirstPage",
|
|
143
|
+
isLoadingMore: result.status === "LoadingMore",
|
|
144
|
+
loadMore,
|
|
145
|
+
hasMore: result.status === "CanLoadMore",
|
|
146
|
+
status: result.status,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Hook for fetching a single content entry.
|
|
151
|
+
*
|
|
152
|
+
* @param queryFn - The Convex query function for getting an entry
|
|
153
|
+
* @param args - Arguments to pass to the query (typically entry ID)
|
|
154
|
+
* @returns The entry with loading state
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```tsx
|
|
158
|
+
* const { entry, isLoading } = useContentEntry(
|
|
159
|
+
* api.example.getBlogPost,
|
|
160
|
+
* { id: postId, locale: "en-US" }
|
|
161
|
+
* );
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
export function useContentEntry(queryFn, args) {
|
|
165
|
+
const result = useQuery(queryFn, args);
|
|
166
|
+
return {
|
|
167
|
+
entry: result,
|
|
168
|
+
isLoading: result === undefined,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// =============================================================================
|
|
172
|
+
// Media Asset Hooks
|
|
173
|
+
// =============================================================================
|
|
174
|
+
/**
|
|
175
|
+
* Hook for fetching paginated media assets.
|
|
176
|
+
*
|
|
177
|
+
* @param queryFn - The Convex query function for listing media
|
|
178
|
+
* @param args - Arguments to pass to the query (folder, type filters, etc.)
|
|
179
|
+
* @param options - Hook options like page size
|
|
180
|
+
* @returns Paginated assets with loading state and load more function
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```tsx
|
|
184
|
+
* const { assets, isLoading, loadMore, hasMore } = useMediaAssets(
|
|
185
|
+
* api.example.listMedia,
|
|
186
|
+
* { folderId: currentFolder, type: "image" },
|
|
187
|
+
* { pageSize: 24 }
|
|
188
|
+
* );
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
export function useMediaAssets(queryFn, args, options = {}) {
|
|
192
|
+
const { pageSize = 24 } = options;
|
|
193
|
+
const result = usePaginatedQuery(queryFn, args, { initialNumItems: pageSize });
|
|
194
|
+
const assets = useMemo(() => {
|
|
195
|
+
if (!result.results)
|
|
196
|
+
return [];
|
|
197
|
+
return result.results;
|
|
198
|
+
}, [result.results]);
|
|
199
|
+
const loadMore = useCallback((numItems) => {
|
|
200
|
+
result.loadMore(numItems ?? pageSize);
|
|
201
|
+
}, [result, pageSize]);
|
|
202
|
+
return {
|
|
203
|
+
assets,
|
|
204
|
+
isLoading: result.status === "LoadingFirstPage",
|
|
205
|
+
isLoadingMore: result.status === "LoadingMore",
|
|
206
|
+
loadMore,
|
|
207
|
+
hasMore: result.status === "CanLoadMore",
|
|
208
|
+
status: result.status,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Hook for CMS mutations with loading and error state tracking.
|
|
213
|
+
*
|
|
214
|
+
* @param mutationFn - The Convex mutation function
|
|
215
|
+
* @returns Mutation function with state tracking
|
|
216
|
+
*
|
|
217
|
+
* @example
|
|
218
|
+
* ```tsx
|
|
219
|
+
* const { mutate: createEntry, isPending, error } = useCmsMutation(
|
|
220
|
+
* api.example.createBlogPost
|
|
221
|
+
* );
|
|
222
|
+
*
|
|
223
|
+
* const handleSubmit = async (data) => {
|
|
224
|
+
* try {
|
|
225
|
+
* await createEntry(data);
|
|
226
|
+
* toast.success("Post created!");
|
|
227
|
+
* } catch (e) {
|
|
228
|
+
* // Error is also available via the error state
|
|
229
|
+
* }
|
|
230
|
+
* };
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
export function useCmsMutation(mutationFn) {
|
|
234
|
+
const mutation = useMutation(mutationFn);
|
|
235
|
+
const [isPending, setIsPending] = useState(false);
|
|
236
|
+
const [error, setError] = useState(null);
|
|
237
|
+
const mutate = useCallback(async (args) => {
|
|
238
|
+
setIsPending(true);
|
|
239
|
+
setError(null);
|
|
240
|
+
try {
|
|
241
|
+
const result = await mutation(args);
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
const err = e instanceof Error ? e : new Error(String(e));
|
|
246
|
+
setError(err);
|
|
247
|
+
throw err;
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
setIsPending(false);
|
|
251
|
+
}
|
|
252
|
+
}, [mutation]);
|
|
253
|
+
const resetError = useCallback(() => {
|
|
254
|
+
setError(null);
|
|
255
|
+
}, []);
|
|
256
|
+
return {
|
|
257
|
+
mutate,
|
|
258
|
+
isPending,
|
|
259
|
+
error,
|
|
260
|
+
resetError,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Hook for uploading files to Convex storage with CMS media asset creation.
|
|
265
|
+
* Includes real-time progress tracking, cancellation support, and error handling.
|
|
266
|
+
*
|
|
267
|
+
* @param getUploadUrl - Mutation to get a storage upload URL
|
|
268
|
+
* @param createAsset - Mutation to create the media asset record
|
|
269
|
+
* @returns Upload function with progress tracking, cancellation, and error state
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
* ```tsx
|
|
273
|
+
* const { upload, cancel, isUploading, progress, error } = useMediaUpload(
|
|
274
|
+
* api.example.generateUploadUrl,
|
|
275
|
+
* api.example.createMediaAsset
|
|
276
|
+
* );
|
|
277
|
+
*
|
|
278
|
+
* const handleUpload = async (file: File) => {
|
|
279
|
+
* try {
|
|
280
|
+
* const asset = await upload(file, { parentId: folderId });
|
|
281
|
+
* console.log("Uploaded:", asset);
|
|
282
|
+
* } catch (e) {
|
|
283
|
+
* if (e.name !== "AbortError") {
|
|
284
|
+
* console.error("Upload failed:", e);
|
|
285
|
+
* }
|
|
286
|
+
* }
|
|
287
|
+
* };
|
|
288
|
+
*
|
|
289
|
+
* // Cancel button
|
|
290
|
+
* <button onClick={cancel} disabled={!isUploading}>Cancel</button>
|
|
291
|
+
* ```
|
|
292
|
+
*/
|
|
293
|
+
export function useMediaUpload(getUploadUrl, createAsset) {
|
|
294
|
+
const generateUrl = useMutation(getUploadUrl);
|
|
295
|
+
const create = useMutation(createAsset);
|
|
296
|
+
const [isUploading, setIsUploading] = useState(false);
|
|
297
|
+
const [progress, setProgress] = useState(0);
|
|
298
|
+
const [error, setError] = useState(null);
|
|
299
|
+
const abortControllerRef = useRef(null);
|
|
300
|
+
const upload = useCallback(async (file, metadata) => {
|
|
301
|
+
abortControllerRef.current = new AbortController();
|
|
302
|
+
setIsUploading(true);
|
|
303
|
+
setProgress(0);
|
|
304
|
+
setError(null);
|
|
305
|
+
try {
|
|
306
|
+
const uploadUrl = await generateUrl({});
|
|
307
|
+
setProgress(5);
|
|
308
|
+
const storageId = await uploadWithXHR(uploadUrl, file, abortControllerRef.current.signal, setProgress);
|
|
309
|
+
setProgress(90);
|
|
310
|
+
const dimensions = await getImageDimensions(file);
|
|
311
|
+
const asset = await create({
|
|
312
|
+
storageId,
|
|
313
|
+
name: file.name,
|
|
314
|
+
mimeType: file.type,
|
|
315
|
+
size: file.size,
|
|
316
|
+
...dimensions,
|
|
317
|
+
...metadata,
|
|
318
|
+
});
|
|
319
|
+
setProgress(100);
|
|
320
|
+
return asset;
|
|
321
|
+
}
|
|
322
|
+
catch (e) {
|
|
323
|
+
const err = e instanceof Error ? e : new Error(String(e));
|
|
324
|
+
if (err.name !== "AbortError") {
|
|
325
|
+
setError(err.message);
|
|
326
|
+
}
|
|
327
|
+
throw err;
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
setIsUploading(false);
|
|
331
|
+
abortControllerRef.current = null;
|
|
332
|
+
}
|
|
333
|
+
}, [generateUrl, create]);
|
|
334
|
+
const cancel = useCallback(() => {
|
|
335
|
+
abortControllerRef.current?.abort();
|
|
336
|
+
}, []);
|
|
337
|
+
const reset = useCallback(() => {
|
|
338
|
+
setProgress(0);
|
|
339
|
+
setError(null);
|
|
340
|
+
setIsUploading(false);
|
|
341
|
+
}, []);
|
|
342
|
+
return {
|
|
343
|
+
upload,
|
|
344
|
+
cancel,
|
|
345
|
+
isUploading,
|
|
346
|
+
progress,
|
|
347
|
+
error,
|
|
348
|
+
reset,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
function queueReducer(state, action) {
|
|
352
|
+
switch (action.type) {
|
|
353
|
+
case "ADD_FILES": {
|
|
354
|
+
const newFiles = action.files.map((file) => ({
|
|
355
|
+
id: generateUploadId(),
|
|
356
|
+
file,
|
|
357
|
+
status: "pending",
|
|
358
|
+
progress: 0,
|
|
359
|
+
}));
|
|
360
|
+
return [...state, ...newFiles];
|
|
361
|
+
}
|
|
362
|
+
case "UPDATE_FILE":
|
|
363
|
+
return state.map((f) => f.id === action.id ? { ...f, ...action.updates } : f);
|
|
364
|
+
case "RETRY_FILE":
|
|
365
|
+
return state.map((f) => f.id === action.id
|
|
366
|
+
? { ...f, status: "pending", progress: 0, error: undefined }
|
|
367
|
+
: f);
|
|
368
|
+
case "REMOVE_FILE":
|
|
369
|
+
return state.filter((f) => f.id !== action.id);
|
|
370
|
+
case "CLEAR_COMPLETED":
|
|
371
|
+
return state.filter((f) => f.status === "pending" || f.status === "uploading");
|
|
372
|
+
case "CLEAR_ALL":
|
|
373
|
+
return [];
|
|
374
|
+
case "CANCEL_FILE":
|
|
375
|
+
return state.map((f) => f.id === action.id && (f.status === "pending" || f.status === "uploading")
|
|
376
|
+
? { ...f, status: "cancelled", error: "Upload cancelled" }
|
|
377
|
+
: f);
|
|
378
|
+
case "CANCEL_ALL":
|
|
379
|
+
return state.map((f) => f.status === "pending" || f.status === "uploading"
|
|
380
|
+
? { ...f, status: "cancelled", error: "Upload cancelled" }
|
|
381
|
+
: f);
|
|
382
|
+
default:
|
|
383
|
+
return state;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Hook for uploading multiple files with queue management, concurrency control,
|
|
388
|
+
* and progress tracking. Uses a reducer for state management to avoid closure issues.
|
|
389
|
+
*
|
|
390
|
+
* @param options - Configuration options
|
|
391
|
+
* @returns Queue state and control functions
|
|
392
|
+
*
|
|
393
|
+
* @example
|
|
394
|
+
* ```tsx
|
|
395
|
+
* const queue = useMediaUploadQueue({
|
|
396
|
+
* getUploadUrl: api.media.generateUploadUrl,
|
|
397
|
+
* createAsset: api.media.createAsset,
|
|
398
|
+
* maxConcurrent: 3,
|
|
399
|
+
* metadata: { parentId: folderId },
|
|
400
|
+
* onComplete: (results) => console.log("All done!", results),
|
|
401
|
+
* });
|
|
402
|
+
*
|
|
403
|
+
* // In your dropzone handler:
|
|
404
|
+
* const handleDrop = (files: File[]) => {
|
|
405
|
+
* queue.addFiles(files);
|
|
406
|
+
* };
|
|
407
|
+
*
|
|
408
|
+
* // Display progress:
|
|
409
|
+
* {queue.files.map(f => (
|
|
410
|
+
* <div key={f.id}>
|
|
411
|
+
* {f.file.name}: {f.status} ({f.progress}%)
|
|
412
|
+
* {f.status === "uploading" && <button onClick={() => queue.cancelFile(f.id)}>Cancel</button>}
|
|
413
|
+
* {f.status === "error" && <button onClick={() => queue.retryFile(f.id)}>Retry</button>}
|
|
414
|
+
* </div>
|
|
415
|
+
* ))}
|
|
416
|
+
* ```
|
|
417
|
+
*/
|
|
418
|
+
export function useMediaUploadQueue(options) {
|
|
419
|
+
const { maxConcurrent = 3, metadata, onComplete, onError } = options;
|
|
420
|
+
const [files, dispatch] = useReducer(queueReducer, []);
|
|
421
|
+
const generateUrl = useMutation(options.getUploadUrl);
|
|
422
|
+
const create = useMutation(options.createAsset);
|
|
423
|
+
const activeUploadsRef = useRef(0);
|
|
424
|
+
const abortControllersRef = useRef(new Map());
|
|
425
|
+
const processingRef = useRef(false);
|
|
426
|
+
const uploadFile = useCallback(async (queueFile) => {
|
|
427
|
+
const abortController = new AbortController();
|
|
428
|
+
abortControllersRef.current.set(queueFile.id, abortController);
|
|
429
|
+
dispatch({
|
|
430
|
+
type: "UPDATE_FILE",
|
|
431
|
+
id: queueFile.id,
|
|
432
|
+
updates: { status: "uploading", progress: 0 },
|
|
433
|
+
});
|
|
434
|
+
try {
|
|
435
|
+
const uploadUrl = await generateUrl({});
|
|
436
|
+
dispatch({
|
|
437
|
+
type: "UPDATE_FILE",
|
|
438
|
+
id: queueFile.id,
|
|
439
|
+
updates: { progress: 5 },
|
|
440
|
+
});
|
|
441
|
+
const storageId = await uploadWithXHR(uploadUrl, queueFile.file, abortController.signal, (progress) => {
|
|
442
|
+
dispatch({
|
|
443
|
+
type: "UPDATE_FILE",
|
|
444
|
+
id: queueFile.id,
|
|
445
|
+
updates: { progress },
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
dispatch({
|
|
449
|
+
type: "UPDATE_FILE",
|
|
450
|
+
id: queueFile.id,
|
|
451
|
+
updates: { progress: 90 },
|
|
452
|
+
});
|
|
453
|
+
const dimensions = await getImageDimensions(queueFile.file);
|
|
454
|
+
const result = await create({
|
|
455
|
+
storageId,
|
|
456
|
+
name: queueFile.file.name,
|
|
457
|
+
mimeType: queueFile.file.type,
|
|
458
|
+
size: queueFile.file.size,
|
|
459
|
+
...dimensions,
|
|
460
|
+
...metadata,
|
|
461
|
+
});
|
|
462
|
+
dispatch({
|
|
463
|
+
type: "UPDATE_FILE",
|
|
464
|
+
id: queueFile.id,
|
|
465
|
+
updates: { status: "complete", progress: 100, result },
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
catch (e) {
|
|
469
|
+
const err = e instanceof Error ? e : new Error(String(e));
|
|
470
|
+
if (err.name === "AbortError") {
|
|
471
|
+
dispatch({
|
|
472
|
+
type: "UPDATE_FILE",
|
|
473
|
+
id: queueFile.id,
|
|
474
|
+
updates: { status: "cancelled", error: "Upload cancelled" },
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
const updatedFile = {
|
|
479
|
+
...queueFile,
|
|
480
|
+
status: "error",
|
|
481
|
+
error: err.message,
|
|
482
|
+
};
|
|
483
|
+
dispatch({
|
|
484
|
+
type: "UPDATE_FILE",
|
|
485
|
+
id: queueFile.id,
|
|
486
|
+
updates: { status: "error", error: err.message },
|
|
487
|
+
});
|
|
488
|
+
onError?.(updatedFile);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
finally {
|
|
492
|
+
abortControllersRef.current.delete(queueFile.id);
|
|
493
|
+
activeUploadsRef.current--;
|
|
494
|
+
}
|
|
495
|
+
}, [generateUrl, create, metadata, onError]);
|
|
496
|
+
const processQueue = useCallback(() => {
|
|
497
|
+
if (processingRef.current)
|
|
498
|
+
return;
|
|
499
|
+
processingRef.current = true;
|
|
500
|
+
const pending = files.filter((f) => f.status === "pending");
|
|
501
|
+
while (activeUploadsRef.current < maxConcurrent && pending.length > 0) {
|
|
502
|
+
const next = pending.shift();
|
|
503
|
+
activeUploadsRef.current++;
|
|
504
|
+
uploadFile(next);
|
|
505
|
+
}
|
|
506
|
+
processingRef.current = false;
|
|
507
|
+
if (activeUploadsRef.current === 0 &&
|
|
508
|
+
files.length > 0 &&
|
|
509
|
+
files.every((f) => f.status !== "pending" && f.status !== "uploading")) {
|
|
510
|
+
onComplete?.(files);
|
|
511
|
+
}
|
|
512
|
+
}, [files, maxConcurrent, uploadFile, onComplete]);
|
|
513
|
+
useEffect(() => {
|
|
514
|
+
if (files.some((f) => f.status === "pending") && activeUploadsRef.current < maxConcurrent) {
|
|
515
|
+
processQueue();
|
|
516
|
+
}
|
|
517
|
+
}, [files, maxConcurrent, processQueue]);
|
|
518
|
+
const addFiles = useCallback((newFiles) => {
|
|
519
|
+
dispatch({ type: "ADD_FILES", files: newFiles });
|
|
520
|
+
}, []);
|
|
521
|
+
const cancelFile = useCallback((id) => {
|
|
522
|
+
const controller = abortControllersRef.current.get(id);
|
|
523
|
+
if (controller) {
|
|
524
|
+
controller.abort();
|
|
525
|
+
}
|
|
526
|
+
dispatch({ type: "CANCEL_FILE", id });
|
|
527
|
+
}, []);
|
|
528
|
+
const cancelAll = useCallback(() => {
|
|
529
|
+
abortControllersRef.current.forEach((controller) => controller.abort());
|
|
530
|
+
dispatch({ type: "CANCEL_ALL" });
|
|
531
|
+
}, []);
|
|
532
|
+
const retryFile = useCallback((id) => {
|
|
533
|
+
dispatch({ type: "RETRY_FILE", id });
|
|
534
|
+
}, []);
|
|
535
|
+
const clearCompleted = useCallback(() => {
|
|
536
|
+
dispatch({ type: "CLEAR_COMPLETED" });
|
|
537
|
+
}, []);
|
|
538
|
+
const clearAll = useCallback(() => {
|
|
539
|
+
abortControllersRef.current.forEach((controller) => controller.abort());
|
|
540
|
+
dispatch({ type: "CLEAR_ALL" });
|
|
541
|
+
}, []);
|
|
542
|
+
const isUploading = files.some((f) => f.status === "uploading");
|
|
543
|
+
const overallProgress = files.length > 0
|
|
544
|
+
? Math.round(files.reduce((sum, f) => sum + f.progress, 0) / files.length)
|
|
545
|
+
: 0;
|
|
546
|
+
return {
|
|
547
|
+
files,
|
|
548
|
+
addFiles,
|
|
549
|
+
cancelFile,
|
|
550
|
+
cancelAll,
|
|
551
|
+
retryFile,
|
|
552
|
+
clearCompleted,
|
|
553
|
+
clearAll,
|
|
554
|
+
isUploading,
|
|
555
|
+
overallProgress,
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
|