nitro-react/src/views/groups/GroupsMessageHandler.tsx
2021-09-06 02:53:24 -03:00

142 lines
4.3 KiB
TypeScript

import { GroupBadgePartsEvent, GroupBuyDataEvent, GroupSettingsEvent, RoomCreatedEvent } from '@nitrots/nitro-renderer';
import { FC, useCallback } from 'react';
import { CreateMessageHook } from '../../hooks';
import { GroupBadgePart } from './common/GroupBadgePart';
import { useGroupsContext } from './context/GroupsContext';
import { GroupsActions } from './context/GroupsContext.types';
function compareId(a, b)
{
if( a.id < b.id ) return -1;
if( a.id > b.id ) return 1;
return 0;
}
export const GroupsMessageHandler: FC<{}> = props =>
{
const { groupsState = null, dispatchGroupsState = null } = useGroupsContext();
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: {
objectValues: rooms,
numberValues: [ parser.groupCost ]
}
});
}, [ 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: {
objectValues: clonedRooms
}
});
}, [ availableRooms, dispatchGroupsState ]);
const onGroupBadgePartsEvent = useCallback((event: GroupBadgePartsEvent) =>
{
const parser = event.getParser();
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);
dispatchGroupsState({
type: GroupsActions.SET_GROUP_BADGE_PARTS_CONFIG,
payload: {
objectValues: [ bases, symbols, partColors, colorsA, colorsB ]
}
});
}, [ dispatchGroupsState ]);
const onGroupSettingsEvent = useCallback((event: GroupSettingsEvent) =>
{
const parser = event.getParser();
const groupBadgeParts: GroupBadgePart[] = [];
parser.badgeParts.forEach((part, id) =>
{
groupBadgeParts.push(new GroupBadgePart(
part.isBase ? GroupBadgePart.BASE : GroupBadgePart.SYMBOL,
part.key,
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
}
});
}, [ dispatchGroupsState ]);
CreateMessageHook(GroupBuyDataEvent, onGroupBuyDataEvent);
CreateMessageHook(RoomCreatedEvent, onRoomCreatedEvent);
CreateMessageHook(GroupBadgePartsEvent, onGroupBadgePartsEvent);
CreateMessageHook(GroupSettingsEvent, onGroupSettingsEvent);
return null;
};