import { WebApplication } from '@/Application/WebApplication' 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 onRecoveryCodesChange?: (isRecoveryCodes: boolean, recoveryCodes?: string) => void children?: ReactNode } const AdvancedOptions: FunctionComponent = ({ viewControllerManager, application, disabled = false, onPrivateUsernameModeChange, onStrictSignInChange, onRecoveryCodesChange, children, }) => { const { server, setServer, enableServerOption, setEnableServerOption } = viewControllerManager.accountMenuController const [showAdvanced, setShowAdvanced] = useState(false) const [isPrivateUsername, setIsPrivateUsername] = useState(false) const [privateUsername, setPrivateUsername] = useState('') const [isRecoveryCodes, setIsRecoveryCodes] = useState(false) const [recoveryCodes, setRecoveryCodes] = 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 handleIsRecoveryCodesChange = useCallback(() => { const newValue = !isRecoveryCodes setIsRecoveryCodes(newValue) onRecoveryCodesChange?.(newValue) if (!isRecoveryCodes) { setIsPrivateUsername(false) setIsStrictSignin(false) setEnableServerOption(false) } }, [isRecoveryCodes, setIsPrivateUsername, setIsStrictSignin, setEnableServerOption, onRecoveryCodesChange]) const handleRecoveryCodesChange = useCallback( (recoveryCodes: string) => { setRecoveryCodes(recoveryCodes) if (recoveryCodes) { onRecoveryCodesChange?.(true, recoveryCodes) } }, [onRecoveryCodesChange], ) 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 || isRecoveryCodes} spellcheck={false} autocomplete={false} /> )} {onStrictSignInChange && (
)}
{isRecoveryCodes && ( <> ]} type="text" placeholder="Recovery code" value={recoveryCodes} onChange={handleRecoveryCodesChange} disabled={disabled} spellcheck={false} autocomplete={false} /> )} ]} placeholder="https://api.standardnotes.com" value={server} onChange={handleSyncServerChange} disabled={!enableServerOption && !disabled && !isRecoveryCodes} />
) : null} ) } export default observer(AdvancedOptions)