{"version":3,"sources":["config.ts","components/CCP.tsx","components/ContactDetails.tsx","components/CallLog.tsx","components/QueueMetrics.tsx","components/PeerStatus.tsx","components/Metrics.tsx","App.tsx","index.tsx"],"names":["config","apiGateway","REGION","WSS_URL","cognito","USER_POOL_ID","APP_CLIENT_ID","IDENTITY_POOL_ID","DOMAIN","SCOPE","REDIRECT_SIGN_IN","REDIRECT_SIGN_OUT","RESPONSE_TYPE","connect","CCP_URL","SAML_LOGIN_URL","CCP","useEffect","window","core","initialized","console","log","initCCP","document","getElementById","ccpUrl","region","loginUrl","loginPopup","loginPopupAutoClose","softphone","allowFramedSoftphone","id","style","display","ContactDetails","contact","Object","keys","length","Table","basic","Body","map","attr","i","Row","key","Cell","renderRows","Segment","CallLog","callLog","Header","HeaderCell","call","Phonenumber","Date","ConnectedTimestamp","toLocaleTimeString","parseInt","Duration","toISOString","substr","Type","QueueMetrics","queues","queue","Queue","ContactsQueued","WaitTime","PeerStatus","agents","agent","FirstName","LastName","Status","charAt","toUpperCase","slice","toLowerCase","includes","Metrics","useState","activeIndex","setActiveIndex","setContact","setCallLog","setQueues","setAgents","token","setToken","name","username","routingProfile","user","setUser","retries","setRetries","ws","useRef","refreshTokens","startWSS","current","close","refreshUser","onmessage","event","response","JSON","parse","data","handleResponse","subscribeConnectEvents","location","reload","Auth","currentSession","then","session","getAccessToken","getJwtToken","subscribe","action","params","AgentUsername","WebSocket","URLSearchParams","toString","join","onopen","send","stringify","onclose","setTimeout","onerror","WBS","handleQueues","handleAgents","handleCallLog","init","Items","filter","isRelevantQueue","index","findIndex","replaceAndReturn","department","noOfflineAgents","isRelevantAgent","findMyDepartmentFirst","newAgentsState","array","newValue","newArray","splice","isOnlineAgent","dateSort","calls","sort","callA","callB","RoutingProfile","getAgentDepartment","myDepartment","forEach","HierarchyLevel1","HierarchyLevel2","subscribeContactEvents","subscribeAgentEvents","onConnecting","contactId","contactAttributes","getAttributes","value","Phone","getActiveInitialConnection","getEndpoint","phoneNumber","onEnded","agentConfig","getConfiguration","userAgentDetails","onAfterCallWork","undefined","handleClick","Number","Accordion","styled","Title","active","onClick","Content","App","signedIn","auth","setAuth","redirect","Hub","listen","payload","clearTimeout","currentAuthenticatedUser","catch","federatedSignIn","search","Grid","Loader","size","Amplify","configure","mandatorySignIn","userPoolId","identityPoolId","userPoolWebClientId","oauth","domain","scope","redirectSignIn","redirectSignOut","responseType","ReactDOM","render"],"mappings":"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","file":"static/js/main.0d77ad0c.chunk.js","sourcesContent":["// config file built according to format here https://serverless-stack.com/chapters/manage-environments-in-create-react-app.html\r\n\r\nconst redirect = (url: string) => {\r\n if (process.env.NODE_ENV === 'development') {\r\n return 'http://localhost:3000';\r\n }\r\n return url;\r\n};\r\n\r\n// frontend stage is determined by process.env.NODE_ENV and defaults to 'development' unless npm run build command is executed (then it's 'production')\r\n// AWS backend variables listed here will be determined based on backend stage which will be controlled manually by environment variable REACT_APP_BACKEND_STAGE (defaults to 'dev')\r\n\r\nconst dev = {\r\n apiGateway: {\r\n REGION: 'us-west-2',\r\n WSS_URL: 'wss://3fuopisubg.execute-api.us-west-2.amazonaws.com/dev',\r\n },\r\n cognito: {\r\n REGION: 'us-west-2',\r\n USER_POOL_ID: 'us-west-2_tU8zVvjQB',\r\n APP_CLIENT_ID: '1aqnafcg0fqg07p390vg1nkjrk',\r\n IDENTITY_POOL_ID: 'us-west-2:91c9026e-1d51-47d8-aaa8-4acb72ade28d',\r\n DOMAIN:\r\n 'uarizona-connect-ccp-auth-domain-dev.auth.us-west-2.amazoncognito.com',\r\n SCOPE: ['email', 'openid', 'profile'],\r\n REDIRECT_SIGN_IN: redirect('https://d2esy5cpy6wdjo.cloudfront.net'),\r\n REDIRECT_SIGN_OUT: redirect('https://d2esy5cpy6wdjo.cloudfront.net'),\r\n RESPONSE_TYPE: 'code', // 'code' or 'token', note that REFRESH token will only be generated when the responseType is code\r\n },\r\n connect: {\r\n REGION: 'us-west-2',\r\n CCP_URL: 'https://dev-uarizona-contactcenter.awsapps.com/connect/ccp-v2/',\r\n SAML_LOGIN_URL:\r\n 'https://shibboleth.arizona.edu/idp/profile/SAML2/Unsolicited/SSO?providerId=urn:amazon:webservices&target=https://us-west-2.console.aws.amazon.com/connect/federate/3a7ce935-1f3e-443c-9c40-84778e578679',\r\n },\r\n};\r\n\r\nconst prod = {\r\n apiGateway: {\r\n REGION: 'us-west-2',\r\n WSS_URL: 'wss://2w8g6dfyi7.execute-api.us-west-2.amazonaws.com/prod',\r\n },\r\n cognito: {\r\n REGION: 'us-west-2',\r\n USER_POOL_ID: 'us-west-2_5uceaDQpU',\r\n APP_CLIENT_ID: 'ijuc11d0pv85n0nck3ib64401',\r\n IDENTITY_POOL_ID: 'us-west-2:a95ee449-4cfe-4df0-90eb-d1c2e540912a',\r\n DOMAIN:\r\n 'uarizona-connect-ccp-auth-domain-prod.auth.us-west-2.amazoncognito.com',\r\n SCOPE: ['email', 'openid', 'profile'], // oauth scopes\r\n REDIRECT_SIGN_IN: redirect('https://d2wr3lxb5ctyhr.cloudfront.net'), // URL of the app/cloudfront-distribution should go here\r\n REDIRECT_SIGN_OUT: redirect('https://d2wr3lxb5ctyhr.cloudfront.net'), // Same as above unless there is a specific logout route\r\n RESPONSE_TYPE: 'code', // 'code' or 'token', note that REFRESH token will only be generated when the responseType is code\r\n },\r\n connect: {\r\n REGION: 'us-west-2',\r\n CCP_URL: 'https://uarizona-contactcenter.awsapps.com/connect/ccp-v2/',\r\n SAML_LOGIN_URL:\r\n 'https://shibboleth.arizona.edu/idp/profile/SAML2/Unsolicited/SSO?providerId=urn:amazon:webservices&target=https://us-west-2.console.aws.amazon.com/connect/federate/6d380d56-36ed-4d63-8342-e59e44ce841e',\r\n },\r\n};\r\n\r\n// Default to dev if not set\r\nconst config = process.env.REACT_APP_BACKEND_STAGE === 'prod' ? prod : dev;\r\n\r\nexport default {\r\n // Add common config values here\r\n // MAX_ATTACHMENT_SIZE: 5000000,\r\n ...config,\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport config from '../config';\r\n\r\ndeclare const window: any;\r\n\r\nconst CCP: React.FC = () => {\r\n const containerID: string = 'ccpContainer';\r\n\r\n useEffect(() => {\r\n const connect = window.connect;\r\n const {\r\n connect: { CCP_URL, REGION, SAML_LOGIN_URL }\r\n } = config;\r\n\r\n if (!connect.core.initialized) {\r\n console.log('Connect initialization started', CCP_URL);\r\n connect.core.initCCP(document.getElementById(containerID), {\r\n ccpUrl: CCP_URL,\r\n region: REGION,\r\n loginUrl: SAML_LOGIN_URL,\r\n loginPopup: true,\r\n loginPopupAutoClose: true,\r\n softphone: {\r\n allowFramedSoftphone: true\r\n }\r\n });\r\n } else {\r\n console.log('Connect Already Initialized!');\r\n }\r\n }, []);\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default CCP;\r\n","import React from 'react';\r\nimport { Table, Segment } from 'semantic-ui-react';\r\nimport { IContact } from '../interfaces';\r\n\r\ninterface IProps {\r\n contact: IContact | {};\r\n}\r\n\r\nconst ContactDetails = ({ contact }: IProps): JSX.Element => {\r\n function renderRows(contact: IContact | any): any {\r\n return Object.keys(contact).map((attr, i) => {\r\n return (\r\n \r\n {attr}\r\n {contact[attr]}\r\n \r\n );\r\n });\r\n }\r\n\r\n if (!Object.keys(contact).length) return No Active Contact;\r\n\r\n return (\r\n \r\n {renderRows(contact)}\r\n
\r\n );\r\n};\r\n\r\nexport default ContactDetails;\r\n","import React from 'react';\r\nimport { Table } from 'semantic-ui-react';\r\nimport { ICall } from '../interfaces';\r\n\r\ninterface IProps {\r\n callLog: ICall[];\r\n}\r\n\r\nconst CallLog = ({ callLog }: IProps): JSX.Element => {\r\n function renderRows(callLog: ICall[]): JSX.Element[] {\r\n return callLog.map((call: ICall, i: number) => {\r\n return (\r\n \r\n {call.Phonenumber}\r\n \r\n {new Date(call.ConnectedTimestamp).toLocaleTimeString()}\r\n \r\n {/* Duration is in seconds */}\r\n \r\n {new Date(1000 * parseInt(call.Duration))\r\n .toISOString()\r\n .substr(11, 8)}\r\n \r\n {call.Type}\r\n \r\n );\r\n });\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n Phone\r\n Start\r\n Duration\r\n Type\r\n \r\n \r\n {renderRows(callLog)}\r\n
\r\n );\r\n};\r\n\r\nexport default CallLog;\r\n","import React from 'react';\r\nimport { Table } from 'semantic-ui-react';\r\nimport { IQueue } from '../interfaces';\r\n\r\ninterface IProps {\r\n queues: IQueue[];\r\n}\r\n\r\nconst QueueMetrics = ({ queues }: IProps): JSX.Element => {\r\n function renderRows(queues: IQueue[]): JSX.Element[] {\r\n return queues.map((queue: IQueue, i: number) => {\r\n return (\r\n \r\n {queue.Queue}\r\n {queue.ContactsQueued}\r\n {/* WaitTime is in milliseconds */}\r\n \r\n {new Date(parseInt(queue.WaitTime)).toISOString().substr(11, 8)}\r\n \r\n \r\n );\r\n });\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n Queue\r\n Contacts Waiting\r\n Wait Time\r\n \r\n \r\n {renderRows(queues)}\r\n
\r\n );\r\n};\r\n\r\nexport default QueueMetrics;\r\n","import React from 'react';\r\nimport { Table } from 'semantic-ui-react';\r\nimport { IAgent } from '../interfaces';\r\n\r\ninterface IProps {\r\n agents: IAgent[];\r\n}\r\n\r\nconst PeerStatus = ({ agents }: IProps): JSX.Element => {\r\n function renderRows(agents: IAgent[]): JSX.Element[] {\r\n return agents.map((agent: IAgent, i: number) => {\r\n return (\r\n \r\n \r\n {agent.FirstName} {agent.LastName}\r\n \r\n \r\n {agent.Status.charAt(0).toUpperCase() +\r\n agent.Status.slice(1).toLowerCase()}\r\n \r\n \r\n {['CONNECTED', 'CONNECTING'].includes(agent.Status.toUpperCase())\r\n ? agent.Queue\r\n : ''}\r\n \r\n \r\n );\r\n });\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n Name\r\n Status\r\n Active Queue\r\n \r\n \r\n {renderRows(agents)}\r\n
\r\n );\r\n};\r\n\r\nexport default PeerStatus;\r\n","import React, { useState, useEffect, useRef } from 'react';\r\nimport { Accordion, AccordionTitleProps } from 'semantic-ui-react';\r\nimport ContactDetails from './ContactDetails';\r\nimport CallLog from './CallLog';\r\nimport QueueMetrics from './QueueMetrics';\r\nimport PeerStatus from './PeerStatus';\r\nimport { IAgent, ICall, IQueue, IContact, IUser } from '../interfaces';\r\nimport { Auth } from 'aws-amplify';\r\nimport { CognitoUserSession } from 'amazon-cognito-identity-js';\r\nimport config from '../config';\r\n\r\ndeclare const window: any;\r\n\r\nconst Metrics: React.FC = () => {\r\n const [activeIndex, setActiveIndex] = useState(3);\r\n const [contact, setContact] = useState({});\r\n const [callLog, setCallLog] = useState([]);\r\n const [queues, setQueues] = useState([]);\r\n const [agents, setAgents] = useState([]);\r\n const [token, setToken] = useState('');\r\n const [user, setUser] = useState({\r\n name: '',\r\n username: '',\r\n routingProfile: '',\r\n queues: [],\r\n });\r\n const [retries, setRetries] = useState(0);\r\n\r\n const ws = useRef();\r\n const uiBlockerID: string = 'block-clear-contact';\r\n\r\n useEffect(() => {\r\n refreshTokens();\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!user.username || !token) return;\r\n\r\n if (retries > 30) {\r\n refreshUser();\r\n return;\r\n }\r\n\r\n startWSS(user.username, token);\r\n\r\n return () => {\r\n ws.current.close();\r\n console.log('Closed connection');\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [user.username, retries]);\r\n\r\n useEffect(() => {\r\n if (ws.current) {\r\n ws.current.onmessage = (event: MessageEvent) => {\r\n const response = JSON.parse(event.data);\r\n console.log(response);\r\n\r\n handleResponse(response);\r\n };\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [callLog, agents, queues, user, retries]);\r\n\r\n useEffect(() => {\r\n subscribeConnectEvents();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const refreshUser = () => {\r\n console.log('Refreshing page for user');\r\n window.location.reload();\r\n };\r\n\r\n const refreshTokens = () => {\r\n console.log('Refreshing user access tokens');\r\n Auth.currentSession().then((session: CognitoUserSession) => {\r\n setToken(session.getAccessToken().getJwtToken());\r\n });\r\n };\r\n\r\n const startWSS = (username: string, token: string) => {\r\n const subscribe = { action: 'init' };\r\n const params = {\r\n AgentUsername: username,\r\n token,\r\n };\r\n\r\n ws.current = new WebSocket(\r\n [config.apiGateway.WSS_URL, new URLSearchParams(params).toString()].join(\r\n '?'\r\n )\r\n );\r\n\r\n ws.current.onopen = () => {\r\n ws.current.send(JSON.stringify(subscribe));\r\n console.log('Subscribing to WSS');\r\n };\r\n\r\n ws.current.onclose = () => {\r\n console.log('WSS has lost connection.');\r\n ws.current.close();\r\n\r\n refreshTokens();\r\n setTimeout(() => setRetries(retries + 1), 20000);\r\n };\r\n\r\n ws.current.onerror = () => {\r\n console.log('There was an error');\r\n };\r\n\r\n window.WBS = ws.current;\r\n };\r\n\r\n const handleResponse = (response: MessageEvent['data']) => {\r\n // console.log(user);\r\n switch (response.Table) {\r\n case 'QueueMetrics':\r\n handleQueues(response);\r\n break;\r\n case 'AgentMetrics':\r\n handleAgents(response);\r\n break;\r\n case 'AgentCallLog':\r\n handleCallLog(response);\r\n break;\r\n default:\r\n console.log('Unrecognized message from websocket', response);\r\n }\r\n };\r\n\r\n const handleQueues = (response: MessageEvent['data']) => {\r\n if (response.init) {\r\n setQueues(response.Items.filter(isRelevantQueue));\r\n return;\r\n }\r\n\r\n if (isRelevantQueue(response)) {\r\n // replace queue in current array, if present\r\n const index = queues.findIndex(\r\n (queue: IQueue) => queue.Queue === response.Queue\r\n );\r\n\r\n if (index === -1) {\r\n setQueues([response, ...queues]);\r\n return;\r\n }\r\n\r\n setQueues(replaceAndReturn(queues, index, response));\r\n }\r\n };\r\n\r\n const handleAgents = (response: MessageEvent['data']) => {\r\n if (response.init) {\r\n !user.department\r\n ? findMyDepartmentFirst(response.Items)\r\n : setAgents(noOfflineAgents(response.Items.filter(isRelevantAgent)));\r\n return;\r\n }\r\n\r\n if (isRelevantAgent(response)) {\r\n let newAgentsState: IAgent[];\r\n // replace agent in current array, if present\r\n const index = agents.findIndex(\r\n (agent: IAgent) => agent.AgentUsername === response.AgentUsername\r\n );\r\n\r\n if (index === -1) {\r\n newAgentsState = [response, ...agents];\r\n } else {\r\n newAgentsState = replaceAndReturn(agents, index, response);\r\n }\r\n\r\n setAgents(noOfflineAgents(newAgentsState));\r\n }\r\n };\r\n\r\n const replaceAndReturn = (\r\n array: any[],\r\n index: number,\r\n newValue: any\r\n ): any[] => {\r\n const newArray = array.slice();\r\n newArray.splice(index, 1, newValue);\r\n return newArray;\r\n };\r\n\r\n const noOfflineAgents = (agents: IAgent[]): IAgent[] => {\r\n return agents.filter((agent: IAgent) => isOnlineAgent(agent));\r\n };\r\n\r\n const handleCallLog = (response: MessageEvent['data']) => {\r\n if (response.init) {\r\n setCallLog(dateSort(response.Items));\r\n return;\r\n }\r\n\r\n setCallLog([response, ...callLog]);\r\n };\r\n\r\n const dateSort = (calls: ICall[]): ICall[] => {\r\n return calls.slice().sort((callA: ICall, callB: ICall): number => {\r\n return new Date(callA.ConnectedTimestamp) <\r\n new Date(callB.ConnectedTimestamp)\r\n ? 1\r\n : -1;\r\n });\r\n };\r\n\r\n const isRelevantQueue = (queue: IQueue) => {\r\n return user.queues.includes(queue.Queue);\r\n };\r\n\r\n const isRelevantAgent = (agent: IAgent) => {\r\n return (\r\n user.routingProfile === agent.RoutingProfile ||\r\n user.department === getAgentDepartment(agent)\r\n );\r\n };\r\n\r\n const isOnlineAgent = (agent: IAgent) => {\r\n return agent.Status !== 'Offline';\r\n };\r\n\r\n const findMyDepartmentFirst = (agents: IAgent[]) => {\r\n let myDepartment: string;\r\n // loop once through agents to find my agent profile and department\r\n agents.forEach((agent: IAgent) => {\r\n if (agent.AgentUsername === user.username) {\r\n // once user agent data found, set user's department and filter relevant agents\r\n myDepartment = getAgentDepartment(agent);\r\n setUser({ ...user, department: myDepartment });\r\n setAgents(\r\n noOfflineAgents(\r\n agents.filter((agent: IAgent) => {\r\n return (\r\n user.routingProfile === agent.RoutingProfile ||\r\n myDepartment === getAgentDepartment(agent)\r\n );\r\n })\r\n )\r\n );\r\n return; // return early\r\n }\r\n });\r\n };\r\n\r\n const getAgentDepartment = (agent: IAgent): string => {\r\n return [agent.HierarchyLevel1, agent.HierarchyLevel2].join('/');\r\n };\r\n\r\n const subscribeConnectEvents = () => {\r\n if (window.connect.core.initialized) {\r\n subscribeContactEvents();\r\n subscribeAgentEvents();\r\n } else {\r\n console.log('Connect not yet initialized, waiting to subscribe events');\r\n setTimeout(subscribeConnectEvents, 1000);\r\n }\r\n };\r\n\r\n const subscribeContactEvents = () => {\r\n console.log('Subscribing to Connect Contact Events');\r\n window.connect.contact((contact: any) => {\r\n contact.onConnecting((contact: any) => {\r\n console.log('Connecting to contact:', contact.contactId);\r\n\r\n const contactAttributes = contact.getAttributes();\r\n Object.keys(contactAttributes).forEach((key) => {\r\n contactAttributes[key] = contactAttributes[key].value;\r\n });\r\n contactAttributes.Phone = contact\r\n .getActiveInitialConnection()\r\n .getEndpoint().phoneNumber;\r\n console.log(JSON.stringify(contactAttributes));\r\n\r\n setContact(contactAttributes);\r\n });\r\n\r\n contact.onEnded(() => {\r\n console.log('Call ended', contact.contactId);\r\n setContact({});\r\n });\r\n });\r\n };\r\n\r\n const subscribeAgentEvents = () => {\r\n console.log('Subscribing to Connect Agent Events');\r\n window.connect.agent((agent: any) => {\r\n const agentConfig = agent.getConfiguration();\r\n const userAgentDetails: IUser = {\r\n name: agentConfig.name,\r\n username: agentConfig.username,\r\n routingProfile: agentConfig.routingProfile.name,\r\n queues: agentConfig.routingProfile.queues.map(\r\n (queue: any) => queue.name\r\n ),\r\n };\r\n\r\n setUser(userAgentDetails);\r\n\r\n agent.onAfterCallWork((agent: any) => {\r\n window.document.getElementById(uiBlockerID).style = undefined;\r\n console.log(\r\n 'On after call work, blocking \"clear contact\" for 3 seconds'\r\n );\r\n setTimeout(() => {\r\n window.document.getElementById(uiBlockerID).style.display = 'none';\r\n }, 3000);\r\n });\r\n });\r\n };\r\n\r\n function handleClick(\r\n event: React.MouseEvent,\r\n data: AccordionTitleProps\r\n ): void {\r\n const { index } = data;\r\n\r\n setActiveIndex(Number(index));\r\n }\r\n return (\r\n \r\n \r\n Contact Details\r\n \r\n \r\n \r\n \r\n\r\n \r\n Call Log ({callLog.length})\r\n \r\n \r\n \r\n \r\n\r\n \r\n Queue Metrics ({queues.length})\r\n \r\n \r\n \r\n \r\n \r\n Peer Status ({agents.length})\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default Metrics;\r\n","import { CognitoUser } from 'amazon-cognito-identity-js';\r\nimport { Auth, Hub } from 'aws-amplify';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Grid, Loader } from 'semantic-ui-react';\r\nimport CCP from './components/CCP';\r\nimport Metrics from './components/Metrics';\r\nimport './App.css';\r\n// import logo from './logo.svg';\r\n\r\ninterface IAuthState {\r\n signedIn: boolean;\r\n user: CognitoUser | null;\r\n}\r\n\r\nconst App: React.FC = () => {\r\n const [auth, setAuth] = useState({ signedIn: false, user: null });\r\n\r\n useEffect(() => {\r\n let redirect: any;\r\n\r\n Hub.listen('auth', (data: any) => {\r\n switch (data.payload.event) {\r\n case 'signIn':\r\n clearTimeout(redirect);\r\n setAuth({ signedIn: true, user: data.payload.data });\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n\r\n Auth.currentAuthenticatedUser()\r\n .then((user: CognitoUser) => setAuth({ signedIn: true, user }))\r\n .catch(() => {\r\n redirect = setTimeout(\r\n () => {\r\n if (!auth.signedIn) {\r\n console.log('Not signed in');\r\n Auth.federatedSignIn();\r\n }\r\n },\r\n window.location.search.includes('code') ? 5000 : 500\r\n );\r\n });\r\n // eslint-disable-next-line\r\n }, []);\r\n\r\n if (!auth.signedIn) return ;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default App;\r\n","import Amplify from 'aws-amplify';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\nimport config from './config';\r\nimport 'semantic-ui-css/semantic.min.css';\r\n// import \"./index.css\";\r\n\r\nAmplify.configure({\r\n Auth: {\r\n mandatorySignIn: true,\r\n region: config.cognito.REGION,\r\n userPoolId: config.cognito.USER_POOL_ID,\r\n identityPoolId: config.cognito.IDENTITY_POOL_ID,\r\n userPoolWebClientId: config.cognito.APP_CLIENT_ID,\r\n oauth: {\r\n domain: config.cognito.DOMAIN,\r\n scope: config.cognito.SCOPE,\r\n redirectSignIn: config.cognito.REDIRECT_SIGN_IN,\r\n redirectSignOut: config.cognito.REDIRECT_SIGN_OUT,\r\n responseType: config.cognito.RESPONSE_TYPE\r\n }\r\n }\r\n});\r\n\r\nReactDOM.render(, document.getElementById('root'));\r\n"],"sourceRoot":""}