nitro-react/src/views/purse/PurseView.tsx

90 lines
3.0 KiB
TypeScript
Raw Normal View History

2021-04-16 05:44:54 +02:00
import { Nitro, UserCreditsEvent, UserCurrencyComposer, UserCurrencyEvent, UserCurrencyUpdateEvent } from 'nitro-renderer';
2021-04-21 05:36:39 +02:00
import { useCallback, useEffect, useState } from 'react';
2021-04-15 19:29:48 +02:00
import { CreateMessageHook, SendMessageHook } from '../../hooks/messages/message-event';
2021-04-21 05:36:39 +02:00
import { TransitionAnimation } from '../../transitions/TransitionAnimation';
import { TransitionAnimationTypes } from '../../transitions/TransitionAnimation.types';
import { CurrencySet } from './currency/CurrencySet';
2021-04-15 19:29:48 +02:00
import { CurrencyView } from './currency/CurrencyView';
import { PurseViewProps } from './PurseView.types';
export function PurseView(props: PurseViewProps): JSX.Element
{
2021-04-21 05:36:39 +02:00
const [ currencies, setCurrencies ] = useState<CurrencySet[]>([ new CurrencySet(-1, 0) ]);
2021-04-15 19:29:48 +02:00
const [ isReady, setIsReady ] = useState(false);
2021-04-21 05:36:39 +02:00
const displayedCurrencies = Nitro.instance.getConfiguration<number[]>('system.currency.types', []);
const onUserCreditsEvent = useCallback((event: UserCreditsEvent) =>
2021-04-15 19:29:48 +02:00
{
const parser = event.getParser();
2021-04-21 05:36:39 +02:00
updateCurrency(-1, parseFloat(parser.credits));
}, []);
2021-04-15 19:29:48 +02:00
2021-04-21 05:36:39 +02:00
const onUserCurrencyEvent = useCallback((event: UserCurrencyEvent) =>
2021-04-15 19:29:48 +02:00
{
const parser = event.getParser();
2021-04-21 05:36:39 +02:00
for(const [ key, value ] of parser.currencies.entries()) updateCurrency(key, value);
2021-04-15 19:29:48 +02:00
setIsReady(true);
2021-04-21 05:36:39 +02:00
}, []);
2021-04-15 19:29:48 +02:00
2021-04-21 05:36:39 +02:00
const onUserCurrencyUpdateEvent = useCallback((event: UserCurrencyUpdateEvent) =>
2021-04-15 19:29:48 +02:00
{
const parser = event.getParser();
2021-04-21 05:36:39 +02:00
updateCurrency(parser.type, parser.amount)
}, []);
function updateCurrency(type: number, amount: number): void
{
setCurrencies(oldState =>
{
const newState: CurrencySet[] = [];
let found = false;
for(const set of oldState)
{
if(set.type !== type)
{
newState.push(set);
continue;
}
newState.push(new CurrencySet(set.type, amount));
found = true;
}
if(!found) newState.push(new CurrencySet(type, amount));
return newState;
});
}
2021-04-15 19:29:48 +02:00
CreateMessageHook(new UserCreditsEvent(onUserCreditsEvent));
CreateMessageHook(new UserCurrencyEvent(onUserCurrencyEvent));
CreateMessageHook(new UserCurrencyUpdateEvent(onUserCurrencyUpdateEvent));
useEffect(() =>
{
SendMessageHook(new UserCurrencyComposer());
}, []);
return (
2021-04-21 05:36:39 +02:00
<TransitionAnimation className="nitro-purse position-relative mb-1" type={ TransitionAnimationTypes.FADE_DOWN } inProp={ isReady } timeout={ 300 }>
<div className="row px-0 mx-0">
{ currencies && currencies.map((set, index) =>
{
if(displayedCurrencies.indexOf(set.type) === -1) return null;
return <CurrencyView key={ index } currencySet={ set } />
}) }
2021-04-15 19:29:48 +02:00
</div>
2021-04-21 05:36:39 +02:00
</TransitionAnimation>
2021-04-15 19:29:48 +02:00
);
}