frontend/src/routes/panel/accounts/nickname/+page.svelte

Summary

Maintainability
Test Coverage
<script lang="ts">
    import type { Account, UpdateAccountAdmin } from '$lib/api';
    import { accountsApi } from '$lib/requests/requests';
    import { onMount } from 'svelte';

    let accounts: Account[] = [];
    let selectedAccount: Account | null = null;

    let nickname: string = '';

    async function getAccounts(search: string) {
        let res = await accountsApi().getAccounts(0, 5, search, { withCredentials: true });
        if (Array.isArray(res.data.accounts)) accounts = res.data.accounts;
    }

    async function updateAccount() {
        if (!selectedAccount) return;
        let res = await accountsApi().patchAccountId(
            selectedAccount.id,
            {
                nickname: nickname
            },
            { withCredentials: true }
        );
        if (res.status === 200) {
            selectedAccount.nickname = nickname;
        }
    }

    onMount(async () => {
        await getAccounts('');
    });
</script>

<div class="w-full flex flex-row justify-center mt-5">
    <div class="w-[50%] flex flex-col gap-5">
        <div class="bg-slate-100 flex flex-col rounded-xl border-2 p-4">
            <div class="text-3xl text-center font-bold p-5">Sélection du compte</div>

            <div class="flex flex-row justify-center">
                <input
                    type="text"
                    class="w-1/2 rounded-lg p-2 border-2 border-slate-200"
                    placeholder="nom du compte"
                    on:keyup={async (e) => {
                        // @ts-ignore
                        let val = e.target?.value;
                        await getAccounts(val);
                    }}
                />
            </div>

            <div class="grid grid-cols-4 items-center gap-3 overflow-x-auto mt-2 p-5 h-56">
                {#each accounts as a}
                    <button
                        class="flex flex-col flex-shrink-0 bg-blue-100 hover:bg-blue-200 rounded-sm p-5 text-center text-lg h-24 justify-center"
                        on:click={() => {
                            selectedAccount = a;
                            nickname = a.nickname ?? '';
                        }}
                    >
                        {a.first_name}
                        {a.last_name}
                    </button>
                {/each}
            </div>
        </div>

        {#if selectedAccount}
            <div class="bg-slate-100 flex flex-col rounded-xl border-2 p-4">
                <div class="text-3xl text-center font-bold p-5">
                    {selectedAccount?.first_name}
                    {selectedAccount?.last_name}
                    {#if selectedAccount?.nickname}
                        (Surnom : {selectedAccount?.nickname})
                    {/if}
                </div>

                <input
                    type="text"
                    class="w-1/2 rounded-lg p-2 border-2 border-slate-200 self-center mt-5"
                    placeholder="nouveau surnom"
                    bind:value={nickname}
                />

                <button
                    class="rounded-md p-2 text-center bg-green-200 hover:bg-green-300 mx-32 mt-5"
                    on:click={() => {
                        updateAccount();
                    }}
                >
                    Valider
                </button>
            </div>
        {/if}
    </div>
</div>