import { h } from "preact" import { Page } from "../../../page"; import Notes, { VaultList } from "../../../notes"; import "./vaults.scss" import Lock from "feather-icons/dist/icons/lock.svg"; import Unlock from "feather-icons/dist/icons/unlock.svg"; import Navigation from "../../../navigation"; import { InputModal } from "../../modals/InputModal"; import { YesNoModal } from "../../modals/YesNoModal"; import AddButton from "../../AddButton"; import ContextMenu from "../../context"; import Notifications from "../../../notifications"; export interface VaultsProps { state: any; selectVault?: boolean; onSelected?: (vaultid: string) => void; } export default class VaultsPage extends Page { constructor(props: VaultsProps) { super(props); this.state = { vaults: [], modal: undefined, context: undefined }; this.updateVaults = this.updateVaults.bind(this); } updateVaults(s?: boolean) { if (s) return; return new Promise(yes => { Notes.getVaults().then(vaults => this.setState({ vaults }, yes)) }) } componentWillMount() { this.updateVaults() Notes.syncObservable.subscribe(this.updateVaults); } componentWillUnmount() { Notes.syncObservable.unsubscribe(this.updateVaults); } async getKey(vault: { name: string, id: string }, permanent = true) { let inp_mod = new InputModal("Enter password for " + vault.name, "Password", "password"); let key = undefined; while (true) { // inp_mod.show(); let value = await inp_mod.getResult(false); if (value === null) { console.log("Value is null") inp_mod.close() return false; } else { key = Notes.passwordToKey(value); try { await Notes.getVault(vault.id, key); break; } catch (err) { Notifications.sendError("Invalid password!") } } } inp_mod.close() let perm = false; if (permanent) { let save_modal = new YesNoModal("Save permanent?"); let res = await save_modal.getResult(); if (res === undefined) { res = false; } perm = res; } Notes.saveVaultKey(vault.id, key, perm); return true; } async openVault(vault: { name: string, encrypted: boolean, id: string }) { const action = () => { if (this.props.selectVault) { this.props.onSelected(vault.id); } else { Navigation.setPage("/vault", { id: vault.id }) } } if (vault.encrypted) { let key = Notes.getVaultKey(vault.id); if (key) action() else { if (await this.getKey(vault)) action(); } } else { action() } } async addButtonClick() { let name_modal = new InputModal("Enter new name", "Name", "text"); let name = await name_modal.getResult(); if (name === null) return; let encrypted_modal = new YesNoModal("Encrypt?"); let encrypted = encrypted_modal.getResult(); if (encrypted === null) return; let password; if (encrypted) { let password_modal = new InputModal("Enter new password", "Password", "password"); password = await password_modal.getResult(); if (password === null) return; } let key; if (password) { key = Notes.passwordToKey(password) } await Notes.createVault(name, key) this.updateVaults(); } onContext(evt: MouseEvent, vault: { name: string, encrypted: boolean, id: string }) { evt.preventDefault(); evt.stopPropagation(); const close = () => { document.documentElement.removeEventListener("click", close); this.setState({ context: undefined }); } document.documentElement.addEventListener("click", close); let deleteb = ; let delete_key; if (Notes.getVaultKey(vault.id)) { delete_key = ; } let exportb = ; let context = {deleteb} {delete_key} {exportb} this.setState({ context }); return false; } render() { let elms = this.state.vaults.map(vault => { return
  • this.openVault(vault)} onContextMenu={(evt) => this.onContext(evt, vault)}> {vault.encrypted ? : } {vault.name}
  • }) return
    {/* {this.state.modal} */} {this.state.context}

    Navigation.setPage("/")}>{this.props.selectVault ? "Select Vault for share" : "Your vaults:"}

    this.addButtonClick()} />
      {elms}
    } }