Files
spacedrive/interface/app/$libraryId/KeyManager/Mounter.tsx
Jamie Pine 4a879594fb [ENG-581, ENG-597, ENG-600] Overview categories (#779)
* added base UI for categories on overview

* update core

* cleanup ui

* Inspector default view if nothing is selected, explorer takes child components, hidden menu tweak if no items are sm:flex

* wip

* somewhat functional

* scroll

* category fixes

* clean category bar

* added config store + made toolbar available on all explorer screens

* clean up overview.tsx

* added counts

* fix inspector bug

* add support for favorites
+ add book extension support

* refactor into smaller components

* Some small rust nitpicks

* fix camel case location_type

* Rust fmt

* fix typescript CI

---------

Co-authored-by: ameer2468 <33054370+ameer2468@users.noreply.github.com>
Co-authored-by: nikec <nikec.job@gmail.com>
Co-authored-by: Ericson Soares <ericson.ds999@gmail.com>
2023-05-17 20:34:05 +00:00

164 lines
4.4 KiB
TypeScript

import { Info } from 'phosphor-react';
import { useEffect, useRef, useState } from 'react';
import { Algorithm, HASHING_ALGOS, HashingAlgoSlug, useLibraryMutation } from '@sd/client';
import {
Button,
CategoryHeading,
PasswordInput,
Select,
SelectOption,
Slider,
Switch,
Tooltip,
tw
} from '@sd/ui';
import { generatePassword } from '~/util';
const KeyHeading = tw(CategoryHeading)`mb-1`;
export default () => {
const ref = useRef<HTMLInputElement>(null);
const [librarySync, setLibrarySync] = useState(true);
const [autoMount, setAutoMount] = useState(false);
const [sliderValue, setSliderValue] = useState([64]);
const [key, setKey] = useState('');
const [encryptionAlgo, setEncryptionAlgo] = useState('XChaCha20Poly1305');
const [hashingAlgo, setHashingAlgo] = useState<HashingAlgoSlug>('Argon2id-s');
const createKey = useLibraryMutation('keys.add');
// this keeps the input focused when switching tabs
// feel free to replace with something cleaner
useEffect(() => {
setTimeout(() => {
ref.current?.focus();
});
}, []);
return (
<div className="mb-1 p-3">
<KeyHeading>Mount key</KeyHeading>
<PasswordInput
ref={ref}
value={key}
onChange={(e) => setKey(e.target.value)}
autoFocus
/>
<div className="flex flex-row space-x-2">
<div className="relative mt-2 flex grow">
<Slider
value={sliderValue}
max={128}
min={8}
step={4}
defaultValue={[64]}
onValueChange={(val) => {
setSliderValue(val);
setKey(generatePassword(val[0] ?? 8));
}}
onClick={() => {
setKey(generatePassword(sliderValue[0] ?? 8));
}}
/>
</div>
<span className="mt-2.5 text-sm font-medium">{sliderValue}</span>
</div>
<div className="mb-1 mt-3 flex flex-row items-center">
<div className="space-x-2">
<Switch
className="bg-app-selected"
size="sm"
checked={librarySync}
onCheckedChange={(e) => {
if (autoMount && !e) setAutoMount(false);
setLibrarySync(e);
}}
/>
</div>
<span className="ml-3 text-xs font-medium">Sync with Library</span>
<Tooltip label="This key will be registered with all devices running your Library">
<Info className="ml-1.5 h-4 w-4 text-ink-faint" />
</Tooltip>
<div className="grow" />
{/* <div className="space-x-2">
<Switch
className="bg-app-selected"
size="sm"
checked={autoMount}
onCheckedChange={(e) => {
if (!librarySync && e) setLibrarySync(true);
setAutoMount(e);
}}
/>
</div>
<span className="ml-3 text-xs font-medium">Automount</span>
<Tooltip label="This key will be automatically mounted every time you unlock the key manager">
<Info className="ml-1.5 h-4 w-4 text-ink-faint" />
</Tooltip> */}
</div>
<div className="mb-3 mt-4 grid w-full grid-cols-2 gap-4">
<div className="flex flex-col">
<span className="text-xs font-bold">Encryption</span>
<Select
size="lg"
value={encryptionAlgo}
onChange={setEncryptionAlgo}
className="mt-2"
>
<SelectOption value="XChaCha20Poly1305">XChaCha20-Poly1305</SelectOption>
<SelectOption value="Aes256Gcm">AES-256-GCM</SelectOption>
</Select>
</div>
<div className="flex flex-col">
<span className="text-xs font-bold">Hashing</span>
<Select
size="lg"
value={hashingAlgo}
onChange={(s) => setHashingAlgo(s as HashingAlgoSlug)}
className="mt-2"
>
<SelectOption value="Argon2id-s">Argon2id (standard)</SelectOption>
<SelectOption value="Argon2id-h">Argon2id (hardened)</SelectOption>
<SelectOption value="Argon2id-p">Argon2id (paranoid)</SelectOption>
<SelectOption value="BalloonBlake3-s">
BLAKE3-Balloon (standard)
</SelectOption>
<SelectOption value="BalloonBlake3-h">
BLAKE3-Balloon (hardened)
</SelectOption>
<SelectOption value="BalloonBlake3-p">
BLAKE3-Balloon (paranoid)
</SelectOption>
</Select>
</div>
</div>
<Button
className="mt-2 w-full"
variant="accent"
disabled={key === ''}
onClick={() => {
setKey('');
const hashing_algorithm = HASHING_ALGOS[hashingAlgo];
createKey.mutate({
algorithm: encryptionAlgo as Algorithm,
hashing_algorithm,
key,
library_sync: librarySync,
automount: autoMount
});
}}
>
Mount Key
</Button>
</div>
);
};