import { observer } from 'mobx-react-lite'; import { useCloseOnClickOutside } from '@/components/utils'; import { AppState } from '@/ui_models/app_state'; import { WebApplication } from '@/ui_models/application'; import { useRef, useState } from 'preact/hooks'; import { GeneralAccountMenu } from './GeneralAccountMenu'; import { FunctionComponent } from 'preact'; import { SignInPane } from './SignIn'; import { CreateAccount } from './CreateAccount'; import { ConfirmPassword } from './ConfirmPassword'; import { JSXInternal } from 'preact/src/jsx'; import { ApplicationGroup } from '@/ui_models/application_group'; export enum AccountMenuPane { GeneralMenu, SignIn, Register, ConfirmPassword, } type Props = { appState: AppState; application: WebApplication; onClickOutside: () => void; mainApplicationGroup: ApplicationGroup; }; type PaneSelectorProps = { appState: AppState; application: WebApplication; mainApplicationGroup: ApplicationGroup; menuPane: AccountMenuPane; setMenuPane: (pane: AccountMenuPane) => void; closeMenu: () => void; }; const MenuPaneSelector: FunctionComponent = observer( ({ application, appState, menuPane, setMenuPane, closeMenu, mainApplicationGroup, }) => { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); switch (menuPane) { case AccountMenuPane.GeneralMenu: return ( ); case AccountMenuPane.SignIn: return ( ); case AccountMenuPane.Register: return ( ); case AccountMenuPane.ConfirmPassword: return ( ); } } ); export const AccountMenu: FunctionComponent = observer( ({ application, appState, onClickOutside, mainApplicationGroup }) => { const { currentPane, setCurrentPane, shouldAnimateCloseMenu, closeAccountMenu, } = appState.accountMenu; const ref = useRef(null); useCloseOnClickOutside(ref, () => { onClickOutside(); }); const handleKeyDown: JSXInternal.KeyboardEventHandler = ( event ) => { switch (event.key) { case 'Escape': if (currentPane === AccountMenuPane.GeneralMenu) { closeAccountMenu(); } else if (currentPane === AccountMenuPane.ConfirmPassword) { setCurrentPane(AccountMenuPane.Register); } else { setCurrentPane(AccountMenuPane.GeneralMenu); } break; } }; return (
); } );