{"version":3,"sources":["lang/messages.js","utils.js","services/viewlogyAuth.js","config/default.js","services/event.js","services/guest.js","context.js","components/Loader/index.js","components/ClientHeader/index.js","components/ContactUs/index.js","components/Footer/index.js","lang/util.js","components/GuestForm/InputFields.js","components/GuestForm/ReCaptcha.js","components/Button/index.js","components/GuestForm/SubmitButton.js","components/GuestForm/Disclaimers.js","components/GuestForm/SubmissionForm.js","components/GuestForm/Header.js","components/GuestForm/isEventStarted.js","components/GuestForm/index.js","features/Viewlogy/Subheader.js","features/Viewlogy/Navigation/messages.js","features/Viewlogy/Navigation/index.js","hooks.js","assets/lock.png","components/Login/LoginContainer.js","components/Login/index.js","components/Login/PINInput.js","features/Viewlogy/messages.js","components/Login/SlideshowMessage.js","features/Viewlogy/Login.js","components/VideoPlayer/index.js","features/Viewlogy/VideoPlayer/VideoPlayer.js","features/Viewlogy/VideoPlayer/CallToAction.js","features/Viewlogy/VideoPlayer/Countdown.js","features/Viewlogy/VideoPlayer/VideoMessage.js","features/Viewlogy/VideoPlayer/MobilePlaceholder.js","features/Viewlogy/VideoPlayer/Overlay.js","features/Viewlogy/VideoPlayer/index.js","features/Viewlogy/GuestSection/List/index.js","features/Viewlogy/GuestSection/index.js","features/Viewlogy/Resources/Card.js","assets/obituary.jpg","assets/preplan.jpg","assets/grief.jpg","features/Viewlogy/Resources/index.js","messages/index.js","components/DonationBanner/index.js","features/Viewlogy/Viewlogy.js","features/Viewlogy/index.js","services/search.js","components/Header/index.js","components/CenteredContentContainer/index.js","assets/search-icon.png","features/Search/index.js","features/SearchDownload/index.js","assets/download.png","features/Feedback/index.js","features/SlideshowUpload/FileInput.js","features/SlideshowUpload/SlideshowUpload.js","features/SlideshowUpload/index.js","features/Redirect404/index.js","features/App/index.js","serviceWorker.js","index.js"],"names":["ar","en","es","fa","fr","hi","pa","pt","ro","ru","tl","vi","zh","setCookie","name","value","expirationDays","d","Date","setTime","getTime","expires","toUTCString","document","cookie","getCookie","_name","ca","split","i","length","c","charAt","substring","indexOf","refresh","window","location","reload","scheduleAtTime","time","fns","offsetMillis","forEach","fn","setTimeout","_setAuthenticated","eventId","pin","_encryptPIN","crypto","createHash","update","digest","authenticate","input","firstName","toLowerCase","_setAuthenticated__legacy","isAuthenticated","id","_getIsAuthenticated__legacy","viewlogiesApiUrl","redirectUrl","googlePlaceIdReviewUrl","recaptchaSiteKey","getEvent","a","organizationId","chapel","startTime","lastName","url","config","console","error","status","message","axios","method","headers","Accept","withCredentials","data","response","getEventByUploadToken","token","createNewUpload","fileBytes","params","getUploadStatus","setGuestCookie","getGuestList","page","size","insertGuest","recaptchaToken","email","postRating","rating","postFeedback","feedback","postIsPreneedLinkClicked","isPreneedLinkClicked","Context","createContext","initialState","urlParams","undefined","isLoading","event","isLoggedIn","isLoginError","isPinLoggedIn","guestList","guestListSize","displaySize","streams","streamIndex","messages","language","navigator","reducer","state","action","type","payload","Error","ViewlogyProvider","children","useReducer","dispatch","Provider","setUrlParams","setIsLoggedIn","setIsLoading","setEvent","setStreams","stream","setStreamIndex","index","setMessages","setIsPinLoggedIn","setGuestList","setGuestListSize","setDisplaySize","locale","useViewlogies","useContext","fetchEvent","log","href","refreshEvent","fetchGuestList","_displaySize","videoLogin","globalPin","login","Loader","props","css","color","Header","organizationName","logoUrl","className","src","alt","ContactUs","defaultMessage","values","chunks","onClick","b","style","Footer","getMomentLocale","InputFields","isInvalidName","isInvalidEmail","maxLength","ReCAPTCHA","require","default","FormattedMessage","ReCaptcha","isSubmitDisabled","recaptchaRef","setMessage","isRecaptchaError","display","ref","sitekey","onChange","Button","this","text","buttonProps","React","Component","SubmitButton","intl","useState","textColor","setTextColor","bgColor","setBgColor","disabled","formatMessage","onMouseEnter","onMouseLeave","border","backgroundColor","opacity","cursor","Disclaimers","SubmissionForm","touched","isSubmitting","validator","isEmail","eventStarted","isFormSubmitted","title","firstSubtitleLine","secondSubtitleLine","marginBottom","isEventStarted","minStartTime","reduce","min","injectIntl","setIsRecaptchaError","setIsFormSubmitted","setIsSubmitting","useRef","margin","height","width","radius","initialValues","onSubmit","current","getValue","Subheader","isRsvpForm","timezone","userTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","moment","utc","tz","format","defineMessages","Vigil","Rosary","Mass","Antyesti","Levaya","Committal","Trisagion","Visitation","Slideshow","Gathering","Navigation","selectedStyle","borderBottom","map","m","useInterval","delay","savedCallback","useEffect","setInterval","clearInterval","LoginContainer","imageSrc","lockImage","Login","password","showSubmit","handlePasswordChange","bind","target","setLoginError","setState","loginError","helpMessage","inputType","submit","ev","preventDefault","placeholder","autoCorrect","autoCapitalize","tabIndex","role","defaultProps","PINInput","setError","isError","secondaryCta","setPin","showHelpMessage","setShowHelpMessage","fields","inputMode","SlideshowMessage","ViewlogyLogin","vimeoAutoplayConfig","vimeo","playerOptions","autopause","autoplay","playsinline","VideoPlayer","thumbnailImageUrl","hidden","introVideoUrl","streamId","videoUrl","setVideoUrl","showIntroVideo","setShowIntroVideo","videoConfig","setVideoConfig","onEnded","light","controls","CallToAction","hover","setHover","treeLink","obituaryUrl","queryParams","URLSearchParams","URL","search","obituaryId","get","e","getTreeLink","plantATree","videoCTA","rel","textDecoration","zeroPad","num","slice","date","hide","renderer","days","hours","minutes","VideoMessage","description","_60_SECONDS","VideoWrapper","showCallToAction","VideoPlayerContainer","showCountdown","setShowCountdown","showOverlay","showMobilePlaceholder","setShowMobilePlaceholder","setStartTime","setMobilePlaceholder","_startTime","_isMobile","streamType","_hasVideoUrl","_shouldHaveVideoUrl","_refreshEvent","_showMobilePlaceholder","_isLoggedIn","_anyStreamLoggedIn","some","_slideshowVisible","List","_fetchGuestList","guestListSizeMessage","isNaN","toLocaleString","onLoadMoreClick","createDate","GuestSection","isGuestList","Card","link","linkText","Resources","preplanningUrl","griefSupportUrl","obituary","externalObituaryUrl","obituaryImg","planningAhead","planningAheadImg","copingResources","copingResourcesImg","reduceOpacity","hex","replace","bigint","parseInt","g","getCorrectedUrl","test","isValidWebsite","includes","DonationBanner","donationUrl","donationUrl2","hover2","setHover2","message1","urls","correctedUrl","push","correctedUrl2","Viewlogy","sharedMessages","isSpecialEvent","every","offset","trigger","scrollToHashElement","hash","elementToScroll","getElementById","scrollTo","top","offsetTop","behavior","addEventListener","removeEventListener","useHashFragment","ReactGA","pageview","pathname","now","entries","endTime","Helmet","property","content","ViewlogyContainer","match","queryPin","parse","CenteredContentContainer","contentClass","Modal","setAppElement","setIsLoginError","isModalOpen","setIsModalOpen","isConsentedToProceed","setIsConsentedToProceed","isWrongEvent","setIsWrongEvent","closeModal","to","modalContent","yes","no","then","setAuth","catch","searchImage","isOpen","onRequestClose","modalStyles","s","downloadLink","download","searchDownload","redirect","Feedback","guest","setGuest","setFeedback","success","submitResult","setSubmitResult","showForm","ratingResult","setRatingResult","r","preneedRedirecUrl","p","atob","toString","_guest","googlePlaceId","err","mainContent","intro","allowedFileTypesRE","FileInput","handleSubmit","videoExists","isUploading","setIsUploading","uploadPercent","setUploadPercent","errorMessage","setErrorMessage","fileInput","filename","setFilename","_handleSubmit","files","pickFileMessage","isUploadComplete","uploadMessage","toFixed","htmlFor","exec","slideshowVimeoUri","_isUploadComplete","_setIsUploadComplete","file","uploadLink","upload","tus","uploadUrl","retryDelays","metadata","filetype","onError","onProgress","bytesUploaded","bytesTotal","onSuccess","isComplete","findPreviousUploads","previousUploads","resumeFromPreviousUpload","start","class","SlideshowUploadContainer","Redirect404","initialize","PortalRedirect","App","path","component","exact","Search","SearchDownload","SlideshowUpload","Boolean","hostname","ReactDOM","render","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.68943268.chunk.js","sourcesContent":["import ar from 'compiled-lang/ar.json';\nimport en from 'compiled-lang/en.json';\nimport es from 'compiled-lang/es.json';\nimport fr from 'compiled-lang/fr.json';\nimport hi from 'compiled-lang/hi.json';\nimport pa from 'compiled-lang/pa.json';\nimport pt from 'compiled-lang/pt.json';\nimport ro from 'compiled-lang/ro.json';\nimport ru from 'compiled-lang/ru.json';\nimport tl from 'compiled-lang/tl.json';\nimport vi from 'compiled-lang/vi.json';\nimport zh from 'compiled-lang/zh.json';\nimport fa from 'compiled-lang/fa.json';\n\nexport default { ar, en, es, fa, fr, hi, pa, pt, ro, ru, tl, vi, zh };\n","import crypto from 'crypto';\nimport validator from 'validator';\n\n/**\n * Set a cookie\n */\nexport const setCookie = (name, value, expirationDays = 30) => {\n const d = new Date();\n d.setTime(d.getTime() + expirationDays * 24 * 60 * 60 * 1000);\n const expires = 'expires=' + d.toUTCString();\n document.cookie = `${name}=${value};${expires};path=/`;\n};\n\n/**\n * // TODO: modernize\n * Get a cookie name and value\n * @param {String} name - name of the cookie\n */\nexport const getCookie = name => {\n const _name = name + '=';\n const ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(_name) === 0) {\n return c.substring(_name.length, c.length);\n }\n }\n return '';\n};\n\n/**\n * Verify that a string is a valid URL\n * @param {String} url\n */\nexport const isValidURL = url => {\n return validator.isURL(url);\n};\n\n/**\n * Perform a sha1 encryption on a string\n * @param {String} str - string to be encrypted\n * @return {string} encrypted value of the string\n */\nexport const sha1 = str =>\n crypto\n .createHash('sha1')\n .update(str, 'utf8')\n .digest('hex');\n\nconst MAX_32_BIT_INTEGER = 2147483647;\n\nexport const refresh = () => window.location.reload(true);\n\n/**\n * Set functions to run at a specific time\n * @param {Date} time - a time to trigger functions (`fns`)\n * @param {Function[]} fns - functions to schedule\n */\nexport const scheduleAtTime = (time, fns) => {\n const offsetMillis = new Date(time).getTime() - new Date().getTime();\n if (offsetMillis > 0 && offsetMillis < MAX_32_BIT_INTEGER) {\n fns.forEach(fn => setTimeout(fn, offsetMillis));\n }\n};\n","import crypto from 'crypto';\nimport { getCookie, setCookie } from 'utils';\n\n/**\n * Store client password as a cookie\n */\nconst _setAuthenticated = (eventId, pin) => setCookie(`${eventId}_pin`, pin);\n\n/**\n * Get client password from cookie\n */\nconst _getPIN = eventId => getCookie(`${eventId}_pin`);\n\n/**\n * Sha1 encrypt input string\n * @param {String} pin - the pin (user input or cookie value)\n * @private\n */\nconst _encryptPIN = pin =>\n crypto\n .createHash('sha1')\n .update(pin)\n .digest('hex');\n\n/**\n * Store client password as a cookie\n */\nconst _setAuthenticated__legacy = (eventId, firstName) => setCookie(`${eventId}_${firstName.toLowerCase()}_in`, true);\n\n/**\n * Get client password from cookie\n */\nconst _getIsAuthenticated__legacy = (eventId, firstName) => getCookie(`${eventId}_${firstName.toLowerCase()}_in`);\n\nexport function setAuth(eventId, pin) {\n _setAuthenticated(eventId, _encryptPIN(pin));\n}\n\nexport function authenticate({ pin, eventId, firstName }, input) {\n if (pin) {\n if (pin === _encryptPIN(input)) {\n _setAuthenticated(eventId, pin);\n return true;\n }\n return false;\n }\n // support for legacy events (use first name from cookie)\n if (firstName.toLowerCase() === input) {\n _setAuthenticated__legacy(eventId, firstName);\n return true;\n }\n return false;\n}\n\n/**\n * Check if user is authenticated\n * @param {String} pin - encrypted pin\n * @param {String} id - eventId or streamId\n * @param {String} firstName - a user's first name (only needed for legacy users)\n * @return {boolean}\n */\nexport function isAuthenticated({ pin, id, firstName }) {\n if (pin) {\n return pin === _getPIN(id);\n }\n // support for legacy events (use first name from cookie)\n return !!_getIsAuthenticated__legacy(id, firstName);\n}\n","const getViewlogiesApiUrl = () => {\n switch (process.env.REACT_APP_ENVIRONMENT) {\n case 'local':\n return 'http://localhost:3000';\n case 'stage':\n return 'https://stage.viewlogies-dev.com';\n default:\n return 'https://viewlogies-dev.com';\n }\n};\n\nexport default {\n viewlogiesApiUrl: getViewlogiesApiUrl(),\n redirectUrl: 'https://viewlogies.com/404',\n googlePlaceIdReviewUrl: 'https://search.google.com/local/writereview?placeid=',\n recaptchaSiteKey: '6Ldlpm0aAAAAAL1yGg7LSA7AGHN8EF5UhV2K5wNL'\n};\n","import axios from 'axios';\nimport config from '../config/default';\n\n/**\n * Request event\n * Either use new endpoint or legacy endpoint depending on function parameters\n * @param {String} organizationId - id of the organization\n * @param {String} eventId - id of the event\n * @param {String} chapel - name of the chapel\n * @param {String} startTime - startTime string that can be converted into date (UTC)\n * @param {String} lastName - last name of the deceased\n * @return {Promise<{message: string, status: number}|{message: string, status: number, data: object}>}\n * @private\n */\nexport const getEvent = async ({ organizationId, eventId, chapel, startTime, lastName }) => {\n // if there's no eventId assume calling legacy URL\n try {\n // get URL\n let url = '';\n if (eventId) {\n url = `${config.viewlogiesApiUrl}/client/v2/event/${organizationId}/${eventId}`;\n } else if (chapel && startTime && lastName) {\n url = `${config.viewlogiesApiUrl}/client/v2/event/${organizationId}/${chapel}/${startTime}/${lastName}`;\n } else {\n console.error('Invalid URL.');\n return { status: -1, message: 'Invalid URL.' };\n }\n\n const { status, data } = await axios({\n method: 'get',\n url,\n headers: { Accept: 'application/json' },\n withCredentials: true\n });\n return { status, data, message: 'Success!' };\n } catch (e) {\n console.error(e);\n const { status, data } = e.response;\n return { status, message: data.message || e.message };\n }\n};\n\n/**\n * Check if user is authorized by PIN\n * Requires cookies to be passed to API\n * @param {String} organizationId - id of the organization\n * @param {String} eventId - id of the event\n * @return {Promise<{status: number, message: string, isAuthorized: boolean}>}\n */\nexport const getEventLogin = async (organizationId, eventId) => {\n try {\n const { status, data } = await axios({\n method: 'get',\n url: `${config.viewlogiesApiUrl}/client/event/login/${organizationId}/${eventId}`,\n headers: { Accept: 'application/json' },\n withCredentials: true\n });\n return { status, isAuthorized: true, message: data.message };\n } catch (e) {\n console.error(e);\n const { status, data } = e.response;\n return { status, isAuthorized: false, message: data.message || e.message };\n }\n};\n\nexport const getEventByUploadToken = async (organizationId, eventId, token) => {\n try {\n const { status, data } = await axios({\n method: 'get',\n url: `${config.viewlogiesApiUrl}/client/event/upload/${organizationId}/${eventId}/${token}`,\n headers: { Accept: 'application/json' },\n withCredentials: true\n });\n return { status, data };\n } catch (e) {\n console.error(e);\n const { status, data } = e.response;\n return { status, message: data.message || e.message };\n }\n};\n\nexport const createNewUpload = async (organizationId, eventId, token, fileBytes) => {\n try {\n const { status, data } = await axios({\n method: 'post',\n url: `${config.viewlogiesApiUrl}/client/event/upload/${organizationId}/${eventId}`,\n params: { token: token },\n data: { fileBytes: fileBytes },\n headers: { 'Content-Type': 'application/json', Accept: '*/*' },\n withCredentials: true\n });\n return { status, data };\n } catch (e) {\n console.error(e);\n const { status, data } = e.response;\n return { status, message: data.message || e.message };\n }\n};\n\nexport const getUploadStatus = async (organizationId, eventId, token) => {\n try {\n const { status, data } = await axios({\n method: 'get',\n url: `${config.viewlogiesApiUrl}/client/event/upload/${organizationId}/${eventId}/status`,\n params: { token: token },\n headers: { Accept: 'application/json' },\n withCredentials: true\n });\n return { status, data };\n } catch (e) {\n console.error(e);\n const { status, data } = e.response;\n return { status, message: data.message || e.message };\n }\n};\n","import axios from 'axios';\nimport config from '../config/default';\nimport { getCookie, setCookie } from '../utils';\n\n/**\n * Record guest insertion event in browser cookie\n * @param {String} eventId - id of the event\n */\nexport const getGuestCookie = eventId => getCookie(`${eventId}_guest_in`);\n\n/**\n * Record guest insertion event in browser cookie\n * @param {String} eventId - id of the event\n */\nexport const setGuestCookie = eventId => setCookie(`${eventId}_guest_in`, true, 3650);\n\n/**\n * Request event\n * Either use new endpoint or legacy endpoint depending on function parameters\n * @param {String} organizationId - id of the organization\n * @param {String} eventId - id of the event\n * @param {Number} page - index in database from where to load guests\n * @param {Number} size - number of guests to request\n * @return {Promise<{message: string, status: number}|{message: string, status: number, data: object}>}\n * @private\n */\nexport const getGuestList = async (organizationId, eventId, page, size) => {\n // if there's no eventId assume calling legacy URL\n try {\n const url = `${config.viewlogiesApiUrl}/client/event/${organizationId}/${eventId}/guest?index=${page}&size=${size}`;\n const { status, data } = await axios({\n method: 'get',\n url,\n headers: { Accept: 'application/json' },\n withCredentials: true\n });\n return { status, data, message: 'Success!' };\n } catch (e) {\n console.error(e);\n const { status, data } = e.response;\n return { status, message: data.message || e.message };\n }\n};\n\n/**\n * Add guest to guest list\n * @param {String} organizationId - id of the organization\n * @param {String} eventId - id of the event\n * @param {String} name - full name of guest\n * @param {String} email - email address of guest\n * @param {String} recaptchaToken - token from recaptcha for backend verification\n * @return {Promise<{message: string, status: number}|{message: *, status: number}>}\n */\nexport const insertGuest = async (eventId, organizationId, { name, email }, recaptchaToken) => {\n try {\n const url = `${config.viewlogiesApiUrl}/client/event/${organizationId}/${eventId}/guest`;\n const { status } = await axios({\n method: 'post',\n url,\n data: { name, email, recaptchaToken },\n headers: { Accept: 'application/json' },\n withCredentials: true\n });\n return { status, message: 'Success!' };\n } catch (e) {\n console.error(e);\n const { status, data } = e.response;\n return { status, message: data.message || e.message };\n }\n};\n\nexport const postRating = async (eventId, organizationId, { email, rating }) =>\n await axios({\n method: 'post',\n url: `${config.viewlogiesApiUrl}/client/event/${organizationId}/${eventId}/guest/rating`,\n data: { email, rating },\n headers: { Accept: 'application/json' },\n withCredentials: true\n });\n\nexport const postFeedback = async (eventId, organizationId, { email, feedback }) =>\n await axios({\n method: 'post',\n url: `${config.viewlogiesApiUrl}/client/event/${organizationId}/${eventId}/guest/feedback`,\n data: { email, feedback },\n headers: { Accept: 'application/json' },\n withCredentials: true\n });\n\nexport const postIsPreneedLinkClicked = async (eventId, organizationId, { email, isPreneedLinkClicked }) =>\n await axios({\n method: 'post',\n url: `${config.viewlogiesApiUrl}/client/event/${organizationId}/${eventId}/guest/preneed`,\n data: { email, isPreneedLinkClicked },\n headers: { Accept: 'application/json' },\n withCredentials: true\n });\n","import React, { createContext, useContext, useReducer } from 'react';\nimport { IntlProvider } from 'react-intl';\nimport messages from 'lang/messages';\nimport { authenticate } from 'services/viewlogyAuth';\nimport { getEvent } from 'services/event';\nimport { getGuestList } from 'services/guest';\n\nconst Context = createContext();\n\nconst GUEST_LIST_MIN_SIZE = 4;\n\nconst initialState = {\n urlParams: undefined,\n isLoading: true,\n event: {\n isLoggedIn: false,\n isLoginError: false\n },\n isPinLoggedIn: false, // set to true if at least one PIN is logged in\n guestList: [],\n guestListSize: 0,\n displaySize: GUEST_LIST_MIN_SIZE,\n streams: [],\n streamIndex: 0,\n messages: {},\n language: navigator.language.split(/[-_]/)[0] || 'en'\n};\n\nconst reducer = (state, action) => {\n // update state through reducer actions\n switch (action.type) {\n case 'UPDATE_URL_PARAMS':\n return {\n ...state,\n urlParams: action.payload\n };\n case 'UPDATE_IS_LOADING':\n return {\n ...state,\n isLoading: action.payload\n };\n case 'UPDATE_IS_LOGGED_IN':\n return {\n ...state,\n event: {\n ...state.event,\n isLoggedIn: action.payload\n }\n };\n case 'UPDATE_EVENT':\n const { streams, ...event } = action.payload;\n return {\n ...state,\n event: {\n ...state.event,\n ...event\n },\n streams\n };\n case 'UPDATE_STREAMS':\n return {\n ...state,\n streams: action.payload\n };\n case 'UPDATE_STREAM_INDEX':\n return {\n ...state,\n streamIndex: action.payload\n };\n case 'UPDATE_MESSAGES':\n return {\n ...state,\n messages: {\n ...state.messages,\n ...action.payload\n }\n };\n case 'UPDATE_IS_PIN_LOGGED_IN':\n return {\n ...state,\n isPinLoggedIn: action.payload\n };\n case 'UPDATE_GUEST_LIST':\n return {\n ...state,\n guestList: action.payload\n };\n case 'UPDATE_GUEST_LIST_SIZE':\n return {\n ...state,\n guestListSize: action.payload\n };\n case 'UPDATE_DISPLAY_SIZE':\n return {\n ...state,\n displaySize: action.payload\n };\n default:\n throw new Error();\n }\n};\n\n/**\n * Provider for EventsContext state\n */\nconst ViewlogyProvider = ({ children }) => {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n const setUrlParams = params => dispatch({ type: 'UPDATE_URL_PARAMS', payload: params });\n const setIsLoading = isLoading => dispatch({ type: 'UPDATE_IS_LOADING', payload: isLoading });\n const setIsLoggedIn = isLoggedIn => dispatch({ type: 'UPDATE_IS_LOGGED_IN', payload: isLoggedIn });\n const setEvent = event => dispatch({ type: 'UPDATE_EVENT', payload: event });\n const setStreams = stream => dispatch({ type: 'UPDATE_STREAMS', payload: stream });\n const setStreamIndex = index => dispatch({ type: 'UPDATE_STREAM_INDEX', payload: index });\n const setMessages = messages => dispatch({ type: 'UPDATE_MESSAGES', payload: messages });\n const setIsPinLoggedIn = isPinLoggedIn => dispatch({ type: 'UPDATE_IS_PIN_LOGGED_IN', payload: isPinLoggedIn });\n const setGuestList = guestList => dispatch({ type: 'UPDATE_GUEST_LIST', payload: guestList });\n const setGuestListSize = size => dispatch({ type: 'UPDATE_GUEST_LIST_SIZE', payload: size });\n const setDisplaySize = size => dispatch({ type: 'UPDATE_DISPLAY_SIZE', payload: size });\n\n return (\n \n \n {children}\n \n \n );\n};\n\n/**\n * Call this method to access Context state in components that use Provider\n */\nconst useViewlogies = () => {\n const value = useContext(Context);\n const {\n event,\n streams,\n streamIndex,\n setIsLoading,\n setIsLoggedIn,\n setEvent,\n setStreams,\n setMessages,\n setIsPinLoggedIn,\n setGuestList,\n setGuestListSize,\n setDisplaySize\n } = value;\n\n // fetch event data for current event (based on URL params)\n const fetchEvent = async params => {\n try {\n const { data } = await getEvent(params);\n setEvent(data);\n setIsLoading(false);\n } catch (e) {\n console.log('Invalid URL!');\n console.error(e);\n // redirect to 404 page\n window.location.href = 'https://www.viewlogies.com/404';\n }\n };\n\n const refreshEvent = async () => {\n try {\n const { organizationId, id, chapel, startTime, lastName } = event;\n const { data } = await getEvent({ organizationId, eventId: id, chapel, startTime, lastName });\n setEvent(data);\n } catch (e) {\n console.error(e);\n }\n };\n\n // log in for a video after a user provides input\n const videoLogin = input => {\n const { globalPin, firstName, id } = event;\n const stream = streams[streamIndex];\n const authParams = globalPin\n ? {\n pin: globalPin,\n eventId: id,\n firstName\n }\n : {\n pin: stream.pin,\n eventId: stream.id,\n firstName\n };\n const _isLoggedIn = authenticate(authParams, input);\n if (_isLoggedIn) {\n setIsPinLoggedIn(true);\n if (globalPin) {\n setIsLoggedIn(true);\n } else {\n streams[streamIndex].isLoggedIn = true;\n setStreams(streams);\n }\n } else {\n setMessages({ login: { error: true } });\n }\n };\n\n // fetch guest list for current event\n const fetchGuestList = async (_displaySize = value.displaySize) => {\n try {\n const { id, organizationId } = event;\n const {\n data: { guestList, guestListSize }\n } = await getGuestList(organizationId, id, 0, _displaySize);\n setGuestList(guestList);\n setGuestListSize(guestListSize); //Total guests in database, not total guests currently displayed\n } catch (e) {\n console.error(e);\n }\n };\n\n return { fetchEvent, refreshEvent, videoLogin, fetchGuestList, ...value };\n};\n\nexport { useViewlogies, ViewlogyProvider };\n","import React from 'react';\nimport FadeLoader from 'react-spinners/FadeLoader';\n\nconst loaderStyles = `\n position: fixed;\n top: calc(50% + 30px);\n left: calc(50% + 30px);\n transform: translate(-50%, -50%);\n`;\n\n/**\n * Simple fade loader using react-spinners module\n * Loader takes up the whole screen\n */\nfunction Loader(props) {\n return ;\n}\n\nexport default Loader;\n","import React from 'react';\nimport { useViewlogies } from 'context';\nimport './header.scss';\n\nconst Header = () => {\n const {\n event: { organizationName, logoUrl }\n } = useViewlogies();\n\n return (\n \n \n \n \n );\n};\n\nexport default Header;\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport { useViewlogies } from 'context';\nimport './contactUs.scss';\n\nconst refresh = () => window.location.reload(true);\n\nconst ContactUs = () => {\n const {\n event: { organizationName, color = '#16394e' }\n } = useViewlogies();\n\n return (\n \n \n \n \n \n \n \n Refresh the website to reconnect the Private Broadcast™. Visit our Help Center. Contact our support team.\"\n values={{\n a: chunks => (\n \n {chunks}\n \n ),\n b: chunks => {chunks}\n }}\n />\n \n {`(415) 763-8439 / support@viewlogies.com`}\n \n \n \n \n \n \n );\n};\n\nexport default ContactUs;\n","import React from 'react';\nimport './footer.scss';\nimport { FormattedMessage } from 'react-intl';\n\nconst Footer = () => (\n \n);\n\nexport default Footer;\n","export const getMomentLocale = language => {\n switch (language) {\n case 'pa':\n return 'pa-in';\n case 'tl':\n return 'tl-ph';\n default:\n return language;\n }\n};\n","import { Field } from 'formik';\nimport { FormattedMessage } from 'react-intl';\n\nconst NAME_INPUT_MAX_LENGTH = 36; // this should keep inputs from being greater than 2 lines\n\nconst InputFields = ({ values, isInvalidName, isInvalidEmail }) => {\n return (\n <>\n \n \n \n \n {values.name.length >= NAME_INPUT_MAX_LENGTH && (\n \n \n \n )}\n \n \n \n \n >\n );\n};\n\nexport default InputFields;\n","import config from 'config/default';\nconst { default: ReCAPTCHA } = require('react-google-recaptcha');\nconst { FormattedMessage } = require('react-intl');\n\nconst ReCaptcha = ({ isSubmitDisabled, recaptchaRef, setMessage, isRecaptchaError }) => {\n return (\n <>\n \n setMessage('')}\n className=\"guest-form-recaptcha\"\n />\n {isRecaptchaError && (\n \n \n \n )}\n \n >\n );\n};\n\nexport default ReCaptcha;\n","import React from 'react';\n// import PropTypes from 'prop-types';\nimport './button.scss';\n\nclass Button extends React.Component {\n render() {\n const { text, children, ...buttonProps } = this.props;\n const className = `viewlogies-button${buttonProps.className ? ` ${buttonProps.className}` : ''}`;\n return (\n \n {text}\n {children}\n \n );\n }\n}\n\nexport default Button;\n","import Button from 'components/Button';\nimport { useState } from 'react';\n\nconst SubmitButton = ({ intl, isSubmitDisabled, color }) => {\n const [textColor, setTextColor] = useState(color);\n const [bgColor, setBgColor] = useState('unset');\n\n return (\n <>\n {\n if (!isSubmitDisabled) {\n setBgColor(color);\n setTextColor('#fff');\n }\n }}\n onMouseLeave={() => {\n if (!isSubmitDisabled) {\n setBgColor('#fff');\n setTextColor(color);\n }\n }}\n style={{\n color: textColor,\n border: `2px solid ${color}`,\n backgroundColor: bgColor,\n opacity: isSubmitDisabled ? '.6' : 'unset',\n cursor: isSubmitDisabled ? 'default' : 'pointer'\n }}\n />\n >\n );\n};\n\nexport default SubmitButton;\n","const { FormattedMessage } = require('react-intl');\n\nconst Disclaimers = () => {\n return (\n <>\n \n Terms of Service and Privacy Policy\"\n values={{\n a: chunks => {chunks},\n b: chunks => {chunks}\n }}\n />\n {/*{`By signing the guest list, you agree to our `}*/}\n {/*{`Terms of Service`}*/}\n {/*{` and `}*/}\n {/*{`Privacy Policy`}*/}\n \n \n Google Privacy Policy and Terms of Service apply.\"\n values={{\n a: chunks => {chunks},\n b: chunks => {chunks}\n }}\n />\n {/*{`This site is protected by reCAPTCHA and the `}*/}\n {/*{`Google Privacy Policy`}*/}\n {/*{` and `}*/}\n {/*{`Terms of Service`}*/}\n {/*{` apply.`}*/}\n \n >\n );\n};\n\nexport default Disclaimers;\n","import { Form } from 'formik';\nimport InputFields from './InputFields';\nimport ReCaptcha from './ReCaptcha';\nimport SubmitButton from './SubmitButton';\nimport Disclaimers from './Disclaimers';\nimport validator from 'validator';\n\nconst SubmissionForm = ({\n values,\n touched,\n isSubmitting,\n recaptchaRef,\n setMessage,\n isRecaptchaError,\n message,\n intl,\n color\n}) => {\n const isInvalidName = touched.name && !values.name;\n const isInvalidEmail = touched.email && !validator.isEmail(values.email);\n const isSubmitDisabled = !values.name || !values.email || isInvalidName || isInvalidEmail || isSubmitting;\n return (\n \n \n \n \n {message && !isRecaptchaError && {message}}\n \n \n \n \n );\n};\n\nexport default SubmissionForm;\n","const Header = ({ intl, lastName, eventStarted, color, isFormSubmitted, isSubmitting }) => {\n const title =\n isFormSubmitted || isSubmitting\n ? eventStarted\n ? intl.formatMessage(\n {\n id: 'features.Viewlogy.GuestSection.Form.thankyou',\n defaultMessage: 'Thank you for supporting the {1} family'\n },\n { 1: lastName }\n )\n : intl.formatMessage({\n id: 'features.Viewlogy.GuestSection.Form.rsvpthankyou',\n defaultMessage: \"Thank you. We'll let you know of any updates.\"\n })\n : eventStarted\n ? intl.formatMessage({ id: 'features.Viewlogy.GuestSection.Form.sign', defaultMessage: 'Sign Guest List' })\n : intl.formatMessage({ id: 'features.Viewlogy.GuestSection.Form.rsvp', defaultMessage: 'RSVP' });\n\n const firstSubtitleLine = eventStarted\n ? intl.formatMessage({\n id: 'features.Viewlogy.GuestSection.Form.signFirstSubtitle',\n defaultMessage: 'to show your support'\n })\n : intl.formatMessage({\n id: 'features.Viewlogy.GuestSection.Form.rsvpFirstSubtitle',\n defaultMessage: 'to receive new updates'\n });\n\n const secondSubtitleLine = eventStarted\n ? intl.formatMessage({\n id: 'features.Viewlogy.GuestSection.Form.signSecondSubtitle',\n defaultMessage: 'and that you attended'\n })\n : intl.formatMessage({\n id: 'features.Viewlogy.GuestSection.Form.rsvpSecondSubtitle',\n defaultMessage: 'about the livestream'\n });\n\n return (\n <>\n \n \n {title}\n \n {!isFormSubmitted && !isSubmitting && (\n \n {firstSubtitleLine}\n \n {secondSubtitleLine}\n \n )}\n \n >\n );\n};\n\nexport default Header;\n","const isEventStarted = streams => {\n const minStartTime = streams.reduce(function(min, stream) {\n return min === null || stream.startTime < min ? stream.startTime : min;\n }, null);\n\n const eventStarted = new Date(minStartTime).getTime() < new Date().getTime();\n\n return eventStarted;\n};\n\nexport default isEventStarted;\n","import React, { useState, useRef } from 'react';\nimport { injectIntl } from 'react-intl';\nimport { Formik } from 'formik';\nimport { useViewlogies } from 'context';\nimport { getGuestCookie, setGuestCookie, insertGuest } from 'services/guest';\nimport './guestForm.scss';\nimport { FormattedMessage } from 'react-intl';\nimport { FadeLoader } from 'react-spinners';\nimport SubmissionForm from './SubmissionForm';\nimport Header from './Header';\nimport isEventStarted from './isEventStarted';\n\nconst GuestForm = ({ intl }) => {\n const {\n event: { id, organizationId, firstName, lastName, color },\n fetchGuestList,\n streams\n } = useViewlogies();\n\n const eventStarted = isEventStarted(streams);\n\n const [message, setMessage] = useState('');\n const [isRecaptchaError, setIsRecaptchaError] = useState(false);\n const [isFormSubmitted, setIsFormSubmitted] = useState(getGuestCookie(id) === 'true');\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const recaptchaRef = useRef();\n\n const loaderStyles = `\n margin-left: 20px;\n `;\n\n return (\n \n \n {isFormSubmitted || isSubmitting ? (\n \n {isSubmitting ? (\n \n \n \n ) : eventStarted ? (\n \n ) : (\n \n )}\n \n ) : (\n <>\n {\n setMessage('');\n const token = await recaptchaRef.current.getValue();\n if (!token) {\n setIsRecaptchaError(true);\n } else {\n setIsRecaptchaError(false);\n setMessage('');\n setIsSubmitting(true);\n const { status } = await insertGuest(id, organizationId, values, token);\n if (status === 201) {\n setGuestCookie(id);\n await fetchGuestList();\n setIsSubmitting(false);\n setIsFormSubmitted(true);\n } else {\n console.error('There was an error', status);\n setMessage(\n intl.formatMessage({\n id: 'features.Viewlogy.GuestSection.Form.error',\n defaultMessage: 'There was an error, please try again.'\n })\n );\n }\n }\n }}\n >\n {({ values, touched, isSubmitting }) => (\n \n )}\n \n >\n )}\n \n );\n};\n\nexport default injectIntl(GuestForm);\n","import React from 'react';\nimport moment from 'moment-timezone';\n// moment locales have to be imported explicitly :(\n// TODO: add locale imports as needed\nimport 'moment/locale/ar';\nimport 'moment/locale/es';\nimport 'moment/locale/fa';\nimport 'moment/locale/fr';\nimport 'moment/locale/hi';\nimport 'moment/locale/pa-in';\nimport 'moment/locale/pt';\nimport 'moment/locale/ro';\nimport 'moment/locale/ru';\nimport 'moment/locale/tl-ph';\nimport 'moment/locale/vi';\nimport 'moment/locale/zh-cn';\nimport { getMomentLocale } from 'lang/util';\nimport { useViewlogies } from 'context';\nimport GuestForm from 'components/GuestForm';\nimport isEventStarted from 'components/GuestForm/isEventStarted';\n\nconst Subheader = () => {\n const {\n event,\n event: { firstName, lastName, timezone, isRsvpForm },\n streams,\n streamIndex,\n language\n } = useViewlogies();\n\n let time = '';\n\n const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n if (streams.length) {\n time = `: ${moment\n .utc(streams[streamIndex].startTime)\n .locale(getMomentLocale(language))\n .tz(userTimezone)\n .format('LLLL z')}`;\n }\n\n const eventStarted = isEventStarted(streams);\n\n return (\n \n {`${firstName} ${lastName}${time}`}\n {!eventStarted && isRsvpForm && }\n \n );\n};\n\nexport default Subheader;\n","import { defineMessages } from 'react-intl';\n\nexport default defineMessages({\n 'Memorial Service': {\n id: 'features.Viewlogy.Navigation.Memorial Service',\n defaultMessage: 'Memorial Service'\n },\n 'Celebration of Life': {\n id: 'features.Viewlogy.Navigation.Celebration of Life',\n defaultMessage: 'Celebration of Life'\n },\n Vigil: {\n id: 'features.Viewlogy.Navigation.Vigil',\n defaultMessage: 'Vigil'\n },\n 'Life Remembered Service': {\n id: 'features.Viewlogy.Navigation.Life Remembered Service',\n defaultMessage: 'Life Remembered Service'\n },\n 'Funeral Service': {\n id: 'features.Viewlogy.Navigation.Funeral Service',\n defaultMessage: 'Funeral Service'\n },\n 'Funeral Reception': {\n id: 'features.Viewlogy.Navigation.Funeral Reception',\n defaultMessage: 'Funeral Reception'\n },\n 'Family Farewell': {\n id: 'features.Viewlogy.Navigation.Family Farewell',\n defaultMessage: 'Family Farewell'\n },\n 'Private Family Viewing': {\n id: 'features.Viewlogy.Navigation.Private Family Viewing',\n defaultMessage: 'Private Family Viewing'\n },\n 'Public Viewing': {\n id: 'features.Viewlogy.Navigation.Public Viewing',\n defaultMessage: 'Public Viewing'\n },\n Rosary: {\n id: 'features.Viewlogy.Navigation.Rosary',\n defaultMessage: 'Rosary'\n },\n Mass: {\n id: 'features.Viewlogy.Navigation.Mass',\n defaultMessage: 'Mass'\n },\n 'Virtual Prayer': {\n id: 'features.Viewlogy.Navigation.Virtual Prayer',\n defaultMessage: 'Virtual Prayer'\n },\n 'Final Blessing': {\n id: 'features.Viewlogy.Navigation.Final Blessing',\n defaultMessage: 'Final Blessing'\n },\n Antyesti: {\n id: 'features.Viewlogy.Navigation.Antyesti',\n defaultMessage: 'Antyesti'\n },\n Levaya: {\n id: 'features.Viewlogy.Navigation.Levaya',\n defaultMessage: 'Levaya'\n },\n 'Sikh Funeral': {\n id: 'features.Viewlogy.Navigation.Sikh Funeral',\n defaultMessage: 'Sikh Funeral'\n },\n Committal: {\n id: 'features.Viewlogy.Navigation.Committal',\n defaultMessage: 'Committal'\n },\n 'Witness Cremation': {\n id: 'features.Viewlogy.Navigation.Witness Cremation',\n defaultMessage: 'Witness Cremation'\n },\n Trisagion: {\n id: 'features.Viewlogy.Navigation.Trisagion',\n defaultMessage: 'Trisagion'\n },\n Visitation: {\n id: 'features.Viewlogy.Navigation.Visitation',\n defaultMessage: 'Visitation'\n },\n Slideshow: {\n id: 'features.Viewlogy.Navigation.Slideshow',\n defaultMessage: 'Slideshow'\n },\n 'Urn Placement': {\n id: 'features.Viewlogy.Navigation.Urn Placement',\n defaultMessage: 'Urn Placement'\n },\n 'Special Event': {\n id: 'features.Viewlogy.Navigation.Special Event',\n defaultMessage: 'Special Event'\n },\n 'Sharing of Memories': {\n id: 'features.Viewlogy.Navigation.Sharing of Memories',\n defaultMessage: 'Sharing of Memories'\n },\n Gathering: {\n id: 'features.Viewlogy.Navigation.Gathering',\n defaultMessage: 'Gathering'\n }\n});\n","import React from 'react';\nimport { useViewlogies } from 'context';\nimport { FormattedMessage } from 'react-intl';\nimport m from './messages';\nimport './navigation.scss';\n\nconst Navigation = () => {\n const {\n event: { color },\n streams,\n streamIndex,\n setStreamIndex\n } = useViewlogies();\n\n const selectedStyle = {\n color,\n borderBottom: `2px solid ${color}`\n };\n\n return (\n \n {streams.map((stream, index) => {\n const isSelected = index === streamIndex;\n const className = `stream-tab${isSelected ? ' selected' : ''}${streams.length === 1 ? ' single' : ''}`;\n return (\n setStreamIndex(index)}\n >\n \n \n );\n })}\n \n );\n};\n\nexport default Navigation;\n","import React, { useEffect, useRef } from 'react';\n\nexport const useInterval = (fn, delay) => {\n const savedCallback = useRef();\n\n // Remember the latest fn.\n useEffect(() => {\n savedCallback.current = fn;\n }, [fn]);\n\n // Set up the interval.\n useEffect(() => {\n let id = setInterval(() => {\n savedCallback.current();\n }, delay);\n return () => clearInterval(id);\n }, [delay]);\n};\n","export default __webpack_public_path__ + \"static/media/lock.0188ba4c.png\";","import React from 'react';\nimport lockImage from 'assets/lock.png';\nimport './loginContainer.scss';\n\nconst LoginContainer = ({ children, className, imageSrc }) => (\n \n \n \n \n {children}\n \n);\n\nexport default LoginContainer;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, FormattedMessage } from 'react-intl';\nimport LoginContainer from './LoginContainer';\nimport './login.scss';\n\nclass Login extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n password: '',\n showSubmit: false\n };\n\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n }\n\n handlePasswordChange(event) {\n const { value: password } = event.target;\n const { setLoginError } = this.props;\n this.setState({ password });\n if (password === '') {\n this.setState({ showSubmit: false });\n setLoginError(false);\n } else {\n this.setState({ showSubmit: true });\n }\n }\n\n render() {\n const { onSubmit, loginError, helpMessage, inputType, intl } = this.props;\n const { password, showSubmit } = this.state;\n const submit = ev => {\n onSubmit(password);\n ev.preventDefault();\n };\n\n return (\n \n \n {helpMessage && {helpMessage}}\n \n {showSubmit ? (\n \n ) : null}\n \n \n \n \n \n );\n }\n}\n\nLogin.defaultProps = {\n inputType: 'password',\n helpMessage: ''\n};\n\nLogin.propTypes = {\n onSubmit: PropTypes.func.isRequired,\n loginError: PropTypes.bool.isRequired,\n setLoginError: PropTypes.func.isRequired,\n helpMessage: PropTypes.string,\n inputType: PropTypes.string\n};\n\nexport default injectIntl(Login);\n","import React, { useState } from 'react';\nimport CodeInput from 'react-code-input';\nimport { FormattedMessage } from 'react-intl';\nimport LoginContainer from './LoginContainer';\nimport './PINLogin.scss';\n\n// expected to be nested within IntlProvider context\n\nconst PINInput = ({ onSubmit, setError, imageSrc, isError, secondaryCta }) => {\n const [pin, setPin] = useState('');\n const [showHelpMessage, setShowHelpMessage] = useState(false);\n\n const handlePINChange = pin => {\n setPin(pin);\n if (pin.length === 6) {\n onSubmit(pin);\n } else {\n setError(false);\n }\n };\n\n const toggleHelpMessageDisplay = () => setShowHelpMessage(!showHelpMessage);\n\n return (\n \n \n \n \n {secondaryCta && {secondaryCta}}\n \n \n \n \n -\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default PINInput;\n","import React from 'react';\n\nconst helpCenter = 'Help Center';\nconst refresh = 'Refresh';\n\nexport default {\n refresh:\n 'Please refresh your page if the stream does not start on time or if you lose connection to the stream at any time.',\n subTitle: 'Enter The Password And Click “Watch Video”',\n recorded: 'This service is being recorded as a keepsake.',\n rewatch: 'Please come back anytime to re-watch.',\n contactUsTitle: 'Need technical support or help with the video?',\n contactUsDescription: [\n 'Please try the following steps for immediate help. ',\n window.location.reload(true)}>\n {refresh}\n ,\n ' the website to reconnect the Private Broadcast™. Visit our ',\n {helpCenter},\n '. Contact our support team.'\n ],\n contactUsNote: 'video streaming and recording is powered by Viewlogies. Call or email us now!',\n obituaryPageIntro: 'Don’t forget about Family Obituary Pages',\n obituaryPageTitle: 'Memorialize Your Loved One',\n obituaryPageDescription:\n 'Upload your memories, photos, and family artifacts to a permanent family website brought to you by',\n obituaryPage: 'Obituary Page',\n loginHelp: 'Password is all lowercase including first letter, please verify your caps lock is off.'\n};\n","import React, { useState } from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport LoginContainer from './LoginContainer';\nimport './PINLogin.scss';\n\n// expected to be nested within IntlProvider context\n\nconst SlideshowMessage = () => {\n const [showHelpMessage, setShowHelpMessage] = useState(false);\n const toggleHelpMessageDisplay = () => setShowHelpMessage(!showHelpMessage);\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default SlideshowMessage;\n","import React from 'react';\nimport { useViewlogies } from 'context';\nimport Login from 'components/Login';\nimport PINInput from 'components/Login/PINInput';\nimport m from './messages';\nimport './login.scss';\nimport SlideshowMessage from 'components/Login/SlideshowMessage';\n\nconst ViewlogyLogin = () => {\n const {\n event: { globalPin },\n streams,\n streamIndex,\n videoLogin,\n messages: { login = { error: false } },\n setMessages\n } = useViewlogies();\n\n const setError = error => setMessages({ login: { error } });\n\n // check for pins (they should exist for all but legacy events)\n if (globalPin || streams[streamIndex].pin) {\n return (\n \n \n \n );\n }\n\n if (streams[streamIndex].id === 'TRIBUTE_VIDEO') {\n return (\n \n \n \n );\n }\n\n // for legacy events\n return (\n \n \n \n );\n};\n\nexport default ViewlogyLogin;\n","import React, { useState, useEffect } from 'react';\nimport ReactPlayer from 'react-player';\nimport { getCookie, setCookie } from 'utils';\nimport './videoPlayer.scss';\n\nconst vimeoAutoplayConfig = {\n vimeo: {\n playerOptions: {\n autopause: false,\n autoplay: true,\n playsinline: true\n }\n }\n};\n\nconst VideoPlayer = ({ url, thumbnailImageUrl = '', hidden = false, introVideoUrl = null, streamId = null }) => {\n const [videoUrl, setVideoUrl] = useState('');\n const [showIntroVideo, setShowIntroVideo] = useState(true);\n const [videoConfig, setVideoConfig] = useState({});\n\n useEffect(() => {\n if (streamId && introVideoUrl && showIntroVideo && getCookie(`WATCHED_INTRO_VIDEO_${streamId}`) === '') {\n setVideoUrl(introVideoUrl);\n } else {\n setShowIntroVideo(false);\n setVideoUrl(url);\n }\n }, [url]);\n\n const onEnded = () => {\n if (showIntroVideo && videoUrl === introVideoUrl) {\n setCookie(`WATCHED_INTRO_VIDEO_${streamId}`, 'true', 1);\n setVideoConfig(vimeoAutoplayConfig);\n setVideoUrl(url);\n setShowIntroVideo(false);\n }\n };\n\n return (\n \n \n \n );\n};\n\nexport default VideoPlayer;\n","import React from 'react';\nimport { useViewlogies } from 'context';\nimport EmbeddedVideoPlayer from 'components/VideoPlayer';\nimport './videoPlayer.scss';\n\nconst VideoPlayer = ({ hidden = false }) => {\n // get data from context\n let {\n streams,\n streamIndex,\n event: { introVideoUrl }\n } = useViewlogies();\n const stream = streams[streamIndex];\n\n return (\n \n );\n};\n\nexport default VideoPlayer;\n","import { useViewlogies } from 'context';\nimport React, { useState } from 'react';\nimport './calltoaction.scss';\n\nconst getTreeLink = (obituaryUrl, organizationId) => {\n try {\n const queryParams = obituaryUrl ? new URLSearchParams(new URL(obituaryUrl).search) : undefined;\n const obituaryId = queryParams.get('obId') || queryParams.get('oId');\n\n let treeLink = '';\n if (obituaryId) {\n treeLink = `https://tree.tributestore.com/memorial-tree?oId=${obituaryId}`;\n } else {\n return '';\n }\n\n if (organizationId) {\n treeLink = `${treeLink}&utm_source=${organizationId}-viewlogies`;\n } else {\n treeLink = `${treeLink}&utm_source=viewlogies`;\n }\n\n treeLink += '&utm_medium=referral&utm_campaign=tt_viewlogies&utm_content=plant-a-tree';\n return treeLink;\n } catch (e) {\n return undefined;\n }\n};\n\nconst CallToAction = () => {\n const [hover, setHover] = useState(false);\n const { event } = useViewlogies();\n const treeLink = getTreeLink(event.obituaryUrl, event.organizationId);\n const plantATree = event.videoCTA === 'Plant A Tree Tribute Store';\n return (\n <>\n {treeLink && plantATree && (\n \n setHover(true)}\n onMouseLeave={() => setHover(false)}\n style={{\n color: hover ? event.color : '#fff',\n border: `2px solid ${event.color}`,\n backgroundColor: hover ? '#fff' : event.color\n }}\n >\n \n \n Plant a Tree\n {event.firstName && (\n in memory of {event.firstName}\n )}\n \n \n \n \n )}\n >\n );\n};\n\nexport default CallToAction;\n","import React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport ReactCountdown from 'react-countdown';\nimport './countdown.scss';\nimport CallToAction from './CallToAction';\n\nconst zeroPad = num => (num > 99 ? `${num}` : ('0' + num).slice(-2));\n\nconst Countdown = ({ intl, date, hide, hidden = false, obituaryUrl }) => {\n return (\n <>\n \n \n \n (\n \n \n \n \n \n \n \n \n \n {zeroPad(days)}\n \n \n \n \n \n {zeroPad(hours)}\n \n \n \n \n \n {zeroPad(minutes)}\n \n \n \n )}\n />\n \n \n \n {'Live'}\n \n \n >\n );\n};\n\nexport default injectIntl(Countdown);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport { useViewlogies } from 'context';\n\nconst VideoMessage = () => {\n const {\n event: { color }\n } = useViewlogies();\n\n return (\n \n \n \n \n \n );\n};\n\nexport default VideoMessage;\n","import React from 'react';\r\nimport { FormattedMessage, injectIntl } from 'react-intl';\r\nimport './mobileplaceholder.scss';\r\n\r\n//TODO - add message to i18n file\r\n\r\nconst MobilePlaceholder = ({ intl, date, hide, hidden = false }) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {'Live'}\r\n \r\n \r\n);\r\n\r\nexport default injectIntl(MobilePlaceholder);\r\n","import React from 'react';\r\nimport { FormattedMessage, injectIntl } from 'react-intl';\r\nimport './overlay.scss';\r\n\r\nconst Overlay = ({ name, description, hidden = false, color = 'black' }) => (\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\nexport default injectIntl(Overlay);\r\n","import React, { useState, useEffect } from 'react';\nimport { useInterval } from 'hooks';\nimport { useViewlogies } from 'context';\nimport { scheduleAtTime } from 'utils';\nimport ViewlogyLogin from '../Login';\nimport VideoPlayer from './VideoPlayer';\nimport Countdown from './Countdown';\nimport VideoMessage from './VideoMessage';\nimport MobilePlaceholder from './MobilePlaceholder';\nimport Overlay from './Overlay';\nimport './videowrapper.scss';\nimport CallToAction from './CallToAction';\n\nconst _60_SECONDS = 60 * 1000;\n\nconst VideoWrapper = ({ children, showCallToAction }) => (\n <>\n {children}\n {showCallToAction ? (\n \n \n \n \n \n \n \n \n \n ) : (\n \n )}\n >\n);\n\nconst VideoPlayerContainer = () => {\n const { event, streams, streamIndex, refreshEvent } = useViewlogies();\n\n const [showCountdown, setShowCountdown] = useState(true);\n const [showOverlay, setShowOverlay] = useState(true);\n const [showMobilePlaceholder, setShowMobilePlaceholder] = useState(false);\n const [startTime, setStartTime] = useState(null); // start time of current or next upcoming stream\n\n const setMobilePlaceholder = _startTime => {\n if (streams.length) {\n const _isMobile = streams[streamIndex].streamType === 'Mobile Stream' ?? false;\n const _hasVideoUrl = !!streams[streamIndex].videoUrl;\n const _shouldHaveVideoUrl = new Date().getTime() > _startTime.getTime() - _60_SECONDS;\n\n setShowMobilePlaceholder(_isMobile && !_hasVideoUrl && _shouldHaveVideoUrl);\n }\n };\n\n useEffect(() => {\n if (startTime) {\n scheduleAtTime(startTime.getTime() - _60_SECONDS, [() => setMobilePlaceholder(startTime)]);\n if (showCountdown) {\n scheduleAtTime(startTime.getTime() - _60_SECONDS, [() => setShowCountdown(false)]);\n }\n }\n }, [startTime]);\n\n useEffect(() => {\n if (streams.length) {\n // set startTime and showCountdown in state, based on current stream start time\n const _startTime = new Date(streams[streamIndex].startTime);\n setMobilePlaceholder(_startTime);\n setShowCountdown(new Date().getTime() <= _startTime.getTime() - _60_SECONDS);\n setStartTime(_startTime);\n }\n }, [streams, streamIndex]);\n\n const FETCH_INTERVAL = 10000;\n const _refreshEvent = async _showMobilePlaceholder => {\n if (_showMobilePlaceholder) {\n await refreshEvent();\n }\n };\n useInterval(() => {\n (async () => await _refreshEvent(showMobilePlaceholder))();\n }, FETCH_INTERVAL);\n\n if (!streams.length || !startTime) {\n return null;\n }\n\n const stream = streams[streamIndex];\n const _isLoggedIn = event.isLoggedIn || stream.isLoggedIn;\n\n const _anyStreamLoggedIn = streams.some(stream => stream.isLoggedIn);\n const _slideshowVisible = stream.id === 'TRIBUTE_VIDEO' && (_anyStreamLoggedIn || _isLoggedIn);\n\n if (!_isLoggedIn && !_slideshowVisible) {\n return (\n <>\n \n >\n );\n }\n return (\n \n {showMobilePlaceholder && stream.id !== 'TRIBUTE_VIDEO' && (\n setShowMobilePlaceholder(false)} hidden={!showMobilePlaceholder} />\n )}\n {showCountdown && stream.id !== 'TRIBUTE_VIDEO' && (\n setShowCountdown(false)} hidden={!showCountdown} />\n )}\n\n {showOverlay && !showCountdown && !showMobilePlaceholder && stream.id !== 'TRIBUTE_VIDEO' && (\n \n )}\n \n \n );\n};\n\nexport default VideoPlayerContainer;\n","import React, { useState, useEffect } from 'react';\nimport moment from 'moment';\n// moment locales have to be imported explicitly :(\n// TODO: add locale imports as needed\nimport 'moment/locale/ar';\nimport 'moment/locale/es';\nimport 'moment/locale/fa';\nimport 'moment/locale/fr';\nimport 'moment/locale/hi';\nimport 'moment/locale/pa-in';\nimport 'moment/locale/pt';\nimport 'moment/locale/ro';\nimport 'moment/locale/ru';\nimport 'moment/locale/tl-ph';\nimport 'moment/locale/vi';\nimport 'moment/locale/zh-cn';\nimport { getMomentLocale } from 'lang/util';\nimport { useViewlogies } from 'context';\nimport { useInterval } from 'hooks';\nimport './guestList.scss';\nimport { FormattedMessage } from 'react-intl';\n\nconst FETCH_INTERVAL = 30000; // 30 second interval for paging guest list table\n\n/**\n * Instead of doing traditional pagination, the guest list size is simply incremented when a user clicks \"Load more\"\n * This solution should be fine for now, and it can be changed if we start having events with over 5000 entries or so\n * The issue is when guests are being added in real time, how do you load more previously created guests?\n * @return {JSX.Element}\n * @constructor\n */\nconst List = () => {\n const {\n displaySize,\n event: { color },\n guestList,\n guestListSize,\n fetchGuestList,\n setDisplaySize,\n language\n } = useViewlogies();\n\n const [isLoading, setIsLoading] = useState(false);\n\n const _fetchGuestList = async (_displaySize = displaySize) => {\n setIsLoading(true);\n await fetchGuestList(_displaySize);\n await fetchGuestList(_displaySize);\n setIsLoading(false);\n };\n\n useEffect(() => {\n (async () => await _fetchGuestList())();\n }, []);\n\n useInterval(() => {\n (async () => await _fetchGuestList())();\n }, FETCH_INTERVAL);\n\n const guestListSizeMessage = !isNaN(guestListSize)\n ? guestListSize > 1\n ? `${guestListSize.toLocaleString()} signed guests`\n : guestListSize === 1\n ? `${guestListSize.toLocaleString()} signed guest`\n : '0 signed guests'\n : isLoading\n ? 'Loading...'\n : undefined; // Some error with the value of guestListSize, hide the text block completely\n\n if (!guestList.length) {\n return null;\n }\n\n const onLoadMoreClick = async () => {\n const _displaySize = guestList.length >= displaySize ? displaySize * 2 : displaySize;\n await _fetchGuestList(_displaySize);\n setDisplaySize(_displaySize);\n };\n\n return (\n \n \n \n \n \n {guestListSizeMessage ? (\n \n \n \n ) : (\n <>>\n )}\n \n {guestList.map(({ name, createDate }, index) => (\n \n {name}\n \n {moment(createDate)\n .locale(getMomentLocale(language))\n .format('L')}\n \n \n ))}\n \n {displaySize < guestListSize ? (\n onLoadMoreClick()}\n disabled={isLoading}\n >\n \n \n ) : (\n <>>\n )}\n \n );\n};\n\nexport default List;\n","import React from 'react';\nimport { useViewlogies } from 'context';\nimport List from './List';\nimport './guestSection.scss';\nimport GuestForm from 'components/GuestForm';\nimport isEventStarted from 'components/GuestForm/isEventStarted';\n\nconst GuestSection = () => {\n const {\n event: { isGuestList },\n isPinLoggedIn,\n streams\n } = useViewlogies();\n\n // useEffect(() => { // TODO: use if we get backend auth working\n // getEventLogin(organizationId, id)\n // .then(({ isAuthorized }) => setIsPinLoggedIn(isAuthorized))\n // .catch(e => {\n // setIsPinLoggedIn(false);\n // console.error(e);\n // });\n // }, []);\n\n if (!isPinLoggedIn || !isGuestList) {\n return null;\n }\n\n const eventStarted = isEventStarted(streams);\n\n return (\n <>\n \n {eventStarted && (\n \n \n \n \n )}\n >\n );\n};\n\nexport default GuestSection;\n","import React, { useState } from 'react';\nimport './resources.scss';\n\nconst Card = ({ imageSrc, color, title, description, link, linkText }) => {\n const [hover, setHover] = useState(false);\n\n return (\n \n \n \n {title}\n {description}\n \n setHover(true)}\n onMouseLeave={() => setHover(false)}\n style={{\n color: hover ? color : '#fff',\n border: `2px solid ${color}`,\n backgroundColor: hover ? 'unset' : color\n }}\n >\n {linkText}\n \n \n \n \n );\n};\n\nexport default Card;\n","export default __webpack_public_path__ + \"static/media/obituary.d9e1ae15.jpg\";","export default __webpack_public_path__ + \"static/media/preplan.dc695e12.jpg\";","export default __webpack_public_path__ + \"static/media/grief.cc812d60.jpg\";","import React from 'react';\nimport { useViewlogies } from 'context';\nimport { FormattedMessage } from 'react-intl';\nimport Card from './Card';\nimport './resources.scss';\nimport obituaryImg from 'assets/obituary.jpg';\nimport planningAheadImg from 'assets/preplan.jpg';\nimport copingResourcesImg from 'assets/grief.jpg';\n\nconst Resources = () => {\n const {\n event: { obituaryUrl, preplanningUrl, griefSupportUrl, firstName, lastName, color, isLoggedIn }\n } = useViewlogies();\n\n if (!isLoggedIn) {\n return null;\n }\n\n let obituary = null;\n if (obituaryUrl) {\n const externalObituaryUrl =\n obituaryUrl.indexOf('http://') === 0 || obituaryUrl.indexOf('https://') === 0\n ? obituaryUrl\n : `//${obituaryUrl}`;\n\n obituary = (\n \n }\n description={\n \n }\n link={externalObituaryUrl}\n linkText={\n \n }\n />\n );\n }\n\n const planningAhead = (\n \n }\n description={\n \n }\n link={preplanningUrl}\n linkText={\n \n }\n />\n );\n\n const copingResources = (\n \n }\n description={\n \n }\n //if griefSupportUrl is not set, use brightermornings.com\n link={griefSupportUrl ? griefSupportUrl : 'https://brightermornings.com/find-hope-and-heal'}\n linkText={\n \n }\n />\n );\n\n return (\n <>\n \n \n {obituary}\n {copingResources}\n {planningAhead}\n \n >\n );\n};\n\nexport default Resources;\n","export default {\n viewlogies: 'Viewlogies',\n viewlogiesAllCaps: 'VIEWLOGIES',\n phoneNumber: '(415) 763-8439',\n supportEmail: 'support@viewlogies.com',\n pronounced: 'pronounced: /v • eulogies/',\n copyright: 'Copyright © 2021 Viewlogies. All rights reserved.',\n errorIntro: 'There was an error'\n};\n","import React, { useState } from 'react';\nimport { useViewlogies } from 'context';\nimport './banner.scss';\n\nconst reduceOpacity = color => {\n const hex = color.replace(/^#/, '');\n\n // Parse r, g, b values\n let bigint = parseInt(hex, 16);\n let r = (bigint >> 16) & 255;\n let g = (bigint >> 8) & 255;\n let b = bigint & 255;\n\n return `rgba(${r}, ${g}, ${b}, ${0.9})`;\n};\n\nconst isValidWebsite = url => {\n const regex = /^(https?:\\/\\/)?(www\\.)?([a-zA-Z0-9-]+(\\.[a-zA-Z]{2,63})+)(\\/[^\\s]*)?$/;\n return regex.test(url);\n};\n\nconst getCorrectedUrl = url => {\n if (url && typeof url === 'string' && isValidWebsite(url)) {\n if (!url.includes('http://') && !url.includes('https://')) {\n return `https://${url}`;\n } else {\n return url;\n }\n }\n return '';\n};\n\nconst DonationBanner = () => {\n const {\n event: { donationUrl, donationUrl2, color, firstName }\n } = useViewlogies();\n\n const backgroundColor = color ?? '#173c4d';\n const [hover, setHover] = useState(false);\n const [hover2, setHover2] = useState(false);\n\n const message1 = firstName\n ? `In lieu of flowers, the family is asking to consider donating in ${firstName}’s name: CLICK HERE`\n : `In lieu of flowers, the family is asking to consider donating: CLICK HERE`;\n const message2 = 'Donation option #2: CLICK HERE';\n\n let urls = [];\n const correctedUrl = getCorrectedUrl(donationUrl);\n if (correctedUrl) {\n urls.push(correctedUrl);\n }\n\n const correctedUrl2 = getCorrectedUrl(donationUrl2);\n if (correctedUrl2) {\n urls.push(correctedUrl2);\n }\n\n return (\n <>\n {urls[0] && (\n setHover(true)}\n onMouseLeave={() => setHover(false)}\n href={urls[0]}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {message1}\n \n )}\n {urls[1] && (\n setHover2(true)}\n onMouseLeave={() => setHover2(false)}\n href={urls[1]}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {message2}\n \n )}\n >\n );\n};\n\nexport default DonationBanner;\n","import React, { useEffect } from 'react';\nimport { Helmet } from 'react-helmet';\nimport ReactGA from 'react-ga';\nimport { useViewlogies } from 'context';\nimport { refresh, scheduleAtTime } from 'utils';\nimport { isAuthenticated } from 'services/viewlogyAuth';\nimport Header from 'components/ClientHeader';\nimport ContactUs from 'components/ContactUs';\nimport Footer from 'components/Footer';\nimport Subheader from './Subheader';\nimport Navigation from './Navigation';\nimport VideoPlayer from './VideoPlayer';\nimport GuestSection from './GuestSection';\nimport Resources from './Resources';\nimport sharedMessages from 'messages';\nimport './viewlogy.scss';\nimport DonationBanner from 'components/DonationBanner';\n\nfunction useHashFragment(offset = 0, trigger = true) {\n useEffect(() => {\n const scrollToHashElement = () => {\n const { hash } = window.location;\n const elementToScroll = document.getElementById(hash?.replace('#', ''));\n\n if (!elementToScroll) return;\n\n window.scrollTo({\n top: elementToScroll.offsetTop - offset,\n behavior: 'smooth'\n });\n };\n\n if (!trigger) return;\n setTimeout(scrollToHashElement, 100);\n window.addEventListener('hashchange', scrollToHashElement);\n return () => window.removeEventListener('hashchange', scrollToHashElement);\n }, [trigger]);\n}\n\nconst Viewlogy = props => {\n const {\n event,\n event: { firstName, lastName },\n videoLogin,\n streams,\n setIsLoggedIn,\n setIsPinLoggedIn,\n setStreams,\n setStreamIndex\n } = useViewlogies();\n const title = `${firstName} ${lastName} — ${sharedMessages.viewlogiesAllCaps}`;\n\n const eventStarted = new Date(streams[0].startTime).getTime() < new Date().getTime();\n\n const isSpecialEvent = streams.every(stream => stream.name === 'Special Event');\n\n useHashFragment();\n\n /**\n * 1 - GA tracking\n * 2 - Video authentication\n * 3 - Set currently visible video\n */\n useEffect(() => {\n // set title manually before tracking page view\n document.title = `${firstName} ${lastName} — ${sharedMessages.viewlogiesAllCaps}`;\n ReactGA.pageview(window.location.pathname);\n\n if (props.pin) {\n videoLogin(props.pin);\n }\n\n // check if authenticated\n if (event.globalPin) {\n const { globalPin: pin, id } = event;\n event.isLoggedIn = isAuthenticated({ pin, id, firstName });\n setIsLoggedIn(event.isLoggedIn);\n if (event.isLoggedIn) setIsPinLoggedIn(true);\n } else {\n setStreams(\n streams.map(stream => {\n const { pin, id } = stream;\n stream.isLoggedIn = isAuthenticated({ pin, id, firstName });\n if (stream.isLoggedIn) setIsPinLoggedIn(true);\n return stream;\n })\n );\n }\n\n // set current stream index\n const now = new Date();\n for (const [index, stream] of streams.entries()) {\n // if stream is currently running\n if (new Date(stream.startTime) < now && now < new Date(stream.endTime) && stream.id !== 'TRIBUTE_VIDEO') {\n setStreamIndex(index);\n return;\n }\n }\n }, []);\n\n /**\n * schedule automatic refreshes\n */\n useEffect(() => {\n // if global PIN and logged in, schedule refresh for all event start times\n if (event.globalPin && event.isLoggedIn) {\n streams.forEach((stream, index) => {\n // switch index to index of stream\n scheduleAtTime(stream.startTime, [refresh, () => setStreamIndex(stream, index)]);\n });\n } else {\n // else schedule a refresh for each stream that is logged in\n streams.forEach((stream, index) => {\n if (stream.isLoggedIn) {\n scheduleAtTime(stream.startTime, [refresh, () => setStreamIndex(stream, index)]);\n }\n });\n }\n }, [event.isLoggedIn, streams]);\n\n return (\n <>\n \n \n {title}\n \n \n \n \n \n \n \n \n \n {/* Don't show funeral resources if event type is special */}\n {!isSpecialEvent && }\n \n \n \n >\n );\n};\n\nexport default Viewlogy;\n","import React, { useEffect } from 'react';\nimport ReactRouterPropTypes from 'react-router-prop-types';\nimport { useViewlogies } from 'context';\nimport Loader from 'components/Loader';\nimport Viewlogy from './Viewlogy';\nimport { parse } from 'query-string';\n\n/**\n * Container component for Viewlogies event page\n * @param {Object} match - ReactRouter URL match object\n * @return {JSX.Element}\n * @constructor\n */\nconst ViewlogyContainer = ({ match: { params }, location }) => {\n const queryPin = parse(location.search).pin;\n const { fetchEvent, isLoading } = useViewlogies();\n // fetch event data from API\n useEffect(() => {\n (async () => fetchEvent(params))();\n }, []);\n // return loading animation while loading\n if (isLoading) return ;\n // return Viewlogies event page\n return ;\n};\n\nViewlogyContainer.propTypes = {\n match: ReactRouterPropTypes.match.isRequired\n};\n\nexport default ViewlogyContainer;\n","import axios from 'axios';\nimport config from 'config/default'; // TODO: fix config\n\nconst { viewlogiesApiUrl } = config;\n\nexport const search = pin => {\n return axios({\n method: 'post',\n url: `${viewlogiesApiUrl}/client/v2/search`,\n data: { pin }\n });\n};\n\nexport const searchDownload = pin => {\n return axios({\n method: 'get',\n url: `${viewlogiesApiUrl}/client/v2/search/download/${pin}`\n });\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport m from 'messages';\nimport './header.scss';\n\nconst Header = ({ type = 'black' }) => (\n \n \n {m.viewlogies}\n \n \n);\n\nHeader.propTypes = {\n type: PropTypes.oneOf(['black', 'black-no-background', 'white'])\n};\n\nexport default Header;\n","import React from 'react';\nimport Header from 'components/Header';\nimport './centeredContentContainer.scss';\n\n/**\n * Container for content centered in a fixed position horizontally and vertically in the middle of the screen\n * @param {String} type - whether the centered content is in 'default' position or 'top' position\n * @param {Element[]} children - content\n * @return {JSX.Element}\n * @constructor\n */\nconst CenteredContentContainer = ({ type = 'default', children }) => {\n let contentClass = '';\n switch (type) {\n case 'top':\n contentClass = 'top-centered-content';\n break;\n case 'default':\n default:\n contentClass = 'centered-content';\n }\n\n return (\n \n \n {children}\n \n );\n};\n\nexport default CenteredContentContainer;\n","export default __webpack_public_path__ + \"static/media/search-icon.01abd853.png\";","import React, { useState } from 'react';\nimport { injectIntl, FormattedMessage } from 'react-intl';\nimport { Redirect } from 'react-router-dom';\nimport Modal from 'react-modal';\nimport { search } from 'services/search';\nimport { setAuth } from 'services/viewlogyAuth';\nimport CenteredContentContainer from 'components/CenteredContentContainer';\nimport PINInput from 'components/Login/PINInput';\nimport Button from 'components/Button';\nimport searchImage from 'assets/search-icon.png';\nimport modalStyles from './modalStyles.json';\nimport './search.scss';\n\nModal.setAppElement('#root');\n\nconst Search = ({ intl }) => {\n const [event, setEvent] = useState(null);\n const [isLoginError, setIsLoginError] = useState(false);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [isConsentedToProceed, setIsConsentedToProceed] = useState(false);\n const [isWrongEvent, setIsWrongEvent] = useState(false);\n\n const openModal = () => setIsModalOpen(true);\n\n const closeModal = () => setIsModalOpen(false);\n\n const proceedToEvent = () => {\n setIsWrongEvent(false);\n setIsConsentedToProceed(true);\n };\n\n const returnToStart = () => {\n setIsWrongEvent(true);\n closeModal();\n };\n\n const handleSubmit = pin => {\n search(pin)\n .then(({ data: event }) => {\n const { streamId } = event;\n setAuth(streamId, pin);\n setEvent(event);\n setIsLoginError(false);\n setIsWrongEvent(false);\n openModal();\n })\n .catch(e => {\n console.error(e);\n setIsLoginError(true);\n setEvent(null);\n });\n };\n\n if (isConsentedToProceed && event) {\n const { organizationId, id } = event;\n return ;\n }\n\n let modalContent = null;\n if (event) {\n const { firstName, lastName } = event;\n const yes = intl.formatMessage({ id: 'yes', defaultMessage: 'yes' });\n const no = intl.formatMessage({ id: 'no', defaultMessage: 'no' });\n\n modalContent = (\n <>\n \n {1} Private Broadcast™.\"\n values={{\n b: (...chunks) => {chunks},\n 1: `${firstName} ${lastName}`\n }}\n />\n \n \n \n \n \n \n \n >\n );\n }\n\n const secondaryCta = isWrongEvent ? (\n \n ) : (\n ''\n );\n\n return (\n \n \n \n {modalContent}\n \n \n );\n};\n\nexport default injectIntl(Search);\n","import React, { useState } from 'react';\nimport { injectIntl, FormattedMessage } from 'react-intl';\nimport Modal from 'react-modal';\nimport { searchDownload } from 'services/search';\nimport CenteredContentContainer from 'components/CenteredContentContainer';\nimport PINInput from 'components/Login/PINInput';\nimport searchImage from 'assets/download.png';\nimport modalStyles from './modalStyles.json';\nimport './searchDownload.scss';\n\nModal.setAppElement('#root');\n\nconst SearchDownload = () => {\n const [event, setEvent] = useState(null);\n const [streams, setStreams] = useState([]);\n const [isLoginError, setIsLoginError] = useState(false);\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const openModal = () => setIsModalOpen(true);\n\n const closeModal = () => setIsModalOpen(false);\n\n const handleSubmit = pin => {\n searchDownload(pin)\n .then(({ data: { event, streams } }) => {\n setEvent(event);\n setStreams(streams);\n setIsLoginError(false);\n openModal();\n })\n .catch(e => {\n console.error(e);\n setIsLoginError(true);\n setEvent(null);\n setStreams([]);\n });\n };\n\n let modalContent = null;\n if (event) {\n const { firstName, lastName } = event;\n\n modalContent = (\n <>\n \n {streams && streams.length > 0 ? (\n {1} Private Broadcast™ by clicking the button${\n streams.length !== 1 ? 's' : ''\n } below.`}\n values={{\n b: (...chunks) => {chunks},\n 1: `${firstName} ${lastName}`\n }}\n />\n ) : (\n {1} Private Broadcast™. Please contact support@viewlogies.com\"\n values={{\n b: (...chunks) => {chunks},\n 1: `${firstName} ${lastName}`\n }}\n />\n )}\n \n \n {streams.map(s => (\n \n {s.name}\n \n ))}\n \n >\n );\n }\n\n return (\n \n \n \n {modalContent}\n \n \n );\n};\n\nexport default injectIntl(SearchDownload);\n","export default \"data:image/png;base64,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\"","import React, { useEffect, useState } from 'react';\nimport { parse } from 'query-string';\nimport { postRating, postFeedback, postIsPreneedLinkClicked } from '../../services/guest';\nimport Header from 'components/Header';\nimport Button from 'components/Button';\nimport config from 'config/default';\nimport './feedback.scss';\n\nconst redirect = () => (window.location.href = config.redirectUrl);\n\nconst Feedback = ({ match: { params }, location }) => {\n const [guest, setGuest] = useState({});\n const [feedback, setFeedback] = useState('');\n const [submitResult, setSubmitResult] = useState({ success: false, message: '' });\n const [ratingResult, setRatingResult] = useState({ success: false, message: '', showForm: false });\n\n const { organizationId, eventId } = params;\n let { r: rating, p: preneedRedirecUrl, e: email } = parse(location.search);\n if (email) {\n email = atob(email.toString());\n }\n\n useEffect(() => {\n if (!email) {\n redirect();\n }\n const _guest = {\n email,\n rating,\n isPreneedLinkClicked: !!preneedRedirecUrl\n };\n setGuest(_guest);\n\n if (preneedRedirecUrl) {\n preneedRedirecUrl = atob(preneedRedirecUrl);\n postIsPreneedLinkClicked(eventId, organizationId, _guest)\n .then(() => {\n console.log('redirecting');\n window.location.href = preneedRedirecUrl;\n })\n .catch(() => {\n window.location.href = preneedRedirecUrl;\n }); // ignore any situations where setting preneed url click event fails\n } else if (rating) {\n postRating(eventId, organizationId, _guest)\n .then(({ data: { googlePlaceId } }) => {\n if (rating === '5') {\n if (googlePlaceId) {\n setRatingResult({\n success: true,\n message: 'You will be redirected shortly...',\n showForm: false\n });\n window.location.href = `${config.googlePlaceIdReviewUrl}${googlePlaceId}`;\n } else {\n setRatingResult({\n success: true,\n message: 'Please let us know how we can improve.',\n showForm: true\n });\n }\n } else {\n setRatingResult({\n success: true,\n message: 'How could we have made this a 5 star experience?',\n showForm: true\n });\n }\n })\n .catch(err => {\n console.error(err);\n window.location.href = config.redirectUrl;\n });\n } else {\n redirect();\n }\n }, [rating]);\n\n const handleSubmit = e => {\n e.preventDefault();\n const _guest = { ...guest, feedback };\n setGuest(_guest);\n postFeedback(eventId, organizationId, _guest)\n .then(() => {\n setSubmitResult({\n success: true,\n message: 'Your feedback was submitted, thank you.'\n });\n })\n .catch(err => {\n console.error(err);\n setSubmitResult({\n success: true,\n message: 'There was an error submitting your feedback. Please try again.'\n });\n });\n };\n\n let mainContent = null;\n if (submitResult.success) {\n mainContent = (\n \n \n {submitResult.message}\n \n );\n } else if (submitResult.message) {\n mainContent = (\n \n \n {submitResult.message}\n \n );\n } else if (ratingResult.success) {\n const message = (\n <>\n \n {ratingResult.message}\n >\n );\n if (ratingResult.showForm) {\n mainContent = (\n \n {message}\n \n setFeedback(ev.target.value)} maxLength={999} />\n \n {'Submit'}\n \n \n \n );\n } else {\n mainContent = message;\n }\n }\n\n let intro = 'Loading...';\n if (preneedRedirecUrl) {\n intro = 'You will be redirected shortly.';\n } else if (rating) {\n intro = 'Thank you for submitting feedback.';\n }\n\n return (\n \n \n \n {intro}\n {mainContent}\n \n \n );\n};\n\nexport default Feedback;\n","import React, { useState, useRef } from 'react';\nimport Button from 'components/Button';\nimport 'index.scss';\nimport './slideshowUpload.scss';\n\nconst allowedFileTypesRE = /(\\.mp4|\\.mov|\\.wmv|\\.avi|\\.flv)$/i;\n\nconst FileInput = ({\n handleSubmit,\n videoExists,\n isUploading,\n setIsUploading,\n uploadPercent,\n setUploadPercent,\n errorMessage,\n setErrorMessage\n}) => {\n const fileInput = useRef(null);\n\n const [filename, setFilename] = useState('');\n\n const _handleSubmit = async e => {\n e.preventDefault();\n setIsUploading(true);\n await handleSubmit(fileInput.current.files[0]);\n };\n\n const pickFileMessage = videoExists ? 'Choose replacement file' : 'Choose a file to upload';\n const isUploadComplete = uploadPercent === 100;\n const uploadMessage = isUploadComplete ? 'Upload complete' : `Uploading ${uploadPercent.toFixed(2)}%`;\n\n return (\n \n \n {pickFileMessage}\n \n {filename && {`${isUploadComplete ? 'Uploaded' : 'Selected'} file: ${filename}`}}\n {errorMessage && {errorMessage}}\n {\n setUploadPercent(0.0);\n setIsUploading(false);\n if (fileInput.current.files[0]) {\n const [{ name }] = fileInput.current.files;\n if (!allowedFileTypesRE.exec(name)) {\n setErrorMessage('Error, file type not allowed');\n } else {\n setErrorMessage('');\n }\n setFilename(name || '');\n }\n }}\n />\n \n {!isUploading ? 'Submit' : uploadMessage}\n \n \n );\n};\n\nexport default FileInput;\n","import React, { useState } from 'react';\nimport { injectIntl } from 'react-intl';\nimport * as tus from 'tus-js-client';\nimport { createNewUpload, getUploadStatus } from 'services/event';\nimport VideoPlayer from 'components/VideoPlayer';\nimport FileInput from './FileInput.js';\nimport 'index.scss';\nimport './slideshowUpload.scss';\n\nconst SlideshowUpload = ({\n organizationId,\n token,\n event: { id: eventId, firstName, lastName, slideshowVimeoUri, isUploadComplete },\n intl\n}) => {\n // TODO: add i18n\n const [isUploading, setIsUploading] = useState(false);\n const [_isUploadComplete, _setIsUploadComplete] = useState(false);\n const [uploadPercent, setUploadPercent] = useState(0.0);\n const [errorMessage, setErrorMessage] = useState('');\n\n const handleSubmit = async file => {\n try {\n const {\n data: { uploadLink }\n } = await createNewUpload(organizationId, eventId, token, file.size);\n\n // create a new tus upload\n const upload = new tus.Upload(file, {\n // endpoint: uploadLink,\n uploadUrl: uploadLink,\n retryDelays: [0, 3000, 5000, 10000, 20000],\n metadata: { filename: file.name, filetype: file.type },\n onError: err => {\n setErrorMessage(`There was an error uploading ${file.name}`);\n console.error(err);\n },\n onProgress: (bytesUploaded, bytesTotal) => {\n setUploadPercent((bytesUploaded / bytesTotal) * 100);\n },\n onSuccess: async () => {\n const {\n data: { isComplete }\n } = await getUploadStatus(organizationId, eventId, token);\n if (isComplete) {\n _setIsUploadComplete(true);\n return;\n }\n setUploadPercent(0.0);\n }\n });\n\n // check if there are any previous uploads to continue\n const previousUploads = await upload.findPreviousUploads();\n if (previousUploads.length) {\n upload.resumeFromPreviousUpload(previousUploads[0]);\n }\n upload.start();\n } catch (err) {\n setErrorMessage(`There was an error uploading ${file.name}`);\n console.error(err);\n }\n };\n\n return (\n \n \n {`${firstName} ${lastName}`}\n {' Private Broadcast™'}\n \n {isUploadComplete || _isUploadComplete ? 'Replace ' : 'Upload '}\n {'Slideshow Tribute Video'}\n \n {(isUploadComplete || _isUploadComplete) && !!slideshowVimeoUri && (\n \n \n {'Current '}\n {'Slideshow Tribute Video'}\n \n \n \n \n \n )}\n \n \n );\n};\n\nexport default injectIntl(SlideshowUpload);\n","import React, { useState, useEffect } from 'react';\nimport { parse } from 'query-string';\nimport { getEventByUploadToken } from 'services/event';\nimport Header from 'components/Header';\nimport Loader from 'components/Loader';\nimport SlideshowUpload from './SlideshowUpload';\nimport 'index.scss';\nimport './slideshowUpload.scss';\n\nconst SlideshowUploadContainer = ({ match: { params }, location, intl }) => {\n const { organizationId, eventId } = params;\n const { token } = parse(location.search);\n\n const [event, setEvent] = useState(null);\n\n useEffect(() => {\n getEventByUploadToken(organizationId, eventId, token)\n .then(({ data }) => setEvent(data))\n .catch(err => {\n console.error(err);\n // redirect to 404 page\n window.location.href = 'https://www.viewlogies.com/404';\n });\n }, []);\n\n return (\n \n \n {event === null ? (\n \n ) : (\n \n )}\n \n );\n};\n\nexport default SlideshowUploadContainer;\n","import React from 'react';\n\nconst Redirect404 = () => {\n window.location.href = 'https://viewlogies.com/404';\n return null;\n};\n\nexport default Redirect404;\n","import React from 'react';\nimport { BrowserRouter as Router, Switch, Route } from 'react-router-dom';\nimport { Helmet } from 'react-helmet';\nimport ReactGA from 'react-ga';\nimport { ViewlogyProvider } from 'context';\nimport Viewlogy from 'features/Viewlogy';\nimport Search from 'features/Search';\nimport SearchDownload from 'features/SearchDownload';\nimport Feedback from 'features/Feedback';\nimport SlideshowUpload from 'features/SlideshowUpload';\nimport Redirect404 from 'features/Redirect404';\n\n// initialize google analytics\nReactGA.initialize('UA-66908667-1');\n\nconst PortalRedirect = ({\n match: {\n params: { organizationId }\n }\n}) => {\n window.location.href = `https://portal.viewlogies.net/${organizationId}/login`;\n return null;\n};\n\nconst App = () => (\n \n \n {'VIEWLOGIES'}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n);\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from 'features/App';\nimport './index.scss';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}
\n Refresh the website to reconnect the Private Broadcast™. Visit our Help Center. Contact our support team.\"\n values={{\n a: chunks => (\n \n {chunks}\n \n ),\n b: chunks => {chunks}\n }}\n />\n
\n \n
\n Terms of Service and Privacy Policy\"\n values={{\n a: chunks => {chunks},\n b: chunks => {chunks}\n }}\n />\n {/*{`By signing the guest list, you agree to our `}*/}\n {/*{`Terms of Service`}*/}\n {/*{` and `}*/}\n {/*{`Privacy Policy`}*/}\n
\n Google Privacy Policy and Terms of Service apply.\"\n values={{\n a: chunks => {chunks},\n b: chunks => {chunks}\n }}\n />\n {/*{`This site is protected by reCAPTCHA and the `}*/}\n {/*{`Google Privacy Policy`}*/}\n {/*{` and `}*/}\n {/*{`Terms of Service`}*/}\n {/*{` apply.`}*/}\n
\n {title}\n
\n {firstSubtitleLine}\n \n {secondSubtitleLine}\n
{helpMessage}
{secondaryCta}
Plant a Tree
in memory of {event.firstName}
{zeroPad(days)}
{zeroPad(hours)}
{zeroPad(minutes)}
\n \n \n \n
{description}
{submitResult.message}
{ratingResult.message}
{`${isUploadComplete ? 'Uploaded' : 'Selected'} file: ${filename}`}
{errorMessage}
\n {'Current '}\n {'Slideshow Tribute Video'}\n