import {useForm} from 'react-hook-form'; import {Fragment, ReactElement, useState} from 'react'; import clsx from 'clsx'; import {m} from 'framer-motion'; import {getLocalTimeZone, now} from '@internationalized/date'; import {Button} from '@common/ui/buttons/button'; import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field'; import {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer'; import type {ShareDialogActivePanel} from '../share-dialog'; import {useEntryShareableLink} from '../../shareable-link/queries/use-entry-shareable-link'; import {Form} from '@common/ui/forms/form'; import { UpdateShareableLinkPayload, useUpdateShareableLink, } from '../../shareable-link/queries/use-update-shareable-link'; import {FormSwitch, Switch} from '@common/ui/forms/toggle/switch'; import {toast} from '@common/ui/toast/toast'; import {useDialogContext} from '@common/ui/overlays/dialog/dialog-context'; import {DialogHeader} from '@common/ui/overlays/dialog/dialog-header'; import {DialogBody} from '@common/ui/overlays/dialog/dialog-body'; import {FormDatePicker} from '@common/ui/forms/input-field/date/date-picker/date-picker'; import {useTrans} from '@common/i18n/use-trans'; import {Trans} from '@common/i18n/trans'; import {message} from '@common/i18n/message'; import {FileEntry} from '@common/uploads/file-entry'; interface LinkSettingsDialogProps { className?: string; setActivePanel: (name: ShareDialogActivePanel) => void; entry: FileEntry; } export function LinkSettingsDialog({ className, setActivePanel, entry, }: LinkSettingsDialogProps) { const {formId} = useDialogContext(); const {data} = useEntryShareableLink(entry.id); const link = data?.link; const form = useForm({ defaultValues: { allowDownload: link?.allow_download, allowEdit: link?.allow_edit, expiresAt: link?.expires_at, entryId: entry.id, }, }); const updateLink = useUpdateShareableLink(form); return ( { setActivePanel('main'); }} >
{ updateLink.mutate(value, { onSuccess: () => { setActivePanel('main'); toast(message('Link settings saved')); }, }); }} >
); } const minDate = now(getLocalTimeZone()); interface LinkExpirationOptionProps { showField: boolean; } function LinkExpirationOption({ showField: showFieldDefault, }: LinkExpirationOptionProps) { const {trans} = useTrans(); const [showField, setShowField] = useState(showFieldDefault); return (
{ setShowField(e.target.checked); }} > {showField && ( )}
); } interface LinkPasswordOptionProps { showField: boolean; } function LinkPasswordOption({ showField: showFieldDefault, }: LinkPasswordOptionProps) { const {trans} = useTrans(); const [showField, setShowField] = useState(showFieldDefault); return (
{ setShowField(e.target.checked); }} > {showField && ( } placeholder={trans({ message: 'Enter new password...', })} /> )}
); } interface LinkOptionProps { children: [ReactElement, ReactElement]; showBorder?: boolean; } function LinkOption({children, showBorder = true}: LinkOptionProps) { const [title, content] = children; return (
{title}
{content}
); }