{"version":3,"sources":["assets/Images/edit.svg","assets/Images/landing/arrow-down.png","assets/Images/landing/arrow-left.png","assets/Images/pursuit_icon.svg","assets/Images/Thumbnail.png","assets/Images/landing/crowd.png","assets/Images/landing/cloud-computer.png","assets/Images/landing/police.png","assets/Images/landing/hexagons.png","assets/Images/landing/Guardian-Group-Logo.png","contexts/focusContext.js","generated/graphql/mutations.js","components/DateDisplay/DateDisplay.js","helpers/AlertContext/AlertReducer.js","helpers/AlertContext/AlertContext.js","generated/graphql/queries.js","helpers/useMessages.js","contexts/userContext.js","helpers/markdown/parser.js","components/MessageForm/MessageForm.jsx","components/MessageTo/MessageToSummary.jsx","components/MessageTo/MessageToDetail.jsx","components/MessageGrid/MessageGrid.jsx","components/MessageFrom/MessageFrom.jsx","components/MessageThread/MessageThread.jsx","constants/index.js","components/StatusPill/index.js","components/UserSelector/UserSelector.jsx","components/Spinner/index.js","components/Button/generateButtonClass.js","components/Button/index.js","components/Alert/index.js","components/AlertHandler/index.js","components/HeaderText/index.js","components/PopupConfirmation/index.js","components/ToolTip/index.js","components/DropDown/index.js","components/TextField/index.js","components/AliasGenerator/index.js","components/AuthHeader/index.js","components/Card/index.js","components/PieChart/index.js","components/CaseMap/index.js","helpers/caseForms/webSourceFields.js","helpers/caseForms/utilHelpers.js","components/Feedback/index.js","components/ConfirmationStep/index.js","components/PointBreakdown/index.js","components/VerticalSorter/index.js","webpack:///./src/assets/Images/edit.svg?4f53","webpack:///./src/assets/Images/trash.svg?9fc8","webpack:///./src/assets/Images/pursuit_icon.svg?437a","components/InvestigatorNotes/index.js","components/ReviewForm/compileSteps.js","components/ConfirmationForm/index.js","components/Container/index.js","components/CountryStateZipPicker/index.js","components/DataGrid/index.js","components/PhoneField/phoneFieldHelper.js","components/PhoneField/index.js","components/EscortAdForm/index.js","components/FileUploader/index.js","components/Footer/index.js","components/LeaderboardCard/index.js","components/LEOGrid/index.js","components/NotificationRow/index.js","components/Notifications/index.js","generated/graphql/subscriptions.js","components/LoggedInHeader/index.js","components/MobileDropdown/index.js","components/SidebarData/index.js","helpers/validationHelpers.js","helpers/createAccount/fieldValidation.js","components/NavBar/index.js","components/SortableItem/SortableItem.jsx","components/OrderStepsForm/index.js","components/Page/index.js","components/PersonalInfoForm/index.js","components/PrivateRoute/index.js","components/ReviewStep/index.js","components/PickSourcesModal/index.js","helpers/PhotoEditing/imageCropper.js","components/ReportBuilder/photoPicker.js","components/ReportBuilder/index.js","components/ReviewForm/index.js","components/RulesAndGuidelines/index.js","components/UserGrid/index.js","components/WebSourceForm/index.js","pages/public/CertificateUpload/index.js","pages/public/Privacy/privacyPolicy.js","pages/public/Privacy/index.js","pages/public/RequiredTraining/index.js","pages/public/TermsOfUse/termsOfUse.js","pages/public/TermsOfUse/index.js","pages/public/ThankYou/index.js","helpers/GoogleAnalytics/eventTracker.js","pages/public/CaseDownload/index.js","pages/private/ActiveCases/index.js","pages/private/Dashboard/index.js","helpers/caseForms/initialFormStates.js","helpers/caseForms/caseValidation.js","helpers/caseForms/fieldValidation.js","pages/private/Investigation/index.js","pages/private/Success/index.js","helpers/dropdownOptions.js","pages/private/Settings/index.js","helpers/knowledgeBase/fieldValidation.js","pages/private/KnowledgeBase/index.js","helpers/knowledgeBase/knowledgeBaseValidation.js","pages/private/Leaderboard/microstatGraph/index.js","pages/private/Leaderboard/index.js","pages/auth/ConfirmAccount/index.js","pages/auth/CreateAccount/PageOne.js","helpers/createAccount/createAccountValidation.js","pages/auth/CreateAccount/PageTwo.js","pages/auth/CreateAccount/TermsModal.js","pages/auth/CreateAccount/PrivacyModal.js","pages/auth/CreateAccount/index.js","pages/auth/ForgotPassword/index.js","pages/auth/RequireNewPassword/index.js","pages/auth/Login/index.js","pages/auth/Welcome/index.js","helpers/useTitle.jsx","helpers/useQueryState.jsx","pages/employee/Messaging/MessageCreate.jsx","pages/employee/Messaging/MessageIndex.jsx","helpers/usePrevious.js","pages/employee/Messaging/MessageRead.jsx","pages/employee/Messaging/MessageViewSent.jsx","routing/volunteerRouting.js","pages/employee/CaseReview/index.js","pages/employee/Dashboard/index.js","components/UsersAwardedLevels/index.js","helpers/useAwardLevels.js","pages/employee/UserDetails/index.js","pages/employee/Volunteers/index.js","routing/employeeRouting.js","pages/admin/CreateUser/index.js","pages/admin/StaffUsers/index.js","pages/admin/LEODetails/index.js","pages/admin/Search/index.js","pages/admin/LEOUsers/index.js","pages/admin/CreateLEO/index.js","routing/adminRouting.js","routing/index.js","generated/aws-exports.js","App.js","serviceWorker.js","index.js","components/WebSourceForm/styles.module.css","assets/Images/trash.svg","assets/Images/guardian_group_logo.svg"],"names":["module","exports","FocusContext","createContext","isFocused","FocusContextProvider","_ref","children","windowIsActive","setWindowIsActive","useState","handleActivity","forcedFlag","document","hidden","useEffect","handleActivityFalse","handleActivityTrue","addEventListener","window","removeEventListener","React","createElement","Provider","value","useFocus","useContext","updateUser","updateUserType","approveUser","enableUser","disableUser","deleteCase","adminDownloadCase","updateTutorial","createMessage","createVolunteerMessage","unreadMessage","readMessage","unflagMessage","flagMessage","deleteMessage","assignMessage","clearNotificationCount","DateDisplay","date","defaultReturn","format","dt","DateTime","fromJSDate","Date","title","toLocaleString","DATETIME_FULL","formattedDate","Fragment","AlertNotificationReducer","state","action","type","_objectSpread","notification","payload","initialState","occurs","message","textColor","borderColor","NotificationContext","Store","dispatch","useReducer","getUser","getUserById","listVolunteers","listEmployees","getCase","listOwnedCases","getCasesByNo","listNotifications","listMessages","listAllMessages","listGroupMessages","sentMessages","sentGroupMessages","getMessage","viewMessage","listMessageThreads","validateMessage","thing","recipients","Array","isArray","console","error","createMessageRequest","async","data","asAdmin","arguments","length","undefined","input","mutation","createAdminMessageMutation","createVolunteerMessageMutation","result","API","graphql","graphqlOperation","Error","sortableMessageFields","useMessages","limit","loading","setLoading","messages","setMessages","messageCount","setMessageCount","resultLimit","setResultLimit","nextToken","setNextToken","sortField","setSortField","sortDirection","setSortDirection","setAlert","setSort","useCallback","fieldName","direction","rest","_objectWithoutProperties","_excluded","info","includes","addMessage","resultIds","id","push","e","loadMessageDetail","params","getMessageQuery","fetchData","viewMessageDetail","viewMessageQuery","sortOrder","items","listMessagesQuery","noneNullNextToken","Object","keys","reduce","acc","key","listSentMessages","group","query","sentMessagesQuery","resultKey","sentGroupMessagesQuery","log","_ref2","userId","name","updateLoading","assignedToName","assignedTo","assignMessageMutation","toast","success","progress","className","autoClose","closeButton","resetNextToken","listAllMessagesQuery","listSharedMessages","_ref3","condense","condenseOn","listGroupMessagesQuery","cur","existingObject","find","x","threadCount","readMessageMutation","flagMessageMutation","deleteMessageMutation","unreadMessageMutation","unflagMessageMutation","isMessageFromAdmin","senderGroups","getInboxUid","concat","toLowerCase","UserContext","user","setUser","userGroups","UserProvider","setUserGroups","isLoading","setIsLoading","isCertified","isAdmin","isEmployee","analyticsSetUserParams","userObj","user_id","user_properties","user_status","userStatus","heard_about_us","heardAboutUs","ReactGA","set","currentAuthUser","Auth","currentAuthenticatedUser","bypassCache","attributes","sub","userToSet","cognitoUser","groups","signInUserSession","accessToken","currentUserInfo","lastSignInAt","toISOString","identityId","signOut","loadUser","useUser","parseMarkdown","markdown","lines","split","stack","html","closeLists","level","tag","pop","forEach","line","test","match","spaces","marker","content","trim","lineHtml","replace","formatDate","dateObject","fromEntries","Intl","DateTimeFormat","year","month","day","formatToParts","map","toUpperCase","unformatDate","dateString","messageTitles","label","fields","required","formatter","unformatter","file","Promise","resolve","reject","reader","FileReader","readAsDataURL","onload","response","size","onerror","maxInstances","userDetails","alias","defaults","MessageForm","createLabel","cancelLabel","clearLabel","isReply","cancelLink","cancelCallback","createCallback","noUserSelector","subjectDisabled","noTitle","noSubject","enableCreate","confirmSend","manualSelectorComponent","setData","saving","setSaving","validData","setValid","showConfirmationDialog","setShowConfirmationDialog","showPreview","setShowPreview","history","useHistory","titles","filter","useVolunteerView","setUseVolunteerView","checkForVolunteerView","useVolunteerSavedPref","localStorage","getItem","selectedRecipients","setSelectedRecipients","selectedTitle","setSelectedTitle","_ref4","extraFields","setExtraFields","extraValid","every","_ref5","subject","_ref6","ids","_ref7","recipient","sr","_iteratorError","_iteratorAbruptCompletion","_didIteratorError","_step","_iterator","_asyncIterator","next","done","err","return","parseRecipients","createNotification","createdCount","handleSend","extraFieldsComponent","_ref8","DatePicker","selected","onChange","Icons","TextField","target","checked","htmlFor","from","_ref9","index","FileUploader","onSuccess","dataUrl","meta","filename","path","autoSave","saveText","prefix","noPrefix","errorMessage","onCancel","isUpdate","UserSelector","isDisabled","values","_ref10","recipientName","realName","recipientAlias","Select","options","_ref11","readonly","maxLength","placeholder","onClick","dangerouslySetInnerHTML","__html","cancelButton","Link","to","preventDefault","goBack","actions","Button","linedBlue","noPadding","disabled","solidBlue","PopUpConfirmation","onConfirm","confirmText","confirmLoadingText","destructive","MessageTo","recipientGroups","recipientMeta","recipientCount","createRequestId","useAdminView","toIcon","FontAwesomeIcon","icon","_faUserSecret","details","tipId","_faUsers","maxSummaryRecipients","users","recipientList","slice","join","aria-describedby","MessageToDetail","userIcon","liClass","style","textDecorationStyle","textUnderlinePosition","role","minWidth","maxHeight","seenCount","i","seenAt","_faEye","_faEyeSlash","MessageGrid","defaultSender","advancedView","hasMore","loadNextPage","rowLink","item","sortableFields","hiddenFields","sort","showCountColumn","employeeOptions","setEmployeeOptions","nextEmployeeToken","employeeList","firstName","lastName","fetchEmployees","formatAssignedTo","event","stopPropagation","employee","oldMessages","messageToUpdateIdx","findIndex","updatedMessage","readAt","formatTo","MessageToSummary","formatSeen","fromISO","formatFlagged","adminFlaggedAt","flags","_faFlagPennant","_faUserCheck","prev","curr","gridColumns","renderFunction","createdAt","sortable","sender","senderAlias","senderName","senderTitle","customTitle","moreChevron","replyTo","_faChevronRight","column","gridMessages","classes","splice","width","noLink","DataGrid","columns","noRecordsText","containerHeight","gridKey","MessageFrom","adminViewParam","useMessageThreads","rootMessageId","autoLoad","showRootIfSingle","threadsDefault","threads","setThreads","listMessageThreadsQuery","loadThreads","thread","MessageThreadSkeleton","ThreadHeader","active","displaySeen","showReply","seen","ThreadBody","replyNotification","formatReplySubject","showSentConfirmation","setShowSentConfirmation","noCancel","startsWith","MessageThread","currentMessageId","showLoadingSkeleton","activeThread","setActiveThread","myIds","replyPath","marginClass","clickHandler","handleThreadClick","UserGroups","UserTypes","CaseStatus","Active","Approved","Submitted","Resubmitted","Returned","Nullified","TutorialCategory","VolunteerStatus","EmployeeType","ESCORT_AD","AwardClassificationOptions","AwardTypes","StatusPill","status","bgColor","charAt","groupStyles","display","alignItems","justifyContent","groupBadgeStyles","backgroundColor","borderRadius","color","fontSize","fontWeight","lineHeight","padding","textAlign","getStatusBackgroundColor","colorStyles","multiValue","styles","chroma","alpha","css","multiValueLabel","multiValueRemove","promiseOptions","inputValue","searchTerm","volunteerResponse","adminResponse","staffResponse","adminUsersWithRealName","a","b","localeCompare","staffUsersWithRealName","possibleUsers","grouped","CheckableOption","isSelected","statusTag","components","Option","assign","formatOptionLabel","_excluded2","formatGroupLabel","GroupHeading","hasSelectedOption","props","_excluded3","_","internalSelected","setInternalSelected","openGroups","setOpenGroups","AsyncSelect","isMulti","cacheOptions","defaultOptions","closeMenuOnSelect","hideSelectedOptions","loadOptions","Group","some","opt","isOpen","toggleThisGroup","expandIcon","groupOptions","selectedOptions","selectProps","allSelected","selectAllOptions","newSelectedOptions","newOptions","paddingLeft","gap","paddingRight","textTransform","flex","cursor","headingProps","onError","classNames","option","getOptionLabel","Spinner","version","xmlns","y","height","viewBox","xmlSpace","d","attributeType","attributeName","dur","repeatCount","generateButtonClass","buttonClass","disabledClasses","solidGray","solidLightGray","linedRed","noLineBlue","solidRed","tab","activeTab","anchorTag","justify","inline","debounceDelay","onClickWithDebounce","debounce","DEFAULT","TEXTCOLORS","greenText","redText","BORDERCOLORS","greenBorder","redBorder","Alert","resolvedClassName","alert","failAlert","setFailAlert","setTimeout","AlertHandler","HeaderText","noBold","mb","cancelText","cancelLoadingText","noConfirm","confirmLoading","cancelLoading","forceScrollBottom","contentWrapper","confirmDisabled","reachedBottom","setReachedBottom","handleScroll","node","scrollHeight","scrollTop","clientHeight","zIndex","top","left","transform","onScroll","ToolTip","tooltipText","show","setShow","DropDown","containerClassName","noFullFieldWidth","noRounded","fieldHeight","fieldWidth","fieldPadding","fieldClassName","getOptionValue","multiSelect","isClearable","tabIndex","widthStyle","heightStyle","classNameStyle","noFullFieldWidthStyle","noRoundedStyle","fieldHeightStyle","fieldWidthStyle","fieldPaddingStyle","fieldClassNameStyle","optionsAttribute","labelComponent","childProps","SelectAsync","infoTitle","placeHolder","tabindex","readOnly","AliasGenerator","setAlias","excludeHeader","clearedAt","setMessage","gender","setGender","startingLetter","setStartingLetter","aliasOptions","setAliasOptions","generateNewAlias","firstInitial","generateAlias","addNewAliasOption","aliases","updatedOptions","updateAlias","AuthHeader","showButtons","useLocation","pathname","src","HeaderLogo","alt","location","href","Component","Card","highchartsMap","Highcharts","PieChart","numOver18","numUnder18","chart","plotBorderColor","plotBorderWidth","plotShadow","marginRight","colors","credits","enabled","legend","text","tooltip","headerFormat","pointFormat","outside","plotOptions","pie","allowPointSelect","dataLabels","connectorColor","distance","crop","overflow","xAxis","labels","tickLength","series","colorByPoint","total","HighchartsReact","highcharts","memo","board","userCrowdToggle","zoom","userPoints","crowdPoints","userOver18Points","crowdOver18Points","setPointData","center","lat","lng","currClusters","setCurrClusters","isLoaded","useJsApiLoader","googleMapsApiKey","process","getId","getCaseMapData","userCases","crowdCases","userOver18Cases","crowdOver18Cases","toLatLng","lon","toOver18","isOver18","toUnder18","newPointData","updatePoints","toMarkers","pinColor","clusterer","pinSVGHole","markerImage","anchor","google","maps","Point","fillOpacity","fillColor","strokeWeight","strokeColor","scale","Marker","createKey","position","onClusteringEnd","newClusters","clusters","markers","m","renderClusters","getPixelPositionOffset","OverlayViewF","mapPaneName","OverlayView","OVERLAY_MOUSE_TARGET","GoogleMap","mapContainerStyle","flexGrow","minHeight","MarkerClusterer","imagePath","fill","websiteList","websiteLabelOverrides","Twitter","getWebSourceSiteLabel","field","webSourceRequiredFields","webSourceRequiredFieldsStructured","escortad","webSourceFields","cashapp","displayName","profilePictureUrl","cashtag","registeredPhoneNumber","description","dateofbirth","dateOfBirth","email","escortSiteTitle","url","adLocation","adDate","phoneNumber","phoneType","facebook","profileName","username","instagram","linktree","kik","messenger","paypal","periscope","pinterest","reddit","snapchat","soundcloud","telegram","tiktok","tumblr","twitch","twitter","venmo","website","whatsapp","youtube","other","onlyfans","webSourceFieldLabels","escortad_description","webSourceFieldCharacterLimits","webSourceFieldPlaceholders","webSourceEscortSiteOptions","webSourceTooltips","readableFormat","word","substr","webSourceFieldLabel","source","hideDetails","fieldValue","uniqueFieldKey","keyValue","escortSiteOption","usesOldEscortAdFormat","record","escortAd","phones","phone","Boolean","sortWebSourceFields","order","aIndex","indexOf","bIndex","Feedback","award","comments","stepId","comment","feedback","ConfirmationStep","_data$body","numSteps","isLast","swapSteps","editSource","deleteSource","expandAll","noSwaps","hideExpand","feedbackComments","awardClassificationOption","disableEdit","allSteps","swapAdStep","expanded","setExpanded","swapDirection","translation","setTranslation","showDelete","setShowDelete","upArrow","downArrow","expandArrow","divHeight","stepContent","renderStepContent","fieldsString","JSON","stringify","entries","body","parse","idxOfDescription","webSourceKey","orderedFields","idxOfUrl","indexOfUniqueFields","overflowWrap","defaultData","obj","number","sortFunction","readableField","uniqueData","editButton","EditIcon","deleteButton","TrashIcon","awardData","PointBreakdown","_caseRecord$totalPoin","_caseRecord$totalPoin3","caseRecord","leadApprovedPts","setLeadApprovedPts","sourcePoints","setSourcePoints","totalPoints","pointsAwarded","_caseRecord$totalPoin2","wasReturned","basePoints","expandedBox","awardType","VerticalSorter","_path","up","down","onUp","onDown","enabledClassName","disabledClassName","buttonClassName","wrapClassName","iconSize","_extends","bind","n","t","r","hasOwnProperty","call","apply","SvgEdit","svgRef","o","_objectWithoutPropertiesLoose","getOwnPropertySymbols","s","propertyIsEnumerable","ref","ForwardRef","forwardRef","_defs","SvgTrash","_path2","_path3","_path4","_path5","_path6","_path7","_path8","_path9","SvgPursuitIcon","splitNotes","notes","note","metadata","metadataRegex","metadataMatch","parseMarkdownPage","Note","initialNote","editing","initialEditingState","editable","deletable","editDisabled","collapsable","collapsed","initialCollapseState","sortActions","onEdit","updateNote","removeNote","setEditing","setNote","setCollapsed","overflowActive","setOverflowActive","overflowingText","useRef","showDeleteDialog","setShowDeleteDialog","author","visibility","textContainer","current","offsetHeight","offsetWidth","scrollWidth","toggleEditing","toggleCollapsed","collapseButton","saveButton","sortButton","noteContent","data-replicated-value","visibilityIcon","useMemo","PursuitIcon","dialog","InvestigatorNotes","setNotes","canEdit","canDelete","canSort","newVisibility","parsedNotes","setParsedNotes","editingNoteIndex","setEditingNoteIndex","save","joinNotes","addNewNote","newNotes","moveNote","removed","addNoteButton","renderedNotes","noteFilter","accessibleNotes","isEditing","compileSteps","steps","webSources","staffSources","sourceOrders","compiledSteps","previousSourceId","unshift","parentIndex","ConfirmationForm","caseState","reviewing","setAwardClassificationOption","middleName","age","city","renderSteps","awards","awardedPoints","filteredSteps","sourceOrder","_awards$find","idx","investigatorNotes","Container","grayedBackground","margin","centerText","rounded","outerClassName","roundedClass","appliedOuterClassName","appliedClassName","renderGrayedBackground","countries","countryList","getData","CountryStateZipPicker","country","setCountry","setState","zip","setZip","selectedCountry","selectedState","states","abbreviation","scrollContainer","gridTemplateColumns","applySort","col","scrollableTarget","gridClass","isSortedAsc","isSortedDesc","Icon","marginBottom","marginTop","renderColumnTitle","InfiniteScroll","dataLength","j","rowClass","formatPhoneNumber","formattedPhoneNumber","PhoneField","setInput","formattedNumber","handleFormatting","EscortAdForm","setCaseState","saveAndAddButton","phoneIndexToRemove","setPhoneIndexToRemove","setPhoneNumber","updatedPhones","newCaseState","removePhoneNumber","phoneToPromote","acceptedFileTypes","uploadObject","fileURL","setFileURL","setFile","setFilename","fileType","setFileType","saved","setSaved","uploadBoxText","setUploadBoxText","saveFile","fileParams","contentType","customPrefix","public","timestamp","getTime","toString","uploadResult","Storage","put","URL","createObjectURL","upload","f","fileForUpload","files","fileUrl","onDragOver","onDragEnter","onDragLeave","onDrop","dataTransfer","accept","moment","Footer","LeaderboardCard","rankText","setRankText","pointsText","setPointsText","pointsPercent","setPointsPercent","leadsApproved","setLeadsApproved","leadsSubmitted","setLeadsSubmitted","leadApproval","setLeadApproval","getUserLeaderboardSummary","summary","nanToZero","Number","isFinite","rank","points","Math","floor","CircularProgressbarWithChildren","strokeWidth","buildStyles","pathColor","rotation","strokeLinecap","Volunteers","statusOptions","initialStatus","queryName","statusColumn","statusFilterLabel","createUserDefaultType","nextUsersToken","setNextUsersToken","setUsers","usersLoading","setUsersLoading","setUserStatus","filters","setFilters","filtersOnLastSearch","setFiltersOnLastSearch","sortOnLastSearch","setSortOnLastSearch","search","setSearch","fetchUsers","userCount","setUserCount","nextTokenToUse","oldUsers","snakeCase","userType","onKeyDown","v","disabledAt","NotificationRow","link","matches","getIcon","FaIcons","_faMessage","_faTriangleExclamation","_faEnvelope","_faArrowDownToBracket","_faTrophy","FiIcons","toFormat","Notifications","dropdownIsActive","setDropdownIsActive","notificationCount","setNotificationCount","notifications","setNotifications","clickOutsideRef","queryNotificationCount","getNotificationCount","count","queryNotifications","loadNext","prevNotifications","newNotifications","updatedNotifications","loadMoreNotifications","subscription","subscribe","initSubscription","unsubscribe","deactivevateDropDoneOnOutsideClick","contains","hasUnread","querySelector","setAttribute","changeFavicon","getFormattedNotificationCount","renderDropdown","LoggedInHeader","menuLeft","setUsername","Switch","clear","MobileDropdown","optionsArray","selectionCallback","SideBarData","openIntroVideo","openRulesModal","handleShareQRCodeModal","volunteerLinks","newTab","employeeLinks","ENABLE_VOLUNTEER_MESSAGING","adminLinks","_faUserPolice","_faMagnifyingGlass","ifContainNumbers","nameValidator","nameEmpty","nameContainsNumbers","emailValidator","emailEmpty","validEmail","passwordValidator","password","passwordEmpty","passwordLength","passwordHasNumber","passwordHasUpperCase","passwordHasLowerCase","ifContainsLowerCase","passwordHasSpecialCharacter","ifContainsSpecialCharacters","confirmPasswordValidator","confirmPassword","confirmPasswordEmpty","passwordsMatch","locationValidator","zipValidator","isValid","RegExp","dateOfBirthValidator","isAdminCreate","luxonDate","diff","years","countryValidator","NavBar","open","setOpen","showRules","showIntroVideo","useEmployeeRouting","isShareQRCodeModalOpen","setIsShareQRCodeModalOpen","shareQRCodeEmail","setShareQRCodeEmail","shareQRButtonLoading","setShareQRButtonLoading","links","motion","nav","initial","animate","transition","duration","rel","div","whiteSpace","right","bottom","opacity","SortableItem","listeners","setNodeRef","isDragging","over","overIndex","newIndex","useSortable","wrapperClass","cantDrop","isFirstPosition","isEscortAd","isSecondEscortAd","CSS","Transform","OrderStepsForm","addButton","setExpandAll","usesOldFormat","setUsesOldFormat","setCompiledSteps","showReorderSection","setShowReorderSection","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","coordinateGetter","sortableKeyboardCoordinates","reOrderButton","updatedWebSources","performSwap","arr","dir","temp","firstSource","secondSource","otherSources","existingAd","uniqueFields","updatedCase","restOfFirstSource","newSource","uuidv4","newEscortAd","sources","spliceOffset","webSourceIds","staffSourceIds","newAwardedPoints","toggleExpandAll","DndContext","collisionDetection","closestCenter","onDragEnd","activeIndex","secondItem","secondIsEscortAd","activeItem","defaultOrder","oldIndex","arrayMove","newSortedCompiledSteps","oldSort","SortableContext","strategy","verticalListSortingStrategy","primaryEscortAdOverride","_awards$find2","getIsApproved","isApproved","indexOffset","_caseState$awardedPoi","currStepAward","_caseState$webSources","_awards$find3","Page","PersonalInfoForm","_caseState$details","disableNameEdit","class","PrivateRoute","allowedGroups","Route","Redirect","awardTypeOptions","ReviewStep","setFeedback","setAwardOption","showAwardOptions","showCheckboxes","toggleCheckbox","isChecked","hideReview","customSorter","initialAward","staffSource","step1Content","getElementById","parseFloat","getComputedStyle","classList","add","remove","setCursor","setSelectionRange","handleChange","selectionStart","stepFields","tmp","Dropdown","PickSourcesModal","checkedSources","setCheckedSources","linkedCases","setSources","getSources","sourcesArr","caseNoList","cases","elem","forceExpanded","createImage","image","Image","getRadianAngle","degreeValue","PI","getBlob","canvas","toBlob","img","ReportPhotoPicker","caseId","photoId","s3Key","inputField","showRemove","setShowRemove","removing","setRemoving","croppingPhoto","setCroppingPhoto","existingPhotoUrl","setExistingPhotoUrl","photoUrl","setPhotoUrl","setCrop","setZoom","croppedPhotoUrl","setCroppedPhotoUrl","croppedPhoto","setCroppedPhoto","photo","get","getPhotoUrl","clearPhoto","saveCasePhoto","photoKey","setCasePhoto","res","newPhoto","Cropper","maxZoom","aspect","cropShape","cropSize","onCropChange","newCrop","onCropComplete","croppedArea","croppedAreaPixels","croppedImage","imageSrc","pixelCrop","ctx","getContext","maxSize","max","safeArea","sqrt","translate","rotate","drawImage","getImageData","putImageData","dataurl","toDataURL","bstr","atob","u8arr","Uint8Array","charCodeAt","File","blob","imageCropHelper","onZoomChange","newZoom","choosePhoto","click","deletePhoto","ReportBuilder","caseInput","setLinkedCases","initialLinkedCases","setInitialLinkedCases","initialCheckedSources","setInitialCheckedSources","pickSourcesReady","setPickSourcesReady","selectedSharedSources","setSelectedSharedSources","selectedBreakpoints","setSelectedBreakpoints","breakpoints","savingBreakpoints","setSavingBreakpoints","showLinkedConfirmation","setShowLinkedConfirmation","generatingPDF","setGeneratingPDF","downloading","setDownloading","shareReady","setShareReady","sharing","setSharing","shareEmail","setShareEmail","getLinkedCases","mergedParentId","getMergedCase","filteredRes","caseNumbers","sequentialNumber","getSharedSources","currentlyLinkedCases","currentlyCheckedSources","selectedSharedSourcesArr","caseNumber","ReactTagInput","tags","newCases","_caseInput$current","_caseInput$current$st","addTag","renderCaseImages","reportImages","approvedAt","generateReportPdf","reportKey","preSignedUrl","variables","authMode","downloadCase","sharePDF","delArr","delParams","mergeParams","caseIds","mergeCases","sortedCaseNumbers","FaCheck","updateLinkedCases","awardClassificationOptions","ReviewForm","stepActions","editAction","showStaffDelete","setShowStaffDelete","feedbackArray","existingFeedbackIndex","updatedFeedback","awardArray","existingAwardIndex","updatedAwards","removeStaffSource","updatedStaffSources","updatedAwardedPoints","moveWebStep","stepIdToMove","filteredSources","webStepIndex","new","moveStaffStep","_steps","_steps$index","directionStepId","myId","staffSourceIndex","warn","moveStep","move","_feedback$find","_feedback$find2","ss","_feedback$find3","commonFields","cs","stepsContent","_arr","_arr2","personalDetailsBlock","header","tabHeader","newItems","RulesAndGuidelines","showDisabledAt","WebSourceForm","_caseState$sourceKey$3","_caseState$sourceKey$4","setCaseStateFunc","stepNumber","webSourceIndex","setGlobalIndex","removeLabel","setFormNumber","sourceKey","removeActionLower","removeActionTitleCase","removeTitle","removeConfirmation","updatedValues","_caseState$sourceKey$","_caseState$sourceKey$2","savedWebsite","savedUniqueFields","hasSavedUniqueFields","updatedFields","savedFieldKey","hasOwn","expectedFields","expectedField","savedFieldKeys","requiredField","uniqueFieldsToSave","defaultWebsite","webSourceCount","newGlobalIndex","emptyEscortAd","selectedSource","savedWebsite2","expectedSourceFields","fieldsToDisplay","descriptionKey","sortedFields","indexOfUrl","indexOfDescription","_selectedSource$uniqu","formattedField","isRequired","updateValue","webSource","updatedUniqueValues","updatedWebSource","setUniqueInput","webSourceFieldPlaceholder","characterLimit","ElementType","fieldType","sourceInput","pattern","elementAttributes","today","sourceField","validity","placeholderText","wrapperClassName","showMonthDropdown","showYearDropdown","scrollableYearDropdown","dropdownMode","todayButton","dateFormat","maxDate","addDays","selectOptions","phoneOptions","locations","safeState","defaultInputValue","selectedOption","CertificateUpload","certificatePath","submitCertification","updatedUser","PrivacyPolicy","Privacy","render","RequiredTraining","TermsOfUse","TermsOfUseText","ThankYou","reload","useAnalyticsEventTracker","category","eventTracker","getCaseIdFromUrl","URLSearchParams","CaseDownload","mfaCode","setMfaCode","setEmail","setCognitoUser","emailSent","setEmailSent","setError","gaEventTracker","setCaseNumber","sendEmail","cogUser","signIn","depth","verifyCode","sendCustomChallengeAnswer","currentSession","_error$errors$","errors","requestDownloadCase","_unused","AuthCode","inputClassName","CaseStatusOptions","ActiveCases","_query$get","passedStatus","useQuery","initialFilterStatus","nextCaseToken","setNextCaseToken","setCases","casesLoading","setCasesLoading","setStatus","recordToDelete","setRecordToDelete","deleting","setDeleting","fetchCases","oldCases","getAwardColor","isFullPoints","updatedCases","indexOfRecord","deleteRecord","Trash","recordStatus","Dashboard","tenRecentActiveCases","setTenRecentActiveCases","tenRecentReturnedCases","setTenRecentReturnedCases","activeCasesLoading","setActiveCasesLoading","returnedCasesLoading","setReturnedCasesLoading","fetchActiveCases","fetchReturnedCases","getName","returnedAt","initialWebSourceState","_webSourceFields$esco","initialEscortAdSourceState","initialCaseState","validateOnSubmit","escortAdValid","escortAdState","_escortAdInformation","_escortAdInformation$","_escortAdInformation2","_escortAdInformation3","escortAdInformation","urlEmpty","noPhones","invalidPhone","uniqueFieldsValid","replaceAll","requiredFields","fieldsToCheckFor","Set","prettyFieldName","escortAdValidator","firstNameEmpty","lastNameEmpty","ageEmpty","cityEmpty","stateEmpty","personalInfoValidator","Investigation","_caseState$awardedPoi4","idParam","useParams","caseID","setCaseID","formNumber","sourceIndex","setSourceIndex","numSources","setNumSources","showConfirmPopup","setShowConfirmPopup","submitting","setSubmitting","autoSaveReady","setAutoSaveReady","autoSaveEnabled","setAutoSaveEnabled","setDisableEdit","disableOnApprove","setDisableOnApprove","disableOnApproveEdit","setDisableOnApproveEdit","rightScroll","setRightScroll","toLocaleLowerCase","noAlert","getCaseRecord","then","storeState","initCaseState","generateCaseNumber","disableApprovedEdit","tabNames","noEdit","ShortUniqueId","dictionary","getFullYear","loadedCaseState","removeAlert","createCase","replaceState","addCaseRecord","_record$webSources$","_JSON$parse","_record$webSources$2","_record$webSources$2$","updatedQuery","updateCaseRecord","submit","saveAndAdd","usesOldEscortAds","newWebSource","prevForm","srcIndex","nextForm","saveAndTo","tabNum","defaultTab","formNum","disable","activateTab","tabButton","personalInfoTab","sourcesTab","reviewTab","confirmTab","prevButton","nextButton","submitButton","submitText","form","escortAdEmpty","selectedIndex","stepsAdded","confirmedSubmit","getCaseState","setItem","formName","Success","howYouHeardAboutUsOptions","Settings","capitalizedFirstName","setCapitalizedFirstName","capitalizedLastName","setCapitalizedLastName","setFirstName","setLastName","setHeardAboutUs","saveUser","TutorialCategoryOptions","KnowledgeBase","nextTutorialToken","setNextTutorialToken","tutorials","setTutorials","tutorialsLoading","setTutorialsLoading","selectedTutorial","setSelectedTutorial","thumbnailS3Key","referenceTutorial","setReferenceTutorial","setCategory","displayVideo","setDisplayVideo","addUpdateVideo","setAddUpdateVideo","setIsUpdate","thumbnailsFetched","setThumbnailsFetched","fetchThumbnails","fetchTutorials","oldTutorials","regex","listTutorials","tutorial","categoryName","convertedTime","sec","parseInt","hours","minutes","seconds","convertHMS","time","dateUploaded","getMonth","getDate","all","thumbnailS3URL","getThumbnail","renderUpdate","toggleAddUpdateTutorial","toggleDeleteTutorial","player","download","expires","row","thumbURL","Thumbnail","vidURL","videoURL","toggleDisplayTutorial","tut","softDeleteTutorial","ReactPlayer","playing","controls","light","video","onloadeddata","srcElement","validateTutorial","titleValidation","titleValidator","titleEmpty","descriptionValidation","descriptionValidator","descriptionEmpty","videoValidation","uploadedVideoValidator","s3KeyEmpty","categoryValidation","categoryValidator","categoryEmpty","updatedAttributes","submitTutorial","LEAD_GRAPH_DEFINITION","yAxis","USER_COUNT_GRAPH_DEFINITION","HOURS_GRAPH_DEFINITION","createGraph","data1","data2","legendOpts","seriesNames","area","stacking","spacing","align","widthAdjust","tickPixelInterval","opposite","softMin","constructorType","buildLegend","legendInput","containerClass","microStatsToCrowdCharts","usersTotal","usersNew","hoursCrowd","hoursUser","microStatsToUserCharts","userLeadsApproved","userLeadsSubmitted","DEFAULT_MICRO_STATISTICS","DEFAULT_MICRO_CHARTS","crowd","Leaderboard","setBoard","leaderboardLoading","setLeaderboardLoading","nextLeaderboardToken","setNextLeaderboardToken","leaderboard","setLeaderboard","setUserCrowdToggle","globalStatistics","setGlobalStatistics","totalLeadsSubmitted","totalLeadsApproved","userStatistics","setUserStatistics","globalStatisticsLoading","setGlobalStatisticsLoading","userStatisticsLoading","setUserStatisticsLoading","microCharts","setMicroCharts","caseMap","setCaseMap","CaseMap","fetchLeaderboard","fetchHistoryStatistics","boardName","getHistoryStatistics","toHighchartsData","toMillis","sumLeads","microStatistics","oldLeaderboard","getTopLeaderboard","rankings","percentSuccess","renderToggles","currentValue","setter","ConfirmAccount","authData","code","setCode","resending","setResending","confirmSignUp","origin","resendSignUp","verifyCurrentUserAttribute","PageOne","setPassword","setConfirmPassword","pageChange","send","hitType","page","validatePageOne","firstNameValidation","lastNameValidation","emailValidation","passwordValidation","confirmPasswordValidation","PageTwo","setDateOfBirth","setLocation","agreeToTerms","setAgreeToTerms","signUp","heardAbout","setHeardAbout","heardAboutOptions","shouldCloseOnSelect","validatePageTwo","countryValidation","dateOfBirthValidation","locationValidation","zipValidation","heardAboutValidation","heardAboutValidator","TermsModal","PrivacyModal","CreateAccount","initialPage","pageState","setPageState","nickname","given_name","family_name","birthdate","ForgotPassword","newPassword","setNewPassword","renderedCode","setRenderedCode","sendCode","forgotPassword","redirect","verifyResponse","resetPassword","forgotPasswordSubmit","renderCode","onCLick","renderEmail","RequireNewPassword","authUser","completeNewPassword","Login","confirmationEmail","confirmationPassword","loginEnabled","setLoginEnabled","currPageState","prevPageState","setPrevPageState","setAuthUser","authenticatedUser","challengeName","Welcome","playsinline","onStart","onEnded","Crowd","ArrowDown","Police","ArrowLeft","GuardianGroupLogo","CloudComputer","Hexagons","useQueryState","defaultValue","newValue","delete","MessageCreate","pageTitle","sendCallback","cancelUrl","defaultCancelUrl","parts","separator","prevTitle","useTitle","setTitle","recipientsArray","setRecipientsArray","setNoUserSelector","setNotification","setSubjectDisabled","setNoTitle","MessageIndex","loadingMore","setLoadingMore","tabName","setTabName","prevTabName","val","usePrevious","setHiddenFields","updateMessages","currentTabName","reset","updatedMessages","primaryAction","myTab","sentTab","sharedTab","tabs","headerSection","sortParams","configure","MessageRead","messageId","autoRead","setAutoRead","messageRead","setMessageRead","displayDeleteConfirmation","setDisplayDeleteConfirmation","adminFlagged","setAdminFlagged","toggleDeleteConfirmation","load","messageReadToggle","apiRequest","task","messageFlagToggle","groupMessageAndAdminView","markRead","readActionButton","flagActionButton","deleteActionButton","fileAttachments","attachment","downloadAttachment","MessageViewSent","VolunteerRouting","exact","CaseReview","_compiledSteps$source","approveReady","setApproveReady","approving","setApproving","returnReady","setReturnReady","returnValid","setReturnValid","returning","setReturning","unapproveReady","setUnapproveReady","unapproving","setUnapproving","showAddStepForm","setShowAddStepForm","sendMessageOnAction","setSendMessageOnAction","sendMessageOnApproval","setSendMessageOnApproval","returnFormNumber","setReturnFormNumber","caseData","approveCaseAndAwardPoints","firstEscortAd","escortAdStepId","escortAdAward","validateOnApprove","approveCase","returnToVolunteer","addSourceButton","lastWebSourceId","lastStaffSourceId","saveStaffSourceButton","addActions","reportTab","saveEditButton","approveButton","reApproveButton","returnButton","unapproveButton","renderReviewButtons","_deleted","editStepId","approveFormContent","owner","returnFormContent","unapproveFormContent","unapproveAndReturnToVolunteer","EmployeeCases","setAssignedTo","caseToAssign","setCaseToAssign","assignmentSaving","setAssignmentSaving","listCasesForAdmin","listAssignedCases","onAssignCase","caseToUpdateIdx","renderAssignedTo","_employeeOptions$find","checkAssignCase","getSubmittedDate","submittedAt","renderDelete","deletedAt","assigned","nullifyRecord","UsersAwardedLevels","usersAwardLevels","possibleAwardLevels","pointLevels","UserDetails","signedInUser","setUserType","showConfirmDisable","setShowConfirmDisable","showConfirmEnable","setShowConfirmEnable","showConfirmDelete","setShowConfirmDelete","disabling","setDisabling","enabling","setEnabling","changingType","setChangingType","isDeleting","setIsDeleting","disabledReason","setDisabledReason","userTypeOptions","awardLevels","useAwardLevels","setAwardLevels","getAwardLevels","levels","returnedUser","getUserType","parseDate","onDisableUser","disableReason","disabledReasonInput","disabledContent","deleteUser","onDeleteUser","onEnableUser","stateCode","matchingState","parseState","scoreAwardLevels","getCertificate","selectedType","volunteerStatusOptions","UserGrid","EmployeeRouting","CreateUser","routeState","defaultState","newUser","setNewUser","aliasClearedAt","setAliasClearedAt","validateAdminCreateUser","stateValidation","firstNameValidator","lastNameValidator","formattedDOB","adminCreateUser","userExistsError","errorType","StaffUsers","enableEditing","setEnableEditing","getLeoUserById","userDoc","updateUserRecord","handleEditSave","_faEdit","agency","department","downloads","lastDownloadedAt","Pagination","currentPage","totalPages","onPageChange","pageNumbers","currentUrl","newUrl","SearchResult","downloadAction","casePDFUrl","setCasePDFUrl","highlights","filteredHighlights","formattedHighlights","downloadButton","openPDFButton","getCasePDF","border","SearchPage","setSearchTerm","searchedTerm","setSearchedTerm","results","setResults","hasSearched","setHasSearched","searchRunning","setSearchRunning","resultsPerPage","setCurrentPage","setTotalPages","setErrorMessage","performSearch","cleanSearch","searchQuery","totalHits","ceil","parsedHighlights","endsWith","filteredItems","searchForm","LEOUsers","LEOGrid","CreateLEO","validateAdminCreateLEOUser","adminCreateLEO","AdminRouting","LEODetails","AppRouter","sidebarOpen","setSidebarOpen","showVideo","setShowVideo","setShowRules","agreedToRules","setAgreedToRules","showVideoClose","setShowVideoClose","userAlias","setUserAlias","aliasMessage","setAliasMessage","isCertifiedOrEmployee","updateVolunteerView","employeeGroups","allGroups","completedTraining","BrowserRouter","watchedIntroVideo","onFinishedIntroVideo","updated","updateUserAttributes","dbUpdated","saveUserAlias","awsmobile","Amplify","config","graphql_headers","Authorization","getIdToken","getJwtToken","App","gaConfig","trackingId","initialize","lastSavedTime","autoLogoffTime","signOutUser","currTime","handleOnActionWithDebounce","handleOnAction","addActiveTime","useIdleTimer","crossTab","emitOnAllTabs","timeout","onIdle","onAction","newLastSavedTime","addActiveTimeS","AlertStore","AppRouting","ToastContainer","closeOnClick","pauseOnFocusLoss","pauseOnHover","hostname","ReactDOM","StrictMode","navigator","serviceWorker","ready","registration","unregister","catch"],"mappings":"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","file":"static/js/main.b17dc12e.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/edit.86475384.svg\";","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOUAAAByCAYAAACsqhbtAAAAAXNSR0IArs4c6QAAAHhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAAFKAAAAAQAAAUoAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAOWgAwAEAAAAAQAAAHIAAAAAeG8HHgAAAAlwSFlzAAAywAAAMsABKGRa2wAABItJREFUeAHt3TtPFFEYgOFZISFeYmw0sbEyxsTEEk1sLEEs/B1a2+tv4qaljYkaS5GgrZWJkQ2N4u64XJYsC+zuDDNzzuw8NsDO5Ryeb18hXDRJ/CFAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgROCMyceMQDtRC4cnvx+sWbd1/N3biz/efn1o9abNomJxKYnegsJ0UjsBfjzNzMy96GXiRJ61K3k6xGszkbKURAlIUwln+T4RjLX9EKoQREGUp+wnXFOCHUFJ0mykiHKcZIB1PBtkRZAXKWJcSYRWs6zxVlJHMdiPF57ws4lyPZlm0EEBBlAPTBJcU4qOH1PQFRBnoeiDEQfA2WFWXFQxJjxeA1XE6UFQ1NjBVBT8Eyoix5iGIsGXgKby/KkoYqxpJgG3BbURY8ZDEWDNrA24myoKGLsSBIt/EtkfM+B8R4XkHXDwv4SDksMuHbYpwQymmZBUSZkUyMGcGcnlmglfmKhl4wEOP+LxdHxPA7TdLdiPZjK3kEusmj9teVb3uX+kg5BnAgxlh/UPxaK/F365gxRn+486971OLRK9HvuuIN1iDGikUsV5WAKIekxTgE4s3KBUR5SC7Gyp97FjxDoPFRivGMZ4aHgwk0NkoxBnvOWXiMQOOiFOOYZ4TDwQUaE6UYgz/XbGBCgQsTnlf702ZmL9xKk+S+f5Sq9qOc+negMVFub65+bn9ZWUjTzsPeT8C8nfrJegdrK9CYKPsTam+sfRBnX8PLGAUaF2V/COLsS3gZm0Bjo+wPQpx9CS9jEWh8lP1BiLMv4WVoAVEOTeBYnGnyZuiwNwmULiDKM4j349xYXux9pfZBKs4zlDxchoAox6j2vlL7sS3OMUoOFyngt2Mzal6993Q+SVuvW61kIeOlpZzeTTvP0r/p+1Ju7qaVCex8X//VW6yzt6Aoc7LHEmenkzze2Vx+l/PdcFmEAj59zTkUn9bmhHPZWAFRjiUafYI4R/s4ml1AlNnNTr1CnKeyeDCHgChzoI265Hic6fqocx0jcJqAKE9TKeCxgzhXnhx8n1OcBZA25haiLHnU4iwZeApvL8qKhirOiqCnYBlRVjxEcVYMXsPlRBloaOIMBF+DZUUZeEjiDDyACJcXZSRDEWckg4hgG6KMYAiDWxiKc23wmNebISDKSOd8GOfS4fc5xRnpnMrYlijLUC3wnuIsELMmtxJlTQZ1FOduMp+mqY+cNZlbnm2KMo9awGvaW8uf2hsrS73/UF2cAedgaQKjBPyi+igdxwgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKEHgP+CKbexvu8viAAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/pursuit_icon.7f7a478d.svg\";","module.exports = \"data:image/png;base64,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IJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAQTAAEAAAAgmAAIAAAAAMEEQAAAAAAIJgACAAAAQDABEAAAAACCCYAAAAAAEEwABAAAAIBgAiAAAAAABBMAAQAAACCYAAgAAAAAwQRAAAAAAAgmAAIAAABAMAEQAAAAAIIJgAAAAAAQTAAEAAAAgGACIAAAAAAEEwABAAAAIJgACAAAAADBBEAAAAAACCYAAgAAAEAwARAAAAAAggmAAAAAABBMAAQAAACAYAIgAAAAAAT7f7NQqrlfpdqJAAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/crowd.25a82be3.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/police.05607e1c.png\";","module.exports = __webpack_public_path__ + \"static/media/hexagons.e5cbebae.png\";","module.exports = __webpack_public_path__ + \"static/media/Guardian-Group-Logo.0a53fd21.png\";","import React, { createContext, useContext, useEffect, useState } from 'react';\n\nconst FocusContext = createContext({\n  isFocused: null,\n});\n\nconst FocusContextProvider = ({ children }) => {\n  const [windowIsActive, setWindowIsActive] = useState(true);\n\n  function handleActivity(forcedFlag) {\n    if (typeof forcedFlag === 'boolean') {\n      return forcedFlag ? setWindowIsActive(true) : setWindowIsActive(false);\n    }\n\n    return document.hidden ? setWindowIsActive(false) : setWindowIsActive(true);\n  }\n\n  useEffect(() => {\n    const handleActivityFalse = () => handleActivity(false);\n    const handleActivityTrue = () => handleActivity(true);\n\n    document.addEventListener('visibilitychange', handleActivity);\n    document.addEventListener('blur', handleActivityFalse);\n    window.addEventListener('blur', handleActivityFalse);\n    window.addEventListener('focus', handleActivityTrue);\n    document.addEventListener('focus', handleActivityTrue);\n\n    return () => {\n      window.removeEventListener('blur', handleActivity);\n      document.removeEventListener('blur', handleActivityFalse);\n      window.removeEventListener('focus', handleActivityFalse);\n      document.removeEventListener('focus', handleActivityTrue);\n      document.removeEventListener('visibilitychange', handleActivityTrue);\n    };\n  }, []);\n\n  return <FocusContext.Provider value={{ isFocused: windowIsActive }}>{children}</FocusContext.Provider>;\n};\n\nconst useFocus = () => useContext(FocusContext);\n\nexport default FocusContext;\n\nexport { FocusContextProvider, useFocus };\n","/* eslint-disable */\n// this is an auto generated file. This will be overwritten\n\nexport const adminCreateUser = /* GraphQL */ `\n  mutation AdminCreateUser($input: AdminCreateUserInput!) {\n    adminCreateUser(input: $input) {\n      id\n      identityId\n      email\n      alias\n      firstName\n      lastName\n      dateOfBirth\n      country\n      state\n      zip\n      heardAboutUs\n      watchedIntroVideo\n      userStatus\n      certificatePath\n      disabledReason\n      scoreAwardLevels {\n        key\n        value\n      }\n      _deleted\n      lastSignInAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const adminCreateLeo = /* GraphQL */ `\n  mutation AdminCreateLeo($input: AdminCreateLEOInput!) {\n    adminCreateLeo(input: $input) {\n      id\n      identityId\n      email\n      firstName\n      lastName\n      country\n      state\n      zip\n      agency\n      position\n      department\n      city\n      downloads\n      userStatus\n      disabledReason\n      _deleted\n      lastSignInAt\n      lastDownloadedAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const updateUser = /* GraphQL */ `\n  mutation UpdateUser($input: UpdateUserInput!) {\n    updateUser(input: $input) {\n      id\n      identityId\n      email\n      alias\n      firstName\n      lastName\n      dateOfBirth\n      country\n      state\n      zip\n      heardAboutUs\n      watchedIntroVideo\n      userStatus\n      certificatePath\n      disabledReason\n      scoreAwardLevels {\n        key\n        value\n      }\n      _deleted\n      lastSignInAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const updateUserRecord = /* GraphQL */ `\n  mutation UpdateUserRecord($id: String!, $input: UpdateLEOInput!) {\n    updateUserRecord(id: $id, input: $input) {\n      id\n      identityId\n      email\n      firstName\n      lastName\n      country\n      state\n      zip\n      agency\n      position\n      department\n      city\n      downloads\n      userStatus\n      disabledReason\n      _deleted\n      lastSignInAt\n      lastDownloadedAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const submitCertification = /* GraphQL */ `\n  mutation SubmitCertification($certificatePath: String!) {\n    submitCertification(certificatePath: $certificatePath) {\n      id\n      identityId\n      email\n      alias\n      firstName\n      lastName\n      dateOfBirth\n      country\n      state\n      zip\n      heardAboutUs\n      watchedIntroVideo\n      userStatus\n      certificatePath\n      disabledReason\n      scoreAwardLevels {\n        key\n        value\n      }\n      _deleted\n      lastSignInAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const updateUserType = /* GraphQL */ `\n  mutation UpdateUserType($id: String!, $type: UserType!) {\n    updateUserType(id: $id, type: $type) {\n      id\n      identityId\n      email\n      alias\n      firstName\n      lastName\n      dateOfBirth\n      country\n      state\n      zip\n      heardAboutUs\n      watchedIntroVideo\n      userStatus\n      certificatePath\n      disabledReason\n      scoreAwardLevels {\n        key\n        value\n      }\n      _deleted\n      lastSignInAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const approveUser = /* GraphQL */ `\n  mutation ApproveUser($id: String!) {\n    approveUser(id: $id) {\n      id\n      identityId\n      email\n      alias\n      firstName\n      lastName\n      dateOfBirth\n      country\n      state\n      zip\n      heardAboutUs\n      watchedIntroVideo\n      userStatus\n      certificatePath\n      disabledReason\n      scoreAwardLevels {\n        key\n        value\n      }\n      _deleted\n      lastSignInAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const enableUser = /* GraphQL */ `\n  mutation EnableUser($id: String!) {\n    enableUser(id: $id) {\n      id\n      identityId\n      email\n      alias\n      firstName\n      lastName\n      dateOfBirth\n      country\n      state\n      zip\n      heardAboutUs\n      watchedIntroVideo\n      userStatus\n      certificatePath\n      disabledReason\n      scoreAwardLevels {\n        key\n        value\n      }\n      _deleted\n      lastSignInAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const disableUser = /* GraphQL */ `\n  mutation DisableUser($id: String!, $disableReason: String!) {\n    disableUser(id: $id, disableReason: $disableReason) {\n      id\n      identityId\n      email\n      alias\n      firstName\n      lastName\n      dateOfBirth\n      country\n      state\n      zip\n      heardAboutUs\n      watchedIntroVideo\n      userStatus\n      certificatePath\n      disabledReason\n      scoreAwardLevels {\n        key\n        value\n      }\n      _deleted\n      lastSignInAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const deleteUser = /* GraphQL */ `\n  mutation DeleteUser($id: String!) {\n    deleteUser(id: $id) {\n      id\n      identityId\n      email\n      alias\n      firstName\n      lastName\n      dateOfBirth\n      country\n      state\n      zip\n      heardAboutUs\n      watchedIntroVideo\n      userStatus\n      certificatePath\n      disabledReason\n      scoreAwardLevels {\n        key\n        value\n      }\n      _deleted\n      lastSignInAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const addActiveTimeS = /* GraphQL */ `\n  mutation AddActiveTimeS($input: AddActiveTimeInput!) {\n    addActiveTimeS(input: $input)\n  }\n`;\nexport const createCase = /* GraphQL */ `\n  mutation CreateCase($input: CreateCaseInput!) {\n    createCase(input: $input) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const updateCase = /* GraphQL */ `\n  mutation UpdateCase($input: UpdateCaseInput!) {\n    updateCase(input: $input) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const employeeUpdateCase = /* GraphQL */ `\n  mutation EmployeeUpdateCase($input: EmployeeUpdateCaseInput!) {\n    employeeUpdateCase(input: $input) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const deleteCase = /* GraphQL */ `\n  mutation DeleteCase($id: String!) {\n    deleteCase(id: $id) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const nullifyCase = /* GraphQL */ `\n  mutation NullifyCase($id: String!) {\n    nullifyCase(id: $id) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const setCasePhoto = /* GraphQL */ `\n  mutation SetCasePhoto($input: SetCasePhotoInput!) {\n    setCasePhoto(input: $input) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const setCaseReportBreakpoints = /* GraphQL */ `\n  mutation SetCaseReportBreakpoints($input: SetBreakpointsInput!) {\n    setCaseReportBreakpoints(input: $input) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const submitCase = /* GraphQL */ `\n  mutation SubmitCase($input: SubmitCaseInput!) {\n    submitCase(input: $input) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const assignCase = /* GraphQL */ `\n  mutation AssignCase($input: AssignCaseInput!) {\n    assignCase(input: $input) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const unassignCase = /* GraphQL */ `\n  mutation UnassignCase($input: UnassignCaseInput!) {\n    unassignCase(input: $input) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const unapproveCase = /* GraphQL */ `\n  mutation UnapproveCase($id: String!) {\n    unapproveCase(id: $id) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const approveCase = /* GraphQL */ `\n  mutation ApproveCase($id: String!) {\n    approveCase(id: $id) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const returnCase = /* GraphQL */ `\n  mutation ReturnCase($id: String!) {\n    returnCase(id: $id) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const mergeCases = /* GraphQL */ `\n  mutation MergeCases($input: MergeCasesInput!) {\n    mergeCases(input: $input) {\n      sortedCaseNumbers\n      mergedParentId\n    }\n  }\n`;\nexport const removeFromMergedCase = /* GraphQL */ `\n  mutation RemoveFromMergedCase($input: RemoveFromMergedCaseInput!) {\n    removeFromMergedCase(input: $input)\n  }\n`;\nexport const updateMergedCaseSources = /* GraphQL */ `\n  mutation UpdateMergedCaseSources($input: UpdateMergedCaseSourcesInput!) {\n    updateMergedCaseSources(input: $input)\n  }\n`;\nexport const generateReportPdf = /* GraphQL */ `\n  mutation GenerateReportPdf($id: String!) {\n    generateReportPdf(id: $id)\n  }\n`;\nexport const shareMfaCredentials = /* GraphQL */ `\n  mutation ShareMfaCredentials($email: String!) {\n    shareMfaCredentials(email: $email)\n  }\n`;\nexport const downloadCase = /* GraphQL */ `\n  mutation DownloadCase($input: DownloadCaseInput) {\n    downloadCase(input: $input) {\n      preSignedUrl\n    }\n  }\n`;\nexport const adminDownloadCase = /* GraphQL */ `\n  mutation AdminDownloadCase($input: AdminDownloadCaseInput!) {\n    adminDownloadCase(input: $input) {\n      preSignedUrl\n    }\n  }\n`;\nexport const emailCaseFile = /* GraphQL */ `\n  mutation EmailCaseFile($email: String!, $caseId: String!) {\n    emailCaseFile(email: $email, caseId: $caseId)\n  }\n`;\nexport const createTutorial = /* GraphQL */ `\n  mutation CreateTutorial($input: CreateTutorialInput!) {\n    createTutorial(input: $input) {\n      s3Key\n      thumbnailS3Key\n      time\n      title\n      description\n      dateUploaded\n      author\n      authorName\n      category\n    }\n  }\n`;\nexport const updateTutorial = /* GraphQL */ `\n  mutation UpdateTutorial($input: UpdateTutorialInput!) {\n    updateTutorial(input: $input) {\n      s3Key\n      thumbnailS3Key\n      time\n      title\n      description\n      dateUploaded\n      author\n      authorName\n      category\n    }\n  }\n`;\nexport const deleteTutorial = /* GraphQL */ `\n  mutation DeleteTutorial($s3Key: String!) {\n    deleteTutorial(s3Key: $s3Key) {\n      s3Key\n      thumbnailS3Key\n      time\n      title\n      description\n      dateUploaded\n      author\n      authorName\n      category\n    }\n  }\n`;\nexport const createNotificationCallback = /* GraphQL */ `\n  mutation CreateNotificationCallback($input: CreateNotificationInput!) {\n    createNotificationCallback(input: $input) {\n      id\n      title\n      message\n      type\n      recipient\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const createUserNotification = /* GraphQL */ `\n  mutation CreateUserNotification($input: CreateNotificationInput!) {\n    createUserNotification(input: $input)\n  }\n`;\nexport const createMessage = /* GraphQL */ `\n  mutation CreateMessage($input: CreateMessageInput!) {\n    createMessage(input: $input) {\n      error\n      createdCount\n    }\n  }\n`;\nexport const createVolunteerMessage = /* GraphQL */ `\n  mutation CreateVolunteerMessage($input: CreateMessageInput!) {\n    createVolunteerMessage(input: $input) {\n      error\n      createdCount\n    }\n  }\n`;\nexport const unreadMessage = /* GraphQL */ `\n  mutation UnreadMessage($id: ID!) {\n    unreadMessage(id: $id) {\n      id\n      title\n      message\n      subject\n      type\n      recipient\n      recipientAlias\n      recipientName\n      recipientCount\n      recipientMeta {\n        recipientCount\n        seenCount\n        readCount\n        users {\n          id\n          alias\n          name\n          seenAt\n        }\n      }\n      sender\n      senderAlias\n      senderName\n      senderGroups\n      recipientGroups\n      createRequestId\n      replyTo\n      readAt\n      seenAt\n      adminFlaggedAt\n      assignedTo\n      assignedToName\n      createdAt\n      updatedAt\n      replyPath\n      rootMessageId\n      attributes {\n        startDate\n        endDate\n        customTitle\n        includeMessage\n        fileAttachments {\n          name\n          path\n          size\n          type\n        }\n      }\n    }\n  }\n`;\nexport const readMessage = /* GraphQL */ `\n  mutation ReadMessage($id: ID!) {\n    readMessage(id: $id) {\n      id\n      title\n      message\n      subject\n      type\n      recipient\n      recipientAlias\n      recipientName\n      recipientCount\n      recipientMeta {\n        recipientCount\n        seenCount\n        readCount\n        users {\n          id\n          alias\n          name\n          seenAt\n        }\n      }\n      sender\n      senderAlias\n      senderName\n      senderGroups\n      recipientGroups\n      createRequestId\n      replyTo\n      readAt\n      seenAt\n      adminFlaggedAt\n      assignedTo\n      assignedToName\n      createdAt\n      updatedAt\n      replyPath\n      rootMessageId\n      attributes {\n        startDate\n        endDate\n        customTitle\n        includeMessage\n        fileAttachments {\n          name\n          path\n          size\n          type\n        }\n      }\n    }\n  }\n`;\nexport const unflagMessage = /* GraphQL */ `\n  mutation UnflagMessage($id: ID!) {\n    unflagMessage(id: $id) {\n      id\n      title\n      message\n      subject\n      type\n      recipient\n      recipientAlias\n      recipientName\n      recipientCount\n      recipientMeta {\n        recipientCount\n        seenCount\n        readCount\n        users {\n          id\n          alias\n          name\n          seenAt\n        }\n      }\n      sender\n      senderAlias\n      senderName\n      senderGroups\n      recipientGroups\n      createRequestId\n      replyTo\n      readAt\n      seenAt\n      adminFlaggedAt\n      assignedTo\n      assignedToName\n      createdAt\n      updatedAt\n      replyPath\n      rootMessageId\n      attributes {\n        startDate\n        endDate\n        customTitle\n        includeMessage\n        fileAttachments {\n          name\n          path\n          size\n          type\n        }\n      }\n    }\n  }\n`;\nexport const flagMessage = /* GraphQL */ `\n  mutation FlagMessage($id: ID!) {\n    flagMessage(id: $id) {\n      id\n      title\n      message\n      subject\n      type\n      recipient\n      recipientAlias\n      recipientName\n      recipientCount\n      recipientMeta {\n        recipientCount\n        seenCount\n        readCount\n        users {\n          id\n          alias\n          name\n          seenAt\n        }\n      }\n      sender\n      senderAlias\n      senderName\n      senderGroups\n      recipientGroups\n      createRequestId\n      replyTo\n      readAt\n      seenAt\n      adminFlaggedAt\n      assignedTo\n      assignedToName\n      createdAt\n      updatedAt\n      replyPath\n      rootMessageId\n      attributes {\n        startDate\n        endDate\n        customTitle\n        includeMessage\n        fileAttachments {\n          name\n          path\n          size\n          type\n        }\n      }\n    }\n  }\n`;\nexport const deleteMessage = /* GraphQL */ `\n  mutation DeleteMessage($id: ID!) {\n    deleteMessage(id: $id) {\n      id\n      title\n      message\n      subject\n      type\n      recipient\n      recipientAlias\n      recipientName\n      recipientCount\n      recipientMeta {\n        recipientCount\n        seenCount\n        readCount\n        users {\n          id\n          alias\n          name\n          seenAt\n        }\n      }\n      sender\n      senderAlias\n      senderName\n      senderGroups\n      recipientGroups\n      createRequestId\n      replyTo\n      readAt\n      seenAt\n      adminFlaggedAt\n      assignedTo\n      assignedToName\n      createdAt\n      updatedAt\n      replyPath\n      rootMessageId\n      attributes {\n        startDate\n        endDate\n        customTitle\n        includeMessage\n        fileAttachments {\n          name\n          path\n          size\n          type\n        }\n      }\n    }\n  }\n`;\nexport const assignMessage = /* GraphQL */ `\n  mutation AssignMessage($input: AssignMessageInput!) {\n    assignMessage(input: $input) {\n      id\n      title\n      message\n      subject\n      type\n      recipient\n      recipientAlias\n      recipientName\n      recipientCount\n      recipientMeta {\n        recipientCount\n        seenCount\n        readCount\n        users {\n          id\n          alias\n          name\n          seenAt\n        }\n      }\n      sender\n      senderAlias\n      senderName\n      senderGroups\n      recipientGroups\n      createRequestId\n      replyTo\n      readAt\n      seenAt\n      adminFlaggedAt\n      assignedTo\n      assignedToName\n      createdAt\n      updatedAt\n      replyPath\n      rootMessageId\n      attributes {\n        startDate\n        endDate\n        customTitle\n        includeMessage\n        fileAttachments {\n          name\n          path\n          size\n          type\n        }\n      }\n    }\n  }\n`;\nexport const createAdminNotifications = /* GraphQL */ `\n  mutation CreateAdminNotifications($input: CreateAdminNotificationsInput!) {\n    createAdminNotifications(input: $input)\n  }\n`;\nexport const clearNotificationCount = /* GraphQL */ `\n  mutation ClearNotificationCount {\n    clearNotificationCount\n  }\n`;\nexport const generateAlias = /* GraphQL */ `\n  mutation GenerateAlias($input: GenerateAliasInput) {\n    generateAlias(input: $input) {\n      aliases\n      error\n    }\n  }\n`;\n","/**\n * Custom date display and formatter\n */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { DateTime } from 'luxon';\n/**\n * Date Formatter\n * @param {Object} props - React props\n * @param {Date} props.date - Date to format\n * @param {String} props.format - Format of date\n * @param {String} props.defaultReturn - Default display if no date\n * @returns {JSX.Element} - The component\n */\n\nconst DateDisplay = ({ date, defaultReturn = '-', format = 'DATE_SHORT' }) => {\n  if (!date) {\n    return defaultReturn;\n  }\n  const dt = DateTime.fromJSDate(new Date(date));\n  const title = dt.toLocaleString(DateTime.DATETIME_FULL);\n  const formattedDate = dt.toLocaleString(DateTime[format]);\n  return (\n    <>\n      <span title={title}>{formattedDate}</span>\n    </>\n  );\n};\n\nDateDisplay.propTypes = {\n  date: PropTypes.oneOfType([PropTypes.string, PropTypes.instanceOf(Date)]).isRequired,\n  defaultReturn: PropTypes.string,\n  format: PropTypes.string,\n};\n\nexport default DateDisplay;\n","const AlertNotificationReducer = (state, action) => {\n  switch (action.type) {\n    case 'SET_NOTIFICATION':\n      return {\n        ...state,\n        notification: action.payload,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default AlertNotificationReducer;\n","import React, { createContext, useReducer } from 'react';\nimport AlertNotificationReducer from './AlertReducer.js';\n\nconst initialState = {\n  notification: {\n    occurs: false,\n    message: '',\n    textColor: '',\n    borderColor: '',\n  },\n};\n\nconst Store = ({ children }) => {\n  const [state, dispatch] = useReducer(AlertNotificationReducer, initialState);\n\n  return <NotificationContext.Provider value={[state, dispatch]}>{children}</NotificationContext.Provider>;\n};\n\nexport const NotificationContext = createContext(initialState);\nexport default Store;\n","/* eslint-disable */\n// this is an auto generated file. This will be overwritten\n\nexport const getUser = /* GraphQL */ `\n  query GetUser {\n    getUser {\n      id\n      identityId\n      email\n      alias\n      firstName\n      lastName\n      dateOfBirth\n      country\n      state\n      zip\n      heardAboutUs\n      watchedIntroVideo\n      userStatus\n      certificatePath\n      disabledReason\n      scoreAwardLevels {\n        key\n        value\n      }\n      _deleted\n      lastSignInAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const getUserById = /* GraphQL */ `\n  query GetUserById($id: ID) {\n    getUserById(id: $id) {\n      id\n      identityId\n      email\n      alias\n      firstName\n      lastName\n      dateOfBirth\n      country\n      state\n      zip\n      heardAboutUs\n      watchedIntroVideo\n      userStatus\n      certificatePath\n      disabledReason\n      scoreAwardLevels {\n        key\n        value\n      }\n      _deleted\n      lastSignInAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const getLeoUserById = /* GraphQL */ `\n  query GetLeoUserById($id: ID) {\n    getLeoUserById(id: $id) {\n      id\n      identityId\n      email\n      firstName\n      lastName\n      country\n      state\n      zip\n      agency\n      position\n      department\n      city\n      downloads\n      userStatus\n      disabledReason\n      _deleted\n      lastSignInAt\n      lastDownloadedAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const listVolunteers = /* GraphQL */ `\n  query ListVolunteers(\n    $userStatus: UserStatus\n    $searchTerm: String\n    $nextToken: NextUserInput\n    $sortField: UserSortField\n    $sortOrder: SortDirection\n    $limit: Int\n  ) {\n    listVolunteers(\n      userStatus: $userStatus\n      searchTerm: $searchTerm\n      nextToken: $nextToken\n      sortField: $sortField\n      sortOrder: $sortOrder\n      limit: $limit\n    ) {\n      items {\n        id\n        identityId\n        email\n        alias\n        firstName\n        lastName\n        dateOfBirth\n        country\n        state\n        zip\n        heardAboutUs\n        watchedIntroVideo\n        userStatus\n        certificatePath\n        disabledReason\n        scoreAwardLevels {\n          key\n          value\n        }\n        _deleted\n        lastSignInAt\n        approvedAt\n        disabledAt\n        createdAt\n        updatedAt\n      }\n      nextToken {\n        id\n        lastName\n        isEmployee\n        email\n        alias\n        firstName\n        state\n        userStatus\n        lastSignInAt\n        createdAt\n      }\n    }\n  }\n`;\nexport const listEmployees = /* GraphQL */ `\n  query ListEmployees(\n    $userStatus: UserStatus\n    $searchTerm: String\n    $nextToken: NextUserInput\n    $sortField: UserSortField\n    $sortOrder: SortDirection\n    $limit: Int\n  ) {\n    listEmployees(\n      userStatus: $userStatus\n      searchTerm: $searchTerm\n      nextToken: $nextToken\n      sortField: $sortField\n      sortOrder: $sortOrder\n      limit: $limit\n    ) {\n      items {\n        id\n        identityId\n        email\n        alias\n        firstName\n        lastName\n        dateOfBirth\n        country\n        state\n        zip\n        heardAboutUs\n        watchedIntroVideo\n        userStatus\n        certificatePath\n        disabledReason\n        scoreAwardLevels {\n          key\n          value\n        }\n        _deleted\n        lastSignInAt\n        approvedAt\n        disabledAt\n        createdAt\n        updatedAt\n      }\n      nextToken {\n        id\n        lastName\n        isEmployee\n        email\n        alias\n        firstName\n        state\n        userStatus\n        lastSignInAt\n        createdAt\n      }\n    }\n  }\n`;\nexport const getCase = /* GraphQL */ `\n  query GetCase($id: ID!) {\n    getCase(id: $id) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const listOwnedCases = /* GraphQL */ `\n  query ListOwnedCases(\n    $status: [CaseStatus]\n    $searchTerm: String\n    $nextToken: NextCaseInput\n    $sortField: CaseSortField\n    $sortOrder: SortDirection\n    $limit: Int\n  ) {\n    listOwnedCases(\n      status: $status\n      searchTerm: $searchTerm\n      nextToken: $nextToken\n      sortField: $sortField\n      sortOrder: $sortOrder\n      limit: $limit\n    ) {\n      items {\n        id\n        caseNumber\n        sequentialNumber\n        tempCaseNumber\n        owner\n        ownerAlias\n        assignedTo\n        assignedToName\n        firstName\n        middleName\n        lastName\n        age\n        city\n        state\n        details\n        escortAd {\n          url\n          phones {\n            id\n            type\n            number\n          }\n          description\n        }\n        webSources {\n          id\n          website\n          url\n          uniqueFields {\n            title\n            username\n            userId\n            displayName\n            profileName\n            profilePictureUrl\n            registeredPhoneNumber\n            phoneNumber\n            phoneType\n            dateOfBirth\n            email\n            cashtag\n            escortSiteTitle\n            adLocation\n            adDate\n          }\n          description\n        }\n        staffSources {\n          id\n          website\n          url\n          uniqueFields {\n            title\n            username\n            userId\n            displayName\n            profileName\n            profilePictureUrl\n            registeredPhoneNumber\n            phoneNumber\n            phoneType\n            dateOfBirth\n            email\n            cashtag\n            escortSiteTitle\n            adLocation\n            adDate\n          }\n          description\n          author\n          previousSourceId\n        }\n        sourceOrder\n        status\n        investigatorNotes\n        lat\n        lon\n        mergedParentId\n        reportImages {\n          id\n          s3Key\n        }\n        reportKey\n        breakpoints\n        submittedAt\n        returnedAt\n        approvedAt\n        yearApproved\n        wasReturned\n        returnCount\n        awardClassificationOption\n        feedbackComments {\n          stepId\n          feedback\n        }\n        awardedPoints {\n          stepId\n          awardType\n        }\n        totalPoints {\n          pointsAwarded\n          fullPoints\n          isFullPoints\n        }\n        _deleted\n        createdAt\n        updatedAt\n        deletedAt\n      }\n      nextToken {\n        id\n        createdAt\n        submittedAt\n        assignedTo\n        status\n        owner\n        caseNumber\n        sequentialNumber\n        ownerAlias\n        firstName\n        lastName\n        state\n      }\n    }\n  }\n`;\nexport const listAssignedCases = /* GraphQL */ `\n  query ListAssignedCases(\n    $status: CaseStatus\n    $searchTerm: String\n    $nextToken: NextCaseInput\n    $sortField: CaseSortField\n    $sortOrder: SortDirection\n    $limit: Int\n  ) {\n    listAssignedCases(\n      status: $status\n      searchTerm: $searchTerm\n      nextToken: $nextToken\n      sortField: $sortField\n      sortOrder: $sortOrder\n      limit: $limit\n    ) {\n      items {\n        id\n        caseNumber\n        sequentialNumber\n        tempCaseNumber\n        owner\n        ownerAlias\n        assignedTo\n        assignedToName\n        firstName\n        middleName\n        lastName\n        age\n        city\n        state\n        details\n        escortAd {\n          url\n          phones {\n            id\n            type\n            number\n          }\n          description\n        }\n        webSources {\n          id\n          website\n          url\n          uniqueFields {\n            title\n            username\n            userId\n            displayName\n            profileName\n            profilePictureUrl\n            registeredPhoneNumber\n            phoneNumber\n            phoneType\n            dateOfBirth\n            email\n            cashtag\n            escortSiteTitle\n            adLocation\n            adDate\n          }\n          description\n        }\n        staffSources {\n          id\n          website\n          url\n          uniqueFields {\n            title\n            username\n            userId\n            displayName\n            profileName\n            profilePictureUrl\n            registeredPhoneNumber\n            phoneNumber\n            phoneType\n            dateOfBirth\n            email\n            cashtag\n            escortSiteTitle\n            adLocation\n            adDate\n          }\n          description\n          author\n          previousSourceId\n        }\n        sourceOrder\n        status\n        investigatorNotes\n        lat\n        lon\n        mergedParentId\n        reportImages {\n          id\n          s3Key\n        }\n        reportKey\n        breakpoints\n        submittedAt\n        returnedAt\n        approvedAt\n        yearApproved\n        wasReturned\n        returnCount\n        awardClassificationOption\n        feedbackComments {\n          stepId\n          feedback\n        }\n        awardedPoints {\n          stepId\n          awardType\n        }\n        totalPoints {\n          pointsAwarded\n          fullPoints\n          isFullPoints\n        }\n        _deleted\n        createdAt\n        updatedAt\n        deletedAt\n      }\n      nextToken {\n        id\n        createdAt\n        submittedAt\n        assignedTo\n        status\n        owner\n        caseNumber\n        sequentialNumber\n        ownerAlias\n        firstName\n        lastName\n        state\n      }\n    }\n  }\n`;\nexport const listCasesForAdmin = /* GraphQL */ `\n  query ListCasesForAdmin(\n    $status: CaseStatus\n    $assignedTo: String\n    $searchTerm: String\n    $nextToken: NextCaseInput\n    $sortField: CaseSortField\n    $sortOrder: SortDirection\n    $limit: Int\n  ) {\n    listCasesForAdmin(\n      status: $status\n      assignedTo: $assignedTo\n      searchTerm: $searchTerm\n      nextToken: $nextToken\n      sortField: $sortField\n      sortOrder: $sortOrder\n      limit: $limit\n    ) {\n      items {\n        id\n        caseNumber\n        sequentialNumber\n        tempCaseNumber\n        owner\n        ownerAlias\n        assignedTo\n        assignedToName\n        firstName\n        middleName\n        lastName\n        age\n        city\n        state\n        details\n        escortAd {\n          url\n          phones {\n            id\n            type\n            number\n          }\n          description\n        }\n        webSources {\n          id\n          website\n          url\n          uniqueFields {\n            title\n            username\n            userId\n            displayName\n            profileName\n            profilePictureUrl\n            registeredPhoneNumber\n            phoneNumber\n            phoneType\n            dateOfBirth\n            email\n            cashtag\n            escortSiteTitle\n            adLocation\n            adDate\n          }\n          description\n        }\n        staffSources {\n          id\n          website\n          url\n          uniqueFields {\n            title\n            username\n            userId\n            displayName\n            profileName\n            profilePictureUrl\n            registeredPhoneNumber\n            phoneNumber\n            phoneType\n            dateOfBirth\n            email\n            cashtag\n            escortSiteTitle\n            adLocation\n            adDate\n          }\n          description\n          author\n          previousSourceId\n        }\n        sourceOrder\n        status\n        investigatorNotes\n        lat\n        lon\n        mergedParentId\n        reportImages {\n          id\n          s3Key\n        }\n        reportKey\n        breakpoints\n        submittedAt\n        returnedAt\n        approvedAt\n        yearApproved\n        wasReturned\n        returnCount\n        awardClassificationOption\n        feedbackComments {\n          stepId\n          feedback\n        }\n        awardedPoints {\n          stepId\n          awardType\n        }\n        totalPoints {\n          pointsAwarded\n          fullPoints\n          isFullPoints\n        }\n        _deleted\n        createdAt\n        updatedAt\n        deletedAt\n      }\n      nextToken {\n        id\n        createdAt\n        submittedAt\n        assignedTo\n        status\n        owner\n        caseNumber\n        sequentialNumber\n        ownerAlias\n        firstName\n        lastName\n        state\n      }\n    }\n  }\n`;\nexport const getMergedCase = /* GraphQL */ `\n  query GetMergedCase($id: String) {\n    getMergedCase(id: $id) {\n      caseNumbers\n      sources\n      sequentialNumber\n    }\n  }\n`;\nexport const getCasesByNo = /* GraphQL */ `\n  query GetCasesByNo($caseNoList: String) {\n    getCasesByNo(caseNoList: $caseNoList) {\n      id\n      caseNumber\n      sequentialNumber\n      tempCaseNumber\n      owner\n      ownerAlias\n      assignedTo\n      assignedToName\n      firstName\n      middleName\n      lastName\n      age\n      city\n      state\n      details\n      escortAd {\n        url\n        phones {\n          id\n          type\n          number\n        }\n        description\n      }\n      webSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n      }\n      staffSources {\n        id\n        website\n        url\n        uniqueFields {\n          title\n          username\n          userId\n          displayName\n          profileName\n          profilePictureUrl\n          registeredPhoneNumber\n          phoneNumber\n          phoneType\n          dateOfBirth\n          email\n          cashtag\n          escortSiteTitle\n          adLocation\n          adDate\n        }\n        description\n        author\n        previousSourceId\n      }\n      sourceOrder\n      status\n      investigatorNotes\n      lat\n      lon\n      mergedParentId\n      reportImages {\n        id\n        s3Key\n      }\n      reportKey\n      breakpoints\n      submittedAt\n      returnedAt\n      approvedAt\n      yearApproved\n      wasReturned\n      returnCount\n      awardClassificationOption\n      feedbackComments {\n        stepId\n        feedback\n      }\n      awardedPoints {\n        stepId\n        awardType\n      }\n      totalPoints {\n        pointsAwarded\n        fullPoints\n        isFullPoints\n      }\n      _deleted\n      createdAt\n      updatedAt\n      deletedAt\n    }\n  }\n`;\nexport const listTutorials = /* GraphQL */ `\n  query ListTutorials(\n    $searchTerm: String\n    $category: String\n    $nextToken: NextTutorialInput\n    $sortField: TutorialSortField\n    $sortOrder: SortDirection\n    $limit: Int\n  ) {\n    listTutorials(\n      searchTerm: $searchTerm\n      category: $category\n      nextToken: $nextToken\n      sortField: $sortField\n      sortOrder: $sortOrder\n      limit: $limit\n    ) {\n      items {\n        s3Key\n        thumbnailS3Key\n        time\n        title\n        description\n        dateUploaded\n        author\n        authorName\n        category\n      }\n      nextToken {\n        s3Key\n        dateUploaded\n        time\n        title\n        description\n        authorName\n        category\n      }\n    }\n  }\n`;\nexport const getNotificationCount = /* GraphQL */ `\n  query GetNotificationCount {\n    getNotificationCount\n  }\n`;\nexport const listNotifications = /* GraphQL */ `\n  query ListNotifications(\n    $nextToken: NextNotificationInput\n    $sortOrder: SortDirection\n    $limit: Int\n  ) {\n    listNotifications(\n      nextToken: $nextToken\n      sortOrder: $sortOrder\n      limit: $limit\n    ) {\n      items {\n        id\n        title\n        message\n        type\n        recipient\n        createdAt\n        updatedAt\n      }\n      nextToken {\n        id\n        recipient\n        createdAt\n      }\n    }\n  }\n`;\nexport const listMessages = /* GraphQL */ `\n  query ListMessages(\n    $nextToken: NextMessageInput\n    $sortField: MessageSortField\n    $sortOrder: SortDirection\n    $limit: Int\n  ) {\n    listMessages(\n      nextToken: $nextToken\n      sortField: $sortField\n      sortOrder: $sortOrder\n      limit: $limit\n    ) {\n      items {\n        id\n        title\n        message\n        subject\n        type\n        recipient\n        recipientAlias\n        recipientName\n        recipientCount\n        recipientMeta {\n          recipientCount\n          seenCount\n          readCount\n          users {\n            id\n            alias\n            name\n            seenAt\n          }\n        }\n        sender\n        senderAlias\n        senderName\n        senderGroups\n        recipientGroups\n        createRequestId\n        replyTo\n        readAt\n        seenAt\n        adminFlaggedAt\n        assignedTo\n        assignedToName\n        createdAt\n        updatedAt\n        replyPath\n        rootMessageId\n        attributes {\n          startDate\n          endDate\n          customTitle\n          includeMessage\n          fileAttachments {\n            name\n            path\n            size\n            type\n          }\n        }\n      }\n      nextToken {\n        id\n        title\n        message\n        subject\n        type\n        recipient\n        recipientAlias\n        recipientName\n        recipientCount\n        recipientMeta {\n          recipientCount\n          seenCount\n          readCount\n          users {\n            id\n            alias\n            name\n            seenAt\n          }\n        }\n        sender\n        senderAlias\n        senderName\n        senderGroups\n        recipientGroups\n        createRequestId\n        replyTo\n        readAt\n        seenAt\n        adminFlaggedAt\n        assignedTo\n        assignedToName\n        createdAt\n        updatedAt\n        replyPath\n        rootMessageId\n        attributes {\n          startDate\n          endDate\n          customTitle\n          includeMessage\n          fileAttachments {\n            name\n            path\n            size\n            type\n          }\n        }\n      }\n    }\n  }\n`;\nexport const listAllMessages = /* GraphQL */ `\n  query ListAllMessages(\n    $nextToken: NextMessageInput\n    $sortOrder: SortDirection\n    $sortField: MessageSortField\n    $limit: Int\n  ) {\n    listAllMessages(\n      nextToken: $nextToken\n      sortOrder: $sortOrder\n      sortField: $sortField\n      limit: $limit\n    ) {\n      items {\n        id\n        title\n        message\n        subject\n        type\n        recipient\n        recipientAlias\n        recipientName\n        recipientCount\n        recipientMeta {\n          recipientCount\n          seenCount\n          readCount\n          users {\n            id\n            alias\n            name\n            seenAt\n          }\n        }\n        sender\n        senderAlias\n        senderName\n        senderGroups\n        recipientGroups\n        createRequestId\n        replyTo\n        readAt\n        seenAt\n        adminFlaggedAt\n        assignedTo\n        assignedToName\n        createdAt\n        updatedAt\n        replyPath\n        rootMessageId\n        attributes {\n          startDate\n          endDate\n          customTitle\n          includeMessage\n          fileAttachments {\n            name\n            path\n            size\n            type\n          }\n        }\n      }\n      nextToken {\n        id\n        title\n        message\n        subject\n        type\n        recipient\n        recipientAlias\n        recipientName\n        recipientCount\n        recipientMeta {\n          recipientCount\n          seenCount\n          readCount\n          users {\n            id\n            alias\n            name\n            seenAt\n          }\n        }\n        sender\n        senderAlias\n        senderName\n        senderGroups\n        recipientGroups\n        createRequestId\n        replyTo\n        readAt\n        seenAt\n        adminFlaggedAt\n        assignedTo\n        assignedToName\n        createdAt\n        updatedAt\n        replyPath\n        rootMessageId\n        attributes {\n          startDate\n          endDate\n          customTitle\n          includeMessage\n          fileAttachments {\n            name\n            path\n            size\n            type\n          }\n        }\n      }\n    }\n  }\n`;\nexport const listGroupMessages = /* GraphQL */ `\n  query ListGroupMessages(\n    $nextToken: NextMessageInput\n    $group: String\n    $sortOrder: SortDirection\n    $sortField: MessageSortField\n    $limit: Int\n  ) {\n    listGroupMessages(\n      nextToken: $nextToken\n      group: $group\n      sortOrder: $sortOrder\n      sortField: $sortField\n      limit: $limit\n    ) {\n      items {\n        id\n        title\n        message\n        subject\n        type\n        recipient\n        recipientAlias\n        recipientName\n        recipientCount\n        recipientMeta {\n          recipientCount\n          seenCount\n          readCount\n          users {\n            id\n            alias\n            name\n            seenAt\n          }\n        }\n        sender\n        senderAlias\n        senderName\n        senderGroups\n        recipientGroups\n        createRequestId\n        replyTo\n        readAt\n        seenAt\n        adminFlaggedAt\n        assignedTo\n        assignedToName\n        createdAt\n        updatedAt\n        replyPath\n        rootMessageId\n        attributes {\n          startDate\n          endDate\n          customTitle\n          includeMessage\n          fileAttachments {\n            name\n            path\n            size\n            type\n          }\n        }\n      }\n      nextToken {\n        id\n        title\n        message\n        subject\n        type\n        recipient\n        recipientAlias\n        recipientName\n        recipientCount\n        recipientMeta {\n          recipientCount\n          seenCount\n          readCount\n          users {\n            id\n            alias\n            name\n            seenAt\n          }\n        }\n        sender\n        senderAlias\n        senderName\n        senderGroups\n        recipientGroups\n        createRequestId\n        replyTo\n        readAt\n        seenAt\n        adminFlaggedAt\n        assignedTo\n        assignedToName\n        createdAt\n        updatedAt\n        replyPath\n        rootMessageId\n        attributes {\n          startDate\n          endDate\n          customTitle\n          includeMessage\n          fileAttachments {\n            name\n            path\n            size\n            type\n          }\n        }\n      }\n    }\n  }\n`;\nexport const sentMessages = /* GraphQL */ `\n  query SentMessages(\n    $nextToken: NextMessageInput\n    $sortField: MessageSortField\n    $sortOrder: SortDirection\n    $limit: Int\n  ) {\n    sentMessages(\n      nextToken: $nextToken\n      sortField: $sortField\n      sortOrder: $sortOrder\n      limit: $limit\n    ) {\n      items {\n        id\n        title\n        message\n        subject\n        type\n        recipient\n        recipientAlias\n        recipientName\n        recipientCount\n        recipientMeta {\n          recipientCount\n          seenCount\n          readCount\n          users {\n            id\n            alias\n            name\n            seenAt\n          }\n        }\n        sender\n        senderAlias\n        senderName\n        senderGroups\n        recipientGroups\n        createRequestId\n        replyTo\n        readAt\n        seenAt\n        adminFlaggedAt\n        assignedTo\n        assignedToName\n        createdAt\n        updatedAt\n        replyPath\n        rootMessageId\n        attributes {\n          startDate\n          endDate\n          customTitle\n          includeMessage\n          fileAttachments {\n            name\n            path\n            size\n            type\n          }\n        }\n      }\n      nextToken {\n        id\n        title\n        message\n        subject\n        type\n        recipient\n        recipientAlias\n        recipientName\n        recipientCount\n        recipientMeta {\n          recipientCount\n          seenCount\n          readCount\n          users {\n            id\n            alias\n            name\n            seenAt\n          }\n        }\n        sender\n        senderAlias\n        senderName\n        senderGroups\n        recipientGroups\n        createRequestId\n        replyTo\n        readAt\n        seenAt\n        adminFlaggedAt\n        assignedTo\n        assignedToName\n        createdAt\n        updatedAt\n        replyPath\n        rootMessageId\n        attributes {\n          startDate\n          endDate\n          customTitle\n          includeMessage\n          fileAttachments {\n            name\n            path\n            size\n            type\n          }\n        }\n      }\n    }\n  }\n`;\nexport const sentGroupMessages = /* GraphQL */ `\n  query SentGroupMessages(\n    $nextToken: NextMessageInput\n    $group: String\n    $sortField: MessageSortField\n    $sortOrder: SortDirection\n    $limit: Int\n  ) {\n    sentGroupMessages(\n      nextToken: $nextToken\n      group: $group\n      sortField: $sortField\n      sortOrder: $sortOrder\n      limit: $limit\n    ) {\n      items {\n        id\n        title\n        message\n        subject\n        type\n        recipient\n        recipientAlias\n        recipientName\n        recipientCount\n        recipientMeta {\n          recipientCount\n          seenCount\n          readCount\n          users {\n            id\n            alias\n            name\n            seenAt\n          }\n        }\n        sender\n        senderAlias\n        senderName\n        senderGroups\n        recipientGroups\n        createRequestId\n        replyTo\n        readAt\n        seenAt\n        adminFlaggedAt\n        assignedTo\n        assignedToName\n        createdAt\n        updatedAt\n        replyPath\n        rootMessageId\n        attributes {\n          startDate\n          endDate\n          customTitle\n          includeMessage\n          fileAttachments {\n            name\n            path\n            size\n            type\n          }\n        }\n      }\n      nextToken {\n        id\n        title\n        message\n        subject\n        type\n        recipient\n        recipientAlias\n        recipientName\n        recipientCount\n        recipientMeta {\n          recipientCount\n          seenCount\n          readCount\n          users {\n            id\n            alias\n            name\n            seenAt\n          }\n        }\n        sender\n        senderAlias\n        senderName\n        senderGroups\n        recipientGroups\n        createRequestId\n        replyTo\n        readAt\n        seenAt\n        adminFlaggedAt\n        assignedTo\n        assignedToName\n        createdAt\n        updatedAt\n        replyPath\n        rootMessageId\n        attributes {\n          startDate\n          endDate\n          customTitle\n          includeMessage\n          fileAttachments {\n            name\n            path\n            size\n            type\n          }\n        }\n      }\n    }\n  }\n`;\nexport const getMessage = /* GraphQL */ `\n  query GetMessage($id: ID!) {\n    getMessage(id: $id) {\n      id\n      title\n      message\n      subject\n      type\n      recipient\n      recipientAlias\n      recipientName\n      recipientCount\n      recipientMeta {\n        recipientCount\n        seenCount\n        readCount\n        users {\n          id\n          alias\n          name\n          seenAt\n        }\n      }\n      sender\n      senderAlias\n      senderName\n      senderGroups\n      recipientGroups\n      createRequestId\n      replyTo\n      readAt\n      seenAt\n      adminFlaggedAt\n      assignedTo\n      assignedToName\n      createdAt\n      updatedAt\n      replyPath\n      rootMessageId\n      attributes {\n        startDate\n        endDate\n        customTitle\n        includeMessage\n        fileAttachments {\n          name\n          path\n          size\n          type\n        }\n      }\n    }\n  }\n`;\nexport const viewMessage = /* GraphQL */ `\n  query ViewMessage($id: ID!) {\n    viewMessage(id: $id) {\n      id\n      title\n      message\n      subject\n      type\n      recipient\n      recipientAlias\n      recipientName\n      recipientCount\n      recipientMeta {\n        recipientCount\n        seenCount\n        readCount\n        users {\n          id\n          alias\n          name\n          seenAt\n        }\n      }\n      sender\n      senderAlias\n      senderName\n      senderGroups\n      recipientGroups\n      createRequestId\n      replyTo\n      readAt\n      seenAt\n      adminFlaggedAt\n      assignedTo\n      assignedToName\n      createdAt\n      updatedAt\n      replyPath\n      rootMessageId\n      attributes {\n        startDate\n        endDate\n        customTitle\n        includeMessage\n        fileAttachments {\n          name\n          path\n          size\n          type\n        }\n      }\n    }\n  }\n`;\nexport const listMessageThreads = /* GraphQL */ `\n  query ListMessageThreads($id: ID!) {\n    listMessageThreads(id: $id) {\n      items {\n        id\n        title\n        message\n        subject\n        type\n        recipient\n        recipientAlias\n        recipientName\n        recipientCount\n        recipientMeta {\n          recipientCount\n          seenCount\n          readCount\n          users {\n            id\n            alias\n            name\n            seenAt\n          }\n        }\n        sender\n        senderAlias\n        senderName\n        senderGroups\n        recipientGroups\n        createRequestId\n        replyTo\n        readAt\n        seenAt\n        adminFlaggedAt\n        assignedTo\n        assignedToName\n        createdAt\n        updatedAt\n        replyPath\n        rootMessageId\n        attributes {\n          startDate\n          endDate\n          customTitle\n          includeMessage\n          fileAttachments {\n            name\n            path\n            size\n            type\n          }\n        }\n      }\n      nextToken {\n        replyPath\n      }\n    }\n  }\n`;\nexport const getTopLeaderboard = /* GraphQL */ `\n  query GetTopLeaderboard($board: String!) {\n    getTopLeaderboard(board: $board) {\n      rankings {\n        id\n        rank\n        alias\n        leadsApproved\n        leadsSubmitted\n        totalPoints\n        hoursSpent\n      }\n    }\n  }\n`;\nexport const getUserRank = /* GraphQL */ `\n  query GetUserRank($board: String!, $id: ID!) {\n    getUserRank(board: $board, id: $id)\n  }\n`;\nexport const getUserLeaderboardSummary = /* GraphQL */ `\n  query GetUserLeaderboardSummary($board: String!, $id: ID) {\n    getUserLeaderboardSummary(board: $board, id: $id) {\n      rank\n      points\n      pointsPercent\n      leadsApproved\n      leadsSubmitted\n    }\n  }\n`;\nexport const getCaseMapData = /* GraphQL */ `\n  query GetCaseMapData($board: String, $id: ID) {\n    getCaseMapData(board: $board, id: $id) {\n      userCases {\n        name\n        lat\n        lon\n      }\n      crowdCases {\n        name\n        lat\n        lon\n      }\n      userOver18Cases {\n        name\n        lat\n        lon\n      }\n      crowdOver18Cases {\n        name\n        lat\n        lon\n      }\n    }\n  }\n`;\nexport const getHistoryStatistics = /* GraphQL */ `\n  query GetHistoryStatistics($board: String!, $id: ID) {\n    getHistoryStatistics(board: $board, id: $id) {\n      leadsApproved {\n        time\n        value\n      }\n      leadsSubmitted {\n        time\n        value\n      }\n      userLeadsApproved {\n        time\n        value\n      }\n      userLeadsSubmitted {\n        time\n        value\n      }\n      usersTotal {\n        time\n        value\n      }\n      usersNew {\n        time\n        value\n      }\n      hoursCrowd {\n        time\n        value\n      }\n      hoursUser {\n        time\n        value\n      }\n    }\n  }\n`;\nexport const listLeos = /* GraphQL */ `\n  query ListLeos(\n    $userStatus: UserStatus\n    $searchTerm: String\n    $nextToken: NextUserInput\n    $sortField: UserSortField\n    $sortOrder: SortDirection\n    $limit: Int\n  ) {\n    listLeos(\n      userStatus: $userStatus\n      searchTerm: $searchTerm\n      nextToken: $nextToken\n      sortField: $sortField\n      sortOrder: $sortOrder\n      limit: $limit\n    ) {\n      items {\n        id\n        identityId\n        email\n        firstName\n        lastName\n        country\n        state\n        zip\n        agency\n        position\n        department\n        city\n        downloads\n        userStatus\n        disabledReason\n        _deleted\n        lastSignInAt\n        lastDownloadedAt\n        approvedAt\n        disabledAt\n        createdAt\n        updatedAt\n      }\n      nextToken {\n        id\n        lastName\n        isEmployee\n        email\n        alias\n        firstName\n        state\n        userStatus\n        lastSignInAt\n        createdAt\n      }\n    }\n  }\n`;\nexport const searchQuery = /* GraphQL */ `\n  query SearchQuery($searchTerm: String!, $limit: Int, $from: Int) {\n    searchQuery(searchTerm: $searchTerm, limit: $limit, from: $from) {\n      items {\n        id\n        source {\n          id\n          caseNumber\n          sequentialNumber\n          tempCaseNumber\n          owner\n          ownerAlias\n          assignedTo\n          assignedToName\n          firstName\n          middleName\n          lastName\n          age\n          city\n          state\n          details\n          escortAd {\n            url\n            phones {\n              id\n              type\n              number\n            }\n            description\n          }\n          webSources {\n            id\n            website\n            url\n            uniqueFields {\n              title\n              username\n              userId\n              displayName\n              profileName\n              profilePictureUrl\n              registeredPhoneNumber\n              phoneNumber\n              phoneType\n              dateOfBirth\n              email\n              cashtag\n              escortSiteTitle\n              adLocation\n              adDate\n            }\n            description\n          }\n          staffSources {\n            id\n            website\n            url\n            uniqueFields {\n              title\n              username\n              userId\n              displayName\n              profileName\n              profilePictureUrl\n              registeredPhoneNumber\n              phoneNumber\n              phoneType\n              dateOfBirth\n              email\n              cashtag\n              escortSiteTitle\n              adLocation\n              adDate\n            }\n            description\n            author\n            previousSourceId\n          }\n          sourceOrder\n          status\n          investigatorNotes\n          lat\n          lon\n          mergedParentId\n          reportImages {\n            id\n            s3Key\n          }\n          reportKey\n          breakpoints\n          submittedAt\n          returnedAt\n          approvedAt\n          yearApproved\n          wasReturned\n          returnCount\n          awardClassificationOption\n          feedbackComments {\n            stepId\n            feedback\n          }\n          awardedPoints {\n            stepId\n            awardType\n          }\n          totalPoints {\n            pointsAwarded\n            fullPoints\n            isFullPoints\n          }\n          _deleted\n          createdAt\n          updatedAt\n          deletedAt\n        }\n        score\n        highlights\n      }\n      totalHits\n    }\n  }\n`;\n","import React, { useState, useCallback, useEffect, useContext } from 'react';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport {\n  createMessage as createAdminMessageMutation,\n  createVolunteerMessage as createVolunteerMessageMutation,\n  unreadMessage as unreadMessageMutation,\n  readMessage as readMessageMutation,\n  flagMessage as flagMessageMutation,\n  unflagMessage as unflagMessageMutation,\n  deleteMessage as deleteMessageMutation,\n  assignMessage as assignMessageMutation,\n} from '../generated/graphql/mutations';\nimport {\n  listMessages as listMessagesQuery,\n  getMessage as getMessageQuery,\n  viewMessage as viewMessageQuery,\n  listAllMessages as listAllMessagesQuery,\n  sentMessages as sentMessagesQuery,\n  sentGroupMessages as sentGroupMessagesQuery,\n  listGroupMessages as listGroupMessagesQuery,\n} from '../generated/graphql/queries';\nimport { NotificationContext } from '../helpers/AlertContext/AlertContext';\nimport { toast } from 'react-toastify';\n\nconst validateMessage = thing => {\n  const { title, message, type, recipients } = thing;\n  if (!title || !message || !type || !recipients || !Array.isArray(recipients)) {\n    // throw new Error('Missing required notification data');\n    console.error('Not a valid message', thing);\n    return false;\n  }\n  return true;\n};\n\nconst createMessageRequest = async (data, asAdmin = false) => {\n  const input = {\n    ...data,\n  };\n  // console.log('input: ', { input, asAdmin });\n  // return { id: '123' };\n  if (validateMessage(input)) {\n    const mutation = asAdmin ? createAdminMessageMutation : createVolunteerMessageMutation;\n    const { data: result } = await API.graphql(\n      graphqlOperation(mutation, {\n        input,\n      })\n    );\n    // console.log('result: ', JSON.stringify(result));\n    return result.createMessage || result.createVolunteerMessage;\n  } else {\n    throw new Error('Missing required message data');\n  }\n};\n\nconst sortableMessageFields = ['createdAt', 'senderAlias', 'title', 'subject', 'recipientAlias'];\n\nexport const useMessages = ({ limit, asAdmin = false } = {}) => {\n  const [loading, setLoading] = useState(false);\n  const [messages, setMessages] = useState([]);\n  const [messageCount, setMessageCount] = useState(0);\n  const [resultLimit, setResultLimit] = useState(limit || 10);\n  const [nextToken, setNextToken] = useState(null);\n  const [sortField, setSortField] = useState(sortableMessageFields[0]);\n  const [sortDirection, setSortDirection] = useState('DESC');\n  // const [sortDirection, setSortDirection] = useState('ASC');\n  const [, setAlert] = useContext(NotificationContext);\n\n  const setSort = useCallback(\n    ({ fieldName, direction, ...rest }) => {\n      console.info('Setting field', { fieldName, direction, rest });\n      if (sortableMessageFields.includes(fieldName)) {\n        setSortField(fieldName);\n        setSortDirection(direction);\n      } else {\n        console.error('Invalid sort field', { fieldName, direction, rest });\n      }\n    },\n    // [setSortField, setSortDirection]\n    []\n  );\n\n  const addMessage = useCallback(async message => {\n    setLoading(true);\n    // const { recipients: recipientParams, ...params } = message;\n    // const { recipients, ...params } = message;\n    // const recipients = recipientParams.split(',');\n\n    const resultIds = [];\n    try {\n      // console.log({ message });\n\n      const id = await createMessageRequest(message, asAdmin);\n      resultIds.push(id);\n    } catch (e) {\n      setLoading(false);\n      throw e;\n    }\n\n    setLoading(false);\n    return resultIds;\n  }, []);\n\n  const loadMessageDetail = useCallback(id => {\n    const fetchData = async () => {\n      const params = { id };\n      // const {\n      //   data: { listMessages: messages },\n      // } = await API.graphql(graphqlOperation(getMessage, params));\n      setLoading(true);\n      // let result = null;\n      try {\n        const {\n          data: { getMessage: message },\n        } = await API.graphql(graphqlOperation(getMessageQuery, params));\n        setLoading(false);\n        return message;\n      } catch (e) {\n        const {\n          data: { getMessage: message },\n        } = e;\n        console.error('Error loading message', e);\n        setLoading(false);\n        return message;\n        // console.log('FAIL5', e);\n      }\n    };\n    // try {\n    return fetchData();\n    // } catch (e) {\n    //   setLoading(false);\n    //   console.log('FAIL');\n    //   console.error(e);\n    // }\n  }, []);\n\n  const viewMessageDetail = useCallback(id => {\n    const fetchData = async () => {\n      const params = { id };\n      setLoading(true);\n      try {\n        const {\n          data: { viewMessage: message },\n        } = await API.graphql(graphqlOperation(viewMessageQuery, params));\n        setLoading(false);\n        return message;\n      } catch (e) {\n        const {\n          data: { getMessage: message },\n        } = e;\n        console.error('Error loading message', e);\n        setLoading(false);\n        return message;\n      }\n    };\n    return fetchData();\n  }, []);\n\n  const listMessages = useCallback(() => {\n    const fetchData = async () => {\n      const params = {\n        limit: resultLimit,\n        nextToken,\n        sortOrder: sortDirection,\n        sortField,\n      };\n      // const {\n      //   data: { listMessages: messages },\n      // } = await API.graphql(graphqlOperation(getMessage, params));\n      setLoading(true);\n      try {\n        const {\n          data: {\n            listMessages: { items, nextToken },\n          },\n        } = await API.graphql(graphqlOperation(listMessagesQuery, params));\n        setLoading(false);\n        // console.log({ items });\n        const noneNullNextToken = nextToken\n          ? Object.keys(nextToken).reduce((acc, key) => {\n              if (nextToken[key]) {\n                acc[key] = nextToken[key];\n              }\n              return acc;\n            }, {})\n          : nextToken;\n        setNextToken(noneNullNextToken);\n        // setNextToken(nextToken);\n        return items;\n      } catch (e) {\n        console.error(e);\n        setLoading(false);\n        const { data } = e;\n        if (data) {\n          const {\n            listMessages: { items, nextToken },\n          } = data;\n          setNextToken(nextToken);\n          return items;\n        }\n        // const {\n        //   data: {\n        //     listMessages: { items },\n        //   },\n        // } = e;\n      }\n    };\n    return fetchData();\n  }, [sortField, sortDirection, nextToken]);\n\n  const listSentMessages = useCallback(\n    ({ group } = {}) => {\n      const fetchData = async () => {\n        const params = {\n          limit: resultLimit,\n          group,\n          nextToken,\n          sortOrder: sortDirection,\n          sortField,\n        };\n        let query = sentMessagesQuery;\n        let resultKey = 'sentMessages';\n        if (asAdmin) {\n          query = sentGroupMessagesQuery;\n          resultKey = 'sentGroupMessages';\n        }\n        // const {\n        //   data: { listMessages: messages },\n        // } = await API.graphql(graphqlOperation(getMessage, params));\n        setLoading(true);\n        try {\n          const {\n            data: {\n              [resultKey]: { items, nextToken },\n            },\n          } = await API.graphql(graphqlOperation(query, params));\n          setLoading(false);\n          // Create a new next token with all the none null values\n          const noneNullNextToken = nextToken\n            ? Object.keys(nextToken).reduce((acc, key) => {\n                if (nextToken[key]) {\n                  acc[key] = nextToken[key];\n                }\n                return acc;\n              }, {})\n            : nextToken;\n          // setNextToken(nextToken);\n          console.log({ noneNullNextToken });\n          setNextToken(noneNullNextToken);\n          // console.log({ items });\n          return items;\n        } catch (e) {\n          console.error(e);\n          setLoading(false);\n          const { data } = e;\n          if (data) {\n            const {\n              // listMessages: { items },\n              [resultKey]: { items, nextToken },\n            } = data;\n            const noneNullNextToken = nextToken\n              ? Object.keys(nextToken).reduce((acc, key) => {\n                  if (nextToken[key]) {\n                    acc[key] = nextToken[key];\n                  }\n                  return acc;\n                }, {})\n              : nextToken;\n            // setNextToken(nextToken);\n            console.log({ noneNullNextToken });\n            setNextToken(noneNullNextToken);\n            return items;\n          }\n          // const {\n          //   data: {\n          //     listMessages: { items },\n          //   },\n          // } = e;\n        }\n      };\n      return fetchData();\n    },\n    [sortField, sortDirection, nextToken]\n  );\n\n  const assignMessage = useCallback(\n    async ({ id, userId, name }, updateLoading = true) => {\n      const fetchData = async () => {\n        const params = {\n          input: {\n            id,\n            // : messageId,\n            assignedToName: name,\n            assignedTo: userId,\n          },\n        };\n        updateLoading && setLoading(true);\n        try {\n          const {\n            data: { assignMessage: message },\n          } = await API.graphql(graphqlOperation(assignMessageMutation, params));\n          updateLoading && setLoading(false);\n          // const oldMessages = [...messages];\n          // const messageToUpdateIdx = oldMessages.findIndex(x => x.id === id);\n          // if (messageToUpdateIdx !== -1) {\n          //   const updatedMessage = oldMessages[messageToUpdateIdx];\n          //   updatedMessage.assignedTo = userId;\n          //   updatedMessage.assignedToName = name;\n          //   oldMessages[messageToUpdateIdx] = updatedMessage;\n          //   setMessages([...oldMessages]);\n          // }\n          // console.log({ message, oldMessages, messageToUpdateIdx, messages });\n          toast.success('Message assigned', {\n            progress: false,\n            className: 'bg-green-500 text-white',\n            autoClose: 1500,\n            closeButton: false,\n            // icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n          });\n          return message;\n        } catch (e) {\n          updateLoading && setLoading(false);\n          // const {\n          //   // data: { assignMessage: message = undefined },\n          //   errors: [{ message: errorMessage }],\n          // } = e;\n          console.error('Error assigning message: ', e);\n          setAlert({\n            type: 'SET_NOTIFICATION',\n            payload: {\n              occurs: true,\n              message: e,\n              textColor: 'redText',\n              borderColor: 'redBorder',\n            },\n          });\n          return null;\n        }\n      };\n      return fetchData();\n    },\n    [messages, setMessages]\n  );\n  const resetNextToken = useCallback(() => {\n    setNextToken(null);\n  }, []);\n\n  const listAllMessages = useCallback(() => {\n    const fetchData = async () => {\n      const params = {\n        limit: resultLimit,\n        nextToken,\n        sortOrder: sortDirection,\n        sortField,\n      };\n      setLoading(true);\n      try {\n        const {\n          data: {\n            listAllMessages: { items },\n          },\n        } = await API.graphql(graphqlOperation(listAllMessagesQuery, params));\n        setLoading(false);\n        return items;\n      } catch (e) {\n        console.error(e);\n        setLoading(false);\n        const { data } = e;\n        if (data) {\n          const {\n            listMessages: { items },\n          } = data;\n          return items;\n        }\n      }\n    };\n    return fetchData();\n  }, [sortField, sortDirection, nextToken]);\n\n  const listSharedMessages = useCallback(\n    ({ group, condense = true, condenseOn = 'rootMessageId' }) => {\n      const fetchData = async () => {\n        const params = {\n          limit: resultLimit,\n          group,\n          nextToken,\n          sortOrder: sortDirection,\n          sortField,\n        };\n        // console.log({ params });\n        setLoading(true);\n        try {\n          const {\n            data: {\n              listGroupMessages: { items, nextToken },\n            },\n          } = await API.graphql(graphqlOperation(listGroupMessagesQuery, params));\n          setLoading(false);\n          const noneNullNextToken = nextToken\n            ? Object.keys(nextToken).reduce((acc, key) => {\n                if (nextToken[key]) {\n                  acc[key] = nextToken[key];\n                }\n                return acc;\n              }, {})\n            : nextToken;\n          setNextToken(noneNullNextToken);\n          // setNextToken(nextToken);\n          return condense\n            ? items.reduce((acc, cur) => {\n                const existingObject = cur && cur[condenseOn] && acc.find(x => x[condenseOn] === cur[condenseOn]);\n                if (!existingObject) {\n                  cur.threadCount = 1;\n                  acc.push(cur);\n                } else {\n                  existingObject.threadCount += 1;\n                }\n                return acc;\n              }, [])\n            : items;\n        } catch (e) {\n          console.error(e);\n          setLoading(false);\n          const { data } = e;\n          if (data) {\n            const {\n              listGroupMessages: { items },\n            } = data;\n            return items;\n          }\n        }\n      };\n      return fetchData();\n    },\n    [sortField, sortDirection, nextToken]\n  );\n\n  const readMessage = useCallback((id, updateLoading = true) => {\n    const fetchData = async () => {\n      const params = { id };\n      updateLoading && setLoading(true);\n      try {\n        const {\n          data: { readMessage: message },\n        } = await API.graphql(graphqlOperation(readMessageMutation, params));\n        updateLoading && setLoading(false);\n        return message;\n      } catch (e) {\n        updateLoading && setLoading(false);\n        const {\n          data: { readMessage: message },\n        } = e;\n        console.error(e);\n        return message;\n      }\n    };\n    return fetchData();\n  }, []);\n  const flagMessage = useCallback((id, updateLoading = true) => {\n    const fetchData = async () => {\n      const params = { id };\n      updateLoading && setLoading(true);\n      try {\n        const {\n          data: { flagMessage: message },\n        } = await API.graphql(graphqlOperation(flagMessageMutation, params));\n        updateLoading && setLoading(false);\n        return message;\n      } catch (e) {\n        updateLoading && setLoading(false);\n        const {\n          data: { readMessage: message },\n        } = e;\n        console.error(e);\n        return message;\n      }\n    };\n    return fetchData();\n  }, []);\n\n  const deleteMessage = useCallback((id, updateLoading = true) => {\n    const fetchData = async () => {\n      const params = { id };\n      updateLoading && setLoading(true);\n      try {\n        const {\n          data: { deleteMessage: message },\n        } = await API.graphql(graphqlOperation(deleteMessageMutation, params));\n        updateLoading && setLoading(false);\n        return message;\n      } catch (e) {\n        updateLoading && setLoading(false);\n        const {\n          data: { deleteMessage: message },\n        } = e;\n        console.error(e);\n        return message;\n      }\n    };\n    return fetchData();\n  }, []);\n\n  const unreadMessage = useCallback((id, updateLoading = true) => {\n    const fetchData = async () => {\n      const params = { id };\n      updateLoading && setLoading(true);\n      try {\n        const {\n          data: { unreadMessage: message },\n        } = await API.graphql(graphqlOperation(unreadMessageMutation, params));\n        updateLoading && setLoading(false);\n        return message;\n      } catch (e) {\n        updateLoading && setLoading(false);\n        const {\n          data: { unreadMessage: message },\n        } = e;\n        console.error(e);\n        return message;\n      }\n    };\n    return fetchData();\n  }, []);\n\n  const unflagMessage = useCallback((id, updateLoading = true) => {\n    const fetchData = async () => {\n      const params = { id };\n      updateLoading && setLoading(true);\n      try {\n        const {\n          data: { unflagMessage: message },\n        } = await API.graphql(graphqlOperation(unflagMessageMutation, params));\n        updateLoading && setLoading(false);\n        return message;\n      } catch (e) {\n        updateLoading && setLoading(false);\n        const {\n          data: { unreadMessage: message },\n        } = e;\n        console.error(e);\n        return message;\n      }\n    };\n    return fetchData();\n  }, []);\n\n  return {\n    loading,\n    messages,\n    messageCount,\n    setMessages,\n    addMessage,\n    loadMessageDetail,\n    listMessages,\n    listSentMessages,\n    listAllMessages,\n    listSharedMessages,\n    readMessage,\n    viewMessageDetail,\n    unreadMessage,\n    setSort,\n    setResultLimit,\n    flagMessage,\n    unflagMessage,\n    deleteMessage,\n    assignMessage,\n    resetNextToken,\n    // sort: { field: sortField, direction: sortDirection },\n    sortField,\n    sortDirection,\n    sortableMessageFields,\n    nextToken,\n  };\n};\n\nexport const isMessageFromAdmin = message => {\n  const adminGroup = 'Admin';\n  return (message.senderGroups || []).includes(adminGroup);\n};\n\nexport const getInboxUid = group => `#inbox-group#${group.toLowerCase()}`;\n","import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { API, graphqlOperation, Auth } from 'aws-amplify';\nimport { getUser } from '../generated/graphql/queries';\nimport { updateUser } from '../generated/graphql/mutations';\nimport ReactGA from 'react-ga4';\n\nconst UserContext = createContext({\n  user: null,\n  setUser: () => null,\n  userGroups: null,\n});\n\nconst UserProvider = ({ children, user, setUser }) => {\n  const [userGroups, setUserGroups] = useState(null);\n  const [isLoading, setIsLoading] = useState(true);\n\n  const isCertified = userGroups && userGroups.includes('Certified');\n  const isAdmin = userGroups && userGroups.includes('Admin');\n  const isEmployee = isAdmin || (userGroups && userGroups.includes('Employee'));\n\n  // Set google analytics to track the user by id and add groups as custom dimensions\n  const analyticsSetUserParams = userObj => {\n    if (!userObj || !userObj.id) {\n      return;\n    }\n    const params = {\n      user_id: userObj.id,\n      user_properties: {\n        user_status: userObj.userStatus,\n        heard_about_us: userObj.heardAboutUs,\n      },\n    };\n    // console.log('Setting user params', params, { userObj });\n    ReactGA.set(params);\n  };\n\n  useEffect(() => {\n    const fetchData = async () => {\n      try {\n        setIsLoading(true);\n        const currentAuthUser = await Auth.currentAuthenticatedUser({ bypassCache: true });\n\n        if (currentAuthUser && currentAuthUser.attributes && currentAuthUser.attributes.sub) {\n          const result = await API.graphql(graphqlOperation(getUser));\n\n          const userToSet = { ...result.data.getUser, cognitoUser: currentAuthUser };\n\n          setUser(userToSet);\n\n          const groups = currentAuthUser.signInUserSession.accessToken.payload['cognito:groups'];\n\n          setUserGroups(groups || []);\n\n          const { id } = await Auth.currentUserInfo();\n\n          analyticsSetUserParams(userToSet);\n\n          await API.graphql(\n            graphqlOperation(updateUser, { input: { lastSignInAt: new Date().toISOString(), identityId: id } })\n          );\n        }\n\n        setIsLoading(false);\n      } catch (error) {\n        console.error('Error getting user info: ', error);\n\n        if (error === 'The user is not authenticated') {\n          try {\n            await Auth.signOut();\n\n            setUser(null);\n          } catch (error) {\n            console.error(`Error -- ${error}`);\n          }\n        }\n        setIsLoading(false);\n        setUser(null);\n        setUserGroups(null);\n      }\n    };\n\n    fetchData();\n  }, []);\n\n  const loadUser = async () => {\n    try {\n      setIsLoading(true);\n      const currentAuthUser = await Auth.currentAuthenticatedUser({ bypassCache: true });\n\n      if (currentAuthUser && currentAuthUser.attributes && currentAuthUser.attributes.sub) {\n        const result = await API.graphql(graphqlOperation(getUser));\n\n        const userToSet = { ...result.data.getUser, cognitoUser: currentAuthUser };\n\n        setUser(userToSet);\n\n        const groups = currentAuthUser.signInUserSession.accessToken.payload['cognito:groups'];\n\n        setUserGroups(groups || []);\n\n        const { id } = await Auth.currentUserInfo();\n\n        analyticsSetUserParams(userToSet);\n\n        await API.graphql(\n          graphqlOperation(updateUser, { input: { lastSignInAt: new Date().toISOString(), identityId: id } })\n        );\n      }\n\n      setIsLoading(false);\n    } catch (error) {\n      console.error('Error getting user info: ', error);\n\n      if (error === 'The user is not authenticated') {\n        try {\n          await Auth.signOut();\n\n          setUser(null);\n        } catch (error) {\n          console.error(`Error -- ${error}`);\n        }\n      }\n      setIsLoading(false);\n      setUser(null);\n      setUserGroups(null);\n    }\n  };\n\n  return (\n    <UserContext.Provider\n      value={{\n        user,\n        setUser,\n        loadUser,\n        userGroups,\n        isCertified,\n        isAdmin,\n        isEmployee,\n        isLoading,\n        setIsLoading,\n      }}>\n      {children}\n    </UserContext.Provider>\n  );\n};\n\nconst useUser = () => useContext(UserContext);\n\nexport default UserContext;\n\nexport { UserProvider, useUser };\n","/**\n * Markdown parser. Returns metadata and content of a markdown string.\n * @module helpers/markdown/parser\n * @param {string} markdown\n * @returns {{metadata: Object, content: string}}\n */\nexport const parseMarkdownPage = markdown => {\n  const metadataRegex = /^---\\n([\\s\\S]*?)\\n---\\n/;\n  // const parts = markdown.match(metadataRegex);\n  const metadataMatch = markdown.match(metadataRegex);\n\n  if (!metadataMatch) {\n    return { metadata: {}, content: markdown };\n  }\n  const metadata = metadataMatch[1].split('\\n').reduce((acc, line) => {\n    const [key, value] = line.split(': ');\n\n    return { ...acc, [key]: value };\n  }, {});\n  const content = markdown.replace(metadataRegex, '');\n\n  return { metadata, content };\n  // const metadata = parts.split('\\n').reduce((acc, line) => {\n  //   const [key, value] = line.split(': ');\n\n  //   return { ...acc, [key]: value };\n  // }, {});\n  // const content = markdown.replace(metadataRegex, '');\n\n  // return { metadata, content };\n\n  // const content = split.slice(1).join('\\n---\\n');\n\n  // return { metadata, content };\n};\n\n/**\n * Parse markdown string into html\n * @param {string} markdown\n * @returns {string}\n */\nexport const parseMarkdown = markdown => {\n  if (!markdown || typeof markdown !== 'string') {\n    return '';\n  }\n  const lines = markdown.split('\\n');\n  const stack = []; // Stack to track open lists\n  let html = '';\n\n  const closeLists = level => {\n    while (stack.length > level) {\n      const tag = stack.pop();\n      html += `</${tag}>`;\n    }\n  };\n\n  lines.forEach(line => {\n    // Handle headings\n    if (/^### (.*$)/.test(line)) {\n      closeLists(0);\n      html += `<h3>${line.match(/^### (.*$)/)[1]}</h3>`;\n    } else if (/^## (.*$)/.test(line)) {\n      closeLists(0);\n      html += `<h2>${line.match(/^## (.*$)/)[1]}</h2>`;\n    } else if (/^# (.*$)/.test(line)) {\n      closeLists(0);\n      html += `<h1>${line.match(/^# (.*$)/)[1]}</h1>`;\n    }\n    // Handle blockquotes\n    else if (/^\\> (.*$)/.test(line)) {\n      closeLists(0);\n      html += `<blockquote>${line.match(/^\\> (.*$)/)[1]}</blockquote>`;\n    }\n\n    // Handle list items\n    else if (/^( *)(\\*|\\d\\.)[ \\t](.*)$/.test(line)) {\n      const match = line.match(/^( *)(\\*|\\d\\.)[ \\t](.*)$/);\n      const spaces = match[1].length;\n      const marker = match[2];\n      const content = match[3];\n      const level = spaces / 2; // Assume 2 spaces per nesting level\n      const tag = marker === '*' ? 'ul' : 'ol';\n      const className = marker === '*' ? 'list-disc' : 'list-decimal';\n\n      if (stack.length < level + 1) {\n        // Open a new list\n        stack.push(tag);\n        html += `<${tag} class=\"pl-8 ${className}\">`;\n      } else if (stack.length > level + 1) {\n        // Close lists to match the current level\n        closeLists(level + 1);\n      }\n\n      // Add the list item\n      html += `<li>${content}</li>`;\n    }\n    // Handle paragraphs\n    else if (line.trim()) {\n      closeLists(0);\n      // Replace inline markdown with html\n      const lineHtml = line\n        .replace(/\\*\\*(.*)\\*\\*/gim, '<b>$1</b>') // bold text\n        .replace(/\\*(.*)\\*/gim, '<i>$1</i>') // italic text\n        .replace(/!\\[(.*?)\\]\\((.*?)\\)/gim, '<img alt=\"$1\" src=\"$2\" />') // images\n        .replace(/\\[(.*?)\\]\\((.*?)\\)/gim, '<a href=\"$2\">$1</a>') // links\n        .trim();\n\n      html += `<p class=\"mb-4\">${lineHtml}</p>`;\n    }\n\n    // // Handle links\n    // else if (/\\[(.*?)\\]\\((.*?)\\)/.test(line)) {\n    //   // closeLists(0);\n    //   const match = line.match(/\\[(.*?)\\]\\((.*?)\\)/);\n    //   html += `<a href=\"${match[2]}\">${match[1]}</a>`;\n    // }\n    // // Handle bold text\n    // else if (/\\*\\*(.*)\\*\\*/.test(line)) {\n    //   // closeLists(0);\n    //   const match = line.match(/\\*\\*(.*)\\*\\*/);\n    //   html += `<b>${match[1]}</b>`;\n    // }\n    // // Handle italic text\n    // else if (/\\*(.*)\\*/.test(line)) {\n    //   // closeLists(0);\n    //   const match = line.match(/\\*(.*)\\*/);\n    //   html += `<i>${match[1]}</i>`;\n    // }\n    // // Handle images\n    // else if (/!\\[(.*?)\\]\\((.*?)\\)/.test(line)) {\n    //   // closeLists(0);\n    //   const match = line.match(/!\\[(.*?)\\]\\((.*?)\\)/);\n    //   html += `<img alt=\"${match[1]}\" src=\"${match[2]}\" />`;\n    // }\n  });\n\n  // Close any remaining open lists\n  closeLists(0);\n\n  return html.trim();\n};\n\nexport const parseMarkdown2 = markdown => {\n  const html = (markdown || '')\n    // Replace greater and less then signs\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/^### (.*$)/gim, '<h3>$1</h3>') // h3 tag\n    .replace(/^## (.*$)/gim, '<h2>$1</h2>') // h2 tag\n    .replace(/^# (.*$)/gim, '<h1>$1</h1>') // h1 tag\n    .replace(/\\*\\*(.*)\\*\\*/gim, '<b>$1</b>') // bold text\n    .replace(/\\*(.*)\\*/gim, '<i>$1</i>') // italic text\n    .replace(/!\\[(.*?)\\]\\((.*?)\\)/gim, '<img alt=\"$1\" src=\"$2\" />') // images\n    .replace(/\\[(.*?)\\]\\((.*?)\\)/gim, '<a href=\"$2\">$1</a>') // links\n    .replace(/^\\> (.*$)/gim, '<blockquote>$1</blockquote>') // blockquotes\n    // Wrap all lines that start with a * in a <ul>\n    // --- with hr\n    .replace(/^\\s*\\n\\*/gim, '<ul class=\"list-disc list-inside\">\\n*') // ul lists\n    .replace(/^(\\*.+)\\s*\\n([^\\*])/gim, '$1\\n</ul>\\n\\n$2') // ul lists\n\n    .replace(/^\\* (.*$)/gim, '<li>$1</li>') // ul lists\n    .replace(/^\\s*\\n\\d\\./gim, '<ol class=\"list-decimal list-inside\">\\n1.') // ol lists\n    .replace(/^\\d\\. (.*$)/gim, '<li>$1</li>') // lists\n    .replace(/^(\\d\\..+)\\s*\\n([^\\d\\.])/gim, '$1\\n</ol>\\n\\n$2') // ol lists\n\n    .replace(/^\\* (.*$)/gim, '<li>$1</li>') // lists\n    .replace(/^\\d\\. (.*$)/gim, '<li>$1</li>') // lists\n\n    // .replace(/^(?!<h|<b|<i|<ul|<ol|<li|<img|<a|<br|\\n)(.*$)/gim, '<p class=\"mb-4\">$1</p>');\n    .replace(/^(?!<h|<ul|<ol|<li|<img|<a|<br|\\n)(.*$)/gim, '<p class=\"mb-2\">$1</p>');\n  // .replace(/\\n$/gim, '<br />'); // line breaks\n\n  return html.trim(); // using trim method to remove whitespace\n};\n","import React, { useCallback, useEffect, useState, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, DropDown, TextField, UserSelector, PopUpConfirmation, FileUploader } from '../../components';\nimport { NotificationContext } from '../../helpers/AlertContext/AlertContext';\nimport { toast } from 'react-toastify';\nimport * as Icons from 'react-icons/fa';\nimport { getUserById } from '../../generated/graphql/queries';\nimport { API, graphqlOperation, label } from 'aws-amplify';\nimport Select from 'react-select';\nimport { Link } from 'react-router-dom';\nimport { useMessages } from '../../helpers/useMessages';\nimport { useUser } from '../../contexts/userContext';\nimport { useHistory } from 'react-router-dom';\nimport DatePicker from 'react-datepicker';\nimport { parseMarkdown } from '../../helpers/markdown';\n\nconst USE_VOLUNTEER_VIEW = 'USE_VOLUNTEER_VIEW';\n// Format a date object to a string in the format DD-MMM-YYYY\nconst formatDate = dateObject => {\n  const date = Object.fromEntries(\n    Intl.DateTimeFormat(undefined, { year: 'numeric', month: 'short', day: '2-digit' })\n      .formatToParts(dateObject)\n      .map(({ type, value }) => [type, value])\n  );\n  if (!date) {\n    return '';\n  }\n  // console.log({ dateObject, date });\n  // return dateObject;\n  return `${date.day}-${date.month}-${date.year}`.toUpperCase();\n};\n\n// Unformatted date string to date object, for use in date picker, dateString is in the format DD-MMM-YYYY\nconst unformatDate = dateString => {\n  const date = dateString.split('-');\n  if (date.length != 3) {\n    return null;\n  }\n  const [day, month, year] = date;\n  return new Date(`${month} ${day}, ${year}`);\n};\n\nconst toBase64 = file =>\n  new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.readAsDataURL(file);\n    // console.log('Encoding file', file);\n    reader.onload = () => {\n      // console.log('Reader', reader);\n      // console.log('Result', reader.result);\n      const response = {\n        name: file.name,\n        type: file.type,\n        size: file.size,\n        data: reader.result,\n      };\n      // return resolve(reader.result.replace(/^data:.+;base64,/, ''));\n      return resolve(response);\n      // return resolve(reader.result);\n    };\n    reader.onerror = error => reject(error);\n  });\n\nconst messageTitles = [\n  // {\n  //   label: 'Operational Support',\n  //   value: 'OPERATIONAL_SUPPORT',\n  // },\n  {\n    label: 'Operational Support',\n    value: 'OPERATIONAL_SUPPORT',\n    fields: [\n      {\n        label: 'Start Date',\n        name: 'startDate',\n        type: 'date',\n        required: true,\n        formatter: formatDate,\n        unformatter: unformatDate,\n      },\n      {\n        label: 'End Date',\n        name: 'endDate',\n        type: 'date',\n        formatter: formatDate,\n        unformatter: unformatDate,\n      },\n    ],\n  },\n  {\n    label: 'Operational Support - 24-hour Reminder',\n    value: 'OPERATIONAL_SUPPORT_24HR_REMINDER',\n    fields: [\n      {\n        label: 'Start Date',\n        name: 'startDate',\n        type: 'date',\n        required: true,\n        formatter: formatDate,\n        unformatter: unformatDate,\n      },\n      {\n        label: 'End Date',\n        name: 'endDate',\n        type: 'date',\n        formatter: formatDate,\n        unformatter: unformatDate,\n      },\n    ],\n  },\n  {\n    label: 'Operational Support - Kickoff',\n    value: 'OPERATIONAL_SUPPORT_KICKOFF',\n    fields: [\n      {\n        label: 'Start Date',\n        name: 'startDate',\n        type: 'date',\n        required: true,\n        formatter: formatDate,\n        unformatter: unformatDate,\n      },\n      {\n        label: 'End Date',\n        name: 'endDate',\n        type: 'date',\n        formatter: formatDate,\n        unformatter: unformatDate,\n      },\n    ],\n  },\n  {\n    label: 'New Feature Update',\n    value: 'NEW_FEATURE',\n  },\n  {\n    label: 'Case Feedback',\n    value: 'CASE_FEEDBACK',\n  },\n  {\n    label: 'General Information',\n    value: 'GENERAL_INFORMATION',\n  },\n  {\n    label: 'User Inquiry',\n    value: 'USER_INQUIRY',\n  },\n  {\n    label: 'Custom',\n    value: 'CUSTOM_MESSAGE',\n    fields: [\n      {\n        label: 'Custom Title',\n        name: 'customTitle',\n        type: 'text',\n        required: true,\n        // formatter: formatDate,\n        // unformatter: unformatDate,\n      },\n      {\n        label: 'Include Message in email body?',\n        name: 'includeMessage',\n        type: 'checkbox',\n      },\n      {\n        label: 'File attachments',\n        name: 'fileAttachments',\n        type: 'file',\n        formatter: toBase64,\n        maxInstances: 3,\n      },\n    ],\n  },\n];\n\nconst userDetails = id =>\n  new Promise(async resolve => {\n    const params = {\n      id,\n    };\n    if (id == '#inbox-group#admin') {\n      resolve({\n        label: 'Project 1591',\n        value: '#inbox-group#admin',\n      });\n    }\n    const response = await API.graphql(graphqlOperation(getUserById, params));\n    // console.log('response', response);\n    const { alias } = response.data.getUserById || {};\n    // const possibleUsers = response.data.listEmployees.items.map(user => ({\n    //   label: user.alias,\n    //   value: user.id,\n    // }));\n    // resolve(possibleUsers.filter(i => i.label.toLowerCase().includes(inputValue.toLowerCase())));\n    resolve({ label: alias, value: id });\n    // resolve(possibleUsers);\n    // setTimeout(() => {\n    //   resolve(filterColors(inputValue));\n    // }, 1000);\n  });\n\n// Message defaults\nconst defaults = {\n  recipients: '',\n  title: '',\n  message: '',\n};\n/**\n * Message form\n * @param {Object} props - React props\n * @param {Object} props.notification - The notification object\n * @param {string} props.notification.recipients - The recipients\n * @param {string} props.notification.title - The title\n * @param {string} props.notification.message - The message\n * @param {String} props.createLabel - Button label\n * @param {String} props.cancelLink - Link of cancel button\n * @param {Boolean} props.isReply - Disable title an subject\n * @returns {JSX.Element} - The component\n */\nconst MessageForm = ({\n  notification = defaults,\n  createLabel = 'Create',\n  cancelLabel = 'Back',\n  clearLabel = 'Clear',\n  isReply = false,\n  cancelLink = '/messaging',\n  cancelCallback,\n  createCallback,\n  noUserSelector = false,\n  subjectDisabled = false,\n  noTitle = false,\n  noSubject = false,\n  enableCreate = true,\n  confirmSend = false, // Show confirmation dialog before sending\n  manualSelectorComponent = null,\n}) => {\n  const [data, setData] = useState({ ...notification });\n  // const [data, setData] = useState({});\n  const [saving, setSaving] = useState(false);\n  const [validData, setValid] = useState(false);\n  const [showConfirmationDialog, setShowConfirmationDialog] = useState(false);\n  const [showPreview, setShowPreview] = useState(false); // State to toggle preview\n\n  // const { addNotification, loading } = useNotifications();\n  const { isEmployee } = useUser();\n  const history = useHistory();\n  const checkForVolunteerView = () => {\n    const useVolunteerSavedPref = localStorage.getItem(USE_VOLUNTEER_VIEW);\n\n    if (useVolunteerSavedPref && useVolunteerSavedPref.toLowerCase() === 'true') {\n      return true;\n    }\n\n    return false;\n  };\n\n  // Create list of message titles. If isReply is true add User Inquiry option\n  const titles = messageTitles.filter(({ value }) => isReply || value != 'USER_INQUIRY');\n\n  const [useVolunteerView, setUseVolunteerView] = useState(checkForVolunteerView());\n  const { addMessage, loading } = useMessages({ asAdmin: isEmployee && !useVolunteerView });\n  const [, setAlert] = useContext(NotificationContext);\n  const [selectedRecipients, setSelectedRecipients] = useState([]);\n  const [selectedTitle, setSelectedTitle] = useState(\n    // data && data.title && (messageTitles.find(({ label }) => label == title) || { value: undefined }).value\n    data && data.title && messageTitles.find(({ label }) => label == data.title)\n  );\n  const [extraFields, setExtraFields] = useState([]);\n\n  // useEffect(() => {\n  //   setData(notification);\n  // }, [notification]);\n\n  useEffect(() => {\n    // All all custom required fields are filled in\n    const extraValid = extraFields.every(({ name, required }) => {\n      const attributes = data.attributes || {};\n      const value = attributes[name] || '';\n      return !required || value;\n    });\n    // Validate data\n    // console.log({ data, notification });\n    // const titleOk = data.title || noTitle;\n    // console.log({ data, enableCreate, extraValid, titleOk });\n    if (data.title && data.message && data.subject && enableCreate && extraValid) {\n      setValid(true);\n    } else {\n      setValid(false);\n    }\n\n    if (data.title) {\n      const title = messageTitles.find(({ label }) => label == data.title);\n      // console.log({ data, messageTitles, title });\n      if (title) {\n        setSelectedTitle(title);\n        // setSelectedTitle(messageTitles.find(({ label }) => label == data.title));\n      }\n    }\n  }, [data]);\n\n  useEffect(() => {\n    // setData(notification);\n    // Validate data\n    // console.log({ notification });\n    const parseRecipients = async () => {\n      if (notification.recipients) {\n        // const ids = notification.recipients.split(',');\n        const ids = notification.recipients.map(({ recipient }) => recipient);\n        const sr = [];\n        // Fetch the details for each of the ids\n        // ids.forEach(async id => {\n        //   const user = await userDetails(id);\n        //   sr.push(user);\n        // });\n        for await (const id of ids) {\n          // Check if ID is a placeholder\n          if (id.length < 10) {\n            continue;\n          }\n          const user = await userDetails(id);\n          sr.push(user);\n        }\n        setSelectedRecipients(sr);\n        // console.log({ sr, ids });\n      }\n    };\n    parseRecipients();\n  }, [notification]);\n\n  // useEffect(() => {\n  //   // Validate data\n  //   // console.log(JSON.stringify({ data, notification }));\n  //   const { title = data.title, message = data.message } = notification;\n  //   // setData({ ...data, title, message });\n  // }, [notification]);\n\n  const createNotification = useCallback(async () => {\n    setSaving(true);\n    try {\n      const type = 'STAFF_MESSAGE';\n      // console.log({ type, data });\n      const result = await addMessage({ type, ...data });\n      if (Array.isArray(result) && !result[0].error && result[0].createdCount > 0) {\n        // toast.success(`Sent ${result.createdCount} messages.`, {\n        // toast.success(`Message sent.`, {\n        //   progress: false,\n        //   className: 'bg-green-500 text-white',\n        //   autoClose: 1500,\n        //   closeButton: false,\n        //   icon: () => <Icons.FaEnvelope size={18} className=\"text-white\" />,\n        // });\n        if (createCallback) {\n          createCallback();\n        }\n      } else {\n        console.log('Error sending message', { result });\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: 'An Error occurred sending message',\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n      }\n    } catch (e) {\n      console.error('error', e);\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'An Error occurred sending message',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n    setSaving(false);\n  }, [data, createCallback]);\n\n  const handleSend = useCallback(async () => {\n    // console.log({ confirmSend });\n    if (confirmSend) {\n      // Show confirmation dialog\n      setShowConfirmationDialog(true);\n    } else {\n      // Send message\n      await createNotification();\n    }\n  }, [confirmSend, createNotification]);\n\n  // const selectedRecipients = data.recipients.map(recipient => ({\n  //   // label: recipient.name,\n  //   value: recipient,\n  // }));\n  // const selectedRecipients = data.recipients;\n  const extraFieldsComponent = extraFields.map(({ label, name, type, required = false, formatter, unformatter }) => {\n    const attributes = data.attributes || {};\n    const value = attributes[name] || '';\n    const id = `extra-field-${name}`;\n    const formatValue = value => (formatter && typeof formatter === 'function' ? formatter(value) : value);\n    const unformatValue = value => (unformatter && typeof unformatter === 'function' ? unformatter(value) : value);\n    return (\n      // <TextField\n      //   key={name}\n      //   value={data[name] || ''}\n      //   onChange={e => setData({ ...data, [name]: e.target.value })}\n      //   label={label}\n      //   className=\"mb-4\"\n      //   type={type}\n      //   required={required}\n      // />\n      <div key={name} className={`font-light light-primary-blue-text${type !== 'date' ? ' w-full' : ''}`}>\n        {type === 'date' && (\n          <>\n            <div className=\"flex\">\n              <label className=\"light-primary-blue-text font-light mb-1 mr-1\">\n                {label} {required && <span className=\"text-pursuit-red ml-1\">*</span>}\n              </label>\n            </div>\n            <div className=\"flex items-center mr-4\">\n              <DatePicker\n                title={label}\n                // selected={data.attributes[name] || null}\n                selected={typeof unformatter === 'function' ? unformatter(value) : value}\n                // onChange={date => setDateOfBirth(date)}\n                onChange={date => {\n                  const attributes = data.attributes || {};\n                  attributes[name] = typeof formatter === 'function' ? formatter(date) : date;\n                  // return setData({ ...data, [name]: date });\n                  return setData({ ...data, attributes });\n                }}\n                // minDate={new Date()}\n                // Set min date to 30 days in the past\n                // minDate={new Date(new Date().setDate(new Date().getDate() - 30))}\n                // Max date is 60 days in the future\n                // maxDate={new Date(new Date().setDate(new Date().getDate() + 60))}\n                className=\"w-full h-10 px-2 textfield-bg-color\"\n                required={required}\n              />\n              <Icons.FaCalendarDay size={30} className=\"ml-4 cursor-pointer\" />\n            </div>\n          </>\n        )}\n        {type === 'text' && (\n          <TextField\n            value={value}\n            onChange={e => {\n              const attributes = data.attributes || {};\n              attributes[name] = e.target.value;\n              return setData({ ...data, attributes });\n            }}\n            label={label}\n            // className=\"w-full\"\n            // type={type}\n            required={required}\n          />\n        )}\n        {type === 'checkbox' && (\n          <div className=\"flex items-center\">\n            <input\n              type=\"checkbox\"\n              className=\"w-4 h-4 mr-2\"\n              checked={value}\n              onChange={e => {\n                const attributes = data.attributes || {};\n                attributes[name] = e.target.checked;\n                return setData({ ...data, attributes });\n              }}\n            />\n            <label className=\"light-primary-blue-text font-light mb-1 mr-1\">{label}</label>\n          </div>\n        )}\n        {type === 'file' && (\n          <>\n            <div className=\"flex\">\n              <label htmlFor={id} className=\"light-primary-blue-text font-light mb-1 mr-1\">\n                {label} {required && <span className=\"text-pursuit-red ml-1\">*</span>}\n              </label>\n            </div>\n            <div className=\"flex items-center mr-4\">\n              {/* <div className=\"flex flex-auto items-center\"> */}\n              {/* <input\n                  id={id}\n                  type=\"file\"\n                  onChange={async e => {\n                    // console.log({ e });\n                    const attributes = data.attributes || {};\n                    if (attributes[name] == undefined) {\n                      attributes[name] = [];\n                    }\n                    attributes[name][0] = await formatValue(e.target.files[0]);\n                    return setData({ ...data, attributes });\n                  }}\n                /> */}\n              {/**\n               * For each file in the array + 1 upto the maxInstances, create a file uploader\n               */}\n              {Array.from(Array(extraFields.find(({ name }) => name == 'fileAttachments').maxInstances).keys()).map(\n                index => {\n                  const attributes = data.attributes || {};\n                  const file = attributes[name] && attributes[name][index];\n                  // console.log({ file });\n                  return (\n                    <div key={index} className=\"flex-1 items-center mx-4\">\n                      <FileUploader\n                        onSuccess={(key, dataUrl, meta) => {\n                          // convert the data url to a file to get the filename\n                          console.log({ key, dataUrl, meta });\n                          const { filename } = meta;\n                          const attributes = data.attributes || {};\n                          if (attributes[name] == undefined) {\n                            attributes[name] = [];\n                          }\n                          attributes[name][index] = {\n                            name: filename,\n                            path: key,\n                          };\n                          setData({ ...data, attributes });\n                        }}\n                        autoSave\n                        saveText=\"UPLOAD\"\n                        prefix=\"email_attachments\"\n                        noPrefix\n                        level=\"email_attachments\"\n                        // level=\"public\"\n                        errorMessage=\"You have unsuccessfully uploaded the file. Please try again.\"\n                        onCancel={result => {\n                          // Remove the file from the array\n                          const attributes = data.attributes || {};\n                          if (attributes[name] == undefined) {\n                            attributes[name] = [];\n                          }\n                          attributes[name][index] = null;\n                          setData({ ...data, attributes });\n                          return true;\n                          // console.log({ result });\n                        }}\n                        isUpdate={false}\n                        // acceptedFileTypes=\"video/*\"\n                        // uploadObject=\"Video\"\n                      />\n                    </div>\n                  );\n                }\n              )}\n              {/* </div> */}\n            </div>\n          </>\n        )}\n      </div>\n    );\n  });\n\n  const fields = (\n    <div className=\"\">\n      {manualSelectorComponent}\n      {isEmployee && !noUserSelector && !manualSelectorComponent && (\n        <div className=\"mb-4\">\n          <div className=\"flex\">\n            <p className=\"light-primary-blue-text font-light mb-1 mr-1\">\n              To <span className=\"text-pursuit-red ml-1\">*</span>\n            </p>\n          </div>\n          <UserSelector\n            // selected={(data.recipients || '').split(',')}\n            isDisabled={isReply}\n            selected={selectedRecipients}\n            onChange={values => {\n              console.log({ values });\n              // const recipients = values.map(recipient => recipient.value).join(',');\n              const recipients = values.map(({ data: recipient, label, value, meta }) => ({\n                recipient: recipient.value || value,\n                recipientName: recipient.meta ? recipient.meta.realName : meta ? meta.realName : null,\n                recipientAlias: recipient.label || label,\n              }));\n              console.log({ ...data, recipients });\n              setData({\n                ...data,\n                recipients,\n              });\n            }}\n          />\n        </div>\n      )}\n      {/* <TextField\n        value={data.title || ''}\n        onChange={e => setData({ ...data, title: e.target.value })}\n        label=\"Title\"\n        className=\"mb-4\"\n        required\n      /> */}\n\n      {!noTitle && (\n        <>\n          <div className=\"mb-4\">\n            <div className=\"flex\">\n              <p className=\"light-primary-blue-text font-light mb-1 mr-1\">\n                Title <span className=\"text-pursuit-red ml-1\">*</span>\n              </p>\n            </div>\n            <Select\n              // value={(messageTitles.find(({ label }) => label == data.title) || {}).value}\n              isDisabled={isReply}\n              value={selectedTitle}\n              // options={messageTitles}\n              options={titles}\n              onChange={({ label, value, fields = [] }) => {\n                setSelectedTitle({ label, value });\n                setData({ ...data, title: label, attributes: {} });\n                console.log({ fields });\n                setExtraFields(fields);\n              }}\n            />\n          </div>\n          {/* Extra fields */}\n          <div className=\"flex flex-col mb-4 w-full\">{extraFieldsComponent}</div>\n        </>\n      )}\n      {!noSubject && (\n        <TextField\n          value={data.subject || ''}\n          readonly={isReply || subjectDisabled}\n          // readonly={true}\n          onChange={e => setData({ ...data, subject: e.target.value })}\n          label=\"Subject\"\n          className=\"mb-4\"\n          maxLength={75}\n          required\n        />\n      )}\n      {/* Message */}\n      <div>\n        <div className=\"flex\">\n          <p className=\"light-primary-blue-text font-light mb-1 mr-1\">\n            Message <span className=\"text-pursuit-red ml-1\">*</span>\n          </p>\n        </div>\n        <textarea\n          // value={notification.message !== data.message ? data.message || '' : ''}\n          value={data.message || ''}\n          onChange={e => {\n            // console.log({ e });\n            return setData({ ...data, message: e.target.value });\n          }}\n          label=\"Message\"\n          className=\"textfield-bg-color w-full h-24 px-2 mt-2 mb-4 shadow\"\n          required\n          placeholder=\"Type your message here...\"\n        />\n        {isEmployee && (\n          <div className=\"text-right\">\n            <button type=\"button\" className=\"text-blue-500 underline mb-2\" onClick={() => setShowPreview(!showPreview)}>\n              {showPreview ? 'Hide Preview' : 'Show Preview'}\n            </button>\n          </div>\n        )}\n\n        {showPreview && (\n          <div>\n            <div\n              className=\"message-preview border p-4 rounded\"\n              dangerouslySetInnerHTML={{ __html: parseMarkdown(data.message) }}\n            />\n          </div>\n        )}\n      </div>\n    </div>\n  );\n  const cancelButton = (cancelLink || cancelCallback) && (\n    <Link\n      to={cancelLink}\n      //<Button\n      className=\"flex items-center font-semibold focus:outline-none text-guardian-darkblue h-10 uppercase\"\n      onClick={e => {\n        e.preventDefault();\n        if (typeof cancelCallback === 'function') {\n          cancelCallback();\n          return;\n        }\n        return history.goBack();\n      }}\n      //  >\n    >\n      <Icons.FaChevronLeft size={18} className=\"mr-4\" />\n      {cancelLabel}\n    </Link>\n  );\n  // flex flex-col-reverse justify-between mt-8 text-xs lg:flex-row\"\n  const actions = (\n    <div className=\"flex flex-row justify-end mt-4\">\n      {/* {isReply && 'test'} */}\n      <div className=\"flex-grow\">\n        <span className=\"w-auto inline-block\">{cancelButton}</span>\n      </div>\n      <Button\n        linedBlue\n        noPadding\n        className=\"px-4 lg:ml-6 w-full lg:w-auto mr-2 uppercase\"\n        onClick={() => {\n          setSelectedTitle(null);\n          setData(notification);\n          // setData(defaults);\n        }}\n        disabled={saving || loading}>\n        {clearLabel}\n      </Button>\n\n      <Button\n        solidBlue\n        noPadding\n        className=\"px-4 ml-2 w-full lg:w-auto uppercase\"\n        // onClick={createNotification}\n        onClick={handleSend}\n        loading={loading || saving}\n        disabled={!validData || saving}>\n        {createLabel}\n      </Button>\n    </div>\n  );\n\n  return (\n    <div>\n      {showConfirmationDialog && (\n        <PopUpConfirmation\n          title=\"Send Message\"\n          content={`Send message to ${data.recipients.length} recipients?`}\n          // noCancel\n          onConfirm={async () => {\n            // Navigate to the messaging page\n            setShowConfirmationDialog(false);\n            await createNotification();\n            // history.push('/messaging');\n          }}\n          onCancel={() => setShowConfirmationDialog(false)}\n          // createCallback={() => setShowSentConfirmation(true)}\n          confirmText={'Send'}\n          confirmLoadingText={'Sending...'}\n          className=\"w-11/12 lg:w-auto\"\n          destructive\n        />\n      )}\n      {fields}\n      {actions}\n      {/* {JSON.stringify({ data, notification, validData, saving })} */}\n    </div>\n  );\n};\n\nMessageForm.propTypes = {\n  notification: PropTypes.shape({\n    recipients: PropTypes.arrayOf(\n      PropTypes.shape({\n        recipient: PropTypes.string,\n        recipientAlias: PropTypes.string,\n        recipientName: PropTypes.string,\n      })\n    ),\n    title: PropTypes.string,\n    message: PropTypes.string,\n  }),\n  createLabel: PropTypes.string,\n  createCallback: PropTypes.func,\n  cancelLabel: PropTypes.string,\n  clearLabel: PropTypes.string,\n  cancelCallback: PropTypes.func,\n  cancelLink: PropTypes.string,\n  isReply: PropTypes.bool,\n  noUserSelector: PropTypes.bool,\n  noTitle: PropTypes.bool,\n  noSubject: PropTypes.bool,\n  enableCreate: PropTypes.bool,\n  subjectDisabled: PropTypes.bool,\n  confirmSend: PropTypes.bool,\n};\n\nexport default MessageForm;\n","import React, { useEffect, useState } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro';\n\nimport PropTypes from 'prop-types';\n\nconst MessageTo = ({ message, options }) => {\n  if (!message) {\n    return null;\n  }\n  const {\n    recipientAlias,\n    recipientName,\n    id,\n    recipientGroups,\n    recipientMeta,\n    recipientCount,\n    createRequestId,\n  } = message;\n\n  const { useAdminView = false } = options;\n  let toIcon = null;\n  let title = `Alias: ${recipientAlias || '-'}`;\n  let to = recipientAlias;\n\n  if (useAdminView && !(recipientGroups || []).includes('Admin')) {\n    toIcon = <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />;\n    title = `Real name: ${recipientName || '-'}`;\n  } else if (useAdminView && (recipientGroups || []).includes('Admin')) {\n    to = recipientName;\n    // title = null;\n    // title = `Real name: ${recipientName || '-'}`;\n  }\n  if (recipientCount && recipientCount > 1) {\n    to = `${recipientCount} Recipients`;\n    let details = `${recipientCount} Recipients`;\n    const tipId = `${createRequestId}-data`;\n    toIcon = <FontAwesomeIcon icon={icon({ name: 'users', style: 'solid' })} />;\n    const maxSummaryRecipients = 5;\n    if (recipientMeta && Array.isArray(recipientMeta.users)) {\n      const recipientList = recipientMeta.users\n        .slice(0, maxSummaryRecipients)\n        .map(x => x.alias)\n        .join(', ');\n      details = `Recipients: ${recipientList}${\n        recipientCount > maxSummaryRecipients ? `and ${recipientCount - maxSummaryRecipients} more` : ''\n      }`;\n    }\n    return (\n      <span className=\"relative\">\n        <span aria-describedby={tipId}>\n          {toIcon} {to || '-'}\n        </span>\n        {/* <span\n          role=\"tooltip\"\n          className=\"p-4 rounded-md bg-gray-100 text-sm text-gray-400 w-64\"\n          style={{ top: '-29px' }}\n          id={tipId}>\n          {details}\n        </span> */}\n      </span>\n    );\n  }\n  return (\n    <span title={title}>\n      {toIcon} {to || '-'}\n      {/* {JSON.stringify(message, null, 2)} */}\n    </span>\n  );\n};\n\nMessageTo.propTypes = {\n  message: PropTypes.object.isRequired,\n  options: PropTypes.object,\n};\n\nexport default MessageTo;\n","import React, { useEffect, useState } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport { Link } from 'react-router-dom';\nimport { DateTime } from 'luxon';\n\nimport PropTypes from 'prop-types';\n\nconst MessageToDetail = ({ message, options }) => {\n  if (!message) {\n    return null;\n  }\n  const {\n    recipientAlias,\n    recipientName,\n    id,\n    recipientGroups,\n    recipientMeta = {},\n    recipientCount,\n    createRequestId,\n  } = message;\n\n  const userIcon =\n    recipientCount > 1 ? (\n      <FontAwesomeIcon icon={icon({ name: 'users', style: 'solid' })} />\n    ) : (\n      <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />\n    );\n\n  const { useAdminView = false } = options;\n  let to = (\n    <span title={useAdminView ? `Real name: ${message.recipientName}` : null}>\n      {useAdminView && userIcon} {message.recipientAlias || message.recipient}\n    </span>\n  );\n  if (useAdminView && (message.recipientGroups || []).includes('Admin')) {\n    to = <span title={`Alias: ${message.recipientAlias}`}>{message.recipientName || message.recipient}</span>;\n  }\n\n  if (\n    !useAdminView ||\n    !recipientMeta ||\n    !Array.isArray(recipientMeta.users) ||\n    (Array.isArray(recipientMeta.users) && recipientMeta.users.length <= 1)\n  ) {\n    return to;\n  }\n  // if (recipientMeta) {\n  //   const users = recipientMeta && Array.isArray(recipientMeta.users) ? recipientMeta.users : [];\n  //   recipientMeta.users = [...users, ...users, ...users, ...users, ...users, ...users, ...users, ...users, ...users];\n  // }\n\n  // Build a basic stats summary for the message\n  // const recipientCount = message.recipientCount || 1;\n\n  // If message is sent to more than one person, show a summary of the recipients\n  // Summary should include:\n  // Name of each recipient, whether they've seen it or not and a count of how many have seen it\n  const tipId = `${id}-data`;\n  const liClass = 'px-4 py-2';\n  return (\n    <span className=\"relative\">\n      {(recipientMeta && (\n        <span\n          aria-describedby={tipId}\n          className=\"underline\"\n          style={{ textDecorationStyle: 'dashed', textUnderlinePosition: 'under' }}>\n          {to}\n        </span>\n      )) ||\n        to}\n      <ul\n        role=\"tooltip\"\n        id={tipId}\n        className=\"rounded-md bg-white text-sm text-gray-400 shadow-2xl border-gray-200 overflow-y-scroll\"\n        style={{ minWidth: '24em', maxHeight: '24em' }}>\n        {recipientMeta && (\n          <li className=\"grid grid-cols-3\">\n            <span className={liClass + ' font-bold col-span-2'}>Recipients {recipientMeta.recipientCount}</span>\n            <span className={liClass + ' font-bold'}>Seen by {recipientMeta.seenCount}</span>\n          </li>\n        )}\n        {recipientMeta &&\n          Array.isArray(recipientMeta.users) &&\n          recipientMeta.users.map((x, i) => (\n            <li key={x.id} className=\"grid grid-cols-3\">\n              <span className={'col-span-2 ' + (i % 2 == 0 ? `bg-gray-100 ${liClass}` : liClass)} key={x.id + '-name'}>\n                <Link to={`/user/${x.id}`} title={useAdminView && x.name}>\n                  {x.alias}\n                </Link>\n              </span>\n              <span className={i % 2 == 0 ? `bg-gray-100 ${liClass}` : liClass} key={x.id + '-seen'}>\n                {x.seenAt ? (\n                  <span\n                    className=\"text-opacity-100 text-black\"\n                    title={DateTime.fromJSDate(new Date(x.seenAt)).toLocaleString(DateTime.DATETIME_FULL)}>\n                    <FontAwesomeIcon icon={icon({ name: 'eye', style: 'regular' })} />\n                  </span>\n                ) : (\n                  <span className=\"text-opacity-50 text-pursuit-gray\">\n                    <FontAwesomeIcon icon={icon({ name: 'eye-slash', style: 'regular' })} />\n                  </span>\n                )}\n              </span>\n            </li>\n          ))}\n        {/* {JSON.stringify(message, null, 2)} */}\n      </ul>\n    </span>\n  );\n};\n\nMessageToDetail.propTypes = {\n  message: PropTypes.object.isRequired,\n  options: PropTypes.object,\n};\n\nexport default MessageToDetail;\n","import React, { useEffect, useState, useCallback } from 'react';\nimport { DataGrid, DateDisplay, MessageTo } from '../';\nimport { DateTime } from 'luxon';\nimport { useHistory } from 'react-router-dom';\nimport { useUser } from '../../contexts/userContext';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport { isMessageFromAdmin } from '../../helpers/useMessages';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { listEmployees } from '../../generated/graphql/queries';\nimport { useMessages } from '../../helpers/useMessages';\nimport { MessageToSummary } from '../MessageTo';\n// import { MessageTo } from '../';\n\nconst USE_VOLUNTEER_VIEW = 'USE_VOLUNTEER_VIEW';\n\nconst MessageGrid = ({\n  messages = [],\n  defaultSender = 'Project 1591',\n  isLoading = false,\n  advancedView = false,\n  hasMore = false,\n  loadNextPage = () => {},\n  rowLink = item => `/messaging/read/${item.id}`,\n  sortableFields = [],\n  hiddenFields = [],\n  sort,\n  setSort,\n  showCountColumn = true,\n}) => {\n  // const [isLoading, setIsLoading] = useState(defaultIsLoading);\n  const { assignMessage, setMessages } = useMessages({ limit: 100 });\n  const history = useHistory();\n  const checkForVolunteerView = () => {\n    const useVolunteerSavedPref = localStorage.getItem(USE_VOLUNTEER_VIEW);\n\n    if (useVolunteerSavedPref && useVolunteerSavedPref.toLowerCase() === 'true') {\n      return true;\n    }\n\n    return false;\n  };\n\n  const [useVolunteerView, setUseVolunteerView] = useState(checkForVolunteerView());\n  const { isEmployee, isAdmin, user } = useUser();\n  const useAdminView = isAdmin && !useVolunteerView;\n\n  const [employeeOptions, setEmployeeOptions] = useState([]);\n  const fetchEmployees = async () => {\n    try {\n      let nextEmployeeToken = null;\n      let employeeList = [];\n\n      do {\n        const params = {\n          nextToken: nextEmployeeToken,\n          limit: 100,\n          sortOrder: 'ASC',\n        };\n\n        const result = await API.graphql(graphqlOperation(listEmployees, params));\n\n        nextEmployeeToken = result.data.listEmployees.nextToken;\n\n        employeeList = [...employeeList, ...result.data.listEmployees.items];\n      } while (nextEmployeeToken);\n\n      const options = employeeList.map(x => ({\n        value: x.id,\n        label: `${x.firstName} ${x.lastName}`,\n      }));\n\n      setEmployeeOptions(options);\n\n      return options;\n    } catch (error) {\n      console.error('Error Loading employees: ', error);\n\n      // setAlert({\n      //   type: 'SET_NOTIFICATION',\n      //   payload: {\n      //     occurs: true,\n      //     message: 'Error loading employees',\n      //     textColor: 'redText',\n      //     borderColor: 'redBorder',\n      //   },\n      // });\n    }\n  };\n\n  useEffect(() => {\n    if (useAdminView) {\n      fetchEmployees();\n    }\n  }, [useAdminView]);\n\n  const formatAssignedTo = item => {\n    // if (item.assignedTo) {\n    return (\n      <select\n        value={item.assignedTo || ''}\n        className={`custom-select pl-2 h-10 w-48 lg:mr-4 border border-gray-200 bg-white rounded ${\n          !item.assignedTo ? 'text-gray-200' : 'text-pursuit-gray'\n        }`}\n        // onChange={() => {}}\n        onClick={event => {\n          event.stopPropagation();\n          event.preventDefault();\n        }}\n        onChange={event => {\n          const employee = employeeOptions.find(x => x.value === event.target.value);\n          const name = employee ? employee.label : null;\n          const userId = event.target.value || null;\n          const oldMessages = [...messages];\n          const messageToUpdateIdx = oldMessages.findIndex(x => x.id === item.id);\n          if (messageToUpdateIdx !== -1) {\n            const updatedMessage = oldMessages[messageToUpdateIdx];\n            updatedMessage.assignedTo = userId;\n            updatedMessage.assignedToName = name;\n            if (userId) {\n              delete updatedMessage.readAt;\n            }\n            // console.log({ userId, name, updatedMessage });\n            oldMessages[messageToUpdateIdx] = updatedMessage;\n            setMessages([...oldMessages]);\n            assignMessage({ id: item.id, userId, name });\n          }\n        }}>\n        <option key=\"default-state\" value=\"\">\n          Unassigned\n        </option>\n\n        {employeeOptions.map((x, i) => (\n          <option value={x.value} key={i}>\n            {x.label}\n          </option>\n        ))}\n      </select>\n    );\n    // }\n\n    // return item.assignedToName || '-';\n  };\n\n  const formatFrom = message => {\n    // let aliasMain = true;\n\n    if (!message) {\n      return;\n    }\n\n    const { sender, senderAlias, senderName, id } = message;\n    // const from = isEmployee && !useVolunteerView && senderAlias;\n    if (useAdminView && isMessageFromAdmin(message)) {\n      const senderTitle = `Alias: ${senderAlias}`;\n      return (\n        <span title={senderTitle}>\n          {/* {isEmployee && !useVolunteerView && (\n            <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />\n          )}{' '} */}\n          {senderName || defaultSender}\n        </span>\n      );\n    } else if (useAdminView) {\n      const senderTitle = `Real name: ${senderName}`;\n      return (\n        <span title={senderTitle}>\n          {isEmployee && !useVolunteerView && (\n            <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />\n          )}{' '}\n          {senderAlias || defaultSender}\n        </span>\n      );\n    } else {\n      return (\n        <span>\n          {/* {isEmployee && !useVolunteerView && (\n            <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />\n          )}{' '} */}\n          {defaultSender}\n        </span>\n      );\n    }\n  };\n\n  const formatTo = message => {\n    return <MessageToSummary message={message} options={{ useAdminView }} />;\n    // if (!message) {\n    //   return;\n    // }\n    // let toIcon = null;\n    // // let title = null;\n    // const {\n    //   recipientAlias,\n    //   recipientName,\n    //   id,\n    //   recipientGroups,\n    //   recipientMeta,\n    //   recipientCount,\n    //   createRequestId,\n    // } = message;\n    // let title = `Alias: ${recipientAlias || '-'}`;\n    // let to = recipientAlias;\n    // if (useAdminView && !(recipientGroups || []).includes('Admin')) {\n    //   toIcon = <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />;\n    //   title = `Real name: ${recipientName || '-'}`;\n    // } else if (useAdminView && (recipientGroups || []).includes('Admin')) {\n    //   to = recipientName;\n    // }\n    // if (recipientCount && recipientCount > 1) {\n    //   to = `${recipientCount} recipients`;\n    //   let details = `${recipientCount} recipients`;\n    //   const tipId = `${createRequestId}-data`;\n    //   toIcon = <FontAwesomeIcon icon={icon({ name: 'users', style: 'solid' })} />;\n    //   const maxSummaryRecipients = 5;\n    //   if (recipientMeta && Array.isArray(recipientMeta.users)) {\n    //     const recipientList = recipientMeta.users\n    //       .slice(0, maxSummaryRecipients)\n    //       .map(x => x.name)\n    //       .join(', ');\n    //     details = `Recipients: ${recipientList}${\n    //       recipientCount > maxSummaryRecipients ? `and ${recipientCount - maxSummaryRecipients} more` : ''\n    //     }`;\n    //   }\n    //   return (\n    //     <span className=\"relative\">\n    //       <span aria-describedby={tipId}>\n    //         {toIcon} {to || '-'}\n    //       </span>\n    //       <span role=\"tooltip\" className=\"p-4 rounded-md bg-gray-100 text-sm text-gray-400 w-64\" id={tipId}>\n    //         {details}\n    //       </span>\n    //     </span>\n    //   );\n    // }\n    // return (\n    //   <span title={title}>\n    //     {toIcon} {to || '-'}\n    //   </span>\n    // );\n  };\n\n  const formatSeen = message => {\n    if (!message) {\n      return;\n    }\n    const { seenAt } = message;\n    return seenAt ? (\n      <>\n        <span\n          title={'Seen: ' + DateTime.fromISO(seenAt).toLocaleString(DateTime.DATETIME_FULL)}\n          className=\"text-opacity-50 text-pursuit-gray\">\n          <FontAwesomeIcon icon={icon({ name: 'eye', style: 'regular' })} />\n        </span>\n      </>\n    ) : (\n      <>\n        <FontAwesomeIcon icon={icon({ name: 'eye-slash', style: 'regular' })} />\n      </>\n    );\n  };\n\n  const formatFlagged = message => {\n    if (!message) {\n      return;\n    }\n    const { adminFlaggedAt, assignedTo } = message;\n    let flags = [];\n    // return adminFlaggedAt ? (\n    //   <>\n    //     <span\n    //       title={'Flagged: ' + DateTime.fromISO(adminFlaggedAt).toLocaleString(DateTime.DATETIME_FULL)}\n    //       className=\"text-opacity-50 text-pursuit-gray\">\n    //       <FontAwesomeIcon icon={icon({ name: 'flag-pennant', style: 'solid' })} className=\"text-pursuit-red\" />\n    //     </span>\n    //   </>\n    // ) : (\n    //   <>{/* <FontAwesomeIcon icon={icon({ name: 'eye-slash', style: 'regular' })} /> */}</>\n    // );\n    if (adminFlaggedAt) {\n      flags.push(\n        <span\n          title={'Flagged: ' + DateTime.fromISO(adminFlaggedAt).toLocaleString(DateTime.DATETIME_FULL)}\n          className=\"text-opacity-50 text-pursuit-gray\"\n          key=\"flagged\">\n          <FontAwesomeIcon icon={icon({ name: 'flag-pennant', style: 'solid' })} className=\"text-pursuit-red\" />\n        </span>\n      );\n    }\n    if (user && user.id == assignedTo) {\n      flags.push(\n        <span title={'Assigned to me'} className=\"text-opacity-50 text-pursuit-gray\" key=\"assigned\">\n          <FontAwesomeIcon icon={icon({ name: 'user-check', style: 'solid' })} className=\"text-pursuit-red\" />\n        </span>\n      );\n    }\n    // const content = flags.join('');\n    // reduce flags to a single element\n    const content = flags.reduce((prev, curr) => [prev, ' ', curr], null);\n    return <>{content}</>;\n  };\n\n  // const filterSection = <div className=\"flex flex-col lg:flex-row lg:justify-between\">TODO: Filters go here</div>;\n  const gridColumns = [\n    // showCountColumn && {\n    //   title: '',\n    //   fieldName: '',\n    //   // width: 'w-auto',\n    //   width: '3em',\n    //   value: (item, i) => i + 1,\n    // },\n    {\n      title: 'Date',\n      fieldName: 'createdAt',\n      // width: 'w-auto',\n      renderFunction: item => (item.createdAt ? <DateDisplay date={item.createdAt} /> : '-'),\n      sortable: sortableFields.includes('createdAt'),\n    },\n    {\n      title: 'From',\n      // fieldName: 'sender',\n      fieldName: 'senderAlias',\n      renderFunction: formatFrom,\n      sortable: sortableFields.includes('senderAlias'),\n    },\n    {\n      title: 'Title',\n      fieldName: 'title',\n      sortable: sortableFields.includes('title'),\n      renderFunction: item => {\n        // Return custom title or default\n        return item.attributes && item.attributes.customTitle ? item.attributes.customTitle || item.title : item.title;\n      },\n    },\n    {\n      title: 'Subject',\n      fieldName: 'subject',\n      renderFunction: item => {\n        const moreChevron = item.replyTo ? (\n          <FontAwesomeIcon className=\"pr-2\" icon={icon({ name: 'chevron-right', style: 'solid' })} />\n        ) : (\n          ''\n        );\n        return (\n          <div className=\"justify-start\">\n            {moreChevron}\n            {item.subject}\n          </div>\n        );\n        // return (item.subject ? item.subject : '-');\n      },\n      sortable: sortableFields.includes('subject'),\n    },\n  ].filter(column => !hiddenFields.includes(column.fieldName));\n\n  const gridMessages = (messages || []).map(message => {\n    const classes = [];\n    if (!message.readAt && message.recipientCount <= 1) {\n      classes.push('font-bold');\n    }\n\n    if (advancedView && message.adminFlaggedAt) {\n      // classes.push('bg-pursuit-red');\n      // classes.push('bg-red-100');\n    }\n    return {\n      ...message,\n      className: classes.join(' '),\n    };\n  });\n\n  if (advancedView) {\n    gridColumns.splice(\n      // showCountColumn ? 2 : 0,\n      0,\n      0,\n      {\n        // title: 'Read',\n        fieldName: 'seenAt',\n        width: '2em',\n        renderFunction: formatSeen,\n        sortable: sortableFields.includes('seenAt'),\n      },\n      {\n        width: '2em',\n        fieldName: 'adminFlaggedAt',\n        // sortable: sortableFields.includes('recipientAlias'),\n        renderFunction: formatFlagged,\n      }\n    );\n    if (!hiddenFields.includes('recipientAlias')) {\n      gridColumns.splice(3, 0, {\n        title: 'To',\n        fieldName: 'recipientAlias',\n        sortable: sortableFields.includes('recipientAlias'),\n        renderFunction: formatTo,\n      });\n    }\n\n    if (!hiddenFields.includes('assignedTo')) {\n      gridColumns.splice(7, 0, {\n        title: 'Assigned',\n        fieldName: 'assignedTo',\n        sortable: sortableFields.includes('assignedTo'),\n        renderFunction: formatAssignedTo,\n        width: '14rem',\n        noLink: true,\n      });\n    }\n\n    if (showCountColumn) {\n      gridColumns.splice(0, 0, {\n        title: '',\n        fieldName: '',\n        // width: 'w-auto',\n        width: '3em',\n        value: (item, i) => i + 1,\n      });\n    }\n  }\n\n  // const rowLink = useCallback(item => {\n  //   return `/messaging/read/${item.id}`;\n  // }, []);\n\n  return (\n    <div className=\"message-grid\">\n      {/* {filterSection} */}\n      <DataGrid\n        columns={gridColumns}\n        sort={sort}\n        setSort={setSort}\n        loading={isLoading}\n        data={gridMessages}\n        noRecordsText=\"No messages found\"\n        // rowLink={item => `/messaging/read/${item.id}`}\n        rowLink={rowLink}\n        // loadNextPage={() => fetchCases(filters)}\n        loadNextPage={loadNextPage}\n        hasMore={!!hasMore}\n        containerHeight=\"h-88\"\n        gridKey=\"employee-messaging\"\n      />\n      {/* <>{JSON.stringify({ hasMore })}</> */}\n    </div>\n  );\n};\n\nexport default MessageGrid;\n","import React, { useEffect, useState } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport { Link } from 'react-router-dom';\nimport { DateTime } from 'luxon';\nimport { isMessageFromAdmin } from '../../helpers/useMessages';\nimport { useUser } from '../../contexts/userContext';\n\nimport PropTypes from 'prop-types';\n\nconst MessageFrom = ({ message, options = {} }) => {\n  const { sender, senderAlias, senderName, id } = message;\n  const { useAdminView: adminViewParam = false, defaultSender = 'Project 1591' } = options;\n  const { isEmployee, isAdmin, user } = useUser();\n  const useAdminView = isAdmin && adminViewParam;\n\n  if (!message) {\n    return;\n  }\n\n  if (useAdminView && isMessageFromAdmin(message)) {\n    const senderTitle = `Alias: ${senderAlias}`;\n    return <span title={senderTitle}>{senderName || defaultSender}</span>;\n  } else if (useAdminView) {\n    const senderTitle = `Real name: ${senderName}`;\n    return (\n      <span title={senderTitle}>\n        {isEmployee && useAdminView && <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />}{' '}\n        {senderAlias || defaultSender}\n      </span>\n    );\n  } else {\n    return <span>{senderAlias || defaultSender}</span>;\n  }\n};\n\nMessageFrom.propTypes = {\n  message: PropTypes.object.isRequired,\n  options: PropTypes.object,\n};\n\nexport default MessageFrom;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { listMessageThreads as listMessageThreadsQuery } from '../../generated/graphql/queries';\nimport { Link } from 'react-router-dom';\nimport {\n  Button,\n  DropDown,\n  TextField,\n  UserSelector,\n  DateDisplay,\n  MessageForm,\n  PopUpConfirmation,\n} from '../../components';\nimport MessageFrom from '../MessageFrom/MessageFrom';\nimport { parseMarkdown } from '../../helpers/markdown';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport { DateTime } from 'luxon';\nimport { getInboxUid } from '../../helpers/useMessages';\nimport { useHistory } from 'react-router-dom';\n\n/**\n * @typedef {Object} Thread\n * @property {string} id - The ID of the message\n * @property {string} message - Content of the message\n * @property {string} recipient - UID of the recipient\n */\n\n/**\n * A placeholder component for a message thread view that loops over an array of threads.\n * Displays the message title attribute. Clicking on the title toggles the display of that messages body content.\n * @param {number} rootMessageId - The ID of the root message to display threads for.\n * @returns {JSX.Element} - Rendered component.\n */\nconst MessageThread = ({\n  rootMessageId,\n  displaySeen = false,\n  currentMessageId = null,\n  showReply = false,\n  showRootIfSingle = false,\n  showLoadingSkeleton = true,\n  user = {},\n}) => {\n  const [activeThread, setActiveThread] = useState(null);\n  const { threads, loading } = useMessageThreads(rootMessageId, { showRootIfSingle });\n  const myIds = user && user.id ? [user.id, getInboxUid(user.userStatus)] : [];\n\n  /**\n   * Handles the click event on a thread title.\n   * If the clicked thread is already active, sets activeThread to null.\n   * If the clicked thread is not active, sets activeThread to the clicked thread.\n   * @param {Object} thread - The thread object that was clicked.\n   */\n  const handleThreadClick = thread => {\n    if (activeThread === thread) {\n      setActiveThread(null);\n    } else {\n      setActiveThread(thread);\n    }\n  };\n  // return <p>{JSON.stringify({ threads, rootMessageId })}</p>;\n  if (!loading && threads.length <= 0) {\n    return <div></div>;\n    // return <div className=\"text-pursuit-gray\">Message is not part of a thread.</div>;\n  }\n\n  return (\n    <div>\n      {!loading && <h2 className=\"mb-1 text-xl text-left font-bold\">Thread</h2>}\n      {loading && showLoadingSkeleton ? (\n        <>\n          <MessageThreadSkeleton />\n        </>\n      ) : (\n        <ul>\n          {(threads || []).map(thread => {\n            const level = `${thread.replyPath}`.match(/\\//g).length - 1 || 0;\n            let marginClass = `ml-${level * 0} py-1 border-b cursor-pointer`;\n            let title = null;\n            if (thread.id === currentMessageId) {\n              marginClass += ' bg-yellow-100';\n              title = 'Current message';\n            }\n            const active = activeThread === thread;\n            const clickHandler = !active ? () => handleThreadClick(thread) : null;\n            return (\n              <li title={title} key={thread.id} className={marginClass} onClick={clickHandler}>\n                <ThreadHeader\n                  displaySeen={displaySeen}\n                  thread={thread}\n                  active={activeThread === thread}\n                  showReply={showReply && myIds.length > 0 && myIds.includes(thread.recipient)}\n                />\n                {/* {activeThread === thread && <ThreadBody thread={thread} />} */}\n                {/* {JSON.stringify({ thread, activeThread, myIds }, null, 2)} */}\n              </li>\n            );\n          })}\n        </ul>\n      )}\n    </div>\n  );\n};\n\nMessageThread.propTypes = {\n  rootMessageId: PropTypes.string.isRequired,\n  displaySeen: PropTypes.bool,\n  currentMessageId: PropTypes.string,\n  showReply: PropTypes.bool,\n  showRootIfSingle: PropTypes.bool,\n  showLoadingSkeleton: PropTypes.bool,\n  user: PropTypes.object,\n};\n\n/**\n * Returns an object with an array of threads for a given message ID and a loading boolean attribute.\n * @param {number} rootMessageId - The ID of the message to get threads for.\n * @returns {Thread[]} - An object with a threads array and a loading boolean attribute.\n */\nconst useMessageThreads = (rootMessageId, { autoLoad = true, showRootIfSingle = false } = {}) => {\n  const threadsDefault = [];\n  const [loading, setLoading] = useState(autoLoad);\n  /**\n   * @type {[Thread[], function]}\n   */\n  const [threads, setThreads] = useState(threadsDefault);\n  const fetchData = async () => {\n    const params = { id: rootMessageId };\n    setLoading(true);\n    try {\n      const {\n        data: { listMessageThreads },\n      } = await API.graphql(graphqlOperation(listMessageThreadsQuery, params));\n      // console.log('params', params);\n      setLoading(false);\n      return listMessageThreads.items || threadsDefault;\n    } catch (e) {\n      const {\n        data: { listMessageThreads },\n      } = e;\n      console.error('Error loading threads', e);\n      setLoading(false);\n      return listMessageThreads.items || threadsDefault;\n    }\n  };\n\n  const loadThreads = async () => {\n    const data = await fetchData();\n    if (!showRootIfSingle) {\n      // console.log({ showRootIfSingle, data, rootMessageId });\n      // Remove the root message from the list of threads if there is only one thread\n      if (data.length === 1) {\n        const [thread] = data;\n        if (thread.id === rootMessageId) {\n          // data.splice(0, 1);\n          setThreads([]);\n          return;\n        }\n      }\n    }\n    // console.log('data', data);\n    setThreads(data);\n  };\n\n  useEffect(() => {\n    if (autoLoad) {\n      loadThreads();\n    }\n  }, [autoLoad]);\n\n  return { threads, loading };\n};\n\nconst MessageThreadSkeleton = () => {\n  // Tailwind skeleton that looks like a table with two rows, three columns\n  return (\n    <div className=\"border-gray-300 p-4 w-full\">\n      <div className=\"animate-pulse flex space-x-4\">\n        <div className=\"flex-1 grid grid-cols-8 gap-4\">\n          <div className=\"h-2 bg-gray-300 rounded col-span-1\"></div>\n          <div className=\"h-2 bg-gray-300 rounded col-span-2\"></div>\n          <div className=\"h-2 bg-gray-300 rounded col-span-5\"></div>\n          <div className=\"h-2 bg-gray-300 rounded col-span-1 col-start-1\"></div>\n          <div className=\"h-2 bg-gray-300 rounded col-span-2\"></div>\n          <div className=\"h-2 bg-gray-300 rounded col-span-3\"></div>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nconst ThreadHeader = ({ thread, active = false, displaySeen = false, showReply = false }) => {\n  const seen = thread.seenAt ? (\n    <>\n      <span\n        title={'Seen: ' + DateTime.fromISO(thread.seenAt).toLocaleString(DateTime.DATETIME_FULL)}\n        className=\"text-opacity-50 text-pursuit-gray\">\n        <FontAwesomeIcon icon={icon({ name: 'eye', style: 'regular' })} />\n      </span>\n    </>\n  ) : (\n    <>\n      <FontAwesomeIcon icon={icon({ name: 'eye-slash', style: 'regular' })} />\n    </>\n  );\n  const date = thread.createdAt ? <DateDisplay date={thread.createdAt} /> : '-';\n  return (\n    <div className=\"flex\">\n      <div className=\"flex-none m-2 mr-0\">{displaySeen && seen}</div>\n      <div className=\"flex-initial m-2 ml-1\">{date}</div>\n      <div className={`${!active ? 'flex-none w-3/12' : 'flex-grow'} min-w-md m-2`}>\n        {active && <>From: </>}\n        <MessageFrom message={thread} options={{ useAdminView: true }} />\n        {active && (\n          <>\n            <div className=\"my-2\">Subject: {thread.subject}</div>\n            <ThreadBody thread={thread} showReply={showReply} />\n          </>\n        )}\n      </div>\n      {!active && (\n        <div className={`flex-grow${!active ? ' flex truncate' : ''} m-2`}>\n          <span className=\"flex-initial\">{thread.subject}</span>\n          {!active && <span className=\"text-gray-400 ml-2 truncate max-w-full\">{thread.message}</span>}\n          {/* {active && <ThreadBody thread={thread} />} */}\n        </div>\n      )}\n    </div>\n  );\n};\nThreadHeader.propTypes = {\n  thread: PropTypes.object.isRequired,\n  active: PropTypes.bool,\n  displaySeen: PropTypes.bool,\n  showReply: PropTypes.bool,\n};\n\nconst ThreadBody = ({ thread, showReply = false }) => {\n  const replyNotification = {\n    // fromReply: true,\n    subject: formatReplySubject(thread.subject),\n    replyTo: thread.id,\n    title: thread.title,\n    recipients: [{ recipient: thread.sender }],\n  };\n\n  const history = useHistory();\n  const [showSentConfirmation, setShowSentConfirmation] = useState(false);\n\n  return (\n    <div className=\"my-2 border-t pt-2 border-gray-200\">\n      {showSentConfirmation && (\n        <PopUpConfirmation\n          title=\"Message Sent\"\n          content={`Your message has been sent.`}\n          noCancel\n          onConfirm={() => {\n            // Navigate to the messaging page\n            history.push('/messaging');\n          }}\n          confirmText=\"OK\"\n          confirmLoadingText=\"OK\"\n          className=\"w-11/12 lg:w-auto\"\n          destructive\n        />\n      )}\n      <span\n        dangerouslySetInnerHTML={{\n          __html: parseMarkdown(thread.message),\n        }}></span>\n      {/* {thread.message} */}\n      {/* {JSON.stringify(thread)} */}\n      {/* {JSON.stringify({ replyNotification, showReply })} */}\n      <div>\n        {showReply && (\n          <div className=\"bg-white border border-gray-200 rounded-sm p-4\">\n            <MessageForm\n              notification={replyNotification}\n              isReply={true}\n              createLabel=\"Reply\"\n              cancelLink={null}\n              createCallback={() => setShowSentConfirmation(true)}\n              noUserSelector={true}\n              subjectDisabled={true}\n              noTitle={true}\n              noSubject={true}\n            />\n          </div>\n        )}\n      </div>\n      {/* <div className=\"flex justify-end mt-2\">{threadReplyButton}</div> */}\n    </div>\n  );\n};\n\nThreadBody.propTypes = {\n  thread: PropTypes.object.isRequired,\n  showReply: PropTypes.bool,\n};\n// Copied from some other place\nconst formatReplySubject = subject => {\n  const prefix = 'Re: ';\n  if (subject.startsWith(prefix)) {\n    return subject;\n  }\n  return `${prefix}${subject}`;\n};\n\nexport default MessageThread;\n","export const UserGroups = {\n  Admin: 'Admin',\n  Employee: 'Employee',\n  Certified: 'Certified',\n};\n\nexport const UserTypes = {\n  Admin: 'ADMIN',\n  Staff: 'STAFF',\n  Volunteer: 'VOLUNTEER',\n  LEO: 'LEO',\n};\n\nexport const CaseStatus = {\n  Active: 'ACTIVE',\n  Approved: 'APPROVED',\n  Submitted: 'SUBMITTED',\n  Resubmitted: 'RESUBMITTED',\n  Returned: 'RETURNED',\n  Nullified: 'NULLIFIED',\n};\n\nexport const TutorialCategory = {\n  Proj1591HowTo: 'PROJECT_1591_HOW_TO',\n  OSINTTipsTricks: 'OSINT_TIPS_TRICKS',\n  Miscellaneous: 'MISCELLANEOUS',\n};\n\nexport const VolunteerStatus = {\n  Uncertfied: 'UNCERTIFIED',\n  Certified: 'CERTIFIED',\n  Pending: 'PENDING',\n  Disabled: 'DISABLED',\n  Deleted: 'DELETED',\n};\n\nexport const EmployeeType = {\n  Admin: 'ADMIN',\n  Staff: 'STAFF',\n};\n\nexport const ESCORT_AD = 'ESCORT_AD';\n\nexport const AwardClassificationOptions = {\n  Underage: 'UNDERAGE',\n  Adult: 'ADULT',\n  Unknown: 'UNKNOWN',\n};\n\nexport const AwardTypes = {\n  AccountIdentified: 'ACCOUNT_IDENTIFIED',\n  VerficationSource: 'VERIFICATION_SOURCE',\n  NoPoints: 'NO_POINTS',\n};\n","import React from 'react';\nimport { CaseStatus, VolunteerStatus, EmployeeType, UserTypes } from '../../constants';\n\nconst StatusPill = ({ status, type = 'user' }) => {\n  let bgColor = '';\n\n  if (type === 'leo' && (status === 'LEO' || status == 'ACTIVE')) {\n    bgColor = 'bg-guardian-blue';\n  } else if (type === 'leo' && status === 'DISABLED_LEO') {\n    bgColor = 'bg-red-500';\n  }\n\n  if ((type == 'user' && status === CaseStatus.Active) || status === VolunteerStatus.Certified) {\n    bgColor = 'bg-green-500';\n  } else if (\n    status === CaseStatus.Submitted ||\n    status === VolunteerStatus.Pending ||\n    status === CaseStatus.Resubmitted\n  ) {\n    bgColor = 'bg-pursuit-amber';\n  } else if (\n    status === VolunteerStatus.Disabled ||\n    status === 'DISABLED_LEO' ||\n    status === VolunteerStatus.Deleted ||\n    status === CaseStatus.Returned\n  ) {\n    bgColor = 'bg-pursuit-red';\n  } else if (status === VolunteerStatus.Uncertfied || status === CaseStatus.Approved) {\n    bgColor = 'bg-pursuit-gray';\n  } else if (status === EmployeeType.Admin) {\n    bgColor = 'bg-yellow-500';\n  } else if (status === EmployeeType.Staff || status === UserTypes.LEO) {\n    bgColor = 'bg-guardian-blue';\n  }\n\n  return (\n    <div className={`rounded-full flex justify-center w-32 py-1 px-1 ${bgColor}`}>\n      <span className=\"text-xs font-semibold text-white lg:text-sm \">\n        {status ? status.charAt(0).toUpperCase() + status.slice(1) : ''}\n      </span>\n    </div>\n  );\n};\n\nexport default StatusPill;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport debounce from 'lodash/debounce';\nimport { useMemo, useRef, useState } from 'react';\nimport Select, { components, MultiValueGenericProps, MultiValueProps, OnChangeValue, Props } from 'react-select';\nimport AsyncSelect from 'react-select/async';\nimport { listEmployees, listVolunteers } from '../../generated/graphql/queries';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport StatusPill from '../StatusPill';\nimport { VolunteerStatus, UserTypes } from '../../constants';\nimport chroma from 'chroma-js';\nimport * as Icons from 'react-icons/fa';\n\nconst groupStyles = {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'space-between',\n};\nconst groupBadgeStyles = {\n  backgroundColor: '#EBECF0',\n  borderRadius: '2em',\n  color: '#172B4D',\n  display: 'inline-block',\n  fontSize: 12,\n  fontWeight: 'normal',\n  lineHeight: '1',\n  minWidth: 1,\n  padding: '0.16666666666667em 0.5em',\n  textAlign: 'center',\n};\n\nconst defaultColor = '#f00';\n\nconst getStatusBackgroundColor = status => {\n  switch (status) {\n    case 'ADMIN':\n      return '#ecc94b';\n    case 'STAFF':\n      return '#01558b';\n    case 'VOLUNTEER':\n      return '#2684FF';\n    case 'CERTIFIED':\n      return '#48bb78';\n    default:\n      return defaultColor;\n  }\n};\n\nconst colorStyles = {\n  // control: styles => ({ ...styles, backgroundColor: 'white' }),\n  // option: (styles, { data, isDisabled, isFocused, isSelected }) => {\n  //   const color = chroma(data.color || defaultColor);\n  //   return {\n  //     ...styles,\n  //     backgroundColor: isDisabled\n  //       ? undefined\n  //       : isSelected\n  //       ? data.color\n  //       : isFocused\n  //       ? color.alpha(0.1).css()\n  //       : undefined,\n  //     color: isDisabled ? '#ccc' : isSelected ? (chroma.contrast(color, 'white') > 2 ? 'white' : 'black') : data.color,\n  //     cursor: isDisabled ? 'not-allowed' : 'default',\n\n  //     ':active': {\n  //       ...styles[':active'],\n  //       backgroundColor: !isDisabled ? (isSelected ? data.color : color.alpha(0.3).css()) : undefined,\n  //     },\n  //   };\n  // },\n  multiValue: (styles, { data }) => {\n    const color = chroma(data.data.color || defaultColor);\n    // console.log('data', data);\n    return {\n      ...styles,\n      // backgroundColor: color.alpha(0.1).css(),\n      // backgroundColor: data.data.color,\n      backgroundColor: color.alpha(0.8).css(),\n      color: 'white',\n    };\n  },\n  multiValueLabel: (styles, { data }) => ({\n    ...styles,\n    // color: data.data.color,\n    color: 'white',\n  }),\n  multiValueRemove: (styles, { data }) => ({\n    ...styles,\n    // color: data.data.color,\n    color: 'white',\n    ':hover': {\n      backgroundColor: data.data.color,\n      color: 'white',\n    },\n  }),\n};\n\nconst promiseOptions = inputValue =>\n  new Promise(async resolve => {\n    const params = {\n      // userStatus: filters.userStatus,\n      userStatus: VolunteerStatus.Certified,\n      searchTerm: inputValue,\n      nextToken: null,\n      sortField: 'ALIAS',\n      sortOrder: 'ASC',\n      limit: 1000,\n    };\n    const volunteerResponse = await API.graphql(graphqlOperation(listVolunteers, params));\n    // console.log('response', response);\n    const adminResponse = await API.graphql(\n      graphqlOperation(listEmployees, {\n        searchTerm: inputValue,\n        userStatus: UserTypes.Admin,\n        nextToken: null,\n        sortField: 'ALIAS',\n        sortOrder: 'ASC',\n        limit: 1000,\n      })\n    );\n    const staffResponse = await API.graphql(\n      graphqlOperation(listEmployees, {\n        searchTerm: inputValue,\n        userStatus: UserTypes.Staff,\n        nextToken: null,\n        sortField: 'ALIAS',\n        sortOrder: 'ASC',\n        limit: 1000,\n      })\n    );\n    const adminUsersWithRealName = adminResponse.data.listEmployees.items\n      .map(user => ({\n        ...user,\n        // Change alias to real name\n        // alias: `${user.firstName} ${user.lastName}`.trim(),\n      }))\n      // Sort by alias\n      .sort((a, b) => a.alias.localeCompare(b.alias));\n    const staffUsersWithRealName = staffResponse.data.listEmployees.items\n      .map(user => ({\n        ...user,\n        // Change alias to real name\n        // alias: `${user.firstName} ${user.lastName}`.trim(),\n      }))\n      // Sort by alias\n      .sort((a, b) => a.alias.localeCompare(b.alias));\n\n    // Combine the two lists\n    // const users = [...volunteerResponse.data.listVolunteers.items, ...staffResponse.data.listEmployees.items];\n    const users = [\n      ...volunteerResponse.data.listVolunteers.items,\n      ...adminUsersWithRealName,\n      ...staffUsersWithRealName,\n    ];\n\n    // const possibleUsers = response.data.listVolunteers.items.map(user => ({\n    const possibleUsers = users.map(user => ({\n      label: user.alias,\n      value: user.id,\n      color: getStatusBackgroundColor(user.userStatus),\n      data: {\n        status: user.userStatus,\n        color: getStatusBackgroundColor(user.userStatus),\n      },\n      meta: {\n        realName: `${user.firstName} ${user.lastName}`.trim(),\n        // group: 'volunteer',\n        status: user.userStatus,\n        // color: getStatusBackgroundColor(user.userStatus),\n      },\n    }));\n    const adminUsersGroups = [\n      {\n        label: 'Project 1591',\n        value: '#inbox-group#admin',\n        data: {\n          group: 'admin',\n          status: 'shared',\n        },\n        meta: {\n          realName: 'Project 1591',\n          group: 'admin',\n          status: 'shared',\n        },\n      },\n    ];\n    possibleUsers.push(...adminUsersGroups);\n    // console.log('possibleUsers', possibleUsers);\n    const filtered = possibleUsers.filter(i => i.label.toLowerCase().includes(inputValue.toLowerCase()));\n    // Group by status, set label to status and add records to options\n    const grouped = filtered.reduce((acc, cur) => {\n      const { status } = cur.data;\n      if (!acc[status]) {\n        acc[status] = {\n          label: status,\n          options: [],\n        };\n      }\n      acc[status].options.push(cur);\n      return acc;\n    }, {});\n\n    const result = Object.values(grouped);\n    // console.log('Users result', { result });\n    // resolve(Object.values(grouped));\n    resolve(result);\n\n    // resolve(filtered);\n  });\n/**\n *\n * @param {object} props Component options\n * @returns {components.Option} - The page JSX\n */\nconst CheckableOption = ({ isSelected, children, ...rest }) => {\n  // const { value, data } = rest;\n  // const thisOption = options.find(({ value: optionValue }) => optionValue === value);\n  const { status, group } = rest.data.data;\n  const statusTag = status && <StatusPill status={status} />;\n  // const groupTag = group && <StatusPill status={group} />;\n  return (\n    <components.Option isSelected={isSelected} {...rest}>\n      <div className=\"flex\">\n        {/* <div className=\"grid grid-cols-min grid-cols-3 gap-x-1 justify-items-start justify-start w-96 grid-rows-1\" > */}\n        {/* <div className=\"grid grid-cols-[max-content_1fr]\"> */}\n        {/* <div className=\"col-span-min\"> */}\n        <div className=\"flex-none pr-4\">\n          <input type=\"checkbox\" checked={isSelected} onChange={() => null} />\n        </div>\n        <div className=\"flex-initial w-48\">\n          <label>{children}</label>\n        </div>\n        <div className=\"flex-initial\">{statusTag}</div>\n      </div>\n      {/* {groupTag} */}\n      {/* {JSON.stringify({ options: options.slice(0, 2), status, group })} */}\n    </components.Option>\n  );\n};\n\nconst formatOptionLabel = ({ label, meta = {}, ...rest }) => {\n  // Display real names for admins and staff\n  const { realName, group, status } = meta;\n  // console.log('label', { label, rest });\n  if (status === 'ADMIN' || status === 'STAFF') {\n    return <span title={`Alias: ${label}`}>{realName}</span>;\n    // return realName;\n  }\n  return label;\n};\n\nconst formatGroupLabel = data => (\n  <div style={groupStyles}>\n    <span>{data.label}</span>\n    <span style={groupBadgeStyles}>{data.options.length}</span>\n  </div>\n);\n\nconst GroupHeading = ({ hasSelectedOption, ...props }) => {\n  const selectedStyle = {\n    backgroundColor: '#2684FF',\n    color: 'hsl(0,0%,100%)',\n  };\n  const style = { ...(hasSelectedOption && selectedStyle) };\n  return <components.GroupHeading {...props} style={style} />;\n};\n\nCheckableOption.propTypes = {\n  isSelected: PropTypes.bool,\n};\n\nconst UserSelector = ({ selected = [], onChange = _ => {}, isDisabled = false }) => {\n  const [internalSelected, setInternalSelected] = useState(selected);\n\n  const [openGroups, setOpenGroups] = useState({});\n\n  const toggleGroup = label => {\n    setOpenGroups(prev => ({ ...prev, [label]: !prev[label] }));\n  };\n\n  const updateSelected = values => {\n    // console.log('values', values);\n    setInternalSelected(values);\n    onChange(values);\n  };\n\n  useEffect(() => {\n    // console.log('selected', selected);\n    setInternalSelected(selected);\n  }, [selected]);\n\n  const Group = props => {\n    const hasSelectedOption = props.children.some(opt => opt.props.isSelected);\n    const { label } = props.data;\n    const isOpen = openGroups[label];\n    // const { label } = props;\n    const toggleThisGroup = () => {\n      console.log('toggleThisGroup', label, { props });\n      setOpenGroups(prev => ({ ...prev, [label]: !prev[label] }));\n    };\n\n    const expandIcon = isOpen ? <Icons.FaChevronDown /> : <Icons.FaChevronRight />;\n\n    const groupOptions = props.options;\n    const selectedOptions = props.selectProps.value;\n\n    // Check if all group options are already selected\n    const allSelected = groupOptions.every(opt => selectedOptions.some(selected => selected.value === opt.value));\n\n    const selectAllOptions = () => {\n      let newSelectedOptions = [];\n      // console.log('selectedOptions', { selectedOptions });\n      if (allSelected) {\n        // Remove group options from selected options\n        newSelectedOptions = selectedOptions.filter(\n          selected => !groupOptions.some(opt => opt.value === selected.value)\n        );\n      } else {\n        // Add group options to selected options\n        const newOptions = groupOptions.filter(opt => !selectedOptions.some(selected => selected.value === opt.value));\n        console.log('newOptions', newOptions);\n        newSelectedOptions = [\n          ...selectedOptions,\n          // ...groupOptions.filter(opt => !selectedOptions.some(selected => selected.value === opt.value)),\n          ...newOptions,\n        ];\n      }\n\n      // console.log(JSON.parse(JSON.stringify({ props, newSelectedOptions })));\n      return props.selectProps.onChange(newSelectedOptions);\n    };\n    // return <components.Group {...props} headingProps={{ ...props.headingProps, hasSelectedOption, onClick }} />;\n    return (\n      <div>\n        <div\n          style={{\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'space-between',\n            // Add padding between each group\n            fontSize: '90%',\n            paddingLeft: '12px',\n            gap: '12px',\n            paddingRight: '12px',\n            color: 'rgb(153, 153, 153)',\n          }}>\n          <span\n            onClick={toggleThisGroup}\n            style={{\n              textTransform: 'uppercase',\n              flex: 1,\n              cursor: 'pointer',\n            }}>\n            {props.label}\n          </span>\n          {/* Add a checkbox to toggle selecting all options */}\n          <span>\n            <input type=\"checkbox\" id={label} checked={allSelected} onChange={selectAllOptions} />{' '}\n            <label\n              htmlFor={label}\n              onClick={e => {\n                e.preventDefault();\n                selectAllOptions();\n              }}>\n              Select All\n            </label>\n          </span>\n          <span onClick={toggleThisGroup} style={{ cursor: 'pointer' }}>\n            {expandIcon}\n          </span>\n        </div>\n        {isOpen && (\n          <components.Group\n            {...props}\n            label={null}\n            headingProps={{ ...props.headingProps, hasSelectedOption, onClick: selectAllOptions }}\n          />\n        )}\n      </div>\n    );\n  };\n\n  return (\n    <>\n      <AsyncSelect\n        isMulti\n        cacheOptions\n        styles={colorStyles}\n        value={internalSelected}\n        defaultOptions\n        isDisabled={isDisabled}\n        closeMenuOnSelect={false}\n        // menuIsOpen={true}\n        // This does not work, no idea where it comes from\n        // allowSelectAll={true}\n        hideSelectedOptions={false}\n        loadOptions={promiseOptions}\n        components={{\n          Option: CheckableOption,\n          Group,\n          GroupHeading,\n        }}\n        onChange={updateSelected}\n        onError={e => {\n          console.log('Error', e);\n        }}\n        // menuIsOpen={true}\n        classNames={{\n          option: state => {\n            return 'flex space-x-2';\n          },\n        }}\n        getOptionLabel={formatOptionLabel}\n        formatGroupLabel={formatGroupLabel}\n      />\n      {/* {JSON.stringify({ selected, internalSelected })} */}\n    </>\n  );\n};\n\nexport default UserSelector;\n","import React from 'react';\n\nconst Spinner = ({ className }) => (\n  <svg\n    className={`fill-current ${className || ''}`}\n    version=\"1.1\"\n    id=\"loader-1\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    x=\"0px\"\n    y=\"0px\"\n    width=\"40px\"\n    height=\"40px\"\n    viewBox=\"0 0 50 50\"\n    xmlSpace=\"preserve\"\n  >\n    <path d=\"M43.935,25.145c0-10.318-8.364-18.683-18.683-18.683c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615c8.072,0,14.615,6.543,14.615,14.615H43.935z\">\n      <animateTransform\n        attributeType=\"xml\"\n        attributeName=\"transform\"\n        type=\"rotate\"\n        from=\"0 25 25\"\n        to=\"360 25 25\"\n        dur=\"1s\"\n        repeatCount=\"indefinite\"\n      />\n    </path>\n  </svg>\n);\n\nexport default Spinner;\n","const BUTTONDEFAULTCLASS = 'btton';\n\nexport function generateButtonClass(props) {\n  let buttonClass;\n  let padding;\n\n  const disabledClasses = 'bg-gray-200 cursor-not-allowed text-white';\n  const disabledTabClasses =\n    'bg-gray-200 cursor-not-allowed text-gray border-none text-white hover:no-underline rounded px-2';\n\n  if (props.solidBlue) {\n    buttonClass = `${BUTTONDEFAULTCLASS} ${props.disabled ? disabledClasses : 'primary-solid-blue'}`;\n  } else if (props.solidGray) {\n    buttonClass = `${BUTTONDEFAULTCLASS} ${props.disabled ? disabledClasses : 'primary-solid-gray'}`;\n  } else if (props.solidLightGray) {\n    buttonClass = `${BUTTONDEFAULTCLASS} ${props.disabled ? disabledClasses : 'primary-solid-lightgray'}`;\n  } else if (props.linedBlue) {\n    buttonClass = `${BUTTONDEFAULTCLASS} ${props.disabled ? disabledClasses : 'primary-lined-blue'}`;\n  } else if (props.linedRed) {\n    buttonClass = `${BUTTONDEFAULTCLASS} ${props.disabled ? disabledClasses : 'primary-lined-red'}`;\n  } else if (props.noLineBlue) {\n    buttonClass = `${BUTTONDEFAULTCLASS} ${props.disabled ? disabledClasses : 'primary-noline-blue'}`;\n  } else if (props.solidRed) {\n    buttonClass = `${BUTTONDEFAULTCLASS} ${props.disabled ? disabledClasses : 'primary-solid-red'}`;\n  } else if (props.tab) {\n    buttonClass = `${props.disabled ? disabledTabClasses : 'btton-tab'}`;\n  } else if (props.activeTab) {\n    buttonClass = 'btton-tab btton-tab-active';\n  } else if (props.anchorTag) {\n    buttonClass = 'underline primary-blue-text';\n  } else {\n    buttonClass = BUTTONDEFAULTCLASS;\n  }\n\n  if (props.noPadding) {\n    padding = '';\n  } else if (props.padding) {\n    padding = ` ${props.padding}`;\n  } else {\n    padding = '';\n  }\n\n  if (props.height) {\n    buttonClass += ` ${props.height}`;\n  } else {\n    buttonClass += ` h-10`;\n  }\n\n  if (props.className) {\n    buttonClass = `${buttonClass} ${props.className}`;\n  }\n\n  return buttonClass + padding;\n}\n","/* eslint-disable react/button-has-type */\nimport React, { useCallback } from 'react';\nimport debounce from 'lodash.debounce';\nimport Spinner from '../Spinner';\nimport { generateButtonClass } from './generateButtonClass.js';\n\nconst Button = ({ type, onClick, loading, justify, inline, disabled, debounceDelay = 250, id, ...props }) => {\n  const className = generateButtonClass({ loading, disabled, ...props });\n  const attributes = { id };\n  // const DEBOUNCE_SAVE_DELAY_MS = 250;\n\n  const onClickWithDebounce = useCallback(\n    debounce(async () => {\n      if (onClick) {\n        onClick();\n      }\n    }, debounceDelay),\n    [onClick]\n  );\n\n  return (\n    <button\n      type={type}\n      onClick={onClickWithDebounce}\n      className={`${!inline && 'flex'} flex-row items-center ${justify || 'justify-center'} ${className}`}\n      disabled={loading || disabled}\n      {...attributes}\n    >\n      {props.children}\n      {loading && <Spinner className=\"h-5 w-5 ml-2\" />}\n    </button>\n  );\n};\n\nexport default Button;\n","import React, { useContext, useEffect, useState } from 'react';\nimport { NotificationContext } from '../../helpers/AlertContext/AlertContext';\nimport Button from '../Button';\n\nconst DEFAULT = 'border border-solid border-transparent';\n\nconst TEXTCOLORS = {\n  greenText: 'bg-green-500 text-white font-bold rounded-t px-4 py-2',\n  redText: 'bg-red-500 text-white font-bold rounded-t px-4 py-2',\n};\n\nconst BORDERCOLORS = {\n  greenBorder: ' relative self-center border border-green-400 rounded-b bg-green-100 px-4 py-3 text-green-700',\n  redBorder: ' relative self-center border border-red-400 rounded-b bg-red-100 px-4 py-3 text-red-700',\n};\n\nconst Alert = ({ borderColor, textColor, children, className }) => {\n  const resolvedClassName = [className, DEFAULT, TEXTCOLORS[textColor], BORDERCOLORS[borderColor]].join('');\n\n  const [alert, setAlert] = useContext(NotificationContext);\n  const [failAlert, setFailAlert] = useState(false);\n\n  useEffect(() => {\n    const resetAlert = () => {\n      setTimeout(() => {\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: false,\n            message: '',\n            textColor: '',\n            borderColor: '',\n          },\n        });\n      }, 3000);\n    };\n\n    if (alert.notification.occurs && alert.notification.textColor === 'greenText') {\n      resetAlert();\n    } else if (alert.notification.occurs && alert.notification.textColor === 'redText') {\n      setFailAlert(true);\n    }\n  }, [alert, setAlert]);\n\n  const renderDismissalButton = () => {\n    if (failAlert) {\n      return (\n        <Button\n          className=\"bg-gray-300 hover:bg-gray-400 text-gray-800 font-bold py-2 px-3  rounded inline-flex items-center\"\n          onClick={() => {\n            setAlert({\n              type: 'SET_NOTIFICATION',\n              payload: {\n                occurs: false,\n                message: '',\n                textColor: '',\n                borderColor: '',\n              },\n            });\n            setFailAlert(false);\n          }}\n        >\n          <svg height=\"10pt\" viewBox=\"0 0 329.26933 329\" width=\"10pt\" xmlns=\"http://www.w3.org/2000/svg\">\n            {/* // this looks to be what draws the \"X\", i would suggest extracting the string and naming it,\n              // would improve readibility (e.g. call the var \"x_svg\" or something)\n              // since it's such a long string you could even define it in a separate file */}\n            <path d=\"m194.800781 164.769531 128.210938-128.214843c8.34375-8.339844 8.34375-21.824219 0-30.164063-8.339844-8.339844-21.824219-8.339844-30.164063 0l-128.214844 128.214844-128.210937-128.214844c-8.34375-8.339844-21.824219-8.339844-30.164063 0-8.34375 8.339844-8.34375 21.824219 0 30.164063l128.210938 128.214843-128.210938 128.214844c-8.34375 8.339844-8.34375 21.824219 0 30.164063 4.15625 4.160156 9.621094 6.25 15.082032 6.25 5.460937 0 10.921875-2.089844 15.082031-6.25l128.210937-128.214844 128.214844 128.214844c4.160156 4.160156 9.621094 6.25 15.082032 6.25 5.460937 0 10.921874-2.089844 15.082031-6.25 8.34375-8.339844 8.34375-21.824219 0-30.164063zm0 0\" />\n          </svg>\n        </Button>\n      );\n    }\n\n    return <></>;\n  };\n\n  return (\n    <div className=\"fixed top-0 inset-x-0 mx-8 lg:mx-20 my-2 z-50 mt-h8pr lg:mt-h13pr\" role=\"alert\">\n      <div className={`${resolvedClassName} flex justify-between`}>\n        {children}\n        {renderDismissalButton()}\n      </div>\n    </div>\n  );\n};\n\nexport default Alert;\n","import React, { useContext } from 'react';\nimport Alert from '../Alert';\nimport { NotificationContext } from '../../helpers/AlertContext/AlertContext.js';\n\nconst AlertHandler = () => {\n  const [state] = useContext(NotificationContext);\n\n  switch (state.notification.occurs) {\n    case true:\n      return (\n        <Alert textColor={state.notification.textColor} borderColor={state.notification.borderColor}>\n          {state.notification.message}\n        </Alert>\n      );\n\n    default:\n      return <></>;\n  }\n};\n\nexport default AlertHandler;\n","import React from 'react';\n\nconst HeaderText = ({ fontSize, noBold, className, children, mb }) => (\n  <div\n    className={`${mb || 'mb-2'} primary-blue-text font-display ${noBold ? '' : ' font-bold'} ${fontSize ||\n      'text-xl'} ${className}`}\n  >\n    {children}\n  </div>\n);\n\nexport default HeaderText;\n","import React, { useCallback, useState } from 'react';\n\nimport Button from '../Button';\nimport HeaderText from '../HeaderText';\n\nconst PopUpConfirmation = ({\n  title,\n  content,\n  onConfirm,\n  onCancel,\n  cancelText,\n  confirmText,\n  cancelLoadingText,\n  confirmLoadingText,\n  noCancel,\n  noConfirm,\n  confirmLoading,\n  cancelLoading,\n  destructive,\n  forceScrollBottom,\n  className,\n  contentWrapper = '',\n  confirmDisabled = false,\n}) => {\n  const [reachedBottom, setReachedBottom] = useState(false);\n\n  const handleScroll = useCallback(\n    event => {\n      if (!reachedBottom) {\n        const node = event.target;\n        const bottom = node.scrollHeight - node.scrollTop < node.clientHeight * 1.25;\n\n        if (bottom) {\n          setReachedBottom(true);\n        }\n      }\n    },\n    [reachedBottom]\n  );\n\n  return (\n    <div\n      className=\"fixed top-0 bottom-0 left-0 right-0 h-screen\"\n      style={{ backgroundColor: 'rgb(100, 100, 100, 0.75)', zIndex: 40 }}>\n      <div\n        className={`absolute flex flex-col bg-white py-6 px-8 shadow-xl ${className}`}\n        style={{ top: '50%', left: '50%', transform: 'translate(-50%, -50%)' }}>\n        <HeaderText noBold fontSize=\"text-2xl lg:text-3xl mb-2\">\n          {title}\n        </HeaderText>\n\n        <div onScroll={handleScroll} className={`${contentWrapper}`}>\n          {content}\n        </div>\n\n        <div className=\"flex justify-end mt-8\">\n          {!noCancel ? (\n            <Button\n              linedBlue\n              noPadding\n              className=\"px-3 mr-6 min-w-20 lg:min-w-24\"\n              onClick={onCancel}\n              loading={cancelLoading}>\n              {cancelLoading ? cancelLoadingText || 'CANCELING' : cancelText || 'CANCEL'}\n            </Button>\n          ) : null}\n\n          {!noConfirm ? (\n            <Button\n              solidBlue={!destructive}\n              solidRed={destructive}\n              noPadding\n              className=\"px-3 min-w-20 lg:min-w-24\"\n              onClick={onConfirm}\n              loading={confirmLoading}\n              disabled={(forceScrollBottom && !reachedBottom) || confirmDisabled}>\n              {confirmLoading ? confirmLoadingText || 'CONFIRMING' : confirmText || 'CONFIRM'}\n            </Button>\n          ) : null}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default PopUpConfirmation;\n","import React, { useState } from 'react';\nimport * as Icons from 'react-icons/fa';\nimport PopUpConfirmation from '../PopupConfirmation';\n\nconst ToolTip = ({ title, tooltipText, size, className }) => {\n  const [show, setShow] = useState(false);\n\n  return (\n    <>\n      {show ? (\n        <PopUpConfirmation\n          title={title}\n          content={tooltipText}\n          onConfirm={() => setShow(false)}\n          confirmText=\"OK\"\n          noCancel\n          className=\"w-11/12 lg:w-auto\"\n        />\n      ) : null}\n      <Icons.FaInfoCircle size={size || 16} className={`cursor-pointer ${className}`} onClick={() => setShow(true)} />\n    </>\n  );\n};\n\nexport default ToolTip;\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React, { useState } from 'react';\nimport Select from 'react-select';\nimport SelectAsync from 'react-select/async';\n\nconst DropDown = props => {\n  const {\n    label,\n    width,\n    height,\n    containerClassName,\n    className,\n    noFullFieldWidth,\n    noRounded,\n    fieldHeight,\n    fieldWidth,\n    fieldPadding,\n    fieldClassName,\n    onChange,\n    value,\n    options,\n    getOptionLabel,\n    getOptionValue,\n    multiSelect,\n    placeholder,\n    loading,\n    loadOptions,\n    isClearable,\n    styles,\n    required,\n    disabled,\n    tabIndex,\n  } = props;\n\n  const [widthStyle] = useState(width || 'w-full');\n  const [heightStyle] = useState(height ? ` ${height}` : '');\n  const [classNameStyle] = useState(containerClassName ? ` ${containerClassName}` : '');\n  const [noFullFieldWidthStyle] = useState(noFullFieldWidth ? '' : ' w-full');\n  const [noRoundedStyle] = useState(noRounded ? '' : ' rounded');\n  const [fieldHeightStyle] = useState(fieldHeight ? ` ${fieldHeight}` : ' h-10');\n  const [fieldWidthStyle] = useState(fieldWidth ? ` ${fieldWidth}` : '');\n  const [fieldPaddingStyle] = useState(fieldPadding ? ` ${fieldPadding}` : '');\n  const [fieldClassNameStyle] = useState(fieldClassName ? ` ${fieldClassName}` : '');\n  const [optionsAttribute] = useState(options);\n\n  const [labelComponent] = useState(\n    label ? (\n      <p className=\"light-primary-blue-text font-light mb-1\">\n        {label}\n        {required && <span className=\"text-pursuit-red ml-1\">*</span>}\n      </p>\n    ) : (\n      ''\n    )\n  );\n\n  const childProps = {\n    placeholder,\n    options: optionsAttribute,\n    value,\n    onChange,\n    isMulti: multiSelect,\n    className: `${noFullFieldWidthStyle} ${noRoundedStyle} ${fieldHeightStyle} ${fieldWidthStyle} ${fieldPaddingStyle} ${fieldClassNameStyle} ${className}`,\n    getOptionLabel: option => (getOptionLabel ? getOptionLabel(option) : option.label),\n    getOptionValue: option => (getOptionValue ? getOptionValue(option) : option.value),\n    isLoading: loading || false,\n    defaultOptions: true,\n    cacheOptions: true,\n    isClearable,\n    tabIndex,\n    loadOptions: loadOptions || (async () => options),\n    styles,\n    isDisabled: !!disabled,\n  };\n\n  return (\n    <div className={`${widthStyle} ${heightStyle} ${classNameStyle} ${disabled ? 'cursor-not-allowed' : ''}`}>\n      {labelComponent}\n\n      {loadOptions ? <SelectAsync {...childProps} /> : <Select {...childProps} />}\n    </div>\n  );\n};\n\nexport default DropDown;\n","import React from 'react';\nimport * as Icons from 'react-icons/fa';\nimport ToolTip from '../ToolTip';\n\nconst TextField = props => {\n  const {\n    fieldClassName = '',\n    className = '',\n    fieldWidth = '',\n    fieldHeight = 'h-10',\n    fieldPadding = 'px-3',\n    width = 'w-full',\n    height = '',\n    noRounded,\n    noFullFieldWidth,\n    label,\n    info,\n    infoTitle,\n    id,\n    type,\n    value,\n    checked,\n    onChange,\n    placeHolder,\n    readonly,\n    required,\n    tabindex,\n    maxLength\n  } = props;\n\n  return (\n    <div className={[width, height, className].join(' ')}>\n      <div className=\"flex\">\n        {label ? (\n          <p className=\"light-primary-blue-text font-light mb-1 mr-1\">\n            {label} {required && <span className=\"text-pursuit-red ml-1\">*</span>}\n          </p>\n        ) : null}\n\n        {info ? <ToolTip title={infoTitle} tooltipText={info} className=\"light-primary-blue-text font-light\" /> : null}\n      </div>\n\n      <div className=\"flex flex-row items-center textfield-bg-color\">\n        <input\n          id={id}\n          readOnly={readonly}\n          type={type}\n          value={value}\n          checked={checked}\n          onChange={onChange}\n          tabIndex={tabindex}\n          maxLength={maxLength}\n          placeholder={placeHolder}\n          className={`textfield-bg-color ${readonly ? 'cursor-not-allowed' : ''} ${\n            noFullFieldWidth ? '' : 'w-full'\n          } ${noRounded} ${fieldHeight} ${fieldWidth} ${fieldPadding} ${fieldClassName} ${\n            readonly ? 'focus:outline-none' : ''\n          }`}\n        />\n\n        <div className={`${!readonly ? 'hidden' : ''}`}>\n          <Icons.FaLock size={16} className=\"mr-2\" />\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default TextField;\n","import React, { useCallback, useEffect, useState } from 'react';\nimport * as Icons from 'react-icons/fa';\n\nimport { generateName } from '../../helpers/createAccount/nameGenerator';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { generateAlias } from '../../generated/graphql/mutations';\n\nimport ToolTip from '../ToolTip';\nimport DropDown from '../DropDown';\nimport TextField from '../TextField';\nimport Button from '../Button';\n\nconst AliasGenerator = ({ alias, setAlias = () => {}, excludeHeader, clearedAt, setMessage = () => {}, message }) => {\n  const [gender, setGender] = useState();\n  const [startingLetter, setStartingLetter] = useState();\n  const [aliasOptions, setAliasOptions] = useState([]);\n  const [loading, setLoading] = useState(false);\n  // const [message, setMessage] = useState('You must select an alias to continue.');\n  // const [selectedAlias, setSelectedAlias] = useState();\n\n  // const updateUsersAlias = useCallback(() => {\n  //   setAlias(selectedAlias);\n  // }, [selectedAlias, setAlias]);\n\n  const generateNewAlias = useCallback(async () => {\n    // return generateName(\n    //   gender ? gender.value : null,\n    //   !startingLetter || startingLetter.value === 'Any Letter' ? null : startingLetter.value\n    // );\n    try {\n      setLoading(true);\n\n      const { data } = await API.graphql(\n        graphqlOperation(generateAlias, {\n          input: { gender: gender ? gender.value : null, firstInitial: startingLetter ? startingLetter.value : null },\n        })\n      );\n      // console.log({ data });\n      setLoading(false);\n      return data.generateAlias;\n    } catch (error) {\n      console.error('Error getting alias options:', error);\n      // toast.error('Error getting alias options');\n      setLoading(false);\n    }\n  }, [gender, startingLetter]);\n\n  const createAliasOptions = useCallback(() => {\n    const options = [];\n\n    for (let i = 0; i < 5; i++) {\n      // options.push(generateName());\n      options.push(generateNewAlias());\n    }\n\n    setAliasOptions(options);\n  });\n\n  // When first loading the component, generate the alias options and set the selected alias to the first option\n  useEffect(() => {\n    // createAliasOptions();\n    addNewAliasOption();\n  }, []);\n\n  useEffect(() => {\n    if (aliasOptions && !!alias) {\n      // setSelectedAlias(aliasOptions[0]);\n      setAlias(aliasOptions[0]);\n    }\n  }, [aliasOptions, alias]);\n\n  const addNewAliasOption = useCallback(async () => {\n    const { aliases } = await generateNewAlias();\n    // console.log({ aliases });\n    if (aliases.length === 0) {\n      setMessage('No could be generated for the selected criteria.');\n      return;\n    }\n    setMessage(undefined);\n    // Add alias to the options list and remove the last option\n    const updatedOptions = [...aliases, ...aliasOptions].slice(0, 5);\n    // setSelectedAlias(newAlias);\n    // setAlias(updatedOptions[0]);\n    setAlias(aliases[0]);\n    setAliasOptions(updatedOptions);\n    // console.log({ aliases, updatedOptions });\n\n    // setAliasOptions([...aliasOptions, newAlias]);\n  }, [aliasOptions, generateNewAlias]);\n\n  // Regen name when options change\n  useEffect(() => {\n    addNewAliasOption();\n  }, [gender, startingLetter]);\n\n  // const selectAltAlias = useCallback(setAlias, [setAlias]);\n\n  // useEffect(() => {\n  //   if (!alias) {\n  //     const startingAlias = generateName();\n\n  //     setAlias(startingAlias);\n  //   }\n  // }, [alias, setAlias]);\n\n  useEffect(() => {\n    if (clearedAt) {\n      setGender(null);\n      setStartingLetter(null);\n    }\n  }, [clearedAt]);\n\n  const updateAlias = useCallback(\n    alias => {\n      console.log('Setting alias to', alias);\n      setAlias(alias);\n    },\n    [setAlias]\n  );\n\n  // useEffect(() => {\n  //   setAlias(\n  //     generateName(\n  //       gender ? gender.value : null,\n  //       !startingLetter || startingLetter.value === 'Any Letter' ? null : startingLetter.value\n  //     )\n  //   );\n  // }, [gender, startingLetter, setAlias]);\n\n  const altAliases = aliasOptions.slice(1).map((option, index) => (\n    <Button\n      // solidBlue\n      key={index}\n      className=\"ml-4 flex items-center justify-center\"\n      onClick={() => updateAlias(option)}>\n      {option}\n    </Button>\n  ));\n  return (\n    <>\n      {!excludeHeader && (\n        <div className=\"flex items-center mb-4\">\n          <label className=\"font-bold text-lg text-pursuit-gray mr-2\">Generate an Alias</label>\n          <ToolTip\n            tooltipText=\"We use an automated username/alias generator to protect the identities of our users from being disclosed on other platform applications. Gender is only asked to generate a random alias.\"\n            title=\"Why an Alias?\"\n            className=\"text-pursuit-gray\"\n          />\n        </div>\n      )}\n\n      <div className=\"flex flex-row\">\n        <DropDown\n          value={gender}\n          onChange={value => setGender(value)}\n          label=\"Gender of Name\"\n          containerClassName=\"mr-2 mb-4\"\n          options={[\n            { value: null, label: 'Unspecified' },\n            { value: 'male', label: 'Male' },\n            { value: 'female', label: 'Female' },\n          ]}\n          key={`${gender}-gender-selection`}\n        />\n\n        <DropDown\n          value={startingLetter}\n          label=\"First Name Starts With\"\n          onChange={value => setStartingLetter(value)}\n          options={[\n            { value: 'Any Letter', label: 'Any Letter' },\n            { value: 'A', label: 'A' },\n            { value: 'B', label: 'B' },\n            { value: 'C', label: 'C' },\n            { value: 'D', label: 'D' },\n            { value: 'E', label: 'E' },\n            { value: 'F', label: 'F' },\n            { value: 'G', label: 'G' },\n            { value: 'H', label: 'H' },\n            { value: 'I', label: 'I' },\n            { value: 'J', label: 'J' },\n            { value: 'K', label: 'K' },\n            { value: 'L', label: 'L' },\n            { value: 'M', label: 'M' },\n            { value: 'N', label: 'N' },\n            { value: 'O', label: 'O' },\n            { value: 'P', label: 'P' },\n            { value: 'Q', label: 'Q' },\n            { value: 'R', label: 'R' },\n            { value: 'S', label: 'S' },\n            { value: 'T', label: 'T' },\n            { value: 'U', label: 'U' },\n            { value: 'V', label: 'V' },\n            { value: 'W', label: 'W' },\n            { value: 'X', label: 'X' },\n            { value: 'Y', label: 'Y' },\n            { value: 'Z', label: 'Z' },\n          ]}\n          containerClassName=\"ml-2 mb-4\"\n          key={`${startingLetter}-starts-with-selection`}\n        />\n      </div>\n\n      <div className=\"flex flex-row items-end mb-4\">\n        <TextField value={alias} placeHolder=\"\" readonly label={excludeHeader ? 'Alias' : null} required />\n        {/* <br />\n        {alias} */}\n\n        <Button\n          solidBlue\n          loading={loading}\n          className=\"w-12 ml-4 flex items-center justify-center\"\n          onClick={() => {\n            // updateUsersAlias();\n            addNewAliasOption();\n            // setAlias(\n            //   generateName(\n            //     gender ? gender.value : null,\n            //     !startingLetter || startingLetter.value === 'Any Letter' ? null : startingLetter.value\n            //   )\n            // );\n          }}>\n          {!loading && <Icons.FaSyncAlt />}\n        </Button>\n      </div>\n      {/* <div className=\"flex flex-row items-end mb-4\">\n        {altAliases}\n  \n      </div> */}\n    </>\n  );\n};\n\nexport default AliasGenerator;\n","import React from 'react';\nimport { useHistory, useLocation, Link } from 'react-router-dom';\nimport HeaderLogo from '../../assets/Images/guardian_group_logo.svg';\n\nimport Button from '../Button';\n\nconst AuthHeader = () => {\n  const history = useHistory();\n  const location = useLocation();\n\n  const showButtons = location.pathname === '/';\n\n  return (\n    <nav className=\"fixed z-30 flex flex-row items-center justify-between w-screen h-12 px-3 bg-white shadow-lg lg:h-24 lg:border-b lg:border-gray-300 lg:shadow-none\">\n      {!showButtons && <div className=\"lg:hidden\" />}\n\n      <Link to=\"/\">\n        <img className=\"h-10 py-1 lg:h-24 lg:my-2 lg:py-2 lg:ml-4\" src={HeaderLogo} alt=\"Guardian Group Logo\" />\n      </Link>\n\n      {showButtons ? (\n        <div className=\"flex flex-no-wrap lg:pr-12 whitespace-no-wrap\">\n          <Button solidRed onClick={() => history.push('login')} className=\"px-3 text-base lg:w-40 mx-1 md:mx-2\" inline>\n            <span className=\"text-xs lg:text-base\">SIGN IN</span>\n          </Button>\n\n          <Button\n            solidBlue\n            onClick={() => history.push('create-account')}\n            // className=\"px-3 ml-3 text-base lg:w-56 lg:mx-12\"\n            className=\"px-3 text-base lg:w-40 mx-1 md:mx-2\"\n            inline>\n            <span className=\"text-xs lg:text-base\">REGISTER</span>\n          </Button>\n\n          <Button\n            solidLightGray\n            onClick={() =>\n              (window.location.href =\n                'https://guardiangroup.org/team1591/?utm_source=p1591&utm_medium=header-button&utm_campaign=donate')\n            }\n            className=\"px-3 text-base lg:w-40 mx-1 md:mx-2\"\n            // style={{ backgroundColor: '#666166' }}\n            inline>\n            <span className=\"text-xs lg:text-base\">DONATE</span>\n          </Button>\n        </div>\n      ) : (\n        <div className=\"lg:hidden\" />\n      )}\n    </nav>\n  );\n};\n\nexport default AuthHeader;\n","import React, { Component } from 'react';\n\nclass Card extends Component {\n  render() {\n    return (\n      <div className=\"max-w-sm rounded overflow-hidden shadow-lg\">\n        <div className=\"px-6 py-4\">\n          <div className=\"font-bold text-xl mb-2\">Leaderboard</div>\n          <p className=\"text-gray-700 text-base\">cardspace</p>\n        </div>\n        <div className=\"px-6 pt-4 pb-2\">\n          <span className=\"inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2\">\n            #cardspace\n          </span>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default Card;\n","import React from 'react';\nimport HighchartsReact from 'highcharts-react-official';\nimport Highcharts from 'highcharts';\nimport highchartsMap from 'highcharts/modules/map';\n\nhighchartsMap(Highcharts);\n\nconst PieChart = ({ numOver18, numUnder18 }) => {\n  const series = [\n    {\n      name: 'Cases',\n      colorByPoint: true,\n      total: numOver18 + numUnder18,\n      data: [\n        {\n          name: 'Underage',\n          y: numUnder18,\n        },\n        {\n          name: '18-25',\n          y: numOver18,\n          dataLabels: {\n            enabled: false,\n          },\n        },\n      ],\n    },\n  ];\n\n  const plotOptions = {\n    pie: {\n      allowPointSelect: true,\n      cursor: 'pointer',\n      title: {\n        enabled: false,\n      },\n      dataLabels: {\n        enabled: true,\n        format: '<b>{total}</b>',\n        connectorColor: '#2F3640',\n        distance: 2,\n        style: {\n          fontSize: '15px',\n        },\n        crop: false,\n        overflow: 'allow',\n      },\n    },\n  };\n\n  const options = {\n    chart: {\n      backgroundColor: null,\n      borderColor: null,\n      plotBorderColor: null,\n      plotBorderWidth: 100,\n      plotShadow: false,\n      type: 'pie',\n      height: 100,\n      width: 120,\n      marginRight: 45,\n    },\n\n    colors: ['#770303', '#2F3640'],\n    credits: {\n      enabled: false,\n    },\n    legend: {\n      enabled: false,\n    },\n    title: {\n      enabled: false,\n      text: '',\n    },\n\n    tooltip: {\n      headerFormat: '<b>{series.name}</b><br/>',\n      pointFormat: '{point.name}: <b>{point.y}</b>',\n      outside: true,\n    },\n    plotOptions,\n    xAxis: {\n      type: 'datetime',\n      labels: { style: { fontSize: '8px' } },\n      tickLength: 5,\n    },\n\n    series,\n  };\n\n  return <HighchartsReact highcharts={Highcharts} options={options} />;\n};\n\nexport { PieChart };\n","import React, { useState, useEffect, useContext, memo, useMemo, useCallback } from 'react';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { GoogleMap, useJsApiLoader, MarkerClusterer, OverlayView, OverlayViewF, Marker } from '@react-google-maps/api';\nimport { useUser } from '../../contexts/userContext';\nimport { NotificationContext } from '../../helpers/AlertContext/AlertContext.js';\n\nimport { getCaseMapData } from '../../generated/graphql/queries';\nimport { PieChart } from '../PieChart';\n\nconst UNDERAGE_MARKER_COLOR = '#770303';\nconst OVER18_MARKER_COLOR = '#2F3640';\n\nconst CaseMap = ({ board = 'allTime', userCrowdToggle = 'crowd' }) => {\n  const { user } = useUser();\n  const [zoom] = useState(3);\n  const [{ userPoints, crowdPoints, userOver18Points, crowdOver18Points }, setPointData] = useState({\n    userPoints: [],\n    crowdPoints: [],\n    userOver18Points: [],\n    crowdOver18Points: [],\n  });\n  const [center] = useState({\n    lat: 39.8097343,\n    lng: -98.5556199,\n  }); // center of USA\n  const [currClusters, setCurrClusters] = useState([]);\n  const [, setAlert] = useContext(NotificationContext);\n\n  const { isLoaded } = useJsApiLoader({\n    id: 'google-map-script',\n    googleMapsApiKey: process.env.REACT_APP_GOOGLE_MAPS_API_KEY,\n  });\n\n  useEffect(() => {\n    // updatePoints();\n\n    const updatePoints = async () => {\n      try {\n        const getId = userCrowdToggle === 'crowd' ? null : user.id;\n\n        const {\n          data: {\n            getCaseMapData: { userCases, crowdCases, userOver18Cases, crowdOver18Cases },\n          },\n        } = await API.graphql(graphqlOperation(getCaseMapData, { board, id: getId }));\n\n        const toLatLng = ({ lat, lon }) => ({ lat, lng: lon });\n        const toOver18 = ({ lat, lng }) => ({ lat, lng, isOver18: true });\n        const toUnder18 = ({ lat, lng }) => ({ lat, lng, isOver18: false });\n\n        const newPointData = {\n          userPoints: userCases.map(toLatLng).map(toUnder18),\n          crowdPoints: crowdCases.map(toLatLng).map(toUnder18),\n          userOver18Points: userOver18Cases.map(toLatLng).map(toOver18),\n          crowdOver18Points: crowdOver18Cases.map(toLatLng).map(toOver18),\n        };\n\n        setPointData(newPointData);\n      } catch (error) {\n        console.error('Error fetching Case Map Data', error);\n\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: 'Error fetching Case Map Data',\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n      }\n    };\n\n    updatePoints();\n  }, [board, setAlert, user.id, userCrowdToggle]);\n\n  const toMarkers = (location, pinColor, clusterer, isOver18, index = 0) => {\n    const pinSVGHole =\n      'M12,11.5A2.5,2.5 0 0,1 9.5,9A2.5,2.5 0 0,1 12,6.5A2.5,2.5 0 0,1 14.5,9A2.5,2.5 0 0,1 12,11.5M12,2A7,7 0 0,0 5,9C5,14.25 12,22 12,22C12,22 19,14.25 19,9A7,7 0 0,0 12,2Z';\n\n    const markerImage = {\n      path: pinSVGHole,\n      anchor: new window.google.maps.Point(12, 17),\n      fillOpacity: 1,\n      fillColor: pinColor,\n      strokeWeight: 2,\n      strokeColor: 'white',\n      scale: 2,\n      isOver18,\n    };\n\n    return <Marker key={createKey(location, index)} position={location} clusterer={clusterer} icon={markerImage} />;\n  };\n\n  const renderMarkers = () => {\n    if (userCrowdToggle === 'crowd') {\n      return (\n        <>\n          {userPoints.length + userOver18Points.length + crowdPoints.length + crowdOver18Points.length > 0 ? (\n            <MarkerClusterer options={{ imagePath: undefined }} onClusteringEnd={onClusteringEnd}>\n              {clusterer =>\n                [...userPoints, ...userOver18Points, ...crowdPoints, ...crowdOver18Points].map(\n                  ({ lat, lng, isOver18 }, index) => {\n                    const markerColor = isOver18 ? OVER18_MARKER_COLOR : UNDERAGE_MARKER_COLOR;\n\n                    return toMarkers({ lat, lng }, markerColor, clusterer, isOver18, index);\n                  }\n                )\n              }\n            </MarkerClusterer>\n          ) : null}\n        </>\n      );\n    }\n\n    return (\n      <>\n        {userPoints.length + userOver18Points.length > 0 ? (\n          <MarkerClusterer options={{ imagePath: undefined }} onClusteringEnd={onClusteringEnd}>\n            {clusterer =>\n              [...userPoints, ...userOver18Points].map(({ lat, lng, isOver18 }) => {\n                const markerColor = isOver18 ? OVER18_MARKER_COLOR : UNDERAGE_MARKER_COLOR;\n\n                return toMarkers({ lat, lng }, markerColor, clusterer, isOver18);\n              })\n            }\n          </MarkerClusterer>\n        ) : null}\n      </>\n    );\n  };\n\n  // Create Pie Charts\n  const onClusteringEnd = item => {\n    const newClusters = [];\n\n    item.clusters.forEach(i => {\n      if (i.markers.length < 2) return;\n      let numOver18 = 0;\n      let numUnder18 = 0;\n\n      const lat = i.center.lat();\n      const lng = i.center.lng();\n\n      i.markers.forEach(m => {\n        if (m.icon.isOver18) {\n          numOver18++;\n        } else {\n          numUnder18++;\n        }\n      });\n\n      newClusters.push({ lat, lng, numOver18, numUnder18 });\n    });\n\n    setCurrClusters(newClusters);\n  };\n\n  const renderClusters = useCallback(() => {\n    const getPixelPositionOffset = (width, height) => ({\n      x: -(width / 2),\n      y: -(height / 2),\n    });\n    return currClusters.map((item, index) => (\n      <Marker\n        key={createKey({ lat: item.lat, lng: item.lng }, index)}\n        position={{ lat: item.lat, lng: item.lng }}\n        icon={{\n          path: '',\n        }}>\n        <OverlayViewF\n          key={createKey({ lat: item.lat, lng: item.lng }, index)}\n          position={{ lat: item.lat, lng: item.lng }}\n          // mapPaneName={OverlayView.FLOAT_PANE}\n          mapPaneName={OverlayView.OVERLAY_MOUSE_TARGET}\n          getPixelPositionOffset={getPixelPositionOffset}>\n          <PieChart numOver18={item.numOver18} numUnder18={item.numUnder18} />\n        </OverlayViewF>\n      </Marker>\n    ));\n  }, [currClusters]);\n\n  function createKey(location, index = 0) {\n    return location.lat + location.lng + index;\n  }\n\n  return isLoaded ? (\n    <>\n      <GoogleMap mapContainerStyle={{ flexGrow: '1', minHeight: '350px', height: '100%' }} center={center} zoom={zoom}>\n        {renderClusters()}\n        {renderMarkers()}\n      </GoogleMap>\n\n      <div className=\"flex justify-center\">\n        <div className=\"flex items-center\">\n          <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <rect width=\"12\" height=\"12\" fill={UNDERAGE_MARKER_COLOR} />\n          </svg>{' '}\n          <span className=\"ml-1\">Underage</span>\n        </div>\n        <div className=\"flex items-center ml-4\">\n          <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <rect width=\"12\" height=\"12\" fill={OVER18_MARKER_COLOR} />\n          </svg>\n          <span className=\"ml-1\">18-25</span>\n        </div>\n      </div>\n    </>\n  ) : (\n    <></>\n  );\n};\n\nexport default memo(CaseMap);\n","export const websiteList = [\n  'CashApp',\n  'Date of Birth',\n  'Email',\n  'Escort Ad',\n  'Facebook',\n  'Instagram',\n  'Kik',\n  'Linktree',\n  'Messenger',\n  'OnlyFans',\n  'PayPal',\n  'Periscope',\n  'Pinterest',\n  'Reddit',\n  'Snapchat',\n  'Sound Cloud',\n  'Telegram',\n  'Threads',\n  'TikTok',\n  'Tumblr',\n  'Twitch',\n  'Twitter',\n  'Venmo',\n  'Website',\n  'WhatsApp',\n  'YouTube',\n  // 'X',\n  'Other',\n];\nconst websiteLabelOverrides = {\n  Twitter: 'X',\n};\n\nexport const getWebSourceSiteLabel = field => {\n  return websiteLabelOverrides[field] || field;\n};\n\n// export const webSourceRequiredFields = ['url', 'description'];\nexport const webSourceRequiredFields = ['url'];\nexport const webSourceRequiredFieldsStructured = {\n  escortad: ['url', 'adLocation', 'adDate', 'phoneNumber', 'escortSiteTitle'],\n};\n\nexport const webSourceFields = {\n  cashapp: {\n    displayName: '',\n    profilePictureUrl: '',\n    cashtag: '',\n    registeredPhoneNumber: '',\n    // url: '',\n\n    description: '',\n  },\n  dateofbirth: {\n    dateOfBirth: '',\n    description: '',\n  },\n  email: {\n    email: '',\n    description: '',\n  },\n  escortad: {\n    escortSiteTitle: '',\n    url: '',\n    adLocation: '',\n    adDate: '',\n    phoneNumber: '',\n    phoneType: '',\n    description: '',\n  },\n  facebook: {\n    profileName: '',\n    username: '',\n    userId: '',\n    description: '',\n  },\n  instagram: {\n    displayName: '',\n    username: '',\n    userId: '',\n    description: '',\n  },\n  threads: {\n    displayName: '',\n    username: '',\n    userId: '',\n    description: '',\n  },\n  linktree: {\n    username: '',\n    description: '',\n  },\n  kik: {\n    displayName: '',\n    username: '',\n    description: '',\n  },\n  messenger: {\n    username: '',\n    description: '',\n  },\n\n  paypal: {\n    displayName: '',\n    username: '',\n    registeredPhoneNumber: '',\n    description: '',\n  },\n  periscope: {\n    displayName: '',\n    username: '',\n    description: '',\n  },\n  pinterest: {\n    displayName: '',\n    username: '',\n    description: '',\n  },\n  reddit: {\n    username: '',\n    description: '',\n  },\n  snapchat: {\n    displayName: '',\n    username: '',\n    registeredPhoneNumber: '',\n    description: '',\n  },\n  soundcloud: {\n    displayName: '',\n    username: '',\n    description: '',\n  },\n  telegram: {\n    displayName: '',\n    username: '',\n    registeredPhoneNumber: '',\n    description: '',\n  },\n  tiktok: {\n    displayName: '',\n    username: '',\n    userId: '',\n    description: '',\n  },\n  tumblr: {\n    displayName: '',\n    username: '',\n    description: '',\n  },\n  twitch: {\n    displayName: '',\n    username: '',\n    description: '',\n  },\n  twitter: {\n    displayName: '',\n    username: '',\n    description: '',\n  },\n  venmo: {\n    displayName: '',\n    username: '',\n    registeredPhoneNumber: '',\n    description: '',\n  },\n  website: {\n    title: '',\n    displayName: '',\n    username: '',\n    description: '',\n  },\n  whatsapp: {\n    displayName: '',\n    username: '',\n    registeredPhoneNumber: '',\n    description: '',\n  },\n  youtube: {\n    displayName: '',\n    username: '',\n    description: '',\n  },\n  other: {\n    title: '',\n    displayName: '',\n    username: '',\n    userId: '',\n    description: '',\n  },\n  onlyfans: {\n    displayName: '',\n    username: '',\n    description: '',\n  },\n};\n\n// Pretty labels to show next to fields\nexport const webSourceFieldLabels = {\n  url: 'URL',\n  description: 'Description',\n  escortad_description: 'Description [Any additional context or phone numbers for this ad]',\n  title: 'Title',\n  // escortSiteTitle: 'Escort Website',\n  escortSiteTitle: 'Title [Website Name]',\n  username: 'Username',\n  displayName: 'Display Name',\n  userId: 'User ID',\n  dateOfBirth: 'Date of Birth',\n  email: 'Email',\n  cashtag: 'Cashtag',\n  profileName: 'Profile Name',\n  profilePictureUrl: 'Profile Picture URL',\n  registeredPhoneNumber: 'Registered Phone Number',\n  phoneNumber: 'Phone Number',\n  // phoneType: 'Type',\n  phoneType: 'Phone Type',\n  // adLocation: 'Location [Posted City]',\n  adLocation: 'Location [Posted City]',\n  adDate: 'Date [Posted Date]',\n};\nexport const webSourceFieldCharacterLimits = {\n  escortad_description: 250,\n  description: 500,\n};\n\n// Hint text to show inside fields\nexport const webSourceFieldPlaceholders = {\n  url: 'Paste URL',\n  description: 'Explain how you got to this point and your analysis',\n  registeredPhoneNumber: '555-555-5555',\n  phoneNumber: '555-555-5555',\n};\n\nexport const webSourceEscortSiteOptions = [\n  {\n    label: 'Adult Look',\n    value: 'adult-look',\n  },\n  {\n    label: 'Adult Search',\n    value: 'adult-search',\n  },\n  {\n    label: 'CallEscort',\n    value: 'callescort',\n  },\n  {\n    label: 'Eros',\n    value: 'eros',\n  },\n  {\n    label: 'KittyAds',\n    value: 'kitty-ads',\n  },\n  {\n    label: 'Megapersonals',\n    value: 'megapersonals',\n  },\n  {\n    label: 'PrivateDelights',\n    value: 'private-delights',\n  },\n  // {\n  //   label: 'Slixa',\n  //   value: 'slixa',\n  // },\n  {\n    label: 'SkipTheGames',\n    value: 'skip-the-games',\n  },\n  // {\n  //   label: 'SumoSearch',\n  //   value: 'sumosearch',\n  // },\n  // {\n  //   label: 'Switter',\n  //   value: 'switter',\n  // },\n  // {\n  //   label: 'TNA Board',\n  //   value: 'tna-board',\n  // }\n  {\n    label: 'Tryst',\n    value: 'tryst',\n  },\n  {\n    label: 'Other',\n    value: 'other',\n  },\n];\n\nexport const webSourceDescriptionHelper = {\n  escortad:\n    'If more than one number exists in this unique ad, please place that information here along with any other amplifying content. For example, on SkipTheGames, there may be a number listed in the ad description but a different number behind the Call Me captcha. This is what you’d list here instead of making it a separate source.',\n};\nexport const webSourceTooltips = {\n  escortad: {\n    // escortSiteTitle: 'website name',\n    adLocation:\n      'The location that is listed here is specific to the latest escort ad posted city. This is not a location where you believe the person is from or residing. The reason for this being specific to the city posted in, allows for Guardian Group to deliver it to the correct law enforcement jurisdiction for appropriate action.',\n    adDate: `The date required here is the date the escort ad was posted online. 90% of the time this is obvious on the escort ad. However, there are sites that it's a bit more obscure or hidden on purpose. If you select an ad from one of the sites where it's not obvious, select today's date instead so you may still submit the lead. Guardian Group will determine the validity of the date.`,\n    description:\n      'If more than one number exists in this unique ad, please place that information here along with any other amplifying content. For example, on SkipTheGames, there may be a number listed in the ad description but a different number behind the Call Me captcha. This is what you’d list here instead of making it a separate source.',\n  },\n};\n","import { webSourceEscortSiteOptions, webSourceFieldLabels, webSourceFieldPlaceholders } from './webSourceFields';\n\nexport function readableFormat(fieldName) {\n  if (!fieldName) {\n    return fieldName;\n  }\n\n  return (\n    fieldName\n      .split(/(?=[A-Z])/)\n      .join(' ')\n      // capitalize first letter of first word\n      .replace(/\\w\\S*/g, word => word.charAt(0).toUpperCase() + word.substr(1))\n  );\n}\n\nexport const webSourceFieldLabel = (field, source, hideDetails = false) => {\n  const label = webSourceFieldLabels[`${source}_${field}`] || webSourceFieldLabels[field] || readableFormat(field);\n  if (hideDetails) {\n    // If hide details is true, remove the details from the label. Remove anything between [].\n    return label.replace(/\\s\\[.*\\]/, '');\n  } else {\n    return label;\n  }\n};\nexport const webSourceFieldPlaceholder = field => webSourceFieldPlaceholders[field] || readableFormat(field);\n\nexport const fieldValue = (uniqueFieldKey, keyValue) => {\n  if (!uniqueFieldKey) {\n    return keyValue;\n  }\n\n  if (uniqueFieldKey === 'escortSiteTitle') {\n    const escortSiteOption = webSourceEscortSiteOptions.find(({ value }) => value === keyValue);\n\n    if (escortSiteOption) {\n      return escortSiteOption.label;\n    }\n  }\n\n  if (keyValue && ['adDate', 'dateOfBirth', 'date'].includes(uniqueFieldKey)) {\n    const date = new Date(keyValue);\n    // const date = new Date(keyValue);\n    const options = {\n      year: 'numeric',\n      month: 'long',\n      day: 'numeric',\n      // hour: 'numeric',\n      // minute: 'numeric',\n      // hour12: true, // Use 12-hour format\n    };\n    // const dateParts = keyValue.split('-');\n    // date.setFullYear(dateParts[0]);\n    // date.setMonth(dateParts[1] - 1);\n    // date.setDate(dateParts[2]);\n\n    const formattedDate = new Intl.DateTimeFormat('en-US', options).format(date);\n    return formattedDate;\n    // return new Date(keyValue).toLocaleDateString();\n  }\n\n  // Default\n  return keyValue;\n};\n\nexport const usesOldEscortAdFormat = record => {\n  const { escortAd } = record;\n\n  if (!escortAd) {\n    return false;\n  }\n  const escortAdData = [escortAd.url, ...escortAd.phones.map(({ phone }) => phone), escortAd.description];\n  const escortAdEmpty = escortAdData.filter(Boolean).length === 0;\n\n  // console.log({ escortAdEmpty, escortAdData });\n\n  // If all fields are empty, it's the old format\n  return !escortAdEmpty;\n};\n\nexport const sortWebSourceFields = order => {\n  // if (!order) {\n  //   return fields;\n  // }\n\n  return ([a], [b]) => {\n    const aIndex = order.indexOf(a);\n    const bIndex = order.indexOf(b);\n\n    if (aIndex === -1) {\n      return 1;\n    }\n\n    if (bIndex === -1) {\n      return -1;\n    }\n\n    return aIndex - bIndex;\n  };\n};\n","import React from 'react';\nimport { CaseStatus, AwardTypes } from '../../constants';\n\nconst Feedback = ({ award, comments, status, stepId }) => {\n  // if (status !== CaseStatus.Returned && status !== CaseStatus.Approved && status !== CaseStatus.Resubmitted) {\n  //   return <></>;\n  // }\n\n  // if (award === AwardTypes.AccountIdentified || award === AwardTypes.VerficationSource) {\n  //   return <></>;\n  // }\n\n  if (!Array.isArray(comments) || !comments.length) {\n    return <></>;\n  }\n\n  const comment = comments.find(x => x.stepId === stepId);\n\n  if (!comment || !comment.feedback) {\n    return <></>;\n  }\n\n  return (\n    <div className=\"p-4 my-8 bg-white rounded\">\n      <label className=\"text-lg font-bold text-pursuit-darkred\">Feedback from Guardian Group on this step:</label>\n      <p className=\"text-pursuit-darkred\">{comment.feedback}</p>\n    </div>\n  );\n};\n\nexport default Feedback;\n","import React, { useState, useEffect } from 'react';\nimport * as Icons from 'react-icons/fa';\nimport {\n  fieldValue,\n  readableFormat,\n  sortWebSourceFields,\n  webSourceFieldLabel,\n} from '../../helpers/caseForms/utilHelpers';\nimport EditIcon from '../../assets/Images/edit.svg';\nimport TrashIcon from '../../assets/Images/trash.svg';\nimport PopUpConfirmation from '../PopupConfirmation';\nimport Feedback from '../Feedback';\nimport { AwardClassificationOptions, AwardTypes, CaseStatus } from '../../constants';\nimport { getWebSourceSiteLabel, webSourceFields } from '../../helpers/caseForms/webSourceFields';\nimport { parseMarkdown } from '../../helpers/markdown';\n\nconst ConfirmationStep = ({\n  data,\n  index,\n  numSteps,\n  isLast,\n  swapSteps,\n  direction,\n  editSource,\n  deleteSource,\n  expandAll,\n  noSwaps,\n  hideExpand,\n  feedbackComments,\n  status,\n  awardClassificationOption,\n  disableEdit,\n  allSteps = [],\n  swapAdStep,\n}) => {\n  const [expanded, setExpanded] = useState(false);\n  const [swapDirection] = useState(direction || 0);\n  const [translation, setTranslation] = useState('');\n  const [showDelete, setShowDelete] = useState(false);\n\n  useEffect(() => {\n    setExpanded(expandAll);\n  }, [expandAll]);\n\n  useEffect(() => {\n    if (swapDirection === 0) return;\n    const className = swapDirection > 0 ? 'translate-y-28' : '-translate-y-28';\n\n    setTranslation(className);\n  }, [swapDirection]);\n\n  function toggleExpanded() {\n    setExpanded(!expanded);\n  }\n\n  // If the source is the first source and a escort ad allow swapping of ad. Convert escort ad to source and vice versa\n  // let swapAdButton = <></>;\n  // if (index === 0 && data.body?.escortAd) {\n  //   swapAdButton = (\n  //     <button\n  //       className=\"m-auto\"\n  //       onClick={() => {\n  //         swapSteps(index, 0);\n  //       }}\n  //       type=\"button\">\n  //       <Icons.FaExchangeAlt size={16} className=\"text-guardian-darkblue\" />\n  //     </button>\n  //   );\n  // }\n\n  const upArrow = (\n    <button\n      className=\"m-auto\"\n      onClick={() => {\n        if (index === 1 && 'Escort Ad' == data.title) {\n          console.log('index', index);\n          console.log({ allSteps, data });\n          // swapSteps(index, -1);\n          swapAdStep(data);\n        } else if (index >= 2) {\n          swapSteps(index, -1);\n        }\n      }}\n      type=\"button\"\n      disabled={\n        !(index > 1 || (index === 1 && 'Escort Ad' == data.title)) ||\n        status === CaseStatus.Submitted ||\n        status === CaseStatus.Resubmitted\n      }>\n      <Icons.FaChevronUp\n        size={16}\n        className={\n          index > 1 ||\n          (index === 1 &&\n            'Escort Ad' == data.title &&\n            !(status === CaseStatus.Submitted || status === CaseStatus.Resubmitted))\n            ? 'text-guardian-darkblue'\n            : 'text-gray-200'\n        }\n      />\n    </button>\n  );\n  // console.log({ status });\n  const downArrow = (\n    <button\n      className=\"m-auto\"\n      onClick={() => {\n        if (index === 0) {\n          swapAdStep(data);\n        } else if (index !== 0 && !isLast) {\n          swapSteps(index, 1);\n        }\n      }}\n      disabled={\n        !(\n          (index !== 0 && !isLast) ||\n          (index === 0 && allSteps[index + 1] && allSteps[index + 1].title === 'Escort Ad')\n        ) ||\n        status === CaseStatus.Submitted ||\n        status === CaseStatus.Resubmitted\n      }\n      title={\n        (index !== 0 && !isLast) ||\n        (index === 0 && allSteps && allSteps[index + 1] && allSteps[index + 1].title === 'Escort Ad')\n          ? 'Swap Escort Ads'\n          : 'Set Step 2 to an Escort Ad to change primary Ad'\n      }\n      type=\"button\">\n      {/* {index}\n      {JSON.stringify(allSteps)} */}\n      <Icons.FaChevronDown\n        size={16}\n        className={\n          (index !== 0 && !isLast) ||\n          (index === 0 &&\n            allSteps[index + 1] &&\n            allSteps[index + 1].title === 'Escort Ad' &&\n            !(status === CaseStatus.Submitted || status === CaseStatus.Resubmitted))\n            ? 'text-guardian-darkblue'\n            : 'text-gray-200'\n        }\n      />\n    </button>\n  );\n\n  const getAwardedPoints = awardData => {\n    if (awardData.award === AwardTypes.VerficationSource) {\n      if (awardClassificationOption === AwardClassificationOptions.Underage) {\n        return 3;\n      }\n\n      return 1;\n    }\n\n    if (awardData.award === AwardTypes.AccountIdentified) {\n      if (awardClassificationOption === AwardClassificationOptions.Underage) {\n        return 5;\n      }\n\n      return 1;\n    }\n\n    return 0;\n  };\n\n  const getAwardColor = () => {\n    if (!data?.award) {\n      return 'bg-white text-pursuit-gray';\n    }\n\n    if (data.award === 'NO_POINTS') {\n      return 'bg-pursuit-red text-white';\n    }\n\n    return 'bg-green-500 text-white';\n  };\n\n  function phoneData(arr) {\n    return arr.map((obj, i) => (\n      <div key={`Field${i}`}>\n        <p className=\"pt-1 font-normal \">\n          <b>Phone {i + 1}</b>\n        </p>\n        <div className=\"pb-1 pl-2 font-normal \">\n          <p>\n            <b>Number: </b>\n            {obj.number}\n          </p>\n          <p>\n            <b>Type: </b>\n            {obj.type}\n          </p>\n        </div>\n      </div>\n    ));\n  }\n\n  function uniqueData(obj) {\n    const { website } = data.body;\n    const webSourceKey = website.toLowerCase().replace(/\\s/g, '');\n    const orderedFields = Object.keys(webSourceFields[webSourceKey]);\n    const sortFunction = sortWebSourceFields(orderedFields);\n\n    // return Object.entries(obj).map(([field, value], i) => {\n    return Object.entries(obj)\n      .sort(sortFunction)\n      .map(([field, value], i) => {\n        if (!value) {\n          return <></>;\n        }\n\n        // const readableField = readableFormat(field);\n        const readableField = webSourceFieldLabel(field, undefined, true);\n\n        return (\n          <p key={`Unique${data.id}${i}`} className=\"py-1 font-normal \">\n            <b>{`${readableField}: `}</b>\n            {fieldValue(field, value)}\n          </p>\n        );\n      });\n  }\n\n  function defaultData(field, value, i) {\n    const formatFieldName = x => {\n      if (x.toLowerCase() === 'url') {\n        return 'URL';\n      }\n\n      return x ? x.charAt(0).toUpperCase() + x.slice(1) : '';\n    };\n\n    if (field === 'description') {\n      const { website = '' } = data.body;\n      const webSourceKey = website.toLowerCase().replace(/\\s/g, '');\n      return (\n        <p key={`Field${i}`} className=\"py-1 font-normal \" style={{ overflowWrap: 'anywhere' }}>\n          {/* <b className=\"text-pursuit-gray\">{`${formatFieldName(field)}: `}</b> */}\n          <b className=\"\">{`${webSourceFieldLabel(field, webSourceKey, true)}: `}</b>\n          <span\n            dangerouslySetInnerHTML={{\n              __html: parseMarkdown(value),\n            }}\n          />\n          {/* {value} */}\n        </p>\n      );\n    }\n\n    return (\n      <p key={`Field${i}`} className=\"py-1 font-normal \" style={{ overflowWrap: 'anywhere' }}>\n        <b className=\"\">{`${formatFieldName(field)}: `}</b>\n        {fieldValue(field, value)}\n      </p>\n    );\n  }\n\n  const expandArrow = expanded ? <Icons.FaChevronDown /> : <Icons.FaChevronRight />;\n  const divHeight = expanded ? 'max-h-64r' : 'max-h-0';\n\n  const renderStepContent = () => {\n    if (!expanded) {\n      return <div />;\n    }\n    // const fields = []\n    // fields.push(...Object.entries(data.body));\n    // const fields = [...Object.entries(data.body)];\n    const fieldsString = JSON.stringify(Object.entries(data.body));\n    const fields = JSON.parse(fieldsString);\n\n    const idxOfDescription = fields.findIndex(x => Array.isArray(x) && x.length && x[0] === 'description');\n    const { website = '' } = data.body;\n    const webSourceKey = website.toLowerCase().replace(/\\s/g, '');\n    const orderedFields = Object.keys(webSourceFields[webSourceKey] || {});\n\n    // ensure description is the last shown field\n    if (idxOfDescription !== -1) {\n      const description = fields[idxOfDescription];\n\n      fields.splice(idxOfDescription, 1);\n\n      fields.push(description);\n    }\n\n    const idxOfUrl = fields.findIndex(x => Array.isArray(x) && x.length && x[0] === 'url');\n    if (idxOfUrl !== -1) {\n      const url = fields[idxOfUrl];\n      // console.log({ website });\n      // if (orderedFields.includes('url')) {\n      // This is such a hack\n      if ('Escort Ad' === website) {\n        const indexOfUniqueFields = fields.findIndex(x => Array.isArray(x) && x.length && x[0] === 'uniqueFields');\n        const indexOfNewUrl = orderedFields.indexOf('url');\n        // const indexOfUrl = Array.findIndex(fields, x => Array.isArray(x) && x.length && x[0] === 'url');\n        // fields[indexOfUniqueFields][1].splice(indexOfNewUrl, 0, url);\n        // Add URL to the unique fields\n        fields[indexOfUniqueFields][1][url[0]] = url[1];\n        // Remove URL from the fields\n        fields.splice(idxOfUrl, 1);\n      } else {\n        const removed = fields.splice(idxOfUrl, 1);\n        // console.log({fields, idxOfUrl, removed});\n        // fields.push(url);\n        fields.splice(fields.length - 1, 0, url);\n      }\n    }\n\n    // console.log({ fields });\n\n    return fields.map(([field, value], i) => {\n      if (field === 'website' || field === 'id') return null;\n      let content = value;\n      content = defaultData(field, value, i);\n      if (field === 'phones') {\n        // return phoneData(value);\n        content = phoneData(value);\n      }\n\n      if (field === 'uniqueFields') {\n        // return uniqueData(value);\n        content = uniqueData(value);\n        // content = 'test';\n      }\n\n      // return defaultData(field, value, i);\n      // console.log({ content, field, value });\n      return <div key={`Field-${data.id}-${index}-${i}`}>{content}</div>;\n    });\n  };\n\n  const renderFeedback = () => {\n    if (!expanded) {\n      return <></>;\n    }\n\n    return <Feedback comments={feedbackComments || []} stepId={data?.id} status={status} award={data?.award || null} />;\n  };\n\n  const stepContent = (\n    <div key={`Data-${data.id}`} className={` pt-4 px-12 transition-maxheight ease-in-out duration-700 ${divHeight}`}>\n      {renderStepContent()}\n      {renderFeedback()}\n    </div>\n  );\n\n  const editButton = (\n    <button\n      className=\"w-10 focus:outline-none\"\n      onClick={() => {\n        editSource(data.id);\n      }}\n      type=\"button\">\n      <img src={EditIcon} alt=\"Edit\" className=\"w-5\" />\n    </button>\n  );\n\n  const deleteButton =\n    index === 0 ? (\n      <div className=\"w-10\" />\n    ) : (\n      <button\n        className=\"w-10 focus:outline-none\"\n        onClick={() => {\n          setShowDelete(true);\n        }}\n        type=\"button\">\n        <img src={TrashIcon} alt=\"Trash\" className=\"w-5\" />\n      </button>\n    );\n\n  return (\n    <div key={`Step${data.id}`}>\n      <div className={`mb-4 p-2 pb-8 shadow font-bold transition-transform duration-500 transform ${translation}`}>\n        <p className=\"m-2 mt-0 text-pursuit-darkred\">Step {index + 1}</p>\n        <div className=\"flex flex-row\">\n          {!noSwaps && (\n            <div className=\"flex flex-col w-12\">\n              {/* {!noSwaps && swapAdButton} */}\n              {/* {!noSwaps && index !== 0 && numSteps > 2 ? ( */}\n              {/* {console.log({ noSwaps, numSteps, allSteps })} */}\n              {!noSwaps && (numSteps > 2 || (numSteps > 1 && allSteps[0].title === 'Escort Ad')) ? (\n                <>\n                  {upArrow}\n                  {downArrow}\n                </>\n              ) : null}\n            </div>\n          )}\n          <div className=\"flex flex-row justify-between w-full p-2 mr-4 text-white bg-guardian-darkblue\">\n            <p>{getWebSourceSiteLabel(data.title)}</p>\n            <div className=\"flex\">\n              {(status === CaseStatus.Approved || status === CaseStatus.Resubmitted) && (\n                <div className={`${getAwardColor()} h-6 w-8 rounded-full flex justify-center items-center p-0 mr-4`}>\n                  {getAwardedPoints(data, awardClassificationOption)}\n                </div>\n              )}\n              <button onClick={toggleExpanded} type=\"button\" className=\"focus:outline-none\">\n                {!hideExpand && expandArrow}\n              </button>\n            </div>\n          </div>\n          {editSource && !disableEdit && editButton}\n          {deleteSource && !disableEdit && deleteButton}\n        </div>\n        {stepContent}\n      </div>\n      {showDelete ? (\n        <PopUpConfirmation\n          title=\"Delete Step\"\n          content={`Are you sure you want to delete ${data?.body?.website || 'this step'}?`}\n          onConfirm={() => {\n            deleteSource(data.id);\n            setShowDelete(false);\n          }}\n          onCancel={() => {\n            setShowDelete(false);\n          }}\n          confirmText=\"DELETE\"\n          destructive\n          className=\"w-11/12 lg:w-auto\"\n        />\n      ) : null}\n    </div>\n  );\n};\n\nexport default ConfirmationStep;\n","import React, { useState, useEffect } from 'react';\nimport * as Icons from 'react-icons/fa';\nimport { AwardClassificationOptions } from '../../constants';\n\nconst PointBreakdown = ({ caseRecord, expandAll, hideExpand }) => {\n  const [expanded, setExpanded] = useState(false);\n  const [leadApprovedPts, setLeadApprovedPts] = useState(0);\n  const [sourcePoints, setSourcePoints] = useState(caseRecord?.totalPoints?.pointsAwarded || 0)\n\n  useEffect(() => {\n    const { wasReturned } = caseRecord;\n    const basePoints = caseRecord?.totalPoints?.pointsAwarded || 0;\n    if (caseRecord.awardClassificationOption === AwardClassificationOptions.Underage) {\n      if (wasReturned) {\n        setLeadApprovedPts(25);\n        // setSourcePoints(sourcePoints - 25);\n        setSourcePoints(basePoints - 25);\n      } else {\n        setLeadApprovedPts(50);\n        // setSourcePoints(sourcePoints - 50);\n        setSourcePoints(basePoints - 50);\n      }\n    } else if (caseRecord.awardClassificationOption === AwardClassificationOptions.Adult) {\n      if (wasReturned) {\n        setLeadApprovedPts(3);\n        // setSourcePoints(sourcePoints - 3);\n        setSourcePoints(basePoints - 3);\n      } else {\n        setLeadApprovedPts(5);\n        // setSourcePoints(sourcePoints - 5);\n        setSourcePoints(basePoints - 5);\n      }\n    }\n  }, [caseRecord]);\n\n  useEffect(() => {\n    setExpanded(expandAll);\n  }, [expandAll]);\n\n  function toggleExpanded() {\n    setExpanded(!expanded);\n  }\n\n  const expandArrow = expanded ? <Icons.FaChevronDown /> : <Icons.FaChevronRight />;\n  const divHeight = expanded ? 'max-h-64r' : 'max-h-0';\n  const expandedBox = expanded ? 'shadow pb-6' : '';\n  const awardType = caseRecord.awardClassificationOption === AwardClassificationOptions.Underage ? 'Underage' : 'Adult';\n\n  return (\n    <>\n      <div className={`mb-4 font-bold transition-transform duration-500 transform ${expandedBox}`}>\n        <div className=\"flex flex-row\">\n          <div className=\"flex flex-row justify-between w-full p-2 text-white bg-guardian-darkblue\">\n            <p>Points Awarded: {caseRecord?.totalPoints?.pointsAwarded || 0}</p>\n            <div className=\"flex\">\n              <button onClick={toggleExpanded} type=\"button\" className=\"focus:outline-none\">\n                {!hideExpand && expandArrow}\n              </button>\n            </div>\n          </div>\n        </div>\n        <div className={`px-12 pt-4 duration-700 ease-in-out transition-maxheight ${divHeight}`}>\n          {!expanded ? (\n            <></>\n          ) : (\n            <div className={`${divHeight}`}>\n              <ul>\n                <li>\n                  {awardType} Lead Approved: {leadApprovedPts}{' '}\n                </li>\n                <li>Escort Ad and Web Sources: {sourcePoints}</li>\n              </ul>\n            </div>\n          )}\n        </div>\n      </div>\n    </>\n  );\n};\n\nexport default PointBreakdown;\n","import React from 'react';\nimport * as Icons from 'react-icons/fa';\n\nconst VerticalSorter = ({\n  up = false,\n  down = false,\n  onUp = () => {},\n  onDown = () => {},\n  enabledClassName = 'text-guardian-darkblue',\n  disabledClassName = 'text-gray-200',\n  buttonClassName = 'm-auto',\n  wrapClassName = 'flex flex-col',\n  iconSize = 16,\n}) => {\n  const upArrow = (\n    <button className={buttonClassName} onClick={onUp} disabled={!up} type=\"button\">\n      <Icons.FaChevronUp size={iconSize} className={up ? enabledClassName : disabledClassName} />\n    </button>\n  );\n\n  const downArrow = (\n    <button className={buttonClassName} onClick={onDown} disabled={!down} type=\"button\">\n      <Icons.FaChevronDown size={iconSize} className={down ? enabledClassName : disabledClassName} />\n    </button>\n  );\n\n  return (\n    <div className={wrapClassName}>\n      {upArrow}\n      {downArrow}\n    </div>\n  );\n};\n\nexport default VerticalSorter;\n","var _path;\nconst _excluded = [\"svgRef\", \"title\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }\nimport React from \"react\";\nconst SvgEdit = _ref => {\n  let {\n      svgRef,\n      title\n    } = _ref,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    width: 25.535,\n    height: 25.773,\n    viewBox: \"0 0 25.535 25.773\",\n    ref: svgRef\n  }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    d: \"M17.835,17.288l1.419-1.611a.353.353,0,0,1,.607.287v7.318A2.286,2.286,0,0,1,17.733,25.7H2.128A2.286,2.286,0,0,1,0,23.283V5.566A2.286,2.286,0,0,1,2.128,3.15H14.253a.414.414,0,0,1,.253.69L13.087,5.45a.331.331,0,0,1-.253.116H2.128V23.283H17.733V17.57A.425.425,0,0,1,17.835,17.288ZM24.778,7.131,13.136,20.348l-4.008.5a1.965,1.965,0,0,1-2.022-2.3l.443-4.55L19.192.789a2.376,2.376,0,0,1,3.666,0l1.915,2.174a3.237,3.237,0,0,1,0,4.167ZM20.4,8.686,17.822,5.762,9.585,15.119l-.324,3.287,2.895-.367ZM23.27,4.675,21.355,2.5a.425.425,0,0,0-.656,0l-1.37,1.555L21.9,6.98l1.37-1.555A.589.589,0,0,0,23.27,4.675Z\",\n    transform: \"translate(0 0.075)\"\n  })));\n};\nconst ForwardRef = /*#__PURE__*/React.forwardRef((props, ref) => /*#__PURE__*/React.createElement(SvgEdit, _extends({\n  svgRef: ref\n}, props)));\nexport default __webpack_public_path__ + \"static/media/edit.86475384.svg\";\nexport { ForwardRef as ReactComponent };","var _defs, _path;\nconst _excluded = [\"svgRef\", \"title\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }\nimport React from \"react\";\nconst SvgTrash = _ref => {\n  let {\n      svgRef,\n      title\n    } = _ref,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    width: 22.324,\n    height: 25.514,\n    viewBox: \"0 0 22.324 25.514\",\n    ref: svgRef\n  }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"style\", null, \".a{fill:#770303;}\"))), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    className: \"a\",\n    d: \"M8.97,20.73h-1.2a.6.6,0,0,1-.6-.6V9.368a.6.6,0,0,1,.6-.6h1.2a.6.6,0,0,1,.6.6V20.132A.6.6,0,0,1,8.97,20.73ZM.8,3.987H4.9L6.6,1.161A2.392,2.392,0,0,1,8.65,0h5.024a2.392,2.392,0,0,1,2.051,1.161l1.7,2.825h4.107a.8.8,0,0,1,.8.8v.8a.8.8,0,0,1-.8.8h-.8V23.122a2.392,2.392,0,0,1-2.392,2.392H3.987a2.392,2.392,0,0,1-2.392-2.392V6.378H.8a.8.8,0,0,1-.8-.8v-.8A.8.8,0,0,1,.8,3.987Zm12.964-1.45a.3.3,0,0,0-.257-.145H8.82a.3.3,0,0,0-.257.145l-.87,1.45h6.938ZM3.987,23.122H18.338V6.378H3.987ZM14.551,20.73h-1.2a.6.6,0,0,1-.6-.6V9.368a.6.6,0,0,1,.6-.6h1.2a.6.6,0,0,1,.6.6V20.132A.6.6,0,0,1,14.551,20.73Z\"\n  })));\n};\nconst ForwardRef = /*#__PURE__*/React.forwardRef((props, ref) => /*#__PURE__*/React.createElement(SvgTrash, _extends({\n  svgRef: ref\n}, props)));\nexport default __webpack_public_path__ + \"static/media/trash.1d629d1e.svg\";\nexport { ForwardRef as ReactComponent };","var _defs, _path, _path2, _path3, _path4, _path5, _path6, _path7, _path8, _path9;\nconst _excluded = [\"svgRef\", \"title\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }\nimport React from \"react\";\nconst SvgPursuitIcon = _ref => {\n  let {\n      svgRef,\n      title\n    } = _ref,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return /*#__PURE__*/React.createElement(\"svg\", _extends({\n    id: \"Layer_1\",\n    \"data-name\": \"Layer 1\",\n    viewBox: \"0 0 1186.08 1186\",\n    ref: svgRef\n  }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"style\", null, \"\\n      .cls-1 {\\n        fill: #21272d;\\n      }\\n\\n      .cls-2 {\\n        fill: #770303;\\n      }\\n    \"))), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n    className: \"cls-2\",\n    d: \"m957.74,327.83l-99.46-99.46-264.34,265.52L326.68,228.77l-99.46,99.46,267.26,265.13-266.12,264.73,99.46,99.46,266.12-264.73,265.52,264.34,99.46-99.46-265.52-264.42,264.34-265.44Z\"\n  })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n    className: \"cls-1\",\n    d: \"m1177.49,575.61h-1.58l-1.42.11c-6.05,1.81-12.27,3.02-18.57,3.59-13.85,1.52-27.86.57-41.39-2.8-17.79-3.52-35.9-5.2-54.04-5.03-12.44-.03-24.87.71-37.21,2.21-14.96,2.56-30.11,3.82-45.29,3.75v-30.52h-7.43v24.7c-269.76,0-303.19,21.56-303.19,21.56,0,0,33.45,21.56,303.19,21.56v24.34h7.43v-30.57c15.18-.06,30.33,1.19,45.29,3.75,12.35,1.51,24.77,2.25,37.21,2.21,18.14.17,36.24-1.51,54.04-5.03,13.52-3.37,27.53-4.32,41.39-2.8,6.29.57,12.51,1.77,18.57,3.59l1.42.11h1.58c4.74,0,8.59-3.84,8.59-8.59v-17.52c.02-4.74-3.81-8.6-8.55-8.62h-.03Z\"\n  })), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n    className: \"cls-1\",\n    d: \"m163.11,565.46c13.79-215.68,185.22-387.78,400.85-402.41l-1.82-26.88c-229.14,15.55-411.31,198.43-425.98,427.62l26.95,1.68Z\"\n  })), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n    className: \"cls-1\",\n    d: \"m8.59,575.61h1.58l1.41.11c6.05,1.81,12.27,3.02,18.57,3.59,13.85,1.52,27.86.57,41.39-2.8,17.79-3.52,35.9-5.2,54.04-5.03,12.44-.03,24.87.71,37.21,2.21,14.96,2.56,30.11,3.82,45.29,3.75v-30.52h7.43v24.7c269.76,0,303.19,21.56,303.19,21.56,0,0-33.45,21.56-303.19,21.56v24.34h-7.43v-30.57c-15.18-.06-30.33,1.19-45.29,3.75-12.35,1.51-24.77,2.25-37.21,2.21-18.14.17-36.24-1.51-54.04-5.03-13.52-3.37-27.53-4.32-41.39-2.8-6.29.57-12.51,1.77-18.57,3.59l-1.41.11h-1.58C3.84,610.34,0,606.5,0,601.75v-17.52c-.02-4.74,3.81-8.6,8.56-8.62h.03Z\"\n  })), _path5 || (_path5 = /*#__PURE__*/React.createElement(\"path\", {\n    className: \"cls-1\",\n    d: \"m620.65,1022.97c215.68-13.79,387.78-185.22,402.41-400.85l26.88,1.82c-15.55,229.14-198.44,411.32-427.64,425.98l-1.66-26.95Z\"\n  })), _path6 || (_path6 = /*#__PURE__*/React.createElement(\"path\", {\n    className: \"cls-1\",\n    d: \"m610.5,1177.41v-1.58l-.11-1.41c-1.81-6.05-3.02-12.27-3.59-18.57-1.52-13.85-.57-27.86,2.8-41.39,3.52-17.79,5.2-35.9,5.03-54.04.03-12.44-.71-24.87-2.21-37.21-2.56-14.95-3.81-30.1-3.75-45.28h30.55v-7.43h-24.7c0-269.76-21.56-303.19-21.56-303.19,0,0-21.56,33.45-21.56,303.19h-24.34v7.43h30.57c.07,15.17-1.19,30.32-3.75,45.28-1.51,12.35-2.25,24.77-2.21,37.21-.17,18.14,1.51,36.24,5.03,54.04,3.37,13.52,4.32,27.53,2.8,41.39-.57,6.29-1.77,12.51-3.59,18.57l-.11,1.41v1.58c0,4.74,3.84,8.59,8.59,8.59h17.52c4.74,0,8.59-3.84,8.59-8.59Z\"\n  })), _path7 || (_path7 = /*#__PURE__*/React.createElement(\"path\", {\n    className: \"cls-1\",\n    d: \"m610.5,8.51v1.58l-.11,1.41c-1.82,6.05-3.02,12.27-3.59,18.57-1.52,13.85-.57,27.86,2.8,41.39,3.52,17.79,5.2,35.9,5.03,54.04.03,12.44-.71,24.87-2.21,37.21-2.56,14.96-3.82,30.11-3.75,45.29h30.55v7.43h-24.7c0,269.76-21.56,303.19-21.56,303.19,0,0-21.56-33.45-21.56-303.19h-24.34v-7.35h30.57c.07-15.18-1.19-30.33-3.75-45.29-1.51-12.35-2.25-24.77-2.21-37.21-.17-18.14,1.51-36.24,5.03-54.04,3.37-13.52,4.32-27.53,2.8-41.39-.57-6.29-1.77-12.51-3.59-18.57l-.11-1.41v-1.58C575.8,3.84,579.65,0,584.39,0h17.52c4.71,0,8.54,3.8,8.59,8.51Z\"\n  })), _path8 || (_path8 = /*#__PURE__*/React.createElement(\"path\", {\n    className: \"cls-1\",\n    d: \"m564.65,1023.84c-215.68-13.79-387.78-185.22-402.41-400.85l-26.88,1.82c15.55,229.14,198.43,411.31,427.62,425.98l1.68-26.95Z\"\n  })), _path9 || (_path9 = /*#__PURE__*/React.createElement(\"path\", {\n    className: \"cls-1\",\n    d: \"m1023.05,565.46c-13.79-215.68-185.22-387.78-400.85-402.41l1.82-26.88c229.14,15.55,411.31,198.43,425.98,427.62l-26.95,1.68Z\"\n  })));\n};\nconst ForwardRef = /*#__PURE__*/React.forwardRef((props, ref) => /*#__PURE__*/React.createElement(SvgPursuitIcon, _extends({\n  svgRef: ref\n}, props)));\nexport default __webpack_public_path__ + \"static/media/pursuit_icon.7f7a478d.svg\";\nexport { ForwardRef as ReactComponent };","import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react';\nimport * as Icons from 'react-icons/fa';\nimport VerticalSorter from '../VerticalSorter';\nimport { ReactComponent as EditIcon } from '../../assets/Images/edit.svg';\nimport { ReactComponent as TrashIcon } from '../../assets/Images/trash.svg';\nimport Button from '../Button';\nimport { useUser } from '../../contexts/userContext';\nimport { parseMarkdown, parseMarkdownPage } from '../../helpers/markdown';\nimport { ReactComponent as PursuitIcon } from '../../assets/Images/pursuit_icon.svg';\nimport PopUpConfirmation from '../PopupConfirmation';\n\nconst noteSeparator = '\\n!---\\n';\n\nconst noteFilter = (visibility = []) => note => {\n  if (\n    undefined === note.metadata.visibility ||\n    note.metadata.visibility === null ||\n    visibility.includes(note.metadata.visibility)\n  ) {\n    return true;\n  }\n\n  return false;\n};\n/**\n * Split a string of notes into an array of objects with a note and author\n * @param {string} notes\n * @returns {Array<{note: string, metadata: {\n *  author: string,\n *  visibility: string,\n * }}>}\n */\nconst splitNotes = notes => {\n  if (!notes || notes.length === 0) {\n    return [];\n  }\n  const split = notes.split(noteSeparator);\n\n  return split.map(note => {\n    const { content, metadata } = parseMarkdownPage(note);\n\n    return { note: content, metadata };\n    // if (parse.metadata.author) {\n    //   return { note: parse.content, author: parse.metadata.author };\n    // }\n    // return { note, author: undefined };\n  });\n};\n\n/**\n * Join an array of note and metadata into a string\n * @param {Array<{note: string, metadata: object}>} notes\n * @returns {string}\n */\nconst joinNotes = notes =>\n  notes\n    .map(\n      note =>\n        `${\n          Object.entries(note.metadata).length > 0\n            ? `---\\n${Object.entries(note.metadata)\n                .filter(([key, value]) => value !== null && value !== undefined)\n                .map(([key, value]) => `${key}: ${value}`)\n                .join('\\n')}\\n---\\n`\n            : ''\n        }${note.note.trim()}`\n    )\n    .join(noteSeparator);\n\nconst Note = ({\n  note: initialNote,\n  metadata = {},\n  editing: initialEditingState = false,\n  editable = false,\n  deletable = true,\n  editDisabled = false,\n  sortable = false,\n  collapsable = true,\n  collapsed: initialCollapseState = true,\n  sortActions = {\n    up: undefined,\n    down: undefined,\n  },\n  label = null,\n  onEdit = _ => {},\n  updateNote = _ => {},\n  removeNote = () => {},\n}) => {\n  const [editing, setEditing] = useState(initialEditingState);\n  const [note, setNote] = useState(initialNote);\n  const [collapsed, setCollapsed] = useState(initialCollapseState);\n  const [overflowActive, setOverflowActive] = useState(false);\n  const overflowingText = useRef(null);\n  const [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\n  const { author, visibility } = metadata;\n\n  const checkOverflow = textContainer => {\n    if (textContainer) {\n      return (\n        textContainer.offsetHeight < textContainer.scrollHeight || textContainer.offsetWidth < textContainer.scrollWidth\n      );\n    }\n\n    return false;\n  };\n\n  useEffect(() => {\n    if (checkOverflow(overflowingText.current)) {\n      setOverflowActive(true);\n      // console.log('overflowing');\n\n      return;\n    }\n    // console.log('not overflowing');\n\n    setOverflowActive(false);\n  }, [overflowActive]);\n\n  const toggleEditing = useCallback(() => {\n    onEdit(!editing);\n    setEditing(!editing);\n  }, [editing, onEdit]);\n\n  const toggleCollapsed = useCallback(() => {\n    setCollapsed(!collapsed);\n  }, [collapsed]);\n\n  const collapseButton =\n    collapsable && overflowActive ? (\n      <Button\n        onClick={toggleCollapsed}\n        className=\"w-10 focus:outline-none\"\n        debounceDelay={0}\n        disabled={editing}\n        title={collapsed ? 'Expand' : 'Collapse'}\n      >\n        {collapsed ? (\n          <Icons.FaChevronRight\n            // size={16}\n            className={`${editDisabled ? 'text-gray-200' : ''}`}\n            // className={index !== 0 && !isLast ? 'text-guardian-darkblue' : 'text-gray-200'}\n          />\n        ) : (\n          <Icons.FaChevronDown\n            // size={16}\n            className={`${editDisabled ? 'text-gray-200' : ''}`}\n            // className={index !== 0 && !isLast ? 'text-guardian-darkblue' : 'text-gray-200'}\n          />\n        )}\n      </Button>\n    ) : null;\n\n  const editButton = editable ? (\n    <Button\n      onClick={toggleEditing}\n      className={`w-10 focus:outline-none ${editDisabled ? 'text-gray' : null}`}\n      debounceDelay={0}\n      disabled={editing || editDisabled}\n    >\n      <EditIcon className={`w-5 ${editDisabled ? 'text-gray-200' : null}`} fill=\"currentColor\" />\n      {/* <img src={EditIcon} alt=\"Edit\" className=\"w-5\" /> */}\n    </Button>\n  ) : null;\n\n  const cancelButton = (\n    <Button\n      className=\"flex focus:outline-none items-center mb-12 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue my-2 mr-8 px-4 py-1\"\n      onClick={() => {\n        toggleEditing();\n        setNote(initialNote);\n        if (initialNote === '') {\n          removeNote();\n        }\n      }}\n      debounceDelay={0}\n    >\n      Cancel\n    </Button>\n  );\n\n  const deleteButton = deletable && (\n    <Button\n      className=\"w-10 focus:outline-none\"\n      onClick={() => {\n        // toggleEditing();\n        // removeNote();\n        setShowDeleteDialog(true);\n      }}\n      debounceDelay={0}\n      disabled={editing || editDisabled}\n    >\n      {/* Delete */}\n      <TrashIcon className={`w-5 ${editDisabled ? 'text-gray-200 opacity-10' : null}`} fill=\"currentColor\" />\n    </Button>\n  );\n\n  const saveButton = (\n    <Button\n      solidBlue\n      className=\"my-2 mr-8 px-4 py-1 focus:outline-none\"\n      onClick={() => {\n        onEdit(false);\n        updateNote(note);\n        toggleEditing();\n      }}\n      debounceDelay={0}\n    >\n      Save\n    </Button>\n  );\n\n  const sortButton = sortable ? (\n    <VerticalSorter up={!!sortActions.up} down={!!sortActions.down} onUp={sortActions.up} onDown={sortActions.down} />\n  ) : null;\n\n  const noteContent = editing ? (\n    <div className=\"grow-wrap -mr-2\" data-replicated-value={note}>\n      <textarea\n        className=\"w-full pl-1 mt-0 mb-2 shadow\"\n        // onInput=\"this.parentNode.dataset.replicatedValue = this.value\"\n        value={note}\n        onChange={e => setNote(e.target.value)}\n      />\n    </div>\n  ) : (\n    <div\n      className={`markdown-content ${collapsed ? 'clamp' : ''}`}\n      ref={overflowingText}\n      dangerouslySetInnerHTML={{\n        __html: parseMarkdown(note),\n      }}\n    />\n  );\n\n  const visibilityIcon = useMemo(() => {\n    if (visibility === 'employee') {\n      return (\n        <>\n          <div className={`w-8 h-10 flex justify-center items-center ${editDisabled ? 'text-gray' : null}`}>\n            <div className=\"rounded-full bg-white justify-center p-1\">\n              <PursuitIcon className={`w-5  ${editDisabled ? 'text-gray-200' : null}`} fill=\"currentColor\" />\n            </div>\n          </div>\n        </>\n      );\n    }\n\n    return null;\n  }, [visibility]);\n\n  const dialog = showDeleteDialog ? (\n    <PopUpConfirmation\n      title=\"Confirm delete\"\n      content={`Are sure you want to delete note ${label}`}\n      onCancel={() => setShowDeleteDialog(false)}\n      onConfirm={() => {\n        setShowDeleteDialog(false);\n        removeNote();\n      }}\n      confirmText=\"Delete\"\n      // confirmLoading={approving}\n      confirmLoadingText=\"Deleting...\"\n      className=\"w-11/12 lg:w-auto\"\n    />\n  ) : null;\n\n  return (\n    <>\n      {dialog}\n      <div className=\"flex gap-4\">\n        <div className=\"flex-none pt-1\">{sortButton}</div>\n        <div className=\"flex-none pt-2\">{label}</div>\n        {/* <div className=\"flex-none\">{collapseButton}</div> */}\n        <div className=\"flex-grow pt-2\">\n          {noteContent}\n          {editing ? (\n            <div className=\"flex justify-end\">\n              {/* <div>{deleteButton}</div> */}\n              <div>{cancelButton}</div>\n              <div>{saveButton}</div>\n            </div>\n          ) : null}\n        </div>\n        {/* {!editing ? ( */}\n        <div className=\"flex-none\">\n          <div className=\"flex\">\n            {collapseButton}\n            {visibilityIcon}\n            {editButton}\n            {deleteButton}\n          </div>\n        </div>\n        {/* ) : null} */}\n        {/* <code>{JSON.stringify({ editing, editable, initialEditingState })}</code> */}\n      </div>\n    </>\n  );\n};\nconst InvestigatorNotes = ({\n  notes,\n  setNotes = _ => {},\n  canEdit = true,\n  canDelete = true,\n  canSort = true,\n  visibility = [],\n  newVisibility,\n}) => {\n  const [parsedNotes, setParsedNotes] = useState(splitNotes(notes));\n  const [editingNoteIndex, setEditingNoteIndex] = useState(undefined);\n  const { user, userGroups, isEmployee } = useUser();\n  // const canEdit = true;\n  // const canSort = true;\n\n  // console.log({ user });\n\n  const save = useCallback(\n    note => {\n      setNotes(Array.isArray(note) ? joinNotes(note) : note);\n    },\n    [setNotes]\n  );\n\n  const addNewNote = useCallback(() => {\n    // console.log({ user, userGroups, isEmployee });\n    const metadata = {\n      author: user.id,\n      // visibility: 'employee',\n      // visibility: isEmployee ? 'employee' : null,\n      visibility: newVisibility,\n    };\n    const newNotes = [...parsedNotes, { note: '', metadata }];\n    // Index needs to account for notes that are filtered out by from parsedNotes\n    // const filteredOffset = parsedNotes.filter(n => !noteFilter(visibility)(n)).length || 0;\n\n    // setEditingNoteIndex(newNotes.length - 1 - filteredOffset);\n    setEditingNoteIndex(newNotes.length - 1);\n    setParsedNotes(newNotes);\n    // save(newNotes);\n  }, [parsedNotes, user.id]);\n\n  const moveNote = useCallback(\n    (from, to) => {\n      const newNotes = [...parsedNotes];\n      const [removed] = newNotes.splice(from, 1);\n\n      newNotes.splice(to, 0, removed);\n      console.log('Saving new notes', newNotes);\n      save(newNotes);\n      setParsedNotes(newNotes);\n    },\n    [parsedNotes, save]\n  );\n\n  const removeNote = useCallback(\n    index => () => {\n      const newNotes = [...parsedNotes];\n\n      newNotes.splice(index, 1);\n      setParsedNotes(newNotes);\n      save(newNotes);\n    },\n    [parsedNotes, save]\n  );\n\n  const onEdit = useCallback(\n    index => (editing = true) => {\n      setEditingNoteIndex(editing ? index : undefined);\n    },\n    [setEditingNoteIndex]\n  );\n\n  const updateNote = useCallback(\n    index => note => {\n      const newNotes = [...parsedNotes];\n\n      newNotes[index].note = note;\n      console.log({ newNotes });\n      setParsedNotes(newNotes);\n      save(newNotes);\n    },\n    [parsedNotes, save]\n  );\n\n  const addNoteButton = canEdit ? (\n    <Button\n      id=\"case-add-note\"\n      className={`btton primary-solid-blue h-10 my-2 px-4 py-1 ${editingNoteIndex !== undefined ? 'opacity-20' : null}`}\n      onClick={addNewNote}\n      debounceDelay={0}\n      disabled={editingNoteIndex !== undefined}\n    >\n      Add Note\n    </Button>\n  ) : null;\n\n  const renderedNotes = parsedNotes\n    // .filter(note => {\n    //   if (\n    //     undefined === note.metadata.visibility ||\n    //     note.metadata.visibility === null ||\n    //     visibility.includes(note.metadata.visibility)\n    //   ) {\n    //     return true;\n    //   }\n\n    //   return false;\n    // })\n    // .filter(Boolean)\n    .map((note, i) => ({\n      note,\n      index: i,\n    }))\n\n    .filter(({ note }) => noteFilter(visibility)(note))\n    // Move indexes all around to account for notes that are filtered out\n    .map(({ note, index: i }, index, accessibleNotes) => {\n      // if (noteFilter(visibility)(note)) {\n      //   return;\n      // }\n      const isEditing = i === editingNoteIndex;\n      const sortActions =\n        editingNoteIndex !== undefined\n          ? undefined\n          : {\n              // up: i > 0 ? () => moveNote(i, i - 1) : undefined,\n              // down: i < parsedNotes.length - 1 ? () => moveNote(i, i + 1) : undefined,\n              up: index > 0 ? () => moveNote(i, i - 1) : undefined,\n              down: index < accessibleNotes.length - 1 ? () => moveNote(i, i + 1) : undefined,\n            };\n      const label = `${index + 1}`;\n\n      // console.log({ isEditing, i, editingNoteIndex });\n\n      return (\n        <li key={note.note + i} className={`my-2 pt-2${i > -1 ? ' border-t border-gray-200' : null}`}>\n          <Note\n            label={label}\n            note={note.note}\n            metadata={note.metadata}\n            editing={isEditing}\n            deletable={canDelete}\n            editDisabled={editingNoteIndex !== undefined}\n            editable={canEdit}\n            sortable={canSort}\n            sortActions={sortActions}\n            onEdit={onEdit(i)}\n            removeNote={removeNote(i)}\n            updateNote={updateNote(i)}\n          />\n        </li>\n      );\n    }) || <span>No Notes</span>;\n\n  return (\n    <div className=\"flex flex-col mt-8\">\n      <div className=\"flex\">\n        <div className=\"flex-grow self-center\">\n          <label className=\"mb-2 text-lg font-bold text-pursuit-gray\">Investigator Notes</label>\n        </div>\n        <div className=\"flex-none\">{addNoteButton}</div>\n      </div>\n      {renderedNotes.length > 0 ? (\n        <ol className=\"\">{renderedNotes}</ol>\n      ) : (\n        <span className=\"text-gray-300\">No notes</span>\n      )}\n      {/* <ol className=\"\">{renderedNotes}</ol> */}\n      {/* {editingNoteIndex} */}\n      {/* {JSON.stringify({renderedNotes})} */}\n    </div>\n  );\n};\n\nexport default InvestigatorNotes;\n","/**\n * Step\n * @typedef {Object} Step\n * @property {string} id - UID of the step\n * @property {string} content - The content of the step\n */\n/**\n * Source\n * @typedef {Step} Source\n * @property {string} id - UID of the step\n * @property {string} content - The content of the step\n */\n/**\n * Staff Source\n * @typedef {Source} StaffSource\n * @property {string} previousSourceId - UID of the parent source\n */\n/**\n * Compile a array of steps from an input sources, recursively adding parents\n *\n * @param {Step[]} steps - Array of steps\n * @param {Source[]} webSources - Array of web sources\n * @param {StaffSource[]} staffSources - Array of staff sources\n * @returns {Step[]} - Array of compiled steps\n * @example\n * const steps        = [ { body: 'Content A', id: 1 } ];\n * const webSources   = [ { body: 'Content B', id: 2 }, { body: 'Content C', id: 3 }  ];\n * const staffSources = [\n * { body: 'Content D', id: 4, previousSourceId: 1 },\n * { body: 'Content E', id: 5, previousSourceId: 4 }\n * ];\n * compileSteps(steps, webSources, staffSources) = [\n * { body:'Content A', id: 1 },\n * { body: 'Content D', id: 4 },\n * { body: 'Content E', id: 5 },\n * { body: 'Content B', id: 2 },\n * { body: 'Content C', id: 3 }\n * ];\n */\nexport const compileSteps = (steps, webSources, staffSources, sourceOrders) => {\n  const compiledSteps = steps.concat(webSources);\n\n  // webSources.forEach(source => {\n  //   compiledSteps.push(source);\n  // });\n\n  staffSources.forEach(source => {\n    // If staff sources previousSourceId is 0 than add it to the beginning of the list\n    if (source.previousSourceId === '0') {\n      compiledSteps.unshift(source);\n      return;\n    }\n    // const parentSource = compiledSteps.find(step => step.id === source.previousSourceId);\n    const parentIndex = compiledSteps.findIndex(({ id }) => id === source.previousSourceId);\n\n    if (parentIndex >= 0) {\n      compiledSteps.splice(parentIndex + 1, 0, source);\n    } else {\n      // If the parent source is not found, add it to the end of the list\n      // compiledSteps.push(source);\n    }\n  });\n\n  // Do it again for looped items, lame\n  staffSources.forEach(source => {\n    if (compiledSteps.includes(source)) {\n      return;\n    }\n    // const parentSource = compiledSteps.find(step => step.id === source.previousSourceId);\n    const parentIndex = compiledSteps.findIndex(({ id }) => id === source.previousSourceId);\n\n    if (parentIndex >= 0) {\n      compiledSteps.splice(parentIndex + 1, 0, source);\n    } else {\n      // If the parent source is not found, add it to the end of the list\n      compiledSteps.push(source);\n    }\n  });\n\n  // Check steps for recursive sources, make sure no steps reference a step then itself\n  // compiledSteps.forEach(step => {\n  //   if (step.previousSourceId) {\n  //     const parentIndex = compiledSteps.findIndex(({ id }) => id === step.previousSourceId);\n  //     if (parentIndex >= 0) {\n  //       compiledSteps.splice(parentIndex + 1, 0, step);\n  //     }\n  //   }\n  // });\n\n  // If source orders is defined then sort the compiled steps based on the source orders\n  if (sourceOrders) {\n    compiledSteps.sort((a, b) => {\n      const aIndex = sourceOrders.findIndex(id => id === a.id);\n      const bIndex = sourceOrders.findIndex(id => id === b.id);\n      return aIndex - bIndex;\n    });\n  }\n\n  return compiledSteps;\n};\n","import React, { useState, useEffect } from 'react';\nimport { ESCORT_AD, CaseStatus } from '../../constants';\nimport ConfirmationStep from '../ConfirmationStep';\nimport PointBreakdown from '../PointBreakdown';\nimport InvestigatorNotes from '../InvestigatorNotes';\nimport { compileSteps } from '../ReviewForm/compileSteps';\n\nconst ConfirmationForm = ({ caseState, reviewing }) => {\n  const [awardClassificationOption, setAwardClassificationOption] = useState('');\n\n  useEffect(() => {\n    setAwardClassificationOption(caseState.awardClassificationOption);\n  }, [caseState.awardClassificationOption]);\n\n  const renderSteps = () => {\n    const awards = caseState.awardedPoints ? [...caseState.awardedPoints] : [];\n\n    // const steps = [\n    //   // {\n    //   //   title: 'Escort Ad',\n    //   //   body: caseState.escortAd,\n    //   //   id: ESCORT_AD,\n    //   //   award: awards.find(x => x.stepId === ESCORT_AD)?.awardType || null,\n    //   // },\n    // ];\n\n    // const escortAdData = [\n    //   caseState.escortAd.url,\n    //   ...caseState.escortAd.phones.map(({ phone }) => phone),\n    //   caseState.escortAd.description,\n    // ];\n    // const escortAdEmpty = escortAdData.filter(Boolean).length === 0;\n    // console.log({\n    //   emptyAdData: escortAdData,\n    //   escortAdEmpty,\n    // });\n    // if (!escortAdEmpty) {\n    //   steps.push({\n    //     title: 'Escort Ad',\n    //     body: caseState.escortAd,\n    //     id: ESCORT_AD,\n    //     award: awards.find(x => x.stepId === ESCORT_AD)?.awardType || null,\n    //   });\n    // }\n\n    // caseState.webSources.map(source => {\n    //   steps.push({\n    //     title: source.website ? source.website : '[no source type selected]',\n    //     body: source,\n    //     id: source.id,\n    //     award: awards.find(x => x.stepId === source.id)?.awardType || null,\n    //   });\n\n    //   return null;\n    // });\n\n    const compiledSteps = compileSteps([], caseState.webSources || [], [], caseState.sourceOrder);\n    const filteredSteps = compiledSteps.map(data => {\n      const award = awards.find(x => x.stepId === data.id)?.awardType || null;\n      return {\n        title: data.website,\n        id: data.id,\n        body: data,\n        award,\n        ...data,\n      };\n    });\n\n    // return steps.map((data, idx) => (\n    return filteredSteps.map((data, idx) => (\n      <ConfirmationStep\n        key={`Source_${idx}`}\n        data={data}\n        index={idx}\n        numSteps={filteredSteps.length}\n        isLast={idx === filteredSteps.length - 1}\n        expandAll\n        hideExpand\n        noSwaps\n        feedbackComments={caseState?.feedbackComments || []}\n        status={caseState?.status}\n        awardClassificationOption={awardClassificationOption}\n      />\n    ));\n  };\n\n  return (\n    <>\n      {!reviewing && (\n        <div className=\"mb-8\">\n          {caseState.status === CaseStatus.Approved || caseState.status === CaseStatus.Resubmitted ? (\n            <h2 className=\"text-lg font-bold text-pursuit-gray\">Approved Case Details</h2>\n          ) : (\n            <>\n              <h2 className=\"text-lg font-bold text-pursuit-gray\">Final Review and Submit</h2>\n              <div className=\"text-sm text-pursuit-gray\">\n                <p>\n                  Take a moment to make a final review of the steps you took to create this investigation. Please be\n                  sure to go back and update anything that looks incorrect. Once you have validated that everything is\n                  correct, you can click the submit button at the bottom of the screen to send the case to Guardian\n                  Group to review.\n                </p>\n              </div>\n            </>\n          )}\n        </div>\n      )}\n      <div className=\"py-4 mb-4\">\n        <h2 className=\"mb-2 text-lg font-bold text-pursuit-gray\">Personal Details</h2>\n        <ul>\n          <li className=\"my-1\">\n            <p>\n              <b className=\"text-pursuit-gray\">Name: </b>\n              {`${caseState.firstName || ''} ${caseState.middleName || ''} ${caseState.lastName || ''}`}\n            </p>\n          </li>\n\n          <li className=\"my-1\">\n            <p>\n              <b className=\"text-pursuit-gray\">Age: </b>\n              {caseState.age}\n            </p>\n          </li>\n\n          <li className=\"my-1\">\n            <p>\n              <b className=\"text-pursuit-gray\">Location: </b>\n              {`${caseState.city || ''}, ${caseState.state || ''}`}\n            </p>\n          </li>\n\n          <li className=\"my-1\">\n          <p className=\"whitespace-normal break-words\">\n              <b className=\"text-pursuit-gray\">Comments: </b>\n              {caseState.details}\n            </p>\n          </li>\n\n          {/* <li className=\"my-1\">\n            <p>\n              <b className=\"text-pursuit-gray\">Investigator Notes: </b>\n              {caseState.investigatorNotes}\n            </p>\n          </li> */}\n        </ul>\n      </div>\n\n      {(caseState.status === CaseStatus.Approved || caseState.status === CaseStatus.Resubmitted) && (\n        <div className=\"mb-8\">\n          <PointBreakdown\n            expandAll\n            noSwaps\n            feedbackComments={caseState?.feedbackComments || []}\n            status={caseState?.status}\n            awardClassificationOption={awardClassificationOption}\n            caseRecord={caseState}\n          />\n        </div>\n      )}\n\n      {renderSteps()}\n\n      <InvestigatorNotes\n        notes={caseState.investigatorNotes}\n        canEdit={false}\n        canDelete={false}\n        canSort={false}\n        // setNotes={note => {\n        //   setInput('investigatorNotes', note);\n        // }}\n      />\n    </>\n  );\n};\n\nexport default ConfirmationForm;\n","import React from 'react';\n\nconst Container = ({\n  id,\n  grayedBackground,\n  width,\n  height,\n  margin,\n  padding,\n  centerText,\n  rounded,\n  className,\n  outerClassName,\n  children,\n}) => {\n  let roundedClass = 'rounded';\n\n  if (rounded === 'md') {\n    roundedClass = 'rounded-md';\n  } else if (rounded === 'lg') {\n    roundedClass = 'rounded-lg';\n  }\n\n  const appliedOuterClassName = `bg-white shadow-container md:shadow-xl ${width} ${height} ${margin ||\n    'm-auto'} ${roundedClass} ${grayedBackground ? 'z-20 relative' : ''} ${outerClassName}`;\n\n  const appliedClassName = `h-full standard-text-font container-shadow ${padding || 'p-2'} ${\n    centerText ? 'text-center' : ''\n  } ${className}`;\n\n  function renderGrayedBackground() {\n    if (grayedBackground) {\n      return <div className=\"container-grayed\" />;\n    }\n  }\n\n  return (\n    <>\n      <div className={appliedOuterClassName}>\n        <div className={appliedClassName} id={id}>\n          {children}\n        </div>\n      </div>\n      {renderGrayedBackground()}\n    </>\n  );\n};\n\nexport default Container;\n","import React from 'react';\n\nimport countryList from 'react-select-country-list';\nimport states from 'states-us';\n\nimport DropDown from '../DropDown';\nimport TextField from '../TextField';\n\nconst countries = countryList().getData();\n\nconst CountryStateZipPicker = ({ country, setCountry, state, setState, zip, setZip }) => {\n  const selectedCountry = countries.find(x => x.label === country);\n  const selectedState = states.find(x => x.abbreviation === state);\n\n  return (\n    <>\n      <DropDown\n        value={selectedCountry}\n        onChange={option => setCountry(option.label)}\n        label=\"Country\"\n        containerClassName=\"mb-4\"\n        options={countries}\n        required\n        key={`${selectedCountry}-country-selection`}\n      />\n\n      {country === 'United States' && (\n        <div className=\"flex flex-col lg:flex-row\">\n          <DropDown\n            value={selectedState}\n            onChange={option => setState(option.abbreviation)}\n            label=\"State\"\n            containerClassName=\"mb-4 lg:mr-2\"\n            options={states}\n            getOptionLabel={option => option.name}\n            getOptionValue={option => option.abbreviation}\n            required\n            key={`${selectedState}-state-selection`}\n          />\n\n          <TextField\n            value={zip}\n            onChange={e => setZip(e.target.value)}\n            placeHolder=\"12345\"\n            label=\"ZIP Code\"\n            className=\"mb-4 lg:ml-2\"\n            required\n          />\n        </div>\n      )}\n    </>\n  );\n};\n\nexport default CountryStateZipPicker;\n","import { Link } from 'react-router-dom';\nimport React, { useRef } from 'react';\nimport * as Icon from 'react-icons/fa';\nimport InfiniteScroll from 'react-infinite-scroll-component';\nimport Spinner from '../Spinner';\n\nconst DataGrid = ({\n  className,\n  columns,\n  data,\n  rowLink,\n  loading,\n  sort,\n  setSort,\n  loadNextPage,\n  hasMore,\n  noRecordsText,\n  containerHeight,\n  gridKey,\n}) => {\n  const scrollContainer = useRef();\n\n  const gridTemplateColumns = columns.map(x => `minmax(0, ${x.width || '1fr'})`).join(' ');\n\n  const renderColumnTitle = col => {\n    if (!col.sortable) {\n      return col.title;\n    }\n\n    const isSortedAsc = sort && sort.fieldName && sort.fieldName === col.fieldName && sort.direction === 'ASC';\n    const isSortedDesc = sort && sort.fieldName && sort.fieldName === col.fieldName && sort.direction === 'DESC';\n\n    return (\n      <div className=\"flex items-center \">\n        <button type=\"button\" onClick={() => applySort(col)} className=\"flex focus:outline-none\">\n          <div className=\"flex flex-col justify-center mr-1\">\n            <Icon.FaChevronUp\n              size={12}\n              style={{ marginBottom: -1 }}\n              className={`${isSortedAsc ? 'text-pursuit-blue' : 'text-gray-200'}`}\n            />\n\n            <Icon.FaChevronDown\n              size={12}\n              style={{ marginTop: -1 }}\n              className={`${isSortedDesc ? 'text-guardian-blue' : 'text-gray-200'}`}\n            />\n          </div>\n\n          {col.title}\n        </button>\n      </div>\n    );\n  };\n\n  const applySort = col => {\n    if (sort && sort.fieldName && sort.fieldName === col.fieldName) {\n      if (sort.direction === 'ASC') {\n        setSort({ fieldName: col.fieldName, direction: 'DESC' });\n\n        return;\n      }\n    }\n\n    setSort({ fieldName: col.fieldName, direction: 'ASC' });\n  };\n\n  const scrollableTarget = `scrollableDiv-${gridKey}`;\n  const gridClass = `lg:grid ${className} px-2 lg:px-0`;\n\n  return (\n    <>\n      <div\n        className={`${gridClass} ${\n          scrollContainer &&\n          scrollContainer.current &&\n          scrollContainer.current.scrollHeight > scrollContainer.current.clientHeight\n            ? 'mr-4'\n            : ''\n        }`}\n        style={{ gridTemplateColumns }}>\n        {columns.map((col, i) => (\n          <div\n            className={`hidden lg:flex items-center text-left text-pursuit-gray border-b border-pursuit-gray px-1 ${col.width ||\n              ''}`}\n            key={`col-${i}`}>\n            {renderColumnTitle(col)}\n          </div>\n        ))}\n      </div>\n\n      <div className={`${containerHeight} overflow-y-auto`} ref={scrollContainer} id={scrollableTarget}>\n        <InfiniteScroll\n          dataLength={(data && data.length) || 0} // This is important field to render the next data\n          next={loadNextPage}\n          hasMore={hasMore}\n          scrollableTarget={scrollableTarget}>\n          <div className={gridClass} style={{ gridTemplateColumns }}>\n            {!loading &&\n              data.map((record, i) =>\n                columns.map((col, j) => {\n                  let value = '-';\n\n                  if (typeof col.value === 'function') {\n                    value = col.value(record, i);\n                  } else if (col.value) {\n                    value = col.value;\n                  } else if (col.fieldName) {\n                    value = record[col.fieldName] || '-';\n                  }\n\n                  const rowClass = record.className;\n\n                  if (rowLink && !col.noLink) {\n                    let path = '';\n\n                    if (typeof rowLink === 'function') {\n                      path = rowLink(record);\n                    } else {\n                      path = rowLink;\n                    }\n\n                    return (\n                      <Link\n                        to={path}\n                        className={`flex items-center py-1 lg:py-2 border-b lg:border-gray-300 lg:px-1 text-pursuit-gray font-light \n                  lg:${col.width} \n                  ${rowClass ? ' ' + rowClass : ''}\n                  ${j === columns.length - 1 ? 'pb-4 lg:pb-2 border-gray-300' : 'border-transparent'}\n                  ${j === 0 && 'pt-4 lg:pt-2'}`}\n                        key={`cell-${record.id || i}-${j}`}\n                        // style={{ gridArea: 'main' }}\n                      >\n                        <div className=\"flex flex-row items-center justify-between w-full\">\n                          {col.title && <span className=\"lg:hidden font-semibold\">{col.title}:</span>}\n                          {col.renderFunction ? col.renderFunction(record) : value}\n                        </div>\n\n                        {j === columns.length - 1 && rowLink && (\n                          <div className=\"hidden flex-1 lg:flex justify-end\">\n                            <Icon.FaChevronRight className=\"ml-2 text-gray-400\" />\n                          </div>\n                        )}\n                      </Link>\n                    );\n                  }\n\n                  return (\n                    <div\n                      className={`flex items-center py-1 lg:py-2 border-b lg:border-gray-300 lg:px-1 text-pursuit-gray font-light \n              lg:${col.width} \n              ${j === columns.length - 1 ? 'pb-4 lg:pb-2 border-gray-300' : 'border-transparent'}\n              ${j === 0 && 'pt-4 lg:pt-2'}`}\n                      key={`cell-${record.id}-${j}`}\n                      // style={{ gridArea: 'main' }}\n                    >\n                      <div className=\"flex flex-row items-center justify-between w-full\">\n                        {col.title && <span className=\"lg:hidden font-semibold\">{col.title}:</span>}\n                        {col.renderFunction ? col.renderFunction(record) : value}\n                      </div>\n                    </div>\n                  );\n                })\n              )}\n          </div>\n          {loading && (\n            <div className=\"w-full flex justify-center py-10\">\n              <Spinner />\n            </div>\n          )}\n          {data.length === 0 && !loading && (\n            <div className=\"w-full text-center\">\n              <p className=\"my-10\">{`${noRecordsText}` || 'No Records'}</p>\n            </div>\n          )}\n        </InfiniteScroll>\n      </div>\n    </>\n  );\n};\n\nexport default DataGrid;\n","export function formatPhoneNumber(phoneNumber) {\n  if (!phoneNumber) return '';\n\n  // filter out non-numerical input\n  const formattedPhoneNumber = phoneNumber.replace(/[^\\d]/g, '');\n\n  const { length } = formattedPhoneNumber;\n\n  if (length < 4) {\n    return formattedPhoneNumber;\n  }\n  if (length < 7) {\n    return `${formattedPhoneNumber.slice(0, 3)}-${formattedPhoneNumber.slice(3)}`;\n  }\n\n  return `${formattedPhoneNumber.slice(0, 3)}-${formattedPhoneNumber.slice(3, 6)}-${formattedPhoneNumber.slice(6, 10)}`;\n}\n","import React, { useState, useEffect } from 'react';\nimport { formatPhoneNumber } from './phoneFieldHelper';\n\nconst PhoneField = ({ className, placeholder, value, setState }) => {\n  const [input, setInput] = useState(value);\n\n  useEffect(() => {\n    if (input !== value) setState(input);\n  }, [input, setState, value]);\n\n  function handleFormatting(e) {\n    const formattedNumber = formatPhoneNumber(e.target.value);\n\n    setInput(formattedNumber);\n  }\n\n  return (\n    <input\n      type=\"text\"\n      className={className}\n      placeholder={placeholder}\n      value={input}\n      onChange={e => handleFormatting(e)}\n    />\n  );\n};\n\nexport default PhoneField;\n","import React, { useState } from 'react';\nimport * as Icons from 'react-icons/fa';\nimport { v4 as uuidv4 } from 'uuid';\nimport Feedback from '../Feedback';\nimport Button from '../Button';\nimport PhoneField from '../PhoneField';\nimport PopUpConfirmation from '../PopupConfirmation';\nimport TrashIcon from '../../assets/Images/trash.svg';\nimport { ESCORT_AD } from '../../constants';\n\nconst EscortAdForm = ({ caseState, setCaseState, saveAndAddButton, reviewing }) => {\n  const [phoneIndexToRemove, setPhoneIndexToRemove] = useState(null);\n\n  const newPhone = {\n    type: 'Cellular',\n    number: '',\n  };\n\n  const setPhoneNumber = (index, key, value) => {\n    setCaseState({\n      ...caseState,\n      escortAd: {\n        ...caseState.escortAd,\n        phones: caseState.escortAd.phones.map((phone, i) => (i === index ? { ...phone, [key]: value } : phone)),\n      },\n    });\n  };\n\n  const removePhoneNumber = index => {\n    setPhoneIndexToRemove(null);\n\n    const updatedPhones = [...caseState.escortAd.phones];\n\n    updatedPhones.splice(index, 1);\n\n    const newCaseState = {\n      ...caseState,\n      escortAd: { ...caseState.escortAd, phones: updatedPhones },\n    };\n\n    setCaseState(newCaseState);\n  };\n\n  const setInput = (key, value) => {\n    setCaseState({ ...caseState, escortAd: { ...caseState.escortAd, [key]: value } });\n  };\n\n  const addPhoneNumber = () => {\n    setCaseState({\n      ...caseState,\n      // escortAd: { ...caseState.escortAd, phones: [...caseState.escortAd.phones, { ...newPhone, id: uuidv4() }] },\n      // Add the new phone number to the beginning of the array\n      escortAd: { ...caseState.escortAd, phones: [{ ...newPhone, id: uuidv4() }, ...caseState.escortAd.phones] },\n    });\n  };\n\n  return (\n    <>\n      {phoneIndexToRemove && (\n        <PopUpConfirmation\n          title=\"Remove Phone Number\"\n          content={`Are you sure you want to remove ${\n            caseState.escortAd.phones[phoneIndexToRemove].number\n              ? caseState.escortAd.phones[phoneIndexToRemove].number\n              : 'this phone number'\n          }?`}\n          onCancel={() => setPhoneIndexToRemove(null)}\n          onConfirm={() => removePhoneNumber(phoneIndexToRemove)}\n          confirmText=\"DELETE\"\n          destructive\n          className=\"w-11/12 lg:w-auto\"\n        />\n      )}\n      <div className=\"h-full mb-8\">\n        {reviewing ? (\n          <h2 className=\"font-bold text-lg text-pursuit-gray\">Source 1 - Details from Escort Ad</h2>\n        ) : (\n          <h2 className=\"font-bold text-lg text-pursuit-gray\">Add Source 1 - Add Details from Escort Ad</h2>\n        )}\n        <div className=\"text-sm text-pursuit-gray\">\n          {!reviewing && (\n            <p>\n              Fill out as much info as you can about this source. You can add additional sources by clicking the 'Save\n              and Add New Source' button. Once you have added all of your sources, proceed to the next page to review\n              your details and submit your case for review.\n            </p>\n          )}\n        </div>\n      </div>\n      <div className=\"h-full flex flex-col\">\n        <label className=\"text-pursuit-gray\">\n          URL<span className=\"text-pursuit-red ml-1\">*</span>\n        </label>\n        <input\n          type=\"text\"\n          placeholder=\"Paste URL\"\n          className=\"mt-2 mb-4 px-2 h-10 lg:w-2/3 2xl:w-1/2 shadow\"\n          value={caseState.escortAd.url}\n          onChange={event => {\n            setInput('url', event.target.value);\n          }}\n        />\n\n        {caseState && caseState.escortAd && caseState.escortAd.phones\n          ? caseState.escortAd.phones.map((phone, idx) => (\n              <div key={`phone-${phone?.id}`} className=\"flex flex-col lg:flex-row mb-2\">\n                <div className=\"flex flex-col lg:mr-4 lg:w-40\">\n                  <label className=\"text-pursuit-gray\">\n                    Phone Number<span className=\"text-pursuit-red ml-1\">*</span>\n                  </label>\n                  <PhoneField\n                    className=\"mt-2 mb-4 px-2 h-10 shadow\"\n                    placeholder=\"555-555-5555\"\n                    value={caseState.escortAd.phones[idx].number}\n                    setState={phoneNumber => {\n                      setPhoneNumber(idx, 'number', phoneNumber);\n                    }}\n                  />\n                </div>\n\n                <div className=\"flex flex-col lg:ml-4 lg:w-40\">\n                  <label className=\"text-pursuit-gray\">\n                    Type<span className=\"text-pursuit-red ml-1\">*</span>\n                  </label>\n                  <select\n                    className=\"custom-select mt-2 mb-4 px-2 h-10 shadow bg-white\"\n                    value={caseState.escortAd.phones[idx].type}\n                    onChange={event => {\n                      setPhoneNumber(idx, 'type', event.target.value);\n                    }}>\n                    <option>Cellular</option>\n                    <option>VOIP</option>\n                  </select>\n                </div>\n\n                {idx !== 0 && (!reviewing || caseState.escortAd.phones[idx].number == '') && (\n                  <>\n                    <Button\n                      className=\"lg:hidden flex w-72 mb-2 items-center font-semibold focus:outline-none text-pursuit-red\"\n                      onClick={() => setPhoneIndexToRemove(idx)}>\n                      <Icons.FaMinusCircle size={18} className=\"mr-4\" />\n                      REMOVE PHONE NUMBER\n                    </Button>\n                    <button\n                      className=\"hidden lg:block w-10 ml-4 mt-2 focus:outline-none\"\n                      onClick={() => {\n                        setPhoneIndexToRemove(idx);\n                      }}\n                      type=\"button\">\n                      <img src={TrashIcon} alt=\"Trash\" className=\"w-5\" />\n                    </button>\n                  </>\n                )}\n\n                {/* Button to promote phone to first number in array */}\n                {/* <div className=\"flex flex-col lg:ml-4 lg:w-40\"> */}\n                {/* {!reviewing && idx !== 0 && ( */}\n                {idx !== 0 && (\n                  <button\n                    // className=\"flex mt-8  mb-2 items-center font-semibold focus:outline-none text-pursuit-red\"\n                    className=\"block ml-4 mt-2 focus:outline-none text-pursuit-red font-semibold\"\n                    title=\"Make this the primary phone number for this case.\"\n                    onClick={() => {\n                      const updatedPhones = [...caseState.escortAd.phones];\n                      const phoneToPromote = updatedPhones.splice(idx, 1);\n                      updatedPhones.unshift(phoneToPromote[0]);\n                      setCaseState({\n                        ...caseState,\n                        escortAd: { ...caseState.escortAd, phones: updatedPhones },\n                      });\n                    }}>\n                    <div className=\"flex items-center\">\n                      <Icons.FaArrowUp size={18} className=\"mr-2\" />\n                      MAKE CURRENT\n                    </div>\n                  </button>\n                )}\n                {/* </div> */}\n              </div>\n            ))\n          : null}\n        {/* Add phone number button */}\n        {/* {!reviewing && ( */}\n        {/* <Button\n          className=\"flex w-72 mb-8 items-center font-semibold focus:outline-none text-guardian-darkblue\"\n          onClick={addPhoneNumber}\n          justify=\"justify-start\">\n          <Icons.FaPlusCircle size={18} className=\"mr-4\" />\n          ADD PHONE NUMBER\n        </Button> */}\n        {/* )} */}\n\n        <label className=\"text-pursuit-gray\">Description</label>\n        <textarea\n          placeholder=\"Please add any additional context about this source here\"\n          className=\"h-24 px-2 mt-2 mb-4 shadow\"\n          value={caseState.escortAd.description || ''}\n          onChange={event => {\n            setInput('description', event.target.value);\n          }}\n        />\n\n        {saveAndAddButton}\n\n        <Feedback comments={caseState?.feedbackComments || []} stepId={ESCORT_AD} status={caseState?.status} />\n      </div>\n    </>\n  );\n};\n\nexport default EscortAdForm;\n","import React, { useContext, useState, useCallback } from 'react';\nimport { Storage } from 'aws-amplify';\nimport * as Icons from 'react-icons/fa';\nimport Button from '../Button';\n\nimport { NotificationContext } from '../../helpers/AlertContext/AlertContext.js';\n\nconst FileUploader = ({\n  onSuccess,\n  onCancel,\n  noCancel = false,\n  saveText = 'SAVE AND SUBMIT',\n  prefix = '',\n  level = 'protected',\n  errorMessage = 'You have unsuccessfully uploaded your Training Certificate',\n  noPrefix = false,\n  isUpdate = false,\n  autoSave = false,\n  acceptedFileTypes = '',\n  uploadObject = 'File',\n}) => {\n  const [fileURL, setFileURL] = useState('');\n  const [file, setFile] = useState('');\n  const [filename, setFilename] = useState('');\n  const [fileType, setFileType] = useState();\n  const [, setAlert] = useContext(NotificationContext);\n  const [saving, setSaving] = useState(false);\n  const [saved, setSaved] = useState(false);\n  const [uploadBoxText, setUploadBoxText] = useState(\n    isUpdate ? `Replace Current ${uploadObject}` : `Upload ${uploadObject}`\n  );\n\n  const cancelFile = async () => {\n    if (saved) {\n      setSaved(false);\n    }\n    const cancelRes = await onCancel();\n\n    if (cancelRes) {\n      setUploadBoxText('Successfully Deleted. Upload File.');\n      setFilename('');\n      setFileURL('');\n    }\n  };\n\n  const saveFile = useCallback(\n    // async ({ filename = filename, file = file, prefix = prefix, level = level }) => {\n    async () => {\n      try {\n        setSaving(true);\n\n        const fileParams = { level };\n\n        if (fileType) {\n          fileParams.contentType = fileType;\n        }\n        if (noPrefix) {\n          fileParams.customPrefix = { public: '' };\n        }\n\n        const timestamp = new Date().getTime().toString();\n\n        // console.log({ prefix, timestamp, filename, fileParams });\n        // const uploadResult = {\n        //   key: `${prefix ? `${prefix}/${timestamp}_${filename}` : `${timestamp}_${filename}`}`,\n        // };\n        const uploadResult = await Storage.put(\n          `${prefix ? `${prefix}/${timestamp}_${filename}` : `${timestamp}_${filename}`}`,\n          file,\n          fileParams\n        );\n\n        if (onSuccess) {\n          // get duration in seconds START HERE!!, was working\n          const meta = {\n            filename,\n            timestamp,\n          };\n          onSuccess(uploadResult.key, URL.createObjectURL(file), meta);\n          setSaved(true);\n          setUploadBoxText('SAVED');\n          console.log({ uploadResult });\n        }\n\n        setFileURL('');\n        setFile('');\n      } catch (error) {\n        console.error('Error uploading file: ', error);\n\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: errorMessage,\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n      }\n\n      setSaving(false);\n    },\n    [file, filename, fileType, fileURL]\n  );\n\n  // const autoSaveFile = useCallback(() => {\n  //   saveFile();\n  // },  [file, filename, fileType, fileURL]);\n\n  const upload = useCallback(\n    f => {\n      const fileForUpload = f.target.files[0];\n\n      if (fileForUpload && fileForUpload.type.split('/')[0] === 'image') {\n        const fileUrl = URL.createObjectURL(fileForUpload);\n\n        setFileURL(fileUrl);\n      } else {\n        setFileURL('');\n      }\n\n      setFile(fileForUpload);\n      setFileType(fileForUpload.type || null);\n\n      setFilename(`${fileForUpload.name}`);\n\n      // if (autoSave) {\n      //   autoSaveFile();\n      //   // setTimeout(async () => {\n      //   // saveFile({\n      //   //   filename: fileForUpload.name,\n      //   //   file: fileForUpload,\n      //   //   prefix,\n      //   //   level,\n      //   // });\n      //   // }, 2000);\n      // }\n    },\n    [saveFile]\n  );\n\n  const dragOver = e => {\n    e.preventDefault();\n  };\n\n  const dragEnter = e => {\n    e.preventDefault();\n  };\n\n  const dragLeave = e => {\n    e.preventDefault();\n  };\n\n  const fileDrop = e => {\n    e.preventDefault();\n\n    const { files } = e.dataTransfer;\n\n    const fileForUpload = files[0];\n\n    if (fileForUpload && fileForUpload.type.split('/')[0] === 'image') {\n      const fileUrl = URL.createObjectURL(fileForUpload);\n\n      setFileURL(fileUrl);\n    } else {\n      setFileURL('');\n    }\n    setFile(fileForUpload);\n    setFileType(fileForUpload.type || null);\n\n    setFilename(`${fileForUpload.name}`);\n  };\n\n  return (\n    <div className=\"flex flex-col w-full\">\n      <div\n        className=\"flex justify-center m-1 bg-gray-100 shadow-lg\"\n        onDragOver={dragOver}\n        onDragEnter={dragEnter}\n        onDragLeave={dragLeave}\n        onDrop={fileDrop}>\n        <label className=\"flex flex-col items-center px-4 py-6 tracking-wide uppercase w-68 h-34\">\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"56\"\n            height=\"60\"\n            viewBox=\"0 0 46 70\"\n            className=\"text-gray-200 fill-current\">\n            <g transform=\"translate(-27 -967.362)\">\n              <path\n                className=\"a\"\n                d=\"M50,967.362a3.363,3.363,0,0,0-2.062.813l-17,16c-.974,1.084-1.376,3.163-.25,4.375a3.125,3.125,0,0,0,4.375-.031L47,977.268v47.094a3,3,0,0,0,6,0V977.268l11.938,11.25a3.305,3.305,0,0,0,4.375.031,3.392,3.392,0,0,0-.25-4.375l-17-16A2.885,2.885,0,0,0,50,967.362Zm-20,64a3,3,0,0,0,0,6H70a3,3,0,0,0,0-6Z\"\n              />\n            </g>\n          </svg>\n\n          <span className=\"pt-8 mb-5 ml-0 text-sm leading-normal mt-7\">{uploadBoxText}</span>\n\n          <input type=\"file\" className=\"hidden\" onChange={upload} accept={acceptedFileTypes} />\n\n          {fileURL ? (\n            <img className=\"w-12 h-12\" src={fileURL} alt=\"file-preview\" />\n          ) : (\n            filename && (\n              <span className=\"flex flex-row items-center\">\n                <Icons.FaFile className=\"mr-2\" />\n                {filename}\n              </span>\n            )\n          )}\n        </label>\n      </div>\n\n      <div className=\"flex flex-col lg:flex-row-reverse\">\n        <Button solidBlue className=\"w-full mt-4 lg:ml-2\" onClick={saveFile} loading={saving} disabled={saved}>\n          {saving ? 'SAVING' : saved ? 'SAVED' : saveText}\n        </Button>\n\n        {!noCancel ? (\n          <Button linedBlue className=\"w-full mt-4 lg:mr-2\" onClick={cancelFile}>\n            CANCEL\n          </Button>\n        ) : null}\n      </div>\n    </div>\n  );\n};\n\nexport default FileUploader;\n","import React from 'react';\nimport moment from 'moment';\n\nconst year = moment().format('YYYY');\n\nconst Footer = () => (\n  <footer className=\"w-full py-6 pl-8 bg-pursuit-gray\">\n    <div className=\"items-center w-full h-full font-medium lg:flex lg:justify-between\">\n      <div className=\"flex flex-col\">\n        <div className=\"text-white header-text-font lg:text-3xl \">\n          PURSUIT<span className=\"mx-1 text-xs align-top lg:text-base\">®</span>\n        </div>\n        <div className=\"text-sm text-white header-text-font lg:text-2xl \">\n          <p className=\"inline font-bold text-white\"> P</p>eople\n          <p className=\"inline font-bold text-white\"> U</p>nited\n          <p className=\"inline font-bold text-white\"> R</p>esponsibly\n          <p className=\"inline font-bold text-white\"> S</p>uppressing\n          <p className=\"inline font-bold text-white\"> U</p>nderage\n          <p className=\"inline font-bold text-white\"> I</p>llicit\n          <p className=\"inline font-bold text-white\"> T</p>rafficking\n        </div>\n      </div>\n\n      <div className=\"block my-auto mt-6 font-semibold text-white lg:mt-0 lg:mr-8 lg:text-right standard-text-font\">\n        <p className=\"mb-1\">Copyright {year} &copy;Guardian Group</p>\n        <p className=\"mb-1\">\n          <a href=\"/terms-of-use\" className=\"hover:underline\">\n            Terms of Use\n          </a>\n          &nbsp; | &nbsp;\n          <a href=\"/privacy\" className=\"hover:underline\">\n            Privacy Policy\n          </a>\n        </p>\n        <a href=\"https://www.GuardianGroup.org\" className=\"hover:underline\">\n          www.GuardianGroup.org\n        </a>\n      </div>\n    </div>\n  </footer>\n);\n\nexport default Footer;\n","import React, { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { CircularProgressbarWithChildren, buildStyles } from 'react-circular-progressbar';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { getUserLeaderboardSummary } from '../../generated/graphql/queries';\nimport HeaderText from '../HeaderText';\nimport Button from '../Button';\nimport Spinner from '../Spinner';\nimport 'react-circular-progressbar/dist/styles.css';\n\nconst LeaderboardCard = ({ userId }) => {\n  const [rankText, setRankText] = useState('');\n  const [pointsText, setPointsText] = useState('');\n  const [pointsPercent, setPointsPercent] = useState(0);\n  const [leadsApproved, setLeadsApproved] = useState(0);\n  const [leadsSubmitted, setLeadsSubmitted] = useState(0);\n  const [leadApproval, setLeadApproval] = useState(0);\n  const [loading, setLoading] = useState(true);\n  // if userId is provided, load for that user? otherwise, load for authenticated user\n\n  async function fetchData(id) {\n    const {\n      data: { getUserLeaderboardSummary: summary },\n    } = await API.graphql(graphqlOperation(getUserLeaderboardSummary, { id: id || null, board: 'allTime' }));\n\n    function rankRender() {\n      if (summary.rank === 0) return `N/A`;\n      if (summary.rank === 11 || summary.rank === 12 || summary.rank === 13) return `${summary.rank}th`;\n      if (summary.rank % 10 === 1) return `${summary.rank}st`;\n      if (summary.rank % 10 === 2) return `${summary.rank}nd`;\n      if (summary.rank % 10 === 3) return `${summary.rank}rd`;\n\n      return `${summary.rank}th`;\n    }\n\n    const nanToZero = n => (Number.isFinite(n) ? n : 0);\n\n    setRankText(rankRender());\n    setPointsText(nanToZero(summary.points));\n    setPointsPercent(nanToZero(summary.pointsPercent));\n    setLeadsApproved(nanToZero(summary.leadsApproved));\n    setLeadsSubmitted(nanToZero(summary.leadsSubmitted));\n    setLeadApproval(nanToZero(Math.floor((summary.leadsApproved / summary.leadsSubmitted) * 100)));\n    setLoading(false);\n  }\n\n  useEffect(() => {\n    fetchData(userId);\n  }, [userId]);\n\n  const containerClassNames = 'lg:px-4 pt-4 xl:overflow-auto';\n  const cellClassNames = 'h-60 mb-5 col-span-1';\n\n  return (\n    <>\n      <HeaderText fontSize=\"text-2xl\" className=\"text-left lg:text-4xl lg:text-center\">\n        Leaderboard\n      </HeaderText>\n\n      <div className={containerClassNames}>\n        {loading ? (\n          <>\n            <div className=\"flex justify-center w-full py-10\">\n              <Spinner />\n            </div>\n          </>\n        ) : (\n          <>\n            <div className=\"grid grid-cols-1 col-span-1 row-span-2 md:grid-cols-2 md:col-span-2\">\n              <div className=\"mb-5 h-60\">\n                <p className=\"mb-4 font-bold text-center text-md\">Community Ranking</p>\n                <HeaderText fontSize=\"text-4xl\" className=\"mb-6 text-4xl text-center text-pursuit-red\">\n                  {rankText}\n                </HeaderText>\n              </div>\n              <div className={cellClassNames}>\n                <p className=\"mb-4 font-bold text-center text-md\">Points</p>\n                <div className=\"p-2\">\n                  <CircularProgressbarWithChildren\n                    value={pointsPercent}\n                    strokeWidth={22}\n                    styles={buildStyles({ pathColor: '#770303', rotation: 0.25, strokeLinecap: 'butt' })}\n                  >\n                    <HeaderText\n                      fontSize=\"text-md\"\n                      className=\"text-md text-center align-middle text-pursuit-red\"\n                      mb=\"mb-1\"\n                    >\n                      {pointsText}\n                    </HeaderText>\n                  </CircularProgressbarWithChildren>\n                </div>\n              </div>\n              <div className=\"mb-5 \">\n                <p className=\"mb-4 font-bold text-center text-md\">Leads Approved/ Leads Submitted</p>\n                <HeaderText fontSize=\"text-4xl\" className=\"mb-6 text-4xl text-center text-pursuit-red\">\n                  {leadsApproved}/{leadsSubmitted}\n                </HeaderText>\n              </div>\n\n              <div className={cellClassNames}>\n                <p className=\"mb-4 font-bold text-center text-md\">Lead Approval</p>\n                <div className=\"p-2\">\n                  <CircularProgressbarWithChildren\n                    value={leadApproval}\n                    strokeWidth={22}\n                    styles={buildStyles({ pathColor: '#770303', rotation: 0.25, strokeLinecap: 'butt' })}\n                  >\n                    <HeaderText\n                      fontSize=\"text-md\"\n                      className=\"text-md text-center align-middle text-pursuit-red\"\n                      mb=\"mb-1\"\n                    >\n                      {leadApproval}%\n                    </HeaderText>\n                  </CircularProgressbarWithChildren>\n                </div>\n              </div>\n            </div>\n          </>\n        )}\n      </div>\n\n      <div className=\"flex flex-row items-end justify-end flex-1 mt-4\">\n        <Link to=\"/leaderboard\">\n          <Button className=\"font-semibold lg:text-md text-pursuit-gray focus:outline-none\">VIEW LEADERBOARD</Button>\n        </Link>\n        <div />\n      </div>\n    </>\n  );\n};\n\nexport default LeaderboardCard;\n","import React, { useEffect, useState, useContext } from 'react';\nimport { DateTime } from 'luxon';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { snakeCase } from 'change-case';\nimport * as Icons from 'react-icons/fa';\nimport { useHistory } from 'react-router-dom';\n\nimport { NotificationContext } from '../../helpers/AlertContext/AlertContext';\n\nimport Container from '../Container';\nimport HeaderText from '../HeaderText';\nimport DataGrid from '../DataGrid';\nimport Button from '../Button';\nimport DropDown from '../DropDown';\nimport ToolTip from '../ToolTip';\nimport { useUser } from '../../contexts/userContext';\n\nconst Volunteers = ({\n  statusOptions,\n  title,\n  initialStatus,\n  query,\n  queryName,\n  statusColumn,\n  statusFilterLabel,\n  createUserDefaultType,\n}) => {\n  const { isAdmin } = useUser();\n\n  const [, setAlert] = useContext(NotificationContext);\n\n  const history = useHistory();\n\n  const [nextUsersToken, setNextUsersToken] = useState();\n\n  const [users, setUsers] = useState([]);\n  const [usersLoading, setUsersLoading] = useState(true);\n\n  const [userStatus, setUserStatus] = useState(initialStatus);\n\n  const [filters, setFilters] = useState({\n    userStatus: initialStatus,\n    searchTerm: '',\n  });\n\n  const [sort, setSort] = useState({\n    fieldName: 'createdAt',\n    direction: 'DESC',\n  });\n\n  const [filtersOnLastSearch, setFiltersOnLastSearch] = useState(null);\n  const [sortOnLastSearch, setSortOnLastSearch] = useState({\n    fieldName: 'createdAt',\n    direction: 'DESC',\n  });\n\n  const [search, setSearch] = useState('');\n\n  useEffect(() => {\n    fetchUsers();\n  }, [sort]);\n\n  useEffect(() => {\n    fetchUsers();\n  }, [filters]);\n\n  const [userCount, setUserCount] = useState(0);\n\n  useEffect(() => {\n    setUserCount(users.length);\n  }, [users]);\n\n  const fetchUsers = async () => {\n    setUsersLoading(true);\n\n    try {\n      let nextTokenToUse = nextUsersToken;\n\n      let oldUsers = nextTokenToUse ? [...users] : [];\n\n      if (\n        !filtersOnLastSearch ||\n        filtersOnLastSearch.userStatus !== filters.userStatus ||\n        filtersOnLastSearch.searchTerm !== filters.searchTerm ||\n        sortOnLastSearch.fieldName !== sort.fieldName ||\n        sortOnLastSearch.direction !== sort.direction\n      ) {\n        setNextUsersToken(null);\n\n        nextTokenToUse = null;\n        oldUsers = [];\n      }\n\n      setSortOnLastSearch(sort);\n      setFiltersOnLastSearch(filters);\n\n      const params = {\n        userStatus: filters.userStatus,\n        searchTerm: filters.searchTerm,\n        nextToken: nextTokenToUse,\n        sortField: sort.fieldName ? snakeCase(sort.fieldName).toUpperCase() : '',\n        sortOrder: sort.direction,\n        limit: 10000,\n      };\n\n      const response = await API.graphql(graphqlOperation(query, params));\n\n      const result = response.data[queryName];\n\n      setNextUsersToken(result.nextToken);\n\n      setUsers([...oldUsers, ...result.items]);\n    } catch (error) {\n      console.error('Error Loading users: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error loading users',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setUsersLoading(false);\n  };\n\n  const getCreatedDate = item => (item.createdAt ? DateTime.fromISO(item.createdAt).toLocaleString() : '-');\n  const getLastSignInDate = item => (item.lastSignInAt ? DateTime.fromISO(item.lastSignInAt).toLocaleString() : '-');\n\n  return (\n    <Container height=\"lg:h-152\" padding=\"p-4\" margin=\"m-3 lg:m-auto lg:mx-8\" className=\"relative\">\n      <div className=\"flex flex-col lg:px-4 pt-4\">\n        <div className=\"flex flex-col lg:flex-row mb-4 lg:mb-0 items-start lg:items-center justify-between\">\n          <HeaderText className=\"text-2xl text-left mb-4 lg:text-4xl\">{title}</HeaderText>\n\n          <div className=\"flex items-center\">\n            <p className=\"light-primary-blue-text font-light inline-block mr-4 leading-9\">Total Users</p>\n            <p className=\"text-2xl lg:text-4xl inline-block\">{userCount}</p>\n          </div>\n\n          {isAdmin && (\n            <Button\n              linedBlue\n              className=\"flex flex-row px-4 w-full lg:w-40\"\n              onClick={() => {\n                history.push('/admin/create-leo', { userType: createUserDefaultType });\n              }}>\n              <Icons.FaPlusCircle className=\"mr-2\" /> NEW LEO USER\n            </Button>\n          )}\n        </div>\n\n        <div className=\"lg:flex items-end justify-end mb-10\">\n          <div className=\"lg:mr-4\">\n            <DropDown\n              value={statusOptions.find(x => x.value === userStatus)}\n              onChange={option => {\n                setUserStatus(option ? option.value : null);\n              }}\n              containerClassName=\"mb-4 lg:mb-0\"\n              width=\"w-full lg:w-48 xl:w-64\"\n              label={statusFilterLabel}\n              options={statusOptions}\n              placeholder={statusFilterLabel}\n              isClearable\n            />\n          </div>\n\n          <div className=\"flex flex-col\">\n            <div className=\"flex flex-row\">\n              <p className=\"light-primary-blue-text font-light mb-1\">Search Term</p>\n\n              <ToolTip\n                tooltipText=\"Find records with the search term included in the First Name, Last Name, Alias, Email, State, or ZIP fields.\"\n                title=\"Search Term\"\n                className=\"text-pursuit-gray ml-2\"\n              />\n            </div>\n\n            <input\n              type=\"text\"\n              value={search}\n              onChange={event => setSearch(event.target.value)}\n              placeholder=\"Search Term\"\n              className=\"bg-gray-100 h-10 mb-4 mt-2 lg:mb-0 lg:mt-0 lg:mr-4 px-4 w-full lg:w-48 xl:w-64\"\n              onKeyDown={event => {\n                const pressedKey = event.key;\n\n                if (pressedKey === 'Enter') {\n                  setFilters({\n                    userStatus,\n                    searchTerm: search,\n                  });\n                }\n              }}\n            />\n          </div>\n\n          <Button\n            solidBlue\n            className=\"px-4 w-full lg:w-24\"\n            onClick={() => {\n              setFilters({\n                userStatus,\n                searchTerm: search,\n              });\n            }}>\n            FILTER\n          </Button>\n        </div>\n\n        <DataGrid\n          columns={[\n            {\n              title: '',\n              fieldName: '',\n              sortable: false,\n              width: '3em',\n              value: (v, i) => {\n                // console.log(v, i);\n                return i + 1;\n                // return 0;\n              },\n            },\n            { title: 'First Name', fieldName: 'firstName', sortable: true },\n            { title: 'Last Name', fieldName: 'lastName', sortable: true },\n            { title: 'Email', fieldName: 'email', sortable: true, width: '3fr' },\n            { title: 'Agency', fieldName: 'agency', sortable: true },\n            { title: 'Position', fieldName: 'position', sortable: true },\n            { title: 'Department', fieldName: 'department', sortable: true },\n            { title: 'City', fieldName: 'city', sortable: true },\n            { title: 'State', fieldName: 'state', sortable: true, width: '.5fr' },\n            { title: 'ZIP', fieldName: 'zip', sortable: true, width: '.5fr' },\n            { title: 'Downloads', fieldName: 'downloads', sortable: true },\n            statusColumn,\n            { title: 'Created', fieldName: 'createdAt', value: getCreatedDate, sortable: true },\n            {\n              title: 'Disabled At',\n              fieldName: 'disabledAt',\n              sortable: false,\n              value: ({ disabledAt }) => {\n                return disabledAt ? DateTime.fromISO(disabledAt).toLocaleString() : '-';\n              },\n            },\n          ]}\n          sort={sort}\n          setSort={setSort}\n          loading={usersLoading}\n          data={users}\n          noRecordsText=\"No users found with the selected filters and sort options\"\n          rowLink={item => `/admin/leo-user/${item.id}`}\n          loadNextPage={() => fetchUsers()}\n          hasMore={!!nextUsersToken}\n          containerHeight=\"h-88\"\n          gridKey=\"employee-cases\"\n        />\n      </div>\n    </Container>\n  );\n};\n\nexport default Volunteers;\n","import React from 'react';\nimport * as FaIcons from 'react-icons/fa';\nimport * as FiIcons from 'react-icons/fi';\nimport { DateTime } from 'luxon';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport { parseMarkdown } from '../../helpers/markdown';\nimport { useHistory } from 'react-router-dom';\n\nconst NotificationRow = ({ notification }) => {\n  const history = useHistory();\n  let link = null;\n  const content = parseMarkdown(notification.message);\n  const getIcon = () => {\n    switch (notification.type) {\n      case 'CASE_SUBMITTED':\n        return <FaIcons.FaBriefcaseMedical size=\"40\" />;\n\n      case 'CASE_RESUBMITTED':\n        return <FaIcons.FaBriefcaseMedical size=\"40\" />;\n\n      case 'CASE_APPROVED':\n        return <FaIcons.FaAward size=\"40\" />;\n\n      case 'CASE_RETURNED':\n        return <FaIcons.FaThumbsDown size=\"40\" />;\n\n      case 'CASE_ASSIGNED':\n        return <FaIcons.FaBriefcase size=\"40\" />;\n\n      case 'CERTIFICATION_SUBMITTED':\n        return <FaIcons.FaUserPlus size=\"40\" />;\n\n      case 'STAFF_MESSAGE':\n        return (\n          <span className=\"fa-layers fa-fw fa-3x\">\n            <FontAwesomeIcon icon={icon({ name: 'message', style: 'regular' })} />\n            <FontAwesomeIcon\n              icon={icon({ name: 'triangle-exclamation', style: 'solid' })}\n              transform={'shrink-5 up-7 right-7'}\n              // mask={icon({ name: 'triangle', style: 'solid' })}\n            />\n          </span>\n        );\n\n      case 'MESSAGE_RECEIVED':\n        return (\n          <span className=\"fa-layers fa-fw fa-3x\">\n            {/* <FaIcons.FaEnvelope size={20} /> */}\n            <FontAwesomeIcon icon={icon({ name: 'envelope', style: 'solid' })} />\n          </span>\n        );\n\n      case 'CASE_FILE_DOWNLOADED':\n        return (\n          <span className=\"fa-layers fa-fw fa-3x\">\n            <FontAwesomeIcon icon={icon({ name: 'arrow-down-to-bracket', style: 'light', family: 'sharp' })} />\n          </span>\n        );\n\n      case 'AWARD_THRESHOLD_REACHED':\n        return (\n          <span className=\"fa-layers fa-fw fa-3x\">\n            <FontAwesomeIcon icon={icon({ name: 'trophy', style: 'solid' })} />\n          </span>\n        );\n\n      default:\n        return <FiIcons.FiMessageSquare size=\"40\" />;\n    }\n  };\n\n  if (notification.type === 'MESSAGE_RECEIVED') {\n    const matches = content.match(/href=\"([^\"]*)/);\n    if (Array.isArray(matches)) {\n      link = matches[1];\n    }\n  }\n\n  const getNotificationTime = () => {\n    const luxonDate = DateTime.fromISO(notification.createdAt);\n\n    return luxonDate.toFormat('ff');\n  };\n\n  const onClick = link\n    ? () => {\n        history.push(link);\n      }\n    : () => {};\n\n  return (\n    <div\n      className={`flex flex-row w-full py-3 border-b border-b-pursuit-gray ${link && 'cursor-pointer'}`}\n      onClick={onClick}>\n      <div className=\"flex items-center justify-center w-20 h-20 mr-4 border border-pursuit-gray text-guardian-darkblue\">\n        {getIcon()}\n      </div>\n\n      <div className=\"flex flex-col flex-1 min-h-20\">\n        <p className=\"font-bold text-guardian-darkblue\">\n          {notification.attributes ? notification.attributes.customTitle || notification.title : notification.title}\n        </p>\n        {/* <p className=\"mb-1 text-sm text-pursuit-gray\">{notification.message}</p> */}\n        <span className=\"mb-1 text-sm text-pursuit-gray\" dangerouslySetInnerHTML={{ __html: content }} />\n        <p className=\"w-full mt-auto text-xs text-right text-gray-300\">{getNotificationTime()}</p>\n      </div>\n    </div>\n  );\n};\n\nexport default NotificationRow;\n","import React, { useRef, useState, useEffect, useCallback } from 'react';\nimport * as Icons from 'react-icons/fa';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { getNotificationCount, listNotifications } from '../../generated/graphql/queries';\nimport { clearNotificationCount } from '../../generated/graphql/mutations';\nimport { onNotificationCreated } from '../../generated/graphql/subscriptions';\nimport Spinner from '../Spinner';\nimport NotificationRow from '../NotificationRow';\nimport { useUser } from '../../contexts/userContext';\nimport { useFocus } from '../../contexts/focusContext';\nconst changeFavicon = (hasUnread = false) => {\n  const link = document.querySelector('link[rel=\"icon\"]');\n  // console.log('link', link, hasUnread);\n  if (link && hasUnread === true) {\n    link.setAttribute('href', '/p1591-icon-unread.svg');\n  } else if (link) {\n    link.setAttribute('href', '/p1591-icon-read.svg');\n  }\n};\n\nconst Notifications = ({ limit = 50 }) => {\n  const { user } = useUser();\n  const { isFocused } = useFocus();\n\n  const [dropdownIsActive, setDropdownIsActive] = useState(false);\n  const [notificationCount, setNotificationCount] = useState(0);\n  const [notifications, setNotifications] = useState();\n  const [nextToken, setNextToken] = useState(null);\n\n  const [loading, setLoading] = useState(false);\n\n  const clickOutsideRef = useRef(null);\n\n  const userId = user?.id;\n\n  const queryNotificationCount = useCallback(async () => {\n    try {\n      const {\n        data: { getNotificationCount: count = null },\n      } = await API.graphql(graphqlOperation(getNotificationCount));\n\n      setNotificationCount(count || 0);\n    } catch (error) {\n      console.error('Error fetching notification count: ', error);\n    }\n  }, []);\n\n  const queryNotifications = async ({ loadNext = false } = {}) => {\n    setLoading(true);\n\n    try {\n      const prevNotifications = loadNext && notifications && nextToken ? [...notifications] : [];\n\n      const params = { limit };\n\n      if (loadNext && nextToken) {\n        params.nextToken = nextToken;\n      }\n\n      const {\n        data: { listNotifications: result = null },\n      } = await API.graphql(graphqlOperation(listNotifications, params));\n\n      const newNotifications = result.items;\n\n      const updatedNotifications = [...prevNotifications, ...newNotifications];\n\n      setNotifications(updatedNotifications);\n      setNextToken(result.nextToken || null);\n      setLoading(false);\n\n      setNotificationCount(0);\n\n      try {\n        await API.graphql(graphqlOperation(clearNotificationCount));\n      } catch (error) {\n        console.error('Error clearing notification count: ', error);\n      }\n    } catch (error) {\n      console.error('Error fetching notifications: ', error);\n    }\n\n    setLoading(false);\n  };\n\n  const loadMoreNotifications = () => {\n    queryNotifications({ loadNext: true });\n  };\n\n  useEffect(() => {\n    if (isFocused) {\n      queryNotificationCount();\n    }\n  }, [queryNotificationCount, userId, isFocused]);\n\n  useEffect(() => {\n    if (dropdownIsActive) {\n      queryNotifications();\n    }\n  }, [dropdownIsActive]);\n\n  useEffect(() => {\n    let subscription = null;\n\n    const initSubscription = async () => {\n      try {\n        subscription = await API.graphql(graphqlOperation(onNotificationCreated, { recipient: userId })).subscribe({\n          error: err => {\n            console.error('Error subscribing to onNotificationCreated: ', err);\n          },\n          next: data => {\n            queryNotificationCount();\n            // TODO: revisit this logic at a later time to avoid additional queries if possible\n\n            // const existingNotifications = notifications ? [...notifications] : [];\n\n            // if (existingNotifications.length) {\n            //   const notification = data.value.data.onNotificationCreated;\n\n            //   const matchingNotification = existingNotifications.find(x => x.id === notification.id);\n\n            //   if (!matchingNotification) {\n            //     const updatedNotifications = [...existingNotifications, notification];\n\n            //     const updatedNextToken = {\n            //       id: notification.id,\n            //       createdAt: notification.createdAt,\n            //       recipient: notification.recipient,\n            //     };\n\n            //     setNextToken(updatedNextToken);\n            //     setNotifications(updatedNotifications);\n            //   }\n            // }\n          },\n        });\n      } catch (error) {\n        console.error('Error on subscription: ', error);\n      }\n    };\n\n    initSubscription();\n\n    return () => {\n      if (subscription) {\n        subscription.unsubscribe();\n      }\n    };\n  }, [notifications, userId, dropdownIsActive]);\n\n  const deactivevateDropDoneOnOutsideClick = event => {\n    if (clickOutsideRef.current && !clickOutsideRef.current.contains(event.target)) {\n      setDropdownIsActive(false);\n    }\n  };\n\n  useEffect(() => {\n    document.addEventListener('mousedown', deactivevateDropDoneOnOutsideClick);\n\n    return () => {\n      document.removeEventListener('mousedown', deactivevateDropDoneOnOutsideClick);\n    };\n  }, [clickOutsideRef]);\n\n  function renderDropdown() {\n    if (dropdownIsActive) {\n      return (\n        <div ref={clickOutsideRef} className=\"absolute mt-4 rounded-md shadow-lg right-0 lg:overflow-visible\">\n          <div className=\"bg-white rounded-md shadow-xs mx-2 lg:mx-0 lg:w-104 notifications\">\n            <div className=\"flex flex-col items-center py-4 h-80 overflow-y-auto px-4\">\n              {loading && (\n                <div className=\"flex w-full justify-center items-center\">\n                  <Spinner />\n                </div>\n              )}\n\n              {!loading && notifications && !notifications.length && (\n                <div className=\"flex w-full justify-center items-center\">You have no notifications</div>\n              )}\n\n              {notifications && notifications.length\n                ? notifications.map(notification => (\n                    <NotificationRow notification={notification} key={`notification-${notification.id}`} />\n                  ))\n                : null}\n              <div>\n                <a onClick={loadMoreNotifications}>Load more</a>\n              </div>\n            </div>\n          </div>\n        </div>\n      );\n    }\n  }\n  // Change favicon if user has unread messages\n  useEffect(() => {\n    // console.log({ notificationCount });\n    changeFavicon(!!notificationCount);\n  }, [notificationCount]);\n\n  const getFormattedNotificationCount = () => {\n    if (!notificationCount) {\n      return null;\n    }\n\n    if (notificationCount > 99) {\n      return '99+';\n    }\n\n    return notificationCount;\n  };\n\n  return (\n    <div className=\"lg:relative\">\n      <button\n        onClick={() => {\n          setDropdownIsActive(true);\n        }}\n        type=\"button\"\n        className=\"flex flex-row items-center focus:outline-none mx-3\">\n        <div className=\"relative mx-1 px-2 py-1 lg:mt-2\">\n          <Icons.FaRegBell className=\"text-pursuit-gray text-2xl lg:text-4xl\" />\n\n          {notificationCount ? (\n            <>\n              <div className=\"bg-pursuit-red text-pursuit-red animate-ping rounded-full absolute top-0 right-0 text-xs lg:text-sm min-w-4 lg:min-w-5 h-4 lg:h-5 px-1\">\n                {getFormattedNotificationCount()}\n              </div>\n\n              <div className=\"bg-pursuit-red rounded-full text-white absolute top-0 right-0 text-xs lg:text-sm min-w-4 lg:min-w-5 h-4 lg:h-5 px-1\">\n                {getFormattedNotificationCount()}\n              </div>\n            </>\n          ) : null}\n        </div>\n      </button>\n\n      {renderDropdown()}\n    </div>\n  );\n};\n\nexport default Notifications;\n","/* eslint-disable */\n// this is an auto generated file. This will be overwritten\n\nexport const onUserApproved = /* GraphQL */ `\n  subscription OnUserApproved($id: String!) {\n    onUserApproved(id: $id) {\n      id\n      identityId\n      email\n      alias\n      firstName\n      lastName\n      dateOfBirth\n      country\n      state\n      zip\n      heardAboutUs\n      watchedIntroVideo\n      userStatus\n      certificatePath\n      disabledReason\n      scoreAwardLevels {\n        key\n        value\n      }\n      _deleted\n      lastSignInAt\n      approvedAt\n      disabledAt\n      createdAt\n      updatedAt\n    }\n  }\n`;\nexport const onNotificationCreated = /* GraphQL */ `\n  subscription OnNotificationCreated($recipient: String!) {\n    onNotificationCreated(recipient: $recipient) {\n      id\n      title\n      message\n      type\n      recipient\n      createdAt\n      updatedAt\n    }\n  }\n`;\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Link, useHistory } from 'react-router-dom';\nimport { Auth } from 'aws-amplify';\nimport Switch from 'react-switch';\nimport * as Icons from 'react-icons/fa';\nimport Button from '../Button';\nimport HeaderLogo from '../../assets/Images/guardian_group_logo.svg';\nimport { useUser } from '../../contexts/userContext';\nimport Notifications from '../Notifications';\n\nconst LoggedInHeader = ({ menuLeft, useVolunteerView, setUseVolunteerView, isEmployee }) => {\n  const history = useHistory();\n\n  const [dropdownIsActive, setDropdownIsActive] = useState(false);\n\n  const { user, setUser } = useUser();\n  const [username, setUsername] = useState('');\n\n  const clickOutsideRef = useRef(null);\n\n  const deactivevateDropDoneOnOutsideClick = event => {\n    if (clickOutsideRef.current && !clickOutsideRef.current.contains(event.target)) {\n      setDropdownIsActive(false);\n    }\n  };\n\n  useEffect(() => {\n    if (user && user.cognitoUser) {\n      if (isEmployee && !useVolunteerView) {\n        setUsername(`${user?.firstName} ${user?.lastName}`);\n      } else {\n        setUsername(user?.alias);\n      }\n    }\n\n    document.addEventListener('mousedown', deactivevateDropDoneOnOutsideClick);\n\n    return () => {\n      document.removeEventListener('mousedown', deactivevateDropDoneOnOutsideClick);\n    };\n  }, [user, isEmployee, useVolunteerView, clickOutsideRef]);\n\n  function toggleDropdown() {\n    switch (dropdownIsActive) {\n      case false:\n        setDropdownIsActive(true);\n        break;\n      case true:\n        setDropdownIsActive(false);\n        break;\n      default:\n        setDropdownIsActive(false);\n    }\n  }\n\n  function renderDropdown() {\n    if (dropdownIsActive) {\n      return (\n        <div ref={clickOutsideRef} className=\"absolute right-0 mt-4 mr-4 rounded-md shadow-lg lg:overflow-visible\">\n          <div className=\"px-4 bg-white rounded-md shadow-xs\">\n            {isEmployee && (\n              <div className=\"flex items-center py-4 border-b border-gray-300\">\n                <span className=\"font-semibold text-pursuit-gray\">Volunteer View</span>\n                <Switch\n                  onChange={enabled => {\n                    setUseVolunteerView(enabled);\n                    history.push('/');\n                  }}\n                  checked={useVolunteerView}\n                  className=\"ml-2\"\n                  height={20}\n                  width={40}\n                />\n              </div>\n            )}\n\n            <div className=\"flex items-center py-4 \">\n              <Button\n                solidBlue\n                className=\"block w-full px-4 py-2 text-sm leading-5\"\n                onClick={async () => {\n                  await Auth.signOut();\n\n                  setUser(null);\n\n                  try {\n                    localStorage.clear();\n                  } catch (error) {\n                    console.error(error);\n                  }\n                }}>\n                Sign Out\n              </Button>\n            </div>\n          </div>\n        </div>\n      );\n    }\n  }\n\n  return (\n    <nav className=\"fixed z-30 flex flex-row items-center justify-center w-screen h-12 bg-white shadow-lg lg:h-24 lg:justify-start lg:shadow-none\">\n      <div className=\"flex flex-row items-center justify-between w-full\">\n        <div className=\"flex flex-row items-center\">\n          {menuLeft}\n          <span className=\"hidden lg:inline-block\">\n            <Link to=\"/\">\n              <img className=\"h-10 py-1 lg:h-24 lg:my-2 lg:py-2 lg:ml-4\" src={HeaderLogo} alt=\"Guardian Group Logo\" />\n            </Link>\n          </span>\n        </div>\n\n        <span className=\"lg:hidden flex-1\">\n          <Link to=\"/\">\n            <img className=\"h-10 py-1 lg:h-24 lg:my-2 lg:py-2 lg:ml-4\" src={HeaderLogo} alt=\"Guardian Group Logo\" />\n          </Link>\n        </span>\n\n        <div className=\"flex items-center\">\n          <Notifications />\n\n          <div>\n            <button onClick={toggleDropdown} type=\"button\" className=\"flex flex-row items-center focus:outline-none\">\n              <p className=\"my-auto text-sm header-text-font lg:text-3xl\">{username || 'New Volunteer'}</p>\n              <Icons.FaCaretDown className=\"mx-1 lg:ml-2 lg:mr-8\" />\n            </button>\n            {renderDropdown()}\n          </div>\n        </div>\n      </div>\n    </nav>\n  );\n};\n\nexport default LoggedInHeader;\n","import React from 'react';\n\nconst MobileDropdown = ({ className, optionsArray, selected, selectionCallback }) => (\n  <select\n    className={`custom-select ${className}`}\n    value={selected}\n    onChange={event => {\n      selectionCallback(event.target.value);\n    }}\n  >\n    {optionsArray.map((option, i) => (\n      <option key={i}>{option}</option>\n    ))}\n  </select>\n);\n\nexport default MobileDropdown;\n","import React from 'react';\nimport * as FaIcons from 'react-icons/fa';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport { P1591Icon } from '../P1591Icon';\n\nconst SideBarData = ({ openIntroVideo, openRulesModal, isAdmin, handleShareQRCodeModal }) => {\n  const volunteerLinks = [\n    {\n      title: 'My Cases',\n      path: '/',\n      icon: <FaIcons.FaBriefcase size={20} />,\n    },\n    {\n      title: 'Settings',\n      path: '/settings',\n      icon: <FaIcons.FaCog size={20} />,\n    },\n    {\n      title: 'New Case',\n      path: '/investigation/new',\n      icon: <FaIcons.FaPlusCircle size={20} />,\n      newTab: true,\n    },\n    {\n      title: 'Leaderboard',\n      path: '/leaderboard',\n      icon: <FaIcons.FaChartArea size={20} />,\n    },\n    {\n      title: 'Knowledge Base',\n      path: '/knowledge',\n      icon: <FaIcons.FaLightbulb size={20} />,\n    },\n    {\n      title: 'Messaging',\n      path: '/messaging',\n      icon: <FaIcons.FaEnvelope size={20} />,\n    },\n    {\n      title: 'Send Feedback',\n      path: '#',\n      icon: <FaIcons.FaQuestionCircle size={20} />,\n      onClick: e => {\n        window.location = 'mailto:project1591@guardiangroup.org?subject=Project 1591 App Feedback';\n        e.preventDefault();\n      },\n    },\n    {\n      title: 'Rules/Guidelines',\n      path: '#',\n      icon: <FaIcons.FaHandshake size={20} />,\n      onClick: openRulesModal,\n    },\n    {\n      title: 'Intro Video',\n      path: '#',\n      icon: <FaIcons.FaPlayCircle size={20} />,\n      onClick: openIntroVideo,\n    },\n  ];\n\n  const employeeLinks = [\n    {\n      title: isAdmin ? 'Cases' : 'My Cases',\n      path: '/',\n      icon: <FaIcons.FaBriefcase size={20} />,\n    },\n    {\n      title: 'Volunteers',\n      path: '/volunteers',\n      icon: <FaIcons.FaUsers size={20} />,\n    },\n    {\n      title: 'Settings',\n      path: '/settings',\n      icon: <FaIcons.FaCog size={20} />,\n    },\n    {\n      title: 'Leaderboard',\n      path: '/leaderboard',\n      icon: <FaIcons.FaChartArea size={20} />,\n    },\n    {\n      title: 'Knowledge Base',\n      path: '/knowledge',\n      icon: <FaIcons.FaLightbulb size={20} />,\n    },\n  ];\n  if (process.env.ENABLE_VOLUNTEER_MESSAGING === 'true') {\n    employeeLinks.push({\n      title: 'Messaging',\n      path: '/messaging',\n      icon: <FaIcons.FaEnvelope size={20} />,\n    });\n  }\n\n  const adminLinks = [\n    {\n      title: 'Messaging',\n      path: '/messaging',\n      icon: <FaIcons.FaEnvelope size={20} />,\n    },\n    {\n      title: 'Admin',\n      path: '/admin/staff',\n      icon: <FaIcons.FaUserCog size={20} />,\n    },\n    // {\n    //   title: 'LEO',\n    //   path: '/admin/leo',\n    //   // icon: <FontAwesomeIcon icon={icon({ name: 'badge-sheriff', style: 'regular' })} />,\n    //   icon: <FontAwesomeIcon icon={P1591Icon} size=\"1x\" />,\n    // },\n    // {\n    //   title: 'LEO',\n    //   path: '/admin/leo',\n    //   icon: <FontAwesomeIcon icon={icon({ name: 'badge-sheriff', style: 'regular' })} />,\n    // },\n    {\n      title: 'LEO',\n      path: '/admin/leo',\n      icon: <FontAwesomeIcon icon={icon({ name: 'user-police', style: 'solid' })} />,\n    },\n    {\n      title: 'Search',\n      path: '/admin/search',\n      icon: <FontAwesomeIcon icon={icon({ name: 'magnifying-glass', style: 'solid' })} />,\n    },\n    // {\n    //   title: 'LEO',\n    //   path: '/admin/leo',\n    //   icon: <FontAwesomeIcon icon={icon({ name: 'building-shield', style: 'solid' })} />,\n    // },\n    // {\n    //   title: 'LEO',\n    //   path: '/admin/leo',\n    //   icon: <FontAwesomeIcon icon={icon({ name: 'building-shield', style: 'regular' })} />,\n    // },\n    // {\n    //   title: 'LEO',\n    //   path: '/admin/leo',\n    //   icon: <FontAwesomeIcon icon={icon({ name: 'id-badge', style: 'regular' })} />,\n    // },\n    // {\n    //   title: 'Share MFA Creds',\n    //   path: '#',\n    //   icon: <FaIcons.FaQrcode size={20} />,\n    //   onClick: handleShareQRCodeModal,\n    // },\n  ];\n\n  return { volunteerLinks, employeeLinks, adminLinks };\n};\n\nexport default SideBarData;\n","import moment from 'moment';\n\nexport const ifEmptyObj = fieldValue => {\n  for (const key of Object.keys(fieldValue)) {\n    if (fieldValue[key]) {\n      return false;\n    }\n  }\n\n  return true;\n};\nexport const ifContainNumbers = fieldValue => /\\d/.test(fieldValue);\nexport const ifOnlyContainsNumbers = fieldValue => /^\\d+$/.test(fieldValue);\nexport const ifEmail = fieldValue =>\n  /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/.test(\n    fieldValue\n  );\nexport const ifLengthIsLessThan = (fieldValue, length) => fieldValue < length;\nexport const ifLengthIs = (fieldValue, length) => fieldValue === length;\nexport const ifContainsUpperCase = fieldValue => /[A-Z]/g.test(fieldValue);\nexport const ifContainsLowerCase = fieldValue => /[a-z]/g.test(fieldValue);\nexport const ifContainsSpecialCharacters = fieldValue => /[~`@!#$%^&*+=\\-[\\]\\\\';,/{}|\\\\\":<>?]/g.test(fieldValue);\nexport const ifFieldValuesMatch = (fieldValue1, fieldValue2) => fieldValue1 === fieldValue2;\nexport const ifYearAgoIs = (year, yearsAgo) => parseInt(moment().format('YYYY')) - year >= yearsAgo;\n","import { DateTime } from 'luxon';\n\nimport {\n  ifContainNumbers,\n  ifEmail,\n  ifContainsUpperCase,\n  ifContainsLowerCase,\n  ifContainsSpecialCharacters,\n  ifFieldValuesMatch,\n} from '../validationHelpers.js';\n\nexport const nameValidator = (setAlert, name) => {\n  const nameEmpty = !name;\n  const nameContainsNumbers = ifContainNumbers(name);\n\n  if (nameEmpty) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter a name',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  } else if (nameContainsNumbers) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Your name cannot contain numbers',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !nameEmpty && !nameContainsNumbers;\n};\n\nexport const firstNameValidator = (setAlert, name) => {\n  const nameEmpty = !name;\n\n  if (nameEmpty) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter a first name',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !nameEmpty;\n};\n\nexport const lastNameValidator = (setAlert, name) => {\n  const nameEmpty = !name;\n\n  if (nameEmpty) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter a last name',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !nameEmpty;\n};\n\nexport const emailValidator = (setAlert, email) => {\n  const emailEmpty = !email;\n  const validEmail = ifEmail(email);\n\n  if (emailEmpty) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter an email',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  } else if (!validEmail) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter a valid email',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !emailEmpty && validEmail;\n};\n\nexport const passwordValidator = (setAlert, password) => {\n  const passwordEmpty = !password;\n  const passwordLength = password && password.length >= 8;\n  const passwordHasNumber = ifContainNumbers(password);\n  const passwordHasUpperCase = ifContainsUpperCase(password);\n  const passwordHasLowerCase = ifContainsLowerCase(password);\n  const passwordHasSpecialCharacter = ifContainsSpecialCharacters(password);\n\n  if (passwordEmpty) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter a password',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  } else if (\n    !passwordLength ||\n    !passwordHasNumber ||\n    !passwordHasUpperCase ||\n    !passwordHasLowerCase ||\n    !passwordHasSpecialCharacter\n  ) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message:\n          'Your password must be 8 characters long, have at least one number, one upper case letter, one lower case letter, and one special character',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return (\n    !passwordEmpty &&\n    passwordLength &&\n    passwordHasNumber &&\n    passwordHasUpperCase &&\n    passwordHasLowerCase &&\n    passwordHasSpecialCharacter\n  );\n};\n\nexport const confirmPasswordValidator = (setAlert, confirmPassword, password) => {\n  const confirmPasswordEmpty = !confirmPassword;\n  const passwordsMatch = ifFieldValuesMatch(password, confirmPassword);\n\n  if (confirmPasswordEmpty) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter your password confirmation',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  } else if (!passwordsMatch) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Your passwords do not match',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !confirmPasswordEmpty && passwordsMatch;\n};\n\nexport const locationValidator = (setAlert, location, country) => {\n  if (!location && country === 'United States') {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter a state',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !!location || country !== 'United States';\n};\n\nexport const zipValidator = (setAlert, zip, country) => {\n  if (!zip && country === 'United States') {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter a ZIP Code',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n\n  if (zip && country === 'United States') {\n    const regex = new RegExp('^[0-9]{5}(?:-[0-9]{4})?$');\n\n    const isValid = regex.test(zip);\n\n    if (!isValid) {\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'ZIP Code must be in format 12345 or 12345-1234',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    return isValid;\n  }\n\n  return true;\n};\n\nexport const dateOfBirthValidator = (setAlert, dateOfBirth, isAdminCreate) => {\n  if (!dateOfBirth) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: isAdminCreate ? 'Please enter a date of birth' : 'Please enter your date of birth',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n\n  const luxonDate = DateTime.fromJSDate(dateOfBirth);\n\n  if (!luxonDate.isValid) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Invalid date of birth provided',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n\n  const now = DateTime.fromJSDate(new Date());\n\n  const yearsDiff = now.diff(luxonDate, 'years').years;\n\n  if (yearsDiff < 18) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: isAdminCreate\n          ? 'Cannot create a new user under the age of 18 years old'\n          : 'You must be at least 18 years old to register for this application',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n\n  return true;\n};\nexport const countryValidator = (setAlert, country) => {\n  if (!country) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter a country',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !!country;\n};\n\nexport const heardAboutValidator = (setAlert, heardAbout) => {\n  if (!heardAbout) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter how you heard about us',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !!heardAbout;\n};\n","/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\n/* eslint-disable jsx-a11y/click-events-have-key-events */\nimport React, { useState, useContext } from 'react';\nimport { Link, useLocation } from 'react-router-dom';\nimport { motion } from 'framer-motion';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { toast } from 'react-toastify';\nimport * as Icons from 'react-icons/fa';\nimport SideBarData from '../SidebarData';\nimport PopUpConfirmation from '../PopupConfirmation';\n// import { shareMFACredentials } from '../../generated/graphql/mutations';\nimport { shareMfaCredentials as shareMFACredentials } from '../../generated/graphql/mutations';\nimport { NotificationContext } from '../../helpers/AlertContext/AlertContext.js';\nimport { emailValidator } from '../../helpers/createAccount/fieldValidation.js';\n\nconst NavBar = ({ open, setOpen, hidden, showRules, showIntroVideo, useEmployeeRouting, isAdmin }) => {\n  const location = useLocation();\n  const [isShareQRCodeModalOpen, setIsShareQRCodeModalOpen] = useState(false);\n  const [shareQRCodeEmail, setShareQRCodeEmail] = useState('');\n  const [shareQRButtonLoading, setShareQRButtonLoading] = useState(false);\n  const [, setAlert] = useContext(NotificationContext);\n\n  if (hidden) {\n    return null;\n  }\n\n  const handleShareQRCodeModal = () => {\n    setShareQRCodeEmail('');\n    setIsShareQRCodeModalOpen(!isShareQRCodeModalOpen);\n  };\n\n  const shareQRCode = async () => {\n    setShareQRButtonLoading(true);\n    const isValidEmail = emailValidator(setAlert, shareQRCodeEmail);\n\n    if (isValidEmail) {\n      try {\n        await API.graphql(graphqlOperation(shareMFACredentials, { email: shareQRCodeEmail }));\n        setShareQRCodeEmail('');\n\n        handleShareQRCodeModal();\n\n        toast.success('MFA Credentials Shared', {\n          progress: false,\n          className: 'bg-green-500 text-white',\n          autoClose: 1500,\n          closeButton: false,\n          icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n        });\n      } catch (error) {\n        console.error(error);\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: 'Unable to share MFA Credentials',\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n      }\n    }\n    setShareQRButtonLoading(false);\n  };\n\n  const { volunteerLinks, employeeLinks, adminLinks } = SideBarData({\n    openIntroVideo: showIntroVideo,\n    openRulesModal: showRules,\n    handleShareQRCodeModal,\n  });\n\n  const buildLinks = () => {\n    if (useEmployeeRouting) {\n      if (isAdmin) {\n        return [...employeeLinks, ...adminLinks];\n      }\n\n      return [...employeeLinks];\n    }\n\n    return [...volunteerLinks];\n  };\n\n  const links = buildLinks();\n\n  return (\n    <>\n      <div className=\"flex-col hidden lg:flex\">\n        <motion.nav\n          initial={{ width: '4rem' }}\n          animate={{ width: open ? '13rem' : '4rem' }}\n          transition={{ duration: 0.15, type: 'keyframes' }}\n          className=\"flex flex-col flex-1 w-0 mt-24 bg-pursuit-darkred lg:w-auto\"\n        >\n          <div className=\"fixed mt-4\">\n            {links.map((item, index) => (\n              <Link\n                to={item.path}\n                key={`desktop-navitem-${index}`}\n                onClick={item.onClick || null}\n                target={item.newTab ? '_blank' : null}\n                rel=\"noopener noreferrer\"\n              >\n                <li\n                  key={index}\n                  className={`flex flex-row items-center px-5 \n                ${\n                  location.pathname === item.path ? 'text-pursuit-red bg-white' : 'text-white'\n                } text-lg hover:bg-gray-200 hover:text-pursuit-red`}\n                >\n                  <div className=\"my-3\">{item.icon}</div>\n\n                  {open && (\n                    <motion.div\n                      animate={{ width: open ? '9.25rem' : '0rem' }}\n                      transition={{ duration: 0.15, type: 'keyframes' }}\n                      style={{ whiteSpace: 'nowrap' }}\n                    >\n                      <div className=\"my-0 ml-4\">{item.title}</div>\n                    </motion.div>\n                  )}\n                </li>\n              </Link>\n            ))}\n          </div>\n        </motion.nav>\n      </div>\n\n      <div className=\"flex flex-col lg:hidden\">\n        <motion.nav\n          initial={{ top: 0, left: 0, right: 0, bottom: '100%' }}\n          animate={{ bottom: open ? 0 : '100%' }}\n          transition={{ duration: 0.25, type: 'keyframes' }}\n          className=\"fixed z-30 flex flex-col mt-12 bg-pursuit-darkred\"\n          style={{ opacity: 0.95 }}\n        >\n          {links.map((item, index) => (\n            <Link\n              to={item.path}\n              className={index === 0 ? 'mt-2' : ''}\n              onClick={() => {\n                if (setOpen) {\n                  setOpen(false);\n                }\n\n                if (item.onClick) {\n                  item.onClick();\n                }\n              }}\n              key={`mobile-navitem-${index}`}\n            >\n              <li\n                key={index}\n                className={`flex flex-row items-center px-5 \n                ${\n                  location.pathname === item.path ? 'text-pursuit-red bg-white' : 'text-white'\n                } text-lg hover:bg-gray-200 hover:text-pursuit-red`}\n              >\n                {open && (\n                  <>\n                    <div className=\"my-3\">{item.icon}</div>\n                    <div className=\"my-0 ml-4\">{item.title}</div>\n                  </>\n                )}\n              </li>\n            </Link>\n          ))}\n        </motion.nav>\n      </div>\n      <div>\n        {isShareQRCodeModalOpen && (\n          <PopUpConfirmation\n            title=\"Share MFA Credentials\"\n            content={\n              <div className=\"flex-col justify-center\">\n                <div>Share MFA QR code with:</div>\n                <div>\n                  <input\n                    type=\"text\"\n                    value={shareQRCodeEmail}\n                    onChange={event => setShareQRCodeEmail(event.target.value)}\n                    placeholder=\"Email\"\n                    className=\"bg-gray-100 h-10 mb-4 mt-2 lg:mb-0 lg:mt-0 lg:mr-4 px-4 w-full lg:w-80\"\n                  />\n                </div>\n              </div>\n            }\n            onConfirm={shareQRCode}\n            onCancel={handleShareQRCodeModal}\n            confirmText=\"SHARE\"\n            className=\"w-11/12 lg:w-auto\"\n            confirmLoading={shareQRButtonLoading}\n            confirmLoadingText=\"SHARE\"\n          />\n        )}\n      </div>\n    </>\n  );\n};\n\nexport default NavBar;\n","import React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\nexport const SortableItem = ({ children = null, ...props }) => {\n  const {\n    attributes,\n    listeners,\n    setNodeRef,\n    transform,\n    transition,\n    isDragging,\n    disabled,\n    over,\n    overIndex,\n    index,\n    newIndex,\n  } = useSortable({\n    id: props.id,\n  });\n  const classNames = 'rounded shadow-lg p-2 my-2 bg-white truncate';\n  const { website, title } = props.data;\n  const { items } = props;\n  let wrapperClass = '';\n  let cantDrop = false;\n  // Confirm that item is a escort ad if in index 0\n\n  // const cantBeFirstSource = isDragging && overIndex === 0 && 'Escort Ad' !== title;\n  // const secondSourceIsEscortAd = items[1] && 'Escort Ad' === items[1].title;\n  // const cantBeRemovedAsFirst = !cantBeFirstSource && !secondSourceIsEscortAd;\n  // const cantDrop = cantBeFirstSource || cantBeRemovedAsFirst;\n  const isFirstPosition = index === 0;\n  const isEscortAd = website === 'Escort Ad' || title === 'Escort Ad';\n  const isSecondEscortAd =\n    (items[1] && items[1].website === 'Escort Ad') || (items[1] && items[1].title === 'Escort Ad');\n  if (isDragging && isFirstPosition && !isSecondEscortAd) {\n    cantDrop = true;\n  }\n  if (isDragging && newIndex === 0 && !isEscortAd) {\n    console.log('isDragging', { isDragging, newIndex, isEscortAd, props });\n    cantDrop = true;\n  }\n  // const isMovingOutOfFirstPosition = overIndex !== 0 && isFirstPosition;\n  // const isMovingIntoFirstPosition = overIndex === 0 && !isFirstPosition;\n  // const secondSourceIsEscortAd = items[1] && items[1].title === 'Escort Ad';\n\n  // const cantDrop =\n  //   (isFirstPosition && !secondSourceIsEscortAd) ||\n  //   (isMovingOutOfFirstPosition && !secondSourceIsEscortAd) ||\n  //   (isMovingIntoFirstPosition && !cantBeFirstSource);\n\n  // console.log('overIndex', {\n  //   over,\n  //   overIndex,\n  //   props,\n  //   index,\n  //   newIndex,\n  //   // secondSourceIsEscortAd,\n  //   cantDrop,\n  //   items,\n  //   second: items[1],\n  // });\n  if (cantDrop) {\n    // classNames = 'rounded shadow-lg p-2 my-2 bg-gray-200 text-gray-300';\n    wrapperClass = 'opacity-50';\n  }\n\n  // const canDrop = overIndex === 0 && over.data;\n\n  const style = {\n    transform: CSS.Transform.toString(transform),\n    transition,\n    cursor: cantDrop ? 'not-allowed' : isDragging ? 'grabbing' : 'grab',\n    zIndex: isDragging ? 10 : 1,\n  };\n\n  return (\n    <div ref={setNodeRef} style={style} className={classNames} {...attributes} {...listeners}>\n      <span className={wrapperClass}>{children}</span>\n    </div>\n  );\n};\n\n// export default SortableItem;\n","import React, { useState, useEffect } from 'react';\nimport ConfirmationStep from '../ConfirmationStep';\nimport Button from '../Button';\nimport { ESCORT_AD, CaseStatus, AwardTypes } from '../../constants';\nimport PointBreakdown from '../PointBreakdown';\nimport InvestigatorNotes from '../InvestigatorNotes';\nimport { v4 as uuidv4 } from 'uuid';\nimport { usesOldEscortAdFormat } from '../../helpers/caseForms/utilHelpers';\n\nimport { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors } from '@dnd-kit/core';\nimport {\n  arrayMove,\n  SortableContext,\n  sortableKeyboardCoordinates,\n  verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { SortableItem } from '../SortableItem';\nimport PopUpConfirmation from '../PopupConfirmation';\nimport { compileSteps } from '../ReviewForm/compileSteps';\nimport * as Icons from 'react-icons/fa';\n\nconst OrderStepsForm = ({ caseState, setCaseState, editSource, addButton, disableEdit, save }) => {\n  const [expandAll, setExpandAll] = useState(false);\n  const [awardClassificationOption, setAwardClassificationOption] = useState('');\n  const [usesOldFormat, setUsesOldFormat] = useState(false);\n  const [compiledSteps, setCompiledSteps] = useState([]);\n\n  const [showReorderSection, setShowReorderSection] = React.useState(false);\n\n  // const [items, setItems] = React.useState([1, 2, 3]);\n  const sensors = useSensors(\n    useSensor(PointerSensor),\n    useSensor(KeyboardSensor, {\n      coordinateGetter: sortableKeyboardCoordinates,\n    })\n  );\n\n  const handleDragEnd = event => {\n    const { active, over, ...rest } = event;\n    console.log({ active, over, rest });\n    if (active.id !== over.id) {\n      // Don't do anything if the item is not a escort ad and is replacing a escort ad\n      const overIndex = over.data.current.sortable.index;\n      const activeIndex = active.data.current.sortable.index;\n      const { items } = over.data.current.sortable;\n      const secondItem = compiledSteps[1];\n      const secondIsEscortAd = secondItem?.title === 'Escort Ad' || secondItem?.website === 'Escort Ad';\n      const activeItem = compiledSteps.find(({ id }) => id === active.id);\n      console.log({ overIndex, activeItem });\n      if (!(activeItem.title === 'Escort Ad' || activeItem.website === 'Escort Ad') && overIndex === 0) {\n        console.log('Can not replace the escort ad');\n        return;\n      }\n      if (activeIndex === 0 && !secondIsEscortAd) {\n        console.log('Can not move ad if second item is not ad');\n        return;\n      }\n      const defaultOrder = compiledSteps.map(({ id }) => id);\n      const oldIndex = (caseState.sourceOrder || defaultOrder).findIndex(id => id === active.id);\n      const newIndex = (caseState.sourceOrder || defaultOrder).findIndex(id => id === over.id);\n      // const newItems = arrayMove(compiledSteps, oldIndex, newIndex);\n      const sourceOrder = arrayMove(caseState.sourceOrder || defaultOrder, oldIndex, newIndex);\n      // const sourceOrder = arrayMove(caseState.sourceOrder || compiledSteps, oldIndex, newIndex);\n      // const sourceSet = new Set(caseState.sourceOrder);\n      // const sourceOrder  = new Set(newItems.map(({ id }) => id));\n      console.log('test', JSON.stringify({ oldIndex, newIndex, sourceOrder }));\n      const newSortedCompiledSteps = compiledSteps.sort(\n        (a, b) => sourceOrder.indexOf(a.id) - sourceOrder.indexOf(b.id)\n      );\n      // newItems.forEach(({ id }) => sourceSet.add(id));\n      // const sourceOrder = newItems.map(({ id }) => id);\n      // const sourceOrder = Array.from(sourceSet);\n      const [firstSource, ...otherSources] = newSortedCompiledSteps;\n      console.log({ oldSort: caseState.sourceOrder, sourceOrder, firstSource, newSortedCompiledSteps });\n      const { uniqueFields = {} } = firstSource;\n      const { adLocation = null } = uniqueFields;\n      let { city, state } = caseState;\n      if (adLocation) {\n        [city, state] = adLocation.split(', ');\n      }\n\n      const newCaseState = JSON.parse(JSON.stringify({ ...caseState, city, state, sourceOrder }));\n      setCaseState(newCaseState);\n    }\n  };\n\n  const reOrderButton = (\n    <Button\n      solidBlue\n      padding=\"px-4 py-1\"\n      className=\"my-2 mr-8\"\n      onClick={() => setShowReorderSection(value => !value)} /* disabled={disableEdit} */\n    >\n      <span className=\"p-0 m-0 nowrap\" style={{ whiteSpace: 'nowrap' }}>\n        Reorder\n      </span>\n    </Button>\n  );\n\n  useEffect(() => {\n    // const usesOldFormat = usesOldEscortAdFormat(caseState);\n    setUsesOldFormat(usesOldEscortAdFormat(caseState));\n\n    // Update compiled steps\n    // const steps = compileSteps(caseState.steps, caseState.webSources, caseState.sourceOrder);\n    // const steps = compileSteps(caseState.steps, caseState.webSources, caseState.sourceOrder);\n    // const steps = compileSteps([], caseState.webSources || [], caseState.staffSources || [], caseState.sourceOrder);\n    const steps = compileSteps([], caseState.webSources || [], [], caseState.sourceOrder);\n    // console.log({ steps });\n    setCompiledSteps(steps);\n  }, [caseState]);\n\n  useEffect(() => {\n    setAwardClassificationOption(caseState.awardClassificationOption);\n  }, [caseState.awardClassificationOption]);\n\n  function setInput(key, value) {\n    setCaseState({ ...caseState, [key]: value });\n  }\n\n  const toggleExpandAll = () => setExpandAll(!expandAll);\n\n  const swapSteps = (index, direction) => {\n    const performSwap = (arr, idx, dir) => {\n      const temp = arr[idx + dir];\n\n      arr[idx + dir] = arr[idx];\n      arr[idx] = temp;\n\n      return arr;\n    };\n    // If using the old format adjust the index by 1 to offset it\n    if (!usesOldEscortAdFormat(caseState)) {\n      index += 1;\n    }\n\n    const updatedWebSources = performSwap([...caseState.webSources], index - 1, direction); // escort ad is idx 0, need to adjust\n\n    setTimeout(() => {\n      setCaseState({ ...caseState, webSources: updatedWebSources });\n    }, 100);\n  };\n\n  // Swap the escort ad with the first source.\n  const swapAdStep = () => {\n    const [firstSource, secondSource, ...otherSources] = caseState.webSources;\n    const existingAd = caseState.escortAd;\n    // console.log({ caseState });\n    // const usesOldFormat = usesOldEscortAdFormat(caseState);\n    console.log('firstSource', firstSource, caseState, usesOldFormat);\n    if (firstSource === undefined || firstSource.website !== 'Escort Ad') return;\n\n    let { city, state } = caseState;\n\n    if (!usesOldFormat) {\n      const { uniqueFields } = secondSource;\n      const { adLocation } = uniqueFields;\n      if (adLocation) {\n        [city, state] = adLocation.split(', ');\n      }\n      const updatedCase = { ...caseState, city, state, webSources: [secondSource, firstSource, ...otherSources] };\n      console.log({ updatedCase, uniqueFields, city, state });\n      setCaseState(updatedCase);\n      // swapSteps(0, 1);\n      return;\n    }\n\n    const { uniqueFields, id, website, ...restOfFirstSource } = firstSource;\n    const { adLocation, phoneNumber, phoneType } = uniqueFields;\n    if (adLocation) {\n      [city, state] = adLocation.split(', ');\n    }\n    // Convert the escort ad to a new source\n    const { description, url, phones } = existingAd;\n    const { number, type } = phones[0];\n    const newSource = {\n      // Create a new UUID\n      id: uuidv4(),\n      website: 'Escort Ad',\n      url,\n      description,\n      uniqueFields: {\n        phoneNumber: number,\n        phoneType: type,\n        adLocation: [city, state].filter(x => x).join(', '),\n      },\n    };\n\n    // Convert the first source to the escort ad\n    const newEscortAd = {\n      ...restOfFirstSource,\n      phones: [\n        {\n          id: 'initial',\n          number: phoneNumber,\n          type: phoneType,\n        },\n      ],\n    };\n\n    // Update the case state\n    const newCaseState = {\n      ...caseState,\n      city,\n      state,\n      escortAd: newEscortAd,\n      webSources: [newSource, secondSource, ...otherSources],\n    };\n    console.log('newCaseState', newCaseState);\n    setCaseState(newCaseState);\n  };\n\n  const deleteSource = id => {\n    const sources = [...caseState.webSources];\n    const staffSources = caseState.staffSources ? [...caseState.staffSources] : [];\n    let spliceOffset = sources.findIndex(x => x.id === id);\n    if (usesOldEscortAdFormat(caseState)) {\n      spliceOffset -= 1;\n    }\n\n    console.log({ spliceOffset, id, usesOldEscortAdFormat: usesOldEscortAdFormat(caseState) });\n\n    sources.splice(spliceOffset, 1);\n    const webSourceIds = sources.map(x => x.id);\n    const staffSourceIds = staffSources.map(x => x.id);\n    const newAwardedPoints = (caseState.awardedPoints || []).filter(\n      x => x.stepId === 'ESCORT_AD' || webSourceIds.includes(x.stepId) || staffSourceIds.includes(x.stepId)\n    );\n    const newCaseState = { ...caseState, webSources: [...sources], awardedPoints: [...newAwardedPoints] };\n\n    // setCaseState({ ...caseState, webSources: [...sources] });\n    // console.log({ newCaseState, newAwardedPoints });\n    setCaseState(newCaseState);\n  };\n  const setNotes = notes => {\n    // console.log('setNotes', note);\n    // const data = { ...caseState, investigatorNotes: notes };\n\n    // console.log('setNotes', data);\n    // setInput('investigatorNotes', notes);\n    setCaseState({ ...caseState, investigatorNotes: notes });\n    // save({data});\n  };\n\n  const renderSteps = () => {\n    const awards = caseState.awardedPoints ? [...caseState.awardedPoints] : [];\n\n    const steps = [\n      // {\n      //   title: 'Escort Ad',\n      //   body: caseState.escortAd,\n      //   id: ESCORT_AD,\n      //   award: awards.find(x => x.stepId === ESCORT_AD)?.awardType || null,\n      // },\n    ];\n    // Check if any of the old escort ad fields are filled\n    const escortAdData = [\n      caseState.escortAd.url,\n      ...caseState.escortAd.phones.map(({ phone }) => phone),\n      caseState.escortAd.description,\n    ];\n    const escortAdEmpty = escortAdData.filter(Boolean).length === 0;\n\n    if (!escortAdEmpty) {\n      steps.push({\n        title: 'Escort Ad',\n        body: caseState.escortAd,\n        id: ESCORT_AD,\n        award: awards.find(x => x.stepId === ESCORT_AD)?.awardType || null,\n      });\n    }\n    const primaryEscortAdOverride =\n      caseState?.staffSources &&\n      caseState.staffSources.find(x => x.website === 'Escort Ad' && x.previousSourceId === '0');\n    if (primaryEscortAdOverride) {\n      steps.push({\n        title: primaryEscortAdOverride.website,\n        body: primaryEscortAdOverride,\n        id: primaryEscortAdOverride.id,\n      });\n    }\n\n    caseState.webSources.forEach(source => {\n      steps.push({\n        title: source.website ? source.website : '[no source type selected]',\n        body: source,\n        id: source.id,\n        award: awards.find(x => x.stepId === source.id)?.awardType || null,\n      });\n    });\n\n    const getIsApproved = idx => {\n      let isApproved = false;\n      const indexOffset = usesOldFormat || primaryEscortAdOverride ? -1 : 0;\n\n      if (idx > 0) {\n        const currStepAward =\n          caseState?.awardedPoints?.find(source => source.stepId === caseState.webSources[idx + indexOffset]?.id) ||\n          null;\n\n        if (\n          caseState.status === CaseStatus.Approved &&\n          (currStepAward?.awardType === AwardTypes.AccountIdentified ||\n            currStepAward?.awardType === AwardTypes.VerficationSource)\n        ) {\n          isApproved = true;\n        }\n      } else if (caseState.status === CaseStatus.Approved) {\n        isApproved = true;\n      }\n\n      return isApproved;\n    };\n\n    const filteredSteps = compiledSteps.map(data => {\n      const award = awards.find(x => x.stepId === data.id)?.awardType || null;\n      return {\n        title: data.website,\n        id: data.id,\n        body: data,\n        award,\n        ...data,\n      };\n    });\n    // return steps.map((data, idx, allSteps) => (\n    return filteredSteps.map((data, idx, allSteps) => (\n      <ConfirmationStep\n        noSwaps\n        key={`Source_${data.id}`}\n        data={data}\n        index={idx}\n        numSteps={allSteps.length}\n        isLast={idx === allSteps.length - 1}\n        swapSteps={swapSteps}\n        editSource={editSource}\n        deleteSource={deleteSource}\n        expandAll={expandAll}\n        feedbackComments={caseState?.feedbackComments || []}\n        status={caseState?.status}\n        awardClassificationOption={awardClassificationOption}\n        disableEdit={disableEdit || getIsApproved(idx)}\n        allSteps={allSteps}\n        swapAdStep={swapAdStep}\n        // swapAdStep={stepToReplaceEscortAd => {\n\n        //   console.log('stepToReplaceEscortAd', stepToReplaceEscortAd);\n        // }}\n      />\n    ));\n  };\n\n  return (\n    <>\n      <div className=\"mb-8\">\n        {caseState.status === CaseStatus.Approved || caseState.status === CaseStatus.Resubmitted ? (\n          <>\n            <h2 className=\"text-lg font-bold text-pursuit-gray\">Review Approved Case</h2>\n            <div className=\"text-sm text-pursuit-gray\">\n              <p>\n                Please review all the steps you took to create this investigation. Use the reorder button below to\n                rearrange the steps in the order of your discovery process. Edit and delete sources that weren't awarded\n                points and add additional sources. Approved sources cannot be edited.\n              </p>\n            </div>\n          </>\n        ) : (\n          <>\n            <h2 className=\"text-lg font-bold text-pursuit-gray\">Review and Adjust</h2>\n            <div className=\"text-sm text-pursuit-gray\">\n              <p>\n                Please review all the steps you took to create this investigation. Use the reorder button below to\n                rearrange the steps in the order of your discovery process.\n              </p>\n            </div>\n          </>\n        )}\n      </div>\n      <div className=\"py-4 mb-4\">\n        <h2 className=\"mb-2 text-lg font-bold text-pursuit-gray\">Personal Details</h2>\n        <ul>\n          <li className=\"my-1\">\n            <p>\n              <b className=\"text-pursuit-gray\">Name: </b>\n              {`${caseState.firstName || ''} ${caseState.middleName || ''} ${caseState.lastName || ''}`}\n            </p>\n          </li>\n\n          <li className=\"my-1\">\n            <p>\n              <b className=\"text-pursuit-gray\">Age: </b>\n              {caseState.age}\n            </p>\n          </li>\n\n          <li className=\"my-1\">\n            <p>\n              <b className=\"text-pursuit-gray\">Location: </b>\n              {`${caseState.city || ''}, ${caseState.state || ''}`}\n            </p>\n          </li>\n\n          <li className=\"my-1\">\n            <p className=\"whitespace-normal break-words\">\n              <b className=\"text-pursuit-gray\">Comments: </b>\n              {caseState.details}\n            </p>\n          </li>\n        </ul>\n      </div>\n\n      {(caseState.status === CaseStatus.Approved || caseState.status === CaseStatus.Resubmitted) && (\n        <div className=\"mb-8\">\n          <PointBreakdown\n            expandAll\n            noSwaps\n            feedbackComments={caseState?.feedbackComments || []}\n            status={caseState?.status}\n            awardClassificationOption={awardClassificationOption}\n            caseRecord={caseState}\n          />\n        </div>\n      )}\n      <div className=\"flex float-right\">\n        {addButton}\n        {reOrderButton}\n        {caseState.webSources.length <= 0 ? (\n          <></>\n        ) : (\n          <>\n            <Button solidBlue className=\"w-32 my-2\" onClick={toggleExpandAll}>\n              {expandAll ? <>Collapse All</> : <>Expand All</>}\n            </Button>\n          </>\n        )}\n      </div>\n      {showReorderSection && (\n        <PopUpConfirmation\n          // noCancel={sendMessageOnApproval}\n          noCancel={true}\n          // noConfirm={sendMessageOnApproval}\n          title=\"Reorder Steps\"\n          contentWrapper=\"p-3 bg-gray-100 border border-black rounded\"\n          // content=\"Are you sure you are ready to approve this case and award points to the submitter?\"\n          content={\n            <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n              <div\n                className=\"overflow-y-auto overflow-x-visible\"\n                style={{\n                  maxHeight: '40vh',\n                }}>\n                <SortableContext\n                  items={compiledSteps}\n                  strategy={verticalListSortingStrategy}\n                  // disabled={{\n                  //   droppable: true,\n                  // }}\n                >\n                  {compiledSteps.map((data, idx, arr) => (\n                    <SortableItem\n                      key={data.id}\n                      id={data.id}\n                      data={data}\n                      items={arr}\n                      disabled={true}\n                      // onDragOver={onDragOver}\n                      children={\n                        <div className=\"flex items-center\" title=\"Click and drag to reorder\">\n                          <span>\n                            <Icons.FaGripVertical className=\"mr-2 text-gray-400\" />\n                          </span>\n                          <span className=\"text-pursuit-darkred font-bold\">Step {idx + 1}:&nbsp;</span>\n                          <span>{data.website}</span>\n                          <span className=\"text-pursuit-gray\">&nbsp;{data?.url && `- ${data?.url}`}</span>\n                        </div>\n                      }\n                    />\n                  ))}\n                </SortableContext>\n              </div>\n            </DndContext>\n          }\n          // onCancel={() => setApproveReady(false)}\n          onConfirm={() => setShowReorderSection(false)}\n          confirmText=\"Close\"\n          // confirmLoading={approving}\n          // confirmLoadingText=\"APPROVING\"\n          className=\"w-11/12 lg:w-auto lg:w-1/2\"\n        />\n      )}\n\n      <div className=\"clear-both\" />\n      {renderSteps()}\n\n      <div className=\"flex flex-col mt-8\">\n        {/* <label className=\"mb-2 text-lg font-bold text-pursuit-gray\">Investigator Notes</label> */}\n\n        {/* <textarea\n          disabled={disableEdit}\n          placeholder=\"Notes or comments\"\n          className=\"h-24 pl-1 mt-1 mb-2 shadow\"\n          value={caseState.investigatorNotes}\n          onChange={event => setInput('investigatorNotes', event.target.value)}\n        /> */}\n\n        <InvestigatorNotes\n          canEdit={!disableEdit}\n          canSort={!disableEdit}\n          canDelete={!disableEdit}\n          notes={caseState.investigatorNotes}\n          // newVisibility={null}\n          setNotes={setNotes}\n        />\n      </div>\n    </>\n  );\n};\n\nexport default OrderStepsForm;\n","import React from 'react';\n\nconst Page = ({ children }) => (\n  <div className=\"mt-10 lg:mt-0 flex flex-1 flex-col pb-6 w-full bg-gray-100 lg:bg-transparent\">\n    <div\n      style={{ zIndex: -10, height: '45vh' }}\n      className=\"fixed bg-no-repeat bg-cover bg-scroll w-screen bg-none lg:mt-24 lg:flex lg:justify-center lg:bg-coin\"\n    />\n\n    <div className=\"flex flex-col flex-1 lg:justify-center w-full mt-3 lg:mt-24\">{children}</div>\n  </div>\n);\n\nexport default Page;\n","/* eslint-disable jsx-a11y/control-has-associated-label */\nimport React from 'react';\nimport states from 'states-us';\n\nconst PersonalInfoForm = ({ caseState, setCaseState, reviewing, disableNameEdit = false }) => {\n  const commentMaxSize = 300;\n  function setInput(key, value) {\n    setCaseState({ ...caseState, [key]: value });\n  }\n\n  return (\n    <>\n      <div className=\"mb-8\">\n        <h2 className=\"text-lg font-bold text-pursuit-gray\">Personal Information</h2>\n        <div className=\"text-sm text-pursuit-gray\">\n          {!reviewing && (\n            <p>\n              Fill out as much information as you can. You can always come back to this screen before submitting. First\n              and last name are required.\n            </p>\n          )}\n        </div>\n      </div>\n\n      <div className=\"flex flex-col\">\n        <label className=\"text-pursuit-gray\">\n          First Name<span className=\"ml-1 text-pursuit-red\">*</span>\n        </label>\n        <input\n          type=\"text\"\n          placeholder=\"First Name\"\n          className=\"h-10 px-2 mt-2 mb-4 shadow lg:w-2/3 2xl:w-1/2\"\n          value={caseState.firstName || undefined}\n          onChange={event => setInput('firstName', event.target.value)}\n          disabled={disableNameEdit}\n        />\n\n        <label className=\"text-pursuit-gray\">Middle Name</label>\n        <input\n          type=\"text\"\n          placeholder=\"Middle Name\"\n          className=\"h-10 px-2 mt-2 mb-4 shadow lg:w-2/3 2xl:w-1/2\"\n          value={caseState.middleName || undefined}\n          onChange={event => setInput('middleName', event.target.value)}\n          disabled={disableNameEdit}\n        />\n\n        <label className=\"text-pursuit-gray\">\n          Last Name<span className=\"ml-1 text-pursuit-red\">*</span>\n        </label>\n        <input\n          type=\"text\"\n          placeholder=\"Last Name\"\n          className=\"h-10 px-2 mt-2 mb-4 shadow lg:w-2/3 2xl:w-1/2\"\n          value={caseState.lastName || undefined}\n          onChange={event => setInput('lastName', event.target.value)}\n          disabled={disableNameEdit}\n        />\n\n        <label className=\"text-pursuit-gray\">\n          Age<span className=\"ml-1 text-pursuit-red\">*</span>\n        </label>\n\n        <input\n          type=\"text\"\n          placeholder=\"Age\"\n          className=\"h-10 px-2 mt-2 mb-4 shadow lg:w-56\"\n          value={caseState.age || undefined}\n          onChange={event => setInput('age', event.target.value)}\n        />\n\n        {/* \n        <div className=\"flex flex-col lg:flex-row lg:mt-1 lg:mb-2\">\n          <p>* Location information is now added from a Escort Ad source.</p>\n        </div>\n\n        <div className=\"flex flex-col lg:flex-row lg:mt-1 lg:mb-2\">\n          <div className=\"flex flex-col\">\n            <label className=\"text-pursuit-gray\">\n              City<span className=\"ml-1 text-pursuit-red\">*</span>\n            </label>\n\n            <input\n              type=\"text\"\n              placeholder=\"City\"\n              className=\"h-10 px-2 mt-2 mb-4 shadow lg:mr-8 lg:w-56\"\n              value={caseState.city}\n              disabled\n              onChange={event => setInput('city', event.target.value)}\n            />\n          </div>\n\n          <div className=\"flex flex-col\">\n            <label className=\"text-pursuit-gray\">\n              State<span className=\"ml-1 text-pursuit-red\">*</span>\n            </label>\n\n            <select\n              name=\"State\"\n              disabled\n              className={`custom-select pl-2 mt-2 mb-4 h-10 lg:w-40 shadow bg-white ${\n                !caseState.state ? 'text-gray-200' : 'text-pursuit-gray'\n              }`}\n              onChange={event => setInput('state', event.target.value)}\n              value={caseState.state || ''}\n              placeholder=\"Select\"\n            >\n              <option key=\"default-state\" value=\"\" disabled=\"disabled\">\n                Select\n              </option>\n\n              {states.map((state, i) => (\n                <option key={i}>{state.name}</option>\n              ))}\n            </select>\n          </div>\n        </div>\n */}\n        <label className=\"text-pursuit-gray\">Additional Details and Comments</label>\n\n        <textarea\n          placeholder={`Notes or comments limited to ${commentMaxSize} characters`}\n          className=\"h-24 pl-1 mt-1 mb-2 shadow\"\n          value={caseState.details || undefined}\n          maxLength={commentMaxSize}\n          onChange={event => setInput('details', event.target.value)}\n        />\n        <div>\n          <span\n            title=\"This field has a maximum size\"\n            class=\"float-right inline-block text-sm px-2 rounded-full bg-gray-200\">\n            {caseState.details?.length || 0}/{commentMaxSize}\n          </span>\n        </div>\n      </div>\n    </>\n  );\n};\n\nexport default PersonalInfoForm;\n","import React from 'react';\nimport { Route, Redirect } from 'react-router-dom';\nimport { useUser } from '../../contexts/userContext';\n\nconst PrivateRoute = ({ path, allowedGroups = [], children }) => {\n  const { user, userGroups } = useUser();\n\n  if (userGroups.some(group => allowedGroups.includes(group))) {\n    return <Route path={path}>{children}</Route>;\n  }\n\n  if (!userGroups.length) {\n    if (user && user.userStatus === 'PENDING') {\n      return <Redirect to=\"/thank-you\" />;\n    }\n\n    return <Redirect to=\"/required-training\" />;\n  }\n\n  return <div>Unauthorized</div>;\n};\n\nexport default PrivateRoute;\n","import React, { useState, useRef, useEffect } from 'react';\nimport {\n  fieldValue,\n  readableFormat,\n  sortWebSourceFields,\n  webSourceFieldLabel,\n} from '../../helpers/caseForms/utilHelpers';\nimport Dropdown from '../DropDown';\nimport { AwardClassificationOptions, AwardTypes, CaseStatus } from '../../constants';\nimport TextField from '../TextField';\nimport PursuitIcon from '../../assets/Images/pursuit_icon.svg';\nimport { parseMarkdown } from '../../helpers/markdown';\nimport { getWebSourceSiteLabel, webSourceFields } from '../../helpers/caseForms/webSourceFields';\nimport * as Icons from 'react-icons/fa';\n\nconst awardTypeOptions = [\n  { label: 'Account Identified', value: AwardTypes.AccountIdentified },\n  { label: 'Verification Source', value: AwardTypes.VerficationSource },\n  { label: 'No Points', value: AwardTypes.NoPoints },\n];\n\nconst ReviewStep = ({\n  data,\n  index,\n  setFeedback,\n  setAwardOption,\n  awardClassificationOption,\n  status,\n  showAwardOptions = true,\n  showCheckboxes = false,\n  toggleCheckbox,\n  isChecked,\n  hideReview,\n  customSorter,\n  actions,\n  expandAll = false,\n  hideExpand = false,\n}) => {\n  const [initialAward] = useState(data.award);\n  const [staffSource] = useState(!!data.author);\n  const [expanded, setExpanded] = useState(false);\n\n  useEffect(() => {\n    setExpanded(expandAll);\n  }, [expandAll]);\n\n  function toggleExpanded() {\n    setExpanded(!expanded);\n  }\n\n  useEffect(() => {\n    const step1Content = document.getElementById('step-1-description');\n    if (step1Content) {\n      const lineHeight = parseFloat(getComputedStyle(step1Content).lineHeight);\n      const maxLines = 3;\n      const maxHeight = lineHeight * maxLines;\n      // console.log('Step 1 content', {\n      //   lineHeight,\n      //   maxLines,\n      //   maxHeight,\n      //   scrollHeight: step1Content.scrollHeight,\n      //   exceeds: step1Content.scrollHeight > maxHeight,\n      // });\n      if (step1Content.scrollHeight > maxHeight) {\n        step1Content.classList.add('exceeds-length');\n      } else {\n        step1Content.classList.remove('exceeds-length');\n      }\n    }\n  }, [expanded]);\n\n  // console.log({ data });\n\n  /**\n   * This is a hack to get the cursor to stay in the same position when\n   * the user is typing in the feedback field. This is because the\n   * feedback field is a controlled component and the cursor position\n   * is reset when the value is updated.\n   */\n  const [cursor, setCursor] = useState(null);\n  const ref = useRef(null);\n\n  useEffect(() => {\n    const input = ref.current;\n\n    if (input) input.setSelectionRange(cursor, cursor);\n  }, [ref, cursor, data.feedback]);\n\n  const expandArrow = expanded ? <Icons.FaChevronDown /> : <Icons.FaChevronRight />;\n  const divHeight = expanded ? 'max-h-64r' : 'max-h-0';\n\n  const handleChange = e => {\n    setCursor(e.target.selectionStart);\n\n    if (setFeedback) {\n      setFeedback({ id: data.id, value: e.target.value });\n    }\n  };\n\n  function phoneData(arr) {\n    return arr.map((obj, i) => (\n      <div key={`Field${i}`}>\n        <p className=\"pt-1 font-normal \">\n          <b>Phone {i + 1}</b>\n        </p>\n        <div className=\"pb-1 pl-2 font-normal \">\n          <p>\n            <b>Number: </b>\n            {obj.number}\n          </p>\n          <p>\n            <b>Type: </b>\n            {obj.type}\n          </p>\n        </div>\n      </div>\n    ));\n  }\n\n  function uniqueData(obj) {\n    // const\n    const { website } = data.body;\n    const webSourceKey = website.toLowerCase().replace(/\\s/g, '');\n    const orderedFields = Object.keys(webSourceFields[webSourceKey]);\n    const sortFunction = sortWebSourceFields(orderedFields);\n    const sortedFields = Object.entries(obj).sort(sortFunction);\n\n    // console.log({ webSourceKey, obj, sortedFields, orderedFields: {...orderedFields} });\n    // const sortFunction = (a, b) => {\n    //   return 0;\n    // };\n    return Object.entries(obj)\n      .sort(sortFunction)\n      .map(([field, value], i) => {\n        if (!value) {\n          return <></>;\n        }\n\n        // const readableField = readableFormat(field);\n        const readableField = webSourceFieldLabel(field, undefined, true);\n\n        return (\n          <span key={`Unique${i}`} className=\"py-1 font-normal \">\n            <b>{`${readableField}: `}</b>\n            {/* {value}  */}\n            {fieldValue(field, value)}\n          </span>\n        );\n      });\n  }\n\n  function defaultData(field, value, i) {\n    const formatFieldName = x => {\n      if (x.toLowerCase() === 'url') {\n        return 'URL';\n      }\n\n      return x ? x.charAt(0).toUpperCase() + x.slice(1) : '';\n    };\n\n    if (field === 'description') {\n      const { website = '' } = data.body;\n      const webSourceKey = website.toLowerCase().replace(/\\s/g, '');\n      return (\n        <span key={`Field${i}`} className={`py-1 font-normal step-${i - 2}`} style={{ overflowWrap: 'anywhere' }}>\n          {/* <b className=\"text-pursuit-gray\">{`${formatFieldName(field)}: `}</b> */}\n          <b className=\"\">{`${webSourceFieldLabel(field, webSourceKey, true)}: `}</b>\n          <div\n            id={`step-${i - 2}-description`}\n            dangerouslySetInnerHTML={{\n              // Quick hack to remove paragraph padding\n              __html: parseMarkdown(value).replace(/mb-4/g, ''),\n            }}\n          />\n          {/* {value} */}\n        </span>\n      );\n    }\n\n    return (\n      <p key={`Field${i}`} className=\"py-1 font-normal \" style={{ overflowWrap: 'anywhere' }}>\n        <b className=\"\">{`${formatFieldName(field)}: `}</b>\n        {value}\n      </p>\n    );\n  }\n\n  const renderStepContent = () => {\n    if (!data?.body) return null;\n\n    if (!expanded) {\n      return <div />;\n    }\n\n    const stepFields = data.body;\n    // const typeOfStep = data.body.website\n\n    // const sortedFields = sortWebSourceFields(Object.entries(stepFields), orderedFields);\n\n    // const fields = [...Object.entries(stepFields)];\n    const tmp = [...Object.entries(stepFields)];\n    const fields = JSON.parse(JSON.stringify(tmp));\n    // console.log({ stepFields, orderedFields, fields });\n    // console.log({ stepFields, fields, webSourceKey, sortedFields });\n\n    const idxOfDescription = fields.findIndex(x => Array.isArray(x) && x.length && x[0] === 'description');\n    // If URL is in unique fields keep it in place else move it to the bottom of the list\n    const idxOfUrl = fields.findIndex(x => Array.isArray(x) && x.length && x[0] === 'url');\n    if (idxOfUrl !== -1) {\n      const url = fields[idxOfUrl];\n      // console.log({ website });\n      // if (orderedFields.includes('url')) {\n      const { website = '' } = stepFields;\n      // This is such a hack\n      if ('Escort Ad' === website) {\n        // Remove spaces and lowercase the key\n        const webSourceKey = website.toLowerCase().replace(/\\s/g, '');\n        const orderedFields = Object.keys(webSourceFields[webSourceKey]);\n        const indexOfUniqueFields = fields.findIndex(x => Array.isArray(x) && x.length && x[0] === 'uniqueFields');\n        const indexOfNewUrl = orderedFields.indexOf('url');\n        // const indexOfUrl = Array.findIndex(fields, x => Array.isArray(x) && x.length && x[0] === 'url');\n        // fields[indexOfUniqueFields][1].splice(indexOfNewUrl, 0, url);\n        // Add URL to the unique fields\n        fields[indexOfUniqueFields][1][url[0]] = url[1];\n        // console.log({ fields: { ...fields }, idxOfUrl });\n        // Remove URL from the fields\n        fields.splice(idxOfUrl, 1);\n        // console.log({ fields2: { ...fields } });\n\n        // console.log({ orderedFields, indexOfUniqueFields, idxOfUrl, indexOfNewUrl, url, fields });\n      } else {\n        const removed = fields.splice(idxOfUrl, 1);\n        // console.log({fields, idxOfUrl, removed});\n        // fields.push(url);\n        fields.splice(fields.length - 1, 0, url);\n      }\n    }\n\n    // ensure description is the last shown field\n    if (idxOfDescription !== -1) {\n      // const description = fields[idxOfDescription];\n      // fields.splice(idxOfDescription, 1);\n      // fields.push(description);\n    }\n\n    return (\n      <div className=\"flex flex-col \" key={data.id}>\n        {fields.map(([field, value], i) => {\n          if (field === 'website' || field === 'id') return null;\n\n          // if (field === 'url') return null;\n\n          // Hide staff fields\n          if (field.slice(0, 5).toLowerCase() === 'staff') {\n            return null;\n          }\n\n          if (field === 'phones') {\n            return phoneData(value);\n          }\n\n          if (field === 'uniqueFields') {\n            return uniqueData(value);\n            // return null;\n          }\n\n          // if (field === 'description') {\n          //   return defaultData(field, parseMarkdown(value), i);\n          // }\n\n          return defaultData(field, value, i);\n        })}\n\n        {!hideReview ? (\n          <>\n            <label className=\"mt-4 text-pursuit-gray\">Review Feedback</label>\n            <textarea\n              ref={ref}\n              placeholder=\"Share feedback about this source with the volunteer who submitted the case\"\n              className=\"h-24 pl-1 mt-1 mb-2 shadow\"\n              value={data?.feedback || ''}\n              onChange={handleChange}\n              // onChange={(event) =>\n              //   setFeedback({ id: data.id, value: event.target.value })\n              // }\n            />\n          </>\n        ) : null}\n      </div>\n    );\n  };\n\n  const stepContent = (\n    <div key={`Data${index}`} className=\"pt-4 lg:px-12\">\n      {renderStepContent()}\n    </div>\n  );\n\n  const getAwardedPoints = () => {\n    if (data.award === AwardTypes.VerficationSource) {\n      if (awardClassificationOption === AwardClassificationOptions.Underage) {\n        return 3;\n      }\n\n      return 1;\n    }\n\n    if (data.award === AwardTypes.AccountIdentified) {\n      if (awardClassificationOption === AwardClassificationOptions.Underage) {\n        return 5;\n      }\n\n      return 1;\n    }\n\n    return 0;\n  };\n\n  const getAwardColor = () => {\n    if (staffSource) {\n      return 'text-white pursuit-staff bg-pursuit-red';\n    }\n    if (!data.award) {\n      return 'bg-white text-pursuit-gray';\n    }\n    if (data.award === 'NO_POINTS') {\n      return 'bg-pursuit-red text-white';\n    }\n\n    return 'bg-green-500 text-white';\n  };\n\n  return (\n    <>\n      {/* <div key={`Step${index}`} className=\"p-2 pb-8 mb-4 font-bold transition-transform duration-500 transform shadow\"> */}\n      <div key={`Step${index}`} className=\"p-2 pb-8 mb-4 font-bold shadow step\">\n        <p className=\"m-2 mt-0 text-pursuit-darkred\">Step {index + 1}</p>\n        <div className=\"flex\">\n          <div className=\"flex-grow\">\n            <div className=\"flex flex-row mt-4\">\n              <div className={`${customSorter ? '' : 'hidden lg:hidden '}w-12 lg:block`}>{customSorter}</div>\n              <div className=\"flex flex-col items-center justify-between w-full p-2 lg:mr-4 lg:flex-row bg-guardian-darkblue step-header\">\n                <p className=\"ml-2 text-white\">{getWebSourceSiteLabel(data.title)}</p>\n                <div className=\"flex flex-row items-center w-full lg:w-64\">\n                  {awardClassificationOption && (\n                    <div\n                      className={`${getAwardColor()} h-6 w-8 rounded-full flex justify-center items-center p-0 mr-4`}>\n                      {getAwardedPoints()}\n                    </div>\n                  )}\n                  {staffSource && (\n                    <div\n                      // className={`${getAwardColor()} h-6 w-8 rounded-full flex justify-center items-center p-0 mr-4`}\n                      className=\"h-6 w-8 rounded-full flex justify-center items-center p-0 mr-4\">\n                      {/* /   {getAwardedPoints()} */}\n                      {/* <FaIcons.FaUsers size={20} /> */}\n                      {/* TODO: Link to user */}\n                      <div className=\"bg-white rounded-full p-1 justify-center items-center\">\n                        <img\n                          src={PursuitIcon}\n                          alt=\"Project 1591 pursuit icon\"\n                          title=\"Staff contribution\"\n                          className=\"w-6\"\n                        />\n                      </div>\n                    </div>\n                  )}\n                  {showAwardOptions && (\n                    <Dropdown\n                      isClearable={\n                        !staffSource || (status !== CaseStatus.Approved && status !== CaseStatus.Resubmitted)\n                      }\n                      // value={awardTypeOptions.find(x => x.value === data.award) || null}\n                      value={\n                        !staffSource\n                          ? awardTypeOptions.find(x => x.value === data.award) || null\n                          : // : awardTypeOptions.find(x => x.value === AwardTypes.NoPoints) || null\n                            { label: 'Staff Contribution', value: null } || null\n                      }\n                      // value={AwardTypes.NoPoints}\n                      onChange={option => {\n                        if (!option) {\n                          return setAwardOption({ id: data.id, value: null });\n                        }\n                        return setAwardOption({ id: data.id, value: option.value });\n                      }}\n                      width=\"w-full\"\n                      options={awardTypeOptions}\n                      // disabled\n                      disabled={\n                        staffSource ||\n                        ((status === CaseStatus.Approved || status === CaseStatus.Resubmitted) &&\n                          initialAward !== AwardTypes.NoPoints &&\n                          initialAward !== null)\n                      }\n                    />\n                  )}\n                  <button onClick={toggleExpanded} type=\"button\" className=\"focus:outline-none ml-3 mr-1 p0 text-white\">\n                    {!hideExpand && expandArrow}\n                  </button>\n                </div>\n              </div>\n              {actions}\n            </div>\n            {stepContent}\n          </div>\n          {showCheckboxes && (\n            <TextField\n              noRounded\n              noFullFieldWidth\n              fieldWidth=\"w-5\"\n              fieldHeight=\"h-5\"\n              width=\"w-5\"\n              type=\"checkbox\"\n              onChange={e => {\n                toggleCheckbox({ isChecked: e.target.checked, source: data });\n              }}\n              className=\"mt-6 ml-2 mr-4 lg:mr-1 md:ml-0\"\n              checked={isChecked}\n            />\n          )}\n        </div>\n      </div>\n      {/* <code>{JSON.stringify(data)}</code> */}\n    </>\n  );\n};\n\nexport default ReviewStep;\n","import React, { useState, useEffect } from 'react';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport HeaderText from '../HeaderText';\nimport Button from '../Button';\nimport Container from '../Container';\nimport ReviewStep from '../ReviewStep';\n\nimport { getCasesByNo } from '../../generated/graphql/queries';\n\nconst PickSourcesModal = ({ checkedSources, setCheckedSources, linkedCases, onCancel, onConfirm, loading }) => {\n  const [sources, setSources] = useState([]);\n\n  useEffect(() => {\n    getSources();\n  }, []);\n\n  useEffect(() => {\n    if (sources.length > 0) {\n      renderSteps();\n    }\n  }, [sources]);\n\n  const getSources = async () => {\n    let sourcesArr = [];\n    const params = { caseNoList: JSON.stringify(linkedCases) };\n    const {\n      data: { getCasesByNo: cases },\n    } = await API.graphql(graphqlOperation(getCasesByNo, params));\n\n    // make array of sources\n    cases.forEach(item => {\n      sourcesArr = [...sourcesArr, ...item.webSources];\n    });\n\n    // pass into renderSteps\n    setSources(sourcesArr);\n  };\n\n  const toggleCheckbox = input => {\n    if (input.isChecked) {\n      setCheckedSources([...checkedSources, input.source.id]);\n    } else {\n      setCheckedSources([...checkedSources.filter(src => src !== input.source.id)]);\n    }\n  };\n\n  const renderSteps = () => {\n    const steps = [];\n\n    sources.forEach(source => {\n      steps.push({\n        title: source.website ? source.website : '[no source type selected]',\n        body: source,\n        id: source.id,\n      });\n    });\n\n    return steps.map((data, idx) => {\n      const isChecked = checkedSources.find(elem => elem === data.id);\n\n      return (\n        <ReviewStep\n          key={`Source_${data.id}`}\n          data={data}\n          index={idx}\n          numSteps={steps.length}\n          isLast={idx === steps.length - 1}\n          forceExpanded\n          noSwaps\n          showAwardOptions={false}\n          showCheckboxes\n          toggleCheckbox={toggleCheckbox}\n          isChecked={isChecked}\n          hideReview\n        />\n      );\n    });\n  };\n\n  return (\n    <Container\n      grayedBackground\n      height=\"lg:h-168\"\n      width=\"w-full\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col justify-between\"\n      margin=\"mx-3 md:mx-12 lg:mx-auto\"\n    >\n      <center>\n        <HeaderText noBold className=\"text-2xl lg:text-3xl\">\n          Choose sources to be included in PDF.\n        </HeaderText>\n      </center>\n      <div className=\"overflow-auto\">{renderSteps()}</div>\n\n      <div className=\"flex justify-end mt-8\">\n        <Button linedBlue noPadding className=\"px-3 mr-6 min-w-20 lg:min-w-24\" onClick={onCancel}>\n          CANCEL\n        </Button>\n\n        <Button\n          solidBlue\n          noPadding\n          className=\"px-3 min-w-20 lg:min-w-24\"\n          onClick={() => {\n            onConfirm();\n          }}\n          loading={loading}\n        >\n          SAVE COMBINED SOURCES\n        </Button>\n      </div>\n    </Container>\n  );\n};\n\nexport default PickSourcesModal;\n","const createImage = url =>\n  new Promise((resolve, reject) => {\n    const image = new Image();\n\n    image.addEventListener('load', () => resolve(image));\n    image.addEventListener('error', error => reject(error));\n    image.setAttribute('crossOrigin', 'anonymous'); // needed to avoid cross-origin issues on CodeSandbox\n    image.src = url;\n  });\n\nfunction getRadianAngle(degreeValue) {\n  return (degreeValue * Math.PI) / 180;\n}\n\n/**\n * This function was adapted from the one in the ReadMe of https://github.com/DominicTobias/react-image-crop\n * @param {File} image - Image File url\n * @param {Object} pixelCrop - pixelCrop Object provided by react-easy-crop\n * @param {number} rotation - optional rotation parameter\n */\nexport default async function getCroppedImg(imageSrc, pixelCrop, rotation = 0, filename) {\n  const image = await createImage(imageSrc);\n  const canvas = document.createElement('canvas');\n  const ctx = canvas.getContext('2d');\n\n  const maxSize = Math.max(image.width, image.height);\n  const safeArea = 2 * ((maxSize / 2) * Math.sqrt(2));\n\n  // set each dimensions to double largest dimension to allow for a safe area for the\n  // image to rotate in without being clipped by canvas context\n  canvas.width = safeArea;\n  canvas.height = safeArea;\n\n  // translate canvas context to a central location on image to allow rotating around the center.\n  ctx.translate(safeArea / 2, safeArea / 2);\n  ctx.rotate(getRadianAngle(rotation));\n  ctx.translate(-safeArea / 2, -safeArea / 2);\n\n  // draw rotated image and store data.\n  ctx.drawImage(image, safeArea / 2 - image.width * 0.5, safeArea / 2 - image.height * 0.5);\n  const data = ctx.getImageData(0, 0, safeArea, safeArea);\n\n  // set canvas width to final desired crop size - this will clear existing context\n  canvas.width = pixelCrop.width;\n  canvas.height = pixelCrop.height;\n\n  // paste generated rotate image with correct offsets for x,y crop values.\n  ctx.putImageData(\n    data,\n    0 - safeArea / 2 + image.width * 0.5 - pixelCrop.x,\n    0 - safeArea / 2 + image.height * 0.5 - pixelCrop.y\n  );\n\n  // As Base64 string\n  const dataurl = canvas.toDataURL('image/png');\n  const arr = dataurl.split(',');\n  const bstr = atob(arr[1]);\n  let n = bstr.length;\n  const u8arr = new Uint8Array(n);\n\n  while (n--) {\n    u8arr[n] = bstr.charCodeAt(n);\n  }\n\n  const file = new File([u8arr], filename, { type: 'image/png' });\n  const blob = await getBlob(canvas);\n\n  return { file, blob };\n}\n\nfunction getBlob(canvas) {\n  return new Promise(resolve => {\n    canvas.toBlob(img => {\n      resolve(URL.createObjectURL(img));\n    }, 'image/png');\n  });\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport Cropper from 'react-easy-crop';\nimport * as Icons from 'react-icons/fa';\nimport { API, graphqlOperation, Storage } from 'aws-amplify';\nimport Button from '../Button';\nimport { setCasePhoto } from '../../generated/graphql/mutations';\nimport imageCropHelper from '../../helpers/PhotoEditing/imageCropper';\nimport Spinner from '../Spinner';\nimport PopUpConfirmation from '../PopupConfirmation';\n\nconst ReportPhotoPicker = ({ caseId, photoId, s3Key, setCaseState }) => {\n  const inputField = useRef(null);\n\n  const [loading, setLoading] = useState('');\n  const [showRemove, setShowRemove] = useState(false);\n  const [removing, setRemoving] = useState(false);\n\n  const [croppingPhoto, setCroppingPhoto] = useState(false);\n  const [existingPhotoUrl, setExistingPhotoUrl] = useState('');\n  const [photoUrl, setPhotoUrl] = useState('');\n\n  const [crop, setCrop] = useState({ x: 0, y: 0 });\n  const [zoom, setZoom] = useState(1);\n\n  const [croppedPhotoUrl, setCroppedPhotoUrl] = useState('');\n  const [croppedPhoto, setCroppedPhoto] = useState(null);\n\n  const placeholderImage = 'https://dummyimage.com/300x300/000/fff';\n\n  useEffect(() => {\n    const getPhotoUrl = async () => {\n      const photo = await Storage.get(s3Key, {\n        level: 'public',\n        customPrefix: {\n          public: '',\n        },\n      });\n\n      setExistingPhotoUrl(photo);\n    };\n\n    if (s3Key) {\n      getPhotoUrl();\n    }\n  }, [s3Key]);\n\n  const renderImage = () => {\n    if (s3Key && !existingPhotoUrl) {\n      return (\n        <div style={{ height: 300, width: 300 }} className=\"flex justify-center items-center\">\n          <Spinner />\n        </div>\n      );\n    }\n\n    return (\n      <img\n        src={croppedPhotoUrl || existingPhotoUrl || placeholderImage}\n        alt={`case report ${photoId}`}\n        height=\"300\"\n        width=\"300\"\n        className=\"contain\"\n      />\n    );\n  };\n\n  const choosePhoto = () => {\n    inputField.current.click();\n  };\n\n  const clearPhoto = () => {\n    setPhotoUrl(null);\n    setCroppingPhoto(false);\n    setCroppedPhotoUrl(null);\n    setCroppedPhoto(null);\n    setCrop({ x: 0, y: 0 });\n    setZoom(1);\n  };\n\n  const onPhotoSelected = event => {\n    const url = window.URL.createObjectURL(event.target.files[0]);\n\n    setPhotoUrl(url);\n    setCroppingPhoto(true);\n  };\n\n  const validateAndUpload = async () => {\n    setLoading(true);\n\n    try {\n      if (croppedPhoto) {\n        const result = await Storage.put(`case_photos/${caseId}/${photoId}.png`, croppedPhoto, {\n          level: 'public',\n          contentType: 'image/png',\n          customPrefix: { public: '' },\n        });\n\n        if (result && result.key) {\n          saveCasePhoto(result.key);\n        }\n      }\n    } catch (error) {\n      console.log('ERROR UPLOADING PHOTO...', error);\n\n      setLoading(false);\n    }\n  };\n\n  const saveCasePhoto = async photoKey => {\n    const params = { input: { id: caseId, photoId, s3Key: photoKey } };\n\n    const {\n      data: { setCasePhoto: res },\n    } = await API.graphql(graphqlOperation(setCasePhoto, params));\n\n    if (photoKey) {\n      const newPhoto = await Storage.get(s3Key, {\n        level: 'public',\n        customPrefix: {\n          public: '',\n        },\n      });\n\n      setExistingPhotoUrl(newPhoto);\n    } else {\n      setExistingPhotoUrl(null);\n    }\n\n    setLoading(false);\n    clearPhoto();\n    setCaseState(res);\n  };\n\n  const deletePhoto = async () => {\n    try {\n      await Storage.remove(s3Key, {\n        level: 'public',\n        contentType: 'image/png',\n        customPrefix: { public: '' },\n      });\n\n      await saveCasePhoto('');\n\n      setRemoving(false);\n      setShowRemove(false);\n    } catch (error) {\n      console.log('Error deleting photo: ', error);\n    }\n  };\n\n  const onCropChange = newCrop => {\n    setCrop(newCrop);\n  };\n\n  const onZoomChange = newZoom => {\n    setZoom(newZoom);\n  };\n\n  const onCropComplete = async (croppedArea, croppedAreaPixels) => {\n    const croppedImage = await imageCropHelper(photoUrl, croppedAreaPixels, 0);\n\n    setCroppedPhotoUrl(croppedImage.blob);\n    setCroppedPhoto(croppedImage.file);\n  };\n\n  return (\n    <div className=\"m-4 flex flex-col justify-center items-center mr-4\">\n      <div className=\"flex justify-center items-center relative\" style={{ width: 300, height: 300 }}>\n        {croppingPhoto && photoUrl ? (\n          <Cropper\n            maxZoom={100}\n            image={photoUrl}\n            crop={crop}\n            zoom={zoom}\n            aspect={1}\n            cropShape=\"rect\"\n            cropSize={{ width: 300, height: 300 }}\n            onCropChange={onCropChange}\n            onCropComplete={onCropComplete}\n            onZoomChange={onZoomChange}\n          />\n        ) : (\n          renderImage()\n        )}\n      </div>\n\n      <div className=\"flex flex-row mt-4\" style={{ width: 300 }}>\n        {!croppingPhoto ? (\n          <>\n            <Button linedBlue onClick={choosePhoto} className={`w-full text-base ${existingPhotoUrl ? 'mr-2' : ''}`}>\n              SELECT &nbsp;\n              <Icons.FaImages />\n            </Button>\n\n            {existingPhotoUrl ? (\n              <Button linedRed onClick={() => setShowRemove(true)} className=\"w-full text-base ml-2\">\n                REMOVE &nbsp;\n                <Icons.FaTrash />\n              </Button>\n            ) : null}\n          </>\n        ) : (\n          <>\n            <Button linedBlue onClick={validateAndUpload} className=\"w-full text-base mr-2\" loading={loading}>\n              {loading ? 'SAVING' : 'SAVE'} &nbsp;\n              {!loading && <Icons.FaSave />}\n            </Button>\n\n            <Button\n              linedRed\n              onClick={() => {\n                clearPhoto();\n              }}\n              className=\"w-full text-base ml-2\"\n            >\n              CANCEL &nbsp;\n              <Icons.FaBan />\n            </Button>\n          </>\n        )}\n\n        <input type=\"file\" className=\"hidden\" onChange={onPhotoSelected} accept=\"image/*\" ref={inputField} />\n      </div>\n\n      {photoUrl ? <div /> : null}\n\n      {showRemove ? (\n        <PopUpConfirmation\n          title=\"Remove Photo\"\n          content={<div>Are you sure you want to remove this photo?</div>}\n          onConfirm={() => {\n            setRemoving(true);\n            deletePhoto();\n          }}\n          onCancel={() => {\n            setShowRemove(false);\n          }}\n          destructive\n          confirmText=\"REMOVE\"\n          className=\"w-11/12 lg:w-auto\"\n          confirmLoading={removing}\n          confirmLoadingText=\"REMOVING\"\n        />\n      ) : null}\n    </div>\n  );\n};\n\nexport default ReportPhotoPicker;\n","import React, { useState, useEffect, useContext, useRef } from 'react';\nimport * as Icons from 'react-icons/fa';\nimport ReactTagInput from '@pathofdev/react-tag-input';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { toast } from 'react-toastify';\nimport { FaCheck } from 'react-icons/fa';\nimport '@pathofdev/react-tag-input/build/index.css';\nimport Button from '../Button';\nimport {\n  emailCaseFile,\n  mergeCases,\n  updateMergedCaseSources,\n  removeFromMergedCase,\n  setCaseReportBreakpoints,\n  generateReportPdf,\n  adminDownloadCase,\n} from '../../generated/graphql/mutations';\nimport { getMergedCase, getCasesByNo } from '../../generated/graphql/queries';\nimport { NotificationContext } from '../../helpers/AlertContext/AlertContext';\nimport PickSourcesModal from '../PickSourcesModal';\nimport Spinner from '../Spinner';\nimport PopUpConfirmation from '../PopupConfirmation';\nimport { emailValidator } from '../../helpers/createAccount/fieldValidation';\nimport TextField from '../TextField';\nimport ReportPhotoPicker from './photoPicker';\nimport { ESCORT_AD } from '../../constants';\n\nconst ReportBuilder = ({ id, caseState, setCaseState }) => {\n  const caseInput = useRef();\n  const [, setAlert] = useContext(NotificationContext);\n\n  const [linkedCases, setLinkedCases] = useState([]);\n  const [initialLinkedCases, setInitialLinkedCases] = useState([]);\n\n  const [initialCheckedSources, setInitialCheckedSources] = useState([]);\n  const [checkedSources, setCheckedSources] = useState([]);\n  const [pickSourcesReady, setPickSourcesReady] = useState(false);\n  const [selectedSharedSources, setSelectedSharedSources] = useState([]);\n  const [selectedBreakpoints, setSelectedBreakpoints] = useState(caseState.breakpoints || []);\n  const [savingBreakpoints, setSavingBreakpoints] = useState(false);\n\n  const [showLinkedConfirmation, setShowLinkedConfirmation] = useState(false);\n\n  const [loading, setLoading] = useState(false);\n  const [generatingPDF, setGeneratingPDF] = useState(false);\n  const [downloading, setDownloading] = useState(false);\n\n  const [shareReady, setShareReady] = useState(false);\n  const [sharing, setSharing] = useState(false);\n  const [shareEmail, setShareEmail] = useState('');\n\n  useEffect(() => {\n    getLinkedCases();\n  }, [id]);\n\n  const getLinkedCases = async () => {\n    if (caseState.mergedParentId) {\n      const {\n        data: { getMergedCase: res },\n      } = await API.graphql(graphqlOperation(getMergedCase, { id: caseState.mergedParentId }));\n\n      const filteredRes = res.caseNumbers.filter(item => item !== caseState.sequentialNumber);\n\n      setInitialCheckedSources(res.sources);\n      setCheckedSources(res.sources);\n      setInitialLinkedCases(filteredRes);\n      setLinkedCases(filteredRes);\n\n      getSharedSources(res.caseNumbers, res.sources);\n    }\n  };\n\n  const updateLinkedCases = async () => {\n    setLoading(true);\n\n    try {\n      const delArr = [];\n\n      initialLinkedCases.forEach(item => {\n        if (!linkedCases.includes(item)) {\n          delArr.push(item);\n        }\n      });\n\n      for (const item of delArr) {\n        const delParams = { input: { mergedParentId: caseState.mergedParentId, caseNumber: item } };\n\n        await API.graphql(graphqlOperation(removeFromMergedCase, delParams));\n      }\n\n      if (linkedCases.length > 0) {\n        const caseIdsToAdd = [...linkedCases].filter(x => x);\n\n        // mergeCases\n        const mergeParams = { input: { sources: [], caseIds: [...caseIdsToAdd, caseState.caseNumber] } };\n        let res = await API.graphql(graphqlOperation(mergeCases, mergeParams));\n\n        setCaseState({ ...caseState, mergedParentId: res.data.mergeCases.mergedParentId });\n\n        res = res.data.mergeCases.sortedCaseNumbers.filter(item => item !== caseState.sequentialNumber);\n\n        // setCaseState mergedParentId\n        setLinkedCases(res);\n        setInitialLinkedCases(res);\n      } else {\n        setLinkedCases([]);\n        setInitialLinkedCases([]);\n      }\n\n      toast.success('Successfully Saved', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <FaCheck size={18} className=\"text-white\" />,\n      });\n\n      setShowLinkedConfirmation(false);\n    } catch (error) {\n      const errorMessage =\n        'An error occurred attempting to link cases. Only Approved, Submitted, or Resubmitted cases can be linked.';\n\n      console.error('Error linking cases: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: errorMessage,\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n    setLoading(false);\n  };\n\n  const getSharedSources = async (currentlyLinkedCases, currentlyCheckedSources) => {\n    let sourcesArr = [];\n    const params = { caseNoList: JSON.stringify(currentlyLinkedCases) };\n\n    const {\n      data: { getCasesByNo: cases },\n    } = await API.graphql(graphqlOperation(getCasesByNo, params));\n\n    // make array of sources\n    cases.forEach(item => {\n      sourcesArr = [...sourcesArr, ...item.webSources];\n    });\n\n    const selectedSharedSourcesArr = sourcesArr.filter(x => currentlyCheckedSources.includes(x.id));\n\n    setSelectedSharedSources(selectedSharedSourcesArr);\n  };\n\n  const onConfirm = async () => {\n    setLoading(true);\n    // save sources\n    const params = { input: { sources: JSON.stringify(checkedSources), mergedParentId: caseState.mergedParentId } };\n\n    await API.graphql(graphqlOperation(updateMergedCaseSources, params));\n\n    setLoading(false);\n    setPickSourcesReady(false);\n\n    getLinkedCases();\n  };\n\n  const sharePDF = async () => {\n    try {\n      setSharing(true);\n\n      const isValidEmail = emailValidator(setAlert, shareEmail);\n\n      if (!isValidEmail) {\n        return;\n      }\n\n      await API.graphql(\n        graphqlOperation(emailCaseFile, {\n          email: shareEmail,\n          caseId: id,\n        })\n      );\n\n      toast.success('Case File Shared', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n\n      setShareEmail('');\n      setShareReady(false);\n    } catch (error) {\n      console.error('Error sharing file: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'An error occurred attempting to share the case',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setSharing(false);\n  };\n\n  const generatePDF = async () => {\n    try {\n      setGeneratingPDF(true);\n\n      const {\n        data: { generateReportPdf: reportKey },\n      } = await API.graphql(\n        graphqlOperation(generateReportPdf, {\n          id,\n        })\n      );\n\n      setCaseState({ ...caseState, reportKey });\n\n      toast.success('PDF Generated', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n    } catch (error) {\n      console.error('Error generating pdf: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'An error occurred attempting to generate the PDF',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setGeneratingPDF(false);\n  };\n\n  const downloadCase = async () => {\n    try {\n      setDownloading(true);\n\n      const {\n        data: {\n          adminDownloadCase: { preSignedUrl },\n        },\n      } = await API.graphql({\n        query: adminDownloadCase,\n        variables: { input: { caseId: id } },\n        authMode: 'AWS_IAM',\n      });\n\n      setDownloading(false);\n\n      window.open(preSignedUrl, '_blank');\n    } catch (error) {\n      console.error('Error downloading case', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'An error occurred attempting to download the case report',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setDownloading(false);\n  };\n\n  const renderCaseImages = () => {\n    const { reportImages } = caseState;\n\n    let result = [];\n\n    if (reportImages) {\n      result = [...reportImages];\n    }\n\n    for (let i = 1; i <= 3; i++) {\n      const matchingIdx = result.findIndex(x => x.id === `Image${i}`);\n\n      if (matchingIdx === -1) {\n        result.push({ id: `Image${i}`, s3Key: null });\n      }\n    }\n\n    return result.map(x => (\n      <ReportPhotoPicker caseId={id} photoId={x.id} key={x.id} s3Key={x.s3Key} setCaseState={setCaseState} />\n    ));\n  };\n\n  const updateBreakpoint = (sourceId, checked) => {\n    const currentBreakpoints = [...selectedBreakpoints];\n\n    if (checked) {\n      if (!currentBreakpoints.find(x => x === sourceId)) {\n        currentBreakpoints.push(sourceId);\n      }\n    } else {\n      const matchingIdx = currentBreakpoints.findIndex(x => x === sourceId);\n\n      if (matchingIdx !== -1) {\n        currentBreakpoints.splice(matchingIdx, 1);\n      }\n    }\n\n    setSelectedBreakpoints(currentBreakpoints);\n  };\n\n  const renderReportBreakpoints = () => {\n    const { webSources, awardedPoints } = caseState;\n\n    const currentBreakpoints = [...selectedBreakpoints];\n\n    let webSourceSteps = webSources.map(x => ({\n      id: x.id,\n      title: `${x.website} (${x.url})`,\n      break: currentBreakpoints.find(y => x.id === y),\n    }));\n\n    webSourceSteps = webSourceSteps.filter(x => {\n      const match = awardedPoints.find(y => x.id === y.stepId);\n\n      if (match && match.awardType !== 'NO_POINTS') {\n        return true;\n      }\n\n      return false;\n    });\n\n    let steps = [\n      {\n        id: ESCORT_AD,\n        title: 'Escort Ad',\n        break: currentBreakpoints.find(x => x === ESCORT_AD),\n      },\n    ];\n\n    if (caseState.mergedParentId && selectedSharedSources && selectedSharedSources.length) {\n      const mappedSources = selectedSharedSources.map(x => ({\n        id: x.id,\n        title: `${x.website} (${x.url})`,\n        break: !!currentBreakpoints.find(y => x.id === y),\n      }));\n\n      steps = [...steps, ...mappedSources];\n    } else {\n      steps = [...steps, ...webSourceSteps];\n    }\n\n    return steps.map(x => (\n      <div className=\"flex flex-row mb-2\">\n        <TextField\n          noRounded\n          noFullFieldWidth\n          fieldWidth=\"w-5\"\n          fieldHeight=\"h-5\"\n          width=\"w-5\"\n          type=\"checkbox\"\n          checked={x.break}\n          onChange={e => {\n            updateBreakpoint(x.id, e.target.checked);\n          }}\n          className=\"mr-4 lg:mr-1\"\n        />\n        <span className=\"font-bold\">&nbsp; {x.title} &nbsp;</span>\n      </div>\n    ));\n  };\n\n  const saveBreakpoints = async () => {\n    try {\n      setSavingBreakpoints(true);\n\n      const {\n        data: { setCaseReportBreakpoints: res },\n      } = await API.graphql(\n        graphqlOperation(setCaseReportBreakpoints, {\n          input: {\n            id: caseState.id,\n            breakpoints: selectedBreakpoints,\n          },\n        })\n      );\n\n      setCaseState(res);\n    } catch (error) {\n      console.error('Error saving breakpoints: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error saving breakpoints',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setSavingBreakpoints(false);\n  };\n\n  return (\n    <>\n      <div className=\"mb-8\">\n        <h2 className=\"text-lg font-bold text-pursuit-gray\">Generate & Share Case Report</h2>\n        <div className=\"text-sm text-pursuit-gray\">\n          <p>\n            Share the case information by compiling it into a formal report to provide to the authorities. You may add\n            up to three photos to be included in the report. You may also combine source information from any linked\n            cases. You can also add page breaks between the steps and preview the PDF before finally sharing the\n            document with authorities. Be sure to seperately share MFA credentials with anyone who will need access.\n          </p>\n        </div>\n      </div>\n\n      {pickSourcesReady ? (\n        <PickSourcesModal\n          linkedCases={[...linkedCases, caseState.caseNumber]}\n          checkedSources={checkedSources}\n          setCheckedSources={setCheckedSources}\n          initialCheckedSources={initialCheckedSources}\n          loading={loading}\n          onConfirm={() => {\n            onConfirm();\n          }}\n          onCancel={() => {\n            setPickSourcesReady(false);\n          }}\n        />\n      ) : null}\n\n      <div className=\"py-4 mb-4 overflow-auto\">\n        <h2 className=\"mb-2 text-lg font-bold text-pursuit-gray\">Linked Cases</h2>\n        <div className=\"flex\">\n          <div className=\"flex-none\">\n            <ReactTagInput\n              tags={linkedCases}\n              onChange={newCases => {\n                setLinkedCases(newCases);\n              }}\n              ref={caseInput}\n              placeholder=\"____-____\"\n            />\n          </div>\n          <div className=\"flex items-center\">\n            <Button\n              height=\"h-8\"\n              className=\"flex items-center justify-center w-12 ml-4 border-guardian-darkblue border\"\n              onClick={() => {\n                caseInput.current.addTag(caseInput.current?.state?.input);\n              }}\n            >\n              <Icons.FaPlus />\n            </Button>\n          </div>\n          <div className=\"flex-grow\" />\n        </div>\n\n        <div className=\"flex flex-row w-120\">\n          <Button\n            solidBlue\n            height=\"h-10 w-40 mt-4\"\n            className=\"flex items-center justify-center\"\n            onClick={() => {\n              setShowLinkedConfirmation(true);\n            }}\n            disabled={linkedCases.length === 0 && initialLinkedCases.length === 0}\n          >\n            {loading ? <Spinner className=\"h-5\" /> : 'SAVE LINKED CASES'}\n          </Button>\n\n          <Button\n            linedBlue\n            height=\"h-10 mt-4 w-56 ml-4\"\n            className=\"flex items-center justify-center\"\n            onClick={() => {\n              setPickSourcesReady(true);\n            }}\n            disabled={linkedCases.length === 0}\n          >\n            {loading ? <Spinner className=\"h-5\" /> : 'CHOOSE SHARED SOURCES'}\n          </Button>\n        </div>\n      </div>\n\n      <div className=\"mb-8\">\n        <h2 className=\"text-lg font-bold text-pursuit-gray\">Report Images</h2>\n        <p>You can zoom and shift the image, cropping to the desired size and shape.</p>\n        <div className=\"flex flex-wrap w-full justify-center\">{renderCaseImages()}</div>\n      </div>\n\n      {/* Remove manual breakpoints in favor of auto-generated ones \n      <div className=\"mb-8\">\n        <h2 className=\"text-lg font-bold text-pursuit-gray\">Report Breakpoints</h2>\n\n        <div className=\"flex flex-col mt-4\">\n          <p className=\"mb-4\">\n            Check which sources should include a page break immedietly <span className=\"font-bold\">after</span> the step\n            in the final report\n          </p>\n          <div className=\"mx-2 mb-4\">{renderReportBreakpoints()}</div>\n\n          <Button linedBlue onClick={saveBreakpoints} className=\"w-full text-base lg:w-48\" loading={savingBreakpoints}>\n            SAVE BREAKPOINTS\n          </Button>\n        </div>\n      </div> */}\n\n      {caseState.approvedAt ? (\n        <div className=\"flex flex-row justify-end mt-12\">\n          <Button\n            solidBlue\n            onClick={generatePDF}\n            className=\"w-full mt-4 text-base lg:mt-0 lg:w-64\"\n            loading={generatingPDF}\n          >\n            {generatingPDF ? 'GENERATING' : 'GENERATE'} PDF\n          </Button>\n        </div>\n      ) : (\n        <p className=\"mt-8\">Case must be approved before generating the report PDF</p>\n      )}\n\n      <div className=\"flex flex-row justify-end mt-6\">\n        {caseState.reportKey ? (\n          <>\n            <Button\n              linedBlue\n              onClick={() => setShareReady(true)}\n              className=\"w-full mr-1 text-base lg:mr-0 lg:mt-0 lg:w-64\"\n            >\n              SHARE PDF\n            </Button>\n\n            <Button\n              linedBlue\n              onClick={() => downloadCase()}\n              className=\"w-full text-base ml-1 lg:w-64 lg:ml-6\"\n              loading={downloading}\n            >\n              DOWNLOAD PDF\n            </Button>\n          </>\n        ) : null}\n      </div>\n\n      {shareReady ? (\n        <PopUpConfirmation\n          title=\"Share Case File\"\n          content={\n            <div className=\"flex-col justify-center\">\n              <div>Share Case File with:</div>\n              <div>\n                <input\n                  type=\"text\"\n                  value={shareEmail}\n                  onChange={event => setShareEmail(event.target.value)}\n                  placeholder=\"Email\"\n                  className=\"w-full h-10 px-4 mt-2 mb-4 bg-gray-100 lg:mb-0 lg:mt-0 lg:mr-4 lg:w-80\"\n                />\n              </div>\n            </div>\n          }\n          onCancel={() => setShareReady(false)}\n          onConfirm={() => sharePDF()}\n          confirmText=\"SEND\"\n          confirmLoading={sharing}\n          confirmLoadingText=\"SENDING\"\n          className=\"w-11/12 lg:w-auto\"\n        />\n      ) : null}\n\n      {showLinkedConfirmation ? (\n        <PopUpConfirmation\n          title=\"Link Cases\"\n          content={\n            <div>\n              Linking cases will allow you to generate a PDF report using the combined information from multiple cases.\n              When generating the PDF, you may select any of the approved additional sources from the other linked cases\n              to include in the final report. However, the Personal Details and Escort Ad information cannot be\n              combined. The final report will only include that data from the case used to create the PDF. The\n              information from the other linked cases will be available in the report appendix.\n              <br />\n              <br />\n              Unlinking a case will make its sources no longer be included when generating the PDF. After unlinking,\n              press \"GENERATE PDF\" to update the PDF.\n              <br />\n              <br />\n              Are you sure you want to save these changes?\n            </div>\n          }\n          onConfirm={() => {\n            updateLinkedCases();\n          }}\n          onCancel={() => {\n            setShowLinkedConfirmation(false);\n          }}\n          confirmText=\"CONFIRM\"\n          className=\"w-11/12 lg:w-auto\"\n        />\n      ) : null}\n    </>\n  );\n};\n\nexport default ReportBuilder;\n","import React, { useCallback, useEffect } from 'react';\nimport ReviewStep from '../ReviewStep';\nimport Dropdown from '../DropDown';\nimport { AwardClassificationOptions, CaseStatus, ESCORT_AD } from '../../constants';\nimport '@pathofdev/react-tag-input/build/index.css';\nimport PointBreakdown from '../PointBreakdown';\nimport VerticalSorter from '../VerticalSorter';\nimport TrashIcon from '../../assets/Images/trash.svg';\nimport { compileSteps } from './compileSteps';\nimport EditIcon from '../../assets/Images/edit.svg';\nimport PopUpConfirmation from '../PopupConfirmation';\nimport InvestigatorNotes from '../InvestigatorNotes';\nimport { v4 as uuidv4 } from 'uuid';\nimport { usesOldEscortAdFormat } from '../../helpers/caseForms/utilHelpers';\n\nimport { DndContext, closestCenter, KeyboardSensor, PointerSensor, useSensor, useSensors } from '@dnd-kit/core';\nimport {\n  arrayMove,\n  SortableContext,\n  sortableKeyboardCoordinates,\n  verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { SortableItem } from '../SortableItem';\nimport Button from '../Button';\nimport * as Icons from 'react-icons/fa';\n\nconst awardClassificationOptions = [\n  { label: 'Underage 18 <', value: AwardClassificationOptions.Underage },\n  { label: 'Adult >', value: AwardClassificationOptions.Adult },\n  { label: 'Unknown', value: AwardClassificationOptions.Unknown },\n];\n\nconst ReviewForm = ({ caseState: state, setCaseState: setState, stepActions = null, editAction = id => {} }) => {\n  const [compiledSteps, setCompiledSteps] = React.useState([]);\n  const [caseState, setCaseState] = React.useState(state);\n  const [showStaffDelete, setShowStaffDelete] = React.useState(null);\n  const [showReorderSection, setShowReorderSection] = React.useState(false);\n  const [expandAll, setExpandAll] = React.useState(false);\n\n  // const [items, setItems] = React.useState([1, 2, 3]);\n  const sensors = useSensors(\n    useSensor(PointerSensor),\n    useSensor(KeyboardSensor, {\n      coordinateGetter: sortableKeyboardCoordinates,\n    })\n  );\n\n  // Add extra css class if comment content is too long\n  useEffect(() => {\n    const content = document.getElementById('comment-wrap');\n    if (content) {\n      // console.log({ content });\n      const lineHeight = parseFloat(getComputedStyle(content).lineHeight);\n      const maxLines = 4;\n      const maxHeight = lineHeight * maxLines;\n\n      if (content.scrollHeight > maxHeight) {\n        content.classList.add('exceeds-length');\n      } else {\n        content.classList.remove('exceeds-length');\n      }\n    }\n    // const step1Content = document.getElementById('step-1-description');\n    // if (step1Content) {\n    //   const lineHeight = parseFloat(getComputedStyle(step1Content).lineHeight);\n    //   const maxLines = 3;\n    //   const maxHeight = lineHeight * maxLines;\n    //   console.log('Step 1 content', { lineHeight, maxLines, maxHeight, scrollHeight: step1Content.scrollHeight });\n    //   if (step1Content.scrollHeight > maxHeight) {\n    //     step1Content.classList.add('exceeds-length');\n    //   } else {\n    //     step1Content.classList.remove('exceeds-length');\n    //   }\n    // }\n  }, [caseState]);\n\n  const handleDragEnd = event => {\n    const { active, over, ...rest } = event;\n    console.log({ active, over, rest });\n    if (active.id !== over.id) {\n      // Don't do anything if the item is not a escort ad and is replacing a escort ad\n      const overIndex = over.data.current.sortable.index;\n      const activeIndex = active.data.current.sortable.index;\n      const { items } = over.data.current.sortable;\n      const secondItem = compiledSteps[1];\n      const secondIsEscortAd = secondItem?.title === 'Escort Ad';\n      const activeItem = compiledSteps.find(({ id }) => id === active.id);\n      console.log({ overIndex, activeItem });\n      if (activeItem.title !== 'Escort Ad' && overIndex === 0) {\n        console.log('Can not replace the escort ad');\n        return;\n      }\n      if (activeIndex === 0 && !secondIsEscortAd) {\n        console.log('Can not move ad if second item is not ad');\n        return;\n      }\n      // setCompiledSteps(items => {\n      //   // console.log({ items, active, over });\n      //   const oldIndex = items.findIndex(({ id }) => id === active.id);\n      //   const newIndex = items.findIndex(({ id }) => id === over.id);\n      //   const newItems = arrayMove(items, oldIndex, newIndex);\n      //   const sourceOrder = newItems.map(({ id }) => id);\n      //   console.log({ sourceOrder });\n      //   // setCaseState({ ...caseState, sourceOrder });\n      //   return newItems;\n      // });\n      // console.log({ items, active, over });\n      const oldIndex = compiledSteps.findIndex(({ id }) => id === active.id);\n      const newIndex = compiledSteps.findIndex(({ id }) => id === over.id);\n      const newItems = arrayMove(compiledSteps, oldIndex, newIndex);\n      const sourceOrder = newItems.map(({ id }) => id);\n      const [firstSource, ...otherSources] = newItems;\n      console.log({ newItems, sourceOrder, firstSource });\n      const { uniqueFields = {} } = firstSource.body;\n      const { adLocation = null } = uniqueFields;\n      let { city, state } = caseState;\n      if (adLocation) {\n        [city, state] = adLocation.split(', ');\n      }\n\n      const newCaseState = JSON.parse(JSON.stringify({ ...caseState, city, state, sourceOrder }));\n      // return Promise.all([setCompiledSteps(newItems), setCaseState(newCaseState)]);\n      // setCompiledSteps(newItems);\n      setCaseState(newCaseState);\n      // setCompiledSteps(newItems);\n      // return newItems;\n    }\n  };\n\n  useEffect(() => {\n    console.log('Case state changed', { caseState });\n    setState(caseState);\n  }, [caseState, setState]);\n\n  const toggleExpandAll = () => setExpandAll(!expandAll);\n\n  // const hideStaffDelete = () => {\n  //   showStaffDelete(null);\n  // };\n\n  // const deleteSelectedStaffSource = useCallback(() => {\n  //   console.log({ showStaffDelete });\n  // }, [showStaffDelete]);\n\n  const setFeedback = useCallback(\n    ({ id, value }) => {\n      const feedbackArray = caseState.feedbackComments ? [...caseState.feedbackComments] : [];\n\n      const existingFeedbackIndex = feedbackArray.findIndex(x => x.stepId === id);\n\n      if (existingFeedbackIndex === -1) {\n        feedbackArray.push({\n          stepId: id,\n          feedback: value,\n        });\n      } else {\n        const updatedFeedback = {\n          ...feedbackArray[existingFeedbackIndex],\n          feedback: value,\n        };\n\n        feedbackArray[existingFeedbackIndex] = updatedFeedback;\n      }\n\n      setCaseState({ ...caseState, feedbackComments: feedbackArray });\n    },\n    [caseState, setCaseState]\n  );\n\n  const setAwardOption = useCallback(\n    ({ id, value }) => {\n      const awardArray = caseState.awardedPoints ? [...caseState.awardedPoints] : [];\n\n      const existingAwardIndex = awardArray.findIndex(x => x.stepId === id);\n\n      if (!value) {\n        if (existingAwardIndex !== -1) {\n          awardArray.splice(existingAwardIndex, 1);\n        }\n        setCaseState({ ...caseState, awardedPoints: awardArray });\n        return;\n      }\n\n      if (existingAwardIndex === -1) {\n        awardArray.push({\n          stepId: id,\n          awardType: value,\n        });\n      } else {\n        const updatedAwards = {\n          ...awardArray[existingAwardIndex],\n          awardType: value,\n        };\n\n        awardArray[existingAwardIndex] = updatedAwards;\n      }\n\n      setCaseState({ ...caseState, awardedPoints: awardArray });\n    },\n    [caseState, setCaseState]\n  );\n\n  const removeStaffSource = useCallback(\n    id => {\n      const { staffSources, awardedPoints } = caseState;\n      const updatedStaffSources = staffSources.filter(s => s.id !== id);\n      const updatedAwardedPoints = awardedPoints.filter(a => a.stepId !== id);\n\n      setCaseState({\n        ...caseState,\n        staffSources: updatedStaffSources,\n        awardedPoints: updatedAwardedPoints,\n      });\n    },\n    [caseState, setCaseState]\n  );\n  const moveWebStep = useCallback(\n    (index, direction, steps) => {\n      const performSwap = (arr, idx, dir) => {\n        const temp = arr[idx + dir];\n\n        arr[idx + dir] = arr[idx];\n        arr[idx] = temp;\n\n        return arr;\n      };\n\n      const stepIdToMove = steps[index].id;\n      const filteredSources = caseState.webSources.filter(Boolean);\n\n      if (Array.isArray(filteredSources) && filteredSources.length > 0) {\n        const webStepIndex = filteredSources.findIndex(({ id = null }) => id === stepIdToMove);\n        // const webStepIndex = index - 1;\n\n        // const updatedWebSources = performSwap([...caseState.webSources], index - 1, direction); // escort ad is idx 0, need to adjust\n        const updatedWebSources = performSwap([...filteredSources], webStepIndex, direction); // escort ad is idx 0, need to adjust\n\n        console.log({\n          index,\n          steps,\n          stepIdToMove,\n          webStepIndex,\n          webSources: caseState.webSources,\n          new: updatedWebSources,\n        });\n        // If not using the old escort ad format we need to update the city and state from the first web source\n        let { city, state } = caseState;\n        if (!usesOldEscortAdFormat(caseState)) {\n          const [firstSource, ...otherSources] = updatedWebSources;\n          const { uniqueFields } = firstSource;\n          const { adLocation } = uniqueFields;\n          if (adLocation) {\n            [city, state] = adLocation.split(', ');\n          }\n        }\n\n        setTimeout(() => {\n          setCaseState({ ...caseState, city, state, webSources: updatedWebSources });\n        }, 100);\n      } else {\n        console.log('No web sources');\n      }\n    },\n    [caseState, setCaseState]\n  );\n\n  const moveStaffStep = useCallback(\n    (index, direction, steps) => {\n      console.log({ index, direction, steps });\n      const directionStepId = steps[index + direction]?.id;\n      const myId = steps[index]?.id;\n\n      const { staffSources } = caseState;\n      const staffSourceIndex = staffSources.findIndex(({ id }) => id === myId);\n\n      console.log({\n        staffSourceIndex,\n        staffSources,\n        directionStepId,\n        index,\n        direction,\n        steps,\n      });\n      if (index + direction < 0) {\n        // or can we?\n        // Set the staff source previousSourceId to 0\n        staffSources[staffSourceIndex].previousSourceId = '0';\n        // Check if any steps are linked to this step and update their previousSourceId\n        const linkedSteps = staffSources.filter(s => s.previousSourceId === myId);\n        linkedSteps.forEach(s => {\n          s.previousSourceId = myId;\n        });\n        // console.log({ linkedSteps, staffSources });\n        console.log({ ...caseState, staffSources });\n        setCaseState({ ...caseState, staffSources });\n        // alert(\"Can't move staff step before the first volunteer step\");\n        return;\n      }\n      if (index + direction >= steps.length) {\n        alert(\"Can't move staff out of range\");\n        return;\n      }\n      if (index === 1 && direction === -2) {\n        alert(\"Can't replace first step\");\n        return;\n      }\n\n      if (staffSources[staffSourceIndex].id !== directionStepId) {\n        staffSources[staffSourceIndex].previousSourceId = directionStepId;\n        console.log({ staffSources });\n        setCaseState({ ...caseState, staffSources });\n      } else {\n        console.warn(\"Can't move staff step to self\");\n      }\n    },\n    [caseState, setCaseState]\n  );\n\n  const moveStep = useCallback(\n    (type, index, direction, steps) => {\n      if (type === 'web') {\n        // console.log({ type, index, direction, steps });\n        // If moving down (+1) and the next step is a staff, we need to move that\n        // staff step up (-1) so it can be anchored to a none staff step\n        if (/* index + direction >= steps.length - 1 && */ steps[index + direction].previousSourceId) {\n          // console.log('Custom move');\n          // moveStep('staff', index, direction * -1, steps);\n          moveStep('staff', index + direction, direction * -1, steps);\n          // Last item is a web and move to a replace a staff. Need to move the staff event down\n        } else {\n          // console.log('Web', { index, direction });\n          // If this web step has an attached staff step, move it down.\n          const attached = steps.find(s => s.previousSourceId === steps[index].id);\n\n          if (attached) {\n            console.log('Need to move sub staff event');\n          }\n\n          // moveStep('staff', index + direction, direction * -1, steps);\n          // }\n          moveWebStep(index, direction, steps);\n        }\n      } else if (type === 'staff') {\n        let move = direction;\n\n        if (direction > 0) {\n          // move++;\n        } else {\n          move--;\n        }\n        console.log('Staff', { index, move });\n        moveStaffStep(index, move, steps);\n      }\n    },\n    [moveStaffStep, moveWebStep]\n  );\n\n  // const swapAdStep = stepId => {\n  //   const [firstSource, ...otherSources] = caseState.webSources;\n  //   console.log({ stepId });\n  //   console.log('firstSource', firstSource);\n  //   if (stepId == undefined || stepId !== firstSource.id) {\n  //     console.log('Attempting to swap the wrong step');\n  //     return;\n  //   }\n\n  //   console.log({ caseState });\n  //   if (firstSource === undefined || firstSource.website !== 'Escort Ad') return;\n\n  //   const existingAd = caseState.escortAd;\n  //   let { city, state } = caseState;\n\n  //   // Convert the escort ad to a new source\n  //   const { description, url, phones } = existingAd;\n  //   const { number, type } = phones[0];\n  //   const newSource = {\n  //     // Create a new UUID\n  //     id: uuidv4(),\n  //     website: 'Escort Ad',\n  //     url,\n  //     description,\n  //     uniqueFields: {\n  //       phoneNumber: number,\n  //       phoneType: type,\n  //       adLocation: [city, state].filter(x => x).join(', '),\n  //     },\n  //   };\n  //   const { uniqueFields, id, website, ...restOfFirstSource } = firstSource;\n  //   const { adLocation, phoneNumber, phoneType } = uniqueFields;\n  //   if (adLocation) {\n  //     [city, state] = adLocation.split(', ');\n  //   }\n\n  //   // Convert the first source to the escort ad\n  //   const newEscortAd = {\n  //     ...restOfFirstSource,\n  //     phones: [\n  //       {\n  //         id: 'initial',\n  //         number: phoneNumber,\n  //         type: phoneType,\n  //       },\n  //     ],\n  //   };\n\n  //   // Update the case state\n  //   const newCaseState = {\n  //     ...caseState,\n  //     city,\n  //     state,\n  //     escortAd: newEscortAd,\n  //     webSources: [newSource, ...otherSources],\n  //   };\n  //   console.log('newCaseState', newCaseState);\n  //   setCaseState(newCaseState);\n  // };\n  // Copied from OrderStepForm\n  const swapAdStep = () => {\n    const [firstSource, secondSource, ...otherSources] = caseState.webSources;\n    const existingAd = caseState.escortAd;\n    // console.log({ caseState });\n    const usesOldFormat = usesOldEscortAdFormat(caseState);\n    console.log('firstSource', firstSource, caseState, usesOldFormat);\n    if (firstSource === undefined || firstSource.website !== 'Escort Ad') return;\n\n    let { city, state } = caseState;\n\n    if (!usesOldFormat) {\n      const { uniqueFields } = secondSource;\n      const { adLocation } = uniqueFields;\n      if (adLocation) {\n        [city, state] = adLocation.split(', ');\n      }\n      const updatedCase = { ...caseState, city, state, webSources: [secondSource, firstSource, ...otherSources] };\n      console.log({ updatedCase, uniqueFields, city, state });\n      setCaseState(updatedCase);\n      // swapSteps(0, 1);\n      return;\n    }\n\n    const { uniqueFields, id, website, ...restOfFirstSource } = firstSource;\n    const { adLocation, phoneNumber, phoneType } = uniqueFields;\n    if (adLocation) {\n      [city, state] = adLocation.split(', ');\n    }\n    // Convert the escort ad to a new source\n    const { description, url, phones } = existingAd;\n    const { number, type } = phones[0];\n    const newSource = {\n      // Create a new UUID\n      id: uuidv4(),\n      website: 'Escort Ad',\n      url,\n      description,\n      uniqueFields: {\n        phoneNumber: number,\n        phoneType: type,\n        adLocation: [city, state].filter(x => x).join(', '),\n      },\n    };\n\n    // Convert the first source to the escort ad\n    const newEscortAd = {\n      ...restOfFirstSource,\n      phones: [\n        {\n          id: 'initial',\n          number: phoneNumber,\n          type: phoneType,\n        },\n      ],\n    };\n\n    // Update the case state\n    const newCaseState = {\n      ...caseState,\n      city,\n      state,\n      escortAd: newEscortAd,\n      webSources: [newSource, secondSource, ...otherSources],\n    };\n    console.log('newCaseState', newCaseState);\n    setCaseState(newCaseState);\n  };\n\n  useEffect(() => {\n    const awards = caseState.awardedPoints ? [...caseState.awardedPoints] : [];\n    const feedback = caseState.feedbackComments ? [...caseState.feedbackComments] : [];\n    const steps = [];\n    // const steps = [\n    //   {\n    //     title: 'Escort Ad',\n    //     body: caseState.escortAd,\n    //     id: ESCORT_AD,\n    //     feedback: feedback.find(x => x.stepId === ESCORT_AD)?.feedback || '',\n    //     award: awards.find(x => x.stepId === ESCORT_AD)?.awardType || null,\n    //   },\n    // ];\n    const escortAdData = [\n      caseState.escortAd.url,\n      ...caseState.escortAd.phones.map(({ phone }) => phone),\n      caseState.escortAd.description,\n    ];\n    const escortAdEmpty = escortAdData.filter(Boolean).length === 0;\n    if (!escortAdEmpty) {\n      // steps.push(escortAdData);\n      steps.push({\n        title: 'Escort Ad',\n        body: caseState.escortAd,\n        id: ESCORT_AD,\n        feedback: feedback.find(x => x.stepId === ESCORT_AD)?.feedback || '',\n        award: awards.find(x => x.stepId === ESCORT_AD)?.awardType || null,\n      });\n    }\n\n    const webSources = caseState.webSources.map(source => ({\n      title: source.website ? source.website : '[no source type selected]',\n      body: source,\n      id: source.id,\n      feedback: feedback.find(x => x.stepId === source.id)?.feedback || '',\n      award: awards.find(x => x.stepId === source.id)?.awardType || null,\n    }));\n    const staffSources = caseState.staffSources\n      ? caseState.staffSources.map(ss => {\n          const { author, previousSourceId, ...commonFields } = ss;\n\n          return {\n            title: ss.website ? ss.website : '[no source type selected]',\n            body: commonFields,\n            previousSourceId,\n            author,\n            id: ss.id,\n            feedback: feedback.find(x => x.stepId === ss.id)?.feedback || '',\n            award: awards.find(x => x.stepId === ss.id)?.awardType || null,\n          };\n        })\n      : [];\n    const cs = compileSteps(steps, webSources, staffSources, caseState.sourceOrder);\n\n    // console.log({ cs });\n    setCompiledSteps(cs);\n  }, [caseState]);\n\n  // const reorderer = useCallback(() => {\n  //   if (!showReorderSection) {\n  //     return;\n  //   }\n  //   const reorderSection = (\n  //     <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n  //       <SortableContext items={compiledSteps} strategy={verticalListSortingStrategy}>\n  //         {/* {items.map(id => (\n  //           <SortableItem key={id} id={id} children={id} />\n  //         ))} */}\n  //         {compiledSteps.map((data, idx, arr) => (\n  //           <SortableItem key={data.id} id={data.id} children={`${data.id} ${data.title} - ${data.body.url}`} />\n  //         ))}\n  //       </SortableContext>\n  //     </DndContext>\n  //   );\n  //   return reorderSection;\n  // }, [compiledSteps, showReorderSection]);\n\n  const reOrderButton = (\n    <Button\n      solidBlue\n      padding=\"px-4 py-1\"\n      className=\"my-2 mr-8\"\n      onClick={() => setShowReorderSection(value => !value)} /* disabled={disableEdit} */\n    >\n      <span className=\"p-0 m-0 nowrap\" style={{ whiteSpace: 'nowrap' }}>\n        Reorder\n      </span>\n    </Button>\n  );\n\n  const renderSteps = useCallback(() => {\n    // const reorderSection = (\n    //   <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n    //   <SortableContext items={compiledSteps} strategy={verticalListSortingStrategy}>\n    //     {/* {items.map(id => (\n    //       <SortableItem key={id} id={id} children={id} />\n    //     ))} */}\n    //     {compiledSteps.map((data, idx, arr) => (\n    //       <SortableItem key={data.id} id={data.id} children={`${data.id} ${data.title} - ${data.body.url}`} />\n    //     ))}\n    //     </SortableContext>\n    //   </DndContext>\n    // )\n\n    // <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n    //   <SortableContext items={compiledSteps} strategy={verticalListSortingStrategy}>\n    //     {compiledSteps.map((data, idx, arr) => (\n    //       <SortableItem key={data.id} id={data.id} children={`${data.id} ${data.title} - ${data.body.url}`} />\n    //     ))}\n    return compiledSteps.map((data, idx, arr) => {\n      // // Allow swapping of step 2 and escort add if step is a escort ad type\n      // const allowEscortSwap = idx == 1 && data.id === ESCORT_AD;\n\n      // console.log({data, idx, arr})\n      const sorter = (\n        <VerticalSorter\n          up={\n            (arr.length > 2 && idx > 1) || // If there are more than 2 steps and this is not the first step allow moving up\n            (usesOldEscortAdFormat(caseState) && idx === 1 && 'Escort Ad' == data.title) || // If this is the second step and the first step is an escort ad allow moving up\n            (!usesOldEscortAdFormat(caseState) &&\n              arr[idx - 1]?.title === 'Escort Ad' &&\n              // !(idx === 1 && data.author) && // If this is the second step and not a staff source\n              true) // this is here to allow quick commenting out of the above line\n          }\n          // up={arr.length > 2 || (idx === 1 && 'Escort Ad' == data.title)}\n          down={\n            (idx > 0 && arr.length > 2 && idx < arr.length - 1) ||\n            (!usesOldEscortAdFormat(caseState) &&\n              idx === 0 &&\n              arr[idx + 1]?.title === 'Escort Ad' &&\n              // !(idx === 0 && arr[1].author) &&  // If this is the first step and not a staff source\n              true) // this is here to allow quick commenting out of the above line\n          }\n          onUp={() => {\n            if (idx === 1 && 'Escort Ad' == data.title) {\n              console.log('Swap ad');\n              if (usesOldEscortAdFormat(caseState)) {\n                swapAdStep(data.id);\n              } else {\n                return moveStep(data?.previousSourceId ? 'staff' : 'web', idx, -1, arr);\n              }\n              return;\n            }\n            return moveStep(data?.previousSourceId ? 'staff' : 'web', idx, -1, arr);\n          }}\n          onDown={() => moveStep(data?.previousSourceId ? 'staff' : 'web', idx, 1, arr)}\n          // onDown={() => moveStep(idx, 1)}\n        />\n      );\n      const actions = (\n        <div className=\"flex flex-row\">\n          <button\n            className=\"w-10 focus:outline-none\"\n            onClick={() => {\n              editAction(idx);\n            }}\n            type=\"button\">\n            <img src={EditIcon} alt=\"Edit\" className=\"w-5\" />\n          </button>\n          {(data.author && (\n            <button\n              className=\"w-10 focus:outline-none\"\n              onClick={() =>\n                // console.log({ data });\n\n                setShowStaffDelete(data.id)\n              }\n              type=\"button\">\n              <img src={TrashIcon} alt=\"Trash\" className=\"w-5\" />\n            </button>\n          )) ||\n            null}\n        </div>\n      );\n\n      return (\n        <div key={idx} className=\"flex flex-row\">\n          {showStaffDelete && showStaffDelete === data.id && (\n            <PopUpConfirmation\n              title=\"Delete Step\"\n              content={`Are you sure you want to delete ${data?.body?.website || 'this step'}?`}\n              onConfirm={() => {\n                // deleteSource(index);\n                removeStaffSource(data.id);\n                setShowStaffDelete(null);\n              }}\n              onCancel={() => {\n                // setShowDelete(false);\n                setShowStaffDelete(null);\n              }}\n              confirmText=\"DELETE\"\n              destructive\n              className=\"w-11/12 lg:w-auto\"\n            />\n          )}\n          <div className=\"w-full\">\n            <ReviewStep\n              key={`Source_${data.id}`}\n              data={data}\n              index={idx}\n              numSteps={arr.length}\n              isLast={idx === arr.length - 1}\n              setFeedback={setFeedback}\n              setAwardOption={setAwardOption}\n              awardClassificationOption={caseState.awardClassificationOption}\n              status={caseState?.status}\n              // forceExpanded\n              noSwaps\n              expandAll={expandAll}\n              // customSorter={sorter}\n              actions={actions}\n            />\n          </div>\n        </div>\n      );\n    });\n    //   </SortableContext>\n    // </DndContext>\n  }, [\n    compiledSteps,\n    setFeedback,\n    setAwardOption,\n    caseState.awardClassificationOption,\n    caseState.status,\n    moveStep,\n    removeStaffSource,\n    showStaffDelete,\n    expandAll,\n    // items,\n  ]);\n\n  const stepsContent = renderSteps();\n  const investigatorNotes = (\n    // <p>\n    //   <b className=\"text-pursuit-gray\">Investigator Notes: </b>\n    //   {caseState.investigatorNotes || 'N/A'}\n    // </p>\n    <>\n      <div className=\"flex flex-col mt-8\">\n        {/* <label className=\"mb-2 text-lg font-bold text-pursuit-gray\">Investigator Notes</label>\n\n        <textarea\n          // disabled\n          placeholder=\"No notes provided\"\n          className=\"h-24 pl-1 mt-1 mb-2 shadow\"\n          value={caseState.investigatorNotes}\n          onChange={event => {\n            // console.log(event.target.value);\n\n            setCaseState({\n              ...caseState,\n              investigatorNotes: event.target.value,\n            });\n          }}\n        /> */}\n        <InvestigatorNotes\n          notes={caseState.investigatorNotes}\n          visibility={['employee']}\n          newVisibility=\"employee\"\n          setNotes={note => {\n            setCaseState({\n              ...caseState,\n              investigatorNotes: note,\n            });\n          }}\n        />\n        {/* <button onClick={save()}>Save</button> */}\n      </div>\n    </>\n  );\n\n  const personalDetailsBlock = (\n    <div className=\"py-4 mb-4\">\n      <div>\n        <h2 className=\"mb-2 text-lg font-bold text-pursuit-gray\">Personal Details</h2>\n        <ul>\n          <li className=\"my-1\">\n            <p>\n              <b className=\"text-pursuit-gray\">Name: </b>\n              {`${caseState.firstName || ''} ${caseState.middleName || ''} ${caseState.lastName || ''}`}\n            </p>\n          </li>\n\n          <li className=\"my-1\">\n            <p>\n              <b className=\"text-pursuit-gray\">Age: </b>\n              {caseState.age}\n            </p>\n          </li>\n\n          <li className=\"my-1\">\n            <p>\n              <b className=\"text-pursuit-gray\">Location: </b>\n              {`${caseState.city || ''}, ${caseState.state || ''}`}\n            </p>\n          </li>\n\n          <li className=\"my-1\">\n            <p className=\"whitespace-normal break-words\">\n              <b className=\"text-pursuit-gray\">Comments: </b>\n              <div\n                id=\"comment-wrap\"\n                style={\n                  {\n                    // maxWidth: '41.4em',\n                    // overflow: 'hidden',\n                    // display: '-webkit-box',\n                    // '-webkit-box-orient': 'vertical',\n                    // '-webkit-line-clamp': '4',\n                  }\n                }>\n                {caseState.details}\n              </div>\n            </p>\n          </li>\n\n          {/* <li className=\"my-1\">\n            <p>\n              <b className=\"text-pursuit-gray\">Investigator Notes: </b>\n              {caseState.investigatorNotes}\n            </p>\n          </li> */}\n        </ul>\n\n        <div className=\"w-full mt-4 lg:w-64\">\n          <label className=\"font-bold text-pursuit-gray\">\n            Award Classification Option <span className=\"text-pursuit-red\">*</span>\n          </label>\n          <Dropdown\n            isClearable\n            value={awardClassificationOptions.find(x => x.value === caseState.awardClassificationOption) || null}\n            onChange={option =>\n              setCaseState({\n                ...caseState,\n                awardClassificationOption: option ? option.value : null,\n              })\n            }\n            width=\"w-full\"\n            options={awardClassificationOptions}\n            disabled={caseState?.status === CaseStatus.Approved || caseState?.status === CaseStatus.Resubmitted}\n            required\n          />\n        </div>\n\n        {(caseState.status === CaseStatus.Approved || caseState.status === CaseStatus.Resubmitted) && (\n          <div className=\"mt-8 mb-8\">\n            <PointBreakdown\n              expandAll\n              noSwaps\n              feedbackComments={caseState?.feedbackComments || []}\n              status={caseState?.status}\n              awardClassificationOption={caseState?.awardClassificationOption}\n              caseRecord={caseState}\n            />\n          </div>\n        )}\n      </div>\n    </div>\n  );\n\n  const header = (\n    <div className=\"mb-8\">\n      <h2 className=\"text-lg font-bold text-pursuit-gray\">Case Review</h2>\n      <div className=\"text-sm text-pursuit-gray\">\n        <p>\n          Take a moment to validate the sources provided by the volunteer that submitted this investigation. Please be\n          sure to provide feedback for anything that looks incorrect so the volunteer can make appropriate updates after\n          the case is returned. Your feedback will not be visible to the volunteer until the case is returned. Once you\n          have validated that everything is correct, please award points accordingly and approve and share the case\n          information.\n        </p>\n      </div>\n    </div>\n  );\n\n  const tabHeader = (\n    <>\n      {header}\n      {personalDetailsBlock}\n    </>\n  );\n\n  const onDragOver = event => {\n    console.log('Drag over', { event });\n  };\n\n  return (\n    <>\n      <>\n        {tabHeader}\n        {/* {stepActions && <div className=\"flex flex-col-reverse lg:flex-row-reverse\">{stepActions}</div>} */}\n        <div className=\"flex flex-col-reverse lg:flex-row-reverse\">\n          {caseState.webSources.length <= 0 ? (\n            <></>\n          ) : (\n            <>\n              <Button solidBlue className=\"w-32 my-2\" onClick={toggleExpandAll}>\n                {expandAll ? <>Collapse All</> : <>Expand All</>}\n              </Button>\n            </>\n          )}\n          {reOrderButton}\n          {stepActions}\n        </div>\n        {/* {reorderer()} */}\n        {showReorderSection && (\n          <PopUpConfirmation\n            // noCancel={sendMessageOnApproval}\n            noCancel={true}\n            // noConfirm={sendMessageOnApproval}\n            title=\"Reorder Steps\"\n            contentWrapper=\"p-3 bg-gray-100 border border-black rounded\"\n            // content=\"Are you sure you are ready to approve this case and award points to the submitter?\"\n            content={\n              <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n                <div\n                  className=\"overflow-y-auto overflow-x-visible\"\n                  style={{\n                    maxHeight: '40vh',\n                  }}>\n                  <SortableContext\n                    items={compiledSteps}\n                    strategy={verticalListSortingStrategy}\n                    // disabled={{\n                    //   droppable: true,\n                    // }}\n                  >\n                    {compiledSteps.map((data, idx, arr) => (\n                      <SortableItem\n                        key={data.id}\n                        id={data.id}\n                        data={data}\n                        items={arr}\n                        disabled={true}\n                        onDragOver={onDragOver}\n                        children={\n                          <div className=\"flex items-center\" title=\"Click and drag to reorder\">\n                            <span>\n                              <Icons.FaGripVertical className=\"mr-2 text-gray-400\" />\n                            </span>\n                            <span className=\"text-pursuit-darkred font-bold\">Step {idx + 1}:&nbsp;</span>\n                            <span>{data.title}</span>\n                            <span className=\"text-pursuit-gray\">&nbsp;{data.body.url && `- ${data.body.url}`}</span>\n                          </div>\n                        }\n                      />\n                    ))}\n                  </SortableContext>\n                </div>\n              </DndContext>\n            }\n            // onCancel={() => setApproveReady(false)}\n            onConfirm={() => setShowReorderSection(false)}\n            confirmText=\"Close\"\n            // confirmLoading={approving}\n            // confirmLoadingText=\"APPROVING\"\n            className=\"w-11/12 lg:w-auto lg:w-1/2\"\n          />\n        )}\n\n        {stepsContent}\n        {investigatorNotes}\n        {/* <code>{JSON.stringify(caseState)}</code> */}\n        {/* <pre>\n        <code>{JSON.stringify(compiledSteps, null, 2)}</code>\n        </pre> */}\n      </>\n    </>\n  );\n};\n\nexport default ReviewForm;\n","import React from 'react';\n\nconst RulesAndGuidelines = () => (\n  <div className=\"text-pursuit-gray\">\n    <p className=\"\">\n      Congratulations on completing the training and assessment process. Thanks for sticking with it and making it\n      through to the end. We know this process works, as we've had previous volunteers successfully identify underage\n      victims being advertised online. Their OSINT skills and desire had lifesaving impacts on a child's life.\n    </p>\n\n    <br />\n\n    <p>\n      The next steps in this Project 1591® volunteer process, is to provide you with some basic start points and\n      guidance as to how you can help Guardian Group in our effort to continue to support United States law enforcement\n      by identifying underage victims of sex trafficking. The following instructions are important to follow. Please ask\n      if you have questions or don't understand something.\n    </p>\n\n    <br />\n\n    <p className=\"font-semibold\">Requirements:</p>\n\n    <ol className=\"pl-6 list-decimal\">\n      <li className=\"mb-2\">\n        All leads must be derived from the surface web, <span className=\"underline\">NOT</span> the dark or deep web\n        locations.\n      </li>\n\n      <li className=\"mb-2\">\n        All information must be derived through <span className=\"underline\">passive</span> OSINT collection methods,\n        using only Publicly Available Information (PAI). If it's not PAI and can't be sourced as such, it will not be\n        corroborated and passed along to the appropriate authorities.\n      </li>\n\n      <li className=\"mb-2\">\n        Do not source information that is only gained through paid access. If you discover it through paid access and\n        can then reverse engineer it to source the PAI source, then that's what should be submitted as a source.\n      </li>\n\n      <li className=\"mb-2\">\n        Escort Sites/Forums:\n        <ol className=\"pl-6 list-alpha\">\n          <li className=\"mb-2\">\n            You must start your research with one of these sites. None of them will list a victim under the age of 18,\n            so this is where you must use your skills in identifying them in true name and age, to determine it as a\n            valid lead. Most underage victims are listed between 18-25 years old on these sites.\n          </li>\n\n          <li className=\"mb-2\">\n            If you believe you've identified an originating escort ad site in an area you want to look at, but it's not\n            in our approved list below, contact us and we'll approve/disapprove it as a valid start point. We're looking\n            for sites that contain original sources, not aggregators. We have one exception listed below. We recommend\n            you copy the sites listed and paste them into your virtual machine, so you don't risk compromising your host\n            machine.\n          </li>\n\n          <li className=\"mb-2\">\n            Of note, we recommend you read this page before hitting any sites. It will help you understand how to spot a\n            fake ad [\n            <a\n              href=\"https://skipthegames.com/articles/about-escorts/how-to-identify-fake-escort-ads-and-avoid-scams\"\n              className=\"underline text-guardian-blue\">\n              link\n            </a>\n            ]. The stuff highlighted here, is applicable to almost all other sites, not just SkipTheGames.\n          </li>\n\n          <li className=\"mb-2\">\n            Sites:\n            <ol className=\"pl-6 list-roman\">\n              <li className=\"mb-2\">\n                SkipTheGames: [\n                <a href=\"https://skipthegames.com\" className=\"underline text-guardian-blue\">\n                  https://skipthegames.com\n                </a>\n                ]\n              </li>\n\n              <li className=\"mb-2\">\n                Megapersonals: [\n                <a href=\"https://megapersonals.eu\" className=\"underline text-guardian-blue\">\n                  https://megapersonals.eu\n                </a>\n                ]\n              </li>\n\n              <li className=\"mb-2\">\n                PrivateDelights: [\n                <a href=\"https://privatedelights.ch\" className=\"underline text-guardian-blue\">\n                  https://privatedelights.ch\n                </a>\n                ]\n              </li>\n\n              <li className=\"mb-2\">\n                KittyAds: [\n                <a href=\"https://www.kittyads.com\" className=\"underline text-guardian-blue\">\n                  https://www.kittyads.com\n                </a>\n                ]\n              </li>\n\n              <li className=\"mb-2\">\n                CallEscort: [\n                <a href=\"https://callescort.org\" className=\"underline text-guardian-blue\">\n                  https://callescort.org\n                </a>\n                ]\n              </li>\n\n              <li className=\"mb-2\">\n                Adult Search: [\n                <a href=\"https://adultsearch.com\" className=\"underline text-guardian-blue\">\n                  https://adultsearch.com\n                </a>\n                ]\n              </li>\n\n              <li className=\"mb-2\">\n                Adult Look: [\n                <a href=\"https://www.adultlook.com\" className=\"underline text-guardian-blue\">\n                  https://www.adultlook.com\n                </a>\n                ]\n              </li>\n\n              {/* <li className=\"mb-2\">\n                Tryst: [\n                <a href=\"https://tryst.link\" className=\"underline text-guardian-blue\">\n                  https://tryst.link\n                </a>\n                ]\n              </li>\n             */}\n              {/* <li className=\"mb-2\">\n                Truth iN Advertising (TNA): [\n                <a href=\"https://www.tnaboard.com\" className=\"underline text-guardian-blue\">\n                  https://www.tnaboard.com\n                </a>\n                ]\n              </li> */}\n\n              {/* <li className=\"mb-2\">\n                Eros: [\n                <a href=\"https://www.eros.com\" className=\"underline text-guardian-blue\">\n                  https://www.eros.com\n                </a>\n                ]\n              </li> */}\n\n              {/* <li className=\"mb-2\">\n                SumoSearch: [\n                <a href=\"https://sumosear.ch\" className=\"underline text-guardian-blue\">\n                  https://sumosear.ch\n                </a>\n                ]\n                <ul className=\"pl-6 list-disc\">\n                  <li className=\"mb-2\">\n                    This is the only aggregator that you can use as a start point, because it's pulling in some of the\n                    sites listed above. When sourcing the Step 1 in your report, you must start with the original ad\n                    URL, NOT the SumoSearch URL. If the original ad has been removed but it's still in SumoSearch, then\n                    you can use the SumoSearch as the start point, but ensure you explain this.\n                  </li>\n                </ul>\n              </li> */}\n            </ol>\n          </li>\n        </ol>\n      </li>\n      <li className=\"mb-2\">\n        Lead Submission(s):\n        <ol className=\"pl-6 list-alpha\">\n          <li className=\"mb-2\">\n            You <span className=\"underline\">must</span> identify true name (first & last).\n          </li>\n          <li className=\"mb-2\">\n            You <span className=\"underline\">must</span> identify a date of birth or show convincing evidence that you\n            believe the victim is underage, <span className=\"underline\">at the time of the submission.</span>\n            <ol className=\"pl-6 list-roman\">\n              <li className=\"mb-2\">\n                If you go through the process of determining a possible victim's true identity and then realize they are\n                between the ages of 18-25, you may still submit through this application. However, it will be reviewed\n                after all underage leads are processed. If approved, it will follow the same point awarding process as\n                underage leads, but with a significantly less point value.\n              </li>\n              {/* <li className=\"mb-2\">\n                Any lead of an underage victim can be submitted no matter how dated the start point ad is. If the lead\n                is of a person 18-25yo, the start point ad must be no older than 24hrs old.\n              </li> */}\n            </ol>\n          </li>\n          <li className=\"mb-2\">\n            The submission <span className=\"underline\">must be for a female</span>, if between the ages of 18-25. It may\n            be for any gender if it's an underage lead.\n          </li>\n          <li className=\"mb-2\">\n            You must show your steps/work/analysis for each sourced entry, to receive points. This means describing any\n            valuable information on the source you've decided to submit.\n          </li>\n          <li className=\"mb-2\">\n            All 'Steps/Sources' must be sourced with a valid link. There are rare occasions that this can't be done. If\n            so, explain this in the 'Description' field.\n          </li>\n          <li className=\"mb-2\">\n            Your submission <span className=\"underline\">must</span> provide visual corroboration to other PAI, that\n            confirms that the person being advertised in the escort ad matches the true identity you've determined. A\n            simple name match won't be sufficient for validation.\n          </li>\n        </ol>\n      </li>\n    </ol>\n    <p className=\"font-semibold\">Guidance:</p>\n    <ol className=\"pl-6 list-decimal\">\n      <li className=\"mb-2\">\n        There's no requirement or expectation that you submit a single lead. This is completely volunteer and up to you\n        as to how you proceed further.\n      </li>\n      <li className=\"mb-2\">\n        You have the freedom to look in any city in the United States, to identify a lead. It's completely your choice.\n        Trafficking happens in almost every city, but the volume greatly increases with the size of a city's population.\n        If you'd like us to recommend an area for you to look, based on our law enforcement contacts, just ask.\n      </li>\n      <li className=\"mb-2\">\n        At least 90% of the time, your true identification will come from clues in the ad, whether that is a phone\n        number, email, username etc. where you further pivot out to identify and corroborate a true identity and age.\n      </li>\n    </ol>\n  </div>\n);\n\nexport default RulesAndGuidelines;\n","import React, { useEffect, useState, useContext } from 'react';\nimport { DateTime } from 'luxon';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { snakeCase } from 'change-case';\nimport * as Icons from 'react-icons/fa';\nimport { useHistory } from 'react-router-dom';\n\nimport { NotificationContext } from '../../helpers/AlertContext/AlertContext';\n\nimport Container from '../Container';\nimport HeaderText from '../HeaderText';\nimport DataGrid from '../DataGrid';\nimport Button from '../Button';\nimport DropDown from '../DropDown';\nimport ToolTip from '../ToolTip';\nimport { useUser } from '../../contexts/userContext';\n\nconst Volunteers = ({\n  statusOptions,\n  title,\n  initialStatus,\n  query,\n  queryName,\n  statusColumn,\n  statusFilterLabel,\n  createUserDefaultType,\n  showDisabledAt = false,\n}) => {\n  const { isAdmin } = useUser();\n\n  const [, setAlert] = useContext(NotificationContext);\n\n  const history = useHistory();\n\n  const [nextUsersToken, setNextUsersToken] = useState();\n\n  const [users, setUsers] = useState([]);\n  const [usersLoading, setUsersLoading] = useState(true);\n\n  const [userStatus, setUserStatus] = useState(initialStatus);\n\n  const [filters, setFilters] = useState({\n    userStatus: initialStatus,\n    searchTerm: '',\n  });\n\n  const [sort, setSort] = useState({\n    fieldName: 'createdAt',\n    direction: 'DESC',\n  });\n\n  const [filtersOnLastSearch, setFiltersOnLastSearch] = useState(null);\n  const [sortOnLastSearch, setSortOnLastSearch] = useState({\n    fieldName: 'createdAt',\n    direction: 'DESC',\n  });\n\n  const [search, setSearch] = useState('');\n\n  const [userCount, setUserCount] = useState(0);\n\n  useEffect(() => {\n    setUserCount(users.length);\n  }, [users]);\n\n  useEffect(() => {\n    fetchUsers();\n  }, [sort]);\n\n  useEffect(() => {\n    fetchUsers();\n  }, [filters]);\n\n  const fetchUsers = async () => {\n    try {\n      let nextTokenToUse = nextUsersToken;\n\n      let oldUsers = nextTokenToUse ? [...users] : [];\n\n      if (\n        !filtersOnLastSearch ||\n        filtersOnLastSearch.userStatus !== filters.userStatus ||\n        filtersOnLastSearch.searchTerm !== filters.searchTerm ||\n        sortOnLastSearch.fieldName !== sort.fieldName ||\n        sortOnLastSearch.direction !== sort.direction\n      ) {\n        setNextUsersToken(null);\n\n        nextTokenToUse = null;\n        oldUsers = [];\n      }\n\n      if (oldUsers.length == 0) {\n        setUsersLoading(true);\n      }\n\n      setSortOnLastSearch(sort);\n      setFiltersOnLastSearch(filters);\n\n      const params = {\n        userStatus: filters.userStatus,\n        searchTerm: filters.searchTerm,\n        nextToken: nextTokenToUse,\n        sortField: sort.fieldName ? snakeCase(sort.fieldName).toUpperCase() : '',\n        sortOrder: sort.direction,\n        limit: 10000,\n      };\n\n      const response = await API.graphql(graphqlOperation(query, params));\n\n      const result = response.data[queryName];\n\n      setNextUsersToken(result.nextToken);\n\n      setUsers([...oldUsers, ...result.items]);\n    } catch (error) {\n      console.error('Error Loading users: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error loading users',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setUsersLoading(false);\n  };\n\n  const getCreatedDate = item => (item.createdAt ? DateTime.fromISO(item.createdAt).toLocaleString() : '-');\n  const getLastSignInDate = item => (item.lastSignInAt ? DateTime.fromISO(item.lastSignInAt).toLocaleString() : '-');\n\n  const columns = [\n    {\n      title: '',\n      fieldName: '',\n      sortable: false,\n      width: '3em',\n      value: (v, i) => {\n        // console.log(v, i);\n        return i + 1;\n        // return 0;\n      },\n    },\n    { title: 'First Name', fieldName: 'firstName', sortable: true },\n    { title: 'Last Name', fieldName: 'lastName', sortable: true },\n    { title: 'Alias', fieldName: 'alias', sortable: true },\n    { title: 'Email', fieldName: 'email', sortable: true, width: '2fr' },\n    { title: 'Created', fieldName: 'createdAt', value: getCreatedDate, sortable: true },\n    { title: 'Last Sign In', fieldName: 'lastSignInAt', value: getLastSignInDate, sortable: true },\n    { title: 'State', fieldName: 'state', sortable: true },\n    { title: 'ZIP', fieldName: 'zip', sortable: true },\n    statusColumn,\n  ];\n  if ((filtersOnLastSearch && filtersOnLastSearch.userStatus === 'DISABLED') || showDisabledAt) {\n    columns.push({\n      title: 'Disabled At',\n      fieldName: 'disabledAt',\n      sortable: false,\n      value: ({ disabledAt }) => {\n        return disabledAt ? DateTime.fromISO(disabledAt).toLocaleString() : '-';\n      },\n    });\n  }\n  return (\n    <Container height=\"lg:h-152\" padding=\"p-4\" margin=\"m-3 lg:m-auto lg:mx-8\" className=\"relative\">\n      <div className=\"flex flex-col lg:px-4 pt-4\">\n        <div className=\"flex flex-col lg:flex-row mb-4 lg:mb-0 items-start lg:items-center justify-between\">\n          <HeaderText className=\"text-2xl text-left mb-4 lg:text-4xl\">{title}</HeaderText>\n\n          <div className=\"flex items-center\">\n            <p className=\"light-primary-blue-text font-light inline-block mr-4 leading-9\">Total Users</p>\n            <p className=\"text-2xl lg:text-4xl inline-block\">{userCount}</p>\n          </div>\n\n          {isAdmin && (\n            <Button\n              linedBlue\n              className=\"flex flex-row px-4 w-full lg:w-40\"\n              onClick={() => {\n                history.push('/admin/create-user', { userType: createUserDefaultType });\n              }}>\n              <Icons.FaPlusCircle className=\"mr-2\" /> NEW USER\n            </Button>\n          )}\n        </div>\n\n        <div className=\"lg:flex items-end justify-end mb-10\">\n          <div className=\"lg:mr-4\">\n            <DropDown\n              value={statusOptions.find(x => x.value === userStatus)}\n              onChange={option => {\n                setUserStatus(option ? option.value : null);\n              }}\n              containerClassName=\"mb-4 lg:mb-0\"\n              width=\"w-full lg:w-48 xl:w-64\"\n              label={statusFilterLabel}\n              options={statusOptions}\n              placeholder={statusFilterLabel}\n              isClearable\n            />\n          </div>\n\n          <div className=\"flex flex-col\">\n            <div className=\"flex flex-row\">\n              <p className=\"light-primary-blue-text font-light mb-1\">Search Term</p>\n\n              <ToolTip\n                tooltipText=\"Find records with the search term included in the First Name, Last Name, Alias, Email, State, or ZIP fields.\"\n                title=\"Search Term\"\n                className=\"text-pursuit-gray ml-2\"\n              />\n            </div>\n\n            <input\n              type=\"text\"\n              value={search}\n              onChange={event => setSearch(event.target.value)}\n              placeholder=\"Search Term\"\n              className=\"bg-gray-100 h-10 mb-4 mt-2 lg:mb-0 lg:mt-0 lg:mr-4 px-4 w-full lg:w-48 xl:w-64\"\n              onKeyDown={event => {\n                const pressedKey = event.key;\n\n                if (pressedKey === 'Enter') {\n                  setFilters({\n                    userStatus,\n                    searchTerm: search,\n                  });\n                }\n              }}\n            />\n          </div>\n\n          <Button\n            solidBlue\n            className=\"px-4 w-full lg:w-24\"\n            onClick={() => {\n              setFilters({\n                userStatus,\n                searchTerm: search,\n              });\n            }}>\n            FILTER\n          </Button>\n        </div>\n\n        <DataGrid\n          columns={columns}\n          sort={sort}\n          setSort={setSort}\n          loading={usersLoading}\n          data={users}\n          noRecordsText=\"No users found with the selected filters and sort options\"\n          rowLink={item => `/user/${item.id}`}\n          loadNextPage={() => fetchUsers()}\n          hasMore={!!nextUsersToken}\n          containerHeight=\"h-88\"\n          gridKey=\"employee-cases\"\n        />\n      </div>\n    </Container>\n  );\n};\n\nexport default Volunteers;\n","import React, { Fragment, useState, useEffect, useCallback } from 'react';\nimport Button from '../Button';\nimport Feedback from '../Feedback';\nimport PopUpConfirmation from '../PopupConfirmation';\nimport {\n  webSourceFields,\n  webSourceRequiredFields,\n  websiteList,\n  webSourceEscortSiteOptions,\n  webSourceDescriptionHelper,\n  webSourceTooltips,\n  webSourceRequiredFieldsStructured,\n  getWebSourceSiteLabel,\n  webSourceFieldCharacterLimits,\n} from '../../helpers/caseForms/webSourceFields';\nimport {\n  readableFormat,\n  usesOldEscortAdFormat,\n  webSourceFieldLabel,\n  webSourceFieldPlaceholder,\n  sortWebSourceFields,\n} from '../../helpers/caseForms/utilHelpers';\nimport { CaseStatus } from '../../constants';\nimport { formatPhoneNumber } from '../PhoneField/phoneFieldHelper';\n// import { formatPhoneNumber } from '../../helpers/caseForms/inputFormatters';\nimport styles from './styles.module.css';\nimport locations from './locations.json';\nimport Select from 'react-select';\nimport ToolTip from '../ToolTip';\nimport * as Icons from 'react-icons/fa';\nimport { v4 as uuidv4 } from 'uuid';\nimport DatePicker from 'react-datepicker';\n\n// const addDays = require('date-fns/addDays');\nimport { addDays } from 'date-fns';\nconst WebSourceForm = ({\n  caseState,\n  setCaseState: setCaseStateFunc,\n  stepNumber,\n  webSourceIndex,\n  setGlobalIndex,\n  saveAndAddButton,\n  reviewing,\n  removeLabel = 'DELETE SOURCE',\n  setFormNumber,\n  staffSource = false,\n}) => {\n  // const sourceKey = staffSource ? 'staffSources' : 'webSources';\n  const [sourceKey] = useState(staffSource ? 'staffSources' : 'webSources');\n  const [showDelete, setShowDelete] = useState(false);\n  // const [webSourceIndex] = useState(webSourceIndexProp);\n  const setCaseState = useCallback(\n    data => {\n      // Remove url from unique fields\n      // if (data[sourceKey][webSourceIndex].uniqueFields) {\n      //   delete data[sourceKey][webSourceIndex].uniqueFields.url;\n      // }\n      setCaseStateFunc(data);\n    },\n    [setCaseStateFunc]\n  );\n  const removeActionLower = removeLabel.toLowerCase();\n  const removeActionTitleCase = removeActionLower.charAt(0).toUpperCase() + removeActionLower.slice(1);\n\n  const removeTitle = `${removeActionTitleCase} Step`;\n  const removeConfirmation = `Are you sure you want to ${removeActionLower} this step?`;\n\n  // console.log({ ...caseState });\n\n  // const [sourcedWebsite, setSourcedWebsite] = useState(caseState[sourceKey][webSourceIndex]?.website);\n\n  // useEffect(() => {\n  //   setSourcedWebsite(caseState[sourceKey][webSourceIndex]?.website);\n  // }, [caseState, sourceKey, webSourceIndex]);\n\n  useEffect(() => {\n    // Check if source is a object, if not return;\n    if (typeof caseState[sourceKey][webSourceIndex] !== 'object') {\n      return;\n    }\n\n    const savedWebsite = caseState[sourceKey][webSourceIndex]?.website;\n    const savedUniqueFields = caseState[sourceKey][webSourceIndex]?.uniqueFields;\n\n    let hasSavedUniqueFields = false;\n\n    if (savedUniqueFields) {\n      hasSavedUniqueFields = !!Object.keys(savedUniqueFields).length;\n    }\n\n    if (savedWebsite) {\n      const fields = webSourceFields[savedWebsite.replace(/ /g, '').toLowerCase()];\n      // const fields = Object.keys(webSourceFields[savedWebsite.replace(/ /g, '').toLowerCase()])\n      //   .filter(field => !webSourceRequiredFields.includes(field))\n      //   .reduce((obj, key) => {\n      //     obj[key] = null;\n\n      //     return obj;\n      //   }, {});\n\n      // console.log('Fields', { fields });\n      if (!hasSavedUniqueFields) {\n        const updatedWebSources = JSON.parse(JSON.stringify(caseState[sourceKey]));\n\n        if (fields) {\n          updatedWebSources[webSourceIndex].uniqueFields = JSON.parse(JSON.stringify(fields));\n        }\n        // console.log('website update', caseState);\n        setCaseState({\n          ...caseState,\n          [sourceKey]: updatedWebSources,\n        });\n      } else {\n        // console.log({ fields });\n        const updatedFields = { ...fields };\n\n        // console.log(1, JSON.stringify(updatedFields));\n\n        // for each field in savedUniqueFields check if it is in fields\n        for (const savedFieldKey of Object.keys(savedUniqueFields)) {\n          // console.log({ updatedFields, savedFieldKey });\n          if (Object.hasOwn(updatedFields, savedFieldKey)) {\n            updatedFields[savedFieldKey] = savedUniqueFields[savedFieldKey];\n          }\n        }\n\n        // console.log(2, JSON.stringify(updatedFields));\n\n        const expectedFields = Object.keys(fields);\n\n        for (const expectedField of expectedFields) {\n          if (!(expectedField in savedUniqueFields)) {\n            savedUniqueFields[expectedField] = fields[expectedField];\n          }\n        }\n\n        const savedFieldKeys = Object.keys(savedUniqueFields);\n\n        for (const savedFieldKey of savedFieldKeys) {\n          if (!(savedFieldKey in fields)) {\n            delete savedUniqueFields[savedFieldKey];\n          }\n        }\n\n        const updatedWebSources = JSON.parse(JSON.stringify(caseState[sourceKey]));\n\n        // Remove the required fields from the updatedFields if present\n        for (const requiredField of webSourceRequiredFields) {\n          // const hasProp = Object.hasOwn({...updatedFields}, requiredField);\n\n          // console.log({ requiredField, updatedFields, hasProp, hasProp2: updatedFields.hasOwnProperty(requiredField) });\n          if (Object.hasOwn(updatedFields, requiredField)) {\n            // console.log('delete', requiredField);\n            // delete updatedFields[requiredField];\n          }\n        }\n        const uniqueFieldsToSave = Object.keys(updatedFields)\n          .filter(field => !webSourceRequiredFields.includes(field))\n          .filter(field => field !== 'description')\n          // .filter(field => field !== 'url')\n          .reduce((obj, key) => {\n            obj[key] = updatedFields[key];\n\n            return obj;\n          }, {});\n\n        // console.log({ uniqueFieldsToSave });\n        updatedWebSources[webSourceIndex] = {\n          ...updatedWebSources[webSourceIndex],\n          // uniqueFields: savedUniqueFields,\n          // uniqueFields: updatedFields,\n          uniqueFields: uniqueFieldsToSave,\n        };\n\n        // console.log(JSON.stringify(updatedFields));\n        // console.log(\n        //   'website update 2',\n        //   caseState,\n        //   JSON.stringify({ savedUniqueFields, updatedFields, uniqueFieldsToSave })\n        // );\n        setCaseState({\n          ...caseState,\n          [sourceKey]: updatedWebSources,\n        });\n      }\n    } else if (!savedWebsite) {\n      const defaultWebsite = websiteList[0];\n\n      const fields = webSourceFields[websiteList[0].toLowerCase()];\n\n      const updatedWebSources = JSON.parse(JSON.stringify(caseState[sourceKey]));\n\n      updatedWebSources[webSourceIndex].website = defaultWebsite;\n\n      if (fields) {\n        updatedWebSources[webSourceIndex].uniqueFields = JSON.parse(JSON.stringify(fields));\n      }\n\n      // console.log('website update 3', caseState);\n      setCaseState({\n        ...caseState,\n        [sourceKey]: updatedWebSources,\n      });\n    }\n  }, [caseState[sourceKey][webSourceIndex]?.website]);\n  // }, [caseState, setCaseState, sourceKey, webSourceIndex]);\n\n  function setInput(key, value) {\n    const updatedWebSources = JSON.parse(JSON.stringify(caseState[sourceKey]));\n    const updatedValues = { ...updatedWebSources[webSourceIndex], [key]: value };\n\n    console.log({ key, value, webSourceIndex, sourceKey, updatedWebSources, updatedValues });\n    // updatedWebSources[webSourceIndex][key] = value;\n    updatedWebSources[webSourceIndex] = updatedValues;\n\n    setCaseState({\n      ...caseState,\n      [sourceKey]: updatedWebSources,\n    });\n  }\n\n  function setUniqueInput(field, value) {\n    // console.log('setUniqueInput', field, value);\n    const updatedWebSources = JSON.parse(JSON.stringify(caseState[sourceKey]));\n    const webSource = { ...updatedWebSources[webSourceIndex] };\n    const { uniqueFields } = webSource;\n    const updatedUniqueValues = { ...uniqueFields, [field]: value };\n    const updatedWebSource = { ...webSource, uniqueFields: updatedUniqueValues };\n\n    console.log({ field, value, webSourceIndex, sourceKey, updatedWebSources, updatedUniqueValues, updatedWebSource });\n\n    if (\n      webSource.website === 'Escort Ad' &&\n      webSourceIndex === 0 &&\n      field === 'adLocation' &&\n      !usesOldEscortAdFormat(caseState)\n    ) {\n      const [city, state] = value.split(', ');\n      if (city) caseState.city = city;\n      console.log({ city, state });\n      if (state) caseState.state = state;\n    }\n\n    // updatedWebSources[webSourceIndex].uniqueFields[field] = value;\n    updatedWebSources[webSourceIndex] = updatedWebSource;\n\n    setCaseState({\n      ...caseState,\n      [sourceKey]: updatedWebSources,\n    });\n  }\n\n  const deleteSource = useCallback(() => {\n    // const sourceKey = staffSource ? 'staffSources' : 'webSources';\n    // TODO: Need to delete points if awarded\n    // const webSourceCount = caseState.webSources.length;\n    const webSourceCount = caseState[sourceKey].length;\n\n    let newGlobalIndex = 0;\n\n    const updatedWebSources = JSON.parse(JSON.stringify(caseState[sourceKey]));\n\n    updatedWebSources.splice(webSourceIndex, 1);\n    const newAwardedPoints = (caseState.awardedPoints || []).filter(\n      x =>\n        x.stepId === 'ESCORT_AD' ||\n        updatedWebSources.map(x => x.id).includes(x.stepId) ||\n        (caseState.staffSources || []).map(x => x.id).includes(x.stepId)\n    );\n\n    const newCaseState = {\n      ...caseState,\n      [sourceKey]: [...updatedWebSources],\n      awardedPoints: [...newAwardedPoints],\n    };\n\n    console.log('newCaseState', newCaseState);\n    setCaseState(newCaseState);\n    setShowDelete(false);\n\n    if (caseState?.status === CaseStatus.Approved) {\n      setFormNumber(2);\n      setGlobalIndex(1);\n    } else {\n      if (webSourceCount > 1) {\n        newGlobalIndex = webSourceIndex;\n      }\n      setGlobalIndex(newGlobalIndex);\n    }\n  }, [caseState, webSourceIndex]);\n\n  // const selectedSource = caseState[sourceKey][webSourceIndex] || { id: null };\n  // Default to a empty escort ad\n  // const emptyEscortAd = { id: null, uniqueFields: webSourceFields['escortad'] };\n  const emptyEscortAd = {\n    id: uuidv4(),\n    description: '',\n    url: '',\n    website: 'Escort Ad',\n    uniqueFields: webSourceFields['escortad'],\n  };\n  const selectedSource = caseState[sourceKey][webSourceIndex] || emptyEscortAd;\n\n  // URL and Description are required\n  // Add the required fields to the array and then after looping the fields check do see if displayed\n  // const requiredFields = [\n  //   {\n  //     key: 'url',\n  //     label: 'URL',\n  //     element: (\n\n  //     )\n\n  //   }\n  // ];\n\n  // console.log({\n  //   staffSource,\n  //   sourceKey,\n  //   webSourceIndex,\n  //   selectedSource,\n  //   // entries: Object.entries(selectedSource?.uniqueFields),\n  // });\n  const savedWebsite2 = caseState[sourceKey][webSourceIndex]?.website || 'Escort Ad';\n  const webSourceKey = savedWebsite2.replace(/ /g, '').toLowerCase();\n  const expectedSourceFields = savedWebsite2 ? webSourceFields[savedWebsite2.replace(/ /g, '').toLowerCase()] : {};\n\n  const fieldsToDisplay = webSourceRequiredFields.reduce(\n    (acc, field) => {\n      // const fieldsToDisplay = [].reduce((acc, field) => {\n      if (!Object.hasOwn(acc, field)) {\n        // console.log('Adding field', field, 'to uniqueFields');\n\n        // acc[field] = '';\n        // Instead add the field to the beginning of the object\n        acc = { [field]: '', ...acc };\n        // return Object.assign({ [field]: '' }, acc);\n      }\n\n      return acc;\n    },\n    // { ...selectedSource.uniqueFields }\n    { ...expectedSourceFields }\n  );\n\n  // console.log({ webSourceRequiredFields, expectedSourceFields, fieldsToDisplay });\n  // const fieldsToDisplay = expectedSourceFields.reduce(\n  //   (acc, field) => {\n  //     // const fieldsToDisplay = [].reduce((acc, field) => {\n  //     if (!Object.hasOwn(acc, field)) {\n  //       // console.log('Adding field', field, 'to uniqueFields');\n  //       acc[field] = '';\n  //     }\n\n  //     return acc;\n  //   },\n  //   // { ...selectedSource.uniqueFields }\n  //   { ...webSourceRequiredFields }\n  // );\n  // Sort fields to display\n\n  // const sortedFields = sortWebSourceFields(fieldsToDisplay);\n\n  // console.log({ sortedFields });\n\n  // const fields = updatedWebSources[webSourceIndex].uniqueFields\n  // console.log({ selectedSource, expectedFields });\n  const descriptionKey = selectedSource?.website && selectedSource?.website.replace(' ', '').toLowerCase();\n  // let descriptionHelper = null;\n  // if (webSourceDescriptionHelper[descriptionKey]) {\n  //   const descriptionHelperText = webSourceDescriptionHelper[descriptionKey];\n  //   descriptionHelper = (\n  //     <span title={descriptionHelperText}>\n  //       {/* <Icons.FaInfoCircle size={16} className=\"inline\" /> */}\n  //       <ToolTip\n  //         tooltipText={descriptionHelperText}\n  //         title=\"Details\"\n  //         className=\"text-pursuit-gray inline\"\n  //       />\n  //     </span>\n  //   );\n  // }\n  const descriptionHelper = webSourceDescriptionHelper[descriptionKey] ? (\n    <span title={webSourceDescriptionHelper[descriptionKey]}>\n      <ToolTip\n        tooltipText={webSourceDescriptionHelper[descriptionKey]}\n        title=\"Tip\"\n        className=\"text-pursuit-gray inline\"\n      />\n    </span>\n  ) : null;\n\n  const orderedFields = Object.keys(webSourceFields[webSourceKey]);\n  const sortFunction = sortWebSourceFields(orderedFields);\n  const sortedFields = Object.entries(fieldsToDisplay)\n    .sort(sortFunction)\n    .map(([field, value]) => field);\n  // console.log({ sortedFields });\n\n  const indexOfUrl = sortedFields.indexOf('url');\n  const indexOfDescription = sortedFields.indexOf('description');\n  const isEscortAd = selectedSource.website === 'Escort Ad';\n  if (!isEscortAd && indexOfUrl && indexOfUrl + 1 !== indexOfDescription) {\n    // console.log('URL and Description are not next to each other');\n    // Move the URL field to be before the description field\n    sortedFields.splice(indexOfUrl, 1);\n    sortedFields.splice(indexOfDescription, 0, 'url');\n  }\n\n  const uniqueFields =\n    // selectedSource?.uniqueFields &&\n    // Object.entries(selectedSource.uniqueFields).map(([field], i) => {\n\n    // fieldsToDisplay &&\n    // Object.entries(fieldsToDisplay)\n    //   // Sort the fields\n    //   .sort(sortWebSourceFields(Object.keys(webSourceFields[descriptionKey])))\n    //   .map(([field], i) => {\n    sortedFields.map((field, i) => {\n      // expectedFields &&\n      // Object.entries(expectedFields).map(([field], i) => {\n      const formattedField = webSourceFieldLabel(field, descriptionKey);\n      const isRequired =\n        webSourceRequiredFields.includes(field) ||\n        (webSourceRequiredFieldsStructured[webSourceKey] &&\n          webSourceRequiredFieldsStructured[webSourceKey].includes(field));\n\n      // let fieldValue = isRequired /* typeof selectedSource[field] !== 'undefined'*/\n      //   ? selectedSource?.[field] || ''\n      //   : selectedSource.uniqueFields[field] || '';\n      let fieldValue =\n        field === 'description' || field === 'url'\n          ? selectedSource?.[field] || ''\n          : selectedSource?.uniqueFields?.[field] || '';\n\n      // const updateValue = isRequired ? value => setInput(field, value) : value => setUniqueInput(field, value);\n      const updateValue =\n        field === 'description' || field === 'url'\n          ? value => setInput(field, value)\n          : value => setUniqueInput(field, value);\n\n      let onChange = e => {\n        updateValue(e.target.value);\n      };\n\n      const placeholder = webSourceFieldPlaceholder(field);\n\n      const characterLimit =\n        webSourceFieldCharacterLimits[`${descriptionKey}_${field}`] || webSourceFieldCharacterLimits[field];\n\n      // console.log('formattedField', formattedField);\n      // console.log({ field, i, selectedSource, uniqueFields: selectedSource.uniqueFields });\n      let ElementType = 'input';\n      let fieldType = 'text';\n      let classes = `${styles.sourceInput} h-10 px-2 mt-2 mb-4 shadow lg:w-2/3 2xl:w-1/2`;\n\n      let pattern = null;\n      let options = null;\n      let elementAttributes = {};\n\n      if (characterLimit) {\n        elementAttributes['maxLength'] = characterLimit;\n        // Remove the bottom margin to make room for the character count\n        classes = classes.replace('mb-4', '');\n      }\n\n      // Adjust field type for special fields\n      switch (field) {\n        case 'email':\n          fieldType = 'email';\n          break;\n        case 'url':\n        case 'profilePictureUrl':\n          fieldType = 'url';\n          // pattern = 'https?://.+';\n          break;\n        case 'phoneNumber':\n        case 'registeredPhoneNumber':\n          fieldType = 'tel';\n          pattern = '[0-9]{3}-[0-9]{3}-[0-9]{4}';\n          fieldValue = formatPhoneNumber(fieldValue);\n          onChange = e => {\n            const formattedPhoneNumber = formatPhoneNumber(e.target.value);\n\n            updateValue(formattedPhoneNumber);\n          };\n          break;\n        case 'dateOfBirth':\n        case 'adDate':\n          // So lame to set validation rules in code like this\n          const today = new Date();\n          const lastYear = new Date(today);\n          // tomorrow.setDate(tomorrow.getDate() + 1);\n          // lastYear.setFullYear(today.getFullYear() - 1);\n          elementAttributes['max'] = today.toISOString().split('T')[0];\n        // ElementType = DatePicker;\n        // break;\n        // elementAttributes['min'] = lastYear.toISOString().split('T')[0];\n        case 'date':\n          fieldType = 'date';\n          // ElementType = DatePicker;\n          // fieldValue = new Date(fieldValue);\n          // elementAttributes['selected'] = new Date(fieldValue);\n          // Field value is a string formatted YYYY-MM-DD, convert it to a date\n          let date = fieldValue;\n          if (fieldValue) {\n            date = new Date(fieldValue);\n            // date = new Date();\n            // const dateParts = fieldValue.split('-');\n            // date.setFullYear(dateParts[0]);\n            // date.setMonth(dateParts[1] - 1);\n            // date.setDate(dateParts[2]);\n          }\n\n          // console.log({ date, fieldValue });\n          return (\n            <span className={styles.sourceField} key={field + i + selectedSource.id + selectedSource.website}>\n              <span\n                className={`${styles.label} ${styles.validity} text-pursuit-gray`}\n                // title={webSourceTooltips[savedWebsite2.replace(/ /g, '').toLowerCase()][field]}\n                title={webSourceTooltips[webSourceKey] && webSourceTooltips[webSourceKey][field]}>\n                {formattedField}{' '}\n                {webSourceTooltips[webSourceKey] && webSourceTooltips[webSourceKey][field] && (\n                  <ToolTip\n                    tooltipText={webSourceTooltips[webSourceKey][field]}\n                    title=\"Information\"\n                    className=\"text-pursuit-gray inline\"\n                  />\n                )}{' '}\n                {isRequired && <span className=\"ml-1 text-pursuit-red\">* </span>}\n              </span>\n              {/* <input /> */}\n              <div className=\"w-full\">\n                <DatePicker\n                  // showIcon\n                  selected={date}\n                  // selected={null}\n                  // className={classes}\n                  placeholderText=\"Select\"\n                  className=\"h-10 px-2 mt-2 mb-4 shadow w-full text-base\"\n                  // className='w-full px-2 mt-2 mb-4 shadow'\n                  // wrapperClassName=\"w-full\"\n                  // wrapperClassName=\"w-full\"\n                  wrapperClassName=\"lg:w-2/3 2xl:w-1/2 text-base\"\n                  // dateFormat=\"yyyy/MM/dd\"\n                  isClearable={!!fieldValue}\n                  showMonthDropdown\n                  showYearDropdown\n                  scrollableYearDropdown\n                  // dropdownMode= \"scroll\"\n                  dropdownMode=\"select\"\n                  // yearDropdownItemNumber={26}\n                  todayButton=\"Today\"\n                  dateFormat=\"MMMM d, yyyy\"\n                  maxDate={addDays(new Date(), 0)}\n                  onChange={date => {\n                    console.log({ date });\n                    if (!date) {\n                      updateValue(date);\n                    } else {\n                      // console.log({ date }, 'Should not be here');\n                      // const ymdDate = date.toISOString().split('T')[0];\n                      // console.log({ date, ymdDate });\n                      // updateValue(ymdDate);\n                      updateValue(date)\n                    }\n                  }}\n                  key={`unique-input-${field}-${i}-${selectedSource.id}-${selectedSource.website}`}\n                />\n              </div>\n              {/* <DatePicker selected={new Date(fieldValue)} onChange={date => updateValue(date)} /> */}\n            </span>\n          );\n          break;\n        case 'description':\n          ElementType = 'textarea';\n          classes = `${styles.sourceInput} h-24 w-full px-2 mt-2 mb-4 shadow`;\n          break;\n        case 'escortSiteTitle':\n          ElementType = 'select';\n          const selectOptions = webSourceEscortSiteOptions.map((option, i) => (\n            <option key={i} value={option.value}>\n              {option.label}\n            </option>\n          ));\n          options = (\n            <>\n              <option>\n                -- Select an option --\n              </option>\n              {selectOptions}\n            </>\n          );\n          // selectOptions = ['Escort Site Title', 'Escort Site Title 2'];\n          break;\n        case 'phoneType':\n          ElementType = 'select';\n          const phoneOptions = ['Cellular', 'VOIP'].map((option, i) => (\n            <option key={i} value={option} selected={i === 0}>\n              {option}\n            </option>\n          ));\n          options = (\n            <>\n              <option>\n                -- Select an option --\n              </option>\n              {phoneOptions}\n            </>\n          );\n          // options += (\n          //   <option hidden disabled selected value>\n          //     {' '}\n          //     -- select an option --{' '}\n          //   </option>\n          // );\n          break;\n        case 'adLocation':\n        case 'location':\n          // ElementType = 'select';\n          // Group locations by state with each city as a child option\n          const locationStates = locations.reduce((acc, location) => {\n            // console.log({ location });\n            try {\n              const { state, city } = location;\n              // Lowercase the state\n              const safeState = state.toLowerCase();\n              if (!Array.isArray(acc[safeState])) {\n                acc[safeState] = [];\n              }\n              acc[safeState].push(location);\n            } catch (error) {\n              console.log({ error });\n            }\n            return acc;\n            // acc[location.state].push(location.city);\n          }, {});\n          // console.log({ locationStates });\n          // options = Object.keys(locationStates).map((state, i) => (\n          //   <optgroup\n          //     key={i}\n          //     label={state.replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substring(1).toLowerCase())}>\n          //     {locationStates[state].map((location, j) => (\n          //       <option key={j} value={`${location.state}:${location.city}`}>\n          //         {location.city}\n          //       </option>\n          //     ))}\n          //   </optgroup>\n          // ));\n          return (\n            <span className={styles.sourceField} key={field + i + selectedSource.id + selectedSource.website}>\n              <span\n                className={`${styles.label} ${styles.validity} text-pursuit-gray`}\n                // title={webSourceTooltips[savedWebsite2.replace(/ /g, '').toLowerCase()][field]}\n                title={webSourceTooltips[webSourceKey] && webSourceTooltips[webSourceKey][field]}>\n                {formattedField}{' '}\n                {webSourceTooltips[webSourceKey] && webSourceTooltips[webSourceKey][field] && (\n                  <ToolTip\n                    tooltipText={webSourceTooltips[webSourceKey][field]}\n                    title=\"Information\"\n                    className=\"text-pursuit-gray inline\"\n                  />\n                )}{' '}\n                {isRequired && <span className=\"ml-1 text-pursuit-red\">* </span>}\n              </span>\n              <Select\n                className=\"mb-4 lg:w-2/3 2xl:w-1/2\"\n                // onChange={onchange}\n                defaultInputValue={fieldValue}\n                onChange={selectedOption => {\n                  console.log({ selectedOption });\n                  // updateValue(selectedOption.value);\n                  onChange({ target: { value: selectedOption.value } });\n                }}\n                options={\n                  //Object.keys(locationStates).map((state, i) => {\n                  // return {\n                  //   // label: state.replace(\n                  //   //   /\\w\\S*/g,\n                  //   //   text => text.charAt(0).toUpperCase() + text.substring(1).toLowerCase()\n                  //   // ),\n                  //   options: locationStates[state].map((location, j) => {\n                  //     return {\n                  //       label: location.city,\n                  //       value: `${location.state}:${location.city}`,\n                  //     };\n                  //   }),\n                  // };\n                  // return locationStates[state].map((location, j) => {\n                  //   return {\n                  //     label: `${location.city}, ${location.state}`,\n                  //     value: `${location.state}:${location.city}`,\n                  //   };\n                  // });\n                  locations.map((location, j) => {\n                    return {\n                      label: `${location.city}, ${location.state}`,\n                      value: `${location.city}, ${location.state}`,\n                      // value: `${location.state}:${location.city}`,\n                    };\n                  })\n                  //}).flatMap(x => x)}\n                }\n              />\n            </span>\n          );\n\n        // options = locationStates.map((state, i) => (\n        //   <optgroup key={i} label={location.state}>\n        //     {location.cities.map((city, j) => (\n        //       <option key={j} value={`${location.state}:${city}`}>\n        //         {city}\n        //       </option>\n        //     ))}\n        //   </optgroup>\n        // ));\n\n        // options = locations.map((location, i) => (\n        //   <option key={i} value={`${location.state}:${location.city}`}>\n        //     {/* {location.state}, {location.city} */}\n        //     {location.city}, {location.state}\n        //   </option>\n        // ));\n        // options = [\n        //   <option key=\"location\" value=\"\">\n        //     Location\n        //   </option>,\n        //   <option key=\"location1\" value=\"location1\">\n        //     Location 1\n        //   </option>,\n        //   <option key=\"location2\" value=\"location2\">\n        //     Location 2\n        //   </option>,\n        // ];\n        default:\n        // Do nothing\n      }\n      // console.log({ field, fieldValue, elementAttributes });\n      if (characterLimit) {\n        // Remove the bottom margin to make room for the character count\n        classes = classes.replace('mb-4', '');\n      }\n      return (\n        <span className={styles.sourceField} key={field + i + selectedSource.id + selectedSource.website}>\n          {/* remove the spaces to get the key */}\n          <span\n            className={`${styles.label} ${styles.validity} text-pursuit-gray`}\n            title={webSourceTooltips[webSourceKey] && webSourceTooltips[webSourceKey][field]}>\n            {formattedField}{' '}\n            {webSourceTooltips[webSourceKey] && webSourceTooltips[webSourceKey][field] && (\n              <ToolTip\n                tooltipText={webSourceTooltips[webSourceKey][field]}\n                title=\"Information\"\n                className=\"text-pursuit-gray inline\"\n              />\n            )}{' '}\n            {isRequired && <span className=\"ml-1 text-pursuit-red\">* </span>}\n            {/* {field === 'description' && descriptionHelper} */}\n          </span>\n          {/* <ToolTip\n            tooltipText={webSourceDescriptionHelper[descriptionKey]}\n            title=\"Details\"\n            className=\"text-pursuit-gray inline\"\n          /> */}\n          <ElementType\n            type={fieldType}\n            placeholder={placeholder}\n            className={classes}\n            // value={selectedSource.uniqueFields[field] || ''}\n            value={fieldValue}\n            // No required attribute for now\n            required={isRequired}\n            pattern={pattern}\n            onChange={onChange}\n            // onChange={event => {\n            //   setUniqueInput(field, event.target.value);\n            // }}\n            key={`unique-input-${field}-${i}-${selectedSource.id}-${selectedSource.website}`}\n            children={options}\n            {...elementAttributes}\n          />\n          {characterLimit && (\n            <span\n              title=\"This field has a maximum size\"\n              className={`float-right inline-block text-sm px-2 rounded-full ${\n                fieldValue.length / characterLimit < 0.9 ? 'bg-gray-200' : 'bg-red-400 text-white'\n              }`}>\n              {fieldValue.length}/{characterLimit}\n            </span>\n          )}\n          {(isRequired || (pattern && fieldValue)) && <span className=\"validity\"></span>}\n          {/* <span class=\"validity\"></span> */}\n        </span>\n      );\n    });\n\n  // console.log('Fields', fieldsToDisplay);\n  // console.log('Unique Fields', uniqueFields);\n\n  return (\n    <>\n      {showDelete && (\n        <PopUpConfirmation\n          title={removeTitle}\n          content={removeConfirmation}\n          onConfirm={() => {\n            deleteSource();\n          }}\n          onCancel={() => {\n            setShowDelete(false);\n          }}\n          // confirmText={removeLabel}\n          confirmText=\"CONFIRM\"\n          destructive\n          className=\"w-11/12 lg:w-auto\"\n        />\n      )}\n      <div className=\"mb-8\">\n        {reviewing ? (\n          <h2 className=\"text-lg font-bold text-pursuit-gray\">Source {stepNumber}</h2>\n        ) : (\n          <h2 className=\"text-lg font-bold text-pursuit-gray\">Add Source {stepNumber}</h2>\n        )}\n        <div className=\"text-sm text-pursuit-gray\">\n          {!reviewing && stepNumber === 1 && (\n            <p>\n              Source 1 will always be an escort ad starting point. Therefore all Source Types in the dropdown are not\n              selectable when viewing or adding Source 1.\n            </p>\n          )}\n          {!reviewing && stepNumber !== 1 && (\n            <p>\n              Fill out as much info as you can about this source. You can add additional sources by clicking the 'Save\n              and Add New Source' button. Once you have added all of your sources, proceed to the next page to review\n              your details and submit your case for review.\n            </p>\n          )}\n        </div>\n      </div>\n      <div className=\"flex flex-col\">\n        <label className=\"text-pursuit-gray\">Source Type</label>\n\n        <select\n          id=\"source-type\"\n          name=\"Source Type\"\n          className=\"h-10 pl-2 mt-2 mb-4 bg-white shadow custom-select lg:w-64\"\n          value={selectedSource?.website}\n          onChange={event => {\n            setInput('website', event.target.value);\n          }}>\n          {websiteList.map((website, i) => (\n            // <option key={i} {website}</option>\n            <option key={i} value={website} disabled={stepNumber <= 1 && website !== 'Escort Ad'}>\n              {getWebSourceSiteLabel(website)}\n            </option>\n          ))}\n        </select>\n\n        {uniqueFields}\n\n        {/* <label className=\"text-pursuit-gray\">URL</label>\n        <input\n          type=\"url\"\n          placeholder=\"Paste URL\"\n          className=\"h-10 px-2 mt-2 mb-4 shadow lg:w-2/3 2xl:w-1/2\"\n          value={selectedSource?.url || ''}\n          onChange={event => {\n            setInput('url', event.target.value);\n          }}\n        />\n\n        <label className=\"text-pursuit-gray\">Description</label>\n        <textarea\n          placeholder=\"Explain how you got to this point and your analysis\"\n          className=\"h-24 px-2 mt-2 mb-4 shadow\"\n          value={selectedSource?.description || ''}\n          onChange={event => {\n            setInput('description', event.target.value);\n          }}\n        /> */}\n\n        <div className=\"flex flex-col mt-4 lg:flex-row-reverse\">\n          {saveAndAddButton}\n          {!reviewing && (\n            <Button solidRed padding=\"lg:mr-8\" className=\"mt-4 lg:w-88 lg:mt-0\" onClick={() => setShowDelete(true)}>\n              {/* DELETE SOURCE */}\n              {removeLabel}\n            </Button>\n          )}\n        </div>\n      </div>\n\n      {selectedSource && (\n        <Feedback comments={caseState?.feedbackComments || []} stepId={selectedSource.id} status={caseState?.status} />\n      )}\n    </>\n  );\n};\n\nexport default WebSourceForm;\n","import React, { useContext } from 'react';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { useHistory } from 'react-router-dom';\nimport { FileUploader, Container, HeaderText } from '../../../components';\nimport { submitCertification } from '../../../generated/graphql/mutations';\nimport { useUser } from '../../../contexts/userContext';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext';\n\nconst CertificateUpload = () => {\n  const { user, setUser } = useUser();\n  const [, setAlert] = useContext(NotificationContext);\n\n  const history = useHistory();\n\n  const successfullUpload = async s3Key => {\n    try {\n      const params = {\n        certificatePath: s3Key,\n      };\n\n      const {\n        data: { submitCertification: updatedUser },\n      } = await API.graphql(graphqlOperation(submitCertification, params));\n\n      setUser({ ...user, updatedUser });\n\n      history.push('/thank-you');\n    } catch (error) {\n      console.error('Error saving user on upload: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'An unexpected error occurred',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n  };\n\n  return (\n    <Container\n      grayedBackground\n      height=\"lg:h-168\"\n      width=\"lg:w-160\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col relative\"\n      margin=\"mx-3 md:mx-12 lg:mx-auto\"\n    >\n      <center>\n        <HeaderText fontSize=\"text-3xl lg:text-4xl\" noBold=\"font-light\">\n          Completed Training\n          <br />\n          Certificate Upload\n        </HeaderText>\n      </center>\n\n      <div className=\"w-400 p-9 pt-4 pb-20\">\n        <FileUploader onSuccess={successfullUpload} onCancel={() => history.push('/required-training')} />\n      </div>\n    </Container>\n  );\n};\n\nexport default CertificateUpload;\n","import React from 'react';\n\nconst PrivacyPolicy = () => (\n  <>\n    <p>\n      <strong>Privacy Policy</strong>\n    </p>\n    <br />\n    <p>\n      Guardian Group (&ldquo;Company,&rdquo; &ldquo; we,&rdquo; or &ldquo;us &rdquo;) respects your privacy and is\n      committed to protecting it through this Privacy Policy.\n    </p>\n    <br />\n    <p>\n      This Privacy Policy explains how we collect, use, and disclose information when you access and use project1591.us\n      and any other website on which this Privacy Policy is posted (the &ldquo;Website&rdquo;), whether as a guest or a\n      registered user.\n    </p>\n    <br />\n    <p>\n      When accessing the Website, the Company will learn certain information about you, both automatically and through\n      information you provide to us during your visit. This Privacy Policy applies to information we collect on the\n      Website and in email, text, or other electronic messages between you and the Website.\n    </p>\n    <br />\n    <p>\n      Please read the Privacy Policy carefully before you start to use the Website. By using the Website or by clicking\n      to accept or agree to the Terms of Use when this option is made available to you, you accept and agree to be bound\n      and abide by the Privacy Policy. If you do not agree to the Privacy Policy, you must not access or use the\n      Website.\n    </p>\n    <br />\n    <p>\n      <strong>Information We Collect About You</strong>\n    </p>\n    <br />\n    <p>\n      We collect the following categories and types of <strong>&ldquo;Personal Information&rdquo;</strong>:\n    </p>\n    <br />\n    <p>\n      • <strong>Contact Information: </strong>your first name and last name, mailing address, email address, and phone\n      number;\n    </p>\n    <p>\n      • <strong>Other Identifying Information: </strong>IP address, social media user names, passwords and other\n      security information for authentication and access;\n    </p>\n    <p>\n      • <strong>Financial Information: </strong>credit card and debit card information;\n    </p>\n    <p>\n      • <strong>Demographic Information: </strong>military history, race, ethnicity, gender and age;{' '}\n    </p>\n    <p>\n      • <strong>Commercial Information: </strong>products purchased or viewed on our Website;\n    </p>\n    <p>\n      • <strong>Geolocation Information: </strong>imprecise location data based upon your IP address;\n    </p>\n    <p>\n      • <strong>Internet or Other Electronic Activity: </strong>your operating system, browser type, and browsing and\n      click history, including information about how you navigate within our website and which elements of our Website\n      you use most;\n    </p>\n    <p>\n      • <strong>Inferences: </strong>inferences we draw from the other categories of information that we collect which\n      reflect your preferences, characteristics, behavior and attitude.{' '}\n    </p>\n    <br />\n    <p>\n      <strong>How We Use Personal Information</strong>\n    </p>\n    <br />\n    <p>We use your personal information for the following categories of use:</p>\n    <br />\n    <p>\n      • <strong>Transactional Purposes.</strong> We use your contact information, other identifying information,\n      financial information, and internet or other electronic activity to: <br />\n      - Communicate with you about our Website, services and products.\n      <br />\n      - Carry out any contract between you and the Company, collect donations, and administer our business activities.\n      <br />- Provide customer service and making available other items and services to our customers and prospective\n      customers.\n    </p>\n    <p>\n      • <strong>Analytical Purposes.</strong> We use your other identifying information, internet activity or other\n      electronic activity, financial information, demographic information, commercial information, geolocation data, and\n      inferences to analyze preferences, trends and statistics.\n    </p>\n    <p>\n      • <strong>Marketing and Promotional Purposes.</strong> We use your contact information, other identifying\n      information, demographic information, commercial information, geolocation information, internet or other\n      electronic activity, and inferences to:\n      <br />\n      - Provide you with offers, promotions, and information for and about our products and services.\n      <br />\n      - Keep you informed about the products and services you have selected to receive and any related products and/or\n      services.\n      <br />\n      - Provide you offers to purchase products and services provided by third parties in exchange for a commission to\n      be paid to us by such third parties.\n      <br />- Display advertisements to you that are tailored to your personal characteristics, interests, and\n      activities.\n    </p>\n    <p>\n      •<strong>Maintenance and Improvement of the Website.</strong> We use your contact information, other identifying\n      information, commercial information, and internet or other electronic activity to:\n      <br />\n      - Help diagnose technical and service problems and administer our Website, including determining technical design\n      specifications, improve our overall performance, and identifying system performance or problem areas.\n      <br />\n      - Handle your customer service requests.\n      <br />- Present our Website and its contents to you. The Company may use software programs to create summary\n      statistics, which are used for such purposes as assessing the number of visitors to the different sections of our\n      site, what information is of most and least interest.\n    </p>\n    <p>\n      • <strong>Security and Fraud Prevention: </strong>We use contact information, other identifying information,\n      commercial information, financial information, demographic information, geolocation information, internet activity\n      and other electronic activity, audio and video information, and inferences to protect the Website, our Company,\n      victims of sex trafficking, and others, and to prevent fraud, theft, and misconduct.\n    </p>\n    <br />\n    <br />\n    <p>\n      <strong>Sources of Personal Information</strong>\n    </p>\n    <br />\n    <p>We collect Personal Information from the following sources:</p>\n    <br />\n    <p>\n      • <strong>We collect information directly from you.</strong> We collect contact, other identifying information,\n      financial information, demographic information directly from you. We collect information that users provide by\n      filling out forms on the Website, registering for a class, communicating with us via contact forms, responding to\n      surveys, search queries on our search feature, providing comments or other feedback, and providing information\n      when ordering a product or service via the Website.{' '}\n    </p>\n    <p>\n      • <strong>We collect information about you from third parties.</strong> We collect your Personal Information from\n      third parties, including our volunteers. Volunteers gather information about you from publicly available sources\n      on the internet, such as social media and government websites.{' '}\n    </p>\n    <p>\n      • <strong>We collect information from you passively.</strong> We collect other identifying information and\n      internet or other electronic activity passively using tools like browser cookies and pixels. This activity is\n      further described in the Cookies, Advertising and Online Tracking section below.\n    </p>\n    <br />\n    <p>\n      <strong>Categories of Third Parties We Share Personal Information With</strong>\n    </p>\n    <br />\n    <p>We share Personal Information with the following categories of third parties:</p>\n    <br />\n    <p>\n      <i>Service Providers</i>\n    </p>\n    <br />\n    <p>\n      From time to time, we may establish a business relationship with other businesses whom we believe trustworthy and\n      who have confirmed that their privacy practices are consistent with ours (\n      <strong>&ldquo;Service Providers&rdquo;</strong>). For example, we may contract with Service Providers to provide\n      certain services, such as hosting and maintenance, data storage and management, and marketing and promotions. We\n      only provide our Service Providers with the information necessary for them to perform these services on our\n      behalf. Each Service Provider must agree to use reasonable security procedures and practices, appropriate to the\n      nature of the information involved, in order to protect your Personal Information from unauthorized access, use,\n      or disclosure. Service Providers are prohibited from using Personal Information other than as specified by us.\n    </p>\n    <br />\n    <p>\n      <i>Compliance with Laws and Law Enforcement</i>\n    </p>\n    <br />\n    <p>\n      We cooperate with government and law enforcement officials and private parties to enforce and comply with the law.\n      We may disclose Personal Information and any other information about you to government or law enforcement\n      officials or private parties if, in our discretion, we believe it is necessary or appropriate in order to respond\n      to legal requests (including court orders and subpoenas), to protect the safety, property, or rights of our\n      company or of any third party, to prevent or stop any illegal, unethical, or legally actionable activity, or to\n      comply with the law. This includes disclosure of Personal Information to report human trafficking to law\n      enforcement.{' '}\n    </p>\n    <br />\n    <p>\n      <i>Our Affiliates</i>\n    </p>\n    <br />\n    <p>\n      We may share Personal Information with businesses controlling, controlled by, or under common control with our\n      Company.{' '}\n    </p>\n    <br />\n    <p>\n      <i>Corporate Transactions</i>\n    </p>\n    <br />\n    <p>\n      If our Company is merged, acquired, or sold, or in the event of a transfer of some or all of our assets, we may\n      disclose or transfer Personal Information in connection with such transaction. You will have the opportunity to\n      opt out of any such transfer if, in our discretion, it will result in the handling of your Personal Information in\n      a way that differs materially from this Privacy Policy.\n    </p>\n    <br />\n    <p>\n      <strong>Use of Cookies</strong>\n    </p>\n    <br />\n    <p>\n      Our website utilizes &ldquo;cookies&rdquo; and similar technologies to collect information about how our Website\n      is used. A cookie is a very small text document, which often includes an anonymous unique identifier, that is\n      stored on your computer to identify your computer and web browser. Information gathered through cookies may\n      include the date and time of visits, the pages viewed, time spent at our site, and the websites visited just\n      before and just after our own, as well as your IP address.\n    </p>\n    <br />\n    <p>\n      Most web browsers are initially setup to accept cookies. You can reset you web browser to refuse all cookies or to\n      indicate when a cookie is being sent, however, certain features of the Website may not work if you delete or\n      disable cookies. Some of our Service Providers may use their own cookies, anonymous identifiers, or other tracking\n      technology in connection with the services they perform on our behalf.\n    </p>\n    <br />\n    <p>\n      We use Google Analytics on the Website to analyze how users use the Website, and to provide advertisements to you\n      on other websites. For more information about how to opt out of having your information used by Google Analytics,\n      visit{' '}\n      <a\n        href=\"https://tools.google.com/dlpage/gaoptout/\"\n        className=\"underline text-guardian-blue\"\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >\n        https://tools.google.com/dlpage/gaoptout/\n      </a>\n      .\n    </p>\n\n    <br />\n    <p>\n      <strong>Advertising and Online Tracking</strong>\n    </p>\n    <br />\n    <p>\n      Some content or applications, including advertisements, on the Website are served by third-parties, including\n      advertisers, ad networks and servers, content providers, and application providers. These third parties may use\n      cookies alone or in conjunction with web beacons or other tracking technologies to collect personal information\n      about you when you use our website. The information they collect may be associated with your personal information\n      or they may collect information, including personal information, about your online activities over time and across\n      different websites and other online services. They may use this information to provide you with interest-based\n      (behavioral) advertising or other targeted content.\n    </p>\n    <br />\n    <p>\n      Our systems do not recognize browser &ldquo;Do Not Track&rdquo; signals, but several Service Providers who utilize\n      cookies on our Website enable you to opt out of targeted advertising practices. To learn more about these\n      advertising practices or to opt out of this type of advertising, you can visit{' '}\n      <a\n        href=\"https://www.networkadvertising.org\"\n        className=\"underline text-guardian-blue\"\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >\n        www.networkadvertising.org\n      </a>{' '}\n      or{' '}\n      <a\n        href=\"https://www.aboutads.info/choices/\"\n        className=\"underline text-guardian-blue\"\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >\n        www.aboutads.info/choices/\n      </a>\n      . We also provide you with additional tools to opt out of marketing from us. You can learn about this in the\n      “Managing Your Information Preferences” section of this Privacy Policy.\n    </p>\n    <br />\n    <p>\n      <strong>Managing Your Information Preferences</strong>\n    </p>\n    <br />\n    <p>\n      You can review, correct, update, or change your Personal Information by changing the relevant settings in your\n      account or by emailing us at{' '}\n      <a\n        href=\"mailto:project1591@guardiangroup.org?subject=Project 1591 App Feedback\"\n        className=\"underline text-guardian-blue\"\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >\n        project1591@guardiangroup.org\n      </a>\n      . We do not share your Personal Information with third parties for their direct marketing purposes. Our emails\n      provide users the opportunity to opt-out of receiving communications from us, including our newsletter or\n      promotional materials, through the “unsubscribe” link at the bottom of our emails. You are able to opt out of\n      receiving marketing emails from us, however, you cannot opt out of receiving all emails from us, such as emails\n      about the status of your account. If you ever have trouble unsubscribing or other questions about this Privacy\n      Policy, you can send an email to{' '}\n      <a\n        href=\"mailto:project1591@guardiangroup.org?subject=Project 1591 App Feedback\"\n        className=\"underline text-guardian-blue\"\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >\n        project1591@guardiangroup.org\n      </a>\n      .\n    </p>\n    <br />\n    <p>\n      <strong>How Do We Protect Your Information and Secure Information Transmissions?</strong>\n    </p>\n    <br />\n    <p>\n      We employ physical, electronic, and procedural safeguards to ensure the security of the information we collect.\n      This includes using standard security protocols and working only with reputable third-party vendors. However, no\n      data transmission over the Internet or other network can be guaranteed to be 100% secure. As a result, while we\n      strive to protect information transmitted on or through the Website, we cannot and do not guarantee the security\n      of any information you transmit on or through the Website, and you do so at your own risk.\n    </p>\n    <br />\n    <p>\n      <strong>Links to Other Websites</strong>\n    </p>\n    <br />\n    <p>\n      Our Website may contain links to other websites or allow others to send you such links. A link to a third party's\n      website does not mean that we endorse it or that we are affiliated with it. We do not exercise control over third\n      party websites. You access such third party websites or content at your own risk. You should always read the\n      Privacy Policy of a third party website before providing any information to that website.\n    </p>\n    <br />\n    <p>\n      <strong>Processing in the United States</strong>\n    </p>\n    <br />\n    <p>\n      Please be aware that your Personal Information and communications may be transferred to and maintained on servers\n      or databases located outside your state, province, or country. If you are located outside of the United States,\n      please be advised that we process and store all information in the United States. The laws in the United States\n      may not be as protective of your privacy as those in your location. By using the Website, you are agreeing to the\n      collection, use, transfer, and disclosure of your Personal Information and communications will be governed by the\n      applicable laws in the United States.\n    </p>\n    <br />\n    <p>\n      <strong>Policy Changes</strong>\n    </p>\n    <br />\n    <p>\n      It is our policy to post any changes we make to our Privacy Policy on this page. If we make changes to how we\n      treat our users' personal information, we will notify you by posting the revised Privacy Policy on the Website.\n      The date the Privacy Policy was last revised is identified at the bottom of the page. By continuing to use the\n      Website, you are consenting to the revised Privacy Policy.\n    </p>\n    <br />\n    <p>\n      <strong>Contact Us</strong>\n    </p>\n    <br />\n    <p>Guardian Group welcomes your questions or comments regarding the Privacy Policy:</p>\n    <br />\n    <p>Guardian Group</p>\n    <p>1900 NE 3rd St.</p>\n    <p>Suite 106 #40</p>\n    <p>Bend, OR 97701</p>\n    <br />\n    <p>\n      Email Address:{' '}\n      <a\n        href=\"mailto:project1591@guardiangroup.org?subject=Project 1591 App Feedback\"\n        className=\"underline text-guardian-blue\"\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >\n        project1591@guardiangroup.org\n      </a>\n    </p>\n    <p>Effective as of July 9, 2019; Last updated May 19, 2022</p>\n    <p>&nbsp;</p>\n  </>\n);\n\nexport default PrivacyPolicy;\n","import React, { Component } from 'react';\nimport Container from '../../../components/Container';\nimport HeaderText from '../../../components/HeaderText';\nimport PrivacyPolicy from './privacyPolicy';\n\nclass Privacy extends Component {\n  render() {\n    return (\n      <Container height=\"h-168\" width=\"w-160\" padding=\"px-20 py-8\" className=\"flex flex-col\" margin=\"mx-auto\">\n        <center>\n          <HeaderText noBold fontSize=\"text-4xl\" className=\"mt-2pr mb-4\">\n            Privacy Policy\n          </HeaderText>\n        </center>\n        <br />\n        <p className=\"overflow-y-auto\">\n          <PrivacyPolicy />\n        </p>\n        <br />\n      </Container>\n    );\n  }\n}\n\nexport default Privacy;\n","import React, { Component } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Button, Container, HeaderText } from '../../../components';\n\nclass RequiredTraining extends Component {\n  render() {\n    return (\n      <Container\n        grayedBackground\n        height=\"lg:h-168\"\n        width=\"lg:w-160\"\n        padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n        className=\"flex flex-col\"\n        margin=\"mx-3 md:mx-12 lg:mx-auto\"\n      >\n        <center>\n          <HeaderText noBold fontSize=\"text-4xl\" className=\"mt-2 mb-4\">\n            Required Training\n          </HeaderText>\n        </center>\n\n        <br />\n        <div className=\"overflow-y-auto mb-4 px-1\">\n          <p>Welcome!</p>\n\n          <br />\n\n          <p>\n            Thanks for signing up and wanting to join Guardian Group in our efforts to counter Commercial Sexual\n            Exploitation of Children (CSEC) here in the United States. Yes, you the volunteer can help us! We believe\n            that through a coordinated collaborative partnership of people with varying skills, motivations and desires,\n            we can have a greater impact as a collective group. This is your opportunity to contribute to a problem that\n            exists in your own city and state. You can have a life-changing impact on the lives of our most vulnerable\n            population.\n          </p>\n\n          <br />\n\n          <p>\n            Before allowing you access to this site, you must first complete the “PURSUIT® - Volunteer Training &\n            Assessment” course at our PURSUIT® Group Academy. A certificate of completion will only be given to those\n            that have successfully completed 3 practical exams with a passing score. Once complete and with certificate\n            in hand, return here to upload your certificate for access approval.\n          </p>\n\n          <br />\n\n          <p>\n            <strong>Important:</strong> When creating your user account at PURSUIT® Group Academy, ensure you use the\n            same credentials you used in creating this account. This is how we will match up the two accounts across two\n            different platforms.\n          </p>\n          <br />\n          <p>Thanks. We look forward to you returning with your certificate.</p>\n        </div>\n        <Link to=\"#\" className=\"link-signup\">\n          <Button\n            solidBlue\n            className=\"btton-signup w-full\"\n            onClick={e => {\n              window.location = 'https://courses.pursuitgroupacademy.us/courses/pursuit-volunteer-training-assessment';\n              e.preventDefault();\n            }}\n          >\n            <span className=\"m-0 p-0 hidden md:inline\">START PURSUIT –&nbsp;</span>VOLUNTEER TRAINING & ASSESSMENT\n            <span className=\"m-0 p-0 hidden md:inline\">&nbsp;COURSE</span>\n          </Button>\n        </Link>\n\n        <Link to=\"/certificate-upload\" className=\"link-signup mt-4 mb-2\">\n          <Button linedBlue className=\"btton-signup w-full\">\n            ALREADY FINISHED YOUR TRAINING?\n          </Button>\n        </Link>\n      </Container>\n    );\n  }\n}\n\nexport default RequiredTraining;\n","import React from 'react';\n\nconst TermsOfUse = () => (\n  <>\n    <p>\n      <strong>Website Terms of Use</strong>\n    </p>\n    <br />\n    <p>\n      The following Terms of Use are entered into by and between You and Guardian Group (&ldquo;\n      <strong>Company</strong>&rdquo;, &ldquo;\n      <strong>we</strong>&rdquo;, or &ldquo;<strong>us</strong>\n      &rdquo;).\n    </p>\n    <br />\n    <p>\n      The following terms and conditions, together with any documents they expressly incorporate by reference\n      (collectively, these &ldquo;<strong>Terms of Use</strong>&rdquo;), govern your access to and use of\n      project1591.us, including any content, functionality and services offered on or through project1591.us (the\n      &ldquo;<strong>Website</strong>&rdquo;), whether as a guest or a registered user.\n    </p>\n    <br />\n    <p>\n      Please read the Terms of Use carefully before you start to use the Website.{' '}\n      <strong>\n        By using the Website or by clicking to accept or agree to the Terms of Use when this option is made available to\n        you, you accept and agree to be bound and abide by these Terms of Use and our Privacy Policy, incorporated\n        herein by reference.\n      </strong>{' '}\n      If you do not want to agree to these Terms of Use including the agreements incorporated by reference herein, you\n      must not access or use the Website.\n    </p>\n    <br />\n    <p>\n      This Website is offered and available to users who are 18 years of age or older. By using this Website, you\n      represent and warrant that you are of legal age to form a binding contract with the Company and meet all of the\n      foregoing eligibility requirements. If you do not meet all of these requirements, you must not access or use the\n      Website.\n    </p>\n    <br />\n    <p>\n      <strong>By using our Services, you represent and warrant that:</strong>\n    </p>\n    <br />\n    <p>1. You are at least 18 years old;</p>\n    <br />\n    <p>2. You are legally qualified to enter a binding contract with Guardian Goup;</p>\n    <br />\n    <p>\n      3. You have not have been convicted of or pled no contest to a felony or indictable offense (or crime of similar\n      severity), a sex crime, or any crime involving violence;\n    </p>\n    <br />\n    <p>4. You are not required to register as a sex offender with any state, federal or local sex offender registry;</p>\n    <br />\n    <p>5. You do not have more than one account on our Services; and</p>\n    <br />\n    <p>\n      6. You have not previously been removed from our Services by us, unless you have our express written permission to\n      create a new account.\n    </p>\n    <br />\n    <p>\n      <strong>Privacy</strong>\n    </p>\n    <br />\n    <p>\n      Your use of the Website is subject to the Company&rsquo;s Privacy Policy. Please review our Privacy Policy, which\n      also governs the Website and informs users of our data collection practices. Your agreement to the Privacy Policy\n      is hereby incorporated into these Terms of Use.\n    </p>\n    <br />\n    <p>\n      <strong>Disclaimer</strong>\n    </p>\n    <br />\n    <p>\n      Your use of the Website is subject to the Company&rsquo;s Disclaimer. Please review our Disclaimer, which also\n      governs the Website and informs users of various limitations regarding the information provided on the Website.\n      Your agreement to the Disclaimer is hereby incorporated into these Terms of Use.\n    </p>\n    <br />\n    <p>\n      <strong>Accessing The Website And Account Security</strong>\n    </p>\n    <br />\n    <p>\n      We reserve the right to withdraw or amend this Website and any service or material we provide on the Website in\n      our sole discretion without notice. We will not be liable if, for any reason, all or any part of the Website is\n      unavailable at any time or for any period. From time to time, we may restrict access to some parts of the Website,\n      or the entire Website, to users, including registered users.\n    </p>\n    <br />\n    <p>\n      To access the Website or some of the resources it offers, you may be asked to provide certain registration details\n      or other information. It is a condition of your use of the Website and any resources downloaded from the Website\n      that all the information you provide on the Website is correct, current, and complete. You agree that all\n      information you provide to register with this Website or otherwise, including but not limited to through the use\n      of any interactive features on the Website, is governed by our Privacy Policy, and you consent to all actions we\n      take with respect to your information consistent with our Privacy Policy.\n    </p>\n    <br />\n    <p>\n      If you choose, or are provided with, a user name, password or any other piece of information as part of our\n      security procedures, you must treat such information as confidential, and you must not disclose it to any other\n      person or entity. You also acknowledge that your account is personal to you and agree not to provide any other\n      person with access to this Website or portions of it using your user name, password or other security information.\n      You agree to notify us immediately of any unauthorized access to or use of your user name or password or any other\n      breach of security. You also agree to ensure that you exit from your account at the end of each session. You\n      should use particular caution when accessing your account from a public or shared computer so that others are not\n      able to view or record your password or other personal information.\n    </p>\n    <br />\n    <p>\n      We have the right to disable any user name, password or other identifier, whether chosen by you or provided by us,\n      at any time in our sole discretion for any or no reason, including if, in our opinion, you have violated any\n      provision of these Terms of Use.\n    </p>\n    <br />\n    <p>\n      <strong>Acceptable Use of the Website and Resources</strong>\n    </p>\n    <br />\n    <p>\n      You are responsible for your use of the Website and resources available for download from the Website\n      (“Resources”), and for any use of the Website or Resources made using your account. When you use the Website or\n      Resources, you shall not:\n    </p>\n    <ul>\n      <li> • Violate any law or regulation;</li>\n      <li> • Violate or infringe other people's intellectual property, publicity, or other legal rights;</li>\n      <li>\n        {' '}\n        • Transmit anything that is illegal, abusive, harassing, harmful to reputation, pornographic, indecent, profane,\n        obscene, hateful, racist, or otherwise objectionable;\n      </li>\n      <li> • Send unsolicited or unauthorized advertising or commercial communications, such as spam;</li>\n      <li> • Transmit any malicious code or computer viruses;</li>\n      <li> • Stalk, harass, or harm another individual;</li>\n      <li>\n        {' '}\n        • Interfere with or damage the Website or Resources, including, without limitation, through the use of viruses,\n        cancel bots, Trojan horses, malicious code, flood pings, denial-of-service attacks, packet or IP spoofing,\n        forged routing or electronic mail address information, or similar methods or technology;\n      </li>\n      <li>\n        {' '}\n        • Register for more than one account or register for an account on behalf of an individual other than yourself;\n      </li>\n      <li>\n        {' '}\n        • Access, tamper with, or use non-public areas of the Website, Company's computer systems, or the technical\n        delivery systems of Company's providers;\n      </li>\n      <li>\n        {' '}\n        • Attempt to probe, scan, or test the vulnerability of any Company system or network or breach any security or\n        authentication measures;\n      </li>\n      <li>\n        {' '}\n        • Avoid, bypass, remove, deactivate, impair, descramble, or otherwise circumvent any technological measure\n        implemented by Company or any of Company's providers or any other third party (including another user) to\n        protect the Website;\n      </li>\n      <li>\n        {' '}\n        • Attempt to decipher, decompile, disassemble, or reverse engineer any of the software used to provide the\n        Website or Resources; or{' '}\n      </li>\n      <li> • Advocate, encourage, or assist any third party in doing any of the foregoing.</li>\n      <li>\n        {' '}\n        • Use the Website or Resources in any manner that could damage, disable, overburden, or impair the Website or\n        interfere with any other party's use and enjoyment of the Website.{' '}\n      </li>\n      <li>\n        {' '}\n        • Obtain or attempt to obtain any materials or information through any means not intentionally made available or\n        provided for through the Website.\n      </li>\n      <li>\n        {' '}\n        • Violate any code of conduct or other guidelines which may be applicable for any particular Communication\n        Service.\n      </li>\n      <li>\n        {' '}\n        • Falsify or delete any author attributions, legal or other proper notices or proprietary designations or labels\n        of the origin or source of software or other material contained in a file that is uploaded.\n      </li>\n      <li>\n        {' '}\n        • Harvest or otherwise collect information about others, including e-mail addresses, without their consent.\n      </li>\n    </ul>\n    <br />\n    <p>\n      Company will investigate and prosecute violations of any of the above to the fullest extent of the law. Company\n      may involve and cooperate with law enforcement authorities in prosecuting users who violate these Terms. You\n      acknowledge that Company has no obligation to monitor your access to or use of the Website or Resources, but has\n      the right to do so for the purpose of operating the Website or providing the Resources, to ensure your compliance\n      with these Terms, or to comply with the law or the order or requirement of a court, administrative agency, or\n      other governmental body. Company reserves the right, at any time and without prior notice, to remove or disable\n      access to any content on the Website that Company, at its sole discretion, considers to be objectionable for any\n      reason, in violation of these Terms, or otherwise harmful to the Website.\n    </p>\n\n    <br />\n    <p>\n      <strong>Intellectual Property</strong>\n    </p>\n    <br />\n    <p>\n      You are granted a non-exclusive, non-transferable, revocable license to access and use the Website and the\n      resources available for download from the Website strictly in accordance with these Terms of Use.\n    </p>\n    <br />\n    <p>\n      All content included as part of the Service, such as text, graphics, logos, images, as well as the compilation\n      thereof, and any software used on the Website, is the property of the Company or its suppliers and protected by\n      copyright and other laws that protect intellectual property and proprietary rights. You agree to observe and abide\n      by all copyright and other proprietary notices, legends or other restrictions contained in any such content and\n      will not make any changes thereto.\n    </p>\n    <br />\n    <p>\n      You will not modify, publish, transmit, reverse engineer, participate in the transfer or sale, create derivative\n      works, or in any way exploit any of the content, in whole or in part, found on the Website or any of the resources\n      available for download from the Website.\n    </p>\n    <br />\n    <p>\n      The Company content is not for resale. Your use of the Website or Resources from the Website does not entitle you\n      to make any unauthorized use of any protected content, and in particular you will not delete or alter any\n      proprietary rights or attribution notices in any content. You will use protected content solely for your\n      individual use, and will make no other use of the content without the express written permission of the Company\n      and the copyright owner. You agree that you do not acquire any ownership rights in any protected content. We do\n      not grant you any licenses, express or implied, to the intellectual property of the Company or our licensors\n      except as expressly authorized by these Terms.\n    </p>\n    <br />\n    <p>\n      The Company name, the Company logo, the Company slogan, and all related names, logos, product and service names,\n      designs, and slogans are trademarks of the Company or its affiliates or licensors. You must not use such marks\n      without the prior written permission of the Company. All other names, logos, product and service names, designs\n      and slogans on this Website are the trademarks of their respective owners.\n    </p>\n    <br />\n    <p>\n      <strong>For Educational And Informational Purposes Only</strong>\n    </p>\n    <br />\n    <p>\n      As set forth more fully in the Disclaimer, the information contained on this Website and the resources available\n      for download through this Website are for educational and informational purposes only. The information contained\n      on this Website and the resources available for download through this Website is not intended as, and shall not be\n      understood or construed as legal, financial, tax, medical, health, or any other professional advice.\n    </p>\n    <br />\n    <p>\n      <strong>Accuracy And Personal Responsibility</strong>\n    </p>\n    <br />\n    <p>\n      As set forth more fully in the Disclaimer, we have done our best to ensure that the information provided on this\n      Website and the resources available for download are accurate and provide valuable information, but we cannot\n      guarantee the accuracy of the information. Neither the Company nor any of its owners or employees shall be held\n      liable or responsible for any errors or omissions on this Website or for any damage you may suffer as a result of\n      failing to seek competent advice from a professional who is familiar with your situation.\n    </p>\n    <br />\n    <p>\n      By using this Website, you accept personal responsibility for the results of your actions. You agree to take full\n      responsibility for any harm or damage you suffer as a result of the use, or non-use, of the information available\n      on this Website or the resources available for download from this Website. You agree to use judgment and conduct\n      due diligence before taking any actions or implementing any plans or policy suggested or recommended on this\n      Website.\n    </p>\n    <br />\n    <p>\n      <strong>No Guarantees As To Results</strong>\n    </p>\n    <br />\n    <p>\n      As set forth more fully in the Disclaimer, you agree that the Company has not made any guarantees about the\n      results of taking any action, whether recommended on this Website or not. The Company provides educational and\n      informational resources that are intended to help users of this Website succeed. You nevertheless recognize that\n      your ultimate success or failure will be the result of your own efforts, your particular situation, and\n      innumerable other circumstances beyond the control and/or knowledge of the Company.\n    </p>\n    <br />\n    <p>\n      You also recognize that prior results do not guarantee a similar outcome. Thus, the results obtained by others\n      &ndash; whether clients of the Company or otherwise &ndash; applying the principles set out in this Website are no\n      guarantee that you or any other person or entity will be able to obtain similar results.\n    </p>\n    <br />\n    <p>\n      <strong>Use Of Communication Services</strong>\n    </p>\n    <br />\n    <p>\n      The Website may contain bulletin board services, chat areas, news groups, forums, communities, personal web pages,\n      calendars, blog comment sections and/or other message or communication facilities designed to enable you to\n      communicate with the public at large or with a group (collectively, &ldquo;\n      <strong>Communication Services</strong>&rdquo;), you agree to use the Communication Services only to post, send\n      and receive messages and material that are proper and related to the particular Communication Service.\n    </p>\n    <br />\n    <p>\n      The Company reserves the right to terminate your access to any or all of the Communication Services at any time\n      without notice for any reason whatsoever.\n    </p>\n    <br />\n    <p>\n      The Company reserves the right at all times to disclose any information as necessary to satisfy any applicable\n      law, regulation, legal process or governmental request, or to edit, refuse to post or to remove any information or\n      materials, in whole or in part, in the Company&rsquo;s sole discretion.\n    </p>\n    <br />\n    <p>\n      Always use caution when giving out any personally identifying information about yourself in any Communication\n      Service. The Company does not control or endorse the content, messages or information found in any Communication\n      Service and, therefore, the Company specifically disclaims any liability with regard to the Communication Services\n      and any actions resulting from your participation in any Communication Service. Managers and hosts are not\n      authorized Company spokespersons, and their views do not necessarily reflect those of the Company.\n    </p>\n    <br />\n    <p>\n      Materials uploaded to a Communication Service may be subject to posted limitations on usage, reproduction and/or\n      dissemination. You are responsible for adhering to such limitations if you upload the materials.\n    </p>\n    <br />\n    <p>\n      <strong>Materials Provided To The Website</strong>\n    </p>\n    <br />\n    <p>\n      The Company does not claim ownership of the materials you provide to the Website (including feedback and\n      suggestions) or post, upload, input or submit to any Website or our associated services (collectively &ldquo;\n      <strong>Submissions</strong>\n      &rdquo;). However, by posting, uploading, inputting, providing, or submitting your Submission you are granting the\n      Company, our affiliated companies, and necessary sub-licensees permission to use your Submission in connection\n      with the operation of their Internet businesses including, without limitation, the rights to: copy, distribute,\n      transmit, publicly display, publicly perform, reproduce, edit, translate, and reformat your Submission; and to\n      publish your name in connection with your Submission.\n    </p>\n    <br />\n    <p>\n      Our license to Submissions is non-exclusive, meaning that you may use the Submissions for your own purposes or let\n      others use your Submissions for their purpose. Our license to your Submission is fully-paid and royalty free,\n      meaning we do not owe you anything else in connection with our use of your Submissions. We may exercise our rights\n      anywhere in the world and our license is perpetual, meaning that our license lasts for an indefinite period of\n      time.{' '}\n    </p>\n\n    <br />\n    <p>\n      By posting, uploading, inputting, providing, or submitting your Submission you warrant and represent that\n      <ul>\n        <li>\n          {' '}\n          • you own or otherwise control all of the rights to your Submission as described in this section including,\n          without limitation, all the rights necessary for you to provide, post, upload, input or submit the\n          Submissions;\n        </li>\n        <li>\n          {' '}\n          • you have paid and will pay in full any fees or other payments that may be related to the use of your\n          Submissions; and\n        </li>\n        <li>\n          {' '}\n          • Your Submissions do not infringe the intellectual property rights, privacy rights, publicity rights, or\n          other legal rights of any third party.\n        </li>\n      </ul>\n    </p>\n    <br />\n    <p>\n      The Company is under no obligation to accept, post or use any Submissions you may provide and we may remove any\n      Submissions from the Website at any time in the Company's sole discretion.\n    </p>\n    <br />\n    <p>\n      <strong>Ownership</strong>\n    </p>\n    <br />\n    <p>\n      Other than the Submissions, we own or license the content on the Website, including software, text, visual, and\n      audio content (collectively, the &ldquo;\n      <strong>Content</strong>&rdquo;) and the Company's trademarks, logos, and brand elements (collectively,the &ldquo;\n      <strong>Marks</strong>&rdquo;). The Content and Marks are protected under U.S. and international laws. We reserve\n      all rights not expressly granted to you.\n    </p>\n    <br />\n    <p>\n      <strong>Links To Third Party Websites And Services</strong>\n    </p>\n    <br />\n    <p>\n      The Website may contain links to other Websites (&ldquo;\n      <strong>Linked Websites</strong>&rdquo;). The Linked Websites are not under the control of the Company and the\n      Company is not responsible for the contents of any Linked Website, including without limitation any link contained\n      in a Linked Website, or any changes or updates to a Linked Website. The Company is providing these links to you\n      only as a convenience, and the inclusion of any link does not imply endorsement by the Company of the Website or\n      any association with its operators. We are not responsible or liable for any damage or loss related to the use of\n      any third-party website. You should always read the terms and conditions and privacy policy of a third-party\n      website before using it.\n    </p>\n    <br />\n    <p>\n      Certain services made available via the Website are delivered by third-party Websites and organizations. By using\n      any product, service, or functionality originating from the Website, you hereby acknowledge and consent that the\n      Company may share such information and data with any third party with whom the Company has a contractual\n      relationship to provide the requested product, service or functionality on behalf of the Website&rsquo;s users and\n      customers.\n    </p>\n    <br />\n    <p>\n      You should make whatever investigation you feel necessary or appropriate before proceeding with any interaction\n      with any of these third parties. You agree that Company is not responsible or liable for any loss or damage of any\n      kind or nature incurred as the result of any such dealings. If there is a dispute between users of the Website, or\n      between users and any third party, you understand and agree that Company is under no obligation to become\n      involved. In the event that you have a dispute with any other user of the Website, you hereby release Company and\n      its affiliates, and their officers, employees, agents, and successors from claims, demands, and damages (actual\n      and consequential) of every kind or nature, known and unknown, suspected and unsuspected, disclosed and\n      undisclosed, arising out of or in any way related to such disputes or the Website. If you are a California\n      resident, you waive California Civil Code Section 1542, which provides: A general release does not extend to\n      claims which the creditor does not know or suspect to exist in his favor at the time of executing the release,\n      which, if known by him must have materially affected his settlement with the debtor.\n    </p>\n    <br />\n    <p>\n      <strong>Use Of Templates And Forms</strong>\n    </p>\n    <br />\n    <p>\n      The Company provides various templates and/or forms for download and/or sale on this Website. The Company grants\n      you a limited, personal, non-exclusive, non-transferable license to use our templates and/or forms. Except as\n      otherwise provided, you acknowledge and agree that you have no right to modify, edit, copy, reproduce, create\n      derivative works of, reverse engineer, alter, enhance or in any way exploit any of the templates and/or forms in\n      any manner, except for modifications in filling out the templates and/or forms for your authorized use.\n    </p>\n    <br />\n    <p>\n      By ordering or downloading Forms, you agree that the Forms you purchase or download may only be used by you for\n      your personal use and may not be sold or redistributed without the express written consent of the Company.\n    </p>\n    <br />\n    <p>\n      <strong>Use of Paid Courses, Programs, and Associated Material</strong>\n    </p>\n    <br />\n    <p>\n      The Company from time-to-time provides various courses, programs, and associated material for sale on this\n      Website. The Company grants you a limited, personal, non-exclusive, non-transferable license to use our courses,\n      programs, and associated material (collectively the &ldquo;\n      <strong>Courses</strong>&rdquo;) for your own personal use. Except as otherwise provided, you acknowledge and\n      agree that you have no right to modify, edit, copy, reproduce, create derivative works of, reverse engineer,\n      alter, enhance or in any way exploit any of the Courses in any manner.\n    </p>\n    <br />\n    <p>\n      By ordering or participating in Courses, you agree that the Courses you purchase or download may only be used by\n      you for your personal use and may not be sold or redistributed without the express written consent of the Company.\n    </p>\n    <br />\n    <p>\n      By ordering or participating in Courses, you further agree that you shall not create any derivative work based\n      upon the Courses and you shall not offer any competing products or services based upon any information contained\n      in the Courses.\n    </p>\n    <br />\n    <p>\n      <strong>Use Of Free Downloadable Content</strong>\n    </p>\n    <br />\n    <p>\n      The Company provides various resources on this Website, which users may access by providing an e-mail address. The\n      Company grants you a limited, personal, non-exclusive, non-transferable license to use our resources provided in\n      exchange for an email address (the &ldquo;<strong>Freemium Content</strong>\n      &rdquo;) for your own personal use. Except as otherwise provided, you acknowledge and agree that you have no right\n      to modify, edit, copy, reproduce, create derivative works of, reverse engineer, alter, enhance or in any way\n      exploit any of the Freemium Content in any manner.\n    </p>\n    <br />\n    <p>\n      By downloading the Freemium Content, you agree that the Freemium Content you download may only be used by you for\n      your personal use and may not be sold or redistributed without the express written consent of the Company.\n    </p>\n    <br />\n    <p>\n      By downloading the Freemium Content, you further agree that you shall not create any derivative work based upon\n      the Freemium Content and you shall not offer any competing products or services based upon any information\n      contained in the Freemium Content.\n    </p>\n    <br />\n    <p>\n      <strong>Guests</strong>\n    </p>\n    <br />\n    <p>\n      The Company may, from time to time, provide information from a third party in the form of a podcast guest\n      interview, interview on other platform, guest blog post, or other medium. The Company does not control the\n      information provided by such third-party guests, is not responsible for investigating the truth of any information\n      provided, and cannot guarantee the veracity of any statements made by such guests.\n    </p>\n    <br />\n    <p>\n      Individuals who agree to appear as guests on any podcast offered by the Company agree to transfer all intellectual\n      property rights they may have in any such interviews to the Company and further provide an irrevocable, perpetual,\n      worldwide license to any rights they are unable to assign.\n    </p>\n    <br />\n    <p>\n      <strong>Cancellation Of Subscription</strong>\n    </p>\n    <br />\n    <p>\n      Certain of the Company&rsquo;s products and services are offered on an ongoing basis with a monthly or yearly\n      subscription. Users may cancel subscriptions at any time by emailing{' '}\n      <a\n        href=\"mailto:project1591@guardiangroup.org?subject=Project 1591 App Feedback\"\n        className=\"underline text-guardian-blue\"\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >\n        project1591@guardiangroup.org\n      </a>\n      .\n    </p>\n    <br />\n    <p>\n      Your subscription shall be terminated immediately upon cancellation, and you shall not receive any refund. You\n      shall not be charged after a cancellation. In order to treat everyone equally, no exceptions will be made. All\n      fees are exclusive of all taxes, levies, or duties imposed by taxing authorities, and you shall be responsible for\n      payment of all taxes, levies, or duties associated with your purchases hereunder, excluding only United States\n      (federal or state) income taxes.\n    </p>\n    <br />\n    <p>\n      <strong>No Warranties</strong>\n    </p>\n    <br />\n    <p>\n      THE COMPANY MAKES NO WARRANTIES REGARDING THE PERFORMANCE OR OPERATION OF THIS WEBSITE. THE COMPANY FURTHER MAKES\n      NO REPRESENTATIONS OR WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, AS TO THE INFORMATION, CONTENTS, MATERIALS,\n      DOCUMENTS, PROGRAMS, PRODUCTS, BOOKS, OR SERVICES INCLUDED ON OR THROUGH THIS WEBSITE. TO THE FULLEST EXTENT\n      PERMISSIBLE UNDER THE LAW, THE COMPANY DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING IMPLIED WARRANTIES\n      OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n    </p>\n    <br />\n    <p>\n      <strong>Limitation of Liability</strong>\n    </p>\n    <br />\n    <p>\n      YOU AGREE TO ABSOLVE THE COMPANY OF ANY AND ALL LIABILITY OR LOSS THAT YOU OR ANY PERSON OR ENTITY ASSOCIATED WITH\n      YOU MAY SUFFER OR INCUR AS A RESULT OF USE OF THE INFORMATION CONTAINED ON THIS WEBSITE AND/OR THE RESOURCES YOU\n      MAY DOWNLOAD FROM THIS WEBSITE. YOU AGREE THAT THE COMPANY SHALL NOT BE LIABLE TO YOU FOR ANY TYPE OF DAMAGES,\n      INCLUDING DIRECT, INDIRECT, SPECIAL, INCIDENTAL, EQUITABLE, OR CONSEQUENTIAL LOSS OR DAMAGES FOR USE OF THIS\n      WEBSITE.\n    </p>\n    <br />\n    <p>\n      THE INFORMATION, SOFTWARE, PRODUCTS, AND SERVICES INCLUDED IN OR AVAILABLE THROUGH THE WEBSITE MAY INCLUDE\n      INACCURACIES OR TYPOGRAPHICAL ERRORS. CHANGES ARE PERIODICALLY ADDED TO THE INFORMATION HEREIN. THE COMPANY AND/OR\n      ITS SUPPLIERS MAY MAKE IMPROVEMENTS AND/OR CHANGES IN THE WEBSITE AT ANY TIME.\n    </p>\n    <br />\n    <p>\n      THE COMPANY AND/OR ITS SUPPLIERS MAKE NO REPRESENTATIONS ABOUT THE SUITABILITY, RELIABILITY, AVAILABILITY,\n      TIMELINESS, AND ACCURACY OF THE INFORMATION, SOFTWARE, PRODUCTS, SERVICES AND RELATED GRAPHICS CONTAINED ON THE\n      WEBSITE FOR ANY PURPOSE. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, ALL SUCH INFORMATION, SOFTWARE,\n      PRODUCTS, SERVICES AND RELATED GRAPHICS ARE PROVIDED &ldquo;AS IS&rdquo; WITHOUT WARRANTY OR CONDITION OF ANY\n      KIND. THE COMPANY AND/OR ITS SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH REGARD TO THIS\n      INFORMATION, SOFTWARE, PRODUCTS, SERVICES AND RELATED GRAPHICS, INCLUDING ALL IMPLIED WARRANTIES OR CONDITIONS OF\n      MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT.\n    </p>\n    <br />\n    <p>\n      TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL THE COMPANY AND/OR ITS SUPPLIERS BE LIABLE\n      FOR ANY DIRECT, INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER\n      INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF USE, DATA OR PROFITS, ARISING OUT OF OR IN ANY WAY CONNECTED\n      WITH THE USE OR PERFORMANCE OF THE WEBSITE, WITH THE DELAY OR INABILITY TO USE THE WEBSITE OR RELATED SERVICES,\n      THE PROVISION OF OR FAILURE TO PROVIDE SERVICES, OR FOR ANY INFORMATION, SOFTWARE, PRODUCTS, SERVICES AND RELATED\n      GRAPHICS OBTAINED THROUGH THE WEBSITE, OR OTHERWISE ARISING OUT OF THE USE OF THE WEBSITE, WHETHER BASED ON\n      CONTRACT, TORT, NEGLIGENCE, STRICT LIABILITY OR OTHERWISE, EVEN IF THE COMPANY OR ANY OF ITS SUPPLIERS HAS BEEN\n      ADVISED OF THE POSSIBILITY OF DAMAGES. BECAUSE SOME STATES/JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION\n      OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU. TO THE EXTENT\n      COMPANY MAY NOT, AS A MATTER OF APPLICABLE LAW, DISCLAIM ANY IMPLIED WARRANTY OR LIMIT ITS LIABILITIES, THE SCOPE\n      AND DURATION OF SUCH WARRANTY AND THE EXTENT OF COMPANY'S LIABILITY WILL BE THE MINIMUM PERMITTED UNDER SUCH LAW.\n      IF YOU ARE DISSATISFIED WITH ANY PORTION OF THE WEBSITE, OR WITH ANY OF THESE TERMS OF USE, YOUR SOLE AND\n      EXCLUSIVE REMEDY IS TO DISCONTINUE USING THE WEBSITE.\n    </p>\n    <br />\n    <p>\n      <strong>Arbitration</strong>\n    </p>\n    <br />\n    <p>\n      By accessing or using the Site or Services, you agree: (i) that any and all disputes you may have with, or claims\n      you may have against Company. or its affiliates relating to, arising out of or connected in any way with (a) the\n      Website, (b) these Terms of Use, or (c) the determination of the scope or applicability of this agreement to\n      arbitrate (a &ldquo;<strong>Claim</strong>&rdquo;), will be resolved exclusively by final and binding arbitration\n      in accordance with the Rules of the American Arbitration Association (&ldquo;<strong>AAA Rules</strong>&rdquo;) to\n      take place in Bend, OR. The arbitration will be heard and determined by a single arbitrator. The arbitrator's\n      decision in any such arbitration will be final and binding upon the parties and may be enforced in any court of\n      competent jurisdiction. The parties agree that the arbitration will be kept confidential and that the existence of\n      the proceeding and any element of it will not be disclosed beyond the arbitration proceedings, except as may be\n      required by applicable law.\n    </p>\n    <br />\n    <p>\n      If you demonstrate that the costs of arbitration will be prohibitive as compared to the costs of litigation,\n      Company will pay as much of the administrative costs and arbitrator's fees required for the arbitration as the\n      arbitrator deems necessary to prevent the cost of the arbitration from being prohibitive. In the final award, the\n      arbitrator may apportion the costs of arbitration and the compensation of the arbitrator among the parties in such\n      amounts as the arbitrator deems appropriate.\n    </p>\n    <br />\n    <p>\n      This arbitration agreement does not preclude you from seeking action by federal, state, or local government\n      agencies. You and Company also have the right to bring qualifying claims in small claims court. In addition, you\n      and Company retain the right to apply to any court of competent jurisdiction for provisional relief, including\n      pre-arbitral attachments or preliminary injunctions, and any such request shall not be deemed incompatible with\n      these Terms of Use, nor a waiver of the right to have disputes submitted to arbitration as provided in these Terms\n      of Use.{' '}\n    </p>\n    <br />\n    <p>\n      Neither you nor Company may act as a class representative or private attorney general, nor participate as a member\n      of a class of claimants, with respect to any Claim. Claims may not be arbitrated on a class or representative\n      basis. The arbitrator can decide only your and/or Company's individual Claims. The arbitrator may not consolidate\n      or join the claims of other persons or parties who may be similarly situated. If for any reason a claim proceeds\n      in court rather than in arbitration we each waive any right to a jury trial.{' '}\n    </p>\n    <br />\n    <p>\n      THIS SECTION LIMITS CERTAIN RIGHTS, INCLUDING THE RIGHT TO MAINTAIN A COURT ACTION, THE RIGHT TO A JURY TRIAL, THE\n      RIGHT TO PARTICIPATE IN ANY FORM OF CLASS OR REPRESENTATIVE CLAIM, THE RIGHT TO ENGAGE IN DISCOVERY EXCEPT AS\n      PROVIDED IN AAA RULES, AND THE RIGHT TO CERTAIN REMEDIES AND FORMS OF RELIEF. OTHER RIGHTS THAT YOU OR COMPANY\n      WOULD HAVE IN COURT ALSO MAY NOT BE AVAILABLE IN ARBITRATION. If any provision of this Section is found to be\n      invalid or unenforceable, then that specific provision shall be of no force and effect and shall be severed, but\n      the remainder of this Section will continue in full force and effect. This Section of these Terms will survive the\n      termination of your relationship with Company.{' '}\n    </p>\n    <br />\n    <p>\n      <strong>International Users</strong>\n    </p>\n    <br />\n    <p>\n      The Service is controlled, operated and administered by the Company from our offices within the USA. If you access\n      the Service from a location outside the USA, you are responsible for compliance with all local laws. You agree\n      that you will not use the Company Content accessed through the Website in any country or in any manner prohibited\n      by any applicable laws, restrictions or regulations.\n    </p>\n    <br />\n    <p>\n      <strong>Indemnification</strong>\n    </p>\n    <br />\n    <p>\n      You agree to indemnify, defend, and hold harmless the Company, its officers, directors, employees, agents and\n      third parties, for any losses, costs, liabilities and expenses (including reasonable attorneys’ fees) relating to\n      or arising out of: (a) your use of or inability to use the Website or services; (b) any information (including\n      user postings) that you or anyone using your account submit, post, or transmit on or through the Website; (c) the\n      violation of any terms of this Agreement by you or anyone using your account; (d) the violation of any rights of a\n      third party, including intellectual property, privacy, publicity, or other proprietary rights, by you or anyone\n      using your account; or (e) the violation of any applicable laws, rules or regulations by you or anyone using your\n      account. The Company reserves the right, at its own cost, to assume the exclusive defense and control of any\n      matter otherwise subject to indemnification by you, in which event you will fully cooperate with the Company in\n      asserting any available defenses.\n    </p>\n    <br />\n    <p>\n      <strong>Termination And Access Restriction</strong>\n    </p>\n    <br />\n    <p>\n      The Company reserves the right, in its sole discretion, to terminate your access to the Website and the related\n      services or any portion thereof at any time, without notice. To the maximum extent permitted by law, and you\n      hereby consent to resolve any and all disputes arising under or related to this Website or the Terms of Use\n      pursuant to the Arbitration Clause above. Use of the Website is unauthorized in any jurisdiction that does not\n      give effect to all provisions of these Terms, including, without limitation, this section.\n    </p>\n    <br />\n    <p>\n      <strong>No Joint Venture Or Other Relationship</strong>\n    </p>\n    <br />\n    <p>\n      You agree that no joint venture, partnership, employment, or agency relationship exists between you and the\n      Company as a result of this agreement or use of the Website. The Company&rsquo;s performance of this agreement is\n      subject to existing laws and legal process, and nothing contained in this agreement is in derogation of the\n      Company&rsquo;s right to comply with governmental, court, and law enforcement requests or requirements relating to\n      your use of the Website or information provided to or gathered by the Company with respect to such use. If any\n      part of this agreement is determined to be invalid or unenforceable pursuant to applicable law including, but not\n      limited to, the warranty disclaimers and liability limitations set forth above, then the invalid or unenforceable\n      provision will be deemed superseded by a valid, enforceable provision that most closely matches the intent of the\n      original provision and the remainder of the agreement shall continue in effect.\n    </p>\n    <br />\n    <p>\n      <strong>Other Provisions</strong>\n    </p>\n    <br />\n    <p>\n      Under no circumstances will Guardian Group be held liable for any delay or failure in performance due in whole or\n      in part to any acts of nature or other causes beyond its reasonable control.\n    </p>\n    <br />\n    <p>\n      These Terms will be governed by and construed in accordance with the laws of the State of Oregon, without giving\n      effect to any conflict of laws rules or provisions.\n    </p>\n    <br />\n    <p>\n      You agree that any action of whatever nature arising from or relating to these Terms of Use, the Website, or any\n      Services will be filed only in the state in Deschutes County, Oregon, or federal courts located in Eugene, Oregon.\n      You consent and submit to the personal jurisdiction of such courts for the purposes of any such action.\n    </p>\n    <br />\n    <p>\n      If any provision of these Terms is found to be unlawful, void, or unenforceable, then that provision will be\n      deemed severable from these Terms and will not affect the validity or enforceability of any remaining provisions.\n    </p>\n    <br />\n    <p>\n      The failure of Company to enforce any right or provision of these Terms of Use will not prevent Company from\n      enforcing such right or provision in the future.\n    </p>\n    <br />\n    <p>\n      We may assign our rights and obligations under these Terms of Use, including in connection with a merger,\n      acquisition, a sale of assets, or by operation of law.\n    </p>\n    <br />\n    <p>\n      <strong>Entire Agreement</strong>\n    </p>\n    <br />\n    <p>\n      Unless otherwise specified herein, this agreement, along with the Privacy Policy and Disclaimer, constitutes the\n      entire agreement between the user and the Company with respect to the Website and it supersedes all prior or\n      contemporaneous communications and proposals, whether electronic, oral or written, between the user and the\n      Company with respect to the Website. A printed version of this agreement and of any notice given in electronic\n      form shall be admissible in judicial or administrative proceedings based upon or relating to this agreement to the\n      same extent and subject to the same conditions as other business documents and records originally generated and\n      maintained in printed form. It is the express wish to the parties that this agreement and all related documents be\n      written in English.\n    </p>\n    <br />\n    <p>\n      <strong>Changes To the Terms Of Use</strong>\n    </p>\n    <br />\n    <p>\n      We may revise and update these Terms of Use from time to time in our sole discretion. All changes are effective\n      immediately when we post them, and apply to all access to and use of the Website thereafter. Your continued use of\n      the Website following the posting of revised Terms of Use means that you accept and agree to the changes. You are\n      expected to check this page from time to time so you are aware of any changes, as they are binding on you.\n    </p>\n    <br />\n    <p>\n      <strong>Contact Us</strong>\n    </p>\n    <br />\n    <p>The Company welcomes your questions or comments regarding the Terms:</p>\n    <br />\n    <p>Guardian Group</p>\n    <p>\n      Email Address:{' '}\n      <a\n        href=\"mailto:project1591@guardiangroup.org?subject=Project 1591 App Feedback\"\n        className=\"underline text-guardian-blue\"\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n      >\n        project1591@guardiangroup.org\n      </a>\n    </p>\n    <p>Effective as of January 1, 2021</p>\n  </>\n);\n\nexport default TermsOfUse;\n","import React, { Component } from 'react';\nimport { Container, HeaderText } from '../../../components';\nimport TermsOfUseText from './termsOfUse';\n\nclass TermsOfUse extends Component {\n  render() {\n    return (\n      <Container height=\"h-168\" width=\"w-160\" padding=\"px-20 py-8\" className=\"flex flex-col\" margin=\"mx-auto\">\n        <center>\n          <HeaderText noBold fontSize=\"text-4xl\" className=\"mt-2 mb-4\">\n            Terms of Use\n          </HeaderText>\n        </center>\n        <br />\n        <p className=\"overflow-y-auto\">\n          <TermsOfUseText />\n        </p>\n        <br />\n      </Container>\n    );\n  }\n}\n\nexport default TermsOfUse;\n","import React, { useEffect } from 'react';\nimport { Auth, API, graphqlOperation } from 'aws-amplify';\nimport { useHistory } from 'react-router-dom';\nimport { Button, Container, HeaderText } from '../../../components';\nimport { onUserApproved } from '../../../generated/graphql/subscriptions';\nimport { useUser } from '../../../contexts/userContext';\n\nconst ThankYou = () => {\n  const { user, setUser } = useUser();\n\n  const history = useHistory();\n\n  useEffect(() => {\n    let subscription = null;\n\n    const initSubscription = async () => {\n      try {\n        subscription = await API.graphql(graphqlOperation(onUserApproved, { id: user?.id })).subscribe({\n          error: err => {\n            console.error('Error subscribing to onApproveUser: ', err);\n          },\n          next: () => {\n            window.location.reload(true);\n          },\n        });\n      } catch (error) {\n        console.error('Error on subscription: ', error);\n      }\n    };\n\n    initSubscription();\n\n    return () => {\n      if (subscription) {\n        subscription.unsubscribe();\n      }\n    };\n  }, [user.id]);\n\n  return (\n    <Container\n      grayedBackground\n      height=\"lg:h-168\"\n      width=\"lg:w-160\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 md:mx-12 lg:mx-auto\">\n      <center>\n        <HeaderText noBold fontSize=\"text-4xl\" className=\"my-4\">\n          Thank You\n        </HeaderText>\n      </center>\n\n      <br />\n\n      <p className=\"overflow-y-auto\">\n        Your training certificate was uploaded successfully. Upon review and approval, you will receive an email with\n        your account confirmation. At that point you can log back in and finish the signup process where you choose your\n        own alias for the system. From there, you'll be allowed access to start contributing to countering sex\n        trafficking victims in the United States. Good luck and thanks for joining us in this effort.\n      </p>\n\n      <Button solidBlue className=\"w-full mt-12\" onClick={() => history.push('certificate-upload')}>\n        RE-UPLOAD CERTIFICATE\n      </Button>\n\n      <Button\n        linedBlue\n        className=\"w-full mt-4\"\n        onClick={async () => {\n          await Auth.signOut();\n\n          setUser(null);\n\n          history.push('/');\n        }}>\n        SIGN OUT\n      </Button>\n    </Container>\n  );\n};\n\nexport default ThankYou;\n","import ReactGA from 'react-ga4';\n\nconst useAnalyticsEventTracker = (category = 'Blog category') => {\n  const eventTracker = (action = 'test action', label = 'test label') => {\n    ReactGA.event({ category, action, label });\n  };\n\n  return eventTracker;\n};\n\nexport default useAnalyticsEventTracker;\n","/* eslint-disable no-nested-ternary */\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { API, graphqlOperation, Auth } from 'aws-amplify';\nimport AuthCode from 'react-auth-code-input';\nimport { Container, HeaderText, Button, TextField } from '../../../components';\nimport { downloadCase } from '../../../generated/graphql/mutations';\nimport { getCase } from '../../../generated/graphql/queries';\nimport useAnalyticsEventTracker from '../../../helpers/GoogleAnalytics/eventTracker';\n\nconst CaseDownload = () => {\n  const [mfaCode, setMfaCode] = useState('');\n  const [email, setEmail] = useState('');\n  const [cognitoUser, setCognitoUser] = useState();\n  const [isLoading, setIsLoading] = useState(false);\n  const [emailSent, setEmailSent] = useState(false);\n  const [error, setError] = useState(null);\n  const gaEventTracker = useAnalyticsEventTracker('Case Download');\n  const [caseNumber, setCaseNumber] = useState('');\n\n  // useEffect(() => {\n  //   const getCaseRecord = async () => {\n  //     const result = await API.graphql(\n  //       graphqlOperation(getCase, {\n  //         id: getCaseIdFromUrl(),\n  //       })\n  //     );\n\n  //     setCaseNumber(result.data.getCase.caseNumber);\n  //   };\n\n  //   getCaseRecord();\n  // }, []);\n\n  const onMFAInputChange = res => {\n    setMfaCode(res);\n  };\n\n  const caseId = getCaseIdFromUrl();\n\n  const requestDownloadCase = async () => {\n    setIsLoading(true);\n    setError(null);\n    try {\n      const {\n        data: {\n          downloadCase: { preSignedUrl },\n        },\n      } = await API.graphql({\n        query: downloadCase,\n        variables: { input: { mfaCode, caseId } },\n        authMode: 'AWS_IAM',\n      });\n\n      window.open(preSignedUrl, '_blank');\n      gaEventTracker('successful-case-download', caseNumber);\n\n      setIsLoading(false);\n    } catch (error) {\n      if (error?.errors[0]?.message) {\n        const errorMessage = error.errors[0].message;\n\n        setError(errorMessage);\n      } else {\n        setError('Something went try wrong. Please try again');\n      }\n\n      gaEventTracker('unsuccessful-case-download', caseNumber);\n      console.error('error', error);\n      setIsLoading(false);\n    }\n  };\n\n  const sendEmail = useCallback(async () => {\n    setIsLoading(true);\n    setError('')\n    try {\n      // const cogUser = await Auth.signIn(email, '');\n      const cogUser = await Auth.signIn(email);\n      console.log({ cogUser }, { depth: null });\n      setCognitoUser(cogUser);\n      setEmailSent(true);\n    } catch (e) {\n      setError(e.message);\n    }\n    setIsLoading(false);\n  }, [email]);\n\n  const verifyCode = useCallback(async () => {\n    // console.log({ cognitoUser, mfaCode });\n    // console.log({ cogUser });\n\n    // It we get here, the answer was sent successfully,\n    // but it might have been wrong (1st or 2nd time)\n    // So we should test if the user is authenticated now\n    setError('');\n    setIsLoading(true);\n    try {\n      // This will throw an error if the user is not yet authenticated:\n      const cogUser = await Auth.sendCustomChallengeAnswer(cognitoUser, mfaCode);\n      await Auth.currentSession();\n      await requestDownloadCase();\n      await Auth.signOut();\n      setEmailSent(false);\n    } catch {\n      console.log('Apparently the user did not enter the right code');\n      setError('Unable to validate code');\n    }\n    setIsLoading(false);\n  }, [mfaCode, cognitoUser]);\n\n  return (\n    <Container\n      height=\"h-168\"\n      width=\"w-full md:w-160\"\n      padding=\"px-4 md:px-20 py-8\"\n      className=\"flex flex-col\"\n      margin=\"mx-auto\">\n      <center>\n        <HeaderText noBold fontSize=\"text-4xl\" className=\"mb-4 mt-2pr\">\n          PAIR Report Download\n        </HeaderText>\n      </center>\n      <br />\n\n      <div className=\"flex flex-col items-center\">\n        <p>Enter your verified LEA email address to begin authentication.</p>\n        <div className=\"w-3/4\">\n          <TextField\n            value={email}\n            onChange={e => setEmail(e.target.value)}\n            label=\"Email\"\n            className=\"mb-4\"\n            tabindex={6}\n          />\n        </div>\n      </div>\n      {emailSent && (\n        <div className=\"flex flex-col items-center\">\n          <p>Enter the MFA code sent to your email address.</p>\n          <AuthCode\n            length={6}\n            onChange={onMFAInputChange}\n            containerClassName=\"flex justify-center my-4\"\n            inputClassName=\"input shadow text-center bg-gray-200 w-1/12 mx-2 h-10\"\n          />\n        </div>\n      )}\n      {error && <div className=\"flex justify-center text-pursuit-darkred\">{error}</div>}\n      <div className=\"flex justify-end mt-8\">\n        {!emailSent ? (\n          <Button solidBlue noPadding className=\"px-3 min-w-20 lg:min-w-24\" onClick={sendEmail} loading={isLoading}>\n            VERIFY EMAIL\n          </Button>\n        ) : (\n          <Button\n            solidBlue\n            noPadding\n            className=\"px-3 min-w-20 lg:min-w-24\"\n            // onClick={requestDownloadCase}\n            onClick={verifyCode}\n            loading={isLoading}>\n            VALIDATE CODE\n          </Button>\n        )}\n      </div>\n      <br />\n    </Container>\n  );\n};\n\nconst getCaseIdFromUrl = () => {\n  const queryParams = new URLSearchParams(window.location.search);\n  const caseId = queryParams.get('caseId');\n\n  return caseId;\n};\n\nexport default CaseDownload;\n","import React, { useEffect, useState, useContext, useMemo } from 'react';\nimport { DateTime } from 'luxon';\nimport { useLocation } from 'react-router-dom';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { snakeCase } from 'change-case';\nimport {\n  Container,\n  HeaderText,\n  DataGrid,\n  Button,\n  StatusPill,\n  PopUpConfirmation,\n  DropDown,\n  ToolTip,\n} from '../../../components';\nimport { listOwnedCases } from '../../../generated/graphql/queries';\nimport { deleteCase } from '../../../generated/graphql/mutations';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext';\nimport { CaseStatus } from '../../../constants';\nimport Trash from '../../../assets/Images/trash.svg';\n\nconst CaseStatusOptions = [\n  { value: CaseStatus.Approved, label: 'Approved' },\n  { value: CaseStatus.Active, label: 'Active' },\n  { value: CaseStatus.Submitted, label: 'Submitted' },\n  { value: CaseStatus.Resubmitted, label: 'Resubmitted' },\n  { value: CaseStatus.Returned, label: 'Returned' },\n];\n\nconst useQuery = () => {\n  const { search } = useLocation();\n\n  return useMemo(() => new URLSearchParams(search), [search]);\n};\n\nconst ActiveCases = () => {\n  const query = useQuery();\n  const passedStatus = query.get('status')?.toUpperCase();\n  let initialFilterStatus = null;\n\n  if (Object.values(CaseStatus).indexOf(passedStatus) > -1) {\n    initialFilterStatus = passedStatus;\n  }\n\n  const [, setAlert] = useContext(NotificationContext);\n\n  const [nextCaseToken, setNextCaseToken] = useState();\n\n  const [cases, setCases] = useState([]);\n  const [casesLoading, setCasesLoading] = useState(true);\n\n  const [status, setStatus] = useState(initialFilterStatus || null);\n\n  const [filters, setFilters] = useState({\n    status: initialFilterStatus || null,\n    searchTerm: '',\n  });\n\n  const [sort, setSort] = useState({\n    fieldName: 'createdAt',\n    direction: 'DESC',\n  });\n\n  const [filtersOnLastSearch, setFiltersOnLastSearch] = useState(null);\n  const [sortOnLastSearch, setSortOnLastSearch] = useState({\n    fieldName: 'createdAt',\n    direction: 'DESC',\n  });\n\n  const [search, setSearch] = useState('');\n\n  const [recordToDelete, setRecordToDelete] = useState(null);\n  const [deleting, setDeleting] = useState(false);\n\n  useEffect(() => {\n    fetchCases();\n  }, [sort]);\n\n  useEffect(() => {\n    fetchCases();\n  }, [filters]);\n\n  const fetchCases = async () => {\n    setCasesLoading(true);\n\n    try {\n      let nextTokenToUse = nextCaseToken;\n      let oldCases = nextTokenToUse ? [...cases] : [];\n\n      if (\n        !filtersOnLastSearch ||\n        filtersOnLastSearch.status !== filters.status ||\n        filtersOnLastSearch.searchTerm !== filters.searchTerm ||\n        sortOnLastSearch.fieldName !== sort.fieldName ||\n        sortOnLastSearch.direction !== sort.direction\n      ) {\n        setNextCaseToken(null);\n\n        nextTokenToUse = null;\n        oldCases = [];\n      }\n\n      setSortOnLastSearch(sort);\n      setFiltersOnLastSearch(filters);\n\n      const params = {\n        status: filters.status,\n        assignedTo: filters.assignedTo,\n        searchTerm: filters.searchTerm,\n        nextToken: nextTokenToUse,\n        sortField: sort.fieldName ? snakeCase(sort.fieldName).toUpperCase() : '',\n        sortOrder: sort.direction,\n        limit: 100,\n      };\n      const response = await API.graphql(graphqlOperation(listOwnedCases.replace('assignedToName\\n', ''), params));\n\n      const result = response.data.listOwnedCases;\n\n      setNextCaseToken(result.nextToken);\n      setCases([...oldCases, ...result.items]);\n    } catch (error) {\n      console.error('Error Loading cases: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error loading active cases',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setCasesLoading(false);\n  };\n\n  const deleteRecord = async id => {\n    try {\n      setDeleting(true);\n\n      const updatedCases = [...cases];\n\n      const indexOfRecord = updatedCases.findIndex(x => x.id === id);\n      // Volunteers can't access assignedToName so we need to remove it\n      const isAdmin = false;\n      const query = isAdmin ? deleteCase : deleteCase.replace('assignedToName\\n', '');\n      await API.graphql(graphqlOperation(query, { id }));\n\n      updatedCases.splice(indexOfRecord, 1);\n\n      setCases(updatedCases);\n    } catch (error) {\n      console.error('Error deleting record: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'There was an error removing the case',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setRecordToDelete(null);\n    setDeleting(false);\n  };\n\n  const renderDelete = record => {\n    if (record.status !== CaseStatus.Active && record.status !== CaseStatus.Returned) {\n      return null;\n    }\n\n    return (\n      <div className=\"flex flex-row items-center justify-between w-full focus:outline-none lg:w-auto \">\n        <span className=\"font-semibold lg:hidden\">Delete Case:</span>\n\n        <button type=\"button\" onClick={() => setRecordToDelete(record)} className=\"focus:outline-none\">\n          <img src={Trash} alt=\"Trash\" className=\"object-contain w-5\" />\n        </button>\n      </div>\n    );\n  };\n\n  const renderStatus = ({ status: recordStatus }) => <StatusPill status={recordStatus} />;\n\n  const renderPoints = ({ totalPoints }) => (\n    <div\n      className={`${getAwardColor(\n        totalPoints\n      )} h-6 w-8 rounded-full flex font-bold justify-center items-center p-0 mr-4`}>\n      {totalPoints?.pointsAwarded || ''}\n    </div>\n  );\n\n  const getAwardColor = totalPoints => {\n    // if points aren't awared yet don't show\n    if (!totalPoints) {\n      return 'bg-white text-white';\n    }\n\n    if (!totalPoints.isFullPoints) {\n      return 'bg-pursuit-amber text-white';\n    }\n\n    return 'bg-green-500 text-white';\n  };\n\n  const getCreatedDate = item => (item.createdAt ? DateTime.fromISO(item.createdAt).toLocaleString() : '-');\n\n  return (\n    <>\n      {recordToDelete ? (\n        <PopUpConfirmation\n          title=\"Delete Record\"\n          content={`Are you sure you want to delete ${recordToDelete?.caseNumber || 'this record'}?`}\n          onConfirm={() => {\n            deleteRecord(recordToDelete.id);\n          }}\n          onCancel={() => {\n            setRecordToDelete(null);\n          }}\n          confirmLoading={deleting}\n          confirmText=\"DELETE\"\n          confirmLoadingText=\"DELETING\"\n          destructive\n          className=\"w-11/12 lg:w-auto\"\n        />\n      ) : null}\n\n      <Container height=\"lg:h-152\" width=\"lg:mx-8\" padding=\"p-4\" margin=\"m-3 lg:m-auto\">\n        <div className=\"flex flex-col pt-4 lg:px-4\">\n          <HeaderText className=\"mb-4 text-2xl text-left lg:text-4xl\">My Cases</HeaderText>\n\n          <div className=\"items-end justify-end mb-10 lg:flex\">\n            <div className=\"lg:mr-4\">\n              <DropDown\n                value={CaseStatusOptions.find(x => x.value === status)}\n                onChange={option => {\n                  setStatus(option ? option.value : null);\n                }}\n                containerClassName=\"w-72\"\n                width=\"w-72\"\n                label=\"Case Status\"\n                options={CaseStatusOptions}\n                placeholder=\"Status\"\n                isClearable\n              />\n            </div>\n\n            <div className=\"flex flex-col\">\n              <div className=\"flex flex-row\">\n                <p className=\"mb-1 font-light light-primary-blue-text\">Search Term</p>\n\n                <ToolTip\n                  tooltipText=\"Find records with the search term included in the Case Number, First Name, or Last Name fields.\"\n                  title=\"Search Term\"\n                  className=\"ml-2 text-pursuit-gray\"\n                />\n              </div>\n              <input\n                type=\"text\"\n                value={search}\n                onChange={event => setSearch(event.target.value)}\n                placeholder=\"Search Term\"\n                className=\"w-64 h-10 px-4 bg-gray-100 lg:mr-4\"\n                onKeyDown={event => {\n                  const pressedKey = event.key;\n\n                  if (pressedKey === 'Enter') {\n                    setFilters({\n                      status,\n                      searchTerm: search,\n                    });\n                  }\n                }}\n              />\n            </div>\n\n            <Button\n              solidBlue\n              className=\"w-24 px-4\"\n              onClick={() => {\n                setFilters({\n                  status,\n                  searchTerm: search,\n                });\n              }}>\n              FILTER\n            </Button>\n          </div>\n\n          <DataGrid\n            columns={[\n              { title: '', renderFunction: renderDelete, width: '2rem', noLink: true },\n              { title: 'Case Number', fieldName: 'caseNumber', sortable: true },\n              { title: 'First Name', fieldName: 'firstName', sortable: true },\n              { title: 'Last Name', fieldName: 'lastName', sortable: true },\n              { title: 'Date Opened', fieldName: 'createdAt', value: getCreatedDate, sortable: true },\n              { title: 'Case Status', fieldName: 'status', renderFunction: renderStatus },\n              { title: 'Points', fieldName: 'totalPoints', renderFunction: renderPoints },\n            ]}\n            sort={sort}\n            setSort={setSort}\n            loading={casesLoading}\n            data={cases}\n            noRecordsText=\"No cases have been submitted\"\n            rowLink={item => `/investigation/${item.id}`}\n            loadNextPage={() => fetchCases(filters)}\n            hasMore={!!nextCaseToken}\n            containerHeight=\"h-88\"\n            gridKey=\"active-cases\"\n          />\n        </div>\n      </Container>\n    </>\n  );\n};\n\nexport default ActiveCases;\n","import React, { useState, useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { DateTime } from 'luxon';\nimport { Container, Button, StatusPill, DataGrid, HeaderText, LeaderboardCard } from '../../../components';\nimport { listOwnedCases } from '../../../generated/graphql/queries';\nimport { CaseStatus } from '../../../constants';\n\nconst Dashboard = () => {\n  const [tenRecentActiveCases, setTenRecentActiveCases] = useState([]);\n  const [tenRecentReturnedCases, setTenRecentReturnedCases] = useState([]);\n\n  const [activeCasesLoading, setActiveCasesLoading] = useState(true);\n  const [returnedCasesLoading, setReturnedCasesLoading] = useState(true);\n\n  const fetchActiveCases = async () => {\n    try {\n      const params = {\n        status: [CaseStatus.Active, CaseStatus.Submitted, CaseStatus.Approved, CaseStatus.Resubmitted],\n        limit: 50,\n      };\n\n      const {\n        data: {\n          listOwnedCases: { items },\n        },\n      } = await API.graphql(graphqlOperation(listOwnedCases.replace('assignedToName\\n', ''), params));\n\n      setTenRecentActiveCases(items && items.length ? items.slice(0, 8) : []);\n      setActiveCasesLoading(false);\n    } catch (error) {\n      console.error('error on fetching cases', error);\n    }\n  };\n\n  const fetchReturnedCases = async () => {\n    try {\n      const params = {\n        status: ['RETURNED'],\n        limit: 50,\n      };\n\n      const {\n        data: {\n          listOwnedCases: { items },\n        },\n      } = await API.graphql(graphqlOperation(listOwnedCases.replace('assignedToName\\n', ''), params));\n\n      setTenRecentReturnedCases(items && items.length ? items.slice(0, 8) : []);\n      setReturnedCasesLoading(false);\n    } catch (error) {\n      console.error('error on fetching cases', error);\n    }\n  };\n\n  useEffect(() => {\n    fetchActiveCases();\n    fetchReturnedCases();\n  }, []);\n\n  const renderStatus = ({ status }) => <StatusPill status={status} />;\n\n  const renderPoints = ({ totalPoints }) => (\n    <div\n      className={`${getAwardColor(\n        totalPoints\n      )} h-6 w-8 rounded-full flex font-bold justify-center items-center p-0 ml-2`}>\n      {totalPoints?.pointsAwarded || ''}\n    </div>\n  );\n\n  const getAwardColor = totalPoints => {\n    // if points aren't awared yet don't show\n    if (!totalPoints) {\n      return 'bg-white text-white';\n    }\n\n    if (!totalPoints.isFullPoints) {\n      return 'bg-pursuit-amber text-white';\n    }\n\n    return 'bg-green-500 text-white';\n  };\n\n  const getName = item =>\n    item && (item.firstName || item.lastName) ? `${item.firstName || ''} ${item.lastName || ''}` : '-';\n\n  const getDateOpened = item => (item.createdAt ? DateTime.fromISO(item.createdAt).toLocaleString() : '-');\n  const getDateReturned = item => (item.returnedAt ? DateTime.fromISO(item.returnedAt).toLocaleString() : '-');\n\n  return (\n    <div className=\"flex flex-col w-full mt-4 lg:mt-0 lg:flex-row lg:justify-center\">\n      <Container\n        height=\"lg:h-152\"\n        width=\"lg:w-1/4\"\n        padding=\"p-4\"\n        margin=\"mx-3 mb-3 lg:mb-0 lg:ml-6\"\n        className=\"flex flex-col\">\n        <LeaderboardCard />\n      </Container>\n\n      <Container\n        height=\"lg:h-152\"\n        width=\"lg:w-1/2\"\n        padding=\"p-4\"\n        margin=\"mx-3 mb-3 lg:mb-0 lg:ml-6\"\n        className=\"flex flex-col\">\n        <HeaderText fontSize=\"text-2xl\" className=\"text-left lg:text-4xl lg:text-center\">\n          My Cases\n        </HeaderText>\n\n        <div className=\"flex flex-col pt-4 overflow-y-auto lg:px-4\">\n          <DataGrid\n            columns={[\n              { title: 'Case Number', fieldName: 'caseNumber' },\n              { title: 'Name', value: getName },\n              { title: 'Date Opened', value: getDateOpened },\n              { title: 'Status', fieldName: 'status', renderFunction: renderStatus },\n              { title: 'Points', fieldName: 'totalPoints', renderFunction: renderPoints },\n            ]}\n            loading={activeCasesLoading}\n            data={tenRecentActiveCases}\n            noRecordsText=\"You have not opened any cases.\"\n            rowLink={item => `/investigation/${item.id}`}\n            gridKey=\"recent-casees\"\n          />\n        </div>\n\n        <div className=\"flex flex-row items-end justify-between flex-1 mt-4\">\n          <Link to=\"/investigation/new\" className=\"lg:ml-4\" target=\"_blank\" rel=\"noopener noreferrer\">\n            <Button linedBlue noPadding className=\"w-32 text-lg\">\n              New Case\n            </Button>\n          </Link>\n\n          <Link to=\"/active-cases\">\n            <Button className=\"font-semibold lg:text-lg text-pursuit-gray focus:outline-none\">VIEW ALL CASES</Button>\n          </Link>\n        </div>\n      </Container>\n\n      <Container\n        height=\"lg:h-152\"\n        width=\"lg:w-1/4\"\n        padding=\"p-4\"\n        margin=\"mx-3 mb-3 lg:mb-0 lg:mx-6\"\n        className=\"flex flex-col\">\n        <HeaderText fontSize=\"text-2xl\" className=\"text-left lg:text-4xl lg:text-center\">\n          Returned Cases\n        </HeaderText>\n\n        <div className=\"flex flex-col pt-4 overflow-y-auto lg:px-4\">\n          <DataGrid\n            columns={[\n              { title: 'Case Number', fieldName: 'caseNumber' },\n              { title: 'Name', value: getName },\n              { title: 'Date Returned', value: getDateReturned },\n            ]}\n            loading={returnedCasesLoading}\n            data={tenRecentReturnedCases}\n            noRecordsText=\"You do not have any returned cases.\"\n            rowLink={item => `/investigation/${item.id}`}\n            gridKey=\"returned-cases\"\n          />\n        </div>\n\n        <div className=\"flex flex-row items-end justify-between flex-1 mt-4\">\n          <div />\n\n          <Link to=\"/active-cases?status=RETURNED\">\n            <Button className=\"font-semibold lg:text-lg text-pursuit-gray focus:outline-none\">\n              VIEW RETURNED CASES\n            </Button>\n          </Link>\n        </div>\n      </Container>\n    </div>\n  );\n};\n\nexport default Dashboard;\n","import { uniqueKey } from 'highcharts';\nimport { CaseStatus } from '../../constants';\nimport { webSourceFields, websiteList } from './webSourceFields';\n\nexport const initialPersonalInfoState = {\n  firstName: '',\n  lastName: '',\n  middleName: '',\n  age: '',\n  city: '',\n  state: '',\n  details: '',\n};\n\nexport const initialEscortAdState = {\n  url: '',\n  phones: [\n    {\n      type: 'Cellular',\n      number: '',\n      id: 'initial',\n    },\n  ],\n};\n\nexport const initialWebSourceState = {\n  website: 'CashApp',\n  // uniqueFields: { ...webSourceFields[websiteList[0].toLowerCase()] },\n  uniqueFields: {\n    cashtag: '',\n    displayName: '',\n    profilePictureUrl: '',\n    registeredPhoneNumber: '',\n  },\n  url: '',\n  description: '',\n};\n\nconst { url, ...escortAdSourceFields } = webSourceFields.escortad;\n// if (escortAdSourceFields.hasOwnProperty('url')) {\n// delete escortAdSourceFields.url;\n// }\n// delete escortAdSourceFields.description;\nexport const initialEscortAdSourceState = {\n  website: 'Escort Ad',\n  // uniqueFields: webSourceFields.escortad,\n  uniqueFields: escortAdSourceFields,\n  url: '',\n  description: '',\n};\n\nexport const initialCaseState = {\n  caseNumber: '',\n  firstName: '',\n  lastName: '',\n  middleName: '',\n  age: '',\n  city: '',\n  state: '',\n  details: '',\n  escortAd: initialEscortAdState,\n  // webSources: [],\n  webSources: [initialEscortAdSourceState],\n  status: CaseStatus.Active,\n};\n","import { AwardTypes, ESCORT_AD } from '../../constants';\nimport { personalInfoValidator, escortAdValidator } from './fieldValidation';\n\nexport function validateOnSubmit(setAlert, caseState) {\n  const escortAdValid = escortAdValidator(setAlert, caseState.escortAd, caseState);\n  const personalInfoValid = personalInfoValidator(setAlert, caseState);\n\n  return personalInfoValid && escortAdValid;\n}\n\nexport function validateOnApprove(setAlert, caseState) {\n  if (!caseState.awardClassificationOption) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'You must select an Award Classification Option before approval',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n\n  const { awardedPoints } = caseState;\n\n  if (\n    !Array.isArray(awardedPoints) ||\n    awardedPoints.length < caseState.webSources.length + (caseState.escortAd.url ? 1 : 0)\n  ) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'You must select an award option for each step before approval.',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n  const firstEscortAd = caseState.webSources[0];\n  // Confirm that the first websource is a escort ad\n  if (firstEscortAd && firstEscortAd.website !== 'Escort Ad') {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'The first web source must be an escort ad',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n  const escortAdStepId = firstEscortAd.id;\n  const escortAdAward =\n    awardedPoints.find(x => x.stepId === ESCORT_AD || x.stepId === escortAdStepId) || awardedPoints[0]; // TODO: Make sure this is the first escort ad;\n\n  if (\n    !escortAdAward ||\n    (escortAdAward.awardType !== AwardTypes.AccountIdentified &&\n      escortAdAward.awardType !== AwardTypes.VerficationSource)\n  ) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Escort ad must be awarded points in order to approve a case',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n\n  return true;\n}\n\nexport function validateOnReturn(setAlert, caseState) {\n  if (!Array.isArray(caseState.feedbackComments) || !caseState.feedbackComments.length) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'You must provide at least one feedback comment before returning the case',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n\n  if (!caseState.feedbackComments.some(x => x.feedback)) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'You must provide at least one feedback comment before returning the case!!',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n\n  return true;\n}\n","import { webSourceFieldLabel } from './utilHelpers';\nimport { webSourceRequiredFields, webSourceRequiredFieldsStructured } from './webSourceFields';\n\nexport function personalInfoValidator(setAlert, caseState) {\n  const firstNameEmpty = !caseState.firstName;\n  const lastNameEmpty = !caseState.lastName;\n  const ageEmpty = !caseState.age;\n  // TODO: Move to use escort ad location instead of case location\n  const cityEmpty = !caseState.city;\n  const stateEmpty = !caseState.state;\n  // const cityEmpty = false;\n  // const stateEmpty = false;\n\n  const requiredFields = [];\n\n  if (firstNameEmpty) {\n    requiredFields.push('First name is required');\n  }\n  if (lastNameEmpty) {\n    requiredFields.push('Last name is required');\n  }\n  if (ageEmpty) {\n    requiredFields.push('Age is required');\n  }\n  if (cityEmpty) {\n    requiredFields.push('City is required');\n  }\n  if (stateEmpty) {\n    requiredFields.push('State is required');\n  }\n\n  if (requiredFields.length !== 0) {\n    const message = `${requiredFields.join(', ')} (Personal Information)`;\n\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message,\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !firstNameEmpty && !lastNameEmpty && !ageEmpty && !cityEmpty && !stateEmpty;\n}\n\nexport function escortAdValidator(setAlert, escortAdState, caseState) {\n  if (!escortAdState) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Escort Ad Incomplete',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n\n  let escortAdInformation = {};\n  if (caseState) {\n    const firstSource = caseState.webSources[0];\n    if (firstSource.website === 'Escort Ad') {\n      escortAdInformation = firstSource;\n    }\n  }\n  console.log('escortAdInformation', escortAdInformation);\n\n  // console.log('escortAdState', escortAdState);\n\n  let urlEmpty = !escortAdState.url;\n  let noPhones =\n    !escortAdState.phones || !escortAdState.phones.length || escortAdState.phones.every(obj => !obj.number);\n  let invalidPhone = false;\n  let uniqueFieldsValid = true;\n\n  if (urlEmpty && escortAdInformation.url) {\n    // Check if the URL is empty\n    urlEmpty = !escortAdInformation.url;\n  }\n\n  if (escortAdState.phones && escortAdState.phones.length) {\n    escortAdState.phones.forEach(obj => {\n      if (!obj.number || !obj.type) {\n        invalidPhone = true;\n      } else {\n        const phone = obj.number.replace('-', '');\n\n        if (phone.length < 10) {\n          invalidPhone = true;\n        }\n      }\n    });\n  }\n  if (invalidPhone && escortAdInformation?.uniqueFields?.phoneNumber) {\n    // Check if the phone number is valid\n    noPhones = false;\n    const phone = escortAdInformation.uniqueFields.phoneNumber.replaceAll('-', '');\n    console.log('phone', phone);\n    if (phone.length !== 10) {\n      invalidPhone = true;\n    } else {\n      invalidPhone = false;\n    }\n  }\n  console.log('noPhones test', !escortAdInformation?.uniqueFields?.phoneNumber);\n\n  const requiredFields = [];\n\n  if (urlEmpty) {\n    // requiredFields.push('URL cannot be empty');\n  }\n  if (noPhones) {\n    // requiredFields.push('Escort Ad requires at least one phone');\n    // requiredFields.push('Escort Ad requires st one phone');\n  }\n  if (invalidPhone) {\n    requiredFields.push('Phone number must have exactly 10 digits');\n  }\n\n  // Check all web sources for required fields\n  for (let i = 0; i < caseState.webSources.length; i++) {\n    const webSource = caseState.webSources[i];\n    // Make sure base required fields are present\n    const fieldsToCheckFor = new Set([\n      ...webSourceRequiredFields,\n      ...(webSourceRequiredFieldsStructured[webSource.website.toLowerCase().replace(/ /g, '')] || []),\n    ]);\n    for (const field of fieldsToCheckFor) {\n      const fieldValue = webSource.uniqueFields[field] || webSource[field];\n      console.log({ field, fieldValue });\n      if (!fieldValue) {\n        const prettyFieldName = webSourceFieldLabel(field);\n        requiredFields.push(`Web Source ${i + 1} is missing ${prettyFieldName}`);\n        uniqueFieldsValid = false;\n      }\n    }\n  }\n\n  if (requiredFields.length !== 0) {\n    // const message = `${requiredFields.join(', ')} (Escort Ad)`;\n    const message = `${requiredFields.join(', ')}`;\n\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message,\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n  // console.log({ urlEmpty, noPhones, invalidPhone });\n  // return false;\n  return !urlEmpty && !noPhones && !invalidPhone && uniqueFieldsValid;\n}\n\n/**\n * Validates the web sources making sure they have a URL and all required fields.\n * Requirements for each web source type are defined in webSourceRequiredFieldsStructured.\n * @param {function} setAlert - Function to set the alert\n * @param {Array} webSources - Array of web sources\n */\n\n// TODO use this Monday. Error to find ;)\n\nexport const webSourcesValidator = (setAlert, webSourceRequiredFieldsStructured, webSources = []) => {\n  // const webSourceRequiredFieldsStructured = {\n  //   'Backpage Ad': ['url', 'phoneNumber', 'phoneType', 'adLocation'],\n  //   'Escort Ad': ['url', 'phoneNumber', 'phoneType', 'adLocation'],\n  //   'Social Media': ['url'],\n  //   'Website': ['url'],\n  // };\n\n  const invalidWebSources = webSources.filter(({ website, uniqueFields }) => {\n    const requiredFields = webSourceRequiredFieldsStructured[website];\n\n    if (!requiredFields) {\n      return false;\n    }\n\n    return requiredFields.some(field => !uniqueFields[field]);\n  });\n\n  if (invalidWebSources.length) {\n    const message = `${invalidWebSources.length} web source(s) are incomplete`;\n\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message,\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n\n  return true;\n};\n","import React, { useContext, useState, useEffect, useCallback } from 'react';\nimport { useParams, useHistory } from 'react-router-dom';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { toast } from 'react-toastify';\nimport ShortUniqueId from 'short-unique-id';\nimport * as Icons from 'react-icons/fa';\nimport debounce from 'lodash.debounce';\nimport Switch from 'react-switch';\nimport { v4 as uuidv4 } from 'uuid';\nimport { createCase, updateCase, submitCase } from '../../../generated/graphql/mutations';\nimport { getCase } from '../../../generated/graphql/queries';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext';\nimport {\n  initialCaseState,\n  initialEscortAdSourceState,\n  initialEscortAdState,\n  initialWebSourceState,\n} from '../../../helpers/caseForms/initialFormStates';\nimport { validateOnSubmit } from '../../../helpers/caseForms/caseValidation';\nimport { AwardTypes, CaseStatus } from '../../../constants';\n\nimport {\n  Container,\n  MobileDropdown,\n  Button,\n  PopUpConfirmation,\n  Spinner,\n  ConfirmationForm,\n  OrderStepsForm,\n  PersonalInfoForm,\n  EscortAdForm,\n  WebSourceForm,\n} from '../../../components';\nimport { usesOldEscortAdFormat } from '../../../helpers/caseForms/utilHelpers';\n\nconst DEBOUNCE_SAVE_DELAY_MS = 3000;\n\nconst Investigation = () => {\n  const history = useHistory();\n\n  const setAlert = useContext(NotificationContext)[1];\n\n  const { idParam } = useParams();\n\n  const id = idParam === 'new' ? '' : idParam;\n\n  const [caseID, setCaseID] = useState(id);\n  const [formNumber, setFormNumber] = useState(0);\n  const [caseState, setCaseState] = useState(JSON.parse(JSON.stringify(initialCaseState)));\n  const [sourceIndex, setSourceIndex] = useState(0);\n  const [numSources, setNumSources] = useState();\n  const [showConfirmPopup, setShowConfirmPopup] = useState(false);\n  const [saving, setSaving] = useState(false);\n  const [loading, setLoading] = useState(true);\n  const [submitting, setSubmitting] = useState(false);\n  const [autoSaveReady, setAutoSaveReady] = useState(false);\n  const [autoSaveEnabled, setAutoSaveEnabled] = useState(true);\n  const [disableEdit, setDisableEdit] = useState(false);\n  const [disableOnApprove, setDisableOnApprove] = useState(false);\n  const [disableOnApproveEdit, setDisableOnApproveEdit] = useState(false);\n  const [rightScroll, setRightScroll] = useState(true);\n\n  useEffect(() => {\n    const enabled = localStorage.getItem('autoSaveEnabled');\n\n    if (enabled && enabled.toLocaleLowerCase() === 'false') {\n      setAutoSaveEnabled(false);\n    }\n  }, []);\n\n  const autoSave = useCallback(\n    debounce(async data => {\n      if (autoSaveReady && autoSaveEnabled) {\n        save({ data, noAlert: true });\n      }\n    }, DEBOUNCE_SAVE_DELAY_MS),\n    [autoSaveReady, autoSaveEnabled]\n  );\n\n  useEffect(() => {\n    if (!id) {\n      const initCaseState = JSON.parse(JSON.stringify(initialCaseState));\n\n      initCaseState.caseNumber = generateCaseNumber();\n      initCaseState.webSources[0].id = uuidv4();\n      // Remove the description field from the unique fields\n      delete initCaseState.webSources[0].uniqueFields.description;\n\n      setCaseState(initCaseState);\n\n      setFormNumber(0);\n      setLoading(false);\n    } else {\n      getCaseRecord().then(record => {\n        setAutoSaveReady(true);\n\n        storeState(record);\n        if (\n          record.status === CaseStatus.Approved ||\n          record.status === CaseStatus.Submitted ||\n          record.status === CaseStatus.Resubmitted\n        ) {\n          setFormNumber(2);\n        }\n      });\n    }\n  }, [id]);\n\n  useEffect(() => {\n    setNumSources(1 + caseState.webSources.length);\n\n    if (caseState.status === CaseStatus.Submitted || caseState.status === CaseStatus.Resubmitted) {\n      setDisableEdit(true);\n    }\n\n    // checkif any any points to edit\n    if (caseState.status === CaseStatus.Approved) {\n      setDisableOnApproveEdit(disableApprovedEdit());\n    }\n\n    if (caseState.status === CaseStatus.Approved) {\n      setDisableOnApprove(true);\n    }\n  }, [caseState]);\n\n  useEffect(() => {\n    if (caseState) {\n      autoSave(caseState, false);\n    }\n  }, [caseState, autoSave]);\n\n  // Was skipping steps\n  // useEffect(() => {\n  //   if (formNumber === 1 && sourceIndex > 0) {\n  //     skipSteps();\n  //   }\n  // }, [sourceIndex, formNumber]);\n\n  const tabNames = ['Personal Information', 'Case Sources', 'Review Steps', 'Confirm Details'];\n\n  const disableApprovedEdit = () => {\n    let noEdit = true;\n\n    caseState.webSources.map(source => {\n      const currStepAward = caseState?.awardedPoints?.find(item => item.stepId === source.id) || null;\n\n      if (currStepAward?.awardType === AwardTypes.NoPoints || !currStepAward?.awardType) {\n        noEdit = false;\n      }\n    });\n\n    return noEdit;\n  };\n\n  const skipSteps = () => {\n    // get awarded points where step id is the same as websource\n\n    let tmpIndex = sourceIndex - 1;\n    let currStepAward =\n      caseState?.awardedPoints?.find(source => source.stepId === caseState.webSources[tmpIndex].id) || null;\n\n    // skip step if already approved. (so user can't edit)\n    if (\n      caseState.status === CaseStatus.Approved &&\n      (currStepAward?.awardType === AwardTypes.AccountIdentified ||\n        currStepAward?.awardType === AwardTypes.VerficationSource)\n    ) {\n      while (\n        currStepAward?.awardType === AwardTypes.AccountIdentified ||\n        currStepAward?.awardType === AwardTypes.VerficationSource\n      ) {\n        // // Moneal test\n        if (rightScroll) {\n          tmpIndex += 1;\n        } else {\n          tmpIndex -= 1;\n        }\n\n        if (tmpIndex >= caseState.webSources.length || tmpIndex < 0) {\n          setFormNumber(formNumber + 1);\n\n          return;\n        }\n\n        currStepAward =\n          caseState?.awardedPoints?.find(source => source.stepId === caseState.webSources[tmpIndex].id) || null;\n      }\n\n      setSourceIndex(tmpIndex + 1);\n\n      if (rightScroll) {\n        nextForm(tmpIndex);\n      } else {\n        prevForm(tmpIndex + 2);\n      }\n    }\n  };\n  const generateCaseNumber = () => {\n    let number = new ShortUniqueId({\n      dictionary: 'number',\n    })();\n\n    const timestamp = new Date();\n    const year = timestamp.getFullYear();\n\n    number = `t${number}-${year}`;\n\n    return number;\n  };\n\n  const storeState = record => {\n    const loadedCaseState = JSON.parse(JSON.stringify(record));\n\n    if (loadedCaseState && loadedCaseState.webSources && loadedCaseState.webSources.length) {\n      const updatedWebSources = [];\n\n      for (const webSource of loadedCaseState.webSources) {\n        if (!webSource.id) {\n          updatedWebSources.push({ ...webSource, id: uuidv4() });\n        } else {\n          updatedWebSources.push(webSource);\n        }\n      }\n\n      loadedCaseState.webSources = updatedWebSources;\n    }\n\n    if (loadedCaseState && loadedCaseState.escortAd && loadedCaseState.escortAd.phones) {\n      const updatedPhones = [];\n\n      for (const phone of loadedCaseState.escortAd.phones) {\n        if (!phone.id) {\n          updatedPhones.push({ ...phone, id: uuidv4() });\n        } else {\n          updatedPhones.push(phone);\n        }\n      }\n\n      loadedCaseState.escortAd.phones = updatedPhones;\n    }\n\n    setCaseState(loadedCaseState);\n    setLoading(false);\n  };\n\n  const getCaseRecord = async () => {\n    try {\n      const res = await API.graphql(\n        graphqlOperation(getCase.replace('assignedToName\\n', ''), {\n          id: caseID,\n        })\n      );\n      return res.data.getCase;\n    } catch (error) {\n      console.error('Error on getting case', error);\n      const { data } = error;\n      if (data && data.getCase !== null) {\n        return data.getCase;\n      }\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error Getting Case',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n  };\n\n  const addCaseRecord = async record => {\n    try {\n      const res = await API.graphql(\n        graphqlOperation(createCase.replace('assignedToName\\n', ''), {\n          input: record,\n        })\n      );\n\n      const caseId = res.data.createCase.id;\n\n      setCaseID(caseId);\n\n      window.history.replaceState(null, 'Pursuit | Guardian Group', `/investigation/${caseId}`);\n\n      setAutoSaveReady(true);\n\n      return true;\n    } catch (error) {\n      console.error('Error on creating case', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error Creating Case',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n\n      return false;\n    }\n  };\n\n  const updateCaseRecord = async record => {\n    record.id = caseID;\n\n    const { assignedToName, ...rest } = JSON.parse(JSON.stringify(record));\n    if (\n      !usesOldEscortAdFormat(record) &&\n      Array.isArray(record.webSources) &&\n      record.webSources[0]?.website === 'Escort Ad'\n    ) {\n      if (record.webSources[0]?.uniqueFields?.adLocation) {\n        const [city, state] = record.webSources[0].uniqueFields.adLocation.split(', ');\n        if (city) rest.city = city;\n        if (state) rest.state = state;\n      }\n    }\n\n    // Remove assignedToName from query, total hack\n    const updatedQuery = updateCase.replace('assignedToName\\n', '');\n    try {\n      const result = await API.graphql(\n        graphqlOperation(updatedQuery, {\n          // input: record,\n          input: rest,\n        })\n      );\n      // console.log({ result });\n      // const {updateCase} = result.data;\n      // setCaseState(updateCase);\n      // setCaseState({ ...record, ...rest });\n\n      return true;\n    } catch (error) {\n      console.error('Error on updating case', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error Saving Case',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n\n      return false;\n    }\n  };\n\n  const save = async params => {\n    let data = null;\n    let noAlert = false;\n\n    if (params) {\n      ({ data, noAlert } = params);\n    }\n\n    setSaving(true);\n\n    removeAlert();\n\n    let saved = true;\n\n    const record = !data ? { ...caseState } : { ...data };\n\n    if (caseID === '') {\n      saved = await addCaseRecord({\n        caseNumber: record.caseNumber,\n        firstName: record.firstName,\n        middleName: record.middleName,\n        lastName: record.lastName,\n        age: record.age,\n        city: record.city,\n        state: record.state,\n        details: record.details,\n        escortAd: record.escortAd,\n        webSources: record.webSources,\n        investigatorNotes: record.investigatorNotes,\n      });\n    } else {\n      saved = await updateCaseRecord({\n        id: caseID,\n        firstName: record.firstName,\n        middleName: record.middleName,\n        lastName: record.lastName,\n        age: record.age,\n        city: record.city,\n        state: record.state,\n        details: record.details,\n        escortAd: record.escortAd,\n        webSources: record.webSources,\n        // Did notes ever save?\n        investigatorNotes: record.investigatorNotes,\n        sourceOrder: record.sourceOrder,\n      });\n    }\n\n    if (!noAlert && saved) {\n      toast.success('Successfully Saved', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n    }\n\n    setSaving(false);\n\n    return saved;\n  };\n\n  const autoSaveToggle = enabled => {\n    setAutoSaveEnabled(enabled);\n\n    localStorage.setItem('autoSaveEnabled', enabled.toString());\n  };\n\n  const submit = () => {\n    if (save() === false) return;\n\n    if (validateOnSubmit(setAlert, caseState)) {\n      removeAlert();\n\n      setShowConfirmPopup(true);\n    }\n  };\n\n  const confirmedSubmit = async () => {\n    try {\n      setSubmitting(true);\n\n      const input = {\n        id: caseID,\n        firstName: caseState.firstName,\n        middleName: caseState.middleName,\n        lastName: caseState.lastName,\n        age: caseState.age,\n        city: caseState.city,\n        state: caseState.state,\n        details: caseState.details,\n        escortAd: caseState.escortAd,\n        webSources: caseState.webSources,\n        investigatorNotes: caseState.investigatorNotes,\n      };\n\n      if ('status' in caseState) {\n        input.status = caseState.status;\n      }\n\n      await API.graphql(graphqlOperation(submitCase.replace('assignedToName\\n', ''), { input }));\n\n      setSubmitting(false);\n\n      history.replace('/success');\n    } catch (error) {\n      console.error('Error submitting case: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error Submitting Case',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n\n      setSubmitting(false);\n    }\n  };\n\n  const removeAlert = () => {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: false,\n      },\n    });\n  };\n\n  const saveAndAdd = async () => {\n    const saved = await save();\n\n    if (!saved) {\n      return;\n    }\n    const usesOldEscortAds = usesOldEscortAdFormat(caseState);\n\n    const newWebSource = JSON.parse(\n      JSON.stringify(numSources === 1 ? initialEscortAdSourceState : initialWebSourceState)\n    );\n\n    newWebSource.id = uuidv4();\n    // Remove description from unique fields if it exists\n    // const {description, ...uniqueFields} = newWebSource.uniqueFields;\n    // delete uniqueFields.description;\n    // newWebSource.uniqueFields = uniqueFields;\n    // if (newWebSource?.uniqueFields?.description) {\n    //   delete newWebSource.uniqueFields.description;\n    // }\n\n    // console.log({ numSources, usesOldEscortAds, newWebSource});\n\n    const updatedWebSources = JSON.parse(JSON.stringify(caseState.webSources));\n\n    updatedWebSources.push(newWebSource);\n\n    if (Array.isArray(caseState.sourceOrder)) {\n      caseState.sourceOrder.push(newWebSource.id);\n    } else {\n      caseState.sourceOrder = [newWebSource.id];\n    }\n\n    const newCaseState = {\n      ...caseState,\n      webSources: [...updatedWebSources],\n    };\n\n    // console.log({ newCaseState, numSources });\n    // If source a escort ad and the first while case not using old escort ads, set the location data from the source\n    if (numSources === 1 && !usesOldEscortAds) {\n      const [city, state] = newWebSource.uniqueFields.adLocation.split(', ');\n      if (city) newCaseState.city = city;\n      if (state) newCaseState.state = state;\n    }\n\n    setCaseState(newCaseState);\n    console.log({ numSources, usesOldEscortAds, newCaseState });\n    if (usesOldEscortAds) {\n      setSourceIndex(numSources);\n      setNumSources(numSources + 1);\n    } else {\n      // TODO: Sending to wrong index\n      // setSourceIndex(numSources - 1);\n      // setNumSources(numSources);\n\n      // setSourceIndex(numSources - 2);\n      // setSourceIndex(numSources - 1);\n      // setNumSources(numSources);\n      setSourceIndex(numSources - 1);\n    }\n\n    setFormNumber(1);\n  };\n\n  const prevForm = (srcIndex = sourceIndex) => {\n    if (autoSaveEnabled) {\n      if (!save({ noAlert: true })) {\n        return;\n      }\n    }\n    setRightScroll(false);\n\n    if (formNumber === 1) {\n      if (srcIndex <= 1) {\n        // if approved don't let user update personal info\n        if (caseState.status === CaseStatus.Approved) {\n          setFormNumber(2);\n        } else {\n          setFormNumber(formNumber - 1);\n        }\n      } else {\n        setSourceIndex(srcIndex - 1);\n      }\n\n      return;\n    }\n\n    if (formNumber === 2) {\n      setFormNumber(formNumber - 1);\n      setSourceIndex(numSources - 1);\n\n      return;\n    }\n\n    setFormNumber(formNumber - 1);\n  };\n\n  const nextForm = async (srcIndex = sourceIndex) => {\n    console.log('nextForm', srcIndex, numSources);\n    const saved = await save();\n\n    if (!saved) {\n      return;\n    }\n    setRightScroll(true);\n\n    // if (formNumber === 1 && srcIndex < numSources - 1) {\n    //   setSourceIndex(srcIndex + 1);\n\n    //   return;\n    // }\n\n    if (formNumber === 0) {\n      setSourceIndex(0);\n    }\n\n    setFormNumber(formNumber + 1);\n  };\n\n  const saveAndTo = async tabNum => {\n    if (autoSaveEnabled) {\n      const saved = await save({ noAlert: true });\n\n      if (!saved) {\n        return;\n      }\n    }\n    if (caseState.status === CaseStatus.Approved) {\n      setSourceIndex(1);\n    } else {\n      setSourceIndex(0);\n    }\n\n    setFormNumber(tabNum);\n  };\n\n  const editSource = id => {\n    if (!save()) {\n      return;\n    }\n    const index = caseState.webSources.findIndex(source => source.id === id);\n\n    console.log('editSource', id, index);\n\n    setSourceIndex(index);\n    setFormNumber(1);\n  };\n\n  // Component Builders\n  const defaultTab = (formNum, text, disable = false) => (\n    <Button\n      tab\n      onClick={() => saveAndTo(formNum, true)}\n      className=\"px-0 text-lg border-b-4 border-transparent rounded-none text-pursuit-gray focus:outline-none hover:border-pursuit-red\"\n      disabled={disable}>\n      {text}\n    </Button>\n  );\n\n  const activateTab = tabButton => (\n    <div className=\"relative flex flex-col\">\n      {tabButton}\n      <div className=\"absolute inset-y-0 w-full border-b-4 border-pursuit-red\" />\n    </div>\n  );\n\n  // let personalInfoTab = defaultTab(0, 'Personal Information', disableEdit || disableOnApprove);\n  let personalInfoTab = defaultTab(0, 'Personal Information');\n  let sourcesTab = defaultTab(1, 'Case Sources', disableEdit || disableOnApproveEdit);\n  let reviewTab = defaultTab(2, 'Review Steps');\n  let confirmTab = defaultTab(3, 'Confirm Details');\n\n  let prevButton = (\n    <Button\n      className=\"flex items-center mb-12 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue\"\n      onClick={prevForm}\n      disabled={disableEdit && formNumber === 2}>\n      <Icons.FaChevronLeft size={18} className=\"mr-4\" />\n      BACK\n    </Button>\n  );\n\n  let nextButton = (\n    <Button\n      className=\"flex items-center mb-12 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue\"\n      onClick={nextForm}>\n      SAVE AND NEXT\n      <Icons.FaChevronRight size={18} className=\"ml-4\" />\n    </Button>\n  );\n\n  const saveAndAddButton = (\n    <Button solidBlue padding=\"px-4 py-1\" className=\"lg:w-88\" onClick={saveAndAdd}>\n      <span className=\"p-0 m-0 nowrap\" style={{ whiteSpace: 'nowrap' }}>\n        SAVE AND ADD NEW SOURCE\n      </span>\n    </Button>\n  );\n\n  const addButton = (\n    <Button solidBlue padding=\"px-4 py-1\" className=\"my-2 mr-8\" onClick={saveAndAdd} disabled={disableEdit}>\n      <span className=\"p-0 m-0 nowrap\" style={{ whiteSpace: 'nowrap' }}>\n        Add New Source\n      </span>\n    </Button>\n  );\n\n  const submitButton = (submitText = 'SAVE & SUBMIT TO GUARDIAN GROUP') => (\n    <Button solidBlue onClick={submit} className=\"text-base w-72\">\n      {submitText}\n    </Button>\n  );\n\n  let form = null;\n\n  switch (formNumber) {\n    case 0:\n      personalInfoTab = activateTab(personalInfoTab);\n      form = (\n        <PersonalInfoForm\n          caseState={caseState}\n          setCaseState={setCaseState}\n          key={`personalinfo-${caseState.caseNumber}`}\n          disableNameEdit={disableEdit || disableOnApprove}\n        />\n      );\n      prevButton = <div />;\n      break;\n    case 1:\n      sourcesTab = activateTab(sourcesTab);\n      // Check if any of the old escort ad fields are filled\n      // const escortAdData = [\n      //   caseState.escortAd.url,\n      //   ...caseState.escortAd.phones.map(({ phone }) => phone),\n      //   caseState.escortAd.description,\n      // ];\n      // const escortAdEmpty = escortAdData.filter(Boolean).length === 0;\n      // console.log({\n      //   emptyAdData: escortAdData,\n      //   escortAdEmpty,\n      // });\n      const escortAdEmpty = !usesOldEscortAdFormat(caseState);\n      // let stepSourceIndex = sourceIndex;\n      // console.log({ escortAdEmpty, sourceIndex });\n      let selectedIndex = sourceIndex;\n      if (!escortAdEmpty) {\n        selectedIndex -= 1;\n      }\n\n      // if (!escortAdEmpty) stepSourceIndex += 1;\n\n      form =\n        !escortAdEmpty && sourceIndex === 0 ? (\n          // Use a normal source for the first step\n          <EscortAdForm\n            caseState={caseState}\n            setCaseState={setCaseState}\n            saveAndAddButton={saveAndAddButton}\n            key={`escort-${caseState.caseNumber}`}\n          />\n        ) : (\n          // <WebSourceForm\n          //   caseState={caseState}\n          //   setCaseState={setCaseState}\n          //   stepNumber={sourceIndex + 1}\n          //   webSourceIndex={sourceIndex}\n          //   setGlobalIndex={setSourceIndex}\n          //   setFormNumber={setFormNumber}\n          //   saveAndAddButton={saveAndAddButton}\n          //   // key={`websource-${caseState.webSources[sourceIndex - 1].id}`}\n          // />\n          <WebSourceForm\n            caseState={caseState}\n            setCaseState={setCaseState}\n            stepNumber={sourceIndex + 1}\n            // webSourceIndex={sourceIndex - 1}\n            webSourceIndex={selectedIndex}\n            // webSourceIndex={stepSourceIndex}\n            setGlobalIndex={setSourceIndex}\n            setFormNumber={setFormNumber}\n            saveAndAddButton={saveAndAddButton}\n            // key={`websource-${caseState.webSources[sourceIndex - 1].id}`}\n          />\n        );\n      break;\n    case 2:\n      reviewTab = activateTab(reviewTab);\n      form = (\n        <OrderStepsForm\n          caseState={caseState}\n          setCaseState={setCaseState}\n          editSource={editSource}\n          save={save}\n          addButton={addButton}\n          disableEdit={disableEdit}\n          sourceIndex={sourceIndex}\n        />\n      );\n      break;\n    case 3:\n      confirmTab = activateTab(confirmTab);\n      form = <ConfirmationForm caseState={caseState} />;\n      const stepsAdded = caseState.awardedPoints?.length - 1 !== caseState?.webSources?.length;\n\n      if (caseState.status === CaseStatus.Active || caseState.status === CaseStatus.Returned) {\n        nextButton = submitButton();\n      } else if (\n        (caseState.status === CaseStatus.Approved && caseState.totalPoints.isFullPoints === false) ||\n        (caseState.status === CaseStatus.Approved && stepsAdded)\n      ) {\n        nextButton = submitButton('RESUBMIT CASE');\n      } else if (caseState.status === CaseStatus.Approved) {\n        nextButton = <span className=\"text-lg font-bold text-pursuit-gray\"> Approved </span>;\n      } else if (caseState.status === CaseStatus.Resubmitted) {\n        nextButton = <span className=\"text-lg font-bold text-pursuit-gray\"> Resubmitted </span>;\n      } else {\n        nextButton = <span className=\"text-lg font-bold text-pursuit-gray\">Pending Approval</span>;\n      }\n      break;\n    default:\n      break;\n  }\n\n  const getCaseState = () => {\n    const { status } = caseState;\n\n    switch (status) {\n      case CaseStatus.Active || null || '':\n        return 'In Progress';\n      case CaseStatus.Approved:\n        return 'Approved';\n      case CaseStatus.Resubmitted:\n        return 'Resubmitted';\n      case CaseStatus.Returned:\n        return 'Returned';\n      case CaseStatus.Submitted:\n        return 'Submitted for Review';\n      default:\n        return '-';\n    }\n  };\n\n  return loading ? (\n    <Container\n      width=\"flex flex-col w-96pr h-88 lg:w-3/4 justify-center items-center\"\n      margin=\"m-3 lg:m-auto\"\n      className=\"relative px-6 py-8\">\n      <div className=\"flex flex-col items-center justify-center w-120\">\n        <div className=\"mb-6 text-xl font-bold text-pursuit-gray\">Loading Case Details</div>\n        <Spinner />\n      </div>\n    </Container>\n  ) : (\n    <>\n      {showConfirmPopup ? (\n        <PopUpConfirmation\n          title=\"Confirm Case Submission\"\n          content=\"Are you sure you are ready to submit this case to Guardian Group?\"\n          onCancel={() => setShowConfirmPopup(false)}\n          onConfirm={() => confirmedSubmit()}\n          confirmText=\"SUBMIT\"\n          confirmLoading={submitting}\n          confirmLoadingText=\"SUBMITTING\"\n          className=\"w-11/12 lg:w-auto\"\n        />\n      ) : null}\n      <div className=\"relative flex flex-col flex-1 w-full lg:my-8\">\n        {saving && (\n          <div className=\"fixed top-0 right-0 hidden p-2 mt-24 lg:block\">\n            <Spinner />\n          </div>\n        )}\n        <Container width=\"lg:w-3/4\" margin=\"m-3 lg:m-auto\" className=\"relative px-3 py-4 lg:px-6 lg:py-8\">\n          <div className=\"p-2 font-bold\">\n            <h1 className=\"text-xl lg:text-4xl text-pursuit-gray\">Case #{caseState.caseNumber}</h1>\n            <h2 className=\"text-sm text-pursuit-red lg:text-xl\">{getCaseState()}</h2>\n          </div>\n          <div className=\"lg:relative\">\n            <div className=\"flex items-center mt-4\">\n              <span className=\"text-pursuit-gray\">Auto Save</span>\n              <Switch\n                onChange={autoSaveToggle}\n                checked={autoSaveEnabled}\n                className=\"ml-2 mr-4\"\n                height={20}\n                width={40}\n              />\n            </div>\n\n            <div className=\"flex m-auto mt-2 mb-4 lg:hidden\">\n              <MobileDropdown\n                className=\"w-full h-10 px-2 bg-white shadow\"\n                optionsArray={tabNames}\n                selected={tabNames[formNumber]}\n                selectionCallback={formName => saveAndTo(tabNames.indexOf(formName))}\n              />\n            </div>\n            <div className=\"absolute bottom-0 right-0 flex-row hidden pr-4 mt-4 mb-2 lg: lg:flex\">\n              {personalInfoTab}\n              <span className=\"ml-6\">{sourcesTab}</span>\n              <span className=\"ml-6\">{reviewTab}</span>\n              <span className=\"ml-6\">{confirmTab}</span>\n            </div>\n          </div>\n          <div className=\"w-full px-2 py-4 my-2 bg-gray-100 lg:px-8 lg:py-8\">\n            {form}\n            <div className=\"flex flex-row justify-between h-10 mt-8 text-xs\">\n              {prevButton}\n              {nextButton}\n            </div>\n          </div>\n        </Container>\n      </div>\n    </>\n  );\n};\n\nexport default Investigation;\n","import React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { Container, HeaderText, Button } from '../../../components';\n\nconst Success = () => {\n  const history = useHistory();\n\n  return (\n    <Container width=\"lg:w-2/3\" margin=\"m-3 lg:m-auto\" className=\"relative px-5 py-6 lg:px-8 lg:py-10\">\n      <HeaderText noBold fontSize=\"text-4xl\">\n        Success\n      </HeaderText>\n\n      <h2 className=\"text-pursuit-red text-sm font-bold lg:text-xl\">Submitted</h2>\n\n      <div className=\"bg-gray-100 px-8 py-4 mt-8\">\n        <p className=\"text-pursuit-gray font-bold text-lg mb-4\">Thanks for the submission.</p>\n\n        <p className=\"text-pursuit-gray\">\n          Next, a Guardian Group administrator will validate, corroborate, and determine the next steps for this lead.\n          It may be approved and passed along to law enforcement and you’ll be awarded your points accordingly. However,\n          it may need additional attention, so keep an eye out for it in your “Returned Cases” folder for review.\n        </p>\n\n        <p className=\"text-pursuit-gray mt-4\">\n          In the meantime, continue submitting new cases to help counter this crime.\n        </p>\n\n        <center>\n          <Button solidBlue noPadding className=\"w-full lg:w-64 mx-auto mt-16 mb-12\" onClick={() => history.push('/')}>\n            BACK TO DASHBOARD\n          </Button>\n        </center>\n      </div>\n    </Container>\n  );\n};\n\nexport default Success;\n","export const howYouHeardAboutUsOptions = [\n  { value: 'Guardian Group member', label: 'Guardian Group member' },\n  { value: 'Friend | Coworker', label: 'Friend | Coworker' },\n  { value: 'Guardian Group website', label: 'Guardian Group website' },\n  { value: 'Social Media', label: 'Social Media' },\n  { value: 'Conference', label: 'Conference' },\n  {\n    value: 'Online search of Open Source Intelligence (OSINT)',\n    label: 'Online search of Open Source Intelligence (OSINT)',\n  },\n  {\n    value: 'Online search of counter sex trafficking',\n    label: 'Online search of counter sex trafficking',\n  },\n  { value: 'Other', label: 'Other' },\n];\n","import React, { useState, useContext } from 'react';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { toast } from 'react-toastify';\nimport * as Icons from 'react-icons/fa';\n\nimport { Container, HeaderText, TextField, Button, DropDown, CountryStateZipPicker } from '../../../components';\nimport { useUser } from '../../../contexts/userContext';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\nimport { howYouHeardAboutUsOptions } from '../../../helpers/dropdownOptions';\nimport { zipValidator } from '../../../helpers/createAccount/fieldValidation';\nimport { updateUser } from '../../../generated/graphql/mutations';\n\nconst Settings = () => {\n  const { user, setUser } = useUser();\n\n  const [capitalizedFirstName, setCapitalizedFirstName] = useState(\n    user.firstName && user.firstName.charAt(0).toUpperCase() + user.firstName.slice(1)\n  );\n\n  const [capitalizedLastName, setCapitalizedLastName] = useState(\n    user.lastName && user.lastName.charAt(0).toUpperCase() + user.lastName.slice(1)\n  );\n\n  const [, setAlert] = useContext(NotificationContext);\n\n  const [firstName, setFirstName] = useState(capitalizedFirstName || '');\n  const [lastName, setLastName] = useState(capitalizedLastName || '');\n  const [country, setCountry] = useState(user.country);\n  const [state, setState] = useState(user.state);\n  const [zip, setZip] = useState(user.zip || '');\n  const [heardAboutUs, setHeardAboutUs] = useState(user.heardAboutUs);\n  const [dateOfBirth] = useState(user.dateOfBirth);\n\n  const { alias, email } = user;\n\n  const saveUser = async () => {\n    try {\n      if (\n        !firstName ||\n        !lastName ||\n        (country === 'United States' && !state) ||\n        (country === 'United States' && !zip) ||\n        !heardAboutUs\n      ) {\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: 'Please fill out all fields',\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n\n        return;\n      }\n\n      const zipValid = zipValidator(setAlert, zip, country);\n\n      if (!zipValid) {\n        return;\n      }\n\n      const params = {\n        input: {\n          firstName,\n          lastName,\n          country,\n          state: (country === 'United States' && state) || null,\n          zip: (country === 'United States' && zip) || null,\n          heardAboutUs,\n        },\n      };\n\n      const {\n        data: { updateUser: updatedUser },\n      } = await API.graphql(graphqlOperation(updateUser, params));\n\n      setCapitalizedFirstName(firstName.charAt(0).toUpperCase() + firstName.slice(1));\n      setCapitalizedLastName(lastName.charAt(0).toUpperCase() + lastName.slice(1));\n\n      setUser({ ...user, ...updatedUser });\n\n      toast.success('Successfully Saved', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n    } catch (error) {\n      console.error('Error saving user: ', error);\n\n      toast.error('Error Saving User', {\n        progress: false,\n        className: 'bg-pursuit-red text-white',\n        autoClose: false,\n        closeButton: true,\n        icon: () => <Icons.FaExclamationCircle size={18} className=\"text-white\" />,\n      });\n    }\n  };\n\n  return (\n    <Container\n      height=\"lg:min-h-104\"\n      width=\"lg:w-4/5 xl:w-3/5\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 md:mx-12 lg:mx-auto mt-4\"\n    >\n      <HeaderText fontSize=\"text-4xl\" className=\"mb-6\">\n        Personal Information\n      </HeaderText>\n\n      <div>\n        <div className=\"flex flex-col-reverse lg:flex-row\">\n          <div className=\"w-full lg:mr-4\">\n            <TextField\n              value={firstName}\n              onChange={e => setFirstName(e.target.value)}\n              label=\"First Name\"\n              className=\"mb-4\"\n              required\n            />\n\n            <TextField\n              value={lastName}\n              onChange={e => setLastName(e.target.value)}\n              label=\"Last Name\"\n              className=\"mb-4\"\n              required\n            />\n\n            <CountryStateZipPicker\n              country={country}\n              setCountry={setCountry}\n              state={state}\n              setState={setState}\n              zip={zip}\n              setZip={setZip}\n            />\n\n            <DropDown\n              value={howYouHeardAboutUsOptions.find(x => x.value === heardAboutUs)}\n              label=\"How Did You Hear About Us?\"\n              onChange={option => setHeardAboutUs(option.value)}\n              options={howYouHeardAboutUsOptions}\n              className=\"mb-4\"\n              containerClassName=\"mb-4\"\n              required\n            />\n          </div>\n\n          <div className=\"w-full lg:mr-4\">\n            <TextField value={alias} label=\"Alias\" className=\"mb-4\" readonly />\n\n            <TextField value={email} label=\"Email Address\" className=\"mb-4\" readonly />\n\n            <TextField value={dateOfBirth} label=\"Date of Birth\" className=\"mb-4\" readonly />\n          </div>\n        </div>\n\n        <div className=\"flex justify-end mt-8\">\n          <Button\n            linedBlue\n            noPadding\n            className=\"w-20 lg:w-24 mr-6\"\n            onClick={() => {\n              setFirstName(capitalizedFirstName || '');\n              setLastName(capitalizedLastName || '');\n              setCountry(user.country);\n              setState(user.state);\n              setHeardAboutUs(user.heardAboutUs);\n            }}\n          >\n            CANCEL\n          </Button>\n          <Button\n            solidBlue\n            noPadding\n            className=\"w-20 lg:w-24\"\n            onClick={() => {\n              saveUser();\n            }}\n          >\n            SAVE\n          </Button>\n        </div>\n      </div>\n    </Container>\n  );\n};\n\nexport default Settings;\n","export const titleValidator = (setAlert, title) => {\n  const titleEmpty = !title;\n\n  if (titleEmpty) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter a title',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !titleEmpty;\n};\n\nexport const descriptionValidator = (setAlert, description) => {\n  const descriptionEmpty = !description;\n\n  if (descriptionEmpty) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please enter a description',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !descriptionEmpty;\n};\n\nexport const uploadedVideoValidator = (setAlert, s3Key) => {\n  const s3KeyEmpty = !s3Key;\n\n  if (s3KeyEmpty) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please upload a video',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !s3KeyEmpty;\n};\n\nexport const categoryValidator = (setAlert, category) => {\n  const categoryEmpty = !category;\n\n  if (categoryEmpty) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please select a category',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n  }\n\n  return !categoryEmpty;\n};\n","import React, { useEffect, useState, useContext, useRef } from 'react';\nimport { API, graphqlOperation, Storage } from 'aws-amplify';\nimport { snakeCase } from 'change-case';\nimport ReactPlayer from 'react-player';\nimport * as Icons from 'react-icons/fa';\nimport {\n  Container,\n  HeaderText,\n  DataGrid,\n  Button,\n  DropDown,\n  PopUpConfirmation,\n  TextField,\n  FileUploader,\n} from '../../../components';\nimport Thumbnail from '../../../assets/Images/Thumbnail.png';\nimport { createTutorial, updateTutorial, deleteTutorial } from '../../../generated/graphql/mutations';\nimport { listTutorials } from '../../../generated/graphql/queries';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext';\nimport { TutorialCategory } from '../../../constants';\nimport { useUser } from '../../../contexts/userContext';\nimport { validateTutorial } from '../../../helpers/knowledgeBase/knowledgeBaseValidation';\n\n/**\n * This has a limit set of 1000 since backend is not complete to handle pagination\n */\n\nconst TutorialCategoryOptions = [\n  { value: TutorialCategory.Proj1591HowTo, label: 'Project 1591® - How To' },\n  { value: TutorialCategory.OSINTTipsTricks, label: 'OSINT Tips/Tricks' },\n  { value: TutorialCategory.Miscellaneous, label: 'Miscellaneous' },\n];\n\nconst KnowledgeBase = () => {\n  const { isAdmin, isEmployee } = useUser();\n\n  const [, setAlert] = useContext(NotificationContext);\n\n  const [nextTutorialToken, setNextTutorialToken] = useState();\n\n  const [tutorials, setTutorials] = useState([]);\n  const [tutorialsLoading, setTutorialsLoading] = useState(true);\n  const [selectedTutorial, setSelectedTutorial] = useState({\n    title: '',\n    description: '',\n    s3Key: '',\n    thumbnailS3Key: '',\n    category: '',\n  });\n  const [referenceTutorial, setReferenceTutorial] = useState({\n    title: '',\n    description: '',\n    s3Key: '',\n    category: '',\n    thumbnailS3Key: '',\n  });\n\n  const [category, setCategory] = useState();\n\n  const [showDelete, setShowDelete] = useState(false);\n  const [displayVideo, setDisplayVideo] = useState(false);\n  const [addUpdateVideo, setAddUpdateVideo] = useState(false);\n  const [isUpdate, setIsUpdate] = useState(false);\n  const [thumbnailsFetched, setThumbnailsFetched] = useState(false);\n\n  const [filters, setFilters] = useState({\n    category: '',\n    searchTerm: '',\n  });\n\n  const [sort, setSort] = useState({\n    fieldName: 'DATE_UPLOADED',\n    direction: 'DESC',\n  });\n\n  const [filtersOnLastSearch, setFiltersOnLastSearch] = useState(null);\n  const [sortOnLastSearch, setSortOnLastSearch] = useState({\n    fieldName: '',\n    direction: 'DESC',\n  });\n\n  const [search, setSearch] = useState('');\n\n  useEffect(() => {\n    if (!thumbnailsFetched && tutorials.length > 0) {\n      fetchThumbnails();\n      setThumbnailsFetched(true);\n    }\n  }, [tutorials]);\n\n  useEffect(() => {\n    fetchTutorials();\n  }, [sort]);\n\n  useEffect(() => {\n    fetchTutorials();\n  }, [filters]);\n\n  const fetchTutorials = async () => {\n    setTutorialsLoading(true);\n\n    try {\n      let nextTokenToUse = nextTutorialToken;\n\n      let oldTutorials = nextTokenToUse ? [...tutorials] : [];\n\n      if (\n        !filtersOnLastSearch ||\n        filtersOnLastSearch.category !== filters.category ||\n        filtersOnLastSearch.searchTerm !== filters.searchTerm ||\n        sortOnLastSearch.fieldName !== sort.fieldName ||\n        sortOnLastSearch.direction !== sort.direction\n      ) {\n        setNextTutorialToken(null);\n\n        nextTokenToUse = null;\n        oldTutorials = [];\n      }\n\n      setSortOnLastSearch(sort);\n      setFiltersOnLastSearch(filters);\n\n      const params = {\n        category: filters.category,\n        searchTerm: filters.searchTerm,\n        nextToken: nextTokenToUse,\n        sortField: sort.fieldName ? snakeCase(sort.fieldName).toUpperCase() : '',\n        sortOrder: sort.direction,\n        limit: 1000,\n        // limit: 5,\n      };\n\n      let query = listTutorials;\n\n      const regex = /authorName/i;\n\n      if (!isAdmin && !isEmployee) {\n        query = query.replace(regex, '');\n      }\n\n      let result = await API.graphql(graphqlOperation(query, params));\n\n      // convert category, time, and date\n      result = result.data.listTutorials.items.map(tutorial => {\n        const categoryName = TutorialCategoryOptions.find(x => x.value === tutorial.category) || '';\n        const convertedTime = convertHMS(parseInt(tutorial.time));\n        let date = new Date(tutorial.dateUploaded);\n        const year = date.getFullYear();\n        let month = date.getMonth() + 1;\n        let dt = date.getDate();\n\n        if (dt < 10) {\n          dt = `0${dt}`;\n        }\n        if (month < 10) {\n          month = `0${month}`;\n        }\n        date = `${month}-${dt}-${year}`;\n\n        return {\n          ...tutorial,\n          time: convertedTime,\n          dateUploaded: date,\n          category: categoryName?.label,\n        };\n      });\n      setThumbnailsFetched(false);\n      setNextTutorialToken(result.nextToken);\n      setTutorials([...oldTutorials, ...result]);\n    } catch (error) {\n      console.error('Error Loading tutorials: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error loading active tutorials',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setTutorialsLoading(false);\n  };\n\n  const fetchThumbnails = async () => {\n    // get thumbnails after rest of state is updated\n    const result = await Promise.all(\n      tutorials.map(async tutorial => {\n        let thumbnailS3URL = '';\n\n        // If custom thumbnail, get presigned s3URL\n        if (tutorial.thumbnailS3Key) {\n          thumbnailS3URL = await getThumbnail(tutorial.thumbnailS3Key);\n        }\n\n        return {\n          ...tutorial,\n          thumbnailS3URL,\n        };\n      })\n    );\n\n    setTutorials([...result]);\n  };\n\n  function convertHMS(value) {\n    const sec = parseInt(value, 10);\n    let hours = Math.floor(sec / 3600);\n    let minutes = Math.floor((sec - hours * 3600) / 60);\n    let seconds = sec - hours * 3600 - minutes * 60;\n\n    if (hours < 10) {\n      hours = `0${hours}`;\n    }\n    if (minutes < 10) {\n      minutes = `0${minutes}`;\n    }\n    if (seconds < 10) {\n      seconds = `0${seconds}`;\n    }\n\n    return `${hours}:${minutes}:${seconds}`;\n  }\n\n  const renderUpdate = item => (\n    // put modal here\n    <div className=\"flex justify-around w-1/2\">\n      <button onClick={() => toggleAddUpdateTutorial(item, true)}>\n        <Icons.FaPencilAlt size={18} />\n      </button>\n      <button onClick={() => toggleDeleteTutorial(item)}>\n        <Icons.FaTrash size={18} />\n      </button>\n    </div>\n  );\n\n  const toggleDeleteTutorial = tutorial => {\n    if (tutorial) {\n      setSelectedTutorial(tutorial);\n      setShowDelete(true);\n    }\n  };\n\n  const softDeleteTutorial = async () => {\n    try {\n      const params = {\n        s3Key: selectedTutorial.s3Key,\n      };\n\n      await API.graphql(graphqlOperation(deleteTutorial, params));\n\n      setTutorials(tutorials.filter(tut => tut.s3Key !== selectedTutorial.s3Key));\n    } catch (error) {\n      console.error('Error deleting tutorial: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'An unexpected error occurred deleting the tutorial',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setShowDelete(false);\n  };\n\n  // Can only get called when adding a video. (not updating)\n  const cancelVideoUpload = async () => {\n    if (selectedTutorial?.s3Key) {\n      try {\n        await Storage.remove(selectedTutorial.s3Key, {\n          level: 'public',\n          customPrefix: { public: '' },\n        });\n\n        return true;\n      } catch (error) {\n        return false;\n      }\n    }\n  };\n\n  const cancelThumbnailUpload = async () => {\n    if (selectedTutorial?.thumbnailS3Key) {\n      try {\n        await Storage.remove(selectedTutorial.thumbnailS3Key, {\n          level: 'public',\n          customPrefix: { public: '' },\n        });\n\n        // if video already exists update dynamo\n        if (selectedTutorial?.dateUploaded) {\n          const params = {\n            input: {\n              s3Key: selectedTutorial.s3Key,\n              thumbnailS3Key: '',\n            },\n          };\n\n          await API.graphql(graphqlOperation(updateTutorial, params));\n        }\n\n        return true;\n      } catch (error) {\n        return false;\n      }\n    }\n  };\n\n  const toggleAddUpdateTutorial = (tutorial = null, isUpdate) => {\n    if (isUpdate) {\n      setReferenceTutorial(tutorial);\n      setSelectedTutorial(tutorial);\n    } else setSelectedTutorial({ title: '', description: '', s3Key: '', thumbnailS3Key: '' });\n\n    setIsUpdate(isUpdate);\n\n    setAddUpdateVideo(true);\n  };\n\n  const toggleDisplayTutorial = async tutorial => {\n    if (tutorial) {\n      const vidURL = await Storage.get(tutorial.s3Key, {\n        level: 'public',\n        download: false,\n        expires: 1800,\n        customPrefix: { public: '' },\n      });\n\n      setSelectedTutorial({ ...tutorial, videoURL: vidURL });\n      setDisplayVideo(true);\n    }\n  };\n\n  const successfullUpload = async (s3Key, fileURL) => {\n    const video = document.createElement('video');\n\n    video.setAttribute('src', fileURL);\n\n    video.onloadeddata = function(event) {\n      const { duration } = event.srcElement;\n\n      setSelectedTutorial({ ...selectedTutorial, s3Key, time: duration });\n    };\n  };\n\n  const successfullThumbnailUpload = async s3Key => {\n    setSelectedTutorial({ ...selectedTutorial, thumbnailS3Key: s3Key });\n  };\n\n  const submitTutorial = async () => {\n    try {\n      if (!selectedTutorial.category) selectedTutorial.category = '';\n\n      const isValid = validateTutorial(\n        setAlert,\n        selectedTutorial.title,\n        selectedTutorial.description,\n        selectedTutorial.category,\n        selectedTutorial.s3Key\n      );\n\n      if (!isValid) {\n        return;\n      }\n\n      let params = {};\n\n      if (isUpdate) {\n        const updatedAttributes = {\n          s3Key: selectedTutorial.s3Key,\n        };\n\n        for (const [key, value] of Object.entries(selectedTutorial)) {\n          if (key !== 's3Key' && key !== 'updatedAt' && key !== 'dateUploaded') {\n            if (value !== referenceTutorial[key]) {\n              updatedAttributes[`${key}`] = value;\n            }\n          }\n        }\n\n        params = {\n          input: {\n            ...updatedAttributes,\n          },\n        };\n\n        if (Object.entries(updatedAttributes).length > 1) {\n          await API.graphql(graphqlOperation(updateTutorial, params));\n        }\n      } else {\n        params = {\n          input: {\n            ...selectedTutorial,\n          },\n        };\n\n        await API.graphql(graphqlOperation(createTutorial, params));\n      }\n\n      setSelectedTutorial({ title: '', description: '', s3Key: '', thumbnailS3Key: '' });\n      fetchTutorials();\n    } catch (error) {\n      console.error('Error saving user on upload: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'An unexpected error occurred',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setAddUpdateVideo(false);\n  };\n\n  const player = useRef(null);\n\n  const getThumbnail = async thumbnailS3Key => {\n    const thumbURL = await Storage.get(thumbnailS3Key, {\n      level: 'public',\n      download: false,\n      expires: 1800,\n      customPrefix: { public: '' },\n    });\n\n    return thumbURL;\n  };\n\n  const renderThumbnail = row => {\n    let thumbURL = Thumbnail;\n\n    if (row?.thumbnailS3URL) {\n      thumbURL = row.thumbnailS3URL;\n    }\n\n    return <img src={thumbURL} alt=\"Thumbnail\" className=\"w-11/12\" onClick={() => toggleDisplayTutorial(row)} />;\n  };\n\n  const columns = [\n    { title: 'Thumbnail', fieldName: 'thumbnail', value: renderThumbnail },\n    { title: 'Title', fieldName: 'title', sortable: true },\n    { title: 'Description', fieldName: 'description', sortable: false },\n    { title: 'Time', fieldName: 'time', sortable: true },\n    { title: 'Date Uploaded', fieldName: 'dateUploaded', sortable: true },\n\n    { title: 'Category', fieldName: 'category', sortable: true },\n  ];\n\n  if (isAdmin) {\n    columns.push({ title: 'Author', fieldName: 'authorName', sortable: true });\n    columns.push({ title: 'Update', value: renderUpdate });\n  } else if (isEmployee) {\n    columns.push({ title: 'Author', fieldName: 'authorName', sortable: true });\n  }\n\n  return (\n    <>\n      <Container\n        height=\"h-11/12 lg:h-152\"\n        width=\"lg:w-11/12\"\n        padding=\"p-4\"\n        margin=\"m-3 lg:m-auto\"\n        className=\"relative justify-c\"\n      >\n        <div className=\"flex flex-col pt-4 lg:px-4\">\n          <HeaderText className=\"mb-4 text-2xl text-left lg:text-4xl\">Knowledge Base</HeaderText>\n          <div className=\"items-end justify-end mb-10 lg:flex\">\n            <div className=\"lg:mr-4\">\n              <DropDown\n                value={TutorialCategoryOptions.find(x => x.value === category)}\n                onChange={option => {\n                  setCategory(option ? option.value : '');\n                }}\n                containerClassName=\"mb-4 lg:mb-0\"\n                width=\"w-full lg:w-48 xl:w-64\"\n                label=\"Category Options\"\n                options={TutorialCategoryOptions}\n                placeholder=\"Categories\"\n                isClearable\n              />\n            </div>\n\n            <div className=\"flex flex-col\">\n              <input\n                type=\"text\"\n                value={search}\n                onChange={event => setSearch(event.target.value)}\n                placeholder=\"Search Term\"\n                className=\"w-full h-10 px-4 mt-2 mb-4 bg-gray-100 lg:mb-0 lg:mt-0 lg:mr-4 lg:w-48 xl:w-64\"\n                onKeyDown={event => {\n                  const pressedKey = event.key;\n\n                  if (pressedKey === 'Enter') {\n                    setFilters({\n                      category,\n                      searchTerm: search,\n                    });\n                  }\n                }}\n              />\n            </div>\n            <Button\n              solidBlue\n              className=\"w-full px-4 mt-2 mb-4 mr-0 lg:w-24 lg:mr-48 lg:mb-0 lg:mt-0 xl:w-48\"\n              onClick={() => {\n                setFilters({\n                  category,\n                  searchTerm: search,\n                });\n              }}\n            >\n              FILTER\n            </Button>\n            {isAdmin && (\n              <Button\n                solidRed\n                className=\"w-full px-4 lg:w-48\"\n                onClick={() => {\n                  toggleAddUpdateTutorial(false);\n                }}\n              >\n                ADD VIDEO TUTORIAL\n              </Button>\n            )}\n          </div>\n\n          <DataGrid\n            columns={columns}\n            sort={sort}\n            setSort={setSort}\n            loading={tutorialsLoading}\n            data={tutorials}\n            noRecordsText=\"No tutorials found\"\n            loadNextPage={() => fetchTutorials(filters)}\n            hasMore={!!nextTutorialToken}\n            containerHeight=\"h-184 lg:h-88\"\n            gridKey=\"employee-tutorials\"\n          />\n        </div>\n      </Container>\n      {showDelete && (\n        <PopUpConfirmation\n          title=\"Delete Tutorial\"\n          content={`Are you sure you want to delete ${selectedTutorial?.title || 'this tutorial'}?`}\n          onConfirm={() => {\n            softDeleteTutorial();\n          }}\n          onCancel={() => {\n            setShowDelete(false);\n          }}\n          confirmText=\"DELETE\"\n          destructive\n          className=\"w-11/12 lg:w-auto\"\n        />\n      )}\n      {displayVideo ? (\n        <PopUpConfirmation\n          title={selectedTutorial.title}\n          content={\n            <div\n              padding=\"p-4 md:px-10 md:py-8 lg:px-20 bg-gray-300\"\n              className=\"flex flex-col w-full\"\n              margin=\"mx-3 mt-3 md:mx-12 lg:mx-auto\"\n            >\n              <ReactPlayer\n                ref={player}\n                url={selectedTutorial.videoURL}\n                width=\"100%\"\n                className=\"w-11/12 mt-4 bg-black\"\n                playing\n                controls\n                light\n              />\n            </div>\n          }\n          onConfirm={() => {\n            setDisplayVideo(false);\n          }}\n          noCancel\n          confirmText=\"CLOSE\"\n          className=\"w-11/12 lg:w-1/2 h-10/12 lg:h-auto\"\n        />\n      ) : null}\n      {addUpdateVideo ? (\n        <PopUpConfirmation\n          title={isUpdate ? 'Update Video Tutorial' : 'Add Video Tutorial'}\n          content={\n            <div\n              className=\"flex flex-col w-full p-4 bg-gray-100 md:px-10 md:py-8 lg:px-20\"\n              margin=\"mx-3 mt-3 md:mx-12 lg:mx-auto\"\n            >\n              <TextField\n                value={selectedTutorial?.title || ''}\n                onChange={e => setSelectedTutorial({ ...selectedTutorial, title: e.target.value })}\n                placeholder=\"Title\"\n                label=\"Title\"\n                className=\"mb-4\"\n                fieldClassName=\"bg-white p-2\"\n              />\n\n              <label className=\"font-light light-primary-blue-text\">Description</label>\n              <textarea\n                value={selectedTutorial?.description || ''}\n                onChange={e => setSelectedTutorial({ ...selectedTutorial, description: e.target.value })}\n                placeholder=\"Description\"\n                label=\"Description\"\n                className=\"h-24 p-2 mb-4\"\n              />\n\n              <DropDown\n                value={TutorialCategoryOptions.find(x => x.label === selectedTutorial?.category)}\n                onChange={option => setSelectedTutorial({ ...selectedTutorial, category: option ? option.value : '' })}\n                label=\"Category\"\n                containerClassName=\"mb-12 lg:mr-2\"\n                width=\"w-full lg:w-48 xl:w-64\"\n                options={TutorialCategoryOptions}\n                isClearable\n              />\n              <div className=\"lg:justify-around lg:flex\">\n                {!isUpdate ? (\n                  <div className=\"mb-12 lg:w-1/3\">\n                    <FileUploader\n                      onSuccess={successfullUpload}\n                      saveText=\"UPLOAD\"\n                      prefix=\"tutorials\"\n                      noPrefix\n                      level=\"tutorial\"\n                      errorMessage=\"You have unsuccessfully uploaded the Tutorial. Please try again.\"\n                      onCancel={cancelVideoUpload}\n                      isUpdate={false}\n                      acceptedFileTypes=\"video/*\"\n                      uploadObject=\"Video\"\n                    />\n                  </div>\n                ) : null}\n                <div className=\"lg:w-1/3\">\n                  <FileUploader\n                    onSuccess={successfullThumbnailUpload}\n                    saveText=\"UPLOAD\"\n                    prefix=\"tutorials/thumbnails\"\n                    noPrefix\n                    level=\"tutorial\"\n                    errorMessage=\"You have unsuccessfully uploaded the Thumbnail. Please try again.\"\n                    onCancel={cancelThumbnailUpload}\n                    isUpdate={selectedTutorial?.thumbnailS3Key}\n                    acceptedFileTypes=\"image/*\"\n                    uploadObject=\"Thumbnail\"\n                  />\n                </div>\n              </div>\n            </div>\n          }\n          onConfirm={() => {\n            submitTutorial();\n          }}\n          onCancel={async () => {\n            if (!isUpdate) {\n              if (selectedTutorial.s3Key) {\n                // deletevideo\n                await Storage.remove(selectedTutorial.s3Key, {\n                  level: 'public',\n                  customPrefix: { public: '' },\n                });\n              }\n              if (selectedTutorial?.thumbnailS3Key) {\n                await Storage.remove(selectedTutorial.thumbnailS3Key, {\n                  level: 'public',\n                  customPrefix: { public: '' },\n                });\n              }\n            }\n            setAddUpdateVideo(false);\n          }}\n          confirmText=\"SAVE\"\n          className=\"w-11/12 overflow-y-auto h-88pr\"\n        />\n      ) : null}\n    </>\n  );\n};\n\nexport default KnowledgeBase;\n","import { titleValidator, descriptionValidator, uploadedVideoValidator, categoryValidator } from './fieldValidation.js';\n\nexport const validateTutorial = (setAlert, title, description, category, s3Key) => {\n  const titleValidation = titleValidator(setAlert, title);\n  const descriptionValidation = descriptionValidator(setAlert, description);\n  const videoValidation = uploadedVideoValidator(setAlert, s3Key);\n  const categoryValidation = categoryValidator(setAlert, category);\n\n  return titleValidation && descriptionValidation && videoValidation && categoryValidation;\n};\n","import React from 'react';\nimport HighchartsReact from 'highcharts-react-official';\nimport Highcharts, { isArray } from 'highcharts';\nimport highchartsMap from 'highcharts/modules/map';\n\nhighchartsMap(Highcharts);\n\nconst LEAD_GRAPH_DEFINITION = {\n  title: 'Submitted & Approved',\n  type: 'line',\n  yAxis: 'Quantity',\n  series: ['Approved', 'Submitted'],\n};\nconst USER_COUNT_GRAPH_DEFINITION = {\n  title: 'User Count',\n  type: 'line',\n  yAxis: ['Total Users', 'New Users'],\n  series: ['Total Users', 'New Users'],\n};\nconst HOURS_GRAPH_DEFINITION = {\n  title: 'Hours In App',\n  type: 'line',\n  yAxis: ['Total Hours', 'User Hours'],\n  series: ['Total Hours', 'User Hours'],\n};\n\nconst createGraph = (data1, data2, { title, type, yAxis, series: seriesNames }, legendOpts) => {\n  const series = [\n    {\n      name: seriesNames[0],\n      yAxis: 0,\n      data: data1,\n    },\n    {\n      name: seriesNames[1],\n      yAxis: isArray(yAxis) ? 1 : 0,\n      data: data2,\n    },\n  ];\n\n  let plotOptions = {};\n\n  if (type === 'area') {\n    plotOptions = {\n      area: {\n        stacking: 'normal',\n        fillOpacity: 0.25,\n      },\n    };\n  }\n\n  const options = {\n    chart: {\n      height: 100,\n      margin: 20,\n      spacing: [0, 10, 15, 10],\n      type,\n    },\n    colors: ['#770303', '#01558B', '#e4d354'],\n    credits: {\n      enabled: false,\n    },\n    legend: {\n      enabled: false,\n    },\n    title: {\n      text: title,\n      align: 'left',\n      widthAdjust: 0,\n      margin: 0,\n      style: {\n        fontSize: '14px',\n        fontWeight: 'bold',\n      },\n    },\n    plotOptions,\n    xAxis: {\n      type: 'datetime',\n      labels: { style: { fontSize: '8px' } },\n      tickLength: 5,\n    },\n    yAxis: isArray(yAxis)\n      ? [\n          {\n            title: { text: yAxis[0], margin: 3, style: { fontSize: '8px' } },\n            labels: { distance: 0, padding: 0, x: 0, style: { fontSize: '8px' } },\n            tickPixelInterval: 30,\n          },\n          {\n            title: { text: yAxis[1], margin: 3, style: { fontSize: '8px' } },\n            labels: { distance: 0, padding: 0, x: 0, style: { fontSize: '8px' } },\n            opposite: true,\n            tickPixelInterval: 30,\n            softMin: 0,\n          },\n        ]\n      : {\n          title: { text: yAxis, margin: 3, style: { fontSize: '8px' } },\n          labels: { distance: 0, padding: 0, x: 0, style: { fontSize: '8px' } },\n          tickPixelInterval: 30,\n          softMin: 0,\n        },\n    series,\n  };\n\n  return (\n    <div className=\"mt-2 mb-2\">\n      <HighchartsReact constructorType=\"mapChart\" highcharts={Highcharts} options={options} />\n      {buildLegend(legendOpts)}\n    </div>\n  );\n};\n\nexport { LEAD_GRAPH_DEFINITION, USER_COUNT_GRAPH_DEFINITION, HOURS_GRAPH_DEFINITION, createGraph };\n\nconst buildLegend = legendInput => (\n  <div className=\"flex justify-center\">\n    {legendInput.map((legend, index) => {\n      const containerClass = index > 0 ? 'flex items-center pt-1 ml-4' : 'flex items-center pt-1';\n\n      return (\n        <div className={containerClass} key={index}>\n          <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <rect width=\"8\" height=\"8\" fill={legend.color} />\n          </svg>{' '}\n          <span className=\"ml-1 text-xs\">{legend.value}</span>\n        </div>\n      );\n    })}\n  </div>\n);\n","import React, { useState, useEffect, useContext } from 'react';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { DateTime } from 'luxon';\nimport { Container, HeaderText, Button, CaseMap, DataGrid, Spinner } from '../../../components';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext';\nimport { getTopLeaderboard, getHistoryStatistics } from '../../../generated/graphql/queries';\nimport {\n  LEAD_GRAPH_DEFINITION,\n  USER_COUNT_GRAPH_DEFINITION,\n  HOURS_GRAPH_DEFINITION,\n  createGraph,\n} from './microstatGraph';\n\nconst microStatsToCrowdCharts = ({ leadsApproved, leadsSubmitted, usersTotal, usersNew, hoursCrowd, hoursUser }) => [\n  createGraph(leadsApproved, leadsSubmitted, LEAD_GRAPH_DEFINITION, [\n    { color: '#01558B', value: 'Submitted' },\n    { color: '#770303', value: 'Approved' },\n  ]),\n  createGraph(usersTotal, usersNew, USER_COUNT_GRAPH_DEFINITION, [\n    { color: '#01558B', value: 'New' },\n    { color: '#770303', value: 'Total' },\n  ]),\n  createGraph(hoursCrowd, hoursUser, HOURS_GRAPH_DEFINITION, [\n    { color: '#01558B', value: 'User' },\n    { color: '#770303', value: 'Crowd' },\n  ]),\n];\n\nconst microStatsToUserCharts = ({ userLeadsApproved, userLeadsSubmitted, hoursUser }) => [\n  createGraph(userLeadsApproved || [], userLeadsSubmitted || [], LEAD_GRAPH_DEFINITION, [\n    { color: '#01558B', value: 'Submitted' },\n    { color: '#770303', value: 'Approved' },\n  ]),\n  createGraph([], hoursUser, HOURS_GRAPH_DEFINITION, [{ color: '#01558B', value: 'User' }]),\n];\n\nconst DEFAULT_MICRO_STATISTICS = {\n  leadsApproved: [],\n  leadsSubmitted: [],\n  userLeadsApproved: [],\n  userLeadsSubmitted: [],\n  usersTotal: [],\n  usersNew: [],\n  hoursCrowd: [],\n  hoursUser: [],\n};\n\nconst DEFAULT_MICRO_CHARTS = {\n  crowd: microStatsToCrowdCharts(DEFAULT_MICRO_STATISTICS),\n  user: microStatsToUserCharts(DEFAULT_MICRO_STATISTICS),\n};\n\nconst Leaderboard = () => {\n  const [, setAlert] = useContext(NotificationContext);\n  const [board, setBoard] = useState('allTime');\n  const [leaderboardLoading, setLeaderboardLoading] = useState(false);\n  const [nextLeaderboardToken, setNextLeaderboardToken] = useState();\n  const [leaderboard, setLeaderboard] = useState([]);\n  const [userCrowdToggle, setUserCrowdToggle] = useState('crowd');\n  const [globalStatistics, setGlobalStatistics] = useState({\n    totalLeadsSubmitted: 0,\n    totalLeadsApproved: 0,\n  });\n  const [userStatistics, setUserStatistics] = useState({\n    userLeadsSubmitted: 0,\n    userLeadsApproved: 0,\n  });\n  const [globalStatisticsLoading, setGlobalStatisticsLoading] = useState(false);\n  const [userStatisticsLoading, setUserStatisticsLoading] = useState(false);\n  const [microCharts, setMicroCharts] = useState(DEFAULT_MICRO_CHARTS);\n  const [caseMap, setCaseMap] = useState(<CaseMap board={board} />);\n\n  useEffect(() => {\n    fetchLeaderboard();\n    setCaseMap(<CaseMap board={board} userCrowdToggle={userCrowdToggle} />);\n    fetchHistoryStatistics(board);\n  }, [board, userCrowdToggle]);\n\n  const fetchHistoryStatistics = async boardName => {\n    setUserStatisticsLoading(true);\n    setGlobalStatisticsLoading(true);\n    try {\n      const response = await API.graphql(graphqlOperation(getHistoryStatistics, { board: boardName }));\n      const {\n        leadsApproved,\n        leadsSubmitted,\n        userLeadsApproved,\n        userLeadsSubmitted,\n        usersTotal,\n        usersNew,\n        hoursCrowd,\n        hoursUser,\n      } = response.data.getHistoryStatistics;\n\n      const toHighchartsData = ({ time, value }) => [DateTime.fromISO(time).toMillis(), value];\n      const sumLeads = (prev, curr) => prev + curr.value;\n\n      const microStatistics = {\n        leadsApproved: leadsApproved.map(toHighchartsData),\n        leadsSubmitted: leadsSubmitted.map(toHighchartsData),\n        userLeadsApproved: userLeadsApproved.map(toHighchartsData),\n        userLeadsSubmitted: userLeadsSubmitted.map(toHighchartsData),\n        usersTotal: usersTotal.map(toHighchartsData),\n        usersNew: usersNew.map(toHighchartsData),\n        hoursCrowd: hoursCrowd.map(toHighchartsData),\n        hoursUser: hoursUser.map(toHighchartsData),\n      };\n\n      setUserStatistics({\n        userLeadsSubmitted: userLeadsSubmitted.reduce(sumLeads, 0),\n        userLeadsApproved: userLeadsApproved.reduce(sumLeads, 0),\n      });\n\n      setGlobalStatistics({\n        totalLeadsSubmitted: leadsSubmitted.reduce(sumLeads, 0),\n        totalLeadsApproved: leadsApproved.reduce(sumLeads, 0),\n      });\n      setMicroCharts({\n        crowd: microStatsToCrowdCharts(microStatistics),\n        user: microStatsToUserCharts(microStatistics),\n      });\n    } catch (error) {\n      console.error('Error Loading history statistics: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error loading history statistics',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n    setUserStatisticsLoading(false);\n    setGlobalStatisticsLoading(false);\n  };\n\n  const fetchLeaderboard = async () => {\n    setLeaderboardLoading(true);\n\n    try {\n      const nextTokenToUse = nextLeaderboardToken;\n\n      const oldLeaderboard = nextTokenToUse ? [...leaderboard] : [];\n      // UPDATE BOARD to be in correct case formate\n      const params = {\n        board,\n        nextToken: nextTokenToUse,\n        limit: 100,\n      };\n\n      const response = await API.graphql(graphqlOperation(getTopLeaderboard, params));\n\n      let result = response.data.getTopLeaderboard.rankings || [];\n\n      setNextLeaderboardToken(result.nextToken);\n      result = result.map(item => ({\n        ...item,\n        percentSuccess: parseInt((item.leadsApproved / item.leadsSubmitted) * 100),\n      }));\n      setLeaderboard([...oldLeaderboard, ...result]);\n    } catch (error) {\n      console.error('Error Loading leaderboard: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error loading leaderboard',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setLeaderboardLoading(false);\n  };\n\n  const renderToggles = (currentValue, setter, options) =>\n    options.map(({ value, label }) =>\n      value === currentValue ? (\n        <Button height=\"h-8\" solidBlue padding=\"ml-1 px-2\" onClick={() => setter(value)}>\n          {label}\n        </Button>\n      ) : (\n        <Button height=\"h-8\" linedBlue padding=\"ml-1 px-2\" onClick={() => setter(value)}>\n          {label}\n        </Button>\n      )\n    );\n  const userCrowdToggleOptions = [\n    { value: 'user', label: 'USER' },\n    { value: 'crowd', label: 'CROWD' },\n  ];\n  const boardOptions = [\n    { value: 'oneMonth', label: '1M' },\n    { value: 'sixMonths', label: '6M' },\n    { value: 'oneYear', label: '1Y' },\n    { value: 'yearToDate', label: 'YTD' },\n    { value: 'allTime', label: 'ALL' },\n  ];\n\n  const renderStatisticsContent = () => {\n    if (userCrowdToggle === 'user') {\n      return userStatisticsLoading ? (\n        <div className=\"flex justify-center\">\n          <Spinner className=\"w-16 h-16 text-pursuit-red\" />{' '}\n        </div>\n      ) : (\n        <div>\n          <p className=\"mb-2 font-bold text-md\">User Leads Submitted: {userStatistics.userLeadsSubmitted}</p>\n          <p className=\"mt-2 mb-2 font-bold text-md\">User Leads Approved: {userStatistics.userLeadsApproved}</p>\n        </div>\n      );\n    }\n\n    return globalStatisticsLoading ? (\n      <div className=\"flex justify-center\">\n        <Spinner className=\"w-16 h-16 text-pursuit-red\" />{' '}\n      </div>\n    ) : (\n      <div>\n        <p className=\"mb-2 font-bold text-md\">Total Leads Submitted: {globalStatistics.totalLeadsSubmitted}</p>\n        <p className=\"mt-2 mb-2 font-bold text-md\">Total Leads Approved: {globalStatistics.totalLeadsApproved}</p>\n      </div>\n    );\n  };\n\n  return (\n    <Container width=\"lg:w-2/3\" margin=\"m-3 lg:m-auto lg:mt-6\" className=\"relative px-5 py-6 lg:px-8 lg:py-10\">\n      <HeaderText fontSize=\"text-4xl\" className=\"text-center\">\n        PURSUIT® Community\n      </HeaderText>\n      <HeaderText noBold fontSize=\"text-2xl italic\" className=\"text-center\">\n        Harnessing the power of many to find the vulnerable\n      </HeaderText>\n\n      <div className=\"flex flex-wrap justify-between px-8 mt-8\">\n        <div className=\"flex justify-start mt-1\">\n          {renderToggles(userCrowdToggle, setUserCrowdToggle, userCrowdToggleOptions)}\n        </div>\n        <div className=\"flex justify-end mt-1\">{renderToggles(board, setBoard, boardOptions)}</div>\n      </div>\n\n      <div className=\"flex flex-col px-8 py-4 mt-8\">\n        <div className=\"flex grid grid-cols-3 gap-10\">\n          <div className=\"w-full col-span-3 lg:col-span-1\">\n            <div className=\"flex grid grid-cols-2\">\n              <div className=\"col-span-2 sm:col-span-1 lg:col-span-2\">\n                <HeaderText>{userCrowdToggle === 'user' ? 'User' : 'Global'} Statistics</HeaderText>\n                {renderStatisticsContent()}\n              </div>\n              {microCharts[userCrowdToggle].map(chart => (\n                <div className=\"col-span-2 sm:col-span-1 lg:col-span-2\">{chart}</div>\n              ))}\n            </div>\n          </div>\n          <div className=\"w-full col-span-3 lg:col-span-2\">\n            {leaderboardLoading ? (\n              <div className=\"flex justify-center\">\n                <Spinner className=\"w-24 h-24 text-pursuit-red\" />{' '}\n              </div>\n            ) : (\n              caseMap\n            )}\n          </div>\n        </div>\n        <div className=\"mt-16\">\n          <HeaderText>Leaderboard</HeaderText>\n          <DataGrid\n            columns={[\n              { title: 'Rank', fieldName: 'rank' },\n              { title: 'Alias', fieldName: 'alias' },\n              { title: 'Leads Approved', fieldName: 'leadsApproved' },\n              { title: 'Leads Submitted', fieldName: 'leadsSubmitted' },\n              { title: '% Success', fieldName: 'percentSuccess' },\n              { title: 'Total Points', fieldName: 'totalPoints' },\n              // { title: 'Hours Spent', fieldName: 'hoursSpent' },\n            ]}\n            loading={leaderboardLoading}\n            data={leaderboard}\n            noRecordsText=\"Nobody in leaderboard\"\n            loadNextPage={() => fetchLeaderboard()}\n            hasMore={!!nextLeaderboardToken}\n            containerHeight=\"h-88\"\n            gridKey=\"leaderboard\"\n          />\n        </div>\n      </div>\n    </Container>\n  );\n};\n\nexport default Leaderboard;\n","import React, { useState, useContext } from 'react';\nimport { Auth } from 'aws-amplify';\nimport { useHistory } from 'react-router-dom';\nimport HeaderText from '../../../components/HeaderText';\nimport Button from '../../../components/Button';\nimport TextField from '../../../components/TextField';\nimport Container from '../../../components/Container';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\nimport { useUser } from '../../../contexts/userContext';\nimport { toast } from 'react-toastify';\n\nconst ConfirmAccount = ({ authData }) => {\n  const [code, setCode] = useState('');\n  const [loading, setLoading] = useState(false);\n  const [resending, setResending] = useState(false);\n  const { user, setUser, loadUser, setIsLoading } = useUser();\n  const history = useHistory();\n\n  const [, setAlert] = useContext(NotificationContext);\n\n  const signIn = async () => {\n    try {\n      setIsLoading(true);\n      const cognitoUser = await Auth.signIn({\n        username: authData.email,\n        password: authData.password,\n      });\n\n      setUser({ ...user, cognitoUser });\n\n      await loadUser();\n\n      history.push('/');\n    } catch (error) {\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: error.message,\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n  };\n\n  const confirmSignUp = async () => {\n    try {\n      setLoading(true);\n\n      // console.error('Skipping confirmation code for now.')\n      await Auth.confirmSignUp(authData.email, code);\n\n      setCode('');\n      console.log({ authData });\n      if (authData.password !== '') {\n        signIn();\n      } else {\n        // history.push('/login#verify-account', { origin: 'verifyAccount', email: authData.email });\n        toast.success(`Account verified`, {\n          progress: false,\n          className: 'bg-green-500 text-white',\n          autoClose: 1500,\n          closeButton: false,\n        });\n        history.push('/forgot-password', { origin: 'verifyAccount', email: authData.email });\n        // window.location.reload()\n      }\n    } catch (error) {\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: error.message,\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n\n      setLoading(false);\n    }\n  };\n\n  const resendCode = async () => {\n    try {\n      setResending(true);\n\n      // This won't work of account is confirmed but email is not verified\n      await Auth.resendSignUp(authData.email);\n\n      // Auth.verifyCurrentUserAttribute('email')\n\n      setResending(false);\n    } catch (error) {\n      setResending(false);\n      console.error('Error resending code: ', error);\n      if (error.message === 'User is already confirmed.') {\n        const response = await Auth.verifyCurrentUserAttribute('email');\n        console.log({ response });\n      } else {\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: error.message,\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n      }\n    }\n  };\n\n  return (\n    <Container\n      grayedBackground\n      height=\"lg:h-168\"\n      width=\"lg:w-160\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 md:mx-12 lg:mx-auto\">\n      <center>\n        <HeaderText noBold className=\"text-3xl lg:text-4xl\">\n          Confirm Sign Up\n        </HeaderText>\n      </center>\n      <TextField\n        type=\"code\"\n        value={code}\n        onChange={e => setCode(e.target.value)}\n        placeHolder=\"Code\"\n        label=\"Confirmation Code\"\n      />\n      <Button solidBlue onClick={confirmSignUp} className=\"mt-4\" loading={loading}>\n        {loading ? 'SUBMITTING' : 'SUBMIT'}\n      </Button>\n      <div className=\"flex justify-end mt-4\">\n        <Button anchorTag onClick={resendCode} loading={resending}>\n          {resending ? 'Resending Code' : 'Resend Code'}\n        </Button>\n      </div>\n    </Container>\n  );\n};\n\nexport default ConfirmAccount;\n","import React, { useEffect, useContext } from 'react';\nimport ReactGA from 'react-ga4';\nimport { useHistory } from 'react-router-dom';\nimport { validatePageOne } from '../../../helpers/createAccount/createAccountValidation.js';\nimport HeaderText from '../../../components/HeaderText';\nimport Button from '../../../components/Button';\nimport TextField from '../../../components/TextField';\nimport Container from '../../../components/Container';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\n\nconst PageOne = ({\n  firstName,\n  setFirstName,\n  lastName,\n  setLastName,\n  email,\n  setEmail,\n  password,\n  setPassword,\n  confirmPassword,\n  setConfirmPassword,\n  pageChange,\n}) => {\n  const [, setAlert] = useContext(NotificationContext);\n  const history = useHistory();\n\n  useEffect(() => {\n    ReactGA.send({ hitType: 'pageview', page: '/create-account_step1' });\n  }, []);\n\n  return (\n    <Container\n      grayedBackground\n      height=\"lg:h-168\"\n      width=\"lg:w-160\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 mt-3 md:mx-12 lg:m-auto\"\n    >\n      <center>\n        <HeaderText noBold className=\"text-3xl lg:text-4xl\">\n          Create an Account\n        </HeaderText>\n      </center>\n      <div>\n        <TextField\n          value={firstName}\n          onChange={e => setFirstName(e.target.value)}\n          placeHolder=\"First Name\"\n          label=\"First Name\"\n          className=\"mb-4\"\n          required\n        />\n\n        <TextField\n          value={lastName}\n          onChange={e => setLastName(e.target.value)}\n          placeHolder=\"Last Name\"\n          label=\"Last Name\"\n          className=\"mb-4\"\n          required\n        />\n\n        <TextField\n          type=\"email\"\n          value={email}\n          onChange={e => setEmail(e.target.value)}\n          placeHolder=\"Email\"\n          label=\"Email\"\n          className=\"mb-4\"\n          required\n        />\n\n        <TextField\n          type=\"password\"\n          value={password}\n          onChange={e => setPassword(e.target.value)}\n          placeHolder=\"Password\"\n          label=\"Password\"\n          className=\"mb-4\"\n          info=\"Your password must be 8 characters long, have at least one number, one upper case letter, one lower case letter, and one special character\"\n          infoTitle=\"Password Requirements\"\n          required\n        />\n\n        <TextField\n          type=\"password\"\n          value={confirmPassword}\n          onChange={e => setConfirmPassword(e.target.value)}\n          placeHolder=\"Password\"\n          label=\"Confirm Password\"\n          className=\"mb-8\"\n          required\n        />\n\n        <div className=\"flex justify-between\">\n          <Button\n            linedBlue\n            noPadding\n            className=\"w-32\"\n            onClick={() => {\n              history.push('login');\n            }}\n          >\n            CANCEL\n          </Button>\n          <Button\n            solidBlue\n            noPadding\n            className=\"w-32\"\n            onClick={() => {\n              if (validatePageOne(setAlert, firstName, lastName, email, password, confirmPassword)) {\n                pageChange('page-two');\n              }\n            }}\n          >\n            NEXT\n          </Button>\n        </div>\n        <p className=\"flex items-center justify-center mt-4 lg:justify-end primary-blue-text\">\n          Already have an account?&nbsp;\n          <Button\n            anchorTag\n            onClick={() => {\n              history.push('login');\n            }}\n          >\n            Click Here\n          </Button>\n        </p>\n      </div>\n    </Container>\n  );\n};\n\nexport default PageOne;\n","import {\n  nameValidator,\n  firstNameValidator,\n  lastNameValidator,\n  emailValidator,\n  passwordValidator,\n  dateOfBirthValidator,\n  locationValidator,\n  confirmPasswordValidator,\n  countryValidator,\n  heardAboutValidator,\n  zipValidator,\n} from './fieldValidation.js';\n\nexport const validatePageOne = (setAlert, firstName, lastName, email, password, confirmPassword) => {\n  const firstNameValidation = nameValidator(setAlert, firstName);\n  const lastNameValidation = nameValidator(setAlert, lastName);\n  const emailValidation = emailValidator(setAlert, email);\n  const passwordValidation = passwordValidator(setAlert, password);\n  const confirmPasswordValidation = confirmPasswordValidator(setAlert, confirmPassword, password);\n\n  return (\n    firstNameValidation && lastNameValidation && emailValidation && passwordValidation && confirmPasswordValidation\n  );\n};\n\nexport const validatePageTwo = (setAlert, dateOfBirth, location, agreeToTerms, country, heardAbout, zip) => {\n  if (!agreeToTerms) {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: true,\n        message: 'Please read and accept the terms and conditions',\n        textColor: 'redText',\n        borderColor: 'redBorder',\n      },\n    });\n\n    return false;\n  }\n\n  const countryValidation = countryValidator(setAlert, country);\n\n  let dateOfBirthValidation = false;\n  let locationValidation = false;\n  let zipValidation = false;\n  let heardAboutValidation = false;\n\n  if (countryValidation) {\n    locationValidation = locationValidator(setAlert, location, country);\n  }\n\n  if (locationValidation) {\n    zipValidation = zipValidator(setAlert, zip, country);\n  }\n\n  if (zipValidation) {\n    dateOfBirthValidation = dateOfBirthValidator(setAlert, dateOfBirth);\n  }\n\n  if (dateOfBirthValidation) {\n    heardAboutValidation = heardAboutValidator(setAlert, heardAbout);\n  }\n\n  return dateOfBirthValidation && locationValidation && countryValidation && heardAboutValidation && zipValidation;\n};\n\nexport const validateAdminCreateUser = (setAlert, { email, firstName, lastName, dateOfBirth, country, state, zip }) => {\n  const emailValidation = emailValidator(setAlert, email);\n\n  let firstNameValidation = false;\n  let lastNameValidation = false;\n  let dateOfBirthValidation = false;\n  let countryValidation = false;\n  let stateValidation = false;\n  let zipValidation = false;\n\n  if (emailValidation) {\n    firstNameValidation = firstNameValidator(setAlert, firstName);\n  }\n\n  if (firstNameValidation) {\n    lastNameValidation = lastNameValidator(setAlert, lastName);\n  }\n\n  if (lastNameValidation) {\n    dateOfBirthValidation = dateOfBirthValidator(setAlert, dateOfBirth, true);\n  }\n\n  if (dateOfBirthValidation) {\n    countryValidation = countryValidator(setAlert, country);\n  }\n\n  if (countryValidation) {\n    stateValidation = locationValidator(setAlert, state, country);\n  }\n\n  if (stateValidation) {\n    zipValidation = zipValidator(setAlert, zip, country);\n  }\n\n  return (\n    firstNameValidation &&\n    lastNameValidation &&\n    dateOfBirthValidation &&\n    stateValidation &&\n    countryValidation &&\n    zipValidation\n  );\n};\n\nexport const validateAdminCreateLEOUser = (setAlert, { email, firstName, lastName, state }) => {\n  const emailValidation = emailValidator(setAlert, email);\n\n  return emailValidation;\n  // let firstNameValidation = false;\n  // let lastNameValidation = false;\n  // let dateOfBirthValidation = false;\n  // let countryValidation = false;\n  // let stateValidation = false;\n  // let zipValidation = false;\n\n  // if (emailValidation) {\n  //   firstNameValidation = firstNameValidator(setAlert, firstName);\n  // }\n\n  // if (firstNameValidation) {\n  //   lastNameValidation = lastNameValidator(setAlert, lastName);\n  // }\n\n  // if (lastNameValidation) {\n  //   dateOfBirthValidation = dateOfBirthValidator(setAlert, dateOfBirth, true);\n  // }\n\n  // if (countryValidation) {\n  //   stateValidation = locationValidator(setAlert, state, country);\n  // }\n\n\n  // return (\n  //   firstNameValidation &&\n  //   lastNameValidation &&\n  //   dateOfBirthValidation &&\n  //   stateValidation &&\n  //   countryValidation &&\n  //   zipValidation\n  // );\n};\n","import React, { useEffect, useContext } from 'react';\nimport ReactGA from 'react-ga4';\nimport * as Icons from 'react-icons/fa';\nimport DatePicker from 'react-datepicker';\nimport { useHistory } from 'react-router-dom';\nimport { validatePageTwo } from '../../../helpers/createAccount/createAccountValidation.js';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\n\nimport {\n  AliasGenerator,\n  HeaderText,\n  Button,\n  TextField,\n  Container,\n  DropDown,\n  CountryStateZipPicker,\n} from '../../../components';\n\nconst PageTwo = ({\n  alias,\n  setAlias,\n  dateOfBirth,\n  setDateOfBirth,\n  location,\n  setLocation,\n  zip,\n  setZip,\n  agreeToTerms,\n  setAgreeToTerms,\n  pageChange,\n  signUp,\n  country,\n  setCountry,\n  heardAbout,\n  setHeardAbout,\n}) => {\n  const [, setAlert] = useContext(NotificationContext);\n  const history = useHistory();\n\n  useEffect(() => {\n    ReactGA.send({ hitType: 'pageview', page: '/create-account_step2' });\n  }, []);\n\n  const heardAboutOptions = [\n    { value: 'Guardian Group member', label: 'Guardian Group member' },\n    { value: 'Friend | Coworker', label: 'Friend | Coworker' },\n    { value: 'Guardian Group website', label: 'Guardian Group website' },\n    { value: 'Social Media', label: 'Social Media' },\n    { value: 'Conference', label: 'Conference' },\n    {\n      value: 'Online search of Open Source Intelligence (OSINT)',\n      label: 'Online search of Open Source Intelligence (OSINT)',\n    },\n    {\n      value: 'Online search of counter sex trafficking',\n      label: 'Online search of counter sex trafficking',\n    },\n    { value: 'Other', label: 'Other' },\n  ];\n\n  return (\n    <Container\n      grayedBackground\n      height=\"lg:min-h-168\"\n      width=\"lg:w-160\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 mt-3 md:mx-12 lg:mx-auto\"\n    >\n      <center>\n        <HeaderText noBold className=\"text-3xl lg:text-4xl\">\n          Create an Account\n        </HeaderText>\n      </center>\n      <div className=\"mt-4\">\n        {/* Move alias generation till after cert upload */}\n        {/* <AliasGenerator alias={alias} setAlias={setAlias} /> */}\n\n        <label className=\"mr-1 font-light light-primary-blue-text\">\n          <span>\n            Date of Birth<span className=\"ml-1 text-pursuit-red\">*</span>\n          </span>\n          <div className=\"flex items-center mt-1\">\n            <DatePicker\n              selected={dateOfBirth}\n              onChange={date => setDateOfBirth(date)}\n              maxDate={new Date()}\n              className=\"w-full h-10 px-2 textfield-bg-color\"\n              shouldCloseOnSelect\n            />\n            <Icons.FaCalendarDay size={30} className=\"ml-4 cursor-pointer\" />\n          </div>\n        </label>\n\n        <CountryStateZipPicker\n          country={country}\n          state={location}\n          zip={zip}\n          setCountry={setCountry}\n          setState={setLocation}\n          setZip={setZip}\n        />\n\n        <DropDown\n          value={heardAboutOptions.find(x => x.value === heardAbout)}\n          label=\"How Did You Hear About Us?\"\n          onChange={option => setHeardAbout(option.value)}\n          options={heardAboutOptions}\n          className=\"mb-4\"\n          containerClassName=\"mb-4\"\n          required\n        />\n\n        <div className=\"flex items-center justify-start mb-4\">\n          <TextField\n            noRounded\n            noFullFieldWidth\n            fieldWidth=\"w-5\"\n            fieldHeight=\"h-5\"\n            width=\"w-5\"\n            type=\"checkbox\"\n            checked={agreeToTerms}\n            onChange={e => {\n              setAgreeToTerms(e.target.checked);\n            }}\n            className=\"mr-4 lg:mr-1\"\n          />\n          <p className=\"mx-2 my-2 lg:my-0 primary-blue-text\">\n            I agree to the&nbsp;\n            <Button\n              anchorTag\n              onClick={() => {\n                pageChange('terms-of-use');\n              }}\n              className=\"h-auto\"\n              inline\n            >\n              Terms of Use\n            </Button>\n            &nbsp;&&nbsp;\n            <Button\n              anchorTag\n              onClick={() => {\n                pageChange('privacy-policy');\n              }}\n              className=\"h-auto\"\n              inline\n            >\n              Privacy Policy\n            </Button>\n          </p>\n        </div>\n        <div className=\"flex justify-between mt-4\">\n          <Button\n            linedBlue\n            className=\"w-32\"\n            onClick={() => {\n              history.push('/');\n            }}\n          >\n            CANCEL\n          </Button>\n          <Button\n            solidBlue\n            className=\"w-32\"\n            onClick={() => {\n              if (validatePageTwo(setAlert, dateOfBirth, location, agreeToTerms, country, heardAbout, zip)) {\n                signUp();\n              }\n            }}\n          >\n            SUBMIT\n          </Button>\n        </div>\n      </div>\n    </Container>\n  );\n};\n\nexport default PageTwo;\n","import React, { useEffect } from 'react';\nimport ReactGA from 'react-ga4';\nimport { HeaderText, Button, Container } from '../../../components';\nimport TermsOfUse from '../../public/TermsOfUse/termsOfUse';\n\nconst TermsModal = ({ pageChange }) => {\n  useEffect(() => {\n    ReactGA.send({ hitType: 'pageview', page: '/create-account_tos' });\n  }, []);\n\n  return (\n    <Container\n      grayedBackground\n      height=\"lg:h-168\"\n      width=\"lg:w-160\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 md:mx-12 lg:mx-auto\"\n    >\n      <center>\n        <HeaderText noBold className=\"text-3xl lg:text-4xl\">\n          Terms of Use\n        </HeaderText>\n      </center>\n      <br />\n      <div className=\"overflow-y-auto\">\n        <TermsOfUse />\n      </div>\n      <br />\n      <center>\n        <Button\n          solidBlue\n          className=\"mb-2 btton-signup\"\n          onClick={() => {\n            pageChange('page-two');\n          }}\n        >\n          Go Back\n        </Button>\n      </center>\n    </Container>\n  );\n};\n\nexport default TermsModal;\n","import React, { useEffect } from 'react';\nimport ReactGA from 'react-ga4';\nimport { HeaderText, Button, Container } from '../../../components';\nimport PrivacyPolicy from '../../public/Privacy/privacyPolicy';\n\nconst PrivacyModal = ({ pageChange }) => {\n  useEffect(() => {\n    ReactGA.send({ hitType: 'pageview', page: '/create-account_privacy' });\n  }, []);\n\n  return (\n    <Container\n      grayedBackground\n      height=\"lg:h-168\"\n      width=\"lg:w-160\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 md:mx-12 lg:mx-auto\"\n    >\n      <center>\n        <HeaderText noBold className=\"text-3xl lg:text-4xl\">\n          Privacy Policy\n        </HeaderText>\n      </center>\n      <br />\n      <div className=\"overflow-y-auto\">\n        <PrivacyPolicy />\n      </div>\n      <br />\n      <br />\n      <center>\n        <Button\n          solidBlue\n          className=\"mb-2 btton-signup\"\n          onClick={() => {\n            pageChange('page-two');\n          }}\n        >\n          Go Back\n        </Button>\n      </center>\n    </Container>\n  );\n};\n\nexport default PrivacyModal;\n","import React, { useState, useContext } from 'react';\nimport { Auth } from 'aws-amplify';\nimport { DateTime } from 'luxon';\nimport { useHistory } from 'react-router-dom';\nimport PageOne from './PageOne.js';\nimport PageTwo from './PageTwo.js';\nimport TermsModal from './TermsModal.js';\nimport PrivacyModal from './PrivacyModal';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\n\nconst CreateAccount = ({ initialPage }) => {\n  const [firstName, setFirstName] = useState('');\n  const [lastName, setLastName] = useState('');\n  const [email, setEmail] = useState('');\n  const [password, setPassword] = useState('');\n  const [confirmPassword, setConfirmPassword] = useState('');\n  const [alias, setAlias] = useState('');\n  const [dateOfBirth, setDateOfBirth] = useState();\n  const [location, setLocation] = useState('');\n  const [country, setCountry] = useState('');\n  const [zip, setZip] = useState('');\n  const [agreeToTerms, setAgreeToTerms] = useState(false);\n  const [heardAbout, setHeardAbout] = useState('');\n  const [pageState, setPageState] = useState(initialPage || 'page-one');\n\n  const [, setAlert] = useContext(NotificationContext);\n  const history = useHistory();\n\n  const signUp = async () => {\n    try {\n      await Auth.signUp({\n        username: email.toLowerCase(),\n        password,\n        attributes: {\n          email: email.toLowerCase(),\n          nickname: alias,\n          given_name: firstName,\n          family_name: lastName,\n          birthdate: dateOfBirth ? DateTime.fromJSDate(dateOfBirth).toFormat('MM/dd/yyyy') : '',\n          'custom:country': country,\n          'custom:state': (country === 'United States' && location) || '',\n          'custom:zip': (country === 'United States' && zip) || '',\n          'custom:heard_about_us': heardAbout,\n        },\n      });\n\n      setFirstName('');\n      setLastName('');\n      setConfirmPassword('');\n      setDateOfBirth(null);\n      setLocation('');\n\n      history.push('login', { origin: 'createAccount', password, email });\n    } catch (error) {\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: error.message,\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n  };\n\n  switch (pageState) {\n    case 'page-one':\n      return (\n        <PageOne\n          firstName={firstName}\n          setFirstName={setFirstName}\n          lastName={lastName}\n          setLastName={setLastName}\n          email={email}\n          setEmail={setEmail}\n          password={password}\n          setPassword={setPassword}\n          confirmPassword={confirmPassword}\n          setConfirmPassword={setConfirmPassword}\n          pageChange={setPageState}\n        />\n      );\n    case 'page-two':\n      return (\n        <PageTwo\n          setFirstName={setFirstName}\n          setLastName={setLastName}\n          setEmail={setEmail}\n          setPassword={setPassword}\n          setConfirmPassword={setConfirmPassword}\n          alias={alias}\n          setAlias={setAlias}\n          dateOfBirth={dateOfBirth}\n          setDateOfBirth={setDateOfBirth}\n          country={country}\n          setCountry={setCountry}\n          location={location}\n          setLocation={setLocation}\n          zip={zip}\n          setZip={setZip}\n          agreeToTerms={agreeToTerms}\n          setAgreeToTerms={setAgreeToTerms}\n          pageChange={setPageState}\n          heardAbout={heardAbout}\n          setHeardAbout={setHeardAbout}\n          signUp={signUp}\n        />\n      );\n    case 'terms-of-use':\n      return <TermsModal pageChange={setPageState} />;\n    case 'privacy-policy':\n      return <PrivacyModal pageChange={setPageState} />;\n    default:\n      return (\n        <PageOne\n          firstName={firstName}\n          setFirstName={setFirstName}\n          lastName={lastName}\n          setLastName={setLastName}\n          email={email}\n          setEmail={setEmail}\n          password={password}\n          setPassword={setPassword}\n          confirmPassword={confirmPassword}\n          setConfirmPassword={setConfirmPassword}\n          pageChange={setPageState}\n        />\n      );\n  }\n};\n\nexport default CreateAccount;\n","import React, { useState, useEffect, useContext } from 'react';\nimport ReactGA from 'react-ga4';\nimport { Auth } from 'aws-amplify';\nimport { useHistory } from 'react-router-dom';\nimport HeaderText from '../../../components/HeaderText';\nimport Button from '../../../components/Button';\nimport TextField from '../../../components/TextField';\nimport Container from '../../../components/Container';\nimport { passwordValidator, confirmPasswordValidator } from '../../../helpers/createAccount/fieldValidation.js';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\n\nconst ForgotPassword = () => {\n  const [email, setEmail] = useState('');\n  const [code, setCode] = useState('');\n  const [newPassword, setNewPassword] = useState('');\n  const [confirmPassword, setConfirmPassword] = useState('');\n  const [renderedCode, setRenderedCode] = useState(false);\n  const [, setAlert] = useContext(NotificationContext);\n  const history = useHistory();\n\n  useEffect(() => {\n    ReactGA.send({ hitType: 'pageview', page: '/forgot-password' });\n  }, []);\n\n  const sendCode = async () => {\n    if (!email) {\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Please enter an email',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    } else {\n      try {\n        await Auth.forgotPassword(email);\n\n        setRenderedCode(true);\n      } catch (error) {\n        let errorMessage = '';\n\n        console.error('Error sending code: ', error);\n\n        let redirect = null;\n\n        if (error.message === 'User password cannot be reset in the current state.') {\n          errorMessage = 'Please attempt to login with password provided in the invitation email';\n        } else if (error.message === 'Attempt limit exceeded, please try after some time.') {\n          errorMessage = 'Too many attempts, please wait a few minutes before trying again';\n        } else if (\n          error.message ===\n          'Cannot reset password for the user as there is no registered/verified email or phone_number'\n        ) {\n          // User has not verified their email and needs to be sent a new verification code.\n          // Update the message to let user know and send them a new verification code.\n\n          errorMessage = 'Please verify your email before resetting your password';\n          try {\n            await Auth.resendSignUp(email);\n            redirect = 'login';\n          } catch (error) {\n            if (error.message === 'User is already confirmed.') {\n              errorMessage = 'Please confirm your email before resetting your password';\n              const verifyResponse = await Auth.verifyCurrentUserAttribute('email');\n              console.log({ verifyResponse });\n              redirect = 'login';\n            }\n            console.error('Error resending signup: ', error);\n            // return;\n          }\n          // history.push('login', { origin: 'createAccount', password, email });\n        } else {\n          errorMessage = 'Please contact an admin for support to have your password reset';\n        }\n\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: errorMessage,\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n        if (redirect) {\n          history.push(redirect, { origin: 'createAccount', email });\n        }\n      }\n    }\n  };\n\n  const resetPassword = async () => {\n    if (passwordValidator(setAlert, newPassword) && confirmPasswordValidator(setAlert, confirmPassword, newPassword)) {\n      try {\n        await Auth.forgotPasswordSubmit(email, code, newPassword);\n\n        setRenderedCode(false);\n        setEmail('');\n\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: 'Your password was successfully changed!',\n            textColor: 'greenText',\n            borderColor: 'greenBorder',\n          },\n        });\n\n        history.push('/login');\n      } catch (error) {\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: error.message,\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n      }\n    }\n  };\n\n  const renderCode = () => {\n    if (renderedCode) {\n      return (\n        <>\n          <TextField\n            type=\"code\"\n            onChange={e => setCode(e.target.value)}\n            placeHolder=\"Code\"\n            label=\"Confirmation Code\"\n            className=\"mb-4\"\n          />\n\n          <TextField\n            type=\"password\"\n            onChange={e => setNewPassword(e.target.value)}\n            placeHolder=\"New Password\"\n            label=\"New Password\"\n            className=\"mb-4\"\n          />\n\n          <TextField\n            type=\"password\"\n            onChange={e => setConfirmPassword(e.target.value)}\n            placeHolder=\"Confirm New Password\"\n            label=\"Confirm New Password\"\n            className=\"mb-4\"\n          />\n\n          <Button solidBlue className=\"mt-4\" onClick={resetPassword}>\n            SUBMIT\n          </Button>\n\n          <div className=\"flex justify-end mt-4\">\n            <Button anchorTag onCLick={sendCode}>\n              Resend Code\n            </Button>\n          </div>\n        </>\n      );\n    }\n  };\n\n  const renderEmail = () => {\n    if (!renderedCode) {\n      return (\n        <>\n          <TextField type=\"Email\" placeHolder=\"Email\" label=\"Email\" onChange={e => setEmail(e.target.value)} />\n          <Button solidBlue className=\"mt-4\" onClick={sendCode}>\n            SEND CODE\n          </Button>\n          <div className=\"flex justify-between mt-4\">\n            <Button\n              anchorTag\n              onClick={() => {\n                history.push('create-account');\n              }}>\n              Create Account\n            </Button>\n            <Button\n              anchorTag\n              onClick={() => {\n                history.push('login');\n              }}>\n              Return to Log In\n            </Button>\n          </div>\n        </>\n      );\n    }\n  };\n\n  return (\n    <Container\n      grayedBackground\n      height=\"lg:h-168\"\n      width=\"lg:w-160\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 mt-3 md:mx-12 lg:mx-auto\">\n      <center>\n        <HeaderText noBold className=\"text-3xl lg:text-4xl\">\n          Forgot Password\n        </HeaderText>\n      </center>\n      {renderCode()}\n      {renderEmail()}\n    </Container>\n  );\n};\n\nexport default ForgotPassword;\n","import React, { useState, useContext } from 'react';\nimport { Auth } from 'aws-amplify';\nimport { useHistory } from 'react-router-dom';\nimport { Container, TextField, Button, HeaderText } from '../../../components';\nimport { passwordValidator, confirmPasswordValidator } from '../../../helpers/createAccount/fieldValidation.js';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\nimport { useUser } from '../../../contexts/userContext';\n\nconst RequireNewPassword = ({ authUser }) => {\n  const history = useHistory();\n  const { loadUser } = useUser();\n  const [newPassword, setNewPassword] = useState('');\n  const [confirmPassword, setConfirmPassword] = useState('');\n  const [, setAlert] = useContext(NotificationContext);\n\n  const resetPassword = async () => {\n    if (passwordValidator(setAlert, newPassword) && confirmPasswordValidator(setAlert, confirmPassword, newPassword)) {\n      try {\n        await Auth.completeNewPassword(authUser, newPassword);\n\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: 'Your password was successfully changed!',\n            textColor: 'greenText',\n            borderColor: 'greenBorder',\n          },\n        });\n\n        await loadUser();\n\n        history.push('/');\n      } catch (error) {\n        console.error('Error updating password: ', error);\n\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: error.message,\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n      }\n    }\n  };\n\n  return (\n    <Container\n      grayedBackground\n      height=\"lg:h-168\"\n      width=\"lg:w-160\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 mt-3 md:mx-12 lg:mx-auto\"\n    >\n      <center>\n        <HeaderText noBold className=\"text-3xl lg:text-4xl\">\n          Reset Your Password\n        </HeaderText>\n      </center>\n\n      <TextField\n        type=\"password\"\n        onChange={e => setNewPassword(e.target.value)}\n        placeHolder=\"New Password\"\n        label=\"New Password\"\n        className=\"my-4\"\n        info=\"Your password must be 8 characters long, have at least one number, one upper case letter, one lower case letter, and one special character\"\n        infoTitle=\"Password Requirements\"\n      />\n\n      <TextField\n        type=\"password\"\n        onChange={e => setConfirmPassword(e.target.value)}\n        placeHolder=\"Confirm New Password\"\n        label=\"Confirm New Password\"\n        className=\"mb-4\"\n      />\n\n      <Button solidBlue className=\"mt-4\" onClick={resetPassword}>\n        SUBMIT\n      </Button>\n    </Container>\n  );\n};\n\nexport default RequireNewPassword;\n","import React, { useState, useEffect, useContext } from 'react';\nimport ReactGA from 'react-ga4';\nimport { Auth } from 'aws-amplify';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport HeaderText from '../../../components/HeaderText';\nimport Button from '../../../components/Button';\nimport TextField from '../../../components/TextField';\nimport Container from '../../../components/Container';\nimport { useUser } from '../../../contexts/userContext';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\nimport RequireNewPassword from '../RequireNewPassword';\nimport ConfirmAccount from '../ConfirmAccount';\n\nconst Login = () => {\n  const history = useHistory();\n  const { state: { email: confirmationEmail, password: confirmationPassword, origin } = {} } = useLocation();\n  const [email, setEmail] = useState(confirmationEmail || '');\n  const [password, setPassword] = useState(confirmationPassword || '');\n\n  const [loginEnabled, setLoginEnabled] = useState(false);\n\n  const { loadUser } = useUser();\n  const [, setAlert] = useContext(NotificationContext);\n\n  const currPageState = origin === 'createAccount' ? 'confirmation' : 'login';\n  const [pageState, setPageState] = useState(currPageState);\n  const [prevPageState, setPrevPageState] = useState('');\n  const [authUser, setAuthUser] = useState(null);\n\n  useEffect(() => {\n    if (prevPageState !== pageState) {\n      if (pageState === 'newPass') {\n        ReactGA.send({ hitType: 'pageview', page: '/reset-password' });\n      } else if (pageState === 'confirmation') {\n        ReactGA.send({ hitType: 'pageview', page: '/create-account_confirm' });\n      } else {\n        ReactGA.send({ hitType: 'pageview', page: '/login' });\n      }\n      setPrevPageState(pageState);\n    }\n  }, [pageState, prevPageState]);\n\n  const signIn = async () => {\n    try {\n      const authenticatedUser = await Auth.signIn({\n        username: email.toLowerCase(),\n        password,\n      });\n\n      setAuthUser(authenticatedUser);\n      if (authenticatedUser.challengeName === 'NEW_PASSWORD_REQUIRED') {\n        setPageState('newPass');\n      } else {\n        await loadUser();\n        history.push('/');\n      }\n\n      setEmail('');\n      setPassword('');\n    } catch (error) {\n      if (error && error.code === 'UserNotConfirmedException') {\n        setPageState('confirmation');\n      } else {\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: error.message,\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n      }\n    }\n  };\n\n  useEffect(() => {\n    if (email.length > 0 && password.length > 0) {\n      setLoginEnabled(true);\n    } else {\n      setLoginEnabled(false);\n    }\n  }, [email, password]);\n\n  switch (pageState) {\n    case 'newPass':\n      return <RequireNewPassword authUser={authUser} />;\n    case 'confirmation':\n      return <ConfirmAccount authData={{ email, password }} />;\n    default:\n      return (\n        <Container\n          grayedBackground\n          height=\"lg:h-168\"\n          width=\"lg:w-160\"\n          padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n          className=\"flex flex-col\"\n          margin=\"mx-3 mt-3 md:mx-12 lg:mx-auto lg:m-auto\">\n          <center>\n            <HeaderText noBold fontSize=\"text-3xl lg:text-4xl\">\n              Log In\n            </HeaderText>\n          </center>\n\n          <div className=\"flex flex-col\">\n            <TextField\n              type=\"text\"\n              value={email}\n              onChange={e => setEmail(e.target.value)}\n              placeHolder=\"Email\"\n              label=\"Email\"\n              className=\"mb-4\"\n            />\n            <TextField\n              type=\"password\"\n              value={password}\n              onChange={e => setPassword(e.target.value)}\n              placeHolder=\"Password\"\n              label=\"Password\"\n              className=\"mb-4\"\n            />\n            <Button solidBlue onClick={signIn} disabled={!loginEnabled}>\n              SUBMIT\n            </Button>\n            <div className=\"flex justify-between mt-4\">\n              <Button\n                anchorTag\n                onClick={() => {\n                  history.push('create-account');\n                }}>\n                Create Account\n              </Button>\n              <Button\n                anchorTag\n                onClick={() => {\n                  history.push('forgot-password');\n                }}>\n                Forgot Password\n              </Button>\n            </div>\n          </div>\n        </Container>\n      );\n  }\n};\n\nexport default Login;\n","import React, { useEffect } from 'react';\nimport ReactGA from 'react-ga4';\nimport ReactPlayer from 'react-player';\nimport HeaderText from '../../../components/HeaderText';\nimport { Container } from '../../../components';\nimport Crowd from '../../../assets/Images/landing/crowd.png';\nimport ArrowDown from '../../../assets/Images/landing/arrow-down.png';\nimport ArrowLeft from '../../../assets/Images/landing/arrow-left.png';\nimport CloudComputer from '../../../assets/Images/landing/cloud-computer.png';\nimport Police from '../../../assets/Images/landing/police.png';\nimport Hexagons from '../../../assets/Images/landing/hexagons.png';\nimport GuardianGroupLogo from '../../../assets/Images/landing/Guardian-Group-Logo.png';\nimport useAnalyticsEventTracker from '../../../helpers/GoogleAnalytics/eventTracker';\n\nconst Welcome = () => {\n  useEffect(() => {\n    ReactGA.send({ hitType: 'pageview', page: '/' });\n  }, []);\n\n  const gaEventTracker = useAnalyticsEventTracker('Welcome Video');\n\n  return (\n    <Container\n      grayedBackground\n      height=\"lg:min-h-168\"\n      width=\"lg:w-4/5\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 mt-3 lg:mt-12 lg:mx-auto\">\n      <center>\n        <HeaderText noBold fontSize=\"text-3xl lg:text-4xl mb-6 lg:mb-8\">\n          {/* Learn About Project 1591® */}\n          Harnessing the power of many to find the vulnerable\n        </HeaderText>\n      </center>\n\n      <div className=\"-mx-4 lg:mx-0\">\n        <ReactPlayer\n          url=\"https://pursuit-public-assets.s3.us-west-2.amazonaws.com/project1591_welcome.mp4\"\n          width=\"100%\"\n          height=\"100%\"\n          className=\"w-full bg-black\"\n          playsinline\n          controls\n          onStart={() => gaEventTracker('start-welcome-video')}\n          onEnded={() => gaEventTracker('finish-welcome-video')}\n        />\n      </div>\n\n      <div className=\"flex flex-col mt-6 lg:mt-16 lg:mx-20\">\n        <div className=\"flex flex-col justify-between lg:flex-row\">\n          <div className=\"text-lg text-pursuit-gray lg:w-128\">\n            <p className=\"mb-4 text-3xl text-pursuit-darkred\">\n              Project 1591® <span className=\"text-guardian-darkblue\">Overview</span>\n            </p>\n            The first ever <span className=\"font-semibold\">crowdsourcing</span> process & platform that{' '}\n            <span className=\"font-semibold\">enables volunteers</span> to become force multipliers to Guardian Group's\n            mission of <span className=\"font-semibold\">illuminating child victims of sex trafficking</span> in the\n            United States.\n          </div>\n          <div className=\"flex flex-col items-center justify-center\">\n            <img src={Crowd} alt=\"crowd of people\" className=\"mt-16 lg:mt-0 \" />\n            <img src={ArrowDown} alt=\"down arrow\" className=\"w-8 mt-8 lg:w-10\" />\n          </div>\n        </div>\n\n        <div className=\"flex flex-col-reverse items-center justify-between lg:flex-row\">\n          <img src={Police} alt=\"police\" className=\"object-contain w-48 h-48\" />\n\n          <img src={ArrowDown} alt=\"left arrow\" className=\"w-8 mt-8 lg:hidden\" />\n          <img src={ArrowLeft} alt=\"left arrow\" className=\"hidden h-10 lg:block\" />\n\n          <img src={GuardianGroupLogo} alt=\"left arrow\" className=\"object-contain w-48 h-48\" />\n\n          <img src={ArrowDown} alt=\"left arrow\" className=\"w-8 mt-8 lg:hidden\" />\n          <img src={ArrowLeft} alt=\"left arrow\" className=\"hidden h-10 lg:block\" />\n\n          <img src={CloudComputer} alt=\"police\" className=\"object-contain w-48 h-48\" />\n        </div>\n\n        <div className=\"flex flex-row justify-between mt-6 lg:mt-16\">\n          <div className=\"text-lg text-pursuit-gray\">\n            <p className=\"mb-4 text-3xl text-pursuit-darkred\">\n              Project 1591® <span className=\"text-guardian-darkblue\">Process</span>\n            </p>\n            Crowdsource a community of <span className=\"font-semibold\">Open-Source Intelligence (OSINT)</span>{' '}\n            volunteers to apply their skills for good in{' '}\n            <span className=\"font-semibold\">identifying and illuminating</span> underage victims of sex trafficking\n            <span className=\"font-semibold\"> to law enforcement</span> in the USA.\n          </div>\n        </div>\n        <div className=\"flex items-center justify-center mt-4 lg:m-16\">\n          <img src={Hexagons} alt=\"process overview\" className=\"object-contain w-full lg:w-auto lg:max-w-144\" />\n        </div>\n      </div>\n    </Container>\n  );\n};\n\nexport default Welcome;\n","import React from 'react';\n/**\n * Custom hook to set page title\n * @param {string} title Page title\n * @param {string[]} parts Page title parts\n * @param {string} separator Page title separator\n */\nexport const useTitle = (title, parts = ['Project 1591®', 'Guardian Group'], separator = '|') => {\n  React.useEffect(() => {\n    const prevTitle = document.title;\n    document.title = [title, ...parts].join(` ${separator} `);\n    return () => {\n      document.title = prevTitle;\n    };\n  }, []);\n};\n","import { useCallback } from 'react';\nimport { useHistory, useLocation } from 'react-router-dom';\n\nexport const useQueryState = (key, defaultValue) => {\n  const location = useLocation();\n  const history = useHistory();\n  const params = new URLSearchParams(location.search);\n  const value = params.get(key) || defaultValue;\n\n  const setValue = useCallback(\n    newValue => {\n      if (newValue) {\n        params.set(key, newValue);\n      } else {\n        params.delete(key);\n      }\n      history.push({ search: params.toString() });\n    },\n    [key, params, history]\n  );\n\n  return [value, setValue];\n};\n","import React, { useEffect, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { useTitle } from '../../../helpers/useTitle';\nimport { MessageForm, Container, HeaderText, Button, PopUpConfirmation } from '../../../components';\nimport { useQueryState } from '../../../helpers/useQueryState';\nimport { useParams, useLocation } from 'react-router-dom';\nimport { useUser } from '../../../contexts/userContext';\nimport { useHistory } from 'react-router-dom';\n\nconst USE_VOLUNTEER_VIEW = 'USE_VOLUNTEER_VIEW';\n/**\n * Create message page\n * @param {Object} props - React props\n * @param {string} props.pageTitle - The page title\n * @param {function} props.sendCallback - Callback function to run after message is sent\n * @param {function} props.cancelCallback - Callback function to run after message is cancelled\n * @returns {JSX.Element} - The page JSX\n */\nconst MessageCreate = ({\n  pageTitle = 'Create New Message',\n  sendCallback,\n  cancelUrl: defaultCancelUrl,\n  cancelCallback,\n  createLabel = 'Send',\n  cancelLabel = 'Cancel',\n}) => {\n  useTitle(pageTitle);\n  // Get recipients from query params\n  let manualSelectorComponent = null;\n  const [recipients] = useQueryState('recipients');\n  const { state } = useLocation();\n  const history = useHistory();\n  const { isAdmin, isEmployee } = useUser();\n  const [message] = useQueryState('message', state && state.message);\n  const subject = state && state.subject;\n  const [title, setTitle] = useQueryState('title', state && state.title);\n  const isReply = state && !!state.replyTo;\n  const cancelUrl = defaultCancelUrl ? defaultCancelUrl : isReply ? `/messaging/read/${state.replyTo}` : '/messaging';\n  const [showSentConfirmation, setShowSentConfirmation] = useState(false);\n\n  // const recipientsArray = recipients ? recipients.split(',').map(recipient => ({ recipient })) : [];\n  const [recipientsArray, setRecipientsArray] = useState(\n    recipients ? recipients.split(',').map(recipient => ({ recipient })) : []\n  );\n  const volunteer = true;\n  // let noUserSelector = true;\n  const [noUserSelector, setNoUserSelector] = useState(true);\n  const [notification, setNotification] = useState({});\n  // let subjectDisabled = false;\n  const [subjectDisabled, setSubjectDisabled] = useState(false);\n  // let noTitle = true;\n  const [noTitle, setNoTitle] = useState(true);\n\n  const checkForVolunteerView = () => {\n    const useVolunteerSavedPref = localStorage.getItem(USE_VOLUNTEER_VIEW);\n\n    if (useVolunteerSavedPref && useVolunteerSavedPref.toLowerCase() === 'true') {\n      return true;\n    }\n\n    return false;\n  };\n\n  const [useVolunteerView, setUseVolunteerView] = useState(checkForVolunteerView());\n\n  useEffect(() => {\n    if (!isEmployee || useVolunteerView) {\n      // // If recipients is empty set it to a value for admins\n      if (recipientsArray.length === 0) {\n        setRecipientsArray([{ recipient: 'ADMIN' }]);\n        // recipientsArray.push({ recipient: 'ADMIN' });\n      }\n      if (!title) {\n        setTitle('User Inquiry');\n      }\n      // manualSelectorComponent = (\n      //   <div className=\"mb-4\">\n      //     <div className=\"flex\">\n      //       <p className=\"light-primary-blue-text font-light mb-1 mr-1\">To: </p>\n      //       <p className=\"font-light mb-1 mr-1\">Project 1591</p>\n      //     </div>\n      //   </div>\n      // );\n    } else {\n      // // noUserSelector = false;\n      setNoUserSelector(false);\n      // // subjectDisabled = false;\n      setSubjectDisabled(false);\n      // // noTitle = false;\n      setNoTitle(false);\n    }\n  }, [useVolunteerView]);\n\n  // const notification = { recipients: recipientsArray, message, title, subject, replyTo: state && state.replyTo };\n  useEffect(() => {\n    const n = {\n      recipients: recipientsArray,\n      message,\n      title: title,\n      subject,\n      replyTo: state && state.replyTo,\n    };\n    setNotification(n);\n    // console.log('notification', JSON.stringify({ n, state }, null, 2));\n\n    // setNotification({ recipients: recipientsArray, message, title, subject, replyTo: state && state.replyTo });\n  }, [recipientsArray, message, title, subject, state]);\n  return (\n    <Container\n      height=\"lg:min-h-104\"\n      width=\"lg:w-4/5\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 md:mx-12 lg:mx-auto mt-4\">\n      <HeaderText fontSize=\"text-4xl\" className=\"mb-12\">\n        {pageTitle}\n      </HeaderText>\n      {showSentConfirmation && (\n        <PopUpConfirmation\n          title=\"Message Sent\"\n          content={`Your message has been sent.`}\n          noCancel\n          // onCancel={toggleDeleteConfirmation}\n          onConfirm={() => {\n            // Navigate to the messaging page\n            history.push('/messaging');\n            // setDeleting(true);\n            // deleteMessage(message.id, false);\n            // setTimeout(() => {\n            //   setDeleting(false);\n            //   history.push('/messaging');\n            // }, 2000);\n          }}\n          confirmText=\"OK\"\n          // confirmLoading={deleting}\n          confirmLoadingText=\"OK\"\n          className=\"w-11/12 lg:w-auto\"\n          destructive\n        />\n      )}\n      {notification && (notification.title || !noTitle) && (\n        <MessageForm\n          // notification={{ ...{ recipients: recipientsArray, message, title, subject, replyTo: state && state.replyTo } }}\n          notification={notification}\n          isReply={isReply}\n          createLabel={createLabel}\n          cancelLink={cancelUrl}\n          cancelCallback={cancelCallback}\n          createCallback={() => setShowSentConfirmation(true)}\n          noUserSelector={noUserSelector}\n          subjectDisabled={subjectDisabled}\n          noTitle={noTitle}\n          manualSelectorComponent={manualSelectorComponent}\n        />\n      )}\n      {/* {JSON.stringify(notification, null, 2)} */}\n    </Container>\n  );\n};\nMessageCreate.propTypes = {\n  pageTitle: PropTypes.string,\n  cancelUrl: PropTypes.string,\n  createLabel: PropTypes.string,\n  cancelLabel: PropTypes.string,\n  sendCallback: PropTypes.func,\n  cancelCallback: PropTypes.func,\n};\n\nexport default MessageCreate;\n","import React, { useState, useContext, useEffect, useCallback } from 'react';\nimport { Container, DataGrid, HeaderText, MessageGrid, Button } from '../../../components';\nimport { useUser } from '../../../contexts/userContext';\nimport * as Icons from 'react-icons/fa';\nimport { useHistory } from 'react-router-dom';\nimport { useMessages } from '../../../helpers/useMessages';\nimport { useQueryState } from '../../../helpers/useQueryState';\nimport { usePrevious } from '../../../helpers/usePrevious';\n\nconst USE_VOLUNTEER_VIEW = 'USE_VOLUNTEER_VIEW';\n\nconst MessageIndex = () => {\n  const pageTitle = 'Messaging';\n  const { isAdmin, isEmployee } = useUser();\n  const [loadingMore, setLoadingMore] = useState(false);\n  const history = useHistory();\n  // const [isLoading, setIsLoading] = useState(false);\n  // const [messages, setMessages] = useState([]);\n  // const [tabName, setTabName] = useState('mine');\n  const [tabName, setTabName] = useQueryState('tab', 'mine');\n  const prevTabName = usePrevious(tabName);\n  // const [sortDirection, setSortDirection] = useState('desc');\n  const checkForVolunteerView = () => {\n    const useVolunteerSavedPref = localStorage.getItem(USE_VOLUNTEER_VIEW);\n\n    if (useVolunteerSavedPref && useVolunteerSavedPref.toLowerCase() === 'true') {\n      return true;\n    }\n\n    return false;\n  };\n\n  const [useVolunteerView, setUseVolunteerView] = useState(checkForVolunteerView());\n\n  const useAdminView = isAdmin && !useVolunteerView;\n  const {\n    listMessages,\n    listSharedMessages,\n    listSentMessages,\n    loading,\n    sortableMessageFields,\n    setSort,\n    sortField,\n    sortDirection,\n    messages,\n    nextToken,\n    setMessages,\n    resetNextToken,\n  } = useMessages({ limit: 1000, asAdmin: useAdminView });\n\n  const [hiddenFields, setHiddenFields] = useState([]);\n\n  // useEffect(() => {\n  //   console.log({ tabName, prevTabName });\n  //   if (prevTabName !== tabName) {\n  //     setMessages([]);\n  //   }\n  // }, [tabName, prevTabName, setMessages]);\n\n  const updateMessages = useCallback(\n    async (currentTabName, reset = false) => {\n      if (messages.length && !reset) {\n        setLoadingMore(true);\n      }\n      let data;\n      switch (currentTabName) {\n        case 'shared':\n          setHiddenFields([]);\n          resetNextToken();\n          data = await listSharedMessages({\n            group: 'admin',\n          });\n          break;\n        case 'sent':\n          setHiddenFields(['senderAlias', 'assignedTo']);\n          resetNextToken();\n          const group = useAdminView ? 'admin' : undefined;\n          data = await listSentMessages({ group });\n          break;\n        default:\n          setHiddenFields(['recipientAlias', 'assignedTo']);\n          resetNextToken();\n          data = await listMessages();\n          break;\n      }\n      // console.log({ data });\n      const updatedMessages = [...(reset ? [] : messages), ...(data || [])];\n      // const updatedMessages = [...messages, ...(data || [])];\n      // console.log({ currentTabName, reset, sortField, sortDirection, updatedMessages });\n      setMessages(updatedMessages);\n      setLoadingMore(false);\n    },\n    // [sortField, sortDirection, setMessages, tabName, messages, listMessages, nextToken]\n    [sortField, sortDirection, setMessages, listMessages, nextToken, messages]\n  );\n\n  useEffect(() => {\n    // const update = async () => {\n    //   let data;\n    //   switch (tabName) {\n    //     case 'shared':\n    //       setHiddenFields([]);\n    //       data = await listSharedMessages({\n    //         group: 'admin',\n    //       });\n    //       break;\n    //     case 'sent':\n    //       // setHiddenFields(['recipientAlias']);\n    //       setHiddenFields(['senderAlias', 'assignedTo']);\n    //       data = await listSentMessages();\n    //       break;\n    //     default:\n    //       setHiddenFields(['recipientAlias', 'assignedTo']);\n    //       data = await listMessages();\n    //       break;\n    //   }\n    //   // console.log({ data });\n    //   console.log({ tabName, sortField, sortDirection });\n    //   setMessages(data);\n    // };\n    // update();\n    // }, [sortField, sortDirection, listMessages, setMessages, tabName]);\n    updateMessages(tabName, prevTabName !== tabName);\n  }, [sortField, sortDirection, setMessages, tabName]);\n\n  const primaryAction = (\n    <Button\n      linedBlue\n      className=\"flex flex-row px-4 w-full lg:w-40 uppercase\"\n      onClick={() => {\n        history.push('/messaging/create');\n      }}>\n      <Icons.FaPlusCircle className=\"mr-2\" /> New Message\n    </Button>\n  );\n  const activateTab = tabButton => (\n    <div className=\"relative flex flex-col\">\n      {tabButton}\n      <div className=\"absolute inset-y-0 w-full border-b-4 border-pursuit-red\" />\n    </div>\n  );\n\n  let myTab = (\n    <Button\n      tab\n      onClick={() => {\n        // setMessages([]);\n        setSort({ fieldName: 'createdAt', direction: 'DESC' });\n        resetNextToken();\n        return setTabName('mine');\n      }}\n      // disabled={tabName === 'mine'}\n      className=\"px-0 text-lg border-b-4 border-transparent rounded-none text-pursuit-gray focus:outline-none hover:border-pursuit-red\">\n      Mine\n    </Button>\n  );\n  let sentTab = (\n    <Button\n      tab\n      onClick={() => {\n        // setMessages([]);\n        setSort({ fieldName: 'createdAt', direction: 'DESC' });\n        resetNextToken();\n        return setTabName('sent');\n      }}\n      // disabled={tabName === 'mine'}\n      className=\"px-0 text-lg border-b-4 border-transparent rounded-none text-pursuit-gray focus:outline-none hover:border-pursuit-red\">\n      Sent\n    </Button>\n  );\n  let sharedTab = useAdminView && (\n    <Button\n      tab\n      onClick={() => {\n        // setMessages([]);\n        setSort({ fieldName: 'createdAt', direction: 'DESC' });\n        resetNextToken();\n        return setTabName('shared');\n      }}\n      // disabled={tabName === 'all'}\n      className=\"px-0 text-lg border-b-4 border-transparent rounded-none text-pursuit-gray focus:outline-none hover:border-pursuit-red\">\n      Shared\n    </Button>\n  );\n  switch (tabName) {\n    case 'mine':\n      myTab = activateTab(myTab);\n      break;\n    case 'shared':\n      sharedTab = activateTab(sharedTab);\n      break;\n    case 'sent':\n      sentTab = activateTab(sentTab);\n      break;\n    default:\n      break;\n  }\n\n  const tabs = useAdminView && (\n    <div className=\"bottom-0 right-0 flex-row hidden pr-4 mt-4 mb-2 lg: lg:flex\">\n      <span className=\"ml-6\">{myTab}</span>\n      <span className=\"ml-6\">{sentTab}</span>\n      <span className=\"ml-6\">{sharedTab}</span>\n    </div>\n  );\n\n  const headerSection = (\n    <>\n      <div className=\"flex flex-col lg:flex-row lg:justify-between\">\n        <HeaderText className=\"mb-4 text-2xl text-left lg:text-4xl\">{pageTitle}</HeaderText>\n        <div>\n          {primaryAction}\n          {tabs}\n        </div>\n      </div>\n    </>\n  );\n  const rowLink = useCallback(\n    item => {\n      switch (tabName) {\n        case 'sent':\n          return `/messaging/view/${item.createRequestId}`;\n        default:\n          return `/messaging/read/${item.id}`;\n      }\n    },\n    [tabName]\n  );\n\n  return (\n    <Container height=\"lg:h-152\" padding=\"p-4\" margin=\"m-3 lg:m-auto lg:mx-8\" className=\"relative\">\n      {headerSection}\n      <MessageGrid\n        messages={messages}\n        isLoading={!loadingMore && loading}\n        sortableFields={sortableMessageFields}\n        advancedView={useAdminView}\n        hasMore={!!nextToken}\n        // loadNextPage={updateMessages}\n        loadNextPage={() => updateMessages(tabName)}\n        // sort={sort}\n        rowLink={rowLink}\n        sort={{\n          fieldName: sortField,\n          direction: sortDirection,\n        }}\n        setSort={sortParams => {\n          resetNextToken();\n          setMessages([]);\n          console.log({ sortParams });\n          setSort(sortParams);\n        }}\n        hiddenFields={hiddenFields}\n      />\n      {/* {JSON.stringify({ messages })} */}\n    </Container>\n  );\n};\n\nexport default MessageIndex;\n","import React from 'react';\n/**\n * Returns the previous value of a given value.\n * @template T\n * @param {T} val - The current value.\n * @returns {T} The previous value.\n */\nexport const usePrevious = val => {\n  const ref = React.useRef();\n  React.useEffect(() => {\n    ref.current = val;\n  }, [val]);\n  return ref.current;\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport {\n  Container,\n  Button,\n  Spinner,\n  DateDisplay,\n  PopUpConfirmation,\n  MessageToDetail,\n  MessageThread,\n  MessageForm,\n} from '../../../components';\nimport * as Icons from 'react-icons/fa';\nimport { Link } from 'react-router-dom';\nimport { useMessages, isMessageFromAdmin, getInboxUid } from '../../../helpers/useMessages';\nimport { useUser } from '../../../contexts/userContext';\nimport { useParams } from 'react-router-dom';\nimport { parseMarkdown } from '../../../helpers/markdown';\nimport { useHistory } from 'react-router-dom';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport { Storage } from 'aws-amplify';\nconst USE_VOLUNTEER_VIEW = 'USE_VOLUNTEER_VIEW';\nStorage.configure({\n  customPrefix: {\n    public: '',\n  },\n  // level: 'email_attachments',\n});\n\nconst MessageRead = ({ defaultSender = 'Project 1591' }) => {\n  const pageTitle = 'Message Detail';\n  const { messageId } = useParams();\n  const { isAdmin, user } = useUser();\n  const history = useHistory();\n  // const history = useHistory();\n  const [message, setMessage] = useState();\n  const [autoRead, setAutoRead] = useState(true);\n  const [deleting, setDeleting] = useState(false);\n  const [messageRead, setMessageRead] = useState(false);\n  const [displayDeleteConfirmation, setDisplayDeleteConfirmation] = useState(false);\n  const [adminFlagged, setAdminFlagged] = useState(false);\n  const [showSentConfirmation, setShowSentConfirmation] = useState(false);\n  const myIds = user && user.id ? [user.id, getInboxUid(user.userStatus)] : [];\n  const {\n    loadMessageDetail,\n    loading,\n    readMessage,\n    unreadMessage,\n    flagMessage,\n    unflagMessage,\n    deleteMessage,\n  } = useMessages();\n\n  const checkForVolunteerView = () => {\n    const useVolunteerSavedPref = localStorage.getItem(USE_VOLUNTEER_VIEW);\n\n    if (useVolunteerSavedPref && useVolunteerSavedPref.toLowerCase() === 'true') {\n      return true;\n    }\n\n    return false;\n  };\n\n  const [useVolunteerView, setUseVolunteerView] = useState(checkForVolunteerView());\n\n  const useAdminView = isAdmin && !useVolunteerView;\n\n  // Toggle the delete confirmation modal\n  const toggleDeleteConfirmation = useCallback(() => {\n    setDisplayDeleteConfirmation(!displayDeleteConfirmation);\n  }, [displayDeleteConfirmation]);\n\n  useEffect(() => {\n    const load = async () => {\n      try {\n        const data = await loadMessageDetail(messageId);\n        setMessage(data);\n        setMessageRead(!!data.readAt);\n        setAdminFlagged(!!data.adminFlaggedAt);\n      } catch (e) {\n        console.error(e);\n      }\n    };\n    load();\n  }, [messageId, loadMessageDetail]);\n\n  const messageReadToggle = useCallback(() => {\n    console.log('Toggle read', { messageRead, messageId });\n    const task = async () => {\n      const apiRequest = messageRead ? unreadMessage(messageId) : readMessage(messageId);\n      const updatedMessage = await apiRequest;\n      console.log({ updatedMessage });\n      setMessageRead(!!updatedMessage.readAt);\n      setMessage(updatedMessage);\n    };\n    task();\n  }, [messageId, readMessage, unreadMessage, messageRead]);\n\n  const messageFlagToggle = useCallback(() => {\n    const task = async () => {\n      const apiRequest = adminFlagged ? unflagMessage(messageId) : flagMessage(messageId);\n      const updatedMessage = await apiRequest;\n      console.log({ updatedMessage });\n      setAdminFlagged(!!updatedMessage.adminFlaggedAt);\n      setMessage(updatedMessage);\n    };\n    task();\n  }, [messageId, flagMessage, unflagMessage, adminFlagged]);\n\n  useEffect(() => {\n    // console.log('Auto read', { message, user, autoRead, useAdminView });\n    if (message && (message.readAt || message.seenAt)) {\n      // console.log('Auto read disabled', { message, user });\n      setAutoRead(false);\n      return;\n    }\n    if (!message || message.readAt !== null || message.seenAt != null || !autoRead) {\n      return;\n    }\n    // Check if user is recipient or message recipientGroups contains the users userStatus and useAdminView is true\n    const lowerCaseGroups = (message.recipientGroups || []).map(group => group.toLowerCase());\n    const messageGroupIncludesUser = lowerCaseGroups.includes(user.userStatus.toLowerCase());\n    const groupMessageAndAdminView = messageGroupIncludesUser && useAdminView;\n    // console.log({ lowerCaseGroups, messageGroupIncludesUser, groupMessageAndAdminView });\n    if (!user || (user.id != message.recipient && !groupMessageAndAdminView)) {\n      console.info('Message not for user');\n      return;\n    }\n    const markRead = async () => {\n      // console.log('Auto marking', { autoRead });\n      setAutoRead(false);\n      const updatedMessage = await readMessage(message.id);\n      if (updatedMessage) {\n        setMessage(updatedMessage);\n        setMessageRead(!!updatedMessage.readAt);\n      }\n    };\n    markRead();\n  }, [message, autoRead, user]);\n\n  const downloadAttachment = async attachment => {\n    console.log({ attachment });\n    // S3 path and file name\n    const { path, name } = attachment;\n    const url = await Storage.get(path, { level: 'public' });\n    // const url = await Storage.get(path, { download: true, level: '' });\n    console.log({ url });\n    // Trigger download\n    window.open(url, '_blank');\n  };\n\n  const backButton = (\n    <Link\n      to=\"/messaging\"\n      onClick={e => {\n        e.preventDefault();\n        return history.goBack();\n      }}\n      className=\"flex items-center mb-12 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue\">\n      <Icons.FaChevronLeft size={18} className=\"mr-4\" />\n      BACK\n    </Link>\n  );\n\n  const readActionButton = message &&\n    user &&\n    (user.id == message.recipient || message.recipient == getInboxUid(user.userStatus)) && (\n      <Button\n        height=\"h-auto\"\n        className=\"flex items-center mb-0 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue mx-2\"\n        onClick={messageReadToggle}\n        // As long as this is the only thing that changes state on this page it can piggy back on message loading\n        loading={loading}\n        disabled={loading}>\n        Mark {messageRead ? 'unread' : 'read'}\n      </Button>\n    );\n\n  const flagActionButton = useAdminView && (\n    <Button\n      height=\"h-auto\"\n      className=\"flex items-center mb-0 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue mx-2\"\n      onClick={messageFlagToggle}\n      // As long as this is the only thing that changes state on this page it can piggy back on message loading\n      loading={loading}\n      disabled={loading}>\n      {adminFlagged ? 'Unflag' : 'Flag'}\n    </Button>\n  );\n  const deleteActionButton = useAdminView && message && (\n    <Button\n      height=\"h-auto\"\n      className=\"flex items-center mb-0 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue mx-2\"\n      onClick={toggleDeleteConfirmation}\n      // As long as this is the only thing that changes state on this page it can piggy back on message loading\n      // loading={loading}\n      disabled={loading}>\n      Delete\n    </Button>\n  );\n  // console.log({user})\n  if ((loading && !message) || !message) {\n    return (\n      <Container\n        width=\"flex flex-col w-96pr h-88 lg:w-3/4 justify-center items-center\"\n        margin=\"m-3 lg:m-auto\"\n        className=\"relative px-6 py-8\">\n        <div className=\"flex flex-col items-center justify-center w-120\">\n          <div className=\"mb-6 text-xl font-bold text-pursuit-gray\">\n            {loading ? 'Loading message' : 'Unable to load message'}\n          </div>\n          {loading && <Spinner />}\n        </div>\n      </Container>\n    );\n  }\n\n  const headerSection = (\n    <div className=\"flex justify-between items-end\">\n      <div>\n        <h1 className=\"mb-1 text-2xl text-left font-bold lg:text-4xl\">{pageTitle}</h1>\n        <span className=\"mb-4 text-sm text-left text-pursuit-gray\">\n          Date: <DateDisplay date={message.createdAt} format=\"DATETIME_SHORT\" />\n        </span>\n      </div>\n      <div className=\"flex\">\n        {readActionButton}\n        {flagActionButton}\n        {deleteActionButton}\n      </div>\n      {/* {primaryAction} */}\n    </div>\n  );\n  const formatReplySubject = subject => {\n    const prefix = 'Re: ';\n    if (subject.startsWith(prefix)) {\n      return subject;\n    }\n    return `${prefix}${subject}`;\n  };\n  const replyButton = (\n    <Link\n      to={{\n        pathname: '/messaging/create',\n        search: `?recipients=${message.sender}`,\n        state: {\n          fromReply: true,\n          subject: formatReplySubject(message.subject),\n          replyTo: messageId,\n          title: message.title,\n        },\n      }}\n      // className=\"flex items-center mb-12 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue\"\n      // onClick={() => history.push('/messaging')}\n      //  >\n    >\n      <Button solidBlue className=\"w-full mt-4 text-base lg:mt-0 lg:w-64\">\n        REPLY\n      </Button>\n    </Link>\n  );\n  // <span title={isAdmin && !useVolunteerView && `Real name: ${message.senderName}`}>\n  //   {isAdmin && !useVolunteerView && <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />}{' '}\n  //   {`${useAdminView ? message.senderAlias || message.sender : defaultSender}`}\n  // </span>\n  let from = (\n    <span>\n      {/* {isEmployee && !useVolunteerView && (\n            <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />\n          )}{' '} */}\n      {defaultSender}\n    </span>\n  );\n\n  // let to = (\n  //   <span title={useAdminView ? `Real name: ${message.recipientName}` : null}>\n  //     {isAdmin && !useVolunteerView && <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />}{' '}\n  //     {message.recipientAlias || message.recipient}\n  //   </span>\n  // );\n  // if (useAdminView && (message.recipientGroups || []).includes('Admin')) {\n  //   to = <span title={`Alias: ${message.recipientAlias}`}>{message.recipientName || message.recipient}</span>;\n  // }\n\n  if (useAdminView && isMessageFromAdmin(message)) {\n    const senderTitle = `Alias: ${message.senderAlias}`;\n    from = <span title={senderTitle}>{message.senderName || defaultSender}</span>;\n  } else if (useAdminView) {\n    const senderTitle = `Real name: ${message.senderName}`;\n    from = (\n      <span title={senderTitle}>\n        {!useVolunteerView && <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />}{' '}\n        {message.senderAlias || defaultSender}\n      </span>\n    );\n  } else {\n  }\n  const content = (\n    <div className=\"w-full px-2 py-4 my-2 bg-gray-100 lg:px-8 lg:py-8\">\n      <ul className=\"message-reader\">\n        <li className=\"my-1\">\n          {/* <p> */}\n          <b className=\"text-pursuit-gray\">To: </b>\n          {/* {to} */}\n          <MessageToDetail message={message} options={{ useAdminView }} />\n          {/* <span title={isAdmin && !useVolunteerView && `Alias: ${message.recipientAlias}`}>\n              {`${isAdmin && !useVolunteerView ? message.recipientName : message.recipientAlias || message.recipient}`}\n            </span> */}\n          {/* </p> */}\n        </li>\n        <li className=\"my-1\">\n          <p>\n            <b className=\"text-pursuit-gray\">From: </b>\n            {from}\n          </p>\n        </li>\n        <li className=\"my-1\">\n          <p>\n            <b className=\"text-pursuit-gray\">Title: </b>\n            {`${(message.attributes && message.attributes.customTitle) || message.title}`}\n          </p>\n        </li>\n        <li className=\"my-1\">\n          <p>\n            <b className=\"text-pursuit-gray\">Subject: </b>\n            {`${message.subject}`}\n          </p>\n        </li>\n        {/**\n         * Show message attribute attachments and download ling from S3\n         */}\n        {message.attributes && message.attributes.fileAttachments && message.attributes.fileAttachments.length > 0 && (\n          <>\n            <li className=\"my-1\">\n              <p>\n                <b className=\"text-pursuit-gray\">Attachments: </b>\n              </p>\n            </li>\n            <li className=\"my-1\">\n              <ul>\n                {message.attributes.fileAttachments.map(\n                  (attachment, index) =>\n                    attachment && (\n                      <li key={index} className=\"my-1\">\n                        <a onClick={() => downloadAttachment(attachment)} target=\"_blank\" rel=\"noopener noreferrer\">\n                          {attachment.name}\n                        </a>\n                      </li>\n                    )\n                )}\n              </ul>\n            </li>\n          </>\n        )}\n\n        {/* <p>{JSON.stringify({ message })}</p> */}\n        <li className=\"my-1\">\n          {/* <b className=\"text-pursuit-gray\">Message: </b> */}\n          <hr className=\"mt-2\" />\n          {/* <p className=\"p-2\"> */}\n          <span\n            className=\"p-2\"\n            dangerouslySetInnerHTML={{\n              __html: parseMarkdown(message.message),\n            }}></span>\n          {/* </p> */}\n          <hr className=\"mb-2\" />\n        </li>\n      </ul>\n      <div className=\"flex flex-col-reverse justify-between mt-8 lg:flex-row\">\n        <div className=\"w-full mt-4 lg:mt-0 lg:w-auto\">{/* {backButton} */}</div>\n        {/* {replyButton} */}\n        {/* {JSON.stringify({ myIds })} */}\n        {/* {myIds.length > 0 && !myIds.includes(message.sender) && ( */}\n        {myIds.length > 0 && myIds.includes(message.recipient) && (\n          <div className=\"bg-white border border-gray-200 rounded-sm p-4 w-full mb-4\">\n            {showSentConfirmation && (\n              <PopUpConfirmation\n                title=\"Message Sent\"\n                content={`Your message has been sent.`}\n                noCancel\n                onConfirm={() => {\n                  // Navigate to the messaging page\n                  history.push('/messaging');\n                }}\n                confirmText=\"OK\"\n                confirmLoadingText=\"OK\"\n                className=\"w-11/12 lg:w-auto\"\n                destructive\n              />\n            )}\n            <MessageForm\n              // notification={message}\n              notification={{\n                subject: formatReplySubject(message.subject),\n                replyTo: message.id,\n                title: message.title,\n                recipients: [{ recipient: message.sender }],\n              }}\n              isReply={true}\n              createLabel=\"Reply\"\n              cancelLink={'/messaging'}\n              cancelCallback={e => {\n                // e.preventDefault();\n                history.goBack();\n              }}\n              createCallback={() => setShowSentConfirmation(true)}\n              noUserSelector={true}\n              subjectDisabled={true}\n              noTitle={true}\n              noSubject={true}\n              confirmSend\n            />\n          </div>\n        )}\n      </div>\n      {/* <p>{JSON.stringify({ message })}</p> */}\n      <MessageThread\n        rootMessageId={message.rootMessageId || message.id}\n        displaySeen={useAdminView}\n        currentMessageId={message.id}\n        user={user}\n        showReply\n        showLoadingSkeleton={false}\n        // showRootIfSingle\n      />\n      {/* <p>{JSON.stringify({ message })}</p> */}\n    </div>\n  );\n\n  return (\n    <Container width=\"lg:w-3/4\" margin=\"m-3 lg:m-auto\" className=\"relative px-3 py-4 lg:px-6 lg:py-8\">\n      {displayDeleteConfirmation && (\n        <PopUpConfirmation\n          title=\"Delete Message\"\n          content={`Are you sure you want to delete this message?`}\n          onCancel={toggleDeleteConfirmation}\n          onConfirm={() => {\n            setDeleting(true);\n            deleteMessage(message.id, false);\n            setTimeout(() => {\n              setDeleting(false);\n              history.push('/messaging');\n            }, 2000);\n          }}\n          confirmText=\"DELETE\"\n          confirmLoading={deleting}\n          confirmLoadingText=\"DELETING\"\n          className=\"w-11/12 lg:w-auto\"\n          destructive\n        />\n      )}\n      {headerSection}\n      {content}\n    </Container>\n  );\n};\n\nexport default MessageRead;\n","import React, { useState, useEffect, useCallback } from 'react';\nimport {\n  Container,\n  Button,\n  Spinner,\n  DateDisplay,\n  PopUpConfirmation,\n  MessageToDetail,\n  MessageThread,\n  MessageForm,\n} from '../../../components';\nimport * as Icons from 'react-icons/fa';\nimport { Link } from 'react-router-dom';\nimport { useMessages, isMessageFromAdmin, getInboxUid } from '../../../helpers/useMessages';\nimport { useUser } from '../../../contexts/userContext';\nimport { useParams } from 'react-router-dom';\nimport { parseMarkdown } from '../../../helpers/markdown';\nimport { useHistory } from 'react-router-dom';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro';\nimport MessageToMeta from '../../../components/MessageTo/MessageToMeta';\nconst USE_VOLUNTEER_VIEW = 'USE_VOLUNTEER_VIEW';\n\nconst MessageViewSent = ({ defaultSender = 'Project 1591' }) => {\n  const pageTitle = 'Message Detail';\n  const { createRequestId: messageId } = useParams();\n  const { isAdmin, user } = useUser();\n  const history = useHistory();\n  // const history = useHistory();\n  const [message, setMessage] = useState();\n  const [autoRead, setAutoRead] = useState(true);\n  const [deleting, setDeleting] = useState(false);\n  const [messageRead, setMessageRead] = useState(false);\n  const [displayDeleteConfirmation, setDisplayDeleteConfirmation] = useState(false);\n  const [adminFlagged, setAdminFlagged] = useState(false);\n  const myIds = user && user.id ? [user.id, getInboxUid(user.userStatus)] : [];\n  const {\n    viewMessageDetail,\n    loading,\n    readMessage,\n    unreadMessage,\n    flagMessage,\n    unflagMessage,\n    deleteMessage,\n  } = useMessages();\n\n  const checkForVolunteerView = () => {\n    const useVolunteerSavedPref = localStorage.getItem(USE_VOLUNTEER_VIEW);\n\n    if (useVolunteerSavedPref && useVolunteerSavedPref.toLowerCase() === 'true') {\n      return true;\n    }\n\n    return false;\n  };\n\n  const [useVolunteerView, setUseVolunteerView] = useState(checkForVolunteerView());\n  const [showSentConfirmation, setShowSentConfirmation] = useState(false);\n\n  const useAdminView = isAdmin && !useVolunteerView;\n\n  // Toggle the delete confirmation modal\n  const toggleDeleteConfirmation = useCallback(() => {\n    setDisplayDeleteConfirmation(!displayDeleteConfirmation);\n  }, [displayDeleteConfirmation]);\n\n  useEffect(() => {\n    const load = async () => {\n      try {\n        const data = await viewMessageDetail(messageId);\n        setMessage(data);\n        setMessageRead(!!data.readAt);\n        setAdminFlagged(!!data.adminFlaggedAt);\n      } catch (e) {\n        console.error(e);\n      }\n    };\n    load();\n  }, [messageId, viewMessageDetail]);\n\n  const messageReadToggle = useCallback(() => {\n    console.log('Toggle read', { messageRead, messageId });\n    const task = async () => {\n      const apiRequest = messageRead ? unreadMessage(messageId) : readMessage(messageId);\n      const updatedMessage = await apiRequest;\n      console.log({ updatedMessage });\n      setMessageRead(!!updatedMessage.readAt);\n      setMessage(updatedMessage);\n    };\n    task();\n  }, [messageId, readMessage, unreadMessage, messageRead]);\n\n  const messageFlagToggle = useCallback(() => {\n    const task = async () => {\n      const apiRequest = adminFlagged ? unflagMessage(messageId) : flagMessage(messageId);\n      const updatedMessage = await apiRequest;\n      console.log({ updatedMessage });\n      setAdminFlagged(!!updatedMessage.adminFlaggedAt);\n      setMessage(updatedMessage);\n    };\n    task();\n  }, [messageId, flagMessage, unflagMessage, adminFlagged]);\n\n  // useEffect(() => {\n  //   if (message && message.readAt) {\n  //     // console.log('Auto read disabled', { message, user });\n  //     setAutoRead(false);\n  //     return;\n  //   }\n  //   if (!message || message.readAt !== null || !autoRead) {\n  //     return;\n  //   }\n  //   if (!user || user.id != message.recipient) {\n  //     return;\n  //   }\n  //   const markRead = async () => {\n  //     console.log('Auto marking', { autoRead });\n  //     setAutoRead(false);\n  //     const updatedMessage = await readMessage(message.id);\n  //     setMessage(updatedMessage);\n  //     setMessageRead(updatedMessage && !!updatedMessage.readAt);\n  //   };\n  //   markRead();\n  // }, [message, autoRead, user]);\n\n  const backButton = (\n    <Link\n      to=\"/messaging\"\n      onClick={e => {\n        e.preventDefault();\n        return history.goBack();\n      }}\n      className=\"flex items-center mb-12 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue\">\n      <Icons.FaChevronLeft size={18} className=\"mr-4\" />\n      BACK\n    </Link>\n  );\n\n  const readActionButton = message && user && user.id == message.recipient && (\n    <Button\n      height=\"h-auto\"\n      className=\"flex items-center mb-0 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue mx-2\"\n      onClick={messageReadToggle}\n      // As long as this is the only thing that changes state on this page it can piggy back on message loading\n      loading={loading}\n      disabled={loading}>\n      Mark {messageRead ? 'unread' : 'read'}\n    </Button>\n  );\n\n  const flagActionButton = useAdminView && (\n    <Button\n      height=\"h-auto\"\n      className=\"flex items-center mb-0 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue mx-2\"\n      onClick={messageFlagToggle}\n      // As long as this is the only thing that changes state on this page it can piggy back on message loading\n      loading={loading}\n      disabled={loading}>\n      {adminFlagged ? 'Unflag' : 'Flag'}\n    </Button>\n  );\n  const deleteActionButton = useAdminView && message && (\n    <Button\n      height=\"h-auto\"\n      className=\"flex items-center mb-0 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue mx-2\"\n      onClick={toggleDeleteConfirmation}\n      // As long as this is the only thing that changes state on this page it can piggy back on message loading\n      // loading={loading}\n      disabled={loading}>\n      Delete\n    </Button>\n  );\n  // console.log({user})\n  if ((loading && !message) || !message) {\n    return (\n      <Container\n        width=\"flex flex-col w-96pr h-88 lg:w-3/4 justify-center items-center\"\n        margin=\"m-3 lg:m-auto\"\n        className=\"relative px-6 py-8\">\n        <div className=\"flex flex-col items-center justify-center w-120\">\n          <div className=\"mb-6 text-xl font-bold text-pursuit-gray\">\n            {loading ? 'Loading message' : 'Unable to load message'}\n          </div>\n          {loading && <Spinner />}\n        </div>\n      </Container>\n    );\n  }\n\n  const headerSection = (\n    <div className=\"flex justify-between items-end\">\n      <div>\n        <h1 className=\"mb-1 text-2xl text-left font-bold lg:text-4xl\">{pageTitle}</h1>\n        <span className=\"mb-4 text-sm text-left text-pursuit-gray\">\n          Date: <DateDisplay date={message.createdAt} format=\"DATETIME_SHORT\" />\n        </span>\n      </div>\n      <div className=\"flex\">\n        {/* {readActionButton} */}\n        {/* {flagActionButton} */}\n        {/* {deleteActionButton} */}\n      </div>\n      {/* {primaryAction} */}\n    </div>\n  );\n  const formatReplySubject = subject => {\n    const prefix = 'Re: ';\n    if (subject.startsWith(prefix)) {\n      return subject;\n    }\n    return `${prefix}${subject}`;\n  };\n  const replyButton = (\n    <Link\n      to={{\n        pathname: '/messaging/create',\n        search: `?recipients=${message.sender}`,\n        state: {\n          fromReply: true,\n          subject: formatReplySubject(message.subject),\n          replyTo: messageId,\n          title: message.title,\n        },\n      }}\n      // className=\"flex items-center mb-12 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue\"\n      // onClick={() => history.push('/messaging')}\n      //  >\n    >\n      <Button solidBlue className=\"w-full mt-4 text-base lg:mt-0 lg:w-64\">\n        REPLY\n      </Button>\n    </Link>\n  );\n  // <span title={isAdmin && !useVolunteerView && `Real name: ${message.senderName}`}>\n  //   {isAdmin && !useVolunteerView && <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />}{' '}\n  //   {`${useAdminView ? message.senderAlias || message.sender : defaultSender}`}\n  // </span>\n  let from = (\n    <span>\n      {/* {isEmployee && !useVolunteerView && (\n            <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />\n          )}{' '} */}\n      {defaultSender}\n    </span>\n  );\n\n  // let to = (\n  //   <span title={useAdminView ? `Real name: ${message.recipientName}` : null}>\n  //     {isAdmin && !useVolunteerView && <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />}{' '}\n  //     {message.recipientAlias || message.recipient}\n  //   </span>\n  // );\n  // if (useAdminView && (message.recipientGroups || []).includes('Admin')) {\n  //   to = <span title={`Alias: ${message.recipientAlias}`}>{message.recipientName || message.recipient}</span>;\n  // }\n\n  if (useAdminView && isMessageFromAdmin(message)) {\n    const senderTitle = `Alias: ${message.senderAlias}`;\n    from = <span title={senderTitle}>{message.senderName || defaultSender}</span>;\n  } else if (useAdminView) {\n    const senderTitle = `Real name: ${message.senderName}`;\n    from = (\n      <span title={senderTitle}>\n        {!useVolunteerView && <FontAwesomeIcon icon={icon({ name: 'user-secret', style: 'duotone' })} />}{' '}\n        {message.senderAlias || defaultSender}\n      </span>\n    );\n  } else {\n  }\n  const content = (\n    <div className=\"w-full px-2 py-4 my-2 bg-gray-100 lg:px-8 lg:py-8\">\n      {/* <MessageToMeta message={message} options={{ useAdminView }} /> */}\n      <ul className=\"message-reader\">\n        <li className=\"my-1\">\n          {/* <p> */}\n          <b className=\"text-pursuit-gray\">To: </b>\n          {/* {to} */}\n          <MessageToDetail message={message} options={{ useAdminView }} />\n          {/* <span title={isAdmin && !useVolunteerView && `Alias: ${message.recipientAlias}`}>\n              {`${isAdmin && !useVolunteerView ? message.recipientName : message.recipientAlias || message.recipient}`}\n            </span> */}\n          {/* </p> */}\n        </li>\n        <li className=\"my-1\">\n          <p>\n            <b className=\"text-pursuit-gray\">From: </b>\n            {from}\n          </p>\n        </li>\n        <li className=\"my-1\">\n          <p>\n            <b className=\"text-pursuit-gray\">Title: </b>\n            {`${(message.attributes && message.attributes.customTitle) || message.title}`}\n          </p>\n        </li>\n        <li className=\"my-1\">\n          <p>\n            <b className=\"text-pursuit-gray\">Subject: </b>\n            {`${message.subject}`}\n          </p>\n        </li>\n        <li className=\"my-1\">\n          {/* <b className=\"text-pursuit-gray\">Message: </b> */}\n          <hr className=\"mt-2\" />\n          {/* <p className=\"p-2\"> */}\n          <span\n            className=\"p-2\"\n            dangerouslySetInnerHTML={{\n              __html: parseMarkdown(message.message),\n            }}></span>\n          {/* </p> */}\n          <hr className=\"mb-2\" />\n        </li>\n      </ul>\n      <div className=\"flex flex-col-reverse justify-between mt-8 lg:flex-row\">\n        <div className=\"w-full mt-4 lg:mt-0 lg:w-auto\">{/* {backButton} */}</div>\n        {/* {replyButton} */}\n        {/* {myIds.length > 0 && !myIds.includes(message.sender) && ( */}\n        {myIds.length > 0 && myIds.includes(message.recipient) && (\n          <div className=\"bg-white border border-gray-200 rounded-sm p-4 w-full mb-4\">\n            {showSentConfirmation && (\n              <PopUpConfirmation\n                title=\"Message Sent\"\n                content={`Your message has been sent.`}\n                noCancel\n                onConfirm={() => {\n                  // Navigate to the messaging page\n                  history.push('/messaging');\n                }}\n                confirmText=\"OK\"\n                confirmLoadingText=\"OK\"\n                className=\"w-11/12 lg:w-auto\"\n                destructive\n              />\n            )}\n\n            <MessageForm\n              // notification={message}\n              notification={{\n                subject: formatReplySubject(message.subject),\n                replyTo: message.id,\n                title: message.title,\n                recipients: [{ recipient: message.recipient }],\n              }}\n              isReply={true}\n              createLabel=\"Reply\"\n              cancelLink={'/messaging'}\n              cancelCallback={e => {\n                // e.preventDefault();\n                history.goBack();\n              }}\n              createCallback={() => setShowSentConfirmation(true)}\n              noUserSelector={true}\n              subjectDisabled={true}\n              noTitle={true}\n              noSubject={true}\n              confirmSend\n            />\n          </div>\n        )}\n      </div>\n      <MessageThread\n        rootMessageId={message.rootMessageId || message.id}\n        displaySeen={useAdminView}\n        currentMessageId={message.id}\n        user={user}\n        showReply={true}\n        showLoadingSkeleton={false}\n        // showRootIfSingle\n      />\n      {/* <p>{JSON.stringify({ message })}</p> */}\n      {/* <p>{JSON.stringify({ user })}</p> */}\n    </div>\n  );\n\n  return (\n    <Container width=\"lg:w-3/4\" margin=\"m-3 lg:m-auto\" className=\"relative px-3 py-4 lg:px-6 lg:py-8\">\n      {displayDeleteConfirmation && (\n        <PopUpConfirmation\n          title=\"Delete Message\"\n          content={`Are you sure you want to delete this message?`}\n          onCancel={toggleDeleteConfirmation}\n          onConfirm={() => {\n            setDeleting(true);\n            deleteMessage(message.id, false);\n            setTimeout(() => {\n              setDeleting(false);\n              history.push('/messaging');\n            }, 2000);\n          }}\n          confirmText=\"DELETE\"\n          confirmLoading={deleting}\n          confirmLoadingText=\"DELETING\"\n          className=\"w-11/12 lg:w-auto\"\n          destructive\n        />\n      )}\n      {headerSection}\n      {content}\n    </Container>\n  );\n};\n\nexport default MessageViewSent;\n","import React from 'react';\nimport { Switch, Route, Redirect } from 'react-router-dom';\n\nimport { Dashboard, Investigation, ActiveCases, Success } from '../pages/private';\nimport { MessageRead, MessageIndex, MessageCreate } from '../pages/employee/Messaging';\n// import { MessageIndex } from '../pages/employee/Messaging';\n\nconst VolunteerRouting = () => (\n  <Switch>\n    <Route exact path={['/', '/dashboard']}>\n      <Dashboard />\n    </Route>\n\n    <Route path=\"/messaging/read/:messageId\">\n      <MessageRead />\n    </Route>\n    <Route path=\"/messaging/create\">\n      <MessageCreate />\n    </Route>\n    <Route path=\"/messaging\">\n      <MessageIndex />\n    </Route>\n\n    <Route path=\"/investigation/:idParam\">\n      <Investigation />\n    </Route>\n\n    <Route path=\"/active-cases\">\n      <ActiveCases />\n    </Route>\n\n    <Route path=\"/success\">\n      <Success />\n    </Route>\n\n    <Route path=\"*\">\n      <Redirect to=\"/\" />\n    </Route>\n  </Switch>\n);\n\nexport default VolunteerRouting;\n","import React, { useContext, useState, useEffect, useCallback } from 'react';\nimport { useParams, useHistory } from 'react-router-dom';\nimport { v4 as uuidv4 } from 'uuid';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { toast } from 'react-toastify';\nimport * as Icons from 'react-icons/fa';\nimport debounce from 'lodash.debounce';\nimport Switch from 'react-switch';\nimport { employeeUpdateCase, approveCase, returnCase, unapproveCase } from '../../../generated/graphql/mutations';\nimport { getCase } from '../../../generated/graphql/queries';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext';\nimport { CaseStatus, AwardTypes, ESCORT_AD } from '../../../constants';\nimport { validateOnApprove, validateOnReturn } from '../../../helpers/caseForms/caseValidation';\nimport { initialWebSourceState } from '../../../helpers/caseForms/initialFormStates';\nimport { useQueryState } from '../../../helpers/useQueryState';\n\nimport {\n  Container,\n  MobileDropdown,\n  Button,\n  PopUpConfirmation,\n  Spinner,\n  ReviewForm,\n  ReportBuilder,\n  PersonalInfoForm,\n  EscortAdForm,\n  WebSourceForm,\n  MessageForm,\n} from '../../../components';\nimport { useUser } from '../../../contexts/userContext';\nimport { getInitialCropFromCroppedAreaPercentages } from 'react-easy-crop';\n\nimport { compileSteps } from '../../../components/ReviewForm/compileSteps';\nimport { usesOldEscortAdFormat } from '../../../helpers/caseForms/utilHelpers';\n\nconst DEBOUNCE_SAVE_DELAY_MS = 3000;\n\nconst CaseReview = () => {\n  const history = useHistory();\n\n  const [, setAlert] = useContext(NotificationContext);\n\n  const { idParam: id } = useParams();\n  const { user } = useUser();\n\n  const [caseState, setCaseState] = useState();\n  const [compiledSteps, setCompiledSteps] = useState([]);\n\n  const [saving, setSaving] = useState(false);\n  const [loading, setLoading] = useState(true);\n\n  const [formNumber, setFormNumber] = useState(2);\n  const [sourceIndex, setSourceIndex] = useState(0);\n  const [numSources, setNumSources] = useState(0);\n\n  const [autoSaveReady, setAutoSaveReady] = useState(false);\n  const [autoSaveEnabled, setAutoSaveEnabled] = useState(true);\n\n  const [approveReady, setApproveReady] = useState(false);\n  const [approving, setApproving] = useState(false);\n\n  const [returnReady, setReturnReady] = useState(false);\n  // Checked when state changes to determine if the form is valid\n  const [returnValid, setReturnValid] = useState(false);\n  const [returning, setReturning] = useState(false);\n\n  const [unapproveReady, setUnapproveReady] = useState(false);\n  const [unapproving, setUnapproving] = useState(false);\n\n  const [title, setTitle] = useState('');\n\n  const [showAddStepForm, setShowAddStepForm] = useState(false);\n  const [sendMessageOnAction, setSendMessageOnAction] = useState(true);\n  const [sendMessageOnApproval, setSendMessageOnApproval] = useState(true);\n  // Toggle sending message on approve/return\n  const toggleSendMessageOnAction = () => {\n    setSendMessageOnAction(current => !current);\n  };\n\n  // Form number to return to after saving a case\n  const [returnFormNumber, setReturnFormNumber] = useQueryState('returnForm');\n\n  useEffect(() => {\n    const enabled = localStorage.getItem('autoSaveEnabled');\n\n    if (enabled && enabled.toLocaleLowerCase() === 'false') {\n      setAutoSaveEnabled(false);\n    }\n  }, []);\n\n  const autoSave = useCallback(\n    debounce(async data => {\n      if (autoSaveReady && autoSaveEnabled) {\n        save({ data, noAlert: true });\n      }\n    }, DEBOUNCE_SAVE_DELAY_MS),\n    [autoSaveReady, autoSaveEnabled]\n  );\n\n  // When return ready changes, check if the form is valid\n  // useEffect(() => {\n  //   if (returnReady) {\n  //     const valid = validateOnReturn(setAlert, caseState);\n  //     setReturnValid(valid);\n  //   }\n  // }, [returnReady, caseState]);\n\n  useEffect(() => {\n    const getCaseRecord = async () => {\n      try {\n        const result = await API.graphql(\n          graphqlOperation(getCase, {\n            id,\n          })\n        );\n\n        setAutoSaveReady(true);\n\n        const caseData = result.data.getCase;\n\n        storeState(caseData);\n        setTitle(`Case #${result.data.getCase.caseNumber}`);\n\n        const { status } = caseData;\n\n        if (status === CaseStatus.Approved) {\n          setFormNumber(3);\n        } else {\n          setFormNumber(2);\n        }\n      } catch (error) {\n        console.error('ERROR: ', error);\n      }\n    };\n\n    getCaseRecord();\n  }, [id]);\n\n  useEffect(() => {\n    if (caseState && caseState.webSources) {\n      setNumSources(1 + caseState.webSources.length);\n    } else {\n      setNumSources(0);\n    }\n  }, [caseState]);\n\n  useEffect(() => {\n    if (!caseState || !caseState.webSources) {\n      return;\n    }\n    const awards = caseState.awardedPoints ? [...caseState.awardedPoints] : [];\n    const feedback = caseState.feedbackComments ? [...caseState.feedbackComments] : [];\n    const steps = [];\n    if (caseState.escortAd.url) {\n      steps.push({\n        title: 'Escort Ad',\n        body: caseState.escortAd,\n        id: ESCORT_AD,\n        feedback: feedback.find(x => x.stepId === ESCORT_AD)?.feedback || '',\n        award: awards.find(x => x.stepId === ESCORT_AD)?.awardType || null,\n      });\n    }\n    const webSources = caseState.webSources.map(source => ({\n      title: source.website ? source.website : '[no source type selected]',\n      body: source,\n      id: source.id,\n      feedback: feedback.find(x => x.stepId === source.id)?.feedback || '',\n      award: awards.find(x => x.stepId === source.id)?.awardType || null,\n    }));\n    const staffSources = caseState.staffSources\n      ? caseState.staffSources.map(ss => {\n          const { author, previousSourceId, ...commonFields } = ss;\n\n          return {\n            title: ss.website ? ss.website : '[no source type selected]',\n            body: commonFields,\n            previousSourceId,\n            author,\n            id: ss.id,\n            feedback: feedback.find(x => x.stepId === ss.id)?.feedback || '',\n            award: awards.find(x => x.stepId === ss.id)?.awardType || null,\n          };\n        })\n      : [];\n    const cs = compileSteps(steps, webSources, staffSources, caseState.sourceOrder);\n\n    console.log({ cs });\n    setCompiledSteps(cs);\n  }, [caseState]);\n\n  useEffect(() => {\n    if (\n      caseState &&\n      caseState.webSources &&\n      sourceIndex > caseState.webSources.length + (caseState.staffSources ? caseState.staffSources.length : 0)\n    ) {\n      if (formNumber < 2) {\n        setFormNumber(formNumber + 1);\n      }\n    }\n  }, [caseState, formNumber, sourceIndex]);\n\n  useEffect(() => {\n    if (caseState) {\n      autoSave(caseState, false);\n    }\n  }, [caseState, autoSave]);\n\n  const tabNames = ['Personal Information', 'Case Sources', 'Review Details', 'Case Report'];\n\n  const storeState = record => {\n    const loadedCaseState = JSON.parse(JSON.stringify(record));\n\n    setCaseState(loadedCaseState);\n    setLoading(false);\n  };\n\n  const updateCaseRecord = async record => {\n    try {\n      await API.graphql(\n        graphqlOperation(employeeUpdateCase, {\n          input: record,\n        })\n      );\n\n      return true;\n    } catch (error) {\n      console.error('Error on updating case', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error Saving Case',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n\n      return false;\n    }\n  };\n\n  const save = async params => {\n    // console.log('Saving case', { params });\n    let data = null;\n    let noAlert = false;\n\n    if (params) {\n      ({ data, noAlert } = params);\n    }\n\n    setSaving(true);\n\n    removeAlert();\n\n    const record = JSON.parse(JSON.stringify(!data ? { ...caseState } : { ...data }));\n    console.log('Saving case', { record });\n\n    const saved = await updateCaseRecord({\n      id,\n      firstName: record.firstName,\n      middleName: record.middleName,\n      lastName: record.lastName,\n      age: record.age,\n      city: record.city,\n      state: record.state,\n      details: record.details,\n      escortAd: record.escortAd,\n      webSources: record.webSources,\n      staffSources: record.staffSources || null,\n      investigatorNotes: record.investigatorNotes || null,\n      awardClassificationOption: record.awardClassificationOption || null,\n      feedbackComments: record.feedbackComments || [],\n      awardedPoints: record.awardedPoints || [],\n      // sourceOrder: record.sourceOrder || Array.isArray(compiledSteps) ? compiledSteps.map(({ id }) => id) : [1],\n      sourceOrder: record.sourceOrder,\n    });\n\n    if (!noAlert && saved) {\n      toast.success('Successfully Saved', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n    }\n\n    setSaving(false);\n\n    return saved;\n  };\n\n  const approveCaseAndAwardPoints = async () => {\n    try {\n      setApproving(true);\n\n      const caseStateIsValid = validateOnApprove(setAlert, caseState);\n\n      if (caseStateIsValid) {\n        const saved = await save({ noAlert: true });\n\n        if (saved) {\n          const result = await API.graphql(\n            graphqlOperation(approveCase, {\n              id,\n            })\n          );\n\n          setCaseState({ ...caseState, ...result.data.approveCase });\n\n          toast.success('Case Approved', {\n            progress: false,\n            className: 'bg-green-500 text-white',\n            autoClose: 1500,\n            closeButton: false,\n            icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n          });\n        }\n      }\n    } catch (error) {\n      console.error('Error approving case: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'An Error occurred approving the case',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setApproving(false);\n    setApproveReady(false);\n  };\n\n  const returnToVolunteer = async () => {\n    try {\n      setReturning(true);\n\n      // const caseStateIsValid = validateOnReturn(setAlert, caseState);\n      // Returning is only done with message form which provides feedback\n      const caseStateIsValid = true;\n\n      if (caseStateIsValid) {\n        const saved = await save({ noAlert: true });\n\n        if (saved) {\n          await API.graphql(\n            graphqlOperation(returnCase, {\n              id,\n            })\n          );\n\n          toast.success('Case Returned', {\n            progress: false,\n            className: 'bg-green-500 text-white',\n            autoClose: 1500,\n            closeButton: false,\n            icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n          });\n\n          history.replace('/');\n        }\n      }\n    } catch (error) {\n      console.error('Error returning case: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'An Error occurred returning the case',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setReturning(false);\n    setReturnReady(false);\n  };\n\n  const unapproveAndReturnToVolunteer = async () => {\n    try {\n      // setReturning(true);\n      setUnapproving(true);\n\n      // const caseStateIsValid = validateOnReturn(setAlert, caseState);\n      // Returning is only done with message form which provides feedback\n      const caseStateIsValid = true;\n\n      if (caseStateIsValid) {\n        const saved = await save({ noAlert: true });\n\n        if (saved) {\n          await API.graphql(\n            graphqlOperation(unapproveCase, {\n              id,\n            })\n          );\n\n          toast.success('Case Unapproved', {\n            progress: false,\n            className: 'bg-green-500 text-white',\n            autoClose: 1500,\n            closeButton: false,\n            icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n          });\n\n          history.replace('/');\n        }\n      }\n    } catch (error) {\n      console.error('Error unapproving case: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'An Error occurred unapproving the case',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setUnapproving(false);\n    setUnapproveReady(false);\n  };\n\n  const autoSaveToggle = enabled => {\n    setAutoSaveEnabled(enabled);\n\n    localStorage.setItem('autoSaveEnabled', enabled.toString());\n  };\n\n  const removeAlert = () => {\n    setAlert({\n      type: 'SET_NOTIFICATION',\n      payload: {\n        occurs: false,\n      },\n    });\n  };\n\n  const prevForm = () => {\n    if (autoSaveEnabled) {\n      if (!save({ noAlert: true })) {\n        return;\n      }\n    }\n\n    if (formNumber === 1 && sourceIndex > 0) {\n      setSourceIndex(sourceIndex - 1);\n\n      return;\n    }\n\n    if (formNumber === 2) {\n      setSourceIndex(0);\n    }\n\n    setFormNumber(formNumber - 1);\n  };\n\n  const nextForm = async () => {\n    const saved = await save();\n\n    if (!saved) {\n      return;\n    }\n\n    if (formNumber === 1 && sourceIndex < numSources - 1) {\n      setSourceIndex(sourceIndex + 1);\n\n      return;\n    }\n\n    if (formNumber === 0) {\n      setSourceIndex(0);\n    }\n\n    setFormNumber(formNumber + 1);\n  };\n\n  const saveAndTo = async tabNum => {\n    if (autoSaveEnabled) {\n      const saved = await save({ noAlert: true });\n\n      if (!saved) {\n        return;\n      }\n    }\n\n    setSourceIndex(0);\n    setFormNumber(tabNum);\n  };\n\n  const addStaffSource = async () => {\n    const newWebSource = JSON.parse(JSON.stringify(initialWebSourceState));\n\n    newWebSource.id = uuidv4();\n\n    const updatedWebSources = caseState.staffSources ? JSON.parse(JSON.stringify(caseState.staffSources)) : [];\n    const lastWebSourceId =\n      Array.isArray(caseState.webSources) && caseState.webSources.length > 0\n        ? caseState.webSources[caseState.webSources.length - 1].id\n        : null;\n\n    const lastStaffSourceId = updatedWebSources.length > 0 ? updatedWebSources[updatedWebSources.length - 1].id : null;\n\n    newWebSource.previousSourceId = lastStaffSourceId || lastWebSourceId;\n\n    // This put things in the wrong spot\n    // const potentialLastStaffSource = updatedWebSources.find(\n    //   ({ previousSourceId }) => previousSourceId === lastWebSourceId\n    // );\n\n    // if (potentialLastStaffSource) {\n    //   newWebSource.previousSourceId = potentialLastStaffSource.id;\n    // }\n\n    if (user && user.id) {\n      newWebSource.author = user.id;\n\n      // if (updatedWebSources.length > 0) {\n      //   previousSourceId = updatedWebSources[updatedWebSources.length - 1].id;\n      // }\n      // newWebSource.previousSourceId = previousSourceId;\n      // newWebSource.staffName = [user.firstName, user.lastName].filter(Boolean).join(' ');\n    }\n    const updatedAwardedPoints = caseState.awardedPoints ? JSON.parse(JSON.stringify(caseState.awardedPoints)) : [];\n\n    updatedWebSources.push(newWebSource);\n    // console.log('Updated web sources', { updatedWebSources });\n\n    updatedAwardedPoints.push({\n      stepId: newWebSource.id,\n      awardType: AwardTypes.NoPoints,\n    });\n    const newCaseState = {\n      ...caseState,\n      // awardClassificationOption: caseState.awardClassificationOption || null,\n      staffSources: [...updatedWebSources],\n      awardedPoints: [...updatedAwardedPoints],\n    };\n\n    setCaseState(newCaseState);\n    setShowAddStepForm(true);\n\n    // setSourceIndex(numSources);\n    // setNumSources(numSources + 1);\n\n    // setFormNumber(1);\n  };\n  const addSourceButton = (\n    <Button solidBlue padding=\"px-4 py-1\" className=\"my-2 mr-8\" onClick={addStaffSource} /* disabled={disableEdit} */>\n      <span className=\"p-0 m-0 nowrap\" style={{ whiteSpace: 'nowrap' }}>\n        Add New Source\n      </span>\n    </Button>\n  );\n\n  const saveStaffSourceButton = (\n    <Button\n      solidBlue\n      padding=\"lg:ml-8\"\n      className=\"mt-4 lg:w-88 lg:mt-0\"\n      onClick={() => {\n        setShowAddStepForm(false);\n        saveAndTo(2);\n      }} /* disabled={disableEdit} */\n    >\n      <span className=\"p-0 m-0 nowrap\" style={{ whiteSpace: 'nowrap' }}>\n        SAVE\n      </span>\n    </Button>\n  );\n\n  const addActions = !showAddStepForm && (\n    <>\n      {/* <div className=\"flex flex-col-reverse lg:flex-row-reverse\"> */}\n      {addSourceButton}\n      {/* {reOrderButton} */}\n      {/* {addNoteButton} */}\n      {/* </div> */}\n    </>\n  );\n\n  const defaultTab = (formNum, text) => (\n    <Button\n      tab\n      onClick={() => saveAndTo(formNum, true)}\n      className=\"px-0 text-lg border-b-4 border-transparent rounded-none text-pursuit-gray focus:outline-none hover:border-pursuit-red\">\n      {text}\n    </Button>\n  );\n\n  const activateTab = tabButton => (\n    <div className=\"relative flex flex-col\">\n      {tabButton}\n      <div className=\"absolute inset-y-0 w-full border-b-4 border-pursuit-red\" />\n    </div>\n  );\n\n  let personalInfoTab = defaultTab(0, 'Personal Information');\n  let sourcesTab = defaultTab(1, 'Case Sources');\n  let reviewTab = defaultTab(2, 'Review Details');\n  let reportTab = defaultTab(3, 'Case Report');\n\n  let prevButton = (\n    <Button\n      className=\"flex items-center mb-12 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue\"\n      onClick={prevForm}>\n      <Icons.FaChevronLeft size={18} className=\"mr-4\" />\n      BACK\n    </Button>\n  );\n\n  let nextButton = (\n    <Button\n      className=\"flex items-center mb-12 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue\"\n      onClick={nextForm}>\n      SAVE AND NEXT\n      <Icons.FaChevronRight size={18} className=\"ml-4\" />\n    </Button>\n  );\n  const saveEditButton = (\n    <Button\n      className=\"flex items-center mb-12 font-semibold lg:text-lg focus:outline-none text-guardian-darkblue\"\n      onClick={() => {\n        console.log('save edit button clicked', { returnFormNumber });\n        setReturnFormNumber(null);\n\n        return saveAndTo(+returnFormNumber);\n      }}>\n      SAVE\n      <Icons.FaChevronRight size={18} className=\"ml-4\" />\n    </Button>\n  );\n\n  const approveButton = (\n    <Button\n      solidBlue\n      onClick={() => {\n        setApproveReady(true);\n      }}\n      className=\"w-full mt-4 text-base lg:mt-0 lg:w-64\">\n      APPROVE CASE\n    </Button>\n  );\n\n  const reApproveButton = (\n    <Button\n      solidBlue\n      onClick={() => {\n        setApproveReady(true);\n      }}\n      className=\"w-full mt-4 text-base lg:mt-0 lg:w-64\">\n      REAPPROVE CASE\n    </Button>\n  );\n\n  const returnButton = (\n    <Button solidRed onClick={() => setReturnReady(true)} className=\"w-full mt-4 text-base lg:mt-0 lg:w-64 lg:mr-6\">\n      RETURN TO VOLUNTEER\n    </Button>\n  );\n\n  const unapproveButton = (\n    <Button solidRed onClick={() => setUnapproveReady(true)} className=\"w-full mt-4 text-base lg:mt-0 lg:w-64 lg:mr-6\">\n      RETURN TO VOLUNTEER\n    </Button>\n  );\n\n  const editSource = index => {\n    if (!save()) {\n      return;\n    }\n    console.log('Edit source', { index });\n    setReturnFormNumber(2);\n\n    setSourceIndex(index);\n    setFormNumber(1);\n  };\n\n  // const messageButton = (\n  //   <span\n  //     // solidBlue\n  //     onClick={() => {\n  //       const title = `Case Feedback`;\n  //       const message = `The case ${caseState.caseNumber}...`;\n  //       history.push(`/messaging/create?recipients=${caseState.owner}&message=${message}&title=${title}`);\n  //     }}>\n  //     Message\n  //   </span>\n  // );\n\n  const renderReviewButtons = () => {\n    if (caseState && caseState.status === CaseStatus.Submitted) {\n      return (\n        <div className=\"flex flex-col-reverse lg:flex-row \">\n          {/* {messageButton} */}\n          {returnButton}\n          {approveButton}\n        </div>\n      );\n    }\n\n    if (caseState && caseState.status === CaseStatus.Resubmitted) {\n      return (\n        <div className=\"flex flex-col\">\n          <div className=\"flex flex-col lg:flex-row \">\n            {returnButton}\n            {reApproveButton}\n          </div>\n        </div>\n      );\n    }\n\n    if (caseState && caseState.status === CaseStatus.Approved) {\n      return (\n        <div className=\"flex flex-col\">\n          <div className=\"flex flex-col lg:flex-row lg:-mr-6\">\n            {unapproveButton}\n            {/* {reApproveButton} */}\n          </div>\n        </div>\n      );\n    }\n\n    return <></>;\n  };\n\n  let form = null;\n\n  if (caseState && caseState._deleted === true) {\n    return (\n      <Container\n        width=\"flex flex-col w-96pr h-88 lg:w-3/4 justify-center items-center\"\n        margin=\"m-3 lg:m-auto\"\n        className=\"relative px-6 py-8\">\n        <div className=\"flex flex-col items-center justify-center w-120\">\n          <div className=\"mb-6 text-xl font-bold text-pursuit-gray\">This case has been deleted.</div>\n        </div>\n      </Container>\n    );\n  }\n\n  switch (formNumber) {\n    case 0:\n      personalInfoTab = activateTab(personalInfoTab);\n      form = (\n        <PersonalInfoForm\n          caseState={caseState}\n          setCaseState={setCaseState}\n          key={`personalinfo-${caseState.caseNumber}`}\n          reviewing\n        />\n      );\n      prevButton = <div />;\n      break;\n    case 1:\n      sourcesTab = activateTab(sourcesTab);\n      let staffSource = false;\n      const editStepId = compiledSteps[sourceIndex]?.id;\n      // const selectedSource = compiledSteps[webSourceIndex];\n      let selectedIndex = (caseState.webSources || []).findIndex(s => s.id === editStepId);\n\n      if (selectedIndex === -1) {\n        selectedIndex = (caseState.staffSources || []).findIndex(s => s.id === editStepId);\n        if (selectedIndex !== -1) {\n          staffSource = true;\n        }\n      }\n\n      // console.log('sourceIndex', sourceIndex, selectedIndex);\n      // console.log('test', { selectedIndex, compiledSteps, sourceIndex, caseState, staffSource, editStepId });\n      const escortAdEmpty = true;\n      // const escortAdEmpty = !usesOldEscortAdFormat(caseState);\n      // if (escortAdEmpty) {\n      //   selectedIndex += 1;\n      // }\n      if (selectedIndex === -1) {\n        form = <p>Unable to find source. Source ID {editStepId}</p>;\n        break;\n      }\n\n      form =\n        !escortAdEmpty && sourceIndex === 0 ? (\n          <EscortAdForm\n            caseState={caseState}\n            setCaseState={setCaseState}\n            key={`escort-${caseState.caseNumber}`}\n            reviewing\n          />\n        ) : (\n          <WebSourceForm\n            caseState={caseState}\n            setCaseState={setCaseState}\n            stepNumber={sourceIndex + 1}\n            // webSourceIndex={sourceIndex - 1}\n            // webSourceIndex={caseState.staffSources.length - 1}\n            webSourceIndex={\n              // sourceIndex <= caseState.webSources.length\n              //   ? sourceIndex - 1\n              //   : sourceIndex - caseState.webSources.length - 1\n              selectedIndex\n              // caseState.webSources.findIndex(s => s.id === compiledSteps[sourceIndex]?.id) - 1 ||\n              // caseState.staffSources.findIndex(s => s.id === compiledSteps[sourceIndex]?.id) - 1\n            }\n            // staffSource={sourceIndex > caseState.webSources.length}\n            // staffSource={(caseState.staffSources || []).findIndex(s => s.id === compiledSteps[sourceIndex].id) !== -1}\n            staffSource={staffSource}\n            setGlobalIndex={setSourceIndex}\n            key={`websource-${caseState.webSources[sourceIndex - 1]?.id}`}\n            reviewing\n          />\n        );\n      break;\n\n    case 2:\n      reviewTab = activateTab(reviewTab);\n\n      form = showAddStepForm ? (\n        <WebSourceForm\n          caseState={caseState}\n          setCaseState={setCaseState}\n          stepNumber={caseState.webSources.length + caseState.staffSources.length + 1}\n          webSourceIndex={caseState.staffSources.length - 1}\n          saveAndAddButton={saveStaffSourceButton}\n          removeLabel=\"CANCEL\"\n          // Functions needed to handle delete after its been created\n          setFormNumber={_ => {}}\n          setGlobalIndex={_ => {\n            setShowAddStepForm(false);\n          }}\n          staffSource\n        />\n      ) : (\n        <>\n          <ReviewForm\n            caseState={caseState}\n            setCaseState={setCaseState}\n            stepActions={addActions}\n            editAction={editSource}\n            // setTitle={setTitle}\n            // approveCaseAndAwardPoints={approveCaseAndAwardPoints}\n          />\n        </>\n      );\n      nextButton = !showAddStepForm ? renderReviewButtons() : null;\n      break;\n\n    case 3:\n      reportTab = activateTab(reportTab);\n      form = <ReportBuilder id={id} caseState={caseState} setCaseState={setCaseState} setTitle={setTitle} />;\n      // nextButton = <></>;\n      // An approved case might need to be returned\n      nextButton = renderReviewButtons();\n      break;\n    default:\n      break;\n  }\n\n  const getCaseState = () => {\n    const { status } = caseState;\n\n    switch (status) {\n      case CaseStatus.Active:\n        return 'In Progress';\n      case CaseStatus.Approved:\n        return 'Approved';\n      case CaseStatus.Returned:\n        return 'Returned';\n      case CaseStatus.Submitted:\n        return 'Submitted for Review';\n      case CaseStatus.Resubmitted:\n        return 'Resubmitted for Review';\n      default:\n        return '-';\n    }\n  };\n\n  const approveFormContent = caseState && (\n    <>\n      <p>Are you sure you are ready to approve this case and award points to the submitter?</p>\n      <div>\n        <input\n          type=\"checkbox\"\n          checked={sendMessageOnApproval}\n          onChange={e => setSendMessageOnApproval(e.target.checked)}\n        />{' '}\n        Send message?\n      </div>\n      {sendMessageOnApproval && (\n        <MessageForm\n          notification={{\n            recipients: [{ recipient: caseState.owner }],\n            title: 'Case Feedback',\n            subject: `Case ${caseState.caseNumber}`,\n            message: `Your case has been approved. You have been awarded points for your submission.\\n\nPlease review any individual source/step feedback within your case if necessary.\\n\nThank you for your contribution!`,\n          }}\n          // isReply={isReply}\n          createLabel=\"Approve\"\n          clearLabel=\"Reset\"\n          cancelLabel={'Cancel'}\n          enableCreate={\n            (caseState.awardClassificationOption &&\n              Array.isArray(caseState.awardedPoints) &&\n              caseState.awardedPoints.length ==\n                caseState.webSources.length +\n                  (caseState.staffSources ? caseState.staffSources.length : 0) +\n                  (caseState.escortAd.url ? 1 : 0)) ||\n            caseState.status === CaseStatus.Resubmitted\n          }\n          // cancelCallback={() => setReturnReady(false)}\n          // createCallback={() => alert(\"Created\")}\n          // enableCreate={returnValid}\n          // createCallback={() => returnToVolunteer()}\n          cancelCallback={() => setApproveReady(false)}\n          createCallback={() => approveCaseAndAwardPoints()}\n          cancelLink={'#'}\n          noUserSelector\n          noTitle\n          subjectDisabled\n        />\n      )}\n      {(!caseState.awardClassificationOption ||\n        !Array.isArray(caseState.awardedPoints) ||\n        !(caseState.awardedPoints.length == caseState.webSources.length + 1)) &&\n        caseState.status !== CaseStatus.Resubmitted && (\n          <div style={{ color: '#666', textAlign: 'right' }}>Points must be assigned before approving the case.</div>\n        )}\n    </>\n  );\n\n  const returnFormContent = caseState && (\n    // const title = `Case Feedback`;\n    //       const message = `The case ${caseState.caseNumber}...`;\n    <div style={{ width: '40em' }}>\n      <p>Are you sure you want to return this case to the volunteer without awarding points?</p>\n      {/* <div>\n        Send message?{' '}\n        <input type=\"checkbox\" checked={sendMessageOnAction} onChange={e => setSendMessageOnAction(e.target.checked)} />\n      </div> */}\n      {sendMessageOnAction && (\n        <MessageForm\n          notification={{\n            recipients: [{ recipient: caseState.owner }],\n            title: 'Case Feedback',\n            subject: `Case ${caseState.caseNumber}`,\n            message:\n              'Please review the individual source feedback from our staff screening of your case submission. You can access this by opening the returned case and selecting the \"Expand All\" within the \"Review Steps\" section. Once you\\'ve completed the corrections, you can resubmit the case for another review by us. If you have questions about our feedback, please click Reply to this message and we will answer your questions accordingly. Thanks for your continued efforts.',\n          }}\n          // isReply={isReply}\n          createLabel=\"Return\"\n          cancelLabel={'Cancel'}\n          clearLabel=\"Reset\"\n          cancelCallback={() => setReturnReady(false)}\n          // createCallback={() => alert(\"Created\")}\n          // enableCreate={returnValid}\n          createCallback={() => returnToVolunteer()}\n          cancelLink={'#'}\n          noUserSelector\n          noTitle\n          subjectDisabled\n        />\n      )}\n    </div>\n  );\n\n  const unapproveFormContent = caseState && (\n    // const title = `Case Feedback`;\n    //       const message = `The case ${caseState.caseNumber}...`;\n    <div style={{ width: '40em' }}>\n      <p>Are you sure you want to return this case to the volunteer and remove awarding points?</p>\n      {/* <div>\n        Send message?{' '}\n        <input type=\"checkbox\" checked={sendMessageOnAction} onChange={e => setSendMessageOnAction(e.target.checked)} />\n      </div> */}\n      {sendMessageOnAction && (\n        <MessageForm\n          notification={{\n            recipients: [{ recipient: caseState.owner }],\n            title: 'Case Feedback',\n            subject: `Case ${caseState.caseNumber}`,\n            message: `After further review of the submitted and approved case, it was determined that it was an error on our part to have approved your case. We have changed the status of the case to \"Returned\". The points that have been previously awarded for this case have been removed. We apologize for the oversight.\n\nPlease review any individual source/step feedback within your case if necessary. If you have any questions, please click Reply to this message and we will answer your questions accordingly. Thanks for your continued efforts.`,\n          }}\n          // isReply={isReply}\n          createLabel=\"Return\"\n          cancelLabel={'Cancel'}\n          clearLabel=\"Reset\"\n          cancelCallback={() => setUnapproveReady(false)}\n          // createCallback={() => alert(\"Created\")}\n          enableCreate={!unapproving}\n          createCallback={() => unapproveAndReturnToVolunteer()}\n          cancelLink={'#'}\n          noUserSelector\n          noTitle\n          subjectDisabled\n        />\n      )}\n    </div>\n  );\n\n  return loading ? (\n    <Container\n      width=\"flex flex-col w-96pr h-88 lg:w-3/4 justify-center items-center\"\n      margin=\"m-3 lg:m-auto\"\n      className=\"relative px-6 py-8\">\n      <div className=\"flex flex-col items-center justify-center w-120\">\n        <div className=\"mb-6 text-xl font-bold text-pursuit-gray\">Loading Case Details</div>\n        <Spinner />\n      </div>\n    </Container>\n  ) : (\n    <>\n      {approveReady ? (\n        <PopUpConfirmation\n          noCancel={sendMessageOnApproval}\n          noConfirm={sendMessageOnApproval}\n          title=\"Confirm Case Approval\"\n          // content=\"Are you sure you are ready to approve this case and award points to the submitter?\"\n          content={approveFormContent}\n          onCancel={() => setApproveReady(false)}\n          onConfirm={() => approveCaseAndAwardPoints()}\n          confirmText=\"APPROVE\"\n          confirmLoading={approving}\n          confirmLoadingText=\"APPROVING\"\n          className=\"w-11/12 lg:w-auto\"\n        />\n      ) : null}\n\n      {returnReady ? (\n        <PopUpConfirmation\n          noCancel={sendMessageOnAction}\n          noConfirm={sendMessageOnAction}\n          title=\"Confirm Case Return\"\n          // content=\"Are you sure you want to return this case to the volunteer without awarding points?\"\n          content={returnFormContent}\n          onCancel={() => setReturnReady(false)}\n          onConfirm={() => returnToVolunteer()}\n          confirmText=\"RETURN\"\n          confirmLoading={returning}\n          confirmLoadingText=\"RETURNING\"\n          className=\"w-11/12 lg:w-auto\"\n        />\n      ) : null}\n\n      {unapproveReady ? (\n        <PopUpConfirmation\n          noCancel={sendMessageOnAction}\n          noConfirm={sendMessageOnAction}\n          title=\"Confirm Case Return (Unapprove)\"\n          // content=\"Are you sure you want to return this case to the volunteer without awarding points?\"\n          content={unapproveFormContent}\n          onCancel={() => {\n            console.log('unapprove cancel');\n            return setUnapproveReady(false);\n          }}\n          onConfirm={() => returnToVolunteer()}\n          confirmText=\"RETURN\"\n          confirmLoading={returning}\n          confirmLoadingText=\"RETURNING\"\n          className=\"w-11/12 lg:w-auto\"\n        />\n      ) : null}\n\n      <div className=\"relative flex flex-col flex-1 w-full lg:my-8\">\n        {saving && (\n          <div className=\"fixed top-0 right-0 hidden p-2 mt-24 lg:block\">\n            <Spinner />\n          </div>\n        )}\n        <Container width=\"lg:w-3/4\" margin=\"m-3 lg:m-auto\" className=\"relative px-3 py-4 lg:px-6 lg:py-8\">\n          <div className=\"p-2 font-bold\">\n            <h1 className=\"text-xl lg:text-4xl text-pursuit-gray\">{title}</h1>\n            <h2 className=\"text-sm text-pursuit-red lg:text-xl\">{getCaseState()}</h2>\n          </div>\n          <div className=\"lg:relative\">\n            <div className=\"flex items-center mt-4 ml-2\">\n              <span className=\"text-pursuit-gray\">Auto Save</span>\n              <Switch\n                onChange={autoSaveToggle}\n                checked={autoSaveEnabled}\n                className=\"ml-2 mr-4\"\n                height={20}\n                width={40}\n              />\n              {/* {messageButton} */}\n            </div>\n\n            <div className=\"flex m-auto mt-2 mb-4 lg:hidden\">\n              <MobileDropdown\n                className=\"w-full h-10 px-2 bg-white shadow\"\n                optionsArray={tabNames}\n                selected={tabNames[formNumber]}\n                selectionCallback={formName => saveAndTo(tabNames.indexOf(formName))}\n              />\n            </div>\n            <div className=\"absolute bottom-0 right-0 flex-row hidden pr-4 mt-4 mb-2 lg: lg:flex\">\n              {personalInfoTab}\n              <span className=\"ml-6\">{sourcesTab}</span>\n              <span className=\"ml-6\">{reviewTab}</span>\n              <span className=\"ml-6\">{reportTab}</span>\n            </div>\n          </div>\n          <div className=\"w-full px-2 py-4 my-2 bg-gray-100 lg:px-8 lg:py-8\">\n            {form}\n            {!showAddStepForm && (\n              <div className=\"flex flex-col-reverse justify-between mt-8 text-xs lg:flex-row\">\n                <div className=\"w-full mt-4 lg:mt-0 lg:w-auto\">{prevButton}</div>\n                {!returnFormNumber ? nextButton : saveEditButton}\n              </div>\n            )}\n          </div>\n        </Container>\n      </div>\n    </>\n  );\n};\n\nexport default CaseReview;\n","import React, { useEffect, useState, useContext, useCallback } from 'react';\nimport { DateTime } from 'luxon';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { snakeCase } from 'change-case';\nimport { toast } from 'react-toastify';\nimport * as Icons from 'react-icons/fa';\nimport {\n  Container,\n  HeaderText,\n  DataGrid,\n  Button,\n  StatusPill,\n  DropDown,\n  PopUpConfirmation,\n  ToolTip,\n} from '../../../components';\nimport { listAssignedCases, listCasesForAdmin, listEmployees } from '../../../generated/graphql/queries';\nimport { assignCase, nullifyCase, unassignCase } from '../../../generated/graphql/mutations';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext';\nimport { CaseStatus, UserGroups } from '../../../constants';\nimport { useUser } from '../../../contexts/userContext';\nimport Trash from '../../../assets/Images/trash.svg';\n\nconst CaseStatusOptions = [\n  { value: CaseStatus.Active, label: 'Active' },\n  { value: CaseStatus.Approved, label: 'Approved' },\n  { value: CaseStatus.Nullified, label: 'Deleted' },\n  { value: CaseStatus.Resubmitted, label: 'Resubmitted' },\n  { value: CaseStatus.Returned, label: 'Returned' },\n  { value: CaseStatus.Submitted, label: 'Submitted' },\n];\n\nconst EmployeeCases = () => {\n  const { userGroups, isAdmin } = useUser();\n\n  const [, setAlert] = useContext(NotificationContext);\n\n  const [nextCaseToken, setNextCaseToken] = useState();\n\n  const [cases, setCases] = useState([]);\n  const [casesLoading, setCasesLoading] = useState(true);\n\n  const [employeeOptions, setEmployeeOptions] = useState([]);\n\n  const [status, setStatus] = useState(CaseStatus.Submitted);\n  const [assignedTo, setAssignedTo] = useState();\n\n  const [filters, setFilters] = useState({\n    status: CaseStatus.Submitted,\n    assignedTo: null,\n    searchTerm: '',\n  });\n\n  const [sort, setSort] = useState({\n    fieldName: 'submittedAt',\n    direction: 'DESC',\n  });\n\n  const [filtersOnLastSearch, setFiltersOnLastSearch] = useState(null);\n  const [sortOnLastSearch, setSortOnLastSearch] = useState({\n    fieldName: 'submittedAt',\n    direction: 'DESC',\n  });\n\n  const [search, setSearch] = useState('');\n\n  const [caseToAssign, setCaseToAssign] = useState(null);\n  const [assignmentSaving, setAssignmentSaving] = useState(null);\n\n  const [recordToDelete, setRecordToDelete] = useState(null);\n  const [deleting, setDeleting] = useState(false);\n\n  useEffect(() => {\n    fetchCases();\n  }, [sort]);\n\n  useEffect(() => {\n    fetchCases();\n  }, [filters]);\n\n  const fetchCases = async () => {\n\n    try {\n      let nextTokenToUse = nextCaseToken;\n\n      let oldCases = nextTokenToUse ? [...cases] : [];\n\n      if (\n        !filtersOnLastSearch ||\n        filtersOnLastSearch.status !== filters.status ||\n        filtersOnLastSearch.assignedTo !== filters.assignedTo ||\n        filtersOnLastSearch.searchTerm !== filters.searchTerm ||\n        sortOnLastSearch.fieldName !== sort.fieldName ||\n        sortOnLastSearch.direction !== sort.direction\n      ) {\n        setNextCaseToken(null);\n\n        nextTokenToUse = null;\n        oldCases = [];\n      }\n      if (oldCases.length == 0) {\n        setCasesLoading(true);\n      }\n\n      setSortOnLastSearch(sort);\n      setFiltersOnLastSearch(filters);\n\n      const params = {\n        status: filters.status,\n        assignedTo: filters.assignedTo,\n        searchTerm: filters.searchTerm,\n        nextToken: nextTokenToUse,\n        sortField: sort.fieldName ? snakeCase(sort.fieldName).toUpperCase() : '',\n        sortOrder: sort.direction,\n        limit: 100,\n      };\n\n      const query = isAdmin ? listCasesForAdmin : listAssignedCases.replace('assignedToName\\n', '');\n\n      const response = await API.graphql(graphqlOperation(query, params));\n\n      const result = isAdmin ? response.data.listCasesForAdmin : response.data.listAssignedCases;\n\n\n      setCases([...oldCases, ...result.items]);\n      setNextCaseToken(result.nextToken);\n    } catch (error) {\n      console.error('Error Loading cases: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error loading active cases',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setCasesLoading(false);\n  };\n\n  const fetchEmployees = async () => {\n    try {\n      let nextEmployeeToken = null;\n      let employeeList = [];\n\n      do {\n        const params = {\n          nextToken: nextEmployeeToken,\n          limit: 100,\n          sortOrder: 'ASC',\n        };\n\n        const result = await API.graphql(graphqlOperation(listEmployees, params));\n\n        nextEmployeeToken = result.data.listEmployees.nextToken;\n\n        employeeList = [...employeeList, ...result.data.listEmployees.items];\n      } while (nextEmployeeToken);\n\n      const options = employeeList.map(x => ({\n        value: x.id,\n        label: `${x.firstName} ${x.lastName}`,\n      }));\n\n      setEmployeeOptions(options);\n\n      return options;\n    } catch (error) {\n      console.error('Error Loading employees: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error loading employees',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n  };\n\n  const checkAssignCase = ({ userId, item }) => {\n    const name = employeeOptions.find(x => x.value === userId)?.label;\n\n    if (item.assignedTo && item.assignedTo !== userId) {\n      setCaseToAssign({ name, userId, caseId: item.id });\n    } else {\n      onAssignCase({ name, userId, caseId: item.id });\n    }\n  };\n\n  const onAssignCase = async ({ name = null, userId = null, caseId }) => {\n    try {\n      setAssignmentSaving(caseId);\n\n      if (userId) {\n        const params = {\n          input: {\n            id: caseId,\n            assignedToName: name,\n            assignedTo: userId,\n          },\n        };\n\n        await API.graphql(graphqlOperation(assignCase, params));\n      } else {\n        await API.graphql(graphqlOperation(unassignCase, { input: { id: caseId } }));\n      }\n\n      const oldCases = [...cases];\n\n      const caseToUpdateIdx = oldCases.findIndex(x => x.id === caseId);\n\n      if (caseToUpdateIdx !== -1) {\n        const updatedCase = oldCases[caseToUpdateIdx];\n\n        updatedCase.assignedTo = userId;\n        updatedCase.assignedToName = name;\n\n        oldCases[caseToUpdateIdx] = updatedCase;\n\n        setCases([...oldCases]);\n      }\n\n      setCaseToAssign(null);\n    } catch (error) {\n      console.error('Error assigning case: ', error);\n    }\n\n    setAssignmentSaving(null);\n  };\n\n  const renderStatus = ({ status: recordStatus }) => <StatusPill status={recordStatus} />;\n\n  const renderAssignedTo = item => {\n    if (item.status === CaseStatus.Submitted) {\n      return (\n        <select\n          value={item.assignedTo || ''}\n          className={`custom-select pl-2 h-10 w-48 lg:mr-4 border border-gray-200 bg-white rounded ${\n            !item.assignedTo ? 'text-gray-200' : 'text-pursuit-gray'\n          }`}\n          onChange={event => checkAssignCase({ item, userId: event.target.value })}>\n          {/* <option key=\"default-state\" value=\"\" disabled=\"disabled\"> */}\n          <option key=\"default-state\" value=\"\">\n            Unassigned\n          </option>\n\n          {employeeOptions.map((x, i) => (\n            <option value={x.value} key={i}>\n              {x.label}\n            </option>\n          ))}\n        </select>\n      );\n    }\n\n    return item.assignedToName || '-';\n  };\n\n  const getSubmittedDate = item => (item.submittedAt ? DateTime.fromISO(item.submittedAt).toLocaleString() : '-');\n\n  const getApprovedDate = item => (item.approvedAt ? DateTime.fromISO(item.approvedAt).toLocaleString() : '-');\n\n  const renderHeaderText = () => (userGroups.includes(UserGroups.Admin) ? 'Cases' : 'My Assigned Cases');\n\n  const renderPoints = ({ totalPoints }) => (\n    <div\n      className={`${getAwardColor(\n        totalPoints\n      )} h-6 w-8 rounded-full flex font-bold justify-center items-center p-0 ml-2`}>\n      {totalPoints?.pointsAwarded || ''}\n    </div>\n  );\n\n  const renderDelete = record => {\n    if (!(record.status === CaseStatus.Submitted || record.status === CaseStatus.Approved)) {\n      return null;\n    }\n\n    return (\n      <div className=\"flex flex-row items-center justify-between w-full focus:outline-none lg:w-auto \">\n        <span className=\"font-semibold lg:hidden\">Delete Case:</span>\n\n        <button type=\"button\" onClick={() => setRecordToDelete(record)} className=\"focus:outline-none\">\n          <img src={Trash} alt=\"Trash\" className=\"object-contain w-5\" />\n        </button>\n      </div>\n    );\n  };\n\n  const nullifyRecord = async id => {\n    try {\n      setDeleting(true);\n\n      const updatedCases = [...cases];\n\n      const indexOfRecord = updatedCases.findIndex(x => x.id === id);\n\n      await API.graphql(graphqlOperation(nullifyCase, { id }));\n\n      updatedCases.splice(indexOfRecord, 1);\n\n      setCases(updatedCases);\n      toast.success('Case removed', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n    } catch (error) {\n      console.error('Error deleting record: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'There was an error removing the case',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setRecordToDelete(null);\n    setDeleting(false);\n  };\n\n  const getAwardColor = totalPoints => {\n    // if points aren't awared yet don't show\n    if (!totalPoints) {\n      return 'bg-white text-white';\n    }\n\n    if (!totalPoints.isFullPoints) {\n      return 'bg-pursuit-amber text-white';\n    }\n\n    return 'bg-green-500 text-white';\n  };\n\n  let columns = [\n    { title: 'Case Number', fieldName: 'caseNumber', sortable: false },\n    {\n      title: 'Submitted',\n      fieldName: 'submittedAt',\n      value: getSubmittedDate,\n      sortable: true,\n    },\n    {\n      title: 'Approved',\n      fieldName: 'approvedAt',\n      value: getApprovedDate,\n      sortable: true,\n    },\n    { title: 'Age', fieldName: 'age', sortable: false, width: '3rem' },\n    { title: 'First Name', fieldName: 'firstName', sortable: false },\n    { title: 'Last Name', fieldName: 'lastName', sortable: true },\n    { title: 'City', fieldName: 'city', sortable: false },\n    { title: 'State', fieldName: 'state', sortable: true },\n    { title: 'Volunteer', fieldName: 'ownerAlias', sortable: true },\n  ];\n\n  if (isAdmin) {\n    columns.unshift({\n      title: '',\n      renderFunction: renderDelete,\n      width: '2rem',\n      noLink: true,\n    });\n    // columns.push({\n    //   title: 'Assigned To',\n    //   value: renderAssignedTo,\n    //   width: '14rem',\n    //   noLink: true,\n    // });\n  }\n\n  columns.push({\n    title: 'Case Status',\n    fieldName: 'status',\n    renderFunction: renderStatus,\n  });\n  columns.push({\n    title: 'Points',\n    fieldName: 'totalPoints',\n    renderFunction: renderPoints,\n  });\n  if (isAdmin) {\n    // columns.unshift({\n    //   title: '',\n    //   renderFunction: renderDelete,\n    //   width: '2rem',\n    //   noLink: true,\n    // });\n    columns.push({\n      title: 'Assigned To',\n      value: renderAssignedTo,\n      width: '14rem',\n      noLink: true,\n    });\n  }\n  if (status === CaseStatus.Nullified) {\n    columns = [\n      { title: 'Case Number', fieldName: 'caseNumber', sortable: true },\n      {\n        title: 'Submitted',\n        fieldName: 'submittedAt',\n        value: getSubmittedDate,\n        sortable: true,\n      },\n      { title: 'Volunteer', fieldName: 'ownerAlias', sortable: true },\n      {\n        title: 'Deleted',\n        fieldName: 'deletedAt',\n        sortable: false,\n        renderFunction: item => (item.deletedAt ? DateTime.fromISO(item.deletedAt).toLocaleString() : '-'),\n      },\n    ];\n  }\n\n  return (\n    <>\n      {caseToAssign ? (\n        <PopUpConfirmation\n          title=\"Confirm Case Reassignment\"\n          content=\"This case is already assigned, are you sure you want to reassign this case?\"\n          onCancel={() => setCaseToAssign(null)}\n          onConfirm={() => onAssignCase(caseToAssign)}\n          confirmLoading={assignmentSaving}\n          confirmLoadingText=\"REASSINGING\"\n          confirmText=\"REASSIGN\"\n          className=\"w-11/12 lg:w-auto\"\n        />\n      ) : null}\n      <Container height=\"lg:h-152\" padding=\"p-4\" margin=\"m-3 lg:m-auto lg:mx-8\" className=\"relative\">\n        <div className=\"flex flex-col pt-4 lg:px-4\">\n          <HeaderText className=\"mb-4 text-2xl text-left lg:text-4xl\">{renderHeaderText()}</HeaderText>\n\n          <div className=\"items-end justify-end mb-10 lg:flex\">\n            <div className=\"lg:mr-4\">\n              <DropDown\n                value={CaseStatusOptions.find(x => x.value === status)}\n                onChange={option => {\n                  setFilters({\n                    status: option ? option.value : null,\n                    assignedTo,\n                    searchTerm: search,\n                  });\n                  setStatus(option ? option.value : null);\n                }}\n                containerClassName=\"mb-4 lg:mb-0\"\n                width=\"w-full lg:w-48 xl:w-64\"\n                label=\"Case Status\"\n                options={CaseStatusOptions}\n                placeholder=\"Status\"\n                isClearable={!isAdmin}\n              />\n            </div>\n\n            {isAdmin && (\n              <div className=\"lg:mr-4\">\n                <DropDown\n                  value={employeeOptions.find(x => x.value === assignedTo)}\n                  width=\"w-full lg:w-48 xl:w-64\"\n                  className=\"bg-gray-100\"\n                  onChange={option => {\n                    const assigned = option ? option.value : null;\n\n                    setAssignedTo(assigned);\n\n                    setFilters({\n                      status,\n                      assigned,\n                      searchTerm: search,\n                    });\n                  }}\n                  label=\"Assigned To\"\n                  options={employeeOptions}\n                  placeholder=\"Assigned To\"\n                  loadOptions={fetchEmployees}\n                  containerClassName=\"mb-4 lg:mb-0\"\n                  isClearable\n                />\n              </div>\n            )}\n\n            <div className=\"flex flex-col\">\n              <div className=\"flex flex-row\">\n                <p className=\"mb-1 font-light light-primary-blue-text\">Search Term</p>\n\n                <ToolTip\n                  tooltipText=\"Find records with the search term included in the Case Number, First Name, Last Name, State, or Volunteer fields.\"\n                  title=\"Search Term\"\n                  className=\"ml-2 text-pursuit-gray\"\n                />\n              </div>\n\n              <input\n                type=\"text\"\n                value={search}\n                onChange={event => setSearch(event.target.value)}\n                placeholder=\"Search Term\"\n                className=\"w-full h-10 px-4 mt-2 mb-4 bg-gray-100 lg:mb-0 lg:mt-0 lg:mr-4 lg:w-48 xl:w-64\"\n                onKeyDown={event => {\n                  const pressedKey = event.key;\n\n                  if (pressedKey === 'Enter') {\n                    setFilters({\n                      status,\n                      assignedTo,\n                      searchTerm: search,\n                    });\n                  }\n                }}\n              />\n            </div>\n\n            <Button\n              solidBlue\n              className=\"w-full px-4 lg:w-24\"\n              onClick={() => {\n                setFilters({\n                  status,\n                  assignedTo,\n                  searchTerm: search,\n                });\n              }}>\n              FILTER\n            </Button>\n          </div>\n\n          {recordToDelete ? (\n            <PopUpConfirmation\n              title=\"Delete Record\"\n              content={`Are you sure you want to delete ${recordToDelete?.caseNumber || 'this record'}?`}\n              onConfirm={() => {\n                nullifyRecord(recordToDelete.id);\n              }}\n              onCancel={() => {\n                setRecordToDelete(null);\n              }}\n              confirmLoading={deleting}\n              confirmText=\"DELETE\"\n              confirmLoadingText=\"DELETING\"\n              destructive\n              className=\"w-11/12 lg:w-auto\"\n            />\n          ) : null}\n\n          <DataGrid\n            columns={columns}\n            sort={sort}\n            setSort={setSort}\n            loading={casesLoading}\n            data={cases}\n            noRecordsText=\"No cases found\"\n            rowLink={item => `/case-review/${item.id}`}\n            loadNextPage={() => fetchCases(filters)}\n            hasMore={!!nextCaseToken}\n            containerHeight=\"h-88\"\n            gridKey=\"employee-cases\"\n          />\n        </div>\n      </Container>\n    </>\n  );\n};\n\nexport default EmployeeCases;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst UsersAwardedLevels = ({ usersAwardLevels = [], possibleAwardLevels = [] }) => {\n  const getAwardLevel = id => {\n    return possibleAwardLevels.find(level => level.id === id);\n  };\n\n  return (\n    <table className=\"award-levels-grid table-auto w-full\">\n      {/* Header for award levels */}\n      <thead className=\"text-left\">\n        <tr>\n          <th className=\"light-primary-blue-text font-semibold\">Leads</th>\n          <th className=\"light-primary-blue-text font-semibold\">Date</th>\n        </tr>\n      </thead>\n      <tbody>\n        {usersAwardLevels.map(({ key, value }, index) => {\n          const { points } = getAwardLevel(key);\n          return (\n            // <div key={key} className=\"award-level flex flex-row\">\n            <tr key={key}>\n              <td title={`Lead level id: ${key}`}>{points} Leads</td>\n              <td>\n                <span title={value}>{new Date(value).toLocaleString()}</span>\n              </td>\n            </tr>\n            // </div>\n          );\n        })}\n      </tbody>\n    </table>\n  );\n};\n\nUsersAwardedLevels.propTypes = {\n  possibleAwardLevels: PropTypes.array.isRequired,\n  usersAwardLevels: PropTypes.array.isRequired,\n};\n\nexport default UsersAwardedLevels;\n","import React, { useState, useContext, useEffect, useCallback } from 'react';\nconst pointLevels = [\n  { level: 1, points: 3, id: 'f96fd95c-a9f4-421d-937d-1e01c20b84ef' },\n  { level: 2, points: 7, id: 'd9f3222b-1c41-4507-9b7e-b5e340d03e26' },\n  { level: 3, points: 12, id: '1688954f-ea9b-4791-b997-45eba6d8e5c5' },\n  { level: 4, points: 25, id: '053c9c19-1755-4354-bfaa-bf75d993bb53' },\n];\n\nexport const useAwardLevels = () => {\n  const [awardLevels, setAwardLevels] = useState([]);\n\n  const getAwardLevels = async () => pointLevels;\n\n  useEffect(() => {\n    getAwardLevels().then(levels => setAwardLevels(levels));\n  }, [getAwardLevels]);\n\n  return {\n    awardLevels,\n    getAwardLevels,\n  };\n};\n","import React, { useState, useContext, useEffect, useCallback } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { API, graphqlOperation, Storage } from 'aws-amplify';\nimport { DateTime } from 'luxon';\nimport { toast } from 'react-toastify';\nimport states from 'states-us';\nimport * as Icons from 'react-icons/fa';\n\nimport { Container, HeaderText, Spinner, Button, DropDown, StatusPill, PopUpConfirmation } from '../../../components';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\nimport { approveUser, enableUser, disableUser, updateUserType, deleteUser } from '../../../generated/graphql/mutations';\nimport { getUserById } from '../../../generated/graphql/queries';\nimport { VolunteerStatus, UserTypes, EmployeeType } from '../../../constants';\nimport { useUser } from '../../../contexts/userContext';\nimport { Link } from 'react-router-dom';\nimport UsersAwardedLevels from '../../../components/UsersAwardedLevels';\nimport { useAwardLevels } from '../../../helpers/useAwardLevels.js';\n\nconst UserDetails = () => {\n  const { user: signedInUser, isAdmin } = useUser();\n  const [, setAlert] = useContext(NotificationContext);\n\n  const { userId } = useParams();\n\n  const [user, setUser] = useState();\n  const [userType, setUserType] = useState({ label: 'Volunteer', value: UserTypes.Volunteer });\n\n  const [loading, setLoading] = useState();\n  const [approving, setApproving] = useState(false);\n  const [showConfirmDisable, setShowConfirmDisable] = useState(false);\n  const [showConfirmEnable, setShowConfirmEnable] = useState(false);\n  const [showConfirmDelete, setShowConfirmDelete] = useState(false);\n  const [disabling, setDisabling] = useState(false);\n  const [enabling, setEnabling] = useState(false);\n  const [changingType, setChangingType] = useState(false);\n  const [isDeleting, setIsDeleting] = useState(false);\n  const [disabledReason, setDisabledReason] = useState(null);\n\n  const userTypeOptions = [\n    { label: 'Admin', value: UserTypes.Admin },\n    { label: 'Staff', value: UserTypes.Staff },\n    { label: 'Volunteer', value: UserTypes.Volunteer },\n    { label: 'LEO', value: UserTypes.LEO },\n  ];\n\n  const { awardLevels } = useAwardLevels();\n\n  useEffect(() => {\n    const getUser = async () => {\n      try {\n        setLoading(true);\n\n        const {\n          data: { getUserById: returnedUser = null },\n        } = await API.graphql(\n          graphqlOperation(getUserById, {\n            id: userId,\n          })\n        );\n\n        if (!returnedUser) {\n          setAlert({\n            type: 'SET_NOTIFICATION',\n            payload: {\n              occurs: true,\n              message: 'User not found',\n              textColor: 'redText',\n              borderColor: 'redBorder',\n            },\n          });\n        }\n\n        setUser(returnedUser);\n        setUserType(getUserType(returnedUser.userStatus));\n      } catch (error) {\n        console.error('Error fetching user by id:', error);\n\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: 'Error fetching user details',\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n\n        setUser(null);\n      }\n\n      setLoading(false);\n    };\n\n    getUser(userId);\n  }, [userId, setAlert]);\n\n  const parseState = stateCode => {\n    if (!stateCode) {\n      return '-';\n    }\n\n    const matchingState = states.find(x => x.abbreviation === stateCode);\n\n    if (matchingState) {\n      return matchingState.name;\n    }\n\n    return stateCode;\n  };\n\n  const parseDate = date => {\n    if (!date) {\n      return '-';\n    }\n\n    const luxonDate = DateTime.fromISO(date);\n\n    if (!luxonDate.isValid) {\n      return 'Invalid Date';\n    }\n\n    return luxonDate.toLocaleString();\n  };\n\n  const getCertificate = async () => {\n    const key = user.certificatePath;\n    const { identityId } = user;\n\n    const fileUrl = await Storage.get(key, { level: 'protected', identityId });\n\n    window.open(fileUrl, '_blank');\n  };\n\n  const onApproveUser = async () => {\n    try {\n      setApproving(true);\n\n      const {\n        data: { approveUser: returnedUser = null },\n      } = await API.graphql(\n        graphqlOperation(approveUser, {\n          id: userId,\n        })\n      );\n\n      if (!returnedUser) {\n        throw new Error('No user returned');\n      }\n\n      toast.success('User Approved', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n\n      setUser(returnedUser);\n    } catch (error) {\n      console.error('Error approving user:', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error approving user',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setApproving(false);\n  };\n\n  const onEnableUser = async () => {\n    try {\n      setEnabling(true);\n\n      const {\n        data: { enableUser: returnedUser = null },\n      } = await API.graphql(\n        graphqlOperation(enableUser, {\n          id: userId,\n        })\n      );\n\n      if (!returnedUser) {\n        throw new Error('No user returned');\n      }\n\n      toast.success('Enabled User', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n\n      setUser(returnedUser);\n      setShowConfirmEnable(false);\n    } catch (error) {\n      console.error('Error enabling user:', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error enabling user',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setEnabling(false);\n  };\n\n  const onDisableUser = useCallback(async () => {\n    try {\n      setDisabling(true);\n\n      const {\n        data: { disableUser: returnedUser = null },\n      } = await API.graphql(\n        graphqlOperation(disableUser, {\n          id: userId,\n          disableReason: disabledReason,\n        })\n      );\n\n      if (!returnedUser) {\n        throw new Error('No user returned');\n      }\n\n      toast.success('Disabled User', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n\n      setUser(returnedUser);\n      setShowConfirmDisable(false);\n    } catch (error) {\n      console.error('Error disabling user:', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error disabling user',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setDisabling(false);\n  }, [userId, disabledReason]);\n\n  const onDeleteUser = async () => {\n    try {\n      setIsDeleting(true);\n\n      const {\n        data: { deleteUser: returnedUser = null },\n      } = await API.graphql(\n        graphqlOperation(deleteUser, {\n          id: userId,\n        })\n      );\n\n      if (!returnedUser) {\n        throw new Error('No user returned');\n      }\n\n      toast.success('Deleted User', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n\n      setUser(returnedUser);\n      setShowConfirmDelete(false);\n    } catch (error) {\n      console.error('Error disabling user:', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error deleting user',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setIsDeleting(false);\n  };\n\n  const getUserType = userStatus => {\n    let type = null;\n\n    if (userStatus === EmployeeType.Admin || userStatus === EmployeeType.Staff) {\n      type = userTypeOptions.find(x => x.value === userStatus);\n    } else {\n      type = userTypeOptions.find(x => x.value === UserTypes.Volunteer);\n    }\n\n    return type;\n  };\n\n  const onUpdateUserType = async () => {\n    const selectedType = userType?.value;\n\n    try {\n      setChangingType(true);\n\n      if (user?.userStatus === 'DISABLED') {\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: \"Error - Can't change user type of a disabled user\",\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n\n        setChangingType(false);\n\n        return;\n      }\n\n      const {\n        data: { updateUserType: returnedUser = null },\n      } = await API.graphql(\n        graphqlOperation(updateUserType, {\n          id: userId,\n          type: selectedType,\n        })\n      );\n\n      if (!returnedUser) {\n        throw new Error('No user returned');\n      }\n\n      toast.success('User Type Updated', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n\n      setUser(returnedUser);\n    } catch (error) {\n      console.error('Error updating user type:', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error updating user type',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setChangingType(false);\n  };\n\n  // const redirectToMessageUser = useCallback(() => {\n  //   history.push(`/messages/create?userIds=${userId}`);\n  // }, [history, userId]);\n\n  const disabledReasonInput = (\n    <textarea\n      value={disabledReason}\n      onChange={e => setDisabledReason(e.target.value)}\n      placeholder=\"Reason for disabling\"\n      className=\"w-full border border-gray-300 rounded-md p-2 focus:outline-none focus:ring-2 focus:ring-guardian-blue\"\n    />\n  );\n\n  const disabledContent = (\n    <div className=\"flex flex-col\">\n      <p className=\"text-pursuit-gray mb-8\">\n        Are you sure you want to disable {user?.firstName && user.firstName} {user?.lastName && user.lastName}\n        {!user?.firstName && !user?.lastName ? 'this user' : ''}?\n      </p>\n      {disabledReasonInput}\n    </div>\n  );\n\n  return (\n    <>\n      {showConfirmDisable && (\n        <PopUpConfirmation\n          title=\"Disable User\"\n          content={disabledContent}\n          // content={\n          //   `Are you sure you want to disable ${user?.firstName && user.firstName} ${user?.lastName && user.lastName}${\n          //     !user?.firstName && !user?.lastName ? 'this user' : ''\n          //   }?` + disabledReasonInput\n          // }\n          onCancel={() => setShowConfirmDisable(false)}\n          onConfirm={() => onDisableUser()}\n          confirmText=\"DISABLE\"\n          confirmLoading={disabling}\n          confirmLoadingText=\"DISABLING\"\n          confirmDisabled={!disabledReason}\n          destructive\n          className=\"w-11/12 lg:w-auto\"\n        />\n      )}\n\n      {showConfirmDelete && (\n        <PopUpConfirmation\n          title=\"Delete User\"\n          content={`Are you sure you want to delete ${user?.firstName && user.firstName} ${user?.lastName &&\n            user.lastName}${!user?.firstName && !user?.lastName ? 'this user' : ''}?`}\n          onCancel={() => setShowConfirmDelete(false)}\n          onConfirm={() => onDeleteUser()}\n          confirmText=\"DELETE\"\n          confirmLoading={isDeleting}\n          confirmLoadingText=\"DELETING\"\n          destructive\n          className=\"w-11/12 lg:w-auto\"\n        />\n      )}\n\n      {showConfirmEnable && (\n        <PopUpConfirmation\n          title=\"Enable User\"\n          content={`Are you sure you want to re-enable ${user?.firstName && user.firstName} ${user?.lastName &&\n            user.lastName}${!user?.firstName && !user?.lastName ? 'this user' : ''}?`}\n          onCancel={() => setShowConfirmEnable(false)}\n          onConfirm={() => onEnableUser()}\n          confirmText=\"ENABLE\"\n          confirmLoading={enabling}\n          confirmLoadingText=\"ENABLING\"\n          className=\"w-11/12 lg:w-auto\"\n        />\n      )}\n      <Container\n        height=\"lg:min-h-104\"\n        width=\"lg:w-4/5\"\n        padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n        className=\"flex flex-col\"\n        margin=\"mx-3 md:mx-12 lg:mx-auto mt-4\">\n        <HeaderText fontSize=\"text-4xl\" className=\"mb-12\">\n          User Details\n        </HeaderText>\n\n        {loading ? (\n          <div className=\"w-full flex justify-center items-center\">\n            <Spinner />\n          </div>\n        ) : (\n          <div>\n            <div className=\"flex flex-col-reverse lg:flex-row\">\n              <div className=\"w-full lg:mr-4 lg:border-r border-gray-200\">\n                <div className=\"flex flex-col\">\n                  <div className=\"flex flex-row w-full\">\n                    <div className=\"flex flex-col w-1/2\">\n                      <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">First Name</p>\n                      <p className=\"text-pursuit-gray mb-8\">{user?.firstName || '-'}</p>\n                    </div>\n\n                    <div className=\"flex flex-col w-1/2\">\n                      <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Last Name</p>\n                      <p className=\"text-pursuit-gray mb-8\">{user?.lastName || '-'}</p>\n                    </div>\n                  </div>\n\n                  <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Country</p>\n                  <p className=\"text-pursuit-gray mb-8\">{user?.country || '-'}</p>\n\n                  {user?.country === 'United States' && (\n                    <div className=\"flex flex-row\">\n                      <div className=\"flex flex-col w-1/2\">\n                        <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">State</p>\n                        <p className=\"text-pursuit-gray mb-8\">{parseState(user?.state)}</p>\n                      </div>\n\n                      <div className=\"flex flex-col w-1/2\">\n                        <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Zip</p>\n                        <p className=\"text-pursuit-gray mb-8\">{user?.zip || '-'}</p>\n                      </div>\n                    </div>\n                  )}\n\n                  <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Heard About Us</p>\n                  <p className=\"text-pursuit-gray mb-8\">{user?.heardAboutUs || '-'}</p>\n\n                  <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Date of Birth</p>\n                  <p className=\"text-pursuit-gray mb-8\">{user?.dateOfBirth || '-'}</p>\n                </div>\n              </div>\n\n              <div className=\"w-full lg:pl-16\">\n                <div className=\"flex flex-row\">\n                  <div className=\"flex flex-col w-1/2\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Alias</p>\n                    <p className=\"text-pursuit-gray mb-8\">{user?.alias || '-'}</p>\n                  </div>\n\n                  <div className=\"flex flex-col w-1/2\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Status</p>\n                    <StatusPill status={user?.userStatus} />\n                  </div>\n                </div>\n\n                <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Email</p>\n                <div className=\"mb-8\">\n                  <a href={`mailto:${user?.email}`} className=\"text-guardian-blue\">\n                    {user?.email || '-'}\n                  </a>\n                </div>\n\n                <div className=\"flex flex-row\">\n                  <div className=\"flex flex-col w-1/3\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Created</p>\n                    <p className=\"text-pursuit-gray mb-8\">{parseDate(user?.createdAt)}</p>\n                  </div>\n\n                  <div className=\"flex flex-col w-1/3\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Approved</p>\n                    <p className=\"text-pursuit-gray mb-8\">{parseDate(user?.approvedAt)}</p>\n                  </div>\n\n                  <div className=\"flex flex-col w-1/3\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Last Sign In</p>\n                    <p className=\"text-pursuit-gray mb-8\">{parseDate(user?.lastSignInAt)}</p>\n                  </div>\n                </div>\n\n                {user?.scoreAwardLevels && (\n                  // <div className=\"flex flex-col\">\n                  //   <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Score Award Levels</p>\n                  //   <p className=\"text-pursuit-gray mb-8\">{JSON.stringify(user?.scoreAwardLevels) || '-'}</p>\n                  // </div>\n                  <UsersAwardedLevels usersAwardLevels={user.scoreAwardLevels} possibleAwardLevels={awardLevels} />\n                  \n                )}\n\n                {user?.certificatePath && (\n                  <div className=\"mb-8\">\n                    <Button\n                      onClick={() => getCertificate()}\n                      className=\"text-guardian-blue underline focus:outline-none\">\n                      View Certificate\n                    </Button>\n                  </div>\n                )}\n\n                {user?.userStatus === VolunteerStatus.Disabled && (\n                  <div className=\"flex flex-col\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Disabled Reason</p>\n                    <p className=\"text-pursuit-gray mb-8\">{user?.disabledReason || '-'}</p>\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Disabled at</p>\n                    <p className=\"text-pursuit-gray mb-8\"> {user?.disabledAt || '-'} </p>\n                  </div>\n                )}\n              </div>\n            </div>\n\n            <div className=\"flex flex-col lg:flex-row lg:justify-between\">\n              {isAdmin && user?.id !== signedInUser?.id && (\n                <div className=\"flex flew-row items-end\">\n                  <div className=\"flex flex-col w-full lg:w-auto\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">User Type</p>\n                    <DropDown\n                      value={userType}\n                      onChange={option => setUserType(option)}\n                      width=\"w-full lg:w-64\"\n                      containerClassName=\"mr-2\"\n                      options={userTypeOptions}\n                    />\n                  </div>\n\n                  <Button solidBlue noPadding className=\"px-4 ml-6\" onClick={onUpdateUserType} loading={changingType}>\n                    {changingType ? 'SAVING' : 'SAVE'}\n                  </Button>\n                </div>\n              )}\n\n              {user?.id !== signedInUser?.id && (\n                <div className=\"flex justify-end mt-8 w-full lg:w-auto\">\n                  {/* User notification button */}\n                  {/* {user?.userStatus !== VolunteerStatus.Deleted ? ( */}\n                  {user?.userStatus === VolunteerStatus.Certified ? (\n                    <Link to={`/messaging/create?recipients=${userId}`}>\n                      <Button\n                        linedBlue\n                        noPadding\n                        className=\"px-4 w-full lg:w-auto uppercase\"\n                        // onClick={() => setShowNotificationModal(true)}\n                      >\n                        Message\n                      </Button>\n                    </Link>\n                  ) : null}\n\n                  {user?.userStatus === VolunteerStatus.Uncertfied ||\n                  user?.userStatus === VolunteerStatus.Disabled ||\n                  user?.userStatus === VolunteerStatus.Pending ? (\n                    <a href={`mailto:${user.email}&cc=project1591@guardiangroup.org`} target=\"_new\">\n                      <Button linedBlue noPadding className=\"px-4 w-full lg:w-auto uppercase\">\n                        Email\n                      </Button>\n                    </a>\n                  ) : null}\n\n                  {user?.userStatus !== VolunteerStatus.Deleted ? (\n                    user?.userStatus !== VolunteerStatus.Disabled ? (\n                      <Button\n                        linedRed\n                        noPadding\n                        className=\"px-4 lg:ml-6 w-full lg:w-auto\"\n                        onClick={() => setShowConfirmDisable(true)}>\n                        DISABLE\n                      </Button>\n                    ) : (\n                      <Button\n                        linedBlue\n                        noPadding\n                        className=\"px-4 lg:ml-6 w-full lg:w-auto\"\n                        onClick={() => setShowConfirmEnable(true)}>\n                        ENABLE\n                      </Button>\n                    )\n                  ) : null}\n                  {user?.userStatus === VolunteerStatus.Disabled ? (\n                    <Button\n                      linedRed\n                      noPadding\n                      className=\"px-4 lg:ml-6 w-full lg:w-auto\"\n                      onClick={() => setShowConfirmDelete(true)}>\n                      DELETE\n                    </Button>\n                  ) : null}\n\n                  {user?.userStatus === VolunteerStatus.Pending && (\n                    <Button\n                      solidBlue\n                      noPadding\n                      className=\"px-4 lg:ml-6 w-full lg:w-auto\"\n                      onClick={onApproveUser}\n                      loading={approving}>\n                      {approving ? 'APPROVING' : 'APPROVE'}\n                    </Button>\n                  )}\n                </div>\n              )}\n            </div>\n          </div>\n        )}\n      </Container>\n    </>\n  );\n};\n\nexport default UserDetails;\n","import React from 'react';\n\nimport { listVolunteers } from '../../../generated/graphql/queries';\nimport { UserGrid, StatusPill } from '../../../components';\nimport { VolunteerStatus, UserTypes } from '../../../constants';\n\nconst volunteerStatusOptions = [\n  { value: VolunteerStatus.Certified, label: 'Certified' },\n  { value: VolunteerStatus.Pending, label: 'Pending' },\n  { value: VolunteerStatus.Uncertfied, label: 'Uncertified' },\n  { value: VolunteerStatus.Disabled, label: 'Disabled' },\n];\n\nconst Volunteers = () => {\n  const renderUserStatus = ({ userStatus: status }) => <StatusPill status={status} />;\n\n  const statusColumn = { title: 'Status', fieldName: 'userStatus', renderFunction: renderUserStatus, sortable: true };\n\n  return (\n    <UserGrid\n      query={listVolunteers}\n      queryName=\"listVolunteers\"\n      statusOptions={volunteerStatusOptions}\n      title=\"Volunteer Users\"\n      initialStatus={VolunteerStatus.Pending}\n      statusColumn={statusColumn}\n      statusFilterLabel=\"User Status\"\n      createUserDefaultType={UserTypes.Volunteer}\n      showDisabledAt\n    />\n  );\n};\n\nexport default Volunteers;\n","import React from 'react';\nimport { Switch, Route, Redirect, useLocation } from 'react-router-dom';\n\nimport { Dashboard, Volunteers, UserDetails, CaseReview, MessageIndex, MessageCreate } from '../pages/employee';\nimport { MessageRead, MessageViewSent } from '../pages/employee/Messaging';\n\nconst EmployeeRouting = () => {\n  const location = useLocation();\n\n  return (\n    <Switch location={location} key={location.pathname}>\n      <Route exact path={['/', '/dashboard']}>\n        <Dashboard />\n      </Route>\n\n      <Route path=\"/case-review/:idParam\">\n        <CaseReview />\n      </Route>\n\n      <Route path=\"/user/:userId\">\n        <UserDetails />\n      </Route>\n\n      <Route path=\"/volunteers\">\n        <Volunteers />\n      </Route>\n\n      <Route path=\"/messaging/read/:messageId\">\n        <MessageRead />\n      </Route>\n      <Route path=\"/messaging/view/:createRequestId\">\n        <MessageViewSent />\n      </Route>\n      <Route path=\"/messaging/create\">\n        <MessageCreate />\n      </Route>\n      <Route path=\"/messaging\">\n        <MessageIndex />\n      </Route>\n\n      <Route path=\"*\">\n        <Redirect to=\"/\" />\n      </Route>\n    </Switch>\n  );\n};\n\nexport default EmployeeRouting;\n","import React, { useState, useContext } from 'react';\nimport { useLocation, useHistory } from 'react-router-dom';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { DateTime } from 'luxon';\nimport { toast } from 'react-toastify';\nimport * as Icons from 'react-icons/fa';\nimport DatePicker from 'react-datepicker';\n\nimport {\n  Container,\n  HeaderText,\n  Button,\n  DropDown,\n  TextField,\n  AliasGenerator,\n  CountryStateZipPicker,\n} from '../../../components';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\nimport { adminCreateUser } from '../../../generated/graphql/mutations';\nimport { UserTypes } from '../../../constants';\nimport { validateAdminCreateUser } from '../../../helpers/createAccount/createAccountValidation';\n\nconst CreateUser = () => {\n  const history = useHistory();\n\n  const { state: routeState } = useLocation();\n\n  const [, setAlert] = useContext(NotificationContext);\n\n  const defaultState = {\n    firstName: '',\n    lastName: '',\n    dateOfBirth: null,\n    country: '',\n    state: '',\n    zip: '',\n    email: '',\n    userType: routeState?.userType || UserTypes.Volunteer,\n  };\n\n  const [newUser, setNewUser] = useState(defaultState);\n\n  const [alias, setAlias] = useState('');\n  const [aliasClearedAt, setAliasClearedAt] = useState(null);\n\n  const [saving, setSaving] = useState();\n\n  const userTypeOptions = [\n    { label: 'Volunteer', value: UserTypes.Volunteer },\n    { label: 'Staff', value: UserTypes.Staff },\n    { label: 'Admin', value: UserTypes.Admin },\n  ];\n\n  const createUser = async () => {\n    try {\n      setSaving(true);\n\n      const stateIsValid = validateAdminCreateUser(setAlert, {\n        firstName: newUser.firstName,\n        lastName: newUser.lastName,\n        email: newUser.email,\n        dateOfBirth: newUser.dateOfBirth,\n        country: newUser.country,\n        state: newUser.state,\n        zip: newUser.zip,\n      });\n\n      if (stateIsValid) {\n        const formattedDOB = DateTime.fromJSDate(newUser.dateOfBirth).toFormat('MM/dd/yyyy');\n\n        const {\n          data: { adminCreateUser: user = null },\n        } = await API.graphql(\n          graphqlOperation(adminCreateUser, {\n            input: {\n              firstName: newUser.firstName,\n              lastName: newUser.lastName,\n              email: newUser.email,\n              alias,\n              dateOfBirth: formattedDOB,\n              country: newUser.country,\n              state: newUser.state,\n              zip: newUser.zip,\n              userType: newUser.userType,\n            },\n          })\n        );\n\n        toast.success('User Created', {\n          progress: false,\n          className: 'bg-green-500 text-white',\n          autoClose: 1500,\n          closeButton: false,\n          icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n        });\n\n        history.push(`/user/${user.id}`);\n      }\n    } catch (error) {\n      let errorMessage = 'An error occurred attempting to create the user.';\n\n      if (error.errors && Array.isArray(error.errors)) {\n        const userExistsError = error.errors.find(x => x.errorType === 'UsernameExistsException');\n\n        if (userExistsError) {\n          errorMessage = `Error creating user - ${userExistsError.message}`;\n        }\n      }\n\n      console.error('Error creating user: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: errorMessage,\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setSaving(false);\n  };\n\n  return (\n    <Container\n      height=\"lg:min-h-104\"\n      width=\"lg:w-4/5\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 md:mx-12 lg:mx-auto mt-4\"\n    >\n      <HeaderText fontSize=\"text-4xl\" className=\"mb-12\">\n        Create New User\n      </HeaderText>\n\n      <div>\n        <div className=\"flex flex-col-reverse lg:flex-row\">\n          <div className=\"flex flex-col lg:w-1/2 lg:mr-8\">\n            <TextField\n              value={newUser.firstName}\n              onChange={e => setNewUser({ ...newUser, firstName: e.target.value })}\n              label=\"First Name\"\n              className=\"mb-4\"\n              required\n            />\n\n            <TextField\n              value={newUser.lastName}\n              onChange={e => setNewUser({ ...newUser, lastName: e.target.value })}\n              label=\"Last Name\"\n              className=\"mb-4\"\n              required\n            />\n\n            <label className=\"light-primary-blue-text font-light mr-1 mb-4\">\n              <span>\n                Date of Birth <span className=\"text-pursuit-red ml-1\">*</span>\n              </span>\n              <div className=\"flex items-center mt-1\">\n                <DatePicker\n                  selected={newUser.dateOfBirth}\n                  onChange={date => setNewUser({ ...newUser, dateOfBirth: date })}\n                  maxDate={new Date()}\n                  className=\"textfield-bg-color w-full h-10 px-2\"\n                  shouldCloseOnSelect\n                />\n                <Icons.FaCalendarDay size={30} className=\"ml-4 cursor-pointer\" />\n              </div>\n            </label>\n\n            <CountryStateZipPicker\n              country={newUser.country}\n              setCountry={country => setNewUser({ ...newUser, country })}\n              state={newUser.state}\n              setState={state => setNewUser({ ...newUser, state })}\n              zip={newUser.zip}\n              setZip={zip => setNewUser({ ...newUser, zip })}\n            />\n          </div>\n\n          <div className=\"flex flex-col lg:w-1/2 lg:ml-8\">\n            <TextField\n              value={newUser.email}\n              onChange={e => setNewUser({ ...newUser, email: e.target.value })}\n              label=\"Email Address\"\n              className=\"mb-4\"\n              required\n            />\n\n            <AliasGenerator alias={alias} setAlias={setAlias} excludeHeader clearedAt={aliasClearedAt} />\n\n            <div className=\"flex flex-col w-full lg:w-auto\">\n              <DropDown\n                value={userTypeOptions.find(x => x.value === newUser.userType) || null}\n                onChange={option => setNewUser({ ...newUser, userType: option.value })}\n                width=\"w-full\"\n                containerClassName=\"mr-2 mb-4\"\n                options={userTypeOptions}\n                label=\"User Type\"\n                required\n              />\n            </div>\n          </div>\n        </div>\n        <div className=\"flex flex-row justify-end mt-4\">\n          <Button\n            linedBlue\n            noPadding\n            className=\"px-4 lg:ml-6 w-full lg:w-auto mr-2\"\n            onClick={() => {\n              setNewUser(defaultState);\n              setAliasClearedAt(new Date().toISOString());\n            }}\n          >\n            CLEAR\n          </Button>\n\n          <Button solidBlue noPadding className=\"px-4 ml-2 w-full lg:w-auto\" onClick={createUser} loading={saving}>\n            {saving ? 'CREATING' : 'CREATE'}\n          </Button>\n        </div>\n      </div>\n    </Container>\n  );\n};\n\nexport default CreateUser;\n","import React from 'react';\n\nimport { listEmployees } from '../../../generated/graphql/queries';\nimport { UserGrid, StatusPill } from '../../../components';\nimport { EmployeeType, UserTypes } from '../../../constants';\n\nconst statusOptions = [\n  { value: EmployeeType.Admin, label: 'Admin' },\n  { value: EmployeeType.Staff, label: 'Staff' },\n];\n\nconst StaffUsers = () => {\n  const renderStaffType = ({ userStatus }) => <StatusPill status={userStatus} />;\n\n  const statusColumn = { title: 'Type', fieldName: 'userStatus', renderFunction: renderStaffType, sortable: true };\n\n  return (\n    <UserGrid\n      query={listEmployees}\n      queryName=\"listEmployees\"\n      statusOptions={statusOptions}\n      title=\"Staff Users\"\n      statusColumn={statusColumn}\n      statusFilterLabel=\"Type\"\n      createUserDefaultType={UserTypes.Staff}\n      showDisabledAt\n    />\n  );\n};\n\nexport default StaffUsers;\n","import React, { useState, useContext, useEffect, useCallback } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { API, graphqlOperation, Storage } from 'aws-amplify';\nimport { DateTime } from 'luxon';\nimport { toast } from 'react-toastify';\nimport states from 'states-us';\nimport * as Icons from 'react-icons/fa';\n\nimport { Container, HeaderText, Spinner, Button, DropDown, StatusPill, PopUpConfirmation } from '../../../components';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\nimport {\n  approveUser,\n  enableUser,\n  disableUser,\n  updateUserType,\n  updateUserRecord,\n} from '../../../generated/graphql/mutations';\nimport { getLeoUserById } from '../../../generated/graphql/queries';\nimport { VolunteerStatus, UserTypes, EmployeeType } from '../../../constants';\nimport { useUser } from '../../../contexts/userContext';\nimport { Link } from 'react-router-dom';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { icon } from '@fortawesome/fontawesome-svg-core/import.macro';\n\nconst UserDetails = () => {\n  const { user: signedInUser, isAdmin } = useUser();\n  const [, setAlert] = useContext(NotificationContext);\n\n  const { userId } = useParams();\n\n  const [user, setUser] = useState();\n  const [userType, setUserType] = useState({ label: 'Volunteer', value: UserTypes.Volunteer });\n\n  const [loading, setLoading] = useState();\n  const [approving, setApproving] = useState(false);\n  const [showConfirmDisable, setShowConfirmDisable] = useState(false);\n  const [showConfirmEnable, setShowConfirmEnable] = useState(false);\n  const [disabling, setDisabling] = useState(false);\n  const [enabling, setEnabling] = useState(false);\n  const [changingType, setChangingType] = useState(false);\n  const [disabledReason, setDisabledReason] = useState(null);\n  const [enableEditing, setEnableEditing] = useState(false);\n\n  // const userTypeOptions = [\n  //   { label: 'Admin', value: UserTypes.Admin },\n  //   { label: 'Staff', value: UserTypes.Staff },\n  //   { label: 'Volunteer', value: UserTypes.Volunteer },\n  // ];\n\n  useEffect(() => {\n    const getUser = async () => {\n      try {\n        setLoading(true);\n\n        const {\n          data: { getLeoUserById: returnedUser = null },\n        } = await API.graphql(\n          graphqlOperation(getLeoUserById, {\n            id: userId,\n          })\n        );\n\n        if (!returnedUser) {\n          setAlert({\n            type: 'SET_NOTIFICATION',\n            payload: {\n              occurs: true,\n              message: 'User not found',\n              textColor: 'redText',\n              borderColor: 'redBorder',\n            },\n          });\n        }\n\n        setUser(returnedUser);\n        // setUserType(getUserType(returnedUser.userStatus));\n      } catch (error) {\n        console.error('Error fetching user by id:', error);\n\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: 'Error fetching user details',\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n\n        setUser(null);\n      }\n\n      setLoading(false);\n    };\n\n    getUser(userId);\n  }, [userId, setAlert]);\n\n  const parseState = stateCode => {\n    if (!stateCode) {\n      return '-';\n    }\n\n    const matchingState = states.find(x => x.abbreviation === stateCode);\n\n    if (matchingState) {\n      return matchingState.name;\n    }\n\n    return stateCode;\n  };\n\n  const parseDate = date => {\n    if (!date) {\n      return '-';\n    }\n\n    const luxonDate = DateTime.fromISO(date);\n\n    if (!luxonDate.isValid) {\n      return 'Invalid Date';\n    }\n\n    return luxonDate.toLocaleString();\n  };\n\n  const getCertificate = async () => {\n    const key = user.certificatePath;\n    const { identityId } = user;\n\n    const fileUrl = await Storage.get(key, { level: 'protected', identityId });\n\n    window.open(fileUrl, '_blank');\n  };\n\n  const onApproveUser = async () => {\n    try {\n      setApproving(true);\n\n      const {\n        data: { approveUser: returnedUser = null },\n      } = await API.graphql(\n        graphqlOperation(approveUser, {\n          id: userId,\n        })\n      );\n\n      if (!returnedUser) {\n        throw new Error('No user returned');\n      }\n\n      toast.success('User Approved', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n\n      setUser(returnedUser);\n    } catch (error) {\n      console.error('Error approving user:', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error approving user',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setApproving(false);\n  };\n\n  const onEnableUser = async () => {\n    try {\n      setEnabling(true);\n\n      const {\n        data: { enableUser: returnedUser = null },\n      } = await API.graphql(\n        graphqlOperation(enableUser, {\n          id: userId,\n        })\n      );\n\n      if (!returnedUser) {\n        throw new Error('No user returned');\n      }\n\n      toast.success('Enabled User', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n\n      setUser(returnedUser);\n      setShowConfirmEnable(false);\n    } catch (error) {\n      console.error('Error enabling user:', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error enabling user',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setEnabling(false);\n  };\n\n  const onDisableUser = useCallback(async () => {\n    try {\n      setDisabling(true);\n\n      const {\n        data: { disableUser: returnedUser = null },\n      } = await API.graphql(\n        graphqlOperation(disableUser, {\n          id: userId,\n          disableReason: disabledReason,\n        })\n      );\n\n      if (!returnedUser) {\n        throw new Error('No user returned');\n      }\n\n      toast.success('Disabled User', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n\n      setUser(returnedUser);\n      setShowConfirmDisable(false);\n    } catch (error) {\n      console.error('Error disabling user:', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error disabling user',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setDisabling(false);\n  }, [userId, disabledReason]);\n\n  // const getUserType = userStatus => {\n  //   let type = null;\n\n  //   if (userStatus === EmployeeType.Admin || userStatus === EmployeeType.Staff) {\n  //     type = userTypeOptions.find(x => x.value === userStatus);\n  //   } else {\n  //     type = userTypeOptions.find(x => x.value === UserTypes.Volunteer);\n  //   }\n\n  //   return type;\n  // };\n\n  const onUpdateUserType = async () => {\n    const selectedType = userType?.value;\n\n    try {\n      setChangingType(true);\n\n      if (user?.userStatus === 'DISABLED') {\n        setAlert({\n          type: 'SET_NOTIFICATION',\n          payload: {\n            occurs: true,\n            message: \"Error - Can't change user type of a disabled user\",\n            textColor: 'redText',\n            borderColor: 'redBorder',\n          },\n        });\n\n        setChangingType(false);\n\n        return;\n      }\n\n      const {\n        data: { updateUserType: returnedUser = null },\n      } = await API.graphql(\n        graphqlOperation(updateUserType, {\n          id: userId,\n          type: selectedType,\n        })\n      );\n\n      if (!returnedUser) {\n        throw new Error('No user returned');\n      }\n\n      toast.success('User Type Updated', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n\n      setUser(returnedUser);\n    } catch (error) {\n      console.error('Error updating user type:', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error updating user type',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setChangingType(false);\n  };\n\n  // const redirectToMessageUser = useCallback(() => {\n  //   history.push(`/messages/create?userIds=${userId}`);\n  // }, [history, userId]);\n\n  const disabledReasonInput = (\n    <textarea\n      value={disabledReason}\n      onChange={e => setDisabledReason(e.target.value)}\n      placeholder=\"Reason for disabling\"\n      className=\"w-full border border-gray-300 rounded-md p-2 focus:outline-none focus:ring-2 focus:ring-guardian-blue\"\n    />\n  );\n\n  const disabledContent = (\n    <div className=\"flex flex-col\">\n      <p className=\"text-pursuit-gray mb-8\">\n        Are you sure you want to disable {user?.firstName && user.firstName} {user?.lastName && user.lastName}\n        {!user?.firstName && !user?.lastName ? 'this user' : ''}?\n      </p>\n      {disabledReasonInput}\n    </div>\n  );\n\n  const handleEditSave = async () => {\n    console.log('save');\n    setEnableEditing(false);\n    console.log(user);\n    const attributesToSave = ['firstName', 'lastName', 'agency', 'department', 'position', 'city', 'zip', 'state'];\n    const userDoc = attributesToSave.reduce((acc, key) => {\n      if ((user[key] && user[key] !== '-') || '' === user[key]) {\n        acc[key] = user[key];\n      }\n      return acc;\n    }, {});\n    // console.log({ userDoc });\n    try {\n\n    const { data } = await API.graphql(graphqlOperation(updateUserRecord, { id: user.id, input: userDoc }));\n    // console.log( data.updateUserRecord);\n    if (data.updateUserRecord && data.updateUserRecord.id) {\n      setUser(data.updateUserRecord);\n      toast.success('User details updated successfully', {\n        progress: false,\n        className: 'bg-green-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n      });\n    } else {\n      toast.error('Error updating user details', {\n        progress: false,\n        className: 'bg-red-500 text-white',\n        autoClose: 1500,\n        closeButton: false,\n        icon: () => <Icons.FaTimes size={18} className=\"text-white\" />,\n      });\n    }\n    } catch (error) {\n      console.error('Error updating user details:', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: 'Error updating user details',\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n  };\n\n  const editButton = !enableEditing ? (\n    <FontAwesomeIcon\n      size=\"xl\"\n      icon={icon({ name: 'edit', style: 'solid' })}\n      onClick={() => setEnableEditing(true)}\n      //  className=\"text-pursuit-red\"\n    />\n  ) : (\n    // <Button solidBlue noPadding className=\"px-4 w-full lg:w-auto\" onClick={() => setEnableEditing(!enableEditing)}>\n    //   SAVE\n    // </Button>\n    <Button linedBlue noPadding className=\"px-4 w-full lg:w-auto uppercase\" onClick={() => handleEditSave()}>\n      Save\n    </Button>\n  );\n  // <FontAwesomeIcon\n  //   icon={icon({ name: 'edit', style: 'solid' })}\n  //   //  className=\"text-pursuit-red\"\n  // />\n\n  return (\n    <>\n      {showConfirmDisable && (\n        <PopUpConfirmation\n          title=\"Disable User\"\n          // content={`Are you sure you want to disable ${user?.firstName && user.firstName} ${user?.lastName &&\n          //   user.lastName}${!user?.firstName && !user?.lastName ? 'this user' : ''}?`}\n          content={disabledContent}\n          onCancel={() => setShowConfirmDisable(false)}\n          onConfirm={() => onDisableUser()}\n          confirmText=\"DISABLE\"\n          confirmLoading={disabling}\n          confirmDisabled={!disabledReason}\n          confirmLoadingText=\"DISABLING\"\n          destructive\n          className=\"w-11/12 lg:w-auto\"\n        />\n      )}\n\n      {showConfirmEnable && (\n        <PopUpConfirmation\n          title=\"Enable User\"\n          content={`Are you sure you want to re-enable ${user?.firstName && user.firstName} ${user?.lastName &&\n            user.lastName}${!user?.firstName && !user?.lastName ? 'this user' : ''}?`}\n          onCancel={() => setShowConfirmEnable(false)}\n          onConfirm={() => onEnableUser()}\n          confirmText=\"ENABLE\"\n          confirmLoading={enabling}\n          confirmLoadingText=\"ENABLING\"\n          className=\"w-11/12 lg:w-auto\"\n        />\n      )}\n      <Container\n        height=\"lg:min-h-104\"\n        width=\"lg:w-4/5\"\n        padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n        className=\"flex flex-col\"\n        margin=\"mx-3 md:mx-12 lg:mx-auto mt-4\">\n        <div\n          className=\"flex flex-row gap-x-6 items-center mb-12\n         \">\n          <HeaderText fontSize=\"text-4xl\" mb={'mb-noclass'} className={''}>\n            LEO User Details\n          </HeaderText>\n          <div>{editButton}</div>\n        </div>\n\n        {loading ? (\n          <div className=\"w-full flex justify-center items-center\">\n            <Spinner />\n          </div>\n        ) : (\n          <div>\n            <div className=\"flex flex-col-reverse lg:flex-row\">\n              <div className=\"w-full lg:mr-4 lg:border-r border-gray-200\">\n                <div className=\"flex flex-col\">\n                  <div className=\"flex flex-row w-full\">\n                    <div className=\"flex flex-col w-1/2\">\n                      <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">First Name</p>\n                      {enableEditing ? (\n                        <div className=\"flex flex-col w-full pr-4\">\n                          <input\n                            type=\"text\"\n                            value={user?.firstName}\n                            onChange={e => setUser({ ...user, firstName: e.target.value })}\n                            // className=\"border border-gray-300 rounded-md p-2 focus:outline-none focus:ring-2 focus:ring-guardian-blue\"\n                            className=\"textfield-bg-color  w-full h-10  px-3\"\n                          />\n                        </div>\n                      ) : (\n                        <p className=\"text-pursuit-gray mb-8\">{user?.firstName || '-'}</p>\n                      )}\n                      {/* <p className=\"text-pursuit-gray mb-8\">{user?.firstName || '-'}</p> */}\n                    </div>\n\n                    <div className=\"flex flex-col w-1/2\">\n                      <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Last Name</p>\n                      {enableEditing ? (\n                        <div className=\"flex flex-col w-full pr-4\">\n                          <input\n                            type=\"text\"\n                            value={user?.lastName}\n                            onChange={e => setUser({ ...user, lastName: e.target.value })}\n                            // className=\"border border-gray-300 rounded-md p-2 focus:outline-none focus:ring-2 focus:ring-guardian-blue\"\n                            className=\"textfield-bg-color  w-full h-10  px-3\"\n                          />\n                        </div>\n                      ) : (\n                        <p className=\"text-pursuit-gray mb-8\">{user?.lastName || '-'}</p>\n                      )}\n                      {/* <p className=\"text-pursuit-gray mb-8\">{user?.lastName || '-'}</p> */}\n                    </div>\n                  </div>\n\n                  <div className=\"flex flex-row w-full\">\n                    <div className=\"flex flex-col w-1/2\">\n                      <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Agency</p>\n                      {enableEditing ? (\n                        <div className=\"flex flex-col w-full pr-4\">\n                          <input\n                            type=\"text\"\n                            value={user?.agency === '-' ? '' : user?.agency}\n                            onChange={e => setUser({ ...user, agency: e.target.value })}\n                            // className=\"border border-gray-300 rounded-md p-2 focus:outline-none focus:ring-2 focus:ring-guardian-blue\"\n                            className=\"textfield-bg-color  w-full h-10  px-3\"\n                          />\n                        </div>\n                      ) : (\n                        <p className=\"text-pursuit-gray mb-8\">{user?.agency || '-'}</p>\n                      )}\n                    </div>\n\n                    <div className=\"flex flex-col w-1/2\">\n                      <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Department</p>\n                      {enableEditing ? (\n                        <div className=\"flex flex-col w-full pr-4\">\n                          <input\n                            type=\"text\"\n                            value={user?.department === '-' ? '' : user?.department}\n                            onChange={e => setUser({ ...user, department: e.target.value })}\n                            // className=\"border border-gray-300 rounded-md p-2 focus:outline-none focus:ring-2 focus:ring-guardian-blue\"\n                            className=\"textfield-bg-color  w-full h-10  px-3\"\n                          />\n                        </div>\n                      ) : (\n                        <p className=\"text-pursuit-gray mb-8\">{user?.department || '-'}</p>\n                      )}\n                      {/* <p className=\"text-pursuit-gray mb-8\">{user?.department || '-'}</p> */}\n                    </div>\n                  </div>\n\n                  <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Position</p>\n                  {enableEditing ? (\n                    <div className=\"flex flex-col w-full pr-4\">\n                      <input\n                        type=\"text\"\n                        value={user?.position === '-' ? '' : user?.position}\n                        onChange={e => setUser({ ...user, position: e.target.value })}\n                        // className=\"border border-gray-300 rounded-md p-2 focus:outline-none focus:ring-2 focus:ring-guardian-blue\"\n                        className=\"textfield-bg-color  w-full h-10  px-3\"\n                      />\n                    </div>\n                  ) : (\n                    <p className=\"text-pursuit-gray mb-8\">{user?.position || '-'}</p>\n                  )}\n                  {/* <p className=\"text-pursuit-gray mb-8\">{user?.position || '-'}</p> */}\n\n                  {/* <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Heard About Us</p>\n                  <p className=\"text-pursuit-gray mb-8\">{user?.heardAboutUs || '-'}</p>\n\n                  <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Date of Birth</p>\n                  <p className=\"text-pursuit-gray mb-8\">{user?.dateOfBirth || '-'}</p> */}\n                </div>\n              </div>\n\n              <div className=\"w-full lg:pl-16\">\n                {/* <div className=\"flex flex-row\">\n                  <div className=\"flex flex-col w-1/2\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Alias</p>\n                    <p className=\"text-pursuit-gray mb-8\">{user?.alias || '-'}</p>\n                  </div>\n\n                  <div className=\"flex flex-col w-1/2\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Status</p>\n                    <StatusPill status={user?.userStatus} />\n                  </div>\n                </div> */}\n\n                <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Email</p>\n                <div className=\"mb-8\">\n                  <a href={`mailto:${user?.email}`} className=\"text-guardian-blue\">\n                    {user?.email || '-'}\n                  </a>\n                </div>\n\n                {user?.country === 'United States' && (\n                  <div className=\"flex flex-row\">\n                    <div className=\"flex flex-col w-1/3\">\n                      <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">City</p>\n                      {/* <p className=\"text-pursuit-gray mb-8\">{user?.city || '-'}</p> */}\n                      {enableEditing ? (\n                        <div className=\"flex flex-col w-full pr-4\">\n                          <input\n                            type=\"text\"\n                            value={user?.city === '-' ? '' : user?.city}\n                            onChange={e => setUser({ ...user, city: e.target.value })}\n                            // className=\"border border-gray-300 rounded-md p-2 focus:outline-none focus:ring-2 focus:ring-guardian-blue\"\n                            className=\"textfield-bg-color  w-full h-10  px-3\"\n                          />\n                        </div>\n                      ) : (\n                        <p className=\"text-pursuit-gray mb-8\">{user?.city || '-'}</p>\n                      )}\n                    </div>\n                    <div className=\"flex flex-col w-1/3\">\n                      <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">State</p>\n                      {enableEditing ? (\n                        <div className=\"flex flex-col w-full pr-4\">\n                          <DropDown\n                            // value={user?.state}\n                            value={{\n                              label: parseState(user?.state),\n                              value: user?.state,\n                            }}\n                            onChange={async option => {\n                              // console.log({ option });\n                              setUser({ ...user, state: option.value });\n                            }}\n                            width=\"w-full\"\n                            containerClassName=\"mr-2\"\n                            options={states.map(state => ({ label: state.name, value: state.abbreviation }))}\n                          />\n                        </div>\n                      ) : (\n                        <p className=\"text-pursuit-gray mb-8\">{parseState(user?.state)}</p>\n                      )}\n                    </div>\n\n                    <div className=\"flex flex-col w-1/3\">\n                      <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Zip</p>\n                      {/* <p className=\"text-pursuit-gray mb-8\">{user?.zip || '-'}</p> */}\n                      {enableEditing ? (\n                        <div className=\"flex flex-col w-full pr-4\">\n                          <input\n                            type=\"text\"\n                            value={user?.zip === '-' ? '' : user?.zip}\n                            onChange={e => setUser({ ...user, zip: e.target.value })}\n                            // className=\"border border-gray-300 rounded-md p-2 focus:outline-none focus:ring-2 focus:ring-guardian-blue\"\n                            className=\"textfield-bg-color  w-full h-10  px-3\"\n                          />\n                        </div>\n                      ) : (\n                        <p className=\"text-pursuit-gray mb-8\">{user?.zip || '-'}</p>\n                      )}\n                    </div>\n                  </div>\n                )}\n\n                <div className=\"flex flex-row\">\n                  <div className=\"flex flex-col w-1/3\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Created</p>\n                    <p className=\"text-pursuit-gray mb-8\">{parseDate(user?.createdAt)}</p>\n                  </div>\n\n                  <div className=\"flex flex-col w-1/3\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Downloads</p>\n                    <p className=\"text-pursuit-gray mb-8\">{user?.downloads || '-'}</p>\n                  </div>\n\n                  <div className=\"flex flex-col w-1/3\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Last Download</p>\n                    <p className=\"text-pursuit-gray mb-8\">{parseDate(user?.lastDownloadedAt)}</p>\n                  </div>\n                </div>\n\n                {user?.certificatePath && (\n                  <div className=\"mb-8\">\n                    <Button\n                      onClick={() => getCertificate()}\n                      className=\"text-guardian-blue underline focus:outline-none\">\n                      View Certificate\n                    </Button>\n                  </div>\n                )}\n\n                {`${user?.userStatus}`.includes('DISABLED') && (\n                  <div className=\"flex flex-col\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Disabled Reason</p>\n                    <p className=\"text-pursuit-gray mb-8\">{user?.disabledReason || '-'}</p>\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">Disabled at</p>\n                    <p className=\"text-pursuit-gray mb-8\"> {user?.disabledAt || '-'} </p>\n                  </div>\n                )}\n              </div>\n            </div>\n\n            <div className=\"flex flex-col lg:flex-row lg:justify-between\">\n              {isAdmin && user?.id !== signedInUser?.id && (\n                <div className=\"flex flew-row items-end\">\n                  {/* <div className=\"flex flex-col w-full lg:w-auto\">\n                    <p className=\"light-primary-blue-text font-semibold mb-1 mr-1\">User Type</p>\n                    <DropDown\n                      value={userType}\n                      onChange={option => setUserType(option)}\n                      width=\"w-full lg:w-64\"\n                      containerClassName=\"mr-2\"\n                      options={userTypeOptions}\n                    />\n                  </div>\n\n                  <Button solidBlue noPadding className=\"px-4 ml-6\" onClick={onUpdateUserType} loading={changingType}>\n                    {changingType ? 'SAVING' : 'SAVE'}\n                  </Button> */}\n                </div>\n              )}\n\n              {user?.id !== signedInUser?.id && (\n                <div className=\"flex justify-end mt-8 w-full lg:w-auto\">\n                  {/* User notification button */}\n                  <Link to={`/messaging/create?recipients=${userId}`}>\n                    <Button\n                      linedBlue\n                      noPadding\n                      className=\"px-4 w-full lg:w-auto uppercase\"\n                      // onClick={() => setShowNotificationModal(true)}\n                      disabled>\n                      Message\n                    </Button>\n                  </Link>\n\n                  {!`${user?.userStatus}`.includes(VolunteerStatus.Disabled) ? (\n                    <Button\n                      linedRed\n                      noPadding\n                      className=\"px-4 lg:ml-6 w-full lg:w-auto\"\n                      onClick={() => setShowConfirmDisable(true)}>\n                      DISABLE\n                    </Button>\n                  ) : (\n                    <Button\n                      linedBlue\n                      noPadding\n                      className=\"px-4 lg:ml-6 w-full lg:w-auto\"\n                      onClick={() => setShowConfirmEnable(true)}>\n                      ENABLE\n                    </Button>\n                  )}\n\n                  {user?.userStatus === VolunteerStatus.Pending && (\n                    <Button\n                      solidBlue\n                      noPadding\n                      className=\"px-4 lg:ml-6 w-full lg:w-auto\"\n                      onClick={onApproveUser}\n                      loading={approving}>\n                      {approving ? 'APPROVING' : 'APPROVE'}\n                    </Button>\n                  )}\n                </div>\n              )}\n            </div>\n          </div>\n        )}\n      </Container>\n    </>\n  );\n};\n\nexport default UserDetails;\n","import React, { useCallback, useEffect, useState } from 'react';\nimport {\n  Container,\n  HeaderText,\n  Button,\n  DropDown,\n  TextField,\n  AliasGenerator,\n  CountryStateZipPicker,\n  ToolTip,\n  StatusPill,\n  Spinner,\n} from '../../../components';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { searchQuery } from '../../../generated/graphql/queries';\nimport { Link } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport * as FaIcons from 'react-icons/fa';\nimport { adminDownloadCase } from '../../../generated/graphql/mutations';\nimport { generateButtonClass } from '../../../components/Button/generateButtonClass';\nimport { useQueryState } from '../../../helpers/useQueryState';\n// Mock data for example search results\n// const searchResults = [\n//   {\n//     id: 1,\n//     caseNumber: 'ABC123',\n//     status: 'Open',\n//     assignedTo: 'John Doe',\n//   },\n//   {\n//     id: 2,\n//     caseNumber: 'DEF456',\n//     status: 'Closed',\n//     assignedTo: 'Jane Smith',\n//   },\n//   // Add more example results here...\n// ];\n\n// Page to display search results\nconst Pagination = ({ currentPage, totalPages, onPageChange }) => {\n  const pageNumbers = Array.from({ length: totalPages }, (_, i) => i + 1);\n  const currentUrl = new URLSearchParams(window.location.search);\n  // Update the page number in the query string\n  return (\n    <div className=\"flex justify-center\">\n      <ul className=\"flex\">\n        {pageNumbers.map(number => {\n          currentUrl.set('page', number);\n          const newUrl = `${window.location.pathname}?${currentUrl.toString()}`;\n          return (\n            <li key={number} className=\"flex-initial\">\n              {/* <a href=\"#\" onClick={() => onPageChange(number)} className={number === currentPage ? 'active' : ''}> */}\n              <Link\n                to={newUrl}\n                className={(number == currentPage ? 'bg-blue-500 text-white' : 'text-blue-500') + ' p-2'}>\n                {number}\n              </Link>\n            </li>\n          );\n        })}\n      </ul>\n    </div>\n  );\n};\n\nconst SearchResult = ({ item, index = null, downloadAction = caseID => {}, searchTerm = null }) => {\n  const [casePDFUrl, setCasePDFUrl] = useState(null);\n  // const { id, highlights: highlightsJson, source } = item;\n  const { id, highlights, source } = item;\n  const { caseNumber, status, reportKey } = source;\n  // const highlights = JSON.parse(highlightsJson) || {};\n\n  const getCasePDF = async caseId => {\n    const {\n      data: {\n        adminDownloadCase: { preSignedUrl },\n      },\n    } = await API.graphql({\n      query: adminDownloadCase,\n      variables: { input: { caseId } },\n      authMode: 'AWS_IAM',\n    });\n\n    setCasePDFUrl(preSignedUrl);\n  };\n\n  // Filter keys they end in .keyword\n  const filteredHighlights = Object.keys(highlights).reduce((acc, key) => {\n    // if (!key.endsWith('.keyword')) {\n    // if (!key.endsWith('.id') && !key.includes('.stepId') && !key.endsWith('.id.keyword')) {\n    acc[key] = highlights[key];\n    // }\n    return acc;\n  }, {});\n  const formattedHighlights = Object.keys(filteredHighlights).map(key => {\n    return (\n      <dl key={key}>\n        <dt className=\"ml-1 font-semibold \">{key}</dt>\n        {/* Set the html to the value of the highlight */}\n        <dd className=\"ml-3\" dangerouslySetInnerHTML={{ __html: highlights[key] }} />\n        {/* <dd>{highlights[key]}</dd> */}\n      </dl>\n    );\n  });\n  const className = generateButtonClass({ disabled: !reportKey, solidBlue: true });\n  const downloadButton = (\n    <button\n      // solidBlue\n\n      className={'w-24 ' + className}\n      disabled={!reportKey}\n      onClick={e => {\n        e.preventDefault();\n        downloadAction(id);\n      }}>\n      Download\n    </button>\n  );\n\n  const openPDFButton = !casePDFUrl ? (\n    <button\n      className={'w-24 ' + className}\n      disabled={!reportKey}\n      onClick={e => {\n        e.preventDefault();\n        getCasePDF(id);\n      }}>\n      View PDF\n    </button>\n  ) : (\n    <button\n      className={'w-24 ' + className}\n      disabled={!reportKey}\n      onClick={e => {\n        e.preventDefault();\n        setCasePDFUrl(null);\n      }}>\n      Close PDF\n    </button>\n  );\n\n  return (\n    <div className=\"mb-8 search-result\">\n      <div className=\"grid grid-flow-col auto-cols-max gap-2 primary-blue-text mb-2\">\n        {index && <div className=\"pt-1 text-xl\">{index}</div>}\n        <div className=\"py-1 text-xl\">\n          <FaIcons.FaBriefcase size={25} />\n        </div>\n        <div className=\"pt-1 text-xl\">\n          <Link to={`/case-review/${id}`}>\n            <strong>Case Number: {caseNumber}</strong>\n          </Link>\n        </div>\n        <div>\n          <StatusPill status={status} />\n        </div>\n        {downloadButton}\n        {openPDFButton}\n      </div>\n      {/* If case pdf url is set show a iframe and highlight the searched term */}\n      {casePDFUrl && (\n        <div\n          className=\"fixed top-0 bottom-0 left-0 right-0 h-screen\"\n          style={{ backgroundColor: 'rgb(100, 100, 100, 0.75)', zIndex: 40 }}\n          onClick={e => {\n            e.preventDefault();\n            setCasePDFUrl(null);\n          }}>\n          <div\n            className={`absolute flex flex-col bg-white py-6 px-8 shadow-xl ${className}`}\n            style={{ top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: '95vw', height: '90vh' }}>\n            <iframe\n              title=\"case-pdf\"\n              // Does not work yet https://issues.chromium.org/issues/40553548?pli=1\n              src={casePDFUrl + '#search=\"' + searchTerm + '\"'}\n              // src={'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'}\n              width=\"100%\"\n              height=\"100%\"\n              className=\"mb-4\"\n              style={{ border: 'none' }}\n            />\n            <div className=\"flex flex-row-reverse\">\n              <Button\n                solidBlue\n                className=\"px-3 mr-6 min-w-20 lg:min-w-24\"\n                onClick={e => {\n                  // e.preventDefault();\n                  setCasePDFUrl(null);\n                }}>\n                Close\n              </Button>\n            </div>\n          </div>\n        </div>\n      )}\n      <Link to={`/case-review/${id}`}>\n        {formattedHighlights && formattedHighlights.length > 0 && (\n          <div className=\"grid grid-cols-4  gap-2\">{formattedHighlights}</div>\n        )}\n      </Link>\n      {/* {JSON.stringify(item)} */}\n    </div>\n  );\n};\n\nSearchResult.propTypes = {\n  item: PropTypes.object.isRequired,\n  index: PropTypes.number,\n  downloadAction: PropTypes.func,\n};\n\nconst SearchPage = () => {\n  const [searchTerm, setSearchTerm] = useQueryState('q');\n  // const [title, setTitle] = useQueryState('title', state && state.title);\n  const [searchedTerm, setSearchedTerm] = useState(searchTerm);\n  const [results, setResults] = useState([]);\n  const [hasSearched, setHasSearched] = useState(false);\n  const [searchRunning, setSearchRunning] = useState(false);\n  const [downloading, setDownloading] = useState(false);\n  // const resultsPerPage = 10;\n  const [resultsPerPage] = useQueryState('limit', 10);\n  // const [currentPage, setCurrentPage] = useState(0);\n  const [currentPage, setCurrentPage] = useQueryState('page', 1);\n  const [totalPages, setTotalPages] = useState(0);\n  const [errorMessage, setErrorMessage] = useState();\n\n  // If search is set from the query string, perform the search\n  useEffect(() => {\n    if (searchTerm) {\n      performSearch();\n    }\n  }, []);\n\n  // Rerun search when page changes\n  useEffect(() => {\n    if (searchTerm) {\n      performSearch();\n    }\n  }, [currentPage]);\n\n  const cleanSearch = () => {\n    setCurrentPage(1);\n    performSearch();\n  };\n\n  const performSearch = useCallback(async () => {\n    setSearchRunning(true);\n    setErrorMessage(null);\n    // console.log('params', searchParams);\n    try {\n      const from = (currentPage - 1) * resultsPerPage || 0;\n      const {\n        data: {\n          searchQuery: { items, totalHits },\n        },\n        errors,\n      } = await API.graphql(\n        graphqlOperation(searchQuery, {\n          searchTerm,\n          limit: resultsPerPage,\n          from,\n        })\n      );\n      const totalPages = Math.ceil(totalHits / resultsPerPage);\n      console.log('Current Page', currentPage);\n      console.log('totalHits', totalHits);\n      console.log('resultsPerPage', resultsPerPage);\n      console.log('totalPages', totalPages);\n      console.log('From', from);\n      if (errors) {\n        console.error('Error searching: ', errors);\n        setResults([]);\n        setErrorMessage(errors[0].message);\n        setTotalPages(0);\n        return;\n      } else {\n        setErrorMessage(null);\n      }\n      setTotalPages(totalPages);\n      // console.log('response', response);\n\n      // Loop item highlights for each item and remove those that only have fields containing '.stepId'\n      items.forEach(item => {\n        const { highlights } = item;\n        const parsedHighlights = JSON.parse(highlights);\n        const filteredHighlights = Object.keys(parsedHighlights).reduce((acc, key) => {\n          if (\n            !key.includes('.stepId') &&\n            !key.endsWith('.id') &&\n            !key.endsWith('.id.keyword') &&\n            !key.includes('s3Key') &&\n            !key.includes('assignedTo') &&\n            !key.includes('author') &&\n            !key.includes('owner')\n          ) {\n            acc[key] = parsedHighlights[key];\n          }\n          return acc;\n        }, {});\n        // item.highlights = JSON.stringify(filteredHighlights);\n        item.highlights = filteredHighlights;\n      });\n\n      // Filter all items to those that have highlights\n      const filteredItems = items.filter(item => {\n        return Object.keys(item.highlights).length > 0;\n      });\n\n      setResults(filteredItems);\n    } catch (error) {\n      console.error('Error searching: ', error);\n      setResults([]);\n      setTotalPages(0);\n      setErrorMessage(error.errors[0].message);\n    }\n    setSearchedTerm(searchTerm);\n    setHasSearched(true);\n    setSearchRunning(false);\n  }, [searchTerm, resultsPerPage, currentPage]);\n\n  const goToPage = async page => {\n    setCurrentPage(page);\n    performSearch();\n    // setSearchRunning(true);\n    // try {\n    //   const {\n    //     data: {\n    //       searchQuery: { items, totalHits },\n    //     },\n    //   } = await API.graphql(\n    //     graphqlOperation(searchQuery, {\n    //       searchTerm,\n    //       limit: resultsPerPage,\n    //       from: (page - 1) * resultsPerPage,\n    //     })\n    //   );\n    //   setResults(items);\n    // } catch (error) {\n    //   console.error('Error searching: ', error);\n    //   setResults([]);\n    // }\n    // setSearchRunning(false);\n  };\n\n  const downloadCase = async caseId => {\n    setDownloading(true);\n\n    const {\n      data: {\n        adminDownloadCase: { preSignedUrl },\n      },\n    } = await API.graphql({\n      query: adminDownloadCase,\n      variables: { input: { caseId } },\n      authMode: 'AWS_IAM',\n    });\n\n    setDownloading(false);\n\n    window.open(preSignedUrl, '_blank');\n  };\n\n  const searchForm = (\n    <>\n      <div className=\"flex flex-col\">\n        <div className=\"flex flex-row\">\n          <p className=\"mb-1 font-light light-primary-blue-text\">Search Term</p>\n\n          <ToolTip\n            tooltipText=\"Find records with the search term included in the Case Number, First Name, Last Name, State, or Volunteer fields.\"\n            title=\"Search Term\"\n            className=\"ml-2 text-pursuit-gray\"\n          />\n        </div>\n\n        <input\n          type=\"text\"\n          value={searchTerm}\n          onChange={event => setSearchTerm(event.target.value)}\n          placeholder=\"Search Term\"\n          className=\"w-full h-10 px-4 mt-2 mb-4 bg-gray-100 lg:mb-0 lg:mt-0 lg:mr-4 lg:w-48 xl:w-64\"\n          onKeyDown={event => {\n            const pressedKey = event.key;\n\n            if (pressedKey === 'Enter') {\n              // performSearch();\n              cleanSearch();\n            }\n          }}\n        />\n      </div>\n\n      <Button solidBlue className=\"w-full px-4 lg:w-24\" onClick={cleanSearch} loading={searchRunning}>\n        Search\n      </Button>\n    </>\n  );\n\n  return (\n    <Container height=\"lg:min-h-152\" padding=\"p-4\" margin=\"m-3 lg:m-auto lg:mx-8 lg:my-8\" className=\"relative\">\n      <div className=\"flex pt-4 lg:px-4 flex-wrap\">\n        <HeaderText fontSize=\"text-4xl\" className=\"mb-12 flex-auto\">\n          Search\n        </HeaderText>\n\n        {/* Display large search form if hasSearched is false */}\n        {!hasSearched && !searchRunning && (\n          <div className=\"flex flex-grow w-full mb-10 mt-20 items-end justify-center\">{searchForm}</div>\n        )}\n\n        {(hasSearched || searchRunning) && (\n          <div className=\"flex flex-auto items-end justify-end mb-10\">{searchForm}</div>\n        )}\n        {/* {loading && (\n          <div className=\"w-full flex justify-center py-10\">\n            <Spinner />\n          </div>\n        )} */}\n      </div>\n      {searchRunning && (\n        <div className=\"w-full flex justify-center py-10\">\n          <Spinner />\n        </div>\n      )}\n      {errorMessage && (\n        <div className=\"flex-1 justify-center\">\n          <p>{errorMessage}</p>\n        </div>\n      )}\n      {!searchRunning && hasSearched && results && results.length == 0 && !errorMessage && (\n        <div className=\"flex-1 justify-center\">\n          {/* eslint-disable-next-line react/no-unescaped-entities */}\n          <p>No search results found for \"{searchedTerm}\".</p>\n        </div>\n      )}\n      {results && !searchRunning && (\n        <div className=\"flex flex-col pt-4 lg:px-4\">\n          <ul className=\"search-results\">\n            {results.map((result, index) => (\n              <li key={result.id}>\n                <SearchResult\n                  item={result}\n                  index={(currentPage > 1 ? currentPage * resultsPerPage : 0) + index + 1}\n                  downloadAction={downloadCase}\n                  searchTerm={searchTerm}\n                />\n              </li>\n            ))}\n          </ul>\n          <Pagination currentPage={currentPage} totalPages={totalPages} onPageChange={goToPage} />\n        </div>\n      )}\n    </Container>\n  );\n};\n\nexport default SearchPage;\n","import React from 'react';\n\nimport { listEmployees, listLeos } from '../../../generated/graphql/queries';\nimport { LEOGrid, StatusPill } from '../../../components';\nimport { EmployeeType, UserTypes } from '../../../constants';\n\nconst statusOptions = [\n  { value: UserTypes.LEO, label: 'Active' },\n  { value: 'DISABLED_LEO', label: 'Disabled' },\n];\n\nconst LEOUsers = () => {\n  const renderStaffType = ({ userStatus }) => (\n    <StatusPill\n      type=\"leo\"\n      status={userStatus === 'DISABLED_LEO' ? 'DISABLED' : userStatus === 'LEO' ? 'ACTIVE' : userStatus}\n    />\n  );\n\n  const statusColumn = { title: 'Status', fieldName: 'userStatus', renderFunction: renderStaffType, sortable: false };\n\n  return (\n    <LEOGrid\n      query={listLeos}\n      queryName=\"listLeos\"\n      statusOptions={statusOptions}\n      title=\"LEO Users\"\n      statusColumn={statusColumn}\n      statusFilterLabel=\"Status\"\n      createUserDefaultType={UserTypes.Staff}\n    />\n  );\n};\n\nexport default LEOUsers;\n","import React, { useState, useContext, useMemo } from 'react';\nimport { useLocation, useHistory } from 'react-router-dom';\nimport { API, graphqlOperation } from 'aws-amplify';\nimport { DateTime } from 'luxon';\nimport { toast } from 'react-toastify';\nimport * as Icons from 'react-icons/fa';\nimport DatePicker from 'react-datepicker';\nimport states from 'states-us';\n\nimport {\n  Container,\n  HeaderText,\n  Button,\n  DropDown,\n  TextField,\n  AliasGenerator,\n  CountryStateZipPicker,\n} from '../../../components';\nimport { NotificationContext } from '../../../helpers/AlertContext/AlertContext.js';\nimport { adminCreateLeo } from '../../../generated/graphql/mutations';\nimport { UserTypes } from '../../../constants';\nimport { validateAdminCreateLEOUser } from '../../../helpers/createAccount/createAccountValidation';\n\nconst CreateLEO = () => {\n  const history = useHistory();\n\n  const { state: routeState } = useLocation();\n\n  const [, setAlert] = useContext(NotificationContext);\n\n  const defaultState = {\n    firstName: '',\n    lastName: '',\n    email: '',\n    agency: '',\n    department: '',\n    position: '',\n    zip: '',\n    city: '',\n    userType: UserTypes.LEO,\n    state: '',\n  };\n\n  const [newUser, setNewUser] = useState(defaultState);\n\n  // const selectedState = useMemo(\n  // const selectedState = states.find(x => x.abbreviation === newUser.state);\n  //   [states, newUser]\n  // );\n\n  const [alias, setAlias] = useState('');\n  const [aliasClearedAt, setAliasClearedAt] = useState(null);\n\n  const [saving, setSaving] = useState();\n\n  const userTypeOptions = [\n    { label: 'Volunteer', value: UserTypes.Volunteer },\n    { label: 'Staff', value: UserTypes.Staff },\n    { label: 'Admin', value: UserTypes.Admin },\n  ];\n\n  const createUser = async () => {\n    try {\n      setSaving(true);\n      console.log({ newUser });\n\n      const stateIsValid = validateAdminCreateLEOUser(setAlert, {\n        firstName: newUser.firstName,\n        lastName: newUser.lastName,\n        email: newUser.email,\n        // dateOfBirth: newUser.dateOfBirth,\n        country: newUser.country,\n        state: newUser.state,\n        // zip: newUser.zip,\n      });\n\n      if (stateIsValid) {\n        // const formattedDOB = DateTime.fromJSDate(newUser.dateOfBirth).toFormat('MM/dd/yyyy');\n\n        const {\n          data: { adminCreateLEO: user = null },\n        } = await API.graphql(\n          graphqlOperation(adminCreateLeo, {\n            input: {\n              firstName: newUser.firstName,\n              lastName: newUser.lastName,\n              email: newUser.email,\n              // alias,\n              // dateOfBirth: formattedDOB,\n              country: 'United States',\n              agency: newUser.agency,\n              department: newUser.department,\n              position: newUser.position,\n              city: newUser.city,\n              state: newUser.state,\n              zip: newUser.zip,\n              userType: 'LEO',\n            },\n          })\n        );\n\n        toast.success('User Created', {\n          progress: false,\n          className: 'bg-green-500 text-white',\n          autoClose: 1500,\n          closeButton: false,\n          icon: () => <Icons.FaCheck size={18} className=\"text-white\" />,\n        });\n\n        // history.push(`/user/${user.id}`);\n        history.push(`/admin/leo`);\n      }\n    } catch (error) {\n      let errorMessage = 'An error occurred attempting to create the user.';\n\n      if (error.errors && Array.isArray(error.errors)) {\n        const userExistsError = error.errors.find(x => x.errorType === 'UsernameExistsException');\n\n        if (userExistsError) {\n          errorMessage = `Error creating user - ${userExistsError.message}`;\n        }\n      }\n\n      console.error('Error creating user: ', error);\n\n      setAlert({\n        type: 'SET_NOTIFICATION',\n        payload: {\n          occurs: true,\n          message: errorMessage,\n          textColor: 'redText',\n          borderColor: 'redBorder',\n        },\n      });\n    }\n\n    setSaving(false);\n  };\n\n  return (\n    <Container\n      height=\"lg:min-h-104\"\n      width=\"lg:w-4/5\"\n      padding=\"p-4 md:px-10 md:py-8 lg:px-20\"\n      className=\"flex flex-col\"\n      margin=\"mx-3 md:mx-12 lg:mx-auto mt-4\">\n      <HeaderText fontSize=\"text-4xl\" className=\"mb-12\">\n        Create New User\n      </HeaderText>\n\n      <div>\n        <div className=\"flex flex-col-reverse lg:flex-row\">\n          <div className=\"flex flex-col lg:w-1/2 lg:mr-8\">\n            <TextField\n              value={newUser.firstName}\n              onChange={e => setNewUser({ ...newUser, firstName: e.target.value })}\n              label=\"First Name\"\n              className=\"mb-4\"\n              required\n              tabindex=\"1\"\n            />\n            <TextField\n              value={newUser.email}\n              onChange={e => setNewUser({ ...newUser, email: e.target.value })}\n              label=\"Email Address\"\n              className=\"mb-4\"\n              required\n              tabindex=\"3\"\n            />\n\n            <TextField\n              value={newUser.department}\n              onChange={e => setNewUser({ ...newUser, department: e.target.value })}\n              label=\"Department\"\n              className=\"mb-4\"\n              tabindex=\"5\"\n            />\n\n            <TextField\n              value={newUser.city}\n              onChange={e => setNewUser({ ...newUser, city: e.target.value })}\n              label=\"City\"\n              className=\"mb-4\"\n              required\n              tabindex=\"7\"\n            />\n          </div>\n\n          <div className=\"flex flex-col lg:w-1/2 lg:ml-8\">\n            <TextField\n              value={newUser.lastName}\n              onChange={e => setNewUser({ ...newUser, lastName: e.target.value })}\n              label=\"Last Name\"\n              className=\"mb-4\"\n              required\n              tabindex={2}\n            />\n\n            <TextField\n              value={newUser.agency}\n              onChange={e => setNewUser({ ...newUser, agency: e.target.value })}\n              label=\"Agency\"\n              className=\"mb-4\"\n              tabindex={4}\n            />\n\n            <TextField\n              value={newUser.position}\n              onChange={e => setNewUser({ ...newUser, position: e.target.value })}\n              label=\"Position\"\n              className=\"mb-4\"\n              tabindex={6}\n            />\n\n            <div className=\"flex flex-col lg:flex-row\">\n              <DropDown\n                // value={newUser.state}\n                // value={selectedState}\n                value={states.find(x => x.abbreviation === newUser.state)}\n                // onChange={option => setState(option.abbreviation)}\n                onChange={option => setNewUser({ ...newUser, state: option.abbreviation })}\n                label=\"State\"\n                containerClassName=\"mb-4 lg:mr-2\"\n                options={states}\n                getOptionLabel={option => option.name}\n                getOptionValue={option => option.abbreviation}\n                required\n                tabIndex={8}\n              />\n\n              <TextField\n                value={newUser.zip}\n                onChange={e => setNewUser({ ...newUser, zip: e.target.value })}\n                label=\"Zip Code\"\n                className=\"mb-4\"\n                required\n                tabindex={10}\n              />\n            </div>\n            {/* <AliasGenerator alias={alias} setAlias={setAlias} excludeHeader clearedAt={aliasClearedAt} /> */}\n\n            {/* <div className=\"flex flex-col w-full lg:w-auto\">\n              <DropDown\n                value={userTypeOptions.find(x => x.value === newUser.userType) || null}\n                onChange={option => setNewUser({ ...newUser, userType: option.value })}\n                width=\"w-full\"\n                containerClassName=\"mr-2 mb-4\"\n                options={userTypeOptions}\n                label=\"User Type\"\n                required\n              />\n            </div> */}\n          </div>\n        </div>\n        <div className=\"flex flex-row justify-end mt-4\">\n          <Button\n            linedBlue\n            noPadding\n            className=\"px-4 lg:ml-6 w-full lg:w-auto mr-2\"\n            onClick={() => {\n              setNewUser(defaultState);\n              setAliasClearedAt(new Date().toISOString());\n            }}>\n            CLEAR\n          </Button>\n\n          <Button solidBlue noPadding className=\"px-4 ml-2 w-full lg:w-auto\" onClick={createUser} loading={saving}>\n            {saving ? 'CREATING' : 'CREATE'}\n          </Button>\n        </div>\n      </div>\n    </Container>\n  );\n};\n\nexport default CreateLEO;\n","import React from 'react';\nimport { Switch, Route, useLocation } from 'react-router-dom';\n\nimport { CreateUser, LEODetails, StaffUsers, SearchPage } from '../pages/admin';\nimport LEOUsers from '../pages/admin/LEOUsers';\nimport CreateLEO from '../pages/admin/CreateLEO';\n\nconst AdminRouting = () => {\n  const location = useLocation();\n\n  const adminPath = '/admin';\n\n  return (\n    <Switch location={location} key={location.pathname}>\n      <Route path={`${adminPath}/create-user`}>\n        <CreateUser />\n      </Route>\n\n      <Route path={`${adminPath}/create-leo`}>\n        <CreateLEO />\n      </Route>\n\n\n\n      <Route path={`${adminPath}/staff`}>\n        <StaffUsers />\n      </Route>\n      <Route path={`${adminPath}/leo`}>\n        <LEOUsers />\n      </Route>\n      <Route path={`${adminPath}/leo-user/:userId`}>\n        <LEODetails />\n      </Route>\n      <Route path={`${adminPath}/search`}>\n        <SearchPage />\n      </Route>\n    </Switch>\n  );\n};\n\nexport default AdminRouting;\n","import React, { useState, useEffect } from 'react';\nimport { Switch, Route, BrowserRouter, Redirect } from 'react-router-dom';\nimport { API, graphqlOperation, Auth } from 'aws-amplify';\nimport * as Icons from 'react-icons/fa';\nimport ReactPlayer from 'react-player';\n\nimport { updateUser } from '../generated/graphql/mutations';\n\nimport {\n  AliasGenerator,\n  AuthHeader,\n  PopUpConfirmation,\n  RulesAndGuidelines,\n  PrivateRoute,\n  AlertHandler,\n  LoggedInHeader,\n  NavBar,\n  Footer,\n  Page,\n  Spinner,\n} from '../components';\n\nimport { RequiredTraining, CertificateUpload, CaseDownload, ThankYou, TermsOfUse, Privacy } from '../pages/public';\nimport { Settings, KnowledgeBase, Leaderboard } from '../pages/private';\nimport { Login, CreateAccount, ForgotPassword, Welcome } from '../pages/auth';\nimport { useUser } from '../contexts/userContext';\n\nimport VolunteerRouting from './volunteerRouting';\nimport EmployeeRouting from './employeeRouting';\nimport AdminRouting from './adminRouting';\n\nimport { UserGroups } from '../constants';\n\nconst USE_VOLUNTEER_VIEW = 'USE_VOLUNTEER_VIEW';\nconst RULES_KEY = 'rules_v1';\n\nconst AppRouter = () => {\n  const { user, isLoading, setUser, userGroups, isCertified, isAdmin, isEmployee } = useUser();\n\n  const [sidebarOpen, setSidebarOpen] = useState(false);\n  const [showVideo, setShowVideo] = useState(false);\n  const [showRules, setShowRules] = useState(false);\n  const [agreedToRules, setAgreedToRules] = useState(false);\n  const [showVideoClose, setShowVideoClose] = useState(false);\n  const [userAlias, setUserAlias] = useState(user?.alias);\n  const [aliasMessage, setAliasMessage] = useState('You must select an alias before continuing.');\n\n  const isCertifiedOrEmployee = isCertified || isEmployee;\n\n  const checkForVolunteerView = () => {\n    const useVolunteerSavedPref = localStorage.getItem(USE_VOLUNTEER_VIEW);\n\n    if (useVolunteerSavedPref && useVolunteerSavedPref.toLowerCase() === 'true') {\n      return true;\n    }\n\n    return false;\n  };\n\n  const saveUserAlias = async alias => {\n    try {\n      const currentAuthUser = await Auth.currentAuthenticatedUser();\n      const updated = await Auth.updateUserAttributes(currentAuthUser, {\n        nickname: alias,\n      });\n      const dbUpdated = await API.graphql(graphqlOperation(updateUser, { input: { alias } }));\n      console.log({ updated, dbUpdated });\n      return updated;\n    } catch (error) {\n      console.error('Error saving alias: ', error);\n    }\n  };\n\n  // Update the alias for the user\n  // const setAlias = alias => {\n  //   console.log({ ...user, alias });\n  //   setUser({ ...user, alias });\n  // };\n\n  const [useVolunteerView, setUseVolunteerView] = useState(checkForVolunteerView());\n\n  const updateVolunteerView = enabled => {\n    setUseVolunteerView(enabled);\n\n    localStorage.setItem(USE_VOLUNTEER_VIEW, enabled.toString());\n  };\n\n  const userId = user?.id;\n\n  useEffect(() => {\n    if (!isCertified && !isEmployee) {\n      return;\n    }\n\n    const seenRules = localStorage.getItem(RULES_KEY);\n\n    // Admins and Employees should not be auto prompted with rules/guidelines\n    if (!seenRules && !isEmployee) {\n      setShowRules(true);\n    } else if (isEmployee) {\n      setShowRules(false);\n    } else {\n      setAgreedToRules(true);\n    }\n  }, [isCertified, isEmployee, userId]);\n\n  const useEmployeeRouting = isEmployee && !useVolunteerView;\n\n  const employeeGroups = [UserGroups.Employee, UserGroups.Admin];\n  const allGroups = [UserGroups.Certified, ...employeeGroups];\n\n  const completedTraining = Array.isArray(userGroups) && userGroups.some(x => allGroups.includes(x));\n\n  const onFinishedIntroVideo = async () => {\n    setUser({ ...user, watchedIntroVideo: true });\n\n    try {\n      await API.graphql(graphqlOperation(updateUser, { input: { watchedIntroVideo: true } }));\n    } catch (error) {\n      console.error('Error saving video progress: ', error);\n    }\n  };\n\n  if (isLoading) {\n    return (\n      <div className=\"flex flex-col h-screen justify-center items-center\">\n        <Spinner className=\"h-24 w-24 text-pursuit-red\" />\n      </div>\n    );\n  }\n\n  if (!user && !isLoading) {\n    return (\n      <div className=\"flex flex-col min-h-screen overflow-y-hidden\">\n        <div className=\"flex flex-col min-h-screen\">\n          <BrowserRouter>\n            <AuthHeader />\n\n            <Page>\n              <AlertHandler />\n\n              <Switch>\n                <Route exact path=\"/\">\n                  <Welcome />\n                </Route>\n\n                <Route exact path=\"/login\">\n                  <Login />\n                </Route>\n\n                <Route exact path=\"/forgot-password\">\n                  <ForgotPassword />\n                </Route>\n\n                <Route exact path=\"/create-account\">\n                  <CreateAccount />\n                </Route>\n\n                <Route exact path=\"/case-download\">\n                  <CaseDownload />\n                </Route>\n\n                <Route path=\"*\">\n                  <Redirect to=\"/\" />\n                </Route>\n              </Switch>\n            </Page>\n          </BrowserRouter>\n        </div>\n      </div>\n    );\n  }\n\n  if (user && !isLoading && userGroups) {\n    return (\n      <div className=\"flex flex-col min-h-screen overflow-y-hidden\">\n        <BrowserRouter>\n          <LoggedInHeader\n            menuLeft={\n              completedTraining ? (\n                <div className=\"flex items-center justify-center w-16 h-12 bg-white cursor-pointer text-pursuit-darkred lg:h-24\">\n                  <Icons.FaBars onClick={() => setSidebarOpen(!sidebarOpen)} size={25} />\n                </div>\n              ) : (\n                <div />\n              )\n            }\n            setUseVolunteerView={updateVolunteerView}\n            useVolunteerView={useVolunteerView}\n            isEmployee={isEmployee}\n          />\n\n          <div className=\"flex flex-row flex-1\">\n            <NavBar\n              open={sidebarOpen}\n              setOpen={setSidebarOpen}\n              hidden={!completedTraining}\n              showRules={() => setShowRules(true)}\n              showIntroVideo={() => setShowVideo(true)}\n              useEmployeeRouting={useEmployeeRouting}\n              isAdmin={isAdmin}\n            />\n\n            {showRules && isCertifiedOrEmployee && !!user?.alias && (\n              <PopUpConfirmation\n                title=\"Project 1591® - Rules and Guidelines\"\n                content={<RulesAndGuidelines />}\n                onConfirm={() => {\n                  setAgreedToRules(true);\n                  setShowRules(false);\n\n                  localStorage.setItem(RULES_KEY, 'true');\n                }}\n                confirmText={!agreedToRules ? 'AGREE' : 'DISMISS'}\n                noCancel\n                className=\"w-11/12 overflow-y-auto lg:w-auto\"\n                contentWrapper=\"h-88 lg:h-128 overflow-y-auto\"\n                forceScrollBottom={!agreedToRules}\n              />\n            )}\n\n            {(!showRules && isCertified && !isEmployee && !user.watchedIntroVideo && !!user.alias) ||\n            (!showRules && showVideo) ? (\n              <PopUpConfirmation\n                title=\"How To Use PROJECT 1591®\"\n                content={\n                  <>\n                    <ReactPlayer\n                      url=\"https://pursuit-public-assets.s3.us-west-2.amazonaws.com/tutorial_video.mp4\"\n                      width=\"1000px\"\n                      height=\"600px\"\n                      className=\"hidden w-full mt-4 bg-black lg:block\"\n                      playsinline\n                      playing\n                      controls={showVideoClose || user.watchedIntroVideo || isEmployee}\n                      onEnded={() => setShowVideoClose(true)}\n                      light\n                    />\n\n                    <ReactPlayer\n                      url=\"https://pursuit-public-assets.s3.us-west-2.amazonaws.com/tutorial_video.mp4\"\n                      width=\"100%\"\n                      height=\"250px\"\n                      className=\"w-full mt-4 bg-black lg:hidden\"\n                      playsinline\n                      playing\n                      controls={showVideoClose || user.watchedIntroVideo || isEmployee}\n                      onEnded={() => setShowVideoClose(true)}\n                      light\n                    />\n\n                    {!showVideoClose && !user.watchedIntroVideo && !isEmployee && (\n                      <p className=\"mt-4 text-pursuit-gray\">\n                        You must watch the intro video in full before continuing.\n                      </p>\n                    )}\n                  </>\n                }\n                onConfirm={() => {\n                  if (!user.watchedIntroVideo) {\n                    onFinishedIntroVideo();\n                  }\n\n                  setShowVideo(false);\n                }}\n                noCancel\n                noConfirm={!showVideoClose && !user.watchedIntroVideo && !isEmployee}\n                confirmText=\"DISMISS\"\n                className=\"w-11/12 lg:w-auto h-10/12 lg:h-auto\"\n              />\n            ) : null}\n\n            {(showRules && isCertified && !isEmployee && !user.alias) || (showRules && showVideo) ? (\n              <PopUpConfirmation\n                title=\"Create your alias\"\n                content={\n                  <div style={{ minWidth: '500px' }}>\n                    <AliasGenerator\n                      alias={userAlias /* || user.alias*/}\n                      setAlias={setUserAlias}\n                      setMessage={setAliasMessage}\n                    />\n\n                    {(!userAlias && !isEmployee) ||\n                      (aliasMessage && (\n                        // <p className=\"mt-4 text-pursuit-gray\">You must select an alias before continuing.</p>\n                        <>\n                          <p className=\"mt-4 text-pursuit-gray\">\n                            {aliasMessage || 'You must select an alias before continuing.'}\n                          </p>\n                          {JSON.stringify({ userAlias, aliasMessage })}\n                        </>\n                      ))}\n                  </div>\n                }\n                onConfirm={async () => {\n                  // if (!user.watchedIntroVideo) {\n                  //   onFinishedIntroVideo();\n                  // }\n\n                  // setShowVideo(false);\n                  // setUser({ ...user, alias: userAlias });\n                  // console.log({ userAlias });\n\n\n                  const result = await saveUserAlias(userAlias);\n                  console.log({ result });\n                  setUser({ ...user, alias: userAlias });\n                }}\n                noCancel\n                noConfirm={!userAlias && !isEmployee}\n                confirmText=\"Set Alias\"\n                contentWrapper={\"relative\"}\n                className=\"w-11/12 lg:w-auto h-10/12 lg:h-auto\"\n              />\n            ) : null}\n\n            <div className=\"flex flex-col flex-1 w-full\">\n              <Page>\n                <AlertHandler />\n\n                <Switch>\n                  <Route path=\"/terms-of-use\">\n                    <TermsOfUse />\n                  </Route>\n\n                  <Route path=\"/privacy\">\n                    <Privacy />\n                  </Route>\n\n                  <Route path=\"/required-training\">\n                    {completedTraining ? <Redirect to=\"/\" /> : <RequiredTraining />}\n                  </Route>\n\n                  <Route path=\"/certificate-upload\">\n                    {completedTraining ? <Redirect to=\"/\" /> : <CertificateUpload />}\n                  </Route>\n\n                  <Route path=\"/thank-you\">{completedTraining ? <Redirect to=\"/\" /> : <ThankYou />}</Route>\n\n                  <Route path=\"/case-download\">\n                    <CaseDownload />\n                  </Route>\n\n                  <PrivateRoute path=\"/settings\" allowedGroups={allGroups}>\n                    <Settings />\n                  </PrivateRoute>\n\n                  <PrivateRoute path=\"/knowledge\" allowedGroups={allGroups}>\n                    <KnowledgeBase />\n                  </PrivateRoute>\n\n                  <PrivateRoute path=\"/leaderboard\" allowedGroups={allGroups}>\n                    <Leaderboard />\n                  </PrivateRoute>\n\n                  <PrivateRoute path=\"/admin\" allowedGroups={[UserGroups.Admin]}>\n                    <AdminRouting />\n                  </PrivateRoute>\n\n                  <PrivateRoute path=\"/\" allowedGroups={useEmployeeRouting ? employeeGroups : allGroups}>\n                    {useEmployeeRouting ? (\n                      <EmployeeRouting />\n                    ) : (\n                      <VolunteerRouting\n                        showVideo={showVideo}\n                        showRules={showRules}\n                        setShowRules={setShowRules}\n                        setShowVideo={setShowVideo}\n                      />\n                    )}\n                  </PrivateRoute>\n                </Switch>\n              </Page>\n\n              <Footer />\n            </div>\n          </div>\n        </BrowserRouter>\n      </div>\n    );\n  }\n};\n\nexport default AppRouter;\n","const awsmobile = {\n  \"aws_project_region\": \"us-west-2\",\n  \"aws_cognito_region\": \"us-west-2\",\n  \"aws_appsync_region\": \"us-west-2\",\n  \"aws_user_files_s3_bucket_region\": \"us-west-2\",\n  \"aws_appsync_authenticationType\": \"AMAZON_COGNITO_USER_POOLS\",\n  \"aws_cognito_login_mechanisms\": [\n    \"PREFERRED_USERNAME\"\n  ],\n  \"aws_cognito_signup_attributes\": [\n    \"EMAIL\"\n  ],\n  \"aws_cognito_mfa_configuration\": \"OFF\",\n  \"aws_cognito_mfa_types\": [\n    \"SMS\"\n  ],\n  \"aws_cognito_password_protection_settings\": {\n    \"passwordPolicyMinLength\": 8,\n    \"passwordPolicyCharacters\": []\n  },\n  \"aws_cognito_verification_mechanisms\": [\n    \"EMAIL\"\n  ],\n  \"aws_cognito_identity_pool_id\": \"us-west-2:2d3ee422-9518-43cb-8e6d-3be6cf42fc7f\",\n  \"aws_user_pools_id\": \"us-west-2_tSeggNUqv\",\n  \"aws_user_pools_web_client_id\": \"h4bjsivhpmodnia3nr1120v15\",\n  \"aws_appsync_graphqlEndpoint\": \"https://27otzvn3vjgb7f6y5chabuiila.appsync-api.us-west-2.amazonaws.com/graphql\",\n  \"aws_user_files_s3_bucket\": \"pursuit-storage-production\"\n}; \n\nexport default awsmobile;","import React, { useState, useEffect, useCallback } from 'react';\nimport { Amplify, API, Auth, graphqlOperation } from 'aws-amplify';\nimport debounce from 'lodash.debounce';\nimport { ToastContainer } from 'react-toastify';\nimport { useIdleTimer } from 'react-idle-timer';\nimport ReactGA from 'react-ga4';\nimport AppRouting from './routing';\nimport { UserProvider } from './contexts/userContext';\nimport { useFocus } from './contexts/focusContext';\nimport AlertStore from './helpers/AlertContext/AlertContext.js';\nimport { addActiveTimeS } from './generated/graphql/mutations';\n// import { registerLocale, setDefaultLocale } from  \"react-datepicker\";\n// import { es } from 'date-fns/locale/es';\n\nimport config from './generated/aws-exports';\n\nAmplify.configure(config);\n\nAPI.configure({\n  graphql_headers: async () => {\n    try {\n      const currentSession = await Auth.currentSession();\n\n      const authorization = currentSession.getIdToken().getJwtToken();\n\n      return {\n        Authorization: authorization,\n      };\n    } catch (error) {\n      //\n    }\n  },\n});\n\n// registerLocale('es', es)\n\nconst App = () => {\n  useEffect(() => {\n    if (typeof process.env.REACT_APP_GOOGLE_MEASUREMENT_ID === 'string') {\n      const ids = process.env.REACT_APP_GOOGLE_MEASUREMENT_ID.split(',');\n      const gaConfig = ids.map(id => ({\n        trackingId: id,\n\n        // gaOptions: {\n        //   debug_mode: true\n        // }\n      }));\n\n      // Enable debugging for development\n      if (process.env.NODE_ENV === 'development') {\n        gaConfig[0].gaOptions = {\n          debug_mode: true,\n        };\n      }\n\n      // gaConfig[0].debug_mode = true;\n      // console.log('gaConfig', gaConfig);\n\n      ReactGA.initialize(gaConfig);\n    }\n  }, []);\n\n  const [user, setUser] = useState(null);\n  const { isFocused } = useFocus();\n  const autoLogoffTime = 1000 * 60 * 60 * 2;\n\n  const DEBOUNCE_SAVE_DELAY_MS = 250;\n\n  useEffect(() => {\n    const lastSavedTime = parseInt(localStorage.getItem('lastSavedTime'));\n    const currTime = parseInt(new Date().getTime() / 1000);\n\n    if (currTime - autoLogoffTime / 1000 > lastSavedTime) {\n      signOutUser();\n    }\n  }, []);\n\n  useEffect(() => {\n    if (isFocused) {\n      const lastSavedTime = parseInt(localStorage.getItem('lastSavedTime'));\n      const currTime = parseInt(new Date().getTime() / 1000);\n\n      if (lastSavedTime !== null && currTime - autoLogoffTime / 1000 > lastSavedTime) {\n        signOutUser();\n      }\n    }\n  }, [isFocused]);\n\n  const handleOnIdle = async () => {\n    // if user goes idle, do not increment activeTimeMS. The previous time was not active.\n    signOutUser();\n  };\n\n  const handleOnActionWithDebounce = useCallback(\n    debounce(async () => {\n      await handleOnAction();\n    }, DEBOUNCE_SAVE_DELAY_MS),\n    [user]\n  );\n\n  const handleOnAction = async () => {\n    const lastSavedTime = parseInt(localStorage.getItem('lastSavedTime'));\n    const currTime = parseInt(new Date().getTime() / 1000);\n\n    const min15 = 60 * 15; // save after 2 min\n\n    if (user !== null) {\n      if (currTime - lastSavedTime > min15) {\n        await addActiveTime(lastSavedTime, currTime);\n      }\n    }\n  };\n\n  const { reset } = useIdleTimer({\n    crossTab: {\n      type: 'localStorage',\n      emitOnAllTabs: true,\n    },\n    timeout: autoLogoffTime,\n    onIdle: handleOnIdle,\n    onAction: handleOnActionWithDebounce,\n    debounce: 500,\n  });\n\n  const addActiveTime = async (lastSavedTime, currTime) => {\n    const input = {\n      lastSavedTime,\n      currTime,\n    };\n\n    try {\n      const newLastSavedTime = await API.graphql(graphqlOperation(addActiveTimeS, { input }));\n\n      localStorage.setItem('lastSavedTime', `${newLastSavedTime.data.addActiveTimeS}`);\n    } catch (error) {\n      console.error('error on adding activeTime', error);\n    }\n  };\n\n  const signOutUser = () => {\n    Auth.signOut();\n\n    setUser(null);\n    reset(); // reset idleTimer\n\n    try {\n      localStorage.clear();\n    } catch (error) {\n      console.error(error);\n    }\n    console.log('logged off');\n  };\n\n  if (!localStorage.getItem('lastSavedTime') || !localStorage.getItem('timeSessionStarted')) {\n    const currTime = parseInt(new Date().getTime() / 1000);\n\n    localStorage.setItem('timeSessionStarted', currTime);\n    localStorage.setItem('lastSavedTime', currTime);\n    reset();\n  }\n\n  return (\n    <UserProvider user={user} setUser={setUser}>\n      <AlertStore>\n        <AppRouting key={`${user?.id}-routing`} />\n\n        <ToastContainer position=\"top-right\" closeOnClick pauseOnFocusLoss pauseOnHover className=\"mt-24\" />\n      </AlertStore>\n    </UserProvider>\n  );\n};\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.0/8 are considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\nexport function register(config) {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            'This web app is being served cache-first by a service ' +\n              'worker. To learn more, visit https://bit.ly/CRA-PWA'\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl, config) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then(registration => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              console.log(\n                'New content is available and will be used when all ' +\n                  'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: { 'Service-Worker': 'script' },\n  })\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get('content-type');\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf('javascript') === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      );\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready\n      .then(registration => {\n        registration.unregister();\n      })\n      .catch(error => {\n        console.error(error.message);\n      });\n  }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport 'react-toastify/dist/ReactToastify.css';\nimport './assets/custom.css';\nimport './assets/tailwind-compiled.css';\nimport 'react-datepicker/dist/react-datepicker.css';\nimport { FocusContextProvider } from './contexts/focusContext';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\n// ReactDOM.render(<App />, document.getElementById('root'));\n\nReactDOM.render(\n  <React.StrictMode>\n    <FocusContextProvider>\n      <App />\n    </FocusContextProvider>\n  </React.StrictMode>,\n  document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"validity\":\"styles_validity__3iF6x\",\"sourceField\":\"styles_sourceField__dO2Is\",\"label\":\"styles_label__1x3x3\",\"sourceInput\":\"styles_sourceInput__n-H9S\"};","module.exports = __webpack_public_path__ + \"static/media/trash.1d629d1e.svg\";","module.exports = __webpack_public_path__ + \"static/media/guardian_group_logo.2cc1bda2.svg\";"],"sourceRoot":""}