import * as Dialog from '@radix-ui/react-dialog' import * as HoverCard from '@radix-ui/react-hover-card' import { useCallback, useEffect, useMemo, useState } from 'preact/hooks' import { useTranslation } from 'react-i18next' import { exportToHtml } from '../exporter/html' import { exportToPng } from '../exporter/image' import { exportToJson, exportToOoba, exportToTavern } from '../exporter/json' import { exportToMarkdown } from '../exporter/markdown' import { exportToText } from '../exporter/text' import { useWindowResize } from '../hooks/useWindowResize' import { Divider } from './Divider' import { ExportDialog } from './ExportDialog' import { FileCode, IconArrowRightFromBracket, IconCamera, IconCopy, IconJSON, IconMarkdown, IconSetting, IconZip } from './Icons' import { MenuItem } from './MenuItem' import { SettingProvider, useSettingContext } from './SettingContext' import { SettingDialog } from './SettingDialog' import '../style.css' import './Dialog.css' function MenuInner({ container }: { container: HTMLDivElement }) { const { t } = useTranslation() const [open, setOpen] = useState(false) const [jsonOpen, setJsonOpen] = useState(false) const [exportOpen, setExportOpen] = useState(false) const [settingOpen, setSettingOpen] = useState(false) const { format, enableTimestamp, timeStamp24H, enableMeta, exportMetaList, } = useSettingContext() useEffect(() => { if (enableTimestamp) { document.body.setAttribute('data-time-format', timeStamp24H ? '24' : '12') } else { document.body.removeAttribute('data-time-format') } }, [enableTimestamp, timeStamp24H]) const metaList = useMemo(() => enableMeta ? exportMetaList : [], [enableMeta, exportMetaList]) const onClickText = useCallback(() => exportToText(), []) const onClickPng = useCallback(() => exportToPng(format), [format]) const onClickMarkdown = useCallback(() => exportToMarkdown(format, metaList), [format, metaList]) const onClickHtml = useCallback(() => exportToHtml(format, metaList), [format, metaList]) const onClickJSON = useCallback(() => { setJsonOpen(true) return true }, []) const onClickOfficialJSON = useCallback(() => exportToJson(format), [format]) const onClickTavern = useCallback(() => exportToTavern(format), [format]) const onClickOoba = useCallback(() => exportToOoba(format), [format]) const width = useWindowResize(() => window.innerWidth) const isMobile = width < 768 const Portal = isMobile ? 'div' : HoverCard.Portal return ( <> {isMobile && open && (
setOpen(false)} >
)} { setOpen(true) return true }} />
{t('JSON')}
{!isMobile && ( )}
) } export function Menu({ container }: { container: HTMLDivElement }) { return ( ) }