{"version":3,"sources":["helpers/authentication.ts","components/routes/Routes.tsx","localization.ts","App.tsx","apolloClient.ts","serviceWorkerRegistration.ts","index.tsx","__generated__/globalTypes.ts","helpers/utils.ts","components/sidebar/Sidebar.tsx","components/header/Searchbar.tsx","components/header/Header.tsx","components/layout/MainMenu.tsx","components/layout/Layout.tsx","components/messages/icons/dismissIcon.svg","components/messages/Message.tsx","components/messages/MessageProgress.tsx","components/messages/SubscriptionsHook.ts","components/messages/Messages.tsx","components/photoGallery/ProtectedMedia.tsx","primitives/Loader.tsx","components/routes/AuthorizedRoute.tsx"],"names":["saveTokenCookie","token","document","cookie","clearTokenCookie","authToken","match","saveSharePassword","shareToken","password","getSharePassword","AuthorizedRoute","React","lazy","AlbumsPage","AlbumPage","PhotosPage","PlacesPage","SharePage","PeoplePage","LoginPage","InitialSetupPage","SettingsPage","Routes","t","useTranslation","Suspense","fallback","Layout","title","Loader","message","active","path","component","location","href","exact","render","to","SITE_TRANSLATION","gql","App","pathname","useLocation","loadLang","data","useLazyQuery","useEffect","language","myUserPreferences","isNil","i18n","changeLanguage","LanguageTranslation","Danish","then","danish","addResourceBundle","English","english","French","Swedish","swedish","Italian","italian","Spanish","spanish","Polish","polish","German","german","Russian","russian","TraditionalChinese","traditionalChinese","SimplifiedChinese","Portuguese","exhaustiveCheck","loadTranslations","window","scrollTo","activeElement","body","blur","Helmet","name","content","Messages","GRAPHQL_ENDPOINT","urlJoin","origin","httpLink","HttpLink","uri","credentials","console","log","apiProtocol","URL","protocol","websocketUri","wsLink","WebSocketLink","toString","link","split","query","definition","getMainDefinition","kind","operation","linkError","onError","graphQLErrors","networkError","errorMessages","map","locations","JSON","stringify","length","push","header","find","x","errors","result","newMessages","msg","key","Math","random","type","NotificationType","Message","props","negative","MessageState","set","messages","paginateCache","keyArgs","merge","existing","incoming","args","fieldName","merged","slice","paginate","Error","offset","i","memoryCache","InMemoryCache","typePolicies","SiteInfo","MediaURL","keyFields","Album","fields","media","FaceGroup","imageFaces","Query","myTimeline","myFaceGroups","client","ApolloClient","ApolloLink","from","cache","isLocalhost","Boolean","hostname","registerValidSW","swUrl","config","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","onUpdate","onSuccess","catch","error","use","initReactI18next","init","resources","en","translation","lng","fallbackLng","returnNull","interpolation","escapeValue","react","useSuspense","process","Main","ApolloProvider","Sidebar","ReactDOM","getElementById","addEventListener","fetch","headers","response","contentType","get","status","indexOf","ready","unregister","reload","checkValidServiceWorker","serviceWorkerRegistration","MediaType","OrderDirection","debounce","func","wait","triggerRising","timeout","debounced","clearTimeout","undefined","setTimeout","cancel","value","SidebarContext","createContext","updateSidebar","warn","setPinned","pinned","displayName","SidebarProvider","children","setState","useState","Provider","useContext","classList","remove","add","className","SEARCH_QUERY","SearchWrapper","styled","div","attrs","ResultTitle","h1","SearchResults","albums","loading","selectedItem","setSelectedItem","expanded","albumElements","album","AlbumRow","selected","setSelected","id","mediaElements","PhotoRow","role","classNames","hidden","tabIndex","onMouseDown","e","preventDefault","SearchRow","preview","label","rowEl","useRef","history","useHistory","keydownEvent","event","removeEventListener","current","scrollIntoView","block","ref","onMouseOver","src","thumbnail","url","searchHighlighted","text","toLowerCase","start","substring","middle","end","SearchBar","fetchSearches","fetchResult","setQuery","fetched","setFetched","setExpanded","inputEl","debouncedFetch","variables","routerMatch","useRouteMatch","searchData","search","selectedItemId","elem","focusEvent","blurEvent","totalItems","min","max","results","trim","autoComplete","placeholder","onChange","persist","target","Header","alt","MAPBOX_QUERY","FACE_DETECTION_ENABLED_QUERY","MenuButton","background","icon","activeClasses","activeClassName","style","backgroundColor","MenuSeparator","MainMenu","mapboxQuery","useQuery","faceDetectionEnabledQuery","mapboxEnabled","mapboxToken","faceDetectionEnabled","siteInfo","viewBox","fill","d","ADMIN_QUERY","otherProps","sidebarContent","_g","_extends","Object","assign","arguments","source","prototype","hasOwnProperty","call","apply","this","SvgDismissIcon","titleId","svgRef","stroke","strokeWidth","fillRule","ForwardRef","forwardRef","onDismiss","onClick","MessageProgress","percent","color","width","NOTIFICATION_SUBSCRIPTION","messageTimeoutHandles","Map","SubscriptionsHook","setMessages","useSubscription","notification","filter","m","newNotification","positive","progress","timeoutHandle","notifyIndex","findIndex","propTypes","PropTypes","array","isRequired","Container","fn","removeKey","transitions","useTransition","reverse","opacity","height","enter","leave","item","MessageElement","dismissMessage","Progress","getMessageElement","isNativeLazyLoadSupported","createElement","getProtectedUrl","imgUrl","tokenRegex","searchParams","ProtectedImage","lazyLoading","crossOrigin","FallbackLazyloadedImage","inView","setInView","imgRef","imgElm","IntersectionObserver","observer","entry","isIntersecting","disconnect","root","threshold","observe","ProtectedVideo","videoWeb","controls","poster","useIsAdmin","enabled","fetchAdminQuery","called","myUser","admin","Authorized","Component","isAdmin","unauthorizedRedirect","adminRedirect","routeProps"],"mappings":"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","file":"static/js/main.e86c42b2.chunk.js","sourcesContent":["export function saveTokenCookie(token: string) {\n const maxAge = 14 * 24 * 60 * 60\n\n document.cookie = `auth-token=${token} ;max-age=${maxAge} ;path=/ ;sameSite=Lax`\n}\n\nexport function clearTokenCookie() {\n document.cookie = 'auth-token= ;max-age=0 ;path=/ ;sameSite=Lax'\n}\n\nexport function authToken() {\n const match = document.cookie.match(/auth-token=([\\d\\w]+)/)\n return match && match[1]\n}\n\nexport function saveSharePassword(shareToken: string, password: string) {\n document.cookie = `share-token-pw-${shareToken}=${password} ;path=/ ;sameSite=Lax`\n}\n\nexport function getSharePassword(shareToken: string) {\n const match = document.cookie.match(\n `share-token-pw-${shareToken}=([\\\\d\\\\w]+)`\n )\n return match && match[1]\n}\n","import React from 'react'\nimport { Route, Switch, Redirect } from 'react-router-dom'\n\nimport Layout from '../layout/Layout'\nimport { clearTokenCookie } from '../../helpers/authentication'\nimport { useTranslation } from 'react-i18next'\nimport Loader from '../../primitives/Loader'\n\nconst AuthorizedRoute = React.lazy(() => import('./AuthorizedRoute'))\n\nconst AlbumsPage = React.lazy(\n () => import('../../Pages/AllAlbumsPage/AlbumsPage')\n)\nconst AlbumPage = React.lazy(() => import('../../Pages/AlbumPage/AlbumPage'))\nconst PhotosPage = React.lazy(() => import('../../Pages/PhotosPage/PhotosPage'))\nconst PlacesPage = React.lazy(() => import('../../Pages/PlacesPage/PlacesPage'))\nconst SharePage = React.lazy(() => import('../../Pages/SharePage/SharePage'))\nconst PeoplePage = React.lazy(() => import('../../Pages/PeoplePage/PeoplePage'))\n\nconst LoginPage = React.lazy(() => import('../../Pages/LoginPage/LoginPage'))\nconst InitialSetupPage = React.lazy(\n () => import('../../Pages/LoginPage/InitialSetupPage')\n)\n\nconst SettingsPage = React.lazy(\n () => import('../../Pages/SettingsPage/SettingsPage')\n)\n\nconst Routes = () => {\n const { t } = useTranslation()\n\n return (\n \n \n \n }\n >\n \n \n \n {() => {\n clearTokenCookie()\n location.href = '/'\n }}\n \n \n \n \n \n \n \n \n \n } />\n (\n
{t('routes.page_not_found', 'Page not found')}
\n )}\n />\n
\n \n )\n}\n\nexport default Routes\n","import { useEffect } from 'react'\nimport { siteTranslation } from './__generated__/siteTranslation'\nimport { gql, useLazyQuery } from '@apollo/client'\nimport i18n from 'i18next'\nimport { initReactI18next, TFunction } from 'react-i18next'\nimport { LanguageTranslation } from './__generated__/globalTypes'\nimport { authToken } from './helpers/authentication'\nimport { exhaustiveCheck, isNil } from './helpers/utils'\n\nexport type TranslationFn = TFunction<'translation'>\n\nexport function setupLocalization(): void {\n i18n.use(initReactI18next).init({\n resources: {\n en: {\n translation: {\n 'Welcome to React': 'Welcome to React and react-i18next',\n },\n },\n },\n lng: 'en',\n fallbackLng: 'en',\n returnNull: false,\n\n interpolation: {\n escapeValue: false,\n },\n\n react: {\n useSuspense: process.env.NODE_ENV == 'production',\n },\n })\n}\n\nconst SITE_TRANSLATION = gql`\n query siteTranslation {\n myUserPreferences {\n id\n language\n }\n }\n`\n\nexport const loadTranslations = () => {\n const [loadLang, { data }] = useLazyQuery(SITE_TRANSLATION)\n\n useEffect(() => {\n if (authToken()) {\n loadLang()\n }\n }, [authToken()])\n\n useEffect(() => {\n const language = data?.myUserPreferences.language\n if (isNil(language)) {\n i18n.changeLanguage('en')\n return\n }\n\n switch (language) {\n case LanguageTranslation.Danish:\n import('./extractedTranslations/da/translation.json').then(danish => {\n i18n.addResourceBundle('da', 'translation', danish)\n i18n.changeLanguage('da')\n })\n return\n case LanguageTranslation.English:\n import('./extractedTranslations/en/translation.json').then(english => {\n i18n.addResourceBundle('en', 'translation', english)\n i18n.changeLanguage('en')\n })\n return\n case LanguageTranslation.French:\n import('./extractedTranslations/fr/translation.json').then(english => {\n i18n.addResourceBundle('fr', 'translation', english)\n i18n.changeLanguage('fr')\n })\n return\n case LanguageTranslation.Swedish:\n import('./extractedTranslations/sv/translation.json').then(swedish => {\n i18n.addResourceBundle('sv', 'translation', swedish)\n i18n.changeLanguage('sv')\n })\n return\n case LanguageTranslation.Italian:\n import('./extractedTranslations/it/translation.json').then(italian => {\n i18n.addResourceBundle('it', 'translation', italian)\n i18n.changeLanguage('it')\n })\n return\n case LanguageTranslation.Spanish:\n import('./extractedTranslations/es/translation.json').then(spanish => {\n i18n.addResourceBundle('es', 'translation', spanish)\n i18n.changeLanguage('es')\n })\n return\n case LanguageTranslation.Polish:\n import('./extractedTranslations/pl/translation.json').then(polish => {\n i18n.addResourceBundle('pl', 'translation', polish)\n i18n.changeLanguage('pl')\n })\n return\n case LanguageTranslation.German:\n import('./extractedTranslations/de/translation.json').then(german => {\n i18n.addResourceBundle('de', 'translation', german)\n i18n.changeLanguage('de')\n })\n return\n case LanguageTranslation.Russian:\n import('./extractedTranslations/ru/translation.json').then(russian => {\n i18n.addResourceBundle('ru', 'translation', russian)\n i18n.changeLanguage('ru')\n })\n return\n case LanguageTranslation.TraditionalChinese:\n import('./extractedTranslations/zh-HK/translation.json').then(\n traditionalChinese => {\n i18n.addResourceBundle('zh-HK', 'translation', traditionalChinese)\n i18n.changeLanguage('zh-HK')\n }\n )\n return\n case LanguageTranslation.SimplifiedChinese:\n import('./extractedTranslations/zh-CN/translation.json').then(\n traditionalChinese => {\n i18n.addResourceBundle('zh-CN', 'translation', traditionalChinese)\n i18n.changeLanguage('zh-CN')\n }\n )\n return\n case LanguageTranslation.Portuguese:\n import('./extractedTranslations/pt/translation.json').then(\n traditionalChinese => {\n i18n.addResourceBundle('pt', 'translation', traditionalChinese)\n i18n.changeLanguage('pt')\n }\n )\n return\n }\n\n exhaustiveCheck(language)\n }, [data?.myUserPreferences.language])\n}\n","import React, { useEffect } from 'react'\nimport { Helmet } from 'react-helmet'\nimport Routes from './components/routes/Routes'\nimport Messages from './components/messages/Messages'\nimport { useTranslation } from 'react-i18next'\nimport { loadTranslations } from './localization'\nimport { useLocation } from 'react-router'\n\nconst App = () => {\n const { t } = useTranslation()\n const { pathname } = useLocation()\n\n loadTranslations()\n\n useEffect(() => {\n window.scrollTo(0, 0)\n if (document.activeElement != document.body)\n (document.activeElement as HTMLInputElement).blur()\n }, [pathname])\n\n return (\n <>\n \n \n \n \n \n \n )\n}\n\nexport default App\n","import {\n InMemoryCache,\n ApolloClient,\n split,\n ApolloLink,\n HttpLink,\n ServerError,\n FieldMergeFunction,\n} from '@apollo/client'\nimport { getMainDefinition } from '@apollo/client/utilities'\nimport { onError } from '@apollo/client/link/error'\nimport { WebSocketLink } from '@apollo/client/link/ws'\n\nimport urlJoin from 'url-join'\nimport { clearTokenCookie } from './helpers/authentication'\nimport { MessageState } from './components/messages/Messages'\nimport { Message } from './components/messages/SubscriptionsHook'\nimport { NotificationType } from './__generated__/globalTypes'\n\nexport const GRAPHQL_ENDPOINT = process.env.REACT_APP_API_ENDPOINT\n ? urlJoin(process.env.REACT_APP_API_ENDPOINT as string, '/graphql')\n : urlJoin(location.origin, '/api/graphql')\n\nconst httpLink = new HttpLink({\n uri: GRAPHQL_ENDPOINT,\n credentials: 'include',\n})\n\nconsole.log('GRAPHQL ENDPOINT', GRAPHQL_ENDPOINT)\n\nconst apiProtocol = new URL(GRAPHQL_ENDPOINT).protocol\n\nconst websocketUri = new URL(GRAPHQL_ENDPOINT)\nwebsocketUri.protocol = apiProtocol === 'https:' ? 'wss:' : 'ws:'\n\nconst wsLink = new WebSocketLink({\n uri: websocketUri.toString(),\n // credentials: 'include',\n})\n\nconst link = split(\n // split based on operation type\n ({ query }) => {\n const definition = getMainDefinition(query)\n return (\n definition.kind === 'OperationDefinition' &&\n definition.operation === 'subscription'\n )\n },\n wsLink,\n httpLink\n)\n\nconst linkError = onError(({ graphQLErrors, networkError }) => {\n const errorMessages = []\n\n if (graphQLErrors) {\n graphQLErrors.map(({ message, locations, path }) =>\n console.log(\n `[GraphQL error]: Message: ${message}, Location: ${JSON.stringify(\n locations\n )} Path: ${path}`\n )\n )\n\n if (graphQLErrors.length == 1) {\n errorMessages.push({\n header: 'Something went wrong',\n content: `Server error: ${graphQLErrors[0].message} at (${graphQLErrors[0].path})`,\n })\n } else if (graphQLErrors.length > 1) {\n errorMessages.push({\n header: 'Multiple things went wrong',\n content: `Received ${graphQLErrors.length} errors from the server. See the console for more information`,\n })\n }\n\n if (graphQLErrors.find(x => x.message == 'unauthorized')) {\n console.log('Unauthorized, clearing token cookie')\n clearTokenCookie()\n // location.reload()\n }\n }\n\n if (networkError) {\n console.log(`[Network error]: ${JSON.stringify(networkError)}`)\n clearTokenCookie()\n\n const errors = (networkError as ServerError)?.result.errors || []\n\n if (errors.length == 1) {\n errorMessages.push({\n header: 'Server error',\n content: `You are being logged out in an attempt to recover.\\n${errors[0].message}`,\n })\n } else if (errors.length > 1) {\n errorMessages.push({\n header: 'Multiple server errors',\n content: `Received ${\n graphQLErrors?.length || 0\n } errors from the server. You are being logged out in an attempt to recover.`,\n })\n }\n }\n\n if (errorMessages.length > 0) {\n const newMessages: Message[] = errorMessages.map(msg => ({\n key: Math.random().toString(26),\n type: NotificationType.Message,\n props: {\n negative: true,\n ...msg,\n },\n }))\n MessageState.set((messages: Message[]) => [...messages, ...newMessages])\n }\n})\n\ntype PaginateCacheType = {\n keyArgs: string[]\n merge: FieldMergeFunction\n}\n\n// Modified version of Apollo's offsetLimitPagination()\nconst paginateCache = (keyArgs: string[]) =>\n ({\n keyArgs,\n merge(existing, incoming, { args, fieldName }) {\n const merged = existing ? existing.slice(0) : []\n if (args?.paginate) {\n const { offset = 0 } = args.paginate\n for (let i = 0; i < incoming.length; ++i) {\n merged[offset + i] = incoming[i]\n }\n } else {\n throw new Error(`Paginate argument is missing for query: ${fieldName}`)\n }\n return merged\n },\n } as PaginateCacheType)\n\nconst memoryCache = new InMemoryCache({\n typePolicies: {\n // There only exists one global instance of SiteInfo,\n // therefore it can always be merged\n SiteInfo: {\n merge: true,\n },\n MediaURL: {\n keyFields: ['url'],\n },\n Album: {\n fields: {\n media: paginateCache(['onlyFavorites', 'order']),\n },\n },\n FaceGroup: {\n fields: {\n imageFaces: paginateCache([]),\n },\n },\n Query: {\n fields: {\n myTimeline: paginateCache(['onlyFavorites']),\n myFaceGroups: paginateCache([]),\n },\n },\n },\n})\n\nconst client = new ApolloClient({\n // link: ApolloLink.from([linkError, authLink.concat(link)]),\n link: ApolloLink.from([linkError, link]),\n cache: memoryCache,\n})\n\nexport default client\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://cra.link/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(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n)\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void\n onUpdate?: (registration: ServiceWorkerRegistration) => void\n}\n\nexport function register(config?: 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 worker.' +\n 'worker. To learn more, visit https://cra.link/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: string, config?: 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://cra.link/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: string, config?: 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 (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\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(\n 'No internet connection found. App is running in offline mode.'\n )\n })\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister()\n })\n .catch(error => {\n console.error(error.message)\n })\n }\n}\n","import 'regenerator-runtime/runtime'\n\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport App from './App'\nimport client from './apolloClient'\nimport { ApolloProvider } from '@apollo/client'\nimport { BrowserRouter as Router } from 'react-router-dom'\nimport { setupLocalization } from './localization'\nimport * as serviceWorkerRegistration from './serviceWorkerRegistration'\n\nimport './index.css'\nimport { SidebarProvider } from './components/sidebar/Sidebar'\n\nsetupLocalization()\n\nconst Main = () => (\n \n \n \n \n \n \n \n)\n\nReactDOM.render(
, document.getElementById('root'))\n\nserviceWorkerRegistration.register()\n","/* tslint:disable */\n/* eslint-disable */\n// @generated\n// This file was automatically generated and should not be edited.\n\n//==============================================================\n// START Enums and Input Objects\n//==============================================================\n\nexport enum LanguageTranslation {\n Danish = 'Danish',\n English = 'English',\n French = 'French',\n German = 'German',\n Italian = 'Italian',\n Polish = 'Polish',\n Russian = 'Russian',\n Spanish = 'Spanish',\n Swedish = 'Swedish',\n TraditionalChinese = 'TraditionalChinese',\n SimplifiedChinese = 'SimplifiedChinese',\n Portuguese = 'Portuguese',\n}\n\nexport enum MediaType {\n Photo = 'Photo',\n Video = 'Video',\n}\n\nexport enum NotificationType {\n Close = 'Close',\n Message = 'Message',\n Progress = 'Progress',\n}\n\nexport enum OrderDirection {\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\n//==============================================================\n// END Enums and Input Objects\n//==============================================================\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface DebouncedFn any> {\n (...args: Parameters): void\n cancel(): void\n}\n\nexport function debounce any>(\n func: T,\n wait: number,\n triggerRising?: boolean\n): DebouncedFn {\n let timeout: number | undefined = undefined\n\n const debounced = (...args: Parameters) => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = undefined\n } else if (triggerRising) {\n func(...args)\n }\n\n timeout = window.setTimeout(() => {\n timeout = undefined\n func(...args)\n }, wait)\n }\n\n debounced.cancel = () => {\n clearTimeout(timeout)\n timeout = undefined\n }\n\n return debounced\n}\n\nexport function isNil(value: any): value is undefined | null {\n return value === undefined || value === null\n}\n\nexport function exhaustiveCheck(value: never) {\n throw new Error(`Exhaustive check failed with value: ${value}`)\n}\n","import React, { createContext, useContext, useEffect, useState } from 'react'\n\nexport type UpdateSidebarFn = (content: React.ReactNode) => void\nexport type SidebarPinnedFn = (pin: boolean) => void\n\ninterface SidebarContextType {\n updateSidebar: UpdateSidebarFn\n setPinned: SidebarPinnedFn\n content: React.ReactNode\n pinned: boolean\n}\n\nexport const SidebarContext = createContext({\n updateSidebar: content => {\n console.warn(\n 'SidebarContext: updateSidebar was called before initialized',\n content\n )\n },\n setPinned: content => {\n console.warn(\n 'SidebarContext: setPinned was called before initialized',\n content\n )\n },\n content: null,\n pinned: false,\n})\nSidebarContext.displayName = 'SidebarContext'\n\ntype SidebarProviderProps = {\n children: React.ReactChild | React.ReactChild[]\n}\n\nexport const SidebarProvider = ({ children }: SidebarProviderProps) => {\n const [state, setState] = useState<{\n content: React.ReactNode | null\n pinned: boolean\n }>({\n content: null,\n pinned: false,\n })\n\n const updateSidebar = (content: React.ReactNode | null) => {\n if (content) {\n setState(state => ({ ...state, content }))\n } else {\n setState(state => ({ ...state, content: null, pinned: false }))\n }\n }\n\n const setPinned = (pinned: boolean) => {\n setState(state => ({ ...state, pinned }))\n }\n\n return (\n \n {children}\n \n )\n}\n\nexport const Sidebar = () => {\n const { content, pinned } = useContext(SidebarContext)\n\n useEffect(() => {\n const body = document.body\n\n if (content == null) {\n body.classList.remove('overflow-y-hidden')\n body.classList.remove('lg:overflow-y-auto')\n } else {\n body.classList.add('overflow-y-hidden')\n body.classList.add('lg:overflow-y-auto')\n }\n\n return () => {\n body.classList.remove('overflow-y-hidden')\n body.classList.remove('lg:overflow-y-auto')\n }\n })\n\n return (\n \n {content}\n
\n \n )\n}\n","import React, { useState, useRef, useEffect } from 'react'\nimport styled from 'styled-components'\nimport { useLazyQuery, gql } from '@apollo/client'\nimport { debounce, DebouncedFn } from '../../helpers/utils'\nimport { ProtectedImage } from '../photoGallery/ProtectedMedia'\nimport { NavLink, useHistory, useRouteMatch } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport {\n searchQuery,\n searchQuery_search_albums,\n searchQuery_search_media,\n} from './__generated__/searchQuery'\nimport classNames from 'classnames'\n\nconst SEARCH_QUERY = gql`\n query searchQuery($query: String!) {\n search(query: $query) {\n query\n albums {\n id\n title\n thumbnail {\n thumbnail {\n url\n }\n }\n }\n media {\n id\n title\n thumbnail {\n url\n }\n album {\n id\n }\n }\n }\n }\n`\n\nconst SearchWrapper = styled.div.attrs({\n className: 'w-full max-w-xs lg:relative',\n})``\n\nconst SearchBar = () => {\n const { t } = useTranslation()\n const [fetchSearches, fetchResult] = useLazyQuery(SEARCH_QUERY)\n const [query, setQuery] = useState('')\n const [fetched, setFetched] = useState(false)\n const [expanded, setExpanded] = useState(false)\n const inputEl = useRef(null)\n\n type QueryFn = (query: string) => void\n\n const debouncedFetch = useRef>(null)\n useEffect(() => {\n debouncedFetch.current = debounce(query => {\n fetchSearches({ variables: { query } })\n setFetched(true)\n setExpanded(true)\n }, 250)\n\n return () => {\n debouncedFetch.current?.cancel()\n }\n }, [])\n\n const fetchEvent = (e: React.ChangeEvent) => {\n e.persist()\n\n setQuery(e.target.value)\n if (e.target.value.trim() != '' && debouncedFetch.current) {\n debouncedFetch.current(e.target.value.trim())\n } else {\n setFetched(false)\n }\n }\n\n const routerMatch = useRouteMatch()\n useEffect(() => {\n setExpanded(false)\n setQuery('')\n }, [routerMatch])\n\n const [selectedItem, setSelectedItem] = useState(null)\n\n const searchData = fetchResult.data\n let media = searchData?.search.media || []\n let albums = searchData?.search.albums || []\n\n albums = albums.slice(0, 5)\n media = media.slice(0, 5)\n\n const selectedItemId =\n selectedItem !== null\n ? [...albums.map(x => x.id), ...media.map(x => x.id)][selectedItem]\n : null\n\n useEffect(() => {\n const elem = inputEl.current\n if (!elem) return\n\n const focusEvent = () => {\n setExpanded(true)\n }\n\n const blurEvent = () => {\n setExpanded(false)\n }\n\n elem.addEventListener('focus', focusEvent)\n elem.addEventListener('blur', blurEvent)\n\n return () => {\n elem.removeEventListener('focus', focusEvent)\n elem.removeEventListener('blur', blurEvent)\n }\n }, [inputEl])\n\n useEffect(() => {\n setSelectedItem(null)\n }, [searchData])\n\n useEffect(() => {\n const totalItems = albums.length + media.length\n\n const keydownEvent = (event: KeyboardEvent) => {\n if (!expanded) return\n\n if (event.key == 'ArrowDown') {\n event.preventDefault()\n setSelectedItem(i => (i === null ? 0 : Math.min(totalItems - 1, i + 1)))\n } else if (event.key == 'ArrowUp') {\n event.preventDefault()\n setSelectedItem(i => (i === null ? 0 : Math.max(0, i - 1)))\n } else if (event.key == 'Escape') {\n // setExpanded(false)\n inputEl.current?.blur()\n }\n }\n\n document.addEventListener('keydown', keydownEvent)\n\n return () => {\n document.removeEventListener('keydown', keydownEvent)\n }\n }, [searchData])\n\n let results = null\n if (query.trim().length > 0 && fetched) {\n results = (\n \n )\n }\n\n return (\n \n \n {results}\n \n )\n}\n\nconst ResultTitle = styled.h1.attrs({\n className: 'uppercase text-gray-700 text-sm font-semibold mt-4 mb-2 mx-1',\n})``\n\ntype SearchResultsProps = {\n albums: searchQuery_search_albums[]\n media: searchQuery_search_media[]\n loading: boolean\n selectedItem: number | null\n setSelectedItem: React.Dispatch>\n query: string\n expanded: boolean\n}\n\nconst SearchResults = ({\n albums,\n media,\n loading,\n selectedItem,\n setSelectedItem,\n query,\n expanded,\n}: SearchResultsProps) => {\n const { t } = useTranslation()\n\n const albumElements = albums.map((album, i) => (\n setSelectedItem(i)}\n />\n ))\n\n const mediaElements = media.map((media, i) => (\n setSelectedItem(i + albumElements.length)}\n />\n ))\n\n let message = null\n if (loading) message = t('header.search.loading', 'Loading results...')\n else if (media.length == 0 && albums.length == 0)\n message = t('header.search.no_results', 'No results found')\n\n if (message) message =
{message}
\n\n return (\n {\n // Prevent input blur event\n e.preventDefault()\n }}\n >\n {message}\n {albumElements.length > 0 && (\n <>\n \n {t('header.search.result_type.albums', 'Albums')}\n \n
    {albumElements}
\n \n )}\n {mediaElements.length > 0 && (\n <>\n \n {t('header.search.result_type.media', 'Media')}\n \n
    {mediaElements}
\n \n )}\n \n )\n}\n\ntype SearchRowProps = {\n id: string\n link: string\n preview: React.ReactNode\n label: React.ReactNode\n selected: boolean\n setSelected(): void\n}\n\nconst SearchRow = ({\n id,\n link,\n preview,\n label,\n selected,\n setSelected,\n}: SearchRowProps) => {\n const rowEl = useRef(null)\n const history = useHistory()\n\n useEffect(() => {\n const keydownEvent = (event: KeyboardEvent) => {\n if (event.key == 'Enter') {\n history.push(link)\n }\n }\n\n document.addEventListener('keydown', keydownEvent)\n\n return () => {\n document.removeEventListener('keydown', keydownEvent)\n }\n })\n\n if (selected) {\n rowEl.current?.scrollIntoView({\n block: 'nearest',\n })\n }\n\n return (\n setSelected()}\n className={classNames('rounded p-1 mt-1', {\n 'bg-gray-100': selected,\n })}\n >\n \n {preview}\n {label}\n \n \n )\n}\n\ntype PhotoRowArgs = {\n query: string\n media: searchQuery_search_media\n selected: boolean\n setSelected(): void\n}\n\nconst PhotoRow = ({ query, media, selected, setSelected }: PhotoRowArgs) => (\n \n }\n label={searchHighlighted(query, media.title)}\n selected={selected}\n setSelected={setSelected}\n />\n)\n\ntype AlbumRowArgs = {\n query: string\n album: searchQuery_search_albums\n selected: boolean\n setSelected(): void\n}\n\nconst AlbumRow = ({ query, album, selected, setSelected }: AlbumRowArgs) => (\n \n }\n label={searchHighlighted(query, album.title)}\n selected={selected}\n setSelected={setSelected}\n />\n)\n\nconst searchHighlighted = (query: string, text: string) => {\n const i = text.toLowerCase().indexOf(query.toLowerCase())\n\n if (i == -1) {\n return text\n }\n\n const start = text.substring(0, i)\n const middle = text.substring(i, i + query.length)\n const end = text.substring(i + query.length)\n\n return (\n \n {start}\n {middle}\n {end}\n \n )\n}\n\nexport default SearchBar\n","import React, { useContext } from 'react'\nimport SearchBar from './Searchbar'\n\nimport { authToken } from '../../helpers/authentication'\nimport { SidebarContext } from '../sidebar/Sidebar'\nimport classNames from 'classnames'\n\nconst Header = () => {\n const { pinned } = useContext(SidebarContext)\n\n return (\n \n

\n \n \n Photoview\n \n

\n {authToken() ? : null}\n \n )\n}\n\nexport default Header\n","import React from 'react'\nimport { NavLink } from 'react-router-dom'\nimport { useQuery, gql } from '@apollo/client'\nimport { authToken } from '../../helpers/authentication'\nimport { useTranslation } from 'react-i18next'\nimport { mapboxEnabledQuery } from '../../__generated__/mapboxEnabledQuery'\n\nexport const MAPBOX_QUERY = gql`\n query mapboxEnabledQuery {\n mapboxToken\n }\n`\n\nexport const FACE_DETECTION_ENABLED_QUERY = gql`\n query faceDetectionEnabled {\n siteInfo {\n faceDetectionEnabled\n }\n }\n`\n\ntype MenuButtonProps = {\n to: string\n exact: boolean\n label: string\n background: string\n activeClasses?: string\n className?: string\n icon?: React.ReactChild\n}\n\nconst MenuButton = ({\n to,\n exact,\n label,\n background,\n icon,\n activeClasses,\n className,\n}: MenuButtonProps) => {\n return (\n \n
  • \n \n {icon}\n \n {label}\n
  • \n \n )\n}\n\nconst MenuSeparator = () => (\n
    \n)\n\nexport const MainMenu = () => {\n const { t } = useTranslation()\n\n const mapboxQuery = authToken()\n ? useQuery(MAPBOX_QUERY)\n : null\n const faceDetectionEnabledQuery = authToken()\n ? useQuery(FACE_DETECTION_ENABLED_QUERY)\n : null\n\n const mapboxEnabled = !!mapboxQuery?.data?.mapboxToken\n const faceDetectionEnabled =\n !!faceDetectionEnabledQuery?.data?.siteInfo?.faceDetectionEnabled\n\n return (\n
    \n
      \n \n \n \n }\n />\n \n \n \n }\n />\n {mapboxEnabled ? (\n \n \n \n }\n />\n ) : null}\n {faceDetectionEnabled ? (\n \n \n \n }\n />\n ) : null}\n \n \n \n \n }\n />\n
    \n
    \n )\n}\n\nexport default MainMenu\n","import { gql } from '@apollo/client'\nimport PropTypes from 'prop-types'\nimport React, { useContext } from 'react'\nimport { Helmet } from 'react-helmet'\nimport Header from '../header/Header'\nimport { Authorized } from '../routes/AuthorizedRoute'\nimport { Sidebar, SidebarContext } from '../sidebar/Sidebar'\nimport MainMenu from './MainMenu'\n\nexport const ADMIN_QUERY = gql`\n query adminQuery {\n myUser {\n admin\n }\n }\n`\n\ntype LayoutProps = {\n children: React.ReactNode\n title: string\n}\n\nconst Layout = ({ children, title, ...otherProps }: LayoutProps) => {\n const { pinned, content: sidebarContent } = useContext(SidebarContext)\n\n return (\n <>\n \n {title ? `${title} - Photoview` : `Photoview`}\n \n
    \n
    \n
    \n \n \n \n \n {children}\n {/*
    */}\n
    \n
    \n \n \n \n )\n}\n\nLayout.propTypes = {\n children: PropTypes.any.isRequired,\n title: PropTypes.string,\n}\n\nexport default Layout\n","var _g;\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgDismissIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n viewBox: \"0 0 20 20\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n stroke: \"currentColor\",\n strokeWidth: 3.5,\n fill: \"none\",\n fillRule: \"evenodd\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"m1.515 1.515 16.97 16.97M18.485 1.515l-16.97 16.97\"\n }))));\n}\n\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgDismissIcon);\nexport default __webpack_public_path__ + \"static/media/dismissIcon.c74dc15c.svg\";\nexport { ForwardRef as ReactComponent };","import React from 'react'\nimport { forwardRef } from 'react'\nimport { ReactComponent as DismissIcon } from './icons/dismissIcon.svg'\n\nexport type MessageProps = {\n header: string\n content?: string\n children?: React.ReactNode\n onDismiss?(): void\n}\n\nconst Message = forwardRef(\n (\n { onDismiss, header, children, content }: MessageProps,\n ref: React.ForwardedRef\n ) => {\n return (\n \n \n

    {header}

    \n
    {content}
    \n {children}\n \n )\n }\n)\n\nexport default Message\n","import React, { forwardRef } from 'react'\nimport MessagePlain, { MessageProps } from './Message'\n\ntype MessageProgressProps = MessageProps & {\n percent?: number\n}\n\nconst MessageProgress = forwardRef(\n (\n { header, content, percent = 0, ...props }: MessageProgressProps,\n ref: React.ForwardedRef\n ) => {\n let color = '#dc2625'\n if (percent > 33) color = '#fbbf24'\n if (percent > 66) color = '#56e263'\n\n return (\n \n
    \n
    \n \n
    \n )\n }\n)\n\nexport default MessageProgress\n","import { notificationSubscription } from './__generated__/notificationSubscription'\nimport PropTypes from 'prop-types'\nimport { useEffect } from 'react'\nimport { useSubscription, gql } from '@apollo/client'\nimport { authToken } from '../../helpers/authentication'\nimport { NotificationType } from '../../__generated__/globalTypes'\n\nconst NOTIFICATION_SUBSCRIPTION = gql`\n subscription notificationSubscription {\n notification {\n key\n type\n header\n content\n progress\n positive\n negative\n timeout\n }\n }\n`\n\nconst messageTimeoutHandles = new Map()\n\nexport interface Message {\n key: string\n type: NotificationType\n timeout?: number\n onDismiss?: () => void\n props: {\n header: string\n content: string\n negative?: boolean\n positive?: boolean\n percent?: number\n }\n}\n\ntype SubscriptionHookProps = {\n messages: Message[]\n setMessages: React.Dispatch>\n}\n\nconst SubscriptionsHook = ({\n messages,\n setMessages,\n}: SubscriptionHookProps) => {\n if (!authToken()) {\n return null\n }\n\n const { data, error } = useSubscription(\n NOTIFICATION_SUBSCRIPTION\n )\n\n useEffect(() => {\n if (error) {\n setMessages(state => [\n ...state,\n {\n key: Math.random().toString(26),\n type: NotificationType.Message,\n props: {\n header: 'Network error',\n content: error.message,\n negative: true,\n },\n },\n ])\n }\n\n if (!data) return\n\n const newMessages = [...messages]\n\n const msg = data.notification\n\n if (msg.type == 'Close') {\n setMessages(messages => messages.filter(m => m.key != msg.key))\n return\n }\n\n const newNotification: Message = {\n key: msg.key,\n type: msg.type,\n timeout: msg.timeout || undefined,\n props: {\n header: msg.header,\n content: msg.content,\n negative: msg.negative,\n positive: msg.positive,\n percent: msg.progress || undefined,\n },\n }\n\n if (msg.timeout) {\n // Clear old timeout, to replace it with the new one\n if (messageTimeoutHandles.get(msg.key)) {\n const timeoutHandle = messageTimeoutHandles.get(msg.key)\n clearTimeout(timeoutHandle)\n }\n\n const timeoutHandle = setTimeout(() => {\n setMessages(messages => messages.filter(m => m.key != msg.key))\n }, msg.timeout)\n\n messageTimeoutHandles.set(msg.key, timeoutHandle)\n }\n\n const notifyIndex = newMessages.findIndex(\n msg => msg.key == newNotification.key\n )\n if (notifyIndex != -1) {\n newMessages[notifyIndex] = newNotification\n } else {\n newMessages.push(newNotification)\n }\n\n setMessages(newMessages)\n }, [data, error])\n\n return null\n}\n\nSubscriptionsHook.propTypes = {\n messages: PropTypes.array.isRequired,\n setMessages: PropTypes.func.isRequired,\n}\n\nexport default SubscriptionsHook\n","import React, { useState } from 'react'\nimport { animated, useTransition } from 'react-spring'\nimport styled from 'styled-components'\nimport { authToken } from '../../helpers/authentication'\nimport MessageProgress from './MessageProgress'\nimport MessagePlain from './Message'\nimport SubscriptionsHook, { Message } from './SubscriptionsHook'\nimport { NotificationType } from '../../__generated__/globalTypes'\n\nconst Container = styled.div`\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 500px;\n\n @media (max-width: 1000px) {\n display: none;\n }\n`\n\ntype MessageStateType = {\n set: React.Dispatch>\n get: Message[]\n add(message: Message): void\n removeKey(key: string): void\n}\n\nexport const MessageState: MessageStateType = {\n set: fn => {\n console.warn('set function is not defined yet, called with', fn)\n },\n get: [],\n add: message => {\n MessageState.set(messages => {\n const newMessages = messages.filter(msg => msg.key != message.key)\n newMessages.push(message)\n\n return newMessages\n })\n },\n removeKey: key => {\n MessageState.set(messages => {\n const newMessages = messages.filter(msg => msg.key != key)\n return newMessages\n })\n },\n}\n\nconst Messages = () => {\n const [messages, setMessages] = useState([])\n MessageState.set = setMessages\n MessageState.get = messages\n\n const getMessageElement = (message: Message): React.FunctionComponent => {\n const dismissMessage = (message: Message) => {\n message.onDismiss && message.onDismiss()\n setMessages(messages => messages.filter(msg => msg.key != message.key))\n }\n\n switch (message.type) {\n case NotificationType.Message:\n return props => (\n {\n dismissMessage(message)\n }}\n {...message.props}\n {...props}\n />\n )\n case NotificationType.Progress:\n return props => (\n {\n dismissMessage(message)\n }}\n {...message.props}\n {...props}\n />\n )\n default:\n throw new Error(`Invalid message type: ${message.type}`)\n }\n }\n\n const transitions = useTransition(messages.slice().reverse(), x => x.key, {\n from: {\n opacity: 0,\n height: '0px',\n },\n enter: {\n opacity: 1,\n height: `100px`,\n },\n leave: { opacity: 0, height: '0px' },\n })\n\n return (\n \n {transitions.map(({ item, props: style, key }) => {\n const MessageElement = getMessageElement(item)\n\n return (\n \n \n \n )\n })}\n {authToken() && (\n \n )}\n \n )\n}\n\nexport default Messages\n","import classNames from 'classnames'\nimport React, { DetailedHTMLProps, ImgHTMLAttributes } from 'react'\nimport { useRef } from 'react'\nimport { useState } from 'react'\nimport { useEffect } from 'react'\nimport { isNil } from '../../helpers/utils'\n\nconst isNativeLazyLoadSupported = 'loading' in document.createElement('img')\nconst placeholder =\n 'data:image/gif;base64,R0lGODlhAQABAPAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='\n\nconst getProtectedUrl = (url?: string) => {\n if (url == undefined) return undefined\n\n const imgUrl = new URL(url, location.origin)\n\n const tokenRegex = location.pathname.match(/^\\/share\\/([\\d\\w]+)(\\/?.*)$/)\n if (tokenRegex) {\n const token = tokenRegex[1]\n imgUrl.searchParams.set('token', token)\n }\n\n return imgUrl.href\n}\n\nexport interface ProtectedImageProps\n extends Omit<\n DetailedHTMLProps, HTMLImageElement>,\n 'src'\n > {\n src?: string\n key?: string\n lazyLoading?: boolean\n}\n\n/**\n * An image that needs authorization to load\n * Set lazyLoading to true if you want the image to be loaded once it enters the viewport\n * Native lazy load via HTMLImageElement.loading attribute will be preferred if it is supported by the browser,\n * otherwise IntersectionObserver will be used.\n */\nexport const ProtectedImage = ({\n src,\n lazyLoading,\n ...props\n}: ProtectedImageProps) => {\n const url = getProtectedUrl(src) || placeholder\n\n if (!lazyLoading) {\n return (\n \n )\n }\n\n if (!isNativeLazyLoadSupported) {\n return \n }\n\n // load with native lazy loading\n return (\n \n )\n}\n\ninterface FallbackLazyloadedImageProps\n extends Omit<\n DetailedHTMLProps, HTMLImageElement>,\n 'src'\n > {\n src?: string\n}\n\nconst FallbackLazyloadedImage = ({\n src,\n ...props\n}: FallbackLazyloadedImageProps) => {\n const [inView, setInView] = useState(false)\n const imgRef = useRef(null)\n\n useEffect(() => {\n const imgElm = imgRef.current\n if (isNil(imgElm) || inView) return\n\n if (window.IntersectionObserver === undefined) {\n setInView(true)\n return\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setInView(true)\n observer.disconnect()\n }\n },\n {\n root: null,\n threshold: 0,\n }\n )\n\n observer.observe(imgElm)\n\n return () => {\n observer.disconnect()\n }\n }, [imgRef])\n\n if (inView) {\n return \n } else {\n return (\n \n )\n }\n}\n\nexport interface ProtectedVideoProps_Media {\n __typename: 'Media'\n id: string\n thumbnail?: null | {\n __typename: 'MediaURL'\n url: string\n }\n videoWeb?: null | {\n __typename: 'MediaURL'\n url: string\n }\n}\n\nexport interface ProtectedVideoProps {\n media: ProtectedVideoProps_Media\n}\n\nexport const ProtectedVideo = ({ media, ...props }: ProtectedVideoProps) => {\n if (isNil(media.videoWeb)) {\n console.error('ProetctedVideo called with media.videoWeb = null')\n return null\n }\n\n return (\n \n \n \n )\n}\n","import React, { CSSProperties } from 'react'\n\ntype LoaderProps = {\n active: boolean\n message?: string\n size?: 'small' | 'default'\n className?: string\n style?: CSSProperties\n}\n\nconst Loader = ({ active, message, className, style }: LoaderProps) => {\n if (!active) return null\n return (\n
    \n {message ?? 'Loading...'}\n
    \n )\n}\n\nexport default Loader\n","import React, { ReactChild, useEffect } from 'react'\nimport PropTypes, { ReactComponentLike } from 'prop-types'\nimport { Route, Redirect, RouteProps } from 'react-router-dom'\nimport { useLazyQuery } from '@apollo/client'\nimport { authToken } from '../../helpers/authentication'\nimport { ADMIN_QUERY } from '../layout/Layout'\n\nexport const useIsAdmin = (enabled = true) => {\n const [fetchAdminQuery, { data, called }] = useLazyQuery(ADMIN_QUERY)\n\n useEffect(() => {\n if (authToken() && !called && enabled) {\n fetchAdminQuery()\n }\n }, [authToken(), enabled])\n\n if (!authToken()) {\n return false\n }\n\n return data?.myUser?.admin\n}\n\nexport const Authorized = ({ children }: { children: JSX.Element }) => {\n const token = authToken()\n\n return token ? children : null\n}\n\ninterface AuthorizedRouteProps extends Omit {\n component: ReactComponentLike\n admin?: boolean\n}\n\nconst AuthorizedRoute = ({\n component: Component,\n admin = false,\n ...props\n}: AuthorizedRouteProps) => {\n const token = authToken()\n const isAdmin = useIsAdmin(admin)\n\n let unauthorizedRedirect: null | ReactChild = null\n if (!token) {\n unauthorizedRedirect = \n }\n\n let adminRedirect: null | ReactChild = null\n if (token && admin) {\n if (isAdmin === false) {\n adminRedirect = \n }\n }\n\n return (\n (\n <>\n {unauthorizedRedirect}\n {adminRedirect}\n \n \n )}\n />\n )\n}\n\nAuthorizedRoute.propTypes = {\n component: PropTypes.elementType.isRequired,\n admin: PropTypes.bool,\n}\n\nexport default AuthorizedRoute\n"],"sourceRoot":""}