import { ArrowBack, X } from "@styled-icons/boxicons-regular"; import { Helmet } from "react-helmet"; import { useHistory, useParams } from "react-router-dom"; import styles from "./Settings.module.scss"; import classNames from "classnames"; import { Text } from "preact-i18n"; import { useCallback, useEffect, useRef, useState } from "preact/hooks"; import { Category, Header, IconButton, LineDivider } from "@revoltchat/ui"; import { isTouchscreenDevice } from "../../lib/isTouchscreenDevice"; import { useApplicationState } from "../../mobx/State"; import ButtonItem from "../../components/navigation/items/ButtonItem"; import { modalController } from "../../controllers/modals/ModalController"; interface Props { pages: { category?: Children; divider?: boolean; id: string; icon: Children; title: Children; hidden?: boolean; hideTitle?: boolean; }[]; custom?: Children; children: Children; defaultPage: string; showExitButton?: boolean; switchPage: (to?: string) => void; category: "pages" | "channel_pages" | "server_pages"; indexHeader?: Children; } export function GenericSettings({ pages, switchPage, category, custom, children, defaultPage, showExitButton, indexHeader, }: Props) { const history = useHistory(); const state = useApplicationState(); const theme = state.settings.theme; const { page } = useParams<{ page: string }>(); const [closing, setClosing] = useState(false); const exitSettings = useCallback(() => { setClosing(true); setTimeout(() => { history.replace(state.layout.getLastPath()); }, 200); }, [history]); useEffect(() => { function keyDown(e: KeyboardEvent) { if (e.key === "Escape") { if (modalController.isVisible) return; exitSettings(); } } document.body.addEventListener("keydown", keyDown); return () => document.body.removeEventListener("keydown", keyDown); }, [exitSettings]); const pageRef = useRef(); return (
{isTouchscreenDevice && (
{typeof page === "undefined" ? ( <> {showExitButton && ( )} ) : ( <> switchPage()}> )}
)} {(!isTouchscreenDevice || typeof page === "undefined") && (
{isTouchscreenDevice && indexHeader} {pages.map((entry, i) => entry.hidden ? undefined : ( <> {entry.category && ( {entry.category} )} switchPage(entry.id)} compact> {entry.icon} {entry.title} {entry.divider && ( )} ), )} {custom}
)} {(!isTouchscreenDevice || typeof page === "string") && (
{ // Force scroll to top if page changes. if (ref) { if (pageRef.current !== page) { ref.scrollTop = 0; pageRef.current = page; } } }}>
{!isTouchscreenDevice && !pages.find( (x) => x.id === page && x.hideTitle, ) && (

)} {children}
{!isTouchscreenDevice && (
)}
)}
); }