nitro-react/src/views/groups/GroupsMessageHandler.tsx

142 lines
4.3 KiB
TypeScript
Raw Normal View History

2021-09-03 23:44:58 +02:00
import { GroupBadgePartsEvent, GroupBuyDataEvent, GroupSettingsEvent, RoomCreatedEvent } from '@nitrots/nitro-renderer';
2021-08-31 05:22:20 +02:00
import { FC, useCallback } from 'react';
import { CreateMessageHook } from '../../hooks';
2021-09-03 23:44:58 +02:00
import { GroupBadgePart } from './common/GroupBadgePart';
2021-08-31 05:22:20 +02:00
import { useGroupsContext } from './context/GroupsContext';
import { GroupsActions } from './context/GroupsContext.types';
2021-09-03 07:09:48 +02:00
function compareId(a, b)
{
if( a.id < b.id ) return -1;
if( a.id > b.id ) return 1;
return 0;
}
2021-08-31 05:22:20 +02:00
export const GroupsMessageHandler: FC<{}> = props =>
{
const { groupsState = null, dispatchGroupsState = null } = useGroupsContext();
2021-09-03 07:09:48 +02:00
const { availableRooms = null } = groupsState;
const onGroupBuyDataEvent = useCallback((event: GroupBuyDataEvent) =>
{
const parser = event.getParser();
const rooms: { id: number, name: string }[] = [];
parser.availableRooms.forEach((name, id) =>
{
rooms.push({ id, name });
});
dispatchGroupsState({
type: GroupsActions.SET_PURHCASE_SETTINGS,
payload: {
2021-09-03 23:44:58 +02:00
objectValues: rooms,
numberValues: [ parser.groupCost ]
2021-09-03 07:09:48 +02:00
}
});
}, [ dispatchGroupsState ]);
const onRoomCreatedEvent = useCallback((event: RoomCreatedEvent) =>
{
const parser = event.getParser();
const clonedRooms = Array.from(availableRooms);
clonedRooms.push({
id: parser.roomId,
name: parser.roomName
});
dispatchGroupsState({
type: GroupsActions.SET_PURHCASE_SETTINGS,
payload: {
2021-09-03 23:44:58 +02:00
objectValues: clonedRooms
2021-09-03 07:09:48 +02:00
}
});
2021-09-03 23:44:58 +02:00
}, [ availableRooms, dispatchGroupsState ]);
2021-08-31 05:22:20 +02:00
const onGroupBadgePartsEvent = useCallback((event: GroupBadgePartsEvent) =>
{
const parser = event.getParser();
2021-09-03 07:09:48 +02:00
const bases: { id: number, images: string[] }[] = [];
const symbols: { id: number, images: string[] }[] = [];
const partColors: { id: number, color: string }[] = [];
const colorsA: { id: number, color: string }[] = [];
const colorsB: { id: number, color: string }[] = [];
parser.bases.forEach((images, id) =>
{
bases.push({ id, images });
});
parser.symbols.forEach((images, id) =>
{
symbols.push({ id, images });
});
parser.partColors.forEach((color, id) =>
{
partColors.push({ id, color });
});
parser.colorsA.forEach((color, id) =>
{
colorsA.push({ id, color });
});
parser.colorsB.forEach((color, id) =>
{
colorsB.push({ id, color });
});
bases.sort(compareId);
symbols.sort(compareId);
partColors.sort(compareId);
colorsA.sort(compareId);
colorsB.sort(compareId);
2021-08-31 05:22:20 +02:00
dispatchGroupsState({
2021-09-03 07:09:48 +02:00
type: GroupsActions.SET_GROUP_BADGE_PARTS_CONFIG,
2021-08-31 05:22:20 +02:00
payload: {
2021-09-03 23:44:58 +02:00
objectValues: [ bases, symbols, partColors, colorsA, colorsB ]
2021-08-31 05:22:20 +02:00
}
2021-09-03 23:44:58 +02:00
});
}, [ dispatchGroupsState ]);
const onGroupSettingsEvent = useCallback((event: GroupSettingsEvent) =>
{
const parser = event.getParser();
const groupBadgeParts: GroupBadgePart[] = [];
parser.badgeParts.forEach((part, id) =>
{
groupBadgeParts.push(new GroupBadgePart(
2021-09-06 07:53:24 +02:00
part.isBase ? GroupBadgePart.BASE : GroupBadgePart.SYMBOL,
part.key,
2021-09-03 23:44:58 +02:00
part.color,
part.position
));
});
dispatchGroupsState({
type: GroupsActions.SET_GROUP_SETTINGS,
payload: {
stringValues: [ parser.title, parser.description ],
numberValues: [ parser.id, parser.state, parser.colorA, parser.colorB ],
boolValues: [ parser.canMembersDecorate ],
objectValues: groupBadgeParts
}
});
2021-08-31 05:22:20 +02:00
}, [ dispatchGroupsState ]);
2021-09-03 07:09:48 +02:00
CreateMessageHook(GroupBuyDataEvent, onGroupBuyDataEvent);
CreateMessageHook(RoomCreatedEvent, onRoomCreatedEvent);
2021-08-31 05:22:20 +02:00
CreateMessageHook(GroupBadgePartsEvent, onGroupBadgePartsEvent);
2021-09-03 23:44:58 +02:00
CreateMessageHook(GroupSettingsEvent, onGroupSettingsEvent);
2021-08-31 05:22:20 +02:00
return null;
};