-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathuploads-section.tsx
More file actions
112 lines (103 loc) · 3.11 KB
/
uploads-section.tsx
File metadata and controls
112 lines (103 loc) · 3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import { type DataSetWithPieces, type UseProvidersResult, useUpload } from '@filoz/synapse-react'
import { useEffect, useState } from 'react'
import { ErrorAlert, HashAlert } from '../custom-ui/alerts.tsx'
import { ButtonLoading } from '../custom-ui/button-loading.tsx'
import { Label } from '../ui/label.tsx'
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectTrigger,
SelectValue,
} from '../ui/select.tsx'
import { Skeleton } from '../ui/skeleton.tsx'
import { UploadsZone } from './uploads-zone.tsx'
export function UploadsSection({
dataSets,
providers,
}: {
dataSets?: DataSetWithPieces[]
providers?: UseProvidersResult
}) {
const [hash, setHash] = useState<string | null>(null)
const [dataSet, setDataSet] = useState<string | undefined>(undefined)
const [files, setFiles] = useState<File[] | undefined>()
const providerWithDataSets = providers?.map((provider) => ({
...provider,
dataSets: dataSets?.filter((d) => d.providerId === provider.id),
}))
useEffect(() => {
if (!dataSet && dataSets && dataSets.length > 0) {
setDataSet(dataSets[0].dataSetId.toString())
}
}, [dataSets])
const {
mutate: upload,
isPending: isUploading,
error: uploadError,
} = useUpload({
onHash: (hash) => {
setHash(hash)
},
mutation: {
onSettled: () => {
setHash(null)
setFiles(undefined)
},
},
})
const handleDrop = (files: File[]) => {
setFiles(files)
}
function onSubmit(e: React.FormEvent<HTMLFormElement>) {
e.preventDefault()
if (files && files.length > 0 && dataSet) {
// upload({
// files: Array.from(fileInput.files),
// dataSetId,
// sessionKey: sessionKey,
// })
upload({ files: Array.from(files), dataSetId: BigInt(dataSet) })
}
}
return dataSet ? (
<form onSubmit={onSubmit}>
<div className="flex flex-col gap-3 my-4">
<Label htmlFor="data-set">Data Set</Label>
<Select
name="data-set"
onValueChange={(value) => {
setDataSet(value)
}}
value={dataSet}
>
<SelectTrigger className="w-[280px]">
<SelectValue placeholder="Select a data set" />
</SelectTrigger>
<SelectContent>
{providerWithDataSets?.map((provider) => (
<SelectGroup key={provider.id}>
<SelectLabel>{provider.name}</SelectLabel>
{provider.dataSets?.map((dataSet) => (
<SelectItem key={dataSet.dataSetId} value={dataSet.dataSetId.toString()}>
# {dataSet.dataSetId} {dataSet.cdn ? 'CDN' : ''}
</SelectItem>
))}
</SelectGroup>
))}
</SelectContent>
</Select>
<UploadsZone files={files} handleDrop={handleDrop} />
<ButtonLoading disabled={!dataSet} loading={isUploading} type="submit">
Upload
</ButtonLoading>
<ErrorAlert error={uploadError} />
<HashAlert hash={hash} />
</div>
</form>
) : (
<Skeleton className="w-full h-50" />
)
}