import { AdvancedMap } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { GroupItem, LocalizeText, TradeState } from '../../../../api'; import { AutoGrid, Base, Button, Column, Flex, Grid, LayoutGridItem, Text } from '../../../../common'; import { useInventoryTrade } from '../../../../hooks'; import { MAX_ITEMS_TO_TRADE, TABS, TAB_FURNITURE } from '../../constants'; interface InventoryTradeViewProps { currentTab: string; setCurrentTab: (value: string) => void; cancelTrade: () => void; } export const InventoryTradeView: FC = props => { const { currentTab = null, setCurrentTab = null, cancelTrade = null } = props; const [ ownGroupItem, setOwnGroupItem ] = useState(null); const [ otherGroupItem, setOtherGroupItem ] = useState(null); const [ countdownTick, setCountdownTick ] = useState(3); const { ownUser = null, otherUser = null, tradeState = TradeState.TRADING_STATE_READY, progressTrade = null, removeItem = null, setTradeState = null } = useInventoryTrade(); const getLockIcon = (accepts: boolean) => { if(accepts) { return } else { return } } const getTotalCredits = (items: AdvancedMap): number => { return items.getValues().map( item => Number(item.iconUrl.split('/')[item.iconUrl.split('/').length - 1]?.split('_')[1]) * item.items.length ).reduce((acc, cur) => acc + (isNaN(cur) ? 0 : cur), 0); } useEffect(() => { if(tradeState !== TradeState.TRADING_STATE_COUNTDOWN) return; setCountdownTick(3); const interval = window.setInterval(() => { setCountdownTick(prevValue => { const newValue = (prevValue - 1); if(newValue === 0) clearInterval(interval); return newValue; }); }, 1000); return () => clearInterval(interval); }, [ tradeState, setTradeState ]); useEffect(() => { if(countdownTick !== 0) return; setTradeState(TradeState.TRADING_STATE_CONFIRMING); }, [ countdownTick, setTradeState ]); if((tradeState === TradeState.TRADING_STATE_READY) || !ownUser || !otherUser) return null; return ( { currentTab === TAB_FURNITURE && <> { LocalizeText('inventory.trading.info.add') } { (ownUser.accepts) && } { LocalizeText('inventory.trading.you') } { LocalizeText('inventory.trading.areoffering') } { Array.from(Array(MAX_ITEMS_TO_TRADE), (e, i) => { const item = (ownUser.userItems.getWithIndex(i) || null); if(!item) return ; return ( setOwnGroupItem(item) } onDoubleClick={ event => removeItem(item) }> { (ownGroupItem === item) && removeItem(item) } /> } ); }) } { LocalizeText('inventory.trading.info.itemcount', [ 'value' ], [ ownUser.itemCount.toString() ]) } { LocalizeText('inventory.trading.info.creditvalue.own', [ 'value' ], [ getTotalCredits(ownUser.userItems).toString() ]) } { getLockIcon(ownUser.accepts) } { (otherUser.accepts) && } { otherUser.userName } { LocalizeText('inventory.trading.isoffering') } { Array.from(Array(MAX_ITEMS_TO_TRADE), (e, i) => { const item = (otherUser.userItems.getWithIndex(i) || null); if(!item) return ; return setOtherGroupItem(item) } />; }) } { LocalizeText('inventory.trading.info.itemcount', [ 'value' ], [ otherUser.itemCount.toString() ]) } { LocalizeText('inventory.trading.info.creditvalue', [ 'value' ], [ getTotalCredits(otherUser.userItems).toString() ]) } { getLockIcon(otherUser.accepts) } } { currentTab !== TAB_FURNITURE && <> { LocalizeText('inventory.trading.minimized.trade_in_progress') } } { (currentTab === TAB_FURNITURE) && <> { (tradeState === TradeState.TRADING_STATE_READY) && } { (tradeState === TradeState.TRADING_STATE_RUNNING) && } { (tradeState === TradeState.TRADING_STATE_COUNTDOWN) && } { (tradeState === TradeState.TRADING_STATE_CONFIRMING) && } { (tradeState === TradeState.TRADING_STATE_CONFIRMED) && } } { (currentTab !== TAB_FURNITURE) && } ); }