aboutsummaryrefslogtreecommitdiff
path: root/packages/anastasis-webui/src/components
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2021-11-24 17:38:39 -0300
committerSebastian <sebasjm@gmail.com>2021-11-24 17:38:39 -0300
commitf49df12b441a2bd06520df42ddd41fc42f639147 (patch)
tree13a3f9a5cecb5df234ceec1149bd794b2f03ea73 /packages/anastasis-webui/src/components
parent668c0430c204c1233fc266b723ed1be308d5f3f1 (diff)
downloadwallet-core-f49df12b441a2bd06520df42ddd41fc42f639147.tar.xz
restore and save session
Diffstat (limited to 'packages/anastasis-webui/src/components')
-rw-r--r--packages/anastasis-webui/src/components/FlieButton.tsx57
-rw-r--r--packages/anastasis-webui/src/components/menu/SideBar.tsx28
2 files changed, 85 insertions, 0 deletions
diff --git a/packages/anastasis-webui/src/components/FlieButton.tsx b/packages/anastasis-webui/src/components/FlieButton.tsx
new file mode 100644
index 000000000..aab0b6170
--- /dev/null
+++ b/packages/anastasis-webui/src/components/FlieButton.tsx
@@ -0,0 +1,57 @@
+import { h, VNode } from "preact";
+import { useRef, useState } from "preact/hooks";
+
+const MAX_IMAGE_UPLOAD_SIZE = 1024 * 1024;
+
+export interface FileTypeContent {
+ content: string;
+ type: string;
+ name: string;
+}
+
+interface Props {
+ label: string;
+ onChange: (v: FileTypeContent | undefined) => void;
+}
+export function FileButton(props: Props): VNode {
+ const fileInputRef = useRef<HTMLInputElement>(null);
+ const [sizeError, setSizeError] = useState(false);
+ return (
+ <div>
+ <button class="button" onClick={(e) => fileInputRef.current?.click()}>
+ <span>{props.label}</span>
+ </button>
+ <input
+ ref={fileInputRef}
+ style={{ display: "none" }}
+ type="file"
+ onChange={(e) => {
+ const f: FileList | null = e.currentTarget.files;
+ if (!f || f.length != 1) {
+ return props.onChange(undefined);
+ }
+ console.log(f);
+ if (f[0].size > MAX_IMAGE_UPLOAD_SIZE) {
+ setSizeError(true);
+ return props.onChange(undefined);
+ }
+ setSizeError(false);
+ return f[0].arrayBuffer().then((b) => {
+ const content = new Uint8Array(b).reduce(
+ (data, byte) => data + String.fromCharCode(byte),
+ "",
+ );
+ return props.onChange({
+ content,
+ name: f[0].name,
+ type: f[0].type,
+ });
+ });
+ }}
+ />
+ {sizeError && (
+ <p class="help is-danger">File should be smaller than 1 MB</p>
+ )}
+ </div>
+ );
+}
diff --git a/packages/anastasis-webui/src/components/menu/SideBar.tsx b/packages/anastasis-webui/src/components/menu/SideBar.tsx
index c73369dd6..6c8189fb9 100644
--- a/packages/anastasis-webui/src/components/menu/SideBar.tsx
+++ b/packages/anastasis-webui/src/components/menu/SideBar.tsx
@@ -36,6 +36,14 @@ export function Sidebar({ mobile }: Props): VNode {
const process = { env: { __VERSION__: "0.0.0" } };
const reducer = useAnastasisContext()!;
+ function saveSession(): void {
+ const state = reducer.exportState();
+ const link = document.createElement("a");
+ link.download = "anastasis.json";
+ link.href = `data:text/plain,${state}`;
+ link.click();
+ }
+
return (
<aside class="aside is-placed-left is-expanded">
{/* {mobile && <div class="footer" onClick={(e) => { return e.stopImmediatePropagation() }}>
@@ -171,6 +179,16 @@ export function Sidebar({ mobile }: Props): VNode {
<span class="menu-item-label"><Translate>Truth Paying</Translate></span>
</div>
</li> */}
+ <li>
+ <div class="buttons ml-4">
+ <button
+ class="button is-primary is-right"
+ onClick={saveSession}
+ >
+ Save backup session
+ </button>
+ </div>
+ </li>
</Fragment>
) : (
reducer.currentReducerState &&
@@ -250,6 +268,16 @@ export function Sidebar({ mobile }: Props): VNode {
</span>
</div>
</li>
+ <li>
+ <div class="buttons ml-4">
+ <button
+ class="button is-primary is-right"
+ onClick={saveSession}
+ >
+ Save recovery session
+ </button>
+ </div>
+ </li>
</Fragment>
)
)}