import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useModule, useUserPoints } from '../../lib/react-utils'; import { SortFunction } from '../../lib/type-utils'; import { useAppDispatch } from '../../store'; import { modules, removeRedeem, setUserPoints } from '../../store/api/reducer'; import { DataTable } from '../components/DataTable'; import DialogContent from '../components/DialogContent'; import { Button, Dialog, DialogActions, Field, FlexRow, InputBox, Label, PageContainer, PageHeader, PageTitle, TabButton, TabContainer, TabContent, TabList, TextBlock, } from '../theme'; import { TableCell, TableRow } from '../theme/table'; function RewardQueue() { const { t } = useTranslation(); const [queue] = useModule(modules.loyaltyRedeemQueue); const dispatch = useAppDispatch(); // Big hack but this is required or refunds break useUserPoints(); const data = queue?.map((q) => ({ ...q, date: new Date(q.when) })) ?? []; type Redeem = typeof data[0]; const sortfn = (key: keyof Redeem) => (a: Redeem, b: Redeem) => { switch (key) { case 'display_name': { return a.display_name?.localeCompare(b.display_name); } case 'when': { return a.date && b.date ? a.date.getTime() - b.date.getTime() : 0; } case 'reward': { return a.reward?.name?.localeCompare(b.reward.name); } default: return 0; } }; return ( <> {(data.length > 0 && ( ( {entry.date.toLocaleString()} {entry.username} {entry.reward?.name} {entry.request_text} )} /> )) ||

{t('pages.loyalty-queue.no-redeems')}

} ); } function UserList() { const { t } = useTranslation(); const users = useUserPoints(); const dispatch = useAppDispatch(); const [currentEntry, setCurrentEntry] = useState(null); const [givePointDialog, setGivePointDialog] = useState({ open: false, user: '', points: 0, }); const [config] = useModule(modules.loyaltyConfig); const [usernameFilter, setUsernameFilter] = useState(''); const filtered = Object.entries(users ?? []) .filter(([user]) => user.includes(usernameFilter)) .map(([username, data]) => ({ username, ...data, })); type UserEntry = typeof filtered[0]; const sortfn = (key: keyof UserEntry): SortFunction => { switch (key) { case 'username': { return (a, b) => a.username.localeCompare(b.username); } case 'points': { return (a: UserEntry, b: UserEntry) => a.points - b.points; } } }; return ( <> setGivePointDialog({ ...givePointDialog, open: state }) } >
{ e.preventDefault(); if ((e.target as HTMLFormElement).checkValidity()) { void dispatch( setUserPoints({ ...givePointDialog, relative: true, }), ); setGivePointDialog({ ...givePointDialog, open: false }); } }} > setGivePointDialog({ ...givePointDialog, user: e.target.value, }) } /> setGivePointDialog({ ...givePointDialog, points: parseInt(e.target.value, 10), }) } />
setCurrentEntry(state ? currentEntry : null)} >
{ e.preventDefault(); if ((e.target as HTMLFormElement).checkValidity()) { void dispatch( setUserPoints({ user: currentEntry.username, points: currentEntry.points, relative: false, }), ); setCurrentEntry(null); } }} > setCurrentEntry({ ...currentEntry, points: parseInt(e.target.value, 10), }) } />
setUsernameFilter(e.target.value)} /> {(filtered.length > 0 && ( ( {entry.username} {entry.points} )} /> )) ||

{t('pages.loyalty-queue.no-users')}

} ); } export default function LoyaltyQueuePage(): React.ReactElement { const { t } = useTranslation(); return ( {t('pages.loyalty-queue.title')} {t('pages.loyalty-queue.subtitle')} {t('pages.loyalty-queue.queue-tab')} {t('pages.loyalty-queue.users-tab')} ); }