Skip to content

Commit 630d568

Browse files
committed
Implement password management and loading modal in login flow
1 parent e439bcf commit 630d568

File tree

4 files changed

+74
-12
lines changed

4 files changed

+74
-12
lines changed

frontend/src/App.svelte

+27-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,24 @@
11
<script lang="ts">
2-
import { Col, Container, Row } from "@sveltestrap/sveltestrap";
2+
import {
3+
Col,
4+
Container,
5+
Modal,
6+
ModalBody,
7+
ModalHeader,
8+
Row,
9+
Spinner,
10+
} from "@sveltestrap/sveltestrap";
311
import SelectTrackedStatiosn from "./lib/SelectTrackedStations.svelte";
412
import Stations from "./lib/Stations.svelte";
513
import Login from "./lib/Login.svelte";
14+
import { checkSavedPassword } from "./lib/auth.svelte";
15+
16+
let checkingPassword: boolean = $state(true);
17+
let foundPassword: boolean = $state(false);
18+
checkSavedPassword().then((fp) => {
19+
foundPassword = fp;
20+
checkingPassword = false;
21+
});
622
</script>
723

824
<main>
@@ -23,5 +39,14 @@
2339
></Row
2440
>
2541
</Container>
26-
<Login></Login>
42+
{#if checkingPassword}
43+
<Modal isOpen={checkingPassword} centered={true}>
44+
<ModalHeader>Logging In...</ModalHeader>
45+
<ModalBody>
46+
<Spinner></Spinner>
47+
</ModalBody>
48+
</Modal>
49+
{:else if !foundPassword}
50+
<Login></Login>
51+
{/if}
2752
</main>

frontend/src/lib/Login.svelte

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
ModalFooter,
99
ModalHeader,
1010
} from "@sveltestrap/sveltestrap";
11-
import { authState } from "./auth.svelte";
11+
import { authState, setPassword } from "./auth.svelte";
1212
1313
let open = $state(true);
1414
let loggingIn = $state(false);
@@ -33,7 +33,7 @@
3333
.then(async (res) => {
3434
if (res.status === 200) {
3535
authState.loggedIn = true;
36-
authState.password = password;
36+
setPassword(password);
3737
open = false;
3838
} else {
3939
error = (await res.text()) || res.statusText;
@@ -46,8 +46,6 @@
4646
.finally(() => {
4747
loggingIn = false;
4848
});
49-
// authState.loggedIn = true;
50-
// open = false;
5149
}
5250
</script>
5351

@@ -72,8 +70,10 @@
7270
<Button color="primary" type="submit" disabled={loggingIn}
7371
>Login</Button
7472
>
75-
<Button color="secondary" onclick={() => (open = false)}
76-
>Guest</Button
73+
<Button
74+
color="secondary"
75+
type="button"
76+
onclick={() => (open = false)}>Guest</Button
7777
>
7878
</ModalFooter>
7979
</form>

frontend/src/lib/SelectTrackedStations.svelte

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts">
22
import { Button, Input, InputGroup } from "@sveltestrap/sveltestrap";
3-
import { authState } from "./auth.svelte";
3+
import { authState, getPassword } from "./auth.svelte";
44
55
let loading = $state(true);
66
$effect(() => {
@@ -37,7 +37,7 @@
3737
method: "POST",
3838
headers: {
3939
"Content-Type": "application/x-www-form-urlencoded",
40-
Authorization: authState.password,
40+
Authorization: getPassword() ?? "",
4141
},
4242
body: formData.toString(),
4343
})

frontend/src/lib/auth.svelte.ts

+39-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,41 @@
1-
export let authState: { loggedIn: boolean; password: string } = $state({
1+
export let authState: { loggedIn: boolean } = $state({
22
loggedIn: false,
3-
password: "",
43
});
4+
5+
export function getPassword(): string | null {
6+
return localStorage.getItem("password");
7+
}
8+
9+
export function setPassword(password: string) {
10+
debugger;
11+
localStorage.setItem("password", password);
12+
}
13+
14+
export async function checkSavedPassword(): Promise<boolean> {
15+
const savedPassword = localStorage.getItem("password");
16+
if (savedPassword !== null) {
17+
const formData = new URLSearchParams({
18+
password: savedPassword,
19+
});
20+
return fetch(import.meta.env.VITE_API_URL + "/login", {
21+
method: "POST",
22+
headers: {
23+
"Content-Type": "application/x-www-form-urlencoded",
24+
},
25+
body: formData.toString(),
26+
})
27+
.then(async (res) => {
28+
if (res.status === 200) {
29+
authState.loggedIn = true;
30+
return true;
31+
} else {
32+
throw res;
33+
}
34+
})
35+
.catch((err) => {
36+
localStorage.removeItem("password");
37+
return false;
38+
});
39+
}
40+
return false;
41+
}

0 commit comments

Comments
 (0)