import { IWheelAdminPrize, IWheelAdminPrizeEdit } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { LocalizeText } from '../../api'; import { Column, Flex, Text } from '../../common'; import { useFortuneWheel } from '../../hooks'; import { NitroCard } from '../../layout'; interface EditRow { id: number; category: string; num: number; weight: number; label: string; } interface CategoryDef { key: string; labelKey: string; } const CATEGORIES: CategoryDef[] = [ { key: 'item', labelKey: 'rarevalues.editor.cat.item' }, { key: 'diamanti', labelKey: 'achievements.activitypoint.5' }, { key: 'duckets', labelKey: 'achievements.activitypoint.0' }, { key: 'crediti', labelKey: 'credits' }, { key: 'giri', labelKey: 'rarevalues.editor.cat.spin' }, { key: 'nulla', labelKey: 'rarevalues.editor.cat.nothing' } ]; const prizeToCategory = (prize: IWheelAdminPrize): string => { switch(prize.type) { case 'item': return 'item'; case 'points': return (prize.pointsType === 5) ? 'diamanti' : 'duckets'; case 'credits': return 'crediti'; case 'spin': return 'giri'; default: return 'nulla'; } }; const prizeToNum = (prize: IWheelAdminPrize): number => (prize.type === 'item') ? (parseInt(prize.value) || 0) : prize.amount; const rowToEdit = (row: EditRow): IWheelAdminPrizeEdit => { const base = { id: row.id, weight: row.weight, label: row.label }; switch(row.category) { case 'item': return { ...base, type: 'item', value: String(row.num), amount: 1, pointsType: 0 }; case 'diamanti': return { ...base, type: 'points', value: '', amount: row.num, pointsType: 5 }; case 'duckets': return { ...base, type: 'points', value: '', amount: row.num, pointsType: 0 }; case 'crediti': return { ...base, type: 'credits', value: '', amount: row.num, pointsType: 0 }; case 'giri': return { ...base, type: 'spin', value: '', amount: row.num, pointsType: 0 }; default: return { ...base, type: 'nothing', value: '', amount: 0, pointsType: 0 }; } }; interface FortuneWheelSettingsViewProps { onClose: () => void; } export const FortuneWheelSettingsView: FC = ({ onClose }) => { const { adminPrizes = [], loadAdminPrizes = null, saveAdminPrizes = null } = useFortuneWheel(); const [ editRows, setEditRows ] = useState([]); useEffect(() => { if(loadAdminPrizes) loadAdminPrizes(); }, [ loadAdminPrizes ]); useEffect(() => { setEditRows(adminPrizes.map(prize => ({ id: prize.id, category: prizeToCategory(prize), num: prizeToNum(prize), weight: prize.weight, label: prize.label }))); }, [ adminPrizes ]); const updateRow = (id: number, patch: Partial) => setEditRows(prev => prev.map(row => (row.id === id) ? { ...row, ...patch } : row)); return ( { LocalizeText('rarevalues.editor.type') } { LocalizeText('rarevalues.editor.value') } { LocalizeText('rarevalues.editor.weight') } { LocalizeText('rarevalues.editor.label') } { editRows.map(row => ( updateRow(row.id, { num: parseInt(event.target.value) || 0 }) } className="w-16 rounded border border-black/20 bg-white px-1 py-0.5 text-sm text-[#1f2d34] disabled:opacity-40" /> updateRow(row.id, { weight: parseInt(event.target.value) || 0 }) } className="w-12 rounded border border-black/20 bg-white px-1 py-0.5 text-sm text-[#1f2d34]" /> updateRow(row.id, { label: event.target.value }) } className="min-w-0 grow rounded border border-black/20 bg-white px-1 py-0.5 text-sm text-[#1f2d34]" /> )) } { !editRows.length && { LocalizeText('wheel.settings.empty') } } ); };