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