Files
drive/packages/web/src/files/store.ts

98 lines
2.2 KiB
TypeScript
Raw Normal View History

2025-10-12 00:43:31 +00:00
import { atom } from "jotai"
import { atomFamily } from "jotai/utils"
export enum FileUploadStatusKind {
InProgress = "InProgress",
Error = "Error",
Success = "Success",
}
export type FileUploadInProgress = {
kind: FileUploadStatusKind.InProgress
2025-10-12 00:43:31 +00:00
progress: number
}
export type FileUploadError = {
kind: FileUploadStatusKind.Error
error: unknown
}
export type FileUploadSuccess = {
kind: FileUploadStatusKind.Success
}
export type FileUploadStatus =
| FileUploadInProgress
| FileUploadError
| FileUploadSuccess
export const fileUploadsAtom = atom<Record<string, FileUploadStatus>>({})
2025-10-12 00:43:31 +00:00
export const fileUploadStatusAtomFamily = atomFamily((id: string) =>
2025-10-12 00:43:31 +00:00
atom(
(get) => get(fileUploadsAtom)[id],
(get, set, status: FileUploadStatus) => {
2025-10-12 00:43:31 +00:00
const fileUploads = { ...get(fileUploadsAtom) }
fileUploads[id] = status
2025-10-12 00:43:31 +00:00
set(fileUploadsAtom, fileUploads)
},
),
)
export const clearFileUploadAtom = atom(null, (get, set, id: string) => {
const fileUploads = { ...get(fileUploadsAtom) }
delete fileUploads[id]
fileUploadStatusAtomFamily.remove(id)
2025-10-12 00:43:31 +00:00
set(fileUploadsAtom, fileUploads)
})
export const clearFileUploadStatusesAtom = atom(
null,
(get, set, ids: string[]) => {
const fileUploads = { ...get(fileUploadsAtom) }
for (const id of ids) {
if (fileUploads[id]) {
delete fileUploads[id]
}
fileUploadStatusAtomFamily.remove(id)
}
set(fileUploadsAtom, fileUploads)
},
)
export const fileUploadCountAtom = atom(
(get) => Object.keys(get(fileUploadsAtom)).length,
2025-10-12 00:43:31 +00:00
)
export const inProgressFileUploadCountAtom = atom((get) => {
const statuses = get(fileUploadsAtom)
let count = 0
for (const status in statuses) {
if (statuses[status]?.kind === FileUploadStatusKind.InProgress) {
count += 1
}
}
return count
})
export const successfulFileUploadCountAtom = atom((get) => {
const statuses = get(fileUploadsAtom)
let count = 0
for (const status in statuses) {
if (statuses[status]?.kind === FileUploadStatusKind.Success) {
count += 1
}
}
return count
})
export const hasFileUploadsErrorAtom = atom((get) => {
const statuses = get(fileUploadsAtom)
for (const status in statuses) {
if (statuses[status]?.kind === FileUploadStatusKind.Error) {
return true
}
}
return false
})