refactor: vaults to private workspace (#1019)

* refactor: vaults to private workspace

* chore: fix types
This commit is contained in:
Mo
2022-05-09 13:57:37 -05:00
committed by GitHub
parent 9e370df2e8
commit 034cae7b62
5 changed files with 91 additions and 84 deletions

View File

@@ -11,53 +11,56 @@ type Props = {
application: WebApplication application: WebApplication
appState: AppState appState: AppState
disabled?: boolean disabled?: boolean
onVaultChange?: (isVault: boolean, vaultedEmail?: string) => void onPrivateWorkspaceChange?: (isPrivate: boolean, identifier?: string) => void
onStrictSignInChange?: (isStrictSignIn: boolean) => void onStrictSignInChange?: (isStrictSignIn: boolean) => void
} }
export const AdvancedOptions: FunctionComponent<Props> = observer( export const AdvancedOptions: FunctionComponent<Props> = observer(
({ appState, application, disabled = false, onVaultChange, onStrictSignInChange, children }) => { ({ appState, application, disabled = false, onPrivateWorkspaceChange, onStrictSignInChange, children }) => {
const { server, setServer, enableServerOption, setEnableServerOption } = appState.accountMenu const { server, setServer, enableServerOption, setEnableServerOption } = appState.accountMenu
const [showAdvanced, setShowAdvanced] = useState(false) const [showAdvanced, setShowAdvanced] = useState(false)
const [isVault, setIsVault] = useState(false) const [isPrivateWorkspace, setIsPrivateWorkspace] = useState(false)
const [vaultName, setVaultName] = useState('') const [privateWorkspaceName, setPrivateWorkspaceName] = useState('')
const [vaultUserphrase, setVaultUserphrase] = useState('') const [privateWorkspaceUserphrase, setPrivateWorkspaceUserphrase] = useState('')
const [isStrictSignin, setIsStrictSignin] = useState(false) const [isStrictSignin, setIsStrictSignin] = useState(false)
useEffect(() => { useEffect(() => {
const recomputeVaultedEmail = async () => { const recomputePrivateWorkspaceIdentifier = async () => {
const vaultedEmail = await application.vaultToEmail(vaultName, vaultUserphrase) const identifier = await application.computePrivateWorkspaceIdentifier(
privateWorkspaceName,
privateWorkspaceUserphrase,
)
if (!vaultedEmail) { if (!identifier) {
if (vaultName?.length > 0 && vaultUserphrase?.length > 0) { if (privateWorkspaceName?.length > 0 && privateWorkspaceUserphrase?.length > 0) {
application.alertService.alert('Unable to compute vault name.').catch(console.error) application.alertService.alert('Unable to compute private workspace name.').catch(console.error)
} }
return return
} }
onVaultChange?.(true, vaultedEmail) onPrivateWorkspaceChange?.(true, identifier)
} }
if (vaultName && vaultUserphrase) { if (privateWorkspaceName && privateWorkspaceUserphrase) {
recomputeVaultedEmail().catch(console.error) recomputePrivateWorkspaceIdentifier().catch(console.error)
} }
}, [vaultName, vaultUserphrase, application, onVaultChange]) }, [privateWorkspaceName, privateWorkspaceUserphrase, application, onPrivateWorkspaceChange])
useEffect(() => { useEffect(() => {
onVaultChange?.(isVault) onPrivateWorkspaceChange?.(isPrivateWorkspace)
}, [isVault, onVaultChange]) }, [isPrivateWorkspace, onPrivateWorkspaceChange])
const handleIsVaultChange = () => { const handleIsPrivateWorkspaceChange = () => {
setIsVault(!isVault) setIsPrivateWorkspace(!isPrivateWorkspace)
} }
const handleVaultNameChange = (name: string) => { const handlePrivateWorkspaceNameChange = (name: string) => {
setVaultName(name) setPrivateWorkspaceName(name)
} }
const handleVaultUserphraseChange = (userphrase: string) => { const handlePrivateWorkspaceUserphraseChange = (userphrase: string) => {
setVaultUserphrase(userphrase) setPrivateWorkspaceUserphrase(userphrase)
} }
const handleServerOptionChange = (e: Event) => { const handleServerOptionChange = (e: Event) => {
@@ -99,11 +102,11 @@ export const AdvancedOptions: FunctionComponent<Props> = observer(
{appState.enableUnfinishedFeatures && ( {appState.enableUnfinishedFeatures && (
<div className="flex justify-between items-center mb-1"> <div className="flex justify-between items-center mb-1">
<Checkbox <Checkbox
name="vault-mode" name="private-workspace"
label="Vault Mode" label="Private workspace"
checked={isVault} checked={isPrivateWorkspace}
disabled={disabled} disabled={disabled}
onChange={handleIsVaultChange} onChange={handleIsPrivateWorkspaceChange}
/> />
<a <a
href="https://standardnotes.com/help/80" href="https://standardnotes.com/help/80"
@@ -116,24 +119,24 @@ export const AdvancedOptions: FunctionComponent<Props> = observer(
</div> </div>
)} )}
{appState.enableUnfinishedFeatures && isVault && ( {appState.enableUnfinishedFeatures && isPrivateWorkspace && (
<> <>
<DecoratedInput
className={'mb-2'}
left={[<Icon type="folder" className="color-neutral" />]}
type="text"
placeholder="Vault name"
value={vaultName}
onChange={handleVaultNameChange}
disabled={disabled}
/>
<DecoratedInput <DecoratedInput
className={'mb-2'} className={'mb-2'}
left={[<Icon type="server" className="color-neutral" />]} left={[<Icon type="server" className="color-neutral" />]}
type="text" type="text"
placeholder="Vault userphrase" placeholder="Userphrase"
value={vaultUserphrase} value={privateWorkspaceUserphrase}
onChange={handleVaultUserphraseChange} onChange={handlePrivateWorkspaceUserphraseChange}
disabled={disabled}
/>
<DecoratedInput
className={'mb-2'}
left={[<Icon type="folder" className="color-neutral" />]}
type="text"
placeholder="Name"
value={privateWorkspaceName}
onChange={handlePrivateWorkspaceNameChange}
disabled={disabled} disabled={disabled}
/> />
</> </>

View File

@@ -25,7 +25,7 @@ export const CreateAccount: FunctionComponent<Props> = observer(
({ appState, application, setMenuPane, email, setEmail, password, setPassword }) => { ({ appState, application, setMenuPane, email, setEmail, password, setPassword }) => {
const emailInputRef = useRef<HTMLInputElement>(null) const emailInputRef = useRef<HTMLInputElement>(null)
const passwordInputRef = useRef<HTMLInputElement>(null) const passwordInputRef = useRef<HTMLInputElement>(null)
const [isVault, setIsVault] = useState(false) const [isPrivateWorkspace, setIsPrivateWorkspace] = useState(false)
useEffect(() => { useEffect(() => {
if (emailInputRef.current) { if (emailInputRef.current) {
@@ -71,10 +71,10 @@ export const CreateAccount: FunctionComponent<Props> = observer(
setPassword('') setPassword('')
} }
const onVaultChange = (isVault: boolean, vaultedEmail?: string) => { const onPrivateWorkspaceChange = (isPrivateWorkspace: boolean, privateWorkspaceIdentifier?: string) => {
setIsVault(isVault) setIsPrivateWorkspace(isPrivateWorkspace)
if (isVault && vaultedEmail) { if (isPrivateWorkspace && privateWorkspaceIdentifier) {
setEmail(vaultedEmail) setEmail(privateWorkspaceIdentifier)
} }
} }
@@ -93,7 +93,7 @@ export const CreateAccount: FunctionComponent<Props> = observer(
<form onSubmit={handleRegisterFormSubmit} className="px-3 mb-1"> <form onSubmit={handleRegisterFormSubmit} className="px-3 mb-1">
<DecoratedInput <DecoratedInput
className="mb-2" className="mb-2"
disabled={isVault} disabled={isPrivateWorkspace}
left={[<Icon type="email" className="color-neutral" />]} left={[<Icon type="email" className="color-neutral" />]}
onChange={handleEmailChange} onChange={handleEmailChange}
onKeyDown={handleKeyDown} onKeyDown={handleKeyDown}
@@ -114,7 +114,11 @@ export const CreateAccount: FunctionComponent<Props> = observer(
<Button className="btn-w-full mt-1" label="Next" variant="primary" onClick={handleRegisterFormSubmit} /> <Button className="btn-w-full mt-1" label="Next" variant="primary" onClick={handleRegisterFormSubmit} />
</form> </form>
<div className="h-1px my-2 bg-border"></div> <div className="h-1px my-2 bg-border"></div>
<AdvancedOptions application={application} appState={appState} onVaultChange={onVaultChange} /> <AdvancedOptions
application={application}
appState={appState}
onPrivateWorkspaceChange={onPrivateWorkspaceChange}
/>
</> </>
) )
}, },

View File

@@ -29,7 +29,7 @@ export const SignInPane: FunctionComponent<Props> = observer(({ application, app
const [isStrictSignin, setIsStrictSignin] = useState(false) const [isStrictSignin, setIsStrictSignin] = useState(false)
const [isSigningIn, setIsSigningIn] = useState(false) const [isSigningIn, setIsSigningIn] = useState(false)
const [shouldMergeLocal, setShouldMergeLocal] = useState(true) const [shouldMergeLocal, setShouldMergeLocal] = useState(true)
const [isVault, setIsVault] = useState(false) const [isPrivateWorkspace, setIsPrivateWorkspace] = useState(false)
const emailInputRef = useRef<HTMLInputElement>(null) const emailInputRef = useRef<HTMLInputElement>(null)
const passwordInputRef = useRef<HTMLInputElement>(null) const passwordInputRef = useRef<HTMLInputElement>(null)
@@ -103,11 +103,11 @@ export const SignInPane: FunctionComponent<Props> = observer(({ application, app
} }
} }
const onVaultChange = useCallback( const onPrivateWorkspaceChange = useCallback(
(newIsVault: boolean, vaultedEmail?: string) => { (newIsPrivateWorkspace: boolean, privateWorkspaceIdentifier?: string) => {
setIsVault(newIsVault) setIsPrivateWorkspace(newIsPrivateWorkspace)
if (newIsVault && vaultedEmail) { if (newIsPrivateWorkspace && privateWorkspaceIdentifier) {
setEmail(vaultedEmail) setEmail(privateWorkspaceIdentifier)
} }
}, },
[setEmail], [setEmail],
@@ -152,7 +152,7 @@ export const SignInPane: FunctionComponent<Props> = observer(({ application, app
onChange={handleEmailChange} onChange={handleEmailChange}
onFocus={resetInvalid} onFocus={resetInvalid}
onKeyDown={handleKeyDown} onKeyDown={handleKeyDown}
disabled={isSigningIn || isVault} disabled={isSigningIn || isPrivateWorkspace}
ref={emailInputRef} ref={emailInputRef}
/> />
<DecoratedPasswordInput <DecoratedPasswordInput
@@ -196,7 +196,7 @@ export const SignInPane: FunctionComponent<Props> = observer(({ application, app
appState={appState} appState={appState}
application={application} application={application}
disabled={isSigningIn} disabled={isSigningIn}
onVaultChange={onVaultChange} onPrivateWorkspaceChange={onPrivateWorkspaceChange}
onStrictSignInChange={handleStrictSigninChange} onStrictSignInChange={handleStrictSigninChange}
/> />
</> </>

View File

@@ -72,7 +72,7 @@
"@standardnotes/components": "1.8.0", "@standardnotes/components": "1.8.0",
"@standardnotes/filepicker": "1.13.7", "@standardnotes/filepicker": "1.13.7",
"@standardnotes/sncrypto-web": "1.9.2", "@standardnotes/sncrypto-web": "1.9.2",
"@standardnotes/snjs": "2.106.5", "@standardnotes/snjs": "2.106.7",
"@standardnotes/stylekit": "5.25.0", "@standardnotes/stylekit": "5.25.0",
"@zip.js/zip.js": "^2.4.10", "@zip.js/zip.js": "^2.4.10",
"mobx": "^6.5.0", "mobx": "^6.5.0",

View File

@@ -2461,14 +2461,14 @@
"@standardnotes/auth" "^3.18.13" "@standardnotes/auth" "^3.18.13"
"@standardnotes/features" "^1.41.0" "@standardnotes/features" "^1.41.0"
"@standardnotes/encryption@^1.6.6": "@standardnotes/encryption@^1.6.8":
version "1.6.6" version "1.6.8"
resolved "https://registry.yarnpkg.com/@standardnotes/encryption/-/encryption-1.6.6.tgz#c341a4d3cdbb23adbddfcf184207fef68f298312" resolved "https://registry.yarnpkg.com/@standardnotes/encryption/-/encryption-1.6.8.tgz#a6bc8fc9a0224eaabfab3959f2594d9b3176c09a"
integrity sha512-qLnQ1DndlNaWzOMPgUnT8hZ5om0cBlueFUnuQT4uCGVoTLdbGLNNjjoOTymfFRZ4NJ3ZaeBVFbur0p4l4WRG6A== integrity sha512-eOb+U4c7/YhBIQa2T5rmtpNBdbke6ycBa6XixkD1JHv5qsCiQTrO1wuiyl+Md4wr7nnntg3/HM56cwqOChqwdQ==
dependencies: dependencies:
"@standardnotes/models" "^1.6.7" "@standardnotes/models" "^1.6.8"
"@standardnotes/responses" "^1.6.17" "@standardnotes/responses" "^1.6.17"
"@standardnotes/services" "^1.10.6" "@standardnotes/services" "^1.10.7"
"@standardnotes/features@^1.41.0": "@standardnotes/features@^1.41.0":
version "1.41.0" version "1.41.0"
@@ -2486,20 +2486,20 @@
"@standardnotes/common" "^1.19.8" "@standardnotes/common" "^1.19.8"
"@standardnotes/utils" "^1.6.6" "@standardnotes/utils" "^1.6.6"
"@standardnotes/files@^1.0.10": "@standardnotes/files@^1.0.11":
version "1.0.10" version "1.0.11"
resolved "https://registry.yarnpkg.com/@standardnotes/files/-/files-1.0.10.tgz#dac27cf777f948962935427132a82f6ad3a87f5d" resolved "https://registry.yarnpkg.com/@standardnotes/files/-/files-1.0.11.tgz#d80e1c7f32bba97316f208fcddd9ed67b27d9bb7"
integrity sha512-+4JgKIVEklJTV6oY7b8Mg0cYhApXrzINd3gMMbWhva2dzSQX8OsdBfNpgHDL8D4SQ8UbwvVjJd19usWXwmTcZQ== integrity sha512-lwgIoyXRsVIeOUspHAZadlvBIN/kloz4eZPoyernIQTZ3V74WReqBJZtexf+VOArJX9Ded0jUD7cQ4kk4joRRA==
dependencies: dependencies:
"@standardnotes/models" "^1.6.7" "@standardnotes/models" "^1.6.8"
"@standardnotes/responses" "^1.6.17" "@standardnotes/responses" "^1.6.17"
"@standardnotes/services" "^1.10.6" "@standardnotes/services" "^1.10.7"
"@standardnotes/utils" "^1.6.6" "@standardnotes/utils" "^1.6.6"
"@standardnotes/models@^1.6.7": "@standardnotes/models@^1.6.8":
version "1.6.7" version "1.6.8"
resolved "https://registry.yarnpkg.com/@standardnotes/models/-/models-1.6.7.tgz#b59f597ab9ec80d93be3b0578cb995022d5e659c" resolved "https://registry.yarnpkg.com/@standardnotes/models/-/models-1.6.8.tgz#e5223cc5c3c17ade58f1a74afe144739ced4831e"
integrity sha512-H9+tjD2uzrpwxj+QCA79d2xRELJWGAKDN7jds0m8GMSg+6TFeFhv7qghQkr2FYsbkf8GrBfA42N5iYNRr1dBDA== integrity sha512-6RZ4G7Km78YYFMsY0HtSH1C9mX0ZU3Ohs74aArMTk1pPRWASsSrlDU7pafcC7Jy/cSropVf1PwR5kkR/TXMqnw==
dependencies: dependencies:
"@standardnotes/features" "^1.41.0" "@standardnotes/features" "^1.41.0"
"@standardnotes/responses" "^1.6.17" "@standardnotes/responses" "^1.6.17"
@@ -2514,14 +2514,14 @@
"@standardnotes/common" "^1.19.8" "@standardnotes/common" "^1.19.8"
"@standardnotes/features" "^1.41.0" "@standardnotes/features" "^1.41.0"
"@standardnotes/services@^1.10.6": "@standardnotes/services@^1.10.7":
version "1.10.6" version "1.10.7"
resolved "https://registry.yarnpkg.com/@standardnotes/services/-/services-1.10.6.tgz#7b2cacc7c454e830ad89e2adcb5f0abe048daeff" resolved "https://registry.yarnpkg.com/@standardnotes/services/-/services-1.10.7.tgz#27d6210048f01d949f66c1b4a993e46434bebba5"
integrity sha512-TxNlve/IzoREpih/wodUkK/XX1mrhM4eHHv4z1E/Qx2ac1gc3wX2s4sNWBjUNqb/G5qMYeIwLn7Iy882I655DA== integrity sha512-AxpyEAbSqLV9UGXQYcxRtZgyW1t9akINiESTUKP+AzEJQCWKu6z694z8RO3UYCmd5R7RYUXQwl4N226kxF2mzw==
dependencies: dependencies:
"@standardnotes/auth" "^3.18.13" "@standardnotes/auth" "^3.18.13"
"@standardnotes/common" "^1.19.8" "@standardnotes/common" "^1.19.8"
"@standardnotes/models" "^1.6.7" "@standardnotes/models" "^1.6.8"
"@standardnotes/responses" "^1.6.17" "@standardnotes/responses" "^1.6.17"
"@standardnotes/utils" "^1.6.6" "@standardnotes/utils" "^1.6.6"
@@ -2544,21 +2544,21 @@
buffer "^6.0.3" buffer "^6.0.3"
libsodium-wrappers "^0.7.9" libsodium-wrappers "^0.7.9"
"@standardnotes/snjs@2.106.5": "@standardnotes/snjs@2.106.7":
version "2.106.5" version "2.106.7"
resolved "https://registry.yarnpkg.com/@standardnotes/snjs/-/snjs-2.106.5.tgz#14637de4dbf5f8960cba2492cd0041f88b5505a3" resolved "https://registry.yarnpkg.com/@standardnotes/snjs/-/snjs-2.106.7.tgz#986b4c5f42dc1304bc31f4aabacd4f846accd674"
integrity sha512-HfE998o4gs9wGb1F6pmQJXcSylfuJRwBDtMZDxuSHnGeiTb+iRJFiR5O259QebxABeK8XSJ7h1WoOYV75EMxuQ== integrity sha512-Vks0HvdsHC+kA8roArS3XoORUDtoplibQrxhah/G9ayUXbcymPb+AKNYCwfZakCE70s6gtxjdPmAuwWA8oV6Rg==
dependencies: dependencies:
"@standardnotes/auth" "^3.18.13" "@standardnotes/auth" "^3.18.13"
"@standardnotes/common" "^1.19.8" "@standardnotes/common" "^1.19.8"
"@standardnotes/domain-events" "^2.28.0" "@standardnotes/domain-events" "^2.28.0"
"@standardnotes/encryption" "^1.6.6" "@standardnotes/encryption" "^1.6.8"
"@standardnotes/features" "^1.41.0" "@standardnotes/features" "^1.41.0"
"@standardnotes/filepicker" "^1.13.7" "@standardnotes/filepicker" "^1.13.7"
"@standardnotes/files" "^1.0.10" "@standardnotes/files" "^1.0.11"
"@standardnotes/models" "^1.6.7" "@standardnotes/models" "^1.6.8"
"@standardnotes/responses" "^1.6.17" "@standardnotes/responses" "^1.6.17"
"@standardnotes/services" "^1.10.6" "@standardnotes/services" "^1.10.7"
"@standardnotes/settings" "^1.14.3" "@standardnotes/settings" "^1.14.3"
"@standardnotes/sncrypto-common" "^1.8.2" "@standardnotes/sncrypto-common" "^1.8.2"
"@standardnotes/utils" "^1.6.6" "@standardnotes/utils" "^1.6.6"