frontend/src/lib/components/borne/transactions.svelte

Summary

Maintainability
Test Coverage
<script lang="ts">
    import type { Transaction, TransactionItem } from '$lib/api';
    import { api } from '$lib/config/config';
    import { transactionsApi } from '$lib/requests/requests';
    import { formatPrice } from '$lib/utils';
    import { onMount } from 'svelte';

    export let amount: number = 3;

    let transactions: Array<Transaction> = [];
    let maxItemPerTransaction: number = 6;

    onMount(() => {
        transactionsApi()
            .getCurrentAccountTransactions(0, amount, undefined, { withCredentials: true })
            .then((res) => {
                if (!(res.data.transactions instanceof Array)) return;
                let countedItems = 0;
                let newTransactions = [];
                for (let transaction of res.data.transactions) {
                    let items: Array<TransactionItem> = [];
                    for (let item of transaction.items) {
                        if (countedItems >= maxItemPerTransaction) break;
                        if (countedItems + item.item_amount > maxItemPerTransaction) {
                            item.item_amount = maxItemPerTransaction - countedItems;
                        }
                        if (item.item_amount > 0) {
                            items.push(item);
                        }
                    }
                    transaction.items = items;
                    newTransactions.push(transaction);
                }
                transactions = newTransactions;
            });
    });
</script>

<!-- Good looking dropdown for transaction -->
<div class="w-full">
    <div class="flex flex-col">
        <div class="flex flex-row justify-between">
            <div class="text-lg font-semibold">Transactions</div>
            <div class="text-lg font-semibold">Montant</div>
        </div>
        <div class="flex flex-col">
            {#each transactions as transaction}
                <div class="flex flex-row justify-between mt-5 border-4 border-white rounded-xl {transaction.state=="started" ? "animate-pulse bg-green-100":""} {transaction.state=="canceled" ? "bg-gray-200":""} {transaction.state=="finished" ? "bg-green-200":""}">
                    <div class="p-5 h-full pr-4 w-full">
                        {#each transaction.items as item}
                            <div class="grid grid-cols-3 gap-2">
                                <!-- One for each item.amount -->
                                {#each Array(item.item_amount) as _}
                                    <img
                                        src={api() + item.picture_uri}
                                        alt="ca charge"
                                        class="w-10 h-10 rounded-2xl"
                                    />
                                {/each}
                            </div>
                        {/each}
                    </div>
                    <div class="border-r border-l border-gray-400" />
                    <div class="p-5 pl-4 w-full text-lg self-center text-center text-red-600">
                        -{formatPrice(transaction.total_cost)}
                    </div>
                </div>
            {/each}
        </div>
    </div>
</div>