'use client'
import React, { JSX, useCallback, useState } from 'react'
import WebRTCPeerProvider from '../components/WebRTCProvider'
import DropZone from '../components/DropZone'
import UploadFileList from '../components/UploadFileList'
import Uploader from '../components/Uploader'
import PasswordField from '../components/PasswordField'
import StartButton from '../components/StartButton'
import { UploadedFile } from '../types'
import Spinner from '../components/Spinner'
import Wordmark from '../components/Wordmark'
import CancelButton from '../components/CancelButton'
import { useMemo } from 'react'
import { getFileName } from '../fs'
import TitleText from '../components/TitleText'
import { pluralize } from '../utils/pluralize'
import TermsAcceptance from '../components/TermsAcceptance'
import AddFilesButton from '../components/AddFilesButton'
function PageWrapper({ children }: { children: React.ReactNode }): JSX.Element {
return (
{children}
)
}
function InitialState({
onDrop,
}: {
onDrop: (files: UploadedFile[]) => void
}): JSX.Element {
return (
Peer-to-peer file transfers in your browser.
)
}
function useUploaderFileListData(uploadedFiles: UploadedFile[]) {
return useMemo(() => {
return uploadedFiles.map((item) => ({
fileName: getFileName(item),
type: item.type,
}))
}, [uploadedFiles])
}
function ConfirmUploadState({
uploadedFiles,
password,
onChangePassword,
onCancel,
onStart,
onRemoveFile,
onAddFiles,
}: {
uploadedFiles: UploadedFile[]
password: string
onChangePassword: (pw: string) => void
onCancel: () => void
onStart: () => void
onRemoveFile: (index: number) => void
onAddFiles: (files: UploadedFile[]) => void
}): JSX.Element {
const fileListData = useUploaderFileListData(uploadedFiles)
return (
You are about to start uploading{' '}
{pluralize(uploadedFiles.length, 'file', 'files')}.
)
}
function UploadingState({
uploadedFiles,
password,
onStop,
}: {
uploadedFiles: UploadedFile[]
password: string
onStop: () => void
}): JSX.Element {
const fileListData = useUploaderFileListData(uploadedFiles)
return (
You are uploading {pluralize(uploadedFiles.length, 'file', 'files')}.
)
}
export default function UploadPage(): JSX.Element {
const [uploadedFiles, setUploadedFiles] = useState([])
const [password, setPassword] = useState('')
const [uploading, setUploading] = useState(false)
const handleDrop = useCallback((files: UploadedFile[]): void => {
setUploadedFiles(files)
}, [])
const handleChangePassword = useCallback((pw: string) => {
setPassword(pw)
}, [])
const handleStart = useCallback(() => {
setUploading(true)
}, [])
const handleStop = useCallback(() => {
setUploading(false)
}, [])
const handleCancel = useCallback(() => {
setUploadedFiles([])
setUploading(false)
}, [])
const handleRemoveFile = useCallback((index: number) => {
setUploadedFiles((fs) => fs.filter((_, i) => i !== index))
}, [])
const handleAddFiles = useCallback((files: UploadedFile[]) => {
setUploadedFiles((fs) => [...fs, ...files])
}, [])
if (!uploadedFiles.length) {
return
}
if (!uploading) {
return (
)
}
return (
)
}