{"version":3,"sources":["_commons/Helpers/HttpHelper.ts","_services/SummitApp/APIs/SessionAPI.ts","_providers/ConferenceInfoProvider.tsx","_commons/Utils/localStorage.ts","_commons/Utils/ReactHOCs/withReactRouteParams.tsx","_commons/Utils/Linq.ts","_commons/Utils/ReactComponents/Dialogs/SimpleDialog.tsx","_components/AgendaPage/SpeakerDetail.tsx","_components/AgendaPage/SessionDetail.tsx","_components/AgendaPage/ConferenceScheduleTableLayoutStyle.ts","_commons/ConferenceLib.ts","_components/AgendaPage/AgendaSessionCard.tsx","_commons/Utils/ReactHOCs/AddToCalendarHoc/AddToCalendarUtils.ts","_components/AgendaPage/ConferenceScheduleTableLayout.tsx","_components/AgendaPage/ConferenceAgendaPageLayoutStyle.ts","_commons/Utils/ReactHooks/useComponents/useReactSelect.tsx","_components/AgendaPage/ConferenceAgendaPageLayout.tsx","_commons/Utils/ReactHooks/useComponents/useRadioButtonGroup.tsx","_commons/Utils/ReactHooks/useComponents/useTextInput.tsx","_commons/Utils/ReactComponents/Popovers/Popover.tsx","_commons/Utils/ReactComponents/Pages/LoadingPage.tsx","_commons/Utils/ReactHOCs/withWrapper.tsx","_hooks/useTime.ts","_components/RoomStatePage/RoomStatePage.tsx","_services/SummitApp/APIs/UserAgendaApi.ts","_hooks/useUserAgenda.ts","AgendaApp.tsx","_commons/Utils/ReactHooks/useSearchParams.tsx","index.js"],"names":["HttpHelper","APIURL","token","headers","Headers","append","options","method","fetch","bodyData","body","JSON","stringify","SessionAPI","ConferenceInfo","a","SessionResource","schedueId","ConferenceInfoContext","React","createContext","conferenceInfo","useConferenceInfo","useContext","canUseLocalStorage","localStorage","setItem","removeItem","e","localStorageTest","console","debug","raw_data_cache_str","getItem","raw_data_json_object","parse","ConferenceInfoProvider","children","useState","_conferenceInfoResp","setConferenceInfoResp","useEffect","resp","status","json","data","new_data_json_str","fetchConferenceInfo","Provider","value","useMemo","timeTables","map","t","startAt","moment","tz","toString","endAt","schedules","sche","link","roomDayLink","find","roomId","daySlot","timeTable","rooms","room","dayLink","filter","reduce","acc","set","Map","withReactRouteParams","Component","props","params","useParams","to","distinct","list","keyGetter","Array","from","Set","concatArray","arraylist","prototype","concat","apply","useStyles","makeStyles","title","textAlign","fontWeight","fontSize","SimpleDialog","onClose","open","maxWidth","fullWidth","classes","Dialog","aria-labelledby","DialogTitle","className","id","root","padding","speakerName","display","marginRight","marginBottom","speakerTagLine","speakerBio","SpeakerDetail","speaker","firstName","lastName","designation","tagLine","bio","profilePicture","src","alt","style","float","margin","email","href","target","blog","companyWebsite","linkedIn","twitter","speakersContainer","speakerElement","cursor","textDecoration","SessionDetail","session","schedule","useSpeakerDialog","defaultContent","dialogOpen","setDialogOpen","dialogChildren","setDialogChildren","dialogCloseHandle","render","useCallback","contentComponent","close","useDynamicContentDialog","sessionFormat","track","sessionLevel","description","rel","variant","color","sessionSpeakers","ss","index","key","speakerId","Tooltip","Avatar","undefined","onClick","StyledScheduleTable","styled","table","useScheduleTableStyle","tableLayout","width","marginLeft","minWidth","trPast","backgroundColor","trUpComing","trInProgress","calendarDialog","flexDirection","addFavouriteIcon","removeFavouriteIcon","addAttendIcon","removeAttendIcon","hoverHightlight","backdropFilter","initSelectedDaySlot","currentTime","length","result","Date","generateCalendarDescription","flatMap","agendaSessionCardStyles","theme","createStyles","spacing","height","position","AgendaSessionTitleDiv","justifyContent","QnAIcon","left","bottom","AgendaSessionCardSpeakersDiv","flexWrap","AgendaSessionCardUserActionsDiv","small","large","clickableText","clickableImg","AgendaSessionCard","sessionTitle","sessionDescription","isQnA","speakerPhotos","userActions","isSmall","useMediaQuery","query","renderSessionTitle","Truncate","eventOptions","lines","ellipsis","onMouseEnter","onMouseLeave","toolTip","photo","url","size","button","Fragment","SHARE_SITES","formatDate","date","replace","formatDuration","duration","parts","split","push","part","join","isMobile","test","window","navigator","userAgent","vendor","opera","isInternetExplorer","escapeICSDescription","buildShareFile","endDatetime","location","startDatetime","timezone","content","encodeURI","buildCalendarFileURL","calData","encodedEventsData","eventsData","formatedCalsData","propId","company","appName","lang","calendarName","flat","buildShareUrl","type","encodeURIComponent","googleShareUrl","yahooShareUrl","handleCalendarButtonClick","filename","preventDefault","currentTarget","getAttribute","startsWith","blob","Blob","msSaveOrOpenBlob","document","createElement","URL","createObjectURL","setAttribute","appendChild","click","removeChild","ConferenceScheduleTableLayout","sort","b","timeSlot","sessions","sessionDialogState","setSessionDialogState","speakerDialogState","setSpeakerDialogState","calendarDialogState","setCalendarDialogState","calendarDialogOpenHandler","renderEmptyCell","UserAttendButton","scheduleId","disableAddButton","setAddAttendingLoading","hovered","setHovered","loading","setLoading","hasBeenAdded","userAgenda","userAttend","scheduleIds","includes","event","removeSchdule","then","green","addSchedule","finally","UserFavouriteButton","userFavourite","renderAddtoCalendar","timeslot","shedule","utc","diff","asHours","format","items","guess","item","currentRoomId","get","selectedDaySlot","roomTitle","linkClickHandler","searchOptions","timeslotMultiSelectValues","some","parseInt","timeMultiSelectValues","array","sessionState","sessionStateStr","startTime","endTime","dif","humanize","timeSlotSubscribed","timeTableId","subscribedSchedleIds","s","timeSlotHasBeenSubscribed","RoomColumns","addAttendLoading","setAddAttendLoading","scheduleFound","isScheduleToAttend","scheId","isFavouriteSchedule","agendaOptionValue","findSession","sessionId","toLowerCase","searchInputValue","sessionFormatSelectValue","sessionTrackSelectValue","sessionTrackMultiSelectValues","selectedValue","sessionLevelSelectValue","sessionSpeakerMultiSelectValues","selectedSpeakerId","sessionSpeaker","qnA","userId","isLoading","colSpan","border","background","borderRadius","useConferenceAgendaLayoutStyle","optionsContainer","top","zIndex","daysButton","selectedBtn","todayBtn","dayOption","dayOptionSelected","exportButtonPopover","overflow","flex","useReactSingleSelect","defaultOption","selectedOption","setSelectedOption","handleChange","handleReset","defaultValue","onChange","isSearchable","isClearable","reset","useReactMultiSelect","selectedOptions","setSelectedOptions","isMulti","preferredOrder","ConferenceAgendaPageLayout","daySlots","time","setTodayDaySlot","_selectedDaySlot","setSelectedDaySlot","currDaySlotSelected","useAgendaRadioButtonsGroup","setValue","renderRadioButtonsGroup","FormControl","component","RadioGroup","row","aria-label","name","op","FormControlLabel","control","Radio","label","useRadioButtonsGroup","userAttendAgenda","Badge","badgeContent","userFavouriteAgenda","useTearchInput","placeholder","textInputValue","setTextInputValue","handleTextInputValueChange","TextField","useTextInput","useSessionFormatSelect","useSessionLevelSelect","indexOf","useSearchableTrackSelect","trim","trackStr","localeCompare","useSearchableSpeakerSelect","optionStr","useTimeMultiSelect","useTimeSlotMultipSelect","renderExportCalButton","buttonTitle","events","addedEvents","ses","desc","calendarData","renderExportPopover","Button","ButtonWithPopover","anchorEl","setAnchorEl","Boolean","buttonProps","Popover","anchorOrigin","vertical","horizontal","transformOrigin","addedSchedule","Accordion","AccordionSummary","expandIcon","aria-controls","AccordionDetails","r","option","LoadingPage","alignItems","CircularProgress","text","withWrappedElement","Wrapper","useTime","now","setCurrentTime","RoomStatePage","useRoomStatePageStyle","sessionTime","finishedColor","textTransform","inProgressColor","commingColor","sessionCards","switchButton","opacity","outline","leftButton","rightButton","right","slidein","animationDuration","animationName","RenderRoomSessions","timer","setInterval","clearInterval","sortedDayTimeTables","latestTimeslots","i","lastTimeSlot","currTimeSlot","nextTimeSlot","selectLastCurrNextTimeSlot","selectedTimeSlot","setSelectedTimeSlot","renderAdjTimeSlotButton","currentTimeSlot","offset","offsetTimeSlotIndex","findIndex","timeSlotState","getSessionState","sessionRoom","sessionToPrint","se","SessionCardWrapper","HighlightSessionCardWrapper","lineHeight","renderHighlightSessionCard","maxHeight","agendaType","idType","emailAddress","UserAgendaApi","GetUserAgenda","AddUserAgenda","RemoveUserAgenda","VerifyConnexUser","RegisterConnexUser","useUserAgenda","userIdType","_userId","setUserId","_isLoading","setIsLoading","_scheduleIds","setScheduleIds","sId","initUserId","catch","err","error","AgendaApp","path","Agenda","parameterNames","useLocation","search","searchParams","URLSearchParams","accumulator","parameterName","useSearchParams","ComponentWithPrivateAgenda","attendAgenda","favouriteAgenda","withUserPrivateAgenda","WithNewUser","registering","setRegistering","success","setSuccess","setOpen","Snackbar","autoHideDuration","Alert","severity","isVerifying","setIsVerifying","isValidUser","setIsValidUser","withEmailAuth","exact","title_small","logo","isSmallSize","baseUrl","getElementsByTagName","rootElement","getElementById","ReactDOM","basename"],"mappings":"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","file":"static/js/main.8f961989.chunk.js","sourcesContent":["const Get = (APIURL: string, token: string | null = null): Promise => {\r\n // console.debug(`${APIURL} ${token}`)\r\n\r\n let headers = new Headers();\r\n // headers.append('Authorization', `Bearer ${token}`);\r\n // headers.append('Accept', '*/*');\r\n if (token)\r\n headers.append('Authorization', `Bearer ${token}`);\r\n const options = {\r\n method: 'GET',\r\n headers: headers\r\n }\r\n return fetch(APIURL, options);\r\n}\r\n\r\nconst PostJSON = (APIURL: string, bodyData: any, token: string | null = null): Promise => {\r\n\r\n // console.debug(`${APIURL} ${token}`)\r\n\r\n let headers = new Headers();\r\n if (token)\r\n headers.append('Authorization', `Bearer ${token}`);\r\n\r\n headers.append('Content-Type', 'application/json');\r\n headers.append('Accept', '*/*');\r\n\r\n const options = bodyData ?\r\n {\r\n method: 'POST',\r\n headers: headers,\r\n body: JSON.stringify(bodyData)\r\n } :\r\n {\r\n method: 'POST',\r\n headers: headers\r\n\r\n }\r\n return fetch(APIURL, options);\r\n\r\n}\r\n\r\nexport const HttpHelper = {\r\n Get: Get,\r\n PostJSON: PostJSON\r\n}","import { HttpHelper } from \"../../../_commons/Helpers/HttpHelper\";\r\nimport IRoom from \"../../../_viewModels/IRoom\";\r\nimport ISchedule from \"../../../_viewModels/ISchedule\";\r\nimport ISession from \"../../../_viewModels/ISession\";\r\nimport ITimeTable from \"../../../_viewModels/ITimeTable\";\r\n\r\n// const AllSchedule = async () => {\r\n// return await HttpHelper.Get(`api/Session`);\r\n// }\r\n\r\n\r\nexport interface IConferenceInfoResponse {\r\n sessions: ISession[],\r\n rooms: IRoom[],\r\n timeTables: ITimeTable[],\r\n schedules: ISchedule[],\r\n roomDayLink:{\r\n roomId:number,\r\n daySlot:number,\r\n link:string\r\n }[]\r\n}\r\nconst ConferenceInfo = async () => {\r\n return await HttpHelper.Get(`api/Session/All`);\r\n}\r\n\r\n\r\n\r\n\r\nexport type SessionStateEnum = 'Past' | 'In Progress' | 'Unavaiable Now'|'Loading'|'Session Not Found';\r\nexport const SessionStateType = {\r\n PAST: 'Past',\r\n IN_PROGRESS: 'In Progress',\r\n UNAVAIABLE: 'Unavaiable Now',\r\n LOADING:'Loading',\r\n NOT_FOUND:'Session Not Found'\r\n}\r\nexport interface ISessionResource {\r\n videoLink: string | null,\r\n teamsLink: string | null,\r\n materialLink: string | null\r\n}\r\nexport interface ISessionResourceAPIResponse{\r\n sessionState:SessionStateEnum,\r\n sessionResource:ISessionResource\r\n\r\n}\r\nconst SessionResource = async (schedueId:number) => {\r\n return await HttpHelper.Get(`api/Session/SessionResource/${schedueId}`);\r\n}\r\n\r\n\r\n\r\n\r\nexport const SessionAPI = {\r\n // AllSchedule,\r\n ConferenceInfo,\r\n SessionResource\r\n} \r\n","import React, { useContext, useEffect, useMemo, useState } from \"react\";\r\nimport IRoom from \"../_viewModels/IRoom\";\r\nimport ISchedule from \"../_viewModels/ISchedule\";\r\nimport ISession from \"../_viewModels/ISession\";\r\nimport ITimeTable from \"../_viewModels/ITimeTable\";\r\nimport { IConferenceInfoResponse, SessionAPI } from \"../_services/SummitApp/APIs/SessionAPI\";\r\nimport moment from \"moment\";\r\nimport 'moment-timezone';\r\nimport { localStorageTest } from \"../_commons/Utils/localStorage\";\r\n\r\nexport interface IConferenceInfo {\r\n sessions: ISession[],\r\n rooms: IRoom[],\r\n timeTables: ITimeTable[],\r\n schedules: ISchedule[]\r\n}\r\n\r\ninterface IConferenceInfoContext {\r\n conferenceInfo: IConferenceInfo | null\r\n}\r\n\r\nconst defaultConfInfoContext: IConferenceInfoContext = {\r\n conferenceInfo: null\r\n}\r\n\r\nconst ConferenceInfoContext = React.createContext(defaultConfInfoContext);\r\n\r\nexport const useConferenceInfo = () => useContext(ConferenceInfoContext);\r\n\r\n//console.debug(\"import ConferenceInfoProvider\")\r\nfunction transformRawData(data: IConferenceInfoResponse | null) {\r\n // console.debug(data);\r\n if (data === null)\r\n return null;\r\n\r\n data.timeTables = data.timeTables.map((t: ITimeTable): ITimeTable => {\r\n t.startAt = moment.tz(t.startAt, \"Pacific/Auckland\").toString();\r\n t.endAt = moment.tz(t.endAt, \"Pacific/Auckland\").toString();\r\n return t;\r\n })\r\n\r\n data.schedules = data.schedules.map((sche: ISchedule) => {\r\n sche.link = data.roomDayLink.find(value => value.roomId === sche.roomId && value.daySlot === sche.timeTable.daySlot)?.link\r\n sche.timeTable.startAt = moment.tz(sche.timeTable.startAt, \"Pacific/Auckland\").toString();\r\n sche.timeTable.endAt = moment.tz(sche.timeTable.endAt, \"Pacific/Auckland\").toString();\r\n return sche;\r\n\r\n })\r\n\r\n data.rooms = data.rooms.map((room: IRoom) => {\r\n room.dayLink = data.roomDayLink.filter(value => value.roomId === room.roomId).reduce(\r\n (acc, value) => {\r\n acc.set(value.daySlot, value.link)\r\n\r\n return acc;\r\n }\r\n , new Map());\r\n\r\n return room;\r\n })\r\n\r\n return data;\r\n}\r\n\r\nconst canUseLocalStorage = localStorageTest();\r\nconsole.debug(`canUseLocalStorage ${canUseLocalStorage}`)\r\nconst raw_data_cache_variable_name = \"tmp_conf_data\";\r\nconst raw_data_cache_str: string | null = canUseLocalStorage ? localStorage.getItem(raw_data_cache_variable_name) : null;\r\nconst raw_data_json_object: IConferenceInfoResponse | null = raw_data_cache_str !== null ? JSON.parse(raw_data_cache_str) : null;\r\n\r\nexport default function ConferenceInfoProvider({ children }: any) {\r\n //console.debug(\"ConferenceInfoProvider render\")\r\n\r\n const [_conferenceInfoResp, setConferenceInfoResp] = useState(raw_data_json_object);\r\n\r\n useEffect(() => {\r\n const fetchConferenceInfo = async () => {\r\n let resp = await SessionAPI.ConferenceInfo();\r\n\r\n if (resp.status === 200) {\r\n let data: IConferenceInfoResponse = await resp.json();\r\n\r\n if (canUseLocalStorage) {\r\n\r\n let new_data_json_str = JSON.stringify(data);\r\n if (new_data_json_str !== raw_data_cache_str) {\r\n localStorage.setItem(raw_data_cache_variable_name, new_data_json_str);\r\n setConferenceInfoResp(data);\r\n }\r\n\r\n } else {\r\n\r\n setConferenceInfoResp(data);\r\n\r\n }\r\n\r\n\r\n }\r\n }\r\n\r\n fetchConferenceInfo();\r\n }, [])\r\n\r\n return (\r\n transformRawData(_conferenceInfoResp), [_conferenceInfoResp])\r\n }}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n","export function localStorageTest(){\r\n var test = 'test';\r\n try {\r\n localStorage.setItem(test, test);\r\n localStorage.removeItem(test);\r\n return true;\r\n } catch(e) {\r\n return false;\r\n }\r\n}","import React from \"react\";\r\nimport { Redirect, useParams } from \"react-router\";\r\n\r\n\r\nexport function withReactRouteParams<\r\n ParamNames extends string[],\r\n ParamTypes extends Record,\r\n P extends ParamTypes>(Component: React.ComponentType

) {\r\n\r\n return function WithReactRouteParams(props: any) {\r\n const params = useParams();\r\n // console.debug(params);\r\n if (params) {\r\n // console.debug(params);\r\n\r\n return }\r\n />\r\n }\r\n else\r\n return \r\n }\r\n}\r\n\r\n\r\nexport function withReactRouteParams2<\r\n ParamNames extends string[],\r\n ParamTypes extends Record,\r\n P extends ParamTypes>(Component: React.ComponentType

, ...parameterNames: ParamNames) {\r\n\r\n return function WithReactRouteParams(props: any) {\r\n const params = useParams();\r\n //console.debug(params);\r\n if (params) {\r\n // console.debug(params);\r\n\r\n return {\r\n // console.debug(parameterName)\r\n accumulator[parameterName] = params[parameterName];\r\n // console.debug(accumulator)\r\n return accumulator;\r\n },\r\n {} as Record)}\r\n />\r\n }\r\n else\r\n return \r\n }\r\n}\r\n","export const groupBy = function (list: any[], keyGetter: (item: any) => any) {\r\n const map = new Map();\r\n list.forEach((item: any) => {\r\n const key = keyGetter(item);\r\n const collection = map.get(key);\r\n if (!collection) {\r\n map.set(key, [item]);\r\n } else {\r\n collection.push(item);\r\n }\r\n });\r\n return map;\r\n\r\n}\r\nexport const distinct = function (list: any, keyGetter: any): any[] {\r\n return Array.from(new Set(list.map(keyGetter)));\r\n}\r\n\r\nexport const concatArray = function (arraylist: any[][]):any [] {\r\n return Array.prototype.concat.apply([], arraylist);\r\n}","import React, { useState, useCallback } from \"react\";\r\nimport { Dialog, DialogTitle, makeStyles } from \"@material-ui/core\";\r\n\r\nconst useStyles = makeStyles({\r\n title: {\r\n textAlign: \"center\",\r\n\r\n '& h2': {\r\n fontWeight: 700,\r\n fontSize: \"2em\",\r\n },\r\n },\r\n});\r\n\r\ninterface SimpleDialogProps {\r\n open: boolean;\r\n onClose: () => void;\r\n title?: string;\r\n fullWidth?: boolean,\r\n maxWidth?: 'lg' | 'md' | 'sm' | 'xl' | 'xs' | false,\r\n children: JSX.Element;\r\n}\r\n\r\nexport default function SimpleDialog({ onClose, open, title, children, maxWidth, fullWidth }: SimpleDialogProps) {\r\n const classes = useStyles();\r\n\r\n\r\n const handleClose = () => {\r\n onClose();\r\n };\r\n\r\n\r\n return (\r\n

\r\n {title && {title}}\r\n {children}\r\n \r\n );\r\n}\r\n\r\n\r\n\r\ninterface IUseSimpleDialog {\r\n maxWidth?: 'lg' | 'md' | 'sm' | 'xl' | 'xs' | false,\r\n fullWidth?: boolean,\r\n defaultContent?: JSX.Element,\r\n title?: string\r\n}\r\nexport function useDynamicContentDialog({ maxWidth, fullWidth, defaultContent, title }: IUseSimpleDialog): {\r\n open: (contentComponent: JSX.Element) => void,\r\n close: () => void,\r\n render: () => JSX.Element\r\n} {\r\n\r\n const [dialogOpen, setDialogOpen] = useState(false);\r\n const [dialogChildren, setDialogChildren] = useState(defaultContent);\r\n\r\n const dialogOpenHandler = (contentComponent: JSX.Element) => {\r\n setDialogOpen(true);\r\n setDialogChildren(contentComponent)\r\n }\r\n\r\n const dialogCloseHandle = () => {\r\n setDialogOpen(false);\r\n }\r\n\r\n const render = useCallback(\r\n () => \r\n {dialogChildren ?? <>}\r\n ,\r\n [dialogChildren, dialogOpen, fullWidth, maxWidth, title],\r\n )\r\n\r\n\r\n return { open: dialogOpenHandler, close: dialogCloseHandle, render }\r\n}","import React from 'react'\r\nimport ISpeaker from '../../_viewModels/ISpeaker'\r\nimport { makeStyles } from '@material-ui/core';\r\nimport TwitterIcon from '@material-ui/icons/Twitter';\r\nimport LinkedInIcon from '@material-ui/icons/LinkedIn';\r\nconst useStyles = makeStyles(\r\n {\r\n root: {\r\n padding: \"20px\"\r\n },\r\n speakerName: {\r\n display: \"inline-block\",\r\n marginRight: \"10px\",\r\n marginBottom: \".1rem\"\r\n\r\n\r\n },\r\n speakerTagLine: {\r\n fontSize: \"11px\",\r\n marginBottom: \".5rem\"\r\n\r\n },\r\n speakerBio: {\r\n marginBottom: \".5rem\"\r\n\r\n }\r\n\r\n }\r\n\r\n)\r\ninterface ISpeakerDetailProps {\r\n speaker: ISpeaker\r\n}\r\n\r\nexport default function SpeakerDetail(props: ISpeakerDetailProps) {\r\n const classes = useStyles();\r\n const { speaker } = props;\r\n\r\n\r\n return (\r\n
\r\n
\r\n

{speaker.firstName + \" \" + speaker.lastName}

\r\n {\r\n speaker.designation && {speaker.designation}\r\n\r\n }\r\n
\r\n {\r\n\r\n speaker.tagLine &&\r\n
\r\n {speaker.tagLine}\r\n
\r\n }\r\n\r\n {\r\n\r\n speaker.bio &&\r\n
\r\n {speaker.bio}\r\n {\r\n\r\n speaker.profilePicture &&\r\n {speaker.firstName}\r\n }\r\n
\r\n }\r\n\r\n {\r\n speaker.email &&\r\n
\r\n Email: {speaker.email}\r\n
\r\n }\r\n {\r\n speaker.blog &&\r\n
\r\n Blog: {speaker.blog}\r\n
\r\n }\r\n {\r\n speaker.companyWebsite &&\r\n
\r\n Company Website: {speaker.companyWebsite}\r\n
\r\n }\r\n { (speaker.linkedIn || speaker.twitter) &&\r\n
\r\n Social Media:\r\n {\r\n speaker.linkedIn && \r\n\r\n }\r\n {\r\n speaker.twitter && \r\n\r\n }\r\n\r\n
\r\n }\r\n\r\n\r\n\r\n\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\nimport ISession from '../../_viewModels/ISession';\r\nimport ISpeaker from '../../_viewModels/ISpeaker'\r\n\r\nimport { useDynamicContentDialog } from '../../_commons/Utils/ReactComponents/Dialogs/SimpleDialog';\r\nimport SpeakerDetail from './SpeakerDetail';\r\nimport { Avatar, Button, makeStyles } from '@material-ui/core';\r\nimport { Tooltip } from '@material-ui/core';\r\nimport ISchedule from '../../_viewModels/ISchedule';\r\n\r\nconst useStyles = makeStyles(\r\n {\r\n root: {\r\n padding: \"20px\"\r\n },\r\n speakersContainer: {\r\n display: 'flex'\r\n },\r\n speakerElement: {\r\n cursor: 'pointer',\r\n margin: \"5px\"\r\n },\r\n speakerName: {\r\n textDecoration: \"underline\"\r\n }\r\n }\r\n\r\n)\r\ninterface ISessionDetailProps {\r\n session: ISession,\r\n schedule?: ISchedule\r\n}\r\n\r\nexport default function SessionDetail(props: ISessionDetailProps) {\r\n const classes = useStyles();\r\n const { session, schedule } = props;\r\n const useSpeakerDialog = useDynamicContentDialog({ maxWidth: \"xs\" });\r\n return (\r\n
\r\n\r\n
{session.title}
\r\n \r\n {\r\n session.sessionFormat &&\r\n | {session.sessionFormat} \r\n }\r\n {\r\n session.track &&\r\n | {session.track} \r\n }\r\n {\r\n session.sessionLevel &&\r\n | {session.sessionLevel} \r\n }\r\n |\r\n \r\n
\r\n {session.description}\r\n\r\n\r\n
\r\n {schedule &&\r\n
\r\n \r\n {schedule.link && }\r\n\r\n
\r\n }\r\n\r\n
\r\n Speaker(s):\r\n
\r\n {\r\n\r\n session.sessionSpeakers.map((ss: { speaker: ISpeaker }, index: number) => {\r\n return
\r\n \r\n useSpeakerDialog.open()}\r\n />\r\n \r\n\r\n \r\n useSpeakerDialog.open()}>\r\n {index > 0 && ,}{ss.speaker.firstName} {ss.speaker.lastName}\r\n \r\n \r\n
\r\n })\r\n\r\n }\r\n
\r\n
\r\n {useSpeakerDialog.render()}\r\n\r\n
\r\n )\r\n}\r\n","import { makeStyles } from \"@material-ui/core\"\r\nimport styled from \"styled-components\"\r\n\r\nexport const StyledScheduleTable = styled.table`\r\nmargin: 5px;\r\n\r\n th, td {\r\n border: 1.5px solid black;\r\n border-collapse: collapse;\r\n\r\n}\r\nth{\r\n position:sticky;\r\n top:0;\r\n z-index:1\r\n}\r\n\r\n&{\r\n thead th \r\n {\r\n background-color: rgb(255, 193, 78);\r\n font-weight: 700;\r\n height: 45px;\r\n }\r\n tbody {\r\n width: 300px;\r\n overflow: auto;\r\n }\r\n th, td {\r\n text-align: center;\r\n }\r\n}\r\n\r\ntd[class='emptyCell']{\r\n background-color: white\r\n}\r\n.emptyRow{\r\n\r\n}\r\n\r\n`\r\n\r\nexport const useScheduleTableStyle = makeStyles({\r\n table: {\r\n tableLayout: \"fixed\",\r\n width: \"98%\",\r\n marginLeft: \"1%\",\r\n minWidth: '1024px'\r\n\r\n },\r\n\r\n trPast: {\r\n backgroundColor: \"#cccccc\",\r\n },\r\n\r\n trUpComing: {\r\n backgroundColor: \"rgba(249,228,133,255)\",\r\n },\r\n\r\n trInProgress: {\r\n backgroundColor: \"#d4f8d0\",\r\n },\r\n calendarDialog: {\r\n padding: '50px',\r\n display: \"flex\",\r\n flexDirection: 'column',\r\n '& button': {\r\n margin: '10px',\r\n width: '100%'\r\n }\r\n },\r\n addFavouriteIcon: {\r\n color: '#5B5E62',\r\n '& :hover': {\r\n color: '#DD3337'\r\n }\r\n },\r\n removeFavouriteIcon: {\r\n color: '#DD3337',\r\n '& :hover': {\r\n color: '#78787A'\r\n }\r\n },\r\n addAttendIcon: {\r\n color: '#5B5E62',\r\n '& :hover': {\r\n color: '#4FAE57'\r\n }\r\n },\r\n removeAttendIcon: {\r\n color: '#4FAE57',\r\n '& :hover': {\r\n color: '#F62F64'\r\n }\r\n },\r\n hoverHightlight: {\r\n \"&:hover\": {\r\n backdropFilter: \"brightness(1.1)\"\r\n }\r\n }\r\n\r\n\r\n})","import moment from \"moment\";\r\nimport { IRoomToolTipSchedule } from \"../_components/RoomToolTip/RoomToolTipUI\";\r\nimport ISchedule from \"../_viewModels/ISchedule\";\r\nimport ISession from \"../_viewModels/ISession\";\r\nimport ISpeaker from \"../_viewModels/ISpeaker\";\r\nimport ITimeTable from \"../_viewModels/ITimeTable\";\r\nexport const selectLastCurrNextTimeSlot = (timeTable: ITimeTable[], now: Date): { lastTimeSlot: ITimeTable | null, currTimeSlot: ITimeTable | null, nextTimeSlot: ITimeTable | null } | undefined => {\r\n if (timeTable.length > 0) {\r\n let i = 0;\r\n for (; i < timeTable.length; i++) {\r\n if (now < new Date(timeTable[i].startAt)) {\r\n break;\r\n }\r\n\r\n }\r\n if (i === 0) {\r\n return {\r\n lastTimeSlot: null,\r\n currTimeSlot: null,\r\n nextTimeSlot: timeTable[i]\r\n\r\n }\r\n } else {\r\n let nextTimeSlot = i < timeTable.length ? timeTable[i] : null;\r\n let lastTimeSlot = null;\r\n let currTimeSlot = null;\r\n if (now <= new Date(timeTable[i - 1].endAt)) {\r\n currTimeSlot = timeTable[i - 1];\r\n if (i - 2 >= 0) {\r\n lastTimeSlot = timeTable[i - 2]\r\n } else {\r\n lastTimeSlot = null\r\n }\r\n } else {\r\n lastTimeSlot = timeTable[i - 1]\r\n currTimeSlot = null;\r\n }\r\n\r\n return {\r\n lastTimeSlot,\r\n currTimeSlot,\r\n nextTimeSlot\r\n\r\n }\r\n }\r\n }\r\n else\r\n return undefined;\r\n}\r\n\r\nexport const selectRoomLastCurrNextSchedule = (schedules: ISchedule[], roomId: number, now: Date): { lastSchedule: ISchedule | null, currSchedule: ISchedule | null, nextSchedule: ISchedule | null } | undefined => {\r\n\r\n let roomSchedule = schedules.filter((s: ISchedule) => s.roomId === roomId);\r\n return roomSchedule ? selectLastCurrNextSchedule(roomSchedule, now) : undefined;\r\n\r\n}\r\nexport const selectLastCurrNextSchedule = (schedules: ISchedule[], now: Date): { lastSchedule: ISchedule | null, currSchedule: ISchedule | null, nextSchedule: ISchedule | null } | undefined => {\r\n\r\n let sortedSchedules = schedules.sort((a: ISchedule, b: ISchedule) => {\r\n //@ts-ignore\r\n return new Date(a.timeTable.startAt) - new Date(b.timeTable.startAt)\r\n });\r\n if (sortedSchedules.length > 0) {\r\n\r\n let i = 0;\r\n for (; i < sortedSchedules.length; i++) {\r\n if (now < new Date(sortedSchedules[i].timeTable.startAt)) {\r\n break;\r\n }\r\n\r\n }\r\n if (i === 0) {\r\n return {\r\n lastSchedule: null,\r\n currSchedule: null,\r\n nextSchedule: sortedSchedules[i]\r\n\r\n }\r\n } else {\r\n let nextSchedule = i < sortedSchedules.length ? sortedSchedules[i] : null;\r\n let lastSchedule = null;\r\n let currSchedule = null;\r\n if (now <= new Date(sortedSchedules[i - 1].timeTable.endAt)) {\r\n currSchedule = sortedSchedules[i - 1];\r\n if (i - 2 >= 0) {\r\n lastSchedule = sortedSchedules[i - 2]\r\n } else {\r\n lastSchedule = null\r\n }\r\n } else {\r\n lastSchedule = sortedSchedules[i - 1]\r\n currSchedule = null;\r\n }\r\n\r\n return {\r\n lastSchedule,\r\n currSchedule,\r\n nextSchedule\r\n\r\n }\r\n }\r\n } else {\r\n return undefined;\r\n }\r\n\r\n}\r\nexport const getRoomToolTipSchedule = (currSchedule: ISchedule | null, sessions: ISession[], currentTime: Date): IRoomToolTipSchedule | null => {\r\n if (currSchedule) {\r\n\r\n let session = sessions.find((sess: ISession) => sess.sessionId === currSchedule.sessionId);\r\n\r\n if (session) {\r\n let sessionState: 'Up Coming' | 'Past' | 'In Progress' = new Date(currSchedule.timeTable.startAt) > currentTime ? \"Up Coming\" : new Date(currSchedule.timeTable.endAt) < currentTime ? \"Past\" : \"In Progress\";\r\n let sessionStateStr: string = sessionState;\r\n if (sessionState === 'Up Coming') {\r\n let startTime = moment(currentTime);\r\n let endTime = moment(currSchedule.timeTable.startAt)\r\n var dif = moment.duration(endTime.diff(startTime));\r\n sessionStateStr = `Starting in ${dif.humanize()}`\r\n } else {\r\n sessionStateStr = sessionState\r\n }\r\n\r\n return {\r\n schedule: currSchedule,\r\n session: session,\r\n sessionState: sessionState,\r\n sessionStateStr: sessionStateStr\r\n }\r\n } else {\r\n return null;\r\n }\r\n\r\n\r\n\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nexport function timeSlotHasBeenSubscribed(timeTableId: number, schedules: ISchedule[], subscribedSchedleIds: number[]) {\r\n\r\n return schedules.filter((s: ISchedule) => s.timeTableId === timeTableId).some((s: ISchedule) => subscribedSchedleIds.includes(s.scheduleId));\r\n\r\n}\r\n\r\nexport const initSelectedDaySlot = (currentTime: Date, timeTable: ITimeTable[]): number | undefined => {\r\n if (timeTable && timeTable.length > 0) {\r\n //make sure timetable sorted\r\n let result = timeTable.find((t: ITimeTable) => currentTime <= new Date(t.endAt));\r\n if (result) {\r\n return result.daySlot\r\n }\r\n else {\r\n return timeTable[timeTable.length - 1].daySlot;\r\n }\r\n } else {\r\n return undefined\r\n }\r\n\r\n}\r\nexport const getCurrentDaySlot = (currentTime: Date, timeTable: ITimeTable[]) => {\r\n return undefined\r\n\r\n}\r\n\r\n\r\nexport type SessionStateType = 'Up Coming' | 'Past' | 'In Progress';\r\nexport const getSessionState = (currentTime: Date, timeTable: ITimeTable): SessionStateType => {\r\n return new Date(timeTable.startAt) > currentTime ? 'Up Coming' : new Date(timeTable.endAt) < currentTime ? 'Past' : 'In Progress';\r\n\r\n}\r\n\r\n\r\nexport const generateCalendarDescription =(session:ISession,link:string|undefined)=>{\r\n return (session.description ?? '')\r\n + '\\n\\n'\r\n + 'Speaker(s): '\r\n + session.sessionSpeakers.flatMap(\r\n (ss: { speaker: ISpeaker }, index: number) => {\r\n\r\n return (index > 0 ? ' ' : '') + ss.speaker.firstName + \" \" + ss.speaker.lastName\r\n })\r\n + '\\n\\n'\r\n + 'Link: '\r\n + (link ?? 'No link available');\r\n}\r\n","import React from 'react'\r\nimport Truncate from 'react-truncate';\r\nimport { makeStyles, createStyles, Avatar, Theme, Tooltip } from '@material-ui/core';\r\nimport { useMediaQuery } from 'react-responsive'\r\n// import AvatarGroup from '@material-ui/lab/AvatarGroup';\r\n\r\n\r\nconst agendaSessionCardStyles = makeStyles(\r\n (theme: Theme) =>\r\n createStyles({\r\n root: {\r\n padding: theme.spacing(0.5),\r\n height: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n\r\n position: 'relative'\r\n // \"&:hover\": {\r\n // backdropFilter: \"brightness(1.1)\"\r\n // }\r\n },\r\n AgendaSessionTitleDiv: {\r\n display: 'flex',\r\n justifyContent: 'center'\r\n },\r\n\r\n QnAIcon: {\r\n position: 'absolute',\r\n left: '2px',\r\n bottom: '2px',\r\n width: '25px'\r\n },\r\n AgendaSessionCardSpeakersDiv: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n flexWrap: 'wrap',\r\n '& > *': {\r\n margin: theme.spacing(0.2),\r\n },\r\n\r\n \"&>$small\": {\r\n width: theme.spacing(4),\r\n height: theme.spacing(4),\r\n },\r\n \"&>$large\": {\r\n width: theme.spacing(7),\r\n height: theme.spacing(7),\r\n },\r\n },\r\n AgendaSessionCardUserActionsDiv: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n\r\n '& *': {\r\n cursor: 'pointer'\r\n }\r\n },\r\n small: {\r\n\r\n },\r\n large: {\r\n\r\n },\r\n\r\n clickableText: {\r\n textDecoration: \"underline\",\r\n color: \"blue\",\r\n cursor: 'pointer'\r\n },\r\n clickableImg: {\r\n cursor: 'pointer',\r\n '& img': {\r\n cursor: \"pointer\"\r\n }\r\n },\r\n\r\n\r\n }),\r\n);\r\ninterface IAgendaSessionCardProps extends React.HTMLAttributes {\r\n sessionTitle: {\r\n title: string,\r\n\r\n toolTip?: string,\r\n lines?: number,\r\n style?: React.CSSProperties,\r\n eventOptions?: IEventOption\r\n },\r\n sessionDescription?: {\r\n description: string,\r\n style?: React.CSSProperties\r\n },\r\n speakerPhotos?: {\r\n alt: string,\r\n url?: string,\r\n size?: 'small' | 'large',\r\n width?: string,\r\n eventOptions?: IEventOption\r\n }[],\r\n isQnA?: boolean,\r\n userActions?: (IActionButton | undefined)[]\r\n}\r\ninterface IEventOption {\r\n onClick?: (event?: any) => void,\r\n onMouseEnter?: (event?: any) => void,\r\n onMouseLeave?: (event?: any) => void\r\n}\r\ninterface IActionButton {\r\n Component: JSX.Element\r\n eventOptions?: IEventOption\r\n}\r\nconst QnAIconURL = process.env.PUBLIC_URL + 'images/QnAIconNoBackColor.png'\r\nexport function AgendaSessionCard(props: IAgendaSessionCardProps) {\r\n\r\n const { sessionTitle, sessionDescription, isQnA, speakerPhotos, userActions } = props;\r\n const classes = agendaSessionCardStyles();\r\n const isSmall = useMediaQuery({ query: '(max-width: 1024px)' })\r\n // const isLarge = useMediaQuery({ query: '(min-width: 1358px)' })\r\n\r\n const renderSessionTitle = () => {\r\n return ... }\r\n onClick={sessionTitle.eventOptions?.onClick ?? undefined}\r\n onMouseEnter={sessionTitle.eventOptions?.onMouseEnter ?? undefined}\r\n onMouseLeave={sessionTitle.eventOptions?.onMouseLeave ?? undefined}>\r\n {sessionTitle.title}\r\n \r\n }\r\n\r\n return
\r\n\r\n
\r\n\r\n\r\n {sessionTitle.toolTip ?\r\n \r\n {renderSessionTitle()}\r\n \r\n : renderSessionTitle()\r\n }\r\n {isQnA && {'QnA'}}\r\n\r\n
\r\n {\r\n sessionDescription &&\r\n
{sessionDescription.description}
\r\n }\r\n {\r\n speakerPhotos &&\r\n
\r\n {/* */}\r\n {\r\n\r\n speakerPhotos.map(\r\n (photo: { alt: string, size?: 'small' | 'large', width?: string, url?: string, eventOptions?: IEventOption }) =>\r\n \r\n \r\n \r\n )\r\n }\r\n {/* */}\r\n
\r\n }\r\n {\r\n userActions &&\r\n
\r\n {userActions.map((button: IActionButton | undefined, index: number) => {button && button.Component})}\r\n\r\n
\r\n\r\n }\r\n\r\n\r\n
\r\n}\r\n","export const SHARE_SITES = {\r\n GOOGLE: 'Google',\r\n ICAL: 'iCal',\r\n OUTLOOK: 'Outlook',\r\n YAHOO: 'Yahoo',\r\n};\r\nexport type SHARE_SITES_TYPES = 'Google' | 'iCal' | 'Outlook' | 'Yahoo'\r\n\r\n/**\r\n * Converts Date String with UTC timezone to date consumable by calendar\r\n * apps. Changes +00:00 to Z.\r\n * @param {string} Date in YYYYMMDDTHHmmssZ format\r\n * @returns {string} Date with +00:00 replaceed with Z\r\n */\r\nexport const formatDate = (date: string) => date && date.replace('+00:00', 'Z');\r\n\r\nexport const formatDuration = (duration: string | number) => {\r\n if (typeof duration === 'string') return duration;\r\n const parts = duration.toString().split('.');\r\n if (parts.length < 2) {\r\n parts.push('00');\r\n }\r\n\r\n return parts.map(part => part.length === 2 ? part : `0${part}`).join('');\r\n};\r\n\r\n/**\r\n * Tests provided UserAgent against Known Mobile User Agents\r\n * @returns {bool} isMobileDevice\r\n */\r\nexport const isMobile = () => /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile/.test(window.navigator.userAgent || window.navigator.vendor || (window as any).opera);\r\n\r\n/**\r\n * Tests userAgent to see if browser is IE\r\n * @returns {bool} isInternetExplorer\r\n */\r\nexport const isInternetExplorer = () => /MSIE/.test(window.navigator.userAgent) || /Trident/.test(window.navigator.userAgent);\r\n\r\nexport const escapeICSDescription = (description: string) => description.replace(/(\\r?\\n|
)/g, '\\\\n');\r\n\r\n/**\r\n * Takes an event object and returns a Google Calendar Event URL\r\n * @param {string} event.description\r\n * @param {string} event.endDatetime\r\n * @param {string} event.location\r\n * @param {string} event.startDatetime\r\n * @param {string} event.title\r\n * @returns {string} Google Calendar Event URL\r\n */\r\nconst googleShareUrl = ({\r\n description,\r\n endDatetime,\r\n location,\r\n startDatetime,\r\n timezone,\r\n title,\r\n}: { description: string, endDatetime: string, location: string, startDatetime: String, timezone: string | undefined, title: string }) =>\r\n `https://calendar.google.com/calendar/render?action=TEMPLATE&dates=${startDatetime\r\n }/${endDatetime}${timezone && `&ctz=${timezone}`}&location=${location}&text=${title}&details=${description}`;\r\n\r\n/**\r\n * Takes an event object and returns a Yahoo Calendar Event URL\r\n * @param {string} event.description\r\n * @param {string} event.duration\r\n * @param {string} event.location\r\n * @param {string} event.startDatetime\r\n * @param {string} event.title\r\n * @returns {string} Yahoo Calendar Event URL\r\n */\r\nconst yahooShareUrl = ({\r\n description,\r\n duration,\r\n location,\r\n startDatetime,\r\n title,\r\n}: { description: string, duration: string, location: string, startDatetime: String, title: string }) =>\r\n `https://calendar.yahoo.com/?v=60&view=d&type=20&title=${title}&st=${startDatetime\r\n }&dur=${duration}&desc=${description}&in_loc=${location}`;\r\n\r\n/**\r\n * Takes an event object and returns an array to be downloaded as ics file\r\n * @param {string} event.description\r\n * @param {string} event.endDatetime\r\n * @param {string} event.location\r\n * @param {string} event.startDatetime\r\n * @param {string} event.title\r\n * @returns {array} ICS Content\r\n */\r\nconst buildShareFile = ({\r\n description = '',\r\n endDatetime,\r\n location = '',\r\n startDatetime,\r\n timezone = '',\r\n title = '',\r\n}: { description: string, endDatetime: string, location: string, startDatetime: string, timezone: string, title: string }) => {\r\n\r\n let content = [\r\n 'BEGIN:VCALENDAR',\r\n 'VERSION:2.0',\r\n 'BEGIN:VEVENT',\r\n 'METHOD:PUBLISH',\r\n // TODO: Will need to parse the date without Z for ics\r\n // This means I'll probably have to require a date lib - luxon most likely or datefns\r\n timezone === '' ? `DTSTART:${startDatetime}` : `DTSTART;TZID=${timezone}:${startDatetime}`,\r\n timezone === '' ? `DTEND:${endDatetime}` : `DTEND;TZID=${timezone}:${endDatetime}`,\r\n `SUMMARY:${title}`,\r\n `DESCRIPTION:${escapeICSDescription(description)}`,\r\n `LOCATION:${location}`,\r\n 'END:VEVENT',\r\n 'END:VCALENDAR',\r\n ].join('\\n');\r\n return isMobile() ? encodeURI(`data:text/calendar;charset=utf8,${content}`) : content;\r\n}\r\n\r\nexport interface ICalendarData {\r\n propId: {\r\n company: string,\r\n appName: string,\r\n lang: 'EN'\r\n },\r\n calendarName: string,\r\n description?: string,\r\n eventsData: ICalendarEventData[]\r\n}\r\nexport interface ICalendarEventData { description: string, endDatetime: string, location: string, startDatetime: string, title: string }\r\n\r\nexport const buildCalendarFileURL = (\r\n calData: ICalendarData\r\n) => {\r\n\r\n\r\n let encodedEventsData = calData.eventsData\r\n .map((data: ICalendarEventData): ICalendarEventData => {\r\n return {\r\n description: data.description,\r\n endDatetime: formatDate(data.endDatetime),\r\n location: data.location,\r\n startDatetime: formatDate(data.startDatetime),\r\n title: data.title,\r\n }\r\n });\r\n\r\n\r\n let formatedCalsData = [[\r\n 'BEGIN:VCALENDAR',\r\n `PRODID:-//${calData.propId.company}//${calData.propId.appName}//${calData.propId.lang}`,\r\n 'VERSION:2.0',\r\n 'CALSCALE:GREGORIAN',\r\n 'METHOD:PUBLISH',\r\n `X-WR-CALNAME: ${calData.calendarName}`\r\n ]]\r\n\r\n if (calData.description)\r\n formatedCalsData.push([\r\n `X-WR-CALDESC:${escapeICSDescription(calData.description)}`\r\n ])\r\n\r\n formatedCalsData = formatedCalsData.concat(\r\n encodedEventsData.map((data: ICalendarEventData) => {\r\n return [\r\n 'BEGIN:VEVENT',\r\n 'METHOD:PUBLISH',\r\n `DTSTART:${data.startDatetime}`,\r\n `DTEND:${data.endDatetime}`,\r\n `SUMMARY:${data.title}`,\r\n `DESCRIPTION:${escapeICSDescription(data.description)}`,\r\n `LOCATION:${data.location}`,\r\n 'END:VEVENT',\r\n ]\r\n })\r\n )\r\n formatedCalsData.push([\r\n 'END:VCALENDAR'\r\n ])\r\n\r\n let content = formatedCalsData.flat().join('\\n');\r\n\r\n\r\n return isMobile() ? encodeURI(`data:text/calendar;charset=utf8,${content}`) : content;\r\n\r\n\r\n\r\n};\r\n\r\n\r\n/**\r\n * Takes an event object and a type of URL and returns either a calendar event\r\n * URL or the contents of an ics file.\r\n * @param {string} event.description\r\n * @param {string} event.duration\r\n * @param {string} event.endDatetime\r\n * @param {string} event.location\r\n * @param {string} event.startDatetime\r\n * @param {string} event.title\r\n * @param {enum} type One of SHARE_SITES from ./enums\r\n */\r\nexport const buildShareUrl = (\r\n {\r\n description = '',\r\n duration,\r\n endDatetime,\r\n location = '',\r\n startDatetime,\r\n timezone = '',\r\n title = ''\r\n }: { description: string, duration: string | number, endDatetime: string, location: string, startDatetime: string, timezone?: string, title: string },\r\n type: SHARE_SITES_TYPES,\r\n) => {\r\n const encodeURI = type !== SHARE_SITES.ICAL && type !== SHARE_SITES.OUTLOOK;\r\n\r\n const data = {\r\n description: encodeURI ? encodeURIComponent(description) : description,\r\n duration: formatDuration(duration),\r\n endDatetime: formatDate(endDatetime),\r\n location: encodeURI ? encodeURIComponent(location) : location,\r\n startDatetime: formatDate(startDatetime),\r\n timezone,\r\n title: encodeURI ? encodeURIComponent(title) : title,\r\n };\r\n\r\n switch (type) {\r\n case SHARE_SITES.GOOGLE:\r\n return googleShareUrl(data);\r\n case SHARE_SITES.YAHOO:\r\n return yahooShareUrl(data);\r\n default:\r\n return buildShareFile(data);\r\n }\r\n};\r\n\r\n\r\n\r\n\r\n\r\nexport const handleCalendarButtonClick = (e: any, filename = \"download\") => {\r\n\r\n e.preventDefault();\r\n const url = e.currentTarget.getAttribute('href');\r\n if (url.startsWith('BEGIN')) {\r\n const blob = new Blob([url], { type: 'text/calendar;charset=utf-8' });\r\n\r\n if (isInternetExplorer()) {\r\n window.navigator.msSaveOrOpenBlob(blob, `${filename}.ics`);\r\n } else {\r\n const link = document.createElement('a');\r\n link.href = window.URL.createObjectURL(blob);\r\n link.setAttribute('download', `${filename}.ics`);\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n }\r\n } else {\r\n window.open(url, '_blank');\r\n }\r\n};","import React from 'react'\r\nimport moment from 'moment';\r\nimport IRoom from '../../_viewModels/IRoom';\r\nimport ISchedule from '../../_viewModels/ISchedule';\r\nimport ISession from '../../_viewModels/ISession';\r\nimport ITimeTable from '../../_viewModels/ITimeTable';\r\nimport ISpeaker from '../../_viewModels/ISpeaker';\r\nimport SessionDetail from './SessionDetail';\r\nimport { StyledScheduleTable, useScheduleTableStyle } from './ConferenceScheduleTableLayoutStyle';\r\nimport { IUserAgenda } from '../../_viewModels/IUserAgenda';\r\nimport EventAvailableIcon from '@material-ui/icons/EventAvailable';\r\nimport AddIcon from '@material-ui/icons/Add';\r\nimport FavoriteIcon from '@material-ui/icons/Favorite';\r\nimport FavoriteBorderIcon from '@material-ui/icons/FavoriteBorder';\r\nimport CheckIcon from '@material-ui/icons/Check';\r\nimport ClearIcon from '@material-ui/icons/Clear';\r\nimport { green } from '@material-ui/core/colors';\r\nimport Button from '@material-ui/core/Button';\r\nimport ClipLoader from \"react-spinners/ClipLoader\";\r\n\r\nimport EventIcon from '@material-ui/icons/Event';\r\nimport { generateCalendarDescription, timeSlotHasBeenSubscribed } from '../../_commons/ConferenceLib';\r\n\r\nimport { useState } from 'react';\r\nimport SimpleDialog from '../../_commons/Utils/ReactComponents/Dialogs/SimpleDialog';\r\nimport SpeakerDetail from './SpeakerDetail';\r\nimport { AgendaSessionCard } from './AgendaSessionCard';\r\nimport { Tooltip } from '@material-ui/core';\r\nimport { buildShareUrl, SHARE_SITES_TYPES, handleCalendarButtonClick } from '../../_commons/Utils/ReactHOCs/AddToCalendarHoc/AddToCalendarUtils';\r\n\r\ninterface IProps {\r\n\r\n\r\n\r\n currentRoomId?: number,\r\n currentTime: Date,\r\n selectedDaySlot: number,\r\n\r\n linkClickHandler?: () => void,\r\n\r\n conferenceInfo: {\r\n timeTables: ITimeTable[],\r\n rooms: IRoom[],\r\n sessions: ISession[],\r\n schedules: ISchedule[],\r\n }\r\n\r\n\r\n userAgenda?: {\r\n userAttend?: IUserAgenda,\r\n userFavourite?: IUserAgenda,\r\n }\r\n searchOptions?: {\r\n agendaOptionValue?: \"all\" | \"attend\" | \"favourite\",\r\n searchInputValue?: string,\r\n sessionFormatSelectValue?: \"All\" | string,\r\n sessionLevelSelectValue?: \"All\" | string,\r\n sessionTrackSelectValue?: string,\r\n sessionTrackMultiSelectValues?: string[],\r\n sessionSpeakerMultiSelectValues?: string[],\r\n timeslotMultiSelectValues?: string[]\r\n timeMultiSelectValues?: string[]\r\n }\r\n\r\n}\r\n\r\n\r\nexport default function ConferenceScheduleTableLayout(props: IProps & { className?: string }) {\r\n\r\n const classes = useScheduleTableStyle();\r\n\r\n\r\n\r\n let timeTables: ITimeTable[] = props.conferenceInfo.timeTables.sort((a: any, b: any) => a.timeSlot - b.timeSlot).sort((a: any, b: any) => a.startAt - b.startAt);\r\n let rooms: IRoom[] = props.conferenceInfo.rooms;\r\n let sessions: ISession[] = props.conferenceInfo.sessions;\r\n let schedules: ISchedule[] = props.conferenceInfo.schedules;\r\n\r\n\r\n\r\n\r\n const [sessionDialogState, setSessionDialogState] =\r\n useState<{ open: boolean, children: JSX.Element | undefined }>({ open: false, children: undefined });\r\n const sessionDialogOpenHandler = (contentComponent: JSX.Element) => {\r\n setSessionDialogState({ open: true, children: contentComponent });\r\n }\r\n const sessionDialogCloseHandle = () => {\r\n setSessionDialogState({ open: false, children: undefined });\r\n }\r\n\r\n const [speakerDialogState, setSpeakerDialogState] =\r\n useState<{ open: boolean, children: JSX.Element | undefined }>({ open: false, children: undefined });\r\n const speakerDialogOpenHandler = (contentComponent: JSX.Element) => {\r\n setSpeakerDialogState({ open: true, children: contentComponent });\r\n }\r\n const speakerDialogCloseHandle = () => {\r\n setSpeakerDialogState({ open: false, children: undefined });\r\n }\r\n\r\n\r\n const [calendarDialogState, setCalendarDialogState] =\r\n useState<{ open: boolean, children: JSX.Element | undefined }>({ open: false, children: undefined });\r\n const calendarDialogOpenHandler = (contentComponent: JSX.Element) => {\r\n setCalendarDialogState({ open: true, children: contentComponent });\r\n }\r\n const calendarDialogCloseHandle = () => {\r\n setCalendarDialogState({ open: false, children: undefined });\r\n }\r\n\r\n\r\n\r\n function renderEmptyCell(index: number) {\r\n\r\n return \r\n }\r\n\r\n function renderUserAgendaTimeSlotStatus() {\r\n return (\r\n \r\n )\r\n }\r\n\r\n\r\n function UserAttendButton({ scheduleId, disableAddButton, setAddAttendingLoading }: { scheduleId: number, disableAddButton?: boolean, setAddAttendingLoading: (loading: boolean) => void }) {\r\n const [hovered, setHovered] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n\r\n let hasBeenAdded = props.userAgenda?.userAttend && props.userAgenda.userAttend.scheduleIds.includes(scheduleId);\r\n function handleAdd(event: any) {\r\n if (props.userAgenda?.userAttend) {\r\n setLoading(true)\r\n setAddAttendingLoading(true)\r\n props.userAgenda.userAttend.addSchedule(scheduleId).then((resp) => { setLoading(false) }).finally(() => { setAddAttendingLoading(false) })\r\n\r\n\r\n }\r\n }\r\n function hanldeRemove(event: any) {\r\n if (props.userAgenda?.userAttend) {\r\n setLoading(true)\r\n props.userAgenda.userAttend.removeSchdule(scheduleId).then((resp) => { setLoading(false) })\r\n\r\n\r\n }\r\n\r\n }\r\n\r\n function handleMouseEnter(event: any) {\r\n setHovered(true)\r\n }\r\n function handleMouseLeave(event: any) {\r\n setHovered(false)\r\n }\r\n return <>\r\n {loading ?\r\n \r\n : hasBeenAdded ?\r\n <>\r\n {\r\n hovered ? \r\n \r\n :\r\n \r\n }\r\n\r\n\r\n \r\n :\r\n disableAddButton !== true ?\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n : null\r\n }\r\n\r\n \r\n\r\n\r\n }\r\n\r\n function UserFavouriteButton({ scheduleId, disableAddButton }: { scheduleId: number, disableAddButton?: boolean }) {\r\n const [loading, setLoading] = useState(false);\r\n\r\n let hasBeenAdded = props.userAgenda?.userFavourite && props.userAgenda.userFavourite.scheduleIds.includes(scheduleId);\r\n function handleAdd(event: any) {\r\n if (props.userAgenda?.userFavourite) {\r\n setLoading(true)\r\n props.userAgenda.userFavourite.addSchedule(scheduleId).then((resp) => { setLoading(false) })\r\n\r\n\r\n }\r\n }\r\n function hanldeRemove(event: any) {\r\n if (props.userAgenda?.userFavourite) {\r\n setLoading(true)\r\n props.userAgenda.userFavourite.removeSchdule(scheduleId).then((resp) => { setLoading(false) })\r\n\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n return disableAddButton !== true ? <>\r\n {loading ?\r\n \r\n : hasBeenAdded ?\r\n \r\n \r\n \r\n \r\n \r\n :\r\n \r\n \r\n \r\n \r\n \r\n\r\n }\r\n\r\n : null\r\n\r\n\r\n\r\n }\r\n\r\n function renderAddtoCalendar(timeslot: ITimeTable, session: ISession, shedule: ISchedule, disableAddButton = false) {\r\n\r\n const startDatetime = moment(timeslot.startAt).utc();\r\n const endDatetime = moment(timeslot.endAt).utc();\r\n const duration = moment.duration(endDatetime.diff(startDatetime)).asHours();\r\n\r\n const description = generateCalendarDescription(session, shedule.link);\r\n\r\n const event = {\r\n description,\r\n duration,\r\n endDatetime: endDatetime.format('YYYYMMDDTHHmmssZ'),\r\n location: 'Online',\r\n startDatetime: startDatetime.format('YYYYMMDDTHHmmssZ'),\r\n title: session.title,\r\n }\r\n\r\n\r\n\r\n const items: SHARE_SITES_TYPES[] = ['Google', 'iCal', 'Outlook', 'Yahoo'];\r\n\r\n\r\n return <>\r\n {disableAddButton === false\r\n && \r\n \r\n calendarDialogOpenHandler(\r\n
\r\n

{session.title}

\r\n

Time({moment.tz.guess()}): {moment(timeslot.startAt).format('YYYY-MM-DD HH:mm')} - {moment(timeslot.endAt).format('YYYY-MM-DD HH:mm')}

\r\n {items.map(\r\n (item: SHARE_SITES_TYPES) => (\r\n\r\n \r\n \r\n \r\n\r\n ))\r\n }\r\n
\r\n\r\n )}\r\n />\r\n
\r\n
\r\n }\r\n \r\n }\r\n\r\n return
\r\n \r\n\r\n \r\n \r\n \r\n Time
({moment.tz.guess(true)})\r\n\r\n \r\n {\r\n rooms.map(\r\n (room: IRoom, index: number) => {\r\n\r\n return (\r\n\r\n\r\n \r\n {\r\n props.currentRoomId || room.dayLink === undefined || room.dayLink.get(props.selectedDaySlot) === undefined ?\r\n {room.roomTitle}\r\n : \r\n (\r\n props.linkClickHandler ?\r\n props.linkClickHandler() :\r\n {}\r\n )\r\n }\r\n >\r\n {room.roomTitle}\r\n \r\n \r\n }\r\n\r\n \r\n\r\n )\r\n }\r\n )\r\n }\r\n \r\n \r\n \r\n {\r\n timeTables.filter(\r\n ///filter time slot\r\n (t: ITimeTable) =>\r\n\r\n (\r\n (\r\n props.searchOptions?.timeslotMultiSelectValues?.some(\r\n (value: string) => parseInt(value) === t.timeSlot\r\n ) === false\r\n )\r\n ||\r\n (\r\n props.searchOptions?.timeMultiSelectValues?.includes(\r\n `${moment(t.startAt).format('HH:mm')} - ${moment(t.endAt).format('HH:mm')}`\r\n ) === false\r\n )\r\n ) === false\r\n\r\n ).map((timeTable: ITimeTable, index: number, array: ITimeTable[]) => {\r\n\r\n\r\n\r\n\r\n let sessionState = new Date(timeTable.startAt) > props.currentTime ? 'Up Coming' : new Date(timeTable.endAt) < props.currentTime ? 'Past' : 'In Progress';\r\n let sessionStateStr = sessionState;\r\n if (sessionState === 'Up Coming') {\r\n let startTime = moment(props.currentTime);\r\n let endTime = moment(timeTable.startAt)\r\n var dif = moment.duration(endTime.diff(startTime));\r\n sessionStateStr = `Starting in ${dif.humanize()}`\r\n } else {\r\n sessionStateStr = sessionState\r\n }\r\n\r\n //calculate user agenda state\r\n let timeSlotSubscribed = props.userAgenda?.userAttend && timeSlotHasBeenSubscribed(timeTable.timeTableId, props.conferenceInfo.schedules, props.userAgenda.userAttend.scheduleIds);\r\n\r\n function RoomColumns() {\r\n const [addAttendLoading, setAddAttendLoading] = useState(false);\r\n\r\n return <>{\r\n rooms.map(\r\n (room: IRoom, index: number) => {\r\n\r\n\r\n //check if there is a schedule for this cell\r\n let scheduleFound = schedules.find((s: ISchedule) => s.roomId === room.roomId && s.timeTableId === timeTable.timeTableId);\r\n if (scheduleFound) {\r\n //check if this schedule has been subscribed \r\n let isScheduleToAttend: boolean | undefined = props.userAgenda?.userAttend?.scheduleIds.some((scheId: number) => scheId === scheduleFound!.scheduleId);\r\n let isFavouriteSchedule: boolean | undefined = props.userAgenda?.userFavourite?.scheduleIds.some((scheId: number) => scheId === scheduleFound!.scheduleId);\r\n\r\n //filtering\r\n if (props.searchOptions?.agendaOptionValue === \"attend\" && isScheduleToAttend === false) {\r\n return renderEmptyCell(room.roomId);\r\n } else if (props.searchOptions?.agendaOptionValue === \"favourite\" && isFavouriteSchedule === false) {\r\n return renderEmptyCell(room.roomId);\r\n }\r\n else {\r\n //query the session detail\r\n let findSession = sessions.find((s: ISession) => s.sessionId === scheduleFound!.sessionId);\r\n if (findSession) {\r\n\r\n //advanced filtering\r\n if (findSession.title.toLowerCase().includes(props.searchOptions?.searchInputValue?.toLowerCase() ?? \"\") === false\r\n && findSession.description?.toLowerCase().includes(props.searchOptions?.searchInputValue?.toLowerCase() ?? \"\") === false)\r\n return renderEmptyCell(room.roomId);\r\n else if (props.searchOptions?.sessionFormatSelectValue\r\n && props.searchOptions.sessionFormatSelectValue !== \"All\"\r\n && findSession.sessionFormat?.includes(props.searchOptions.sessionFormatSelectValue) === false) {\r\n return renderEmptyCell(room.roomId);\r\n } else if (props.searchOptions?.sessionTrackSelectValue\r\n && props.searchOptions.sessionTrackSelectValue !== \"All\"\r\n && findSession.track?.includes(props.searchOptions.sessionTrackSelectValue) === false) {\r\n return renderEmptyCell(room.roomId);\r\n } else if (props.searchOptions?.sessionTrackMultiSelectValues\r\n && props.searchOptions.sessionTrackMultiSelectValues\r\n .some(\r\n (selectedValue: string) => findSession!.track?.includes(selectedValue)\r\n ) === false) {\r\n return renderEmptyCell(room.roomId);\r\n }\r\n\r\n else if (props.searchOptions?.sessionLevelSelectValue\r\n && props.searchOptions.sessionLevelSelectValue !== \"All\"\r\n && findSession.sessionLevel?.includes(props.searchOptions.sessionLevelSelectValue) === false) {\r\n return renderEmptyCell(room.roomId);\r\n }\r\n else if (props.searchOptions?.sessionSpeakerMultiSelectValues\r\n && props.searchOptions.sessionSpeakerMultiSelectValues\r\n .some(\r\n (selectedSpeakerId: string) => findSession!.sessionSpeakers\r\n .some(\r\n (sessionSpeaker: { speaker: ISpeaker; }) =>\r\n sessionSpeaker.speaker.speakerId === selectedSpeakerId\r\n )\r\n ) === false) {\r\n return renderEmptyCell(room.roomId);\r\n }\r\n else {\r\n return (\r\n \r\n {\r\n props.linkClickHandler && props.linkClickHandler();\r\n sessionDialogOpenHandler(\r\n \r\n )\r\n },\r\n // onMouseEnter: (e) => handlePopoverOpen(e, findSession!),\r\n // onMouseLeave: handlePopoverClose\r\n }\r\n }}\r\n isQnA={scheduleFound.qnA === true}\r\n speakerPhotos={findSession.sessionSpeakers.map((sessionSpeaker) => {\r\n return {\r\n alt: sessionSpeaker.speaker.firstName + \" \" + sessionSpeaker.speaker.lastName,\r\n url: sessionSpeaker.speaker.profilePicture ?? undefined,\r\n eventOptions: {\r\n onClick: () => speakerDialogOpenHandler(\r\n \r\n )\r\n }\r\n }\r\n })\r\n\r\n }\r\n\r\n userActions={\r\n [\r\n props.userAgenda?.userAttend?.userId\r\n && props.userAgenda?.userAttend?.isLoading === false ? {\r\n Component: \r\n } : undefined,\r\n props.userAgenda?.userFavourite?.userId\r\n && props.userAgenda?.userFavourite?.isLoading === false ? {\r\n Component: \r\n } : undefined,\r\n {\r\n Component: renderAddtoCalendar(scheduleFound.timeTable, findSession, scheduleFound)\r\n }\r\n ]\r\n\r\n\r\n }\r\n\r\n\r\n />\r\n\r\n \r\n )\r\n }\r\n } else {\r\n return renderEmptyCell(room.roomId);\r\n }\r\n\r\n }\r\n }\r\n else {\r\n return renderEmptyCell(room.roomId);\r\n }\r\n }\r\n )\r\n }\r\n }\r\n\r\n return (\r\n \r\n {\r\n //render empty row \r\n (index === 0 || array[index].timeSlot !== array[index - 1].timeSlot) &&\r\n <>\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n Repeat of sessions\r\n \r\n \r\n \r\n \r\n\r\n\r\n }\r\n\r\n \r\n\r\n {/*render first column */}\r\n \r\n [{moment(timeTable.startAt).format('YYYY-MM-DD')}]\r\n

\r\n {moment(timeTable.startAt).format('HH:mm')} - {moment(timeTable.endAt).format('HH:mm')}\r\n

\r\n ({sessionStateStr})\r\n

\r\n {\r\n timeSlotSubscribed && renderUserAgendaTimeSlotStatus()\r\n }\r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n
\r\n )\r\n })}\r\n\r\n \r\n
\r\n\r\n {\r\n sessionDialogState.open && sessionDialogState.children &&\r\n \r\n {sessionDialogState.children}\r\n \r\n }\r\n {\r\n speakerDialogState.open && speakerDialogState.children &&\r\n \r\n {speakerDialogState.children}\r\n \r\n }\r\n {\r\n calendarDialogState.open && calendarDialogState.children &&\r\n \r\n {calendarDialogState.children}\r\n \r\n }\r\n
\r\n}\r\n\r\n\r\n\r\n\r\n","import { makeStyles } from \"@material-ui/core\";\r\n\r\nexport const useConferenceAgendaLayoutStyle = makeStyles({\r\n root: {\r\n\r\n display: 'flex',\r\n flexDirection: 'column'\r\n },\r\n optionsContainer: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n justifyContent: 'space-between',\r\n position: 'sticky',\r\n top: '0',\r\n backgroundColor: 'white',\r\n zIndex: 2,\r\n },\r\n\r\n\r\n daysButton: {\r\n // borderColor: '#e1e2e2',\r\n borderRadius: \"5px\",\r\n marginLeft: \"5px\",\r\n width: \"40px\",\r\n height: \"40px\",\r\n\r\n\r\n \"&:hover\": {\r\n backgroundColor: \"#dddddd\",\r\n },\r\n\r\n \"&:focus &:visited\": {\r\n backgroundColor: \"#aaaaaa\",\r\n // borderColor: '#e1e2e2'\r\n }\r\n },\r\n\r\n selectedBtn: {\r\n color: 'red !important'\r\n },\r\n todayBtn: {\r\n backgroundColor: '#B3FFCE !important'\r\n },\r\n dayOption: {\r\n width: \"45px\",\r\n marginLeft: \"5px\",\r\n cursor: 'pointer',\r\n \"&:hover\": {\r\n filter: \"hue-rotate(270deg) brightness(1.7) contrast(2)\",\r\n\r\n }\r\n },\r\n dayOptionSelected: {\r\n filter: \"hue-rotate(90deg) brightness(1.3) contrast(3)\",\r\n },\r\n\r\n exportButtonPopover: {\r\n padding: '10px',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n '& button': {\r\n width: '100px',\r\n margin: '10px'\r\n }\r\n\r\n },\r\n\r\n table: {\r\n overflow: 'auto',\r\n flex: '1 1 auto'\r\n }\r\n});\r\n","import React, { useCallback, useState } from 'react'\r\nimport Select from 'react-select'\r\ninterface IOption {\r\n value: string;\r\n label: string;\r\n\r\n}\r\nexport type IReactSelectOption = IOption;\r\nexport function useReactSingleSelect(options: Array, defaultOption?: IOption): {\r\n selectedOption: IOption | undefined | null,\r\n render: () => JSX.Element,\r\n reset: () => void\r\n\r\n} {\r\n\r\n const [selectedOption, setSelectedOption] = useState(defaultOption);\r\n const handleChange = useCallback((selectedOption: any | null) => {\r\n setSelectedOption(selectedOption);\r\n // console.debug(`Option selected:`, selectedOption);\r\n }, []);\r\n const handleReset = useCallback(() => {\r\n setSelectedOption(defaultOption);\r\n }, [defaultOption]);\r\n const renderSingleSelect = useCallback(\r\n () => {\r\n return \r\n },\r\n [options, defaultOption, handleChange],\r\n )\r\n\r\n\r\n return {\r\n selectedOption: selectedOption,\r\n render: renderSingleSelect,\r\n reset: handleReset\r\n\r\n }\r\n\r\n}\r\n\r\nexport function useReactMultiSelect(options: IOption[], defaultOption?: IOption[]): {\r\n selectedOptions: IOption[] | undefined | null,\r\n render: () => JSX.Element,\r\n reset: () => void\r\n\r\n} {\r\n\r\n const [selectedOptions, setSelectedOptions] = useState(defaultOption);\r\n const handleChange = useCallback(\r\n (selectedOptions: any) => {\r\n setSelectedOptions(selectedOptions);\r\n // console.debug(`Option selected:`, selectedOptions);\r\n },\r\n [],\r\n );\r\n const handleReset = useCallback(\r\n () => {\r\n setSelectedOptions(defaultOption);\r\n },\r\n [defaultOption],\r\n )\r\n const renderMultiSelect = useCallback(\r\n () => {\r\n return \r\n },\r\n [options, defaultOption, handleChange]\r\n )\r\n\r\n\r\n return {\r\n selectedOptions: selectedOptions,\r\n render: renderMultiSelect,\r\n reset: handleReset\r\n\r\n }\r\n\r\n}\r\n","import React, { useEffect, useMemo, useState, useCallback } from 'react'\r\n\r\nimport IRoom from '../../_viewModels/IRoom';\r\nimport ISchedule from '../../_viewModels/ISchedule';\r\nimport ISession from '../../_viewModels/ISession';\r\nimport ITimeTable from '../../_viewModels/ITimeTable';\r\nimport { distinct, concatArray } from '../../_commons/Utils/Linq';\r\nimport ConferenceScheduleTableLayout from './ConferenceScheduleTableLayout';\r\nimport { useConferenceAgendaLayoutStyle } from './ConferenceAgendaPageLayoutStyle';\r\nimport { IUserAgenda } from '../../_viewModels/IUserAgenda';\r\nimport { useTextInput } from '../../_commons/Utils/ReactHooks/useComponents/useTextInput';\r\nimport { IReactSelectOption, useReactMultiSelect, useReactSingleSelect } from '../../_commons/Utils/ReactHooks/useComponents/useReactSelect';\r\nimport ISpeaker from '../../_viewModels/ISpeaker';\r\nimport { useRadioButtonsGroup } from '../../_commons/Utils/ReactHooks/useComponents/useRadioButtonGroup';\r\nimport { generateCalendarDescription, initSelectedDaySlot } from '../../_commons/ConferenceLib';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport { Accordion, AccordionDetails, AccordionSummary, Badge, Button } from '@material-ui/core';\r\nimport moment from 'moment';\r\nimport { buildCalendarFileURL, handleCalendarButtonClick, ICalendarData, ICalendarEventData } from '../../_commons/Utils/ReactHOCs/AddToCalendarHoc/AddToCalendarUtils';\r\nimport { withPopover } from '../../_commons/Utils/ReactComponents/Popovers/Popover';\r\ninterface IProps {\r\n className?: string,\r\n\r\n currentRoomId?: number,\r\n currentTime: Date,\r\n scheduleSelectHandler?: (s: ISchedule) => void,\r\n linkClickHandler?: () => void,\r\n\r\n timeTables: ITimeTable[],\r\n rooms: IRoom[],\r\n sessions: ISession[],\r\n schedules: ISchedule[],\r\n\r\n userAttendAgenda?: IUserAgenda,\r\n userFavouriteAgenda?: IUserAgenda\r\n}\r\nconst preferredOrder = ['Introductory and overview', 'Intermediate', 'Advanced', 'Expert'];\r\n\r\n\r\nconst imageFolderURL = process.env.PUBLIC_URL + \"images\";\r\nexport default function ConferenceAgendaPageLayout(props: IProps) {\r\n //console.debug(\"ConferenceAgendaPageLayout\")\r\n const classes = useConferenceAgendaLayoutStyle();\r\n\r\n\r\n\r\n\r\n //group to get the array of day slot \r\n let daySlots: number[] = distinct(props.timeTables, (time: ITimeTable) => time.daySlot);\r\n\r\n const [_todayDaySlot, setTodayDaySlot] = useState(daySlots[0] ?? 0);\r\n const [_selectedDaySlot, setSelectedDaySlot] = useState(initSelectedDaySlot(props.currentTime, props.timeTables) ?? daySlots[0] ?? 0);\r\n\r\n\r\n useEffect(() => {\r\n let currDaySlotSelected = initSelectedDaySlot(props.currentTime, props.timeTables);\r\n if (currDaySlotSelected) {\r\n setTodayDaySlot(currDaySlotSelected);\r\n }\r\n\r\n }, [props.currentTime, props.timeTables])\r\n\r\n const useAgendaRadioButtonsGroup = useRadioButtonsGroup<\"all\" | \"attend\" | \"favourite\">(\r\n useMemo(() => {\r\n let options: { value: \"all\" | \"attend\" | \"favourite\", label: React.ReactNode }[] = [{ value: \"all\", label: \"All\" }]\r\n if (props.userAttendAgenda)\r\n options.push(\r\n {\r\n value: \"attend\",\r\n label: \r\n Attend\r\n \r\n }\r\n );\r\n if (props.userFavouriteAgenda)\r\n options.push(\r\n {\r\n value: \"favourite\",\r\n label: \r\n Favourite\r\n \r\n }\r\n );\r\n\r\n return options;\r\n }, [props.userAttendAgenda, props.userFavouriteAgenda]),\r\n \"all\");\r\n\r\n const useTearchInput = useTextInput(\"Search\");\r\n\r\n\r\n const useSessionFormatSelect = useReactSingleSelect(\r\n useMemo(() =>\r\n [\"All\"]\r\n .concat(distinct(props.sessions, (session: ISession) => session.sessionFormat).filter(s => s && s !== \"\"))\r\n .map((value: string) => { return { value: value, label: value } })\r\n , [props.sessions])\r\n ,);\r\n\r\n const useSessionLevelSelect = useReactSingleSelect(\r\n useMemo(() =>\r\n [\"All\"]\r\n .concat(distinct(props.sessions, (session: ISession) => session.sessionLevel).filter(s => s && s !== \"\"))\r\n .sort((a: string, b: string) => preferredOrder.indexOf(a) - preferredOrder.indexOf(b))\r\n .map((value: string) => { return { value: value, label: value } })\r\n , [props.sessions])\r\n );\r\n\r\n const useSearchableTrackSelect = useReactMultiSelect(\r\n useMemo(() =>\r\n distinct(\r\n concatArray(\r\n props.sessions.map(\r\n (session: ISession) => session.track ? session.track.split(\",\") : [\"\"]\r\n )\r\n ), (track: string) => track.trim())\r\n .filter(s => s && s !== \"\")\r\n .map((trackStr: string) => { return { value: trackStr, label: trackStr } })\r\n .sort((a: { value: string; label: string; }, b: { value: string; label: string; }) => a.label.localeCompare(b.label))\r\n , [props.sessions])\r\n\r\n )\r\n\r\n const useSearchableSpeakerSelect = useReactMultiSelect(\r\n useMemo(\r\n () => distinct(\r\n concatArray(\r\n props.sessions.map(\r\n (s: ISession) => s.sessionSpeakers.map(\r\n (sessionSpeaker: { speaker: ISpeaker; }): ISpeaker => sessionSpeaker.speaker)\r\n )\r\n ),\r\n (speaker: ISpeaker): string => JSON.stringify({ value: speaker.speakerId, label: speaker.firstName + \" \" + speaker.lastName })\r\n ).map(\r\n (optionStr: string) => {\r\n // console.debug(optionStr)\r\n return JSON.parse(optionStr);\r\n }\r\n ).sort((a: { value: string; label: string; }, b: { value: string; label: string; }) => a.label.localeCompare(b.label))\r\n ,\r\n [props.sessions])\r\n )\r\n\r\n const timeOptions = useMemo(\r\n () => distinct(\r\n props.timeTables,\r\n (t: ITimeTable) => `${moment(t.startAt).format(\"HH:mm\")} - ${moment(t.endAt).format(\"HH:mm\")}`\r\n ).map((value: string) => {\r\n return {\r\n value: value,\r\n label: value\r\n }\r\n }), [props.timeTables]);\r\n\r\n const useTimeMultiSelect = useReactMultiSelect(timeOptions)\r\n\r\n const timeSlotOptions = useMemo(() => distinct(props.timeTables, (t: ITimeTable) => t.timeSlot).map((value) => {\r\n return { value: value, label: value }\r\n }), [props.timeTables])\r\n const useTimeSlotMultipSelect = useReactMultiSelect(timeSlotOptions)\r\n\r\n\r\n\r\n const renderExportCalButton = useCallback(\r\n (schedules: ISchedule[], buttonTitle: string, filename?: string) => {\r\n\r\n function getEventsBySchedules(tmpSchedules: ISchedule[]): ICalendarEventData[] {\r\n \r\n return tmpSchedules.reduce(\r\n function (addedEvents: ICalendarEventData[], sche: ISchedule) {\r\n let ses = props.sessions.find((s: ISession) => s.sessionId === sche.sessionId);\r\n if (ses) {\r\n let desc= generateCalendarDescription(ses,sche.link);\r\n addedEvents.push({\r\n startDatetime: moment(sche.timeTable.startAt).utc().format('YYYYMMDDTHHmmssZ'),\r\n endDatetime: moment(sche.timeTable.endAt).utc().format('YYYYMMDDTHHmmssZ'),\r\n title: ses.title,\r\n description: desc,\r\n location: 'Online',\r\n })\r\n }\r\n return addedEvents;\r\n }\r\n , [])\r\n }\r\n\r\n\r\n const events: ICalendarEventData[] = getEventsBySchedules(schedules);\r\n\r\n\r\n const calendarData: ICalendarData = {\r\n propId: {\r\n company: 'Radacad',\r\n appName: filename ?? 'Calendar',\r\n lang: 'EN'\r\n },\r\n calendarName: filename ?? 'Calendar',\r\n eventsData: events\r\n }\r\n\r\n return handleCalendarButtonClick(e, filename)}\r\n href={buildCalendarFileURL(calendarData)}\r\n >\r\n \r\n \r\n },\r\n [props.sessions],\r\n )\r\n\r\n\r\n const renderExportPopover = useCallback(() => {\r\n const ButtonWithPopover = withPopover(Button);\r\n\r\n\r\n return \r\n
\r\n
\r\n {renderExportCalButton(props.schedules, \"All\", \"Power BI Summit - All\")}\r\n
\r\n {\r\n props.userAttendAgenda && props.userAttendAgenda.userId && props.userAttendAgenda.isLoading === false &&\r\n < div >\r\n {renderExportCalButton(\r\n props.userAttendAgenda.scheduleIds.reduce(\r\n (addedSchedule: ISchedule[], id: number) => {\r\n let schedule = props.schedules.find((s: ISchedule) => s.scheduleId === id);\r\n if (schedule) {\r\n addedSchedule.push(schedule)\r\n }\r\n return addedSchedule;\r\n }\r\n , [])\r\n , \"Attend\", \"Power BI Summit - Attend\")}\r\n
\r\n }\r\n {\r\n props.userFavouriteAgenda && props.userFavouriteAgenda.userId && props.userFavouriteAgenda.isLoading === false &&\r\n < div >\r\n {renderExportCalButton(\r\n props.userFavouriteAgenda.scheduleIds.reduce(\r\n (addedSchedule: ISchedule[], id: number) => {\r\n let schedule = props.schedules.find((s: ISchedule) => s.scheduleId === id);\r\n if (schedule) {\r\n addedSchedule.push(schedule)\r\n }\r\n return addedSchedule;\r\n }, [])\r\n , \"Favourite\", \"Power BI Summit - Favourite\")}\r\n \r\n }\r\n\r\n \r\n
\r\n }, [classes.exportButtonPopover, renderExportCalButton, props.schedules, props.userAttendAgenda, props.userFavouriteAgenda])\r\n\r\n\r\n\r\n\r\n return daySlots.length > 0 ?\r\n
\r\n\r\n
\r\n
\r\n {daySlots.map((daySlot: number) =>\r\n\r\n\r\n\r\n { setSelectedDaySlot(daySlot) }}\r\n />\r\n\r\n )}\r\n
\r\n
\r\n {useAgendaRadioButtonsGroup.component}\r\n {renderExportPopover()}\r\n
\r\n\r\n\r\n \r\n }\r\n aria-controls=\"panel1a-content\"\r\n >\r\n\r\n \r\n\r\n {useTearchInput.render()}\r\n
\r\n \r\n \r\n\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {/* */}\r\n\r\n
\r\n
\r\n \r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n t.daySlot === _selectedDaySlot),\r\n rooms: props.currentRoomId ? props.rooms.filter((r: IRoom) => r.roomId === props.currentRoomId) : props.rooms,\r\n sessions: props.sessions,\r\n schedules: props.schedules\r\n }}\r\n\r\n\r\n userAgenda={{\r\n userAttend: props.userAttendAgenda,\r\n userFavourite: props.userFavouriteAgenda\r\n\r\n }}\r\n\r\n\r\n searchOptions={\r\n {\r\n agendaOptionValue: useAgendaRadioButtonsGroup.selectedValue,\r\n searchInputValue: useTearchInput.value,\r\n sessionFormatSelectValue: useSessionFormatSelect.selectedOption?.value,\r\n sessionLevelSelectValue: useSessionLevelSelect.selectedOption?.value,\r\n sessionTrackMultiSelectValues: useSearchableTrackSelect.selectedOptions?.map((option: IReactSelectOption) => option.value),\r\n sessionSpeakerMultiSelectValues: useSearchableSpeakerSelect.selectedOptions?.map((option: IReactSelectOption) => option.value),\r\n timeslotMultiSelectValues: useTimeSlotMultipSelect.selectedOptions?.map((option: IReactSelectOption) => option.value),\r\n timeMultiSelectValues: useTimeMultiSelect.selectedOptions?.map((option: IReactSelectOption) => option.value)\r\n\r\n }\r\n\r\n }\r\n\r\n />\r\n\r\n :\r\n
\r\n error\r\n
\r\n}\r\n\r\n","import { FormControl, RadioGroup, FormControlLabel, Radio } from '@material-ui/core';\r\nimport React, { useCallback, useMemo, useState } from 'react'\r\n\r\n\r\nexport function useRadioButtonsGroup(\r\n options: {\r\n value: Type,\r\n label: React.ReactNode\r\n }[],\r\n defaultValue: Type)\r\n : {\r\n selectedValue: Type,\r\n component: JSX.Element\r\n\r\n } {\r\n const [value, setValue] = useState(defaultValue);\r\n\r\n const handleChange = useCallback(\r\n (event: React.ChangeEvent) => {\r\n //@ts-ignore\r\n setValue((event.target as HTMLInputElement).value);\r\n },\r\n []\r\n );\r\n\r\n const renderRadioButtonsGroup = useMemo(\r\n () => {\r\n return (\r\n \r\n \r\n {options.map((op: {\r\n value: Type,\r\n label: React.ReactNode\r\n }, index: number) =>\r\n } label={op.label} />)}\r\n \r\n \r\n );\r\n },\r\n [handleChange, value, options],\r\n )\r\n\r\n\r\n\r\n\r\n\r\n return { selectedValue: value, component: renderRadioButtonsGroup }\r\n\r\n}","import { TextField } from \"@material-ui/core\";\r\nimport React, { useState } from \"react\";\r\n\r\nexport function useTextInput(placeholder?: string) {\r\n const [textInputValue, setTextInputValue] = useState(\"\");\r\n\r\n const handleTextInputValueChange = (event: any) => {\r\n setTextInputValue(event.target.value);\r\n }\r\n const reset = () => {\r\n setTextInputValue(\"\");\r\n }\r\n\r\n /*\r\n const renderHTMLTextInput = () => {\r\n return \r\n }\r\n */\r\n const renderMaterialUITextInput = () => {\r\n return \r\n }\r\n\r\n return {\r\n value: textInputValue,\r\n render: renderMaterialUITextInput,\r\n reset: reset\r\n }\r\n}","import { Button, Popover } from \"@material-ui/core\";\r\nimport React, { ReactNode } from \"react\";\r\n\r\nexport function PopoverExample() {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n\r\n const handleClick = (event: React.MouseEvent) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n const id = open ? 'simple-popover' : undefined;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport function withPopover(Button: React.ComponentType) {\r\n\r\n return function WithPopover(props: {\r\n children: ReactNode,\r\n buttonProps?: any\r\n }) {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n\r\n const handleClick = (event: React.MouseEvent) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n const id = open ? 'simple-popover' : undefined;\r\n\r\n return (\r\n <>\r\n \r\n }\r\n , [sortedDayTimeTables, classes])\r\n\r\n\r\n if (selectedTimeSlot) {\r\n // console.debug(selectedTimeSlot)\r\n // console.debug(moment(selectedTimeSlot.startAt).format(\"YYYY-MM-DD HH:mm\"));\r\n let timeSlotState = getSessionState(currentTime, selectedTimeSlot)\r\n let matchedSchedules = conferenceInfo.schedules.filter((s: ISchedule) => s.timeTable.timeTableId === selectedTimeSlot!.timeTableId);\r\n // console.debug(matchedSchedules)\r\n if (matchedSchedules.length > 0)\r\n return (\r\n
\r\n
\r\n\r\n {\r\n timeSlotState === 'In Progress' ? This round of session(s) is in progress now. :\r\n timeSlotState === 'Up Coming' ? This round of session(s) will start in {moment.duration(moment(selectedTimeSlot.startAt).diff(moment(currentTime))).humanize()}. :\r\n This round of session(s) already finished. \r\n }\r\n\r\n {moment(selectedTimeSlot.startAt).format('MM-DD HH:mm')} - {moment(selectedTimeSlot.endAt).format('MM-DD HH:mm')} ({moment.tz.guess(true)})\r\n
\r\n\r\n
\r\n {renderAdjTimeSlotButton(selectedTimeSlot, -1)}\r\n {\r\n conferenceInfo.schedules.filter((s: ISchedule) => s.timeTable.timeTableId === selectedTimeSlot!.timeTableId)\r\n .sort((a: ISchedule, b: ISchedule) => a.roomId - b.roomId)\r\n .map(\r\n (sche: ISchedule, index: number, array: ISchedule[]): JSX.Element => {\r\n\r\n let sessionToPrint = conferenceInfo.sessions.find((se: ISession) => se.sessionId === sche.sessionId);\r\n if (sessionToPrint) {\r\n\r\n return array.length > 1 ?\r\n {renderSessionCard(sessionToPrint, sche.room, timeSlotState)} :\r\n {renderHighlightSessionCard(sessionToPrint, sche.room, timeSlotState)}\r\n } else {\r\n return \r\n }\r\n })\r\n }\r\n {renderAdjTimeSlotButton(selectedTimeSlot, 1)}\r\n
\r\n
\r\n )\r\n else\r\n return <>\r\n }\r\n else\r\n return <>\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\nfunction SessionCardWrapper(props: any) {\r\n return
\r\n\r\n {props.children}\r\n
\r\n}\r\nfunction renderSessionCard(session: ISession, sessionRoom: IRoom, sessionState: SessionStateType) {\r\n\r\n return withWrappedElement(SessionCardWrapper,\r\n \r\n {\r\n return {\r\n alt: s.speaker.firstName + \" \" + s.speaker.lastName,\r\n url: s.speaker.profilePicture ?? undefined,\r\n width: session.sessionSpeakers.length === 4 ? \"19px\" : session.sessionSpeakers.length === 3 ? \"27px\" : \"32px\"\r\n }\r\n })\r\n }\r\n />\r\n
{sessionRoom.roomTitle}
\r\n
\r\n )({ style: { backgroundColor: sessionState === 'In Progress' ? \"#D5F7D2\" : (sessionState === 'Past' ? \"#CCCCCC\" : \"#F9E38C\") } })\r\n}\r\n\r\n\r\nfunction HighlightSessionCardWrapper(props: any) {\r\n return
\r\n\r\n {props.children}\r\n
\r\n}\r\nfunction renderHighlightSessionCard(session: ISession, sessionRoom: IRoom, sessionState: SessionStateType) {\r\n\r\n return withWrappedElement(HighlightSessionCardWrapper,\r\n \r\n {\r\n return {\r\n alt: s.speaker.firstName + \" \" + s.speaker.lastName,\r\n url: s.speaker.profilePicture ?? undefined,\r\n width: session.sessionSpeakers.length === 4 ? \"19px\" : session.sessionSpeakers.length === 3 ? \"27px\" : \"32px\"\r\n }\r\n })\r\n }\r\n />\r\n
{sessionRoom.roomTitle}
\r\n
\r\n )({ style: { backgroundColor: sessionState === 'In Progress' ? \"#D5F7D2\" : (sessionState === 'Past' ? \"#CCCCCC\" : \"#F9E38C\") } })\r\n}\r\n","\r\nimport { HttpHelper } from './../../../_commons/Helpers/HttpHelper';\r\n\r\n\r\ninterface IGetUserAgendaRequest {\r\n userId: string\r\n}\r\nexport interface IGetUserAgendaResponse {\r\n scheduleIds: number[]\r\n}\r\nasync function GetUserAgenda(userId: string, agendaType: \"Attend\" | \"Favourite\", idType?: null | \"MS\" | \"Connex\") {\r\n let data: IGetUserAgendaRequest = { userId: userId };\r\n\r\n if (idType === \"Connex\")\r\n return await HttpHelper.PostJSON(`api/ConnexAgenda/GetUserAgenda/${agendaType}`, data);\r\n else\r\n return await HttpHelper.PostJSON(`api/PrivateAgenda/GetUserAgenda/${agendaType}${idType ? `/${idType}` : \"\"}`, data);\r\n}\r\n\r\n\r\n\r\ninterface IPostUserAgendaRequest {\r\n userId: string,\r\n scheduleId: number\r\n}\r\nasync function AddUserAgenda(userId: string, scheduleId: number, agendaType: \"Attend\" | \"Favourite\", idType?: null | \"MS\" | \"Connex\") {\r\n let data: IPostUserAgendaRequest = { userId, scheduleId }\r\n if (idType === \"Connex\")\r\n return await HttpHelper.PostJSON(`api/ConnexAgenda/AddUserAgenda/${agendaType}`, data);\r\n else\r\n return await HttpHelper.PostJSON(`api/PrivateAgenda/AddUserAgenda/${agendaType}${idType ? `/${idType}` : \"\"}`, data);\r\n}\r\nasync function RemoveUserAgenda(userId: string, scheduleId: number, agendaType: \"Attend\" | \"Favourite\", idType?: null | \"MS\" | \"Connex\") {\r\n let data: IPostUserAgendaRequest = { userId, scheduleId }\r\n\r\n if (idType === \"Connex\")\r\n return await HttpHelper.PostJSON(`api/ConnexAgenda/RemoveUserAgenda/${agendaType}`, data);\r\n else\r\n return await HttpHelper.PostJSON(`api/PrivateAgenda/RemoveUserAgenda/${agendaType}${idType ? `/${idType}` : \"\"}`, data);\r\n}\r\n\r\n\r\nasync function VerifyConnexUser(userId: string) {\r\n //console.debug(\"VerifyConnexUser\")\r\n let data: IGetUserAgendaRequest = { userId: userId };\r\n \r\n return await HttpHelper.PostJSON(`api/ConnexAgenda/VerifyUser`, data);\r\n}\r\n\r\n\r\nasync function RegisterConnexUser(email : string) {\r\n // console.debug(\"RegisterUser\")\r\n let data: {emailAddress:string} = { emailAddress: email };\r\n \r\n return await HttpHelper.PostJSON(`api/ConnexAgenda/RegisterUser`, data);\r\n}\r\n\r\n\r\nexport const UserAgendaApi = {\r\n GetUserAgenda,\r\n AddUserAgenda,\r\n RemoveUserAgenda,\r\n VerifyConnexUser,\r\n RegisterConnexUser\r\n\r\n}","import { useEffect, useState } from 'react';\r\nimport { IGetUserAgendaResponse, UserAgendaApi } from './../_services/SummitApp/APIs/UserAgendaApi';\r\n\r\n\r\nexport function useUserAgenda(userId: string | null | undefined, agendaType: \"Attend\" | \"Favourite\", userIdType?: null | \"MS\" | \"Connex\") {\r\n const [_userId, setUserId] = useState();\r\n //const [_success, setSuccess] = useState(false);\r\n const [_isLoading, setIsLoading] = useState(true);\r\n const [_scheduleIds, setScheduleIds] = useState([]);\r\n\r\n useEffect(() => {\r\n setUserId(userId);\r\n }, [userId]);\r\n\r\n useEffect(() => {\r\n //call api, initialize schduleIds\r\n function initUserAgender(initUserId: string) {\r\n // console.debug(\"initUserAgender:\" + _userId)\r\n\r\n UserAgendaApi.GetUserAgenda(initUserId, agendaType, userIdType)\r\n .then(async resp => {\r\n if (resp.status === 200) {\r\n let data: IGetUserAgendaResponse = await resp.json();\r\n setScheduleIds(data.scheduleIds);\r\n // setSuccess(true)\r\n // console.debug(data.scheduleIds)\r\n } else {\r\n // setSuccess(false);\r\n }\r\n }).catch(err => {\r\n // setSuccess(false);\r\n console.error(err)\r\n })\r\n .finally(() => setIsLoading(false));\r\n }\r\n _userId && initUserAgender(_userId);\r\n\r\n }, [_userId, agendaType, userIdType])\r\n\r\n\r\n async function addSchedule(scheduleId: number): Promise {\r\n // console.debug(\"addSchedule\")\r\n return _userId ? await UserAgendaApi.AddUserAgenda(_userId, scheduleId, agendaType, userIdType)\r\n .then(\r\n resp => {\r\n if (resp.status === 200) {\r\n setScheduleIds(scheduleIds => [...scheduleIds, scheduleId])\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n\r\n\r\n })\r\n : false;\r\n }\r\n async function removeSchdule(scheduleId: number): Promise {\r\n // console.debug(\"removeSchdule\")\r\n return _userId ? await UserAgendaApi.RemoveUserAgenda(_userId, scheduleId, agendaType, userIdType)\r\n .then(\r\n resp => {\r\n if (resp.status === 200) {\r\n setScheduleIds(scheduleIds => scheduleIds.filter(sId => sId !== scheduleId))\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n\r\n\r\n })\r\n : false;\r\n }\r\n\r\n\r\n return { userId: _userId, isLoading: _isLoading, scheduleIds: _scheduleIds, addSchedule, removeSchdule }\r\n}\r\n\r\n","\r\nimport React, { useEffect, useState } from 'react'\r\nimport { createStyles, DialogTitle, makeStyles, Theme, Snackbar } from '@material-ui/core';\r\nimport { Route, Redirect, Switch } from 'react-router';\r\nimport { useSearchParams } from './_commons/Utils/ReactHooks/useSearchParams';\r\nimport { withReactRouteParams } from './_commons/Utils/ReactHOCs/withReactRouteParams';\r\nimport ConferenceAgendaPageLayout from './_components/AgendaPage/ConferenceAgendaPageLayout';\r\nimport RoomStatePage from './_components/RoomStatePage/RoomStatePage';\r\nimport useTime from './_hooks/useTime';\r\nimport { useUserAgenda } from './_hooks/useUserAgenda';\r\nimport { useConferenceInfo } from './_providers/ConferenceInfoProvider';\r\nimport { UserAgendaApi } from './_services/SummitApp/APIs/UserAgendaApi';\r\nimport { IUserAgenda } from './_viewModels/IUserAgenda';\r\nimport { LoadingPage } from './_commons/Utils/ReactComponents/Pages/LoadingPage';\r\nimport { useMediaQuery } from 'react-responsive'\r\nimport { Alert } from '@material-ui/lab';\r\n\r\nexport default function AgendaApp() {\r\n\r\n return \r\n \r\n \r\n
} />\r\n \r\n
\r\n}\r\n\r\n\r\n\r\n\r\n\r\nfunction withSearchParams

(Component: React.ComponentType

) {\r\n\r\n\r\n\r\n return function WithSearchParams(props: any) {\r\n const { email } = useSearchParams(\"email\");\r\n\r\n\r\n return email ?\r\n withEmailAuth(Component, email)(props)\r\n : \r\n }\r\n\r\n}\r\n\r\n\r\n\r\nfunction withEmailAuth

(Component: React.ComponentType

, email: string) {\r\n const ComponentWithPrivateAgenda = withUserPrivateAgenda(Component);\r\n\r\n\r\n\r\n function WithNewUser(props: any) {\r\n\r\n const [registering, setRegistering] = useState(true);\r\n const [success, setSuccess] = useState(false);\r\n const [open, setOpen] = React.useState(true);\r\n\r\n useEffect(() => {\r\n UserAgendaApi.RegisterConnexUser(email).then(\r\n (resp) => {\r\n if (resp.status === 200) {\r\n setSuccess(true)\r\n } else {\r\n setSuccess(false)\r\n }\r\n }).catch(\r\n (e) => {\r\n setSuccess(false)\r\n }\r\n )\r\n .finally(\r\n () => {\r\n setRegistering(false)\r\n }\r\n )\r\n }, [])\r\n\r\n return registering ?\r\n \r\n :\r\n success ?\r\n <>\r\n \r\n setOpen(false)}>\r\n setOpen(false)}>\r\n Reigistering for '{email}' successed.\r\n \r\n \r\n :\r\n <>\r\n \r\n setOpen(false)}>\r\n setOpen(false)} >\r\n Reigistering for the email address -'{email}' failed.\r\n \r\n \r\n \r\n }\r\n\r\n\r\n return function WithEmailAuth(props: any) {\r\n const [isVerifying, setIsVerifying] = useState(true);\r\n const [isValidUser, setIsValidUser] = useState(false);\r\n\r\n useEffect(\r\n () => {\r\n\r\n UserAgendaApi.VerifyConnexUser(email).then(\r\n (resp) => {\r\n // console.debug(resp)\r\n if (resp.status === 200)\r\n setIsValidUser(true)\r\n else\r\n setIsValidUser(false)\r\n }\r\n ).catch(err => {\r\n setIsValidUser(false)\r\n }).finally(() => {\r\n setIsVerifying(false);\r\n })\r\n\r\n\r\n }\r\n , []\r\n )\r\n\r\n\r\n\r\n return isVerifying ?\r\n \r\n : isValidUser === false ?\r\n \r\n : \r\n }\r\n}\r\n\r\nfunction withUserPrivateAgenda

(Component: React.ComponentType

) {\r\n\r\n return function WithUserPrivateAgenda(props: P & { email: string }) {\r\n const userAttendAgenda = useUserAgenda(props.email, \"Attend\", \"Connex\");\r\n const userFavouriteAgenda = useUserAgenda(props.email, \"Favourite\", \"Connex\");\r\n\r\n\r\n return \r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n root: {\r\n height: '100%',\r\n // width: '100%',\r\n margin: '10px 20px 20px 20px ',\r\n display: 'flex',\r\n flexDirection: 'column'\r\n },\r\n\r\n title: {\r\n textAlign: \"center\",\r\n\r\n '& h2': {\r\n fontWeight: 700,\r\n fontSize: \"2em\",\r\n },\r\n },\r\n title_small: {\r\n textAlign: \"center\",\r\n\r\n '& h2': {\r\n fontWeight: 700,\r\n fontSize: \"1.4em\",\r\n },\r\n },\r\n logo:{\r\n maxHeight:'60px',\r\n marginLeft:'30px'\r\n },\r\n body: {\r\n // flex: '1 1 auto',\r\n maxHeight:'100vh'\r\n }\r\n })\r\n)\r\n\r\ninterface IUserAgendas {\r\n attendAgenda?: IUserAgenda,\r\n favouriteAgenda?: IUserAgenda\r\n}\r\n\r\nconst logoURL = process.env.PUBLIC_URL + \"images/summitLogo.png\";\r\nconst logoURLSm = process.env.PUBLIC_URL + \"images/Power_BI_Logo_Small.png\";\r\nfunction Agenda(props: IUserAgendas) {\r\n\r\n const classes = useStyles();\r\n const { currentTime } = useTime();\r\n const { conferenceInfo } = useConferenceInfo();\r\n const isSmallSize = useMediaQuery({ query: '(max-width:748px)' })\r\n\r\n return conferenceInfo ?\r\n

\r\n
\r\n \"Logo\"\r\n Conference Agenda\r\n
\r\n \r\n
\r\n : \r\n}\r\n","import React from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\n\r\nexport function useSearchParams(...parameterNames: ParamNames): Record {\r\n const { search } = useLocation();\r\n return React.useMemo(() => { // recalculate only when 'search' or arguments changed\r\n const searchParams = new URLSearchParams(search);\r\n return parameterNames.reduce((accumulator, parameterName: ParamNames[number]) => {\r\n accumulator[ parameterName ] = searchParams.get(parameterName);\r\n return accumulator;\r\n }, {} as Record);\r\n }, [ search, parameterNames.join(',') ]); // join for sake of reducing array of strings to simple, comparable string\r\n}","\r\n/*\r\nimport 'bootstrap/dist/css/bootstrap.css';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter, Route, Switch } from 'react-router-dom'\r\nimport App from './App';\r\nimport ConferenceInfoProvider from './_providers/ConferenceInfoProvider';\r\nimport AzureAuthenticationProvider from './_providers/AzureAuthenticationProvider'\r\n// MSAL imports\r\nimport { PublicClientApplication } from \"@azure/msal-browser\";\r\nimport { MsalProvider } from \"@azure/msal-react\";\r\nimport { MSAL_CONFIG } from \"./_configs/auth-config\";\r\nimport { GuardedRegistrationPage } from './_components/RegistrationPage/RegistrationPage';\r\n\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\n\r\nconst msalInstance = new PublicClientApplication(MSAL_CONFIG);\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }>\r\n \r\n \r\n ,\r\n rootElement);\r\n*/\r\n\r\nimport 'bootstrap/dist/css/bootstrap.css';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\n\r\nimport ConferenceInfoProvider from './_providers/ConferenceInfoProvider';\r\nimport AgendaApp from './AgendaApp';\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n ,\r\n rootElement);\r\n\r\n"],"sourceRoot":""}