aboutsummaryrefslogtreecommitdiffstats
path: root/src/routes/(app)/+layout.svelte
blob: 301b838b8098b8f9a84803bd60f084873590dc03 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<script>
  import { SvelteToast } from "@zerodevx/svelte-toast";
  import { onDestroy, onMount } from "svelte";
  import { close, connect, send } from "$lib/socket";
  import {
    last,
    invoice,
    request,
    ndef,
    passwordPrompt,
    password,
    pin,
    theme,
  } from "$lib/store";
  import { page } from "$app/stores";
  import { browser } from "$app/environment";
  import LoadingSplash from "$comp/LoadingSplash.svelte";
  import AppHeader from "$comp/AppHeader.svelte";
  import Invoice from "$comp/Invoice.svelte";
  import Password from "$comp/Password.svelte";
  import { getCookie, warning, protectedRoutes } from "$lib/utils";
  import { t, locale, loading } from "$lib/translations";
  import { goto, afterNavigate, preloadData } from "$app/navigation";

  export let data;

  let { generate, rate, user, subject, token, rates } = data;

  $: update(data);
  let update = (data) => {
    ({ rate, user, subject, token, rates } = data);
  };

  afterNavigate(() => {
    if (user) {
      preloadData(`/${user.username}`);
      preloadData(`/${user.username}/receive`);
      preloadData("/payments");
      preloadData("/send");
    }
  });

  onMount(async () => {
    if (browser) {
      checkSocket();
      $pin = getCookie("pin");

      if (window.NDEFReader && user.nfc) {
        try {
          $ndef = new NDEFReader();
          await $ndef.scan();

          $ndef.addEventListener("readingerror", (e) => {
            console.log("nfc error", e);
          });

          $ndef.addEventListener("reading", ({ message, serialNumber }) => {
            goto(`/send/${message}`);
          });
        } catch (error) {
          console.log("Argh! " + error);
        }
      }
    }
  });

  $: browser && connect(token);

  let lost,
    checkTimer,
    expireTimer,
    counter = 0;

  let checkSocket = () => {
    counter++;
    lost = Date.now() - $last > 30000;
    if (lost) connect(token);
    if (counter > 5) {
      send("heartbeat", token);
      counter = 0;
    }

    checkTimer = setTimeout(checkSocket, 1000);
  };

  onDestroy(() => {
    if (browser) {
      close();
      clearTimeout(checkTimer);
      clearTimeout(expireTimer);
    }
  });
</script>

{#if browser && user && $passwordPrompt}
  <Password {user} />
{/if}

<svelte:head>
  {#if subject}
    <title>coinos - {subject.username}</title>
    <meta name="lightning" content={`lnurlp:${subject.username}@coinos.io`} />
  {:else}
    <title>coinos</title>
  {/if}

  {#if subject?.profile}
    <meta name="og:image" content={`/api/public/${subject.profile}.webp`} />
  {:else}
    <meta property="og:image" content="/images/logo.webp" />
  {/if}
</svelte:head>

<SvelteToast options={{ reversed: true, intro: { y: 192 } }} />

<main class="pb-20 min-h-dvh" data-theme={$theme}>
  <AppHeader {user} {subject} />
  {#if !$loading}
    <slot />
  {/if}
</main>

{#if $invoice}
  <Invoice {user} />
{/if}