import { WebApplication } from '@/Application/Application' import { ViewControllerManager } from '@/Controllers/ViewControllerManager' import { observer } from 'mobx-react-lite' import { ChangeEventHandler, FunctionComponent, ReactNode, useCallback, useEffect, useState } from 'react' import Checkbox from '@/Components/Checkbox/Checkbox' import DecoratedInput from '@/Components/Input/DecoratedInput' import Icon from '@/Components/Icon/Icon' type Props = { application: WebApplication viewControllerManager: ViewControllerManager disabled?: boolean onPrivateUsernameModeChange?: (isPrivate: boolean, identifier?: string) => void onStrictSignInChange?: (isStrictSignIn: boolean) => void children?: ReactNode } const AdvancedOptions: FunctionComponent = ({ viewControllerManager, application, disabled = false, onPrivateUsernameModeChange, onStrictSignInChange, children, }) => { const { server, setServer, enableServerOption, setEnableServerOption } = viewControllerManager.accountMenuController const [showAdvanced, setShowAdvanced] = useState(false) const [isPrivateUsername, setIsPrivateUsername] = useState(false) const [privateUsername, setPrivateUsername] = useState('') const [isStrictSignin, setIsStrictSignin] = useState(false) useEffect(() => { const recomputePrivateUsername = async () => { const identifier = await application.computePrivateUsername(privateUsername) if (!identifier) { if (privateUsername?.length > 0) { application.alertService.alert('Unable to compute private username.').catch(console.error) } return } onPrivateUsernameModeChange?.(true, identifier) } if (privateUsername) { recomputePrivateUsername().catch(console.error) } }, [privateUsername, application, onPrivateUsernameModeChange]) useEffect(() => { onPrivateUsernameModeChange?.(isPrivateUsername) }, [isPrivateUsername, onPrivateUsernameModeChange]) const handleIsPrivateUsernameChange = useCallback(() => { setIsPrivateUsername(!isPrivateUsername) }, [isPrivateUsername]) const handlePrivateUsernameNameChange = useCallback((name: string) => { setPrivateUsername(name) }, []) const handleServerOptionChange: ChangeEventHandler = useCallback( (e) => { if (e.target instanceof HTMLInputElement) { setEnableServerOption(e.target.checked) } }, [setEnableServerOption], ) const handleSyncServerChange = useCallback( (server: string) => { setServer(server) application.setCustomHost(server).catch(console.error) }, [application, setServer], ) const handleStrictSigninChange = useCallback(() => { const newValue = !isStrictSignin setIsStrictSignin(newValue) onStrictSignInChange?.(newValue) }, [isStrictSignin, onStrictSignInChange]) const toggleShowAdvanced = useCallback(() => { setShowAdvanced(!showAdvanced) }, [showAdvanced]) return ( <> {showAdvanced ? (
{children}
{isPrivateUsername && ( <> ]} type="text" placeholder="Username" value={privateUsername} onChange={handlePrivateUsernameNameChange} disabled={disabled} spellcheck={false} autocomplete={false} /> )} {onStrictSignInChange && (
)} ]} placeholder="https://api.standardnotes.com" value={server} onChange={handleSyncServerChange} disabled={!enableServerOption && !disabled} />
) : null} ) } export default observer(AdvancedOptions)