mirror of
https://github.com/billsonnn/nitro-react.git
synced 2024-11-26 15:40:51 +01:00
Add purse
This commit is contained in:
parent
10373b08c8
commit
bf1f357848
@ -54,7 +54,7 @@
|
|||||||
"chat.history.max.items": 100,
|
"chat.history.max.items": 100,
|
||||||
"animation.fps": 24,
|
"animation.fps": 24,
|
||||||
"limits.fps": true,
|
"limits.fps": true,
|
||||||
"system.dispatcher.log": true,
|
"system.dispatcher.log": false,
|
||||||
"system.currency.types": [
|
"system.currency.types": [
|
||||||
-1,
|
-1,
|
||||||
0,
|
0,
|
||||||
|
@ -12,14 +12,10 @@ export function CreateEventDispatcherHook(type: string, eventDispatcher: IEventD
|
|||||||
|
|
||||||
useEffect(() =>
|
useEffect(() =>
|
||||||
{
|
{
|
||||||
console.log('register', type);
|
|
||||||
|
|
||||||
eventDispatcher.addEventListener(type, handlerRef.current);
|
eventDispatcher.addEventListener(type, handlerRef.current);
|
||||||
|
|
||||||
return () =>
|
return () =>
|
||||||
{
|
{
|
||||||
console.log('unregister', type);
|
|
||||||
|
|
||||||
eventDispatcher.removeEventListener(type, handlerRef.current);
|
eventDispatcher.removeEventListener(type, handlerRef.current);
|
||||||
}
|
}
|
||||||
}, [ type, eventDispatcher, handler ]);
|
}, [ type, eventDispatcher, handler ]);
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { IMessageEvent } from 'nitro-renderer';
|
import { IMessageComposer, IMessageEvent } from 'nitro-renderer';
|
||||||
import { Nitro } from 'nitro-renderer/src/nitro/Nitro';
|
import { Nitro } from 'nitro-renderer/src/nitro/Nitro';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
|
|
||||||
export function CreateMessageHook(event: IMessageEvent)
|
export function CreateMessageHook(event: IMessageEvent): void
|
||||||
{
|
{
|
||||||
useEffect(() =>
|
useEffect(() =>
|
||||||
{
|
{
|
||||||
@ -14,3 +14,8 @@ export function CreateMessageHook(event: IMessageEvent)
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function SendMessageHook(event: IMessageComposer<unknown[]>): void
|
||||||
|
{
|
||||||
|
Nitro.instance.communication.connection.send(event);
|
||||||
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
@import './avatar-image/AvatarImage.scss';
|
@import './avatar-image/AvatarImage.scss';
|
||||||
@import './hotel-view/HotelView.scss';
|
@import './hotel-view/HotelView.scss';
|
||||||
@import './loading/LoadingView.scss';
|
@import './loading/LoadingView.scss';
|
||||||
@import './main//MainView.scss';
|
@import './main/MainView.scss';
|
||||||
@import './toolbar//ToolbarView.scss';
|
@import './purse/PurseView.scss';
|
||||||
|
@import './right-side/RightSideView.scss';
|
||||||
|
@import './toolbar/ToolbarView.scss';
|
||||||
|
@ -4,6 +4,7 @@ import { useRoomEngineEvent } from '../../hooks/events/nitro/room/room-engine-ev
|
|||||||
import { useRoomSessionManagerEvent } from '../../hooks/events/nitro/session/room-session-manager-event';
|
import { useRoomSessionManagerEvent } from '../../hooks/events/nitro/session/room-session-manager-event';
|
||||||
import { FadeTransition } from '../../transitions/FadeTransition';
|
import { FadeTransition } from '../../transitions/FadeTransition';
|
||||||
import { HotelView } from '../hotel-view/HotelView';
|
import { HotelView } from '../hotel-view/HotelView';
|
||||||
|
import { RightSideView } from '../right-side/RightSideView';
|
||||||
import { ToolbarView } from '../toolbar/ToolbarView';
|
import { ToolbarView } from '../toolbar/ToolbarView';
|
||||||
import { MainViewProps } from './MainView.types';
|
import { MainViewProps } from './MainView.types';
|
||||||
|
|
||||||
@ -110,6 +111,7 @@ export function MainView(props: MainViewProps): JSX.Element
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<HotelView />
|
<HotelView />
|
||||||
|
<RightSideView />
|
||||||
<FadeTransition inProp={ isReady } timeout={ 300 }>
|
<FadeTransition inProp={ isReady } timeout={ 300 }>
|
||||||
<ToolbarView />
|
<ToolbarView />
|
||||||
</FadeTransition>
|
</FadeTransition>
|
||||||
|
1
src/views/purse/PurseView.scss
Normal file
1
src/views/purse/PurseView.scss
Normal file
@ -0,0 +1 @@
|
|||||||
|
@import './currency/CurrencyView.scss';
|
65
src/views/purse/PurseView.tsx
Normal file
65
src/views/purse/PurseView.tsx
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
import { Map } from 'immutable';
|
||||||
|
import { UserCreditsEvent, UserCurrencyEvent, UserCurrencyUpdateEvent } from 'nitro-renderer';
|
||||||
|
import { UserCurrencyComposer } from 'nitro-renderer/src/nitro/communication/messages/outgoing/user/inventory/currency/UserCurrencyComposer';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import { CreateMessageHook, SendMessageHook } from '../../hooks/messages/message-event';
|
||||||
|
import { FadeTransition } from '../../transitions/FadeTransition';
|
||||||
|
import { CurrencyView } from './currency/CurrencyView';
|
||||||
|
import { PurseViewProps } from './PurseView.types';
|
||||||
|
|
||||||
|
export function PurseView(props: PurseViewProps): JSX.Element
|
||||||
|
{
|
||||||
|
const [ currencies, setCurrencies ] = useState(Map({ '-1': 0 }));
|
||||||
|
const [ isReady, setIsReady ] = useState(false);
|
||||||
|
|
||||||
|
const onUserCreditsEvent = (event: UserCreditsEvent) =>
|
||||||
|
{
|
||||||
|
const parser = event.getParser();
|
||||||
|
|
||||||
|
setCurrencies(currencies.set('-1', parseFloat(parser.credits)));
|
||||||
|
};
|
||||||
|
|
||||||
|
const onUserCurrencyEvent = (event: UserCurrencyEvent) =>
|
||||||
|
{
|
||||||
|
const parser = event.getParser();
|
||||||
|
|
||||||
|
const map = {};
|
||||||
|
|
||||||
|
for(const [ key, value ] of parser.currencies.entries())
|
||||||
|
{
|
||||||
|
map[key.toString()] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
setCurrencies(currencies.merge(map));
|
||||||
|
setIsReady(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onUserCurrencyUpdateEvent = (event: UserCurrencyUpdateEvent) =>
|
||||||
|
{
|
||||||
|
const parser = event.getParser();
|
||||||
|
|
||||||
|
setCurrencies(currencies.set(parser.type.toString(), parser.amount));
|
||||||
|
};
|
||||||
|
|
||||||
|
CreateMessageHook(new UserCreditsEvent(onUserCreditsEvent));
|
||||||
|
CreateMessageHook(new UserCurrencyEvent(onUserCurrencyEvent));
|
||||||
|
CreateMessageHook(new UserCurrencyUpdateEvent(onUserCurrencyUpdateEvent));
|
||||||
|
|
||||||
|
useEffect(() =>
|
||||||
|
{
|
||||||
|
SendMessageHook(new UserCurrencyComposer());
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<FadeTransition inProp={ isReady } timeout={ 300 }>
|
||||||
|
<div className="grid-container mb-1">
|
||||||
|
<div className="grid-items grid-2">
|
||||||
|
{ currencies && currencies.entrySeq().map(([ key, value ]) =>
|
||||||
|
{
|
||||||
|
return <CurrencyView key={ key } type={ parseInt(key) } amount={ value } />
|
||||||
|
}) }
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</FadeTransition>
|
||||||
|
);
|
||||||
|
}
|
4
src/views/purse/PurseView.types.ts
Normal file
4
src/views/purse/PurseView.types.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
export interface PurseViewProps
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
31
src/views/purse/currency/CurrencyView.scss
Normal file
31
src/views/purse/currency/CurrencyView.scss
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
.purse-item {
|
||||||
|
flex: 46%;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
padding: 0.23rem;
|
||||||
|
margin-right: 3px;
|
||||||
|
|
||||||
|
&:nth-child(2n),
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-value {
|
||||||
|
font-size: $font-size-sm;
|
||||||
|
padding: 2px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-icon {
|
||||||
|
position: relative;
|
||||||
|
width: 25px;
|
||||||
|
height: 25px;
|
||||||
|
border-radius: $card-border-radius;
|
||||||
|
|
||||||
|
.currency-icon {
|
||||||
|
position: absolute;
|
||||||
|
background-position: center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
13
src/views/purse/currency/CurrencyView.tsx
Normal file
13
src/views/purse/currency/CurrencyView.tsx
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { CurrencyViewProps } from './CurrencyView.types';
|
||||||
|
|
||||||
|
export function CurrencyView(props: CurrencyViewProps): JSX.Element
|
||||||
|
{
|
||||||
|
const { type = -1, amount = 0 } = props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="d-flex item-detail bg-primary rounded border border-black shadow p-1">
|
||||||
|
<div className="flex-grow-1 item-value">{ amount }</div>
|
||||||
|
<div className="item-icon p-1 rounded bg-secondary">{ type }</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/views/purse/currency/CurrencyView.types.ts
Normal file
5
src/views/purse/currency/CurrencyView.types.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export interface CurrencyViewProps
|
||||||
|
{
|
||||||
|
type: number;
|
||||||
|
amount: number;
|
||||||
|
}
|
6
src/views/right-side/RightSideView.scss
Normal file
6
src/views/right-side/RightSideView.scss
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.nitro-right-side {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
z-index: $rightside-zindex;
|
||||||
|
}
|
13
src/views/right-side/RightSideView.tsx
Normal file
13
src/views/right-side/RightSideView.tsx
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { PurseView } from '../purse/PurseView';
|
||||||
|
import { RightSideProps } from './RightSideView.types';
|
||||||
|
|
||||||
|
export function RightSideView(props: RightSideProps): JSX.Element
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
<div className="nitro-right-side">
|
||||||
|
<div className="d-flex flex-column">
|
||||||
|
<PurseView />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
4
src/views/right-side/RightSideView.types.ts
Normal file
4
src/views/right-side/RightSideView.types.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
export interface RightSideProps
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user