74 lines
1.7 KiB
TypeScript
74 lines
1.7 KiB
TypeScript
import { useCallback, useEffect, useState } from "react"
|
|
import type { Vault } from "opvault.js"
|
|
import { OnePassword } from "opvault.js"
|
|
import { Unlock } from "./Unlock"
|
|
import { electronAdapter } from "../../utils/ipc-adapter"
|
|
import { get, remove, set, Key } from "../../utils/localStorage"
|
|
import { PickOPVault } from "./Picker"
|
|
|
|
interface VaultPickerProps {
|
|
instance: OnePassword | undefined
|
|
setInstance(value?: OnePassword): void
|
|
vault: Vault | undefined
|
|
setVault(vault?: Vault): void
|
|
}
|
|
|
|
export const VaultPicker: React.FC<VaultPickerProps> = ({
|
|
instance,
|
|
setInstance,
|
|
vault,
|
|
setVault,
|
|
}) => {
|
|
const [vaultPath, setVaultPath] = useState("")
|
|
|
|
const unlock = useCallback(
|
|
async (profile: string, password: string) => {
|
|
const vault = await instance!.getProfile(profile!)
|
|
await vault.unlock(password)
|
|
setVault(vault)
|
|
},
|
|
[instance, setVault]
|
|
)
|
|
|
|
const clearInstance = useCallback(() => {
|
|
setVaultPath("")
|
|
setInstance(undefined)
|
|
}, [setInstance])
|
|
|
|
useEffect(() => {
|
|
const existingPath = get(Key.LAST_VAULT_PATH)
|
|
if (existingPath != null) {
|
|
setVaultPath(existingPath)
|
|
}
|
|
}, [])
|
|
|
|
useEffect(() => {
|
|
if (vaultPath) {
|
|
const instance = new OnePassword({
|
|
path: vaultPath,
|
|
adapter: electronAdapter,
|
|
})
|
|
setInstance(instance)
|
|
set(Key.LAST_VAULT_PATH, vaultPath)
|
|
} else {
|
|
setInstance(undefined)
|
|
remove(Key.LAST_VAULT_PATH)
|
|
}
|
|
}, [vaultPath, setInstance])
|
|
|
|
if (!instance) {
|
|
return <PickOPVault setPath={setVaultPath} />
|
|
}
|
|
if (!vault) {
|
|
return (
|
|
<Unlock
|
|
vaultPath={vaultPath}
|
|
onReturn={clearInstance}
|
|
instance={instance}
|
|
onUnlock={unlock}
|
|
/>
|
|
)
|
|
}
|
|
return null
|
|
}
|