2022-07-28 01:16:21 +02:00
|
|
|
import { CampaignCalendarData, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, ILinkEventTracker, 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-07-19 02:48:54 +02:00
|
|
|
import { useMessageEvent } 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-07-19 02:48:54 +02:00
|
|
|
useMessageEvent(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-07-19 02:48:54 +02:00
|
|
|
useMessageEvent(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
|
|
|
useEffect(() =>
|
|
|
|
{
|
2022-07-28 01:16:21 +02:00
|
|
|
const linkTracker: ILinkEventTracker = {
|
|
|
|
linkReceived: (url: string) =>
|
|
|
|
{
|
|
|
|
const value = url.split('/');
|
|
|
|
|
|
|
|
if(value.length < 2) return;
|
|
|
|
|
|
|
|
switch(value[1])
|
|
|
|
{
|
|
|
|
case 'calendar':
|
|
|
|
setCalendarOpen(true);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
eventUrlPrefix: 'openView/'
|
|
|
|
};
|
|
|
|
|
2021-11-23 06:41:46 +01:00
|
|
|
AddEventLinkTracker(linkTracker);
|
|
|
|
|
2022-07-28 01:16:21 +02:00
|
|
|
return () => RemoveLinkEventTracker(linkTracker);
|
|
|
|
}, []);
|
2021-11-23 06:41:46 +01:00
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
2022-04-04 04:45:47 +02:00
|
|
|
{ (calendarData && isCalendarOpen) &&
|
2022-07-28 01:08:53 +02:00
|
|
|
<CalendarView onClose={ 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
|
|
|
}
|
|
|
|
</>
|
|
|
|
)
|
|
|
|
}
|