nitro-react/src/components/campaign/CampaignView.tsx

111 lines
3.6 KiB
TypeScript
Raw Normal View History

2021-11-27 07:58:21 +01:00
import { CampaignCalendarData, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer } from '@nitrots/nitro-renderer';
2021-11-23 06:41:46 +01:00
import { FC, useCallback, useEffect, useState } from 'react';
2022-03-24 03:56:35 +01:00
import { AddEventLinkTracker, CalendarItem, RemoveLinkEventTracker, SendMessageComposer } from '../../api';
2022-04-01 23:08:50 +02:00
import { UseMessageEventHook } from '../../hooks';
2022-03-07 08:37:22 +01:00
import { CalendarView } from './CalendarView';
2021-11-23 06:41:46 +01:00
export const CampaignView: FC<{}> = props =>
{
const [ calendarData, setCalendarData ] = useState<CampaignCalendarData>(null);
2021-11-27 07:58:21 +01:00
const [ lastOpenAttempt, setLastOpenAttempt ] = useState<number>(-1);
2022-03-16 03:52:25 +01:00
const [ receivedProducts, setReceivedProducts ] = useState<Map<number, CalendarItem>>(new Map());
2021-11-23 06:41:46 +01:00
const [ isCalendarOpen, setCalendarOpen ] = useState(false);
const onCampaignCalendarDataMessageEvent = useCallback((event: CampaignCalendarDataMessageEvent) =>
{
const parser = event.getParser();
if(!parser) return;
setCalendarData(parser.calendarData);
}, []);
2022-03-03 10:11:31 +01:00
UseMessageEventHook(CampaignCalendarDataMessageEvent, onCampaignCalendarDataMessageEvent);
2021-11-23 06:41:46 +01:00
2021-11-27 07:58:21 +01:00
const onCampaignCalendarDoorOpenedMessageEvent = useCallback((event: CampaignCalendarDoorOpenedMessageEvent) =>
{
const parser = event.getParser();
if(!parser) return;
const lastAttempt = lastOpenAttempt;
if(parser.doorOpened)
{
2022-04-01 23:08:50 +02:00
setCalendarData(prev =>
2021-11-27 07:58:21 +01:00
{
2022-04-01 23:08:50 +02:00
const copy = prev.clone();
copy.openedDays.push(lastOpenAttempt);
return copy;
});
setReceivedProducts(prev =>
{
const copy = new Map(prev);
copy.set(lastAttempt, new CalendarItem(parser.productName, parser.customImage,parser.furnitureClassName));
return copy;
2021-11-27 07:58:21 +01:00
});
}
setLastOpenAttempt(-1);
2022-04-01 19:33:08 +02:00
}, [ lastOpenAttempt ]);
2021-11-27 07:58:21 +01:00
2022-03-03 10:11:31 +01:00
UseMessageEventHook(CampaignCalendarDoorOpenedMessageEvent, onCampaignCalendarDoorOpenedMessageEvent);
2021-11-27 07:58:21 +01:00
const openPackage = useCallback((id: number, asStaff = false) =>
{
if(!calendarData) return;
setLastOpenAttempt(id);
if(asStaff)
{
2022-03-03 10:11:31 +01:00
SendMessageComposer(new OpenCampaignCalendarDoorAsStaffComposer(calendarData.campaignName, id));
2021-11-27 07:58:21 +01:00
}
else
{
2022-03-03 10:11:31 +01:00
SendMessageComposer(new OpenCampaignCalendarDoorComposer(calendarData.campaignName, id));
2021-11-27 07:58:21 +01:00
}
2022-04-01 19:33:08 +02:00
}, [ calendarData ]);
2021-11-27 07:58:21 +01:00
const onCalendarClose = useCallback(() =>
{
setCalendarOpen(false);
}, []);
2021-11-23 06:41:46 +01:00
const onLinkReceived = useCallback((link: string) =>
{
const value = link.split('/');
if(value.length < 2) return;
switch(value[1])
{
case 'calendar':
setCalendarOpen(true);
break;
}
}, []);
useEffect(() =>
{
const linkTracker = { linkReceived: onLinkReceived, eventUrlPrefix: 'openView/' };
AddEventLinkTracker(linkTracker);
return () =>
{
RemoveLinkEventTracker(linkTracker);
}
2022-04-01 19:33:08 +02:00
}, [ onLinkReceived ]);
2021-11-23 06:41:46 +01:00
return (
<>
2022-04-04 04:45:47 +02:00
{ (calendarData && isCalendarOpen) &&
2022-04-04 02:52:34 +02:00
<CalendarView close={ onCalendarClose } campaignName={ calendarData.campaignName } currentDay={ calendarData.currentDay } numDays={ calendarData.campaignDays } openedDays={ calendarData.openedDays } missedDays={ calendarData.missedDays } openPackage={ openPackage } receivedProducts={ receivedProducts } />
2021-11-23 06:41:46 +01:00
}
</>
)
}