options.ts raw
1 import {
2 BrowserSyncData,
3 SIGNER_META_DATA_KEY,
4 SignerMetaData_VaultSnapshot,
5 } from '@common';
6 import './app/common/extensions/array';
7 import browser from 'webextension-polyfill';
8 import { v4 as uuidv4 } from 'uuid';
9
10 //
11 // Functions
12 //
13
14 async function getSignerMetaDataVaultSnapshots(): Promise<
15 SignerMetaData_VaultSnapshot[]
16 > {
17 const data = (await browser.storage.local.get(
18 SIGNER_META_DATA_KEY.vaultSnapshots
19 )) as {
20 vaultSnapshots?: SignerMetaData_VaultSnapshot[];
21 };
22
23 return typeof data.vaultSnapshots === 'undefined'
24 ? []
25 : data.vaultSnapshots.sortBy((x) => x.fileName, 'desc');
26 }
27
28 async function setSignerMetaDataVaultSnapshots(
29 vaultSnapshots: SignerMetaData_VaultSnapshot[]
30 ): Promise<void> {
31 await browser.storage.local.set({
32 vaultSnapshots,
33 });
34 }
35
36 function rebuildSnapshotsList(snapshots: SignerMetaData_VaultSnapshot[]) {
37 const ul = document.getElementById('snapshotsList');
38 if (!ul) {
39 return;
40 }
41
42 // Clear the list
43 ul.innerHTML = '';
44
45 for (const snapshot of snapshots) {
46 const li = document.createElement('li');
47
48 const test =
49 '"' +
50 snapshot.fileName +
51 '"' +
52 ' -> vault version: ' +
53 snapshot.data.version +
54 ' -> identities: ' +
55 snapshot.data.identities.length +
56 ' -> relays: ' +
57 snapshot.data.relays.length +
58 '';
59
60 li.innerText = test;
61 ul.appendChild(li);
62 }
63 }
64
65 //
66 // Main
67 //
68
69 document.addEventListener('DOMContentLoaded', async () => {
70 const uploadSnapshotsButton = document.getElementById(
71 'uploadSnapshotsButton'
72 );
73 const deleteSnapshotsButton = document.getElementById(
74 'deleteSnapshotsButton'
75 );
76 const uploadSnapshotInput = document.getElementById(
77 'uploadSnapshotInput'
78 ) as HTMLInputElement;
79
80 deleteSnapshotsButton?.addEventListener('click', async () => {
81 await setSignerMetaDataVaultSnapshots([]);
82 rebuildSnapshotsList([]);
83 });
84
85 uploadSnapshotsButton?.addEventListener('click', async () => {
86 uploadSnapshotInput?.click();
87 });
88
89 uploadSnapshotInput?.addEventListener('change', async (event) => {
90 const files = (event.target as HTMLInputElement).files;
91 if (!files) {
92 return;
93 }
94
95 try {
96 const existingSnapshots = await getSignerMetaDataVaultSnapshots();
97
98 const newSnapshots: SignerMetaData_VaultSnapshot[] = [];
99 for (const file of files) {
100 const text = await file.text();
101 const vault = JSON.parse(text) as BrowserSyncData;
102
103 // Check, if the "new" file is already in the list (via fileName comparison)
104 if (existingSnapshots.some((x) => x.fileName === file.name)) {
105 continue;
106 }
107
108 newSnapshots.push({
109 id: uuidv4(),
110 fileName: file.name,
111 createdAt: new Date().toISOString(),
112 data: vault,
113 identityCount: vault.identities?.length ?? 0,
114 reason: 'manual',
115 });
116 }
117
118 const snapshots = [...existingSnapshots, ...newSnapshots].sortBy(
119 (x) => x.fileName,
120 'desc'
121 );
122
123 // Persist the new snapshots to the local storage
124 await setSignerMetaDataVaultSnapshots(snapshots);
125
126 //
127 rebuildSnapshotsList(snapshots);
128 } catch (error) {
129 console.log(error);
130 }
131 });
132
133 const snapshots = await getSignerMetaDataVaultSnapshots();
134 rebuildSnapshotsList(snapshots);
135 });
136