import { WebApplication } from '@/UIModels/Application' import { AppState } from '@/UIModels/AppState' import { observer } from 'mobx-react-lite' import { ChangeEventHandler, FunctionComponent, 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 appState: AppState disabled?: boolean onPrivateWorkspaceChange?: (isPrivate: boolean, identifier?: string) => void onStrictSignInChange?: (isStrictSignIn: boolean) => void } const AdvancedOptions: FunctionComponent = ({ appState, application, disabled = false, onPrivateWorkspaceChange, onStrictSignInChange, children, }) => { const { server, setServer, enableServerOption, setEnableServerOption } = appState.accountMenu const [showAdvanced, setShowAdvanced] = useState(false) const [isPrivateWorkspace, setIsPrivateWorkspace] = useState(false) const [privateWorkspaceName, setPrivateWorkspaceName] = useState('') const [privateWorkspaceUserphrase, setPrivateWorkspaceUserphrase] = useState('') const [isStrictSignin, setIsStrictSignin] = useState(false) useEffect(() => { const recomputePrivateWorkspaceIdentifier = async () => { const identifier = await application.computePrivateWorkspaceIdentifier( privateWorkspaceName, privateWorkspaceUserphrase, ) if (!identifier) { if (privateWorkspaceName?.length > 0 && privateWorkspaceUserphrase?.length > 0) { application.alertService.alert('Unable to compute private workspace name.').catch(console.error) } return } onPrivateWorkspaceChange?.(true, identifier) } if (privateWorkspaceName && privateWorkspaceUserphrase) { recomputePrivateWorkspaceIdentifier().catch(console.error) } }, [privateWorkspaceName, privateWorkspaceUserphrase, application, onPrivateWorkspaceChange]) useEffect(() => { onPrivateWorkspaceChange?.(isPrivateWorkspace) }, [isPrivateWorkspace, onPrivateWorkspaceChange]) const handleIsPrivateWorkspaceChange = useCallback(() => { setIsPrivateWorkspace(!isPrivateWorkspace) }, [isPrivateWorkspace]) const handlePrivateWorkspaceNameChange = useCallback((name: string) => { setPrivateWorkspaceName(name) }, []) const handlePrivateWorkspaceUserphraseChange = useCallback((userphrase: string) => { setPrivateWorkspaceUserphrase(userphrase) }, []) 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}
{isPrivateWorkspace && ( <> ]} type="text" placeholder="Userphrase" value={privateWorkspaceUserphrase} onChange={handlePrivateWorkspaceUserphraseChange} disabled={disabled} /> ]} type="text" placeholder="Name" value={privateWorkspaceName} onChange={handlePrivateWorkspaceNameChange} disabled={disabled} /> )} {onStrictSignInChange && ( )} ]} placeholder="https://api.standardnotes.com" value={server} onChange={handleSyncServerChange} disabled={!enableServerOption && !disabled} />
) : null} ) } export default observer(AdvancedOptions)