{"version":3,"sources":["../../src/index.ts","../../src/DeviceManager.tsx","../../src/VideoManager.ts","../../src/RoomManager.ts","../../../src/SignalR/SignalRConnectionBuilder.ts","../../src/AudioCard.tsx","../../src/ParticipantInfo.ts","../../src/ParticipantCard.tsx","../../src/VideoCard.tsx","../../src/AudioManager.ts","../../src/ChatManager.ts","../../src/common/modal/Modal.tsx","../../src/common/modal/ModalFooter.tsx","../../src/common/modal/ModalBody.tsx","../../src/common/modal/ModalHeader.tsx","../../src/CallService.ts","../../../src/SignalR/JQueryLoader.ts","../../../src/SignalR/StatusService.ts","../../src/CircuitBreaker.ts","../../src/UserService.ts","../../src/CallTree.tsx","../../src/CallTreeTeam.tsx","../../src/CallTreeTeamMember.tsx","../../src/common/CookieManager.ts","../../src/Publications.tsx","../../src/TrackSelector.tsx","../../src/Room.tsx","../../src/LeaveRoomModal.tsx","../../src/RoomHeader.tsx","../../src/ToggleAudioButton.tsx","../../src/ToggleVideoButton.tsx","../../src/ToggleChatButton.tsx","../../src/ToggleSettingsButton.tsx","../../src/LeaveRoomButton.tsx","../../src/RoomBody.tsx","../../src/ChatSlider.tsx","../../src/SettingsSlider.tsx","../../src/common/SelectInput.tsx","../../src/common/modal/index.tsx","components/ApiAuthorization/ApiAuthorizationConstants.ts","components/ApiAuthorization/AuthorizeService.ts","components/ApiAuthorization/AuthContext.ts","security/AuthChangeCheck.ts","components/ApiAuthorization/AuthorizeNavItem.tsx","components/ApiAuthorization/LoginMenu.tsx","components/Common/ImageTrendToggle.tsx","components/SignalR/StatusService.ts","components/user/NavPresenceToggle.tsx","components/Navigation/NavMenu.tsx","components/Navigation/NavMenuContext.tsx","components/Navigation/useNavMenu.ts","components/Layout.tsx","components/Home.tsx","Logging.ts","ApiConstants.ts","security/Permission/TelehealthPortalPermission.ts","security/Claims.ts","components/RoomRouter.tsx","components/ApiAuthorization/AuthorizeRoute.tsx","components/ApiAuthorization/Login.tsx","components/ApiAuthorization/Logout.tsx","common/ApiRequest.ts","components/ApiAuthorization/ApiAuthorizationRoutes.tsx","components/CallTreeRouter.tsx","callCenter/CallLog.ts","common/Messaging.ts","common/ApiResponse.ts","common/ApiResponseHandler.ts","common/Message.ts","common/messaging/CallNotificationPreferenceChange.ts","common/messaging/UserDeclinedCall.ts","common/messaging/UserModificationMessage.ts","common/messaging/DeclinedCallLog.ts","common/settings/SettingStrings.ts","common/SettingRequestPayload.ts","common/settings/UserCallNotificationSetting.ts","components/CallToast.tsx","common/messaging/MessagingContext.ts","components/CallToastManager.tsx","SecurityStatus.ts","components/Common/FontAwesome.tsx","components/Common/Messages.tsx","components/MessageState.ts","SecurityManager.ts","components/Common/ClickableText.tsx","common/AnonymousApiRequest.ts","user/ForgotPasswordRequest.ts","components/Common/ErrorMessages.tsx","components/Common/UnexpectedError.tsx","components/ForgotPassword.tsx","components/UserLogin.tsx","Team.ts","components/ResetPasswordHandlerState.ts","services/LoginUserService.ts","components/ResetPassword.tsx","common/queue.ts","common/tree.ts","common/treeNode.ts","common/treeBuilder.ts","Organization.ts","user/AccountStatusConstants.ts","user/AccountStatusState.ts","user/NameState.ts","common/NameParts.ts","common/NameSplitter.ts","user/UserPhoneState.ts","Person.ts","organization/OrgUser.ts","organization/OrganizationService.ts","components/Common/Slushbox.tsx","organization/UpdateOrganizationRequest.ts","organization/UpdateTeamRequest.ts","components/Teams/EditTeam.tsx","components/Common/ImageTrendTable.tsx","components/AccessDenied.tsx","components/SecuredComponent.tsx","security/Permission/AdminRoleRequiredPermission.ts","security/Permission/DisplayTeamsPermission.ts","security/Permission/NotGranted.ts","security/Claim.ts","security/UserRoleClaim.ts","security/RoleRetriever.ts","services/SecuredPersonService.ts","security/Permission/RenderPermission.ts","components/Teams/Teams.tsx","security/Permission/DisplayUsersPermission.ts","components/Common/DemographicPrefix.ts","components/Common/DemographicSuffix.ts","user/UserResponse.ts","common/PatchRequest.ts","user/ReinviteUserRequest.ts","user/UserService.ts","user/UserStrings.ts","components/user/UserAccountCard.tsx","user/ChangeUserRequest.ts","components/Common/PrefixSelectInput.tsx","components/Common/SuffixSelector.tsx","components/user/UserDemographicsCard.tsx","components/user/UserPermissionsCard.tsx","common/RequestBuilder.ts","user/ChangeUserRequestBuilder.ts","user/UserDemographics.ts","components/user/EditUser.tsx","components/user/Users.tsx","components/ApiAuthorization/AuthContextProvider.tsx","common/CallMappers.ts","common/Strings.ts","components/CallCenter/AnswerCallButton.tsx","components/CallCenter/DeclineCallButton.tsx","components/Common/LoadingIndicator.tsx","security/Permission/Granted.ts","components/CallCenter/ActiveCalls.tsx","components/CallCenter/CallHistory.tsx","common/ApiRequestFactories.ts","common/PhoneNumber.ts","components/Common/DefaultErrorMessage.tsx","components/CallCenter/ConfigureCallSettings.tsx","components/Common/Panel.tsx","components/Common/UpperContent.tsx","components/CallCenter/InviteCallParticipant.tsx","components/ApiAuthorization/useAuthContext.ts","components/CallCenter/CallCenter.tsx","components/user/Presence.tsx","common/messaging/VoidMessage.ts","components/Messaging/MessagingContextProvider.tsx","components/AcceptCall.tsx","components/ApiAuthorization/TelehealthAccountSecuredComponent.tsx","components/Navigation/NavMenuContextProvider.tsx","App.tsx","index.tsx","../../src/UrlHelper.ts"],"names":["DeviceManagerEvents","DeviceManager","cachedDevices","device","label","toLowerCase","devices","length","defaultDevice","find","v","deviceId","x","getSafeDeviceLabel","indexOf","maybeFrontDevices","filter","selectedVideoDeviceId","cookieManager","getSelectedCamera","maybeSelectedVideoDevices","d","this","getFrontFacingCameraFromBrowserAsync","frontFacingCamera","guessDefaultVideoDevice","selectedAudioDeviceId","getSelectedMicrophone","maybeSelectedAudioDevices","defaultAudioDevice","a","navigator","mediaDevices","getUserMedia","video","facingMode","exact","mediaStream","undefined","getTracks","forEach","t","stop","videoTracks","getVideoTracks","settings","getSettings","audio","enumerateDevices","audioDevices","kind","map","videoDevices","i","selectedAudioDevice","getDefaultAudioDevice","getDefaultVideoDevice","selectedVideoDevice","camera","some","Error","setSelectedCamera","emit","SELECTED_CAMERA_CHANGED","microphone","setSelectedMicrophone","SELECTED_MICROPHONE_CHANGED","EventEmitter","deviceManager","VideoManagerEvents","VideoManager","participant","videoTrack","isSwitching","trackPublications","Array","from","values","track","newDeviceId","pauseVideo","resumeVideo","localTrackPublication","unpublishTrack","VIDEO_STATUS","createLocalVideoTrack","publishTrack","RoomManagerEvents","RoomManager","showChatStatus","showSettingsStatus","SHOW_CHAT_STATUS","SHOW_SETTINGS_STATUS","hideSettings","hideChat","AudioCard","props","updateAudioRef","audioRef","attachTrack","state","audioTrack","detachTrack","prevProps","newAudioTrack","setState","removeAttribute","detach","attach","setAttribute","name","autoPlay","muted","isLocal","ref","Component","identity","sid","isLocalParticipant","ParticipantCard","p","participantCss","className","id","key","Publications","PublicationsContext","Consumer","pubContext","Fragment","TrackSelector","publications","trackSelector","selectMainAudioTrack","TrackContext","selectMainVideoTrack","VideoCard","displayName","position","videoRef","updateVideoRef","newVideoTrack","containerCss","playsInline","AudioManagerEvents","AudioManager","_isMuted","audioTracks","createLocalAudioTrack","disable","AUDIO_MUTED","enable","ChatManagerEvents","ChatManager","authService","isConnected","chatConnection","messageIndex","getAccessToken","token","userId","userDisplayName","message","messageObj","index","MESSAGE_RECEIVED","signalRConnectionBuilder","connect","urlHelper","resolveUrl","bind","connection","on","messageReceived","off","roomId","send","Modal","modal","showModal","element","show","cleanupModal","hide","dispose","tabIndex","role","children","ModalFooter","ModalBody","ModalHeader","title","type","onClick","close","UserStatus","CallTree","_callCreatedCallback","teams","roomNameRedirect","userService","UserService","callService","CallService","onCallCreated","updateContacts","b","localeCompare","status","sortOrder","alphaSort","lastName","firstName","getTeamsStatuses","sort","existingMembers","teamMemberSort","to","getCallDetailsAsync","callDetails","createCall","recipientUser","recipientTeam","unitNumber","agencyId","agencyName","response","contact","createTeamMemberCall","team","CallTreeTeam","createTeamCall","teamContents","renderTeam","href","isAvailable","m","isExpanded","teamMember","CallTreeTeamMember","teamMembersContents","expandoIcon","headerClassName","teamMembers","renderTeamMember","callButton","expandOrContract","statusIcon","CookieManager","cameraCookieName","microphoneCookieName","setCookie","value","expirationDate","expires","toUTCString","isInsecureCookieAllowed","location","hostname","document","cookie","nameEq","c","cookieArray","split","len","charAt","substring","readCookie","date","Date","setUTCFullYear","getUTCFullYear","createContext","trackPublished","publication","trackUnpublished","concat","Provider","trackSubscribed","trackUnsubscribed","onPublication","offPublication","newPublication","updatePublication","CallState","Room","room","eventHandlers","videoManager","audioManager","callHasEnded","callHasBeenAnswered","showLeaveRoomModal","leaveRoomCallback","leaveRoom","disconnect","endCall","roomAdapter","cameraChanged","changeCamera","microphoneChanged","changeMicrophone","isMobile","userAgent","test","callState","LOADING","participants","chatManager","roomManager","GET_USER_INFO","getUserInfo","window","self","top","e","endCallCallback","connectAsync","GET_TOKEN","populateToken","modalContents","LeaveRoomModal","RoomHeader","RoomBody","ChatSlider","currentUserId","SettingsSlider","POPULATE_INPUT_DEVICES","CHAT_CONNECTING","CONNECTING","CONNECTED","renderRoom","DISCONNECTING","DISCONNECTED","getUserId","populateInputDevices","getDevicesAsync","initializeChat","apiToken","fetch","headers","method","json","data","selectAndJoinRoom","error","removeAllEventListeners","visibilityState","target","eventName","listener","push","addEventListener","removeEventListener","userInfo","callAnsweredCallback","localParticipant","console","log","updatedParticipants","findIndex","createParticipant","callAnswered","splice","connectOptions","participantConnected","participantDisconnected","setCurrentActiveParticipant","handleVisibilityChange","once","onDisconnected","startCallCallback","ParticipantInfo","leave","stay","ToggleSettingsButton","ToggleChatButton","ToggleVideoButton","ToggleAudioButton","LeaveRoomButton","updateMuteStatus","isMuted","mute","unmute","updateVideoState","videoEnabled","isVideoEnabled","switchVideo","pauseOrUnpauseVideo","getVideoStatus","videoIcon","getShowChat","showChat","showOrHideChat","getShowSettings","showSettings","showOrHideSettings","participantContents","connectingMessageContents","chatComposerRef","chatMessagesRef","hideOrShowSlider","sliderCss","messageClone","messages","scrollTo","scrollHeight","previousMessage","currentMessage","lineNumber","lines","alignmentClass","userClassname","messageClassname","event","getIsConnected","preventDefault","broadcastMessage","messageContents","renderChatMessages","placeholder","onKeyDown","handleMessageKeyDown","loadDevices","getDevices","selectedCamera","selectedMicrophone","getCachedDevices","setCamera","setMicrophone","Row","Col","SelectInput","options","onSelected","chosen","selectCamera","controlId","labelText","icon","optionText","option","optionValue","selected","selectMicrophone","useState","selectOptions","setOptions","selectedOption","setSelected","useEffect","builtOptions","builtOpt","buildOptions","iconFragment","Label","for","Input","onChange","o","QueryParameterNames","LogoutActions","LoginActions","ApplicationPaths","Claims","AuthenticationResultStatus","AuthorizeService","_callbacks","_nextSubscriptionId","_user","_onSignedInCallbacks","_onSignedInSubId","_beforeSignOutCallbacks","_beforeSignOutSubId","_isAuthenticated","_popUpDisabled","userManager","ensureUserManagerInitialized","getUser","user","expired","profile","sub","preferred_username","access_token","signinSilent","createArguments","silentUser","updateState","success","signinPopup","popUpUser","signinRedirect","redirect","url","signinCallback","signInCompletion","callback","beforeSignOut","signoutPopup","signoutRedirect","signoutCallback","signinSilentCallback","notifySubscribers","subscription","subscriptionId","subscriptionIndex","found","useReplaceToNavigate","Fail","Success","Redirect","host","origin","authority","client_id","redirect_uri","automaticSilentRenew","silent_redirect_uri","includeIdTokenInSilentRenew","post_logout_redirect_uri","response_type","scope","userStore","WebStorageStateStore","prefix","UserManager","events","addUserSignedOut","removeUser","defaultAuthContextProvider","provider","initialize","onAuthenticationChange","subscribe","cancelAuthenticationChange","withSubscriptionId","unsubscribe","isAuthenticated","AuthContext","React","AuthChangeCheck","_authService","currentlyAuthenticated","authChangedCallback","authSameCallback","userAuthenticated","AuthorizeNavItem","_subscription","_mounted","_ready","_authChangeChecker","context","display","authenticated","authenticationChanged","populateAuthenticationState","checkAuthChanged","authStatus","onAuthChanged","onNoAuthChange","NavItem","NavLink","tag","Link","contextType","LoginMenu","_authChangeCheck","userName","populateState","updatedAuth","profilePath","Profile","logoutPath","pathname","LogOut","local","authenticatedView","registerPath","Register","loginPath","Login","anonymousView","UncontrolledDropdown","nav","inNavbar","DropdownToggle","caret","DropdownMenu","right","DropdownItem","ImageTrendToggle","checked","checkedLabel","uncheckedLabel","labelDisplaySide","labelClass","handleDiameter","height","width","checkedIcon","onColor","statusService","StatusService","afterSignIn","makeUserAvailable","NavPresenceToggle","userAvailable","setUserAvailable","setUserAuthenticated","authContext","useContext","authConfig","useMemo","userStatusSub","useRef","authChangeSub","mounted","current","refreshUserPresence","refreshStatus","refreshUserAuthStatus","updatePresenceToggle","authenticatedUserId","statusRefreshSub","toUpperCase","priorAvailability","HubStatusMethod","GetStatus","authSub","statusSub","authenticationSub","handleAvailabilityChange","available","makeUserUnavailable","NavMenu","collapsed","isInIframe","Navbar","light","NavbarBrand","src","alt","NavbarToggler","toggleNavbar","Collapse","isOpen","navbar","Nav","NavMenuContext","navVisible","showNav","hideNav","useNavMenu","Layout","initializeAuth","Home","sm","Card","CardBody","CardTitle","datadogLogs","init","clientToken","site","forwardErrorsToLogs","sampleRate","service","setLoggerGlobalContext","ApiUrl","SecurityStrings","logger","debug","info","warn","TelehealthPortalPermission","userClaims","_onGranted","onGrantedCallback","_onUngranted","onDeniedCallback","accountClaim","findClaimsByType","onGranted","onDenied","onGrantedAsync","granted","onDenial","onDeniedAsync","denied","claims","_claims","ofType","foundClaim","claim","RoomRouter","lookupLoggedInUser","portalPermission","returnToCallCenter","deniedAsync","signOut","Promise","resolve","answeredName","answeredUserId","handleRejectedPromise","reason","invalidRoom","query","URLSearchParams","search","get","disableCallNotifications","showNavMenu","enableCallNotifications","AuthorizeRoute","link","createElement","path","isArray","returnUrl","protocol","hash","redirectUrl","ReturnUrl","encodeURI","renderComponent","routeProps","component","render","renderRoute","prevState","action","returnUrlState","login","getReturnUrl","LoginCallback","processLoginCallback","LoginFailed","Message","redirectToProfile","redirectToRegister","SilentLogin","loginSilently","signIn","result","lookupUserOrg","orgId","localStorage","setItem","navigateToReturnUrl","completeSignIn","afterLogin","runAfterLogin","fromQuery","startsWith","redirectToApiAuthorizationPath","IdentityRegisterPath","IdentityManagePath","apiAuthorizationPath","replace","onIdRetrieved","bearerToken","UserUrl","Authorization","lookupResponse","redirected","userLookup","orgClaim","Organization","Logout","isReady","history","removeItem","logout","LogoutCallback","processLogoutCallback","LoggedOut","completeSignOut","PatchOperation","ApiAuthorizationRoutes","loginAction","SilentRenewCallback","logoutAction","LogOutCallback","CallTreeRouter","CallLog","caller","callerAgency","callRecipientName","received","callerAgencyNumber","_caller","_agency","_agencyNumber","_answeredBy","_roomId","callId","recipient","receivedOn","appendDisplayPart","toString","now","DateTime","setZone","zone","toLocaleString","TIME_SIMPLE","answeredBy","person","formatForUser","DATE_SHORT","TIME_24_SIMPLE","whenAnsweredBy","byPerson","dateTime","callLogRow","CallLogRow","inRoom","displayPart","toCaller","recentlyReceived","ApiRequest","endpoint","resourceIdentifier","getToken","validateToken","dest","endsWith","substr","commonRequestHeaders","request","body","JSON","stringify","accessTokenExpired","MessageId","ApiResponse","statusCode","item","_failureMessages","successItemFactory","failureItemFactory","succeeded","failed","itemFactory","creationChecks","contentType","responseJson","includes","SuccessfulApiResponse","failedApiResponse","FailureApiResponse","failedResponse","failureMessages","failureMessage","onSucceded","onFailed","onSucceededResponse","ApiResponseHandler","unhandled","onSuccess","onFailure","create","r","other","CallNotificationPreferenceChange","userCallAudioNotificationEnabled","UserDeclinedCall","userCallDecline","UserModifySuccessMessage","userModifySuccess","UserModifyFailMessage","userModifyFail","Messages","MessageSubscription","subscribeTo","onMessageReceived","instance","_subscriptions","_currentSubId","subscribedTo","equals","onMessage","removeSubscription","toMessage","withCallback","clonedPublisher","MessagePublisher","DeclinedCallLog","declinedCallLog","displayCaller","SettingStrings","userIncomingCallAudioNotification","userIncomingCallSmsNotification","callSystem","notificationSubSystem","userCategory","deleteAction","modifyAction","SettingRequestPayload","system","category","subSystem","UserCallNotificationSetting","EnabledUserCallNotificationSetting","UserCallSmsNotificationSetting","DeleteUserCallSmsNotificationSetting","CallToast","_subscriptionId","toastRef","incomingCallId","incomingCaller","redirectToRoom","handleAnswerCall","call","AgencyName","UnitNumber","From","md","Button","handleIgnoreCall","color","handleRejectCall","messagingContext","publish","unsubscribeFrom","CallToastManager","_audioAlert","_messageSubs","stopAudioNotification","answerCall","CallId","answered","RoomId","calls","removeCall","awaitableCallDecline","declineCall","publishCallDeclinedMessage","callIndex","callAlertEnabled","showToasts","Audio","loop","incomingCall","IncomingCall","CallAnswered","endedCall","CallEnded","handleUserStatusChange","UpdateStatus","audioAlertSub","callAudioAlertChange","alertEnabled","setupIncomingCallAlert","removeSubscriptions","messageSub","userDeclinedCall","callSubRemoval","declinedMessage","s","callsCopy","ms","paused","play","CallIndex","callsClone","userAlertPreferenceRequest","post","SettingUrl","userAlertPreferenceResponse","userAlertResponseHandler","handle","audioAlert","setting","userAlertSetting","Boolean","valueOf","pause","toasts","MessagingContext","LoginStatus","ResetPasswordStatus","RoutedCallToastManager","withRouter","FontAwesome","size","successMessages","errorMessages","successDismissible","errorsDismissible","displaySuccess","setShowSuccess","displayErrors","setShowErrors","Alert","toggle","xs","MessageState","LoginResponse","Failure","permissionGroups","ResetPasswordResponse","email","SecurityManager","username","password","SecurityUrl","loginResponse","loginStatus","currentPassword","newPassword","confirmPassword","createResetPasswordResponseFromAsync","resetToken","resetResponse","resetPasswordResponse","userEmail","ClickableText","classes","onClicked","AnonymousApiRequest","ForgotPasswordRequest","ErrorMessages","UnexpectedError","ForgotPassword","showLogin","emailValid","setEmailValid","resetRequestSent","setResetRequestSent","showErrors","resetForm","useFormik","initialValues","validationSchema","Yup","required","onSubmit","forgotPasswordApi","forgotPasswordRequest","ok","errors","Form","handleSubmit","InputGroup","InputGroupAddon","addonType","InputGroupText","onBlur","handleBlur","handleChange","invalid","touched","valid","FormFeedback","LoginState","redirectToLogin","showForgotPasswordForm","showReset","showLoader","firstTimeLogin","enableLoginButton","UserLogin","jumpTable","setLoginSuccessState","PasswordResetRequired","setPasswordResetRequiredState","FirstTimeLogin","setFirstTimeLoginState","clearErrors","disableLoginButton","loginManager","loginUser","loginHandlerDelegate","populateErrorMessageStateFrom","singleErrorMessage","msg","onUsernameChange","handlePasswordChange","onPasswordKeyPress","disabled","hideForgotPasswordForm","TeamStatus","UninitializedPasswordHandlerState","onHandlingWithCredentials","InitializedWithTokenState","InitializedWithCredentialsState","onHandlingWithToken","onHandlingWithPassword","UserNotLookedUpState","onUserLookingUp","_onLookingUp","UserLookedUpState","onLookingUp","LoginUserService","_userLookupResponse","accessToken","dontLookup","lookup","ResetPasswordState","loginSucceeded","inviteExpired","shouldRender","forceLogoff","registrationUrl","ResetPassword","handlerState","match","params","regUrl","encodeURIComponent","RegistrationInvite","expiredInviteCheck","successful","attemptPasswordReset","lookedUpUser","lookupAnonymousUserByToken","withCredentials","resetWithCredentialsAsync","withResetToken","resetWithTokenAsync","securityManager","resetUserPasswordWithTokenAsync","passwordResetResponse","updateStateFromResetPasswordResponseAsync","resetUserPassword","updateStateFromLoginResponse","FormGroup","handleCurrentPasswordChange","handleConfirmPasswordChange","submitPasswordChange","Queue","items","slice","Tree","root","nodeVisitor","queue","currentNode","visitChildren","visitingNodeChild","enqueue","peek","dequeue","searchNode","nodesEqual","foundNode","traverse","visitingNode","firstValue","secondValue","visit","node","nodeData","rootData","recurseNodeDepth","targetNode","level","targetNodeData","currentNodeData","nextLevel","child","TreeNode","parent","childNode","childRemovedCollection","visitCallback","TreeBuilder","unparsedTree","parseOptions","rootNodeName","tree","dataFactory","processedChild","treeNode","childrenCollectionName","childData","addChild","nodeDataName","addedTeamName","users","updatedUsers","updatedOrg","currentUser","addedTeam","members","onTeam","sortTeams","updatedTeam","updatedTeams","userTeams","userTeam","compareStrings","default","AccountStatusDescriptions","Team","availableUsers","created","toDateString","Active","thisMember","Inactive","empty","unknown","ActiveStatusState","onActivating","onDeactivating","InactiveStatusState","FirstLastState","FirstMiddleLastState","PrefixFirstLastState","FirstLastSuffixState","onHasMiddleName","onHasPrefix","onHasSuffix","PrefixFirstMiddleLastState","FirstMiddleLastSuffixState","PrefixFirstLastSuffixState","PrefixFirstMiddleLastSuffixState","NameParts","middleName","_prefix","_suffix","suffix","EmptyName","NameSplitter","_namePattern","nameMatch","groups","first","last","nameParts","middle","addPrefix","addSuffix","PhoneNumberState","onAddingNumber","onRemovingNumber","NoPhoneNumberState","onPhoneNumberProvided","Person","lastLogin","_name","_namePrefix","_nameSuffix","_phoneNumber","_state","_phoneState","hasMiddleName","hasPrefix","hasSuffix","includePrefix","includeMiddleName","includeSuffix","onMiddleName","namePrefix","nameSuffix","onPrefix","onSuffix","withPhoneNumber","numberProvided","withoutPhoneNumber","clearPhoneNumber","phoneNumber","SecurePerson","flatPermissionGroups","_status","_username","_accountStatusState","_whenPersonActive","doNothing","inactive","active","invokeActiveCallback","onLoginAllowed","activeCallback","OrgUser","flatTeams","_teams","invoke","AdminRoleName","OrganizationService","defaultParseOptions","source","organizationFactory","second","orgNodesEqual","OrgUrl","emptyTree","builtTree","createTreeBuilder","parse","buildOrganizationTree","orgTree","fetchedOrg","getRoot","orgUpdateRequest","patch","organization","updateResponse","orgJson","createOrganization","createResponse","fromRequest","withOrgJson","foundOrg","visitingOrg","removedMembers","addedMembers","teamName","removedTeamMembers","addedTeamMembers","then","fail","orgTreeJs","existingMember","createdOn","withExisistingMembers","activate","deactivate","u","orgUser","reducedTeamsName","namePrefixedWith","nameSuffixedWith","foundOrgTeam","orgTeam","org","manages","accessibleBy","firstId","secondId","Slushbox","availableItems","assignedItems","displayText","valueFactory","mapOptionFrom","onAssignedItemsChanged","onAvailableItemsChanged","itemsEqual","pendingAssignments","setPendingAssignments","pendingUnassignments","setPendingUnassignments","itemOptions","mapSelectedOptionsToArrayT","selectedOptions","opt","sortItemsByDisplayText","firstText","secondText","itemsSame","markAvailableForAssignment","multiple","assign","assignments","unassign","itemsToMakeAvailable","markAssignmentForAvailable","UpdateOrganizationRequest","editedTeam","addedUser","editedUser","UpdateTeamRequest","teamId","assignedUsers","EditTeam","teamEditing","onUpdated","onExit","availableMembers","setAvailableMembers","assignedMembers","setAssignedMembers","orgService","assigned","onUpdateComplete","onAddComplete","newTeam","editTeamRequest","member","orgModifying","modifyOrgRequest","editTeam","addNewTeam","updateOrg","failure","form","check","foundUser","memberId","findMemberFrom","ImageTrendTable","renderableData","searchable","filterable","rowProps","row","tableColumns","tableData","useTable","columns","useSortBy","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","renderHeaderGroup","hg","getHeaderGroupProps","col","getSortByToggleProps","getHeaderProps","isSorted","isSortedDesc","renderHeaderCell","renderBodyRow","getRowProps","original","cells","cell","getCellProps","Table","striped","ImageTrendTableHeader","headerText","valueAccessor","columnId","Header","accessor","AccessDenied","SecuredComponent","permission","displayComponent","setDisplayComponent","setShouldRender","shouldRenderOutput","AdminRoleRequiredPermission","userPermGroups","_allowedPermissionGroups","_userPermGroupsClaim","onDenialAsync","DisplayTeamsPermission","additionalPermNeeded","_requiredPerm","_checkPermissionGranted","_checkPermissionDenied","NotGranted","Claim","UserRoleClaim","RoleClaimType","UserRoleName","RoleRetriever","securedUserService","_securedUserService","loggedInUser","SecuredPersonService","userResponseFactory","userResponse","userLookupResponse","handler","apiResponse","RenderPermission","inner","_inner","_renderThisUsing","grantedAsync","renderDisabled","renderAction","renderEnabled","renderer","Teams","Cell","updateTeams","viewTeamsPermission","setViewTeamsPermission","renderComplete","setRenderComplete","showTeams","setShowTeams","setTeamEditing","teamOrg","setTeamOrg","renderTeams","retrieveRole","disableRendering","roleRetriever","ofLoggedInUser","roleClaim","enableRendering","fetchOrg","onTeamUpdated","updateTeam","addTeam","onCancelModification","DisplayUsersPermission","DemographicPrefix","descriptor","_empty","EmptyPrefix","description","creator","MrDemographicPrefix","MrsDemographicPrefix","MsDemographicPrefix","DrDemographicPrefix","DemographicSuffix","_pleaseSelect","EmptySuffix","JuniorSuffix","SeniorSuffix","UserResponse","PatchStrings","opAdd","opRemove","ReinviteUserRequest","op","patchPayload","patchIndex","authToken","ur","reinviteRequest","ReinviteRequest","payload","userInviteResponse","inviteResponse","UserStrings","invitationSent","resendInviteError","AccountStatus","UserAccountCard","onPasswordChange","onPasswordConfirmationChange","showUsernameField","editMode","notifyUsernameNeeded","notifyUsernameOptional","notifyUserActive","notifyUserInactive","userActive","passwordConfirmation","resetRequired","notifyPasswordReset","requireReset","setResetNeeded","setInviteExpired","lookupUser","lookupByUsername","emailForUsernameChanged","onActiveStatusChange","resendInvite","invite","account","PrefixSelectInput","selectedPrefix","selectId","prefixSelected","onPrefixChange","SuffixSelector","onSuffixSelected","chosenSuffix","setChosenSuffix","pleaseSelectSuffix","jrSuffix","srSuffix","pleaseSelectText","jrSuffixText","srSuffixText","onSuffixChosen","UserDemographicsCard","demographics","onPrefixSelected","onFirstNameChange","onMiddleNameChange","onLastNameChange","onEmailAddressChange","onPhoneNumberChange","prefixOptions","selectedSuffix","emailAddress","UserPermissionsCard","permissionGroup","organizationTeams","assignedOrganizationTeams","availableTeams","onPermissionGroupChosen","onTeamsAssigned","onTeamsAvailableChange","orgTeams","selectedPermGroup","withPermissionGroup","searchTeam","parseInt","innerText","findTeamFrom","allAssigned","allAvailable","ChangeUserRequestContact","ChangeUserRequestDemographics","ChangeUserRequestAccount","useEmailForUsername","accountStatus","requirePasswordReset","emptyRequest","ChangeUserRequestAccountSecurity","ChangeUserRequest","security","credentials","RequestBuilder","createMissingItemMessage","EditingUserState","AddingUserState","UseEmailForUsernameState","onAdding","onEditing","onUsingEmail","onRequired","RequireUsernameState","ChangeUserRequestNameBuilder","_first","_last","_middle","canBuild","ChangeUserRequestContactBuilder","_emailAddress","ChangeUserRequestDemographicsBuilder","_nameBuilder","withFirst","withLast","withMiddle","removeMiddle","withPrefix","prefixName","suffixName","build","ChangeUserRequestAccountBuilder","_password","_confirmPassword","_active","_resetRequired","requireUsername","missingValues","missingFields","val","builtRequest","forAddingUser","whenEmailUsernameConfigured","whenUsernameRequired","whenEditing","forEditingUser","returns","whenAdding","editing","adding","ChangeUserRequestAccountSecurityBuilder","_permissionGroup","ChangeUserRequestBuilder","_demographicsBuilder","_contactBuilder","_accountBuilder","_securityBuilder","throwBuildError","userNamed","emailAt","callAt","withUserName","withPassword","loginWithPassword","confirmPasswordWith","clearAssignedTeams","group","inPermissionGroup","configureForEditing","configureForAdding","configureEmailAsUsername","activateUser","deactivateUser","mustResetPassword","resetPasswordNotRequired","removePassword","removePasswordConfirmation","builder","withEditingUserConfigured","userHasName","onNamePrefixed","namePrefixed","onNameSuffixed","nameSuffixed","userContactedAt","reachableByPhoneAt","userReachedAt","loginAllowed","onTeams","inSecurityGroup","whenAdministrator","logsInWith","UserDemographics","demos","EditUser","userOrg","onCancel","onUserChanged","setUserDisplayName","setOrgUser","userDemographics","setUserDemographics","setFirstName","setLastName","setMiddleName","setNamePrefix","setNameSuffix","setEmail","setPhoneNumber","setUsername","setPassword","setPasswordConfirmation","setUserActive","passwordResetRequired","setPasswordReset","showUsername","setShowUsername","assignedTeams","setAssignedTeams","setAvailableTeams","permGroup","setAssignedPermGroup","rBuilder","requestBuilder","setRequestBuilder","setErrors","setSuccessMessages","setEditUserPermission","messagingSubs","tryRemoveSubscription","useCallback","messagingSub","fromMessage","subRemovedIndex","setEditPermission","roleRetrieval","errorMsgSub","MessageFactory","errorMsg","err","listenForFailureMessages","removeSubsIndexes","removalIndex","subIndex","successMsgSub","successMsg","listenForSuccessMessages","retrieveUser","findUserWithId","initializeFromUser","modifyUser","onSaveComplete","updateOrgRequest","editUser","addNewUser","responseData","addedErrors","clearForm","saveUser","saveUserAndAddMore","successMessage","noDemographics","prefixChosen","removePrefix","suffixChosen","removeSuffix","onSuffixChange","newEmailAddress","newPhoneNumber","securesAccount","confirmedPassword","passwordMatches","newUsername","useEmailUsername","resetNeeded","passwordResetNotNeeded","onTeamAssignmentsChange","onPermissionGroupAssigned","Users","orgUsers","setOrgUsers","usersPermission","setUsersPermission","userClicked","setUserClicked","displayUsers","setDisplayUsers","setOrg","addUser","setAddUser","setEditUser","retrievePermissions","allowedToViewUsers","retrieveUsers","sortUsers","closeUserModification","updatedOrgUsers","userIndex","updateUser","onUserEdited","onUserAdded","Spinner","AuthContextProvider","CallMappers","callResponse","callLog","dateReceived","fromISO","callerUnitNumber","answer","ofCall","toRecipient","Strings","defaultErrorMessage","AnswerCallButton","DeclineCallButton","LoadingIndicator","loadingMessage","Granted","ActiveCalls","activeCalls","setActiveCalls","callDeclined","setDeclinedCall","callsRetrieved","setCallsRetrieved","removeActiveCallId","setRemoveActiveCallId","viewCallsPermission","setViewPermission","messagePublisher","isMounted","retrieveCalls","callsRequest","CallUrl","callsResponse","callHandler","callMapper","callsResponses","cr","endDate","declinedByMe","callLogFrom","toCallLogRow","answeredState","NotAnswered","grantedPermission","subscriptions","clientSubscriptions","updateActiveCalls","listenForIncomingCalls","callRequest","callLookupResponse","callLookupHandler","callLogFromNotification","callLogResponse","clr","answeredSub","answeredCall","listenForAnsweredCalls","clientSub","listenForEndedCalls","activeCall","activeCallsCopy","activeCallsColumns","callReceivedDateOnlyFormatted","callReceivedTimeOnlyFormatted","CallHistory","callHistoryRetreived","setCallHistoryRetrieved","priorCalls","setCallHistory","messageSubs","callHistoryRequest","callTask","responseHandler","recentCalls","firstDate","secondDate","sortByReceivedDate","reverse","filteredCalls","callHistory","callHistoryColumns","ApiRequestFactories","PhoneNumber","formatters","_formatter","PhoneNumberParts","unformatted","format","AreaCodeParenthesis","PhoneNumberHyphenizer","numberDigitsMatch","parensRegex","parensMatch","areaCode","remaining","trimmedNumber","phoneNumberDigitGroup","fullNumber","areacode","numberHyphenated","numberHyphen","number","_formatters","formatted","DefaultErrorMessage","ConfigureCallSettings","setShowModal","playSound","setPlaySound","sendSms","setSendSms","setSettingsSuccessMsgs","settingsErrors","setSettingsErrors","smsNumber","setSmsNumber","settingsHandlers","populateAudioAlertSetting","populateSmsAlertSetting","modifiedSettings","toggleConfigurationModal","handleSmsNumberChange","alertSmsNumber","formattedPhone","createWithDefaultFormatters","smsSettingIndex","modifiedSmsSetting","createUserIncomingCallSmsSetting","delete","createDeleteUserIncomingCallSmsSetting","saveSettingsAsync","put","postSettingsResponse","settingChangeResponse","retrieveCallSettings","callSettingsResponse","settingResponse","processSetting","enableAudioAlert","process","callSetting","settingValue","createUserIncomingCallSettingRequest","audioAlertSettingIndex","handlePlaySoundChange","handleSendSmsSettingChange","PanelInfo","infoText","Panel","UpperContent","page","InviteCallParticipant","destination","setDestination","useHistory","createCallAndInvite","inviteUserResponse","createdCall","useAuthContext","CallCenter","externalCallingEnabled","setExternalCallingEnabled","checkExternalCallsFeature","featureResponse","externalCallingFeature","enabled","lg","Presence","authSubscriptions","userPresenceSubscriptions","reconnectedHanderInitialized","reconnectedHandler","logMsg","addReconnectedHandler","authedSub","presenceChangeSub","myUserId","presenceSub","voidMessage","MessagingContextProvider","messenger","AcceptCall","setRedirectToLogin","useParams","signature","joinCall","joinCallResponse","TelehealthAccountSecuredComponent","personService","renderPermission","setRenderPermission","initialized","perm","NavMenuContextProvider","setShowNav","navMenuProvider","unlisten","authSubscription","navContext","setClassName","setAuthenticated","authChange","getClassName","firstSegment","locationChangeHandler","checkAuthenticated","checkAuth","listen","updateNav","initializeStatus","navMenuCtx","ApiAuthorizationPrefix","baseUrl","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","StrictMode","basename","rootUrl"],"mappings":"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","file":"static/js/main.698b5d01.chunk.js","sourcesContent":["\"use strict\";\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n__exportStar(require(\"./CallService\"), exports);\r\n__exportStar(require(\"./SignalR/JQueryLoader\"), exports);\r\n__exportStar(require(\"./SignalR/SignalRConnectionBuilder\"), exports);\r\n__exportStar(require(\"./SignalR/StatusService\"), exports);\r\n__exportStar(require(\"./UrlHelper\"), exports);\r\n__exportStar(require(\"./UserService\"), exports);\r\n//# sourceMappingURL=index.js.map","import { EventEmitter } from 'events';\r\nimport { cookieManager } from './common/CookieManager';\r\n\r\nexport interface DeviceInfo {\r\n\tdeviceId: string,\r\n\tlabel: string\r\n}\r\n\r\nexport interface Devices {\r\n\taudioDevices: Array,\r\n\tvideoDevices: Array,\r\n\tselectedAudioDevice: DeviceInfo | undefined,\r\n\tselectedVideoDevice: DeviceInfo | undefined\r\n}\r\n\r\nexport enum DeviceManagerEvents {\r\n\tSELECTED_CAMERA_CHANGED = \"selectedCameraChanged\",\r\n SELECTED_MICROPHONE_CHANGED = \"selectedMicrophoneChanged\"\r\n}\r\n\r\nexport class DeviceManager extends EventEmitter {\r\n\tprivate cachedDevices: Devices | null = null;\r\n\r\n\tgetSafeDeviceLabel(device: DeviceInfo) {\r\n\t\tlet label = device.label || \"\";\r\n\t\treturn label.toLowerCase();\r\n\t}\r\n\r\n\tguessDefaultVideoDevice(devices: Array) {\r\n\t\t// iOS front camera will have a label of \"Front Camera\"\r\n\t\t// iOS rear camera will have a label of \"Back Camera\"\r\n\t\tif (devices.length === 0) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\telse if (devices.length === 1) {\r\n\t\t\treturn devices[0];\r\n\t\t}\r\n\t\t// try to find a default device\r\n\t\tlet defaultDevice = devices.find(v => v.deviceId === 'default');\r\n\t\tif (defaultDevice) {\r\n\t\t\treturn defaultDevice;\r\n\t\t}\r\n\t\t// look for a device with \"front\" in the label\r\n\t\tdefaultDevice = devices.find(x => this.getSafeDeviceLabel(x).indexOf('front') > -1);\r\n\t\tif (defaultDevice) {\r\n\t\t\treturn defaultDevice;\r\n\t\t}\r\n\t\t// look for a device that doesn't have \"rear\" or \"back\" or \" ir \" in the label\r\n\t\tlet maybeFrontDevices = devices.filter(x => {\r\n\t\t\tlet label = this.getSafeDeviceLabel(x);\r\n\t\t\tif (label.indexOf('rear') > -1 || label.indexOf('back') > -1) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t// also remove any infrared cameras\r\n\t\t\tif (label.indexOf(' ir ') > -1) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\t\tif (maybeFrontDevices.length > 0) {\r\n\t\t\treturn maybeFrontDevices[0];\r\n\t\t}\r\n\t\t// just pick the first one at this point\r\n\t\treturn devices[0];\r\n\t}\r\n\r\n\tasync getDefaultVideoDevice(devices: Array) {\r\n\t\t// read from cookie first\r\n\t\tlet selectedVideoDeviceId = cookieManager.getSelectedCamera();\r\n\t\tif (selectedVideoDeviceId) {\r\n\t\t\tlet maybeSelectedVideoDevices = devices.filter(d => d.deviceId === selectedVideoDeviceId);\r\n\t\t\tif (maybeSelectedVideoDevices.length > 0) {\r\n\t\t\t\treturn maybeSelectedVideoDevices[0];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// try to let the browser determine which device is front facing,\r\n\t\t// if it can't or if the device does not have a front facing camera we\r\n\t\t// will determine this ourselves.\r\n\t\tlet frontFacingCamera = await this.getFrontFacingCameraFromBrowserAsync(devices);\r\n\t\tif (frontFacingCamera) {\r\n\t\t\treturn frontFacingCamera;\r\n\t\t}\r\n\t\treturn this.guessDefaultVideoDevice(devices);\r\n\t}\r\n\r\n\tgetDefaultAudioDevice(devices: Array) {\r\n\t\t// read from cookie first\r\n\t\tlet selectedAudioDeviceId = cookieManager.getSelectedMicrophone();\r\n\t\tif (selectedAudioDeviceId) {\r\n\t\t\tlet maybeSelectedAudioDevices = devices.filter(d => d.deviceId === selectedAudioDeviceId);\r\n\t\t\tif (maybeSelectedAudioDevices.length > 0) {\r\n\t\t\t\treturn maybeSelectedAudioDevices[0];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (devices.length === 0) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tlet defaultAudioDevice = devices.find(a => a.deviceId === 'default');\r\n\t\tif (!defaultAudioDevice) {\r\n\t\t\tdefaultAudioDevice = devices[0];\r\n\t\t}\r\n\t\treturn defaultAudioDevice;\r\n\t}\r\n\r\n\tasync getFrontFacingCameraFromBrowserAsync(devices: Array) {\r\n\t\tlet mediaStream: MediaStream;\r\n\t\ttry {\r\n\t\t\tmediaStream = await navigator.mediaDevices.getUserMedia({\r\n\t\t\t\tvideo: {\r\n\t\t\t\t\tfacingMode: {\r\n\t\t\t\t\t\texact: 'user'\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} catch (ex) {\r\n\t\t\t// getUserMedia will throw an overconstrained error if the device does not have a front facing camera\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tmediaStream.getTracks().forEach(t => t.stop());\r\n\t\tlet videoTracks = mediaStream.getVideoTracks();\r\n\t\tif (videoTracks.length === 0) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tlet settings = videoTracks[0].getSettings();\r\n\t\treturn devices.find(x => x.deviceId === settings.deviceId);\r\n\t}\r\n\r\n\tgetCachedDevices(): Devices | null {\r\n\t\treturn this.cachedDevices;\r\n\t}\r\n\r\n\tasync getDevicesAsync(): Promise {\r\n\t\tif (this.cachedDevices) {\r\n\t\t\treturn this.cachedDevices;\r\n\t\t}\r\n\r\n\t\t// Call this so we prompt the user for permissions if necessary.\r\n\t\t// This will also start up a media stream, which will turn on the camera light on your device.\r\n\t\tlet mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });\r\n\t\t// stop all the tracks we get back\r\n\t\tmediaStream.getTracks().forEach(t => t.stop());\r\n\t\tlet devices = await navigator.mediaDevices.enumerateDevices();\r\n\t\tlet audioDevices = devices.filter(d => d.kind === 'audioinput').map(d => ({ deviceId: d.deviceId, label: d.label }));\r\n\t\tlet videoDevices = devices.filter(d => d.kind === 'videoinput').map(d => ({ deviceId: d.deviceId, label: d.label }));\r\n\t\tlet i = 1;\r\n\t\t// add labels to any that don't have labels\r\n\t\taudioDevices.forEach(d => {\r\n\t\t\tif (!d.label) {\r\n\t\t\t\td.label = `Unknown audio #${i}`;\r\n\t\t\t}\r\n\t\t});\r\n\t\ti = 1;\r\n\t\tvideoDevices.forEach(d => {\r\n\t\t\tif (!d.label) {\r\n\t\t\t\td.label = `Unknown video #${i}`;\r\n\t\t\t}\r\n\t\t});\r\n\t\tlet selectedAudioDevice = this.getDefaultAudioDevice(audioDevices);\r\n\t\tlet selectedVideoDevice = await this.getDefaultVideoDevice(videoDevices);\r\n\r\n\t\tthis.cachedDevices = {\r\n\t\t\taudioDevices,\r\n\t\t\tvideoDevices,\r\n\t\t\tselectedAudioDevice,\r\n\t\t\tselectedVideoDevice\r\n\t\t}\r\n\t\treturn this.cachedDevices;\r\n\t}\r\n\r\n\tsetCamera(camera: DeviceInfo) {\r\n\t\tif (!this.cachedDevices?.videoDevices.some(v => v.deviceId === camera.deviceId)) {\r\n\t\t\tthrow new Error('Cannot select unknown camera.');\r\n\t\t}\r\n\t\tthis.cachedDevices.selectedVideoDevice = camera;\r\n\t\tcookieManager.setSelectedCamera(camera.deviceId);\r\n\t\tthis.emit(DeviceManagerEvents.SELECTED_CAMERA_CHANGED, camera.deviceId);\r\n\t}\r\n\r\n\tsetMicrophone(microphone: DeviceInfo) {\r\n\t\tif (!this.cachedDevices?.audioDevices.some(a => a.deviceId === microphone.deviceId)) {\r\n\t\t\tthrow new Error('Cannot select unknown microphone.');\r\n\t\t}\r\n\t\tthis.cachedDevices.selectedAudioDevice = microphone;\r\n\t\tcookieManager.setSelectedMicrophone(microphone.deviceId);\r\n\t\tthis.emit(DeviceManagerEvents.SELECTED_MICROPHONE_CHANGED, microphone.deviceId);\r\n\t}\r\n}\r\n\r\nexport var deviceManager = new DeviceManager();","import { LocalParticipant, createLocalVideoTrack, LocalVideoTrack } from 'twilio-video';\r\nimport { EventEmitter } from 'events';\r\n\r\nexport enum VideoManagerEvents {\r\n\tVIDEO_STATUS = \"videoStatus\"\r\n}\r\n\r\nexport class VideoManager extends EventEmitter {\r\n\tprivate readonly participant: LocalParticipant;\r\n\tprivate deviceId: string;\r\n\tprivate videoTrack: LocalVideoTrack | null = null;\r\n\tprivate isSwitching: boolean = false;\r\n\r\n\tconstructor(participant: LocalParticipant, deviceId: string) {\r\n\t\tsuper();\r\n\t\tthis.participant = participant;\r\n\t\tthis.deviceId = deviceId;\r\n\t\tconst trackPublications = Array.from(participant.videoTracks.values());\r\n\t\tif (trackPublications.length > 0) {\r\n\t\t\tthis.videoTrack = trackPublications[0].track;\r\n\t\t}\r\n\t}\r\n\r\n\tasync changeCamera(newDeviceId: string) {\r\n\t\tthis.pauseVideo();\r\n\t\tthis.deviceId = newDeviceId;\r\n\t\tawait this.resumeVideo();\r\n\t}\r\n\r\n\tasync pauseOrUnpauseVideo() {\r\n\t\tif (!this.videoTrack) {\r\n\t\t\tawait this.resumeVideo();\r\n\t\t} else {\r\n\t\t\tthis.pauseVideo();\r\n\t\t}\r\n\t}\r\n\r\n\tgetVideoStatus() {\r\n\t\treturn !!this.videoTrack;\r\n\t}\r\n\r\n\tpauseVideo() {\r\n\t\tif (this.isSwitching) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.isSwitching = true;\r\n\t\tif (!this.videoTrack) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// We are stopping and unpublishing the track here in order to make your camera light turn off.\r\n\t\t// You could alternatively use enable()/disable() here but the camera light would remain on.\r\n\t\tthis.videoTrack.stop();\r\n\t\tconst localTrackPublication = this.participant.unpublishTrack(this.videoTrack);\r\n\t\t// Twilio apparently has a bug in their SDK that doesn't fire this event,\r\n\t\t// but the link requires a login: https://issues.corp.twilio.com/browse/JSDK-2592\r\n this.participant.emit('trackUnpublished', localTrackPublication);\r\n\t\tthis.videoTrack = null;\r\n\t\tthis.isSwitching = false;\r\n\t\tthis.emit(VideoManagerEvents.VIDEO_STATUS, false);\r\n\t}\r\n\r\n\tasync resumeVideo() {\r\n\t\tif (this.isSwitching) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.isSwitching = true;\r\n\t\tthis.videoTrack = await createLocalVideoTrack({\r\n\t\t\tdeviceId: {\r\n\t\t\t\texact: this.deviceId\r\n\t\t\t}\r\n\t\t});\r\n\t\tawait this.participant.publishTrack(this.videoTrack);\r\n\t\tthis.isSwitching = false;\r\n\t\tthis.emit(VideoManagerEvents.VIDEO_STATUS, true);\r\n\t}\r\n}","import { EventEmitter } from 'events';\r\n\r\nexport enum RoomManagerEvents {\r\n SHOW_CHAT_STATUS = \"showChatStatus\",\r\n SHOW_SETTINGS_STATUS = \"showSettingsStatus\"\r\n}\r\n\r\nexport class RoomManager extends EventEmitter {\r\n\tprivate showChatStatus: boolean = false;\r\n private showSettingsStatus: boolean = false;\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t}\r\n\r\n\tgetShowChat() {\r\n\t\treturn this.showChatStatus;\r\n\t}\r\n\r\n getShowSettings() {\r\n return this.showSettingsStatus;\r\n }\r\n\r\n\thideChat() {\r\n if (!this.showChatStatus) {\r\n // chat is already hidden\r\n return;\r\n }\r\n this.showChatStatus = false;\r\n this.emit(RoomManagerEvents.SHOW_CHAT_STATUS, false);\r\n\t}\r\n\r\n hideSettings() {\r\n if (!this.showSettingsStatus) {\r\n return;\r\n }\r\n this.showSettingsStatus = false;\r\n this.emit(RoomManagerEvents.SHOW_SETTINGS_STATUS, false);\r\n }\r\n\r\n showChat() {\r\n if (this.showChatStatus) {\r\n // chat is already shown\r\n return;\r\n }\r\n if (this.showSettingsStatus) {\r\n this.hideSettings();\r\n }\r\n this.showChatStatus = true;\r\n this.emit(RoomManagerEvents.SHOW_CHAT_STATUS, true);\r\n }\r\n\r\n showSettings() {\r\n if (this.showSettingsStatus) {\r\n return;\r\n }\r\n if (this.showChatStatus) {\r\n this.hideChat();\r\n }\r\n this.showSettingsStatus = true;\r\n this.emit(RoomManagerEvents.SHOW_SETTINGS_STATUS, true);\r\n }\r\n}","\"use strict\";\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n});\r\nvar __importStar = (this && this.__importStar) || function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n};\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.signalRConnectionBuilder = exports.SignalRConnectionBuilder = void 0;\r\nconst signalR = __importStar(require(\"@microsoft/signalr\"));\r\nclass SignalRConnectionBuilder {\r\n buildConnection(hubUrl, accessTokenFactory) {\r\n const options = {};\r\n if (accessTokenFactory !== undefined) {\r\n options.accessTokenFactory = accessTokenFactory;\r\n }\r\n const connection = new signalR.HubConnectionBuilder().withUrl(hubUrl, options).build();\r\n return connection;\r\n }\r\n connect(hubUrl, accessTokenFactory) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const connection = this.buildConnection(hubUrl, accessTokenFactory);\r\n yield connection.start();\r\n return connection;\r\n });\r\n }\r\n}\r\nexports.SignalRConnectionBuilder = SignalRConnectionBuilder;\r\nexports.signalRConnectionBuilder = new SignalRConnectionBuilder();\r\n//# sourceMappingURL=SignalRConnectionBuilder.js.map","import React, { Component } from 'react';\r\nimport { AudioTrackPublication, LocalAudioTrack, RemoteAudioTrack } from 'twilio-video';\r\nimport { Track } from './TrackSelector';\r\n\r\ntype TwilioAudioTrack = RemoteAudioTrack | LocalAudioTrack | null | undefined;\r\n\r\ninterface AudioCardProps {\r\n\tisLocal: boolean,\r\n\ttrack: Track\r\n}\r\n\r\ninterface AudioCardState {\r\n\taudioTrack: TwilioAudioTrack\r\n}\r\n\r\nexport class AudioCard extends Component, Readonly> {\r\n\taudioRef: HTMLAudioElement | null;\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\taudioTrack: props.track as TwilioAudioTrack\r\n\t\t};\r\n\t\tthis.audioRef = null;\r\n\t}\r\n\r\n\tcomponentWillUnmount() {\r\n\t\tthis.detachTrack(this.state.audioTrack);\r\n\t}\r\n\r\n\tcomponentDidUpdate(prevProps: AudioCardProps) {\r\n\t\tconst newAudioTrack = this.props.track as TwilioAudioTrack;\r\n\t\tif (newAudioTrack !== this.state.audioTrack) {\r\n\t\t\tthis.setState((state) => {\r\n\t\t\t\tthis.detachTrack(state.audioTrack);\r\n\t\t\t\tthis.attachTrack(newAudioTrack);\r\n\t\t\t\treturn {\r\n\t\t\t\t\taudioTrack: newAudioTrack\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tdetachTrack(audioTrack: TwilioAudioTrack) {\r\n\t\tif (this.audioRef) {\r\n\t\t\tthis.audioRef.removeAttribute('data-cy-audio-track-name');\r\n\t\t}\r\n\t\tif (audioTrack && this.audioRef) {\r\n\t\t\taudioTrack.detach(this.audioRef);\r\n\t\t}\r\n\t}\r\n\r\n\tattachTrack(audioTrack: TwilioAudioTrack) {\r\n\t\tif (!this.audioRef) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!audioTrack) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\taudioTrack.attach(this.audioRef);\r\n\t\tthis.audioRef.setAttribute('data-cy-audio-track-name', audioTrack.name);\r\n\t}\r\n\r\n\tupdateAudioRef = (audioRef: HTMLAudioElement) => {\r\n\t\tthis.audioRef = audioRef;\r\n\t\tthis.attachTrack(this.state.audioTrack);\r\n\t}\r\n\r\n\trender() {\r\n\t\tif (!this.state.audioTrack) {\r\n\t\t\treturn (

No Audio!

);\r\n\t\t}\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}","import { Participant } from \"twilio-video\";\r\n\r\nexport class ParticipantInfo {\r\n\tidentity: string = \"\";\r\n\tsid: string = \"\";\r\n\tisLocalParticipant: boolean = false;\r\n\tparticipant: Participant;\r\n\r\n\tconstructor(identity: string, sid: string, isLocalParticipant: boolean, participant: Participant) {\r\n\t\tthis.identity = identity;\r\n\t\tthis.sid = sid;\r\n\t\tthis.isLocalParticipant = isLocalParticipant;\r\n\t\tthis.participant = participant;\r\n\t}\r\n}","import React, { Component } from 'react';\r\nimport { AudioCard } from './AudioCard';\r\nimport { ParticipantInfo } from './ParticipantInfo';\r\nimport { Publications, PublicationsContext } from './Publications';\r\nimport { TrackContext, TrackSelector, selectMainAudioTrack, selectMainVideoTrack } from './TrackSelector';\r\nimport { VideoCard } from './VideoCard';\r\nimport './ParticipantCard.css';\r\n\r\ninterface ParticipantCardProps {\r\n\tparticipant: ParticipantInfo\r\n}\r\n\r\n// Actual UI for a participant\r\nexport class ParticipantCard extends Component, Readonly<{}>> {\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst p = this.props.participant;\r\n\t\tlet participantCss = \"participant\";\r\n\t\tif (!this.props.participant.isLocalParticipant) {\r\n\t\t\tparticipantCss = \"participant remote-participant\";\r\n\t\t}\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\t{(pubContext) => (\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\t{({track}) => (\r\n\t\t\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\t\r\n\t\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\t{({track}) => (\r\n\t\t\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\t\r\n\t\t\t\t\t\t\t\r\n\t\t\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
\r\n\t\t);\r\n\t}\r\n}","import React, { Component } from 'react';\r\nimport { RemoteVideoTrack, LocalVideoTrack } from 'twilio-video';\r\nimport { Track } from './TrackSelector';\r\n\r\nimport './VideoCard.css';\r\n\r\ntype TwilioVideoTrack = RemoteVideoTrack | LocalVideoTrack | null | undefined;\r\n\r\ninterface VideoCardProps {\r\n\ttrack: Track,\r\n\tisLocal: boolean,\r\n\tdisplayName: string,\r\n\tposition: string\r\n}\r\n\r\ninterface VideoCardState {\r\n\tvideoTrack: TwilioVideoTrack\r\n}\r\n\r\nexport class VideoCard extends Component, Readonly> {\r\n\tvideoRef: HTMLVideoElement | null = null;\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tvideoTrack: this.props.track as TwilioVideoTrack\r\n\t\t}\r\n\t}\r\n\r\n\tcomponentDidMount() {\r\n\t\tthis.attachTrack(this.state.videoTrack);\r\n\t}\r\n\r\n\tcomponentWillUnmount() {\r\n\t\tthis.detachTrack(this.state.videoTrack);\r\n\t}\r\n\r\n\tdetachTrack(videoTrack: TwilioVideoTrack) {\r\n\t\tif (!this.videoRef || !videoTrack) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tvideoTrack.detach(this.videoRef);\r\n\t}\r\n\r\n\tattachTrack(videoTrack: TwilioVideoTrack) {\r\n\t\tif (!this.videoRef || !videoTrack) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tvideoTrack.attach(this.videoRef);\r\n\t}\r\n\r\n\tcomponentDidUpdate(prevProps: VideoCardProps) {\r\n\t\tconst newVideoTrack = this.props.track as TwilioVideoTrack;\r\n\t\tif (newVideoTrack !== this.state.videoTrack) {\r\n\t\t\tthis.setState((state) => {\r\n\t\t\t\tthis.detachTrack(state.videoTrack);\r\n\t\t\t\tthis.attachTrack(newVideoTrack);\r\n\t\t\t\treturn {\r\n\t\t\t\t\tvideoTrack: newVideoTrack\r\n\t\t\t\t};\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n\r\n\tupdateVideoRef = (videoRef: HTMLVideoElement) => {\r\n\t\tthis.videoRef = videoRef;\r\n\t\tthis.attachTrack(this.state.videoTrack);\r\n\t}\r\n\r\n\trender() {\r\n\t\tif (!this.state.videoTrack) {\r\n\t\t\treturn (

No Video!

);\r\n\t\t}\r\n\t\tlet containerCss = this.props.isLocal ? \"video-card-local-container\" : \"video-card-remote-container\";\r\n\t\treturn (\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}","import { LocalParticipant, LocalAudioTrack, createLocalAudioTrack } from 'twilio-video';\r\nimport { EventEmitter } from 'events';\r\n\r\nexport enum AudioManagerEvents {\r\n\tAUDIO_MUTED = \"audioMuted\"\r\n}\r\n\r\nexport class AudioManager extends EventEmitter {\r\n\tprivate readonly participant: LocalParticipant;\r\n\tprivate _isMuted: boolean = false;\r\n\t\r\n\tconstructor(participant: LocalParticipant) {\r\n\t\tsuper();\r\n\t\tthis.participant = participant;\r\n\t}\r\n\r\n\tasync changeMicrophone(newDeviceId: string) {\r\n\t\tthis.participant.audioTracks.forEach(a => {\r\n\t\t\ta.track.stop();\r\n\t\t\tthis.participant.unpublishTrack(a.track);\r\n\t\t});\r\n\t\tconst audioTrack = await createLocalAudioTrack({\r\n\t\t\tdeviceId: {\r\n\t\t\t\texact: newDeviceId\r\n\t\t\t}\r\n\t\t});\r\n\t\tawait this.participant.publishTrack(audioTrack);\r\n\t}\r\n\r\n\tmute() {\r\n\t\tthis.participant.audioTracks.forEach(a => a.track.disable());\r\n\t\tthis._isMuted = true;\r\n\t\tthis.emit(AudioManagerEvents.AUDIO_MUTED, true);\r\n\t}\r\n\r\n\tunmute() {\r\n\t\tthis.participant.audioTracks.forEach(a => a.track.enable());\r\n\t\tthis._isMuted = false;\r\n\t\tthis.emit(AudioManagerEvents.AUDIO_MUTED, false);\r\n\t}\r\n\r\n\tisMuted() {\r\n\t\treturn this._isMuted;\r\n\t}\r\n}","import { EventEmitter } from \"events\";\r\nimport { IAuthService } from \"telehealth-abstractions\";\r\nimport { signalRConnectionBuilder, urlHelper } from \"telehealth-api\";\r\nimport { HubConnection } from \"@microsoft/signalr\";\r\n\r\nexport enum ChatManagerEvents {\r\n MESSAGE_RECEIVED = \"messageReceived\",\r\n}\r\n\r\nexport class ChatManager extends EventEmitter {\r\n private isConnected: boolean = false;\r\n private authService: IAuthService;\r\n private chatConnection: HubConnection | null = null;\r\n private messageIndex: number = 0;\r\n\r\n constructor(authService: IAuthService) {\r\n super();\r\n this.authService = authService;\r\n }\r\n\r\n private async getAccessToken() {\r\n const token = await this.authService.getAccessToken();\r\n if (token === null) {\r\n throw new Error(\"Unable to get auth token for chat service.\");\r\n }\r\n return token;\r\n }\r\n\r\n private messageReceived(userId: string, userDisplayName: string, message: string) {\r\n var messageObj = {\r\n userId: userId,\r\n userDisplayName: userDisplayName,\r\n message: message,\r\n index: this.messageIndex,\r\n };\r\n this.messageIndex++;\r\n this.emit(ChatManagerEvents.MESSAGE_RECEIVED, messageObj);\r\n }\r\n\r\n async connectAsync() {\r\n if (this.isConnected) {\r\n return;\r\n }\r\n const connection = await signalRConnectionBuilder.connect(\r\n urlHelper.resolveUrl(\"/hub/chat/\"),\r\n this.getAccessToken.bind(this)\r\n );\r\n connection.on(\"broadcastMessage\", this.messageReceived.bind(this));\r\n this.chatConnection = connection;\r\n this.isConnected = true;\r\n }\r\n\r\n disconnect() {\r\n if (this.chatConnection) {\r\n this.chatConnection.off(\"broadcastMessage\");\r\n this.chatConnection.stop();\r\n }\r\n this.chatConnection = null;\r\n this.isConnected = false;\r\n }\r\n\r\n getIsConnected() {\r\n return this.isConnected;\r\n }\r\n\r\n broadcastMessage(message: string, roomId: string) {\r\n if (!this.chatConnection || !this.isConnected) {\r\n throw new Error(\"Chat is not connected. Cannot send message.\");\r\n }\r\n this.chatConnection.send(\"broadcastMessage\", message, roomId);\r\n }\r\n}\r\n","import React from 'react';\r\nimport { Modal as BootstrapModal } from 'bootstrap';\r\n\r\ninterface ModalProps {\r\n}\r\n\r\nexport interface BaseModalState {\r\n\tshow: boolean\r\n}\r\n\r\nexport class Modal extends React.Component, Readonly<{}>> {\r\n\tprivate modal: BootstrapModal | null = null;\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {};\r\n\t}\r\n\r\n\tcomponentWillUnmount() {\r\n\t\tthis.cleanupModal();\r\n\t}\r\n\r\n\tcleanupModal() {\r\n\t\tif (this.modal) {\r\n\t\t\tthis.modal.hide();\r\n\t\t\tthis.modal.dispose();\r\n\t\t\tthis.modal = null;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate showModal = (element: HTMLDivElement | null) => {\r\n\t\tif (!element) {\r\n\t\t\tthis.cleanupModal();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.modal = new BootstrapModal(element);\r\n\t\tthis.modal.show();\r\n\t}\r\n\r\n\trender() {\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\t\t{this.props.children}\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}","import React from 'react';\r\n\r\nexport const ModalFooter : React.FunctionComponent<{}> = props => {\r\n\treturn (\r\n\t\t
\r\n\t\t\t{props.children}\r\n\t\t
\r\n\t);\r\n}","import React from 'react';\r\n\r\nexport const ModalBody : React.FunctionComponent<{}> = props => {\r\n\treturn (\r\n\t\t
\r\n\t\t\t{props.children}\r\n\t\t
\r\n\t);\r\n}","import React, { Component } from 'react';\r\n\r\ninterface ModalHeaderProps {\r\n\tclose: () => any,\r\n\ttitle: string\r\n}\r\n\r\nexport const ModalHeader : React.FunctionComponent = props => {\r\n\treturn (\r\n\t\t
\r\n\t\t\t
{props.title}
\r\n\t\t\t\r\n\t\t
\r\n\t);\r\n}","\"use strict\";\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.CallService = void 0;\r\nconst UrlHelper_1 = require(\"./UrlHelper\");\r\nclass CallService {\r\n constructor(authService) {\r\n this.authService = authService;\r\n }\r\n createCall(request) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n let apiToken = yield this.authService.getAccessToken();\r\n let response = yield fetch(UrlHelper_1.urlHelper.resolveUrl('api/v1.0/call'), {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${apiToken}`\r\n },\r\n body: JSON.stringify(request),\r\n method: 'POST'\r\n });\r\n let data = yield response.json();\r\n return data;\r\n });\r\n }\r\n answerCall(request) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n let apiToken = yield this.authService.getAccessToken();\r\n let response = yield fetch(UrlHelper_1.urlHelper.resolveUrl('api/v1.0/call/answer'), {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${apiToken}`\r\n },\r\n body: JSON.stringify(request),\r\n method: 'POST'\r\n });\r\n let data = yield response.json();\r\n return data;\r\n });\r\n }\r\n declineCall(request) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const apiToken = yield this.authService.getAccessToken();\r\n const response = yield fetch(UrlHelper_1.urlHelper.resolveUrl('api/v1.0/call'), {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${apiToken}`\r\n },\r\n body: JSON.stringify([\r\n {\r\n 'op': 'add',\r\n 'path': '/callId',\r\n 'value': request.callId\r\n },\r\n {\r\n 'op': 'add',\r\n 'path': '/endCallOn',\r\n 'value': new Date().toISOString()\r\n }\r\n ]),\r\n method: 'PATCH'\r\n });\r\n });\r\n }\r\n}\r\nexports.CallService = CallService;\r\n//# sourceMappingURL=CallService.js.map","\"use strict\";\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n});\r\nvar __importStar = (this && this.__importStar) || function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.$ = void 0;\r\n// SingalR needs jquery, and doesn't work properly unless you add it globally\r\nconst $ = __importStar(require(\"jquery\"));\r\nexports.$ = $;\r\nwindow.$ = $;\r\nwindow.jQuery = $;\r\n//# sourceMappingURL=JQueryLoader.js.map","\"use strict\";\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nvar __importDefault = (this && this.__importDefault) || function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.StatusService = exports.AdditionalHubNotification = exports.HubStatusMethod = void 0;\r\nconst SignalRConnectionBuilder_1 = require(\"./SignalRConnectionBuilder\");\r\nconst signalr_1 = require(\"@microsoft/signalr\");\r\nconst UrlHelper_1 = require(\"../UrlHelper\");\r\nconst CircuitBreaker_1 = __importDefault(require(\"../CircuitBreaker\"));\r\nvar HubStatusMethod;\r\n(function (HubStatusMethod) {\r\n HubStatusMethod[\"CallAnswered\"] = \"callAnswered\";\r\n HubStatusMethod[\"CallEnded\"] = \"callEnded\";\r\n HubStatusMethod[\"GetStatus\"] = \"getStatus\";\r\n HubStatusMethod[\"IncomingCall\"] = \"incomingCall\";\r\n HubStatusMethod[\"UpdateStatus\"] = \"updateStatus\";\r\n HubStatusMethod[\"UpdateStatuses\"] = \"updateStatuses\";\r\n})(HubStatusMethod = exports.HubStatusMethod || (exports.HubStatusMethod = {}));\r\n// Additional notifications that don't correspond directly\r\n// to a method in the status hub\r\nvar AdditionalHubNotification;\r\n(function (AdditionalHubNotification) {\r\n AdditionalHubNotification[\"ContactUpdate\"] = \"contactUpdate\";\r\n})(AdditionalHubNotification = exports.AdditionalHubNotification || (exports.AdditionalHubNotification = {}));\r\nconst CallNotificationMethods = [\r\n HubStatusMethod.CallAnswered,\r\n HubStatusMethod.CallEnded,\r\n HubStatusMethod.IncomingCall,\r\n];\r\nvar UserStatus;\r\n(function (UserStatus) {\r\n UserStatus[\"Available\"] = \"Available\";\r\n UserStatus[\"Unavailable\"] = \"Unavailable\";\r\n})(UserStatus || (UserStatus = {}));\r\nclass StatusService {\r\n constructor(authService) {\r\n this.currentUsers = new Map();\r\n this.connection = null;\r\n this.nextSubscriptionId = 0;\r\n this.isAuthenticated = false;\r\n this.callbacks = [];\r\n this.username = null;\r\n this.authSubscription = null;\r\n this.callNotificationsEnabled = true;\r\n //SignalR sometimes throws not fatal errors that we need to handle, so do that by using a circuit breaker which will retry up to 5 times on failure\r\n //See https://github.com/dotnet/aspnetcore/issues/13276 for more detail\r\n this.signalRCircuitBreaker = new CircuitBreaker_1.default(3000, 5); //A breaker around the SignalR connection\r\n this.authService = authService;\r\n }\r\n initialize() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this.authSubscription = this.authService.subscribe(() => __awaiter(this, void 0, void 0, function* () { return yield this.updateAuthenticationStatus(); }));\r\n yield this.updateAuthenticationStatus();\r\n });\r\n }\r\n updateAuthenticationStatus() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const authenticated = yield this.authService.isAuthenticated();\r\n if (authenticated === this.isAuthenticated) {\r\n // no change\r\n return;\r\n }\r\n if (authenticated) {\r\n this.username = yield this.authService.getUserPreferredName();\r\n yield this.setupConnection();\r\n }\r\n else {\r\n this.tearDownConnection();\r\n }\r\n });\r\n }\r\n internalUpdateUser(username, status) {\r\n if (username === this.username) {\r\n return;\r\n }\r\n if (status) {\r\n this.currentUsers.set(username, true);\r\n }\r\n else {\r\n this.currentUsers.delete(username);\r\n }\r\n }\r\n updateAllUsers(users) {\r\n users.forEach((x) => {\r\n this.internalUpdateUser(x, true);\r\n });\r\n this.notifySubscribers(AdditionalHubNotification.ContactUpdate);\r\n }\r\n updateUser(username, status) {\r\n this.internalUpdateUser(username, status);\r\n this.notifySubscribers(AdditionalHubNotification.ContactUpdate);\r\n }\r\n incomingCall(callJson) {\r\n let call = JSON.parse(callJson);\r\n this.notifySubscribers(HubStatusMethod.IncomingCall, call);\r\n }\r\n callAnswered(callJson) {\r\n let call = JSON.parse(callJson);\r\n this.notifySubscribers(HubStatusMethod.CallAnswered, call);\r\n }\r\n callEnded(callJson) {\r\n let call = JSON.parse(callJson);\r\n this.notifySubscribers(HubStatusMethod.CallEnded, call);\r\n }\r\n onStatusRefreshed(forUser, currentStatus) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n var myUserId = yield this.authService.getUserId();\r\n if (!myUserId) {\r\n return;\r\n }\r\n if (myUserId.toUpperCase() !== forUser.toUpperCase()) {\r\n return;\r\n }\r\n this.notifySubscribers(HubStatusMethod.GetStatus, forUser, currentStatus);\r\n });\r\n }\r\n getAccessToken() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const token = yield this.authService.getAccessToken();\r\n if (token === null) {\r\n throw new Error(\"Unable to get auth token for status service.\");\r\n }\r\n return token;\r\n });\r\n }\r\n setupConnection(retriesAttempted = 0) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n yield this.signalRCircuitBreaker.call(() => __awaiter(this, void 0, void 0, function* () {\r\n if (this.connection) {\r\n this.tearDownConnection();\r\n }\r\n this.connection = SignalRConnectionBuilder_1.signalRConnectionBuilder.buildConnection(UrlHelper_1.urlHelper.resolveUrl(\"/hub/status/\"), this.getAccessToken.bind(this));\r\n if (this.connection) {\r\n this.connection.on(HubStatusMethod.UpdateStatuses, this.updateAllUsers.bind(this));\r\n this.connection.on(HubStatusMethod.UpdateStatus, (username, status) => this.updateUser(username, status));\r\n this.connection.on(HubStatusMethod.IncomingCall, this.incomingCall.bind(this));\r\n this.connection.on(HubStatusMethod.CallAnswered, this.callAnswered.bind(this));\r\n this.connection.on(HubStatusMethod.CallEnded, (callJson) => this.callEnded(callJson));\r\n this.connection.on(HubStatusMethod.GetStatus, (userId, status) => this.onStatusRefreshed(userId, status));\r\n yield this.connection.start();\r\n }\r\n }));\r\n }\r\n catch (error) {\r\n //Retry up to 5 times before we break\r\n if (retriesAttempted < 5) {\r\n yield this.setupConnection(++retriesAttempted);\r\n }\r\n else {\r\n throw error;\r\n }\r\n }\r\n });\r\n }\r\n tearDownConnection() {\r\n if (!this.connection) {\r\n // we have already taken it down\r\n return;\r\n }\r\n this.connection.off(HubStatusMethod.UpdateStatuses);\r\n this.connection.off(HubStatusMethod.UpdateStatus);\r\n this.connection.off(HubStatusMethod.IncomingCall);\r\n this.connection.off(HubStatusMethod.CallAnswered);\r\n this.connection.off(HubStatusMethod.CallEnded);\r\n this.connection.off(HubStatusMethod.GetStatus);\r\n this.connection.stop();\r\n this.connection = null;\r\n this.currentUsers.clear();\r\n }\r\n notifySubscribers(methodName, ...args) {\r\n if (CallNotificationMethods.indexOf(methodName) !== -1 && !this.callNotificationsEnabled) {\r\n return;\r\n }\r\n for (let i = 0; i < this.callbacks.length; i++) {\r\n const callback = this.callbacks[i].callback;\r\n if (methodName === this.callbacks[i].methodName) {\r\n callback.apply(null, args);\r\n }\r\n }\r\n }\r\n isConnected() {\r\n var _a;\r\n return ((_a = this.connection) === null || _a === void 0 ? void 0 : _a.state) === signalr_1.HubConnectionState.Connected;\r\n }\r\n subscribe(callback, methodName) {\r\n this.callbacks.push({ callback, methodName, subscription: this.nextSubscriptionId++ });\r\n return this.nextSubscriptionId - 1;\r\n }\r\n unsubscribe(subscriptionId) {\r\n const subscriptionIndex = this.callbacks\r\n .map((element, index) => ({ found: element.subscription === subscriptionId, index }))\r\n .filter((element) => element.found === true);\r\n if (subscriptionIndex.length !== 1) {\r\n throw new Error(`Found an invalid number of subscriptions ${subscriptionIndex.length}`);\r\n }\r\n this.callbacks.splice(subscriptionIndex[0].index, 1);\r\n }\r\n disableCallNotifications() {\r\n this.callNotificationsEnabled = false;\r\n }\r\n enableCallNotifications() {\r\n this.callNotificationsEnabled = true;\r\n }\r\n makeUserAvailable() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n yield this.ready(() => __awaiter(this, void 0, void 0, function* () { return yield this.connection.send(HubStatusMethod.UpdateStatus, \"Available\"); }));\r\n });\r\n }\r\n makeUserUnavailable() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n yield this.ready(() => __awaiter(this, void 0, void 0, function* () { return yield this.connection.send(HubStatusMethod.UpdateStatus, \"Unavailable\"); }));\r\n });\r\n }\r\n refreshStatus() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n yield this.ready(() => __awaiter(this, void 0, void 0, function* () { return yield this.connection.send(HubStatusMethod.GetStatus); }));\r\n });\r\n }\r\n /*\r\n * Checks the status of the SignalR connection and invokes the provided callback if connected.\r\n * If not connected, it will check every second until it successfully connects, at which point,\r\n * the callback is invoked and the check for success stops.\r\n */\r\n ready(onReady) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!onReady) {\r\n throw new Error(\"onReady callback was not provided\");\r\n }\r\n if (this.isConnected()) {\r\n yield onReady();\r\n }\r\n else {\r\n //Check connection status every second\r\n this.checkConnectionId = setInterval(() => __awaiter(this, void 0, void 0, function* () {\r\n //Did we connect?\r\n if (this.isConnected()) {\r\n //invoke provided call\r\n yield onReady();\r\n //clear the connection check\r\n clearTimeout(this.checkConnectionId);\r\n }\r\n }), 1000);\r\n }\r\n });\r\n }\r\n addReconnectedHandler(callback) {\r\n var _a;\r\n let logMessage = \"SignalR connection reconnected\";\r\n console.log(logMessage);\r\n (_a = this.connection) === null || _a === void 0 ? void 0 : _a.onreconnected(callback);\r\n }\r\n}\r\nexports.StatusService = StatusService;\r\n//# sourceMappingURL=StatusService.js.map","\"use strict\";\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.HalfOpenCircuitBreaker = exports.OpenCircuitBreaker = exports.ClosedCircuitBreaker = void 0;\r\nconst luxon_1 = require(\"luxon\");\r\nclass CircuitBreaker {\r\n constructor(retryWaitMilliseconds, maxAmountRetries) {\r\n this._retriesAttempted = 0;\r\n this._maxRetries = 5;\r\n this._state = new ClosedCircuitBreaker();\r\n this._retryWaitMs = retryWaitMilliseconds !== null && retryWaitMilliseconds !== void 0 ? retryWaitMilliseconds : 1000;\r\n this._maxRetries = maxAmountRetries !== null && maxAmountRetries !== void 0 ? maxAmountRetries : 5;\r\n }\r\n call(unstableProcess) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this._lastAttemptUtc = luxon_1.DateTime.now().toUTC();\r\n try {\r\n this._state = yield this._state.run(() => __awaiter(this, void 0, void 0, function* () {\r\n this._retriesAttempted++;\r\n this._lastAttemptUtc = luxon_1.DateTime.now().toUTC();\r\n yield unstableProcess();\r\n this._resetRetries();\r\n }));\r\n }\r\n catch (_a) {\r\n if (this._retriesAttempted >= this._maxRetries) {\r\n this._state = new OpenCircuitBreaker(this._lastAttemptUtc, this._retryWaitMs);\r\n }\r\n throw new Error(\"Circuit Breaker Operation Failed\");\r\n }\r\n });\r\n }\r\n open() {\r\n this._state = this._state.open();\r\n }\r\n close() {\r\n if (this._openBreakerTimer) {\r\n //We're closing the breaker, so cancel the reset timer if any\r\n clearTimeout(this._openBreakerTimer);\r\n }\r\n this._state = this._state.close();\r\n this._retriesAttempted = 0;\r\n }\r\n _resetRetries() {\r\n this._retriesAttempted = 0;\r\n }\r\n}\r\nexports.default = CircuitBreaker;\r\nclass ClosedCircuitBreaker {\r\n run(process) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n yield process();\r\n return this;\r\n });\r\n }\r\n close() {\r\n return this;\r\n }\r\n open() {\r\n return new OpenCircuitBreaker();\r\n }\r\n halfOpen() {\r\n return new HalfOpenCircuitBreaker();\r\n }\r\n}\r\nexports.ClosedCircuitBreaker = ClosedCircuitBreaker;\r\nclass OpenCircuitBreaker {\r\n constructor(lastAttemptUtc, retryWaitMilliseconds) {\r\n this._lastAttemptUtc = lastAttemptUtc !== null && lastAttemptUtc !== void 0 ? lastAttemptUtc : luxon_1.DateTime.now().toUTC();\r\n this._retryWaitMs = retryWaitMilliseconds !== null && retryWaitMilliseconds !== void 0 ? retryWaitMilliseconds : 2000;\r\n }\r\n run(process) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (this._lastAttemptUtc.plus(this._retryWaitMs) < luxon_1.DateTime.now().toUTC()) {\r\n try {\r\n yield process();\r\n }\r\n catch (_a) {\r\n return this.halfOpen();\r\n }\r\n }\r\n return this;\r\n });\r\n }\r\n close() {\r\n return new ClosedCircuitBreaker();\r\n }\r\n open() {\r\n return this;\r\n }\r\n halfOpen() {\r\n return new HalfOpenCircuitBreaker();\r\n }\r\n}\r\nexports.OpenCircuitBreaker = OpenCircuitBreaker;\r\nclass HalfOpenCircuitBreaker {\r\n constructor(retryWaitMilliseconds) {\r\n this._retryWaitMs = retryWaitMilliseconds !== null && retryWaitMilliseconds !== void 0 ? retryWaitMilliseconds : 2000;\r\n }\r\n run(process) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n //Allow one attempt and open the breaker again if the process fails\r\n try {\r\n yield process();\r\n return this.close();\r\n }\r\n catch (_a) {\r\n return this.open();\r\n }\r\n });\r\n }\r\n close() {\r\n return new ClosedCircuitBreaker();\r\n }\r\n open() {\r\n return new OpenCircuitBreaker();\r\n }\r\n halfOpen() {\r\n return this;\r\n }\r\n}\r\nexports.HalfOpenCircuitBreaker = HalfOpenCircuitBreaker;\r\n//# sourceMappingURL=CircuitBreaker.js.map","\"use strict\";\r\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.UserService = void 0;\r\nconst UrlHelper_1 = require(\"./UrlHelper\");\r\nclass UserService {\r\n constructor(authService) {\r\n this.authService = authService;\r\n }\r\n getTeamsStatuses() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n let apiToken = yield this.authService.getAccessToken();\r\n let response = yield fetch(UrlHelper_1.urlHelper.resolveUrl('api/v1.0/status/teams'), {\r\n headers: !apiToken ? {} : { 'Authorization': `Bearer ${apiToken}` }\r\n });\r\n let data = yield response.json();\r\n return data.teams;\r\n });\r\n }\r\n getUserInfo(userId) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n let apiToken = yield this.authService.getAccessToken();\r\n let response = yield fetch(UrlHelper_1.urlHelper.resolveUrl(`api/v1.0/user/${userId}`), {\r\n headers: !apiToken ? {} : { 'Authorization': `Bearer ${apiToken}` }\r\n });\r\n let data = yield response.json();\r\n return data;\r\n });\r\n }\r\n}\r\nexports.UserService = UserService;\r\n//# sourceMappingURL=UserService.js.map","import React, { Component } from 'react';\r\nimport { IAuthService, IUserService, Team, TeamMember } from 'telehealth-abstractions';\r\nimport { StatusService, AdditionalHubNotification, HubStatusMethod, UserService, CallService } from 'telehealth-api';\r\nimport { CallTreeTeam } from './CallTreeTeam'\r\n\r\nimport './CallHeader.css';\r\nimport './CallTree.css';\r\n\r\ninterface CallTreeState {\r\n\tteams: Array,\r\n\troomNameRedirect: string | null\r\n}\r\n\r\nexport interface CallTreeProps {\r\n\tauthService: IAuthService,\r\n\tonCallCreated: (roomId: string) => any,\r\n\tgetCallDetailsAsync: () => Promise\r\n}\r\n\r\nexport interface EliteCallDetails {\r\n\tunitNumber: string | undefined,\r\n\tagencyId: string | undefined,\r\n\tagencyName: string | undefined\r\n}\r\n\r\nexport class CallTree extends Component, Readonly> {\r\n\t_callCreatedCallback: ((...args: any[]) => void) | null = null;\r\n\tuserService: IUserService;\r\n\tauthService: IAuthService;\r\n\tcallService: CallService;\r\n\tonCallCreated: (roomId: string) => any;\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tteams: [],\r\n\t\t\troomNameRedirect: null\r\n\t\t};\r\n\t\tthis.userService = new UserService(props.authService);\r\n\t\tthis.callService = new CallService(props.authService);\r\n\t\tthis.authService = props.authService;\r\n\t\tthis.onCallCreated = props.onCallCreated;\r\n\t}\r\n\r\n\tcomponentDidMount() {\r\n\t\tthis.updateContacts();\r\n\t}\r\n\r\n\talphaSort(a: string, b: string) {\r\n\t\tif ((a === null || a === undefined) && (b === null || b === undefined)) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tif (a === null || a === undefined) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\treturn a.localeCompare(b);\r\n\t}\r\n\r\n\tteamMemberSort(a: TeamMember, b: TeamMember) {\r\n\t\tif (a.status && !b.status) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tif (!a.status && b.status) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\tlet sortOrder = this.alphaSort(a.lastName, b.lastName);\r\n\t\tif (sortOrder === 0) {\r\n\t\t\tsortOrder = this.alphaSort(a.firstName, b.firstName);\r\n\t\t}\r\n\t\treturn sortOrder;\r\n\t}\r\n\r\n\tasync updateContacts() {\r\n\t\tconst teams = await this.userService.getTeamsStatuses();\r\n\t\tteams.sort((a, b) => this.alphaSort(a.name, b.name));\r\n\t\tteams.forEach(t => {\r\n\t\t\tt.existingMembers.sort((a, b) => this.teamMemberSort(a, b));\r\n\t\t});\r\n\r\n\t\tthis.setState({ teams });\r\n\t}\r\n\r\n\tasync createTeamMemberCall(to: TeamMember) {\r\n\t\tlet callDetails = await this.props.getCallDetailsAsync();\r\n\t\tlet response = await this.callService.createCall({\r\n\t\t\trecipientUser: to.userId,\r\n\t\t\trecipientTeam: undefined,\r\n\t\t\tunitNumber: callDetails.unitNumber,\r\n\t\t\tagencyId: callDetails.agencyId,\r\n\t\t\tagencyName: callDetails.agencyName\r\n\t\t});\r\n\t\tthis.onCallCreated(response.roomId);\r\n\t}\r\n\r\n\tasync createTeamCall(to: Team) {\r\n\t\tlet callDetails = await this.props.getCallDetailsAsync();\r\n\t\tlet response = await this.callService.createCall({\r\n\t\t\trecipientUser: undefined,\r\n\t\t\trecipientTeam: to.id,\r\n\t\t\tunitNumber: callDetails.unitNumber,\r\n\t\t\tagencyId: callDetails.agencyId,\r\n\t\t\tagencyName: callDetails.agencyName\r\n\t\t});\r\n\t\tthis.onCallCreated(response.roomId);\r\n\t}\r\n\r\n\trenderContact(contact: TeamMember) {\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\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t
{contact.firstName} {contact.lastName}
\r\n\t\t\t\t\t\t
\r\n\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\trenderTeam(team: Team) {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t)\r\n\t}\r\n\r\n\trender() {\r\n\t\tvar teamContents = this.state.teams.map(this.renderTeam.bind(this));\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\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\t\t

Available Providers

\r\n\t\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\t\t
Please select a team or an individual to initiate a call.
\r\n\t\t\t\t\t\t\t\t\t{teamContents}\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}","import React, { Component } from 'react';\r\nimport { Team, TeamMember } from 'telehealth-abstractions';\r\nimport { CallTreeTeamMember } from './CallTreeTeamMember';\r\n\r\nimport './CallTreeTeam.css';\r\n\r\nexport interface CallTreeTeamProps {\r\n\tcreateTeamCall: (team: Team) => Promise,\r\n\tcreateTeamMemberCall: (teamMember: TeamMember) => Promise,\r\n\tteam: Team\r\n}\r\n\r\ninterface CallTreeTeamState {\r\n\tisExpanded: boolean\r\n}\r\n\r\nexport class CallTreeTeam extends Component, CallTreeTeamState> {\r\n\tteam: Team;\r\n\tcreateTeamCall: (team: Team) => Promise;\r\n\tcreateTeamMemberCall: (teamMember: TeamMember) => Promise;\r\n\tisAvailable: boolean;\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tthis.team = props.team;\r\n\t\tthis.createTeamCall = props.createTeamCall;\r\n\t\tthis.createTeamMemberCall = props.createTeamMemberCall;\r\n\t\tthis.isAvailable = props.team.existingMembers && props.team.existingMembers.some(m => {\r\n\t\t\treturn m.status == true;\r\n\t\t});\r\n\t\tthis.state = {\r\n\t\t\tisExpanded: false\r\n\t\t};\r\n\t}\r\n\r\n\texpandOrContract() {\r\n\t\tthis.setState({ isExpanded: !this.state.isExpanded });\r\n\t}\r\n\r\n\trenderTeamMember(teamMember: TeamMember) {\r\n\t\treturn ();\r\n\t}\r\n\r\n\trender() {\r\n\t\tlet teamMembersContents: JSX.Element | null = null;\r\n\t\tlet expandoIcon: JSX.Element | null = null;\r\n\t\tlet headerClassName = \"call-tree-team-header\";\r\n\t\tif (this.state.isExpanded) {\r\n\t\t\tlet teamMembers = this.team.existingMembers.map(this.renderTeamMember.bind(this));\r\n\t\t\tteamMembersContents = (\r\n\t\t\t\t
\r\n\t\t\t\t\t{teamMembers}\r\n\t\t\t\t
\r\n\t\t\t);\r\n\t\t\texpandoIcon = ();\r\n\t\t\theaderClassName += \" expanded\";\r\n\t\t} else {\r\n\t\t\texpandoIcon = ();\r\n\t\t\tteamMembersContents = (
);\r\n\t\t}\r\n\t\tlet callButton: JSX.Element | null = null;\r\n\t\tif (this.isAvailable) {\r\n\t\t\tcallButton = ();\r\n\t\t} else {\r\n\t\t\tcallButton = ();\r\n\t\t}\r\n\t\t\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t

{this.team.name}

\r\n\t\t\t\t\t{callButton}\r\n\t\t\t\t\t{expandoIcon}\r\n\t\t\t\t
\r\n\t\t\t\t{teamMembersContents}\r\n\t\t\t
\r\n\t\t\t);\r\n\t}\r\n}","import React, { Component } from 'react';\r\nimport { TeamMember } from 'telehealth-abstractions';\r\n\r\nimport './CallTreeTeamMember.css';\r\n\r\nexport interface CallTreeTeamMemberProps {\r\n\tcreateTeamMemberCall: (teamMember: TeamMember) => Promise,\r\n\tteamMember: TeamMember\r\n}\r\n\r\nexport class CallTreeTeamMember extends Component, {}> {\r\n\tcreateTeamMemberCall: (teamMember: TeamMember) => Promise;\r\n\tteamMember: TeamMember;\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tthis.createTeamMemberCall = props.createTeamMemberCall;\r\n\t\tthis.teamMember = props.teamMember;\r\n\t}\r\n\r\n\trender() {\r\n\t\tlet statusIcon: JSX.Element | null = null;\r\n\t\tlet callButton: JSX.Element | null = null;\r\n\t\tif (this.teamMember.status) {\r\n\t\t\tstatusIcon = (\r\n\t\t\t\t\r\n\t\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\tcallButton = ();\r\n\t\t} else {\r\n\t\t\tstatusIcon = (\r\n\t\t\t\t\r\n\t\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\tcallButton = ();\r\n\t\t}\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t{statusIcon}\r\n\t\t\t\t{this.teamMember.firstName} {this.teamMember.lastName}\r\n\t\t\t\t{callButton}\r\n\t\t\t
\r\n\t\t\t);\r\n\t}\r\n}","export class CookieManager {\r\n\treadonly cameraCookieName = \"selected-camera\";\r\n readonly microphoneCookieName = \"selected-microphone\";\r\n\r\n private readCookie(name: string) {\r\n\t\tvar nameEq,\r\n\t\t\tcookieArray = document.cookie.split(\";\"),\r\n\t\t\ti,\r\n\t\t\tlen = cookieArray.length,\r\n\t\t\tc;\r\n\t\tif (!name) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tnameEq = name + \"=\";\r\n\t\tfor (i = 0; i < len; i++) {\r\n\t\t\tc = cookieArray[i];\r\n\t\t\twhile (c.charAt(0) === \" \") {\r\n\t\t\t\tc = c.substring(1, c.length);\r\n\t\t\t}\r\n\t\t\tif (c.indexOf(nameEq) === 0) {\r\n\t\t\t\treturn c.substring(nameEq.length, c.length);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n private setCookie = function (name: string, value: string, expirationDate: Date) {\r\n\t\tvar expires;\r\n\t\tif (!!expirationDate) {\r\n\t\t\texpires = \"; expires=\" + expirationDate.toUTCString();\r\n\t\t} else {\r\n\t\t\texpires = \"\";\r\n\t\t}\r\n\t\tif (!name) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (value === null || value === undefined) {\r\n\t\t\t// not a good situation because readCookie will return \"null\" instead of null and \"undefined\" instead of undefined\r\n\t\t\tthrow new Error(\"value was null or undefined in setCookie\");\r\n\t\t}\r\n\t\tvar isInsecureCookieAllowed = (location.hostname === \"localhost\" || location.hostname === \"127.0.0.1\");\r\n\t\tdocument.cookie = name + \"=\" + value + expires + \"; path=/\" + (isInsecureCookieAllowed ? \"\" : \";secure\") + \"; SameSite=Lax\";\r\n\t}\r\n\r\n getSelectedCamera() {\r\n return this.readCookie(this.cameraCookieName);\r\n }\r\n\r\n setSelectedCamera(deviceId: string) {\r\n const date = new Date();\r\n date.setUTCFullYear(date.getUTCFullYear() + 1);\r\n return this.setCookie(this.cameraCookieName, deviceId, date);\r\n }\r\n\r\n getSelectedMicrophone() {\r\n return this.readCookie(this.microphoneCookieName);\r\n }\r\n\r\n setSelectedMicrophone(deviceId: string) {\r\n const date = new Date();\r\n date.setUTCFullYear(date.getUTCFullYear() + 1);\r\n return this.setCookie(this.microphoneCookieName, deviceId, date);\r\n }\r\n}\r\n\r\nexport var cookieManager = new CookieManager();","\r\nimport React from 'react';\r\nimport { AudioTrackPublication, LocalTrackPublication, Participant, RemoteVideoTrackPublication, VideoTrackPublication } from 'twilio-video';\r\n\r\ninterface PublicationsProps {\r\n\tparticipant: Participant\r\n}\r\n\r\n// Twilio's typing for publications is not great. Their TrackPublication type is missing a lot of properties found on other publication types.\r\n// And we can get a list of Audio or Video publications to start with, but published event gives us Local or Remote publications.\r\nexport type TrackPublication = AudioTrackPublication | VideoTrackPublication | LocalTrackPublication | RemoteVideoTrackPublication;\r\n\r\nexport interface IPublicationsContext {\r\n\tpublications: TrackPublication[]\r\n}\r\n\r\nexport const PublicationsContext = React.createContext({ publications: [] });\r\n\r\nexport class Publications extends React.Component, Readonly> {\r\n\t// What we want is a Participant component\r\n\t// which has a Publications, Tracks, AudioTrack, and VideoTrack component\r\n\t// Publications accepts ParticipantInfo in the props\r\n\t// Tracks takes in Publications\r\n\t// AudioTrack, and VideoTrack depend on Tracks\r\n\t// So it looks something like: \r\n\t// \r\n\t//\t\t\r\n\t//\t\t\r\n\t//\t\t\r\n\t//\t\t\r\n\t// \r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tpublications: []\r\n\t\t};\r\n\t}\r\n\r\n\ttrackPublished = (publication: TrackPublication) => {\r\n\t\tthis.setState((state) => {\r\n\t\t\treturn {\r\n\t\t\t\tpublications: [...state.publications, publication]\r\n\t\t\t};\r\n\t\t});\r\n\t}\r\n\r\n\ttrackUnpublished = (publication: TrackPublication) => {\r\n\t\tthis.setState((state) => {\r\n\t\t\treturn {\r\n\t\t\t\tpublications: state.publications.filter(p => p !== publication)\r\n\t\t\t};\r\n\t\t});\r\n\t}\r\n\r\n\tcomponentDidMount() {\r\n\t\tlet publications: TrackPublication[] = Array.from(this.props.participant.audioTracks.values());\r\n\t\tpublications = publications.concat(Array.from(this.props.participant.videoTracks.values()));\r\n\t\tthis.setState({\r\n\t\t\tpublications\r\n\t\t});\r\n\t\tthis.props.participant.on('trackPublished', this.trackPublished);\r\n\t\tthis.props.participant.on('trackUnpublished', this.trackUnpublished);\r\n\t}\r\n\r\n\tcomponentWillUnmount() {\r\n\t\tthis.props.participant.off('trackPublished', this.trackPublished);\r\n\t\tthis.props.participant.off('trackUnpublished', this.trackUnpublished);\r\n\t}\r\n\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t{this.props.children}\r\n\t\t\t\r\n\t\t)\r\n\t}\r\n}","\r\nimport React from 'react';\r\nimport { LocalAudioTrack, LocalDataTrack, LocalVideoTrack, RemoteAudioTrack, RemoteVideoTrack } from 'twilio-video';\r\nimport { TrackPublication } from './Publications';\r\n\r\ninterface TrackSelectorProps {\r\n\tpublications: TrackPublication[],\r\n\ttrackSelector: (publications: TrackPublication[]) => TrackPublication | undefined\r\n}\r\n\r\nexport function selectMainVideoTrack(publications: TrackPublication[]) {\r\n\treturn publications.find(p => p.kind === 'video');\r\n}\r\n\r\nexport function selectMainAudioTrack(publications: TrackPublication[]) {\r\n\treturn publications.find(p => p.kind === 'audio');\r\n}\r\n\r\nexport type Track = RemoteVideoTrack | LocalVideoTrack | RemoteAudioTrack | LocalAudioTrack | LocalDataTrack | null | undefined\r\n\r\nexport interface ITrackContext {\r\n\ttrack: Track\r\n}\r\n\r\nexport const TrackContext = React.createContext({ track: undefined })\r\n\r\nexport class TrackSelector extends React.Component, Readonly> {\r\n\tpublication: TrackPublication | undefined;\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tthis.publication = this.props.trackSelector(this.props.publications);\r\n\t\tthis.state = {\r\n\t\t\ttrack: this.publication?.track\r\n\t\t};\r\n\t}\r\n\r\n\ttrackSubscribed = (track: Track) => {\r\n\t\tthis.setState((state) => {\r\n\t\t\treturn {\r\n\t\t\t\ttrack\r\n\t\t\t};\r\n\t\t});\r\n\t}\r\n\t\r\n\ttrackUnsubscribed = () => {\r\n\t\tthis.setState((state) => {\r\n\t\t\treturn {\r\n\t\t\t\ttrack: undefined\r\n\t\t\t};\r\n\t\t});\r\n\t}\r\n\r\n\tcomponentDidMount() {\r\n\t\tthis.onPublication(this.publication);\r\n\t}\r\n\r\n\tcomponentWillUnmount() {\r\n\t\tthis.offPublication(this.publication);\r\n\t}\r\n\r\n\tonPublication(publication: TrackPublication | undefined) {\r\n\t\tif (publication) {\r\n\t\t\tpublication.on('subscribed', this.trackSubscribed);\r\n\t\t\tpublication.on('unsubscribed', this.trackUnsubscribed);\r\n\t\t}\r\n\t}\r\n\r\n\toffPublication(publication: TrackPublication | undefined) {\r\n\t\tif (publication) {\r\n\t\t\tpublication.off('subscribed', this.trackSubscribed);\r\n\t\t\tpublication.off('unsubscribed', this.trackUnsubscribed);\r\n\t\t}\r\n\t}\r\n\r\n\tupdatePublication(newPublication: TrackPublication | undefined) {\r\n\t\tthis.setState({\r\n\t\t\ttrack: newPublication?.track\r\n\t\t});\r\n\t\tthis.offPublication(this.publication);\r\n\t\tthis.onPublication(newPublication);\r\n\t\tthis.publication = newPublication;\r\n\t}\r\n\r\n\tcomponentDidUpdate(prevProps: TrackSelectorProps) {\r\n\t\tif (this.props.publications !== prevProps.publications || this.props.trackSelector !== prevProps.trackSelector) {\r\n\t\t\tconst newPublication = this.props.trackSelector(this.props.publications);\r\n\t\t\tif (newPublication !== this.publication) {\r\n\t\t\t\tthis.updatePublication(newPublication);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t{this.props.children}\r\n\t\t\t\r\n\t\t)\r\n\t}\r\n}","import React, { Component } from 'react';\r\nimport { connect, createLocalVideoTrack, Room as TwilioRoom, LocalVideoTrack, Participant as TwilioParticipant } from 'twilio-video';\r\nimport { ParticipantInfo } from './ParticipantInfo';\r\nimport { deviceManager, DeviceManagerEvents, DeviceInfo } from './DeviceManager';\r\nimport { AudioManager } from './AudioManager';\r\nimport { ChatManager } from './ChatManager';\r\nimport { VideoManager } from './VideoManager';\r\nimport { RoomManager, RoomManagerEvents } from './RoomManager';\r\nimport { LeaveRoomModal } from './LeaveRoomModal';\r\nimport { RoomHeader } from './RoomHeader';\r\nimport { RoomBody } from './RoomBody';\r\nimport { ChatSlider } from './ChatSlider';\r\nimport { SettingsSlider } from './SettingsSlider';\r\nimport './CallHeader.css';\r\nimport './Room.css';\r\nimport { IAuthService, IRoomAdapter, IUserService } from 'telehealth-abstractions';\r\nimport { urlHelper, UserService } from 'telehealth-api';\r\n\r\nenum CallState {\r\n\tLOADING = 0,\r\n\tGET_USER_INFO = 1,\r\n\tPOPULATE_INPUT_DEVICES = 2,\r\n\tCHAT_CONNECTING = 4,\r\n\tGET_TOKEN = 5,\r\n\tCONNECTING = 6,\r\n\tCONNECTED = 7,\r\n\tDISCONNECTING = 8,\r\n\tDISCONNECTED = 9,\r\n}\r\n\r\ninterface RoomProps {\r\n\tauthService: IAuthService,\r\n\troomAdapter: IRoomAdapter,\r\n\troomId: string\r\n}\r\n\r\ninterface RoomState {\r\n\ttoken: string | null,\r\n\tcallState: CallState,\r\n\troomId: string | null,\r\n\tuserId: string | null | undefined,\r\n\taudioDevices: Array,\r\n\tvideoDevices: Array,\r\n\tparticipants: Array,\r\n\tshowLeaveRoomModal: boolean\r\n}\r\n\r\ninterface EventHandler {\r\n\ttarget: EventTarget,\r\n\teventName: string,\r\n\tlistener: EventListener\r\n}\r\n\r\nexport class Room extends Component, Readonly> {\r\n\tselectedAudioDeviceId: string | null = null;\r\n\tselectedVideoDeviceId: string | null = null;\r\n\troom: TwilioRoom | null = null;\r\n\teventHandlers: Array = [];\r\n\tvideoManager: VideoManager | null = null;\r\n\taudioManager: AudioManager | null = null;\r\n\tchatManager: ChatManager;\r\n\troomManager: RoomManager;\r\n\tauthService: IAuthService;\r\n\tcallHasEnded: boolean = false;\r\n\tcallHasBeenAnswered: boolean = false;\r\n\tuserService: IUserService;\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttoken: null,\r\n\t\t\tcallState: CallState.LOADING,\r\n\t\t\troomId: props.roomId,\r\n\t\t\tuserId: null,\r\n\t\t\taudioDevices: [],\r\n\t\t\tvideoDevices: [],\r\n\t\t\tparticipants: [],\r\n\t\t\tshowLeaveRoomModal: false\r\n\t\t};\r\n\t\tthis.authService = props.authService;\r\n\t\tthis.userService = new UserService(this.authService);\r\n\t\tthis.chatManager = new ChatManager(this.authService);\r\n\t\tthis.roomManager = new RoomManager();\r\n\t}\r\n\r\n\tcomponentDidMount() {\r\n\t\tthis.setState({ callState: CallState.GET_USER_INFO });\r\n\t\tthis.getUserInfo();\r\n\t}\r\n\r\n\tcomponentWillUnmount() {\r\n\t\tif (this.chatManager) {\r\n\t\t\tthis.chatManager.disconnect();\r\n\t\t}\r\n\t\tdeviceManager.off(DeviceManagerEvents.SELECTED_CAMERA_CHANGED, this.cameraChanged);\r\n\t\tdeviceManager.off(DeviceManagerEvents.SELECTED_MICROPHONE_CHANGED, this.microphoneChanged);\r\n\t}\r\n\r\n\tisInIframe() {\r\n\t\ttry {\r\n\t\t\treturn window.self !== window.top;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\r\n\tshowLeaveRoomModal = () => {\r\n\t\tthis.setState({\r\n\t\t\tshowLeaveRoomModal: true\r\n\t\t});\r\n\t}\r\n\r\n\tleaveRoomCallback = async (leaveRoom: boolean) => {\r\n\t\tthis.setState({\r\n\t\t\tshowLeaveRoomModal: false\r\n\t\t});\r\n\t\tif (!leaveRoom) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.disconnect();\r\n\t\tawait this.endCall();\r\n\t\tthis.props.roomAdapter.leaveRoom();\r\n\t}\r\n\r\n\tasync endCall() {\r\n\t\tif (!this.callHasEnded) {\r\n\t\t\tawait this.props.roomAdapter.endCallCallback(this.props.roomId);\r\n\t\t\tthis.callHasEnded = true;\r\n\t\t}\r\n\t}\r\n\r\n\tasync initializeChat() {\r\n\t\tawait this.chatManager.connectAsync();\r\n\t\tthis.setState({ callState: CallState.GET_TOKEN });\r\n\t\tthis.populateToken();\r\n\t}\r\n\r\n\trenderRoom() {\r\n\t\tlet modalContents: JSX.Element | null = null;\r\n\t\tif (this.state.showLeaveRoomModal) {\r\n\t\t\tmodalContents = ();\r\n\t\t}\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\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t{modalContents}\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n\trender() {\r\n\t\tswitch (this.state.callState) {\r\n\t\t\tdefault:\r\n\t\t\tcase CallState.LOADING:\r\n\t\t\t\treturn (

Loading...

);\r\n\t\t\tcase CallState.GET_USER_INFO:\r\n\t\t\t\treturn (

Getting user info...

);\r\n\t\t\tcase CallState.POPULATE_INPUT_DEVICES:\r\n\t\t\t\treturn (

Getting input devices...

);\r\n\t\t\tcase CallState.CHAT_CONNECTING:\r\n\t\t\t\treturn (

Connecting to chat...

);\r\n\t\t\tcase CallState.GET_TOKEN:\r\n\t\t\t\treturn (

Getting token...

);\r\n\t\t\tcase CallState.CONNECTING:\r\n\t\t\t\treturn (

Connecting...

);\r\n\t\t\tcase CallState.CONNECTED:\r\n\t\t\t\treturn this.renderRoom();\r\n\t\t\tcase CallState.DISCONNECTING:\r\n\t\t\t\treturn (

Disconnecting...

);\r\n\t\t\tcase CallState.DISCONNECTED:\r\n\t\t\t\treturn (

Disconnected...

);\r\n\t\t}\r\n\t}\r\n\r\n\tasync getUserInfo() {\r\n\t\tconst userId = await this.authService.getUserId();\r\n\t\tthis.setState({ userId: userId, callState: CallState.POPULATE_INPUT_DEVICES });\r\n\t\tthis.populateInputDevices();\r\n\t}\r\n\r\n\tasync populateInputDevices() {\r\n\t\tlet devices = await deviceManager.getDevicesAsync();\r\n\t\tif (devices.selectedAudioDevice && devices.selectedVideoDevice) {\r\n\t\t\t// we have default devices, lets use them\r\n\t\t\tthis.selectedAudioDeviceId = devices.selectedAudioDevice?.deviceId;\r\n\t\t\tthis.selectedVideoDeviceId = devices.selectedVideoDevice?.deviceId;\r\n\t\t}\r\n\t\tdeviceManager.on(DeviceManagerEvents.SELECTED_CAMERA_CHANGED, this.cameraChanged);\r\n\t\tdeviceManager.on(DeviceManagerEvents.SELECTED_MICROPHONE_CHANGED, this.microphoneChanged);\r\n\t\tthis.setState({ audioDevices: devices.audioDevices, videoDevices: devices.videoDevices, callState: CallState.CHAT_CONNECTING });\r\n\t\tthis.initializeChat();\r\n\t}\r\n\r\n\tcameraChanged = async (deviceId: string) => {\r\n\t\tawait this.videoManager?.changeCamera(deviceId);\r\n\t}\r\n\r\n\tmicrophoneChanged = async (deviceId: string) => {\r\n\t\tawait this.audioManager?.changeMicrophone(deviceId);\r\n\t}\r\n\r\n\tasync populateToken() {\r\n\t\tlet apiToken = await this.authService.getAccessToken();\r\n\t\tlet response = await fetch(urlHelper.resolveUrl(`api/v1.0/token?roomName=${this.state.roomId}`), {\r\n\t\t\theaders: !apiToken ? {} : { 'Authorization': `Bearer ${apiToken}` },\r\n\t\t\tmethod: 'POST'\r\n\t\t});\r\n\t\tlet data = await response.json();\r\n\t\tthis.setState({ token: data.token, callState: CallState.CONNECTING });\r\n\t\tthis.selectAndJoinRoom();\r\n\t}\r\n\r\n\tdisconnect() {\r\n\t\tif (this.videoManager) {\r\n\t\t\tthis.videoManager.pauseVideo();\r\n\t\t}\r\n\t\tif (!this.room) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.room.disconnect();\r\n\t}\r\n\r\n\tonDisconnected(room: TwilioRoom, error: Error) {\r\n\t\tthis.removeAllEventListeners();\r\n\t\t// TODO: reset participants and room state\r\n\t\tthis.setState({\r\n\t\t\ttoken: null,\r\n\t\t\tcallState: CallState.DISCONNECTED,\r\n\t\t\troomId: this.state.roomId,\r\n\t\t\tuserId: null,\r\n\t\t\taudioDevices: [],\r\n\t\t\tvideoDevices: [],\r\n\t\t\tparticipants: []\r\n\t\t});\r\n\t}\r\n\r\n\tasync handleVisibilityChange() {\r\n\t\tif (!this.videoManager) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (document.visibilityState === 'hidden') {\r\n\t\t\tthis.videoManager.pauseVideo();\r\n\t\t} else {\r\n\t\t\tawait this.videoManager.resumeVideo();\r\n\t\t}\r\n\t}\r\n\r\n\tisMobile = (() => {\r\n\t\tif (typeof navigator === 'undefined' || typeof navigator.userAgent !== 'string') {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn /Mobile/.test(navigator.userAgent);\r\n\t})();\r\n\r\n\taddEventListener(target: EventTarget, eventName: string, listener: EventListener) {\r\n\t\tthis.eventHandlers.push({\r\n\t\t\ttarget,\r\n\t\t\teventName,\r\n\t\t\tlistener\r\n\t\t});\r\n\t\ttarget.addEventListener(eventName, listener);\r\n\t}\r\n\r\n\tremoveAllEventListeners() {\r\n\t\tthis.eventHandlers.forEach(e => e.target.removeEventListener(e.eventName, e.listener));\r\n\t}\r\n\r\n\tasync callAnswered(userId: string) {\r\n\t\tlet userInfo = await this.userService.getUserInfo(userId);\r\n\t\tthis.props.roomAdapter.callAnsweredCallback(this.props.roomId, userInfo.name, userId);\r\n\t}\r\n\r\n\t/* Participant */\r\n\tparticipantConnected(participant: TwilioParticipant) {\r\n\t\tif (!this.room) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tlet isLocalParticipant = participant === this.room.localParticipant;\r\n\t\tif (this.state.participants.some(p => participant.sid === p.sid)) {\r\n\t\t\tconsole.log('Participant reconnected ' + participant.sid);\r\n\t\t\t// they are already in here\r\n\t\t\tlet updatedParticipants = this.state.participants.concat([]);\r\n\t\t\tupdatedParticipants[updatedParticipants.findIndex(p => p.sid === participant.sid)] = this.createParticipant(participant);\r\n\t\t\tthis.setState({ participants: updatedParticipants });\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!isLocalParticipant && !this.callHasBeenAnswered) {\r\n\t\t\tthis.callAnswered(participant.identity);\r\n\t\t\tthis.callHasBeenAnswered = true;\r\n\t\t}\r\n\t\tconsole.log('Participant connected ' + participant.sid);\r\n\t\t// handle any tracks that are added later\r\n\t\tthis.setState({ participants: this.state.participants.concat([this.createParticipant(participant)]) });\r\n\t}\r\n\r\n\tparticipantDisconnected(participant: TwilioParticipant) {\r\n\t\tif (this.state.participants.some(p => participant.sid === p.sid)) {\r\n\t\t\t// they are already in here\r\n\t\t\tlet updatedParticipants = this.state.participants.concat([]);\r\n\t\t\tupdatedParticipants.splice(updatedParticipants.findIndex(p => p.sid === participant.sid), 1);\r\n\t\t\tthis.setState({ participants: updatedParticipants });\r\n\t\t\tthis.endCall();\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\tsetCurrentActiveParticipant() {\r\n\t\t//TODO\r\n\t}\r\n\t/* END Participant */\r\n\r\n\tasync selectAndJoinRoom() {\r\n\t\t// select microphone\r\n\t\t// select camera\r\n\t\t// get a token\r\n\t\t// setup the connect options\r\n\t\tif (!this.selectedAudioDeviceId) {\r\n\t\t\tthrow new Error('No audio device selected when trying to connect to a room.');\r\n\t\t}\r\n\t\tif (!this.selectedVideoDeviceId) {\r\n\t\t\tthrow new Error('No video device selected when trying to connect to a room.');\r\n\t\t}\r\n\t\tlet connectOptions = {\r\n\t\t\taudio: {\r\n\t\t\t\tdeviceId: {\r\n\t\t\t\t\texact: this.selectedAudioDeviceId\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tname: this.state.roomId,\r\n\t\t\tvideo: {\r\n\t\t\t\tdeviceId: {\r\n\t\t\t\t\texact: this.selectedVideoDeviceId\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\tif (!this.state.token) {\r\n\t\t\tthrow new Error('Missing token when trying to connect to a room.');\r\n\t\t}\r\n\t\t// connect to the room\r\n\t\tthis.room = await connect(this.state.token, connectOptions);\r\n\t\tthis.videoManager = new VideoManager(this.room.localParticipant, this.selectedVideoDeviceId);\r\n\t\tthis.audioManager = new AudioManager(this.room.localParticipant);\r\n\t\t// subscribe to participants\r\n\t\tthis.participantConnected(this.room.localParticipant);\r\n\t\tthis.room.participants.forEach(this.participantConnected.bind(this));\r\n\t\tthis.room.on('participantConnected', this.participantConnected.bind(this));\r\n\t\tthis.room.on('participantDisconnected', this.participantDisconnected.bind(this));\r\n\t\t// setup dominant speaker\r\n\t\tthis.setCurrentActiveParticipant();\r\n\t\tthis.room.on('dominantSpeakerChanged', this.setCurrentActiveParticipant.bind(this));\r\n\t\t// setup disconnect\r\n\t\tthis.addEventListener(window, 'beforeunload', this.disconnect.bind(this));\r\n\t\tif (this.isMobile) {\r\n\t\t\tthis.addEventListener(window, 'onpagehide', this.disconnect.bind(this));\r\n\t\t\tthis.addEventListener(window.document, 'visibilitychange', this.handleVisibilityChange.bind(this));\r\n\t\t}\r\n\t\tthis.room.once('disconnected', this.onDisconnected.bind(this));\r\n\t\tthis.setState({ callState: CallState.CONNECTED });\r\n\t\tthis.props.roomAdapter.startCallCallback(this.props.roomId);\r\n\t}\r\n\r\n\tprivate createParticipant(participant: TwilioParticipant): ParticipantInfo {\r\n\t\t//createParticipant is only called from participantConnected, so we know room is defined\r\n\t\tlet isLocalParticipant = participant === this.room!.localParticipant;\r\n\r\n\t\tlet p = new ParticipantInfo(participant.identity, participant.sid, isLocalParticipant, participant);\r\n\t\t\r\n\t\treturn p;\r\n\t}\r\n}","import React from 'react';\r\nimport { BaseModalState, Modal } from './common/modal/Modal';\r\nimport { ModalFooter } from './common/modal/ModalFooter';\r\nimport { ModalBody } from './common/modal/ModalBody';\r\nimport { ModalHeader } from './common/modal/ModalHeader';\r\n\r\nexport interface LeaveRoomModalProps {\r\n\tleaveRoomCallback(leaveRoom: boolean): Promise\r\n}\r\n\r\nexport class LeaveRoomModal extends React.Component, Readonly> {\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tshow: true\r\n\t\t};\r\n\t}\r\n\r\n\tleave = () => {\r\n\t\tthis.setState({ show: false });\r\n\t\tthis.props.leaveRoomCallback(true);\r\n\t}\r\n\r\n\tstay = () => {\r\n\t\tthis.setState({ show: false });\r\n\t\tthis.props.leaveRoomCallback(false);\r\n\t}\r\n\r\n\trender() {\r\n\t\tif (!this.state.show) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t

Are you sure you want to leave the call?

\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\tNo, stay connected\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}","import React, { Component } from 'react';\r\nimport { ToggleAudioButton, ToggleAudioButtonProps } from './ToggleAudioButton';\r\nimport { ToggleVideoButton, ToggleVideoButtonProps } from './ToggleVideoButton';\r\nimport { ToggleChatButton, ToggleChatButtonProps } from './ToggleChatButton';\r\nimport { ToggleSettingsButton, ToggleSettingsButtonProps } from './ToggleSettingsButton';\r\nimport { LeaveRoomButton, LeaveRoomButtonProps } from './LeaveRoomButton';\r\nimport './RoomHeader.css';\r\n\r\ninterface RoomHeaderProps extends ToggleAudioButtonProps, ToggleChatButtonProps, ToggleVideoButtonProps, ToggleSettingsButtonProps, LeaveRoomButtonProps {\r\n}\r\n\r\nexport class RoomHeader extends React.Component, Readonly<{}>> {\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\trender() {\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\n\t}\r\n}","import React, { Component } from 'react';\r\nimport { AudioManager, AudioManagerEvents } from './AudioManager';\r\n\r\nexport interface ToggleAudioButtonProps {\r\n\taudioManager: AudioManager | null\r\n}\r\n\r\ninterface ToggleAudioButtonState {\r\n\tisMuted: boolean\r\n}\r\n\r\nexport class ToggleAudioButton extends React.Component, Readonly> {\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tlet isMuted = false;\r\n\t\tif (props.audioManager) {\r\n\t\t\tisMuted = props.audioManager.isMuted();\r\n\t\t\tprops.audioManager.on(AudioManagerEvents.AUDIO_MUTED, this.updateMuteStatus);\r\n\t\t}\r\n\t\tthis.state = {\r\n\t\t\tisMuted: false\r\n\t\t};\r\n\t}\r\n\r\n\tcomponentWillUnmount() {\r\n\t\tif (this.props.audioManager) {\r\n\t\t\tthis.props.audioManager.off(AudioManagerEvents.AUDIO_MUTED, this.updateMuteStatus);\r\n\t\t}\r\n\t}\r\n\r\n\tupdateMuteStatus = (isMuted: boolean) => {\r\n\t\tthis.setState({\r\n\t\t\tisMuted\r\n\t\t});\r\n\t}\r\n\r\n\tmute = () => {\r\n\t\tif (this.props.audioManager) {\r\n\t\t\tthis.props.audioManager.mute();\r\n\t\t}\r\n\t}\r\n\r\n\tunmute = () => {\r\n\t\tif (this.props.audioManager) {\r\n\t\t\tthis.props.audioManager.unmute();\r\n\t\t}\r\n\t}\r\n\r\n\trender() {\r\n\t\tif (this.state.isMuted) {\r\n\t\t\treturn (\r\n\t\t\t\t\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}","import React, { Component } from 'react';\r\nimport { VideoManager, VideoManagerEvents } from './VideoManager';\r\n\r\nexport interface ToggleVideoButtonProps {\r\n\tvideoManager: VideoManager | null\r\n}\r\n\r\ninterface ToggleVideoButtonState {\r\n\tisVideoEnabled: boolean\r\n}\r\n\r\nexport class ToggleVideoButton extends React.Component, Readonly> {\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tlet videoStatus = true;\r\n\t\tif (props.videoManager) {\r\n\t\t\tvideoStatus = props.videoManager.getVideoStatus();\r\n\t\t}\r\n\t\tthis.state = {\r\n\t\t\tisVideoEnabled: true\r\n\t\t};\r\n\t}\r\n\r\n\tcomponentDidMount() {\r\n\t\tif (this.props.videoManager) {\r\n\t\t\tthis.props.videoManager.on(VideoManagerEvents.VIDEO_STATUS, this.updateVideoState);\r\n\t\t}\r\n\t}\r\n\r\n\tcomponentWillUnmount() {\r\n\t\tif (this.props.videoManager) {\r\n\t\t\tthis.props.videoManager.off(VideoManagerEvents.VIDEO_STATUS, this.updateVideoState);\r\n\t\t}\r\n\t}\r\n\r\n\tupdateVideoState = (videoEnabled: boolean) => {\r\n\t\tthis.setState({\r\n\t\t\tisVideoEnabled: videoEnabled\r\n\t\t});\r\n\t}\r\n\r\n\tswitchVideo = () => {\r\n\t\tif (this.props.videoManager) {\r\n\t\t\tthis.props.videoManager.pauseOrUnpauseVideo();\r\n\t\t}\r\n\t}\r\n\r\n\trender() {\r\n\t\tif (!this.props.videoManager) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tlet videoIcon = (\r\n\t\t\t\r\n\t\t);\r\n\t\tif (!this.state.isVideoEnabled) {\r\n\t\t\tvideoIcon = (\r\n\t\t\t\t\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}","import React, { Component } from 'react';\r\nimport { RoomManager } from './RoomManager';\r\n\r\nexport interface ToggleChatButtonProps {\r\n\troomManager: RoomManager\r\n}\r\n\r\nexport class ToggleChatButton extends React.Component, Readonly<{}>> {\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n showOrHideChat() {\r\n if (this.props.roomManager.getShowChat()) {\r\n this.props.roomManager.hideChat();\r\n } else {\r\n this.props.roomManager.showChat();\r\n }\r\n }\r\n\r\n\trender() {\r\n return (\r\n \r\n );\r\n\t}\r\n}","import React, { Component } from 'react';\r\nimport { RoomManager } from './RoomManager';\r\n\r\nexport interface ToggleSettingsButtonProps {\r\n\troomManager: RoomManager\r\n}\r\n\r\nexport class ToggleSettingsButton extends React.Component, Readonly<{}>> {\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n showOrHideSettings() {\r\n if (this.props.roomManager.getShowSettings()) {\r\n this.props.roomManager.hideSettings();\r\n } else {\r\n this.props.roomManager.showSettings();\r\n }\r\n }\r\n\r\n\trender() {\r\n return (\r\n \r\n );\r\n\t}\r\n}","import React, { Component } from 'react';\r\nimport './LeaveRoomButton.css';\r\n\r\nexport interface LeaveRoomButtonProps {\r\n\tshowLeaveRoomModal: () => void\r\n}\r\n\r\nexport class LeaveRoomButton extends React.Component, Readonly<{}>> {\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {};\r\n\t}\r\n\r\n\trender() {\r\n\t\treturn (\r\n\t\t\t\t\r\n\t\t);\r\n\t}\r\n}","import React, { Component } from 'react';\r\nimport { ParticipantInfo } from './ParticipantInfo';\r\nimport { ParticipantCard } from './ParticipantCard';\r\nimport './RoomBody.css';\r\n\r\ninterface RoomBodyProps {\r\n participants: ParticipantInfo[]\r\n}\r\n\r\nexport class RoomBody extends React.Component, Readonly<{}>> {\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\trender() {\r\n const participantContents = this.props.participants.map(p => ());\r\n\t\tlet connectingMessageContents = null;\r\n\t\tif (!this.props.participants.some(p => !p.isLocalParticipant)) {\r\n\t\t\t// render the connecting message\r\n\t\t\tconnectingMessageContents = (\r\n\t\t\t\t
\r\n\t\t\t\t\tWaiting for Participant...\r\n\t\t\t\t
\r\n\t\t\t);\r\n\t\t}\r\n return (\r\n
\r\n {participantContents}\r\n {connectingMessageContents}\r\n
\r\n );\r\n\t}\r\n}","import React, { Component } from 'react';\r\nimport { ChatManager, ChatManagerEvents } from './ChatManager';\r\nimport { RoomManager, RoomManagerEvents } from './RoomManager';\r\nimport { ChatMessage } from './ChatMessage';\r\nimport './ChatSlider.css';\r\n\r\ninterface ChatSliderProps {\r\n chatManager: ChatManager,\r\n\troomManager: RoomManager,\r\n currentUserId: string | null | undefined,\r\n roomId: string | null\r\n}\r\n\r\ninterface ChatSliderState {\r\n messages: ChatMessage[],\r\n sliderCss: string\r\n}\r\n\r\nexport class ChatSlider extends React.Component, Readonly> {\r\n chatComposerRef: HTMLTextAreaElement | null = null;\r\n\tchatMessagesRef: HTMLElement | null = null;\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n this.state = {\r\n messages: [],\r\n sliderCss: 'room-slider'\r\n };\r\n\t}\r\n\r\n\tcomponentDidMount() {\r\n\t\tthis.props.chatManager.on(ChatManagerEvents.MESSAGE_RECEIVED, this.messageReceived);\r\n this.props.roomManager.on(RoomManagerEvents.SHOW_CHAT_STATUS, this.hideOrShowSlider);\r\n\t}\r\n\r\n componentWillUnmount() {\r\n\t\tthis.props.chatManager.off(ChatManagerEvents.MESSAGE_RECEIVED, this.messageReceived);\r\n this.props.chatManager.off(RoomManagerEvents.SHOW_CHAT_STATUS, this.hideOrShowSlider);\r\n\t}\r\n\r\n private hideOrShowSlider = (showChat: boolean) => {\r\n if (showChat) {\r\n this.setState({ sliderCss: 'room-slider show-slider'});\r\n } else {\r\n this.setState({ sliderCss: 'room-slider' });\r\n }\r\n }\r\n\r\n private messageReceived = (message: ChatMessage) => {\r\n const messageClone = this.state.messages.concat([]);\r\n\t\tmessageClone.push(message);\r\n\t\tthis.setState({ messages: messageClone });\r\n\t\tif (this.chatMessagesRef) {\r\n\t\t\tthis.chatMessagesRef.scrollTo(0, this.chatMessagesRef.scrollHeight);\r\n\t\t}\r\n }\r\n\r\n private renderChatMessages() {\r\n\t\tif (this.state.messages.length === 0) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tlet previousMessage = null;\r\n\t\tlet currentMessage = null;\r\n\t\tlet lineNumber = 0;\r\n\t\tlet lines = [];\r\n\t\tfor (let i = 0; i < this.state.messages.length; i++) {\r\n\t\t\tpreviousMessage = currentMessage;\r\n\t\t\tcurrentMessage = this.state.messages[i];\r\n\t\t\tlet alignmentClass = currentMessage.userId === this.props.currentUserId ? 'room-chat-message-right' : 'room-chat-message-left';\r\n\t\t\tif (previousMessage === null || previousMessage.userId !== currentMessage.userId) {\r\n\t\t\t\t// add the user's display name if the previous chat message was not\r\n\t\t\t\t// sent by that user.\r\n\t\t\t\tlet userClassname = alignmentClass + \" room-chat-username\";\r\n\t\t\t\tlines.push((
{currentMessage.userDisplayName}
));\r\n\t\t\t\tlineNumber++;\r\n\t\t\t}\r\n\t\t\tlet messageClassname = alignmentClass + \" room-chat-message\";\r\n\t\t\tlines.push((
{currentMessage.message}
));\r\n\t\t\tlineNumber++;\r\n\t\t}\r\n\t\treturn lines;\r\n\t}\r\n\r\n private handleMessageKeyDown(event: React.KeyboardEvent) {\r\n\t\tif (event.key !== 'Enter') {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!this.chatComposerRef) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!this.props.chatManager.getIsConnected()) {\r\n\t\t\treturn;\r\n\t\t}\r\n if (!this.props.roomId) {\r\n return;\r\n }\r\n\t\tevent.preventDefault();\r\n\t\tlet message = this.chatComposerRef.value;\r\n\t\tif (!message) {\r\n\t\t\treturn;\r\n\t\t}\r\n this.props.chatManager.broadcastMessage(message, this.props.roomId);\r\n\t\tthis.chatComposerRef.value = '';\r\n\t}\r\n\r\n\trender() {\r\n let messageContents = this.renderChatMessages();\r\n return (\r\n
\r\n
\r\n
{ this.chatMessagesRef = chatMessagesRef }}>\r\n {messageContents}\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n\t}\r\n}","import React, { Component } from 'react';\r\nimport { Col, Row } from 'reactstrap';\r\nimport { RoomManager, RoomManagerEvents } from './RoomManager';\r\nimport { DeviceManager, Devices, DeviceInfo, DeviceManagerEvents } from './DeviceManager';\r\nimport { SelectInput } from './common/SelectInput';\r\n\r\nimport './SettingsSlider.css';\r\n\r\ninterface SettingsSliderProps {\r\n roomManager: RoomManager,\r\n deviceManager: DeviceManager\r\n}\r\n\r\ninterface SettingsSliderState {\r\n sliderCss: string,\r\n selectedCamera: string | undefined,\r\n selectedMicrophone: string | undefined\r\n}\r\n\r\nexport class SettingsSlider extends React.Component, Readonly> {\r\n chatComposerRef: HTMLTextAreaElement | null = null;\r\n\tchatMessagesRef: HTMLElement | null = null;\r\n devices: Devices;\r\n\r\n\tconstructor(props: Readonly) {\r\n\t\tsuper(props);\r\n this.devices = this.getDevices();\r\n this.state = {\r\n sliderCss: 'room-slider settings-slider',\r\n selectedCamera: this.devices.selectedVideoDevice?.deviceId,\r\n selectedMicrophone: this.devices.selectedAudioDevice?.deviceId\r\n };\r\n\t}\r\n\r\n componentDidMount() {\r\n this.props.roomManager.on(RoomManagerEvents.SHOW_SETTINGS_STATUS, this.hideOrShowSlider);\r\n this.props.deviceManager.on(DeviceManagerEvents.SELECTED_CAMERA_CHANGED, this.loadDevices);\r\n this.props.deviceManager.on(DeviceManagerEvents.SELECTED_MICROPHONE_CHANGED, this.loadDevices);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.roomManager.off(RoomManagerEvents.SHOW_SETTINGS_STATUS, this.hideOrShowSlider);\r\n this.props.deviceManager.off(DeviceManagerEvents.SELECTED_CAMERA_CHANGED, this.loadDevices);\r\n this.props.deviceManager.off(DeviceManagerEvents.SELECTED_MICROPHONE_CHANGED, this.loadDevices);\r\n\t}\r\n\r\n private hideOrShowSlider = (showChat: boolean) => {\r\n if (showChat) {\r\n this.setState({ sliderCss: 'room-slider settings-slider show-slider'});\r\n } else {\r\n this.setState({ sliderCss: 'room-slider settings-slider' });\r\n }\r\n }\r\n\r\n private getDevices() {\r\n let devices = this.props.deviceManager.getCachedDevices();\r\n if (!devices) {\r\n throw new Error('Devices must be loaded before displaying Settings panel.');\r\n }\r\n return devices;\r\n }\r\n\r\n private loadDevices = () => {\r\n this.devices = this.getDevices();\r\n }\r\n\r\n private selectCamera(camera: DeviceInfo | undefined) {\r\n if (!camera) {\r\n return;\r\n }\r\n this.props.deviceManager.setCamera(camera);\r\n this.setState({ selectedCamera: camera.deviceId });\r\n }\r\n\r\n private selectMicrophone(microphone: DeviceInfo | undefined) {\r\n if (!microphone) {\r\n return;\r\n }\r\n this.props.deviceManager.setMicrophone(microphone);\r\n this.setState({ selectedMicrophone: microphone.deviceId });\r\n }\r\n\r\n\trender() {\r\n return (\r\n
\r\n \r\n \r\n

Camera and Microphone Settings

\r\n \r\n
\r\n \r\n \r\n

Camera Device

\r\n this.selectCamera(chosen) }\r\n controlId=\"select-camera\"\r\n labelText=\"Camera\"\r\n icon=\"fa-video\"\r\n optionText={option => option?.label ?? \"Please Select\"}\r\n optionValue={option => option.deviceId}\r\n selected={this.state.selectedCamera}\r\n\t\t\t\t\t\t\t/>\r\n \r\n
\r\n
\r\n \r\n \r\n

Audio Device

\r\n this.selectMicrophone(chosen) }\r\n controlId=\"select-microphone\"\r\n labelText=\"Microphone\"\r\n icon=\"fa-microphone\"\r\n optionText={option => option?.label ?? \"Please Select\"}\r\n optionValue={option => option.deviceId}\r\n selected={this.state.selectedMicrophone}\r\n\t\t\t\t\t\t\t/>\r\n \r\n
\r\n
\r\n );\r\n\t}\r\n}","import React, { useEffect, useState, Fragment } from 'react';\r\nimport { Input, Label } from 'reactstrap';\r\n\r\nimport './SelectInput.css';\r\n\r\ninterface SelectInputProps {\r\n\toptions: Iterable\r\n\tcontrolId: string;\r\n\tlabelText?: string;\r\n\tselected?: string;\r\n\tonSelected: (choosenOption?: T) => void;\r\n\toptionText: (option: T) => string;\r\n\toptionValue: (option: T) => string;\r\n\ticon?: string;\r\n}\r\n\r\nexport const SelectInput = ({ options, controlId, labelText, selected, onSelected, optionText, optionValue, icon }: SelectInputProps) => {\r\n\tconst [selectOptions, setOptions] = useState([] as JSX.Element[]);\r\n\tconst [selectedOption, setSelected] = useState();\r\n\r\n\tuseEffect(() => {\r\n\t\tconst buildOptions = () => {\r\n\t\t\tlet builtOptions = [];\r\n\r\n\t\t\tfor (let option of options) {\r\n\t\t\t\tbuiltOptions.push(option);\r\n\t\t\t}\r\n\r\n\t\t\tsetOptions(builtOptions.map(builtOpt => ));\r\n\t\t}\r\n\r\n\t\tbuildOptions();\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\tonSelected(selectedOption);\r\n\t},[selectedOption]);\r\n\r\n\tconst onChange = (o: string) => {\r\n\t\tif(!o){\r\n\t\t\tsetSelected(undefined);\r\n\t\t} else {\r\n\t\t\tfor(let option of options) {\r\n\t\t\t\tif(optionValue(option) === o) {\r\n\t\t\t\t\tsetSelected(option);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tlet iconFragment = null;\r\n\tif (icon) {\r\n\t\ticonFragment = (\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t
\r\n\t\t\t\t{iconFragment}\r\n\t\t\t
\r\n\t\t\t onChange(event.target.value)} role=\"option\" className=\"select-input\">\r\n\t\t\t\t{selectOptions}\r\n\t\t\t\r\n\t\t
\r\n\t)\r\n}","export * from './Modal'\r\nexport * from './ModalBody'\r\nexport * from './ModalFooter'\r\nexport * from './ModalHeader'","export const ApplicationName = \"reactauth\";\r\n\r\nexport enum QueryParameterNames {\r\n ReturnUrl = \"returnUrl\",\r\n Message = \"message\",\r\n}\r\n\r\nexport enum LogoutActions {\r\n LogoutCallback = \"logout-callback\",\r\n Logout = \"logout\",\r\n LoggedOut = \"logged-out\",\r\n}\r\n\r\nexport enum LoginActions {\r\n Login = \"login\",\r\n LoginCallback = \"login-callback\",\r\n LoginFailed = \"login-failed\",\r\n Profile = \"profile\",\r\n Register = \"register\",\r\n SilentLogin = \"silent-callback\",\r\n}\r\n\r\nexport enum ApplicationPaths {\r\n DefaultLoginRedirectPath = \"/\",\r\n ApiAuthorizationClientConfigurationUrl = \"/_configuration/reactauth\",\r\n ApiAuthorizationPrefix = \"/authentication\",\r\n ApiBaseUrl = \"/api\",\r\n Login = \"/login\",\r\n LoginFailed = \"/authentication/login-failed\",\r\n LoginCallback = \"/authentication/login-callback\",\r\n Register = \"/authentication/register\",\r\n Profile = \"/authentication/profile\",\r\n LogOut = \"/authentication/logout\",\r\n LoggedOut = \"/authentication/logged-out\",\r\n LogOutCallback = \"/authentication/logout-callback\",\r\n IdentityRegisterPath = \"/Identity/Account/Register\",\r\n IdentityManagePath = \"/Identity/Account/Manage\",\r\n SecurityApiUrl = \"/api/security\",\r\n OrganizationApiUrl = \"/api/v1/organization\",\r\n RegistrationInvite = \"/first-login\",\r\n SilentRenewCallback = \"/authentication/silent-callback\",\r\n}\r\n\r\nexport enum Claims {\r\n Organization = \"__tenant__\",\r\n}\r\n","import { UserManager, WebStorageStateStore, User } from \"oidc-client\";\r\nimport { ApplicationName } from \"./ApiAuthorizationConstants\";\r\nimport { IAuthService } from \"telehealth-abstractions\";\r\n\r\ninterface Callback {\r\n callback: Function;\r\n subscription: number;\r\n}\r\n\r\nexport enum AuthenticationResultStatus {\r\n Redirect = \"redirect\",\r\n Success = \"success\",\r\n Fail = \"fail\",\r\n}\r\n\r\ninterface AuthorizeSuccessResult {\r\n status: AuthenticationResultStatus.Success;\r\n state: any;\r\n}\r\n\r\ninterface AuthorizeFailureResult {\r\n status: AuthenticationResultStatus.Fail;\r\n message: string;\r\n}\r\n\r\ninterface AuthorizeRedirectResult {\r\n status: AuthenticationResultStatus.Redirect;\r\n}\r\n\r\nexport type AuthorizeResult = AuthorizeSuccessResult | AuthorizeFailureResult;\r\n\r\nexport class AuthorizeService implements IAuthService {\r\n private _callbacks: Array = [];\r\n private _nextSubscriptionId = 0;\r\n private _user: User | null | undefined = null;\r\n\r\n private _onSignedInCallbacks: Array = [];\r\n private _onSignedInSubId = 0;\r\n private _beforeSignOutCallbacks: Array = [];\r\n private _beforeSignOutSubId = 0;\r\n\r\n _isAuthenticated = false;\r\n\r\n // By default pop ups are disabled because they don't work properly on Edge.\r\n // If you want to enable pop up authentication simply set this flag to false.\r\n _popUpDisabled = true;\r\n\r\n userManager: UserManager | undefined;\r\n\r\n async isAuthenticated() {\r\n await this.ensureUserManagerInitialized();\r\n\r\n const user = await this.userManager!.getUser();\r\n return !!user && !user!.expired;\r\n }\r\n\r\n async getUser() {\r\n if (this._user && this._user.profile) {\r\n return this._user.profile;\r\n }\r\n\r\n await this.ensureUserManagerInitialized();\r\n\r\n const user = await this.userManager!.getUser();\r\n return user && user.profile;\r\n }\r\n\r\n async getUserId() {\r\n const user = await this.getUser();\r\n if (!user) {\r\n return null;\r\n }\r\n return user.sub;\r\n }\r\n\r\n async getUserPreferredName() {\r\n const user = await this.getUser();\r\n if (!user) {\r\n return \"\";\r\n }\r\n return user.preferred_username || \"\";\r\n }\r\n\r\n async getAccessToken() {\r\n await this.ensureUserManagerInitialized();\r\n const user = await this.userManager!.getUser();\r\n return user && user.access_token;\r\n }\r\n\r\n // We try to authenticate the user in three different ways:\r\n // 1) We try to see if we can authenticate the user silently. This happens\r\n // when the user is already logged in on the IdP and is done using a hidden iframe\r\n // on the client.\r\n // 2) We try to authenticate the user using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 3) If the two methods above fail, we redirect the browser to the IdP to perform a traditional\r\n // redirect flow.\r\n async signIn(state: any): Promise {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n const silentUser = await this.userManager!.signinSilent(this.createArguments());\r\n this.updateState(silentUser);\r\n return this.success(state);\r\n } catch (silentError) {\r\n // User might not be authenticated, fallback to popup authentication\r\n console.log(\"Silent authentication error: \", silentError);\r\n\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error(\r\n \"Popup disabled. Change 'AuthorizeService.js:AuthorizeService._popupDisabled' to false to enable it.\"\r\n );\r\n }\r\n\r\n const popUpUser = await this.userManager!.signinPopup(this.createArguments());\r\n this.updateState(popUpUser);\r\n return this.success(state);\r\n } catch (popUpError) {\r\n if (typeof popUpError === \"object\" && popUpError?.message) {\r\n if (popUpError.message === \"Popup window closed\") {\r\n // The user explicitly cancelled the login action by closing an opened popup.\r\n return this.error(\"The user closed the window.\");\r\n } else if (!this._popUpDisabled) {\r\n console.log(\"Popup authentication error: \", popUpError);\r\n }\r\n }\r\n\r\n // PopUps might be blocked by the user, fallback to redirect\r\n try {\r\n await this.userManager!.signinRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectError) {\r\n console.log(\"Redirect authentication error: \", redirectError);\r\n return this.error(redirectError);\r\n }\r\n }\r\n }\r\n }\r\n\r\n async completeSignIn(url: string): Promise {\r\n try {\r\n if (!this.userManager) await this.ensureUserManagerInitialized();\r\n const user = await this.userManager!.signinCallback(url);\r\n\r\n for (let signInCompletion of this._onSignedInCallbacks) {\r\n await signInCompletion.callback();\r\n }\r\n\r\n this.updateState(user);\r\n return this.success(user && user.state);\r\n } catch (error) {\r\n console.log(\"There was an error signing in: \", error);\r\n return this.error(\"There was an error signing in.\");\r\n }\r\n }\r\n\r\n // We try to sign out the user in two different ways:\r\n // 1) We try to do a sign-out using a PopUp Window. This might fail if there is a\r\n // Pop-Up blocker or the user has disabled PopUps.\r\n // 2) If the method above fails, we redirect the browser to the IdP to perform a traditional\r\n // post logout redirect flow.\r\n async signOut(state: any): Promise {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n if (this._popUpDisabled) {\r\n throw new Error(\r\n \"Popup disabled. Change 'AuthorizeService.js:AuthorizeService._popupDisabled' to false to enable it.\"\r\n );\r\n }\r\n\r\n for (let beforeSignOut of this._beforeSignOutCallbacks) {\r\n await beforeSignOut.callback();\r\n }\r\n\r\n await this.userManager!.signoutPopup(this.createArguments());\r\n this.updateState(undefined);\r\n return this.success(state);\r\n } catch (popupSignOutError) {\r\n console.log(\"Popup signout error: \", popupSignOutError);\r\n try {\r\n await this.userManager!.signoutRedirect(this.createArguments(state));\r\n return this.redirect();\r\n } catch (redirectSignOutError) {\r\n console.log(\"Redirect signout error: \", redirectSignOutError);\r\n return this.error(redirectSignOutError);\r\n }\r\n }\r\n }\r\n\r\n async completeSignOut(url: string): Promise {\r\n await this.ensureUserManagerInitialized();\r\n try {\r\n const response = await this.userManager!.signoutCallback(url);\r\n this.updateState(null);\r\n\r\n this._beforeSignOutCallbacks = [];\r\n this._beforeSignOutSubId = 0;\r\n this._onSignedInCallbacks = [];\r\n this._onSignedInSubId = 0;\r\n\r\n return this.success(response && response.state);\r\n } catch (error) {\r\n console.log(`There was an error trying to log out '${error}'.`);\r\n return this.error(error);\r\n }\r\n }\r\n\r\n async loginSilently(url: string) {\r\n await this.ensureUserManagerInitialized();\r\n this.userManager!.signinSilentCallback(url);\r\n }\r\n\r\n updateState(user: User | undefined | null) {\r\n this._user = user;\r\n this._isAuthenticated = !!this._user;\r\n this.notifySubscribers();\r\n }\r\n\r\n subscribe(callback: Function) {\r\n this._callbacks.push({ callback, subscription: this._nextSubscriptionId++ });\r\n return this._nextSubscriptionId - 1;\r\n }\r\n\r\n unsubscribe(subscriptionId: number) {\r\n const subscriptionIndex = this._callbacks\r\n .map((element, index) => (element.subscription === subscriptionId ? { found: true, index } : { found: false }))\r\n .filter((element) => element.found === true);\r\n if (subscriptionIndex.length !== 1) {\r\n throw new Error(`Found an invalid number of subscriptions ${subscriptionIndex.length}`);\r\n }\r\n\r\n this._callbacks.splice(subscriptionIndex[0].index!, 1);\r\n }\r\n\r\n notifySubscribers() {\r\n for (let i = 0; i < this._callbacks.length; i++) {\r\n const callback = this._callbacks[i].callback;\r\n callback();\r\n }\r\n }\r\n\r\n createArguments(state?: any) {\r\n return { useReplaceToNavigate: true, data: state };\r\n }\r\n\r\n error(message: string): AuthorizeFailureResult {\r\n return { status: AuthenticationResultStatus.Fail, message };\r\n }\r\n\r\n success(state: any): AuthorizeSuccessResult {\r\n return { status: AuthenticationResultStatus.Success, state };\r\n }\r\n\r\n redirect(): AuthorizeRedirectResult {\r\n return { status: AuthenticationResultStatus.Redirect };\r\n }\r\n\r\n async ensureUserManagerInitialized() {\r\n if (this.userManager) {\r\n return;\r\n }\r\n\r\n //hard coding the OIDC settings now since multiple calls are made to our reactauth configuration endpoint\r\n //during rerenders\r\n const host = window.location.origin;\r\n const settings = {\r\n authority: host,\r\n client_id: \"reactauth\",\r\n redirect_uri: `${host}/authentication/login-callback`,\r\n automaticSilentRenew: true,\r\n silent_redirect_uri: `${host}/authentication/silent-callback`,\r\n includeIdTokenInSilentRenew: true,\r\n post_logout_redirect_uri: `${host}/authentication/logout-callback`,\r\n response_type: \"code\",\r\n scope: \"email name preferred_username role __tenant__ ImageTrend.Telemedicine.WebAppAPI openid profile\",\r\n userStore: new WebStorageStateStore({\r\n prefix: ApplicationName,\r\n }),\r\n };\r\n\r\n this.userManager = new UserManager(settings);\r\n\r\n this.userManager.events.addUserSignedOut(async () => {\r\n await this.userManager!.removeUser();\r\n this.updateState(undefined);\r\n });\r\n }\r\n\r\n async accessTokenExpired() {\r\n if (!!!this.userManager) {\r\n return true;\r\n }\r\n\r\n const user = await this.userManager!.getUser();\r\n\r\n return user?.expired ?? true;\r\n }\r\n\r\n static get instance() {\r\n return authService;\r\n }\r\n\r\n afterSignIn(callback: () => Promise) {\r\n this._onSignedInCallbacks.push({\r\n callback: callback,\r\n subscription: ++this._onSignedInSubId,\r\n });\r\n }\r\n\r\n onSignOut(callback: () => Promise) {\r\n this._beforeSignOutCallbacks.push({ callback: callback, subscription: ++this._beforeSignOutSubId });\r\n }\r\n}\r\n\r\nconst authService = new AuthorizeService();\r\n\r\nexport default authService;\r\n","import React from 'react';\r\nimport authService from './AuthorizeService';\r\nimport { UserManagerContext } from './UserManagerContext'\r\n\r\nexport const defaultAuthContextProvider = {\r\n\tprovider: authService,\r\n\tinitialize: async () => await authService.ensureUserManagerInitialized(),\r\n\tonAuthenticationChange: (callback: () => void) => authService.subscribe(() => callback()),\r\n\tcancelAuthenticationChange: (withSubscriptionId: number) => authService.unsubscribe(withSubscriptionId),\r\n\tisAuthenticated: async () => await authService.isAuthenticated(),\r\n\tuser: async () => await authService.getUser()\r\n}\r\n\r\nexport const AuthContext = React.createContext(defaultAuthContextProvider);\r\n","import { IAuthService } from \"telehealth-abstractions/build\";\r\n\r\nexport class AuthChangeCheck {\r\n private _authService: IAuthService;\r\n\r\n constructor(authService: IAuthService) {\r\n if (!authService) {\r\n throw new Error(\"An authService argument was not provided\");\r\n }\r\n\r\n this._authService = authService;\r\n }\r\n\r\n async checkAuthChanged(\r\n currentlyAuthenticated: boolean,\r\n authChangedCallback: (authenticated: boolean) => void,\r\n authSameCallback?: () => void\r\n ) {\r\n const userAuthenticated = await this._authService.isAuthenticated();\r\n\r\n if (userAuthenticated === currentlyAuthenticated) {\r\n if (authSameCallback) {\r\n authSameCallback();\r\n }\r\n } else {\r\n authChangedCallback(userAuthenticated);\r\n }\r\n }\r\n}\r\n","import React, { Component } from \"react\";\r\nimport { NavItem, NavLink } from \"reactstrap\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { AuthContext } from \"./AuthContext\";\r\nimport { AuthChangeCheck } from \"../../security/AuthChangeCheck\";\r\nimport { UserManagerContext } from \"../ApiAuthorization/UserManagerContext\";\r\n\r\ninterface AuthorizeNavItemState {\r\n to: string;\r\n display: string;\r\n authenticated: boolean;\r\n}\r\n\r\ninterface AuthorizeNavItemProps {\r\n to: string;\r\n display: string;\r\n}\r\n\r\nexport class AuthorizeNavItem extends Component, AuthorizeNavItemState> {\r\n private _subscription: number | null = null;\r\n private _mounted = false;\r\n private _ready = false;\r\n private _authChangeChecker!: AuthChangeCheck;\r\n\r\n static contextType: typeof AuthContext;\r\n context!: UserManagerContext;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.state = {\r\n to: props.to,\r\n display: props.display,\r\n authenticated: false,\r\n };\r\n }\r\n\r\n async componentDidMount() {\r\n this._authChangeChecker = new AuthChangeCheck(this.context.provider);\r\n this._ready = true;\r\n this._mounted = true;\r\n this._subscription = this.context.onAuthenticationChange(async () => await this.authenticationChanged());\r\n\r\n await this.populateAuthenticationState();\r\n }\r\n\r\n // async componentDidUpdate() {\r\n // this.checkAuthChanged(() => this.populateAuthenticationState);\r\n // }\r\n\r\n componentWillUnmount() {\r\n if (this._subscription) {\r\n this.context.cancelAuthenticationChange(this._subscription);\r\n this._subscription = null;\r\n }\r\n\r\n if (this._mounted) {\r\n this._mounted = false;\r\n }\r\n\r\n this._ready = false;\r\n }\r\n\r\n async populateAuthenticationState() {\r\n // if (!this._mounted) {\r\n // return;\r\n // }\r\n\r\n this._ready = true;\r\n this.checkAuthChanged((authStatus) => this.setState({ authenticated: authStatus }));\r\n }\r\n\r\n async authenticationChanged() {\r\n this._ready = false;\r\n\r\n this.checkAuthChanged((authStatus) => this.setState({ authenticated: authStatus }));\r\n await this.populateAuthenticationState();\r\n this._ready = true;\r\n }\r\n\r\n private async checkAuthChanged(onAuthChanged: (userAuthenticated: boolean) => void, onNoAuthChange?: () => void) {\r\n await this._authChangeChecker.checkAuthChanged(this.state.authenticated, onAuthChanged, onNoAuthChange);\r\n }\r\n\r\n render() {\r\n const { authenticated, to, display } = this.state;\r\n if (!this._ready || !authenticated) {\r\n return null;\r\n }\r\n return (\r\n \r\n \r\n {display}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nAuthorizeNavItem.contextType = AuthContext;\r\n","import React, { Component, Fragment } from \"react\";\r\nimport { DropdownItem, DropdownMenu, DropdownToggle, NavItem, NavLink, UncontrolledDropdown } from \"reactstrap\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { ApplicationPaths } from \"./ApiAuthorizationConstants\";\r\nimport { AuthContext } from \"./AuthContext\";\r\nimport { AuthChangeCheck } from \"../../security/AuthChangeCheck\";\r\n\r\ninterface LoginMenuState {\r\n isAuthenticated: boolean;\r\n userName: string | null;\r\n}\r\n\r\ninterface ToLinkParam {\r\n pathname: string;\r\n state: any;\r\n}\r\n\r\nexport class LoginMenu extends Component, Readonly> {\r\n context!: React.ContextType;\r\n\r\n private _subscription: number | undefined;\r\n private _mounted: boolean = false;\r\n private _authChangeCheck!: AuthChangeCheck;\r\n\r\n constructor(props: Readonly<{}>) {\r\n super(props);\r\n\r\n this.state = {\r\n isAuthenticated: false,\r\n userName: null,\r\n };\r\n }\r\n\r\n async componentDidMount() {\r\n this._mounted = true;\r\n this._authChangeCheck = new AuthChangeCheck(this.context.provider);\r\n this._subscription = this.context.onAuthenticationChange(() => this.populateState());\r\n await this.populateState();\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this._subscription) {\r\n this.context.cancelAuthenticationChange(this._subscription);\r\n this._subscription = undefined;\r\n }\r\n\r\n this._mounted = false;\r\n }\r\n\r\n async populateState() {\r\n if (!this._mounted) {\r\n return;\r\n }\r\n\r\n const user = await this.context.user();\r\n this._authChangeCheck.checkAuthChanged(this.state.isAuthenticated, (updatedAuth: boolean) =>\r\n this.setState({ isAuthenticated: updatedAuth, userName: user?.name ?? null })\r\n );\r\n }\r\n\r\n render() {\r\n const { isAuthenticated, userName } = this.state;\r\n if (!isAuthenticated) {\r\n const registerPath = `${ApplicationPaths.Register}`;\r\n const loginPath = `${ApplicationPaths.Login}`;\r\n return this.anonymousView(registerPath, loginPath);\r\n } else {\r\n const profilePath = `${ApplicationPaths.Profile}`;\r\n const logoutPath = { pathname: `${ApplicationPaths.LogOut}`, state: { local: true } };\r\n return this.authenticatedView(userName, profilePath, logoutPath);\r\n }\r\n }\r\n\r\n authenticatedView(userName: string | null, profilePath: string, logoutPath: string | ToLinkParam) {\r\n return (\r\n \r\n \r\n {userName}\r\n \r\n \r\n \r\n \r\n \r\n Logout\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n anonymousView(registerPath: string, loginPath: string) {\r\n return (\r\n \r\n \r\n \r\n Login\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nLoginMenu.contextType = AuthContext;\r\n","import React from \"react\";\r\nimport Switch, { ReactSwitchProps } from \"react-switch\";\r\n\r\ninterface ImageTrendToggleProps {\r\n checkedLabel?: string;\r\n uncheckedLabel?: string;\r\n labelDisplaySide?: string;\r\n}\r\n\r\nconst ImageTrendToggle = ({\r\n checked,\r\n className,\r\n onChange,\r\n checkedLabel,\r\n uncheckedLabel,\r\n labelDisplaySide = \"left\",\r\n}: ReactSwitchProps & ImageTrendToggleProps) => {\r\n let labelClass = \"d-inline-block mr-2\";\r\n\r\n if (className) {\r\n labelClass = labelClass + ` ${className}`;\r\n }\r\n\r\n return (\r\n <>\r\n {checkedLabel && checked && labelDisplaySide === \"left\" &&
{checkedLabel}
}\r\n {uncheckedLabel && !checked && labelDisplaySide === \"left\" &&
{uncheckedLabel}
}\r\n onChange(checked, event, id)}\r\n />\r\n {checkedLabel && checked && labelDisplaySide === \"right\" &&
{checkedLabel}
}\r\n {uncheckedLabel && !checked && labelDisplaySide === \"right\" &&
{uncheckedLabel}
}\r\n \r\n );\r\n};\r\n\r\nexport default ImageTrendToggle;\r\n","import { StatusService } from \"telehealth-api\";\r\nimport authService from \"../ApiAuthorization/AuthorizeService\";\r\n\r\n// Default singleton of StatusService that uses the default singleton IAuthService\r\nconst statusService = new StatusService(authService);\r\n\r\nauthService.afterSignIn(async () => {\r\n await statusService.makeUserAvailable();\r\n});\r\n\r\nexport { statusService };\r\n","import React, { useContext, useEffect, useMemo, useState, useRef } from \"react\";\r\nimport { NavItem, NavLink } from \"reactstrap\";\r\nimport ImageTrendToggle from \"components/Common/ImageTrendToggle\";\r\nimport { statusService } from \"components/SignalR/StatusService\";\r\nimport { HubStatusMethod } from \"telehealth-api\";\r\nimport { AuthContext } from \"components/ApiAuthorization/AuthContext\";\r\nimport { AuthChangeCheck } from \"../../security/AuthChangeCheck\";\r\n\r\nexport const NavPresenceToggle = () => {\r\n const [userAvailable, setUserAvailable] = useState(true);\r\n const [userAuthenticated, setUserAuthenticated] = useState(false);\r\n\r\n const authContext = useContext(AuthContext);\r\n\r\n const authConfig = useMemo(() => new AuthChangeCheck(authContext.provider), [authContext]);\r\n\r\n let userStatusSub = useRef([] as Array);\r\n let authChangeSub = useRef([] as Array);\r\n\r\n const mounted = useRef(false);\r\n\r\n useEffect(() => {\r\n mounted.current = true;\r\n\r\n const refreshUserPresence = async () => {\r\n //send a status refresh message\r\n await statusService.refreshStatus();\r\n };\r\n\r\n const refreshUserAuthStatus = async () => {\r\n // component can potentially unmount in between the time we call refreshUserAuthStatus\r\n // and isAuthenticated returns\r\n if (mounted.current) {\r\n authConfig.checkAuthChanged(userAuthenticated, (updatedAuth) => setUserAuthenticated(updatedAuth));\r\n }\r\n };\r\n\r\n const updatePresenceToggle = async () => {\r\n const authenticatedUserId = await authContext.provider.getUserId();\r\n\r\n if (!authenticatedUserId) {\r\n return;\r\n }\r\n\r\n //listen for user status refresh messages so the presence toggle is set correctly upon page load\r\n let statusRefreshSub = statusService.subscribe((userId: string, status: string) => {\r\n if (authenticatedUserId.toUpperCase() !== userId.toUpperCase()) {\r\n return;\r\n }\r\n\r\n setUserAvailable((priorAvailability) => {\r\n const previousStatus = priorAvailability ? \"Available\" : \"Unavailable\";\r\n if (previousStatus.toUpperCase() !== status.toUpperCase()) {\r\n return status.toUpperCase() === \"Available\".toUpperCase();\r\n }\r\n\r\n return priorAvailability;\r\n });\r\n }, HubStatusMethod.GetStatus);\r\n\r\n userStatusSub.current.push(statusRefreshSub);\r\n\r\n let authSub = authContext.onAuthenticationChange(async () =>\r\n authConfig.checkAuthChanged(userAuthenticated, (updatedAuth) => setUserAuthenticated(updatedAuth))\r\n );\r\n\r\n authChangeSub.current.push(authSub);\r\n };\r\n\r\n refreshUserAuthStatus();\r\n updatePresenceToggle();\r\n refreshUserPresence();\r\n\r\n return () => {\r\n userStatusSub.current.forEach((statusSub) => statusService.unsubscribe(statusSub));\r\n authChangeSub.current.forEach((authenticationSub) => authContext.cancelAuthenticationChange(authenticationSub));\r\n\r\n userStatusSub.current = [];\r\n authChangeSub.current = [];\r\n mounted.current = false;\r\n };\r\n }, [authContext, userAuthenticated, authConfig, userAvailable]);\r\n\r\n const handleAvailabilityChange = async (available: boolean) => {\r\n //Broadcast user availability change.\r\n if (available) {\r\n await statusService.makeUserAvailable();\r\n } else {\r\n await statusService.makeUserUnavailable();\r\n }\r\n\r\n setUserAvailable(available);\r\n };\r\n\r\n return (\r\n <>\r\n {userAuthenticated && (\r\n \r\n \r\n await handleAvailabilityChange(checked)}\r\n />\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { AuthContext } from \"components/ApiAuthorization/AuthContext\";\r\nimport React, { Component } from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { Collapse, Nav, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from \"reactstrap\";\r\nimport { AuthorizeNavItem } from \"../ApiAuthorization/AuthorizeNavItem\";\r\nimport { LoginMenu } from \"../ApiAuthorization/LoginMenu\";\r\nimport { UserManagerContext } from \"components/ApiAuthorization/UserManagerContext\";\r\nimport { NavPresenceToggle } from \"components/user/NavPresenceToggle\";\r\n\r\nimport \"./NavMenu.css\";\r\n\r\ninterface NavMenuState {\r\n collapsed: boolean;\r\n userAvailable: boolean;\r\n}\r\n\r\nexport class NavMenu extends Component, Readonly> {\r\n static displayName = NavMenu.name;\r\n static contextType: React.Context = AuthContext;\r\n\r\n context!: UserManagerContext;\r\n\r\n constructor(props: Readonly<{}>) {\r\n super(props);\r\n\r\n this.state = {\r\n collapsed: true,\r\n userAvailable: true,\r\n };\r\n }\r\n\r\n toggleNavbar() {\r\n this.setState({\r\n collapsed: !this.state.collapsed,\r\n });\r\n }\r\n\r\n isInIframe() {\r\n try {\r\n return window.self !== window.top;\r\n } catch (e) {\r\n return true;\r\n }\r\n }\r\n\r\n render() {\r\n if (this.isInIframe()) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \"ImageTrend\r\n \r\n this.toggleNavbar()} className=\"mr-2\" />\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\n\r\nexport interface INavMenuContext {\r\n navVisible: boolean;\r\n showNav: () => void;\r\n hideNav: () => void;\r\n}\r\n\r\nconst NavMenuContext = React.createContext({\r\n navVisible: true,\r\n showNav: () => {},\r\n hideNav: () => {},\r\n});\r\n\r\nexport default NavMenuContext;\r\n","import { useContext } from 'react';\r\nimport NavMenuContext from \"./NavMenuContext\";\r\n\r\nconst useNavMenu = () => useContext(NavMenuContext);\r\n\r\nexport default useNavMenu;","import React, { PropsWithChildren, useContext, useEffect } from \"react\";\r\nimport { NavMenu } from \"./Navigation/NavMenu\";\r\nimport { AuthContext } from \"./ApiAuthorization/AuthContext\";\r\nimport useNavMenu from \"./Navigation/useNavMenu\";\r\n\r\nimport \"Layout.scss\";\r\n\r\ninterface LayoutProps extends PropsWithChildren<{}> {\r\n className: string;\r\n}\r\n\r\nconst Layout = ({ className, children }: LayoutProps) => {\r\n const { initialize } = useContext(AuthContext);\r\n const { navVisible } = useNavMenu();\r\n\r\n useEffect(() => {\r\n const initializeAuth = async () => {\r\n await initialize();\r\n };\r\n\r\n initializeAuth();\r\n }, []);\r\n\r\n return (\r\n <>\r\n {navVisible && }\r\n
{children}
\r\n \r\n );\r\n};\r\n\r\nexport default Layout;\r\n","import React, { Component } from 'react';\r\nimport { Card, CardBody, CardTitle, Col, Row } from 'reactstrap';\r\nimport NavMenuContext from 'components/Navigation/NavMenuContext';\r\n\r\nimport './Home.scss'\r\n\r\nexport class Home extends Component {\r\n\tstatic displayName = Home.name;\r\n\t\r\n\tcomponentDidMount() {\r\n\t\tthis.context.showNav();\r\n\t}\r\n\r\n\trender() {\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\t\t

Dashboard

\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\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\t\t

Answer a Call

\r\n\t\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\t

Incoming calls will appear in a notification message within the Telehealth portal. Details of the caller and agency will appear in addition to the ability to answer (or decline) the incoming call.

\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\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\t\t

Enable Browser Access

\r\n\t\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\t

Upon answering your first incoming call, your browser will prompt you to allow access to both your camera and your microphone. Please do so to enable answering all future calls successfully.

\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\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\t\t

Improve the App

\r\n\t\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\t

We want to hear from you! Continuous updates will be made to our platform. Tell us what works or what we can improve on!

\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\nHome.contextType = NavMenuContext;\r\n","import { datadogLogs } from \"@datadog/browser-logs\";\r\n\r\nexport interface LogContext {\r\n [x: string]: LogContextValue;\r\n}\r\nexport declare type LogContextValue = string | number | boolean | LogContext | LogContextArray | undefined;\r\nexport interface LogContextArray extends Array {}\r\n\r\ndatadogLogs.init({\r\n // clientToken is public so it is alright to store here directly\r\n // if we ever create a runtime config, this could be moved into it\r\n clientToken: \"pubd706080d8d57385d27d0ecc91f4fc31c\",\r\n site: \"datadoghq.com\",\r\n forwardErrorsToLogs: true,\r\n sampleRate: 100,\r\n service: \"Telehealth-ClientApp\",\r\n});\r\n\r\n// set service as an attribute\r\ndatadogLogs.setLoggerGlobalContext({ service: \"TeleHealth-ClientApp\" });\r\n\r\nexport class Logger {\r\n debug(message: string, context?: LogContext | undefined) {\r\n datadogLogs.logger.debug(message, context);\r\n }\r\n\r\n error(message: string, context?: LogContext | undefined) {\r\n datadogLogs.logger.error(message, context);\r\n }\r\n\r\n info(message: string, context?: LogContext | undefined) {\r\n datadogLogs.logger.info(message, context);\r\n }\r\n\r\n warn(message: string, context?: LogContext | undefined) {\r\n datadogLogs.logger.warn(message, context);\r\n }\r\n}\r\n\r\nconst logger = new Logger();\r\n\r\nexport default logger;\r\n","export enum ApiUrl {\r\n\tNonTenantOrgLookupUrl = \"/api/v1/security/organization\",\r\n\tCallUrl = \"/api/v1/call\",\r\n\tOrgUrl = \"/api/v1/organization\",\r\n\tSecurityUrl = \"/api/v1/security\",\r\n\tSettingUrl = \"/api/v1/setting\",\r\n\tUserUrl = '/api/v1/user'\r\n}\r\n\r\nexport enum SecurityStrings {\r\n\tAdminRoleName = \"Administrator\",\r\n\tRoleClaimType = \"role\",\r\n\tUserRoleName = \"User\"\r\n}","import { IPermission } from '../IPermission';\r\nimport { Claims } from '../Claims';\r\n\r\nexport default class TelehealthPortalPermission implements IPermission {\r\n private _onGranted: ((onGrantedCallback: () => void) => void) = (onGrantedCallback) => {};\r\n private _onUngranted: ((onDeniedCallback: () => void) => void) = (onDeniedCallback) => onDeniedCallback();\r\n\r\n constructor(userClaims: Claims) {\r\n const accountClaim = userClaims.findClaimsByType(\"account\");\r\n\r\n if(accountClaim) {\r\n switch(accountClaim.value) {\r\n case 'telehealth':\r\n this._onGranted = (onGranted: () => void) => onGranted();\r\n this._onUngranted = (onDenied: () => void) => {};\r\n break; \r\n }\r\n \r\n }\r\n }\r\n\r\n granted(onGranted: () => void) {\r\n if(!onGranted) {\r\n return;\r\n }\r\n\r\n this._onGranted(() => onGranted());\r\n }\r\n\r\n async grantedAsync(onGrantedAsync: () => Promise) {\r\n if(!onGrantedAsync) {\r\n return;\r\n }\r\n\r\n let granted = false;\r\n this._onGranted(() => granted = true);\r\n\r\n if(granted) {\r\n await onGrantedAsync();\r\n }\r\n }\r\n\r\n denied(onDenial: () => void) {\r\n if(!onDenial) {\r\n return;\r\n }\r\n\r\n this._onUngranted(() => onDenial()); \r\n }\r\n\r\n async deniedAsync(onDeniedAsync: () => Promise) {\r\n if(!onDeniedAsync) {\r\n return;\r\n }\r\n\r\n let denied = false;\r\n this.denied(() => denied = true);\r\n\r\n if(denied) {\r\n await onDeniedAsync();\r\n }\r\n }\r\n}","import { Claim } from './Claim';\r\n\r\nexport class Claims {\r\n\tprivate _claims: Iterable;\r\n\r\n\tconstructor(claims: Iterable) {\r\n\t\tif(!!!claims) {\r\n\t\t\tthrow new Error(\"claims were not provided\");\r\n\t\t}\r\n\r\n\t\tthis._claims = claims;\r\n\t}\r\n\r\n\tfindClaimsByType(ofType: string): Claim | undefined {\r\n\t\tlet foundClaim = undefined;\r\n\r\n\t\tfor(let claim of this._claims) {\r\n\t\t\tif(claim.type === ofType) {\r\n\t\t\t\tfoundClaim = claim;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn foundClaim;\r\n\t}\r\n}","import authService from \"components/ApiAuthorization/AuthorizeService\";\r\nimport logger from \"Logging\";\r\nimport React, { Component } from \"react\";\r\nimport { Redirect, RouteComponentProps } from \"react-router-dom\";\r\nimport { IRoomAdapter } from \"telehealth-abstractions\";\r\nimport { Room } from \"telehealth-client\";\r\nimport { statusService } from \"components/SignalR/StatusService\";\r\nimport { SecuredPersonService } from \"services/SecuredPersonService\";\r\nimport TelehealthPortalPermission from \"security/Permission/TelehealthPortalPermission\";\r\nimport { Claims } from \"security/Claims\";\r\n\r\nexport interface RoomRouterProps extends RouteComponentProps {\r\n showNavMenu: (show: boolean) => void;\r\n userService: SecuredPersonService;\r\n}\r\n\r\ninterface RoomRouterState {\r\n invalidRoom: boolean;\r\n returnToCallCenter: boolean;\r\n}\r\n\r\nexport class RoomRouter extends Component, RoomRouterState> implements IRoomAdapter {\r\n roomId: string | null;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n const query = new URLSearchParams(props.location.search);\r\n this.roomId = query.get(\"roomId\");\r\n\r\n this.state = {\r\n invalidRoom: false,\r\n returnToCallCenter: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n statusService.disableCallNotifications();\r\n this.props.showNavMenu(false);\r\n\r\n //handle non-existent rooms\r\n window.addEventListener(\"unhandledrejection\", (event) => this.handleRejectedPromise(event));\r\n }\r\n\r\n componentWillUnmount() {\r\n this.props.showNavMenu(true);\r\n statusService.enableCallNotifications();\r\n\r\n window.removeEventListener(\"unhandledrejection\", (event) => this.handleRejectedPromise(event));\r\n }\r\n\r\n leaveRoom = async () => {\r\n //external user? sign them out\r\n const user = await this.props.userService.lookupLoggedInUser();\r\n\r\n let portalPermission = new TelehealthPortalPermission(new Claims(user.claims));\r\n\r\n portalPermission.granted(() =>\r\n this.setState((state) => {\r\n return {\r\n returnToCallCenter: true,\r\n };\r\n })\r\n );\r\n\r\n await portalPermission.deniedAsync(async () => {\r\n await authService.signOut({});\r\n });\r\n };\r\n\r\n endCallCallback = (roomId: string) => {\r\n return Promise.resolve();\r\n };\r\n\r\n callAnsweredCallback = (roomId: string, answeredName: string, answeredUserId: string) => {\r\n return Promise.resolve();\r\n };\r\n\r\n startCallCallback = (roomId: string) => {\r\n return Promise.resolve();\r\n };\r\n\r\n private handleRejectedPromise = (event: PromiseRejectionEvent) => {\r\n if (typeof event.reason === \"object\") {\r\n if (event.reason.name && event.reason.name === \"TwilioError\")\r\n if (event.reason.message === \"Room not found\") {\r\n this.setState((state) => ({\r\n invalidRoom: true,\r\n }));\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n if (this.state.returnToCallCenter) {\r\n return ;\r\n }\r\n if (!this.roomId) {\r\n logger.error(\"No roomId specified in RoomRouter\");\r\n return

Unable to make call.

;\r\n }\r\n\r\n if (this.state.invalidRoom) {\r\n logger.error(\"Invalid roomid\");\r\n return

Unable to answer call.

;\r\n }\r\n\r\n let modalContents: JSX.Element | null = null;\r\n return (\r\n \r\n \r\n {modalContents}\r\n \r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { Component } from \"react\";\r\nimport { RouteProps, RouteComponentProps } from \"react-router\";\r\nimport { Route, Redirect } from \"react-router-dom\";\r\nimport { ApplicationPaths, QueryParameterNames } from \"./ApiAuthorizationConstants\";\r\nimport { AuthContext } from \"./AuthContext\";\r\n\r\ninterface AuthorizeRouteState {\r\n //ready: boolean;\r\n authenticated: boolean;\r\n}\r\n\r\nexport default class AuthorizeRoute extends Component {\r\n _subscription: number | null = null;\r\n _ready = false;\r\n\r\n constructor(props: RouteProps) {\r\n super(props);\r\n\r\n this.state = {\r\n //ready: false,\r\n authenticated: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this._subscription = this.context.onAuthenticationChange(() => this.authenticationChanged());\r\n this.populateAuthenticationState();\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this._subscription) {\r\n this.context.cancelAuthenticationChange(this._subscription);\r\n }\r\n }\r\n\r\n render() {\r\n const { authenticated } = this.state;\r\n var link = document.createElement(\"a\");\r\n if (this.props?.path) {\r\n link.href = Array.isArray(this.props.path) ? this.props.path[0] : this.props.path;\r\n }\r\n const returnUrl = `${link.protocol}//${link.host}${link.pathname}${link.search}${link.hash}`;\r\n let redirectUrl = `${ApplicationPaths.Login}?${QueryParameterNames.ReturnUrl}=${encodeURI(returnUrl)}`;\r\n if (!this._ready) {\r\n return
;\r\n } else {\r\n return this.renderComponent(this.props, authenticated, redirectUrl);\r\n }\r\n }\r\n\r\n renderRoute(authenticated: boolean, redirectUrl: string, props: RouteProps, routeProps: RouteComponentProps) {\r\n if (!authenticated) {\r\n return ;\r\n }\r\n if (props.children) {\r\n if (typeof props.children === \"function\") {\r\n return props.children(routeProps);\r\n }\r\n return props.children;\r\n }\r\n if (props.component) {\r\n return React.createElement(props.component, routeProps);\r\n }\r\n if (props.render) {\r\n return props.render(routeProps);\r\n }\r\n return null;\r\n }\r\n\r\n renderComponent(props: RouteProps, authenticated: boolean, redirectUrl: string) {\r\n let { component, children, render, ...routeProps } = props;\r\n return ;\r\n }\r\n\r\n async populateAuthenticationState() {\r\n console.debug(\"AuthorizeRoute:populateAuthenticationState called\");\r\n const authenticated = await this.context.isAuthenticated();\r\n this._ready = true;\r\n this.setState((prevState: AuthorizeRouteState) => {\r\n if (prevState.authenticated === authenticated) {\r\n //no change, no need to rerender\r\n return prevState;\r\n }\r\n\r\n return { authenticated };\r\n });\r\n }\r\n\r\n async authenticationChanged() {\r\n this._ready = false;\r\n //this.setState({ authenticated: false });\r\n await this.populateAuthenticationState();\r\n }\r\n}\r\n\r\nAuthorizeRoute.contextType = AuthContext;\r\n","import React from \"react\";\r\nimport { Component } from \"react\";\r\nimport authService from \"./AuthorizeService\";\r\nimport { AuthenticationResultStatus } from \"./AuthorizeService\";\r\nimport { LoginActions, QueryParameterNames, ApplicationPaths } from \"./ApiAuthorizationConstants\";\r\nimport { ApiUrl } from \"../../ApiConstants\";\r\nimport { Claims } from \"./ApiAuthorizationConstants\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport { StaticContext } from \"react-router\";\r\n\r\ninterface LoginProps extends RouteComponentProps<{}, StaticContext, { action?: string }> {\r\n action: string;\r\n afterLogin?: Iterable<() => Promise>;\r\n redirectUrl?: string;\r\n}\r\n\r\ninterface LoginState {\r\n message: string | undefined | null;\r\n}\r\n\r\n// The main responsibility of this component is to handle the user's login process.\r\n// This is the starting point for the login process. Any component that needs to authenticate\r\n// a user can simply perform a redirect to this component with a returnUrl query parameter and\r\n// let the component perform the login and return back to the return url.\r\nexport class Login extends Component, LoginState> {\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action ?? this.props.location.state.action;\r\n const returnUrlState = this.props.redirectUrl ? { returnUrl: this.props.redirectUrl! } : undefined;\r\n\r\n switch (action) {\r\n case LoginActions.Login:\r\n this.login(this.getReturnUrl(returnUrlState));\r\n break;\r\n case LoginActions.LoginCallback:\r\n this.processLoginCallback();\r\n break;\r\n case LoginActions.LoginFailed:\r\n const params = new URLSearchParams(window.location.search);\r\n const error = params.get(QueryParameterNames.Message);\r\n this.setState({ message: error });\r\n break;\r\n case LoginActions.Profile:\r\n this.redirectToProfile();\r\n break;\r\n case LoginActions.Register:\r\n this.redirectToRegister();\r\n break;\r\n case LoginActions.SilentLogin:\r\n this.loginSilently();\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n\r\n render() {\r\n const action = this.props.action;\r\n const { message } = this.state;\r\n\r\n if (!!message) {\r\n return
{message}
;\r\n } else {\r\n switch (action) {\r\n case LoginActions.Login:\r\n return
Processing login
;\r\n case LoginActions.LoginCallback:\r\n return
Processing login callback
;\r\n case LoginActions.Profile:\r\n case LoginActions.Register:\r\n case LoginActions.SilentLogin:\r\n return
;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n }\r\n\r\n async login(returnUrl: string) {\r\n const state = { returnUrl };\r\n const result = await authService.signIn(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n /* Ideally, the userinfo endpoint of idsrv would return the organization claim.\r\n * But, we're using the MS Convention based implementation of Identity Server, which\r\n * does not allow identity resource scopes, only api resources. This should be changed\r\n * but requires configuration changes (and testing), so just lookup the logged in user\r\n * and grab their org claim that way for now.\r\n */\r\n await this.lookupUserOrg((orgId) => localStorage.setItem(\"orgId\", orgId));\r\n this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid status result.\");\r\n }\r\n }\r\n\r\n async processLoginCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignIn(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Success:\r\n if (this.props.afterLogin) {\r\n for (let runAfterLogin of this.props.afterLogin) {\r\n await runAfterLogin();\r\n }\r\n }\r\n this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n }\r\n\r\n getReturnUrl(state?: any) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\");\r\n }\r\n return (state && state.returnUrl) || fromQuery || `${window.location.origin}/home`;\r\n }\r\n\r\n redirectToRegister() {\r\n this.redirectToApiAuthorizationPath(\r\n `${ApplicationPaths.IdentityRegisterPath}?${QueryParameterNames.ReturnUrl}=${encodeURI(ApplicationPaths.Login)}`\r\n );\r\n }\r\n\r\n redirectToProfile() {\r\n this.redirectToApiAuthorizationPath(ApplicationPaths.IdentityManagePath);\r\n }\r\n\r\n redirectToApiAuthorizationPath(apiAuthorizationPath: string) {\r\n const redirectUrl = `${window.location.origin}${apiAuthorizationPath}`;\r\n // It's important that we do a replace here so that when the user hits the back arrow on the\r\n // browser he gets sent back to where it was on the app instead of to an endpoint on this\r\n // component.\r\n window.location.replace(redirectUrl);\r\n }\r\n\r\n navigateToReturnUrl(returnUrl: string) {\r\n // It's important that we do a replace here so that we remove the callback uri with the\r\n // fragment containing the tokens from the browser history.\r\n window.location.replace(returnUrl);\r\n }\r\n\r\n private async lookupUserOrg(onIdRetrieved: (orgId: string) => void) {\r\n const bearerToken = await authService.getAccessToken();\r\n\r\n if (!bearerToken) {\r\n //something is wrong, this is only called after successful login\r\n return;\r\n }\r\n\r\n var lookupResponse = await fetch(`${ApiUrl.UserUrl}/lookupSignedInUser`, {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: `Bearer ${bearerToken}`,\r\n },\r\n });\r\n\r\n if (lookupResponse.redirected) {\r\n return;\r\n }\r\n\r\n if (lookupResponse.status === 200) {\r\n let userLookup = await lookupResponse.json();\r\n\r\n let orgClaim = userLookup.claims.filter((x: any) => x.type === Claims.Organization);\r\n\r\n if (orgClaim && orgClaim[0]) {\r\n onIdRetrieved(orgClaim[0].value);\r\n }\r\n }\r\n }\r\n\r\n private async loginSilently() {\r\n const url = window.location.href;\r\n\r\n authService.loginSilently(url);\r\n }\r\n}\r\n","import React from \"react\";\r\nimport { Component } from \"react\";\r\nimport authService from \"./AuthorizeService\";\r\nimport { AuthenticationResultStatus } from \"./AuthorizeService\";\r\nimport { QueryParameterNames, LogoutActions, ApplicationPaths } from \"./ApiAuthorizationConstants\";\r\nimport NavMenuContext from \"../Navigation/NavMenuContext\";\r\n\r\ninterface LogoutState {\r\n message: string | undefined;\r\n isReady: boolean;\r\n authenticated: boolean;\r\n}\r\n\r\ninterface LogoutProps {\r\n action: LogoutActions;\r\n}\r\n\r\n// The main responsibility of this component is to handle the user's logout process.\r\n// This is the starting point for the logout process, which is usually initiated when a\r\n// user clicks on the logout button on the LoginMenu component.\r\nexport class Logout extends Component, Readonly> {\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n this.state = {\r\n message: undefined,\r\n isReady: false,\r\n authenticated: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n if (!!window.history.state.state.local) {\r\n localStorage.removeItem(\"orgId\");\r\n this.logout(this.getReturnUrl());\r\n } else {\r\n // This prevents regular links to /authentication/logout from triggering a logout\r\n this.setState({ isReady: true, message: \"The logout was not initiated from within the page.\" });\r\n }\r\n break;\r\n case LogoutActions.LogoutCallback:\r\n this.processLogoutCallback();\r\n break;\r\n case LogoutActions.LoggedOut:\r\n this.context.showNav();\r\n this.setState({\r\n isReady: true,\r\n message: \"You have been successfully logged out and your status has automatically been set to unavailable.\",\r\n });\r\n break;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n\r\n this.populateAuthenticationState();\r\n }\r\n\r\n render() {\r\n const { isReady, message } = this.state;\r\n if (!isReady) {\r\n return
;\r\n }\r\n if (!!message) {\r\n return

{message}

;\r\n } else {\r\n const action = this.props.action;\r\n switch (action) {\r\n case LogoutActions.Logout:\r\n return

Processing logout

;\r\n case LogoutActions.LogoutCallback:\r\n return

Processing logout callback

;\r\n case LogoutActions.LoggedOut:\r\n return

{message}

;\r\n default:\r\n throw new Error(`Invalid action '${action}'`);\r\n }\r\n }\r\n }\r\n\r\n async logout(returnUrl: string) {\r\n const state = { returnUrl };\r\n const isauthenticated = await authService.isAuthenticated();\r\n if (isauthenticated) {\r\n const result = await authService.signOut(state);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Redirect:\r\n break;\r\n case AuthenticationResultStatus.Success:\r\n this.navigateToReturnUrl(returnUrl);\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n } else {\r\n this.setState({ message: \"You successfully logged out!\" });\r\n }\r\n }\r\n\r\n async processLogoutCallback() {\r\n const url = window.location.href;\r\n const result = await authService.completeSignOut(url);\r\n switch (result.status) {\r\n case AuthenticationResultStatus.Success:\r\n this.navigateToReturnUrl(this.getReturnUrl(result.state));\r\n break;\r\n case AuthenticationResultStatus.Fail:\r\n this.setState({ message: result.message });\r\n break;\r\n default:\r\n throw new Error(\"Invalid authentication result status.\");\r\n }\r\n }\r\n\r\n async populateAuthenticationState() {\r\n const authenticated = await authService.isAuthenticated();\r\n this.setState({ isReady: true, authenticated });\r\n }\r\n\r\n getReturnUrl(state?: any) {\r\n const params = new URLSearchParams(window.location.search);\r\n const fromQuery = params.get(QueryParameterNames.ReturnUrl);\r\n if (fromQuery && !fromQuery.startsWith(`${window.location.origin}/`)) {\r\n // This is an extra check to prevent open redirects.\r\n throw new Error(\"Invalid return url. The return url needs to have the same origin as the current page.\");\r\n }\r\n return (state && state.returnUrl) || fromQuery || `${window.location.origin}${ApplicationPaths.LoggedOut}`;\r\n }\r\n\r\n navigateToReturnUrl(returnUrl: string) {\r\n return window.location.replace(returnUrl);\r\n }\r\n}\r\n\r\nLogout.contextType = NavMenuContext;\r\n","import authService from \"components/ApiAuthorization/AuthorizeService\";\r\n\r\nexport class ApiRequest {\r\n\tasync get (id: string, endpoint: string, resourceIdentifier?: string) {\r\n\t\tconst token = await this.getToken();\r\n\t\t\r\n\t\tthis.validateToken(token);\r\n\r\n\t\tlet dest = endpoint;\r\n\t\tif(resourceIdentifier) {\r\n\t\t\tif(dest.endsWith('/')) {\r\n\t\t\t\tdest = dest.substr(0, dest.length - 2);\r\n\t\t\t}\r\n\r\n\t\t\tdest = `${endpoint}?${resourceIdentifier}=${id}`\r\n\t\t} else {\r\n\t\t\tif(!dest.endsWith('/')){\r\n\t\t\t\tdest = dest + '/';\r\n\t\t\t}\r\n\r\n\t\t\tdest = dest + id;\r\n\t\t}\r\n\r\n\t\treturn await fetch(dest, {\r\n\t\t\theaders: this.commonRequestHeaders(token!)\r\n\t\t});\r\n\t}\r\n\r\n\tasync send(endpoint: string) {\r\n\t\tconst token = await this.getToken();\r\n\r\n\t\tthis.validateToken(token);\r\n\r\n\t\tvar response = await fetch(endpoint, {\r\n\t\t\theaders: this.commonRequestHeaders(token!),\r\n\t\t});\r\n\r\n\t\treturn response;\r\n\t}\r\n\r\n\tasync patch(endpoint: string, request: T) {\r\n\t\tconst token = await this.getToken();\r\n\r\n\t\tthis.validateToken(token);\r\n\r\n\t\treturn await fetch(endpoint, {\r\n\t\t\t\theaders: this.commonRequestHeaders(token!),\r\n\t\t\t\tmethod: \"PATCH\",\r\n\t\t\t\tbody: JSON.stringify(request),\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\tasync post(endpoint: string, request: T) {\r\n\t\tconst token = await this.getToken();\r\n\r\n\t\tthis.validateToken(token);\r\n\r\n\t\treturn await fetch(endpoint, {\r\n\t\t\theaders: this.commonRequestHeaders(token!),\r\n\t\t\tmethod: \"POST\",\r\n\t\t\tbody: JSON.stringify(request)\r\n\t\t});\r\n\t }\r\n\r\n\t async put(endpoint: string, request: T) {\t\t \r\n\t\tconst token = await this.getToken();\r\n\r\n\t\tthis.validateToken(token);\r\n\r\n\t\treturn await fetch(endpoint, {\r\n\t\t\theaders: this.commonRequestHeaders(token!),\r\n\t\t\tmethod: \"PUT\",\r\n\t\t\tbody: JSON.stringify(request)\r\n\t\t});\r\n\t }\r\n\t\r\n\r\n\t private validateToken(bearerToken?: string) {\r\n\t\t if(!bearerToken) {\r\n\t\t\tthrow new Error('unable to retrieve bearer token from the oidc manager');\r\n\t\t }\r\n\t }\r\n\r\n\t private commonRequestHeaders(bearerToken: string) {\r\n\t\t return {\r\n\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\"Authorization\": `Bearer ${bearerToken}`\r\n\t\t };\r\n\t }\r\n\r\n\t private async getToken() { \r\n\t\tif(!await authService.isAuthenticated()){\r\n\t\t\tawait authService.signIn({});\r\n\t\t}\r\n\r\n\t\tif(await authService.accessTokenExpired()) {\r\n\t\t\tawait authService.signIn({});\r\n\t\t}\r\n\r\n\t\tvar token = await authService.getAccessToken();\r\n\r\n\t\treturn token ?? undefined;\r\n\t }\r\n}\r\n\r\nexport enum PatchOperation {\r\n\tAdd = \"add\",\r\n\tRemove = \"remove\",\r\n}\r\n\r\nexport class PatchRequest extends ApiRequest {\r\n\tspecifications: {operation: string, path: string, value: TValue}[] = []\r\n\r\n\tconstructor(op: string, path: string, value: TValue) {\r\n\t\tsuper();\r\n\r\n\t\tthis.specifications.push({\r\n\t\t\toperation: op,\r\n\t\t \tpath: path,\r\n\t\t\tvalue: value\r\n\t\t})\r\n\t}\r\n\r\n\tasync patch(endpoint: string) {\r\n\t\treturn super.patch<{operation: string, path: string, value: TValue}[]>(endpoint, this.specifications);\r\n\t}\r\n}\r\n","import React, { Component, Fragment } from \"react\";\r\nimport { Route, RouteComponentProps, StaticContext } from \"react-router\";\r\nimport { Login } from \"./Login\";\r\nimport { Logout } from \"./Logout\";\r\nimport { ApplicationPaths, LoginActions, LogoutActions } from \"./ApiAuthorizationConstants\";\r\n\r\nexport default class ApiAuthorizationRoutes extends Component<\r\n RouteComponentProps<{}, StaticContext, { action: string }>\r\n> {\r\n render() {\r\n return (\r\n \r\n this.loginAction(LoginActions.Login)} />\r\n this.loginAction(LoginActions.LoginFailed)} />\r\n this.loginAction(LoginActions.LoginCallback)} />\r\n this.loginAction(LoginActions.Profile)} />\r\n this.loginAction(LoginActions.Register)} />\r\n this.loginAction(LoginActions.SilentLogin)} />\r\n this.logoutAction(LogoutActions.Logout)} />\r\n this.logoutAction(LogoutActions.LogoutCallback)} />\r\n this.logoutAction(LogoutActions.LoggedOut)} />\r\n \r\n );\r\n }\r\n\r\n loginAction(name: LoginActions) {\r\n return ;\r\n }\r\n\r\n logoutAction(name: LogoutActions) {\r\n return ;\r\n }\r\n}\r\n","import { Component } from 'react';\r\nimport { Redirect } from 'react-router-dom';\r\nimport { CallTree } from 'telehealth-client';\r\nimport authService from './ApiAuthorization/AuthorizeService'\r\nimport React from 'react';\r\nimport { Col, Row } from 'reactstrap';\r\n\r\ninterface CallTreeRouterState {\r\n\troomNameRedirect: string | null\r\n}\r\n\r\nexport class CallTreeRouter extends Component, CallTreeRouterState> {\r\n\tconstructor(props: Readonly<{}>) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\troomNameRedirect: null\r\n\t\t};\r\n\t}\r\n\r\n\tgetCallDetailsAsync() {\r\n\t\treturn Promise.resolve({\r\n\t\t\tunitNumber: undefined,\r\n\t\t\tagencyId: undefined,\r\n\t\t\tagencyName: undefined\r\n\t\t});\r\n\t}\r\n\r\n\tonCallCreated(roomId: string) {\r\n\t\tthis.setState({ roomNameRedirect: roomId });\r\n\t}\r\n\r\n\trender() {\r\n\t\tif (this.state.roomNameRedirect) {\r\n\t\t\treturn (\r\n\t\t\t\t\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn (<>\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tCall Center\r\n\t\t\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);\r\n\t}\r\n}","import { DateTime } from \"luxon\";\r\n\r\nexport default class CallLog {\r\n\tprivate readonly _caller: string;\r\n\tprivate readonly _agency?: string;\r\n\tprivate readonly _agencyNumber?: number;\r\n\tprivate _answeredBy?: string;\r\n\tprivate _roomId?: string;\r\n\treadonly callId: number;\r\n\treadonly recipient: string;\r\n\treadonly receivedOn: DateTime;\r\n\r\n\tconstructor(id: number, caller: string,\tcallerAgency: string, callRecipientName: string, received: DateTime, callerAgencyNumber?: number) {\r\n\t\tthis.callId = id;\r\n\t\tthis._caller = caller;\r\n\t\tthis._agency = callerAgency;\r\n\t\tthis._agencyNumber = callerAgencyNumber;\r\n\t\tthis.recipient = callRecipientName;\r\n\t\tthis.receivedOn = received;\r\n\t}\r\n\r\n\tdisplayCaller(): string {\r\n\t\tlet display = '';\r\n\r\n\t\tif(this._agency) {\r\n\t\t\tdisplay = this.appendDisplayPart(this._agency, display);\r\n\t\t}\r\n\r\n\t\tif(this._agencyNumber) {\r\n\t\t\tdisplay = this.appendDisplayPart(this._agencyNumber.toString(), display);\r\n\t\t}\r\n\r\n\t\tif(display) {\r\n\t\t\tdisplay = display.concat(\";\")\r\n\t\t}\r\n\r\n\t\tdisplay = this.appendDisplayPart(this._caller, display);\r\n\r\n\t\treturn display;\r\n\t }\r\n\r\n\t get startTime(): string {\r\n\t\t var now = DateTime.now();\r\n\r\n\t\t //convert to user's local\r\n\t\t const localReceivedOn = this.receivedOn.setZone(now.zone);\r\n\t\t return localReceivedOn.toLocaleString(DateTime.TIME_SIMPLE)\r\n\t }\r\n\r\n\t get answeredState(): string {\r\n\t\t let state = \"Not Answered\";\r\n\r\n\t\t this.answeredBy(person => state = \"Answered\");\r\n\t\t return state;\r\n\t }\r\n\r\n\t get callReceivedFormatted() {\r\n\t\t return this.formatForUser(this.receivedOn);\r\n\t }\r\n\r\n\t get callReceivedDateOnlyFormatted() {\r\n\t\t return this.receivedOn.toLocaleString(DateTime.DATE_SHORT);\r\n\t }\r\n\r\n\t get callReceivedTimeOnlyFormatted() {\r\n\t\treturn this.receivedOn.toLocaleString(DateTime.TIME_24_SIMPLE);\r\n\t }\r\n\r\n\t get room(): string | undefined {\r\n\t\t return this._roomId;\r\n\t }\r\n\r\n\t answeredBy(whenAnsweredBy: (person: string) => {}) {\r\n\t\t if(this._answeredBy) {\r\n\t\t\t whenAnsweredBy(this._answeredBy);\r\n\t\t }\r\n\t }\r\n\r\n\t answer(byPerson: string) {\r\n\t\t this._answeredBy = byPerson;\r\n\t }\r\n\r\n\tformatForUser(dateTime: DateTime): string {\r\n\t\treturn`${dateTime.toLocaleString(DateTime.DATE_SHORT)}, ${dateTime.toLocaleString(DateTime.TIME_24_SIMPLE)}`\r\n\t}\r\n\r\n\t inRoom(roomId: string) {\r\n\t\t this._roomId = roomId;\r\n\t }\r\n\r\n\t toCallLogRow() {\r\n\t\t let callLogRow = new CallLogRow(this.callId, this._caller, this._agency ?? '', this.recipient, this.receivedOn, this._agencyNumber);\r\n\t\t\r\n\t\tif(this._roomId) {\r\n\t\t\tcallLogRow.inRoom(this._roomId);\r\n\t\t}\r\n\r\n\t\tcallLogRow._answeredBy = this._answeredBy;\r\n\r\n\t\treturn callLogRow;\r\n\t }\r\n\r\n\t private appendDisplayPart(displayPart: string, toCaller: string) {\r\n\t\t return toCaller ? toCaller.concat(` ${displayPart}`) : toCaller.concat(`${displayPart}`)\r\n\t }\r\n}\r\n\r\nexport class CallLogRow extends CallLog {\r\n\trecentlyReceived: boolean = false;\r\n\r\n\tconstructor(id: number, caller: string,\tcallerAgency: string, callRecipientName: string, received: DateTime, callerAgencyNumber?: number) {\r\n\t\tsuper(id, caller, callerAgency, callRecipientName, received, callerAgencyNumber);\r\n\t}\r\n}\r\n","import Message from 'common/Message';\r\nimport CallNotificationPreferenceChange from 'common/messaging/CallNotificationPreferenceChange';\r\nimport UserDeclinedCall from 'common/messaging/UserDeclinedCall';\r\nimport { UserModifySuccessMessage, UserModifyFailMessage } from 'common/messaging/UserModificationMessage';\r\n\r\nexport enum MessageId {\r\n userCallAudioNotificationEnabled = 'setting-call-notification-user-action-modify',\r\n userCallDecline = 'user-call-decline',\r\n userModifySuccess = 'user-modify-success',\r\n userModifyFail = 'user-modify-fail',\r\n voidMessage = 'void-message'\r\n}\r\n\r\nexport class Messages {\r\n static callAudioAlertChange() {\r\n return new CallNotificationPreferenceChange();\r\n }\r\n\r\n static userDeclinedCall() {\r\n return new UserDeclinedCall();\r\n }\r\n\r\n static userModifySuccess() {\r\n return new UserModifySuccessMessage()\r\n }\r\n\r\n static userModifyFail() {\r\n return new UserModifyFailMessage();\r\n }\r\n}\r\n\r\nexport class MessageSubscription {\r\n private readonly subscriptionId: number = 0;\r\n private readonly message: Message;\r\n private readonly onMessageReceived: Function\r\n \r\n constructor(subscriptionId: number, subscribeTo: Message, onMessageReceived: Function) {\r\n this.subscriptionId = subscriptionId;\r\n this.message = subscribeTo;\r\n this.onMessageReceived = onMessageReceived; \r\n }\r\n\r\n get id() {\r\n return this.subscriptionId\r\n }\r\n\r\n get subscribedTo() {\r\n return this.message;\r\n }\r\n\r\n get onMessage() {\r\n return this.onMessageReceived;\r\n }\r\n}\r\n\r\nexport class MessagePublisher {\r\n private _subscriptions: MessageSubscription[] = []\r\n private _currentSubId = 0;\r\n \r\n public publish(message: Message, value: T) {\r\n for(const subscription of this._subscriptions) {\r\n if(subscription.subscribedTo.equals(message)) {\r\n subscription.onMessage(value);\r\n }\r\n }\r\n }\r\n\r\n public unsubscribeFrom(subscription: MessageSubscription) {\r\n for(let i = 0; i < this._subscriptions.length; i++) {\r\n const sub = this._subscriptions[i];\r\n\r\n if(sub.subscribedTo.equals(subscription.subscribedTo)) {\r\n this.removeSubscription(i);\r\n }\r\n }\r\n }\r\n\r\n public subscribe(toMessage: Message, withCallback: Function): MessageSubscription {\r\n const sub = new MessageSubscription(++this._currentSubId, toMessage, withCallback);\r\n\r\n this._subscriptions.push(sub);\r\n\r\n return sub;\r\n }\r\n\r\n /*****************\r\n * This method exists primarily to work around how React tracks items in the context API, which is by reference.\r\n * This is called from the App component after a new message is subscribed to. This causes a new reference,\r\n * which then triggers the context API to update all subscribed components.\r\n */\r\n public clone(): MessagePublisher {\r\n let clonedPublisher = new MessagePublisher();\r\n\r\n clonedPublisher._currentSubId = this._currentSubId;\r\n\r\n for(let sub of this._subscriptions) {\r\n clonedPublisher._subscriptions.push(sub);\r\n }\r\n \r\n return clonedPublisher;\r\n }\r\n\r\n private removeSubscription(index: number) {\r\n this._subscriptions = this._subscriptions.splice(index, 1);\r\n }\r\n}\r\n\r\nlet instance = new MessagePublisher();\r\n\r\nexport default instance;","///\r\n//Represents a response from an api call which returns json.\r\n//\r\n//Note: this is poorly named as it is attempting to return json in both the \r\n//succeeded and failed methods when there may not be json being returned from the api.\r\n//Probably warrants some refactoring to not make assumptions about the content returns\r\n//and only worry about the status code.\r\nexport abstract class ApiResponse {\r\n\treadonly statusCode: number = 0;\r\n\treadonly item: T;\r\n\tprotected _failureMessages: string[] = [];\r\n\r\n\tconstructor(statusCode: number, item: T) {\r\n\t\tif(!item) {\r\n\t\t\tthrow new Error(\"item cannot be null\");\r\n\t\t}\r\n\r\n\t\tif(statusCode < 0) {\r\n\t\t\tthrow new Error(`Invalid status code of ${statusCode} provided`)\r\n\t\t}\r\n\r\n\t\tthis.statusCode = statusCode;\r\n\t\tthis.item = item;\r\n\t}\r\n\r\n\tabstract successful(onSucceededResponse: (result: T) => void): void;\r\n\r\n\tabstract failure(onFailed: () => void): void;\r\n\r\n\terrorMessages() {\r\n\t\treturn [...this._failureMessages];\r\n\t} \r\n\r\n\tstatic async create(response: Response, successItemFactory: (json: TResponse) => T, failureItemFactory: () => T): Promise> {\r\n\t\tif(!!!response) {\r\n\t\t\tthrow new Error(\"response was not provided\");\r\n\t\t}\r\n\r\n\t\tif(!successItemFactory){\r\n\t\t\tthrow new Error(\"successItemFactory was not provided\");\r\n\t\t}\r\n\r\n\t\tif(!failureItemFactory){\r\n\t\t\tthrow new Error(\"failureItemFactory was not provided\");\r\n\t\t}\r\n\r\n\t\tif(response.status < 400) {\r\n\t\t\treturn await this.succeeded(response, successItemFactory);\r\n\t\t} \r\n\r\n\t\treturn this.failed(response, failureItemFactory);\r\n\t}\r\n\r\n\tstatic async succeeded(response: Response, itemFactory: (json: any) => T) {\r\n\t\tthis.creationChecks(response, itemFactory);\r\n\r\n\t\tvar contentType = response.headers.get('Content-Type');\r\n\r\n\t\tlet responseJson = '{}';\r\n\t\tlet item = {};\r\n\t\tif(contentType && contentType.includes(\"application/json\")) {\r\n\t\t\tresponseJson = await response.json();\r\n\t\t\titem = itemFactory(responseJson);\r\n\t\t}\r\n\r\n\t\treturn new SuccessfulApiResponse(response.status, item) as ApiResponse;;\r\n\t}\r\n\r\n\tstatic async failed(response: Response, itemFactory: () => T) {\r\n\t\tthis.creationChecks(response, itemFactory);\r\n\r\n\t\tlet item = itemFactory();\r\n\r\n\t\tlet failedApiResponse = new FailureApiResponse(response.status, item);\r\n\r\n\t\ttry {\r\n\t\t\tlet failedResponse = await response.json();\r\n\r\n\t\t\tif(failedResponse.failureMessages) {\r\n\t\t\t\tfor(let failureMessage of failedResponse.failureMessages) {\r\n\t\t\t\t\tfailedApiResponse._failureMessages.push(failureMessage);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch(error) {\r\n\t\t\tconsole.error(`${error}`);\r\n\t\t\tfailedApiResponse._failureMessages.push(\"We're sorry, we ran into an issue. We are looking into it now.\");\r\n\t\t}\r\n\r\n\t\treturn failedApiResponse as ApiResponse;\r\n\t}\r\n\r\n\tprivate static creationChecks(response: Response, itemFactory: (response: Response) => T){\r\n\t\tif(!!!response) { \r\n\t\t\tthrow new Error(\"response was not provided\");\r\n\t\t}\r\n\r\n\t\tif(!itemFactory){\r\n\t\t\tthrow new Error(\"itemFactory was not provided\")\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport class SuccessfulApiResponse extends ApiResponse {\r\n\tsuccessful(onSucceded: (result: T) => void) {\r\n\t\tonSucceded(this.item)\r\n\t}\r\n\r\n\tfailure(onFailed: () => void) {\r\n\t}\r\n}\r\n\r\nexport class FailureApiResponse extends ApiResponse {\r\n\tsuccessful(onSucceededResponse: (result: T) => void) {\r\n\t}\r\n\r\n\tfailure(onFailed: (failedResponse: FailureApiResponse) => void) {\r\n\t\t\tonFailed(this as FailureApiResponse)\r\n\t}\r\n}","import { ApiResponse } from \"common/ApiResponse\";\r\n\r\nexport class ApiResponseHandler {\r\n\tasync handle(unhandled: Response, onSuccess: (result: TResponse) => T, onFailure: () => T) {\r\n\t\tlet response = await ApiResponse.create(unhandled, \r\n\t\t\tr => onSuccess(r), \r\n\t\t\t() => onFailure());\r\n\r\n\t\treturn response;\r\n\t}\r\n}","export default class Message {\r\n readonly id: string;\r\n\r\n constructor(id: string) {\r\n if(!id) {\r\n throw new Error('A message id must be provided');\r\n }\r\n\r\n this.id = id;\r\n }\r\n\r\n equals(other: Message) {\r\n return this.id === other.id;\r\n }\r\n}","import { MessageId } from 'common/Messaging';\r\nimport Message from 'common/Message';\r\n\r\nexport default class CallNotificationPreferenceChange extends Message {\r\n constructor() {\r\n super(MessageId.userCallAudioNotificationEnabled);\r\n }\r\n}\r\n","import { MessageId } from 'common/Messaging';\r\nimport Message from 'common/Message';\r\nimport UserMessage from 'common/messaging/UserMessage';\r\n\r\nexport default class UserDeclinedCall extends Message {\r\n constructor() {\r\n super(MessageId.userCallDecline);\r\n }\r\n}","import Message from 'common/Message';\r\nimport { MessageId } from 'common/Messaging';\r\n\r\nexport class UserModifySuccessMessage extends Message {\r\n constructor() {\r\n super(MessageId.userModifySuccess)\r\n }\r\n}\r\n\r\nexport class UserModifyFailMessage extends Message {\r\n constructor() {\r\n super(MessageId.userModifyFail);\r\n }\r\n}","import Message from 'common/Message';\r\nimport { MessageId } from 'common/Messaging';\r\nimport CallLog from 'callCenter/CallLog';\r\n\r\n/*\r\n* A message that is published when a user declines answering a call\r\n*/\r\nexport default class DeclinedCallLog extends Message {\r\n readonly declinedCallLog: CallLog;\r\n\r\n constructor(log: CallLog) {\r\n super(MessageId.userCallDecline);\r\n\r\n this.declinedCallLog = log;\r\n }\r\n\r\n displayCaller() {\r\n return this.declinedCallLog.displayCaller();\r\n }\r\n}","export default class SettingStrings {\r\n static readonly userIncomingCallAudioNotification = 'User Incoming Call Notification';\r\n static readonly userIncomingCallSmsNotification = \"User Incoming Call SMS Notification\";\r\n\r\n static readonly callSystem = 'Call';\r\n static readonly notificationSubSystem = 'Notification';\r\n static readonly userCategory = 'User';\r\n\r\n static readonly deleteAction = 'delete';\r\n static readonly modifyAction = 'modify';\r\n}","import SettingStrings from 'common/settings/SettingStrings';\r\n\r\nexport class SettingRequestPayload {\r\n\treadonly system: string;\r\n\treadonly subSystem: string | undefined;\r\n\treadonly category: string;\r\n\treadonly action: string;\r\n\treadonly value: string | boolean;\r\n\treadonly name: string;\r\n\r\n\r\n\tconstructor(system: string, category: string, action: string, value: string | boolean, name: string, subSystem?: string) {\r\n\t\tthis.system = system;\r\n\t\tthis.category = category;\r\n\t\tthis.action = action;\r\n\t\tthis.value = value;\r\n\t\tthis.name = name;\r\n\t\tthis.subSystem = subSystem;\r\n\t}\r\n\r\n\tdelete() {\r\n\t\treturn new SettingRequestPayload(this.system, this.category, SettingStrings.deleteAction, this.value, this.name, this.subSystem);\r\n\t}\r\n}\r\n\r\n","import { SettingRequestPayload } from 'common/SettingRequestPayload'\r\nimport SettingStrings from 'common/settings/SettingStrings';\r\n\r\nexport class UserCallNotificationSetting extends SettingRequestPayload {\r\n\tconstructor(value: boolean | string) {\r\n\t\tsuper('call', 'user', SettingStrings.modifyAction, value, SettingStrings.userIncomingCallAudioNotification, 'notification');\r\n\t}\r\n}\r\n\r\nexport class EnabledUserCallNotificationSetting extends SettingRequestPayload {\r\n\tconstructor() {\r\n\t\tsuper('call', 'user', SettingStrings.modifyAction, 'yes', SettingStrings.userIncomingCallAudioNotification, 'notification');\r\n\t}\r\n}\r\n\r\nexport class UserCallSmsNotificationSetting extends SettingRequestPayload {\r\n\tconstructor(value: string) {\r\n\t\tsuper('call', 'user', SettingStrings.modifyAction, value, SettingStrings.userIncomingCallSmsNotification, 'notification');\r\n\t}\r\n}\r\n\r\nexport class DeleteUserCallSmsNotificationSetting extends SettingRequestPayload {\r\n\tconstructor() {\r\n\t\tsuper('call', 'user', SettingStrings.deleteAction, '', SettingStrings.userIncomingCallSmsNotification, 'notification');\r\n\t}\r\n}","import React, { Component } from \"react\";\r\nimport { CallNotification } from \"telehealth-abstractions\";\r\nimport { Button, Col, Row } from \"reactstrap\";\r\nimport \"./CallToast.scss\";\r\n\r\nexport interface CallToastProps {\r\n call: CallNotification;\r\n handleAnswerCall: (call: CallNotification) => Promise;\r\n handleIgnoreCall: (call: CallNotification) => void;\r\n handleRejectCall: (call: CallNotification) => void;\r\n}\r\n\r\nexport class CallToast extends Component, Readonly<{}>> {\r\n _subscriptionId: number | null = null;\r\n toastRef: HTMLDivElement | null = null;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n this.state = {\r\n incomingCallId: null,\r\n incomingCaller: null,\r\n redirectToRoom: false,\r\n };\r\n }\r\n\r\n render() {\r\n return (\r\n {\r\n this.toastRef = toastRef;\r\n }}\r\n >\r\n
\r\n
Incoming Call
\r\n
\r\n this.props.handleAnswerCall(this.props.call)}\r\n >\r\n \r\n {this.props.call.AgencyName ?? \"Incoming Call\"}\r\n {this.props.call.UnitNumber && {this.props.call.UnitNumber}}\r\n \r\n \r\n \r\n \r\n \r\n {this.props.call.From}\r\n \r\n \r\n \r\n \r\n this.props.handleIgnoreCall(this.props.call)}\r\n type=\"button\"\r\n color=\"orange\"\r\n >\r\n \r\n Ignore\r\n \r\n \r\n \r\n this.props.handleRejectCall(this.props.call)}\r\n title={`Decline call from ${this.props.call.From}`}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport { MessageSubscription } from '../Messaging';\r\nimport Message from '../Message';\r\n\r\nexport interface IMessagePublisherContext {\r\n publish: (message: Message, value: T) => void,\r\n subscribeTo: (message: Message, callback: (value: T) => void) => MessageSubscription;\r\n unsubscribeFrom: (subscription: MessageSubscription) => void;\r\n}\r\n\r\nconst messagingContext = React.createContext({\r\n publish: (message: Message, value: T) => {},\r\n subscribeTo: (message: Message, callback: (value: T) => void) => new MessageSubscription(-1, message, () => {}),\r\n unsubscribeFrom: () => {}\r\n});\r\n\r\nexport default messagingContext;","import { ApiUrl } from \"ApiConstants\";\r\nimport CallLog from \"callCenter/CallLog\";\r\nimport { ApiRequest } from \"common/ApiRequest\";\r\nimport { ApiResponseHandler } from \"common/ApiResponseHandler\";\r\nimport { Messages, MessageSubscription } from \"common/Messaging\";\r\nimport DeclinedCallLog from \"common/messaging/DeclinedCallLog\";\r\nimport {\r\n EnabledUserCallNotificationSetting,\r\n UserCallNotificationSetting,\r\n} from \"common/settings/UserCallNotificationSetting\";\r\nimport { DateTime } from \"luxon\";\r\nimport React, { Component } from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router-dom\";\r\nimport {\r\n CallAnsweredNotification,\r\n CallEndedNotification,\r\n CallNotification,\r\n IAuthService,\r\n} from \"telehealth-abstractions\";\r\nimport { CallService, HubStatusMethod } from \"telehealth-api\";\r\nimport { CallToast } from \"./CallToast\";\r\nimport { statusService } from \"./SignalR/StatusService\";\r\nimport { SettingRequestPayload } from \"../common/SettingRequestPayload\";\r\nimport SettingStrings from \"common/settings/SettingStrings\";\r\nimport MessagingContext, { IMessagePublisherContext } from \"common/messaging/MessagingContext\";\r\nimport { DeclineCallRequest } from \"telehealth-abstractions\";\r\n\r\ninterface CallToastManagerState {\r\n calls: Array;\r\n callIndex: number;\r\n callAlertEnabled: boolean;\r\n showToasts: boolean;\r\n}\r\n\r\ninterface CallToastManagerProps extends RouteComponentProps {\r\n authService: IAuthService;\r\n callService: CallService;\r\n}\r\n\r\nclass CallToastManager extends Component, Readonly> {\r\n _subscriptions: Array;\r\n callService!: CallService;\r\n _audioAlert: HTMLAudioElement;\r\n _messageSubs: MessageSubscription[];\r\n\r\n static contextType: React.Context = MessagingContext;\r\n context!: IMessagePublisherContext;\r\n\r\n constructor(props: CallToastManagerProps) {\r\n super(props);\r\n this._subscriptions = [];\r\n this._messageSubs = [];\r\n\r\n this.state = {\r\n calls: [],\r\n callIndex: 0,\r\n callAlertEnabled: false,\r\n showToasts: true,\r\n };\r\n\r\n //preload the alert audio file so it's ready to be played when needed\r\n this._audioAlert = new Audio(\"/call-alert.mp3\");\r\n this._audioAlert.loop = true;\r\n\r\n this.callService = props.callService;\r\n }\r\n\r\n async componentDidMount() {\r\n this._subscriptions.push(statusService.subscribe(this.incomingCall.bind(this), HubStatusMethod.IncomingCall));\r\n this._subscriptions.push(statusService.subscribe(this.callAnswered.bind(this), HubStatusMethod.CallAnswered));\r\n this._subscriptions.push(\r\n statusService.subscribe(\r\n (endedCall: CallEndedNotification) => this.removeCall(endedCall.CallId),\r\n HubStatusMethod.CallEnded\r\n )\r\n );\r\n this._subscriptions.push(\r\n statusService.subscribe(\r\n async (userId: string, available: boolean) => await this.handleUserStatusChange(userId, available),\r\n HubStatusMethod.UpdateStatus\r\n )\r\n );\r\n\r\n //listen for audio alert changes a user may make\r\n let audioAlertSub = this.context.subscribeTo(Messages.callAudioAlertChange(), (alertEnabled: boolean) => {\r\n if (alertEnabled !== this.state.callAlertEnabled) {\r\n this.setState({\r\n callAlertEnabled: alertEnabled,\r\n });\r\n }\r\n });\r\n\r\n if (audioAlertSub) {\r\n this._messageSubs.push(audioAlertSub);\r\n }\r\n\r\n await this.setupIncomingCallAlert();\r\n }\r\n\r\n componentDidUpdate(prevProps: RouteComponentProps, prevState: CallToastManagerState) {\r\n if (prevState.calls.length !== this.state.calls.length) {\r\n //unsubscribe from all call declination messages\r\n const removeSubscriptions: number[] = [];\r\n this._messageSubs.forEach((messageSub, index) => {\r\n if (messageSub.subscribedTo.equals(Messages.userDeclinedCall())) {\r\n removeSubscriptions.push(index);\r\n this.context.unsubscribeFrom(messageSub);\r\n }\r\n });\r\n\r\n for (let callSubRemoval of removeSubscriptions) {\r\n this._messageSubs.splice(callSubRemoval, 1);\r\n }\r\n\r\n //setup the call declined subscription again so if a user declines a call, we remove it from the toast list\r\n let sub = this.context.subscribeTo(Messages.userDeclinedCall(), (declinedMessage: DeclinedCallLog) => {\r\n const callIndex = this.state.calls.findIndex((c) => c.CallId === declinedMessage.declinedCallLog.callId);\r\n\r\n if (callIndex > -1) {\r\n this.setState((s) => {\r\n let callsCopy = s.calls;\r\n\r\n callsCopy.splice(callIndex, 1);\r\n return {\r\n calls: callsCopy,\r\n };\r\n });\r\n }\r\n });\r\n\r\n if (sub) {\r\n this._messageSubs.push(sub);\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this._subscriptions.forEach((s) => statusService.unsubscribe(s));\r\n this._messageSubs.forEach((ms) => this.context.unsubscribeFrom(ms));\r\n this._subscriptions = [];\r\n this._messageSubs = [];\r\n }\r\n\r\n incomingCall(call: CallNotification) {\r\n if (this.state.callAlertEnabled && this._audioAlert.paused) {\r\n this._audioAlert.play();\r\n }\r\n\r\n this.setState((state, props) => {\r\n call.CallIndex = state.callIndex + 1;\r\n let callsClone = state.calls.concat([]);\r\n callsClone.push(call);\r\n return {\r\n calls: callsClone,\r\n callIndex: call.CallIndex,\r\n };\r\n });\r\n }\r\n\r\n removeCall(callId: number) {\r\n this.stopAudioNotification();\r\n\r\n this.setState((state, props) => {\r\n let callsClone = state.calls.concat([]);\r\n let index = callsClone.findIndex((c) => c.CallId === callId);\r\n\r\n if (index > -1) {\r\n callsClone.splice(index, 1);\r\n }\r\n\r\n return {\r\n calls: callsClone,\r\n };\r\n });\r\n }\r\n\r\n // Someone else answered the call\r\n callAnswered(call: CallAnsweredNotification) {\r\n this.removeCall(call.CallId);\r\n }\r\n\r\n handleAnswerCall = async (call: CallNotification) => {\r\n this.stopAudioNotification();\r\n\r\n let response = await this.callService.answerCall({\r\n callId: call.CallId,\r\n });\r\n\r\n if (response.answered) {\r\n this.props.history.push(`/room?roomId=${call.RoomId}`);\r\n statusService.disableCallNotifications();\r\n this.setState({\r\n calls: [],\r\n });\r\n } else {\r\n this.removeCall(call.CallId);\r\n console.log(response.reason);\r\n }\r\n };\r\n\r\n handleIgnoreCall = (call: CallNotification) => {\r\n this.removeCall(call.CallId);\r\n };\r\n\r\n handleRejectCall = async (call: CallNotification) => {\r\n let awaitableCallDecline = this.callService.declineCall({ callId: call.CallId } as DeclineCallRequest);\r\n\r\n this.publishCallDeclinedMessage(call);\r\n this.removeCall(call.CallId);\r\n\r\n await awaitableCallDecline;\r\n };\r\n\r\n private async setupIncomingCallAlert() {\r\n let userAlertPreferenceRequest = new ApiRequest();\r\n let userAlertPreferenceResponse = await userAlertPreferenceRequest.post(\r\n `${ApiUrl.SettingUrl}/user/search`,\r\n new EnabledUserCallNotificationSetting()\r\n );\r\n\r\n let userAlertResponseHandler = new ApiResponseHandler();\r\n let userAlertSetting = await userAlertResponseHandler.handle(\r\n userAlertPreferenceResponse,\r\n (responseJson) => {\r\n var audioAlert = new UserCallNotificationSetting(false);\r\n for (let setting of responseJson) {\r\n if (setting.name !== SettingStrings.userIncomingCallAudioNotification) {\r\n continue;\r\n }\r\n\r\n if (setting.value === \"yes\") {\r\n audioAlert = new UserCallNotificationSetting(true);\r\n }\r\n }\r\n\r\n return audioAlert;\r\n },\r\n () => new UserCallNotificationSetting(false)\r\n );\r\n\r\n this.setState({\r\n callAlertEnabled: Boolean(userAlertSetting.item.value).valueOf(),\r\n });\r\n }\r\n\r\n private stopAudioNotification() {\r\n if (!this._audioAlert.paused) {\r\n this._audioAlert.pause();\r\n }\r\n }\r\n\r\n private async handleUserStatusChange(userId: string, available: boolean) {\r\n const id = await this.props.authService.getUserId();\r\n\r\n if (userId !== id) {\r\n return;\r\n }\r\n\r\n this.setState({\r\n showToasts: available,\r\n });\r\n }\r\n\r\n private publishCallDeclinedMessage(call: CallNotification) {\r\n this.context.publish(\r\n Messages.userDeclinedCall(),\r\n new DeclinedCallLog(\r\n new CallLog(\r\n call.CallId,\r\n call.From ?? \"Telehealth User\",\r\n call.AgencyName ?? \"Unknown Agency\",\r\n \"\",\r\n DateTime.now()\r\n )\r\n )\r\n );\r\n }\r\n\r\n render() {\r\n let toasts = this.state.calls.map((c) => (\r\n this.handleIgnoreCall(call)}\r\n handleRejectCall={this.handleRejectCall}\r\n />\r\n ));\r\n\r\n return (\r\n <>\r\n {this.state.showToasts && (\r\n \r\n {toasts}\r\n \r\n )}\r\n {!this.state.showToasts && null}\r\n \r\n );\r\n }\r\n}\r\n\r\nexport const RoutedCallToastManager = withRouter(CallToastManager);\r\n","export enum LoginStatus {\r\n\tFailure = 0,\r\n\tSuccess = 1,\r\n\tPasswordResetRequired = 2,\r\n\tFirstTimeLogin = 3\r\n}\r\n\r\nexport enum ResetPasswordStatus {\r\n\tFailure = 0,\r\n\tSuccess = 1,\r\n\tNotAuthorized = 401\r\n}","import * as React from 'react';\r\n\r\ntype FontAwesomeProps = {\r\n\tclassName?: string;\r\n\ticon: string;\r\n\tsize?: number;\r\n\tonClick?: () => void;\r\n}\r\n\r\nexport const FontAwesome = ({icon, className, size, onClick}: FontAwesomeProps) => ","import React, { useEffect, useState } from 'react';\r\nimport { Alert, Col, Row } from 'reactstrap';\r\n\r\nimport './Messages.scss'\r\n\r\nexport class MessageProps {\r\n\tsuccessMessages: Array = [];\r\n\terrorMessages: Array = [];\r\n\tsuccessDismissible?: boolean = false;\r\n\terrorsDismissible?: boolean = false;\r\n}\r\n\r\nexport const Messages = ({successMessages, errorMessages, successDismissible, errorsDismissible}: MessageProps) => {\r\n\tconst [displaySuccess, setShowSuccess] = useState(false);\r\n\tconst [displayErrors, setShowErrors] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif(successMessages.length > 0) {\r\n\t\t\tsetShowSuccess(true);\r\n\t\t} else {\r\n\t\t\tsetShowSuccess(false)\r\n\t\t}\r\n\t}, [successMessages]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif(errorMessages.length > 0) {\r\n\t\t\tsetShowErrors(true);\r\n\t\t} else {\r\n\t\t\tsetShowErrors(false);\r\n\t\t}\r\n\t}, [errorMessages])\r\n\r\n\tconst hideSuccessMessages = () => {\r\n\t\tsetShowSuccess(false);\r\n\t}\r\n\r\n\tconst hideErrorMessages = () => {\r\n\t\tsetShowErrors(false);\r\n\t}\r\n\t\r\n\treturn <>\t\r\n\t\t\t hideSuccessMessages()} : {})}>\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{ successMessages.map(message =>
  • {message}
  • ) }\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 hideErrorMessages()} : {})}>\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\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t{ errorMessages.map(message =>
  • {message}
  • ) }\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}\r\n","export interface IMessagesState {\r\n\tsuccessMessages: Array,\r\n\terrorMessages: Array\r\n}\r\n\r\nexport class MessageState implements IMessagesState {\r\n\tsuccessMessages: Array = new Array();\r\n\terrorMessages: Array = new Array();\r\n}\r\n","import { ApiUrl } from './ApiConstants';\r\nimport { LoginStatus, ResetPasswordStatus } from './SecurityStatus';\r\n\r\nexport class LoginResponse {\r\n\tstatus: LoginStatus = LoginStatus.Failure;\r\n\terrorMessages: Array = [];\r\n\torgId: string = '';\r\n\tpermissionGroups: string[] = []\r\n} \r\n\r\nexport class ResetPasswordResponse {\r\n\temail: string = '';\r\n\tuserId: string = '';\r\n\tuserName: string = '';\r\n\tstatus: ResetPasswordStatus = ResetPasswordStatus.Failure;\r\n\terrorMessages: Array = [];\r\n}\r\n\r\nexport class Passwords {\r\n\tnewPassword: string = '';\r\n\tconfirmPassword: string = '';\r\n\r\n\tconstructor(newPassword: string, confirmPassword: string) {\r\n\t\tif(!newPassword){\r\n\t\t\tthrow new Error('New password was not provided.');\r\n\t\t}\r\n\r\n\t\tif(!confirmPassword) {\r\n\t\t\tthrow new Error('Password confirmation was not provided.');\r\n\t\t}\r\n\r\n\t\tthis.newPassword = newPassword;\r\n\t\tthis.confirmPassword = confirmPassword;\r\n\t}\r\n\r\n}\r\n\r\nexport class SecurityManager {\r\n\tasync loginUser(username: string, password: string) {\r\n\t\tvar response = await fetch(ApiUrl.SecurityUrl, {\r\n\t\t\tmethod: \"POST\",\r\n\t\t\tbody: JSON.stringify({\r\n\t\t\t\tusername: username,\r\n\t\t\t\tpassword: password\r\n\t\t\t}),\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json'\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tlet responseJson = await response.json();\r\n\t\t\r\n\t\tlet loginResponse = new LoginResponse();\r\n\t\tloginResponse.status = responseJson.loginStatus;\r\n\t\tloginResponse.errorMessages = responseJson.failureMessages;\r\n\t\tloginResponse.orgId = responseJson.orgId;\r\n\t\tloginResponse.permissionGroups = responseJson.permissionGroups;\r\n\t\t\r\n\t\treturn loginResponse;\r\n\t}\r\n\r\n\tasync resetUserPassword(username: string, currentPassword: string, newPassword: string, confirmPassword: string){\r\n\t\tvar response = await fetch(`${ApiUrl.SecurityUrl}/user/reset`, {\r\n\t\t\tmethod: \"POST\",\r\n\t\t\tbody: JSON.stringify({\r\n\t\t\t\tusername: username,\r\n\t\t\t\tcurrentPassword: currentPassword,\r\n\t\t\t\tnewPassword: newPassword,\r\n\t\t\t\tconfirmPassword: confirmPassword\r\n\t\t\t}),\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json'\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn await this.createResetPasswordResponseFromAsync(response);\r\n\t}\r\n\r\n\tasync resetUserPasswordWithTokenAsync(newPassword: string, confirmPassword: string, resetToken: string) {\r\n\t\t\r\n\t\tlet response = await fetch(`${ApiUrl.SecurityUrl}/user/reset`, {\r\n\t\t\tmethod: \"POST\",\r\n\t\t\tbody: JSON.stringify({\r\n\t\t\t\tnewPassword: newPassword,\r\n\t\t\t\tconfirmPassword: confirmPassword,\r\n\t\t\t\tresetToken: resetToken\r\n\t\t\t}),\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json'\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn await this.createResetPasswordResponseFromAsync(response);\r\n\t}\r\n\r\n\tprivate async createResetPasswordResponseFromAsync(resetResponse: Response): Promise {\r\n\t\tlet response = await resetResponse.json();\r\n\r\n\t\tlet resetPasswordResponse = new ResetPasswordResponse();\r\n\r\n\t\tif(response.userEmail) {\r\n\t\t\tresetPasswordResponse.email = response.userEmail;\r\n\t\t}\r\n\t\t\r\n\t\tif(response.userId) {\r\n\t\t\tresetPasswordResponse.userId = response.userId;\r\n\t\t}\r\n\r\n\t\tif(response.userName) {\r\n\t\t\tresetPasswordResponse.userName = response.userName;\r\n\t\t}\r\n\r\n\t\tresetPasswordResponse.status = response.status;\r\n\r\n\t\tresetPasswordResponse.errorMessages = response.failureMessages;\r\n\r\n\t\treturn resetPasswordResponse;\r\n\t}\r\n}","import React, { PropsWithChildren } from 'react'\r\n\r\nexport interface ClickableTextProps {\r\n\tclasses?: string;\r\n\tonClicked: () => void;\t\t//The callback which will be invoked when this is clicked\r\n}\r\n\r\n/**********************\r\n * Creates a div styled to look like an anchor. Primarily used since the HTML spec says that \r\n * anchors with href's need to go somewhere which can be navigated via the address bar in the\r\n * browser\r\n ****************/\r\nexport const ClickableText = ({classes, onClicked, children}: PropsWithChildren) => {\r\n\treturn (\r\n\t\t
onClicked()} role=\"link\">{children}
\r\n\t)\r\n}","import { ApiUrl } from \"ApiConstants\";\r\n\r\nexport default class AnonymousApiRequest {\r\n\tasync get(url: string) {\r\n\t\tlet response = await fetch(url);\r\n\r\n\t\treturn response;\r\n\t}\r\n\t\r\n\tasync post(url: string, request: TRequest) {\r\n\t\tif(!url) {\r\n\t\t\tthrow new Error('URL was not provided');\r\n\t\t}\r\n\r\n\t\tif(!request) {\r\n\t\t\tthrow new Error(\"request was not provided\");\r\n\t\t}\r\n\r\n\t\tlet response = await fetch(url, {\r\n\t\t\tmethod: \"POST\",\r\n\t\t\tbody: JSON.stringify(request),\r\n\t\t\theaders: {\r\n\t\t\t\t\"Content-Type\": \"application/json\"\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn response;\r\n\t}\r\n}","export class ForgotPasswordRequest {\r\n\treadonly email: string;\r\n\r\n\tconstructor(email: string) {\r\n\t\tthis.email = email;\r\n\t}\r\n}","import React, { PropsWithChildren } from 'react';\r\nimport { Alert } from 'reactstrap';\r\n\r\nexport const ErrorMessages = ({children}: PropsWithChildren<{}>) => {\r\n\r\n\treturn(\r\n\t\t\r\n\t\t\t{children}\r\n\t\t\r\n\t)\r\n}","import React from 'react';\r\n\r\nexport const UnexpectedError =() => {\r\n\treturn (\r\n\t\t\r\n\t\t\tUh-oh, an unexpected error occurred within the system.{' '} \r\n\t\t\tThe issue has been logged and will be reviewed by our team.{' '}If you would \r\n\t\t\tlike, you can create a support ticket for this issue.\r\n\t\t \r\n\t)\r\n}","import React, { ComponentProps, useEffect, useState } from 'react';\r\nimport { Button, Form, FormFeedback, Input, InputGroup, InputGroupAddon, InputGroupText, } from 'reactstrap';\r\nimport { FontAwesome } from './Common/FontAwesome';\r\nimport { useFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport AnonymousApiRequest from '../common/AnonymousApiRequest';\r\nimport { ForgotPasswordRequest } from '../user/ForgotPasswordRequest';\r\nimport { ApiUrl } from '../ApiConstants';\r\nimport { ErrorMessages } from './Common/ErrorMessages';\r\nimport { UnexpectedError } from './Common/UnexpectedError';\r\nimport { ClickableText } from './Common/ClickableText';\r\n\r\ninterface ForgotPasswordProps extends ComponentProps {\r\n\tshowLogin: () => void;\r\n}\r\n\r\nexport const ForgotPassword = ({ showLogin } : ForgotPasswordProps) => {\r\n\tconst [emailValid, setEmailValid] = useState();\r\n\tconst [resetRequestSent, setResetRequestSent] = useState(false);\r\n\tconst [showErrors, setShowErrors] = useState(false);;\r\n\r\n\tconst resetForm = useFormik({\r\n\t\tinitialValues: {\r\n\t\t\temail: ''\r\n\t\t},\r\n\t\tvalidationSchema: Yup.object({\r\n\t\t\temail: Yup.string().required('An email address is required').email('Invalid email address provided')\r\n\t\t}),\r\n\t\tonSubmit: async values => {\r\n\t\t\tsetShowErrors(false);\r\n\r\n\t\t\tconst forgotPasswordApi = new AnonymousApiRequest();\r\n\t\t\tconst forgotPasswordRequest = new ForgotPasswordRequest(values.email);\r\n\r\n\t\t\tconst forgotPasswordResponse = await forgotPasswordApi.post(`${ApiUrl.UserUrl}/forgot-password`, forgotPasswordRequest);\r\n\r\n\t\t\tif(forgotPasswordResponse.ok) {\r\n\t\t\t\tsetResetRequestSent(true);\r\n\t\t\t} else {\r\n\t\t\t\tsetShowErrors(true);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\tuseEffect(() => {\r\n\t\tif(resetForm.errors.email) {\r\n\t\t\tsetEmailValid(false);\r\n\t\t} else {\r\n\t\t\tsetEmailValid(true);\r\n\t\t}\r\n\t}, [resetForm.errors.email])\r\n\r\n\tconst returnToLogin = () => {\r\n\t\tshowLogin();\r\n\t}\r\n\r\n\treturn (\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t{ showErrors && \r\n\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\tForgot Password\r\n\t\t\t\t{ !resetRequestSent &&\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t

A link to reset your password will be sent to your email address.

\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\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\t\r\n\t\t\t\t\t\t\t{resetForm.touched.email && resetForm.errors.email ? resetForm.errors.email : null}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t returnToLogin()}>Back to Login\r\n\t\t\t\t\t }\r\n\t\t\t\t{ resetRequestSent && \r\n\t\t\t\t\t

An email has been sent. Please click the link in it to reset your password.

}\r\n\t\t\t
\r\n\t)\r\n}","import React, { Component } from \"react\";\r\nimport { FontAwesome } from \"components/Common/FontAwesome\";\r\nimport { LoginActions } from \"components/ApiAuthorization/ApiAuthorizationConstants\";\r\nimport { Messages } from \"components/Common/Messages\";\r\nimport { MessageState } from \"./MessageState\";\r\nimport { Login } from \"components/ApiAuthorization/Login\";\r\nimport { LoginStatus } from \"../SecurityStatus\";\r\nimport { SecurityManager } from \"../SecurityManager\";\r\nimport { Button, Col, Form, Input, InputGroup, InputGroupAddon, InputGroupText, Row } from \"reactstrap\";\r\nimport { Redirect, RouteComponentProps, StaticContext } from \"react-router\";\r\nimport { ClickableText } from \"components/Common/ClickableText\";\r\nimport { ForgotPassword } from \"./ForgotPassword\";\r\nimport NavMenuContext from \"./Navigation/NavMenuContext\";\r\n\r\nimport \"./UserLogin.scss\";\r\n\r\nexport interface ILoginComponentProps extends RouteComponentProps<{}, StaticContext, { action?: string }> {\r\n afterLogin?: Iterable<() => Promise>;\r\n}\r\n\r\nexport class LoginState extends MessageState {\r\n username: string = \"\";\r\n password: string = \"\";\r\n redirectToLogin: boolean = false;\r\n showForgotPasswordForm: boolean = false;\r\n showReset: boolean = false;\r\n showLoader: boolean = true;\r\n showLogin: boolean = true;\r\n firstTimeLogin: boolean = false;\r\n enableLoginButton: boolean = true;\r\n}\r\n\r\nexport class UserLogin extends Component {\r\n private jumpTable: any = {\r\n [LoginStatus.Success]: async () => await this.setLoginSuccessState(),\r\n [LoginStatus.PasswordResetRequired]: () => this.setPasswordResetRequiredState(),\r\n [LoginStatus.FirstTimeLogin]: () => this.setFirstTimeLoginState(),\r\n };\r\n\r\n constructor(props: ILoginComponentProps) {\r\n super(props);\r\n\r\n this.state = new LoginState();\r\n }\r\n\r\n componentDidMount() {\r\n this.context.hideNav();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.context.showNav();\r\n }\r\n\r\n private async setLoginSuccessState() {\r\n this.setState((s) => ({\r\n ...s,\r\n redirectToLogin: true,\r\n }));\r\n }\r\n\r\n private setPasswordResetRequiredState() {\r\n this.setState((s) => ({\r\n ...s,\r\n showReset: true,\r\n showLogin: false,\r\n }));\r\n }\r\n\r\n private setFirstTimeLoginState() {\r\n this.setState((s) => ({\r\n ...s,\r\n showLogin: false,\r\n showReset: true,\r\n firstTimeLogin: true,\r\n }));\r\n }\r\n\r\n private async login() {\r\n this.clearErrors();\r\n this.disableLoginButton();\r\n\r\n var loginManager = new SecurityManager();\r\n\r\n try {\r\n let response = await loginManager.loginUser(this.state.username, this.state.password);\r\n\r\n var loginHandlerDelegate = this.jumpTable[response.status];\r\n\r\n if (loginHandlerDelegate) {\r\n loginHandlerDelegate();\r\n } else {\r\n this.populateErrorMessageStateFrom(response.errorMessages);\r\n this.enableLoginButton();\r\n }\r\n } catch (error) {\r\n this.enableLoginButton();\r\n\r\n if (!error.message) {\r\n return;\r\n }\r\n\r\n let singleErrorMessage: Array = [error.message];\r\n this.populateErrorMessageStateFrom(singleErrorMessage);\r\n }\r\n }\r\n\r\n private onUsernameChange(value: string) {\r\n this.setState((s) => ({\r\n ...s,\r\n username: value,\r\n }));\r\n }\r\n\r\n private handlePasswordChange(value: string) {\r\n this.setState((s) => ({\r\n ...s,\r\n password: value,\r\n }));\r\n }\r\n\r\n private clearErrors() {\r\n this.setState((s) => ({\r\n ...s,\r\n errorMessages: [],\r\n }));\r\n }\r\n\r\n private populateErrorMessageStateFrom(messages: Array) {\r\n if (!messages) {\r\n return;\r\n }\r\n let errorMessages: Array = [];\r\n this.state.errorMessages.forEach((msg) => errorMessages.push(msg));\r\n\r\n messages.forEach((msg: string) => errorMessages.push(msg));\r\n errorMessages.push();\r\n\r\n this.setState((s) => ({\r\n ...s,\r\n errorMessages: errorMessages,\r\n }));\r\n }\r\n\r\n private enableLoginButton() {\r\n this.setState((s) => ({\r\n ...s,\r\n enableLoginButton: true,\r\n }));\r\n }\r\n\r\n private disableLoginButton() {\r\n this.setState((s) => ({\r\n ...s,\r\n enableLoginButton: false,\r\n }));\r\n }\r\n\r\n private showForgotPasswordForm() {\r\n this.setState((s) => ({\r\n ...s,\r\n showForgotPasswordForm: true,\r\n showLogin: false,\r\n }));\r\n }\r\n\r\n private hideForgotPasswordForm() {\r\n this.setState((s) => ({\r\n ...s,\r\n showForgotPasswordForm: false,\r\n showLogin: true,\r\n }));\r\n }\r\n\r\n private async onPasswordKeyPress(key: string) {\r\n if (key === \"Enter\") {\r\n await this.login();\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n {this.state.showLogin ? (\r\n <>\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n this.onUsernameChange(event.target.value)}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n this.handlePasswordChange(event.target.value)}\r\n onKeyDown={(e) => this.onPasswordKeyPress(e.key)}\r\n />\r\n \r\n this.login()}\r\n disabled={!this.state.enableLoginButton}\r\n >\r\n Login\r\n \r\n this.showForgotPasswordForm()}>\r\n Forgot Password\r\n \r\n \r\n {this.state.redirectToLogin ? (\r\n \r\n ) : null}\r\n \r\n ) : null}\r\n {this.state.showReset ? (\r\n \r\n ) : null}\r\n {this.state.showForgotPasswordForm && this.hideForgotPasswordForm()} />}\r\n
\r\n );\r\n }\r\n}\r\n\r\nUserLogin.contextType = NavMenuContext;\r\n","import { Person } from './Person';\r\n\r\nexport enum TeamStatus {\r\n\tActive =\"Active\",\r\n\tInactive = \"Inactive\"\r\n}\r\n\r\nexport class Team {\r\n\tid: number = 0;\r\n\tname: string = \"Default Team\";\r\n\tmembers: Person[] = [];\r\n\tavailableUsers: Person[] = [];\r\n\tcreated = new Date().toDateString();\r\n\tstatus = TeamStatus.Active;\r\n\r\n\tstatic empty: Team = new Team(0, \"Default Team\");\r\n\tstatic unknown = new Team(0, \"Unknown\");\r\n\r\n\tconstructor(id: number, name: string){\r\n\t\tthis.id = id;\r\n\t\tthis.name = name\r\n\t}\r\n\r\n\tget memberCount() {\r\n\t\treturn this.members.length;\r\n\t}\r\n\r\n\taddToTeam(thisMember: Person) {\r\n\t\tthis.members.push(thisMember);\r\n\t}\r\n\r\n\tremoveFromTeam(thisMember: Person) {\r\n\t\tthis.members = this.members.filter(teamMember => thisMember.id !== teamMember.id);\r\n\t}\r\n\r\n\twithExisistingMembers(members: Person[]){\r\n\t\tthis.members = members;\r\n\t}\r\n\r\n\twithAvailableUser(users: Person[]){\r\n\t\tthis.availableUsers = users;\r\n\t}\r\n\r\n\tactivate() {\r\n\t\tthis.status = TeamStatus.Active;\r\n\t}\r\n\r\n\tdeactivate() {\r\n\t\tthis.status = TeamStatus.Inactive;\r\n\t}\r\n\r\n\tequals(other: Team): boolean {\r\n\t\tif(other === null) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(this.id === other.id && this.name === other.name) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n}","export interface IResetPasswordHandlerState\r\n{\r\n\twithCredentials(onHandlingWithCredentials: () => void ): IResetPasswordHandlerState;\r\n\twithResetToken(onHandlingWithToken: () => void): IResetPasswordHandlerState;\r\n}\r\n\r\nexport class UninitializedPasswordHandlerState implements IResetPasswordHandlerState\r\n{\r\n\tprivate login: string;\r\n\tprivate password: string;\r\n\tprivate resetToken: string;\r\n\r\n\tconstructor(login: string, password: string, resetToken: string) {\r\n\t\tthis.login = login;\r\n\t\tthis.password = password;\r\n\t\tthis.resetToken = resetToken;\r\n\r\n\t\tif(!this.login && !this.password && !this.resetToken) {\r\n\t\t\tthrow new Error(\"No login credentials or reset token was provided. Provide either to continue.\");\r\n\t\t}\r\n\r\n\t\tif(this.login && !this.password && !this.resetToken) {\r\n\t\t\tthrow new Error(\"No password was provided with a login. Provide a password to continue.\")\r\n\t\t}\r\n\r\n\t\tif(this.password && !this.login && !this.resetToken) {\r\n\t\t\tthrow new Error(\"No login was provided with a password. Provide a password to continue.\")\r\n\t\t}\r\n\t}\r\n\t\r\n\twithCredentials(onHandlingWithCredentials: () => void): IResetPasswordHandlerState {\r\n\t\tif(this.resetToken) {\r\n\t\t\treturn new InitializedWithTokenState();\r\n\t\t}\r\n\r\n\t\tif(this.login && this.password) {\r\n\t\t\tonHandlingWithCredentials();\r\n\t\t\treturn new InitializedWithCredentialsState();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\twithResetToken(onHandlingWithToken: () => void): IResetPasswordHandlerState {\r\n\t\tif(this.resetToken) {\r\n\t\t\tonHandlingWithToken();\r\n\t\t\treturn new InitializedWithTokenState();\r\n\t\t}\r\n\r\n\t\tif(this.login && this.password) {\r\n\t\t\treturn new InitializedWithCredentialsState();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nexport class InitializedWithCredentialsState implements IResetPasswordHandlerState {\r\n\twithCredentials(onHandlingWithCredentials: () => void): IResetPasswordHandlerState {\r\n\t\tonHandlingWithCredentials();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\twithResetToken(onHandlingWithToken: () => void): IResetPasswordHandlerState {\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nexport class InitializedWithTokenState implements IResetPasswordHandlerState {\r\n\twithCredentials(onHandlingWithPassword: () => void): IResetPasswordHandlerState {\r\n\t\treturn this;\r\n\t}\r\n\r\n\twithResetToken(onHandlingWithToken: () => void): IResetPasswordHandlerState {\r\n\t\tonHandlingWithToken();\r\n\r\n\t\treturn this;\r\n\t}\r\n}","import { ApiUrl } from '../ApiConstants';\r\nimport authService from '../components/ApiAuthorization/AuthorizeService';\r\n\r\ninterface IUserLookupState {\r\n\tlookup: (username: string) => IUserLookupState;\r\n\tdontLookup: () => IUserLookupState;\r\n}\r\n\r\n\r\nclass UserNotLookedUpState implements IUserLookupState {\r\n\tprivate _onLookingUp: (username: string) => void; \r\n\r\n\tconstructor(onUserLookingUp: (username: string) => void){\r\n\t\tif(!!!onUserLookingUp) {\r\n\t\t\tthrow new Error('onLookingUp callback was not provided');\r\n\t\t}\r\n\r\n\t\tthis._onLookingUp = onUserLookingUp;\r\n\t}\r\n\r\n\tlookup(username: string): IUserLookupState {\r\n\t\tif(!!!username) {\r\n\t\t\tthrow new Error(\"username was not provided\");\r\n\t\t}\r\n\t\t\r\n\t\tthis._onLookingUp(username);\r\n\r\n\t\treturn new UserLookedUpState(this._onLookingUp)\r\n\t}\r\n\r\n\tdontLookup(): IUserLookupState {\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nclass UserLookedUpState implements IUserLookupState {\r\n\tprivate _onLookingUp: (username: string) => void; \r\n\r\n\tconstructor(onLookingUp: (username: string) => void){\r\n\t\tif(!!!onLookingUp) {\r\n\t\t\tthrow new Error('onLookingUp callback was not provided');\r\n\t\t}\r\n\r\n\t\tthis._onLookingUp = onLookingUp;\r\n\t}\r\n\r\n\tlookup(username: string): IUserLookupState {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tdontLookup(): IUserLookupState {\r\n\t\treturn new UserNotLookedUpState(this._onLookingUp);\r\n\t}\r\n}\r\n\r\nexport class LoginUserService {\r\n\tprivate _userLookupResponse: IUserLookupState;\r\n\r\n\tconstructor(onLookingUp: (username: string) => void) {\r\n\t\tthis._userLookupResponse = new UserNotLookedUpState(onLookingUp);\r\n\t}\r\n\r\n\tasync lookupSignedInUserAsync() {\r\n\t\tconst accessToken = await authService.getAccessToken();\r\n\r\n\t\tif(!!!accessToken) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar lookupResponse = await fetch(`${ApiUrl.UserUrl}/lookupSignedInUser`, {\r\n\t\t\tmethod: \"GET\",\r\n\t\t\theaders: {\r\n\t\t\t\t\"Authorization\": `Bearer ${accessToken}`\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif(lookupResponse.redirected){\r\n\t\t\tthis._userLookupResponse = this._userLookupResponse.dontLookup();\r\n\t\t}\r\n\r\n\t\tif(lookupResponse.status === 200) {\r\n\t\t\tlet userLookup = await lookupResponse.json();\r\n\t\t\t\r\n\t\t\tthis._userLookupResponse = this._userLookupResponse.lookup(userLookup.username);\r\n\t\t} \r\n\t}\r\n\r\n\tasync lookupAnonymousUserByToken(resetToken: string) {\r\n\t\tif(!resetToken) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar lookupResponse = await fetch(`${ApiUrl.UserUrl}/lookupByToken/${resetToken}`);\r\n\r\n\t\tif(lookupResponse.status === 200) {\r\n\t\t\tlet lookup = await lookupResponse.json();\r\n\r\n\t\t\tthis._userLookupResponse = this._userLookupResponse.lookup(lookup.username);\r\n\t\t} \r\n\t}\r\n}","import * as React from \"react\";\r\nimport { RouteComponentProps, Redirect } from \"react-router\";\r\nimport { Button, Col, Form, FormGroup, Input, Label, Row } from \"reactstrap\";\r\nimport { ResetPasswordResponse, SecurityManager } from \"../SecurityManager\";\r\nimport { LoginStatus, ResetPasswordStatus } from \"../SecurityStatus\";\r\nimport { Login } from \"./ApiAuthorization/Login\";\r\nimport { LoginActions } from \"./ApiAuthorization/ApiAuthorizationConstants\";\r\nimport { Messages } from \"components/Common/Messages\";\r\nimport { MessageState } from \"./MessageState\";\r\nimport { IResetPasswordHandlerState, UninitializedPasswordHandlerState } from \"./ResetPasswordHandlerState\";\r\nimport { LoginUserService } from \"../services/LoginUserService\";\r\nimport { LoginResponse } from \"../SecurityManager\";\r\nimport AnonymousApiRequest from \"../common/AnonymousApiRequest\";\r\nimport { ApiUrl } from \"ApiConstants\";\r\nimport { ApiResponseHandler } from \"../common/ApiResponseHandler\";\r\nimport authService from \"./ApiAuthorization/AuthorizeService\";\r\nimport { ApplicationPaths } from \"./ApiAuthorization/ApiAuthorizationConstants\";\r\n\r\ntype ExpirationCheck = {\r\n username: string;\r\n inviteExpired: boolean;\r\n};\r\n\r\nexport interface IResetPasswordRouteProps {\r\n action: string;\r\n resetToken?: string;\r\n}\r\n\r\nexport interface IResetPasswordProps\r\n extends RouteComponentProps {}\r\n\r\nexport class ResetPasswordState extends MessageState {\r\n currentPassword: string = \"\";\r\n newPassword: string = \"\";\r\n confirmPassword: string = \"\";\r\n loginSucceeded: boolean = false;\r\n redirectToLogin: boolean = false;\r\n firstTimeLogin: boolean = false;\r\n username: string = \"\";\r\n inviteExpired: boolean = false;\r\n shouldRender: boolean = false;\r\n forceLogoff: boolean = false;\r\n registrationUrl: string = \"\";\r\n}\r\n\r\n//used to specify the Location state shape for react-route so that we may pass username from the UserLogin component\r\ninterface ResetPasswordLocationState {\r\n username: string;\r\n action?: string;\r\n}\r\n\r\nexport class ResetPassword extends React.Component, ResetPasswordState> {\r\n private handlerState?: IResetPasswordHandlerState;\r\n\r\n constructor(props: Readonly) {\r\n super(props);\r\n\r\n let state = new ResetPasswordState();\r\n\r\n if (props.location.state?.username) {\r\n state.username = props.location.state.username;\r\n }\r\n\r\n if (!this.props.match.params.resetToken) {\r\n state.firstTimeLogin = false;\r\n } else {\r\n state.firstTimeLogin = true;\r\n }\r\n\r\n this.state = state;\r\n }\r\n\r\n async componentDidMount() {\r\n let request = new AnonymousApiRequest();\r\n\r\n if (this.props.match.params.resetToken) {\r\n //if signed in, we need to logout and redirect back here\r\n if (await authService.isAuthenticated()) {\r\n //build the registration url to redirect back to after signing out\r\n let regUrl = encodeURIComponent(\r\n `${window.location.origin}${ApplicationPaths.RegistrationInvite}/${this.props.match.params.resetToken}`\r\n );\r\n\r\n this.setState((s) => ({\r\n ...s,\r\n forceLogoff: true,\r\n registrationUrl: regUrl,\r\n }));\r\n } else {\r\n //check for expired invitation\r\n let response = await request.get(`${ApiUrl.UserUrl}/lookupByToken/${this.props.match.params.resetToken}`);\r\n\r\n let expiredInviteCheck = new ApiResponseHandler();\r\n\r\n let user = await expiredInviteCheck.handle(\r\n response,\r\n (json) => json,\r\n () => ({ username: \"\", inviteExpired: false })\r\n );\r\n\r\n user.successful((result) =>\r\n this.setState((s) => ({\r\n ...s,\r\n inviteExpired: result.inviteExpired,\r\n errorMessages: result.inviteExpired ? [\"Your invite has expired\"] : [],\r\n }))\r\n );\r\n }\r\n }\r\n\r\n this.setState((s) => ({\r\n ...s,\r\n shouldRender: true,\r\n }));\r\n }\r\n\r\n private handleCurrentPasswordChange(currentPassword: string) {\r\n this.setState((s) => ({\r\n ...s,\r\n currentPassword: currentPassword,\r\n }));\r\n }\r\n\r\n private handlePasswordChange(password: string) {\r\n this.setState((s) => ({\r\n ...s,\r\n newPassword: password,\r\n }));\r\n }\r\n\r\n private handleConfirmPasswordChange(confirmPassword: string) {\r\n this.setState((s) => ({\r\n ...s,\r\n confirmPassword: confirmPassword,\r\n }));\r\n }\r\n\r\n private async submitPasswordChange(): Promise {\r\n if (this.state.username) {\r\n this.attemptPasswordReset(this.state.username);\r\n } else {\r\n let userService = new LoginUserService((lookedUpUser) => this.attemptPasswordReset(lookedUpUser));\r\n\r\n await userService.lookupAnonymousUserByToken(this.props.match.params.resetToken ?? \"\");\r\n }\r\n }\r\n\r\n private attemptPasswordReset(username: string) {\r\n this.handlerState = new UninitializedPasswordHandlerState(\r\n username,\r\n this.state.newPassword,\r\n this.props.match.params.resetToken ?? \"\"\r\n );\r\n\r\n //attempt both resets, the callback will only be invoked for the correct state, determined by what was provided to the initial handler state.\r\n this.handlerState = this.handlerState.withCredentials(async () => await this.resetWithCredentialsAsync());\r\n this.handlerState = this.handlerState.withResetToken(\r\n async () => await this.resetWithTokenAsync(this.props.match.params.resetToken ?? \"\")\r\n );\r\n }\r\n\r\n private async resetWithTokenAsync(resetToken: string): Promise {\r\n let securityManager = new SecurityManager();\r\n\r\n let passwordResetResponse = await securityManager.resetUserPasswordWithTokenAsync(\r\n this.state.newPassword,\r\n this.state.confirmPassword,\r\n resetToken\r\n );\r\n\r\n this.updateStateFromResetPasswordResponseAsync(passwordResetResponse);\r\n\r\n return passwordResetResponse;\r\n }\r\n\r\n private async resetWithCredentialsAsync(): Promise {\r\n var securityManager = new SecurityManager();\r\n\r\n let resetPasswordResponse = await securityManager.resetUserPassword(\r\n this.state.username,\r\n this.state.currentPassword,\r\n this.state.newPassword,\r\n this.state.confirmPassword\r\n );\r\n\r\n this.updateStateFromResetPasswordResponseAsync(resetPasswordResponse);\r\n\r\n return resetPasswordResponse;\r\n }\r\n\r\n private async updateStateFromResetPasswordResponseAsync(passwordResetResponse: ResetPasswordResponse): Promise {\r\n if (passwordResetResponse.status === ResetPasswordStatus.Success) {\r\n var securityManager = new SecurityManager();\r\n let loginResponse = await securityManager.loginUser(passwordResetResponse.userName, this.state.newPassword);\r\n\r\n this.updateStateFromLoginResponse(loginResponse);\r\n } else if (passwordResetResponse.status === ResetPasswordStatus.Failure) {\r\n let errors: string[] = [];\r\n passwordResetResponse.errorMessages.forEach((msg) => errors.push(msg));\r\n\r\n this.setState((s) => ({\r\n ...s,\r\n errorMessages: errors,\r\n }));\r\n }\r\n }\r\n\r\n private updateStateFromLoginResponse(loginResponse: LoginResponse) {\r\n let errors: string[] = [];\r\n\r\n switch (loginResponse.status) {\r\n case LoginStatus.Success:\r\n case LoginStatus.FirstTimeLogin:\r\n this.setState((s) => ({\r\n ...s,\r\n loginSucceeded: true,\r\n }));\r\n break;\r\n case LoginStatus.Failure:\r\n loginResponse.errorMessages.forEach((msg) => errors.push(msg));\r\n this.setState((s) => ({\r\n ...s,\r\n errorMessages: errors,\r\n }));\r\n break;\r\n default:\r\n this.setState((s) => ({\r\n ...s,\r\n redirectToLogin: true,\r\n }));\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n {this.state.shouldRender && (\r\n <>\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {!this.state.inviteExpired && (\r\n
\r\n
\r\n

Your password needs to be updated.

\r\n
\r\n
\r\n {!this.state.firstTimeLogin && (\r\n \r\n \r\n this.handleCurrentPasswordChange(event.target.value)}\r\n />\r\n \r\n )}\r\n \r\n \r\n this.handlePasswordChange(event.target.value)}\r\n />\r\n \r\n \r\n \r\n this.handleConfirmPasswordChange(event.target.value)}\r\n />\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n )}\r\n {this.state.loginSucceeded && }\r\n \r\n
\r\n
{\" \"}\r\n {this.state.forceLogoff && (\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n","export default class Queue {\r\n\tprivate items: Array = [];\r\n\r\n\tenqueue(item: T): void {\r\n\t\tif(!item) {\r\n\t\t\tthrow new Error('Item provided was undefined. Pass an initialized item to enqueue.');\r\n\t\t}\r\n\r\n\t\tthis.items.push(item);\r\n\t}\r\n\r\n\tdequeue(): T {\r\n\t\tif(this.items.length === 0) {\r\n\t\t\tthrow new Error('No items have been enqueued to this queue. Enqueue an item to be able to call dequeue.');\r\n\t\t}\r\n\r\n\t\tvar item = this.items[0];\r\n\r\n\t\tif(this.items.length === 1) {\r\n\t\t\tthis.items = [];\r\n\t\t} else {\r\n\t\t\tthis.items = this.items.slice(1, this.items.length);\r\n\t\t}\r\n\t\t\r\n\t\treturn item;\r\n\t}\r\n\r\n\tpeek(): T | null {\r\n\t\tif(this.items.length === 0) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar item = this.items[0];\r\n\r\n\t\treturn item;\r\n\t}\r\n}","import TreeNode from './treeNode';\r\nimport Queue from './queue';\r\n\r\nexport default class Tree {\r\n\tprivate root: TreeNode;\r\n\r\n\t/**\r\n\t * Constructs a new instance of a Tree, which holds items of type T\r\n\t * \r\n\t * @param root the node which is the root of this tree.\r\n\t */\r\n\tconstructor(root: TreeNode) {\r\n\t\tif(!root) {\r\n\t\t\tthrow new Error('A root for this tree was not defined. Initialize the tree by passing a non-null instance of a TreeNode');\r\n\t\t}\r\n\r\n\t\tthis.root = root;\r\n\t}\r\n\r\n\t/** \r\n\t * Visits every node in the tree, starting from the root.\r\n\t * It visits the node, and then its children in the order\r\n\t * they were added to the node.\r\n\t * \r\n\t * @param nodeVisitor a callback which will be called with the\r\n\t * \t\t\t\t\t\tnode being visited as a parameter. This \r\n\t * \t\t\t\t\t\tcannot be null or undefined. \r\n\t */\r\n\ttraverse(nodeVisitor: (visitingNode: TreeNode) => void) {\r\n\t\tvar queue = new Queue>();\r\n\r\n\t\tvar currentNode = this.root;\r\n\r\n\t\twhile(currentNode != null) {\r\n\t\t\tnodeVisitor(currentNode);\r\n\r\n\t\t\tcurrentNode.visitChildren(visitingNodeChild => {\r\n\t\t\t\tqueue.enqueue(visitingNodeChild);\r\n\t\t\t});\r\n\r\n\t\t\tif(!queue.peek()) {\r\n\t\t\t\tcurrentNode = null as any;\r\n\t\t\t} else {\r\n\t\t\t\tcurrentNode = queue.dequeue();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Searches the tree for a node in the tree.\r\n\t * \r\n\t * @param searchNode the node in the tree being searched for.\r\n\t * @returns the found TreeNode, or null if not found.\r\n\t */\r\n\tfind(searchNode: TreeNode, nodesEqual: ((first: TreeNode, second: TreeNode) => boolean)) : TreeNode | null {\r\n\t\tvar foundNode: TreeNode | null = null;\r\n\r\n\t\tthis.traverse((visitingNode) => {\r\n\t\t\tif(!nodesEqual) {\r\n\t\t\t\tlet firstValue: T | null = null;\r\n\t\t\t\tlet secondValue: T | null = null;\r\n\r\n\t\t\t\tsearchNode.visit(data => firstValue = data);\r\n\t\t\t\tvisitingNode.visit(data => secondValue = data);\r\n\r\n\t\t\t\tif(firstValue === secondValue){\r\n\t\t\t\t\tfoundNode = visitingNode;\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if(nodesEqual(visitingNode, searchNode)) {\r\n\t\t\t\tfoundNode = visitingNode;\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t\treturn foundNode;\r\n\t}\r\n\r\n\t/**\r\n\t * Finds the depth of the node in the tree. Returns the depth of the node if\r\n\t * its in the tree, or -1 if not.\r\n\t * \r\n\t * @param node the node to find the depth of in this tree\r\n\t */\r\n\tdepthOf(node: TreeNode): number {\r\n\t\tlet currentLevel: number = -1;\r\n\r\n\t\tvar nodeData: T | null = null;\r\n\t\tvar rootData: T | null = null;\r\n\r\n\t\tnode.visit(data => nodeData = data);\r\n\t\tthis.root.visit(data => rootData = data);\r\n\t\t\r\n\r\n\t\tif(nodeData === rootData) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tcurrentLevel = this.recurseNodeDepth(node, this.root, 0);\r\n\r\n\t\treturn currentLevel;\r\n\t}\r\n\r\n\tgetRoot(): TreeNode {\r\n\t\treturn this.root;\r\n\t}\r\n\r\n\tprivate recurseNodeDepth(targetNode: TreeNode, currentNode: TreeNode, level: number): number {\r\n\t\tvar targetNodeData: T | null = null;\r\n\t\tvar currentNodeData: T | null = null;\r\n\r\n\t\ttargetNode.visit(data => targetNodeData = data);\r\n\t\tcurrentNode.visit(data => currentNodeData = data);\r\n\r\n\t\tif(targetNodeData === currentNodeData) {\r\n\t\t\treturn level;\r\n\t\t}\r\n\t\t\r\n\t\tvar nextLevel = -1;\r\n\r\n\t\tcurrentNode.visitChildren(child => {\r\n\t\t\tnextLevel = this.recurseNodeDepth(targetNode, child, level + 1);\r\n\r\n\t\t\tif(nextLevel !== -1) {\r\n\t\t\t\treturn nextLevel;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn nextLevel;\r\n\t}\r\n}","export default class TreeNode {\r\n\tprivate data: T;\r\n\tprivate parent: TreeNode | null = null;\r\n\tprivate children: Array> = [];\r\n\r\n\tconstructor(data: T) {\r\n\t\tif(!data) {\r\n\t\t\tthrow new Error('Data was not provided for this nodes data.')\r\n\t\t}\r\n\r\n\t\tthis.data = data;\r\n\t}\r\n\r\n\taddChild(childNode: TreeNode): void {\r\n\t\tif(!childNode) {\r\n\t\t\tthrow new Error('Provided childNode was undefined. Provide an initialized childNode to continue.')\r\n\t\t}\r\n\t\t\r\n\t\tchildNode.parent = this;\r\n\t\tthis.children.push(childNode);\r\n\t}\r\n\r\n\tremoveChild(childNode: TreeNode): void {\r\n\t\tlet childRemovedCollection: Array> = [];\r\n\r\n\t\tfor(let child of this.children) {\r\n\t\t\tif(childNode.data === child.data){\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tchildRemovedCollection.push(child);\r\n\t\t}\r\n\r\n\t\tthis.children = childRemovedCollection;\r\n\t}\r\n\r\n\tvisit(visitCallback: (nodeData: T) => void): void {\r\n\t\tif(!visitCallback) {\r\n\t\t\tthrow new Error(\"No callback was provided for visitCallBack. Provide a callback to continue.\");\r\n\t\t}\r\n\r\n\t\tvisitCallback(this.data);\r\n\t}\r\n\r\n\tvisitParent(visitCallback: (parentNode: TreeNode) => void): void {\r\n\t\tif(!visitCallback) {\r\n\t\t\tthrow new Error(\"No callback was provided for visitCallBack. Provide a callback to continue.\");\r\n\t\t}\r\n\r\n\t\tif(!this.parent) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\r\n\t\tvisitCallback(this.parent);\r\n\t}\r\n\r\n\tvisitChildren(visitCallback: (childNode: TreeNode) => void): void {\r\n\t\tif(!visitCallback) {\r\n\t\t\tthrow new Error(\"No callback was provided for visitCallBack. Provide a callback to continue.\");\r\n\t\t}\r\n\r\n\t\tfor(let child of this.children) {\r\n\t\t\tvisitCallback(child);\r\n\t\t}\r\n\t}\r\n}","import Queue from './queue';\r\nimport Tree from './tree';\r\nimport TreeNode from './treeNode';\r\n\r\nexport interface ITreeParseFactoryOptions {\r\n\t/** \r\n\t * Defines the name of the property on the object containing the name of the root object which will be held in a [[`TreeNode``]].\r\n\t * For example, given an object \r\n\t * ```\r\n\t * {\r\n\t * \t root: {data: 'A'},\r\n\t * \t children: []\r\n\t * }\r\n\t * ```\r\n\t * \r\n\t * The nodeDataName would be 'data'.\r\n\t */\r\n\trootNodeName: string;\r\n\r\n\t/** \r\n\t * Defines the name of the property on the object containing the data which will be held in a [[`TreeNode``]].\r\n\t * For example, given an object \r\n\t * ```\r\n\t * {\r\n\t * \t root: {data: 'A'},\r\n\t * \t children: []\r\n\t * }\r\n\t * ```\r\n\t * \r\n\t * The nodeDataName would be 'data'.\r\n\t */\r\n\tnodeDataName: string;\r\n\r\n\t/** \r\n\t * Defines the name of the property on the object containing the child nodes of the current node.\r\n\t * For example, given an object \r\n\t * ```\r\n\t * {\r\n\t * \t root: {data: 'A',\r\n\t * \t children: [\r\n\t * \t\t{\r\n\t * \t\t data: 'B',\r\n\t * \t\t children: []\r\n\t * \t\t}\r\n\t * \t ]}\r\n\t * }\r\n\t * ```\r\n\t * \r\n\t * The childrenCollectionName would be 'children'.\r\n\t */\r\n\tchildrenCollectionName: string;\r\n\r\n\t/**\r\n\t * Defines a factory function which is used to create the data which will be stored at each node.\r\n\t */\r\n\tdataFactory: ((source: any) => T);\r\n\r\n\tnodesEqual: ((first: TreeNode, second: TreeNode) => boolean);\r\n}\r\n\r\n/**\r\n * An instance of TreeBuilder represents an item that knows how to parse an arbitrary JavaScript object\r\n * that has a tree-like shape and create a Tree. It uses the provided [[`ITreeParseOptions`]] to configure the \r\n * root object, the data entry, and children from the source so that the builder knows how to parse the \r\n * object to create the tree.\r\n */\r\nexport default class TreeBuilder {\r\n\tprivate readonly unparsedTree: any;\r\n\tprivate readonly parseOptions: ITreeParseFactoryOptions;\r\n\r\n\t/**\r\n\t * \r\n\t * @param unparsedTree the object that will be parsed to construct the tree.\r\n\t * @param parseOptions an instance of ITreeParseOptions defining the structure of the unparsedTree provided.\r\n\t */\r\n\tconstructor(unparsedTree: any, parseOptions: ITreeParseFactoryOptions) {\r\n\t\tif(!unparsedTree) {\r\n\t\t\tthrow new Error('An undefined object was passed to this treeBuilder. Provide an initializedJson object to use this treeBuilder.');\r\n\t\t}\r\n\r\n\t\tif(!parseOptions) {\r\n\t\t\tthrow new Error('Uninitialized parse options were passed to this treeBuilder. Provide initialized options to use this treeBuilder.');\r\n\t\t}\r\n\r\n\t\tthis.unparsedTree = unparsedTree;\r\n\t\tthis.parseOptions = parseOptions;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates the tree from the unparsed object provided to the constructor.\r\n\t * \r\n\t * @returns a Tree resulting from parsing, or null if the object provided to the\r\n\t * \t\t\tconstructor could not be parsed.\r\n\t */\r\n\tparse(): Tree | null {\r\n\t\tvar queue = new Queue();\r\n\r\n\t\tvar current: any | null = this.unparsedTree[this.parseOptions.rootNodeName];\r\n\t\tvar tree: Tree | null = null;\r\n\r\n\t\twhile(current) {\r\n\t\t\tvar data = this.parseOptions.dataFactory(current)\r\n\r\n\t\t\t//Have we processed this node as a child in the previous iteration?\r\n\t\t\tvar processedChild: TreeNode = new TreeNode(data);\r\n\t\t\tvar treeNode: TreeNode | null = null;\r\n\r\n\t\t\t/*\r\n\t\t\t* The tree is not initialized; this has to be the root which means we\r\n\t\t\t* haven't processed this node previously.\r\n\t\t\t*/\r\n\t\t\tif(!tree) {\r\n\t\t\t\ttree = new Tree(processedChild);\r\n\t\t\t\ttreeNode = processedChild;\r\n\t\t\t} else {\r\n\t\t\t\ttreeNode = tree.find(processedChild, this.parseOptions.nodesEqual);\r\n\t\t\t\tif(!treeNode) {\r\n\t\t\t\t\t//This shouldn't ever happen, but erring on the side of caution\r\n\t\t\t\t\tthrow new Error('A previously processed child node was not found in the tree being built. Ensure the tree json being parsed is well formed.');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar children = current[this.parseOptions.childrenCollectionName] || [];\r\n\r\n\t\t\tfor(let child of children) {\r\n\t\t\t\tvar childData = this.parseOptions.dataFactory(child);\r\n\t\t\t\tvar childNode = new TreeNode(childData);\r\n\r\n\t\t\t\tif(treeNode) {\r\n\t\t\t\t\ttreeNode.addChild(childNode);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tqueue.enqueue(child);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(queue.peek()) {\r\n\t\t\t\tcurrent = queue.dequeue();\r\n\t\t\t} else {\r\n\t\t\t\tcurrent = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn tree;\r\n\t}\r\n\r\n\tparseModel(dataFactory: (source: any) => T): Tree | null {\r\n\t\tvar queue = new Queue();\r\n\r\n\t\tvar current: any | null = this.unparsedTree[this.parseOptions.rootNodeName];\r\n\t\tvar tree: Tree | null = null;\r\n\r\n\t\twhile(current) {\r\n\t\t\tvar data = dataFactory(current[this.parseOptions.nodeDataName]);\r\n\r\n\t\t\t//Have we processed this node as a child in the previous iteration?\r\n\t\t\tvar processedChild: TreeNode = new TreeNode(data);\r\n\t\t\tvar treeNode: TreeNode | null = null;\r\n\r\n\t\t\t/*\r\n\t\t\t* The tree is not initialized; this has to be the root which means we\r\n\t\t\t* haven't processed this node previously.\r\n\t\t\t*/\r\n\t\t\tif(!tree) {\r\n\t\t\t\ttree = new Tree(processedChild);\r\n\t\t\t\ttreeNode = processedChild;\r\n\t\t\t} else {\r\n\t\t\t\ttreeNode = tree.find(processedChild, this.parseOptions.nodesEqual);\r\n\t\t\t\tif(!treeNode) {\r\n\t\t\t\t\t//This shouldn't ever happen, but erring on the side of caution\r\n\t\t\t\t\tthrow new Error('A previously processed child node was not found in the tree being built. Ensure the tree json being parsed is well formed.');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar children = current[this.parseOptions.childrenCollectionName] || [];\r\n\r\n\t\t\tfor(let child of children) {\r\n\t\t\t\tvar childData = dataFactory(child[this.parseOptions.nodeDataName])\r\n\t\t\t\tvar childNode = new TreeNode(childData);\r\n\r\n\t\t\t\tif(treeNode) {\r\n\t\t\t\t\ttreeNode.addChild(childNode);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tqueue.enqueue(child);\r\n\t\t\t}\r\n\r\n\t\t\tif(queue.peek()) {\r\n\t\t\t\tcurrent = queue.dequeue();\r\n\t\t\t} else {\r\n\t\t\t\tcurrent = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn tree;\r\n\t}\r\n\r\n}","import { Team } from './Team';\r\nimport { OrgUser } from './organization/OrgUser';\r\n\r\nexport class Organization {\r\n\tid: string = '';\r\n\tname: string = '';\r\n\taddedTeamName: string = '';\r\n\r\n\tteams: Team[] = [];\r\n\tusers: OrgUser[] = []\r\n\r\n\tconstructor(id: string, name: string){\r\n\t\tthis.id = id;\r\n\t\tthis.name = name;\r\n\t}\r\n\r\n\tmanages(teams: Team[]) {\r\n\t\tthis.teams = teams;\r\n\t}\r\n\r\n\taccessibleBy(users: OrgUser[]) {\r\n\t\tthis.users = users;\r\n\t}\r\n\r\n\tfindUserWithId(id: string) {\r\n\t\tlet foundUser = this.users.find(user => user.id === id);\r\n\r\n\t\treturn foundUser;\r\n\t}\r\n\r\n\taddUser(user: OrgUser) {\r\n\t\tlet updatedUsers = [...this.users];\r\n\t\tupdatedUsers.push(user);\r\n\t\t\r\n\t\tlet updatedOrg = new Organization(this.id, this.name);\r\n\t\tupdatedOrg.teams = this.teams;\r\n\t\tupdatedOrg.addedTeamName = this.addedTeamName;\r\n\t\tupdatedOrg.users = updatedUsers;\r\n\r\n\t\treturn updatedOrg;\r\n\t}\r\n\r\n\tupdateUser(user: OrgUser): Organization {\r\n\t\tlet updatedUsers = [];\r\n\r\n\t\tfor(let currentUser of this.users) {\r\n\t\t\tif(currentUser.id === user.id) {\r\n\t\t\t\tupdatedUsers.push(user);\r\n\t\t\t} else {\r\n\t\t\t\tupdatedUsers.push(currentUser);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tlet updatedOrg = new Organization(this.id, this.name);\r\n\t\tupdatedOrg.teams = this.teams;\r\n\t\tupdatedOrg.addedTeamName = this.addedTeamName;\r\n\t\tupdatedOrg.users = updatedUsers;\r\n\r\n\t\treturn updatedOrg;\r\n\t}\r\n\r\n\taddTeam(addedTeam: Team) {\r\n\t\tlet updatedUsers = [];\r\n\r\n\t\tfor(let user of this.users) {\r\n\t\t\tif(addedTeam.members.some(m => m.id === user.id)){\r\n\t\t\t\tuser.onTeam(addedTeam);\r\n\t\t\t}\r\n\r\n\t\t\tupdatedUsers.push(user);\r\n\t\t}\r\n\r\n\t\tlet updatedTeams = [...this.teams, addedTeam]\r\n\r\n\t\tlet updatedOrg = new Organization(this.id, this.name);\r\n\t\tupdatedOrg.teams = [...this.teams, addedTeam].sort((a, b) => this.sortTeams(a, b));\r\n\t\tupdatedOrg.users = updatedUsers;\r\n\t\t\r\n\t\treturn updatedOrg;\r\n\t}\r\n\r\n\tupdateTeam(updatedTeam: Team) {\r\n\t\tlet updatedTeams = this.teams.filter(t => t.id !== updatedTeam.id);\r\n\t\tupdatedTeams.push(updatedTeam);\r\n\r\n\t\tupdatedTeams.sort((a, b) => this.sortTeams(a, b));\r\n\r\n\t\tlet updatedUsers = [];\r\n\r\n\t\tfor(let user of this.users) {\r\n\t\t\tlet userTeams = [];\r\n\t\t\tfor(let userTeam of user.teams){\r\n\t\t\t\tif(userTeam.id === updatedTeam.id){\r\n\t\t\t\t\tuserTeams.push(updatedTeam);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tuserTeams.push(userTeam);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tuser.teams = [...userTeams];\r\n\t\t\tupdatedUsers.push(user);\r\n\t\t\tuserTeams = [];\r\n\t\t}\r\n\r\n\t\tlet updatedOrg = new Organization(this.id, this.name);\r\n\t\tupdatedOrg.teams = updatedTeams;\r\n\t\tupdatedOrg.users = updatedUsers;\r\n\t\t\r\n\t\treturn updatedOrg;\r\n\t}\r\n\r\n\tprivate sortTeams(a: Team, b: Team) {\r\n\t\treturn this.compareStrings(a.name, b.name);\r\n\t}\r\n\r\n\tprivate compareStrings(a: string, b: string) {\r\n\t\tif(!a && !b) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tif(a === b) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tif(a < b) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\r\n\t\treturn 1;\t\r\n\t}\r\n \r\n\tstatic default = new Organization(\"\", \"\");\r\n}","export enum AccountStatusDescriptions {\r\n\tActive = \"Active\",\r\n\tInactive = \"Inactive\"\r\n}","export interface AccountStatusState {\r\n\tactive(onActivating: () => void): AccountStatusState;\r\n\tinactive(onDeactivating: () => void): AccountStatusState;\r\n}\r\n\r\nexport class ActiveStatusState implements AccountStatusState {\r\n\tactive(onActivating: () => void) {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tinactive(onDeactivating: () => void) {\r\n\t\tif(!!!onDeactivating) {\r\n\t\t\tthrow new Error(\"onDeactivating callback not provided\");\r\n\t\t}\r\n\r\n\t\tonDeactivating();\r\n\r\n\t\treturn new InactiveStatusState();\r\n\t}\r\n}\r\n\r\nexport class InactiveStatusState implements AccountStatusState {\r\n\tactive(onActivating: () => void) {\r\n\t\tif(!!!onActivating) {\r\n\t\t\tthrow new Error(\"onActivating callback not provided\");\r\n\t\t}\r\n\r\n\t\tonActivating();\r\n\r\n\t\treturn new ActiveStatusState();\r\n\t}\r\n\r\n\tinactive(onDeactivating: () => void) {\r\n\t\treturn this;\r\n\t}\r\n}","export interface NameState {\r\n\thasMiddleName: () => NameState;\r\n\thasPrefix:() => NameState;\r\n\thasSuffix:() => NameState;\r\n\tincludeMiddleName: (onHasMiddleName: () => void) => void;\r\n\tincludePrefix: (onHasPrefix: () => void) => void;\r\n\tincludeSuffix: (onHasSuffix: () => void) => void;\r\n}\r\n\r\nexport class FirstLastState implements NameState {\r\n\thasMiddleName() {\r\n\t\treturn new FirstMiddleLastState() as NameState;\r\n\t}\r\n\r\n\thasPrefix() {\r\n\t\treturn new PrefixFirstLastState() as NameState;\r\n\t}\r\n\r\n\thasSuffix() {\r\n\t\treturn new FirstLastSuffixState() as NameState;\r\n\t}\r\n\r\n\tincludeMiddleName(onHasMiddleName: () => void) {\r\n\t\t//NO-OP\r\n\t}\r\n\r\n\tincludePrefix(onHasPrefix: () => void) {\r\n\t\t//NO-OP\r\n\t}\r\n\r\n\tincludeSuffix(onHasSuffix: () => void) {\r\n\t\t//NO-OP\r\n\t}\r\n}\r\n\r\nexport class FirstMiddleLastState implements NameState {\r\n\thasMiddleName() {\r\n\t\treturn this as NameState;\r\n\t}\r\n\r\n\thasPrefix() {\r\n\t\treturn new PrefixFirstMiddleLastState() as NameState;\r\n\t}\r\n\r\n\thasSuffix() {\r\n\t\treturn new FirstMiddleLastSuffixState() as NameState;\r\n\t}\r\n\r\n\tincludePrefix(onHasPrefix: () => void) {\r\n\t\t//NO-OP\r\n\t}\r\n\r\n\tincludeMiddleName(onHasMiddleName: () => void) {\r\n\t\tif(!!!onHasMiddleName) {\r\n\t\t\tthrow new Error(\"onHasMiddleName callback was not provided\");\r\n\t\t}\r\n\r\n\t\tonHasMiddleName();\r\n\t}\r\n\r\n\tincludeSuffix(onHasSuffix: () => void) {\r\n\t\t//NO-OP\r\n\t}\r\n}\r\n\r\nexport class PrefixFirstLastState implements NameState {\r\n\thasMiddleName() {\r\n\t\treturn new PrefixFirstMiddleLastState() as NameState;\r\n\t}\r\n\r\n\thasPrefix() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\thasSuffix() {\r\n\t\treturn new PrefixFirstLastSuffixState() as NameState;\r\n\t};\r\n\r\n\tincludeMiddleName(onHasMiddleName: () => void) {\r\n\t\t//NO-OP\r\n\t};\r\n\r\n\tincludePrefix(onHasPrefix: () => void) {\r\n\t\tif(!onHasPrefix) {\r\n\t\t\tthrow new Error(\"onHasPrefix callback was not provided\");\r\n\t\t}\r\n\r\n\t\tonHasPrefix();\r\n\t}\r\n\r\n\tincludeSuffix(onHasSuffix: () => void) {\r\n\t\t//NO-OP\r\n\t}\r\n\r\n}\r\n\r\nexport class FirstLastSuffixState implements NameState {\r\n\thasMiddleName() {\r\n\t\treturn new FirstMiddleLastSuffixState() as NameState;\r\n\t}\r\n\r\n\thasPrefix() {\r\n\t\treturn new PrefixFirstLastSuffixState() as NameState;\r\n\t}\r\n\r\n\thasSuffix() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tincludeMiddleName(onHasMiddleName: () => void) {\r\n\t\t//NO-OP\r\n\t}\r\n\r\n\tincludePrefix(onHasPrefix: () => void) {\r\n\t\t//NO-OP\r\n\t}\r\n\r\n\tincludeSuffix(onHasSuffix: () => void) {\r\n\t\tif(!!!onHasSuffix) {\r\n\t\t\tthrow new Error(\"onHasSuffix callback was not provided.\");\r\n\t\t}\r\n\r\n\t\tonHasSuffix();\r\n\t}\r\n}\r\n\r\nexport class PrefixFirstMiddleLastState implements NameState {\r\n\thasMiddleName() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\thasPrefix() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\thasSuffix() {\r\n\t\treturn new PrefixFirstMiddleLastSuffixState() as NameState;\r\n\t}\r\n\r\n\tincludeMiddleName(onHasMiddleName: () => void) {\r\n\t\tif(!!!onHasMiddleName) {\r\n\t\t\tthrow new Error(\"onHasMiddleName callback was not provided.\");\r\n\t\t}\r\n\r\n\t\tonHasMiddleName();\r\n\t}\r\n\r\n\tincludePrefix(onHasPrefix: () => void) {\r\n\t\tif(!!!onHasPrefix) {\r\n\t\t\tthrow new Error(\"onHasPrefix callback was not provided.\");\r\n\t\t}\r\n\r\n\t\tonHasPrefix();\r\n\t}\r\n\r\n\tincludeSuffix(onHasSuffix: () => void) {\r\n\t\t//NO-OP\r\n\t}\r\n}\r\n\r\nexport class FirstMiddleLastSuffixState implements NameState {\r\n\thasMiddleName() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\thasPrefix() {\r\n\t\treturn new PrefixFirstMiddleLastSuffixState() as NameState;\r\n\t}\r\n\r\n\thasSuffix() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tincludeMiddleName(onHasMiddleName: () => void) {\r\n\t\tif(!!!onHasMiddleName) {\r\n\t\t\tthrow new Error(\"onHasMiddleName callback was not provided.\");\r\n\t\t}\r\n\r\n\t\tonHasMiddleName();\r\n\t}\r\n\r\n\tincludePrefix(onHasPrefix: () => void) {\r\n\t\t//NO-OP\r\n\t}\r\n\r\n\tincludeSuffix(onHasSuffix: () => void) {\r\n\t\tif(!!!onHasSuffix) {\r\n\t\t\tthrow new Error(\"onHasSuffix callback was not provided.\");\r\n\t\t}\r\n\r\n\t\tonHasSuffix();\r\n\t}\r\n}\r\n\r\nexport class PrefixFirstLastSuffixState implements NameState {\r\n\thasMiddleName() {\r\n\t\treturn new PrefixFirstMiddleLastSuffixState() as NameState;\r\n\t}\r\n\r\n\thasPrefix() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\thasSuffix() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tincludeMiddleName(onHasMiddleName: () => void) {\r\n\t\t//NO-OP\r\n\t}\r\n\r\n\tincludePrefix(onHasPrefix: () => void) {\r\n\t\tif(!!!onHasPrefix) {\r\n\t\t\tthrow new Error(\"onHasPrefix callback was not provided.\");\r\n\t\t}\r\n\r\n\t\tonHasPrefix();\r\n\t}\r\n\r\n\tincludeSuffix(onHasSuffix: () => void) {\r\n\t\tif(!!!onHasSuffix) {\r\n\t\t\tthrow new Error(\"onHasSuffix callback was not provided.\");\r\n\t\t}\r\n\r\n\t\tonHasSuffix();\r\n\t}\r\n}\r\n\r\nexport class PrefixFirstMiddleLastSuffixState implements NameState {\r\n\thasMiddleName() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\thasPrefix() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\thasSuffix() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tincludeMiddleName(onHasMiddleName: () => void) {\r\n\t\tif(!!!onHasMiddleName) {\r\n\t\t\tthrow new Error(\"onHasMiddleName callback was not provided.\");\r\n\t\t}\r\n\r\n\t\tonHasMiddleName();\r\n\t}\r\n\r\n\tincludePrefix(onHasPrefix: () => void) {\r\n\t\tif(!!!onHasPrefix) {\r\n\t\t\tthrow new Error(\"onHasPrefix callback was not provided.\");\r\n\t\t}\r\n\r\n\t\tonHasPrefix();\r\n\t}\r\n\r\n\tincludeSuffix(onHasSuffix: () => void) {\r\n\t\tif(!!!onHasSuffix) {\r\n\t\t\tthrow new Error(\"onHasSuffix callback was not provided.\");\r\n\t\t}\r\n\r\n\t\tonHasSuffix();\r\n\t}\r\n}\r\n","export class NameParts {\r\n\treadonly firstName: string;\r\n\treadonly lastName: string;\r\n\treadonly middleName?: string;\r\n\tprivate _prefix?: string;\r\n\tprivate _suffix?: string;\r\n\r\n\tconstructor(firstName: string, lastName: string, middleName?: string) {\r\n\t\tif(!!!firstName) {\r\n\t\t\tthrow new Error(\"firstName was not provided\");\r\n\t\t}\r\n\r\n\t\tif(!!!lastName) {\r\n\t\t\tthrow new Error(\"lastName was not provided\");\r\n\t\t}\r\n\r\n\t\tthis.firstName = firstName;\r\n\t\tthis.lastName = lastName;\r\n\r\n\t\tif(middleName) {\r\n\t\t\tthis.middleName = middleName;\t\r\n\t\t}\r\n\t}\r\n\r\n\tget prefix() {\r\n\t\treturn this._prefix;\r\n\t}\r\n\r\n\tget suffix() {\r\n\t\treturn this._suffix;\r\n\t}\r\n\r\n\taddPrefix(prefix: string) {\r\n\t\tif(!this._prefix) {\r\n\t\t\tthis._prefix = prefix;\r\n\t\t}\r\n\t}\r\n\r\n\taddSuffix(suffix: string) {\r\n\t\tif(!this._suffix) {\r\n\t\t\tthis._suffix = suffix;\r\n\t\t}\r\n\t}\r\n\r\n\tstatic EmptyName: NameParts = new NameParts(\"First\", \"Last\");\r\n} ","import { NameParts } from \"./NameParts\";\r\n\r\nexport class NameSplitter {\r\n\tprivate _namePattern = /^(?(?:Mr[sS]{0,1}\\.?|Ms\\.?|Dr\\.?)?)\\s?(?[a-zA-Z]{2,})\\s+(?:(?[a-zA-Z]+)\\s(?=(?:[^sSrR]{2}|[^jJrR]{2}),?\\s*(?:[sSrR]|[jJrR])*)|\\s{0,1})(?[a-zA-Z]+),{0,1}\\s?(?(?:[sSrR]|[jJrR]){2}\\.?)?$/;\r\n\r\n\tsplit (name: string): NameParts {\r\n\t\tif (!name) {\r\n\t\t\tthrow new Error(\"name was not provided\");\r\n\t\t}\r\n\r\n\t\tif(this._namePattern.test(name)) {\r\n\t\t\tvar nameMatch = name.match(this._namePattern);\r\n\r\n\t\t\t//ensure we have required parts, first and last\r\n\t\t\tif(!nameMatch?.groups?.first || !nameMatch?.groups?.last) {\r\n\t\t\t\treturn new NameParts(name, name);\r\n\t\t\t}\r\n\r\n\t\t\tlet nameParts = new NameParts(nameMatch.groups.first, nameMatch.groups.last, nameMatch.groups.middle);\r\n\r\n\t\t\tif(nameMatch.groups.prefix) {\r\n\t\t\t\tnameParts.addPrefix(nameMatch.groups.prefix);\r\n\t\t\t}\r\n\r\n\t\t\tif(nameMatch.groups.suffix) {\r\n\t\t\t\tnameParts.addSuffix(nameMatch.groups.suffix);\r\n\t\t\t}\r\n\r\n\t\t\treturn nameParts;\r\n\t\t}\r\n\r\n\t\treturn new NameParts(name, name);\r\n\t}\r\n}","export interface UserPhoneState {\r\n withPhoneNumber(onAddingNumber: () => void): UserPhoneState;\r\n withoutPhoneNumber(onRemovingNumber: () => void): UserPhoneState;\r\n numberProvided(onPhoneNumberProvided: () => void): void;\r\n}\r\n\r\nexport class PhoneNumberState implements UserPhoneState {\r\n withPhoneNumber(onAddingNumber: () => void) {\r\n return this;\r\n }\r\n\r\n withoutPhoneNumber(onRemovingNumber: () => void) {\r\n if (!!!onRemovingNumber) {\r\n throw new Error(\"onRemovingNumber callback not provided\");\r\n }\r\n\r\n onRemovingNumber();\r\n\r\n return new NoPhoneNumberState() as UserPhoneState;\r\n }\r\n\r\n numberProvided(onPhoneNumberProvided: () => void) {\r\n if (!!!onPhoneNumberProvided) {\r\n throw new Error(\"onPhoneNumberProvided was not provided\");\r\n }\r\n\r\n onPhoneNumberProvided();\r\n }\r\n}\r\n\r\nexport class NoPhoneNumberState implements UserPhoneState {\r\n withPhoneNumber(onAddingNumber: () => void) {\r\n if (!!!onAddingNumber) {\r\n throw new Error(\"onAddingNumber callback not provided\");\r\n }\r\n\r\n onAddingNumber();\r\n\r\n return new PhoneNumberState() as UserPhoneState;\r\n }\r\n\r\n withoutPhoneNumber(onRemovingNumber: () => void) {\r\n return this;\r\n }\r\n\r\n numberProvided(onPhoneNumberProvided: () => void) {\r\n //NO-OP\r\n }\r\n}\r\n","import { AccountStatusDescriptions } from './user/AccountStatusConstants';\r\nimport { AccountStatusState, InactiveStatusState } from './user/AccountStatusState';\r\nimport { Claim } from './security/Claim';\r\nimport { FirstLastState, NameState } from './user/NameState';\r\nimport { NameSplitter } from './common/NameSplitter';\r\nimport { NoPhoneNumberState, UserPhoneState } from './user/UserPhoneState';\r\n\r\nexport class Person {\r\n\tid: string;\r\n\treadonly firstName: string;\r\n\tmiddleName?: string;\r\n\treadonly lastName: string;\r\n\tlastLogin: string = \"\";\r\n\treadonly email: string;\r\n\r\n\tprivate _name: string;\r\n\tprivate _namePrefix?: string;\r\n\tprivate _nameSuffix?: string;\r\n\r\n\tprivate _phoneNumber?: string;\r\n\t\r\n\tprivate _state: NameState = new FirstLastState();\r\n\tprivate _phoneState: UserPhoneState = new NoPhoneNumberState();\r\n\r\n\tconstructor(id: string, name: string, email: string) {\r\n\t\tif(!!!name) {\r\n\t\t\tthrow new Error(\"name was not provided\");\r\n\t\t}\r\n\r\n\t\tif(!!!email) {\r\n\t\t\tthrow new Error(\"email not provided\");\r\n\t\t}\r\n\r\n\t\tthis.id = id;\r\n\t\tthis._name = name;\r\n\t\tthis.email = email;\r\n\r\n\t\tlet nameSplit = new NameSplitter();\r\n\t\tlet nameParts = nameSplit.split(this._name);\r\n\r\n\t\tthis.firstName = nameParts.firstName;\r\n\t\tthis.lastName = nameParts.lastName;\r\n\r\n\t\tthis._nameSuffix = nameParts.suffix;\r\n\r\n\t\tif(nameParts.middleName) {\r\n\t\t\tthis.middleName = nameParts.middleName;\r\n\t\t\tthis._state = this._state.hasMiddleName();\r\n\t\t}\r\n\r\n\t\tif(nameParts.prefix) {\r\n\t\t\tthis._namePrefix = nameParts.prefix;\r\n\t\t\tthis._state = this._state.hasPrefix();\r\n\t\t}\r\n\r\n\t\tif(nameParts.suffix) {\r\n\t\t\tthis._nameSuffix = nameParts.suffix;\r\n\t\t\tthis._state = this._state.hasSuffix();\r\n\t\t}\r\n\t}\r\n\r\n\tname() {\r\n\t\treturn `${this.firstName} ${this.lastName}`;\r\n\t}\r\n\t\r\n\tdisplayName(): string {\r\n\t\tlet name = \"\";\r\n\r\n\t\tthis._state.includePrefix(() => name = `${this._namePrefix} `)\r\n\r\n\t\tname = `${name}${this.firstName}`;\r\n\t\t\r\n\t\tthis._state.includeMiddleName(() => name = `${name} ${this.middleName}`)\r\n\t\t\r\n\t\tname = `${name} ${this.lastName}`\r\n\r\n\t\tthis._state.includeSuffix(() => name = `${name} ${this._nameSuffix}`)\r\n\r\n\t\treturn name;\r\n\t}\r\n\r\n\tget namePrefix() {\r\n\t\treturn this._namePrefix\r\n\t}\r\n\r\n\tget nameSuffix() {\r\n\t\treturn this._nameSuffix\r\n\t}\r\n\r\n\tonHasMiddleName(onMiddleName: () => void) {\r\n\t\tif(!!!onMiddleName) {\r\n\t\t\tthrow new Error(\"onMiddleName callback was not provided.\")\r\n\t\t}\r\n\r\n\t\tthis._state.includeMiddleName(() => onMiddleName());\r\n\t}\r\n\r\n\tnamePrefixedWith(namePrefix: string) {\r\n\t\tthis._state = this._state.hasPrefix();\r\n\r\n\t\tthis._namePrefix = namePrefix;\r\n\t}\r\n\r\n\tnameSuffixedWith(nameSuffix: string) {\r\n\t\tthis._state = this._state.hasSuffix();\r\n\r\n\t\tthis._nameSuffix = nameSuffix;\r\n\t}\r\n\r\n\tonNamePrefixed(onPrefix: () => void) {\r\n\t\tif(!!!onPrefix) {\r\n\t\t\tthrow new Error(\"onPrefix callback was not provided.\")\r\n\t\t}\r\n\r\n\t\tthis._state.includePrefix(() => onPrefix());\r\n\t}\r\n\r\n\tonNameSuffixed(onSuffix: () => void) {\r\n\t\tif(!!!onSuffix) {\r\n\t\t\tthrow new Error(\"onSuffix callback was not provided.\");\r\n\t\t}\r\n\t}\r\n\r\n\treachableByPhoneAt(withPhoneNumber: (number: string) => void) {\r\n\t\tif(!!!withPhoneNumber) {\r\n\t\t\tthrow new Error(\"withPhoneNumber callback was not provided.\");\r\n\t\t}\r\n\r\n\t\tthis._phoneState.numberProvided(() => withPhoneNumber(this._phoneNumber!));\r\n\t}\r\n\r\n\tremovePhoneNumber() {\r\n\t\tthis._phoneState = this._phoneState.withoutPhoneNumber(() => this.clearPhoneNumber());\r\n\t}\r\n\r\n\twithPhoneNumber(phoneNumber: string) {\r\n\t\tif(!!!phoneNumber) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._phoneState = this._phoneState.withPhoneNumber(() => this._phoneNumber = phoneNumber);\r\n\t}\r\n\r\n\tprivate clearPhoneNumber() {\r\n\t\tthis._phoneNumber = undefined;\r\n\t}\r\n}\r\n\r\nexport class SecurePerson extends Person {\r\n\tflatPermissionGroups: string = \"\";\r\n\tprivate _status: string = AccountStatusDescriptions.Inactive;\r\n\tprivate readonly _username: string;\r\n\r\n\tclaims: Claim[] = []\r\n\r\n\tprivate _accountStatusState: AccountStatusState = new InactiveStatusState();\r\n\r\n\t//a function another function as a parameter which will be invoked\r\n\t//when the user is active.\r\n\t//defaults to do nothing since we default the user to the inactive state.\r\n\tprivate _whenPersonActive: (invoke: () => void) => void = this.doNothing;\r\n\r\n\tconstructor(id: string, name: string, email: string, username: string, claims: Claim[]) {\r\n\t\tsuper(id, name, email);\r\n\r\n\t\tif(!!!username) {\r\n\t\t\tthrow new Error(\"username was not provided\");\r\n\t\t}\r\n\r\n\t\tthis._username = username;\r\n\t\tthis.claims = claims;\r\n\t}\r\n\r\n\tget status(): string {\r\n\t\treturn this._status;\r\n\t}\r\n\r\n\tset status(status: string) {\r\n\t\tif(!!!status) {\r\n\t\t\tthis._whenPersonActive = () => {};\r\n\r\n\t\t\tthis._accountStatusState.inactive(() => this._status = AccountStatusDescriptions.Active);\r\n\t\t}\r\n\r\n\t\tif(status === AccountStatusDescriptions.Active) {\r\n\t\t\tthis._accountStatusState = this._accountStatusState.active(() => {\r\n\t\t\t\tthis._status = AccountStatusDescriptions.Active;\r\n\r\n\t\t\t\tthis._whenPersonActive = this.invokeActiveCallback;\r\n\t\t\t});\r\n\t\t} else if(status === AccountStatusDescriptions.Inactive) {\r\n\t\t\tthis._accountStatusState = this._accountStatusState.inactive(() => {\r\n\t\t\t\tthis._status = AccountStatusDescriptions.Inactive;\r\n\r\n\t\t\t\tthis._whenPersonActive = this.doNothing;\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tget username() {\r\n\t\treturn this._username\r\n\t}\r\n\r\n\tactivate() {\r\n\t\tthis._accountStatusState = this._accountStatusState.active(() => {\r\n\t\t\tthis._status = AccountStatusDescriptions.Active\r\n\t\t\tthis._whenPersonActive = this.invokeActiveCallback;\r\n\t\t});\r\n\t}\r\n\r\n\tdeactivate() {\r\n\t\tthis._accountStatusState = this._accountStatusState.inactive(() => {\r\n\t\t\tthis._status = AccountStatusDescriptions.Inactive;\r\n\t\t\tthis._whenPersonActive = this.doNothing;\r\n\t\t});\r\n\t}\r\n\r\n\tloginAllowed(onLoginAllowed: () => void) {\r\n\t\tthis._whenPersonActive(onLoginAllowed)\r\n\t}\r\n\r\n\tprivate invokeActiveCallback(activeCallback: () => void) {\r\n\t\tactiveCallback();\r\n\t}\r\n\r\n\tprivate doNothing(activeCallback: () => void) {\r\n\t\t//NO-OP \r\n\t}\r\n}","import { SecurityStrings } from '../ApiConstants';\r\nimport { SecurePerson } from '../Person';\r\nimport { Claim } from '../security/Claim';\r\nimport { Team } from '../Team';\r\n\r\nexport class OrgUser extends SecurePerson {\r\n\tflatTeams: string = \"\";\r\n\tprivate _teams: Team[] = []\r\n\r\n\tconstructor(id: string, name: string, email: string, username: string, claims: Claim[]) {\r\n\t\tsuper(id, name, email, username, claims);\r\n\t}\r\n\r\n\tget teams(): Iterable {\r\n\t\treturn this._teams;\r\n\t}\r\n\r\n\tset teams(teams) {\r\n\t\tthis._teams = Array.from(teams);\r\n\t}\r\n\r\n\tonTeam(team: Team) {\r\n\t\tif(!team){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(this._teams.find(t => t.equals(team))){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._teams.push(team)\r\n\t}\r\n\r\n\twhenAdministrator(invoke: () => void) {\r\n\t\tif(!!!invoke) {\r\n\t\t\tconsole.error(\"invoke callback was not provided\");\r\n\t\t\t\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(!!!this.flatPermissionGroups) {\r\n\t\t\tconsole.error(\"Permission groups are not assigned\");\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet permissionGroups = this.flatPermissionGroups.split(\",\");\r\n\r\n\t\tif(!!!permissionGroups) {\r\n\t\t\t return;\r\n\t\t}\r\n\r\n\t\tif(permissionGroups.includes(SecurityStrings.AdminRoleName)) {\r\n\t\t\tinvoke();\r\n\t\t}\r\n\t}\r\n}","import TreeBuilder from \"common/treeBuilder\";\r\nimport TreeNode from \"common/treeNode\";\r\nimport Tree from \"common/tree\";\r\nimport { Organization } from \"Organization\";\r\nimport { ApiUrl } from \"ApiConstants\";\r\nimport { Team } from \"Team\";\r\nimport { Person } from \"Person\";\r\nimport { ApiResponse, FailureApiResponse } from \"common/ApiResponse\";\r\nimport { UpdateOrganizationRequest } from \"organization/UpdateOrganizationRequest\";\r\nimport { OrgUser } from \"organization/OrgUser\";\r\nimport { Claim } from \"security/Claim\";\r\nimport { ApiRequest } from \"common/ApiRequest\";\r\n\r\nexport default class OrganizationService {\r\n\tdefaultParseOptions = {\r\n\t\trootNodeName: \"orgTree\",\r\n\t\tchildrenCollectionName: \"children\",\r\n\t\tnodeDataName: \"data\",\r\n\t\tdataFactory: (source: any) => this.organizationFactory(source),\r\n\t\tnodesEqual: (\r\n\t\t\tfirst: TreeNode,\r\n\t\t\tsecond: TreeNode\r\n\t\t) => this.orgNodesEqual(first, second),\r\n\t};\r\n\r\n\t/*******************************\r\n\t * There isn't a notion of an organization tree anymore... that concept has been moved to sites.\r\n\t * Each organization may have multiple sites, and they may have a nested hierarchy. This code\r\n\t * is left here for legacy reasons as it was called in many places in the front-end, and we\r\n\t * made the decision to have an organization only have one site for now. The callers were\r\n\t * adapted to make this work.\r\n\t */\r\n\tasync buildOrganizationTree() {\r\n\t\tconst request = new ApiRequest();\r\n\t\tlet response = await request.send(`${ApiUrl.OrgUrl}`)\r\n\r\n\t\tconst emptyTree = new Tree(new TreeNode(Organization.default));\r\n\t\tlet treeBuilder: TreeBuilder;\r\n\t\tlet tree = ApiResponse.create, any>(response, json => {\r\n\t\t\ttreeBuilder = this.createTreeBuilder(json);\r\n\r\n\t\t\tvar builtTree = treeBuilder.parse();\r\n\r\n\t\t\tif(!!!builtTree) {\r\n\t\t\t\treturn emptyTree;\r\n\t\t\t}\r\n\r\n\t\t\treturn builtTree;\r\n\t\t}, () => emptyTree);\r\n\r\n\t\treturn tree;\r\n\t}\r\n\r\n\tprivate async retrieveOrganization() {\r\n\t\tlet orgTree = await this.buildOrganizationTree();\r\n\r\n\t\tlet fetchedOrg = Organization.default;\r\n\r\n\t\torgTree.item.getRoot().visit((o) => (fetchedOrg = o));\r\n\r\n\t\treturn fetchedOrg;\r\n\t}\r\n\r\n\tasync updateOrg(orgUpdateRequest: UpdateOrganizationRequest): Promise> {\r\n\t\ttry {\r\n\t\t\tvar request = new ApiRequest();\r\n\r\n\t\t\tvar updateResponse = await request.patch(`${ApiUrl.OrgUrl}/${orgUpdateRequest.organization.id}`, orgUpdateRequest);\r\n\r\n\t\t\tconst createResponse = await ApiResponse.create(\r\n\t\t\t\tupdateResponse,\r\n\t\t\t\t(orgJson: any) =>\r\n\t\t\t\t\tthis.createOrganization(orgUpdateRequest, orgJson),\r\n\t\t\t\t() => orgUpdateRequest.organization\r\n\t\t\t);\r\n\r\n\t\t\treturn createResponse;\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(\r\n\t\t\t\t`Something went wrong when updating organization ${error}`\r\n\t\t\t);\r\n\t\t\treturn new FailureApiResponse(\r\n\t\t\t\t500,\r\n\t\t\t\torgUpdateRequest.organization\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate createOrganization(\r\n\t\tfromRequest: UpdateOrganizationRequest,\r\n\t\twithOrgJson: any\r\n\t) {\r\n\t\tconst treeBuilder = this.createTreeBuilder(withOrgJson);\r\n\r\n\t\tlet orgTree = treeBuilder.parse();\r\n\t\tvar searchNode = new TreeNode(fromRequest.organization);\r\n\r\n\t\tlet found = orgTree?.find(searchNode, this.orgNodesEqual);\r\n\r\n\t\tlet foundOrg = new Organization(\"0\", \"\");\r\n\t\tfound?.visit((visitingOrg) => (foundOrg = visitingOrg));\r\n\r\n\t\treturn foundOrg;\r\n\t}\r\n\r\n\tasync updateTeam(\r\n\t\torgId: string,\r\n\t\tteam: Team,\r\n\t\tremovedMembers: Person[],\r\n\t\taddedMembers: Person[]\r\n\t) {\r\n\t\treturn fetch(`${ApiUrl.OrgUrl}/${orgId}/team/${team.id}/`, {\r\n\t\t\theaders: {\r\n\t\t\t\t\"content-type\": \"application/json\",\r\n\t\t\t},\r\n\t\t\tmethod: \"PUT\",\r\n\t\t\tbody: JSON.stringify({\r\n\t\t\t\tteamName: team.name,\r\n\t\t\t\tremovedTeamMembers: removedMembers,\r\n\t\t\t\taddedTeamMembers: addedMembers,\r\n\t\t\t}),\r\n\t\t}).then((response) => {\r\n\t\t\tif (response.status >= 400 && response.status <= 500) {\r\n\t\t\t\treturn new Promise((resolve, fail) =>\r\n\t\t\t\t\tfail(\"Updating team failed.\")\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\treturn response.json();\r\n\t\t});\r\n\t}\r\n\r\n\tprivate createTreeBuilder(orgTreeJs: string) {\r\n\t\treturn new TreeBuilder(\r\n\t\t\torgTreeJs,\r\n\t\t\tthis.defaultParseOptions\r\n\t\t);\r\n\t}\r\n\r\n\tprivate organizationFactory(source: any): Organization {\r\n\t\tlet teams: Team[] = source[\"teams\"].map(\r\n\t\t\t(t: {\r\n\t\t\t\tid: number;\r\n\t\t\t\tname: string;\r\n\t\t\t\tstatus: string;\r\n\t\t\t\tcreatedOn: string;\r\n\t\t\t\texistingMembers: { id: string; name: string, email: string }[];\r\n\t\t\t}) => {\r\n\t\t\t\tvar members = t.existingMembers.map((existingMember) =>\tnew Person(existingMember.id, existingMember.name, existingMember.email));\r\n\t\t\t\tvar team = new Team(t.id, t.name);\r\n\t\t\t\tteam.created = t.createdOn;\r\n\r\n\t\t\t\tteam.withExisistingMembers(members);\r\n\r\n\t\t\t\tif(t.status === \"Active\") {\r\n\t\t\t\t\tteam.activate();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tteam.deactivate();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn team;\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t\tlet users = source[\"users\"].map(\r\n\t\t\t(u: {\r\n\t\t\t\tid: string;\r\n\t\t\t\tname: string;\r\n\t\t\t\tclaim: Claim[];\r\n\t\t\t\treducedTeamsName: string;\r\n\t\t\t\tflatPermissionGroups: string;\r\n\t\t\t\tlastLogin: string;\r\n\t\t\t\tstatus: string;\r\n\t\t\t\temail: string;\r\n\t\t\t\tnamePrefix?: string;\r\n\t\t\t\tnameSuffix?: string;\r\n\t\t\t\tteams: string[];\r\n\t\t\t\tphoneNumber: string;\r\n\t\t\t\tusername: string;\r\n\t\t\t}) => {\r\n\t\t\t\tlet orgUser = new OrgUser(u.id, u.name, u.email, u.username, []);\r\n\r\n\t\t\t\torgUser.flatTeams = u.reducedTeamsName;\r\n\t\t\t\torgUser.flatPermissionGroups = u.flatPermissionGroups;\r\n\r\n\t\t\t\torgUser.lastLogin = u.lastLogin;\r\n\r\n\t\t\t\torgUser.status = u.status;\r\n\r\n\t\t\t\tif(u.namePrefix) {\r\n\t\t\t\t\torgUser.namePrefixedWith(u.namePrefix);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(u.nameSuffix) {\r\n\t\t\t\t\torgUser.nameSuffixedWith(u.nameSuffix);\r\n\t\t\t\t}\r\n\r\n\t\t\t\torgUser.withPhoneNumber(u.phoneNumber);\r\n\r\n\t\t\t\tfor(var teamName of u.teams) { \r\n\t\t\t\t\tlet foundOrgTeam = teams.find((orgTeam) => orgTeam.name === teamName);\r\n\r\n\t\t\t\t\tif(foundOrgTeam) {\r\n\t\t\t\t\t\torgUser.onTeam(foundOrgTeam);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn orgUser;\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t\tlet org = new Organization(source[\"id\"], source[\"data\"]);\r\n\r\n\t\torg.manages(teams);\r\n\t\torg.accessibleBy(users);\r\n\r\n\t\treturn org;\r\n\t}\r\n\r\n\tprivate orgNodesEqual(\r\n\t\tfirst: TreeNode,\r\n\t\tsecond: TreeNode\r\n\t): boolean {\r\n\t\tlet firstId: string = \"\";\r\n\t\tlet secondId: string = \"\";\r\n\r\n\t\tfirst.visit((a) => (firstId = a.id));\r\n\t\tsecond.visit((b) => (secondId = b.id));\r\n\r\n\t\treturn firstId === secondId;\r\n\t}\r\n}\r\n","import React, { ChangeEvent, useState } from \"react\";\r\nimport { Col, Row } from \"reactstrap\";\r\nimport { FontAwesome } from \"../Common/FontAwesome\";\r\n\r\ninterface SlushboxProps {\r\n availableItems: Iterable;\r\n assignedItems?: Iterable;\r\n displayText: (item: T) => string;\r\n valueFactory?: (item: T) => string;\r\n mapOptionFrom: (option: HTMLOptionElement) => T;\r\n onAssignedItemsChanged: (allAssignedItems: T[]) => void;\r\n onAvailableItemsChanged: (availableItems: T[]) => void;\r\n itemsEqual?: (first: T, second: T) => boolean;\r\n}\r\n\r\nexport const Slushbox = ({\r\n availableItems,\r\n assignedItems,\r\n displayText,\r\n valueFactory,\r\n mapOptionFrom,\r\n onAssignedItemsChanged,\r\n onAvailableItemsChanged,\r\n itemsEqual,\r\n}: SlushboxProps) => {\r\n const [pendingAssignments, setPendingAssignments] = useState([]);\r\n const [pendingUnassignments, setPendingUnassignments] = useState([]);\r\n\r\n const itemOptions = (items: T[]) => {\r\n return items.map((item) => {\r\n const optionValue = valueFactory ? valueFactory(item) : displayText(item);\r\n return (\r\n \r\n );\r\n });\r\n };\r\n\r\n const assign = () => {\r\n onAssignedItemsChanged(sortItemsByDisplayText([...(assignedItems ?? []), ...pendingAssignments]));\r\n\r\n var available = Array.from(availableItems ?? []);\r\n\r\n onAvailableItemsChanged(\r\n sortItemsByDisplayText([...available.filter((a) => !!!pendingAssignments.some((p) => itemsSame(a, p)))])\r\n );\r\n\r\n setPendingAssignments([]);\r\n };\r\n\r\n const unassign = () => {\r\n let assignments = Array.from(assignedItems ?? []);\r\n onAssignedItemsChanged([...assignments.filter((x) => !!!pendingUnassignments.some((p) => itemsSame(x, p)))]);\r\n\r\n var available = Array.from(availableItems ?? []);\r\n onAvailableItemsChanged(sortItemsByDisplayText([...available, ...pendingUnassignments]));\r\n setPendingUnassignments([]);\r\n };\r\n\r\n const markAvailableForAssignment = (event: ChangeEvent) => {\r\n const selectedOptions = mapSelectedOptionsToArrayT(event.target.selectedOptions);\r\n\r\n setPendingAssignments([...selectedOptions]);\r\n };\r\n\r\n const markAssignmentForAvailable = (event: ChangeEvent) => {\r\n const itemsToMakeAvailable = mapSelectedOptionsToArrayT(event.target.selectedOptions);\r\n\r\n setPendingUnassignments([...itemsToMakeAvailable]);\r\n };\r\n\r\n const mapSelectedOptionsToArrayT = (selectedOptions: HTMLCollectionOf) => {\r\n return Array.from(selectedOptions).map((opt) => mapOptionFrom(opt));\r\n };\r\n\r\n const sortItemsByDisplayText = (items: T[]) => {\r\n if (items && items.length === 1) {\r\n return items;\r\n }\r\n\r\n return items.sort((first, second) => {\r\n const firstText = displayText(first);\r\n const secondText = displayText(second);\r\n\r\n return firstText < secondText ? -1 : firstText === secondText ? 0 : 1;\r\n });\r\n };\r\n\r\n const itemsSame = (first: T, second: T) => {\r\n if (itemsEqual) {\r\n return itemsEqual(first, second);\r\n } else {\r\n return first === second;\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n markAvailableForAssignment(event)}\r\n multiple={true}\r\n >\r\n {itemOptions(Array.from(availableItems ?? []))}\r\n \r\n \r\n \r\n assign()}>\r\n
\r\n unassign()}>\r\n \r\n \r\n markAssignmentForAvailable(event)}\r\n multiple={true}\r\n >\r\n {itemOptions(Array.from(assignedItems ?? []))}\r\n \r\n \r\n
\r\n );\r\n};\r\n","import { Organization } from '../Organization';\r\nimport { ChangeUserRequest } from '../user/ChangeUserRequest';\r\nimport { UpdateTeamRequest } from './UpdateTeamRequest';\r\n\r\nexport class UpdateOrganizationRequest {\r\n\torganization: Organization;\r\n\taddedTeam?: UpdateTeamRequest;\r\n\teditedTeam?: UpdateTeamRequest;\r\n\taddedUser?: ChangeUserRequest;\r\n\teditedUser?: ChangeUserRequest;\r\n\r\n\tconstructor(org: Organization) {\r\n\t\tif(!org) {\r\n\t\t\tthrow new Error('Organization provided was undefined');\r\n\t\t}\r\n\r\n\t\tthis.organization = org;\r\n\t}\r\n\r\n\taddNewTeam(addedTeam: UpdateTeamRequest) {\r\n\t\tthis.addedTeam = addedTeam;\r\n\t}\r\n\r\n\teditTeam(updatedTeam: UpdateTeamRequest) {\r\n\t\tthis.editedTeam = updatedTeam;\r\n\t}\r\n\r\n\taddNewUser(user: ChangeUserRequest) {\r\n\t\tif(!!!user) {\r\n\t\t\tthrow new Error(\"user was not provided for add user request.\");\r\n\t\t}\r\n\r\n\t\tthis.addedUser = user;\r\n\t}\r\n\r\n\teditUser(user: ChangeUserRequest) {\r\n\t\tif(!!!user) {\r\n\t\t\tthrow new Error(\"user was not provided for edit user request.\");\r\n\t\t}\r\n\r\n\t\tthis.editedUser = user;\r\n\t}\r\n}","import { TeamStatus } from \"../Team\";\r\n\r\nexport class UpdateTeamRequest {\r\n\tteamId: number = 0;\r\n\tteamName: string;\r\n\tassignedUsers: string[] = []; //id's of the members assigned\r\n\tstatus = TeamStatus.Active;\r\n\r\n\tconstructor(teamName: string) {\r\n\t\tif(!!!teamName) {\r\n\t\t\tthrow new Error(\"teamName was not provided\");\r\n\t\t}\r\n\r\n\t\tthis.teamName = teamName;\r\n\t}\r\n\r\n\tactivate() {\r\n\t\tthis.status = TeamStatus.Active;\r\n\t}\r\n\r\n\tdeactivate() {\r\n\t\tthis.status = TeamStatus.Inactive\r\n\t}\r\n}","import React, { useEffect, useState } from \"react\";\r\nimport { Slushbox } from \"../Common/Slushbox\";\r\nimport { Person } from \"../../Person\";\r\nimport { Team, TeamStatus } from \"../../Team\";\r\nimport { UpdateOrganizationRequest } from \"../../organization/UpdateOrganizationRequest\";\r\nimport { UpdateTeamRequest } from \"../../organization/UpdateTeamRequest\";\r\nimport { Button, Col, FormGroup, Label, Row } from \"reactstrap\";\r\nimport { ErrorMessage, Field, Form, Formik } from \"formik\";\r\nimport { Organization } from \"../../Organization\";\r\nimport OrganizationService from \"../../organization/OrganizationService\";\r\n\r\ninterface EditTeamProps {\r\n teamEditing?: Team;\r\n org: Organization;\r\n onUpdated: (team: Team) => void;\r\n onExit: () => void;\r\n}\r\n\r\nexport const EditTeam = ({ teamEditing, org, onUpdated, onExit }: EditTeamProps) => {\r\n const [availableMembers, setAvailableMembers] = useState();\r\n const [assignedMembers, setAssignedMembers] = useState(teamEditing?.members ?? []);\r\n\r\n const orgService = new OrganizationService();\r\n\r\n useEffect(() => {\r\n let orgUsers = Array.from(org.users ?? []);\r\n\r\n let availableUsers = orgUsers.filter(\r\n (orgUser) => !!!assignedMembers.some((assigned) => assigned.id === orgUser.id)\r\n );\r\n\r\n setAvailableMembers(availableUsers);\r\n }, [org.users, assignedMembers]);\r\n\r\n const findMemberFrom = (option: HTMLOptionElement): Person => {\r\n let foundUser = undefined;\r\n\r\n for (let orgUser of org.users) {\r\n let memberId = option.value;\r\n\r\n if (orgUser.id === memberId) {\r\n foundUser = orgUser;\r\n break;\r\n }\r\n }\r\n\r\n return (foundUser as Person) ?? new Person(\"0\", \"Organization User\", \"orguser@email.com\");\r\n };\r\n\r\n const onMembersAssigned = (members: Person[]) => {\r\n setAssignedMembers(members);\r\n };\r\n\r\n const onMembersAvailable = (members: Person[]) => {\r\n setAvailableMembers(members);\r\n };\r\n\r\n const onUpdateComplete = (updatedOrg: Organization) => {\r\n if (teamEditing) {\r\n let updatedTeam = updatedOrg.teams.find((t) => t.id === teamEditing.id);\r\n\r\n onUpdated(updatedTeam!);\r\n }\r\n };\r\n\r\n const onAddComplete = (updatedOrg: Organization, addedTeamName: string) => {\r\n let newTeam = updatedOrg.teams.find((t) => t.name === addedTeamName);\r\n\r\n onUpdated(newTeam!);\r\n };\r\n\r\n return (\r\n <>\r\n {\r\n let editTeamRequest = new UpdateTeamRequest(values.name);\r\n\r\n if (teamEditing) {\r\n editTeamRequest.teamId = teamEditing.id;\r\n }\r\n\r\n if (values.status === TeamStatus.Active) {\r\n editTeamRequest.activate();\r\n } else {\r\n editTeamRequest.deactivate();\r\n }\r\n\r\n editTeamRequest.assignedUsers = assignedMembers.map((member) => member.id);\r\n\r\n const orgModifying = new Organization(org.id, org.name);\r\n const modifyOrgRequest = new UpdateOrganizationRequest(orgModifying);\r\n\r\n if (teamEditing) {\r\n modifyOrgRequest.editTeam(editTeamRequest);\r\n } else {\r\n modifyOrgRequest.addNewTeam(editTeamRequest);\r\n }\r\n\r\n let response = await orgService.updateOrg(modifyOrgRequest);\r\n\r\n //TODO retrieve errors\r\n response.failure(() => console.log(\"An error occurred\"));\r\n\r\n response.successful((org) => {\r\n if (teamEditing) {\r\n onUpdateComplete(org);\r\n } else {\r\n onAddComplete(org, values.name);\r\n }\r\n });\r\n }}\r\n >\r\n
\r\n \r\n \r\n

{teamEditing ? teamEditing.name : \"Add Team\"}

\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {teamEditing ? (\r\n \r\n

Date Created

\r\n

{teamEditing?.created ?? new Date().toDateString}

\r\n \r\n ) : null}\r\n \r\n \r\n Status\r\n \r\n \r\n \r\n \r\n Inactive\r\n \r\n \r\n \r\n
\r\n \r\n \r\n

Users

\r\n member.name()}\r\n mapOptionFrom={(opt) => findMemberFrom(opt)}\r\n valueFactory={(u) => u.id.toString()}\r\n onAssignedItemsChanged={(assigned) => onMembersAssigned(assigned)}\r\n onAvailableItemsChanged={(available) => onMembersAvailable(available)}\r\n itemsEqual={(first, second) => first.id === second.id}\r\n />\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n );\r\n};\r\n","import React, { HTMLAttributes, useEffect, useMemo, useState } from 'react';\r\nimport { Column, Cell, HeaderGroup, Row, useSortBy, useTable, RowPropGetter, PropGetter, TablePropGetter } from 'react-table';\r\nimport { Table } from 'reactstrap';\r\n\r\nimport 'components/Common/ImageTrendTable.scss';\r\n\r\nclass ImageTrendTableProps {\r\n\trenderableData: T[] = [];\r\n\theaders: Column[] = [];\r\n\tsearchable?: boolean = false;\r\n\tfilterable?: boolean = false;\r\n\trowProps?: (row: T) => RowPropGetter;\r\n\ttitle?: string;\r\n}\r\n\r\nexport const ImageTrendTable = ({ renderableData, \r\n\theaders, \r\n\tsearchable, \r\n\tfilterable,\r\n\trowProps = (row => ({})),\r\n\ttitle,\r\n\tclassName\r\n\t}: ImageTrendTableProps & HTMLAttributes) => {\r\n\t\r\n\tconst tableColumns = useMemo(() => headers, [headers]);\r\n\tconst tableData = useMemo(() => renderableData, [renderableData]);\r\n\r\n\tconst {\r\n\t\tgetTableProps,\r\n\t\tgetTableBodyProps,\r\n\t\theaderGroups,\r\n\t\trows,\r\n\t\tprepareRow\r\n\t} = useTable({ data: tableData, columns: tableColumns}, useSortBy);\r\n\r\n\tconst renderHeaderCell = (hg: HeaderGroup) => {\r\n\t\thg.getSortByToggleProps()\r\n\t\treturn (\r\n\t\t\t{hg.render('Header')}\r\n\t\t\t\r\n {hg.isSorted\r\n ? hg.isSortedDesc\r\n ? ' 🔽'\r\n : ' 🔼'\r\n : ''}\r\n \r\n\t\t\t\r\n\t\t)\r\n\t};\r\n\r\n\tconst renderHeaderGroup = (hg: HeaderGroup) => {\r\n\t\treturn (\r\n\t\t\t{\r\n\t\t\t\thg.headers.map(col => renderHeaderCell(col))}\r\n\t\t\t\r\n\t\t)\r\n\t};\r\n\r\n\tconst renderBodyCell = (cell: Cell) => {\r\n\t\treturn (\r\n\t\t\t{\r\n\t\t\t\tcell.render('Cell')\r\n\t\t\t}\r\n\t\t\t\r\n\t\t)\r\n\t};\r\n\r\n\tconst renderBodyRow = (row: Row) => {\r\n\t\treturn (\r\n\t\t\t{\r\n\t\t\t\trow.cells.map(c => renderBodyCell(c))\r\n\t\t\t}\r\n\t\t\t\r\n\t\t)\r\n\t};\r\n\r\n\treturn (\r\n\t\t)}>\r\n\t\t\t{headerGroups.map(hg => renderHeaderGroup(hg))}\r\n\t\t\t{\r\n\t\t\t\trows.map(r => {\r\n\t\t\t\t\tprepareRow(r);\r\n\t\t\t\t\treturn renderBodyRow(r);\r\n\t\t\t\t})}\r\n\t\t\t\r\n\t\t
\r\n\t)\r\n}\r\n\r\nexport class ImageTrendTableHeader {\r\n\treadonly Header: string;\r\n\treadonly accessor: string | ((item: T, rowIndex: number, row: Row) => void);\r\n\treadonly id?: string;\r\n\r\n\tconstructor(headerText: string, valueAccessor: string | ((item: T, rowIndex: number, row: Row) => void), columnId?: string) {\r\n\t\tthis.Header = headerText;\r\n\t\tthis.accessor = valueAccessor;\r\n\r\n\t\tif(columnId) {\r\n\t\t\tthis.id = columnId;\r\n\t\t}\r\n\t}\r\n}","import * as React from 'react';\r\n\r\nexport const AccessDenied = () => {\r\n\treturn (\r\n\t\t
\r\n\t\t\tYou do not have access to this area.\r\n\t\t
\r\n\t)\r\n}","import React, { Fragment, PropsWithChildren, useEffect, useState } from 'react';\r\nimport { AccessDenied } from './AccessDenied';\r\nimport { RenderPermission } from '../security/Permission/RenderPermission';\r\n\r\nexport interface SecuredProps {\r\n\tpermission: RenderPermission\r\n}\r\n\r\nexport interface SecuredComponentProps extends PropsWithChildren {\r\n}\r\n\r\nexport const SecuredComponent = ({permission, children}: SecuredComponentProps) => {\r\n\tconst [displayComponent, setDisplayComponent] = useState(false);\r\n\tconst [shouldRender, setShouldRender] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tsetShouldRender(false);\r\n\t\t\r\n\t\tpermission.granted(() => setDisplayComponent(true))\r\n\t\t\r\n\t\tpermission.shouldRenderOutput(() => setShouldRender(true));\r\n\t}, [permission]);\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t{ shouldRender\r\n\t\t\t? !displayComponent \r\n\t\t\t\t? \r\n\t\t\t\t: children \r\n\t\t\t: null }\r\n\t\t\r\n\t)\r\n}","import { IPermission } from '../IPermission';\r\nimport { SecurityStrings } from '../../ApiConstants';\r\nimport { Claim } from '../Claim';\r\n\r\nexport class AdminRoleRequiredPermission implements IPermission {\r\n\tprivate _allowedPermissionGroups: string[] = [SecurityStrings.AdminRoleName]\r\n\tprivate _userPermGroupsClaim: Claim;\r\n\r\n\tconstructor(userPermGroups: Claim) {\r\n\t\tif (!!!userPermGroups) {\r\n\t\t\tthrow new Error('userPermsGroup claim was not provided.');\r\n\t\t}\r\n\r\n\t\tthis._userPermGroupsClaim = userPermGroups;\r\n\t}\r\n\r\n\tgranted(onGranted: () => void) {\r\n\t\tif(!!!onGranted){\r\n\t\t\tthrow new Error(\"onGranted was not provided\");\r\n\t\t}\r\n\r\n\t\tvar allowedPermGroupIndex = this._allowedPermissionGroups.indexOf(this._userPermGroupsClaim.value);\r\n\r\n\t\tif (allowedPermGroupIndex > - 1) {\r\n\t\t\tonGranted();\r\n\t\t}\r\n\t}\r\n\r\n\tasync grantedAsync(onGrantedAsync: () => Promise) {\r\n\t\tlet granted = false;\r\n\t\tthis.granted(() => granted = true);\r\n\r\n\t\tif(granted) {\r\n\t\t\tawait onGrantedAsync();\r\n\t\t}\r\n\t}\r\n\r\n\tdenied(onDenial: () => void){\r\n\t\tif(!!!onDenial){\r\n\t\t\tthrow new Error(\"onDenial was not provided\");\r\n\t\t}\r\n\r\n\t\tvar allowedPermGroupIndex = this._allowedPermissionGroups.indexOf(this._userPermGroupsClaim.value);\r\n\r\n\t\tif(allowedPermGroupIndex < 0) {\r\n\t\t\tonDenial();\r\n\t\t}\r\n\t}\r\n\r\n\tasync deniedAsync(onDenialAsync: () => Promise) {\r\n\t\tif(!onDenialAsync) {\r\n\t\t\tthrow new Error(\"onDenialAsync callback was not provided\");\r\n\t\t}\r\n\r\n\t\tlet denied = false;\r\n\t\tthis.denied(() => denied = true);\r\n\r\n\t\tif(denied) {\r\n\t\t\tawait onDenialAsync();\r\n\t\t}\r\n\t}\r\n}","import { IPermission } from '../IPermission';\r\nimport { Claim } from '../Claim';\r\nimport { AdminRoleRequiredPermission } from './AdminRoleRequiredPermission'\r\n\r\nexport class DisplayTeamsPermission extends AdminRoleRequiredPermission implements IPermission {\r\n\tprivate _requiredPerm: IPermission | undefined;\r\n\tprivate _checkPermissionGranted = (onGranted: () => void) => super.granted(onGranted);\r\n\tprivate _checkPermissionDenied = (onDenied: () => void) => super.denied(onDenied);\r\n\r\n\tconstructor(userPermGroups: Claim, additionalPermNeeded?: IPermission) {\r\n\t\tsuper(userPermGroups);\r\n\r\n\t\tif (additionalPermNeeded) {\r\n\t\t\tthis._requiredPerm = additionalPermNeeded;\r\n\r\n\t\t\tthis._checkPermissionGranted = (onGranted: () => void) => super.granted(() => this._requiredPerm!.granted(() => onGranted()));\r\n\t\t\tthis._checkPermissionDenied = (onDenied: () => void) => super.denied(() => this._requiredPerm!.denied(() => onDenied()));\r\n\t\t}\r\n\t}\r\n\r\n\tgranted(onGranted: () => void) {\r\n\t\tif(!!!onGranted) {\r\n\t\t\tthrow new Error(\"onGranted not provided\");\r\n\t\t}\r\n\r\n\t\tthis._checkPermissionGranted(() => onGranted());\r\n\t}\r\n\r\n\tdenied(onDenial: () => void) {\r\n\t\tif(!!!onDenial) {\r\n\t\t\tthrow new Error(\"onDenial was not provided\")\r\n\t\t}\r\n\r\n\t\tthis._checkPermissionDenied(() => onDenial());\r\n\t}\r\n}\r\n","import { IPermission } from '../IPermission';\r\n\r\nexport class NotGranted implements IPermission {\r\n\tgranted(onGranted: () => void) { }\r\n\r\n\tasync grantedAsync(onGrantedAsync: () => Promise) { }\r\n\r\n\tdenied(onDenial: () => void) {\r\n\t\tif(!!!onDenial) {\r\n\t\t\tthrow new Error(\"onDenial was not provided\");\r\n\t\t}\r\n\r\n\t\tonDenial();\r\n\t}\r\n\r\n\tasync deniedAsync(onDenialAsync: () => Promise) {\r\n\t\tif(!onDenialAsync) {\r\n\t\t\tthrow new Error(\"onDenialAsync was not provided\");\r\n\t\t}\r\n\r\n\t\tawait onDenialAsync();\r\n\t}\r\n}","export class Claim {\r\n\ttype: string;\r\n\tvalue: string;\r\n\r\n\tconstructor(type: string, value: string) {\r\n\t\tif(!type) {\r\n\t\t\tthrow new Error(\"Claim type must be provided.\");\r\n\t\t}\r\n\r\n\t\tif(!value){\r\n\t\t\tthrow new Error(\"Claim value must be provided\");\r\n\t\t}\r\n\r\n\t\tthis.type = type;\r\n\t\tthis.value = value;\r\n\t}\r\n}","import { Claim } from './Claim';\r\nimport { SecurityStrings } from '../ApiConstants';\r\n\r\nexport class UserRoleClaim extends Claim{\r\n\tconstructor() {\r\n\t\tsuper(SecurityStrings.RoleClaimType, SecurityStrings.UserRoleName);\r\n\t}\r\n}","import { SecuredPersonService } from '../services/SecuredPersonService';\r\nimport { Claim } from './Claim';\r\nimport { Claims } from './Claims';\r\nimport { SecurityStrings } from '../ApiConstants';\r\nimport { UserRoleClaim } from './UserRoleClaim';\r\n\r\nexport class RoleRetriever {\r\n\tprivate _securedUserService: SecuredPersonService;\r\n\r\n\tconstructor(securedUserService: SecuredPersonService) {\r\n\t\tif(!securedUserService) {\r\n\t\t\tthrow new Error(\"securedUserService was not provided\");\r\n\t\t}\r\n\r\n\t\tthis._securedUserService = securedUserService;\r\n\t}\r\n\r\n\tasync ofLoggedInUser(): Promise {\r\n\t\tlet loggedInUser = await this._securedUserService.lookupLoggedInUser();\r\n\r\n\t\tlet claims = new Claims(loggedInUser.claims);\r\n\r\n\t\treturn claims.findClaimsByType(SecurityStrings.RoleClaimType) ?? new UserRoleClaim();\r\n\t}\r\n}","import { ApiUrl } from '../ApiConstants';\r\nimport authService from '../components/ApiAuthorization/AuthorizeService';\r\nimport { ApiResponseHandler } from '../common/ApiResponseHandler';\r\nimport { SecurePerson } from '../Person';\r\nimport { Claim } from '../security/Claim';\r\n\r\nexport class SecuredPersonService {\r\n\tprivate userResponseFactory = (userResponse: any) => {\r\n\t\tif(userResponse.userEmail && userResponse.claims) {\r\n\t\t\tlet userClaims = userResponse.claims.map((c: {type: string, value: string}) => new Claim(c.type, c.value));\r\n\r\n\t\t\treturn new SecurePerson(userResponse.id, userResponse.name, userResponse.userEmail, userResponse.username, userClaims);\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"Properties are missing from response object needed to create a SecurePerson\");\r\n\t}\r\n\r\n\tasync lookupLoggedInUser(): Promise {\r\n\t\tlet token = await authService.getAccessToken();\r\n\r\n\t\tlet userLookupResponse = await fetch(`${ApiUrl.UserUrl}/lookupSignedInUser`, {\r\n\t\t\theaders: !token ? {} : {\r\n\t\t\t\t'content-type': 'application/json',\r\n\t\t\t\t'Authorization': `Bearer ${token}`\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tlet handler = new ApiResponseHandler();\r\n\r\n\t\tlet apiResponse = await handler.handle(userLookupResponse, \r\n\t\t\t\t\t\tjson => this.userResponseFactory(json),\r\n\t\t\t\t\t\t() => new SecurePerson('-1', 'Unknown Person', \"unknown@no.email\", \"nouser\", []));\r\n\r\n\t\treturn apiResponse.item;\r\n\t}\r\n}","import { IPermission } from '../IPermission';\r\n\r\n/*\r\n* An instance of this class represents a permission which \r\n* also has the ability to signal that a SecuredComponent\r\n* should render it's decision about a permission. This is \r\n* useful in situations where the permission being provided\r\n* is asynchronously retrieved.\r\n*\r\n* For example, if we default a components permission to \r\n* \"Not Granted\" (secure by default), but want really want \r\n* to base the display off a checking a user's role (an async op),\r\n* the \"Permission Denied\" message would be displayed as\r\n* we wait for the user's role to be retrieved over the network.\r\n*/\r\nexport class RenderPermission implements IPermission {\r\n\tprivate _inner: IPermission;\r\n\t\r\n\t//the action which will invoked when renderOutput is called. It defaults to not invoking the provided render action (it does nothing)\r\n\tprivate _renderThisUsing: (renderAction: () => void) => void = render => {};\r\n\r\n\tconstructor(inner: IPermission) {\r\n\t\tif(!!!inner) {\r\n\t\t\tthrow new Error(\"inner permission was not provided\");\r\n\t\t}\r\n\r\n\t\tthis._inner = inner;\r\n\t}\r\n\r\n\tgranted(onGranted: () => void) {\r\n\t\tif(!!!onGranted) {\r\n\t\t\tthrow new Error(\"onGranted callback was not provided\");\r\n\t\t}\r\n\r\n\t\tthis._inner.granted(onGranted);\r\n\t}\r\n\r\n\tasync grantedAsync(onGrantedAsync: () => Promise) {\r\n\t\tif(!!!onGrantedAsync) {\r\n\t\t\tthrow new Error(\"onGrantedAsync callback was not provided\");\r\n\t\t}\r\n\r\n\t\tawait this._inner.grantedAsync(async () => await onGrantedAsync());\r\n\t}\r\n\r\n\tdenied(onDenied: () => void) {\r\n\t\tif(!!!onDenied) {\r\n\t\t\tthrow new Error(\"onDenied callback was not provided\");\r\n\t\t}\r\n\r\n\t\tthis._inner.denied(onDenied);\r\n\t}\r\n\r\n\tasync deniedAsync(onDeniedAsync: () => Promise) {\r\n\t\tif(!onDeniedAsync) {\r\n\t\t\tthrow new Error(\"onDeniedAsync callback was not provided\");\r\n\t\t}\r\n\r\n\t\tawait this._inner.deniedAsync(async () => await onDeniedAsync());\r\n\t}\r\n\r\n\tdisableRendering() {\r\n\t\t//disable the invocation of renderAction\r\n\t\tlet renderDisabled = new RenderPermission(this._inner);\r\n\t\trenderDisabled._renderThisUsing = renderAction => {};\r\n\r\n\r\n\t\treturn renderDisabled;\r\n\t}\r\n\r\n\tenableRendering() {\r\n\t\t//update the rendering action to invoke whatever the passed render action is. This action is passed via the shouldRenderOutput method\r\n\t\tlet renderEnabled = new RenderPermission(this._inner);\r\n\t\trenderEnabled._renderThisUsing = renderAction => renderAction();\r\n\r\n\t\treturn renderEnabled;\r\n\t}\r\n\r\n\tshouldRenderOutput(renderer: () => void) {\r\n\t\tif(!!!renderer) {\r\n\t\t\tthrow new Error(\"renderer callback was not provided\");\r\n\t\t}\r\n\r\n\t\tthis._renderThisUsing(renderer);\r\n\t}\r\n}","import OrganizationService from \"../../organization/OrganizationService\";\r\nimport React, { useEffect, useMemo, useState } from \"react\";\r\nimport { Button, Col, Row } from \"reactstrap\";\r\nimport { EditTeam } from \"./EditTeam\";\r\nimport { ImageTrendTable } from \"../Common/ImageTrendTable\";\r\nimport { SecuredComponent } from \"../SecuredComponent\";\r\nimport { DisplayTeamsPermission } from \"../../security/Permission/DisplayTeamsPermission\";\r\nimport { NotGranted } from \"../../security/Permission/NotGranted\";\r\nimport { Organization } from \"../../Organization\";\r\nimport { RoleRetriever } from \"../../security/RoleRetriever\";\r\nimport { SecuredPersonService } from \"../../services/SecuredPersonService\";\r\nimport { Team } from \"../../Team\";\r\nimport { Column, Row as TableRow, RowPropGetter } from \"react-table\";\r\nimport { OrgUser } from \"../../organization/OrgUser\";\r\nimport { RenderPermission } from \"../../security/Permission/RenderPermission\";\r\n\r\nexport const Teams = () => {\r\n let i = 0;\r\n let columns = useMemo(\r\n () => [\r\n { Header: \"Name\", accessor: \"name\" } as Column,\r\n { Header: \"Number of Users\", accessor: \"memberCount\" } as Column,\r\n { Header: \"Date Created\", accessor: \"created\" } as Column,\r\n { Header: \"Status\", accessor: \"status\" } as Column,\r\n {\r\n Cell: (\r\n \r\n ),\r\n accessor: (row: TableRow, index: Number) => \"\",\r\n id: `editteam-${i++}`,\r\n } as Column,\r\n ],\r\n []\r\n );\r\n\r\n const [teams, updateTeams] = useState();\r\n const [viewTeamsPermission, setViewTeamsPermission] = useState(new RenderPermission(new NotGranted()));\r\n const [renderComplete, setRenderComplete] = useState(false);\r\n const [showTeams, setShowTeams] = useState(true);\r\n const [editTeam, setTeamEditing] = useState();\r\n const [teamOrg, setTeamOrg] = useState();\r\n\r\n let renderTeams = useMemo(() => teams, [teams]);\r\n\r\n useEffect(() => {\r\n const retrieveRole = async () => {\r\n setRenderComplete(false);\r\n viewTeamsPermission.disableRendering();\r\n\r\n let roleRetriever = new RoleRetriever(new SecuredPersonService());\r\n let roleClaim = await roleRetriever.ofLoggedInUser();\r\n\r\n setViewTeamsPermission(new RenderPermission(new DisplayTeamsPermission(roleClaim)).enableRendering());\r\n\r\n setRenderComplete(true);\r\n };\r\n\r\n const fetchOrg = async () => {\r\n var orgService = new OrganizationService();\r\n\r\n let orgTreeResponse = await orgService.buildOrganizationTree();\r\n\r\n orgTreeResponse.successful((orgTree) => {\r\n let org = Organization.default;\r\n orgTree.getRoot().visit((o) => (org = o));\r\n\r\n updateTeams(org.teams);\r\n setTeamOrg(org);\r\n });\r\n };\r\n\r\n retrieveRole();\r\n fetchOrg();\r\n }, []);\r\n\r\n const onTeamClicked = (clickedTeam: Team) => {\r\n setTeamEditing(clickedTeam);\r\n setShowTeams(false);\r\n };\r\n\r\n const onTeamUpdated = (updatedTeam: Team) => {\r\n if (teamOrg?.teams) {\r\n if (teamOrg.teams.some((t) => t.id === updatedTeam.id)) {\r\n //editing existing team\r\n let updatedOrg = teamOrg.updateTeam(updatedTeam);\r\n setTeamOrg(updatedOrg);\r\n updateTeams(updatedOrg.teams);\r\n } else {\r\n //added a new team\r\n let updatedOrg = teamOrg.addTeam(updatedTeam);\r\n setTeamOrg(updatedOrg);\r\n updateTeams(updatedOrg.teams);\r\n }\r\n }\r\n\r\n setTeamEditing(undefined);\r\n setShowTeams(true);\r\n };\r\n\r\n const onCancelModification = () => {\r\n setTeamEditing(undefined);\r\n setShowTeams(true);\r\n };\r\n\r\n const teamsTable = () => {\r\n return showTeams ? (\r\n <>\r\n \r\n \r\n

Teams

\r\n \r\n \r\n {\r\n //setShowAdd(true);\r\n setShowTeams(false);\r\n }}\r\n >\r\n Add Team\r\n \r\n \r\n
\r\n \r\n \r\n \r\n renderableData={renderTeams ?? []}\r\n headers={columns}\r\n rowProps={(row: Team) =>\r\n ({\r\n className: \"clickable\",\r\n onClick: () => onTeamClicked(row),\r\n } as RowPropGetter)\r\n }\r\n />\r\n \r\n \r\n \r\n ) : editTeam ? (\r\n onTeamUpdated(updatedTeam)}\r\n onExit={() => onCancelModification()}\r\n />\r\n ) : (\r\n onTeamUpdated(updatedTeam)}\r\n onExit={() => onCancelModification()}\r\n />\r\n );\r\n };\r\n\r\n return renderComplete ? {teamsTable()} : null;\r\n};\r\n","import { IPermission } from '../IPermission';\r\nimport { Claim } from '../Claim';\r\nimport { AdminRoleRequiredPermission } from './AdminRoleRequiredPermission'\r\n\r\nexport class DisplayUsersPermission extends AdminRoleRequiredPermission {\r\n\tprivate _requiredPerm: IPermission | undefined;\r\n\tprivate _checkPermissionGranted = (onGranted: () => void) => super.granted(onGranted);\r\n\tprivate _checkPermissionDenied = (onDenied: () => void) => super.denied(onDenied);\r\n\r\n\tconstructor(userPermGroups: Claim, additionalPermNeeded?: IPermission) {\r\n\t\tsuper(userPermGroups);\r\n\r\n\t\tif (additionalPermNeeded) {\r\n\t\t\tthis._requiredPerm = additionalPermNeeded;\r\n\r\n\t\t\tthis._checkPermissionGranted = (onGranted: () => void) => super.granted(() => this._requiredPerm!.granted(() => onGranted()));\r\n\t\t\tthis._checkPermissionDenied = (onDenied: () => void) => super.denied(() => this._requiredPerm!.denied(() => onDenied()));\r\n\t\t}\r\n\t}\r\n\r\n\tgranted(onGranted: () => void) { \r\n\t\tif(!!!onGranted) {\r\n\t\t\tthrow new Error(\"onGranted was not provided\");\r\n\t\t}\r\n\r\n\t\tthis._checkPermissionGranted(() => onGranted());\r\n\t}\r\n\r\n\tdenial(onDenial: () => void ) {\r\n\t\tif(!!!onDenial) {\r\n\t\t\tthrow new Error(\"onDenial was not provided\");\r\n\t\t}\r\n\r\n\t\tthis._checkPermissionDenied(() => onDenial());\r\n\t}\r\n}","export abstract class DemographicPrefix {\r\n\tdescriptor: string;\r\n\tprivate static _empty: DemographicPrefix;\r\n\r\n\tconstructor(descriptor: string) {\r\n\t\tif(!descriptor) {\r\n\t\t\tthrow new Error(\"descriptor was not provided\");\r\n\t\t}\r\n\r\n\t\tthis.descriptor = descriptor;\r\n\t}\r\n\r\n\tstatic empty() {\r\n\t\tif(!this._empty) {\r\n\t\t\tthis._empty = new EmptyPrefix();\r\n\t\t}\r\n\r\n\t\treturn this._empty;\r\n\t}\r\n\r\n\tstatic parse(description: string) {\r\n\t\tconst prefixChooser: any = {\r\n\t\t\t[\"Mr.\"]: () => new MrDemographicPrefix(),\r\n\t\t\t[\"Mrs.\"]: () => new MrsDemographicPrefix(),\r\n\t\t\t[\"Ms.\"]: () => new MsDemographicPrefix(),\r\n\t\t\t[\"Dr.\"]: () => new DrDemographicPrefix};\r\n\r\n\t\tlet creator = prefixChooser[description];\r\n\t\t\r\n\t\tif(creator){\r\n\t\t\treturn creator();\r\n\t\t}\r\n\r\n\t\treturn DemographicPrefix.empty();\r\n\t}\r\n}\r\n\r\nclass EmptyPrefix extends DemographicPrefix{\r\n\tconstructor() {\r\n\t\tsuper(\"Please Select\");\r\n\t}\r\n}\r\n\r\nexport class MrDemographicPrefix extends DemographicPrefix {\r\n\tconstructor() {\r\n\t\tsuper(\"Mr.\")\r\n\t}\r\n}\r\n\r\nexport class MrsDemographicPrefix extends DemographicPrefix {\r\n\tconstructor() {\r\n\t\tsuper(\"Mrs.\")\r\n\t}\r\n}\r\n\r\nexport class MsDemographicPrefix extends DemographicPrefix {\r\n\tconstructor() {\r\n\t\tsuper(\"Ms.\");\r\n\t}\r\n}\r\n\r\nexport class DrDemographicPrefix extends DemographicPrefix {\r\n\tconstructor() {\r\n\t\tsuper(\"Dr.\");\r\n\t}\r\n}","export abstract class DemographicSuffix {\r\n\tdescriptor: string;\r\n\tprivate static _pleaseSelect: DemographicSuffix;\r\n\t\r\n\tconstructor(descriptor: string) {\r\n\t\tif(!descriptor) {\r\n\t\t\tthrow new Error(\"suffix descriptor was not provided\");\r\n\t\t}\r\n\r\n\t\tthis.descriptor = descriptor;\r\n\t}\r\n\r\n\tstatic empty(){\r\n\t\tif(!this._pleaseSelect) {\r\n\t\t\tthis._pleaseSelect = new EmptySuffix();\r\n\t\t\treturn this._pleaseSelect;\r\n\t\t}\r\n\t\t\r\n\t\treturn this._pleaseSelect;\r\n\t}\r\n}\r\n\r\nclass EmptySuffix extends DemographicSuffix {\r\n\tconstructor(){\r\n\t\tsuper(\"Please Select\");\r\n\t}\r\n}\r\n\r\nexport class JuniorSuffix extends DemographicSuffix {\r\n\tconstructor() {\r\n\t\tsuper(\"Jr.\");\r\n\t}\r\n}\r\n\r\nexport class SeniorSuffix extends DemographicSuffix {\r\n\tconstructor() {\r\n\t\tsuper(\"Sr.\");\r\n\t}\r\n}","export default class UserResponse { \r\n id?: string;\r\n userEmail?: string;\r\n name?: string;\r\n username?: string;\r\n inviteExpired: boolean = false;\r\n}","export class PatchStrings {\r\n static readonly opAdd = \"add\";\r\n static readonly opRemove = \"remove\";\r\n}\r\n\r\nexport default abstract class PatchRequest { \r\n private patchPayload: [{\r\n op: string,\r\n path: string,\r\n value: string | number | object\r\n }];\r\n\r\n constructor(op: string, path: string, value: string | number | object) {\r\n this.patchPayload = [{\r\n op: op,\r\n path: path,\r\n value: value\r\n }];\r\n }\r\n\r\n get payload() {\r\n return this.patchPayload;\r\n }\r\n\r\n addOp(op: string, path: string, value: string | number | object) {\r\n this.patchPayload.push({\r\n op: op,\r\n path: path,\r\n value: value\r\n });\r\n }\r\n\r\n removeOp(op: string, path: string, value: string | number | object) {\r\n const patchIndex = this.patchPayload.findIndex(r => r.op === op && r.path === path && r.value === value);\r\n\r\n if(patchIndex > -1) {\r\n this.patchPayload.splice(patchIndex, 1);\r\n }\r\n }\r\n}","import PatchRequest, { PatchStrings } from 'common/PatchRequest';\r\n\r\nexport default class ReinviteUserRequest extends PatchRequest { \r\n constructor(value: string) {\r\n super(PatchStrings.opAdd, \"/username\", value);\r\n }\r\n}","import { ApiResponseHandler } from 'common/ApiResponseHandler';\r\nimport UserResponse from 'user/UserResponse';\r\nimport { ApiUrl } from 'ApiConstants';\r\nimport authService from 'components/ApiAuthorization/AuthorizeService';\r\nimport ReinviteRequest from 'user/ReinviteUserRequest';\r\nimport ReinviteUserRequest from 'user/ReinviteUserRequest';\r\n\r\nexport default class UserService {\r\n async lookupByUsername(username: string) {\r\n const authToken = await authService.getAccessToken();\r\n\r\n if(!authToken) {\r\n console.log('User not authenticated. Redirecting to login.');\r\n \r\n await authService.signOut({});\r\n }\r\n\r\n const response = await fetch(`${ApiUrl.UserUrl}/username/${username}`, {\r\n headers: {\r\n 'Authorization': `Bearer ${authToken}`\r\n },\r\n method: 'GET'\r\n });\r\n\r\n var handler = new ApiResponseHandler();\r\n\r\n const userResponse = await handler.handle(response, \r\n ur => ur, \r\n () => new UserResponse()); \r\n\r\n let user = new UserResponse();\r\n\r\n userResponse.successful(ur => user = ur);\r\n\r\n return user;\r\n }\r\n\r\n async invite(username: string) {\r\n const authToken = await authService.getAccessToken();\r\n\r\n if(!authToken) {\r\n console.log('User not authenticated. Redirecting to login.');\r\n \r\n await authService.signOut({});\r\n }\r\n\r\n let reinviteRequest = new ReinviteRequest(username);\r\n\r\n let userInviteResponse = await fetch(`${ApiUrl.UserUrl}/invite`, {\r\n headers: {\r\n 'Authorization': `Bearer ${authToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n method: 'PATCH',\r\n body: JSON.stringify(reinviteRequest.payload)\r\n });\r\n\r\n var handler = new ApiResponseHandler();\r\n //currently the invite API doesn't return anything, so we're just plopping in a dummy object with the original username \r\n const inviteResponse = await handler.handle(userInviteResponse, \r\n () => reinviteRequest, \r\n () => {\r\n console.error(`Failed to invite ${username}`);\r\n return reinviteRequest\r\n });\r\n\r\n return inviteResponse;\r\n }\r\n}","export default class UserStrings {\r\n static readonly invitationSent = \"Invitation was sent\"\r\n static readonly resendInviteError = \"Failed to send invitation to user\";\r\n}","import React, { useContext, useEffect, useState } from \"react\";\r\nimport { Button, CardBody, CardTitle, Col, Form, FormGroup, Input, Label } from \"reactstrap\";\r\nimport UserService from \"user/UserService\";\r\nimport MessagingContext from \"common/messaging/MessagingContext\";\r\nimport { Messages } from \"common/Messaging\";\r\nimport UserStrings from \"user/UserStrings\";\r\n\r\ninterface UserAccountCardProps {\r\n onUsernameChange: (username: string) => void;\r\n onPasswordChange: (password: string) => void;\r\n onPasswordConfirmationChange: (confirmPassword: string) => void;\r\n showUsernameField: boolean;\r\n editMode: boolean;\r\n notifyUsernameNeeded: () => void;\r\n notifyUsernameOptional: () => void;\r\n notifyUserActive: () => void;\r\n notifyUserInactive: () => void;\r\n username?: string;\r\n userActive: boolean;\r\n password?: string;\r\n passwordConfirmation?: string;\r\n resetRequired: boolean;\r\n notifyPasswordReset: (resetNeeded: boolean) => void;\r\n}\r\n\r\nconst userService = new UserService();\r\n\r\nexport const UserAccountCard = ({\r\n onUsernameChange,\r\n onPasswordChange,\r\n onPasswordConfirmationChange,\r\n showUsernameField,\r\n editMode,\r\n notifyUsernameNeeded,\r\n notifyUsernameOptional,\r\n notifyUserActive,\r\n notifyUserInactive,\r\n username,\r\n userActive,\r\n password,\r\n passwordConfirmation,\r\n resetRequired,\r\n notifyPasswordReset,\r\n}: UserAccountCardProps) => {\r\n const [requireReset, setResetNeeded] = useState();\r\n const [inviteExpired, setInviteExpired] = useState(false);\r\n\r\n const messagingContext = useContext(MessagingContext);\r\n\r\n useEffect(() => {\r\n const lookupUser = async () => {\r\n const user = await userService.lookupByUsername(username!);\r\n\r\n if (user.inviteExpired) {\r\n setInviteExpired(true);\r\n }\r\n };\r\n\r\n if (username) {\r\n lookupUser();\r\n }\r\n }, [username]);\r\n\r\n useEffect(() => {\r\n notifyPasswordReset(requireReset ?? false);\r\n }, [requireReset, notifyPasswordReset]);\r\n\r\n const emailForUsernameChanged = (value: string) => {\r\n if (value === \"1\") {\r\n notifyUsernameOptional();\r\n } else {\r\n notifyUsernameNeeded();\r\n }\r\n };\r\n\r\n const onActiveStatusChange = (value: string) => {\r\n if (value === \"1\") {\r\n notifyUserActive();\r\n } else {\r\n notifyUserInactive();\r\n }\r\n };\r\n\r\n const resendInvite = async () => {\r\n if (!username) {\r\n return;\r\n }\r\n\r\n let inviteResponse = await userService.invite(username);\r\n\r\n inviteResponse.successful((account) => {\r\n messagingContext.publish(Messages.userModifySuccess(), UserStrings.invitationSent);\r\n setInviteExpired(false);\r\n });\r\n\r\n inviteResponse.failure(() => {\r\n messagingContext.publish(Messages.userModifyFail(), UserStrings.resendInviteError);\r\n });\r\n };\r\n\r\n const emailAddressForUserName = () => {\r\n return (\r\n \r\n Use Email Address for User Name?\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n const accountStatus = () => {\r\n return (\r\n \r\n Status\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n };\r\n\r\n const accountDetailsElement = () => {\r\n return (\r\n \r\n \r\n onUsernameChange(event.target.value)}\r\n />\r\n \r\n );\r\n };\r\n\r\n return (\r\n <>\r\n \r\n Account Details\r\n
\r\n
\r\n {!editMode && emailAddressForUserName()}\r\n {editMode && accountStatus()}\r\n
\r\n
\r\n {showUsernameField ? accountDetailsElement() : null}\r\n {editMode ? (\r\n <>\r\n \r\n \r\n onPasswordChange(event.target.value)}\r\n placeholder=\"********\"\r\n />\r\n \r\n \r\n \r\n onPasswordConfirmationChange(event.target.value)}\r\n placeholder=\"********\"\r\n />\r\n \r\n {!inviteExpired && (\r\n \r\n

Reset Password

\r\n \r\n
\r\n )}\r\n {inviteExpired && (\r\n \r\n \r\n \r\n )}\r\n \r\n ) : null}\r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n","import { Team } from \"../Team\";\r\n\r\nexport enum AccountStatus {\r\n\tActive = 1,\r\n\tInactive = 2,\r\n}\r\n\r\nexport class ChangeUserRequestContact {\r\n\treadonly email: string;\r\n\tphoneNumber?: string;\r\n\r\n\tconstructor(email: string) {\r\n\t\tif (!!!email) {\r\n\t\t\tthrow new Error(\"Email was not provided\");\r\n\t\t}\r\n\r\n\t\tthis.email = email;\r\n\t}\r\n}\r\n\r\nexport class ChangeUserRequestDemographics {\r\n\treadonly firstName: string;\r\n\treadonly lastName: string;\r\n\tmiddleName?: string;\r\n\tprefix?: string;\r\n\tsuffix?: string;\r\n\r\n\tconstructor(firstName: string, lastName: string) {\r\n\t\tif (!!!firstName) {\r\n\t\t\tthrow new Error(\"firstName was not provided\");\r\n\t\t}\r\n\r\n\t\tif (!!!lastName) {\r\n\t\t\tthrow new Error(\"lastName was not provided\");\r\n\t\t}\r\n\r\n\t\tthis.firstName = firstName;\r\n\t\tthis.lastName = lastName;\r\n\t}\r\n}\r\n\r\nexport class ChangeUserRequestAccount {\r\n\tusername: string;\r\n\tpassword?: string;\r\n\tconfirmPassword?: string;\r\n\tuseEmailForUsername: boolean = false;\r\n\taccountStatus: AccountStatus = AccountStatus.Inactive;\r\n\trequirePasswordReset: boolean = false;\r\n\r\n\tprivate constructor(username: string, password?: string, confirmPassword?: string) {\r\n\t\tthis.username = username;\r\n\t\tthis.password = password;\r\n\t\tthis.confirmPassword = confirmPassword;\r\n\t}\r\n\r\n\tstatic forAddingUser(){\r\n\t\tlet emptyRequest = new ChangeUserRequestAccount(\"empty\");\r\n\r\n\t\temptyRequest.username = \"\";\r\n\t\temptyRequest.password = \"\";\r\n\t\temptyRequest.confirmPassword = \"\";\r\n\r\n\t\temptyRequest.useEmailForUsername = true;\r\n\r\n\t\treturn emptyRequest;\r\n\t}\r\n\r\n\tstatic forEditingUser(username: string, password?: string, confirmPassword?: string) {\r\n\t\tif (!!!username) {\r\n\t\t\tthrow new Error(\"username was not provided\");\r\n\t\t}\r\n\r\n\t\treturn new ChangeUserRequestAccount(username, password, confirmPassword);\r\n\t}\r\n}\r\n\r\nexport class ChangeUserRequestAccountSecurity {\r\n\treadonly permissionGroup: string;\r\n\treadonly teams: Team[] = [];\r\n\r\n\tconstructor(permissionGroup: string, teams?: Team[]) {\r\n\t\tif(!!!permissionGroup) {\r\n\t\t\tthrow new Error(\"permissionGroup was not provided\");\r\n\t\t}\r\n\t\tthis.permissionGroup = permissionGroup;\r\n\r\n\t\tif(teams && teams.length > 0) {\r\n\t\t\tthis.teams = teams;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport class ChangeUserRequest {\r\n\tprefix?: string;\r\n\treadonly firstName: string;\r\n\treadonly lastName: string;\r\n\treadonly middleName?: string;\r\n\treadonly emailAddress: string;\r\n\tphoneNumber?: string;\r\n\tsuffix?: string;\r\n\tid?: string;\r\n\r\n\treadonly credentials?: ChangeUserRequestAccount\r\n\r\n\taccountStatus: AccountStatus = AccountStatus.Inactive;\r\n\r\n\treadonly permissionGroup: string;\r\n\treadonly useEmailForUsername: boolean;\r\n\treadonly username?: string;\r\n\treadonly teams: Team[] = [];\r\n\r\n\tconstructor(\r\n\t\tdemographics: ChangeUserRequestDemographics,\r\n\t\tcontact: ChangeUserRequestContact,\r\n\t\tsecurity: ChangeUserRequestAccountSecurity,\r\n\t\taccount?: ChangeUserRequestAccount,\r\n\t) {\r\n\t\tif (!!!demographics) {\r\n\t\t\tthrow new Error(\"demographics not provided\");\r\n\t\t}\r\n\r\n\t\tif (!!!contact) {\r\n\t\t\tthrow new Error(\"contact not provided\");\r\n\t\t}\r\n\r\n\t\tif (!!!security) {\r\n\t\t\tthrow new Error(\"security not provided\");\r\n\t\t}\r\n\r\n\t\tif(!!!security.permissionGroup) {\r\n\t\t\tthrow new Error(\"permissionGroup not provided\");\r\n\t\t}\r\n\r\n\t\tthis.firstName = demographics.firstName;\r\n\t\tthis.lastName = demographics.lastName;\r\n\t\tthis.middleName = demographics.middleName;\r\n\t\tthis.emailAddress = contact.email;\r\n\t\tthis.phoneNumber = contact.phoneNumber;\r\n\r\n\t\tthis.credentials = account;\r\n\t\t\r\n\t\tthis.permissionGroup = security.permissionGroup;\r\n\r\n\t\tif(security.teams) {\r\n\t\t\tthis.teams = [...security.teams];\r\n\t\t}\r\n\r\n\t\tthis.username = account?.username;\r\n\t\tthis.useEmailForUsername = account?.useEmailForUsername ?? true;\r\n\t\tthis.accountStatus = account?.accountStatus ?? AccountStatus.Inactive;\r\n\t\tthis.prefix = demographics.prefix;\r\n\t\tthis.suffix = demographics.suffix;\r\n\t}\r\n}","import React, { useEffect, useState, Fragment } from 'react';\r\nimport { Input, Label } from 'reactstrap';\r\n\r\ninterface PrefixSelectInputProps {\r\n\toptions: Iterable\r\n\tcontrolId?: string;\r\n\tlabelText?: string;\r\n\tselected?: string;\r\n\tonSelected: (prefixChosen?: T) => void;\r\n\toptionText: (option: T) => string;\r\n}\r\n\r\nexport const PrefixSelectInput = ({ options, controlId, labelText, selected, onSelected, optionText }: PrefixSelectInputProps) => {\r\n\tconst [selectOptions, setOptions] = useState([] as JSX.Element[]);\r\n\tconst [selectedPrefix, setSelected] = useState();\r\n \r\n\tconst selectId = \"prefix-select\";\r\n\r\n\tuseEffect(() => {\r\n\t\tconst buildOptions = () => {\r\n\t\t\tlet builtOptions = [];\r\n\r\n\t\t\tfor (let option of options) {\r\n\t\t\t\tbuiltOptions.push(option);\r\n\t\t\t}\r\n\r\n\t\t\tsetOptions(builtOptions.map(builtOpt => ));\r\n\t\t}\r\n\r\n\t\tbuildOptions();\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\tonSelected(selectedPrefix);\r\n\t},[selectedPrefix]);\r\n\r\n\tconst onPrefixChange = (prefixSelected: string) => {\r\n\t\tif(!prefixSelected){\r\n\t\t\tsetSelected(undefined);\r\n\t\t} else {\r\n\t\t\tfor(let option of options) {\r\n\t\t\t\tif(optionText(option) === prefixSelected) {\r\n\t\t\t\t\tsetSelected(option);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t onPrefixChange(event.target.value)} role=\"option\">\r\n\t\t\t\t{selectOptions}\r\n\t\t\t\r\n\t\t\r\n\t)\r\n}","import React, { Fragment, useEffect, useState } from 'react';\r\nimport { Input, Label } from 'reactstrap';\r\nimport { DemographicSuffix, JuniorSuffix, SeniorSuffix } from './DemographicSuffix';\r\n\r\ninterface SuffixSelectorProps {\r\n\tselected?: string;\r\n\tonSuffixSelected: (suffix?: DemographicSuffix) => void;\r\n}\r\n\r\nexport const SuffixSelector = ({ selected, onSuffixSelected }: SuffixSelectorProps) => {\r\n\tconst [chosenSuffix, setChosenSuffix] = useState()\r\n\r\n\tconst pleaseSelectSuffix = DemographicSuffix.empty();\r\n\tconst jrSuffix = new JuniorSuffix();\r\n\tconst srSuffix = new SeniorSuffix();\r\n\t\r\n\tconst pleaseSelectText = pleaseSelectSuffix.descriptor;\r\n\tconst jrSuffixText = jrSuffix.descriptor;\r\n\tconst srSuffixText = srSuffix.descriptor;\r\n\t\r\n\r\n\tuseEffect(() => {\r\n\t\tonSuffixSelected(chosenSuffix);\r\n\t}, [chosenSuffix])\r\n\r\n\tconst onSuffixChosen = (descriptor?: string) => {\r\n\t\tif(!descriptor) {\r\n\t\t\tsetChosenSuffix(undefined);\r\n\t\t}\r\n\r\n\t\tconst suffixChooser = {\r\n\t\t\t[pleaseSelectText]: () => setChosenSuffix(pleaseSelectSuffix),\r\n\t\t\t[jrSuffixText]: () => setChosenSuffix(jrSuffix),\r\n\t\t\t[srSuffixText]: () => setChosenSuffix(srSuffix)\r\n\t\t};\r\n\r\n\t\tsuffixChooser[descriptor!]();\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t onSuffixChosen(event.target.value)}>\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t)\r\n}","import React from \"react\";\r\nimport { CardBody, CardTitle, Form, FormGroup, Input, Label } from \"reactstrap\";\r\nimport { UserDemographics } from \"../../user/UserDemographics\";\r\nimport { PrefixSelectInput } from \"../../components/Common/PrefixSelectInput\";\r\nimport { SuffixSelector } from \"../../components/Common/SuffixSelector\";\r\nimport {\r\n DemographicPrefix,\r\n MrDemographicPrefix,\r\n MrsDemographicPrefix,\r\n MsDemographicPrefix,\r\n DrDemographicPrefix,\r\n} from \"../Common/DemographicPrefix\";\r\nimport { DemographicSuffix } from \"../Common/DemographicSuffix\";\r\n\r\ninterface UserDemoGraphicsCardProps {\r\n demographics: UserDemographics;\r\n editMode: boolean;\r\n onPrefixSelected: (selectedPrefix?: DemographicPrefix) => void;\r\n onSuffixSelected: (selectedSuffix: DemographicSuffix) => void;\r\n onFirstNameChange: (newFirstName: string) => void;\r\n onMiddleNameChange: (newMiddleName: string) => void;\r\n onLastNameChange: (newLastName: string) => void;\r\n onEmailAddressChange: (newEmailAddress: string) => void;\r\n onPhoneNumberChange: (newPhoneNumber: string) => void;\r\n}\r\n\r\nexport const UserDemographicsCard = ({\r\n demographics,\r\n onPrefixSelected,\r\n onSuffixSelected,\r\n onFirstNameChange,\r\n onMiddleNameChange,\r\n onLastNameChange,\r\n onEmailAddressChange,\r\n onPhoneNumberChange,\r\n}: UserDemoGraphicsCardProps) => {\r\n const prefixOptions = [\r\n DemographicPrefix.empty(),\r\n new MrDemographicPrefix(),\r\n new MrsDemographicPrefix(),\r\n new MsDemographicPrefix(),\r\n new DrDemographicPrefix(),\r\n ] as DemographicPrefix[];\r\n\r\n return (\r\n <>\r\n \r\n Demographics\r\n
\r\n
\r\n \r\n onPrefixSelected(chosen)}\r\n optionText={(option) => option?.descriptor ?? \"Please Select\"}\r\n selected={demographics?.prefix}\r\n />\r\n \r\n \r\n \r\n onFirstNameChange(event.target.value)}\r\n >\r\n \r\n \r\n \r\n onMiddleNameChange(event.target.value)}\r\n >\r\n \r\n \r\n \r\n onLastNameChange(event.target.value)}\r\n >\r\n \r\n \r\n onSuffixSelected(selectedSuffix!)}\r\n selected={demographics?.suffix}\r\n />\r\n \r\n
\r\n
\r\n \r\n \r\n onEmailAddressChange(event.target.value)}\r\n >\r\n \r\n \r\n \r\n onPhoneNumberChange(event.target.value)}\r\n >\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n","import React, { ChangeEvent } from \"react\";\r\nimport { CardBody, CardTitle, Form, FormGroup, Label } from \"reactstrap\";\r\nimport { Team } from \"../../Team\";\r\nimport { Slushbox } from \"../Common/Slushbox\";\r\n\r\ninterface UserPermissionCardProps {\r\n permissionGroup?: string;\r\n organizationTeams: Iterable;\r\n availableTeams: Iterable;\r\n assignedOrganizationTeams?: Iterable;\r\n editMode: boolean;\r\n onPermissionGroupChosen: (permissionGroup: string) => void;\r\n onTeamsAssigned: (assignedTeams: Iterable) => void;\r\n onTeamsAvailableChange: (availableTeams: Iterable) => void;\r\n}\r\n\r\nexport const UserPermissionsCard = ({\r\n permissionGroup = \"Please Select\",\r\n organizationTeams,\r\n assignedOrganizationTeams,\r\n availableTeams,\r\n editMode,\r\n onPermissionGroupChosen,\r\n onTeamsAssigned,\r\n onTeamsAvailableChange,\r\n}: UserPermissionCardProps) => {\r\n const orgTeams = Array.from(organizationTeams ?? []);\r\n\r\n const findTeamFrom = (option: HTMLOptionElement) => {\r\n const searchTeam = new Team(parseInt(option.value), option.innerText);\r\n return orgTeams.find((team) => searchTeam.equals(team));\r\n };\r\n\r\n const withPermissionGroup = (selectedPermGroup: ChangeEvent) => {\r\n if (!!!selectedPermGroup) {\r\n console.error(\"withPermissionGroup called without selectedPermGroup\");\r\n }\r\n\r\n const permissionGroup = selectedPermGroup.target.selectedOptions[0];\r\n\r\n onPermissionGroupChosen(permissionGroup.value);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n Permissions\r\n
\r\n
\r\n \r\n \r\n withPermissionGroup(event)}\r\n //defaultValue=\"Please Select\"\r\n data-testid=\"permission-group\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n

Teams

\r\n team.name}\r\n mapOptionFrom={(opt) => findTeamFrom(opt) ?? Team.unknown}\r\n valueFactory={(t) => t.id.toString()}\r\n onAssignedItemsChanged={(allAssigned) => onTeamsAssigned(allAssigned)}\r\n onAvailableItemsChanged={(allAvailable) => onTeamsAvailableChange(allAvailable)}\r\n itemsEqual={(first, second) => first.id === second.id}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n","export abstract class RequestBuilder {\r\n\tabstract build(): TBuilt;\r\n\tabstract canBuild(): boolean;\r\n\t\r\n\tprotected throwBuildError(item: string) {\r\n\t\tthrow new Error(this.createMissingItemMessage(item));\r\n\t}\r\n\r\n\tprivate createMissingItemMessage(item: string): string {\r\n\t\treturn `${item} has not been built`;\r\n\t}\r\n}","import { AccountStatus, \r\n\tChangeUserRequest, \r\n\tChangeUserRequestAccount, \r\n\tChangeUserRequestAccountSecurity, \r\n\tChangeUserRequestContact, \r\n\tChangeUserRequestDemographics } from '../user/ChangeUserRequest';\r\nimport { NameParts } from '../common/NameParts';\r\nimport { OrgUser } from '../organization/OrgUser';\r\nimport { RequestBuilder } from '../common/RequestBuilder';\r\nimport { Team } from '../Team';\r\nimport { SecurityStrings } from '../ApiConstants';\r\n\r\nexport interface UserConfigurationState {\r\n\tadding: () => UserConfigurationState;\r\n\tediting: () => UserConfigurationState;\r\n\trequireUsername: () => UserConfigurationState;\r\n\tuseEmailForUsername: () => UserConfigurationState;\r\n\twhenEditing: (onEditing: () => void) => void;\r\n\twhenAdding: (onAdding: () => void) => void;\r\n\twhenEmailUsernameConfigured: (onEmailUsernameConfigured: () => void) => void;\r\n\twhenUsernameRequired: (onRequired: () => void) => void;\r\n}\r\n\r\nexport class EditingUserState implements UserConfigurationState {\r\n\tadding() {\r\n\t\treturn new AddingUserState();\r\n\t} \r\n\r\n\tediting() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tuseEmailForUsername() {\r\n\t\treturn new UseEmailForUsernameState();\r\n\t}\r\n\r\n\trequireUsername() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\twhenAdding(onAdding: () => void) {\r\n\t}\r\n\r\n\twhenEditing(onEditing: () => void) {\r\n\t\tonEditing();\r\n\t}\r\n\r\n\twhenEmailUsernameConfigured(onUsingEmail: () => void) {\r\n\t}\r\n\r\n\twhenUsernameRequired(onRequired: () => void){\r\n\t\tonRequired();\r\n\t}\r\n}\r\n\r\nexport class AddingUserState implements UserConfigurationState {\r\n\tadding() {\r\n\t\treturn this;\r\n\t} \r\n\r\n\tediting() {\r\n\t\treturn new EditingUserState();\r\n\t}\r\n\r\n\tuseEmailForUsername() {\r\n\t\treturn new UseEmailForUsernameState();\r\n\t}\r\n\r\n\trequireUsername() {\r\n\t\treturn new RequireUsernameState();\r\n\t}\r\n\r\n\twhenAdding(onAdding: () => void) {\r\n\t\tonAdding();\r\n\t}\r\n\r\n\twhenEditing(onEditing: () => void) {\r\n\t}\r\n\r\n\twhenEmailUsernameConfigured(onUsingEmail: () => void) {\r\n\t\tonUsingEmail();\r\n\t}\r\n\r\n\twhenUsernameRequired(onRequired: () => void) {\t\t\r\n\t}\r\n}\r\n\r\nexport class UseEmailForUsernameState extends AddingUserState {\r\n\tadding() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\tuseEmailForUsername() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\twhenEmailUsernameConfigured(onUsingEmail: () => void) {\r\n\t\tonUsingEmail();\r\n\t}\r\n}\r\n\r\nexport class RequireUsernameState extends AddingUserState{\r\n\trequireUsername() {\r\n\t\treturn this;\r\n\t}\r\n\r\n\twhenEmailUsernameConfigured(onUsingEmail: () => void) {\r\n\t}\r\n\r\n\twhenUsernameRequired(onRequired: () => void) {\t\t\r\n\t\tonRequired();\r\n\t}\r\n}\r\n\r\nexport class ChangeUserRequestNameBuilder extends RequestBuilder {\r\n\tprivate _first?: string;\r\n\tprivate _last?: string;\r\n\tprivate _middle?: string;\r\n\tprivate _prefix?: string;\r\n\tprivate _suffix?: string\r\n\r\n\twithFirst(firstName: string) {\r\n\t\tthis._first = firstName;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\twithLast(lastName: string) {\r\n\t\tthis._last = lastName;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\twithMiddle(middleName: string) {\r\n\t\tthis._middle = middleName;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\twithPrefix(prefix?: string) {\r\n\t\tthis._prefix = prefix;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\twithSuffix(suffix: string) {\r\n\t\tthis._suffix = suffix;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tremoveMiddle() {\r\n\t\tthis._middle = undefined;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tremovePrefix() {\r\n\t\tthis._prefix = undefined;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tcanBuild() {\r\n\t\tif(!!!this._first) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(!!!this._last) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tbuild() {\r\n\t\tif (this.canBuild()) {\r\n\t\t\treturn new NameParts(this._first!, this._last!, this._middle);\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"First and/or last name(s) are missing. Unable to build.\");\r\n\t}\r\n}\r\n\r\nexport class ChangeUserRequestContactBuilder extends RequestBuilder {\r\n\tprivate _emailAddress?: string;\r\n\tprivate _phoneNumber?: string;\r\n\r\n\temailAt(emailAddress: string) {\r\n\t\tthis._emailAddress = emailAddress;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tcallAt(phoneNumber: string) {\r\n\t\tthis._phoneNumber = phoneNumber;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tcanBuild() {\r\n\t\tif(!!!this._emailAddress) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tbuild() {\r\n\t\tif(!this.canBuild()){\r\n\t\t\tthrow new Error(\"Unable to build contact as not all required components have been provided. Before calling this, invoke canBuild() to check validity of this builder.\");\r\n\t\t}\r\n\r\n\t\tlet contact = new ChangeUserRequestContact(this._emailAddress!);\r\n\t\r\n\t\tcontact.phoneNumber = this._phoneNumber;\r\n\t\t\r\n\t\treturn contact;\r\n\t}\r\n}\r\n\r\nexport class ChangeUserRequestDemographicsBuilder extends RequestBuilder {\r\n\tprivate _nameBuilder = new ChangeUserRequestNameBuilder();\r\n\tprivate _prefix?: string;\r\n\tprivate _suffix?: string;\r\n\r\n\tuserNamed(first: string, last: string, middle?: string) {\r\n\t\tthis._nameBuilder = this._nameBuilder.withFirst(first).withLast(last);\r\n\r\n\t\tif (middle) {\r\n\t\t\tthis._nameBuilder = this._nameBuilder.withMiddle(middle);\r\n\t\t} else {\r\n\t\t\tthis._nameBuilder = this._nameBuilder.removeMiddle();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tprefixName(prefix?: string) {\r\n\t\tthis._nameBuilder = this._nameBuilder.withPrefix(prefix);\r\n\t\t\r\n\t\tthis._prefix = prefix;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tsuffixName(suffix?: string) {\r\n\t\tthis._suffix = suffix;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tremovePrefix() {\r\n\t\tif(!this._prefix){\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.prefixName(undefined);\r\n\t}\r\n\r\n\tremoveSuffix() {\r\n\t\tif(!this._suffix) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treturn this.suffixName(undefined);\r\n\t}\r\n\r\n\tcanBuild() {\r\n\t\tif(!!!this._nameBuilder.canBuild()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tbuild() {\r\n\t\tif(!this.canBuild()) {\r\n\t\t\tthrow new Error(\"Unable to build demographics - required items are missing.\");\r\n\t\t}\r\n\r\n\t\tlet nameParts = this._nameBuilder.build()\r\n\r\n\t\tlet demographics = new ChangeUserRequestDemographics(\r\n\t\t\tnameParts.firstName,\r\n\t\t\tnameParts.lastName\r\n\t\t);\r\n\r\n\t\tif(nameParts.middleName) {\r\n\t\t\tdemographics.middleName = nameParts.middleName;\r\n\t\t}\r\n\r\n\t\tif(this._prefix) {\r\n\t\t\tdemographics.prefix = this._prefix;\r\n\t\t}\r\n\r\n\t\tif(this._suffix) {\r\n\t\t\tdemographics.suffix = this._suffix;\r\n\t\t}\r\n\r\n\t\treturn demographics;\r\n\t}\r\n}\r\n\r\nexport class ChangeUserRequestAccountBuilder extends RequestBuilder {\r\n\tprivate _username?: string;\r\n\tprivate _password?: string;\r\n\tprivate _confirmPassword?: string;\r\n\tprivate _active: AccountStatus = AccountStatus.Inactive;\r\n\tprivate _state: UserConfigurationState = new AddingUserState();\r\n\tprivate _resetRequired: boolean = false;\r\n\r\n\twithUserName(username: string) {\r\n\t\tthis._username = username;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tloginWithPassword(password?: string) {\r\n\t\tthis._password = password;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tconfirmPasswordWith(passwordConfirmation?: string) {\r\n\t\tthis._confirmPassword = passwordConfirmation;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tconfigureEmailAsUsername() {\r\n\t\tthis._state = this._state.useEmailForUsername();\r\n\t\t\r\n\t\treturn this;\r\n\t}\r\n\r\n\trequireUsername() {\r\n\t\tthis._state = this._state.requireUsername();\r\n\r\n\t\treturn this;\r\n\t}\r\n\t \r\n\tactivateUser() {\r\n\t\tthis._active = AccountStatus.Active;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tdeactivateUser() {\r\n\t\tthis._active = AccountStatus.Inactive;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tmustResetPassword() {\r\n\t\tthis._resetRequired = true;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tresetPasswordNotRequired() {\r\n\t\tthis._resetRequired = false;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tremovePassword() {\r\n\t\tthis._password = undefined;\r\n\t\t\r\n\t\treturn this;\r\n\t}\r\n\r\n\tremovePasswordConfirmation() {\r\n\t\tthis._confirmPassword = undefined;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tbuild() {\r\n\t\tif(!this.canBuild()){\r\n\t\t\tlet missingValues: string[] = [];\r\n\r\n\t\t\tif(!!!this._username) {\r\n\t\t\t\tmissingValues.push(\"username\");\r\n\t\t\t}\r\n\r\n\t\t\tlet missingFields = \"\";\r\n\t\t\tmissingValues.forEach((val, index) => {\r\n\t\t\t\t\tindex === 0 ? missingFields = val : missingFields = `${missingFields}, ${val}`\r\n\t\t\t});\r\n\r\n\t\t\tthrow new Error(`Unable to build. ${missingFields} are missing. Invoke the canBuild method before calling build() to check builder validity.`);\r\n\t\t}\r\n\r\n\t\tlet builtRequest = ChangeUserRequestAccount.forAddingUser();\r\n\t\tthis._state.whenEmailUsernameConfigured(() => builtRequest.useEmailForUsername = true);\r\n\t\tthis._state.whenUsernameRequired(() => {\r\n\t\t\tbuiltRequest.useEmailForUsername = false;\r\n\t\t\tbuiltRequest.username = this._username!;\r\n\t\t});\r\n\t\tthis._state.whenEditing(() => builtRequest = ChangeUserRequestAccount.forEditingUser(this._username!, this._password, this._confirmPassword));\r\n\t\t\r\n\t\tbuiltRequest.accountStatus = this._active;\r\n\r\n\t\tbuiltRequest.requirePasswordReset = this._resetRequired\r\n\r\n\t\treturn builtRequest;\r\n\t}\r\n\r\n\tpublic canBuild() {\r\n\t\tlet returns = false;\r\n\t\t\r\n\t\t//if the request is configured for adding, we do not need the account information\r\n\t\t//because we use the email address as a username and enforce a password reset.\r\n\t\tthis._state.whenAdding(() => returns = true);\t\r\n\r\n\t\tthis._state.whenEditing(() => {\r\n\t\t\tif(!!!this._username) {\r\n\t\t\t\treturns = false;\r\n\t\t\t} else {\r\n\t\t\t\treturns = true\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn returns;\r\n\t}\r\n\r\n\tconfigureForEditing() {\r\n\t\tthis._state = this._state.editing();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tconfigureForAdding() {\r\n\t\tthis._state = this._state.adding();\r\n\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nexport class ChangeUserRequestAccountSecurityBuilder extends RequestBuilder {\r\n\tprivate _permissionGroup?: string;\r\n\tprivate _teams: Team[] = [];\r\n\r\n\tinPermissionGroup(permissionGroup: string) {\r\n\t\tthis._permissionGroup = permissionGroup;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tonTeam(team: Team) {\r\n\t\tif(this._teams.includes(team)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tthis._teams.push(team);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tclearAssignedTeams() {\r\n\t\tthis._teams = [];\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tbuild() {\r\n\t\tif(!this.canBuild()) {\r\n\t\t\tthrow new Error(\"Unable to build ChangeUserRequestAccountSecurity. Not all required items were provided. Invoke canBuild() before build() to check the validity of this builder.\");\r\n\t\t}\r\n\r\n\t\treturn new ChangeUserRequestAccountSecurity(this._permissionGroup!, this._teams);\r\n\t}\r\n\r\n\tpublic canBuild() {\r\n\t\tif(!!!this._permissionGroup){ \r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport class ChangeUserRequestBuilder extends RequestBuilder {\r\n\tprivate _demographicsBuilder = new ChangeUserRequestDemographicsBuilder();\r\n\tprivate _contactBuilder = new ChangeUserRequestContactBuilder();\r\n\tprivate _accountBuilder = new ChangeUserRequestAccountBuilder();\r\n\tprivate _securityBuilder = new ChangeUserRequestAccountSecurityBuilder();\r\n\r\n\tuserHasName(firstName: string, lastName: string, middleName?: string) {\r\n\t\tif(!!!firstName) {\r\n\t\t\tthis.throwBuildError(\"firstName\");\r\n\t\t}\r\n\r\n\t\tif(!!!lastName) {\r\n\t\t\tthis.throwBuildError(\"lastName\");\r\n\t\t}\r\n\r\n\t\tthis._demographicsBuilder = this._demographicsBuilder.userNamed(firstName, lastName, middleName);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tuserContactedAt(emailAddress: string) {\r\n\t\tthis._contactBuilder = this._contactBuilder.emailAt(emailAddress);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tuserReachedAt(phoneNumber: string) {\r\n\t\tthis._contactBuilder = this._contactBuilder.callAt(phoneNumber);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tlogsInWith(username: string) {\r\n\t\tthis._accountBuilder = this._accountBuilder.withUserName(username);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tsecuresAccount(withPassword?: string) {\r\n\t\tthis._accountBuilder = this._accountBuilder.loginWithPassword(withPassword);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpasswordMatches(passwordConfirmation?: string) {\r\n\t\tthis._accountBuilder = this._accountBuilder.confirmPasswordWith(passwordConfirmation);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tonTeam(team: Team) {\r\n\t\tif(!!!team) {\r\n\t\t\tthis.throwBuildError(\"team\");\r\n\t\t}\r\n\r\n\t\tthis._securityBuilder = this._securityBuilder.onTeam(team);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tonTeams(teams: Iterable) {\r\n\t\tif(!!!teams) {\r\n\t\t\tthis.throwBuildError(\"teams\");\r\n\t\t}\r\n\r\n\t\tthis._securityBuilder = this._securityBuilder.clearAssignedTeams();\r\n\t\tfor(let team of teams) {\r\n\t\t\tthis._securityBuilder = this._securityBuilder.onTeam(team);\r\n\t\t}\r\n\t\t\t\r\n\t\treturn this;\r\n\t}\r\n\r\n\tinSecurityGroup(group: string) {\r\n\t\tthis._securityBuilder = this._securityBuilder.inPermissionGroup(group);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\twithEditingUserConfigured() {\r\n\t\tthis._accountBuilder = this._accountBuilder.configureForEditing();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\twithAddingUserConfigured() {\r\n\t\tthis._accountBuilder = this._accountBuilder.configureForAdding();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tuseEmailUsername() {\r\n\t\tthis._accountBuilder = this._accountBuilder.configureEmailAsUsername();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\trequireUsername() {\r\n\t\tthis._accountBuilder = this._accountBuilder.requireUsername();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tactivateUser() {\r\n\t\tthis._accountBuilder = this._accountBuilder.activateUser();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tdeactivateUser() {\r\n\t\tthis._accountBuilder = this._accountBuilder.deactivateUser();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tnamePrefixed(prefix?: string) {\r\n\t\tthis._demographicsBuilder = this._demographicsBuilder.prefixName(prefix);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tnameSuffixed(suffix?: string) {\r\n\t\tthis._demographicsBuilder = this._demographicsBuilder.suffixName(suffix);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\trequirePasswordReset() {\r\n\t\tthis._accountBuilder = this._accountBuilder.mustResetPassword();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpasswordResetNotNeeded() {\r\n\t\tthis._accountBuilder = this._accountBuilder.resetPasswordNotRequired();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tremovePrefix() {\r\n\t\tthis._demographicsBuilder = this._demographicsBuilder.prefixName(undefined);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tremoveSuffix() {\r\n\t\tthis._demographicsBuilder = this._demographicsBuilder.suffixName(undefined);\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tcanBuild() {\r\n\t\tif(!!!this._demographicsBuilder.canBuild()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(!!!this._accountBuilder.canBuild()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(!!!this._contactBuilder.canBuild()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(!this._securityBuilder.canBuild()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tclearPassword() {\r\n\t\tthis._accountBuilder = this._accountBuilder.removePassword();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tclearPasswordConfirmation() {\r\n\t\tthis._accountBuilder = this._accountBuilder.removePasswordConfirmation();\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tbuild() {\r\n\t\tconst demographics = this._demographicsBuilder.build();\r\n\t\tconst contact = this._contactBuilder.build();\r\n\t\tconst account = this._accountBuilder.build();\r\n\t\tconst security = this._securityBuilder.build();\r\n\r\n\t\treturn new ChangeUserRequest(demographics,\r\n\t\t\tcontact,\r\n\t\t\tsecurity, \r\n\t\t\taccount);\r\n\t}\r\n\r\n\tstatic initializeFromUser(user: OrgUser) {\r\n\t\tlet builder = new ChangeUserRequestBuilder();\r\n\r\n\t\tbuilder = builder.withEditingUserConfigured();\r\n\r\n\t\tbuilder = builder.userHasName(user.firstName, user.lastName);\r\n\t\t\r\n\t\tuser.onHasMiddleName(() => builder = builder.userHasName(user.firstName, user.lastName, user.middleName));\r\n\r\n\t\tuser.onNamePrefixed(() => builder = builder.namePrefixed(user.namePrefix));\r\n\t\tuser.onNameSuffixed(() => builder = builder.nameSuffixed(user.nameSuffix));\r\n\r\n\t\tbuilder = builder.userContactedAt(user.email);\r\n\t\t\r\n\t\tuser.reachableByPhoneAt(phoneNumber => builder = builder.userReachedAt(phoneNumber));\r\n\t\t\r\n\t\tuser.loginAllowed(() => builder = builder.activateUser());\r\n\r\n\t\tbuilder = builder.onTeams(user.teams);\r\n\r\n\t\tbuilder = builder.inSecurityGroup(SecurityStrings.UserRoleName);\r\n\t\tuser.whenAdministrator(() => builder = builder.inSecurityGroup(SecurityStrings.AdminRoleName));\r\n\r\n\t\tbuilder.logsInWith(user.username);\r\n\r\n\t\treturn builder;\r\n\t}\r\n}","import { SecurePerson } from \"../Person\";\r\n\r\nexport class UserDemographics {\r\n prefix?: string;\r\n firstName?: string;\r\n lastName?: string;\r\n middleName?: string;\r\n suffix?: string;\r\n emailAddress?: string;\r\n phoneNumber?: string;\r\n\r\n static noDemographics() {\r\n const demos = new UserDemographics();\r\n demos.prefix = \"\";\r\n demos.firstName = \"\";\r\n demos.lastName = \"\";\r\n demos.middleName = \"\";\r\n demos.suffix = \"\";\r\n demos.emailAddress = \"\";\r\n demos.phoneNumber = \"\";\r\n\r\n return demos;\r\n }\r\n\r\n static fromUser(person: SecurePerson) {\r\n let demographics = new UserDemographics();\r\n\r\n demographics.firstName = person.firstName;\r\n demographics.middleName = person.middleName;\r\n demographics.lastName = person.lastName;\r\n demographics.prefix = person.namePrefix;\r\n demographics.suffix = person.nameSuffix;\r\n demographics.emailAddress = person.email;\r\n\r\n person.reachableByPhoneAt((phoneNumber) => (demographics.phoneNumber = phoneNumber));\r\n }\r\n}\r\n","import { DemographicPrefix } from \"components/Common/DemographicPrefix\";\r\nimport { DemographicSuffix } from \"components/Common/DemographicSuffix\";\r\nimport { Messages } from \"components/Common/Messages\";\r\nimport { UserAccountCard } from \"components/user/UserAccountCard\";\r\nimport { UserDemographicsCard } from \"components/user/UserDemographicsCard\";\r\nimport { UserPermissionsCard } from \"components/user/UserPermissionsCard\";\r\nimport { Organization } from \"Organization\";\r\nimport OrganizationService from \"organization/OrganizationService\";\r\nimport { OrgUser } from \"organization/OrgUser\";\r\nimport { UpdateOrganizationRequest } from \"organization/UpdateOrganizationRequest\";\r\nimport React, { useCallback, useContext, useEffect, useRef, useState } from \"react\";\r\nimport { Button, Col, Row } from \"reactstrap\";\r\nimport { IPermission } from \"security/IPermission\";\r\nimport { AdminRoleRequiredPermission } from \"security/Permission/AdminRoleRequiredPermission\";\r\nimport { RoleRetriever } from \"security/RoleRetriever\";\r\nimport { SecuredPersonService } from \"services/SecuredPersonService\";\r\nimport { Team } from \"Team\";\r\nimport { ChangeUserRequestBuilder } from \"user/ChangeUserRequestBuilder\";\r\nimport { UserDemographics } from \"user/UserDemographics\";\r\nimport MessagingContext from \"common/messaging/MessagingContext\";\r\nimport { MessageSubscription, Messages as MessageFactory } from \"common/Messaging\";\r\nimport Message from \"common/Message\";\r\n\r\ninterface EditUserProps {\r\n userId?: string;\r\n userOrg: Organization;\r\n editing: boolean;\r\n onCancel: () => void;\r\n onUserChanged: (user: OrgUser) => void;\r\n}\r\n\r\nexport const EditUser = ({ userId = \"\", userOrg, editing, onCancel, onUserChanged }: EditUserProps) => {\r\n const [userDisplayName, setUserDisplayName] = useState();\r\n const [user, setOrgUser] = useState();\r\n\r\n //demographic fields\r\n const [userDemographics, setUserDemographics] = useState();\r\n const [firstName, setFirstName] = useState(\"\");\r\n const [lastName, setLastName] = useState(\"\");\r\n const [middleName, setMiddleName] = useState(\"\");\r\n const [namePrefix, setNamePrefix] = useState(\"\");\r\n const [nameSuffix, setNameSuffix] = useState(\"\");\r\n const [email, setEmail] = useState(\"\");\r\n const [phoneNumber, setPhoneNumber] = useState(\"\");\r\n\r\n //account fields\r\n const [username, setUsername] = useState(\"\");\r\n const [password, setPassword] = useState(\"\");\r\n const [passwordConfirmation, setPasswordConfirmation] = useState(\"\");\r\n const [userActive, setUserActive] = useState(true);\r\n const [passwordResetRequired, setPasswordReset] = useState();\r\n const [showUsername, setShowUsername] = useState(true);\r\n\r\n //security fields\r\n const [assignedTeams, setAssignedTeams] = useState>([]);\r\n const [availableTeams, setAvailableTeams] = useState>(userOrg.teams);\r\n const [permGroup, setAssignedPermGroup] = useState(\"Please Select\");\r\n\r\n let rBuilder = new ChangeUserRequestBuilder().activateUser();\r\n\r\n const [requestBuilder, setRequestBuilder] = useState(rBuilder);\r\n\r\n const [errors, setErrors] = useState([]);\r\n const [successMessages, setSuccessMessages] = useState([]);\r\n\r\n const [userEditPermission, setEditUserPermission] = useState();\r\n\r\n const messagingSubs = useRef([]);\r\n\r\n const messagingContext = useContext(MessagingContext);\r\n\r\n const tryRemoveSubscription = useCallback(\r\n (messagingSub: MessageSubscription, fromMessage: Message) => {\r\n if (!messagingSub) {\r\n return;\r\n }\r\n\r\n let subRemovedIndex = -1;\r\n\r\n if (messagingSub.subscribedTo.equals(fromMessage)) {\r\n messagingContext.unsubscribeFrom(messagingSub);\r\n subRemovedIndex = messagingSubs.current.findIndex((sub) => messagingSub.id === sub.id);\r\n }\r\n\r\n return subRemovedIndex;\r\n },\r\n [messagingContext]\r\n );\r\n\r\n useEffect(() => {\r\n const setEditPermission = async () => {\r\n let roleRetrieval = new RoleRetriever(new SecuredPersonService());\r\n let role = await roleRetrieval.ofLoggedInUser();\r\n\r\n setEditUserPermission(new AdminRoleRequiredPermission(role));\r\n };\r\n\r\n setEditPermission();\r\n\r\n return () => {\r\n for (let messageSub of messagingSubs.current) {\r\n messagingContext.unsubscribeFrom(messageSub);\r\n }\r\n\r\n messagingSubs.current = [];\r\n };\r\n }, [messagingContext]);\r\n\r\n useEffect(() => {\r\n //Listen for error messages from our sub-components\r\n const listenForFailureMessages = () => {\r\n let errorMsgSub = messagingContext.subscribeTo(MessageFactory.userModifyFail(), (errorMsg: string) => {\r\n const errorMsgIndex = errors.findIndex((err) => err === errorMsg);\r\n\r\n if (errorMsgIndex > -1) {\r\n //we already have this message, don't add it again\r\n return;\r\n }\r\n\r\n setErrors([...errors, errorMsg]);\r\n });\r\n\r\n messagingSubs.current.push(errorMsgSub);\r\n };\r\n\r\n listenForFailureMessages();\r\n\r\n return () => {\r\n //clean up our error message subscriptions\r\n let removeSubsIndexes: number[] = [];\r\n\r\n messagingSubs.current.forEach((messagingSub, index) => {\r\n let removalIndex = tryRemoveSubscription(messagingSub, MessageFactory.userModifyFail());\r\n\r\n if (removalIndex && removalIndex > -1) {\r\n removeSubsIndexes.push(removalIndex);\r\n }\r\n });\r\n\r\n removeSubsIndexes.forEach((subIndex) => messagingSubs.current.splice(subIndex));\r\n };\r\n }, [errors, messagingContext, tryRemoveSubscription]);\r\n\r\n useEffect(() => {\r\n //listen for success messages from our sub-components\r\n const listenForSuccessMessages = () => {\r\n let successMsgSub = messagingContext.subscribeTo(MessageFactory.userModifySuccess(), (successMsg: string) => {\r\n const successMsgIndex = successMessages.findIndex((s) => s === successMsg);\r\n\r\n if (successMsgIndex > -1) {\r\n //we already have this message, don't add it again\r\n return;\r\n }\r\n\r\n setSuccessMessages([...successMessages, successMsg]);\r\n });\r\n\r\n messagingSubs.current.push(successMsgSub);\r\n };\r\n\r\n listenForSuccessMessages();\r\n\r\n return () => {\r\n //clean up our success message subscriptions\r\n let removeSubsIndexes: number[] = [];\r\n\r\n messagingSubs.current.forEach((messagingSub) => {\r\n let removalIndex = tryRemoveSubscription(messagingSub, MessageFactory.userModifySuccess());\r\n\r\n if (removalIndex && removalIndex > -1) {\r\n removeSubsIndexes.push(removalIndex);\r\n }\r\n });\r\n\r\n removeSubsIndexes.forEach((subIndex) => messagingSubs.current.splice(subIndex));\r\n };\r\n }, [successMessages, messagingContext, tryRemoveSubscription]);\r\n\r\n useEffect(() => {\r\n const retrieveUser = async () => {\r\n if (!userOrg || !userId) {\r\n return;\r\n }\r\n\r\n const orgUser = userOrg.findUserWithId(userId);\r\n\r\n if (orgUser) {\r\n setUserDisplayName(orgUser.displayName());\r\n setOrgUser(orgUser);\r\n\r\n setFirstName(orgUser.firstName);\r\n setLastName(orgUser.lastName);\r\n\r\n if (orgUser.middleName) {\r\n setMiddleName(orgUser.middleName);\r\n }\r\n\r\n if (orgUser.namePrefix) {\r\n setNamePrefix(orgUser.namePrefix);\r\n }\r\n\r\n if (orgUser.nameSuffix) {\r\n setNameSuffix(orgUser.nameSuffix);\r\n }\r\n\r\n setEmail(orgUser.email);\r\n\r\n orgUser.reachableByPhoneAt((phoneNumber) => setPhoneNumber(phoneNumber));\r\n\r\n setUserActive(false);\r\n orgUser.loginAllowed(() => setUserActive(true));\r\n\r\n setUsername(orgUser.username);\r\n\r\n setAssignedPermGroup(orgUser.flatPermissionGroups);\r\n let assignedTeams = Array.from(orgUser.teams);\r\n\r\n setAvailableTeams(\r\n userOrg.teams.filter((orgTeam) => !!!assignedTeams.some((userTeam) => userTeam.id === orgTeam.id))\r\n );\r\n setAssignedTeams(assignedTeams);\r\n\r\n setRequestBuilder(ChangeUserRequestBuilder.initializeFromUser(orgUser));\r\n }\r\n };\r\n\r\n if (editing) {\r\n setShowUsername(true);\r\n retrieveUser();\r\n }\r\n }, [userId, editing, userOrg]);\r\n\r\n useEffect(() => {\r\n var demographics = new UserDemographics();\r\n\r\n demographics.firstName = firstName ?? \"\";\r\n demographics.middleName = middleName ?? \"\";\r\n demographics.lastName = lastName ?? \"\";\r\n demographics.emailAddress = email ?? \"\";\r\n demographics.phoneNumber = phoneNumber ?? \"\";\r\n demographics.prefix = namePrefix ?? \"\";\r\n demographics.suffix = nameSuffix ?? \"\";\r\n\r\n setUserDemographics(demographics);\r\n }, [firstName, middleName, lastName, namePrefix, nameSuffix, email, phoneNumber]);\r\n\r\n const onFirstNameChange = (newFirstName: string) => {\r\n setFirstName(newFirstName);\r\n };\r\n\r\n const onMiddleNameChange = (newMiddleName: string) => {\r\n setMiddleName(newMiddleName);\r\n };\r\n\r\n const onLastNameChange = (newLastName: string) => {\r\n setLastName(newLastName);\r\n };\r\n\r\n const onEmailAddressChange = (newEmailAddress: string) => {\r\n setEmail(newEmailAddress);\r\n setRequestBuilder(requestBuilder.userContactedAt(newEmailAddress));\r\n };\r\n\r\n const onPrefixChange = (selectedPrefix?: DemographicPrefix) => {\r\n if (!!!selectedPrefix) {\r\n setNamePrefix(DemographicPrefix.empty().descriptor);\r\n setRequestBuilder(requestBuilder.removePrefix());\r\n\r\n return;\r\n }\r\n\r\n if (selectedPrefix === DemographicPrefix.empty()) {\r\n setRequestBuilder(requestBuilder.removePrefix());\r\n } else {\r\n setRequestBuilder(requestBuilder.namePrefixed(selectedPrefix!.descriptor));\r\n }\r\n\r\n setNamePrefix(selectedPrefix!.descriptor);\r\n };\r\n\r\n const onSuffixChange = (selectedSuffix?: DemographicSuffix) => {\r\n if (!!!selectedSuffix) {\r\n setNameSuffix(DemographicSuffix.empty().descriptor);\r\n setRequestBuilder(requestBuilder.removeSuffix());\r\n\r\n return;\r\n }\r\n\r\n if (selectedSuffix === DemographicSuffix.empty()) {\r\n setNameSuffix(DemographicSuffix.empty().descriptor);\r\n setRequestBuilder(requestBuilder.removeSuffix());\r\n } else {\r\n setRequestBuilder(requestBuilder.nameSuffixed(selectedSuffix?.descriptor));\r\n }\r\n\r\n setNameSuffix(selectedSuffix?.descriptor);\r\n };\r\n\r\n const onPhoneNumberChange = (newPhoneNumber: string) => {\r\n setPhoneNumber(newPhoneNumber);\r\n setRequestBuilder(requestBuilder.userReachedAt(newPhoneNumber));\r\n };\r\n\r\n const onUsernameChange = (newUsername: string) => {\r\n setUsername(newUsername);\r\n setRequestBuilder(requestBuilder.logsInWith(newUsername));\r\n };\r\n\r\n const onPasswordChange = (newPassword?: string) => {\r\n setPassword(newPassword ?? \"\");\r\n setRequestBuilder(requestBuilder.securesAccount(newPassword));\r\n };\r\n\r\n const onPasswordConfirmationChange = (confirmedPassword?: string) => {\r\n setPasswordConfirmation(confirmedPassword ?? \"\");\r\n setRequestBuilder(requestBuilder.passwordMatches(confirmedPassword));\r\n };\r\n\r\n const onTeamAssignmentsChange = (teams: Iterable) => {\r\n setAssignedTeams(teams);\r\n };\r\n\r\n const onTeamsAvailableChange = (teams: Iterable) => {\r\n setAvailableTeams(teams);\r\n };\r\n\r\n const onPermissionGroupAssigned = (permGroup: string) => {\r\n setAssignedPermGroup(permGroup);\r\n setRequestBuilder(requestBuilder.inSecurityGroup(permGroup));\r\n };\r\n\r\n const configureEmailAsUsername = () => {\r\n setShowUsername(false);\r\n setRequestBuilder(requestBuilder.useEmailUsername());\r\n };\r\n\r\n const requireUsername = () => {\r\n setShowUsername(true);\r\n setRequestBuilder(requestBuilder.requireUsername());\r\n };\r\n\r\n const activateUser = () => {\r\n setUserActive(true);\r\n setRequestBuilder(requestBuilder.activateUser());\r\n };\r\n\r\n const deactivateUser = () => {\r\n setUserActive(false);\r\n setRequestBuilder(requestBuilder.deactivateUser());\r\n };\r\n\r\n const onPasswordResetToggle = (required: boolean) => {\r\n if (required) {\r\n setPasswordReset(true);\r\n setRequestBuilder(requestBuilder.requirePasswordReset());\r\n } else {\r\n setPasswordReset(false);\r\n setRequestBuilder(requestBuilder.passwordResetNotNeeded());\r\n }\r\n };\r\n\r\n const modifyUser = async (onSaveComplete: () => void) => {\r\n if (!userOrg) {\r\n return;\r\n }\r\n\r\n if (editing) {\r\n setRequestBuilder(requestBuilder.withEditingUserConfigured());\r\n }\r\n\r\n setRequestBuilder(requestBuilder.userHasName(firstName!, lastName!, middleName));\r\n setRequestBuilder(requestBuilder.onTeams(assignedTeams));\r\n\r\n const request = requestBuilder.build();\r\n\r\n const updateOrgRequest = new UpdateOrganizationRequest(userOrg);\r\n\r\n if (editing) {\r\n updateOrgRequest.editUser(request);\r\n updateOrgRequest.editedUser!.id = user!.id;\r\n } else {\r\n updateOrgRequest.addNewUser(request);\r\n }\r\n\r\n const orgService = new OrganizationService();\r\n const updateResponse = await orgService.updateOrg(updateOrgRequest);\r\n\r\n updateResponse.successful((responseData: Organization) => {\r\n if (editing) {\r\n for (let user of responseData.users) {\r\n if (user.id === request.id) {\r\n onUserChanged(user);\r\n break;\r\n }\r\n }\r\n } else {\r\n var search = request.useEmailForUsername ? request.emailAddress : request.username!;\r\n //find the updated user and callback with it\r\n for (let user of responseData.users) {\r\n if (user.username === search) {\r\n onUserChanged(user);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n onSaveComplete();\r\n });\r\n\r\n updateResponse.failure(() => {\r\n const addedErrors: string[] = [];\r\n\r\n for (let message of updateResponse.errorMessages()) {\r\n addedErrors.push(message);\r\n }\r\n\r\n setErrors([...errors, ...addedErrors]);\r\n });\r\n };\r\n\r\n const clearForm = () => {\r\n setFirstName(\"\");\r\n setLastName(\"\");\r\n setMiddleName(\"\");\r\n setNamePrefix(\"\");\r\n setNameSuffix(\"\");\r\n setEmail(\"\");\r\n setPhoneNumber(\"\");\r\n\r\n setShowUsername(true);\r\n setUsername(\"\");\r\n setPassword(\"\");\r\n setPasswordConfirmation(\"\");\r\n setPasswordReset(undefined);\r\n setUserActive(true);\r\n\r\n setAssignedPermGroup(\"\");\r\n setAssignedTeams([]);\r\n setAvailableTeams(userOrg.teams);\r\n\r\n setRequestBuilder(new ChangeUserRequestBuilder());\r\n };\r\n\r\n const clearMessages = () => {\r\n setErrors([]);\r\n setSuccessMessages([]);\r\n };\r\n\r\n const saveUser = async () => {\r\n //this method is called when the Save User button is clicked, so we want to close the form, which is why\r\n //we pass the onCancel function to modifyUser.\r\n await modifyUser(() => {\r\n clearForm();\r\n clearMessages();\r\n onCancel();\r\n });\r\n };\r\n\r\n const saveUserAndAddMore = async () => {\r\n //this function is called when the Save and Add Another button is clicked; we don't want to do anything\r\n //with the display of the form since the user wants to add another user.\r\n\r\n await modifyUser(() => {\r\n const successMessage = `${firstName} ${lastName} was added`;\r\n setSuccessMessages([...successMessages, successMessage]);\r\n clearForm();\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n

{editing ? userDisplayName : \"Add New User\"}

\r\n \r\n \r\n \r\n {!!!editing ? (\r\n \r\n ) : null}\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n {\r\n \r\n }\r\n \r\n \r\n onPrefixChange(prefixChosen)}\r\n onSuffixSelected={(suffixChosen) => onSuffixChange(suffixChosen)}\r\n onFirstNameChange={(firstName) => onFirstNameChange(firstName)}\r\n onMiddleNameChange={(middleName) => onMiddleNameChange(middleName)}\r\n onLastNameChange={(lastName) => onLastNameChange(lastName)}\r\n onEmailAddressChange={(emailAddress) => onEmailAddressChange(emailAddress)}\r\n onPhoneNumberChange={(phoneNumber) => onPhoneNumberChange(phoneNumber)}\r\n />\r\n \r\n \r\n \r\n \r\n onPasswordChange(password)}\r\n onPasswordConfirmationChange={(passwordConfirmation) =>\r\n onPasswordConfirmationChange(passwordConfirmation)\r\n }\r\n onUsernameChange={(username) => onUsernameChange(username)}\r\n showUsernameField={showUsername}\r\n editMode={editing}\r\n notifyUsernameOptional={() => configureEmailAsUsername()}\r\n notifyUsernameNeeded={() => requireUsername()}\r\n notifyUserActive={() => activateUser()}\r\n notifyUserInactive={() => deactivateUser()}\r\n username={username}\r\n userActive={userActive}\r\n password={password}\r\n passwordConfirmation={passwordConfirmation}\r\n resetRequired={passwordResetRequired ?? false}\r\n notifyPasswordReset={(resetNeeded) => onPasswordResetToggle(resetNeeded)}\r\n />\r\n \r\n \r\n \r\n \r\n onTeamAssignmentsChange(teams)}\r\n onPermissionGroupChosen={(permissionGroup) => onPermissionGroupAssigned(permissionGroup)}\r\n onTeamsAvailableChange={(availableTeams) => onTeamsAvailableChange(availableTeams)}\r\n />\r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Button, Col, Row, Spinner } from \"reactstrap\";\r\nimport { Person } from \"../../Person\";\r\nimport { Column, RowPropGetter } from \"react-table\";\r\nimport { ImageTrendTable } from \"../Common/ImageTrendTable\";\r\nimport OrganizationService from \"../../organization/OrganizationService\";\r\nimport { DisplayUsersPermission } from \"../../security/Permission/DisplayUsersPermission\";\r\nimport { SecuredPersonService } from \"../../services/SecuredPersonService\";\r\nimport { SecuredComponent } from \"../SecuredComponent\";\r\nimport { NotGranted } from \"../../security/Permission/NotGranted\";\r\nimport { RoleRetriever } from \"../../security/RoleRetriever\";\r\nimport { EditUser } from \"./EditUser\";\r\nimport { OrgUser } from \"../../organization/OrgUser\";\r\nimport { Organization } from \"../../Organization\";\r\nimport { RenderPermission } from \"../../security/Permission/RenderPermission\";\r\n\r\nexport const Users = () => {\r\n let orgService = new OrganizationService();\r\n\r\n let nameColumn: Column = {\r\n Header: \"Last Name\",\r\n accessor: \"lastName\",\r\n };\r\n\r\n let columns = [\r\n nameColumn,\r\n {\r\n Header: \"First Name\",\r\n accessor: \"firstName\",\r\n } as Column,\r\n {\r\n Header: \"Teams\",\r\n accessor: \"flatTeams\",\r\n } as Column,\r\n {\r\n Header: \"Permission Group\",\r\n accessor: \"flatPermissionGroups\",\r\n } as Column,\r\n {\r\n Header: \"Status\",\r\n accessor: \"status\",\r\n } as Column,\r\n {\r\n Header: \"Last Login\",\r\n accessor: \"lastLogin\",\r\n } as Column,\r\n ];\r\n\r\n const [orgUsers, setOrgUsers] = useState(new Array());\r\n const [usersPermission, setUsersPermission] = useState(new RenderPermission(new NotGranted()));\r\n const [renderComplete, setRenderComplete] = useState(false);\r\n const [userClicked, setUserClicked] = useState({} as Person);\r\n const [displayUsers, setDisplayUsers] = useState(true);\r\n const [org, setOrg] = useState(Organization.default);\r\n const [addUser, setAddUser] = useState(false);\r\n const [editUser, setEditUser] = useState(false);\r\n\r\n useEffect(() => {\r\n let mounted = true;\r\n usersPermission.disableRendering();\r\n\r\n const retrievePermissions = async () => {\r\n if (mounted) {\r\n let roleRetriever = new RoleRetriever(new SecuredPersonService());\r\n let roleClaim = await roleRetriever.ofLoggedInUser();\r\n\r\n let allowedToViewUsers = new RenderPermission(new DisplayUsersPermission(roleClaim)).enableRendering();\r\n\r\n setUsersPermission(allowedToViewUsers);\r\n }\r\n };\r\n\r\n retrievePermissions();\r\n\r\n return () => {\r\n mounted = false;\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n useEffect(() => {\r\n setRenderComplete(false);\r\n\r\n const retrieveUsers = async () => {\r\n setRenderComplete(false);\r\n\r\n let fetchOrgResponse = await orgService.buildOrganizationTree();\r\n\r\n fetchOrgResponse.successful((orgTree) => {\r\n orgTree.getRoot().visit((visitingOrg) => {\r\n setOrg(visitingOrg);\r\n setOrgUsers(sortUsers(visitingOrg.users));\r\n });\r\n });\r\n };\r\n\r\n usersPermission.granted(async () => {\r\n await retrieveUsers();\r\n setRenderComplete(true);\r\n });\r\n\r\n usersPermission.denied(() => setRenderComplete(true));\r\n }, [usersPermission]);\r\n\r\n const onUserClicked = (user: Person) => {\r\n setDisplayUsers(false);\r\n setEditUser(true);\r\n setUserClicked(user);\r\n };\r\n\r\n const onAddUser = () => {\r\n setAddUser(true);\r\n setDisplayUsers(false);\r\n };\r\n\r\n const onUserEdited = (user: OrgUser) => {\r\n let updatedOrgUsers: OrgUser[] = [];\r\n for (let userIndex = 0; userIndex < orgUsers.length; userIndex++) {\r\n let currentUser = orgUsers[userIndex];\r\n\r\n if (currentUser.id !== user.id) {\r\n updatedOrgUsers.push(currentUser);\r\n } else {\r\n updatedOrgUsers.push(user);\r\n }\r\n }\r\n\r\n setOrgUsers(sortUsers(updatedOrgUsers));\r\n setOrg(org.updateUser(user));\r\n };\r\n\r\n const onUserAdded = (user: OrgUser) => {\r\n setOrgUsers(sortUsers([...orgUsers, user]));\r\n setOrg(org.addUser(user));\r\n };\r\n\r\n const closeUserModification = () => {\r\n setAddUser(false);\r\n setEditUser(false);\r\n setDisplayUsers(true);\r\n };\r\n\r\n const sortUsers = (orgUsers: OrgUser[]) => {\r\n return orgUsers.sort((a, b) => {\r\n if (a.lastName === b.lastName) {\r\n return 0;\r\n }\r\n\r\n return a.lastName < b.lastName ? -1 : 1;\r\n });\r\n };\r\n\r\n const imageTrendTable = () => {\r\n return orgUsers.length > 0 ? (\r\n <>\r\n {displayUsers ? (\r\n <>\r\n \r\n \r\n

Users

\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n renderableData={orgUsers}\r\n headers={columns}\r\n rowProps={(row: Person) =>\r\n ({\r\n className: \"clickable\",\r\n onClick: () => onUserClicked(row),\r\n } as RowPropGetter)\r\n }\r\n />\r\n \r\n \r\n \r\n ) : null}\r\n \r\n \r\n {editUser ? (\r\n \r\n \r\n onUserEdited(user)}\r\n onCancel={() => closeUserModification()}\r\n />\r\n \r\n \r\n ) : null}\r\n {addUser ? (\r\n \r\n \r\n onUserAdded(user)}\r\n onCancel={() => closeUserModification()}\r\n />\r\n \r\n \r\n ) : null}\r\n \r\n \r\n \r\n ) : null;\r\n };\r\n\r\n return (\r\n <>\r\n {renderComplete ? (\r\n {imageTrendTable()}\r\n ) : (\r\n \r\n \r\n Loading Users...\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React, { PropsWithChildren } from 'react';\r\nimport { AuthContext, defaultAuthContextProvider } from './AuthContext';\r\n\r\nconst AuthContextProvider = ({children}: PropsWithChildren<{}>) => {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport default AuthContextProvider;","import { CallResponse } from \"./CallResponse\";\r\nimport CallLog from 'callCenter/CallLog';\r\nimport { DateTime } from \"luxon\";\r\nimport { CallNotification } from \"telehealth-abstractions\";\r\n\r\nexport default class CallMappers {\r\n callLogFrom(callResponse: CallResponse): CallLog {\r\n let recipient = callResponse.recipientTeam ?? callResponse.recipient ?? \"Unknown Caller\";\r\n\r\n let callLog = new CallLog(callResponse.callId,\r\n callResponse.caller, \r\n callResponse.callerAgency, \r\n recipient,\r\n callResponse.dateReceived ? DateTime.fromISO(callResponse.dateReceived) : DateTime.now(), \r\n callResponse.callerUnitNumber);\r\n\r\n if(callResponse.answeredBy) {\r\n callLog.answer(callResponse.answeredBy)\r\n }\r\n\r\n callLog.inRoom(callResponse.roomId)\r\n\r\n return callLog;\r\n }\r\n\r\n callLogFromNotification(ofCall: CallNotification, toRecipient?: string) {\r\n const callLog = new CallLog(ofCall.CallId, \r\n ofCall.From ?? 'Unknown Caller',\r\n ofCall.AgencyName ?? \"\", \r\n toRecipient ?? 'Unknown Recipient', \r\n DateTime.now(), \r\n ofCall.UnitNumber ? parseInt(ofCall.UnitNumber) : undefined);\r\n\r\n if(ofCall.RoomId) {\r\n callLog.inRoom(ofCall.RoomId);\r\n }\r\n \r\n return callLog;\r\n }\r\n}","export class Strings {\r\n\tstatic readonly defaultErrorMessage = \"Uh-oh, an unexpected error occurred within the system. The issue has been logged and will be reviewed by our team. If you would like, you can create a support ticket for this issues\";\r\n\tstatic readonly call = {\r\n\t\t'Answered': 'Answered',\r\n\t\t'NotAnswered': 'Not Answered'\r\n\t}\r\n}","import { FontAwesome } from 'components/Common/FontAwesome';\r\nimport React, { HTMLAttributes, PropsWithChildren } from 'react';\r\nimport './AnswerCallButton.scss';\r\n\r\nexport interface AnswerCallButtonProps extends HTMLAttributes<{}> {\r\n onClick: () => Promise;\r\n}\r\n\r\nexport const AnswerCallButton = ({children, className, onClick, title}: PropsWithChildren) => {\r\n return (\r\n
await onClick()} title={title}>\r\n \r\n { children }\r\n
\r\n )\r\n}","import { FontAwesome } from 'components/Common/FontAwesome';\r\nimport React, { HTMLAttributes, PropsWithChildren } from 'react';\r\nimport './DeclineCallButton.scss';\r\n\r\nexport interface DeclineCallButtonProps extends HTMLAttributes<{}> {\r\n onClick: () => Promise;\r\n}\r\n\r\nexport const DeclineCallButton = ({children, className, onClick, title}: PropsWithChildren) => {\r\n return (\r\n
await onClick()} title={title}>\r\n \r\n { children }\r\n
\r\n )\r\n}","import React from 'react';\r\nimport { Col, Row, Spinner } from 'reactstrap';\r\n\r\ninterface LoadingIndicatorProps {\r\n loadingMessage?: string;\r\n}\r\n\r\nexport const LoadingIndicator = ({loadingMessage}: LoadingIndicatorProps) => {\r\n return (\r\n \r\n \r\n \r\n {loadingMessage ?? 'Loading...'}\r\n \r\n \r\n \r\n )\r\n}","import { IPermission } from \"../IPermission\";\r\n\r\nexport class Granted implements IPermission {\r\n\tgranted(onGranted: () => void) {\r\n\t\tif(!!!onGranted) {\r\n\t\t\tthrow new Error(\"onGranted callback was not provided\");\r\n\t\t}\r\n\r\n\t\tonGranted();\r\n\t}\r\n\r\n\tasync grantedAsync(onGrantedAsync: () => Promise) {\r\n\t\tif(!onGrantedAsync) {\r\n\t\t\tthrow new Error(\"onGrantedAsync callback was not provided\");\r\n\t\t}\r\n\r\n\t\tawait onGrantedAsync();\r\n\t}\r\n\r\n\tdenied(onDenied: () => void) {\r\n\t}\r\n\r\n\tdeniedAsync(onDenialAsync: () => Promise) {\r\n\t\treturn Promise.resolve();\r\n\t}\r\n}","import { ApiUrl } from \"ApiConstants\";\r\nimport CallLog, { CallLogRow } from \"callCenter/CallLog\";\r\nimport { ApiRequest } from \"common/ApiRequest\";\r\nimport { ApiResponseHandler } from \"common/ApiResponseHandler\";\r\nimport CallMappers from \"common/CallMappers\";\r\nimport { CallResponse } from \"common/CallResponse\";\r\nimport { Messages, MessageSubscription } from \"common/Messaging\";\r\nimport DeclinedCallLog from \"common/messaging/DeclinedCallLog\";\r\nimport { Strings } from \"common/Strings\";\r\nimport { AnswerCallButton } from \"components/CallCenter/AnswerCallButton\";\r\nimport { DeclineCallButton } from \"components/CallCenter/DeclineCallButton\";\r\nimport { ImageTrendTable, ImageTrendTableHeader } from \"components/Common/ImageTrendTable\";\r\nimport { LoadingIndicator } from \"components/Common/LoadingIndicator\";\r\nimport { SecuredComponent } from \"components/SecuredComponent\";\r\nimport { statusService } from \"components/SignalR/StatusService\";\r\nimport React, { useContext, useEffect, useState } from \"react\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport { Column } from \"react-table\";\r\nimport { Granted } from \"security/Permission/Granted\";\r\nimport { RenderPermission } from \"security/Permission/RenderPermission\";\r\nimport { CallAnsweredNotification, CallEndedNotification, CallNotification } from \"telehealth-abstractions\";\r\nimport { CallService, HubStatusMethod } from \"telehealth-api\";\r\nimport MessagingContext from \"common/messaging/MessagingContext\";\r\n\r\nexport interface ActiveCallProps extends RouteComponentProps {\r\n callService: CallService;\r\n}\r\n\r\nexport const ActiveCalls = ({ history, callService }: ActiveCallProps) => {\r\n const [activeCalls, setActiveCalls] = useState([]);\r\n const [callDeclined, setDeclinedCall] = useState();\r\n const [callsRetrieved, setCallsRetrieved] = useState(false);\r\n const [removeActiveCallId, setRemoveActiveCallId] = useState();\r\n const [viewCallsPermission, setViewPermission] = useState(new RenderPermission(new Granted()));\r\n const messagePublisher = useContext(MessagingContext);\r\n\r\n useEffect(() => {\r\n let isMounted = true;\r\n const retrieveCalls = async () => {\r\n let callsRequest = new ApiRequest();\r\n\r\n let callsResponse = await callsRequest.send(ApiUrl.CallUrl);\r\n\r\n const callHandler = new ApiResponseHandler, CallResponse[]>();\r\n const callMapper = new CallMappers();\r\n let callHandling = await callHandler.handle(\r\n callsResponse,\r\n (callsResponses) =>\r\n callsResponses\r\n .filter((cr) => !cr.endDate)\r\n .filter((cr) => !cr.declinedByMe)\r\n .map((cr) => callMapper.callLogFrom(cr).toCallLogRow()),\r\n () => []\r\n );\r\n\r\n callHandling.successful((calls) => {\r\n if (isMounted) {\r\n setActiveCalls(Array.from(calls).filter((call) => call.answeredState === Strings.call.NotAnswered));\r\n\r\n const grantedPermission = new RenderPermission(new Granted());\r\n setViewPermission(grantedPermission.enableRendering());\r\n setCallsRetrieved(true);\r\n }\r\n });\r\n };\r\n\r\n retrieveCalls();\r\n\r\n return () => {\r\n isMounted = false;\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n let subscriptions: number[] = [];\r\n let clientSubscriptions: MessageSubscription[] = [];\r\n const callMapper = new CallMappers();\r\n\r\n const updateActiveCalls = (incomingCall: CallLogRow) => {\r\n setActiveCalls([incomingCall, ...activeCalls]);\r\n };\r\n\r\n const listenForIncomingCalls = async () => {\r\n let subscription = statusService.subscribe(async (incomingCall: CallNotification) => {\r\n const callRequest = new ApiRequest();\r\n let callLookupResponse = await callRequest.get(incomingCall.CallId.toString(), ApiUrl.CallUrl);\r\n\r\n //lookup the call to get needed call information like the recpient\r\n const callLookupHandler = new ApiResponseHandler();\r\n\r\n let callLogResponse = await callLookupHandler.handle(\r\n callLookupResponse,\r\n (cr) =>\r\n callMapper\r\n .callLogFromNotification(incomingCall, cr.recipient ?? cr.recipientTeam ?? undefined)\r\n .toCallLogRow(),\r\n () => callMapper.callLogFromNotification(incomingCall).toCallLogRow()\r\n );\r\n\r\n let callLogRow = callLogResponse.item;\r\n callLogResponse.successful((clr) => (callLogRow.recentlyReceived = true));\r\n\r\n updateActiveCalls(callLogRow);\r\n }, HubStatusMethod.IncomingCall);\r\n\r\n subscriptions.push(subscription);\r\n };\r\n\r\n const listenForAnsweredCalls = () => {\r\n //call can be answered from the toast message or this table, listen for answered calls and remove it from the table if needed\r\n let answeredSub = statusService.subscribe((answeredCall: CallAnsweredNotification) => {\r\n setRemoveActiveCallId(answeredCall.CallId);\r\n }, HubStatusMethod.CallAnswered);\r\n\r\n subscriptions.push(answeredSub);\r\n };\r\n\r\n //Remove any calls that get end via a participant ending a call\r\n const listenForEndedCalls = () => {\r\n let sub = statusService.subscribe((endedCall: CallEndedNotification) => {\r\n setRemoveActiveCallId(endedCall.CallId);\r\n }, HubStatusMethod.CallEnded);\r\n\r\n subscriptions.push(sub);\r\n\r\n //listen to calls ignored, not declined, from a toast notification\r\n let clientSub = messagePublisher.subscribeTo(Messages.userDeclinedCall(), (message: DeclinedCallLog) => {\r\n setRemoveActiveCallId(message.declinedCallLog.callId);\r\n });\r\n\r\n clientSubscriptions.push(clientSub);\r\n };\r\n\r\n listenForIncomingCalls();\r\n listenForAnsweredCalls();\r\n listenForEndedCalls();\r\n\r\n return () => {\r\n for (let sub of subscriptions) {\r\n statusService.unsubscribe(sub);\r\n }\r\n\r\n subscriptions = [];\r\n\r\n for (let clientSub of clientSubscriptions) {\r\n messagePublisher.unsubscribeFrom(clientSub);\r\n }\r\n\r\n clientSubscriptions = [];\r\n };\r\n }, [activeCalls, messagePublisher]);\r\n\r\n //Remove the call specified by removeActiveCall from the active calls table\r\n useEffect(() => {\r\n if (!removeActiveCallId) {\r\n return;\r\n }\r\n\r\n const callIndex = activeCalls.findIndex((activeCall) => activeCall.callId === removeActiveCallId);\r\n\r\n if (callIndex > -1) {\r\n let activeCallsCopy = [...activeCalls];\r\n const removedItems = activeCallsCopy.splice(callIndex, 1);\r\n\r\n setRemoveActiveCallId(undefined);\r\n setActiveCalls(activeCallsCopy);\r\n }\r\n }, [activeCalls, removeActiveCallId]);\r\n\r\n //Move Declined call to past calls table\r\n useEffect(() => {\r\n if (!callDeclined) {\r\n return;\r\n }\r\n\r\n messagePublisher.publish(Messages.userDeclinedCall(), new DeclinedCallLog(callDeclined));\r\n }, [callDeclined, messagePublisher]);\r\n\r\n const answerCall = async (call: CallLog) => {\r\n let answeredResponse = await callService.answerCall({\r\n callId: call.callId,\r\n });\r\n\r\n if (answeredResponse.answered) {\r\n history.push(`/room?roomId=${call.room}`);\r\n statusService.disableCallNotifications();\r\n }\r\n };\r\n\r\n const declineCall = async (call: CallLog) => {\r\n await callService.declineCall({\r\n callId: call.callId,\r\n });\r\n\r\n setRemoveActiveCallId(call.callId);\r\n setDeclinedCall(call);\r\n };\r\n\r\n const activeCallsColumns: Column[] = [\r\n new ImageTrendTableHeader(\r\n \"Date Received\",\r\n (callLog) => callLog.callReceivedDateOnlyFormatted,\r\n \"active-call-received-date\"\r\n ) as Column,\r\n new ImageTrendTableHeader(\r\n \"Start Time\",\r\n (callLog) => callLog.callReceivedTimeOnlyFormatted,\r\n \"active-call-received-time\"\r\n ) as Column,\r\n new ImageTrendTableHeader(\r\n \"Recipient\",\r\n (callLog) => callLog.recipient,\r\n \"active-call-to\"\r\n ) as Column,\r\n new ImageTrendTableHeader(\r\n \"Caller\",\r\n (callLog) => callLog.displayCaller(),\r\n \"active-call-from\"\r\n ) as Column,\r\n new ImageTrendTableHeader(\r\n \"\",\r\n (callLog) => {\r\n return (\r\n <>\r\n answerCall(callLog)}\r\n aria-role=\"button\"\r\n title={`Answer call from ${callLog.displayCaller()}`}\r\n />\r\n answerCall(callLog)}\r\n aria-role=\"button\"\r\n title={`Answer call from ${callLog.displayCaller()}`}\r\n >\r\n Answer\r\n \r\n declineCall(callLog)}\r\n aria-role=\"button\"\r\n title={`Decline call from ${callLog.displayCaller()}`}\r\n />\r\n \r\n );\r\n },\r\n \"answer-call\"\r\n ) as Column,\r\n ];\r\n\r\n return (\r\n <>\r\n {!callsRetrieved && }\r\n {callsRetrieved && (\r\n \r\n {\r\n if (row.recentlyReceived) {\r\n return { className: \"new-row\" };\r\n }\r\n\r\n return { className: \"\" };\r\n }}\r\n />\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import CallLog from \"callCenter/CallLog\";\r\nimport { ApiRequest } from \"common/ApiRequest\";\r\nimport { ApiResponseHandler } from \"common/ApiResponseHandler\";\r\nimport { Messages, MessageSubscription } from \"common/Messaging\";\r\nimport { ImageTrendTable, ImageTrendTableHeader } from \"components/Common/ImageTrendTable\";\r\nimport { SecuredComponent } from \"components/SecuredComponent\";\r\nimport { DateTime } from \"luxon\";\r\nimport React, { useContext, useEffect, useRef, useState } from \"react\";\r\nimport { Column } from \"react-table\";\r\nimport { Granted } from \"security/Permission/Granted\";\r\nimport { RenderPermission } from \"security/Permission/RenderPermission\";\r\nimport { CallResponse } from \"common/CallResponse\";\r\nimport DeclinedCallLog from \"common/messaging/DeclinedCallLog\";\r\nimport { LoadingIndicator } from \"components/Common/LoadingIndicator\";\r\nimport MessagingContext from \"common/messaging/MessagingContext\";\r\n\r\nexport const CallHistory = () => {\r\n const [callHistoryRetreived, setCallHistoryRetrieved] = useState(false);\r\n const [priorCalls, setCallHistory] = useState([]);\r\n const [viewCallsPermission, setViewPermission] = useState(new RenderPermission(new Granted()));\r\n const messagingContext = useContext(MessagingContext);\r\n\r\n let messageSubs = useRef([] as MessageSubscription[]);\r\n\r\n useEffect(() => {\r\n const retrieveCalls = async () => {\r\n let callHistoryRequest = new ApiRequest();\r\n\r\n var callTask = callHistoryRequest.send(\"/api/v1/call\");\r\n\r\n var responseHandler = new ApiResponseHandler, CallResponse[]>();\r\n\r\n const callsResponse = await responseHandler.handle(\r\n await callTask,\r\n (calls) => {\r\n const sortByReceivedDate = (calls: CallResponse[]) => {\r\n return calls.sort((a, b) => {\r\n if (!a.dateReceived && !b.dateReceived) {\r\n return 0;\r\n }\r\n\r\n if (!b.dateReceived) {\r\n return -1;\r\n }\r\n\r\n if (!a.dateReceived) {\r\n return 1;\r\n }\r\n\r\n const firstDate = DateTime.fromISO(a.dateReceived);\r\n const secondDate = DateTime.fromISO(b.dateReceived);\r\n\r\n if (firstDate < secondDate) {\r\n return -1;\r\n }\r\n\r\n if (firstDate > secondDate) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n });\r\n };\r\n\r\n const recentCalls = sortByReceivedDate(calls).reverse().slice(0, 14);\r\n\r\n const callLog: Array = [];\r\n let filteredCalls = recentCalls.filter((c) => c.endDate !== null || c.declinedByMe);\r\n for (let call of filteredCalls) {\r\n let recipient = call.recipientTeam ?? call.recipient ?? \"\";\r\n\r\n if (call.recipientTeam && call.answeredBy) {\r\n recipient = recipient.concat(` (${call.answeredBy})`);\r\n }\r\n\r\n let log = new CallLog(\r\n call.callId,\r\n call.caller,\r\n call.callerAgency,\r\n recipient,\r\n DateTime.fromISO(call.dateReceived!),\r\n call.callerUnitNumber\r\n );\r\n\r\n if (call.answeredBy) {\r\n log.answer(call.answeredBy);\r\n }\r\n\r\n callLog.push(log);\r\n }\r\n\r\n return callLog;\r\n },\r\n () => []\r\n );\r\n\r\n callsResponse.successful((callHistory) => {\r\n setCallHistory(Array.from(callHistory));\r\n\r\n const grantedPermission = new RenderPermission(new Granted());\r\n setViewPermission(grantedPermission.enableRendering());\r\n setCallHistoryRetrieved(true);\r\n });\r\n };\r\n\r\n retrieveCalls();\r\n }, []);\r\n\r\n useEffect(() => {\r\n let declinedMessage = Messages.userDeclinedCall();\r\n let sub = messagingContext.subscribeTo(declinedMessage, (msg: DeclinedCallLog) => {\r\n setCallHistory([msg.declinedCallLog, ...priorCalls]);\r\n });\r\n\r\n messageSubs.current.push(sub);\r\n\r\n return () => {\r\n for (let messageSub of messageSubs.current) {\r\n messagingContext.unsubscribeFrom(messageSub);\r\n }\r\n\r\n messageSubs.current = [];\r\n };\r\n }, [priorCalls, setCallHistory, messageSubs, messagingContext]);\r\n\r\n const callHistoryColumns: Column[] = [\r\n new ImageTrendTableHeader(\r\n \"Date Received\",\r\n (callLog) => callLog.callReceivedDateOnlyFormatted\r\n ) as Column,\r\n new ImageTrendTableHeader(\r\n \"Start Time\",\r\n (callLog) => callLog.callReceivedTimeOnlyFormatted\r\n ) as Column,\r\n new ImageTrendTableHeader(\"Status\", (callLog) => callLog.answeredState) as Column,\r\n new ImageTrendTableHeader(\"Recipient (Answered by)\", (callLog) => callLog.recipient) as Column,\r\n new ImageTrendTableHeader(\"Caller\", (callLog) => callLog.displayCaller()) as Column,\r\n ];\r\n\r\n return (\r\n <>\r\n {!callHistoryRetreived && }\r\n {callHistoryRetreived && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { SettingRequestPayload } from \"common/SettingRequestPayload\";\r\nimport { DeleteUserCallSmsNotificationSetting, UserCallNotificationSetting, UserCallSmsNotificationSetting } from \"common/settings/UserCallNotificationSetting\";\r\n\r\nexport class ApiRequestFactories {\r\n\tstatic createSettingRequest(system: string, category: string, action: string, value: string | boolean, name: string, subSystem?: string) {\r\n\t\treturn new SettingRequestPayload(system, category, action ,value, name, subSystem);\r\n\t}\r\n\r\n\tstatic createUserIncomingCallSettingRequest(value: string | boolean) {\r\n\t\treturn new UserCallNotificationSetting(value);\r\n\t}\r\n\r\n\tstatic createUserIncomingCallSmsSetting(value: string) {\r\n\t\treturn new UserCallSmsNotificationSetting(value);\r\n\t}\r\n\r\n\tstatic createDeleteUserIncomingCallSmsSetting() {\r\n\t\treturn new DeleteUserCallSmsNotificationSetting();\r\n\t}\r\n}\r\n","export default class PhoneNumber {\r\n private _formatter: PhoneNumberPart;\r\n\r\n constructor(formatters: Iterable) {\r\n this._formatter = new PhoneNumberParts(formatters);\r\n }\r\n\r\n format(unformatted?: string) {\r\n if(!unformatted) {\r\n return undefined;\r\n }\r\n\r\n const formatted = this._formatter.format(unformatted);\r\n \r\n return formatted;\r\n }\r\n\r\n static createWithDefaultFormatters() {\r\n return new PhoneNumber([\r\n new AreaCodeParenthesis(), \r\n new PhoneNumberHyphenizer()\r\n ])\r\n }\r\n}\r\n\r\nexport interface PhoneNumberPart {\r\n format: (phoneNumber: string) => string | undefined;\r\n}\r\n\r\nclass AreaCodeParenthesis implements PhoneNumberPart {\r\n format(phoneNumber?: string) {\r\n if(!phoneNumber) {\r\n return phoneNumber;\r\n }\r\n\r\n let numberDigitsMatch = phoneNumber.match(/\\d+/g);\r\n\r\n //ensure we have numbers\r\n if((numberDigitsMatch?.length ?? 0) === 0) {\r\n return phoneNumber;\r\n }\r\n\r\n const parensRegex = /^(?\\(\\d{3}\\){0,1})\\s{0,1}(?.*)/;\r\n if(parensRegex.test(phoneNumber)) { \r\n //we're already formatted, pass on the number, but we may or may not have a space, so add it\r\n const parensMatch = phoneNumber.match(parensRegex)!;\r\n const areaCode = parensMatch.groups!.areaCode;\r\n const remaining = parensMatch.groups!.remaining;\r\n\r\n return !remaining ? areaCode : `${areaCode} ${parensMatch.groups!.remaining}`;\r\n }\r\n\r\n let trimmedNumber: string | undefined = undefined;\r\n for(let phoneNumberDigitGroup of numberDigitsMatch!) {\r\n if(!trimmedNumber) {\r\n trimmedNumber = phoneNumberDigitGroup;\r\n } else {\r\n trimmedNumber = trimmedNumber.concat(phoneNumberDigitGroup)\r\n }\r\n }\r\n\r\n //ensure we have at least 3 numbers\r\n if(trimmedNumber!.length < 3) {\r\n return phoneNumber;\r\n }\r\n\r\n\r\n const areaCode = trimmedNumber!.substring(0, 3);\r\n \r\n return `(${areaCode}) ${trimmedNumber!.substring(3)}`\r\n }\r\n}\r\n\r\nclass PhoneNumberHyphenizer implements PhoneNumberPart {\r\n format(phoneNumber?: string) {\r\n if(!phoneNumber) {\r\n return phoneNumber;\r\n }\r\n\r\n let numberDigitsMatch = phoneNumber.match(/\\d+/g);\r\n\r\n //ensure we have some numbers\r\n if(!numberDigitsMatch?.length) {\r\n return phoneNumber;\r\n }\r\n \r\n //match something that remotely resembles a phone number\r\n let fullNumber = phoneNumber.match(/^\\({0,1}(?[0-9]{3})\\){0,1}(?:-*|\\s*)(?[0-9]{1,3})(?-*|\\s*)(?[0-9]{0,4})$/); \r\n\r\n if(fullNumber?.groups) {\r\n const areaCode = fullNumber.groups.areacode;\r\n const prefix = fullNumber.groups.prefix;\r\n const numberHyphenated = fullNumber.groups.numberHyphen;\r\n const number = fullNumber.groups.number;\r\n\r\n if(prefix && number) {\r\n return `(${areaCode}) ${prefix}-${number}`;\r\n }\r\n\r\n if(prefix) {\r\n //if the user entered a hyphen, we should let it through\r\n return numberHyphenated ? `(${areaCode}) ${prefix}-` : `(${areaCode}) ${prefix}`;\r\n }\r\n\r\n return `(${areaCode})`;\r\n }\r\n\r\n return phoneNumber;\r\n }\r\n}\r\n\r\n\r\nclass PhoneNumberParts implements PhoneNumberParts {\r\n private _formatters: Iterable = [];\r\n\r\n constructor(formatters: Iterable){\r\n this._formatters = formatters;\r\n }\r\n\r\n format(phoneNumber?: string) {\r\n if(!phoneNumber) {\r\n return phoneNumber;\r\n }\r\n\r\n let formatted = phoneNumber;\r\n for(const formatter of this._formatters) {\r\n formatted = formatter.format(formatted) ?? formatted;\r\n }\r\n\r\n return formatted;\r\n }\r\n}","import React from 'react';\r\n\r\nexport const DefaultErrorMessage = () => {\r\n\treturn (\r\n\t\t\r\n\t\t\tUh-oh, an unexpected error occured within the system.The issue has been logged and will be reviewed by our team. If you would like, you can create a support ticket for this issue.\r\n\t\t\r\n\t)\r\n}","import { ApiUrl } from 'ApiConstants';\r\nimport { ApiRequest } from 'common/ApiRequest';\r\nimport { ApiRequestFactories } from 'common/ApiRequestFactories';\r\nimport { ApiResponse } from 'common/ApiResponse';\r\nimport { ApiResponseHandler } from 'common/ApiResponseHandler';\r\nimport PhoneNumber from 'common/PhoneNumber';\r\nimport { SettingRequestPayload } from 'common/SettingRequestPayload';\r\nimport SettingStrings from 'common/settings/SettingStrings';\r\nimport { EnabledUserCallNotificationSetting, UserCallNotificationSetting } from 'common/settings/UserCallNotificationSetting';\r\nimport { DefaultErrorMessage } from 'components/Common/DefaultErrorMessage';\r\nimport { ErrorMessages } from 'components/Common/ErrorMessages';\r\nimport { FontAwesome } from 'components/Common/FontAwesome';\r\nimport ImageTrendToggle from 'components/Common/ImageTrendToggle';\r\nimport React, { ReactNode, useContext, useEffect, useRef, useState } from 'react';\r\nimport { Button, Col, Modal, ModalBody, ModalFooter, ModalHeader, Row } from 'reactstrap';\r\nimport { Messages } from 'common/Messaging';\r\nimport MessagingContext from 'common/messaging/MessagingContext';\r\n\r\nimport './ConfigureCallSettings.scss';\r\n\r\nexport const ConfigureCallSettings = () => {\r\n\tconst [showModal, setShowModal] = useState(false);\r\n\tconst [playSound, setPlaySound] = useState();\r\n\tconst [sendSms, setSendSms] = useState();\r\n\tconst [settingsSuccessMsgs, setSettingsSuccessMsgs] = useState([]);\r\n\tconst [settingsErrors, setSettingsErrors] = useState([]);\r\n\tconst [smsNumber, setSmsNumber] = useState();\r\n\tconst messagingContext = useContext(MessagingContext);\r\n\r\n\tconst settingsHandlers: { [id: string]: (setting:UserCallNotificationSetting) => void} = {\r\n\t\t'User Incoming Call Notification': (setting: UserCallNotificationSetting) => populateAudioAlertSetting(setting),\r\n\t\t'User Incoming Call SMS Notification': (setting: UserCallNotificationSetting) => populateSmsAlertSetting(setting)\r\n\t}\r\n\r\n\tconst modifiedSettings = useRef([]);\r\n\r\n\tconst configureSettingsClicked = () => {\r\n\t\tsetShowModal(true);\r\n\t}\r\n\r\n\tconst toggleConfigurationModal = () => {\r\n\t\tsetShowModal(!setShowModal);\r\n\t}\r\n\r\n\tconst handlePlaySoundChange = (checked: boolean) => {\r\n\t\tsetPlaySound(checked);\r\n\r\n\t\tconst settingValue = checked ? \"yes\" : \"no\";\r\n\t\tconst payload = ApiRequestFactories.createUserIncomingCallSettingRequest(settingValue);\r\n\t\tconst audioAlertSettingIndex = modifiedSettings.current.findIndex(setting => setting.name === SettingStrings.userIncomingCallAudioNotification);\r\n\r\n\t\t//We have an existing audio alert\r\n\t\tif(audioAlertSettingIndex > -1)\t{\r\n\t\t\t//So replace it\r\n\t\t\tmodifiedSettings.current[audioAlertSettingIndex] = payload;\r\n\t\t} else {\r\n\t\t\t//Add the audio alert setting to the persist queue\r\n\t\t\tmodifiedSettings.current.push(payload);\r\n\t\t}\r\n\t}\r\n\t\r\n\tconst handleSendSmsSettingChange = (sendSms: boolean) => {\r\n\t\tsetSendSms(sendSms);\r\n\t\tif (!sendSms) {\r\n\t\t\t// clear out the phone number if we disable sending via sms\r\n\t\t\t// this will also mark the sms setting to be deleted when we save\r\n\t\t\thandleSmsNumberChange(undefined);\r\n\t}\r\n\t}\r\n\r\n\tconst handleSmsNumberChange = (alertSmsNumber?: string) => {\r\n\t\tconst formattedPhone = PhoneNumber.createWithDefaultFormatters().format(alertSmsNumber);\r\n\t\tsetSmsNumber(formattedPhone);\r\n\r\n\t\tconst smsSettingIndex = modifiedSettings.current.findIndex(setting => setting.name === SettingStrings.userIncomingCallSmsNotification);\r\n\t\t\r\n\t\tif(!formattedPhone) {\r\n\t\t\tlet modifiedSmsSetting = ApiRequestFactories.createDeleteUserIncomingCallSmsSetting();\r\n\t\t\t//remove the sms settings from the settings array if it's currently in it\r\n\t\t\tif(smsSettingIndex > -1) {\r\n\t\t\t\tmodifiedSettings.current.splice(smsSettingIndex, 1);\r\n\t\t\t}\r\n\t\t\tmodifiedSettings.current.push(modifiedSmsSetting);\r\n\t\t} else {\r\n\t\t\tlet modifiedSmsSetting = ApiRequestFactories.createUserIncomingCallSmsSetting(formattedPhone);\r\n\r\n\t\t\tif(!sendSms) {\r\n\t\t\t\tmodifiedSmsSetting = modifiedSmsSetting.delete();\r\n\t\t\t}\r\n\r\n\t\t\tmodifiedSettings.current[smsSettingIndex] = modifiedSmsSetting;\r\n\t\t\t//an existing sms setting exists\r\n\t\t\tif(smsSettingIndex > -1) {\r\n\t\t\t\t//so replace it\r\n\t\t\t\tmodifiedSettings.current[smsSettingIndex] = modifiedSmsSetting;\t\t\t\r\n\t\t\t} else {\r\n\t\t\t\tmodifiedSettings.current.push(modifiedSmsSetting);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tconst saveSettingsAsync = async () => {\r\n\t\tsetSettingsErrors([]);\r\n\t\tsetSettingsSuccessMsgs([]);\r\n\r\n\t\tlet postSettingsResponse = await new ApiRequest().put(`${ApiUrl.SettingUrl}`, modifiedSettings.current);\r\n\t\tlet settingChangeResponse = await ApiResponse.create<{}, {}>(postSettingsResponse, () => {return {}}, () => {return {}});\r\n\t\t\r\n\t\tsettingChangeResponse.successful(response => {\r\n\t\t\tmessagingContext.publish(Messages.callAudioAlertChange(), playSound);\r\n\t\t\tsetShowModal(false);\r\n\t\t\t// clear the modified settings only if we successfully saved the settings\r\n\t\t\tmodifiedSettings.current = [];\r\n\t\t});\r\n\r\n\t\tsettingChangeResponse.failure(() => setSettingsErrors([...settingsErrors, ]));\r\n\t}\r\n\r\n\tuseEffect(() => {\r\n\t\tconst retrieveCallSettings = async () => {\r\n\t\t\tlet userAlertPreferenceRequest = new ApiRequest();\r\n\t\t\tlet callSettingsResponse = await userAlertPreferenceRequest.post(`${ApiUrl.SettingUrl}/user/search`, new EnabledUserCallNotificationSetting());\r\n\r\n\t\t\tlet userAlertResponseHandler = new ApiResponseHandler<{}, UserCallNotificationSetting[]>();\r\n\t\t\tawait userAlertResponseHandler.handle(callSettingsResponse, \r\n\t\t\t\t(responseJson) => {\r\n\t\t\t\t\tfor(const settingResponse of responseJson) {\r\n\t\t\t\t\t\tprocessSetting(settingResponse);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn {};\r\n\t\t\t\t},\r\n\t\t\t\t() => ({}));\r\n\t\t}\r\n\r\n\t\tretrieveCallSettings();\r\n\t}, []);\r\n\r\n\tconst populateAudioAlertSetting = (settingResponse: UserCallNotificationSetting) => {\r\n\t\tconst enableAudioAlert = settingResponse.value === 'yes' ? true : false;\r\n\t\tsetPlaySound(enableAudioAlert);\r\n\t}\r\n\r\n\tconst populateSmsAlertSetting = (settingResponse: UserCallNotificationSetting) => {\r\n\t\tif (settingResponse.value && settingResponse.value !== '') {\r\n\t\t\tsetSendSms(true);\r\n\t}\r\n\t\tsetSmsNumber(settingResponse.value as string);\r\n\t}\r\n\r\n\tconst processSetting = (setting: UserCallNotificationSetting) => {\r\n\t\tlet process = (callSetting: UserCallNotificationSetting) => {};\r\n\t\tif(settingsHandlers[setting.name]) {\r\n\t\t\tprocess = settingsHandlers[setting.name];\r\n\t\t}\r\n\r\n\t\tprocess(setting);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t toggleConfigurationModal()} size=\"lg\">\r\n\t\t\t\t toggleConfigurationModal()}>\r\n\t\t\t\t\tIncoming Call Notifications\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t{settingsErrors.some(() => true) && \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{settingsErrors}\r\n\t\t\t\t\t\t\r\n\t\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\tPlay sound for incoming calls\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t handlePlaySoundChange(checked)} checked={playSound ?? false} aria-labelledby=\"toggle-sound-text\" />\r\n\t\t\t\t\t\t\r\n\t\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\tSend me a text message for incoming calls\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t handleSendSmsSettingChange(checked)} checked={sendSms ?? false} />\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{sendSms && \r\n\t\t\t\t\t\t\t handleSmsNumberChange(e.target.value)} type=\"text\" value={smsNumber} />\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\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}","import React, { PropsWithChildren } from 'react';\r\nimport { Col, Row } from 'reactstrap';\r\n\r\nimport './Panel.scss'\r\n\r\nexport interface PanelProps extends PropsWithChildren<{}>{\r\n\tname?: string;\r\n\tinfoText?: string\r\n}\r\n\r\nexport const PanelInfo = ({name, infoText}: PanelProps) => {\r\n\treturn(\r\n\t\t\r\n\t\t\t\r\n\t\t\t{ name && \r\n\t\t\t\t
\r\n\t\t\t\t\t{name}\r\n\t\t\t\t
}\r\n\t\t\t{ infoText && \r\n\t\t\t\t

\r\n\t\t\t\t\t{infoText}\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 Panel = ({name, infoText, children}: PanelProps) => {\r\n\treturn(\r\n\t\t
\r\n\t\t\t{ (name || infoText) && \r\n\t\t\t }\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t{children}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
\r\n\t)\r\n}","import React, { PropsWithChildren } from \"react\";\r\nimport { Col, Row } from \"reactstrap\";\r\n\r\nexport interface UpperContentComponentProps\r\n\textends PropsWithChildren<{}> {\r\n\tpage: string;\r\n\t}\r\n\r\nexport const UpperContent = ({\r\n\tchildren,\r\n\tpage\r\n}: UpperContentComponentProps) => {\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t

{page}

\r\n\t\t\t\r\n\t\t\t{children && {children}}\r\n\t\t
\r\n\t);\r\n};\r\n","import React, { useContext, useEffect, useState } from 'react';\r\nimport { useHistory } from 'react-router'; \r\nimport { Button, Input, FormGroup, Label } from 'reactstrap';\r\nimport { Panel } from 'components/Common/Panel';\r\nimport { CallService } from 'telehealth-api';\r\nimport { AuthContext } from 'components/ApiAuthorization/AuthContext';\r\n\r\nexport const InviteCallParticipant = () => {\r\n\r\n const [destination, setDestination] = useState();\r\n const authContext = useContext(AuthContext);\r\n\r\n const history = useHistory();\r\n\r\n let callService: CallService = new CallService(authContext.provider);\r\n\r\n useEffect(() => {\r\n callService = new CallService(authContext.provider)\r\n }, [authContext, authContext.provider]);\r\n\r\n const onInputChange = (e: React.ChangeEvent) => {\r\n switch (e.target.id) {\r\n case 'callDestination':\r\n setDestination(e.target.value);\r\n break;\r\n }\r\n }\r\n\r\n const createCallAndInvite = async () => {\r\n if (!destination) {\r\n return;\r\n }\r\n\r\n const authToken = await authContext.provider.getAccessToken();\r\n\r\n if (!authToken) {\r\n return;\r\n }\r\n\r\n let inviteUserResponse = await fetch('/api/v1/call/user', {\r\n headers: {\r\n 'Authorization': `Bearer ${authToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({\r\n destination: destination,\r\n }),\r\n method: 'POST'\r\n });\r\n\r\n if(inviteUserResponse.ok && (inviteUserResponse.headers.get('Content-Type')?.indexOf('json') ?? -1) > -1) {\r\n var createdCall = await inviteUserResponse.json() as {roomId: string};\r\n //history.push(`/room?roomId=${createdCall.roomId}`);\r\n window.location.href = `${window.location.protocol}//${window.location.host}/room?roomId=${createdCall.roomId}`;\r\n }\r\n }\r\n\r\n return \r\n \r\n \r\n onInputChange(event)} />\r\n \r\n \r\n \r\n}","import { useContext } from 'react';\r\nimport { AuthContext } from './AuthContext';\r\n\r\nexport const useAuthContext = () => {\r\n const context = useContext(AuthContext);\r\n\r\n return context;\r\n}\r\n\r\nexport default useAuthContext;","import { ActiveCalls } from 'components/CallCenter/ActiveCalls';\r\nimport { CallHistory } from 'components/CallCenter/CallHistory';\r\nimport { ConfigureCallSettings } from 'components/CallCenter/ConfigureCallSettings';\r\nimport { Panel } from 'components/Common/Panel';\r\nimport { UpperContent } from 'components/Common/UpperContent';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { Col, Row } from 'reactstrap';\r\nimport { CallService } from 'telehealth-api';\r\nimport { InviteCallParticipant } from './InviteCallParticipant';\r\n import useAuthContext from 'components/ApiAuthorization/useAuthContext';\r\n\r\nexport const CallCenter = (props: RouteComponentProps) => {\r\n\tconst [externalCallingEnabled, setExternalCallingEnabled] = useState(false);\r\n\tconst { isAuthenticated, provider } = useAuthContext();\r\n\r\n\tuseEffect(() => {\r\n\t\tconst checkExternalCallsFeature = async () => {\r\n\t\t\tconst authed = await isAuthenticated();\r\n\r\n\t\t\tif(!authed) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst token = await provider.getAccessToken();\r\n\r\n\t\t\tlet featureResponse = await fetch('/api/v1/feature/externalCalling', {\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t'Authorization': `Bearer ${token!}`\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif(featureResponse.ok && (featureResponse.headers.get('Content-Type')?.indexOf('json') ?? -1) > -1) {\r\n\t\t\t\tlet externalCallingFeature = (await featureResponse.json()) as {enabled: boolean};\r\n\r\n\t\t\t\tif(externalCallingEnabled !== externalCallingFeature.enabled) {\r\n\t\t\t\t\tsetExternalCallingEnabled(externalCallingFeature.enabled);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tcheckExternalCallsFeature();\r\n\t});\r\n\r\n\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\t\r\n\t\t\t\t{ externalCallingEnabled && (\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\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\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\t )}\r\n\t\t\t\t{ !externalCallingEnabled && (\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)}\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\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\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)\r\n}","import React, { useContext, useEffect, useRef } from \"react\";\r\nimport { statusService } from \"components/SignalR/StatusService\";\r\nimport { AuthContext } from \"components/ApiAuthorization/AuthContext\";\r\nimport { HubStatusMethod } from \"telehealth-api\";\r\n\r\nexport const Presence = () => {\r\n const authContext = useContext(AuthContext);\r\n const authSubscriptions = useRef([] as Array);\r\n const userPresenceSubscriptions = useRef([] as Array);\r\n const reconnectedHanderInitialized = useRef(false);\r\n\r\n // a handler which makes the user available in the event their\r\n // SignalR connection drops and reconnects\r\n const reconnectedHandler = (error?: string) => {\r\n let logMsg = \"Reconnected to status hub\";\r\n if (error) {\r\n logMsg = `${logMsg} after failing with: ${error}`;\r\n }\r\n\r\n console.debug(logMsg);\r\n\r\n //if (!reconnectedHanderInitialized.current) {\r\n statusService.enableCallNotifications();\r\n reconnectedHanderInitialized.current = true;\r\n //}\r\n\r\n return Promise.resolve();\r\n };\r\n\r\n // setup a reconnection handler for SignalR to ensure call notifications are re-enabled\r\n useEffect(() => {\r\n statusService.addReconnectedHandler(reconnectedHandler);\r\n }, []);\r\n\r\n useEffect(() => {\r\n let authedSub = authContext.onAuthenticationChange(async () => {\r\n if (await authContext.isAuthenticated()) {\r\n await statusService.makeUserAvailable();\r\n }\r\n });\r\n\r\n authSubscriptions.current.push(authedSub);\r\n\r\n //listen for user availablity change so we know when to display/send call notifications\r\n let presenceChangeSub = statusService.subscribe(async (userId: string, available: boolean) => {\r\n let myUserId = await authContext.provider.getUserId();\r\n\r\n if (!myUserId) {\r\n return;\r\n }\r\n\r\n if (myUserId !== userId) {\r\n return;\r\n }\r\n\r\n if (available) {\r\n statusService.enableCallNotifications();\r\n } else {\r\n statusService.disableCallNotifications();\r\n }\r\n }, HubStatusMethod.UpdateStatus);\r\n\r\n userPresenceSubscriptions.current.push(presenceChangeSub);\r\n\r\n return () => {\r\n authSubscriptions.current.forEach((authSub) => authContext.cancelAuthenticationChange(authSub));\r\n userPresenceSubscriptions.current.forEach((presenceSub) => statusService.unsubscribe(presenceSub));\r\n\r\n authSubscriptions.current = [];\r\n userPresenceSubscriptions.current = [];\r\n };\r\n }, [authContext]);\r\n\r\n return <>;\r\n};\r\n\r\nexport default Presence;\r\n","import Message from 'common/Message';\r\nimport { MessageId } from 'common/Messaging';\r\n\r\nclass VoidMessage extends Message {\r\n constructor () {\r\n super(MessageId.voidMessage);\r\n }\r\n}\r\n\r\n//singleton instance\r\nconst instance = new VoidMessage();\r\nexport default instance;","import React, { PropsWithChildren } from \"react\";\r\nimport MessagingContext from \"../../common/messaging/MessagingContext\";\r\nimport Message from \"../../common/Message\";\r\nimport messenger, { MessageSubscription } from \"../../common/Messaging\";\r\nimport voidMessage from \"../../common/messaging/VoidMessage\";\r\n\r\nconst MessagingContextProvider = ({ children }: PropsWithChildren<{}>) => {\r\n const handlePublish = (msg: Message, value: T) => {\r\n messenger.publish(msg, value);\r\n };\r\n\r\n const handleSubscribe = (msg: Message, callback: (value: T) => void) => {\r\n if (!msg) {\r\n return new MessageSubscription(-1, voidMessage, () => {});\r\n }\r\n\r\n const sub = messenger.subscribe(msg, callback);\r\n return sub;\r\n };\r\n\r\n const handleUnsubscribe = (messageSub: MessageSubscription) => {\r\n if (!messageSub) {\r\n return;\r\n }\r\n\r\n messenger.unsubscribeFrom(messageSub);\r\n };\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nexport default MessagingContextProvider;\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { StaticContext } from 'react-router';\r\nimport { useParams, RouteComponentProps } from 'react-router-dom';\r\nimport { Login } from 'components/ApiAuthorization/Login';\r\nimport { LoginActions } from './ApiAuthorization/ApiAuthorizationConstants';\r\n\r\nexport const AcceptCall = (props: RouteComponentProps<{}, StaticContext, {action: string}>) => {\r\n const [redirectToLogin, setRedirectToLogin] = useState(false);\r\n const redirectUrl = useRef();\r\n\r\n let { userId, roomId, signature } = useParams<{userId: string, roomId: string, signature: string}>();\r\n \r\n useEffect(() => {\r\n if(!userId) {\r\n return;\r\n }\r\n\r\n if(!roomId) {\r\n return;\r\n }\r\n\r\n const joinCall = async () => {\r\n let joinCallResponse = await fetch(`/api/v1/call/join/${userId}/${roomId}/${signature}`, {\r\n method: \"GET\"\r\n });\r\n\r\n redirectUrl.current = `${window.location.protocol}//${window.location.host}/room?roomId=${roomId}`;\r\n\r\n if(joinCallResponse.ok) {\r\n setRedirectToLogin(true); \r\n }\r\n }\r\n\r\n joinCall();\r\n\r\n }, [userId, roomId, signature])\r\n\r\n return <>\r\n {redirectToLogin && }\r\n \r\n}","import React, { useEffect, useState, useRef, PropsWithChildren } from 'react';\r\nimport { Claims } from 'security/Claims';\r\nimport { SecuredPersonService } from '../../services/SecuredPersonService';\r\nimport { SecuredComponent } from '../SecuredComponent';\r\nimport TelehealthPortalPermission from '../../security/Permission/TelehealthPortalPermission';\r\nimport { NotGranted } from '../../security/Permission/NotGranted';\r\nimport { RenderPermission } from '../../security/Permission/RenderPermission';\r\nimport useAuthContext from './useAuthContext';\r\n\r\nexport interface RequirePortalAccountProps extends PropsWithChildren<{}> {\r\n personService: SecuredPersonService\r\n}\r\n\r\n/****************************************\r\n * Represents a component which requires \r\n * the user to have the \"telehealth\" \r\n * account claim. \r\n ***************************************/\r\nconst TelehealthAccountSecuredComponent = ({children, personService}: RequirePortalAccountProps) => {\r\n const [renderPermission, setRenderPermission] = useState(new RenderPermission(new NotGranted()));\r\n const authContext = useAuthContext();\r\n const initialized = useRef(false);\r\n\r\n useEffect(() => {\r\n const lookupUser = async () => {\r\n const authed = await authContext.isAuthenticated();\r\n \r\n if(authed) {\r\n renderPermission.deniedAsync(async () => {\r\n const user = await personService.lookupLoggedInUser();\r\n let perm = new RenderPermission(new TelehealthPortalPermission(new Claims(user.claims))).enableRendering();\r\n setRenderPermission(perm);\r\n }); \r\n } else {\r\n renderPermission.granted(() => {\r\n let perm = new RenderPermission(new NotGranted()).enableRendering(); \r\n setRenderPermission(perm);\r\n });\r\n }\r\n }\r\n \r\n if(!initialized.current) {\r\n initialized.current = true;\r\n lookupUser();\r\n }\r\n \r\n }, [authContext, renderPermission, personService, authContext.isAuthenticated]);\r\n \r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport default TelehealthAccountSecuredComponent;","import React, { useState, ReactNode } from \"react\";\r\nimport NavMenuContext, { INavMenuContext } from \"./NavMenuContext\";\r\n\r\ninterface NavMenuContextProviderProps {\r\n children?: ((ctx: INavMenuContext) => ReactNode) | ReactNode;\r\n}\r\n\r\nexport const NavMenuContextProvider = ({ children }: NavMenuContextProviderProps) => {\r\n const [showNav, setShowNav] = useState(true);\r\n\r\n const navMenuProvider = {\r\n navVisible: showNav,\r\n showNav: () => setShowNav(true),\r\n hideNav: () => setShowNav(false),\r\n } as INavMenuContext;\r\n\r\n if (typeof children === \"function\") {\r\n return {children(navMenuProvider)};\r\n }\r\n\r\n return {children};\r\n};\r\n","import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { Redirect, Route, withRouter, StaticContext, Switch } from \"react-router\";\r\nimport Layout from \"./components/Layout\";\r\nimport { Home } from \"./components/Home\";\r\nimport { RoomRouter } from \"./components/RoomRouter\";\r\nimport AuthorizeRoute from \"./components/ApiAuthorization/AuthorizeRoute\";\r\nimport ApiAuthorizationRoutes from \"./components/ApiAuthorization/ApiAuthorizationRoutes\";\r\nimport { ApplicationPaths } from \"./components/ApiAuthorization/ApiAuthorizationConstants\";\r\nimport { CallTreeRouter } from \"./components/CallTreeRouter\";\r\nimport { RoutedCallToastManager } from \"./components/CallToastManager\";\r\nimport { UnregisterCallback } from \"history\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport { UserLogin } from \"./components/UserLogin\";\r\nimport { ResetPassword } from \"./components/ResetPassword\";\r\nimport { Teams } from \"./components/Teams/Teams\";\r\nimport { Users } from \"./components/user/Users\";\r\nimport AuthContextProvider from \"components/ApiAuthorization/AuthContextProvider\";\r\nimport { CallCenter } from \"components/CallCenter/CallCenter\";\r\nimport Presence from \"components/user/Presence\";\r\nimport MessagingContextProvider from \"components/Messaging/MessagingContextProvider\";\r\nimport { CallService } from \"telehealth-api\";\r\nimport { AcceptCall } from \"components/AcceptCall\";\r\nimport TelehealthAccountSecuredComponent from \"components/ApiAuthorization/TelehealthAccountSecuredComponent\";\r\nimport { SecuredPersonService } from \"services/SecuredPersonService\";\r\nimport { NavMenuContextProvider } from \"components/Navigation/NavMenuContextProvider\";\r\nimport { AuthContext } from \"components/ApiAuthorization/AuthContext\";\r\nimport NavMenuContext from \"components/Navigation/NavMenuContext\";\r\nimport { statusService } from \"components/SignalR/StatusService\";\r\nimport { AuthChangeCheck } from \"./security/AuthChangeCheck\";\r\n\r\nimport \"@fortawesome/fontawesome-free/css/all.min.css\";\r\nimport \"../node_modules/telehealth-styles/build/telehealth.css\";\r\n\r\ninterface AppProps extends RouteComponentProps<{}, StaticContext, { action?: string }> {}\r\n\r\nconst App = ({ history, location, match }: AppProps) => {\r\n let unlisten = useRef();\r\n\r\n const personService = new SecuredPersonService();\r\n const authSubscription = useRef();\r\n const authContext = useContext(AuthContext);\r\n const navContext = useContext(NavMenuContext);\r\n\r\n const [className, setClassName] = useState();\r\n const [authenticated, setAuthenticated] = useState(false);\r\n\r\n const authChange = useMemo(() => new AuthChangeCheck(authContext.provider), [authContext]);\r\n\r\n const getClassName = useCallback(\r\n (path: string) => {\r\n let firstSegment = path.match(/^\\/(?[a-zA-Z-]*)/);\r\n\r\n let className = \"layout container-fluid\";\r\n if (firstSegment && firstSegment.groups?.path) {\r\n className = `layout-${firstSegment.groups.path} container-fluid`;\r\n } else {\r\n //this must be either the login or home path\r\n className = authenticated ? \"layout-home container-fluid\" : \"layout-login container-fluid\";\r\n }\r\n\r\n return className;\r\n },\r\n [authenticated]\r\n );\r\n\r\n const locationChangeHandler = useCallback(() => {\r\n const checkAuthenticated = async () => {\r\n authChange.checkAuthChanged(authenticated, (authenticated: boolean) =>\r\n authenticated ? navContext.showNav() : navContext.hideNav()\r\n );\r\n };\r\n\r\n if (getClassName(location.pathname) !== location.pathname) {\r\n setClassName(getClassName(location.pathname));\r\n }\r\n\r\n checkAuthenticated();\r\n }, [getClassName, location.pathname, navContext, authenticated, authChange]);\r\n\r\n useEffect(() => {\r\n const checkAuth = async () => {\r\n let userAuthenticated = await authContext.isAuthenticated();\r\n\r\n if (userAuthenticated !== authenticated) {\r\n if (authSubscription.current) {\r\n authContext.cancelAuthenticationChange(authSubscription.current);\r\n }\r\n\r\n authSubscription.current = authContext.onAuthenticationChange(() => {\r\n setAuthenticated(userAuthenticated);\r\n });\r\n\r\n setAuthenticated(userAuthenticated);\r\n }\r\n };\r\n\r\n checkAuth();\r\n\r\n return () => {\r\n if (authSubscription.current) {\r\n authContext.cancelAuthenticationChange(authSubscription.current);\r\n\r\n authSubscription.current = undefined;\r\n }\r\n };\r\n }, [authenticated, authContext]);\r\n\r\n useEffect(() => {\r\n locationChangeHandler();\r\n\r\n if (history) {\r\n unlisten.current = history.listen(() => locationChangeHandler());\r\n }\r\n\r\n return () => {\r\n if (unlisten.current) {\r\n unlisten.current();\r\n unlisten.current = undefined;\r\n }\r\n };\r\n }, [history, location, locationChangeHandler]);\r\n\r\n useEffect(() => {\r\n const updateNav = async () =>\r\n await authChange.checkAuthChanged(authenticated, (authenticated) => {\r\n authenticated ? navContext.showNav() : navContext.hideNav();\r\n });\r\n\r\n updateNav();\r\n }, [navContext, authenticated, authChange]);\r\n\r\n useEffect(() => {\r\n const initializeStatus = async () => {\r\n await statusService.initialize();\r\n };\r\n\r\n if (authenticated) {\r\n initializeStatus();\r\n }\r\n }, [authenticated]);\r\n\r\n return (\r\n \r\n \r\n {(navMenuCtx) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n (\r\n (show ? navMenuCtx.showNav() : navMenuCtx.hideNav())}\r\n userService={personService}\r\n />\r\n )}\r\n />\r\n \r\n <>\r\n {authenticated && }\r\n {!authenticated && }\r\n \r\n \r\n \r\n \r\n {(authContext) =>\r\n authenticated && (\r\n \r\n )\r\n }\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default withRouter(App);\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport { BrowserRouter } from \"react-router-dom\";\r\nimport App from \"./App\";\r\n\r\nconst baseUrl = document.getElementsByTagName(\"base\")[0].getAttribute(\"href\") ?? \"\";\r\nconst rootElement = document.getElementById(\"root\");\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n ,\r\n rootElement\r\n);\r\n","\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.urlHelper = exports.UrlHelper = void 0;\r\nclass UrlHelper {\r\n // rootUrl should be an empty string most of the time, in which case all the URLs\r\n // will be relative.\r\n // rootUrl will be set to an actual URL when we are in a mobile app.\r\n constructor(rootUrl) {\r\n this.rootUrl = '';\r\n if (rootUrl !== '' && !rootUrl.endsWith('/')) {\r\n rootUrl = rootUrl + '/';\r\n }\r\n this.rootUrl = rootUrl;\r\n }\r\n resolveUrl(relativePath) {\r\n // if we don't have a rootUrl, don't modify the relative path since this was the existing behavior\r\n if (this.rootUrl !== '' && relativePath.startsWith('/')) {\r\n relativePath = relativePath.substr(1);\r\n }\r\n return this.rootUrl + relativePath;\r\n }\r\n}\r\nexports.UrlHelper = UrlHelper;\r\n// We can use relative paths when this is loaded in TeleHealth, but we \r\n// need to use absolute paths whenever another application (like Elite)\r\n// uses this package. \r\n// So if you use this in Elite, you should have a script like the one below\r\n// before you load this one:\r\n// window.TELEHEALTH_URL = 'https://mytelehealthurl.com'\r\nvar serverUrl = window.TELEHEALTH_URL || '';\r\nexports.urlHelper = new UrlHelper(serverUrl);\r\n//# sourceMappingURL=UrlHelper.js.map"],"sourceRoot":""}