{"version":3,"sources":["Assets/buttonPlus.svg","Assets/buttonMinus.svg","Assets/buttonReset.svg","Assets/createdBY.svg","Assets/imagesCourtesy.svg","Pages/Layout.tsx","Shoothill.Core/Utils/App/GoogleAnalyticsUtils.ts","Shoothill.Core/Utils/App/WithGATracker.tsx","Errors/HttpError.ts","Errors/RequestError.ts","Shoothill.Core/Utils/Utils.ts","Shoothill.Core/Utils/React/ElementId.ts","Shoothill.Core/Utils/Hooks/UseReactRouter.ts","Shoothill.Core/Utils/Hooks/UseDataApi.ts","Pages/User.tsx","Components/OpenSeadragonReact.tsx","Pages/Home.tsx","AppRoutes.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["module","exports","__webpack_require__","p","Layout","props","react_default","a","createElement","Fragment","Box","style","backgroundColor","children","GoogleAnalytics","initialize","trackingId","set","anonymizeIp","sendEvent","args","event","withTracker","WrappedComponent","options","arguments","length","undefined","trackPage","page","fieldsObject","trackerNames","path","Object","objectSpread","pageview","HOC","_Component","classCallCheck","this","possibleConstructorReturn","getPrototypeOf","apply","inherits","createClass","key","value","location","pathname","nextProps","currentPage","nextPage","Component","category","action","wrapNativeSuper","Error","throttled","delay","fn","lastCall","now","Date","getTime","React","RequestType","dataFetchReducer","state","type","isLoading","hasLoaded","isError","data","payload","User","initialUrl","requestType","GET","initialPostData","_useState","useState","_useState2","slicedToArray","url","setUrl","_useState3","_useState4","postData","setPostData","_useReducer","useReducer","_useReducer2","dispatch","useEffect","didCancel","_ref","asyncToGenerator","regenerator_default","mark","_callee","headers","jwt","result","wrap","_context","prev","next","localStorage","getItem","Authorization","concat","POST","axios","post","sent","t0","stop","fetchData","doRequest","preventDefault","useDataApi","className","border","overflow","height","width","display","allowFullScreen","src","OpenSeaDragonReact","_React$Component","_this","call","el","elements","viewer","GetViewer","repositionElements","es","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","done","e","repositionElement","err","return","newRect","viewport","viewportToViewerElementRectangle","imageToViewportRectangle","rect","point","getFlip","flipPoint","x","y","getRotation","world","getItemAt","viewportToImageCoordinates","getCenter","pos","viewportToViewerElementCoordinates","imageToViewportCoordinates","element","left","top","fontSize","getZoom","getHomeZoom","angle","center","rotatedPoint","rotatePoint","Math","PI","subtractPoints","sin","cos","addPoints","p1","p2","addElement","wrapperDiv","document","position","appendChild","canvas","push","OpenSeadragon","Rect","getElementById","id","find","removeElementById","removeChild","splice","indexOf","removeElementsById","ids","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","withSlowOSDAnimation","f","factor","oldValues","centerSpringXAnimationTime","centerSpringX","animationTime","centerSpringYAnimationTime","centerSpringY","zoomSpringAnimationTime","zoomSpring","loadImage","Promise","resolve","reject","img","addEventListener","initSeaDragon","self","assertThisInitialized","_this$props","image","Viewer","prefixUrl","tileSources","alwaysBlend","immediateRender","visibilityRatio","zoomInButton","zoomOutButton","homeButton","showNavigator","navigatorAutoFade","navigatorPosition","blendTime","preload","pixelsPerWheelLine","zoomPerScroll","gestureSettingsMouse","clickToZoom","dblClickToZoom","_i","_arr","h","addHandler","target","onOpen","quick","viewportPoint","pointFromPixel","zoomHandler","Utils","onZoom","eventSource","mouseMoveHandler","onMouseMove","MouseTracker","moveHandler","setTracking","navigator","_this2","ref","node","nextState","defaultProps","makeStyles","theme","root","flexGrow","button","margin","spacing","input","paper","padding","textAlign","color","palette","text","secondary","styled","Paper","_templateObject","_templateObject2","_templateObject3","Grid","_templateObject4","apollo11","ButtonGroup","_templateObject5","ImgButton","_templateObject6","OneSmallStep","_templateObject7","OneSmallStepBold","span","_templateObject8","LogoBox","_templateObject9","Attribution","_templateObject10","NetworkShares","_templateObject11","FBShare","memo","shareUrl","title","FacebookShareButton","quote","onShareWindowClose","FacebookIcon","size","round","TwitterShareButton","TwitterIcon","WhatsappShareButton","separator","WhatsappIcon","LinkedinShareButton","windowWidth","windowHeight","LinkedinIcon","HomeContainer","WithTracker","openSeaDragonRef","useRef","getViewer","current","mouseEvent","abrupt","get","vp","logicalRect","w","console","log","fileName","cell","_x","maxWidth","paddingLeft","paddingTop","float","ZoomIn","ZoomOut","Reset","Typography","align","Logo","onClick","window","open","Nasa","iniFrame","OpenSeadragonReact_OpenSeaDragonReact","xy","fitBounds","setTimeout","goHome","zoomLevel","_oldZoom","opacity","AppRoutes","react_router","exact","component","defaultTheme","createMuiTheme","typography","fontFamily","h5","fontWeight","h6","subtitle1","lineHeight","letterSpacing","subtitle2","primary","main","contrastText","overrides","MuiLink","textDecoration","MuiTabs","indicator","MuiTab","marginLeft","textTransform","borderRadius","&:hover","@media (min-width: 960px)","minWidth","MuiButton","MuiListItemIcon","MuiOutlinedInput","notchedOutline","MuiInputLabel","outlined","App","StylesProvider","injectFirst","ThemeProvider","styled_components_browser_esm","CssBaseline","react_router_dom","Layout_Layout","AppRoutes_AppRoutes","Boolean","hostname","match","baseUrl","baseElements","getElementsByTagName","retVal","getAttribute","History","basename","isDev","process","Init","src_App","ReactDOM","render","src_Init","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.11a467aa.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/buttonPlus.b1cec805.svg\";","module.exports = __webpack_public_path__ + \"static/media/buttonMinus.76b21b41.svg\";","module.exports = __webpack_public_path__ + \"static/media/buttonReset.21462def.svg\";","module.exports = __webpack_public_path__ + \"static/media/createdBY.d0998141.svg\";","module.exports = __webpack_public_path__ + \"static/media/imagesCourtesy.04d857c1.svg\";","import React from \"react\";\r\nimport { Header } from \"../Shoothill.Components/General\";\r\nimport { Container, Box } from \"@material-ui/core\";\r\n\r\n//EN: use empty generic type to get default react props\r\nexport const Layout: React.FC<{}> = props => {\r\n\treturn (\r\n\t\t\r\n\t\t\t{/*
\r\n\t\t\t
*/}\r\n\t\t\t{props.children}\r\n\t\t\r\n\t);\r\n};\r\n","import GoogleAnalytics, { EventArgs, FieldsObject, TrackerNames } from \"react-ga\";\r\n\r\n//export { EventArgs, FieldsObject, TrackerNames };\r\n\r\nGoogleAnalytics.initialize([\r\n\t{\r\n\t\ttrackingId: \"UA-1542809-15\" //UA-1852243-67\r\n\t\t// gaOptions: {\r\n\t\t// \tname: \"Apollo11\"\r\n\t\t// }\r\n\t}\r\n]);\r\n\r\nGoogleAnalytics.set({ anonymizeIp: true });\r\n\r\n///\r\n/// sendEvent\r\n///\r\n///https://developers.google.com/analytics/devguides/collection/analyticsjs/events\r\nexport const sendEvent = (args: EventArgs) => {\r\n\t//let eventArgs: EventArgs = {\r\n\t// category: category,\r\n\t// action: action,\r\n\t// label: label,\r\n\t// nonInteraction: nonInteraction,\r\n\t// transport: transport,\r\n\t// value: value\r\n\t//};\r\n\t//if (args != undefined && args.transport == undefined) {\r\n\t// `args.transport` must be either one of these values: `beacon`, `xhr` or `image`\r\n\t// args.transport = window.location.pathname;\r\n\t//}\r\n\r\n\tGoogleAnalytics.event(args);\r\n};\r\n\r\n///\r\n/// set\r\n///\r\nexport const set = (fieldsObject: FieldsObject, trackerNames?: TrackerNames) => {\r\n\tGoogleAnalytics.set({\r\n\t\tfieldsObject,\r\n\t\ttrackerNames\r\n\t});\r\n};\r\n\r\n///\r\n/// pageview\r\n///\r\nexport const pageview = (path: string, trackerNames?: TrackerNames, title?: string): void => {\r\n\tGoogleAnalytics.pageview(path);\r\n};\r\n","import React, { Component } from \"react\";\r\nimport * as GoogleAnalytics from \"./GoogleAnalyticsUtils\";\r\n\r\nexport const withTracker = (WrappedComponent: React.ComponentType, options = {}) => {\r\n\tconst trackPage = (page: string) => {\r\n\t\tGoogleAnalytics.set({\r\n\t\t\tpage,\r\n\t\t\t...options\r\n\t\t});\r\n\t\tGoogleAnalytics.pageview(page);\r\n\t};\r\n\r\n\tconst HOC = class extends Component {\r\n\t\tpublic componentDidMount() {\r\n\t\t\tconst page = this.props.location.pathname;\r\n\t\t\ttrackPage(page);\r\n\t\t}\r\n\r\n\t\tpublic componentWillReceiveProps(nextProps: any) {\r\n\t\t\tconst currentPage = this.props.location.pathname;\r\n\t\t\tconst nextPage = nextProps.location.pathname;\r\n\r\n\t\t\tif (currentPage !== nextPage) {\r\n\t\t\t\ttrackPage(nextPage);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic render() {\r\n\t\t\treturn ;\r\n\t\t}\r\n\t};\r\n\r\n\tGoogleAnalytics.sendEvent({ category: \"Startup\", action: \"App Started\" });\r\n\treturn HOC;\r\n};\r\n\r\nexport default withTracker;\r\n","// AJ: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status\r\nexport class HttpError extends Error {\r\n\tpublic readonly httpStatusCode: number;\r\n\r\n\tpublic constructor(httpStatusCode: number, message: string) {\r\n\t\t// AJ: https://stackoverflow.com/questions/47941324/inherited-exceptions-and-instanceof\r\n\t\tconst targetPrototype = new.target.prototype;\r\n\t\tsuper(message);\r\n\t\tObject.setPrototypeOf(this, targetPrototype);\r\n\r\n\t\tthis.httpStatusCode = httpStatusCode;\r\n\t}\r\n}\r\n","export class RequestError extends Error {\r\n public readonly errorMessages: string[];\r\n\r\n constructor(errorMessages: string[]) {\r\n //AJ: https://stackoverflow.com/questions/47941324/inherited-exceptions-and-instanceof\r\n const targetPrototype = new.target.prototype;\r\n super(\"The request had errors.\");\r\n Object.setPrototypeOf(this, targetPrototype);\r\n\r\n this.errorMessages = errorMessages;\r\n }\r\n}","function _isNil(value: any) {\r\n\treturn value == null;\r\n}\r\n\r\nexport const throttled = (delay: number, fn: any) => {\r\n\tlet lastCall = 0;\r\n\treturn function(...args: any) {\r\n\t\tconst now = new Date().getTime();\r\n\t\tif (now - lastCall < delay) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tlastCall = now;\r\n\t\treturn fn(...args);\r\n\t};\r\n};\r\n\r\nexport const generateID = function() {\r\n\t// Math.random should be unique because of its seeding algorithm.\r\n\t// Convert it to base 36 (numbers + letters), and grab the first 9 characters\r\n\t// after the decimal.\r\n\treturn (\r\n\t\t\"_\" +\r\n\t\tMath.random()\r\n\t\t\t.toString(36)\r\n\t\t\t.substr(2, 9)\r\n\t);\r\n};\r\n\r\nexport const sortByString = (a: string | undefined, b: string | undefined, options?: Intl.CollatorOptions) => {\r\n\tif (a === undefined && b === undefined) {\r\n\t\treturn 0;\r\n\t}\r\n\tif (a === undefined) {\r\n\t\treturn -1;\r\n\t}\r\n\tif (b === undefined) {\r\n\t\treturn 1;\r\n\t}\r\n\r\n\treturn a.localeCompare(b, undefined, options);\r\n};\r\n\r\nexport const coalesce = (...args: (TArg | undefined)[]) => {\r\n\tfor (const arg of args) {\r\n\t\tif (_isNil(arg) === false) {\r\n\t\t\treturn arg;\r\n\t\t}\r\n\t}\r\n\r\n\treturn null;\r\n};\r\nexport const getApiUrl = (): string => (window as any).apiurl;\r\n\r\nexport const getImageUrl = (imageUrl: string): string => {\r\n\treturn getApiUrl() + imageUrl;\r\n};\r\n\r\nexport const getBaseUrl = (): string | undefined => {\r\n\tconst baseElements = document.getElementsByTagName(\"base\");\r\n\r\n\tif (baseElements.length === 0) {\r\n\t\tthrow new Error(\"Base element not found\");\r\n\t}\r\n\r\n\tif (baseElements.length > 1) {\r\n\t\tthrow new Error(\"Multiple base elements found\");\r\n\t}\r\n\r\n\tconst baseElement = baseElements[0];\r\n\tconst baseUrl = baseElement.getAttribute(\"href\");\r\n\r\n\tif (baseUrl === undefined) {\r\n\t\tthrow new Error(\"Base element 'href' attribute not found.\");\r\n\t}\r\n\r\n\tlet retVal: string | undefined;\r\n\tif (baseUrl !== null) {\r\n\t\tretVal = baseUrl;\r\n\t}\r\n\treturn retVal;\r\n};\r\n\r\nexport const parseJwt = (token: string) => {\r\n\tconst base64Url = token.split(\".\")[1];\r\n\tconst base64 = decodeURIComponent(\r\n\t\tatob(base64Url)\r\n\t\t\t.split(\"\")\r\n\t\t\t.map(c => {\r\n\t\t\t\treturn \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\r\n\t\t\t})\r\n\t\t\t.join(\"\")\r\n\t);\r\n\r\n\treturn JSON.parse(base64);\r\n};\r\n","import React from \"react\";\r\n\r\nlet defaultPrefix = \"id\";\r\nlet lastId = 0;\r\n\r\nexport interface Props {\r\n defaultPrefix?: string;\r\n}\r\n\r\nexport class ResetElementIdGenerator extends React.Component {\r\n public constructor(props: Props) {\r\n super(props);\r\n\r\n lastId = 0;\r\n\r\n if (props.defaultPrefix != null) {\r\n defaultPrefix = props.defaultPrefix;\r\n }\r\n }\r\n\r\n public render() { return null; }\r\n}\r\n\r\nexport const getElementId = (prefix?: string) => `${prefix || defaultPrefix}_${++lastId}`;","import { LocationState } from \"history\";\r\nimport { Context, useContext, useEffect } from \"react\";\r\nimport { __RouterContext, RouteComponentProps, StaticContext } from \"react-router\";\r\nimport { useForceUpdate } from \"./UseForceUpdate\";\r\n\r\ntype AnyContext = Context>;\r\n\r\nconst INCORRECT_VERSION_ERROR: Error = new Error(\"use-react-router may only be used with react-router@^5.\");\r\n\r\nconst MISSING_CONTEXT_ERROR: Error = new Error(\"useReactRouter may only be called within a context.\");\r\n\r\nexport function useRouter<\r\n\tP extends { [K in keyof P]?: string } = {},\r\n\tC extends StaticContext = StaticContext,\r\n\tS = LocationState\r\n>(): RouteComponentProps {\r\n\t// If this version of react-router does not support Context,\r\n\tif (!__RouterContext) {\r\n\t\tthrow INCORRECT_VERSION_ERROR;\r\n\t}\r\n\r\n\t// If the react-router Context is not a parent Component,\r\n\tconst context: RouteComponentProps = useContext>(\r\n\t\t(__RouterContext as AnyContext) as Context>\r\n\t);\r\n\tif (!context) {\r\n\t\tthrow MISSING_CONTEXT_ERROR;\r\n\t}\r\n\r\n\tconst forceUpdate: VoidFunction = useForceUpdate();\r\n\tuseEffect((): VoidFunction => context.history.listen(forceUpdate), [context]);\r\n\treturn context;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { InitialState } from \"../../../Models/InitialState\";\r\nimport { useState, useEffect, useReducer } from \"react\";\r\nimport axios, { AxiosResponse } from \"axios\";\r\n// import * as Models from \"../../Models\";\r\n\r\nfunction dataFetchReducer(state: any, action: Actions) {\r\n\tswitch (action.type) {\r\n\t\tcase \"FETCH_INIT\":\r\n\t\t\treturn { ...state, isLoading: true, hasLoaded: false, isError: false };\r\n\t\tcase \"FETCH_SUCCESS\":\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tisLoading: false,\r\n\t\t\t\tisError: false,\r\n\t\t\t\thasLoaded: true,\r\n\t\t\t\tdata: action.payload\r\n\t\t\t};\r\n\t\tcase \"FETCH_FAILURE\":\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tisLoading: false,\r\n\t\t\t\thasLoaded: false,\r\n\t\t\t\tisError: true,\r\n\t\t\t\tdata: {}\r\n\t\t\t};\r\n\t\tdefault:\r\n\t\t\tthrow new Error();\r\n\t}\r\n}\r\n\r\ninterface Actions {\r\n\ttype: string;\r\n\tpayload?: InitialState;\r\n}\r\n\r\ninterface DataApi {\r\n\tisLoading: boolean;\r\n\thasLoaded: boolean;\r\n\tisError: boolean;\r\n\tdata: T;\r\n\tdoRequest(url: string, postData?: any, event?: any): void;\r\n}\r\n\r\nenum RequestType {\r\n\tGET,\r\n\tPOST\r\n}\r\n\r\n// export const useDataApi: (initialUrl: string, initialData: any) => = (initialUrl: string) {\r\n// export const useDataApi: (initialUrl: string, initialData: any) => {} = (initialUrl: string, initialData: string) => {\r\n/**\r\n * Hook to fetch data from the url specified.\r\n * @param {string} initialUrl Url to send data to. Required.\r\n * @param {RequestType} requestType Defaults to GET. Ignored if postData is not null\r\n * @param {any} initialPostData Data to be posted to the Url specified. If blank the call will be a get request. Defaults to null\r\n */\r\n\r\nexport const useDataApi = (\r\n\tinitialUrl: string = \"\",\r\n\trequestType: RequestType = RequestType.GET,\r\n\tinitialPostData: any = null\r\n): DataApi => {\r\n\tconst initialData = null;\r\n\tconst [url, setUrl] = useState(initialUrl);\r\n\tconst [postData, setPostData] = useState(initialPostData);\r\n\r\n\tconst [state, dispatch] = useReducer(dataFetchReducer, {\r\n\t\tisLoading: false,\r\n\t\thasLoaded: false,\r\n\t\tisError: false,\r\n\t\tdata: initialData\r\n\t});\r\n\r\n\tuseEffect(() => {\r\n\t\tlet didCancel = false;\r\n\r\n\t\tif (url === \"\") {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst fetchData = async () => {\r\n\t\t\tdispatch({ type: \"FETCH_INIT\" });\r\n\t\t\tlet headers = {};\r\n\t\t\tvar jwt = localStorage.getItem(\".auth\");\r\n\t\t\tif (jwt !== null || jwt !== \"\") {\r\n\t\t\t\theaders = { Authorization: `Bearer ${jwt}` };\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\t\t\t\tlet result: AxiosResponse = {} as any;\r\n\t\t\t\tif (postData || requestType === RequestType.POST) {\r\n\t\t\t\t\tresult = await axios.post(url, postData, { headers: headers });\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult = await axios(url, { headers: headers });\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!didCancel) {\r\n\t\t\t\t\tdispatch({ type: \"FETCH_SUCCESS\", payload: result.data });\r\n\t\t\t\t\tsetUrl(\"\"); // Reset so that subsequent calls will show a state change\r\n\t\t\t\t}\r\n\t\t\t} catch (error) {\r\n\t\t\t\tif (!didCancel) {\r\n\t\t\t\t\tdispatch({ type: \"FETCH_FAILURE\" });\r\n\t\t\t\t\tsetUrl(\"\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tfetchData();\r\n\r\n\t\treturn () => {\r\n\t\t\tdidCancel = true;\r\n\t\t};\r\n\t}, [url]);\r\n\r\n\tconst doRequest = (url: string, initialPostData: any = null, event: any = null): void => {\r\n\t\tsetUrl(url);\r\n\t\tsetPostData(initialPostData);\r\n\r\n\t\tif (event) {\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t};\r\n\r\n\treturn { ...state, doRequest };\r\n};\r\n","import React from \"react\";\r\nimport { Button } from \"@material-ui/core\";\r\nimport { useDataApi } from \"Shoothill.Core/Utils\";\r\nimport { ApiResult } from \"Shoothill.Components/Models\";\r\n\r\nexport const User: React.FC = () => {\r\n\tconst { doRequest } = useDataApi();\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\t{/* */}\r\n\t\t\t\r\n\t\t
\r\n\t);\r\n};\r\n","import React from \"react\";\r\nimport OpenSeadragon from \"openseadragon\";\r\nimport * as Utils from \"../Shoothill.Core/Utils/Utils\";\r\n\r\n//declare var OpenSeadragon: any;\r\n\r\ninterface Props {\r\n\tid?: any;\r\n\tonZoom?: any;\r\n\tonMouseMove?: any;\r\n\tonOpen?: any;\r\n\timage: string;\r\n\ttype?: string;\r\n\tshowNavigator?: boolean;\r\n}\r\nexport class OpenSeaDragonReact extends React.Component {\r\n\tpublic el: any = null;\r\n\tpublic elements: any = [];\r\n\tpublic viewer: OpenSeadragon.Viewer = {} as any;\r\n\tconstructor(props: Props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic GetViewer = () => {\r\n\t\treturn this.viewer;\r\n\t};\r\n\r\n\t// \tpublic validateElement = (e: any) => {\r\n\t// \tconst props = [\"id\", \"element\", \"x\", \"y\", \"width\", \"height\"];\r\n\t// \tlet isValid = true;\r\n\t// \tlet errors = [];\r\n\t// \tfor (prop of props) {\r\n\t// \t\tif (!(prop in e)) {\r\n\t// \t\t\tisValid = false;\r\n\t// \t\t\terrors.push(prop);\r\n\t// \t\t}\r\n\t// \t}\r\n\t// \tif (errors.length !== 0) {\r\n\t// \t\tconsole.log(\"Missing properties \" + errors.join(\", \") + \". Element was not added: \", e);\r\n\t// \t}\r\n\t// \treturn isValid;\r\n\t// }\r\n\r\n\tpublic repositionElements = (es: any, viewer: any) => {\r\n\t\tfor (let e of es) {\r\n\t\t\tthis.repositionElement(e, viewer);\r\n\t\t}\r\n\t};\r\n\r\n\tpublic repositionElement = (e: any, viewer: any) => {\r\n\t\tconst newRect = this.viewer.viewport.viewportToViewerElementRectangle(\r\n\t\t\tviewer.viewport.imageToViewportRectangle(e.rect)\r\n\t\t);\r\n\t\tconst point = this.viewer.viewport.getFlip()\r\n\t\t\t? this.flipPoint(\r\n\t\t\t\t\t{ x: e.rect.x, y: e.rect.y },\r\n\t\t\t\t\tviewer.viewport.getRotation(),\r\n\t\t\t\t\tviewer.world.getItemAt(0).viewportToImageCoordinates(viewer.viewport.getCenter(true))\r\n\t\t\t )\r\n\t\t\t: { x: e.rect.x, y: e.rect.y };\r\n\t\tconst pos = viewer.viewport.viewportToViewerElementCoordinates(\r\n\t\t\tviewer.viewport.imageToViewportCoordinates(point.x, point.y)\r\n\t\t);\r\n\t\te.element.style.left = pos.x - newRect.width / 2 + \"px\";\r\n\t\te.element.style.top = pos.y - newRect.height / 2 + \"px\";\r\n\t\te.element.style.width = newRect.width + \"px\";\r\n\t\te.element.style.height = newRect.height + \"px\";\r\n\t\tif (\"fontSize\" in e) {\r\n\t\t\te.element.style.fontSize = (e.fontSize * viewer.viewport.getZoom(true)) / viewer.viewport.getHomeZoom() + \"px\";\r\n\t\t}\r\n\t};\r\n\r\n\tpublic flipPoint = (p: any, angle: any, center: any) => {\r\n\t\tconst rotatedPoint = this.rotatePoint(p, 180 + angle * 2, center);\r\n\t\treturn { x: rotatedPoint.x, y: center.y * 2 - rotatedPoint.y };\r\n\t};\r\n\r\n\tpublic rotatePoint = (p: any, angle: any, center: any) => {\r\n\t\tangle = (angle * Math.PI) / 180;\r\n\t\tlet point = center ? this.subtractPoints(p, center) : p,\r\n\t\t\tsin = Math.sin(angle),\r\n\t\t\tcos = Math.cos(angle);\r\n\t\tpoint = {\r\n\t\t\tx: point.x * cos - point.y * sin,\r\n\t\t\ty: point.x * sin + point.y * cos\r\n\t\t};\r\n\t\treturn center ? this.addPoints(point, center) : point;\r\n\t};\r\n\r\n\tpublic subtractPoints = (p1: any, p2: any) => {\r\n\t\treturn { x: p1.x - p2.x, y: p1.y - p2.y };\r\n\t};\r\n\r\n\tpublic addPoints = (p1: any, p2: any) => {\r\n\t\treturn { x: p1.x + p2.x, y: p1.y + p2.y };\r\n\t};\r\n\tpublic addElement = (e: any) => {\r\n\t\t//if (this.validateElement(e))\r\n\t\t{\r\n\t\t\te.element.style.width = \"100%\";\r\n\t\t\te.element.style.height = \"100%\";\r\n\t\t\tlet wrapperDiv = document.createElement(\"div\");\r\n\t\t\twrapperDiv.style.position = \"absolute\";\r\n\t\t\twrapperDiv.appendChild(e.element);\r\n\t\t\tthis.viewer.canvas.appendChild(wrapperDiv);\r\n\t\t\tthis.elements.push({\r\n\t\t\t\t...e,\r\n\t\t\t\telement: wrapperDiv,\r\n\t\t\t\trect: new OpenSeadragon.Rect(e.x + e.width / 2, e.y + e.height / 2, e.width, e.height)\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn this.elements;\r\n\t};\r\n\tpublic getElementById = (id: string) => {\r\n\t\treturn this.elements.find((e: any) => {\r\n\t\t\treturn e.id === id;\r\n\t\t});\r\n\t};\r\n\tpublic removeElementById = (id: string) => {\r\n\t\tconst e = this.getElementById(id);\r\n\t\tif (e !== null) {\r\n\t\t\tthis.viewer.canvas.removeChild(e.element);\r\n\t\t\tthis.elements.splice(this.elements.indexOf(e), 1);\r\n\t\t}\r\n\t\treturn this.elements;\r\n\t};\r\n\tpublic removeElementsById = (ids: string[]) => {\r\n\t\tfor (let id of ids) {\r\n\t\t\tthis.removeElementById(id);\r\n\t\t}\r\n\t\treturn this.elements;\r\n\t};\r\n\r\n\t// temporarily set OpenSeadragon animation params\r\n\t// to a very slow animate, then restore.\r\n\tpublic withSlowOSDAnimation = (viewport: any, f: any, factor: number = 20) => {\r\n\t\t// save old ones\r\n\t\tvar oldValues = {} as any;\r\n\t\toldValues.centerSpringXAnimationTime = viewport.centerSpringX.animationTime;\r\n\t\toldValues.centerSpringYAnimationTime = viewport.centerSpringY.animationTime;\r\n\t\toldValues.zoomSpringAnimationTime = viewport.zoomSpring.animationTime;\r\n\r\n\t\t// set our new ones\r\n\t\tviewport.centerSpringX.animationTime = viewport.centerSpringY.animationTime = viewport.zoomSpring.animationTime = factor;\r\n\r\n\t\t// callback\r\n\t\tf();\r\n\r\n\t\t// restore values\r\n\t\tviewport.centerSpringX.animationTime = oldValues.centerSpringXAnimationTime;\r\n\t\tviewport.centerSpringY.animationTime = oldValues.centerSpringYAnimationTime;\r\n\t\tviewport.zoomSpring.animationTime = oldValues.zoomSpringAnimationTime;\r\n\t};\r\n\tprivate loadImage = (src: string) =>\r\n\t\tnew Promise(function(resolve, reject) {\r\n\t\t\tvar img = document.createElement(\"img\");\r\n\t\t\timg.addEventListener(\"load\", function() {\r\n\t\t\t\tresolve(img);\r\n\t\t\t});\r\n\t\t\timg.addEventListener(\"error\", function(err) {\r\n\t\t\t\treject(404);\r\n\t\t\t});\r\n\t\t\timg.src = src;\r\n\t\t});\r\n\r\n\trender() {\r\n\t\tlet self = this;\r\n\t\tlet { id } = this.props;\r\n\t\treturn (\r\n\t\t\t {\r\n\t\t\t\t\tthis.el = node;\r\n\t\t\t\t}}>\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t{/* */}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n\r\n\tinitSeaDragon = () => {\r\n\t\tlet self = this;\r\n\t\tlet { id, image, type } = this.props;\r\n\t\tself.viewer = new OpenSeadragon.Viewer({\r\n\t\t\tid: id,\r\n\t\t\tprefixUrl: \"//cdnjs.cloudflare.com/ajax/libs/openseadragon/2.4.1/images/\",\r\n\t\t\ttileSources: image,\r\n\t\t\talwaysBlend: true,\r\n\t\t\timmediateRender: true,\r\n\t\t\tvisibilityRatio: 1.1,\r\n\t\t\t//constrainDuringPan: false,\r\n\t\t\t//defaultZoomLevel: 1,\r\n\t\t\t//minZoomLevel: 1,\r\n\t\t\t//maxZoomLevel: 20,\r\n\t\t\tzoomInButton: \"zoom-in\",\r\n\t\t\tzoomOutButton: \"zoom-out\",\r\n\t\t\thomeButton: \"reset\",\r\n\t\t\t// fullPageButton: \"full-page\",\r\n\t\t\t// nextButton: \"next\",\r\n\t\t\t// previousButton: \"previous\",\r\n\t\t\tshowNavigator: true,\r\n\t\t\t//navigatorId: \"navigator\",\r\n\t\t\tnavigatorAutoFade: false,\r\n\t\t\tnavigatorPosition: \"BOTTOM_LEFT\",\r\n\t\t\tblendTime: 0.5,\r\n\t\t\tpreload: true,\r\n\t\t\tpixelsPerWheelLine: 40,\r\n\t\t\t//minScrollDeltaTime: 20\r\n\t\t\tzoomPerScroll: 1.7,\r\n\t\t\tgestureSettingsMouse: {\r\n\t\t\t\tclickToZoom: false,\r\n\t\t\t\tdblClickToZoom: true\r\n\t\t\t}\r\n\t\t\t//debugMode: true\r\n\t\t\t// overlays: [\r\n\t\t\t// \t{\r\n\t\t\t// \t\tid: \"overlay\",\r\n\t\t\t// \t\tx: 0,\r\n\t\t\t// \t\ty: 0,\r\n\t\t\t// \t\twidth: 0.031249999999999979,\r\n\t\t\t// \t\theight: 0.031249999999999979,\r\n\t\t\t// \t\tclassName: \"highlight\"\r\n\t\t\t// \t}\r\n\t\t\t// ]\r\n\t\t});\r\n\r\n\t\t// var elt = document.getElementById(\"overlay\");\r\n\t\t// elt!.id = \"overlay\";\r\n\t\t// elt!.className = \"highlight\";\r\n\t\t// self.viewer.addOverlay({\r\n\t\t// \telement: elt,\r\n\t\t// \tlocation: new OpenSeadragon.Rect(0.33, 0.75, 0.2, 0.25)\r\n\t\t// });\r\n\r\n\t\t//This sets up listerners for everything in self.elements as and when they are added\r\n\t\tfor (var h of [\"open\", \"animation\", \"rotate\", \"flip\", \"resize\"]) {\r\n\t\t\tthis.viewer.addHandler(h, function() {\r\n\t\t\t\tself.repositionElements(self.elements, self.viewer);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t//var hEl = (self.viewer as any).HTMLelements();\r\n\r\n\t\t// var textbox = document.createElement(\"div\");\r\n\t\t// textbox.style.backgroundColor = \"rgba(200,200,200,0.8)\";\r\n\t\t// textbox.style.border = \"solid 1px black\";\r\n\t\t// textbox.style.borderRadius = \"8px\";\r\n\t\t// textbox.innerHTML =\r\n\t\t// \t\"ipsum dolor amet brisket pork spare ribs drumstick cupim. Turducken pork chop drumstick meatball boudin spare ribs.\";\r\n\r\n\t\t// this.addElement({\r\n\t\t// \tid: \"gif\",\r\n\t\t// \telement: textbox,\r\n\t\t// \tx: 0,\r\n\t\t// \ty: 0,\r\n\t\t// \t//width: self.viewer.viewport.viewportToImageCoordinates(new OpenSeadragon.Point(0.3)),\r\n\t\t// \t//height: self.viewer.viewport.viewportToImageCoordinates(new OpenSeadragon.Point(0.3))\r\n\t\t// \twidth: 4125,\r\n\t\t// \theight: 4125,\r\n\t\t// \tfontSize: 14\r\n\t\t// });\r\n\r\n\t\tself.viewer.addHandler(\"open\", target => {\r\n\t\t\tthis.props.onOpen();\r\n\t\t});\r\n\r\n\t\tself.viewer.addHandler(\"canvas-click\", target => {\r\n\t\t\tif (target.quick === true) {\r\n\t\t\t\tvar viewportPoint = self.viewer.viewport.pointFromPixel(target.position);\r\n\t\t\t\tvar imagePoint = self.viewer.viewport.viewportToImageCoordinates(viewportPoint.x, viewportPoint.y);\r\n\t\t\t\timagePoint = self.viewer.viewport.viewportToImageCoordinates(0.0309, 0.0305);\r\n\t\t\t\t//console.log(parseInt(imagePoint.x), parseInt(imagePoint.y));\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tconst zoomHandler = Utils.throttled(250, (event: any) => self.props.onZoom(event.eventSource));\r\n\t\tself.viewer.addHandler(\"animation\", zoomHandler);\r\n\r\n\t\tconst mouseMoveHandler = Utils.throttled(200, (event: any) => self.props.onMouseMove(event));\r\n\t\tvar tracker = new OpenSeadragon.MouseTracker({\r\n\t\t\telement: this.props.id,\r\n\t\t\tmoveHandler: mouseMoveHandler\r\n\t\t});\r\n\t\ttracker.setTracking(true);\r\n\r\n\t\tif (this.props.showNavigator === false) {\r\n\t\t\tself.viewer.navigator.element.style.display = \"none\";\r\n\t\t}\r\n\t\t//self.viewer.addHandler(\"mousemove\", event => mouseMoveHandler(event.eventSource));\r\n\t\t// setTimeout(() => {\r\n\t\t// \tvar point = new OpenSeadragon.Point(0 + 0.031249999999999979 / 2, 0 + 0.031249999999999979 / 2);\r\n\t\t// \tself.viewer.viewport.panTo(point);\r\n\t\t// }, 2000);\r\n\t\t// setTimeout(() => {\r\n\t\t// \tvar point = new OpenSeadragon.Point(0 + 0.031249999999999979 / 2, 0 + 0.031249999999999979 / 2);\r\n\t\t// \tself.viewer.viewport.zoomTo(14, point);\r\n\t\t// }, 5000);\r\n\t};\r\n\r\n\tcomponentDidMount() {\r\n\t\tthis.initSeaDragon();\r\n\t}\r\n\tshouldComponentUpdate(nextProps: any, nextState: any) {\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\n(OpenSeaDragonReact as any).defaultProps = { id: \"ocd-viewer\", type: \"legacy-image-pyramid\", showNavigator: true };\r\n","import React, { useRef, useEffect } from \"react\";\r\nimport \"./Home.css\";\r\nimport { OpenSeaDragonReact } from \"../Components/OpenSeadragonReact\";\r\nimport OpenSeadragon from \"openseadragon\";\r\nimport axios from \"axios\";\r\nimport ZoomIn from \"../Assets/buttonPlus.svg\";\r\nimport ZoomOut from \"../Assets/buttonMinus.svg\";\r\nimport Reset from \"../Assets/buttonReset.svg\";\r\nimport Logo from \"../Assets/createdBY.svg\";\r\nimport Nasa from \"../Assets/imagesCourtesy.svg\";\r\nimport * as WithTracker from \"Shoothill.Core/Utils/App/WithGATracker\";\r\nimport { sendEvent } from \"Shoothill.Core/Utils/App/GoogleAnalyticsUtils\";\r\nimport { Grid, Paper, Box, makeStyles, Typography } from \"@material-ui/core\";\r\nimport styled from \"styled-components\";\r\nimport {\r\n\tFacebookShareButton,\r\n\tLinkedinShareButton,\r\n\tTwitterShareButton,\r\n\tTelegramShareButton,\r\n\tWhatsappShareButton,\r\n\tPinterestShareButton,\r\n\tVKShareButton,\r\n\tOKShareButton,\r\n\tRedditShareButton,\r\n\tTumblrShareButton,\r\n\tLivejournalShareButton,\r\n\tFacebookIcon,\r\n\tFacebookShareCount,\r\n\tTwitterIcon,\r\n\tWhatsappIcon,\r\n\tLinkedinIcon,\r\n\tPinterestIcon\r\n} from \"react-share\";\r\nconst useStyles = makeStyles(theme => ({\r\n\troot: {\r\n\t\t// width: \"100%\",\r\n\t\t// maxWidth: 500\r\n\t\tflexGrow: 1\r\n\t},\r\n\tbutton: {\r\n\t\tmargin: theme.spacing(1)\r\n\t},\r\n\tinput: {\r\n\t\tdisplay: \"none\"\r\n\t},\r\n\tpaper: {\r\n\t\tpadding: theme.spacing(2),\r\n\t\ttextAlign: \"center\",\r\n\t\tcolor: theme.palette.text.secondary\r\n\t}\r\n}));\r\n\r\nexport const PaperFullHeight = styled(Paper)`\r\n\theight: 90vh;\r\n\tpadding-left: 10px;\r\n`;\r\n\r\nexport const LinkBox = styled(Box)`\r\n\tpadding: 5px;\r\n\tcursor: pointer;\r\n`;\r\n\r\nexport const FancyBox = styled(Box)`\r\n\tdisplay: inline-block;\r\n\tpadding: 10px;\r\n\ttransition: background-color 0.5s ease-in-out;\r\n\t&:hover {\r\n\t\tbackground-color: #f2893e;\r\n\t\t/* animation: color 4s ease-in-out; */\r\n\t}\r\n`;\r\n\r\nexport const RightSide = styled(Grid)`\r\n\toverflow: auto;\r\n\theight: 90vh;\r\n`;\r\n\r\nexport const ButtonGroup = styled(Box)`\r\n\tposition: absolute;\r\n\ttop: 0px;\r\n\tleft: 0px;\r\n\tz-index: 1000;\r\n\tmax-width: 250px;\r\n\tcursor: pointer;\r\n\t@media (max-width: 900px) {\r\n\t\tpadding-top: 15px;\r\n\t\tpadding-left: 20px;\r\n\t}\r\n`;\r\n\r\nexport const ImgButton = styled.img`\r\n\tpadding-right: 15px;\r\n\twidth: 40px;\r\n\t@media (min-width: 600px) {\r\n\t\twidth: 50px;\r\n\t}\r\n`;\r\n\r\nexport const OneSmallStep = styled(Box)`\r\n\ttext-transform: uppercase;\r\n\tposition: absolute;\r\n\ttop: 0px;\r\n\tright: 0px;\r\n\tz-index: 1000;\r\n\tpadding-right: 20px;\r\n\tpadding-top: 15px;\r\n\twidth: 150px;\r\n\tcolor: white;\r\n\tuser-select: none;\r\n\talign-items: flex-end;\r\n\tp {\r\n\t\tfont-size: 10px;\r\n\t}\r\n\t@media (min-width: 400px) {\r\n\t\tpadding-right: 20px;\r\n\t\twidth: 200px;\r\n\t\tp {\r\n\t\t\tfont-size: 12px;\r\n\t\t}\r\n\t}\r\n\t@media (min-width: 640px) {\r\n\t\tpadding-right: 20px;\r\n\t\twidth: 400px;\r\n\t\tp {\r\n\t\t\tfont-size: 14px;\r\n\t\t}\r\n\t}\r\n\t@media (min-width: 950px) {\r\n\t\tfont-size: 18px;\r\n\t\twidth: auto;\r\n\t\tpadding-top: 50px;\r\n\t\tpadding-right: 80px;\r\n\t\tp {\r\n\t\t\tfont-family: \"Gotham\";\r\n\t\t}\r\n\t}\r\n`;\r\nexport const OneSmallStepBold = styled.span`\r\n\tfont-family: \"GothamBold\";\r\n`;\r\n\r\nexport const LogoBox = styled(Box)`\r\n\tposition: absolute;\r\n\tz-index: 1000;\r\n\tbottom: 0px;\r\n\tright: 0px;\r\n\tpadding-bottom: 57px;\r\n\tpadding-right: 80px;\r\n\tcursor: pointer;\r\n\t@media (max-width: 600px) {\r\n\t\tpadding-bottom: 10px;\r\n\t\tpadding-right: 40px;\r\n\t\timg {\r\n\t\t\twidth: 100px;\r\n\t\t}\r\n\t}\r\n`;\r\n\r\nexport const Attribution = styled(Box)`\r\n\tposition: absolute;\r\n\tleft: 0px;\r\n\tbottom: 0px;\r\n\tpadding-bottom: 10px;\r\n\tpadding-left: 10px;\r\n\tz-index: 1000;\r\n\t@media (min-width: 600px) {\r\n\t\tpadding-bottom: 50px;\r\n\t\tpadding-left: 100px;\r\n\t}\r\n\t@media (max-width: 600px) {\r\n\t\timg {\r\n\t\t\twidth: 150px;\r\n\t\t}\r\n\t}\r\n`;\r\n\r\nexport const NetworkShares = styled(Box)`\r\n\tvertical-align: top;\r\n\tdisplay: flex;\r\n\tmargin-right: 15px;\r\n\ttext-align: center;\r\n\tdiv {\r\n\t\tpadding-right: 6px;\r\n\t\tcursor: pointer;\r\n\t}\r\n`;\r\n\r\nexport var infoIcon: any;\r\nexport var square: any;\r\nexport var apollo11: any;\r\n\r\nexport const Home: React.FC = () => {\r\n\t//const classes = useStyles();\r\n\tvar openSeaDragonRef: any = useRef();\r\n\tlet viewPort: OpenSeadragon.Viewport;\r\n\t//const showIconAtZoomLevel = 1.5;\r\n\tconst dzUrl = \"https://deepzoom01.blob.core.windows.net/apollo11-50k/output.xml\";\r\n\tconst dzWidth = 945918.5509784536;\r\n\tconst dzHeight = 944951.33241448808;\r\n\tconst aspectRatio = dzWidth / dzHeight;\r\n\t//const cellWidth = 0.0044913413798331348;\r\n\t//const cellHeight = 0.0044913413798331348;\r\n\r\n\t//const getLogicalWidth = (x: number) => dzWidth / x / 1000;\r\n\t//const getLogicalHeight = (y: number) => dzHeight / y / 1000;\r\n\r\n\tconst getViewer = (): OpenSeadragon.Viewer => {\r\n\t\treturn openSeaDragonRef.current.viewer as OpenSeadragon.Viewer;\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\t// viewPort = openSeaDragonRef.current.viewer.viewport;\r\n\t\t// infoIcon = document.createElement(\"img\");\r\n\t\t// infoIcon.id = \"apollo11\";\r\n\t\t// infoIcon.src = \"https://deepzoom01.blob.core.windows.net/apollo11-50k/apollo11.png\";\r\n\t\t// openSeaDragonRef.current.addElement({\r\n\t\t// \tid: \"apollo11\",\r\n\t\t// \telement: infoIcon,\r\n\t\t// \tx: 0,\r\n\t\t// \ty: 0,\r\n\t\t// \twidth: 512,\r\n\t\t// \theight: 512\r\n\t\t// });\r\n\t\t// square = document.createElement(\"div\");\r\n\t\t// square.addEventListener(\"mouseover\", onIconHover);\r\n\t\t// square.id = \"square\";\r\n\t\t// square.src = \"https://deepzoom01.blob.core.windows.net/apollo11-50k/information.png\";\r\n\t\t// square.className = \"highlight\";\r\n\t\t// let width = openSeaDragonRef.current.viewer.viewport.viewportToImageCoordinates(0.0309, 0.0305);\r\n\t\t// openSeaDragonRef.current.addElement({\r\n\t\t// \tid: \"square\",\r\n\t\t// \telement: square,\r\n\t\t// \tx: 0,\r\n\t\t// \ty: 0,\r\n\t\t// \twidth: 4079,\r\n\t\t// \theight: 4026\r\n\t\t// });\r\n\t}, []);\r\n\r\n\tconst onIconHover = () => {\r\n\t\tconsole.log(\"Icon hover\");\r\n\t};\r\n\r\n\tconst onClick = () => {\r\n\t\tviewPort = openSeaDragonRef.current.viewer.viewport;\r\n\t\tlet width = openSeaDragonRef.current.viewer.viewport.viewportToImageCoordinates(0.0309, 0.0305);\r\n\t\tconsole.log(viewPort.getBoundsWithMargins());\r\n\t\t//viewPort.zoomBy(2);\r\n\t\tlet rect = new OpenSeadragon.Rect(0, 0, 1, 1);\r\n\t\t//getViewer().viewport.fitBounds(new OpenSeadragon.Rect(0, 0, 0.03, 0.03));\r\n\t\topenSeaDragonRef.current.withSlowOSDAnimation(getViewer().viewport, function() {\r\n\t\t\t// stuff\r\n\t\t\tgetViewer().viewport.fitBounds(new OpenSeadragon.Rect(0.5, 0.8, 0.0044913413798331348, 0.0044913413798331348));\r\n\t\t});\r\n\t\t//viewPort.fitBounds(rect);\r\n\t\t//infoIcon.style.display = \"none\";\r\n\t};\r\n\r\n\tconst onMouseMove = async (mouseEvent: any) => {\r\n\t\treturn;\r\n\t\tconsole.log(mouseEvent.position.x, mouseEvent.position.y);\r\n\t\t//return;\r\n\t\tvar vp = getViewer().viewport.pointFromPixel(mouseEvent.position);\r\n\t\tif (vp.x < 0 || vp.x > 1 || vp.y < 0 || vp.y > aspectRatio * 1.1) return;\r\n\r\n\t\t//EN: Use the following if all the cells are of equal height and width to save making a call back to the server\r\n\t\t// {\r\n\t\t// \tlet xx = Math.floor(vp.x / cellWidth) * cellWidth;\r\n\t\t// \tlet yy = Math.floor(vp.y / cellHeight) * cellHeight;\r\n\t\t// \tvar size = openSeaDragonRef.current.viewer.viewport.viewportToImageCoordinates(cellWidth, cellHeight);\r\n\t\t// \tvar xy = openSeaDragonRef.current.viewer.viewport.viewportToImageCoordinates(xx, yy);\r\n\t\t// }\r\n\r\n\t\t//EN: Make a call to the server to get actual dimensions of the cell\r\n\t\tvar data = await axios.get(`/api/deepzoom/getcell/${vp.x}/${vp.y}`);\r\n\t\tif (data.data === \"\") return;\r\n\t\tvar size = openSeaDragonRef.current.viewer.viewport.viewportToImageCoordinates(\r\n\t\t\tdata.data.logicalRect.w,\r\n\t\t\tdata.data.logicalRect.h\r\n\t\t);\r\n\t\tvar xy = openSeaDragonRef.current.viewer.viewport.viewportToImageCoordinates(\r\n\t\t\tdata.data.logicalRect.x,\r\n\t\t\tdata.data.logicalRect.y\r\n\t\t);\r\n\t\tconsole.log(data.data.fileName, data.data.cell.x, data.data.cell.y);\r\n\t\treturn;\r\n\t\tlet e = openSeaDragonRef.current.getElementById(\"square\");\r\n\t\te.x = xy.x;\r\n\t\te.y = xy.y;\r\n\t\te.width = size.x;\r\n\t\te.height = size.y;\r\n\t\te.rect = new OpenSeadragon.Rect(e.x + e.width / 2, e.y + e.height / 2, e.width, e.height);\r\n\t\topenSeaDragonRef.current.repositionElement(e, openSeaDragonRef.current.viewer);\r\n\t};\r\n\r\n\tconst onZoom = (viewer: OpenSeadragon.Viewer) => {\r\n\t\t//zoomLevel > showIconAtZoomLevel ? (infoIcon.style.display = \"block\") : (infoIcon.style.display = \"none\");\r\n\t\tlet zoomLevel = (viewer.viewport as any)._oldZoom;\r\n\t\tif (apollo11) {\r\n\t\t\tapollo11.style.opacity = zoomLevel / 10;\r\n\t\t\t//console.log(\"Zoom=>\" + zoomLevel, apollo11.style.opacity);\r\n\t\t}\r\n\t};\r\n\r\n\tconst onOpen = (viewer: OpenSeadragon.Viewer) => {\r\n\t\tviewPort = openSeaDragonRef.current.viewer.viewport;\r\n\t\tvar size = openSeaDragonRef.current.viewer.viewport.viewportToImageCoordinates(\r\n\t\t\t0.0043027400249884273,\r\n\t\t\t0.0044983191170333559\r\n\t\t);\r\n\t\tvar xy = openSeaDragonRef.current.viewer.viewport.viewportToImageCoordinates(\r\n\t\t\t0.50450534470149666,\r\n\t\t\t0.42524071963078131\r\n\t\t);\r\n\r\n\t\tapollo11 = document.createElement(\"img\");\r\n\t\tapollo11.id = \"apollo11\";\r\n\t\tapollo11.src = \"https://deepzoom01.blob.core.windows.net/apollo11-50k/apollo11.jpg\";\r\n\t\t//apollo11.style.display = \"none\";\r\n\t\topenSeaDragonRef.current.addElement({\r\n\t\t\tid: \"apollo11\",\r\n\t\t\telement: apollo11,\r\n\t\t\tx: xy.x,\r\n\t\t\ty: xy.y,\r\n\t\t\twidth: size.x,\r\n\t\t\theight: size.y\r\n\t\t});\r\n\t\t//let e = openSeaDragonRef.current.getElementById(\"apollo11\");\r\n\t\t//openSeaDragonRef.current.repositionElement(e, openSeaDragonRef.current.viewer);\r\n\r\n\t\tgetViewer().viewport.fitBounds(\r\n\t\t\tnew OpenSeadragon.Rect(0.50450534470149666, 0.42524071963078131, 0.0043027400249884273, 0.0044983191170333559),\r\n\t\t\ttrue\r\n\t\t);\r\n\t\tsetTimeout(() => {\r\n\t\t\tapollo11.style.display = \"block\";\r\n\t\t\topenSeaDragonRef.current.withSlowOSDAnimation(getViewer().viewport, function() {\r\n\t\t\t\t// getViewer().viewport.fitBounds(\r\n\t\t\t\t// \tnew OpenSeadragon.Rect(0.50450534470149666, 0.42524071963078131, 0.0043027400249884273, 0.0044983191170333559)\r\n\t\t\t\t// );\r\n\t\t\t\tgetViewer().viewport.goHome();\r\n\t\t\t});\r\n\t\t}, 2500);\r\n\t\tconsole.log(\"Opened\");\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\r\n\t\t\t\t{/* */}\r\n\t\t\t
\r\n\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tOne small step for man, one giant leap for mankind 20th July 1969\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t {\r\n\t\t\t\t\t\tsendEvent({ action: \"clicked\", category: \"logo\" });\r\n\t\t\t\t\t\twindow.open(\"https://www.shoothill.com\", \"_blank\");\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t{!(window as any).iniFrame && (\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport const FBShare = React.memo(() => {\r\n\tconst shareUrl = \"https://apollo11.shoothill.com\";\r\n\tconst title = \"Shoothill - Apollo 11 moon landing 50th anniversary megafiche\";\r\n\tconst iconSize = 38;\r\n\treturn (\r\n\t\t\r\n\t\t\t sendEvent({ action: \"clicked\", category: \"facebook\" })}>\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t sendEvent({ action: \"clicked\", category: \"twitter\" })}>\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t sendEvent({ action: \"clicked\", category: \"whatsapp\" })}>\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t sendEvent({ action: \"clicked\", category: \"linkedin\" })}>\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t{/* sendEvent({ action: \"clicked\", category: \"pinterest\" })}>\r\n\t\t\t\t>\r\n\t\t\t\t\r\n\t\t\t */}\r\n\t\t\r\n\t);\r\n});\r\n\r\nexport const HomeContainer = WithTracker.withTracker(Home);\r\n","import React from \"react\";\r\nimport { User } from \"./Pages/User\";\r\nimport { HomeContainer } from \"./Pages/Home\";\r\n// import { LoginPage } from \"./Pages/LoginPage\";\r\n// import { RegisterPage } from \"./Pages/RegisterPage\";\r\n// import { PrivateRoute } from \"Shoothill.Core/Utils\";\r\nimport { Route } from \"react-router\";\r\n\r\nexport const AppRoutes: React.FC = () => {\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t{/* \r\n\t\t\t */}\r\n\t\t\t\r\n\t\t\t{/* {\r\n\t\t\t\t\treturn store.domain.AccountStore.IsLoggedIn && store.domain.AccountStore.isInRole(\"admin\");\r\n\t\t\t\t}}\r\n\t\t\t/> */}\r\n\t\t\r\n\t);\r\n};\r\n","import React from \"react\";\r\nimport { hot } from \"react-hot-loader\";\r\n\r\n// import purple from \"@material-ui/core/colors/purple\";\r\nimport { BrowserRouter as Router } from \"react-router-dom\";\r\nimport CssBaseline from \"@material-ui/core/CssBaseline\";\r\n\r\nimport { StylesProvider } from \"@material-ui/styles\";\r\nimport { Layout } from \"./Pages/Layout\";\r\nimport { AppRoutes } from \"./AppRoutes\";\r\nimport { ThemeProvider as MuiThemeProvider } from \"@material-ui/styles\";\r\nimport { ThemeProvider } from \"styled-components\";\r\nimport { createMuiTheme } from \"@material-ui/core/styles\";\r\n\r\nconst defaultTheme = createMuiTheme({\r\n\ttypography: {\r\n\t\tfontFamily: `\"Roboto Condensed\", \"Helvetica\", \"Arial\", sans-serif`,\r\n\t\th5: {\r\n\t\t\tfontSize: \"18px\",\r\n\t\t\tfontWeight: \"bold\"\r\n\t\t},\r\n\t\th6: {\r\n\t\t\tfontSize: \"14px\",\r\n\t\t\tfontWeight: \"bold\"\r\n\t\t},\r\n\t\tsubtitle1: {\r\n\t\t\tfontSize: \"14px\",\r\n\t\t\tfontWeight: 300,\r\n\t\t\tlineHeight: 1.4,\r\n\t\t\tletterSpacing: \"-0.4px\"\r\n\t\t},\r\n\t\tsubtitle2: {\r\n\t\t\tfontSize: \"14px\",\r\n\t\t\tfontWeight: 300\r\n\t\t}\r\n\t},\r\n\tpalette: {\r\n\t\tprimary: {\r\n\t\t\tmain: \"#9DCB3B\",\r\n\t\t\tcontrastText: \"#FFFFFF\"\r\n\t\t},\r\n\t\tsecondary: {\r\n\t\t\tmain: \"#F2893E\",\r\n\t\t\tcontrastText: \"#FFFFFF\"\r\n\t\t}\r\n\t},\r\n\toverrides: {\r\n\t\tMuiLink: {\r\n\t\t\troot: {\r\n\t\t\t\ttextDecoration: \"none\",\r\n\t\t\t\tcolor: \"#000\"\r\n\t\t\t}\r\n\t\t},\r\n\t\tMuiTabs: {\r\n\t\t\tindicator: {\r\n\t\t\t\tdisplay: \"none\"\r\n\t\t\t}\r\n\t\t},\r\n\t\tMuiTab: {\r\n\t\t\troot: {\r\n\t\t\t\tbackgroundColor: \"#F1F1F1\",\r\n\t\t\t\tborder: \"1px solid rgba(0, 0, 0, 0.08)\",\r\n\t\t\t\tmarginLeft: \"1px\",\r\n\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\tfontWeight: \"bold\",\r\n\t\t\t\tborderRadius: \"2px 2px 0 0\",\r\n\t\t\t\t\"&:hover\": {\r\n\t\t\t\t\tbackgroundColor: \"rgba(0, 0, 0, .1)\",\r\n\t\t\t\t\tcolor: \"black\"\r\n\t\t\t\t},\r\n\t\t\t\t\"@media (min-width: 960px)\": {\r\n\t\t\t\t\twidth: \"57px\",\r\n\t\t\t\t\tminWidth: \"57px\"\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tMuiButton: {\r\n\t\t\troot: {\r\n\t\t\t\tmargin: \"15px 0 15px 0\",\r\n\t\t\t\tborderRadius: \"0\",\r\n\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\tfontSize: \"16px\"\r\n\t\t\t}\r\n\t\t},\r\n\t\tMuiListItemIcon: {\r\n\t\t\troot: {\r\n\t\t\t\tminWidth: \"36px\"\r\n\t\t\t}\r\n\t\t},\r\n\t\tMuiOutlinedInput: {\r\n\t\t\tinput: {\r\n\t\t\t\tpadding: \"10px 6px 10px 6px\",\r\n\t\t\t\theight: \"30px\"\r\n\t\t\t},\r\n\t\t\tnotchedOutline: {\r\n\t\t\t\tborderRadius: \"0\"\r\n\t\t\t}\r\n\t\t},\r\n\t\tMuiInputLabel: {\r\n\t\t\toutlined: {\r\n\t\t\t\tfontWeight: 500,\r\n\t\t\t\tcolor: \"#191919\"\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\nconst App: React.FC = () => {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default hot(module)(App);\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","//EN: To support IE 11\r\n// Uncomment the two lines below\r\n// Revert MobX to 4.12.0\r\n// Delete node_modules directory and reinstall\r\nimport \"react-app-polyfill/ie11\";\r\nimport \"react-app-polyfill/stable\";\r\nimport React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"index.css\";\r\nimport App from \"App\";\r\nimport * as serviceWorker from \"serviceWorker\";\r\nimport * as Utils from \"./Shoothill.Core/Utils/Utils\";\r\nimport { useDataApi } from \"./Shoothill.Core/Utils\";\r\n\r\nimport * as History from \"history\";\r\nimport { AppErrorBoundary } from \"./AppErrorBoundary\";\r\nimport { InitialState } from \"Models\";\r\n\r\nconst baseUrl: string | undefined = Utils.getBaseUrl();\r\nconst history = History.createBrowserHistory({\r\n\tbasename: baseUrl\r\n});\r\n\r\nconst isDev: boolean = process.env.NODE_ENV === \"development\";\r\n(window as any).isDev = isDev;\r\n// const devTools: JSX.Element | null = isDev ? : null;\r\n\r\nfunction renderApp() {\r\n\tReactDOM.render(, document.getElementById(\"root\"));\r\n}\r\n\r\nconst Init: React.FC = () => {\r\n\t//const { data, isLoading, isError, doRequest } = useDataApi(\"/api/initialstate/getinitialstatejson\");\r\n\t// const store = useContext(StoresContext);\r\n\r\n\t// if (isLoading) {\r\n\t// \t// EN: Delayed in code behind so we can see the loading text\r\n\t// \treturn ;\r\n\t// } else if (isError) {\r\n\t// \treturn (\r\n\t// \t\t\r\n\t// \t\t\tError!!!\r\n\t// \t\t\r\n\t// \t);\r\n\t// }\r\n\r\n\t// if (data !== null) {\r\n\t// \t// const { Provider, Consumer } = React.createContext(new StoresContext(data, history));\r\n\t// \tstore.init(data, history);\r\n\t// \treturn (\r\n\t// \t\t<>\r\n\t// \t\t\t\r\n\t// \t\t\t\t\r\n\t// \t\t\t\r\n\t// \t\t\r\n\t// \t);\r\n\t// }\r\n\t// return <>;\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nrenderApp();\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n\r\n// if ((module as any).hot) {\r\n// (module as any).hot.accept(\"./AppRoutes\", () => renderApp());\r\n// }\r\n"],"sourceRoot":""}