'use client'; import { useState } from 'react'; import { Button, Drawer } from '@mantine/core'; import { useWindowEvent } from '@mantine/hooks'; import { RiArticleLine } from 'react-icons/ri'; import useReaderContent from '../../lib/queries/useReaderContent'; import useReaderLinks from '../../lib/useReaderLinks'; import { ReaderLinkProvider, useReaderLinkReducer, } from '../../lib/readerLinkState'; import ReaderArticle from '../ReaderArticle/ReaderArticle'; import ReaderToolbar from '../ReaderToolbar/ReaderToolbar'; import ReaderLinksDrawer from '../ReaderLinksDrawer/ReaderLinksDrawer'; import { DEFAULT_READER_SETTINGS } from '../ReaderTextSettings/ReaderTextSettings'; import { trackSembleAction } from '@/features/semble/lib/analytics'; import { useSembleNavigation } from '@/features/semble/lib/sembleNavigation'; interface Props { url: string; } export default function ReaderButton(props: Props) { const [opened, setOpened] = useState(false); const [linksOpen, setLinksOpen] = useState(false); const [settings, setSettings] = useState(DEFAULT_READER_SETTINGS); const [linkState, dispatchLink] = useReaderLinkReducer(); // Hide while following a link so the page skeleton shows; the reader // remounts on the new page const isNavigating = useSembleNavigation()?.isNavigating; const reader = useReaderContent({ url: props.url, enabled: opened }); // Extracted from the original content so the list keeps working while // the show-links toggle is off const links = useReaderLinks(reader.data?.content ?? '', props.url); const closeReader = () => { setOpened(false); dispatchLink({ type: 'reset' }); }; // Popovers never hold focus, so Escape is handled here useWindowEvent('keydown', (e) => { if (e.key === 'Escape' && linkState.activeId !== null) { dispatchLink({ type: 'dismiss' }); } }); return ( setLinksOpen(true)} onClose={closeReader} /> setLinksOpen(false)} links={links} articleUrl={props.url} /> ); }