@zjlab-fe/data-hub-ui 0.9.0 → 0.10.0
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/.github/instructions/i.instructions.md +249 -0
- package/dist/types/components/FileUploader/FileUploadModal.d.ts +3 -0
- package/dist/types/components/FileUploader/FileUploader.d.ts +3 -0
- package/dist/types/components/FileUploader/UploadStoreProvider/UploadStoreProvider.d.ts +3 -0
- package/dist/types/components/feature-card/demo/moha.d.ts +1 -0
- package/dist/types/components/feature-card/index.d.ts +7 -1
- package/dist/types/components/file-uploader/components/circle-progress.d.ts +6 -0
- package/dist/types/components/file-uploader/components/hooks/use-drop-zone.d.ts +18 -0
- package/dist/types/components/file-uploader/components/hooks/use-file-validation.d.ts +13 -0
- package/dist/types/components/file-uploader/components/icons.d.ts +5 -0
- package/dist/types/components/file-uploader/components/uploader-drop-zone.d.ts +50 -0
- package/dist/types/components/file-uploader/components/uploader-file-item.d.ts +44 -0
- package/dist/types/components/file-uploader/components/uploader-file-list.d.ts +29 -0
- package/dist/types/components/file-uploader/components/uploader.d.ts +64 -0
- package/dist/types/components/file-uploader/components/uploading-status.d.ts +9 -0
- package/dist/types/components/file-uploader/components/utils/directory-reader.d.ts +8 -0
- package/dist/types/components/file-uploader/constants.d.ts +27 -0
- package/dist/types/components/file-uploader/context/file-state-store.d.ts +64 -0
- package/dist/types/components/file-uploader/context/handler-registry.d.ts +96 -0
- package/dist/types/components/file-uploader/context/upload-context.d.ts +14 -0
- package/dist/types/components/file-uploader/context/upload-provider.d.ts +47 -0
- package/dist/types/components/file-uploader/context/upload-reducer.d.ts +6 -0
- package/dist/types/components/file-uploader/context/use-upload-engine.d.ts +22 -0
- package/dist/types/components/file-uploader/demo/index.d.ts +2 -0
- package/dist/types/components/file-uploader/engine/queue-callbacks.d.ts +21 -0
- package/dist/types/components/file-uploader/engine/queue-manager.d.ts +63 -0
- package/dist/types/components/file-uploader/engine/queue-types.d.ts +37 -0
- package/dist/types/components/file-uploader/engine/queue-uploader.d.ts +8 -0
- package/dist/types/components/file-uploader/hooks/use-upload-batch.d.ts +36 -0
- package/dist/types/components/file-uploader/hooks/use-upload-control.d.ts +37 -0
- package/dist/types/components/file-uploader/hooks/use-upload-files.d.ts +40 -0
- package/dist/types/components/file-uploader/hooks/use-upload-operations.d.ts +43 -0
- package/dist/types/components/file-uploader/hooks/use-upload.d.ts +85 -0
- package/dist/types/components/file-uploader/index.d.ts +13 -0
- package/dist/types/components/file-uploader/persistence/file-blob-store.d.ts +71 -0
- package/dist/types/components/file-uploader/persistence/file-handle-store.d.ts +116 -0
- package/dist/types/components/file-uploader/persistence/index.d.ts +42 -0
- package/dist/types/components/file-uploader/persistence/metadata-store.d.ts +63 -0
- package/dist/types/components/file-uploader/persistence/persistence-context.d.ts +20 -0
- package/dist/types/components/file-uploader/persistence/persistence-manager.d.ts +103 -0
- package/dist/types/components/file-uploader/persistence/persistence-provider.d.ts +49 -0
- package/dist/types/components/file-uploader/persistence/types.d.ts +268 -0
- package/dist/types/components/file-uploader/persistence/use-persistence.d.ts +78 -0
- package/dist/types/components/file-uploader/types.d.ts +135 -0
- package/dist/types/components/file-uploader/utils/chunk-handlers.d.ts +40 -0
- package/dist/types/components/file-uploader/utils/ensure-handlers.d.ts +7 -0
- package/dist/types/components/file-uploader/utils/error-handler.d.ts +59 -0
- package/dist/types/components/file-uploader/utils/upload-controllers.d.ts +72 -0
- package/dist/types/components/file-uploader/utils/upload-handler.d.ts +17 -0
- package/dist/types/components/file-uploader/utils/validate-handlers.d.ts +6 -0
- package/dist/types/components/section-heading/index.d.ts +1 -1
- package/dist/types/components/tip-tap/extensions/index.d.ts +1 -1
- package/dist/types/index.d.ts +2 -1
- package/es/index.js +1 -1
- package/lib/index.js +1 -1
- package/package.json +1 -1
- package/tailwind.config.js +4 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { UploadHandlers } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Per-file handler storage.
|
|
4
|
+
*
|
|
5
|
+
* When a file is added for upload, its handlers are registered here.
|
|
6
|
+
* Even if the originating component unmounts, the handlers remain
|
|
7
|
+
* available for the QueueManager to use during background uploads.
|
|
8
|
+
*/
|
|
9
|
+
export interface FileHandlerEntry {
|
|
10
|
+
/** The handlers specific to this file's upload context */
|
|
11
|
+
handlers: UploadHandlers;
|
|
12
|
+
/** Timestamp when handlers were registered */
|
|
13
|
+
registeredAt: number;
|
|
14
|
+
/** Optional metadata for debugging */
|
|
15
|
+
context?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Global handler registry for background uploads.
|
|
19
|
+
*
|
|
20
|
+
* This registry stores handlers per-file, allowing uploads to continue
|
|
21
|
+
* even when the user navigates away from the page that initiated the upload.
|
|
22
|
+
*
|
|
23
|
+
* Flow:
|
|
24
|
+
* 1. Component calls addFiles() -> handlers are registered per file ID
|
|
25
|
+
* 2. User navigates away -> component unmounts but handlers persist
|
|
26
|
+
* 3. QueueManager continues -> looks up handlers by file ID
|
|
27
|
+
* 4. Upload completes -> handlers are cleaned up
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* // In page component
|
|
32
|
+
* const { addFiles } = useUpload();
|
|
33
|
+
* addFiles(files, {
|
|
34
|
+
* getHandlers: (file) => ({
|
|
35
|
+
* onGetUploadUrls: (name, parts) => api.getUrls(datasetId, name, parts, folderFromUI()),
|
|
36
|
+
* // ... other handlers
|
|
37
|
+
* })
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* // When user adds files, handlers are registered:
|
|
41
|
+
* // handlerRegistry.register(file.id, handlers)
|
|
42
|
+
*
|
|
43
|
+
* // User navigates away - no problem!
|
|
44
|
+
* // QueueManager uses: handlerRegistry.get(fileId)
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
declare class HandlerRegistry {
|
|
48
|
+
private registry;
|
|
49
|
+
/**
|
|
50
|
+
* Register handlers for a file.
|
|
51
|
+
* Called when a file is added for upload.
|
|
52
|
+
*/
|
|
53
|
+
register(fileId: string, handlers: UploadHandlers, context?: string): void;
|
|
54
|
+
/**
|
|
55
|
+
* Get handlers for a file.
|
|
56
|
+
* Returns undefined if file has no registered handlers.
|
|
57
|
+
*/
|
|
58
|
+
get(fileId: string): UploadHandlers | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Check if handlers exist for a file.
|
|
61
|
+
*/
|
|
62
|
+
has(fileId: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Remove handlers for a file.
|
|
65
|
+
* Called when upload completes, fails permanently, or is cancelled.
|
|
66
|
+
*/
|
|
67
|
+
unregister(fileId: string): void;
|
|
68
|
+
/**
|
|
69
|
+
* Get all registered file IDs.
|
|
70
|
+
* Useful for debugging and cleanup.
|
|
71
|
+
*/
|
|
72
|
+
getRegisteredFileIds(): string[];
|
|
73
|
+
/**
|
|
74
|
+
* Get entry with metadata for debugging.
|
|
75
|
+
*/
|
|
76
|
+
getEntry(fileId: string): FileHandlerEntry | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* Clear all registrations.
|
|
79
|
+
* Use with caution - mainly for testing or complete reset.
|
|
80
|
+
*/
|
|
81
|
+
clear(): void;
|
|
82
|
+
/**
|
|
83
|
+
* Get count of registered handlers.
|
|
84
|
+
*/
|
|
85
|
+
get size(): number;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Singleton instance of the handler registry.
|
|
89
|
+
* This is intentionally a module-level singleton, not React context,
|
|
90
|
+
* because it needs to persist completely independently of React lifecycle.
|
|
91
|
+
*/
|
|
92
|
+
export declare const handlerRegistry: HandlerRegistry;
|
|
93
|
+
export {};
|
|
94
|
+
/**
|
|
95
|
+
* Debug helper to log current registry state.
|
|
96
|
+
*/
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { UploadState, UploadContextValue, UploadConfig } from '../types';
|
|
2
|
+
export declare const initialUploadState: UploadState;
|
|
3
|
+
/**
|
|
4
|
+
* Default upload configuration (Provider level).
|
|
5
|
+
* Controls chunk sizes and concurrency - typically same across app.
|
|
6
|
+
*/
|
|
7
|
+
export declare const defaultUploadConfig: Required<UploadConfig>;
|
|
8
|
+
export declare const UploadContext: import("react").Context<UploadContextValue | null>;
|
|
9
|
+
/**
|
|
10
|
+
* Hook to consume upload context
|
|
11
|
+
* Must be used within UploadProvider
|
|
12
|
+
* @throws Error if used outside of UploadProvider
|
|
13
|
+
*/
|
|
14
|
+
export declare function useUploadContext(): UploadContextValue;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { UploadConfig } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Props for UploadProvider component
|
|
5
|
+
*
|
|
6
|
+
* The provider manages shared state (files list, queue manager) and
|
|
7
|
+
* global upload configuration (chunk sizes, concurrency).
|
|
8
|
+
*
|
|
9
|
+
* For persistence, wrap with PersistenceProvider inside UploadProvider.
|
|
10
|
+
*/
|
|
11
|
+
export interface UploadProviderProps {
|
|
12
|
+
/** Global upload configuration (chunk sizes, concurrency) */
|
|
13
|
+
config?: UploadConfig;
|
|
14
|
+
/** Child components */
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Upload Provider Component
|
|
19
|
+
*
|
|
20
|
+
* Provides shared upload state and global configuration across the application.
|
|
21
|
+
* Manages:
|
|
22
|
+
* - Files state (list of files, their status, progress)
|
|
23
|
+
* - QueueManager singleton (shared upload queue)
|
|
24
|
+
* - Global config (chunk sizes, concurrency)
|
|
25
|
+
*
|
|
26
|
+
* For persistence support, wrap your app with PersistenceProvider inside UploadProvider:
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```tsx
|
|
30
|
+
* // App level - state management + global config
|
|
31
|
+
* <UploadProvider config={{ concurrentFiles: 3 }}>
|
|
32
|
+
* <PersistenceProvider config={{ mode: 'indexeddb' }}>
|
|
33
|
+
* <App />
|
|
34
|
+
* </PersistenceProvider>
|
|
35
|
+
* </UploadProvider>
|
|
36
|
+
*
|
|
37
|
+
* // In App - use persistence hook
|
|
38
|
+
* const { pendingFiles, restoreFiles } = usePersistence();
|
|
39
|
+
*
|
|
40
|
+
* // Component level - provide handlers & per-usage options
|
|
41
|
+
* const { addFiles } = useUpload();
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function UploadProvider({ config, children }: UploadProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
export declare namespace UploadProvider {
|
|
46
|
+
var displayName: string;
|
|
47
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { UploadFile } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Hook that integrates QueueManager with React context.
|
|
4
|
+
*
|
|
5
|
+
* This hook bridges the imperative QueueManager with React's declarative state.
|
|
6
|
+
* It provides functions to control uploads while keeping UI state in sync.
|
|
7
|
+
*
|
|
8
|
+
* Global config (chunk sizes, concurrency) comes from context.
|
|
9
|
+
* Handlers are provided per-file via addFiles().
|
|
10
|
+
*
|
|
11
|
+
* @returns Upload control functions: startUpload, pauseUpload, resumeUpload, cancelUpload
|
|
12
|
+
*/
|
|
13
|
+
export declare function useUploadEngine(): {
|
|
14
|
+
/** Start uploading a file */
|
|
15
|
+
startUpload: (uploadFile: UploadFile) => Promise<void>;
|
|
16
|
+
/** Pause an uploading file */
|
|
17
|
+
pauseUpload: (fileId: string) => void;
|
|
18
|
+
/** Resume a paused file */
|
|
19
|
+
resumeUpload: (fileId: string) => Promise<void>;
|
|
20
|
+
/** Cancel a file upload */
|
|
21
|
+
cancelUpload: (fileId: string) => Promise<void>;
|
|
22
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Dispatch } from 'react';
|
|
2
|
+
import type { QueueCallbacks } from './queue-types';
|
|
3
|
+
import type { UploadAction } from '../types';
|
|
4
|
+
/**
|
|
5
|
+
* Dependencies required to create queue callbacks.
|
|
6
|
+
* These are injected from the React hook to maintain reactivity.
|
|
7
|
+
*/
|
|
8
|
+
export interface QueueCallbackDeps {
|
|
9
|
+
/** React dispatch function for state updates */
|
|
10
|
+
dispatch: Dispatch<UploadAction>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Creates QueueManager callbacks that integrate with React state.
|
|
14
|
+
*
|
|
15
|
+
* These callbacks are called by QueueManager during upload lifecycle:
|
|
16
|
+
* - onChunkProgress: When chunk upload progress updates
|
|
17
|
+
* - onChunkComplete: When a chunk finishes uploading
|
|
18
|
+
* - onChunkError: When a chunk upload fails
|
|
19
|
+
* - onFileComplete: When all chunks of a file are uploaded
|
|
20
|
+
*/
|
|
21
|
+
export declare function createQueueCallbacks({ dispatch }: QueueCallbackDeps): QueueCallbacks;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { UploadFile } from '../types';
|
|
2
|
+
import type { QueueCallbacks, QueueConfig } from './queue-types';
|
|
3
|
+
export type { QueueItem, QueueCallbacks, QueueConfig } from './queue-types';
|
|
4
|
+
/**
|
|
5
|
+
* Manages upload queue with configurable concurrency.
|
|
6
|
+
*
|
|
7
|
+
* Handles scheduling of chunk uploads across multiple files,
|
|
8
|
+
* respecting concurrency limits for both files and chunks per file.
|
|
9
|
+
*/
|
|
10
|
+
export declare class QueueManager {
|
|
11
|
+
/** Pending items waiting to be uploaded */
|
|
12
|
+
private queue;
|
|
13
|
+
/** Currently uploading items, grouped by file ID */
|
|
14
|
+
private activeByFile;
|
|
15
|
+
/** Set of file IDs that are paused */
|
|
16
|
+
private pausedFiles;
|
|
17
|
+
/** Track chunk completion counts per file */
|
|
18
|
+
private fileChunkCounts;
|
|
19
|
+
private config;
|
|
20
|
+
private callbacks;
|
|
21
|
+
constructor(config: QueueConfig, callbacks: QueueCallbacks);
|
|
22
|
+
/**
|
|
23
|
+
* Add a file's chunks to the upload queue.
|
|
24
|
+
* Only pending chunks are added; completed chunks are skipped.
|
|
25
|
+
*/
|
|
26
|
+
addFile(uploadFile: UploadFile): void;
|
|
27
|
+
/**
|
|
28
|
+
* Process queue and start uploads respecting concurrency limits.
|
|
29
|
+
* - Max `concurrentFiles` files can upload simultaneously
|
|
30
|
+
* - Each file can have max `concurrentChunks` chunks uploading
|
|
31
|
+
*/
|
|
32
|
+
private processQueue;
|
|
33
|
+
/**
|
|
34
|
+
* Start uploading a single chunk.
|
|
35
|
+
* Handles progress, completion, and error callbacks.
|
|
36
|
+
*/
|
|
37
|
+
private startUpload;
|
|
38
|
+
/** Remove an item from the active uploads map */
|
|
39
|
+
private removeFromActive;
|
|
40
|
+
/** Pause uploads for a file (aborts active uploads) */
|
|
41
|
+
pauseFile(fileId: string): void;
|
|
42
|
+
/** Resume uploads for a paused file */
|
|
43
|
+
resumeFile(fileId: string): void;
|
|
44
|
+
/** Cancel all uploads for a file and clean up */
|
|
45
|
+
cancelFile(fileId: string): void;
|
|
46
|
+
/** Abort all active uploads for a file */
|
|
47
|
+
private abortFileUploads;
|
|
48
|
+
/** Get count of active files and total active chunks */
|
|
49
|
+
getActiveCount(): {
|
|
50
|
+
files: number;
|
|
51
|
+
chunks: number;
|
|
52
|
+
};
|
|
53
|
+
/** Check if a file is currently paused */
|
|
54
|
+
isFilePaused(fileId: string): boolean;
|
|
55
|
+
/** Get number of items waiting in queue */
|
|
56
|
+
getQueueLength(): number;
|
|
57
|
+
/** Get number of pending queue items for a specific file */
|
|
58
|
+
getFileQueueLength(fileId: string): number;
|
|
59
|
+
/** Check if file has any items in queue or active uploads */
|
|
60
|
+
hasFileInQueue(fileId: string): boolean;
|
|
61
|
+
/** Clear all queue items for a file (used before re-adding on resume) */
|
|
62
|
+
clearFileFromQueue(fileId: string): void;
|
|
63
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ChunkState } from '../types';
|
|
2
|
+
import type { UploadRequestConfig } from '../utils/upload-handler';
|
|
3
|
+
/** Item in the upload queue */
|
|
4
|
+
export interface QueueItem {
|
|
5
|
+
fileId: string;
|
|
6
|
+
file: File;
|
|
7
|
+
chunk: ChunkState;
|
|
8
|
+
uploadUrl: string;
|
|
9
|
+
chunkSize: number;
|
|
10
|
+
abortController: AbortController;
|
|
11
|
+
}
|
|
12
|
+
/** Callbacks for queue events */
|
|
13
|
+
export interface QueueCallbacks {
|
|
14
|
+
onChunkUploadComplete: (fileId: string, partNum: number) => void;
|
|
15
|
+
onChunkComplete: (fileId: string, partNum: number) => Promise<{
|
|
16
|
+
success: boolean;
|
|
17
|
+
reason?: string;
|
|
18
|
+
}>;
|
|
19
|
+
onChunkError: (fileId: string, partNum: number, error: Error) => void;
|
|
20
|
+
onFileComplete: (fileId: string, result: {
|
|
21
|
+
succeeded: number;
|
|
22
|
+
total: number;
|
|
23
|
+
allSucceeded: boolean;
|
|
24
|
+
}) => Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/** Queue manager configuration */
|
|
27
|
+
export interface QueueConfig {
|
|
28
|
+
concurrentFiles: number;
|
|
29
|
+
concurrentChunks: number;
|
|
30
|
+
requestConfig?: UploadRequestConfig;
|
|
31
|
+
}
|
|
32
|
+
/** Chunk count tracker for a file */
|
|
33
|
+
export interface FileChunkCount {
|
|
34
|
+
total: number;
|
|
35
|
+
completed: number;
|
|
36
|
+
succeeded: number;
|
|
37
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { QueueItem, QueueConfig } from './queue-types';
|
|
2
|
+
export interface UploadResult {
|
|
3
|
+
item: QueueItem;
|
|
4
|
+
success: boolean;
|
|
5
|
+
error?: Error;
|
|
6
|
+
}
|
|
7
|
+
/** Upload a single queue item and return result */
|
|
8
|
+
export declare function uploadQueueItem(item: QueueItem, config: QueueConfig): Promise<UploadResult>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for batch upload operations.
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - Start all pending files
|
|
6
|
+
* - Pause all uploading files
|
|
7
|
+
* - Resume all paused files
|
|
8
|
+
* - Cancel all uploads
|
|
9
|
+
*
|
|
10
|
+
* Use this hook when you need bulk control over multiple files.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* function BatchControls() {
|
|
15
|
+
* const { startAll, pauseAll, cancelAll } = useUploadBatch();
|
|
16
|
+
*
|
|
17
|
+
* return (
|
|
18
|
+
* <div>
|
|
19
|
+
* <button onClick={startAll}>Start All</button>
|
|
20
|
+
* <button onClick={pauseAll}>Pause All</button>
|
|
21
|
+
* <button onClick={cancelAll}>Cancel All</button>
|
|
22
|
+
* </div>
|
|
23
|
+
* );
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function useUploadBatch(): {
|
|
28
|
+
/** Start all pending files */
|
|
29
|
+
startAll: () => Promise<void>;
|
|
30
|
+
/** Pause all uploading files */
|
|
31
|
+
pauseAll: () => void;
|
|
32
|
+
/** Resume all paused files */
|
|
33
|
+
resumeAll: () => Promise<void>;
|
|
34
|
+
/** Cancel all uploads */
|
|
35
|
+
cancelAll: () => void;
|
|
36
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for single file upload controls.
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - Start a pending file
|
|
6
|
+
* - Pause an uploading file
|
|
7
|
+
* - Resume a paused file
|
|
8
|
+
* - Cancel an upload
|
|
9
|
+
*
|
|
10
|
+
* Use this hook when you only need to control individual file uploads.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* function FileControlButtons({ fileId, status }: { fileId: string; status: string }) {
|
|
15
|
+
* const { start, pause, resume, cancel } = useUploadControl();
|
|
16
|
+
*
|
|
17
|
+
* return (
|
|
18
|
+
* <div>
|
|
19
|
+
* {status === 'pending' && <button onClick={() => start(fileId)}>Start</button>}
|
|
20
|
+
* {status === 'uploading' && <button onClick={() => pause(fileId)}>Pause</button>}
|
|
21
|
+
* {status === 'paused' && <button onClick={() => resume(fileId)}>Resume</button>}
|
|
22
|
+
* <button onClick={() => cancel(fileId)}>Cancel</button>
|
|
23
|
+
* </div>
|
|
24
|
+
* );
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function useUploadControl(): {
|
|
29
|
+
/** Start uploading a pending file */
|
|
30
|
+
start: (id: string) => Promise<void>;
|
|
31
|
+
/** Pause an uploading file */
|
|
32
|
+
pause: (id: string) => void;
|
|
33
|
+
/** Resume a paused file */
|
|
34
|
+
resume: (id: string) => Promise<void>;
|
|
35
|
+
/** Cancel a file upload */
|
|
36
|
+
cancel: (id: string) => Promise<void>;
|
|
37
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { UploadFile } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Hook for accessing upload file state and filtered lists.
|
|
4
|
+
*
|
|
5
|
+
* Provides:
|
|
6
|
+
* - All files in the upload queue
|
|
7
|
+
* - Filtered lists by status (pending, uploading, completed, failed, paused)
|
|
8
|
+
* - File lookup by ID
|
|
9
|
+
*
|
|
10
|
+
* Use this hook when you only need to display/read file data without controlling uploads.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* function FileList() {
|
|
15
|
+
* const { files, pendingFiles, completedFiles } = useUploadFiles();
|
|
16
|
+
* return (
|
|
17
|
+
* <div>
|
|
18
|
+
* <h3>Pending: {pendingFiles.length}</h3>
|
|
19
|
+
* <ul>{files.map(f => <li key={f.id}>{f.fileName}</li>)}</ul>
|
|
20
|
+
* </div>
|
|
21
|
+
* );
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function useUploadFiles(): {
|
|
26
|
+
/** All files in the upload queue */
|
|
27
|
+
files: UploadFile[];
|
|
28
|
+
/** Get a specific file by ID */
|
|
29
|
+
getFileById: (id: string) => UploadFile | undefined;
|
|
30
|
+
/** Files waiting to be uploaded */
|
|
31
|
+
pendingFiles: UploadFile[];
|
|
32
|
+
/** Files currently uploading */
|
|
33
|
+
uploadingFiles: UploadFile[];
|
|
34
|
+
/** Successfully completed uploads */
|
|
35
|
+
completedFiles: UploadFile[];
|
|
36
|
+
/** Failed uploads */
|
|
37
|
+
failedFiles: UploadFile[];
|
|
38
|
+
/** Paused uploads */
|
|
39
|
+
pausedFiles: UploadFile[];
|
|
40
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { UploadFile, AddFilesOptions } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Hook for file management operations.
|
|
4
|
+
*
|
|
5
|
+
* Provides:
|
|
6
|
+
* - Adding files to the upload queue
|
|
7
|
+
* - Removing individual files
|
|
8
|
+
* - Clearing completed/all files
|
|
9
|
+
*
|
|
10
|
+
* Use this hook when you need to manage the file queue without upload controls.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* function FileInput({ datasetId }: { datasetId: string }) {
|
|
15
|
+
* const { addFiles } = useUploadOperations();
|
|
16
|
+
*
|
|
17
|
+
* return (
|
|
18
|
+
* <input
|
|
19
|
+
* type="file"
|
|
20
|
+
* onChange={(e) =>
|
|
21
|
+
* addFiles(e.target.files, {
|
|
22
|
+
* getHandlers: (file) => ({
|
|
23
|
+
* onGetUploadUrls: (fileName, partCount) =>
|
|
24
|
+
* api.getUploadUrls(datasetId, fileName, partCount),
|
|
25
|
+
* // ... other handlers
|
|
26
|
+
* }),
|
|
27
|
+
* })
|
|
28
|
+
* }
|
|
29
|
+
* />
|
|
30
|
+
* );
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function useUploadOperations(): {
|
|
35
|
+
/** Add files to the upload queue */
|
|
36
|
+
addFiles: (files: FileList | File[], addOptions: AddFilesOptions, runtime?: unknown) => UploadFile[] | undefined;
|
|
37
|
+
/** Remove a file from the queue */
|
|
38
|
+
removeFile: (id: string) => Promise<void>;
|
|
39
|
+
/** Clear all completed files */
|
|
40
|
+
clearCompleted: () => void;
|
|
41
|
+
/** Clear all files */
|
|
42
|
+
clearAll: () => void;
|
|
43
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { AddFilesOptions, UploadFile } from '../types';
|
|
2
|
+
import type { FileWithPath } from '../components/utils/directory-reader';
|
|
3
|
+
/**
|
|
4
|
+
* Main consumer hook for file uploads - Core functionality.
|
|
5
|
+
*
|
|
6
|
+
* This hook provides essential upload API with:
|
|
7
|
+
* - `files` - All files in the upload queue
|
|
8
|
+
* - `start`, `pause`, `resume`, `cancel` - Single file controls
|
|
9
|
+
* - `addFiles`, `removeFile` - File operations
|
|
10
|
+
*
|
|
11
|
+
* Use this hook for the most common upload scenarios.
|
|
12
|
+
* For extended functionality (batch operations, file selectors), use `useUploadExtend`.
|
|
13
|
+
*
|
|
14
|
+
* Global config (chunk sizes, concurrency) comes from UploadProvider.
|
|
15
|
+
* Handlers are provided per-file at selection time via addFiles options,
|
|
16
|
+
* allowing runtime-dependent targets (e.g., different folders/datasets).
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* function MyUploader({ datasetId }: { datasetId: string }) {
|
|
21
|
+
* const { files, addFiles, start, pause } = useUpload();
|
|
22
|
+
*
|
|
23
|
+
* return (
|
|
24
|
+
* <>
|
|
25
|
+
* <input
|
|
26
|
+
* type="file"
|
|
27
|
+
* onChange={(e) =>
|
|
28
|
+
* addFiles(e.target.files, {
|
|
29
|
+
* getHandlers: (file) => ({
|
|
30
|
+
* onGetUploadUrls: (fileName, partCount) =>
|
|
31
|
+
* api.getUploadUrls(datasetId, fileName, partCount),
|
|
32
|
+
* onPartComplete: (fileName, uploadId, partNum) =>
|
|
33
|
+
* api.markPartComplete(datasetId, uploadId, partNum),
|
|
34
|
+
* onFileComplete: (fileName, uploadId) =>
|
|
35
|
+
* api.completeUpload(datasetId, uploadId),
|
|
36
|
+
* }),
|
|
37
|
+
* })
|
|
38
|
+
* }
|
|
39
|
+
* />
|
|
40
|
+
* <div>
|
|
41
|
+
* {files.map(f => (
|
|
42
|
+
* <div key={f.id}>
|
|
43
|
+
* {f.fileName}
|
|
44
|
+
* <button onClick={() => start(f.id)}>Start</button>
|
|
45
|
+
* </div>
|
|
46
|
+
* ))}
|
|
47
|
+
* </div>
|
|
48
|
+
* </>
|
|
49
|
+
* );
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function useUpload(): {
|
|
54
|
+
files: UploadFile[];
|
|
55
|
+
addFiles: (files: FileWithPath[], addOptions: AddFilesOptions, runtime?: unknown) => undefined;
|
|
56
|
+
removeFile: (id: string) => Promise<void>;
|
|
57
|
+
start: (id: string) => Promise<void>;
|
|
58
|
+
pause: (id: string) => void;
|
|
59
|
+
resume: (id: string) => Promise<void>;
|
|
60
|
+
cancel: (id: string) => Promise<void>;
|
|
61
|
+
/** Get a specific file by ID */
|
|
62
|
+
getFileById: (id: string) => UploadFile | undefined;
|
|
63
|
+
/** Files waiting to be uploaded */
|
|
64
|
+
pendingFiles: UploadFile[];
|
|
65
|
+
/** Files currently uploading */
|
|
66
|
+
uploadingFiles: UploadFile[];
|
|
67
|
+
/** Successfully completed uploads */
|
|
68
|
+
successFiles: UploadFile[];
|
|
69
|
+
/** Failed uploads */
|
|
70
|
+
failedFiles: UploadFile[];
|
|
71
|
+
/** Paused uploads */
|
|
72
|
+
pausedFiles: UploadFile[];
|
|
73
|
+
/** Start all pending files */
|
|
74
|
+
startAll: () => Promise<void>;
|
|
75
|
+
/** Pause all uploading files */
|
|
76
|
+
pauseAll: () => void;
|
|
77
|
+
/** Resume all paused files */
|
|
78
|
+
resumeAll: () => Promise<void>;
|
|
79
|
+
/** Cancel all uploads */
|
|
80
|
+
cancelAll: () => void;
|
|
81
|
+
/** Clear all succeeded files */
|
|
82
|
+
clearSucceeded: () => Promise<void>;
|
|
83
|
+
/** Clear all files */
|
|
84
|
+
clearAll: () => Promise<void>;
|
|
85
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { UploadProvider } from './context/upload-provider';
|
|
2
|
+
export { Uploader as FileUploader } from './components/uploader';
|
|
3
|
+
export { UploaderDropZone } from './components/uploader-drop-zone';
|
|
4
|
+
export { UploaderFileListLayout } from './components/uploader-file-list';
|
|
5
|
+
export { UploaderFileItem } from './components/uploader-file-item';
|
|
6
|
+
export { useUpload } from './hooks/use-upload';
|
|
7
|
+
export type { UploadFile, ChunkState, UploadHandlers, CallbackResult, GetUploadUrlsResult, UploadUrl, UploadConfig, AddFilesOptions, } from './types';
|
|
8
|
+
export type { DropZoneError, UploaderDropZoneClassNames, UploaderDropZoneProps, } from './components/uploader-drop-zone';
|
|
9
|
+
export type { FileWithPath } from './components/utils/directory-reader';
|
|
10
|
+
export type { FileListClassNames } from './components/uploader-file-list';
|
|
11
|
+
export type { UploaderFileItemClassNames } from './components/uploader-file-item';
|
|
12
|
+
export { UploadStatus } from './constants';
|
|
13
|
+
export type { UploadStatusType } from './constants';
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Blob Store - IndexedDB storage for file blobs
|
|
3
|
+
*
|
|
4
|
+
* This store handles file blob persistence for the 'indexeddb' mode.
|
|
5
|
+
* Separate from metadata storage for cleaner data management and quota handling.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* File Blob Store class for file data persistence
|
|
9
|
+
*/
|
|
10
|
+
export declare class FileBlobStore {
|
|
11
|
+
private prefix;
|
|
12
|
+
private db;
|
|
13
|
+
constructor(prefix?: string);
|
|
14
|
+
/**
|
|
15
|
+
* Initialize the store (open database connection)
|
|
16
|
+
*/
|
|
17
|
+
initialize(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Ensure database is initialized
|
|
20
|
+
*/
|
|
21
|
+
private ensureDb;
|
|
22
|
+
/**
|
|
23
|
+
* Save a file blob
|
|
24
|
+
* @param fileId - Unique file identifier
|
|
25
|
+
* @param file - File object to store
|
|
26
|
+
*/
|
|
27
|
+
saveBlob(fileId: string, file: File): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Get a file by ID
|
|
30
|
+
* @param fileId - Unique file identifier
|
|
31
|
+
* @returns Reconstructed File object or null
|
|
32
|
+
*/
|
|
33
|
+
getFile(fileId: string): Promise<File | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a file blob exists
|
|
36
|
+
*/
|
|
37
|
+
hasBlob(fileId: string): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Delete a file blob
|
|
40
|
+
*/
|
|
41
|
+
deleteBlob(fileId: string): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Delete multiple file blobs
|
|
44
|
+
*/
|
|
45
|
+
deleteMany(fileIds: string[]): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Clear all blobs
|
|
48
|
+
*/
|
|
49
|
+
clearAll(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Get all stored file IDs
|
|
52
|
+
*/
|
|
53
|
+
getAllIds(): Promise<string[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Estimate storage usage for blobs
|
|
56
|
+
* @returns Estimated bytes used
|
|
57
|
+
*/
|
|
58
|
+
estimateUsage(): Promise<number>;
|
|
59
|
+
/**
|
|
60
|
+
* Close the database connection
|
|
61
|
+
*/
|
|
62
|
+
close(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Delete the entire database (for mode switching)
|
|
65
|
+
*/
|
|
66
|
+
deleteDatabase(): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Default singleton instance
|
|
70
|
+
*/
|
|
71
|
+
export declare const fileBlobStore: FileBlobStore;
|