Files
classquiz-ai/frontend/src/routes/account/settings/security/totp_setup.svelte
T
2025-09-21 12:42:04 +02:00

73 lines
2.0 KiB
Svelte

<!--
SPDX-FileCopyrightText: 2023 Marlon W (Mawoka)
SPDX-License-Identifier: MPL-2.0
-->
<script lang="ts">
import QRCode from 'qrcode';
import Spinner from '$lib/Spinner.svelte';
import { getLocalization } from '$lib/i18n';
const { t } = getLocalization();
interface Props {
totp_data: { url: string; secret: string } | undefined;
}
let { totp_data = $bindable() }: Props = $props();
const get_image_url = async () => {
return await QRCode.toDataURL(totp_data.url);
};
</script>
<div class="w-screen h-screen fixed top-0 left-0 p-48 z-30 bg-black/50">
<div class="w-full h-full">
<button
class="bg-gray-200 dark:bg-gray-900 px-2 py-1 rounded-t-lg hover:bg-gray-300 transition"
onclick={() => {
totp_data = undefined;
}}
>{$t('words.close')}
</button>
<div class="bg-white dark:bg-gray-700 rounded-b-lg rounded-tr-lg w-full h-full">
<div class="grid grid-cols-3 w-full h-full">
<div class="flex flex-col justify-center w-full h-5/6">
<span class="m-auto"></span>
<div class="h-5/6 flex">
<p class="my-auto ml-auto">
{$t('security_settings.totp_setup.scan_to_set_up')}
</p>
</div>
<div class="flex">
<p class="my-auto ml-auto">
{$t('security_settings.totp_setup.enter_as_secret_if_no_see_code')}
</p>
</div>
</div>
<div class="flex flex-col justify-start w-full h-5/6">
<h2 class="text-2xl m-auto">{$t('security_settings.totp_setup.totp_setup')}</h2>
{#await get_image_url()}
<Spinner my_20={false} />
{:then data}
<div class="m-auto h-5/6 object-contain w-full">
<img
src={data}
alt="QR-Code for Totp-setup"
class="w-full h-full object-contain"
/>
</div>
{/await}
<p class="m-auto select-all font-mono">{totp_data.secret}</p>
</div>
<div class="flex justify-center h-5/6 w-full">
<p class="m-auto text-3xl p-4">
{$t('security_settings.totp_setup.do_not_forget_backup_code')}
</p>
</div>
</div>
</div>
</div>
</div>