'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 ( ) }