|
import { Form, Input, Layout, Modal, Spin } from 'antd' |
|
import React, { useEffect, useState } from 'react' |
|
import { RouteComponentProps, useHistory } from 'react-router' |
|
import useSWR from 'swr' |
|
import useSWRImmutable from 'swr/immutable' |
|
import { fetcher } from '../../utils/Fetcher' |
|
import Error from './components/Error' |
|
import TableFiles from './components/TableFiles' |
|
import Viewer from './components/Viewer' |
|
import { useDebounce } from 'use-debounce/lib' |
|
|
|
interface PageProps extends RouteComponentProps<{ |
|
id: string |
|
}> {} |
|
|
|
const View: React.FC<PageProps & { isInDrawer?: boolean, onCloseDrawer?: () => void }> = ({ match, isInDrawer, onCloseDrawer }) => { |
|
const [openPassModal, setOpenPassModal] = useState<boolean>(false) |
|
const history = useHistory() |
|
const [paramId] = useDebounce(match.params.id, 250) |
|
const { data: me } = useSWRImmutable('/users/me', fetcher) |
|
const { data, error, mutate } = useSWR(paramId || match.params.id ? `/files/${paramId || match.params.id}?password=${sessionStorage.getItem(`pass-${paramId || match.params.id}`)}` : null, fetcher) |
|
const [form] = Form.useForm() |
|
|
|
useEffect(() => { |
|
if (error?.status === 400) { |
|
setOpenPassModal(true) |
|
} |
|
}, [error]) |
|
|
|
useEffect(() => { |
|
if (data?.file.type === 'folder') { |
|
if (me?.user) { |
|
if (data.file.user_id === me.user.id) { |
|
return history.replace(`/dashboard?parent=${data.file.id}`) |
|
} else if (data.file.shared_options?.includes(me.user.id)) { |
|
return history.replace(`/dashboard/shared?parent=${data.file.id}`) |
|
} |
|
} else if (data.file.sharing_options?.includes('*')) { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
} |
|
}, [data, me]) |
|
|
|
const submit = () => { |
|
const { password } = form.getFieldsValue() |
|
sessionStorage.setItem(`pass-${paramId || match.params.id}`, password) |
|
mutate() |
|
setOpenPassModal(false) |
|
} |
|
|
|
return <> |
|
{!data && !error |
|
? <Layout style={{ paddingTop: '45vh', minHeight: '100vh' }}><Spin /></Layout> |
|
: error || data && data.file.upload_progress !== null |
|
? <Error error={error} me={me} /> |
|
: data?.file.type === 'folder' && data?.file.sharing_options?.includes('*') |
|
? <TableFiles me={me} data={data} /> |
|
: <Viewer isInDrawer={isInDrawer} onCloseDrawer={onCloseDrawer} me={me} data={data} error={error} mutate={mutate} pageParams={match.params} />} |
|
<Modal title="Input your password" visible={openPassModal} onCancel={() => setOpenPassModal(false)} okText="Open" onOk={submit}> |
|
<Form form={form} layout="vertical" onFinish={submit}> |
|
<Form.Item name="password" label="Password"> |
|
<Input.Password /> |
|
</Form.Item> |
|
</Form> |
|
</Modal> |
|
</> |
|
} |
|
|
|
export default View |