Skip to content

Commit 48c9cde

Browse files
committed
export files
1 parent bc0ee21 commit 48c9cde

File tree

5 files changed

+50
-30
lines changed

5 files changed

+50
-30
lines changed

src/frontend/UpupUploader.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { forwardRef, useImperativeHandle } from 'react'
22
import { TbLoader } from 'react-icons/tb/index.js'
33
import { devinoDark, devinoLight, logoDark, logoLight } from '../assets/logos'
4-
import { FileWithProgress, UpupUploaderProps } from '../shared/types'
4+
import { FileWithParams, UpupUploaderProps } from '../shared/types'
55
import DefaultLoaderIcon from './components/DefaultLoaderIcon'
66
import MainBox from './components/MainBox'
77
import ShouldRender from './components/shared/ShouldRender'
@@ -13,12 +13,15 @@ import { cn } from './lib/tailwind'
1313
export type UpupUploaderRef = {
1414
useUpload(): {
1515
error?: string
16-
files: Array<FileWithProgress>
16+
files: FileWithParams[]
1717
loading: boolean
1818
progress: number
1919
upload(): Promise<string[] | undefined>
20+
dynamicUpload(
21+
files: File[] | FileWithParams[],
22+
): Promise<string[] | undefined>
2023
setFiles(newFiles: File[]): void
21-
dynamicallyReplaceFiles(files: File[]): void
24+
dynamicallyReplaceFiles(files: File[] | FileWithParams[]): void
2225
}
2326
}
2427

@@ -35,6 +38,7 @@ export default forwardRef<UpupUploaderRef, UpupUploaderProps>(
3538
upload: providerValues.upload,
3639
files: providerValues.files,
3740
setFiles: providerValues.setFiles,
41+
dynamicUpload: providerValues.dynamicUpload,
3842
dynamicallyReplaceFiles: providerValues.dynamicallyReplaceFiles,
3943
})
4044

src/frontend/context/RootContext.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ export interface IRootContext {
6262

6363
files: Map<string, FileWithParams>
6464
setFiles: (newFiles: File[]) => void
65-
dynamicallyReplaceFiles: (files: File[]) => void
65+
dynamicallyReplaceFiles: (files: File[] | FileWithParams[]) => void
66+
dynamicUpload: (
67+
files: File[] | FileWithParams[],
68+
) => Promise<string[] | undefined>
6669
isAddingMore: boolean
6770
setIsAddingMore: Dispatch<SetStateAction<boolean>>
6871

src/frontend/hooks/useRootProvider.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,27 @@ export default function useRootProvider({
122122
}),
123123
[warningHandler, toastContainerId],
124124
)
125+
function isFileWithParamsArray(
126+
files: File[] | FileWithParams[],
127+
): files is FileWithParams[] {
128+
return files.length > 0 && 'id' in files[0]
129+
}
130+
async function dynamicUpload(files: File[] | FileWithParams[]) {
131+
dynamicallyReplaceFiles(files)
132+
return await proceedUpload()
133+
}
134+
function dynamicallyReplaceFiles(files: File[] | FileWithParams[]) {
135+
const filesMap = new Map<string, FileWithParams>()
125136

126-
const dynamicallyReplaceFiles = (files: File[]) => {
127-
const filesMap = new Map()
128-
for (const file of files) {
129-
const fileWithParams = fileAppendParams(file)
130-
filesMap.set(fileWithParams.id, fileWithParams)
137+
if (isFileWithParamsArray(files)) {
138+
for (const f of files) {
139+
filesMap.set(f.id, f)
140+
}
141+
} else {
142+
for (const f of files) {
143+
const fileWithParams = fileAppendParams(f)
144+
filesMap.set(fileWithParams.id, fileWithParams)
145+
}
131146
}
132147
setSelectedFilesMap(filesMap)
133148
}
@@ -216,7 +231,6 @@ export default function useRootProvider({
216231
},
217232
[onPrepareFiles],
218233
)
219-
220234
const proceedUpload = async () => {
221235
if (!selectedFilesMap.size) return
222236

@@ -309,6 +323,7 @@ export default function useRootProvider({
309323
setIsAddingMore,
310324
files: selectedFilesMap,
311325
setFiles: handleSetSelectedFiles,
326+
dynamicUpload,
312327
dynamicallyReplaceFiles,
313328
handleDone,
314329
handleFileRemove,

src/frontend/hooks/useUpload.ts

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,28 @@ export default function useUpload({
55
files,
66
setFiles,
77
dynamicallyReplaceFiles,
8+
dynamicUpload,
89
}: Pick<
910
IRootContext,
10-
'upload' | 'files' | 'setFiles' | 'dynamicallyReplaceFiles'
11+
| 'upload'
12+
| 'files'
13+
| 'setFiles'
14+
| 'dynamicallyReplaceFiles'
15+
| 'dynamicUpload'
1116
>) {
12-
const {
13-
proceedUpload,
14-
filesProgressMap,
15-
uploadStatus,
16-
uploadError,
17-
totalProgress,
18-
} = upload || {}
17+
const { proceedUpload, uploadStatus, uploadError, totalProgress } =
18+
upload || {}
1919

2020
return {
2121
upload: proceedUpload,
22-
files: Array.from(files.values()).map(file => {
23-
const progressObject = filesProgressMap?.[file.id]
24-
const progress = progressObject?.total
25-
? Math.round(progressObject?.loaded / progressObject.total)
26-
: 0
27-
28-
return {
29-
...file,
30-
progress,
31-
}
32-
}),
3322
loading: uploadStatus === UploadStatus.ONGOING,
3423
error: uploadError,
3524
progress: totalProgress,
25+
files: Array.from(files.values()).map(file => {
26+
return file
27+
}),
3628
setFiles,
3729
dynamicallyReplaceFiles,
30+
dynamicUpload,
3831
}
3932
}

stories/UploaderWithHooks.stories.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'
22
import React, { useEffect, useRef, useState } from 'react'
33
import UpupUploader, { UpupUploaderRef } from '../src/frontend/UpupUploader'
44
import {
5+
FileWithParams,
56
FileWithProgress,
67
UploadAdapter,
78
UpupProvider,
@@ -53,9 +54,12 @@ const meta = {
5354
loading: false,
5455
progress: 0,
5556
upload: async () => [],
57+
dynamicUpload(
58+
files: File[] | FileWithParams[],
59+
): Promise<string[] | undefined> {},
5660
error: undefined,
5761
setFiles(newFiles: File[]) {},
58-
dynamicallyReplaceFiles(files: File[]) {},
62+
dynamicallyReplaceFiles(files: File[] | FileWithParams[]) {},
5963
})
6064

6165
// Track files directly instead of through a derived value
@@ -121,6 +125,7 @@ const meta = {
121125
onFilesSelected={() => {
122126
// Use setTimeout to ensure we get the updated state after React has processed the file selection
123127
setTimeout(refreshUploadData, 0)
128+
console.log(ref?.current?.useUpload()?.files)
124129
}}
125130
onError={() => {
126131
// Use setTimeout to ensure we get the updated state after React has processed the error

0 commit comments

Comments
 (0)