198 lines
4.8 KiB
Svelte
198 lines
4.8 KiB
Svelte
<script lang="ts">
|
|
import {
|
|
type ContactInfo,
|
|
type Account,
|
|
Gender,
|
|
} from "@hibas123/openauth-internalapi";
|
|
import InternalAPI from "../../../helper/api";
|
|
import Loading from "../Loading.svelte";
|
|
import { onMount } from "svelte";
|
|
import {
|
|
Button,
|
|
Card,
|
|
Input,
|
|
Label,
|
|
Select,
|
|
Heading,
|
|
Spinner,
|
|
Helper,
|
|
} from "flowbite-svelte";
|
|
|
|
let profileInfo: Account;
|
|
let loadedProfileInfo: Account;
|
|
let contactInfo: ContactInfo;
|
|
|
|
let loading = true;
|
|
let error: string | undefined;
|
|
|
|
async function load() {
|
|
error = undefined;
|
|
loading = true;
|
|
|
|
try {
|
|
profileInfo = await InternalAPI.Account.GetProfile();
|
|
loadedProfileInfo = { ...profileInfo };
|
|
contactInfo = await InternalAPI.Account.GetContactInfos();
|
|
} catch (e) {
|
|
error = e.message;
|
|
} finally {
|
|
loading = false;
|
|
}
|
|
}
|
|
|
|
let savingProfile = false;
|
|
|
|
async function saveProfileChanges() {
|
|
savingProfile = true;
|
|
|
|
try {
|
|
await new Promise((yes) => setTimeout(yes, 1000));
|
|
await InternalAPI.Account.UpdateProfile(profileInfo);
|
|
loadedProfileInfo = { ...profileInfo };
|
|
} catch (e) {
|
|
error = e.message;
|
|
} finally {
|
|
savingProfile = false;
|
|
}
|
|
}
|
|
|
|
$: hasProfileChanged =
|
|
JSON.stringify(profileInfo) != JSON.stringify(loadedProfileInfo);
|
|
|
|
onMount(() => {
|
|
load();
|
|
});
|
|
|
|
let genders = [
|
|
{
|
|
value: Gender.None,
|
|
name: "Not saying",
|
|
},
|
|
{
|
|
value: Gender.Male,
|
|
name: "Male",
|
|
},
|
|
{
|
|
value: Gender.Female,
|
|
name: "Female",
|
|
},
|
|
{
|
|
value: Gender.Other,
|
|
name: "Other",
|
|
},
|
|
];
|
|
</script>
|
|
|
|
<Loading {loading} {error}>
|
|
<Card>
|
|
<Heading tag="h5">General Account Details</Heading>
|
|
<hr class="mb-6" />
|
|
<div class="mb-6">
|
|
<Label for="name-input" class="block mb-2">Name</Label>
|
|
<Input id="name-input" placeholder="Name" bind:value={profileInfo.name} />
|
|
</div>
|
|
<div class="mb-6">
|
|
<Label for="birthday-input" class="block mb-2">Birthday (WIP)</Label>
|
|
<Input
|
|
id="birthday-input"
|
|
placeholder="Birthday"
|
|
disabled
|
|
bind:value={profileInfo.birthday}
|
|
/>
|
|
</div>
|
|
<div class="mb-6">
|
|
<Label class="block mb-2"
|
|
>Gender
|
|
<Select items={genders} bind:value={profileInfo.gender} />
|
|
</Label>
|
|
</div>
|
|
|
|
<Button
|
|
disabled={!hasProfileChanged || savingProfile}
|
|
on:click={saveProfileChanges}
|
|
>
|
|
{#if savingProfile}
|
|
<Spinner class="mr-3" size="4" color="white" /> Saving...
|
|
{:else}
|
|
Save
|
|
{/if}
|
|
</Button>
|
|
</Card>
|
|
|
|
<Card class="mt-4">
|
|
<Heading tag="h5">Contact Details (WIP)</Heading>
|
|
<hr class="mb-6" />
|
|
|
|
<Heading tag="h6" color="gray">Mails</Heading>
|
|
<hr class="mb-6" />
|
|
|
|
{#each contactInfo.mail as mail}
|
|
<div class="mb-6">
|
|
<!-- <Label for="mail-input" class="block mb-2">Mail</Label> -->
|
|
<Input
|
|
id="mail-input"
|
|
placeholder="Mail"
|
|
bind:value={mail.mail}
|
|
color={mail.verified ? "green" : "base"}
|
|
disabled
|
|
/>
|
|
{#if mail.verified}
|
|
<Helper class="mt-2" color="green"
|
|
><span class="font-medium">Well done!</span> E-Mail is verified.</Helper
|
|
>
|
|
{:else}
|
|
<Helper class="mt-2" color="gray"
|
|
><span class="font-medium">Oh no!</span> E-Mail needs verification.</Helper
|
|
>
|
|
{/if}
|
|
</div>
|
|
{/each}
|
|
|
|
<Heading tag="h6" color="gray">Phones</Heading>
|
|
<hr class="mb-6" />
|
|
|
|
{#each contactInfo.phone as phone}
|
|
<div class="mb-6">
|
|
<!-- <Label for="phone-input" class="block mb-2">Phone</Label> -->
|
|
<Input
|
|
id="phone-input"
|
|
placeholder="Phone"
|
|
bind:value={phone.phone}
|
|
color={phone.verified ? "green" : "base"}
|
|
disabled
|
|
/>
|
|
{#if phone.verified}
|
|
<Helper class="mt-2" color="green"
|
|
><span class="font-medium">Well done!</span> Phone is verified.</Helper
|
|
>
|
|
{:else}
|
|
<Helper class="mt-2" color="gray"
|
|
><span class="font-medium">Oh no!</span> Phone needs verification.</Helper
|
|
>
|
|
{/if}
|
|
</div>
|
|
{/each}
|
|
<!-- <div class="mb-6">
|
|
<Label for="name-input" class="block mb-2">Name</Label>
|
|
<Input id="name-input" placeholder="Name" bind:value={profileInfo.name} />
|
|
</div>
|
|
<div class="mb-6">
|
|
<Label for="birthday-input" class="block mb-2">Birthday (WIP)</Label>
|
|
<Input
|
|
id="birthday-input"
|
|
placeholder="Birthday"
|
|
disabled
|
|
bind:value={profileInfo.birthday}
|
|
/>
|
|
</div>
|
|
<div class="mb-6">
|
|
<Label class="block mb-2"
|
|
>Gender
|
|
<Select items={genders} bind:value={profileInfo.gender} />
|
|
</Label>
|
|
</div> -->
|
|
|
|
<!-- <Button>Save</Button> -->
|
|
</Card>
|
|
</Loading>
|