{"version":3,"sources":["components/api-authorization/ApiAuthorizationConstants.js","components/api-authorization/AuthorizeService.js","components/api-authorization/LoginMenu.js","components/NavMenu.js","components/Layout.js","components/PriceAction.js","components/api-authorization/AuthorizeRoute.js","components/api-authorization/Login.js","components/api-authorization/Logout.js","components/api-authorization/ApiAuthorizationRoutes.js","App.js","serviceWorkerRegistration.js","reportWebVitals.js","index.js"],"names":["ApplicationName","QueryParameterNames","LogoutActions","LoginActions","prefix","ApplicationPaths","DefaultLoginRedirectPath","ApiAuthorizationClientConfigurationUrl","ApiAuthorizationPrefix","Login","LoginFailed","LoginCallback","Register","Profile","LogOut","LoggedOut","LogOutCallback","IdentityRegisterPath","IdentityManagePath","AuthorizeService","_callbacks","_nextSubscriptionId","_user","_isAuthenticated","_popUpDisabled","a","this","getUser","user","profile","ensureUserManagerInitialized","userManager","access_token","state","signinSilent","createArguments","silentUser","updateState","success","console","log","Error","signinPopup","popUpUser","message","error","signinRedirect","redirect","url","signinCallback","signoutPopup","undefined","signoutRedirect","signoutCallback","response","data","notifySubscribers","callback","push","subscription","subscriptionId","subscriptionIndex","map","element","index","found","filter","length","splice","i","useReplaceToNavigate","status","AuthenticationResultStatus","Fail","Success","Redirect","fetch","ok","json","settings","automaticSilentRenew","includeIdTokenInSilentRenew","userStore","WebStorageStateStore","UserManager","events","addUserSignedOut","removeUser","authService","LoginMenu","props","isAuthenticated","userName","_subscription","subscribe","populateState","unsubscribe","Promise","all","setState","name","profilePath","logoutPath","pathname","local","authenticatedView","registerPath","loginPath","anonymousView","NavItem","NavLink","tag","Link","className","to","Component","NavMenu","toggleNavbar","bind","collapsed","Navbar","light","Container","NavbarBrand","NavbarToggler","onClick","Collapse","isOpen","navbar","displayName","Layout","fluid","children","PriceAction","prices","exchanges","loading","populatePriceData","populateExchangeData","contents","ex","id","exchange","renderPriceActionTable","p","exchangeId","priceDiff24BeforeAndAdded","reduce","totalPrice","price","priceDiffAddedAnd24After","priceDiffAddedAnd48After","priceDiffAddedAnd72After","priceDiffAddedAnd96After","priceDiffAddedAnd120After","getAccessToken","token","headers","beforeAndAddAvg","addAnd24HrAvg","addAnd48HrAvg","addAnd72HrAvg","addAnd96HrAvg","addAnd120HrAvg","labelledby","symbol","price24HoursBefore","style","color","priceWhenAdded","price24AfterHours","price48AfterHours","price72AfterHours","price96AfterHours","price120AfterHours","isNaN","Math","round","Number","EPSILON","AuthorizeRoute","ready","authenticated","authenticationChanged","populateAuthenticationState","link","document","createElement","href","path","returnUrl","protocol","host","search","hash","redirectUrl","encodeURIComponent","component","rest","render","action","login","getReturnUrl","processLoginCallback","URLSearchParams","window","location","get","redirectToProfile","redirectToRegister","signIn","result","navigateToReturnUrl","completeSignIn","fromQuery","startsWith","origin","redirectToApiAuthorizationPath","encodeURI","apiAuthorizationPath","replace","Logout","isReady","history","logout","processLogoutCallback","signOut","completeSignOut","ApiAuthorizationRoutes","loginAction","logoutAction","App","exact","Boolean","hostname","match","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","baseUrl","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","basename","navigator","serviceWorker","registration","unregister","catch"],"mappings":"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","file":"static/js/main.2ad43a28.chunk.js","sourcesContent":["export const ApplicationName = 'CryptoView';\n\nexport const QueryParameterNames = {\n ReturnUrl: 'returnUrl',\n Message: 'message'\n};\n\nexport const LogoutActions = {\n LogoutCallback: 'logout-callback',\n Logout: 'logout',\n LoggedOut: 'logged-out'\n};\n\nexport const LoginActions = {\n Login: 'login',\n LoginCallback: 'login-callback',\n LoginFailed: 'login-failed',\n Profile: 'profile',\n Register: 'register'\n};\n\nconst prefix = '/authentication';\n\nexport const ApplicationPaths = {\n DefaultLoginRedirectPath: '/',\n ApiAuthorizationClientConfigurationUrl: `_configuration/${ApplicationName}`,\n ApiAuthorizationPrefix: prefix,\n Login: `${prefix}/${LoginActions.Login}`,\n LoginFailed: `${prefix}/${LoginActions.LoginFailed}`,\n LoginCallback: `${prefix}/${LoginActions.LoginCallback}`,\n Register: `${prefix}/${LoginActions.Register}`,\n Profile: `${prefix}/${LoginActions.Profile}`,\n LogOut: `${prefix}/${LogoutActions.Logout}`,\n LoggedOut: `${prefix}/${LogoutActions.LoggedOut}`,\n LogOutCallback: `${prefix}/${LogoutActions.LogoutCallback}`,\n IdentityRegisterPath: 'Identity/Account/Register',\n IdentityManagePath: 'Identity/Account/Manage'\n};\n","import { UserManager, WebStorageStateStore } from 'oidc-client';\nimport { ApplicationPaths, ApplicationName } from './ApiAuthorizationConstants';\n\nexport class AuthorizeService {\n _callbacks = [];\n _nextSubscriptionId = 0;\n _user = null;\n _isAuthenticated = false;\n\n // By default pop ups are disabled because they don't work properly on Edge.\n // If you want to enable pop up authentication simply set this flag to false.\n _popUpDisabled = true;\n\n async isAuthenticated() {\n const user = await this.getUser();\n return !!user;\n }\n\n async getUser() {\n if (this._user && this._user.profile) {\n return this._user.profile;\n }\n\n await this.ensureUserManagerInitialized();\n const user = await this.userManager.getUser();\n return user && user.profile;\n }\n\n async getAccessToken() {\n await this.ensureUserManagerInitialized();\n const user = await this.userManager.getUser();\n return user && user.access_token;\n }\n\n // We try to authenticate the user in three different ways:\n // 1) We try to see if we can authenticate the user silently. This happens\n // when the user is already logged in on the IdP and is done using a hidden iframe\n // on the client.\n // 2) We try to authenticate the user using a PopUp Window. This might fail if there is a\n // Pop-Up blocker or the user has disabled PopUps.\n // 3) If the two methods above fail, we redirect the browser to the IdP to perform a traditional\n // redirect flow.\n async signIn(state) {\n await this.ensureUserManagerInitialized();\n try {\n const silentUser = await this.userManager.signinSilent(this.createArguments());\n this.updateState(silentUser);\n return this.success(state);\n } catch (silentError) {\n // User might not be authenticated, fallback to popup authentication\n console.log(\"Silent authentication error: \", silentError);\n\n try {\n if (this._popUpDisabled) {\n throw new Error('Popup disabled. Change \\'AuthorizeService.js:AuthorizeService._popupDisabled\\' to false to enable it.')\n }\n\n const popUpUser = await this.userManager.signinPopup(this.createArguments());\n this.updateState(popUpUser);\n return this.success(state);\n } catch (popUpError) {\n if (popUpError.message === \"Popup window closed\") {\n // The user explicitly cancelled the login action by closing an opened popup.\n return this.error(\"The user closed the window.\");\n } else if (!this._popUpDisabled) {\n console.log(\"Popup authentication error: \", popUpError);\n }\n\n // PopUps might be blocked by the user, fallback to redirect\n try {\n await this.userManager.signinRedirect(this.createArguments(state));\n return this.redirect();\n } catch (redirectError) {\n console.log(\"Redirect authentication error: \", redirectError);\n return this.error(redirectError);\n }\n }\n }\n }\n\n async completeSignIn(url) {\n try {\n await this.ensureUserManagerInitialized();\n const user = await this.userManager.signinCallback(url);\n this.updateState(user);\n return this.success(user && user.state);\n } catch (error) {\n console.log('There was an error signing in: ', error);\n return this.error('There was an error signing in.');\n }\n }\n\n // We try to sign out the user in two different ways:\n // 1) We try to do a sign-out using a PopUp Window. This might fail if there is a\n // Pop-Up blocker or the user has disabled PopUps.\n // 2) If the method above fails, we redirect the browser to the IdP to perform a traditional\n // post logout redirect flow.\n async signOut(state) {\n await this.ensureUserManagerInitialized();\n try {\n if (this._popUpDisabled) {\n throw new Error('Popup disabled. Change \\'AuthorizeService.js:AuthorizeService._popupDisabled\\' to false to enable it.')\n }\n\n await this.userManager.signoutPopup(this.createArguments());\n this.updateState(undefined);\n return this.success(state);\n } catch (popupSignOutError) {\n console.log(\"Popup signout error: \", popupSignOutError);\n try {\n await this.userManager.signoutRedirect(this.createArguments(state));\n return this.redirect();\n } catch (redirectSignOutError) {\n console.log(\"Redirect signout error: \", redirectSignOutError);\n return this.error(redirectSignOutError);\n }\n }\n }\n\n async completeSignOut(url) {\n await this.ensureUserManagerInitialized();\n try {\n const response = await this.userManager.signoutCallback(url);\n this.updateState(null);\n return this.success(response && response.data);\n } catch (error) {\n console.log(`There was an error trying to log out '${error}'.`);\n return this.error(error);\n }\n }\n\n updateState(user) {\n this._user = user;\n this._isAuthenticated = !!this._user;\n this.notifySubscribers();\n }\n\n subscribe(callback) {\n this._callbacks.push({ callback, subscription: this._nextSubscriptionId++ });\n return this._nextSubscriptionId - 1;\n }\n\n unsubscribe(subscriptionId) {\n const subscriptionIndex = this._callbacks\n .map((element, index) => element.subscription === subscriptionId ? { found: true, index } : { found: false })\n .filter(element => element.found === true);\n if (subscriptionIndex.length !== 1) {\n throw new Error(`Found an invalid number of subscriptions ${subscriptionIndex.length}`);\n }\n\n this._callbacks.splice(subscriptionIndex[0].index, 1);\n }\n\n notifySubscribers() {\n for (let i = 0; i < this._callbacks.length; i++) {\n const callback = this._callbacks[i].callback;\n callback();\n }\n }\n\n createArguments(state) {\n return { useReplaceToNavigate: true, data: state };\n }\n\n error(message) {\n return { status: AuthenticationResultStatus.Fail, message };\n }\n\n success(state) {\n return { status: AuthenticationResultStatus.Success, state };\n }\n\n redirect() {\n return { status: AuthenticationResultStatus.Redirect };\n }\n\n async ensureUserManagerInitialized() {\n if (this.userManager !== undefined) {\n return;\n }\n\n let response = await fetch(ApplicationPaths.ApiAuthorizationClientConfigurationUrl);\n if (!response.ok) {\n throw new Error(`Could not load settings for '${ApplicationName}'`);\n }\n\n let settings = await response.json();\n settings.automaticSilentRenew = true;\n settings.includeIdTokenInSilentRenew = true;\n settings.userStore = new WebStorageStateStore({\n prefix: ApplicationName\n });\n\n this.userManager = new UserManager(settings);\n\n this.userManager.events.addUserSignedOut(async () => {\n await this.userManager.removeUser();\n this.updateState(undefined);\n });\n }\n\n static get instance() { return authService }\n}\n\nconst authService = new AuthorizeService();\n\nexport default authService;\n\nexport const AuthenticationResultStatus = {\n Redirect: 'redirect',\n Success: 'success',\n Fail: 'fail'\n};\n","import React, { Component, Fragment } from 'react';\nimport { NavItem, NavLink } from 'reactstrap';\nimport { Link } from 'react-router-dom';\nimport authService from './AuthorizeService';\nimport { ApplicationPaths } from './ApiAuthorizationConstants';\n\nexport class LoginMenu extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n isAuthenticated: false,\n userName: null\n };\n }\n\n componentDidMount() {\n this._subscription = authService.subscribe(() => this.populateState());\n this.populateState();\n }\n\n componentWillUnmount() {\n authService.unsubscribe(this._subscription);\n }\n\n async populateState() {\n const [isAuthenticated, user] = await Promise.all([authService.isAuthenticated(), authService.getUser()])\n this.setState({\n isAuthenticated,\n userName: user && user.name\n });\n }\n\n render() {\n const { isAuthenticated, userName } = this.state;\n if (!isAuthenticated) {\n const registerPath = `${ApplicationPaths.Register}`;\n const loginPath = `${ApplicationPaths.Login}`;\n return this.anonymousView(registerPath, loginPath);\n } else {\n const profilePath = `${ApplicationPaths.Profile}`;\n const logoutPath = { pathname: `${ApplicationPaths.LogOut}`, state: { local: true } };\n return this.authenticatedView(userName, profilePath, logoutPath);\n }\n }\n\n authenticatedView(userName, profilePath, logoutPath) {\n return (\n \n {userName}\n \n \n Logout\n \n );\n\n }\n\n anonymousView(registerPath, loginPath) {\n return (\n {/**/}\n {/* Register*/}\n {/**/}\n \n Login\n \n );\n }\n}\n","import React, { Component } from 'react';\nimport {Collapse, Container, Navbar, NavbarBrand, NavbarToggler} from 'reactstrap';\nimport { Link } from 'react-router-dom';\nimport { LoginMenu } from './api-authorization/LoginMenu';\nimport './NavMenu.css';\n\nexport class NavMenu extends Component {\n static displayName = NavMenu.name;\n\n constructor(props) {\n super(props);\n\n this.toggleNavbar = this.toggleNavbar.bind(this);\n this.state = {\n collapsed: true\n };\n }\n\n toggleNavbar() {\n this.setState({\n collapsed: !this.state.collapsed\n });\n }\n\n render() {\n return (\n
\n \n \n Crypto Price Action View\n {/*Trade View*/}\n \n \n
    \n \n \n
\n
\n
\n
\n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport { Container } from 'reactstrap';\nimport { NavMenu } from './NavMenu';\n\nexport class Layout extends Component {\n static displayName = Layout.name;\n\n render () {\n return (\n
\n \n \n {this.props.children}\n \n
\n );\n }\n}\n","import React, { Component } from 'react';\nimport authService from './api-authorization/AuthorizeService'\n\nexport class PriceAction extends Component {\n static displayName = PriceAction.name;\n\n constructor(props) {\n super(props);\n this.state = { prices: [], exchanges: [], loading: true };\n }\n\n componentDidMount() {\n this.populatePriceData();\n this.populateExchangeData();\n }\n\n static renderPriceActionTable(\n exchange,\n prices,\n beforeAndAddAvg,\n addAnd24HrAvg,\n addAnd48HrAvg,\n addAnd72HrAvg,\n addAnd96HrAvg,\n addAnd120HrAvg,\n ) {\n return (\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {prices.map(price =>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n

{exchange.name}

Symbol24 Hrs beforePrice when listed24 Hrs48 Hrs72 Hrs96 Hrs120 Hrs
{price.symbol}${price.price24HoursBefore} 0 ? \"green\" : \"red\" }}>{price.priceDiff24BeforeAndAdded}%${price.priceWhenAdded} 0 ? \"green\" : \"red\" }}>{price.price24AfterHours !== 0 && price.price24AfterHours !== null ? price.priceDiffAddedAnd24After + \"%\" : \"\"}{price.price24AfterHours !== 0 && price.price24AfterHours !== null ? \"$\" + price.price24AfterHours : \"\"} 0 ? \"green\" : \"red\" }}>{price.price48AfterHours !== 0 && price.price48AfterHours !== null ? price.priceDiffAddedAnd48After + \"%\" : \"\"}{price.price48AfterHours !== 0 && price.price48AfterHours !== null ? \"$\" + price.price48AfterHours : \"\"} 0 ? \"green\" : \"red\" }}>{price.price72AfterHours !== 0 && price.price72AfterHours !== null ? price.priceDiffAddedAnd72After + \"%\" : \"\"}{price.price72AfterHours !== 0 && price.price72AfterHours !== null ? \"$\" + price.price72AfterHours : \"\"} 0 ? \"green\" : \"red\" }}>{price.price96AfterHours !== 0 && price.price96AfterHours !== null ? price.priceDiffAddedAnd96After + \"%\" : \"\"}{price.price96AfterHours !== 0 && price.price96AfterHours !== null ? \"$\" + price.price96AfterHours : \"\"} 0 ? \"green\" : \"red\" }}>{price.price120AfterHours !== 0 && price.price120AfterHours !== null ? price.priceDiffAddedAnd120After + \"%\" : \"\"}{price.price120AfterHours !== 0 && price.price120AfterHours !== null ? \"$\" + price.price120AfterHours : \"\"}
Average: 0 ? \"green\" : \"red\" }}>{isNaN(beforeAndAddAvg) ? \"\" : Math.round((beforeAndAddAvg + Number.EPSILON) * 100) / 100 + \"%\"} 0 ? \"green\" : \"red\" }}>{isNaN(addAnd24HrAvg) ? \"\" : Math.round((addAnd24HrAvg + Number.EPSILON) * 100) / 100 + \"%\"} 0 ? \"green\" : \"red\" }}>{isNaN(addAnd48HrAvg) ? \"\" : Math.round((addAnd48HrAvg + Number.EPSILON) * 100) / 100 + \"%\"} 0 ? \"green\" : \"red\" }}>{isNaN(addAnd72HrAvg) ? \"\" : Math.round((addAnd72HrAvg + Number.EPSILON) * 100) / 100 + \"%\"} 0 ? \"green\" : \"red\" }}>{isNaN(addAnd96HrAvg) ? \"\" : Math.round((addAnd96HrAvg + Number.EPSILON) * 100) / 100 + \"%\"} 0 ? \"green\" : \"red\" }}>{isNaN(addAnd120HrAvg) ? \"\" : Math.round((addAnd120HrAvg + Number.EPSILON) * 100) / 100 + \"%\"}
\n
\n );\n }\n\n render() {\n\n let contents = this.state.loading\n ?

Loading...

\n :\n this.state.exchanges\n .filter(ex => ex.id !== 1)\n .map(exchange =>\n PriceAction.renderPriceActionTable(\n exchange,\n this.state.prices.filter(p => p.exchangeId === exchange.id),\n (this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiff24BeforeAndAdded !== 0).reduce((totalPrice, price) => totalPrice + price.priceDiff24BeforeAndAdded, 0) / this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiff24BeforeAndAdded !== 0).length),\n (this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiffAddedAnd24After !== 0).reduce((totalPrice, price) => totalPrice + price.priceDiffAddedAnd24After, 0) / this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiffAddedAnd24After !== 0).length),\n (this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiffAddedAnd48After !== 0).reduce((totalPrice, price) => totalPrice + price.priceDiffAddedAnd48After, 0) / this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiffAddedAnd48After !== 0).length),\n (this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiffAddedAnd72After !== 0).reduce((totalPrice, price) => totalPrice + price.priceDiffAddedAnd72After, 0) / this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiffAddedAnd72After !== 0).length),\n (this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiffAddedAnd96After !== 0).reduce((totalPrice, price) => totalPrice + price.priceDiffAddedAnd96After, 0) / this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiffAddedAnd96After !== 0).length),\n (this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiffAddedAnd120After !== 0).reduce((totalPrice, price) => totalPrice + price.priceDiffAddedAnd120After, 0) / this.state.prices.filter(p => p.exchangeId === exchange.id && p.priceDiffAddedAnd120After !== 0).length)\n )\n );\n\n return (\n
\n {/*

Price Action

*/}\n {contents}\n
\n );\n }\n\n async populatePriceData() {\n const token = await authService.getAccessToken();\n const response = await fetch('priceaction', {\n headers: !token ? {} : { 'Authorization': `Bearer ${token}` }\n });\n const data = await response.json();\n this.setState({ prices: data, loading: false });\n }\n\n async populateExchangeData() {\n const token = await authService.getAccessToken();\n const response = await fetch('exchange', {\n headers: !token ? {} : { 'Authorization': `Bearer ${token}` }\n });\n const data = await response.json();\n this.setState({ exchanges: data, loading: false });\n }\n}\n","import React from 'react'\nimport { Component } from 'react'\nimport { Route, Redirect } from 'react-router-dom'\nimport { ApplicationPaths, QueryParameterNames } from './ApiAuthorizationConstants'\nimport authService from './AuthorizeService'\n\nexport default class AuthorizeRoute extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n ready: false,\n authenticated: false\n };\n }\n\n componentDidMount() {\n this._subscription = authService.subscribe(() => this.authenticationChanged());\n this.populateAuthenticationState();\n }\n\n componentWillUnmount() {\n authService.unsubscribe(this._subscription);\n }\n\n render() {\n const { ready, authenticated } = this.state;\n var link = document.createElement(\"a\");\n link.href = this.props.path;\n const returnUrl = `${link.protocol}//${link.host}${link.pathname}${link.search}${link.hash}`;\n const redirectUrl = `${ApplicationPaths.Login}?${QueryParameterNames.ReturnUrl}=${encodeURIComponent(returnUrl)}`\n if (!ready) {\n return
;\n } else {\n const { component: Component, ...rest } = this.props;\n return {\n if (authenticated) {\n return \n } else {\n return \n }\n }} />\n }\n }\n\n async populateAuthenticationState() {\n const authenticated = await authService.isAuthenticated();\n this.setState({ ready: true, authenticated });\n }\n\n async authenticationChanged() {\n this.setState({ ready: false, authenticated: false });\n await this.populateAuthenticationState();\n }\n}\n","import React from 'react'\nimport { Component } from 'react';\nimport authService from './AuthorizeService';\nimport { AuthenticationResultStatus } from './AuthorizeService';\nimport { LoginActions, QueryParameterNames, ApplicationPaths } from './ApiAuthorizationConstants';\n\n// The main responsibility of this component is to handle the user's login process.\n// This is the starting point for the login process. Any component that needs to authenticate\n// a user can simply perform a redirect to this component with a returnUrl query parameter and\n// let the component perform the login and return back to the return url.\nexport class Login extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n message: undefined\n };\n }\n\n componentDidMount() {\n const action = this.props.action;\n switch (action) {\n case LoginActions.Login:\n this.login(this.getReturnUrl());\n break;\n case LoginActions.LoginCallback:\n this.processLoginCallback();\n break;\n case LoginActions.LoginFailed:\n const params = new URLSearchParams(window.location.search);\n const error = params.get(QueryParameterNames.Message);\n this.setState({ message: error });\n break;\n case LoginActions.Profile:\n this.redirectToProfile();\n break;\n case LoginActions.Register:\n this.redirectToRegister();\n break;\n default:\n throw new Error(`Invalid action '${action}'`);\n }\n }\n\n render() {\n const action = this.props.action;\n const { message } = this.state;\n\n if (!!message) {\n return
{message}
\n } else {\n switch (action) {\n case LoginActions.Login:\n return (
Processing login
);\n case LoginActions.LoginCallback:\n return (
Processing login callback
);\n case LoginActions.Profile:\n case LoginActions.Register:\n return (
);\n default:\n throw new Error(`Invalid action '${action}'`);\n }\n }\n }\n\n async login(returnUrl) {\n const state = { returnUrl };\n const result = await authService.signIn(state);\n switch (result.status) {\n case AuthenticationResultStatus.Redirect:\n break;\n case AuthenticationResultStatus.Success:\n await this.navigateToReturnUrl(returnUrl);\n break;\n case AuthenticationResultStatus.Fail:\n this.setState({ message: result.message });\n break;\n default:\n throw new Error(`Invalid status result ${result.status}.`);\n }\n }\n\n async processLoginCallback() {\n const url = window.location.href;\n const result = await authService.completeSignIn(url);\n switch (result.status) {\n case AuthenticationResultStatus.Redirect:\n // There should not be any redirects as the only time completeSignIn finishes\n // is when we are doing a redirect sign in flow.\n throw new Error('Should not redirect.');\n case AuthenticationResultStatus.Success:\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\n break;\n case AuthenticationResultStatus.Fail:\n this.setState({ message: result.message });\n break;\n default:\n throw new Error(`Invalid authentication result status '${result.status}'.`);\n }\n }\n\n getReturnUrl(state) {\n const params = new URLSearchParams(window.location.search);\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\n // This is an extra check to prevent open redirects.\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\")\n }\n return (state && state.returnUrl) || fromQuery || `${window.location.origin}/`;\n }\n\n redirectToRegister() {\n this.redirectToApiAuthorizationPath(`${ApplicationPaths.IdentityRegisterPath}?${QueryParameterNames.ReturnUrl}=${encodeURI(ApplicationPaths.Login)}`);\n }\n\n redirectToProfile() {\n this.redirectToApiAuthorizationPath(ApplicationPaths.IdentityManagePath);\n }\n\n redirectToApiAuthorizationPath(apiAuthorizationPath) {\n const redirectUrl = `${window.location.origin}/${apiAuthorizationPath}`;\n // It's important that we do a replace here so that when the user hits the back arrow on the\n // browser they get sent back to where it was on the app instead of to an endpoint on this\n // component.\n window.location.replace(redirectUrl);\n }\n\n navigateToReturnUrl(returnUrl) {\n // It's important that we do a replace here so that we remove the callback uri with the\n // fragment containing the tokens from the browser history.\n window.location.replace(returnUrl);\n }\n}\n","import React from 'react'\nimport { Component } from 'react';\nimport authService from './AuthorizeService';\nimport { AuthenticationResultStatus } from './AuthorizeService';\nimport { QueryParameterNames, LogoutActions, ApplicationPaths } from './ApiAuthorizationConstants';\n\n// The main responsibility of this component is to handle the user's logout process.\n// This is the starting point for the logout process, which is usually initiated when a\n// user clicks on the logout button on the LoginMenu component.\nexport class Logout extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n message: undefined,\n isReady: false,\n authenticated: false\n };\n }\n\n componentDidMount() {\n const action = this.props.action;\n switch (action) {\n case LogoutActions.Logout:\n if (!!window.history.state.state.local) {\n this.logout(this.getReturnUrl());\n } else {\n // This prevents regular links to /authentication/logout from triggering a logout\n this.setState({ isReady: true, message: \"The logout was not initiated from within the page.\" });\n }\n break;\n case LogoutActions.LogoutCallback:\n this.processLogoutCallback();\n break;\n case LogoutActions.LoggedOut:\n this.setState({ isReady: true, message: \"You successfully logged out!\" });\n break;\n default:\n throw new Error(`Invalid action '${action}'`);\n }\n\n this.populateAuthenticationState();\n }\n\n render() {\n const { isReady, message } = this.state;\n if (!isReady) {\n return
\n }\n if (!!message) {\n return (
{message}
);\n } else {\n const action = this.props.action;\n switch (action) {\n case LogoutActions.Logout:\n return (
Processing logout
);\n case LogoutActions.LogoutCallback:\n return (
Processing logout callback
);\n case LogoutActions.LoggedOut:\n return (
{message}
);\n default:\n throw new Error(`Invalid action '${action}'`);\n }\n }\n }\n\n async logout(returnUrl) {\n const state = { returnUrl };\n const isauthenticated = await authService.isAuthenticated();\n if (isauthenticated) {\n const result = await authService.signOut(state);\n switch (result.status) {\n case AuthenticationResultStatus.Redirect:\n break;\n case AuthenticationResultStatus.Success:\n await this.navigateToReturnUrl(returnUrl);\n break;\n case AuthenticationResultStatus.Fail:\n this.setState({ message: result.message });\n break;\n default:\n throw new Error(\"Invalid authentication result status.\");\n }\n } else {\n this.setState({ message: \"You successfully logged out!\" });\n }\n }\n\n async processLogoutCallback() {\n const url = window.location.href;\n const result = await authService.completeSignOut(url);\n switch (result.status) {\n case AuthenticationResultStatus.Redirect:\n // There should not be any redirects as the only time completeAuthentication finishes\n // is when we are doing a redirect sign in flow.\n throw new Error('Should not redirect.');\n case AuthenticationResultStatus.Success:\n await this.navigateToReturnUrl(this.getReturnUrl(result.state));\n break;\n case AuthenticationResultStatus.Fail:\n this.setState({ message: result.message });\n break;\n default:\n throw new Error(\"Invalid authentication result status.\");\n }\n }\n\n async populateAuthenticationState() {\n const authenticated = await authService.isAuthenticated();\n this.setState({ isReady: true, authenticated });\n }\n\n getReturnUrl(state) {\n const params = new URLSearchParams(window.location.search);\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\n // This is an extra check to prevent open redirects.\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\")\n }\n return (state && state.returnUrl) ||\n fromQuery ||\n `${window.location.origin}${ApplicationPaths.LoggedOut}`;\n }\n\n navigateToReturnUrl(returnUrl) {\n return window.location.replace(returnUrl);\n }\n}\n","import React, { Component, Fragment } from 'react';\nimport { Route } from 'react-router';\nimport { Login } from './Login'\nimport { Logout } from './Logout'\nimport { ApplicationPaths, LoginActions, LogoutActions } from './ApiAuthorizationConstants';\n\nexport default class ApiAuthorizationRoutes extends Component {\n\n render () {\n return(\n \n loginAction(LoginActions.Login)} />\n loginAction(LoginActions.LoginFailed)} />\n loginAction(LoginActions.LoginCallback)} />\n loginAction(LoginActions.Profile)} />\n loginAction(LoginActions.Register)} />\n logoutAction(LogoutActions.Logout)} />\n logoutAction(LogoutActions.LogoutCallback)} />\n logoutAction(LogoutActions.LoggedOut)} />\n );\n }\n}\n\nfunction loginAction(name){\n return ();\n}\n\nfunction logoutAction(name) {\n return ();\n}\n","import React, { Component } from 'react';\nimport { Route } from 'react-router';\nimport { Layout } from './components/Layout';\nimport { PriceAction } from './components/PriceAction';\n//import { TradeView } from './components/TradeView';\nimport AuthorizeRoute from './components/api-authorization/AuthorizeRoute';\nimport ApiAuthorizationRoutes from './components/api-authorization/ApiAuthorizationRoutes';\nimport { ApplicationPaths } from './components/api-authorization/ApiAuthorizationConstants';\n\nimport './custom.css'\n\nexport default class App extends Component {\n static displayName = App.name;\n\n render () {\n return (\n \n \n {/**/}\n \n \n );\n }\n}\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(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://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, 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, 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('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","const reportWebVitals = (onPerfEntry) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import 'bootstrap/dist/css/bootstrap.css';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter } from 'react-router-dom';\nimport App from './App';\nimport * as serviceWorkerRegistration from './serviceWorkerRegistration';\nimport reportWebVitals from './reportWebVitals';\n\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\nconst rootElement = document.getElementById('root');\n\nReactDOM.render(\n \n \n ,\n rootElement);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://cra.link/PWA\nserviceWorkerRegistration.unregister();\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}