parent
6667fcd37f
commit
16e0baa90a
@ -0,0 +1,57 @@ |
|||||||
|
<!-- |
||||||
|
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers |
||||||
|
// All rights reserved. |
||||||
|
// Licensed under the Apache License, Version 2.0 |
||||||
|
// <LICENSE-APACHE2 or http://www.apache.org/licenses/LICENSE-2.0> |
||||||
|
// or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>, |
||||||
|
// at your option. All files in the project carrying such |
||||||
|
// notice may not be copied, modified, or distributed except |
||||||
|
// according to those terms. |
||||||
|
--> |
||||||
|
|
||||||
|
<!-- |
||||||
|
@component DeviceIcon |
||||||
|
Display an icon for a device class provided by the `device` attribute. |
||||||
|
Pass `config` for custom attributes. |
||||||
|
--> |
||||||
|
|
||||||
|
<script lang="ts"> |
||||||
|
import { |
||||||
|
Icon, |
||||||
|
Cube, |
||||||
|
GlobeAlt, |
||||||
|
QuestionMarkCircle, |
||||||
|
DevicePhoneMobile, |
||||||
|
ComputerDesktop, |
||||||
|
ServerStack, |
||||||
|
Key, |
||||||
|
CommandLine, |
||||||
|
} from "svelte-heros-v2"; |
||||||
|
|
||||||
|
export let config = {}; |
||||||
|
export let device: string; |
||||||
|
|
||||||
|
const mapping = { |
||||||
|
Web: GlobeAlt, |
||||||
|
NativeIos: DevicePhoneMobile, |
||||||
|
NativeAndroid: DevicePhoneMobile, |
||||||
|
NativeMacOS: ComputerDesktop, |
||||||
|
NativeLinux: ComputerDesktop, |
||||||
|
NativeWin: ComputerDesktop, |
||||||
|
NativeService: ServerStack, |
||||||
|
NodeService: ServerStack, |
||||||
|
Verifier: ServerStack, |
||||||
|
VerifierLocal: ServerStack, |
||||||
|
ClientBroker: ServerStack, |
||||||
|
WalletMaster: ServerStack, |
||||||
|
Box: Cube, |
||||||
|
Stick: Key, // VerifierStick |
||||||
|
Cli: CommandLine, |
||||||
|
}; |
||||||
|
|
||||||
|
const find = (dataClass: string) => { |
||||||
|
return mapping[dataClass] || QuestionMarkCircle; |
||||||
|
}; |
||||||
|
</script> |
||||||
|
|
||||||
|
<Icon {...config} variation="outline" color="black" icon={find(device)} /> |
@ -0,0 +1,351 @@ |
|||||||
|
<!-- |
||||||
|
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers |
||||||
|
// All rights reserved. |
||||||
|
// Licensed under the Apache License, Version 2.0 |
||||||
|
// <LICENSE-APACHE2 or http://www.apache.org/licenses/LICENSE-2.0> |
||||||
|
// or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>, |
||||||
|
// at your option. All files in the project carrying such |
||||||
|
// notice may not be copied, modified, or distributed except |
||||||
|
// according to those terms. |
||||||
|
--> |
||||||
|
|
||||||
|
<!-- |
||||||
|
@component |
||||||
|
"Wallet Info" user panel sub menu. |
||||||
|
Provides info about wallet, broker, etc. and download option. |
||||||
|
--> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { Modal } from "flowbite-svelte"; |
||||||
|
import { link, push } from "svelte-spa-router"; |
||||||
|
import CenteredLayout from "../lib/CenteredLayout.svelte"; |
||||||
|
import { |
||||||
|
ArrowLeft, |
||||||
|
Trash, |
||||||
|
DocumentArrowDown, |
||||||
|
NoSymbol, |
||||||
|
QrCode, |
||||||
|
Link, |
||||||
|
ArrowDownOnSquare, |
||||||
|
} from "svelte-heros-v2"; |
||||||
|
import { onMount, tick } from "svelte"; |
||||||
|
import { Sidebar, SidebarGroup, SidebarWrapper } from "flowbite-svelte"; |
||||||
|
|
||||||
|
import { close_active_wallet, active_session, active_wallet } from "../store"; |
||||||
|
|
||||||
|
import { default as ng } from "../api"; |
||||||
|
|
||||||
|
let tauri_platform = import.meta.env.TAURI_PLATFORM; |
||||||
|
let error; |
||||||
|
let nonActiveClass = |
||||||
|
"flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700"; |
||||||
|
|
||||||
|
let top; |
||||||
|
|
||||||
|
async function scrollToTop() { |
||||||
|
await tick(); |
||||||
|
top.scrollIntoView(); |
||||||
|
} |
||||||
|
onMount(async () => { |
||||||
|
if (!$active_session) { |
||||||
|
push("#/"); |
||||||
|
} else { |
||||||
|
await scrollToTop(); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
let downloading = false; |
||||||
|
let wallet_file_ready = false; |
||||||
|
let download_link = false; |
||||||
|
let download_error = false; |
||||||
|
async function download_wallet() { |
||||||
|
try { |
||||||
|
downloading = true; |
||||||
|
let file = await ng.wallet_get_file($active_wallet.id); |
||||||
|
// @ts-ignore |
||||||
|
wallet_file_ready = "wallet-" + $active_wallet.id + ".ngw"; |
||||||
|
if (!tauri_platform) { |
||||||
|
const blob = new Blob([file], { |
||||||
|
type: "application/octet-stream", |
||||||
|
}); |
||||||
|
// @ts-ignore |
||||||
|
download_link = URL.createObjectURL(blob); |
||||||
|
} else { |
||||||
|
download_link = true; |
||||||
|
} |
||||||
|
} catch (e) { |
||||||
|
download_error = e; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
let wallet_remove_modal_open = false; |
||||||
|
async function remove_wallet_clicked() { |
||||||
|
wallet_remove_modal_open = true; |
||||||
|
} |
||||||
|
// TODO: WTF, this does not close the modal??? |
||||||
|
const close_modal = () => { |
||||||
|
wallet_remove_modal_open = false; |
||||||
|
}; |
||||||
|
|
||||||
|
async function remove_wallet_confirmed() { |
||||||
|
if (!active_wallet) return; |
||||||
|
// TODO: Wait for implementation |
||||||
|
// ng.wallet_remove($active_wallet.id); |
||||||
|
close_active_wallet(); |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<CenteredLayout> |
||||||
|
<div class="container3" bind:this={top}> |
||||||
|
<div class="row mb-20"> |
||||||
|
<Sidebar {nonActiveClass}> |
||||||
|
<SidebarWrapper |
||||||
|
divClass="bg-gray-60 overflow-y-auto py-4 px-3 rounded dark:bg-gray-800" |
||||||
|
> |
||||||
|
<SidebarGroup ulClass="space-y-2"> |
||||||
|
<li> |
||||||
|
<h2 class="text-xl mb-6">Wallet Info</h2> |
||||||
|
</li> |
||||||
|
|
||||||
|
<!-- Go Back --> |
||||||
|
<!-- svelte-ignore a11y-no-noninteractive-tabindex --> |
||||||
|
<li |
||||||
|
tabindex="0" |
||||||
|
class="text-left text-left flex items-center p-2 text-base font-normal text-gray-900 clickable rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" |
||||||
|
on:keypress={() => window.history.go(-1)} |
||||||
|
on:click={() => window.history.go(-1)} |
||||||
|
> |
||||||
|
<ArrowLeft |
||||||
|
tabindex="-1" |
||||||
|
class="w-7 h-7 text-black transition duration-75 dark:text-white group-hover:text-gray-900 dark:group-hover:text-white" |
||||||
|
/> |
||||||
|
<span class="ml-3">Back</span> |
||||||
|
</li> |
||||||
|
|
||||||
|
<!-- Download Wallet --> |
||||||
|
|
||||||
|
{#if !downloading} |
||||||
|
<li |
||||||
|
tabindex="0" |
||||||
|
role="menuitem" |
||||||
|
class="flex items-center p-2 text-base font-normal text-gray-900 clickable rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" |
||||||
|
on:keypress={download_wallet} |
||||||
|
on:click={download_wallet} |
||||||
|
> |
||||||
|
<div> |
||||||
|
<DocumentArrowDown |
||||||
|
tabindex="-1" |
||||||
|
class="w-7 h-7 text-black transition duration-75 dark:text-white group-hover:text-gray-900 dark:group-hover:text-white" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
<span class="ml-3">Download Wallet File</span> |
||||||
|
</li> |
||||||
|
{:else if download_error} |
||||||
|
<li |
||||||
|
tabindex="-1" |
||||||
|
class="flex items-center p-2 text-base font-normal text-red-700 rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" |
||||||
|
> |
||||||
|
<div> |
||||||
|
<NoSymbol |
||||||
|
tabindex="-1" |
||||||
|
class="w-7 h-7 text-red-700 transition duration-75 dark:text-white group-hover:text-gray-900 dark:group-hover:text-white" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
<span class="ml-3 text-left" |
||||||
|
>Download failed:<br /> {download_error}</span |
||||||
|
> |
||||||
|
</li> |
||||||
|
{:else if !wallet_file_ready} |
||||||
|
<li |
||||||
|
tabindex="-1" |
||||||
|
class="flex items-center p-2 text-base font-normal text-blue-700 rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" |
||||||
|
> |
||||||
|
<div> |
||||||
|
<DocumentArrowDown |
||||||
|
tabindex="-1" |
||||||
|
class="w-7 h-7 text-blue-700 transition duration-75 dark:text-white group-hover:text-gray-900 dark:group-hover:text-white" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
<span class="ml-3 text-left">Download in progress...</span> |
||||||
|
</li> |
||||||
|
{:else if download_link === true} |
||||||
|
<li |
||||||
|
tabindex="-1" |
||||||
|
class="flex p-2 text-sm text-left break-all font-normal text-blue-700 rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" |
||||||
|
> |
||||||
|
<span |
||||||
|
>You will find the file named "{wallet_file_ready}" <br />in |
||||||
|
your Downloads folder</span |
||||||
|
> |
||||||
|
</li> |
||||||
|
{:else} |
||||||
|
<li |
||||||
|
tabindex="-1" |
||||||
|
class="flex items-center text-base font-normal text-gray-900 clickable rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" |
||||||
|
> |
||||||
|
<a |
||||||
|
href={download_link} |
||||||
|
target="_blank" |
||||||
|
download={wallet_file_ready} |
||||||
|
> |
||||||
|
<button |
||||||
|
tabindex="-1" |
||||||
|
class=" text-white bg-primary-700 hover:bg-primary-700/90 focus:ring-4 focus:ring-primary-700/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-700/55" |
||||||
|
> |
||||||
|
<div> |
||||||
|
<DocumentArrowDown |
||||||
|
tabindex="-1" |
||||||
|
class="w-14 h-14 transition duration-75 dark:text-white dark:group-hover:text-white" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
Click here to download the wallet file |
||||||
|
</button> |
||||||
|
</a> |
||||||
|
</li> |
||||||
|
{/if} |
||||||
|
|
||||||
|
<!-- Remove Wallet --> |
||||||
|
<li |
||||||
|
tabindex="0" |
||||||
|
class="text-left flex items-center p-2 text-base font-normal text-gray-900 clickable rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" |
||||||
|
on:keypress={remove_wallet_clicked} |
||||||
|
on:click={remove_wallet_clicked} |
||||||
|
> |
||||||
|
<div> |
||||||
|
<Trash |
||||||
|
tabindex="-1" |
||||||
|
class="w-7 h-7 text-black transition duration-75 dark:text-white group-hover:text-gray-900 dark:group-hover:text-white" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
<span class="ml-3">Remove Wallet from Device</span> |
||||||
|
<Modal |
||||||
|
autoclose |
||||||
|
outsideclose |
||||||
|
bind:open={wallet_remove_modal_open} |
||||||
|
title="Remove Wallet" |
||||||
|
> |
||||||
|
<p class="mt-4"> |
||||||
|
Are you sure you want to remove this wallet from your device? |
||||||
|
</p> |
||||||
|
<div class="mt-4 flex justify-end"> |
||||||
|
<button on:click={close_modal}> Cancel </button> |
||||||
|
|
||||||
|
<button |
||||||
|
class="mr-2 bg-primary-700 text-white" |
||||||
|
on:click={remove_wallet_confirmed} |
||||||
|
> |
||||||
|
Remove |
||||||
|
</button> |
||||||
|
</div> |
||||||
|
</Modal> |
||||||
|
</li> |
||||||
|
|
||||||
|
<!-- TODO: Show QR-Code --> |
||||||
|
{#if false} |
||||||
|
<li |
||||||
|
tabindex="0" |
||||||
|
class="text-left flex items-center p-2 text-base font-normal text-gray-900 clickable rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" |
||||||
|
> |
||||||
|
<div> |
||||||
|
<QrCode |
||||||
|
tabindex="-1" |
||||||
|
class="w-7 h-7 text-black transition duration-75 dark:text-white group-hover:text-gray-900 dark:group-hover:text-white" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
<span class="ml-3">Wallet QR-Code</span> |
||||||
|
<Modal autoclose outsideclose title="My Wallet QR-Code" |
||||||
|
>Use this QR-Code to log in with your wallet on new devices. |
||||||
|
</Modal> |
||||||
|
</li> |
||||||
|
{/if} |
||||||
|
|
||||||
|
<!-- TODO: Copy Wallet Link --> |
||||||
|
{#if false} |
||||||
|
<li |
||||||
|
tabindex="0" |
||||||
|
class="text-left flex items-center p-2 text-base font-normal text-gray-900 clickable rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" |
||||||
|
> |
||||||
|
<div> |
||||||
|
<Link |
||||||
|
tabindex="-1" |
||||||
|
class="w-7 h-7 text-black transition duration-75 dark:text-white group-hover:text-gray-900 dark:group-hover:text-white" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
<span class="ml-3">Copy Wallet Link</span> |
||||||
|
</li> |
||||||
|
{/if} |
||||||
|
|
||||||
|
<!-- TODO: Save to Device --> |
||||||
|
{#if false} |
||||||
|
<li |
||||||
|
tabindex="0" |
||||||
|
class="text-left flex items-center p-2 text-base font-normal text-gray-900 clickable rounded-lg dark:text-white hover:bg-gray-200 dark:hover:bg-gray-700" |
||||||
|
> |
||||||
|
<!-- TODO: Same as with the trash icon, this is not same-sized as the others. --> |
||||||
|
<ArrowDownOnSquare |
||||||
|
tabindex="-1" |
||||||
|
class="w-7 h-7 text-black transition duration-75 dark:text-white group-hover:text-gray-900 dark:group-hover:text-white" |
||||||
|
/> |
||||||
|
<span class="ml-3">Save to Device for Future Logins</span> |
||||||
|
</li> |
||||||
|
{/if} |
||||||
|
</SidebarGroup> |
||||||
|
</SidebarWrapper> |
||||||
|
</Sidebar> |
||||||
|
</div> |
||||||
|
{#if error} |
||||||
|
<div class=" max-w-6xl lg:px-8 mx-auto px-4 text-red-800"> |
||||||
|
<svg |
||||||
|
class="animate-bounce mt-10 h-16 w-16 mx-auto" |
||||||
|
fill="none" |
||||||
|
stroke="currentColor" |
||||||
|
stroke-width="1.5" |
||||||
|
viewBox="0 0 24 24" |
||||||
|
xmlns="http://www.w3.org/2000/svg" |
||||||
|
aria-hidden="true" |
||||||
|
> |
||||||
|
<path |
||||||
|
stroke-linecap="round" |
||||||
|
stroke-linejoin="round" |
||||||
|
d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z" |
||||||
|
/> |
||||||
|
</svg> |
||||||
|
{#if error == "AlreadyExists"} |
||||||
|
<p class="max-w-xl md:mx-auto lg:max-w-2xl mb-5"> |
||||||
|
The user is already registered with the selected broker.<br /> Try logging |
||||||
|
in instead |
||||||
|
</p> |
||||||
|
<a use:link href="/"> |
||||||
|
<button |
||||||
|
tabindex="-1" |
||||||
|
class="text-white bg-primary-700 hover:bg-primary-700/90 focus:ring-4 focus:ring-primary-700/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-700/55 mb-2" |
||||||
|
> |
||||||
|
Login |
||||||
|
</button> |
||||||
|
</a> |
||||||
|
{:else} |
||||||
|
<p class="max-w-xl md:mx-auto lg:max-w-2xl mb-5"> |
||||||
|
An error occurred:<br />{error} |
||||||
|
</p> |
||||||
|
<a use:link href="/"> |
||||||
|
<button |
||||||
|
tabindex="-1" |
||||||
|
class="text-white bg-primary-700 hover:bg-primary-700/90 focus:ring-4 focus:ring-primary-700/50 font-medium rounded-lg text-lg px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-primary-700/55 mb-2" |
||||||
|
> |
||||||
|
Go back to homepage |
||||||
|
</button> |
||||||
|
</a> |
||||||
|
{/if} |
||||||
|
</div> |
||||||
|
{/if} |
||||||
|
</div> |
||||||
|
</CenteredLayout> |
||||||
|
|
||||||
|
<style> |
||||||
|
li.clickable { |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
.site-cnx-details { |
||||||
|
@apply mt-0 !important; |
||||||
|
} |
||||||
|
</style> |
Loading…
Reference in new issue