Skip to content

Commit 79cfc6b

Browse files
committed
Add admin list
1 parent 7a4aa36 commit 79cfc6b

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

src/lib/components/Error.svelte

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<script lang="ts">
2+
import { FlexWrapper, Icon, Space, Button, toast, LinkButton } from "@davidnet/svelte-ui";
3+
import { browser } from "$app/environment";
4+
import { tick } from "svelte";
5+
6+
export let correlationID = "Unknown";
7+
export let pageName = "Unknown";
8+
export let errorMSG = "Unknown";
9+
10+
async function copyToClipboard() {
11+
if (!browser) return;
12+
13+
try {
14+
const clipboardText = `DN_Account
15+
Page: ${pageName}
16+
Message: ${errorMSG}
17+
CorrelationID: ${correlationID}
18+
Date: ${new Date()}`;
19+
20+
await navigator.clipboard.writeText(clipboardText);
21+
await tick();
22+
toast({
23+
title: "Error copied!",
24+
icon: "content_copy",
25+
appearance: "success",
26+
position: "bottom-left",
27+
autoDismiss: 2000
28+
});
29+
} catch {
30+
toast({
31+
title: "Copy failed!",
32+
desc: "We couldn't access your clipboard.",
33+
icon: "content_copy",
34+
appearance: "danger",
35+
position: "bottom-left",
36+
autoDismiss: 5000
37+
});
38+
}
39+
}
40+
</script>
41+
42+
<h1 style="text-align: center; font-size: 1.8rem;">{pageName}</h1>
43+
<FlexWrapper height="100%" width="100%">
44+
<Icon icon="crisis_alert" size="100px;" color="var(--token-color-text-warning)" />
45+
<h1 style="text-align: center;">Error</h1>
46+
<p role="alert" aria-live="assertive" style="text-align: center;">{errorMSG}</p>
47+
<p style="font-weight: bold;">CorrelationID:</p>
48+
<span style="text-align:center; font-size: 0.8rem;">{correlationID}</span>
49+
<Space height="var(--token-space-6)" />
50+
<Button
51+
onClick={() => {
52+
history.back();
53+
}}>Navigate back</Button
54+
>
55+
<Space height="var(--token-space-4)" />
56+
<Button
57+
appearance="primary"
58+
onClick={() => {
59+
window.location.reload();
60+
}}>Reset</Button
61+
>
62+
<Space height="var(--token-space-4)" />
63+
<Button onClick={copyToClipboard} appearance="discover">Copy Error</Button>
64+
<Space height="var(--token-space-4)" />
65+
<LinkButton href="mailto:contact@davidnet.net">Need help?</LinkButton>
66+
</FlexWrapper>

src/routes/admin/+page.svelte

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<script lang="ts">
2+
import { goto } from "$app/navigation";
3+
import { page } from "$app/state";
4+
import type { SessionInfo } from "$lib/types";
5+
import { onMount } from "svelte";
6+
import Error from "$lib/components/Error.svelte";
7+
import { refreshAccessToken, getSessionInfo, isAuthenticated, LinkButton, Loader } from "@davidnet/svelte-ui";
8+
9+
let correlationID = crypto.randomUUID();
10+
let error = false;
11+
let Authenticated = false;
12+
13+
onMount(async () => {
14+
try {
15+
const si: SessionInfo | null = await getSessionInfo(correlationID);
16+
17+
if (!(await isAuthenticated(correlationID)) || !si || !si.admin) {
18+
goto("/login?redirect=" + encodeURIComponent(page.url.toString()));
19+
return;
20+
}
21+
22+
if (!si || si.email_verified === 0) {
23+
goto("/verify/email/check/" + si?.email);
24+
return;
25+
}
26+
27+
Authenticated = true;
28+
setInterval(
29+
() => {
30+
refreshAccessToken(correlationID, true, false);
31+
},
32+
12 * 60 * 1000
33+
);
34+
} catch (e) {
35+
console.error("Session error:", e);
36+
error = true;
37+
}
38+
});
39+
</script>
40+
41+
{#if error}
42+
<Error pageName="Admin list" errorMSG="Unknown" />
43+
{:else if Authenticated}
44+
<LinkButton href="https://account.davidnet.net/admin/">Account Admin</LinkButton>
45+
<LinkButton href="https://kanban.davidnet.net/admin/">Kanban Admin</LinkButton>
46+
{:else}
47+
<Loader/>
48+
{/if}

0 commit comments

Comments
 (0)