Files
drive/apps/drive-web/src/files/store.ts

101 lines
2.4 KiB
TypeScript
Raw Normal View History

2025-11-08 23:17:36 +00:00
import type { FileSystemHandle } from "@fileone/convex/filesystem"
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 fileUploadStatusesAtom = 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(fileUploadStatusesAtom)[id],
(get, set, status: FileUploadStatus) => {
const fileUploads = { ...get(fileUploadStatusesAtom) }
fileUploads[id] = status
set(fileUploadStatusesAtom, fileUploads)
2025-10-12 00:43:31 +00:00
},
),
)
export const clearFileUploadStatusesAtom = atom(
null,
(get, set, ids: string[]) => {
const fileUploads = { ...get(fileUploadStatusesAtom) }
for (const id of ids) {
if (fileUploads[id]) {
delete fileUploads[id]
}
fileUploadStatusAtomFamily.remove(id)
}
set(fileUploadStatusesAtom, fileUploads)
},
)
2025-11-08 18:41:30 +00:00
export const clearAllFileUploadStatusesAtom = atom(null, (_, set) => {
set(fileUploadStatusesAtom, {})
})
export const fileUploadCountAtom = atom(
(get) => Object.keys(get(fileUploadStatusesAtom)).length,
2025-10-12 00:43:31 +00:00
)
export const inProgressFileUploadCountAtom = atom((get) => {
const statuses = get(fileUploadStatusesAtom)
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(fileUploadStatusesAtom)
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(fileUploadStatusesAtom)
for (const status in statuses) {
if (statuses[status]?.kind === FileUploadStatusKind.Error) {
return true
}
}
return false
})
2025-11-08 23:17:36 +00:00
export const cutHandlesAtom = atom<FileSystemHandle[]>([])
export const clearCutItemsAtom = atom(null, (_, set) => {
set(cutHandlesAtom, [])
})