5180 fichiers 38.5 Mo 0 téléchargements 591 vues mis à jour il y a 8 heures ui
recycler.helpers.ts 1.6 Ko Télécharger le fichier
import { GroupItem } from '../../../../../../api';

export interface RecyclerInventoryChoice {
    iconUrl: string;
    itemId: number;
    name: string;
}

export const normalizeRecyclerSlotCount = (value: unknown, fallback = 8) => {
    const count = Number(value);

    return Number.isInteger(count) && count > 0 ? Math.min(count, 12) : fallback;
};

export const getRecyclerInventoryChoices = (groups: readonly GroupItem[], selectedIds: ReadonlySet<number>) =>
    groups.flatMap((group) => {
        const item = group.items.find((candidate) => candidate.recyclable && !candidate.locked && !selectedIds.has(candidate.id));

        if (!item) return [];

        return [{ iconUrl: group.iconUrl, itemId: item.id, name: group.name } satisfies RecyclerInventoryChoice];
    });

export const getRecyclerEligibleItemIds = (groups: readonly GroupItem[]) =>
    new Set(
        groups.flatMap((group) =>
            group.items.filter((item) => item.recyclable && !item.locked).map((item) => item.id)
        )
    );

export const reconcileRecyclerSlots = (
    slots: readonly RecyclerInventoryChoice[],
    eligibleIds: ReadonlySet<number>
) => slots.filter((slot, index) => eligibleIds.has(slot.itemId) && slots.findIndex((item) => item.itemId === slot.itemId) === index);

export const addRecyclerSlot = (
    slots: RecyclerInventoryChoice[],
    choice: RecyclerInventoryChoice,
    slotCount: number,
    eligibleIds: ReadonlySet<number>
) => {
    if (slots.length >= slotCount || !eligibleIds.has(choice.itemId) || slots.some((slot) => slot.itemId === choice.itemId)) {
        return slots;
    }

    return [...slots, choice];
};
15Sujets
1Dépôts
20Membres
4En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser