import { AddLinkEventTracker, CampaignCalendarData, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, ILinkEventTracker, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; import { FC, useEffect, useState } from 'react'; import { CalendarItem, SendMessageComposer } from '../../api'; import { useMessageEvent } from '../../hooks'; import { CalendarView } from './CalendarView'; export const CampaignView: FC<{}> = props => { const [ calendarData, setCalendarData ] = useState(null); const [ lastOpenAttempt, setLastOpenAttempt ] = useState(-1); const [ receivedProducts, setReceivedProducts ] = useState>(new Map()); const [ isCalendarOpen, setCalendarOpen ] = useState(false); const openPackage = (id: number, asStaff = false) => { if(!calendarData) return; setLastOpenAttempt(id); if(asStaff) { SendMessageComposer(new OpenCampaignCalendarDoorAsStaffComposer(calendarData.campaignName, id)); } else { SendMessageComposer(new OpenCampaignCalendarDoorComposer(calendarData.campaignName, id)); } }; useMessageEvent(CampaignCalendarDataMessageEvent, event => { const parser = event.getParser(); if(!parser) return; setCalendarData(parser.calendarData); }); useMessageEvent(CampaignCalendarDoorOpenedMessageEvent, event => { const parser = event.getParser(); if(!parser) return; const lastAttempt = lastOpenAttempt; if(parser.doorOpened) { setCalendarData(prev => { 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; }); } setLastOpenAttempt(-1); }); useEffect(() => { 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/' }; AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, []); return ( <> { (calendarData && isCalendarOpen) && setCalendarOpen(false) } /> } ); };