{
  "version": 3,
  "sources": ["../node_modules/actioncable/lib/assets/compiled/action_cable.js", "../app/javascript/packs/internal.tsx", "../app/javascript/components/maintaining/SubmissionsSummaryTable.tsx", "../app/javascript/components/mentoring/Inbox.tsx", "../app/javascript/components/mentoring/inbox/DiscussionList.tsx", "../app/javascript/components/mentoring/inbox/Discussion.tsx", "../app/javascript/components/mentoring/inbox/StatusTab.tsx", "../app/javascript/components/mentoring/TextFilter.tsx", "../app/javascript/components/mentoring/Sorter.tsx", "../app/javascript/components/mentoring/inbox/TrackFilter.tsx", "../app/javascript/components/mentoring/inbox/TrackList.tsx", "../app/javascript/components/mentoring/Queue.tsx", "../app/javascript/components/mentoring/queue/useTrackList.tsx", "../app/javascript/components/mentoring/queue/useExerciseList.tsx", "../app/javascript/components/mentoring/queue/useMentoringQueue.tsx", "../app/javascript/components/mentoring/queue/TrackFilterList.tsx", "../app/javascript/components/modals/MentorChangeTracksModal.tsx", "../app/javascript/components/mentoring/TrackSelector.tsx", "../app/javascript/components/mentoring/track-selector/TracksList.tsx", "../app/javascript/components/mentoring/track-selector/TrackCheckbox.tsx", "../app/javascript/components/mentoring/track-selector/SelectedTracksMessage.tsx", "../app/javascript/components/mentoring/track-selector/ContinueButton.tsx", "../app/javascript/components/mentoring/track-selector/SearchBar.tsx", "../app/javascript/components/mentoring/queue/ExerciseFilterList.tsx", "../app/javascript/components/mentoring/queue/SolutionList.tsx", "../app/javascript/components/mentoring/queue/Solution.tsx", "../app/javascript/components/mentoring/Session.tsx", "../app/javascript/components/mentoring/session/CloseButton.tsx", "../app/javascript/components/mentoring/session/SessionInfo.tsx", "../app/javascript/components/mentoring/session/Guidance.tsx", "../app/javascript/components/common/Accordion.tsx", "../app/javascript/components/mentoring/session/MentorNotes.tsx", "../app/javascript/components/mentoring/session/guidance/ExemplarFilesList.tsx", "../app/javascript/components/mentoring/session/Scratchpad.tsx", "../app/javascript/components/mentoring/session/StudentInfo.tsx", "../app/javascript/components/mentoring/session/FavoriteButton.tsx", "../app/javascript/components/mentoring/session/favorite-button/AddFavoriteButton.tsx", "../app/javascript/components/mentoring/session/favorite-button/RemoveFavoriteButton.tsx", "../app/javascript/components/mentoring/session/PreviousSessionsLink.tsx", "../app/javascript/components/modals/PreviousMentoringSessionsModal.tsx", "../app/javascript/components/mentoring/session/IterationView.tsx", "../app/javascript/components/mentoring/session/iteration-view/IterationHeader.tsx", "../app/javascript/components/mentoring/session/iteration-view/iteration-header/DownloadButton.tsx", "../app/javascript/components/mentoring/session/iteration-view/iteration-header/CopyButton.tsx", "../app/javascript/components/mentoring/session/LinkButton.tsx", "../app/javascript/components/mentoring/discussion/DiscussionDetails.tsx", "../app/javascript/components/mentoring/discussion/FinishedWizard.tsx", "../app/javascript/components/mentoring/discussion/finished-wizard/MentorAgainStep.tsx", "../app/javascript/components/mentoring/discussion/finished-wizard/FavoriteStep.tsx", "../app/javascript/components/mentoring/discussion/finished-wizard/FinishStep.tsx", "../app/javascript/components/mentoring/discussion/DiscussionPostList.tsx", "../app/javascript/components/mentoring/discussion/usePostHighlighting.tsx", "../app/javascript/components/mentoring/discussion/PostsContext.tsx", "../app/javascript/components/mentoring/session/IterationMarker.tsx", "../app/javascript/components/mentoring/session/AutomatedFeedbackSummary.tsx", "../app/javascript/components/mentoring/session/AutomatedFeedbackModal.tsx", "../app/javascript/components/mentoring/session/useIterationScrolling.tsx", "../app/javascript/components/mentoring/discussion/discussion-post-list/use-posts.tsx", "../app/javascript/components/mentoring/discussion/discussion-post-list/use-post-scrolling.tsx", "../app/javascript/components/mentoring/discussion/discussion-post-list/use-list-trimming.tsx", "../app/javascript/components/mentoring/discussion/discussion-post-list/use-channel.tsx", "../app/javascript/channels/discussionPostChannel.ts", "../app/javascript/components/mentoring/discussion/DiscussionPost.tsx", "../app/javascript/components/mentoring/discussion/discussion-post/DiscussionPostView.tsx", "../app/javascript/components/mentoring/discussion/discussion-post/DiscussionPostEdit.tsx", "../app/javascript/components/mentoring/discussion/DiscussionActions.tsx", "../app/javascript/components/mentoring/discussion/MarkAsNothingToDoButton.tsx", "../app/javascript/components/mentoring/discussion/FinishButton.tsx", "../app/javascript/components/modals/mentor/FinishMentorDiscussionModal.tsx", "../app/javascript/components/mentoring/discussion/AddDiscussionPostPanel.tsx", "../app/javascript/components/mentoring/discussion/AddDiscussionPost.tsx", "../app/javascript/components/mentoring/discussion/AddDiscussionPostForm.tsx", "../app/javascript/components/mentoring/discussion/NewMessageAlert.tsx", "../app/javascript/components/mentoring/session/MentoringNote.tsx", "../app/javascript/components/mentoring/discussion/use-discussion-iterations.tsx", "../app/javascript/components/mentoring/request/RequestDetails.tsx", "../app/javascript/components/mentoring/request/MentoringRequestPanel.tsx", "../app/javascript/components/mentoring/request/StartMentoringPanel.tsx", "../app/javascript/components/mentoring/request/StartDiscussionPanel.tsx", "../app/javascript/components/mentoring/automation/RepresentationsWithFeedback.tsx", "../app/javascript/components/mentoring/automation/Representation.tsx", "../app/javascript/components/mentoring/automation/TrackFilterList.tsx", "../app/javascript/components/mentoring/automation/AutomationIntroducer.tsx", "../app/javascript/components/mentoring/automation/RepresentationList.tsx", "../app/javascript/components/mentoring/automation/AutomationListElement.tsx", "../app/javascript/components/mentoring/automation/MostPopularTag.tsx", "../app/javascript/components/mentoring/automation/useAutomation.tsx", "../app/javascript/components/mentoring/automation/RepresentationsWithoutFeedback.tsx", "../app/javascript/components/mentoring/automation/RepresentationsAdmin.tsx", "../app/javascript/components/mentoring/TryMentoringButton.tsx", "../app/javascript/components/modals/MentorRegistrationModal.tsx", "../app/javascript/components/modals/mentor-registration-modal/StepIndicator.tsx", "../app/javascript/components/modals/mentor-registration-modal/CloseButton.tsx", "../app/javascript/components/modals/mentor-registration-modal/ChooseTrackStep.tsx", "../app/javascript/components/modals/mentor-registration-modal/CommitStep.tsx", "../app/javascript/components/modals/mentor-registration-modal/commit-step/ReputationInfo.tsx", "../app/javascript/components/modals/mentor-registration-modal/commit-step/Checkbox.tsx", "../app/javascript/components/modals/mentor-registration-modal/CongratulationsStep.tsx", "../app/javascript/components/mentoring/TestimonialsList.tsx", "../app/javascript/components/mentoring/testimonials-list/RevealedTestimonial.tsx", "../app/javascript/components/modals/TestimonialModal.tsx", "../app/javascript/components/mentoring/testimonials-list/revealed-testimonial/OptionsDropdown.tsx", "../app/javascript/components/mentoring/testimonials-list/revealed-testimonial/DeleteTestimonialModal.tsx", "../app/javascript/components/mentoring/testimonials-list/UnrevealedTestimonial.tsx", "../app/javascript/components/mentoring/testimonials-list/TrackDropdown.tsx", "../app/javascript/components/mentoring/testimonials-list/OrderSelect.tsx", "../app/javascript/components/mentoring/Representation.tsx", "../app/javascript/components/mentoring/representation/left-pane/LeftPane.tsx", "../app/javascript/components/mentoring/representation/left-pane/RepresentationIterationView.tsx", "../app/javascript/components/mentoring/representation/left-pane/RepresentationInfo.tsx", "../app/javascript/components/mentoring/representation/right-pane/RightPane.tsx", "../app/javascript/components/mentoring/representation/right-pane/HowImportant.tsx", "../app/javascript/components/mentoring/representation/right-pane/RadioGroup.tsx", "../app/javascript/components/mentoring/representation/right-pane/MentoringConversation.tsx", "../app/javascript/components/mentoring/representation/modals/PreviewAutomationModal.tsx", "../app/javascript/components/mentoring/representation/modals/PreviewFeedbackComment.tsx", "../app/javascript/components/mentoring/representation/common/CommentTag.tsx", "../app/javascript/components/mentoring/representation/modals/PreviewFooter.tsx", "../app/javascript/components/mentoring/representation/common/CancelButton.tsx", "../app/javascript/components/mentoring/representation/common/PrimaryButton.tsx", "../app/javascript/components/mentoring/representation/modals/SubmittedAutomationModal.tsx", "../app/javascript/components/mentoring/representation/right-pane/RepresentationFeedbackEditor.tsx", "../app/javascript/components/mentoring/representation/right-pane/UtilityTabs.tsx", "../app/javascript/components/mentoring/representation/right-pane/AutomationRules.tsx", "../app/javascript/components/mentoring/representation/right-pane/Considerations.tsx", "../app/javascript/components/student/Nudge.tsx", "../app/javascript/components/student/MentoringComboButton.tsx", "../app/javascript/channels/latestIterationStatusChannel.ts", "../app/javascript/components/student/SolutionSummary.tsx", "../app/javascript/components/student/solution-summary/Header.tsx", "../app/javascript/utils/toSentence.ts", "../app/javascript/components/student/solution-summary/IterationLink.tsx", "../app/javascript/components/student/solution-summary/CommunitySolutions.tsx", "../app/javascript/components/student/solution-summary/Mentoring.tsx", "../app/javascript/components/student/MentoringSession.tsx", "../app/javascript/components/student/mentoring-session/IterationView.tsx", "../app/javascript/components/student/mentoring-session/iteration-view/IterationHeader.tsx", "../app/javascript/components/student/mentoring-session/SessionInfo.tsx", "../app/javascript/components/student/mentoring-session/DiscussionInfo.tsx", "../app/javascript/components/student/mentoring-session/MentorInfo.tsx", "../app/javascript/components/student/mentoring-session/FinishButton.tsx", "../app/javascript/components/modals/student/FinishMentorDiscussionModal.tsx", "../app/javascript/components/modals/student/finish-mentor-discussion-modal/RateMentorStep.tsx", "../app/javascript/components/modals/student/finish-mentor-discussion-modal/AddTestimonialStep.tsx", "../app/javascript/components/modals/student/finish-mentor-discussion-modal/TestimonialField.tsx", "../app/javascript/components/modals/student/finish-mentor-discussion-modal/CelebrationStep.tsx", "../app/javascript/components/modals/student/finish-mentor-discussion-modal/UnhappyStep.tsx", "../app/javascript/components/modals/student/finish-mentor-discussion-modal/RequeuedStep.tsx", "../app/javascript/components/modals/student/finish-mentor-discussion-modal/SatisfiedStep.tsx", "../app/javascript/components/modals/student/finish-mentor-discussion-modal/ReportStep.tsx", "../app/javascript/components/modals/student/finish-mentor-discussion-modal/ReasonSelect.tsx", "../node_modules/@xstate/react/es/useMachine.js", "../node_modules/xstate/es/_virtual/_tslib.js", "../node_modules/xstate/es/constants.js", "../node_modules/xstate/es/environment.js", "../node_modules/xstate/es/utils.js", "../node_modules/xstate/es/types.js", "../node_modules/xstate/es/actionTypes.js", "../node_modules/xstate/es/actions.js", "../node_modules/xstate/es/stateUtils.js", "../node_modules/xstate/es/State.js", "../node_modules/xstate/es/serviceScope.js", "../node_modules/xstate/es/Actor.js", "../node_modules/xstate/es/invokeUtils.js", "../node_modules/xstate/es/StateNode.js", "../node_modules/xstate/es/Machine.js", "../node_modules/xstate/es/scheduler.js", "../node_modules/xstate/es/registry.js", "../node_modules/xstate/es/devTools.js", "../node_modules/xstate/es/behaviors.js", "../node_modules/xstate/es/interpreter.js", "../node_modules/@xstate/react/es/types.js", "../node_modules/@xstate/react/es/useInterpret.js", "../node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js", "../node_modules/@xstate/react/es/useConstant.js", "../node_modules/@xstate/react/es/useReactEffectActions.js", "../node_modules/@xstate/react/es/utils.js", "../app/javascript/components/modals/student/ConfirmFinishMentorDiscussionModal.tsx", "../app/javascript/components/student/mentoring-session/DiscussionActions.tsx", "../app/javascript/components/student/mentoring-session/MentoringRequest.tsx", "../app/javascript/components/student/mentoring-session/mentoring-request/MentoringRequestForm.tsx", "../app/javascript/components/student/mentoring-session/mentoring-request/MentoringRequestInfo.tsx", "../app/javascript/components/student/mentoring-session/mentoring-request/CancelRequestButton.tsx", "../app/javascript/components/student/mentoring-session/mentoring-request/CancelRequestModal.tsx", "../app/javascript/components/journey/JourneyPage.tsx", "../app/javascript/components/journey/ContributionsList.tsx", "../app/javascript/components/journey/ContributionResults.tsx", "../app/javascript/components/journey/Contribution.tsx", "../app/javascript/components/journey/contribution-results/MarkAllAsSeenModal.tsx", "../app/javascript/components/journey/contribution-results/MarkAllAsSeenButton.tsx", "../app/javascript/components/journey/contributions-list/CategorySelect.tsx", "../app/javascript/components/journey/SolutionsList.tsx", "../app/javascript/components/journey/Solution.tsx", "../app/javascript/components/journey/solutions-list/OrderSwitcher.tsx", "../app/javascript/components/journey/solutions-list/SolutionFilter.tsx", "../app/javascript/components/journey/solutions-list/ExerciseStatusSelect.tsx", "../app/javascript/components/journey/solutions-list/HeadTestsStatusSelect.tsx", "../app/javascript/components/journey/solutions-list/MentoringStatusSelect.tsx", "../app/javascript/components/journey/solutions-list/SyncStatusSelect.tsx", "../app/javascript/components/journey/solutions-list/TestsStatusSelect.tsx", "../app/javascript/components/journey/BadgesList.tsx", "../app/javascript/components/journey/BadgeResults.tsx", "../app/javascript/components/journey/RevealedBadge.tsx", "../app/javascript/components/modals/BadgeModal.tsx", "../app/javascript/components/journey/UnrevealedBadge.tsx", "../app/javascript/components/journey/badges-list/OrderSwitcher.tsx", "../app/javascript/components/journey/Overview.tsx", "../app/javascript/components/journey/overview/LearningSection.tsx", "../app/javascript/components/journey/overview/learning-section/HeaderSummary.tsx", "../app/javascript/components/journey/overview/TrackHeaderSpan.tsx", "../app/javascript/components/journey/overview/TrackHeaderSummaryText.tsx", "../app/javascript/components/journey/overview/learning-section/TracksEnrolledSummary.tsx", "../app/javascript/components/journey/overview/learning-section/ExercisesCompletedSummary.tsx", "../app/javascript/components/journey/overview/learning-section/ConceptsLearntSummary.tsx", "../app/javascript/components/journey/overview/learning-section/LearningOverview.tsx", "../app/javascript/components/journey/overview/learning-section/TrackSummary.tsx", "../app/javascript/components/journey/overview/learning-section/track-summary/TrackSummaryHeader.tsx", "../app/javascript/components/journey/overview/learning-section/track-summary/TrackProgressBar.tsx", "../app/javascript/components/journey/overview/MentoringSection.tsx", "../app/javascript/components/journey/overview/mentoring-section/HeaderSummary.tsx", "../app/javascript/components/journey/overview/mentoring-section/MentoringChart.tsx", "../app/javascript/components/journey/overview/mentoring-section/SessionsMentoredSummary.tsx", "../app/javascript/components/journey/overview/mentoring-section/CommunityRank.tsx", "../app/javascript/components/journey/overview/mentoring-section/StudentsMentoredSummary.tsx", "../app/javascript/components/journey/overview/mentoring-section/SessionRatioSummary.tsx", "../app/javascript/components/journey/overview/mentoring-section/TrackSummary.tsx", "../app/javascript/components/journey/overview/ContributingSection.tsx", "../app/javascript/components/journey/overview/contributing-section/HeaderSummary.tsx", "../app/javascript/components/journey/overview/BadgesSection.tsx", "../app/javascript/components/journey/overview/badges-section/BadgeSummary.tsx", "../app/javascript/components/journey/types.ts", "../app/javascript/components/settings/ProfileForm.tsx", "../app/javascript/components/settings/FormMessage.tsx", "../app/javascript/components/settings/PronounsForm.tsx", "../app/javascript/components/settings/HandleForm.tsx", "../app/javascript/components/settings/EmailForm.tsx", "../app/javascript/components/settings/PasswordForm.tsx", "../app/javascript/components/settings/TokenForm.tsx", "../app/javascript/components/settings/UserPreferencesForm.tsx", "../app/javascript/components/settings/ThemePreferenceForm.tsx", "../app/javascript/components/settings/CommunicationPreferencesForm.tsx", "../app/javascript/components/settings/DeleteAccountButton.tsx", "../app/javascript/components/modals/DeleteAccountModal.tsx", "../app/javascript/hooks/use-confirmation.ts", "../app/javascript/components/settings/ResetAccountButton.tsx", "../app/javascript/components/modals/ResetAccountModal.tsx", "../app/javascript/components/settings/DeleteProfileForm.tsx", "../app/javascript/components/settings/delete-profile-form/DeleteProfileModal.tsx", "../app/javascript/components/settings/PhotoForm.tsx", "../app/javascript/components/settings/ShowOnSupportersPageButton.tsx", "../app/javascript/components/dropdowns/Notifications.tsx", "../app/javascript/components/dropdowns/notifications/NotificationsIcon.tsx", "../app/javascript/components/notifications/notifications-list/Notification.tsx", "../app/javascript/components/dropdowns/notifications/useNotificationDropdown.tsx", "../app/javascript/components/dropdowns/Reputation.tsx", "../app/javascript/components/dropdowns/reputation/ReputationIcon.tsx", "../app/javascript/components/dropdowns/reputation/ReputationMenu.tsx", "../app/javascript/components/dropdowns/reputation/ReputationMenuItem.tsx", "../app/javascript/channels/reputationChannel.ts", "../app/javascript/components/dropdowns/TrackMenu.tsx", "../app/javascript/components/dropdowns/track-menu/ActivatePracticeModeModal.tsx", "../app/javascript/components/dropdowns/track-menu/ActivateLearningModeModal.tsx", "../app/javascript/components/dropdowns/track-menu/ResetTrackModal.tsx", "../app/javascript/components/dropdowns/track-menu/LeaveTrackModal.tsx", "../app/javascript/components/dropdowns/track-menu/leave-track-modal/LeaveTrackForm.tsx", "../app/javascript/components/dropdowns/track-menu/leave-track-modal/LeaveResetTrackForm.tsx", "../app/javascript/components/notifications/NotificationsList.tsx", "../app/javascript/components/notifications/notifications-list/List.tsx", "../app/javascript/components/notifications/notifications-list/EmptyList.tsx", "../app/javascript/components/notifications/notifications-list/useNotificationMutation.tsx", "../app/javascript/components/notifications/notifications-list/MutationButton.tsx", "../app/javascript/components/notifications/notifications-list/MarkAllNotificationsAsReadModal.tsx"],
  "sourcesContent": ["(function() {\n  var context = this;\n\n  (function() {\n    (function() {\n      var slice = [].slice;\n\n      this.ActionCable = {\n        INTERNAL: {\n          \"message_types\": {\n            \"welcome\": \"welcome\",\n            \"ping\": \"ping\",\n            \"confirmation\": \"confirm_subscription\",\n            \"rejection\": \"reject_subscription\"\n          },\n          \"default_mount_path\": \"/cable\",\n          \"protocols\": [\"actioncable-v1-json\", \"actioncable-unsupported\"]\n        },\n        WebSocket: window.WebSocket,\n        logger: window.console,\n        createConsumer: function(url) {\n          var ref;\n          if (url == null) {\n            url = (ref = this.getConfig(\"url\")) != null ? ref : this.INTERNAL.default_mount_path;\n          }\n          return new ActionCable.Consumer(this.createWebSocketURL(url));\n        },\n        getConfig: function(name) {\n          var element;\n          element = document.head.querySelector(\"meta[name='action-cable-\" + name + \"']\");\n          return element != null ? element.getAttribute(\"content\") : void 0;\n        },\n        createWebSocketURL: function(url) {\n          var a;\n          if (url && !/^wss?:/i.test(url)) {\n            a = document.createElement(\"a\");\n            a.href = url;\n            a.href = a.href;\n            a.protocol = a.protocol.replace(\"http\", \"ws\");\n            return a.href;\n          } else {\n            return url;\n          }\n        },\n        startDebugging: function() {\n          return this.debugging = true;\n        },\n        stopDebugging: function() {\n          return this.debugging = null;\n        },\n        log: function() {\n          var messages, ref;\n          messages = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n          if (this.debugging) {\n            messages.push(Date.now());\n            return (ref = this.logger).log.apply(ref, [\"[ActionCable]\"].concat(slice.call(messages)));\n          }\n        }\n      };\n\n    }).call(this);\n  }).call(context);\n\n  var ActionCable = context.ActionCable;\n\n  (function() {\n    (function() {\n      var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n      ActionCable.ConnectionMonitor = (function() {\n        var clamp, now, secondsSince;\n\n        ConnectionMonitor.pollInterval = {\n          min: 3,\n          max: 30\n        };\n\n        ConnectionMonitor.staleThreshold = 6;\n\n        function ConnectionMonitor(connection) {\n          this.connection = connection;\n          this.visibilityDidChange = bind(this.visibilityDidChange, this);\n          this.reconnectAttempts = 0;\n        }\n\n        ConnectionMonitor.prototype.start = function() {\n          if (!this.isRunning()) {\n            this.startedAt = now();\n            delete this.stoppedAt;\n            this.startPolling();\n            document.addEventListener(\"visibilitychange\", this.visibilityDidChange);\n            return ActionCable.log(\"ConnectionMonitor started. pollInterval = \" + (this.getPollInterval()) + \" ms\");\n          }\n        };\n\n        ConnectionMonitor.prototype.stop = function() {\n          if (this.isRunning()) {\n            this.stoppedAt = now();\n            this.stopPolling();\n            document.removeEventListener(\"visibilitychange\", this.visibilityDidChange);\n            return ActionCable.log(\"ConnectionMonitor stopped\");\n          }\n        };\n\n        ConnectionMonitor.prototype.isRunning = function() {\n          return (this.startedAt != null) && (this.stoppedAt == null);\n        };\n\n        ConnectionMonitor.prototype.recordPing = function() {\n          return this.pingedAt = now();\n        };\n\n        ConnectionMonitor.prototype.recordConnect = function() {\n          this.reconnectAttempts = 0;\n          this.recordPing();\n          delete this.disconnectedAt;\n          return ActionCable.log(\"ConnectionMonitor recorded connect\");\n        };\n\n        ConnectionMonitor.prototype.recordDisconnect = function() {\n          this.disconnectedAt = now();\n          return ActionCable.log(\"ConnectionMonitor recorded disconnect\");\n        };\n\n        ConnectionMonitor.prototype.startPolling = function() {\n          this.stopPolling();\n          return this.poll();\n        };\n\n        ConnectionMonitor.prototype.stopPolling = function() {\n          return clearTimeout(this.pollTimeout);\n        };\n\n        ConnectionMonitor.prototype.poll = function() {\n          return this.pollTimeout = setTimeout((function(_this) {\n            return function() {\n              _this.reconnectIfStale();\n              return _this.poll();\n            };\n          })(this), this.getPollInterval());\n        };\n\n        ConnectionMonitor.prototype.getPollInterval = function() {\n          var interval, max, min, ref;\n          ref = this.constructor.pollInterval, min = ref.min, max = ref.max;\n          interval = 5 * Math.log(this.reconnectAttempts + 1);\n          return Math.round(clamp(interval, min, max) * 1000);\n        };\n\n        ConnectionMonitor.prototype.reconnectIfStale = function() {\n          if (this.connectionIsStale()) {\n            ActionCable.log(\"ConnectionMonitor detected stale connection. reconnectAttempts = \" + this.reconnectAttempts + \", pollInterval = \" + (this.getPollInterval()) + \" ms, time disconnected = \" + (secondsSince(this.disconnectedAt)) + \" s, stale threshold = \" + this.constructor.staleThreshold + \" s\");\n            this.reconnectAttempts++;\n            if (this.disconnectedRecently()) {\n              return ActionCable.log(\"ConnectionMonitor skipping reopening recent disconnect\");\n            } else {\n              ActionCable.log(\"ConnectionMonitor reopening\");\n              return this.connection.reopen();\n            }\n          }\n        };\n\n        ConnectionMonitor.prototype.connectionIsStale = function() {\n          var ref;\n          return secondsSince((ref = this.pingedAt) != null ? ref : this.startedAt) > this.constructor.staleThreshold;\n        };\n\n        ConnectionMonitor.prototype.disconnectedRecently = function() {\n          return this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold;\n        };\n\n        ConnectionMonitor.prototype.visibilityDidChange = function() {\n          if (document.visibilityState === \"visible\") {\n            return setTimeout((function(_this) {\n              return function() {\n                if (_this.connectionIsStale() || !_this.connection.isOpen()) {\n                  ActionCable.log(\"ConnectionMonitor reopening stale connection on visibilitychange. visbilityState = \" + document.visibilityState);\n                  return _this.connection.reopen();\n                }\n              };\n            })(this), 200);\n          }\n        };\n\n        now = function() {\n          return new Date().getTime();\n        };\n\n        secondsSince = function(time) {\n          return (now() - time) / 1000;\n        };\n\n        clamp = function(number, min, max) {\n          return Math.max(min, Math.min(max, number));\n        };\n\n        return ConnectionMonitor;\n\n      })();\n\n    }).call(this);\n    (function() {\n      var i, message_types, protocols, ref, supportedProtocols, unsupportedProtocol,\n        slice = [].slice,\n        bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n        indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n      ref = ActionCable.INTERNAL, message_types = ref.message_types, protocols = ref.protocols;\n\n      supportedProtocols = 2 <= protocols.length ? slice.call(protocols, 0, i = protocols.length - 1) : (i = 0, []), unsupportedProtocol = protocols[i++];\n\n      ActionCable.Connection = (function() {\n        Connection.reopenDelay = 500;\n\n        function Connection(consumer) {\n          this.consumer = consumer;\n          this.open = bind(this.open, this);\n          this.subscriptions = this.consumer.subscriptions;\n          this.monitor = new ActionCable.ConnectionMonitor(this);\n          this.disconnected = true;\n        }\n\n        Connection.prototype.send = function(data) {\n          if (this.isOpen()) {\n            this.webSocket.send(JSON.stringify(data));\n            return true;\n          } else {\n            return false;\n          }\n        };\n\n        Connection.prototype.open = function() {\n          if (this.isActive()) {\n            ActionCable.log(\"Attempted to open WebSocket, but existing socket is \" + (this.getState()));\n            return false;\n          } else {\n            ActionCable.log(\"Opening WebSocket, current state is \" + (this.getState()) + \", subprotocols: \" + protocols);\n            if (this.webSocket != null) {\n              this.uninstallEventHandlers();\n            }\n            this.webSocket = new ActionCable.WebSocket(this.consumer.url, protocols);\n            this.installEventHandlers();\n            this.monitor.start();\n            return true;\n          }\n        };\n\n        Connection.prototype.close = function(arg) {\n          var allowReconnect, ref1;\n          allowReconnect = (arg != null ? arg : {\n            allowReconnect: true\n          }).allowReconnect;\n          if (!allowReconnect) {\n            this.monitor.stop();\n          }\n          if (this.isActive()) {\n            return (ref1 = this.webSocket) != null ? ref1.close() : void 0;\n          }\n        };\n\n        Connection.prototype.reopen = function() {\n          var error;\n          ActionCable.log(\"Reopening WebSocket, current state is \" + (this.getState()));\n          if (this.isActive()) {\n            try {\n              return this.close();\n            } catch (error1) {\n              error = error1;\n              return ActionCable.log(\"Failed to reopen WebSocket\", error);\n            } finally {\n              ActionCable.log(\"Reopening WebSocket in \" + this.constructor.reopenDelay + \"ms\");\n              setTimeout(this.open, this.constructor.reopenDelay);\n            }\n          } else {\n            return this.open();\n          }\n        };\n\n        Connection.prototype.getProtocol = function() {\n          var ref1;\n          return (ref1 = this.webSocket) != null ? ref1.protocol : void 0;\n        };\n\n        Connection.prototype.isOpen = function() {\n          return this.isState(\"open\");\n        };\n\n        Connection.prototype.isActive = function() {\n          return this.isState(\"open\", \"connecting\");\n        };\n\n        Connection.prototype.isProtocolSupported = function() {\n          var ref1;\n          return ref1 = this.getProtocol(), indexOf.call(supportedProtocols, ref1) >= 0;\n        };\n\n        Connection.prototype.isState = function() {\n          var ref1, states;\n          states = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n          return ref1 = this.getState(), indexOf.call(states, ref1) >= 0;\n        };\n\n        Connection.prototype.getState = function() {\n          var ref1, state, value;\n          for (state in WebSocket) {\n            value = WebSocket[state];\n            if (value === ((ref1 = this.webSocket) != null ? ref1.readyState : void 0)) {\n              return state.toLowerCase();\n            }\n          }\n          return null;\n        };\n\n        Connection.prototype.installEventHandlers = function() {\n          var eventName, handler;\n          for (eventName in this.events) {\n            handler = this.events[eventName].bind(this);\n            this.webSocket[\"on\" + eventName] = handler;\n          }\n        };\n\n        Connection.prototype.uninstallEventHandlers = function() {\n          var eventName;\n          for (eventName in this.events) {\n            this.webSocket[\"on\" + eventName] = function() {};\n          }\n        };\n\n        Connection.prototype.events = {\n          message: function(event) {\n            var identifier, message, ref1, type;\n            if (!this.isProtocolSupported()) {\n              return;\n            }\n            ref1 = JSON.parse(event.data), identifier = ref1.identifier, message = ref1.message, type = ref1.type;\n            switch (type) {\n              case message_types.welcome:\n                this.monitor.recordConnect();\n                return this.subscriptions.reload();\n              case message_types.ping:\n                return this.monitor.recordPing();\n              case message_types.confirmation:\n                return this.subscriptions.notify(identifier, \"connected\");\n              case message_types.rejection:\n                return this.subscriptions.reject(identifier);\n              default:\n                return this.subscriptions.notify(identifier, \"received\", message);\n            }\n          },\n          open: function() {\n            ActionCable.log(\"WebSocket onopen event, using '\" + (this.getProtocol()) + \"' subprotocol\");\n            this.disconnected = false;\n            if (!this.isProtocolSupported()) {\n              ActionCable.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\");\n              return this.close({\n                allowReconnect: false\n              });\n            }\n          },\n          close: function(event) {\n            ActionCable.log(\"WebSocket onclose event\");\n            if (this.disconnected) {\n              return;\n            }\n            this.disconnected = true;\n            this.monitor.recordDisconnect();\n            return this.subscriptions.notifyAll(\"disconnected\", {\n              willAttemptReconnect: this.monitor.isRunning()\n            });\n          },\n          error: function() {\n            return ActionCable.log(\"WebSocket onerror event\");\n          }\n        };\n\n        return Connection;\n\n      })();\n\n    }).call(this);\n    (function() {\n      var slice = [].slice;\n\n      ActionCable.Subscriptions = (function() {\n        function Subscriptions(consumer) {\n          this.consumer = consumer;\n          this.subscriptions = [];\n        }\n\n        Subscriptions.prototype.create = function(channelName, mixin) {\n          var channel, params, subscription;\n          channel = channelName;\n          params = typeof channel === \"object\" ? channel : {\n            channel: channel\n          };\n          subscription = new ActionCable.Subscription(this.consumer, params, mixin);\n          return this.add(subscription);\n        };\n\n        Subscriptions.prototype.add = function(subscription) {\n          this.subscriptions.push(subscription);\n          this.consumer.ensureActiveConnection();\n          this.notify(subscription, \"initialized\");\n          this.sendCommand(subscription, \"subscribe\");\n          return subscription;\n        };\n\n        Subscriptions.prototype.remove = function(subscription) {\n          this.forget(subscription);\n          if (!this.findAll(subscription.identifier).length) {\n            this.sendCommand(subscription, \"unsubscribe\");\n          }\n          return subscription;\n        };\n\n        Subscriptions.prototype.reject = function(identifier) {\n          var i, len, ref, results, subscription;\n          ref = this.findAll(identifier);\n          results = [];\n          for (i = 0, len = ref.length; i < len; i++) {\n            subscription = ref[i];\n            this.forget(subscription);\n            this.notify(subscription, \"rejected\");\n            results.push(subscription);\n          }\n          return results;\n        };\n\n        Subscriptions.prototype.forget = function(subscription) {\n          var s;\n          this.subscriptions = (function() {\n            var i, len, ref, results;\n            ref = this.subscriptions;\n            results = [];\n            for (i = 0, len = ref.length; i < len; i++) {\n              s = ref[i];\n              if (s !== subscription) {\n                results.push(s);\n              }\n            }\n            return results;\n          }).call(this);\n          return subscription;\n        };\n\n        Subscriptions.prototype.findAll = function(identifier) {\n          var i, len, ref, results, s;\n          ref = this.subscriptions;\n          results = [];\n          for (i = 0, len = ref.length; i < len; i++) {\n            s = ref[i];\n            if (s.identifier === identifier) {\n              results.push(s);\n            }\n          }\n          return results;\n        };\n\n        Subscriptions.prototype.reload = function() {\n          var i, len, ref, results, subscription;\n          ref = this.subscriptions;\n          results = [];\n          for (i = 0, len = ref.length; i < len; i++) {\n            subscription = ref[i];\n            results.push(this.sendCommand(subscription, \"subscribe\"));\n          }\n          return results;\n        };\n\n        Subscriptions.prototype.notifyAll = function() {\n          var args, callbackName, i, len, ref, results, subscription;\n          callbackName = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n          ref = this.subscriptions;\n          results = [];\n          for (i = 0, len = ref.length; i < len; i++) {\n            subscription = ref[i];\n            results.push(this.notify.apply(this, [subscription, callbackName].concat(slice.call(args))));\n          }\n          return results;\n        };\n\n        Subscriptions.prototype.notify = function() {\n          var args, callbackName, i, len, results, subscription, subscriptions;\n          subscription = arguments[0], callbackName = arguments[1], args = 3 <= arguments.length ? slice.call(arguments, 2) : [];\n          if (typeof subscription === \"string\") {\n            subscriptions = this.findAll(subscription);\n          } else {\n            subscriptions = [subscription];\n          }\n          results = [];\n          for (i = 0, len = subscriptions.length; i < len; i++) {\n            subscription = subscriptions[i];\n            results.push(typeof subscription[callbackName] === \"function\" ? subscription[callbackName].apply(subscription, args) : void 0);\n          }\n          return results;\n        };\n\n        Subscriptions.prototype.sendCommand = function(subscription, command) {\n          var identifier;\n          identifier = subscription.identifier;\n          return this.consumer.send({\n            command: command,\n            identifier: identifier\n          });\n        };\n\n        return Subscriptions;\n\n      })();\n\n    }).call(this);\n    (function() {\n      ActionCable.Subscription = (function() {\n        var extend;\n\n        function Subscription(consumer, params, mixin) {\n          this.consumer = consumer;\n          if (params == null) {\n            params = {};\n          }\n          this.identifier = JSON.stringify(params);\n          extend(this, mixin);\n        }\n\n        Subscription.prototype.perform = function(action, data) {\n          if (data == null) {\n            data = {};\n          }\n          data.action = action;\n          return this.send(data);\n        };\n\n        Subscription.prototype.send = function(data) {\n          return this.consumer.send({\n            command: \"message\",\n            identifier: this.identifier,\n            data: JSON.stringify(data)\n          });\n        };\n\n        Subscription.prototype.unsubscribe = function() {\n          return this.consumer.subscriptions.remove(this);\n        };\n\n        extend = function(object, properties) {\n          var key, value;\n          if (properties != null) {\n            for (key in properties) {\n              value = properties[key];\n              object[key] = value;\n            }\n          }\n          return object;\n        };\n\n        return Subscription;\n\n      })();\n\n    }).call(this);\n    (function() {\n      ActionCable.Consumer = (function() {\n        function Consumer(url) {\n          this.url = url;\n          this.subscriptions = new ActionCable.Subscriptions(this);\n          this.connection = new ActionCable.Connection(this);\n        }\n\n        Consumer.prototype.send = function(data) {\n          return this.connection.send(data);\n        };\n\n        Consumer.prototype.connect = function() {\n          return this.connection.open();\n        };\n\n        Consumer.prototype.disconnect = function() {\n          return this.connection.close({\n            allowReconnect: false\n          });\n        };\n\n        Consumer.prototype.ensureActiveConnection = function() {\n          if (!this.connection.isActive()) {\n            return this.connection.open();\n          }\n        };\n\n        return Consumer;\n\n      })();\n\n    }).call(this);\n  }).call(this);\n\n  if (typeof module === \"object\" && module.exports) {\n    module.exports = ActionCable;\n  } else if (typeof define === \"function\" && define.amd) {\n    define(ActionCable);\n  }\n}).call(this);\n", "import 'easymde/dist/easymde.min.css'\n\nimport React from 'react'\nimport { initReact } from '../utils/react-bootloader.jsx'\n\nimport {\n  Iteration,\n  // Track,\n  // Exercise,\n  MentorSessionRequest,\n  MentorSessionTrack,\n  MentorSessionExercise,\n  MentorDiscussion,\n  MentoredTrack,\n  SolutionForStudent,\n  CommunitySolution,\n  Testimonial,\n  MentoredTrackExercise,\n  // User,\n  // SiteUpdate,\n  UserPreferences,\n  CommunicationPreferences,\n  User,\n  MentoringSessionExemplarFile,\n  SharePlatform,\n  CompleteRepresentationData,\n  Guidance,\n  // TrackContribution,\n} from '../components/types'\n\nimport * as Maintaining from '../components/maintaining'\nimport * as Mentoring from '../components/mentoring'\nimport * as Student from '../components/student'\nimport { Nudge as StudentNudge } from '../components/student/Nudge'\nimport { IterationsList as StudentIterationsList } from '../components/student/IterationsList'\nimport { SolutionSummary as StudentSolutionSummary } from '../components/student/SolutionSummary'\nimport { Links as TryMentoringButtonLinks } from '../components/mentoring/TryMentoringButton'\nimport { Links as MentoringQueueLinks } from '../components/mentoring/Queue'\n\nimport { Student as MentoringSessionStudent } from '../components/types'\nimport {\n  Links as MentoringSessionLinks,\n  Scratchpad as MentoringSessionScratchpad,\n} from '../components/mentoring/Session'\nimport {\n  MentoringSession as StudentMentoringSession,\n  Mentor as StudentMentoringSessionMentor,\n  Video as StudentMentoringSessionVideo,\n  Links as StudentMentoringSessionLinks,\n} from '../components/student/MentoringSession'\nimport { Links as RequestMentoringButtonLinks } from '../components/student/RequestMentoringButton'\nimport { Track as MentoringTestimonialsListTrack } from '../components/mentoring/TestimonialsList'\n\nimport * as JourneyComponents from '../components/journey'\nimport { Category as JourneyPageCategory } from '../components/journey/JourneyPage'\nimport * as Settings from '../components/settings'\nimport { MarkdownEditor } from '../components/common/MarkdownEditor'\n\nimport { Notifications as NotificationsDropdown } from '../components/dropdowns/Notifications'\nimport { Reputation as ReputationDropdown } from '../components/dropdowns/Reputation'\nimport { TrackMenu as TrackMenuDropdown } from '../components/dropdowns/TrackMenu'\nimport { Links as TrackMenuLinks } from '../components/dropdowns/TrackMenu'\n\nimport {\n  Track as IterationsListTrack,\n  Exercise as IterationsListExercise,\n  Links as IterationsListLinks,\n  IterationsListRequest,\n} from '../components/student/IterationsList'\nimport { IterationSummaryWithWebsockets } from '../components/track/IterationSummary'\nimport {\n  SolutionSummaryLinks,\n  Track as SolutionSummaryTrack,\n  SolutionSummaryRequest,\n} from '../components/student/SolutionSummary'\nimport {\n  Links as NudgeLinks,\n  Track as NudgeTrack,\n} from '../components/student/Nudge'\nimport { Links as PublishedSolutionLinks } from '../components/student/PublishedSolution'\n\nimport { Links as NotificationsListLinks } from '../components/notifications/NotificationsList'\nimport * as Notifications from '../components/notifications'\n\nimport * as Modals from '../components/modals'\n\nimport { Request } from '../hooks/request-query'\nimport { Request as MentoringInboxRequest } from '../components/mentoring/Inbox'\nimport { camelizeKeys } from 'humps'\nimport { AutomationProps } from '../components/mentoring/automation/Representation'\nimport { ThemePreferenceLinks } from '@/components/settings/ThemePreferenceForm'\nfunction camelizeKeysAs<T>(object: any): T {\n  return camelizeKeys(object) as unknown as T\n}\n\n// Add all react components here.\n// Each should map 1-1 to a component in app/helpers/components\n\ninitReact({\n  'common-markdown-editor': (data: any) => (\n    <MarkdownEditor contextId={data.context_id} />\n  ),\n\n  'modals-welcome-modal': (data: any) => (\n    <Modals.WelcomeModal endpoint={data.endpoint} />\n  ),\n\n  'modals-welcome-to-premium-modal': (data: any) => (\n    <Modals.WelcomeToPremiumModal endpoint={data.endpoint} />\n  ),\n\n  'modals-welcome-to-insiders-modal': (data: any) => (\n    <Modals.WelcomeToInsidersModal endpoint={data.endpoint} />\n  ),\n\n  'maintaining-submissions-summary-table': (data: any) => (\n    <Maintaining.SubmissionsSummaryTable\n      submissions={data.submissions.map((s: any) => {\n        return camelizeKeys(s)\n      })}\n    />\n  ),\n  'mentoring-inbox': (data: any) => (\n    <Mentoring.Inbox\n      discussionsRequest={camelizeKeysAs<MentoringInboxRequest>(\n        data.discussions_request\n      )}\n      tracksRequest={camelizeKeysAs<MentoringInboxRequest>(data.tracks_request)}\n      sortOptions={data.sort_options}\n      links={data.links}\n    />\n  ),\n  'mentoring-queue': (data: any) => (\n    <Mentoring.Queue\n      queueRequest={camelizeKeysAs<Request>(data.queue_request)}\n      tracksRequest={camelizeKeysAs<Request>(data.tracks_request)}\n      defaultTrack={camelizeKeysAs<MentoredTrack>(data.default_track)}\n      defaultExercise={camelizeKeysAs<MentoredTrackExercise>(\n        data.default_exercise\n      )}\n      links={camelizeKeysAs<MentoringQueueLinks>(data.links)}\n      sortOptions={data.sort_options}\n    />\n  ),\n  'mentoring-session': (data: any) => (\n    <Mentoring.Session\n      userHandle={data.user_handle}\n      discussion={camelizeKeysAs<MentorDiscussion>(data.discussion)}\n      mentorSolution={camelizeKeysAs<CommunitySolution>(data.mentor_solution)}\n      exemplarFiles={camelizeKeysAs<readonly MentoringSessionExemplarFile[]>(\n        data.exemplar_files\n      )}\n      student={camelizeKeysAs<MentoringSessionStudent>(data.student)}\n      track={camelizeKeysAs<MentorSessionTrack>(data.track)}\n      exercise={camelizeKeysAs<MentorSessionExercise>(data.exercise)}\n      iterations={camelizeKeysAs<Iteration[]>(data.iterations)}\n      instructions={data.instructions}\n      testFiles={data.test_files}\n      links={camelizeKeysAs<MentoringSessionLinks>(data.links)}\n      request={camelizeKeysAs<MentorSessionRequest>(data.request)}\n      scratchpad={camelizeKeysAs<MentoringSessionScratchpad>(data.scratchpad)}\n      guidance={camelizeKeysAs<Pick<Guidance, 'exercise' | 'track'>>(\n        data.guidance\n      )}\n      outOfDate={data.out_of_date}\n      downloadCommand={data.download_command}\n    />\n  ),\n  'mentoring-representations-with-feedback': (data: any) => (\n    <Mentoring.RepresentationsWithFeedback\n      data={camelizeKeysAs<AutomationProps>(data)}\n    />\n  ),\n  'mentoring-representations-admin': (data: any) => (\n    <Mentoring.RepresentationsAdmin\n      data={camelizeKeysAs<AutomationProps>(data)}\n    />\n  ),\n  'mentoring-representations-without-feedback': (data: any) => (\n    <Mentoring.RepresentationsWithoutFeedback\n      data={camelizeKeysAs<AutomationProps>(data)}\n    />\n  ),\n  'mentoring-try-mentoring-button': (data: any) => (\n    <Mentoring.TryMentoringButton\n      text={data.text}\n      size={data.size}\n      links={camelizeKeysAs<TryMentoringButtonLinks>(data.links)}\n    />\n  ),\n  'mentoring-testimonials-list': (data: any) => (\n    <Mentoring.TestimonialsList\n      request={camelizeKeysAs<Request>(data.request)}\n      tracks={camelizeKeysAs<readonly MentoringTestimonialsListTrack[]>(\n        data.tracks\n      )}\n      platforms={camelizeKeysAs<readonly SharePlatform[]>(data.platforms)}\n    />\n  ),\n  'mentoring-representation': (data: any) => (\n    <Mentoring.Representation\n      data={camelizeKeysAs<CompleteRepresentationData>(data)}\n    />\n  ),\n  'student-mentoring-session': (data: any) => (\n    <StudentMentoringSession\n      userHandle={data.user_handle}\n      discussion={camelizeKeysAs<MentorDiscussion>(data.discussion)}\n      iterations={camelizeKeysAs<Iteration[]>(data.iterations)}\n      mentor={camelizeKeysAs<StudentMentoringSessionMentor>(data.mentor)}\n      track={camelizeKeysAs<MentorSessionTrack>(data.track)}\n      exercise={camelizeKeysAs<MentorSessionExercise>(data.exercise)}\n      trackObjectives={data.track_objectives}\n      videos={camelizeKeysAs<StudentMentoringSessionVideo[]>(data.videos)}\n      request={camelizeKeysAs<MentorSessionRequest>(data.request)}\n      links={camelizeKeysAs<StudentMentoringSessionLinks>(data.links)}\n      outOfDate={data.out_of_date}\n    />\n  ),\n  'student-request-mentoring-button': (data: any) => (\n    <Student.RequestMentoringButton\n      request={data.request}\n      links={camelizeKeysAs<RequestMentoringButtonLinks>(data.links)}\n    />\n  ),\n\n  'journey-journey-page': (data: any) => (\n    <JourneyComponents.JourneyPage\n      categories={camelizeKeysAs<readonly JourneyPageCategory[]>(\n        data.categories\n      )}\n      defaultCategory={data.default_category}\n    />\n  ),\n  'settings-profile-form': (data: any) => (\n    <Settings.ProfileForm\n      defaultUser={data.user}\n      defaultProfile={data.profile}\n      links={data.links}\n    />\n  ),\n  'settings-photo-form': (data: any) => (\n    <Settings.PhotoForm\n      defaultUser={camelizeKeysAs<User>(data.user)}\n      links={data.links}\n    />\n  ),\n  'settings-delete-profile-form': (data: any) => (\n    <Settings.DeleteProfileForm links={data.links} />\n  ),\n  'settings-pronouns-form': (data: any) => (\n    <Settings.PronounsForm\n      handle={data.handle}\n      defaultPronounParts={data.pronoun_parts}\n      links={data.links}\n    />\n  ),\n  'settings-handle-form': (data: any) => (\n    <Settings.HandleForm defaultHandle={data.handle} links={data.links} />\n  ),\n  'settings-email-form': (data: any) => (\n    <Settings.EmailForm defaultEmail={data.email} links={data.links} />\n  ),\n  'settings-password-form': (data: any) => (\n    <Settings.PasswordForm links={data.links} />\n  ),\n  'settings-token-form': (data: any) => (\n    <Settings.TokenForm defaultToken={data.token} links={data.links} />\n  ),\n  'settings-user-preferences-form': (data: any) => (\n    <Settings.UserPreferencesForm\n      defaultPreferences={camelizeKeysAs<readonly UserPreferences[]>(\n        data.preferences\n      )}\n      links={data.links}\n    />\n  ),\n  'settings-theme-preference-form': (data: any) => (\n    <Settings.ThemePreferenceForm\n      defaultThemePreference={data.default_theme_preference}\n      isPremium={data.is_premium}\n      insidersStatus={data.insiders_status}\n      links={camelizeKeysAs<ThemePreferenceLinks>(data.links)}\n    />\n  ),\n  'settings-communication-preferences-form': (data: any) => (\n    <Settings.CommunicationPreferencesForm\n      defaultPreferences={camelizeKeysAs<CommunicationPreferences>(\n        data.preferences\n      )}\n      links={data.links}\n    />\n  ),\n  'settings-delete-account-button': (data: any) => (\n    <Settings.DeleteAccountButton handle={data.handle} links={data.links} />\n  ),\n  'settings-reset-account-button': (data: any) => (\n    <Settings.ResetAccountButton handle={data.handle} links={data.links} />\n  ),\n  'settings-show-on-supporters-page-button': (data: any) => (\n    <Settings.ShowOnSupportersPageButton\n      defaultValue={data.value}\n      links={data.links}\n    />\n  ),\n  'dropdowns-notifications': (data: any) => (\n    <NotificationsDropdown endpoint={data.endpoint} />\n  ),\n  'dropdowns-reputation': (data: any) => (\n    <ReputationDropdown\n      endpoint={data.endpoint}\n      defaultIsSeen={data.is_seen}\n      defaultReputation={data.reputation}\n    />\n  ),\n  'dropdowns-track-menu': (data: any) => (\n    <TrackMenuDropdown\n      track={data.track}\n      links={camelizeKeysAs<TrackMenuLinks>(data.links)}\n    />\n  ),\n  'notifications-notifications-list': (data: any) => (\n    <Notifications.NotificationsList\n      request={camelizeKeysAs<Request>(data.request)}\n      links={camelizeKeysAs<NotificationsListLinks>(data.links)}\n    />\n  ),\n  'track-iteration-summary': (data: any) => (\n    <IterationSummaryWithWebsockets\n      iteration={camelizeKeysAs<Iteration>(data.iteration)}\n      className={data.class_name}\n      showSubmissionMethod={true}\n      showTestsStatusAsButton={!!data.show_tests_status_as_button}\n      showFeedbackIndicator={!!data.show_feedback_indicator}\n    />\n  ),\n  'student-iterations-list': (data: any) => (\n    <StudentIterationsList\n      solutionUuid={data.solution_uuid}\n      request={camelizeKeysAs<IterationsListRequest>(data.request)}\n      exercise={camelizeKeysAs<IterationsListExercise>(data.exercise)}\n      track={camelizeKeysAs<IterationsListTrack>(data.track)}\n      links={camelizeKeysAs<IterationsListLinks>(data.links)}\n    />\n  ),\n  'student-solution-summary': (data: any) => (\n    <StudentSolutionSummary\n      discussions={camelizeKeysAs<MentorDiscussion[]>(data.discussions)}\n      solution={camelizeKeysAs<SolutionForStudent>(data.solution)}\n      request={camelizeKeysAs<SolutionSummaryRequest>(data.request)}\n      links={camelizeKeysAs<SolutionSummaryLinks>(data.links)}\n      track={camelizeKeysAs<SolutionSummaryTrack>(data.track)}\n      exercise={data.exercise}\n    />\n  ),\n\n  'student-nudge': (data: any) => (\n    <StudentNudge\n      solution={camelizeKeysAs<SolutionForStudent>(data.solution)}\n      track={camelizeKeysAs<NudgeTrack>(data.track)}\n      discussions={camelizeKeysAs<readonly MentorDiscussion[]>(\n        data.discussions\n      )}\n      request={camelizeKeysAs<SolutionSummaryRequest>(data.request)}\n      iterations={camelizeKeysAs<readonly Iteration[]>(data.iterations)}\n      exerciseType={data.exercise_type}\n      links={camelizeKeysAs<NudgeLinks>(data.links)}\n    />\n  ),\n\n  'student-publish-solution-button': (data: any) => (\n    <Student.PublishSolutionButton\n      endpoint={data.endpoint}\n      iterations={camelizeKeysAs<readonly Iteration[]>(data.iterations)}\n    />\n  ),\n  'student-published-solution': (data: any) => (\n    <Student.PublishedSolution\n      solution={camelizeKeysAs<CommunitySolution>(data.solution)}\n      publishedIterationIdx={data.published_iteration_idx}\n      iterations={camelizeKeysAs<readonly Iteration[]>(data.iterations)}\n      links={camelizeKeysAs<PublishedSolutionLinks>(data.links)}\n    />\n  ),\n  'student-update-exercise-notice': (data: any) => (\n    <Student.UpdateExerciseNotice links={data.links} />\n  ),\n})\n", "import React, { useState, useEffect } from 'react'\nimport 'actioncable'\n\nimport consumer from '../../utils/action-cable-consumer'\n\ntype Submission = {\n  uuid: string\n  track: string\n  exercise: string\n  testsStatus: string\n  representationStatus: string\n  analysisStatus: string\n}\n\ntype SubmissionEvent = {\n  submission: Submission\n}\n\nfunction SubmissionsSummaryTableRow({\n  uuid,\n  track,\n  exercise,\n  testsStatus,\n  representationStatus,\n  analysisStatus,\n}: Submission) {\n  return (\n    <tr>\n      <td>{uuid}</td>\n      <td>{track}</td>\n      <td>{exercise}</td>\n      <td>{testsStatus}</td>\n      <td>{representationStatus}</td>\n      <td>{analysisStatus}</td>\n    </tr>\n  )\n}\n\nexport function SubmissionsSummaryTable({\n  submissions,\n}: {\n  submissions: readonly Submission[]\n}): JSX.Element {\n  const [stateSubmissions, setSubmissions] = useState(submissions)\n\n  useEffect(() => {\n    const received = (event: SubmissionEvent) => {\n      const existingSubmissions = [...stateSubmissions]\n      const existingIndex = existingSubmissions.findIndex(\n        (submission) => submission.uuid === event.submission.uuid\n      )\n\n      if (existingIndex !== -1) {\n        existingSubmissions[existingIndex] = event.submission\n      } else {\n        existingSubmissions.unshift(event.submission)\n      }\n\n      setSubmissions(existingSubmissions)\n    }\n\n    const subscription = consumer.subscriptions.create(\n      { channel: 'SubmissionChannel' },\n      { received }\n    )\n    return () => subscription.unsubscribe()\n  })\n\n  return (\n    <table>\n      <thead>\n        <tr>\n          <th>ID</th>\n          <th>Track</th>\n          <th>Exercise</th>\n          <th>Test status</th>\n          <th>Representation status</th>\n          <th>Analyses status</th>\n        </tr>\n      </thead>\n      <tbody>\n        {stateSubmissions.map((submission) => (\n          <SubmissionsSummaryTableRow\n            key={submission.uuid}\n            uuid={submission.uuid}\n            track={submission.track}\n            exercise={submission.exercise}\n            testsStatus={submission.testsStatus}\n            representationStatus={submission.representationStatus}\n            analysisStatus={submission.analysisStatus}\n          />\n        ))}\n      </tbody>\n    </table>\n  )\n}\n", "import React, { useState, useEffect } from 'react'\nimport { DiscussionList } from './inbox/DiscussionList'\nimport { StatusTab } from './inbox/StatusTab'\nimport { TextFilter } from './TextFilter'\nimport { Sorter } from './Sorter'\nimport { TrackFilter } from './inbox/TrackFilter'\nimport { useList } from '../../hooks/use-list'\nimport {\n  usePaginatedRequestQuery,\n  Request as BaseRequest,\n} from '../../hooks/request-query'\nimport { ResultsZone } from '../ResultsZone'\nimport { useHistory, removeEmpty } from '../../hooks/use-history'\nimport { MentorDiscussion, DiscussionStatus } from '../types'\n\nexport type SortOption = {\n  value: string\n  label: string\n}\n\nexport type APIResponse = {\n  results: readonly MentorDiscussion[]\n  meta: {\n    currentPage: number\n    totalPages: number\n    awaitingMentorTotal: number\n    awaitingStudentTotal: number\n    finishedTotal: number\n  }\n}\n\nexport type Request = BaseRequest<{\n  status: DiscussionStatus\n  order?: string\n  criteria?: string\n  page?: number\n  trackSlug?: string\n}>\n\ntype Links = {\n  queue: string\n}\n\nexport const Inbox = ({\n  tracksRequest,\n  sortOptions,\n  discussionsRequest,\n  links,\n}: {\n  tracksRequest: Request\n  discussionsRequest: Request\n  sortOptions: readonly SortOption[]\n  links: Links\n}): JSX.Element => {\n  const [criteria, setCriteria] = useState(\n    discussionsRequest.query?.criteria || ''\n  )\n  const {\n    request,\n    setCriteria: setRequestCriteria,\n    setOrder,\n    setPage,\n    setQuery,\n  } = useList(discussionsRequest)\n  const { status, resolvedData, latestData, isFetching, refetch } =\n    usePaginatedRequestQuery<APIResponse>(\n      ['mentor-discussion-list', request.endpoint, request.query],\n      request\n    )\n\n  useEffect(() => {\n    const handler = setTimeout(() => {\n      setRequestCriteria(criteria)\n    }, 200)\n\n    return () => {\n      clearTimeout(handler)\n    }\n  }, [setRequestCriteria, criteria])\n\n  useHistory({ pushOn: removeEmpty(request.query) })\n\n  const setTrack = (trackSlug: string | null) => {\n    setQuery({ ...request.query, trackSlug: trackSlug, page: undefined })\n  }\n\n  const setStatus = (status: string) => {\n    setQuery({ ...request.query, status: status, page: undefined })\n  }\n\n  return (\n    <div className=\"c-mentor-inbox\">\n      <div className=\"tabs\">\n        <StatusTab<DiscussionStatus>\n          status=\"awaiting_mentor\"\n          currentStatus={request.query.status}\n          setStatus={setStatus}\n        >\n          Inbox\n          {resolvedData ? (\n            <div className=\"count\">{resolvedData.meta.awaitingMentorTotal}</div>\n          ) : null}\n        </StatusTab>\n        <StatusTab<DiscussionStatus>\n          status=\"awaiting_student\"\n          currentStatus={request.query.status}\n          setStatus={setStatus}\n        >\n          Awaiting student\n          {resolvedData ? (\n            <div className=\"count\">\n              {resolvedData.meta.awaitingStudentTotal}\n            </div>\n          ) : null}\n        </StatusTab>\n        <StatusTab<DiscussionStatus>\n          status=\"finished\"\n          currentStatus={request.query.status}\n          setStatus={setStatus}\n        >\n          Finished\n          {resolvedData ? (\n            <div className=\"count\">{resolvedData.meta.finishedTotal}</div>\n          ) : null}\n        </StatusTab>\n      </div>\n      <div className=\"container\">\n        <header className=\"c-search-bar inbox-header\">\n          <TrackFilter\n            request={{\n              ...tracksRequest,\n              query: { status: request.query.status },\n            }}\n            value={request.query.trackSlug || null}\n            setTrack={setTrack}\n          />\n          <TextFilter\n            filter={criteria}\n            setFilter={setCriteria}\n            id=\"discussion-filter\"\n            placeholder=\"Filter by student or exercise name\"\n          />\n          <Sorter\n            sortOptions={sortOptions}\n            order={request.query.order}\n            setOrder={setOrder}\n            setPage={setPage}\n          />\n        </header>\n        <ResultsZone isFetching={isFetching}>\n          <DiscussionList\n            latestData={latestData}\n            resolvedData={resolvedData}\n            status={status}\n            refetch={refetch}\n            setPage={setPage}\n            links={links}\n          />\n        </ResultsZone>\n      </div>\n    </div>\n  )\n}\n", "import React from 'react'\nimport { Pagination, Loading, GraphicalIcon } from '../../common'\nimport { Discussion } from './Discussion'\nimport { APIResponse } from '../Inbox'\nimport { QueryStatus } from 'react-query'\nimport { RefetchOptions } from 'react-query/types/core/query'\n\ntype Links = {\n  queue: string\n}\n\nexport const DiscussionList = ({\n  resolvedData,\n  latestData,\n  refetch,\n  status,\n  setPage,\n  links,\n}: {\n  resolvedData: APIResponse | undefined\n  latestData: APIResponse | undefined\n  status: QueryStatus\n  setPage: (page: number) => void\n  refetch: (options?: RefetchOptions) => Promise<APIResponse | undefined>\n  links: Links\n}): JSX.Element => {\n  return (\n    <div>\n      {status === 'loading' && <Loading />}\n      {status === 'error' && (\n        <>\n          <p>Something went wrong</p>\n          <button onClick={() => refetch()} aria-label=\"Retry\">\n            Retry\n          </button>\n        </>\n      )}\n      {status === 'success' &&\n        (resolvedData && resolvedData.results.length === 0 ? (\n          <>\n            <div className=\"--no-results\">\n              <GraphicalIcon icon=\"mentoring\" category=\"graphics\" />\n              <h3>No mentoring discussions</h3>\n              <a href={links.queue} className=\"btn-simple\">\n                Mentor a new solution\n              </a>\n            </div>\n          </>\n        ) : (\n          <div className=\"--conversations\">\n            {resolvedData && (\n              <React.Fragment>\n                {resolvedData.results.map((discussion, key) => (\n                  <Discussion key={key} discussion={discussion} />\n                ))}\n                <footer>\n                  <Pagination\n                    disabled={latestData === undefined}\n                    current={resolvedData.meta.currentPage}\n                    total={resolvedData.meta.totalPages}\n                    setPage={setPage}\n                  />\n                </footer>\n              </React.Fragment>\n            )}\n          </div>\n        ))}\n    </div>\n  )\n}\n", "import React from 'react'\nimport { fromNow } from '../../../utils/time'\nimport {\n  TrackIcon,\n  ExerciseIcon,\n  GraphicalIcon,\n  Avatar,\n  Icon,\n} from '../../common'\nimport { MentorDiscussion } from '../../types'\nimport { HandleWithFlair } from '@/components/common/HandleWithFlair'\n\nexport const Discussion = ({\n  discussion,\n}: {\n  discussion: MentorDiscussion\n}): JSX.Element => {\n  return (\n    <a className=\"--solution\" href={discussion.links.self}>\n      <TrackIcon\n        title={discussion.track.title}\n        iconUrl={discussion.track.iconUrl}\n      />\n      <ExerciseIcon\n        title={discussion.exercise.title}\n        iconUrl={discussion.exercise.iconUrl}\n      />\n      <Avatar\n        src={discussion.student.avatarUrl}\n        handle={discussion.student.handle}\n      />\n      <div className=\"--info\">\n        <div className=\"--handle\">\n          <HandleWithFlair\n            handle={discussion.student.handle}\n            flair={discussion.student.flair}\n          />\n          {discussion.student.isFavorited ? (\n            <Icon\n              icon=\"gold-star\"\n              alt=\"Favorite student\"\n              className=\"favorited\"\n            />\n          ) : null}\n        </div>\n        <div className=\"--exercise-title\">on {discussion.exercise.title}</div>\n      </div>\n      <div className=\"--comments-count\">\n        <Icon icon=\"comment\" alt={`{discussion.postsCount} comments`} />\n        {discussion.postsCount}\n      </div>\n      <time className=\"-updated-at\">{fromNow(discussion.updatedAt)}</time>\n      <GraphicalIcon icon=\"chevron-right\" className=\"action-icon\" />\n    </a>\n  )\n}\n", "import React, { useCallback } from 'react'\n\ntype StatusTabProps<S> = React.PropsWithChildren<{\n  status: S\n  currentStatus: S\n  setStatus: (status: S) => void\n}>\n\nexport function StatusTab<T>({\n  status,\n  currentStatus,\n  setStatus,\n  children,\n}: StatusTabProps<T>): JSX.Element {\n  const handleClick = useCallback(() => {\n    setStatus(status)\n  }, [setStatus, status])\n\n  const selected = currentStatus === status\n  return (\n    <button\n      type=\"button\"\n      onClick={handleClick}\n      disabled={selected}\n      className={`c-tab ${selected ? 'selected' : null}`}\n    >\n      {children}\n    </button>\n  )\n}\n", "import React from 'react'\n\nexport const TextFilter = ({\n  setFilter,\n  id,\n  filter = '',\n  placeholder,\n}: {\n  setFilter: (filter: string) => void\n  id: string\n  filter?: string\n  placeholder: string\n}): JSX.Element => {\n  return (\n    <input\n      id={id}\n      onChange={(e) => setFilter(e.target.value)}\n      value={filter}\n      placeholder={placeholder}\n      className=\"--search\"\n    />\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { SortOption } from './Inbox'\nimport { SingleSelect } from '../common/SingleSelect'\n\nconst OptionComponent = ({ option }: { option: SortOption }) => {\n  return <React.Fragment>{option.label}</React.Fragment>\n}\n\nexport const Sorter = ({\n  setOrder,\n  setPage,\n  order,\n  sortOptions,\n  componentClassName,\n}: {\n  setOrder: (order: string) => void\n  setPage: (page: number) => void\n  order: string\n  sortOptions: readonly SortOption[]\n  componentClassName?: string\n}): JSX.Element => {\n  const value = sortOptions.find((o) => o.value === order) || sortOptions[0]\n  const setValue = useCallback(\n    (option) => {\n      setOrder(option.value)\n      setPage(1)\n    },\n    [setOrder, setPage]\n  )\n\n  return (\n    <SingleSelect<SortOption>\n      options={sortOptions}\n      value={value}\n      setValue={setValue}\n      SelectedComponent={OptionComponent}\n      OptionComponent={OptionComponent}\n      componentClassName={componentClassName}\n    />\n  )\n}\n", "import React from 'react'\nimport { useRequestQuery, Request } from '../../../hooks/request-query'\nimport { Loading } from '../../common/Loading'\nimport { TrackList, Track } from './TrackList'\n\nexport const TrackFilter = ({\n  request,\n  value,\n  setTrack,\n}: {\n  request: Request\n  value: string | null\n  setTrack: (track: string | null) => void\n}): JSX.Element => {\n  const { isLoading, isError, data: tracks } = useRequestQuery<Track[]>(\n    ['track-filter', request.query],\n    request\n  )\n\n  return (\n    <div className=\"c-track-filter\">\n      {isLoading && <Loading />}\n      {isError && <p>Something went wrong</p>}\n      {tracks && (\n        <TrackList tracks={tracks} setTrack={setTrack} value={value} />\n      )}\n    </div>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { TrackSelect, TrackLogo } from '../../common/TrackSelect'\n\nexport type Track = {\n  slug: string\n  title: string\n  iconUrl: string\n  count: number\n}\n\nconst OptionComponent = ({ option: track }: { option: Track }) => {\n  return (\n    <React.Fragment>\n      <TrackLogo track={track} />\n      <div className=\"title\">{track.title}</div>\n      <div className=\"count\">{track.count}</div>\n    </React.Fragment>\n  )\n}\n\nconst SelectedComponent = ({ option: track }: { option: Track }) => {\n  return (\n    <div>\n      <TrackLogo track={track} />\n      <div className=\"sr-only\">{track.title}</div>\n    </div>\n  )\n}\n\nexport const TrackList = ({\n  tracks,\n  value,\n  setTrack,\n}: {\n  tracks: Track[]\n  value: string | null\n  setTrack: (value: string | null) => void\n}): JSX.Element => {\n  const track = tracks.find((t) => t.slug === value) || tracks[0]\n\n  const handleSet = useCallback(\n    (track: Track) => {\n      setTrack(track.slug)\n    },\n    [setTrack]\n  )\n\n  return (\n    <TrackSelect<Track>\n      tracks={tracks}\n      value={track}\n      setValue={handleSet}\n      OptionComponent={OptionComponent}\n      SelectedComponent={SelectedComponent}\n      size=\"inline\"\n    />\n  )\n}\n", "import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { useTrackList } from './queue/useTrackList'\nimport { useExerciseList } from './queue/useExerciseList'\nimport { MentoredTrack, MentoredTrackExercise } from '../types'\nimport { useMentoringQueue } from './queue/useMentoringQueue'\nimport { TrackFilterList } from './queue/TrackFilterList'\nimport { Request } from '../../hooks/request-query'\nimport { ExerciseFilterList } from './queue/ExerciseFilterList'\nimport { SolutionList } from './queue/SolutionList'\nimport { TextFilter } from './TextFilter'\nimport { Sorter } from './Sorter'\nimport { ResultsZone } from '../ResultsZone'\n\nconst TRACKS_LIST_CACHE_KEY = 'mentored-tracks'\n\ntype SortOption = {\n  value: string\n  label: string\n}\n\nexport type Links = {\n  tracks: string\n  updateTracks: string\n}\n\nexport const Queue = ({\n  queueRequest,\n  tracksRequest,\n  defaultTrack,\n  defaultExercise,\n  sortOptions,\n  links,\n}: {\n  queueRequest: Request\n  tracksRequest: Request\n  defaultTrack: MentoredTrack\n  defaultExercise: MentoredTrackExercise | null\n  sortOptions: SortOption[]\n  links: Links\n}): JSX.Element => {\n  const isMounted = useRef(false)\n  const {\n    tracks,\n    status: trackListStatus,\n    error: trackListError,\n    isFetching: isTrackListFetching,\n  } = useTrackList({\n    cacheKey: TRACKS_LIST_CACHE_KEY,\n    request: tracksRequest,\n  })\n  const [selectedTrack, setSelectedTrack] =\n    useState<MentoredTrack>(defaultTrack)\n  const {\n    exercises,\n    status: exerciseListStatus,\n    error: exerciseListError,\n  } = useExerciseList({ track: selectedTrack })\n  const [selectedExercise, setSelectedExercise] =\n    useState<MentoredTrackExercise | null>(defaultExercise)\n  const {\n    resolvedData,\n    latestData,\n    isFetching,\n    criteria,\n    setCriteria,\n    order,\n    setOrder,\n    page,\n    setPage,\n    status,\n    error,\n  } = useMentoringQueue({\n    request: queueRequest,\n    track: selectedTrack,\n    exercise: selectedExercise,\n  })\n\n  useEffect(() => {\n    if (tracks.length === 0) {\n      return\n    }\n\n    if (tracks.find((track) => track.slug === selectedTrack.slug)) {\n      return\n    }\n\n    setSelectedTrack(tracks[0])\n  }, [selectedTrack.slug, tracks])\n\n  useEffect(() => {\n    if (!isMounted.current) {\n      isMounted.current = true\n      return\n    }\n\n    setSelectedExercise(null)\n  }, [selectedTrack])\n\n  const handleExerciseChange = useCallback(\n    (exercise) => {\n      setPage(1)\n      setCriteria('')\n      setSelectedExercise(exercise)\n    },\n    [setPage, setCriteria]\n  )\n\n  const handleTrackChange = useCallback(\n    (track) => {\n      setPage(1)\n      setCriteria('')\n      setSelectedTrack(track)\n    },\n    [setPage, setCriteria]\n  )\n\n  return (\n    <div className=\"queue-section-content\">\n      <div className=\"c-mentor-queue\">\n        <header className=\"c-search-bar\">\n          <TextFilter\n            filter={criteria}\n            setFilter={setCriteria}\n            id=\"mentoring-queue-student-name-filter\"\n            placeholder=\"Filter by student handle\"\n          />\n          <Sorter\n            sortOptions={sortOptions}\n            order={order}\n            setPage={setPage}\n            setOrder={setOrder}\n          />\n        </header>\n        <ResultsZone isFetching={isFetching}>\n          <SolutionList\n            status={status}\n            error={error}\n            page={page}\n            resolvedData={resolvedData}\n            latestData={latestData}\n            setPage={setPage}\n          />\n        </ResultsZone>\n      </div>\n      <div className=\"mentor-queue-filtering\">\n        <TrackFilterList\n          status={trackListStatus}\n          error={trackListError}\n          tracks={tracks}\n          isFetching={isTrackListFetching}\n          value={selectedTrack}\n          setValue={handleTrackChange}\n          cacheKey={TRACKS_LIST_CACHE_KEY}\n          links={links}\n        />\n        <ExerciseFilterList\n          status={exerciseListStatus}\n          exercises={exercises}\n          value={selectedExercise}\n          setValue={handleExerciseChange}\n          error={exerciseListError}\n        />\n      </div>\n    </div>\n  )\n}\n", "import { Request, usePaginatedRequestQuery } from '../../../hooks/request-query'\nimport { MentoredTrack } from '../../types'\nimport { QueryStatus } from 'react-query'\n\nexport type APIResponse = {\n  tracks: MentoredTrack[]\n}\n\nexport const useTrackList = ({\n  cacheKey,\n  request,\n}: {\n  cacheKey: string\n  request: Request\n}): {\n  tracks: MentoredTrack[]\n  status: QueryStatus\n  error: unknown\n  isFetching: boolean\n  resolvedData: any\n} => {\n  const { resolvedData, isFetching, status, error } =\n    usePaginatedRequestQuery<APIResponse>([cacheKey, request], request)\n\n  return {\n    tracks: resolvedData ? resolvedData.tracks : [],\n    status,\n    error,\n    isFetching,\n    resolvedData,\n  }\n}\n", "import { QueryStatus } from 'react-query'\nimport { MentoredTrack, MentoredTrackExercise } from '../../types'\nimport { usePaginatedRequestQuery } from '../../../hooks/request-query'\n\nexport const useExerciseList = ({\n  track,\n}: {\n  track: MentoredTrack | null\n}): {\n  exercises: MentoredTrackExercise[] | undefined\n  status: QueryStatus\n  isFetching: boolean\n  error: unknown\n} => {\n  const {\n    resolvedData: exercises,\n    status,\n    isFetching,\n    error,\n  } = usePaginatedRequestQuery<MentoredTrackExercise[]>(\n    ['mentored-exercises', track?.slug],\n    {\n      endpoint: track?.links.exercises,\n      options: {\n        enabled: !!track,\n        staleTime: 0,\n        cacheTime: 0,\n        initialData: track?.exercises ? track.exercises : undefined,\n      },\n    }\n  )\n\n  return {\n    exercises,\n    status,\n    isFetching,\n    error,\n  }\n}\n", "import { useMemo } from 'react'\nimport { usePaginatedRequestQuery, Request } from '../../../hooks/request-query'\nimport { useList } from '../../../hooks/use-list'\nimport { MentoredTrack, MentoredTrackExercise } from '../../types'\nimport { QueryStatus } from 'react-query'\nimport { useDebounce } from '../../../hooks/use-debounce'\nimport { useHistory } from '../../../hooks/use-history'\n\nexport type MentoringRequest = {\n  uuid: string\n  trackTitle: string\n  trackIconUrl: string\n  exerciseTitle: string\n  exerciseIconUrl: string\n  studentHandle: string\n  studentAvatarUrl: string\n  updatedAt: string\n  isFavorited: boolean\n  haveMentoredPreviously: boolean\n  status: string\n  tooltipUrl: string\n  url: string\n}\n\nexport type APIResponse = {\n  results: MentoringRequest[]\n  meta: {\n    currentPage: number\n    totalCount: number\n    totalPages: number\n    unscopedTotal: number\n  }\n}\n\nexport const useMentoringQueue = ({\n  request: initialRequest,\n  track,\n  exercise,\n}: {\n  request: Request\n  track: MentoredTrack | null\n  exercise: MentoredTrackExercise | null\n}): {\n  criteria?: string\n  setCriteria: (criteria: string) => void\n  order: string\n  setOrder: (order: string) => void\n  page: number\n  setPage: (page: number) => void\n  resolvedData: APIResponse | undefined\n  latestData: APIResponse | undefined\n  isFetching: boolean\n  status: QueryStatus\n  error: unknown\n} => {\n  const { request, setCriteria, setOrder, setPage } = useList(initialRequest)\n  const trackSlug = track?.slug\n  const exerciseSlug = exercise?.slug\n  const query = useMemo(() => {\n    return {\n      ...request.query,\n      trackSlug: trackSlug,\n      exerciseSlug: exerciseSlug,\n    }\n  }, [exerciseSlug, request.query, trackSlug])\n  const debouncedQuery = useDebounce(query, 500)\n  const { resolvedData, latestData, isFetching, status, error } =\n    usePaginatedRequestQuery<APIResponse>(\n      ['mentoring-request', debouncedQuery, request],\n      {\n        ...request,\n        query: debouncedQuery,\n        options: {\n          ...request.options,\n          enabled: !!track,\n        },\n      }\n    )\n\n  useHistory({ pushOn: debouncedQuery })\n\n  return {\n    resolvedData,\n    latestData,\n    status,\n    isFetching,\n    criteria: request.query.criteria,\n    setCriteria,\n    order: request.query.order,\n    setOrder,\n    page: request.query.page,\n    setPage,\n    error,\n  }\n}\n", "import React, { useCallback, useRef, useState } from 'react'\nimport { TrackIcon, Icon, GraphicalIcon } from '../../common'\nimport { FetchingBoundary } from '../../FetchingBoundary'\nimport { MentoredTrack } from '../../types'\nimport { QueryStatus } from 'react-query'\nimport { useDropdown } from '../../dropdowns/useDropdown'\nimport { ResultsZone } from '../../ResultsZone'\nimport { MentorChangeTracksModal } from '../../modals/MentorChangeTracksModal'\n\nconst TrackFilter = ({\n  title,\n  iconUrl,\n  numSolutionsQueued,\n  checked,\n  onChange,\n}: MentoredTrack & {\n  checked: boolean\n  onChange: (e: React.ChangeEvent) => void\n}): JSX.Element => {\n  return (\n    <label className=\"c-radio-wrapper\">\n      <input\n        type=\"radio\"\n        onChange={onChange}\n        checked={checked}\n        name=\"queue_track\"\n      />\n      <div className=\"row\">\n        <TrackIcon iconUrl={iconUrl} title={title} />\n        <div className=\"title\">{title}</div>\n        <div className=\"count\">{numSolutionsQueued}</div>\n      </div>\n    </label>\n  )\n}\n\nconst DEFAULT_ERROR = new Error('Unable to fetch tracks')\n\nexport const TrackFilterList = ({\n  status,\n  error,\n  children,\n  ...props\n}: React.PropsWithChildren<\n  Props & { status: QueryStatus; error: unknown }\n>): JSX.Element => {\n  return (\n    <FetchingBoundary\n      error={error}\n      status={status}\n      defaultError={DEFAULT_ERROR}\n    >\n      <Component {...props}>{children}</Component>\n    </FetchingBoundary>\n  )\n}\n\ntype Props = {\n  tracks: MentoredTrack[] | undefined\n  isFetching: boolean\n  value: MentoredTrack\n  setValue: (value: MentoredTrack) => void\n  cacheKey: string\n  links: {\n    tracks: string\n    updateTracks: string\n  }\n  sizeVariant?: 'large' | 'multi' | 'inline' | 'single' | 'automation'\n  countText?: string\n}\n\nconst Component = ({\n  sizeVariant = 'large',\n  tracks,\n  isFetching,\n  value,\n  countText,\n  setValue,\n  cacheKey,\n  links,\n}: Props): JSX.Element | null => {\n  const changeTracksRef = useRef<HTMLButtonElement>(null)\n  const [isModalOpen, setIsModalOpen] = useState(false)\n  const {\n    buttonAttributes,\n    panelAttributes,\n    listAttributes,\n    itemAttributes,\n    setOpen,\n    open,\n  } = useDropdown((tracks?.length || 0) + 1, (i) => handleItemSelect(i), {\n    placement: 'bottom',\n    modifiers: [\n      {\n        name: 'offset',\n        options: {\n          offset: [0, 8],\n        },\n      },\n    ],\n  })\n  const handleItemSelect = useCallback(\n    (index) => {\n      if (!tracks) {\n        return\n      }\n\n      const track = tracks[index]\n\n      track ? setValue(tracks[index]) : changeTracksRef.current?.click()\n      setOpen(false)\n    },\n    [setValue, tracks, setOpen]\n  )\n\n  if (!tracks) {\n    return null\n  }\n\n  return (\n    <div className={`c-single-select c-track-select --size-${sizeVariant}`}>\n      <ResultsZone isFetching={isFetching}>\n        <button\n          className=\"current-track\"\n          aria-label=\"Open the track filter\"\n          {...buttonAttributes}\n        >\n          <TrackIcon iconUrl={value.iconUrl} title={value.title} />\n          <div className=\"track-title\">{value.title}</div>\n          <div className=\"count\">\n            {value.numSolutionsQueued} {countText}\n          </div>\n          <Icon\n            icon=\"chevron-down\"\n            alt=\"Click to change\"\n            className=\"action-icon\"\n          />\n        </button>\n      </ResultsZone>\n      {open ? (\n        <div {...panelAttributes} className=\"--options\">\n          <ul {...listAttributes}>\n            {tracks.map((track, i) => {\n              return (\n                <li key={track.slug} {...itemAttributes(i)}>\n                  <TrackFilter\n                    onChange={() => {\n                      setValue(track)\n                      setOpen(false)\n                    }}\n                    checked={value.slug === track.slug}\n                    {...track}\n                  />\n                </li>\n              )\n            })}\n            <li key=\"change-tracks\" {...itemAttributes(tracks.length)}>\n              <button\n                ref={changeTracksRef}\n                type=\"button\"\n                onClick={() => {\n                  setIsModalOpen(true)\n                  setOpen(false)\n                }}\n              >\n                <GraphicalIcon icon=\"reset\" />\n                Change the tracks you mentor\n              </button>\n            </li>\n          </ul>\n        </div>\n      ) : null}\n      <MentorChangeTracksModal\n        open={isModalOpen}\n        tracks={tracks}\n        cacheKey={cacheKey}\n        links={links}\n        onClose={() => setIsModalOpen(false)}\n        onSuccess={() => {\n          setIsModalOpen(false)\n          setOpen(false)\n        }}\n      />\n    </div>\n  )\n}\n", "import React, { useState } from 'react'\nimport { Modal, ModalProps } from './Modal'\nimport { TrackSelector } from '../mentoring/TrackSelector'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../utils/send-request'\nimport { MentoredTrack } from '../types'\nimport { APIResponse as TrackListAPIResponse } from '../mentoring/queue/useTrackList'\nimport { useQueryCache } from 'react-query'\n\ntype Links = {\n  tracks: string\n  updateTracks: string\n}\n\nexport const MentorChangeTracksModal = ({\n  onClose,\n  tracks,\n  cacheKey,\n  links,\n  onSuccess,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  links: Links\n  tracks: readonly MentoredTrack[]\n  cacheKey: string\n  onSuccess: () => void\n}): JSX.Element => {\n  const queryCache = useQueryCache()\n  const [selected, setSelected] = useState<string[]>(tracks.map((t) => t.slug))\n\n  const [mutation] = useMutation<TrackListAPIResponse>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: links.updateTracks,\n        method: 'PATCH',\n        body: JSON.stringify({ track_slugs: selected }),\n      })\n\n      return fetch\n    },\n    {\n      onSuccess: (response) => {\n        queryCache.setQueryData(cacheKey, response)\n        onSuccess()\n      },\n      onSettled: () => {\n        queryCache.invalidateQueries(cacheKey)\n      },\n    }\n  )\n\n  return (\n    <Modal\n      {...props}\n      onClose={onClose}\n      className=\"m-change-mentor-tracks\"\n      cover={false}\n    >\n      <header>\n        <div className=\"info\">\n          <h2>Change the Tracks you mentor</h2>\n          <p>\n            You will still be able to continue any existing discussions on other\n            tracks.\n          </p>\n        </div>\n      </header>\n      <TrackSelector\n        selected={selected}\n        setSelected={setSelected}\n        tracksEndpoint={links.tracks}\n        onContinue={() => mutation()}\n      />\n    </Modal>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { usePaginatedRequestQuery } from '../../hooks/request-query'\nimport { TracksList } from './track-selector/TracksList'\nimport { SelectedTracksMessage } from './track-selector/SelectedTracksMessage'\nimport { ContinueButton } from './track-selector/ContinueButton'\nimport { SearchBar } from './track-selector/SearchBar'\nimport { useList } from '../../hooks/use-list'\nimport { ResultsZone } from '../ResultsZone'\n\nexport type APIResponse = {\n  tracks: readonly Track[]\n}\n\nexport type Track = {\n  slug: string\n  title: string\n  iconUrl: string\n  medianWaitTime: number\n  numSolutionsQueued: number\n}\n\nexport const TrackSelector = ({\n  tracksEndpoint,\n  selected,\n  setSelected,\n  onContinue,\n}: {\n  tracksEndpoint: string\n  selected: string[]\n  setSelected: (selected: string[]) => void\n  onContinue: () => void\n}): JSX.Element => {\n  const { request, setCriteria } = useList({\n    endpoint: tracksEndpoint,\n    options: {},\n  })\n  const { status, resolvedData, isFetching, error } = usePaginatedRequestQuery<\n    APIResponse\n  >(['tracks', request.endpoint, request.query], request)\n\n  const handleContinue = useCallback(() => {\n    onContinue()\n  }, [onContinue])\n\n  return (\n    <div className=\"c-mentor-track-selector\">\n      <div className=\"c-search-bar\">\n        <SearchBar\n          value={request.query.criteria || ''}\n          setValue={setCriteria}\n        />\n        <SelectedTracksMessage numSelected={selected.length} />\n        <ContinueButton\n          disabled={selected.length === 0}\n          onClick={handleContinue}\n        />\n      </div>\n      <ResultsZone isFetching={isFetching}>\n        <div className=\"tracks\">\n          <TracksList\n            status={status}\n            selected={selected}\n            setSelected={setSelected}\n            data={resolvedData}\n            error={error}\n          />\n        </div>\n      </ResultsZone>\n    </div>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { QueryStatus } from 'react-query'\nimport { APIResponse, Track } from '../TrackSelector'\nimport { TrackCheckbox } from './TrackCheckbox'\nimport { FetchingBoundary } from '../../FetchingBoundary'\n\nconst NoTracksFoundMessage = () => {\n  return <p>No tracks found</p>\n}\n\nconst TrackOptions = ({\n  tracks,\n  selected,\n  setSelected,\n}: {\n  tracks: readonly Track[]\n  selected: readonly string[]\n  setSelected: (selected: string[]) => void\n}) => {\n  const handleChange = useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>, id: string) => {\n      if (e.target.checked) {\n        setSelected([...selected, id])\n      } else {\n        setSelected(selected.filter((v) => v !== id))\n      }\n    },\n    [selected, setSelected]\n  )\n\n  return (\n    <React.Fragment>\n      {tracks.map((track) => {\n        return (\n          <TrackCheckbox\n            key={track.slug}\n            {...track}\n            checked={selected.includes(track.slug)}\n            onChange={(e) => handleChange(e, track.slug)}\n          />\n        )\n      })}\n    </React.Fragment>\n  )\n}\n\nconst DEFAULT_ERROR = new Error('Unable to fetch tracks')\n\nexport const TracksList = ({\n  status,\n  error,\n  selected,\n  setSelected,\n  data,\n}: {\n  status: QueryStatus\n  error: Error | unknown\n  selected: readonly string[]\n  setSelected: (selected: string[]) => void\n  data: APIResponse | undefined\n}): JSX.Element | null => {\n  return (\n    <FetchingBoundary\n      status={status}\n      error={error}\n      defaultError={DEFAULT_ERROR}\n    >\n      {data === undefined || data.tracks.length === 0 ? (\n        <NoTracksFoundMessage />\n      ) : (\n        <TrackOptions\n          tracks={data.tracks}\n          selected={selected}\n          setSelected={setSelected}\n        />\n      )}\n    </FetchingBoundary>\n  )\n}\n", "import React from 'react'\nimport pluralize from 'pluralize'\nimport { Track } from '../TrackSelector'\nimport { Icon, MedianWaitTime, TrackIcon } from '../../common'\n\nexport const TrackCheckbox = ({\n  slug,\n  title,\n  iconUrl,\n  medianWaitTime,\n  numSolutionsQueued,\n  checked,\n  onChange,\n}: Track & {\n  checked: boolean\n  onChange: (e: React.ChangeEvent<HTMLInputElement>) => void\n}): JSX.Element => {\n  return (\n    <div className=\"track\">\n      <input\n        type=\"checkbox\"\n        id={slug}\n        checked={checked}\n        onChange={onChange}\n        aria-labelledby={`${slug}-label`}\n      />\n      <label className=\"track\" htmlFor={slug} id={`${slug}-label`}>\n        {checked ? (\n          <div className=\"selected-icon\">\n            <Icon icon=\"checkmark\" alt=\"Track selected\" />\n          </div>\n        ) : null}\n        <TrackIcon iconUrl={iconUrl} title={title} />\n        <div className=\"title\">{title}</div>\n        <div className=\"info\">\n          <MedianWaitTime seconds={medianWaitTime} />\n          {numSolutionsQueued} {pluralize('solution', numSolutionsQueued)}{' '}\n          queued\n        </div>\n      </label>\n    </div>\n  )\n}\n", "import React from 'react'\nimport pluralize from 'pluralize'\n\nexport const SelectedTracksMessage = ({\n  numSelected,\n}: {\n  numSelected: number\n}): JSX.Element => {\n  const classNames = ['selected', numSelected === 0 ? 'none' : ''].filter(\n    (name) => name !== ''\n  )\n  const message =\n    numSelected === 0\n      ? 'No tracks selected'\n      : `${numSelected} ${pluralize('track', numSelected)} selected`\n\n  return <div className={classNames.join(' ')}>{message}</div>\n}\n", "import React from 'react'\n\nexport const ContinueButton = (\n  props: React.ButtonHTMLAttributes<HTMLButtonElement>\n): JSX.Element => {\n  return (\n    <button className=\"btn-primary btn-m\" {...props}>\n      <span>Continue</span>\n    </button>\n  )\n}\n", "import React, { useCallback } from 'react'\n\nexport const SearchBar = ({\n  value,\n  setValue,\n}: {\n  value: string\n  setValue: (value: string) => void\n}): JSX.Element => {\n  const handleChange = useCallback(\n    (e) => {\n      setValue(e.target.value)\n    },\n    [setValue]\n  )\n\n  return <input className=\"--search\" value={value} onChange={handleChange} />\n}\n", "import React, { useState, useCallback, useMemo, useEffect } from 'react'\nimport { ExerciseIcon, GraphicalIcon } from '../../common'\nimport { FetchingBoundary } from '../../FetchingBoundary'\nimport { MentoredTrackExercise } from '../../types'\nimport { QueryStatus } from 'react-query'\n\nexport type Props = {\n  exercises: MentoredTrackExercise[] | undefined\n  value: MentoredTrackExercise | null\n  setValue: (value: MentoredTrackExercise | null) => void\n}\n\nconst AllExerciseFilter = ({\n  count,\n  checked,\n  onChange,\n}: {\n  count: number\n  checked: boolean\n  onChange: (e: React.ChangeEvent) => void\n}): JSX.Element => {\n  return (\n    <label className=\"c-radio-wrapper\">\n      <input type=\"radio\" onChange={onChange} checked={checked} />\n      <div className=\"row\">\n        <div className=\"c-radio\" />\n        <GraphicalIcon icon=\"exercise\" category=\"graphics\" />\n        <div className=\"title\">All exercises</div>\n        <div className=\"count\">{count}</div>\n      </div>\n    </label>\n  )\n}\n\nconst ExerciseFilter = ({\n  title,\n  iconUrl,\n  count,\n  checked,\n  onChange,\n}: MentoredTrackExercise & {\n  checked: boolean\n  onChange: (e: React.ChangeEvent) => void\n}): JSX.Element => {\n  const classNames = `c-radio-wrapper ${count == 0 ? 'zero' : null}`\n  return (\n    <label className={classNames}>\n      <input type=\"radio\" onChange={onChange} checked={checked} />\n      <div className=\"row\">\n        <div className=\"c-radio\" />\n        <ExerciseIcon iconUrl={iconUrl} />\n        <div className=\"title\">{title}</div>\n        <div className=\"count\">{count}</div>\n      </div>\n    </label>\n  )\n}\n\nconst DEFAULT_ERROR = new Error('Unable to fetch exercises')\n\nexport const ExerciseFilterList = ({\n  status,\n  error,\n  ...props\n}: Props & { status: QueryStatus; error: unknown }): JSX.Element => {\n  return (\n    <FetchingBoundary\n      error={error}\n      status={status}\n      defaultError={DEFAULT_ERROR}\n    >\n      <Component {...props} />\n    </FetchingBoundary>\n  )\n}\n\nconst Component = ({ exercises, value, setValue }: Props): JSX.Element => {\n  const [searchQuery, setSearchQuery] = useState('')\n  const [isShowingExercisesToMentor, setIsShowingExercisesToMentor] = useState(\n    true\n  )\n  const [\n    isShowingExercisesCompleted,\n    setIsShowingExercisesCompleted,\n  ] = useState(false)\n\n  const exercisesToShow = useMemo(() => {\n    if (!exercises) {\n      return []\n    }\n\n    return exercises\n      .filter((exercise) => {\n        if (exercise.slug === value?.slug) {\n          return true\n        }\n\n        return isShowingExercisesToMentor ? exercise.count !== 0 : true\n      })\n      .filter((exercise) => {\n        if (exercise.slug === value?.slug) {\n          return true\n        }\n\n        return isShowingExercisesCompleted ? exercise.completedByMentor : true\n      })\n      .filter((exercise) =>\n        exercise.title.match(new RegExp(`^${searchQuery}`, 'i'))\n      )\n  }, [\n    exercises,\n    isShowingExercisesCompleted,\n    isShowingExercisesToMentor,\n    searchQuery,\n    value?.slug,\n  ])\n\n  const handleChange = useCallback(\n    (e, optionValue) => {\n      setSearchQuery('')\n      setValue(optionValue)\n    },\n    [setValue]\n  )\n\n  const handleShowCompletedExercises = useCallback(\n    (e) => {\n      if (!exercises) {\n        return\n      }\n\n      setIsShowingExercisesCompleted(e.target.checked)\n      setValue(null)\n    },\n    [exercises, setValue]\n  )\n\n  const handleSearchBarChange = useCallback((e) => {\n    setSearchQuery(e.target.value)\n  }, [])\n\n  useEffect(() => {\n    setSearchQuery('')\n    setIsShowingExercisesToMentor(true)\n    setIsShowingExercisesCompleted(false)\n  }, [JSON.stringify(exercises)])\n\n  return (\n    <>\n      <div className=\"exercise-filter\">\n        <div className=\"c-search-bar\">\n          <input\n            value={searchQuery}\n            onChange={handleSearchBarChange}\n            className=\"--search\"\n            placeholder=\"Search by Exercise name\"\n          />\n        </div>\n        <label className=\"c-checkbox-wrapper filter\">\n          <input\n            type=\"checkbox\"\n            checked={isShowingExercisesToMentor}\n            onChange={() =>\n              setIsShowingExercisesToMentor(!isShowingExercisesToMentor)\n            }\n          />\n          <div className=\"row\">\n            <div className=\"c-checkbox\">\n              <GraphicalIcon icon=\"checkmark\" />\n            </div>\n            Only show exercises that need mentoring\n          </div>\n        </label>\n        <label className=\"c-checkbox-wrapper filter\">\n          <input\n            type=\"checkbox\"\n            checked={isShowingExercisesCompleted}\n            onChange={handleShowCompletedExercises}\n          />\n          <div className=\"row\">\n            <div className=\"c-checkbox\">\n              <GraphicalIcon icon=\"checkmark\" />\n            </div>\n            Only show exercises I've completed\n          </div>\n        </label>\n      </div>\n      <div className=\"exercises\">\n        <AllExerciseFilter\n          key=\"all\"\n          onChange={(e) => handleChange(e, null)}\n          checked={value === null}\n          count={\n            exercises?.reduce((sum, exercise) => sum + exercise.count, 0) || 0\n          }\n        />\n        {exercisesToShow.map((exercise) => (\n          <ExerciseFilter\n            key={exercise.slug}\n            onChange={(e) => handleChange(e, exercise)}\n            checked={value?.slug === exercise.slug}\n            {...exercise}\n          />\n        ))}\n      </div>\n    </>\n  )\n}\n", "import React from 'react'\nimport { Solution } from './Solution'\nimport { Pagination } from '../../common/Pagination'\nimport { FetchingBoundary } from '../../FetchingBoundary'\nimport { APIResponse } from './useMentoringQueue'\nimport { QueryStatus } from 'react-query'\n\nconst DEFAULT_ERROR = new Error('Unable to fetch queue')\n\ntype Props = {\n  resolvedData: APIResponse | undefined\n  latestData: APIResponse | undefined\n  page: number\n  setPage: (page: number) => void\n}\n\nexport const SolutionList = ({\n  status,\n  error,\n  ...props\n}: { status: QueryStatus; error: unknown } & Props): JSX.Element => {\n  return (\n    <FetchingBoundary\n      status={status}\n      error={error}\n      defaultError={DEFAULT_ERROR}\n    >\n      <Component {...props} />\n    </FetchingBoundary>\n  )\n}\n\nconst Component = ({ resolvedData, latestData, page, setPage }: Props) => {\n  return (\n    <>\n      {resolvedData && resolvedData.results.length > 0 ? (\n        <React.Fragment>\n          <div className=\"--solutions\">\n            {resolvedData.results.length > 0\n              ? resolvedData.results.map((solution, key) => (\n                  <Solution key={key} {...solution} />\n                ))\n              : 'No discussions found'}\n          </div>\n          <footer>\n            <Pagination\n              disabled={latestData === undefined}\n              current={page}\n              total={resolvedData.meta.totalPages}\n              setPage={setPage}\n            />\n          </footer>\n        </React.Fragment>\n      ) : null}\n    </>\n  )\n}\n", "import React from 'react'\nimport { fromNow } from '../../../utils/time'\nimport { ExerciseIcon } from '../../common/ExerciseIcon'\nimport { GraphicalIcon } from '../../common/GraphicalIcon'\nimport { Icon } from '../../common/Icon'\nimport { Avatar } from '../../common/Avatar'\nimport { StudentTooltip } from '../../tooltips'\nimport { MentoringRequest } from './useMentoringQueue'\nimport { ExercismTippy } from '../../misc/ExercismTippy'\n\nexport const Solution = ({\n  studentAvatarUrl,\n  studentHandle,\n  exerciseTitle,\n  exerciseIconUrl,\n  isFavorited,\n  haveMentoredPreviously,\n  status,\n  updatedAt,\n  url,\n  tooltipUrl,\n}: MentoringRequest): JSX.Element => {\n  return (\n    <ExercismTippy content={<StudentTooltip endpoint={tooltipUrl} />}>\n      <a href={url} className=\"--solution\">\n        <ExerciseIcon title={exerciseTitle} iconUrl={exerciseIconUrl} />\n        <Avatar src={studentAvatarUrl} handle={studentHandle} />\n        <div className=\"--info\">\n          <div className=\"--handle\">\n            {studentHandle}\n            {isFavorited ? (\n              <Icon\n                icon=\"gold-star\"\n                alt=\"Favorite student\"\n                className=\"favorited\"\n              />\n            ) : haveMentoredPreviously ? (\n              <Icon\n                icon=\"mentoring\"\n                alt=\"Mentored previously\"\n                className=\"previously-mentored\"\n              />\n            ) : null}\n          </div>\n          <div className=\"--exercise-title\">on {exerciseTitle}</div>\n        </div>\n        {status ? <div className=\"--status\">{status}</div> : null}\n        <time className=\"-updated-at\">{fromNow(updatedAt)}</time>\n        <GraphicalIcon icon=\"chevron-right\" className=\"action-icon\" />\n      </a>\n    </ExercismTippy>\n  )\n}\n", "import React, { useState, createContext, useCallback } from 'react'\n\nimport { CommunitySolution, Guidance as GuidanceTypes, Student } from '../types'\nimport { CloseButton } from './session/CloseButton'\nimport { SessionInfo } from './session/SessionInfo'\nimport { Guidance } from './session/Guidance'\nimport { Scratchpad } from './session/Scratchpad'\nimport { StudentInfo } from './session/StudentInfo'\nimport { IterationView } from './session/IterationView'\n\nimport { DiscussionDetails } from './discussion/DiscussionDetails'\nimport { DiscussionActions } from './discussion/DiscussionActions'\nimport { AddDiscussionPostPanel } from './discussion/AddDiscussionPostPanel'\nimport { useDiscussionIterations } from './discussion/use-discussion-iterations'\n\nimport { RequestDetails } from './request/RequestDetails'\nimport { MentoringRequestPanel } from './request/MentoringRequestPanel'\n\nimport { Tab, TabContext } from '../common/Tab'\nimport { GraphicalIcon } from '../common/GraphicalIcon'\nimport { PostsWrapper } from './discussion/PostsContext'\n\nimport {\n  MentorSessionRequest as Request,\n  Iteration,\n  MentorDiscussion as Discussion,\n  MentorSessionTrack as Track,\n  MentorSessionExercise as Exercise,\n  MentoringSessionExemplarFile,\n  TestFile,\n} from '../types'\n\nimport { useIterationScrolling } from './session/useIterationScrolling'\nimport { SplitPane } from '../common'\nimport { FavoritableStudent } from './session/FavoriteButton'\n\nexport type Links = {\n  mentorDashboard: string\n  improveNotes: string\n  mentoringDocs: string\n}\n\nexport type Scratchpad = {\n  isIntroducerHidden: boolean\n  links: {\n    markdown: string\n    hideIntroducer: string\n    self: string\n  }\n}\n\nexport type SessionProps = {\n  student: Student\n  track: Track\n  exercise: Exercise\n  links: Links\n  discussion: Discussion\n  iterations: readonly Iteration[]\n  instructions: string\n  testFiles: readonly TestFile[]\n  userHandle: string\n  guidance: SessionGuidance\n  outOfDate: boolean\n  mentorSolution: CommunitySolution\n  exemplarFiles: readonly MentoringSessionExemplarFile[]\n  request: Request\n  scratchpad: Scratchpad\n  downloadCommand: string\n}\n\nexport type SessionGuidance = Pick<\n  GuidanceTypes,\n  'exercise' | 'track' | 'links'\n>\n\nexport type TabIndex = 'discussion' | 'scratchpad' | 'guidance'\n\nexport const TabsContext = createContext<TabContext>({\n  current: 'instructions',\n  switchToTab: () => null,\n})\n\nexport const Session = (props: SessionProps): JSX.Element => {\n  const [session, setSession] = useState(props)\n  const {\n    student,\n    track,\n    exercise,\n    links,\n    iterations: initialIterations,\n    instructions,\n    testFiles,\n    discussion,\n    guidance,\n    mentorSolution,\n    exemplarFiles,\n    outOfDate,\n    request,\n    scratchpad,\n    userHandle,\n    downloadCommand,\n  } = session\n  const [tab, setTab] = useState<TabIndex>('discussion')\n\n  const setStudent = useCallback(\n    (student: Student) => {\n      setSession({ ...session, student: student })\n    },\n    [session]\n  )\n\n  const { iterations, status } = useDiscussionIterations({\n    discussion: discussion,\n    iterations: initialIterations,\n  })\n\n  const [isLinked, setIsLinked] = useState(false)\n  const { currentIteration, handleIterationClick, handleIterationScroll } =\n    useIterationScrolling({ iterations: iterations, on: isLinked })\n\n  return (\n    <div className=\"c-mentor-discussion\">\n      <SplitPane\n        id=\"mentoring-session\"\n        defaultLeftWidth=\"90%\"\n        leftMinWidth={550}\n        rightMinWidth={625}\n        left={\n          <>\n            <header className=\"discussion-header\">\n              <CloseButton url={links.mentorDashboard} />\n              <SessionInfo\n                student={student}\n                track={track}\n                exercise={exercise}\n              />\n              {discussion ? (\n                <DiscussionActions\n                  {...discussion}\n                  session={session}\n                  setSession={setSession}\n                />\n              ) : null}\n            </header>\n            <IterationView\n              iterations={iterations}\n              instructions={instructions}\n              testFiles={testFiles}\n              currentIteration={currentIteration}\n              onClick={handleIterationClick}\n              isOutOfDate={outOfDate}\n              language={track.highlightjsLanguage}\n              indentSize={track.indentSize}\n              isLinked={isLinked}\n              setIsLinked={setIsLinked}\n              discussion={discussion}\n              downloadCommand={downloadCommand}\n            />\n          </>\n        }\n        right={\n          <PostsWrapper discussion={session.discussion}>\n            <TabsContext.Provider\n              value={{\n                current: tab,\n                switchToTab: (id: string) => setTab(id as TabIndex),\n              }}\n            >\n              <>\n                <div className=\"tabs\" role=\"tablist\">\n                  <Tab id=\"discussion\" context={TabsContext}>\n                    <GraphicalIcon icon=\"comment\" />\n                    <Tab.Title text=\"Discussion\" />\n                  </Tab>\n                  <Tab id=\"scratchpad\" context={TabsContext}>\n                    <GraphicalIcon icon=\"scratchpad\" />\n                    <Tab.Title text=\"Scratchpad\" />\n                  </Tab>\n                  <Tab id=\"guidance\" context={TabsContext}>\n                    <GraphicalIcon icon=\"guidance\" />\n                    <Tab.Title text=\"Guidance\" />\n                  </Tab>\n                </div>\n                <Tab.Panel id=\"discussion\" context={TabsContext}>\n                  <StudentInfo student={student} setStudent={setStudent} />\n                  {discussion ? (\n                    <DiscussionDetails\n                      status={status}\n                      discussion={discussion}\n                      iterations={iterations}\n                      student={student as FavoritableStudent}\n                      setStudent={setStudent}\n                      userHandle={userHandle}\n                      onIterationScroll={handleIterationScroll}\n                    />\n                  ) : (\n                    <RequestDetails\n                      iteration={iterations[iterations.length - 1]}\n                      request={request}\n                    />\n                  )}\n                </Tab.Panel>\n                <Tab.Panel id=\"scratchpad\" context={TabsContext}>\n                  <Scratchpad\n                    scratchpad={scratchpad}\n                    track={track}\n                    exercise={exercise}\n                  />\n                </Tab.Panel>\n                <Tab.Panel id=\"guidance\" context={TabsContext}>\n                  <Guidance\n                    guidance={guidance}\n                    mentorSolution={mentorSolution}\n                    exemplarFiles={exemplarFiles}\n                    language={track.highlightjsLanguage}\n                    links={guidance.links}\n                  />\n                </Tab.Panel>\n                {discussion ? (\n                  <AddDiscussionPostPanel\n                    discussion={discussion}\n                    links={links}\n                  />\n                ) : (\n                  <MentoringRequestPanel\n                    iterations={iterations}\n                    request={request}\n                    session={session}\n                    setSession={setSession}\n                    links={links}\n                  />\n                )}\n              </>\n            </TabsContext.Provider>\n          </PostsWrapper>\n        }\n      />\n    </div>\n  )\n}\n", "import React from 'react'\nimport { GraphicalIcon } from '../../common'\n\nexport const CloseButton = ({ url }: { url: string }): JSX.Element => (\n  <a\n    href={url}\n    className=\"close-btn\"\n    aria-label=\"Close discussion and return to mentoring dashboard\"\n  >\n    <GraphicalIcon icon=\"close\" />\n  </a>\n)\n", "import React from 'react'\nimport { TrackIcon } from '../../common/TrackIcon'\nimport { Avatar } from '../../common/Avatar'\nimport { Student } from '../../types'\nimport {\n  MentorSessionTrack as Track,\n  MentorSessionExercise as Exercise,\n} from '../../types'\n\nexport const SessionInfo = ({\n  student,\n  track,\n  exercise,\n}: {\n  student: Student\n  track: Track\n  exercise: Exercise\n}): JSX.Element => {\n  return (\n    <>\n      <TrackIcon title={track.title} iconUrl={track.iconUrl} />\n      <div className=\"student\">\n        <Avatar src={student.avatarUrl} handle={student.handle} />\n        <div className=\"info\">\n          <div className=\"handle\">{student.handle}</div>\n          <div className=\"exercise\">\n            on {exercise.title} in {track.title}{' '}\n          </div>\n        </div>\n      </div>\n    </>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { Accordion } from '../../common/Accordion'\nimport { MentorNotes } from './MentorNotes'\nimport {\n  CommunitySolution as CommunitySolutionProps,\n  GuidanceLinks,\n  MentoringSessionExemplarFile,\n} from '../../types'\nimport { CommunitySolution, GraphicalIcon } from '../../common'\nimport { useHighlighting } from '../../../utils/highlight'\nimport { ExemplarFilesList } from './guidance/ExemplarFilesList'\nimport { SessionGuidance } from '../Session'\n\nconst AccordionHeader = ({\n  isOpen,\n  title,\n}: {\n  isOpen: boolean\n  title: string\n}) => {\n  return (\n    <Accordion.Header>\n      {isOpen ? (\n        <GraphicalIcon icon=\"minus-circle\" />\n      ) : (\n        <GraphicalIcon icon=\"plus-circle\" />\n      )}\n      <div className=\"--title\">{title}</div>\n    </Accordion.Header>\n  )\n}\n\nexport type Props = {\n  guidance: SessionGuidance\n  mentorSolution?: CommunitySolutionProps\n  exemplarFiles: readonly MentoringSessionExemplarFile[]\n  links: GuidanceLinks\n  language: string\n  feedback?: any\n}\n\nexport const Guidance = ({\n  guidance,\n  mentorSolution,\n  exemplarFiles,\n  links,\n  language,\n  feedback = false,\n}: Props): JSX.Element => {\n  const ref = useHighlighting<HTMLDivElement>()\n  const [accordionState, setAccordionState] = useState([\n    {\n      id: 'exemplar-files',\n      isOpen: exemplarFiles.length !== 0,\n    },\n    {\n      id: 'exercise-guidance',\n      isOpen: exemplarFiles.length === 0,\n    },\n    {\n      id: 'track-guidance',\n      isOpen: false,\n    },\n    {\n      id: 'mentor-solution',\n      isOpen: false,\n    },\n    {\n      id: 'feedback',\n      isOpen: false,\n    },\n  ])\n\n  const handleClick = useCallback(\n    (id: string) => {\n      setAccordionState(\n        accordionState.map((state) => {\n          const isOpen = id === state.id && !state.isOpen\n          return {\n            id: state.id,\n            isOpen: isOpen,\n          }\n        })\n      )\n    },\n    [accordionState]\n  )\n\n  const isOpen = useCallback(\n    (id: string) => {\n      const state = accordionState.find((state) => state.id === id)\n\n      if (!state) {\n        throw new Error('Accordion id not found')\n      }\n\n      return state.isOpen\n    },\n    [accordionState]\n  )\n\n  return (\n    <div ref={ref}>\n      {exemplarFiles.length !== 0 ? (\n        <Accordion\n          id=\"exemplar-files\"\n          isOpen={isOpen('exemplar-files')}\n          onClick={handleClick}\n        >\n          <AccordionHeader\n            isOpen={isOpen('exemplar-files')}\n            title=\"The exemplar solution\"\n          />\n          <Accordion.Panel>\n            <div className=\"c-textual-content --small\">\n              <p>\n                Try and guide the student towards this solution. It is the best\n                place for them to reach at this point during the Track.\n              </p>\n              <ExemplarFilesList files={exemplarFiles} language={language} />\n            </div>\n          </Accordion.Panel>\n        </Accordion>\n      ) : null}\n      <Accordion\n        id=\"exercise-guidance\"\n        isOpen={isOpen('exercise-guidance')}\n        onClick={handleClick}\n      >\n        <AccordionHeader\n          isOpen={isOpen('exercise-guidance')}\n          title=\"Exercise notes\"\n        />\n        <Accordion.Panel>\n          <MentorNotes\n            notes={guidance.exercise}\n            guidanceType=\"exercise\"\n            improveUrl={links.improveExerciseGuidance}\n          />\n        </Accordion.Panel>\n      </Accordion>\n      <Accordion\n        id=\"track-guidance\"\n        isOpen={isOpen('track-guidance')}\n        onClick={handleClick}\n      >\n        <AccordionHeader\n          isOpen={isOpen('track-guidance')}\n          title=\"Track notes\"\n        />\n        <Accordion.Panel>\n          <MentorNotes\n            notes={guidance.track}\n            guidanceType=\"track\"\n            improveUrl={links.improveTrackGuidance}\n          />\n        </Accordion.Panel>\n      </Accordion>\n      {mentorSolution ? (\n        <Accordion\n          id=\"mentor-solution\"\n          isOpen={isOpen('mentor-solution')}\n          onClick={handleClick}\n        >\n          <AccordionHeader\n            isOpen={isOpen('mentor-solution')}\n            title=\"How you solved the exercise\"\n          />\n          <Accordion.Panel>\n            <CommunitySolution context=\"mentoring\" solution={mentorSolution} />\n          </Accordion.Panel>\n        </Accordion>\n      ) : null}\n      {feedback ? (\n        <Accordion\n          id=\"feedback\"\n          isOpen={isOpen('feedback')}\n          onClick={handleClick}\n        >\n          <AccordionHeader\n            isOpen={isOpen('feedback')}\n            title=\"Automated feedback\"\n          />\n          <Accordion.Panel>\n            <p>Feedback here</p>\n          </Accordion.Panel>\n        </Accordion>\n      ) : null}\n    </div>\n  )\n}\n", "import React from 'react'\n\nexport type AccordionContext = {\n  id: string\n  isOpen: boolean\n  onClick: (id: string) => void\n}\n\nconst Context = React.createContext<AccordionContext>({\n  id: '',\n  isOpen: false,\n  onClick: (id: string) => null,\n})\n\nexport const Accordion = ({\n  id,\n  isOpen,\n  onClick,\n  children,\n}: {\n  id: string\n  isOpen: boolean\n  onClick: (id: string) => void\n  children?: React.ReactNode\n}): JSX.Element => {\n  return (\n    <Context.Provider value={{ isOpen, id, onClick }}>\n      <div className=\"c-accordion-section\">{children}</div>\n    </Context.Provider>\n  )\n}\n\nconst AccordionHeader = ({\n  label,\n  children,\n}: {\n  label?: string\n  children?: React.ReactNode\n}): JSX.Element => {\n  const { isOpen, id, onClick } = React.useContext(Context)\n\n  return (\n    <button\n      type=\"button\"\n      onClick={() => onClick(id)}\n      aria-expanded={isOpen}\n      aria-controls={`accordion-panel-${id}`}\n      aria-label={label}\n      id={`accordion-header-${id}`}\n    >\n      {children}\n    </button>\n  )\n}\nAccordionHeader.displayName = 'AccordionHeader'\nAccordion.Header = AccordionHeader\n\nconst AccordionPanel = ({ children }: { children: React.ReactNode }) => {\n  const { isOpen, id } = React.useContext(Context)\n\n  return (\n    <div\n      id={`accordion-panel-${id}`}\n      aria-labelledby={`accordion-panel-${id}`}\n      hidden={!isOpen}\n    >\n      {children}\n    </div>\n  )\n}\n\nAccordionPanel.displayName = 'AccordionPanel'\nAccordion.Panel = AccordionPanel\n", "import React from 'react'\n\nexport const MentorNotes = ({\n  notes,\n  improveUrl,\n  guidanceType,\n}: {\n  notes?: string\n  improveUrl: string\n  guidanceType: 'track' | 'exercise' | 'representer'\n}): JSX.Element => {\n  const prLink = (\n    <a href={improveUrl} target=\"_blank\" rel=\"noreferrer\">\n      Pull Request on GitHub\n    </a>\n  )\n\n  if (!notes) {\n    return (\n      <p className=\"text-p-base\">\n        This {guidanceType} doesn&apos;t have any mentoring notes yet. Mentoring\n        notes are written by our community. Please help get them started for\n        this exercise by sending a {prLink}.\n      </p>\n    )\n  }\n\n  return (\n    <React.Fragment>\n      <div\n        className=\"c-textual-content --small\"\n        dangerouslySetInnerHTML={{ __html: notes }}\n      />\n      <hr className=\"c-divider --small my-16\" />\n      <h3 className=\"text-h5 mb-4\">Improve these notes</h3>\n      <p className=\"text-p-base\">\n        These notes are written by our community. Please help improve them by\n        sending a {prLink}.\n      </p>\n    </React.Fragment>\n  )\n}\n", "import React from 'react'\nimport { MentoringSessionExemplarFile } from '../../../types'\n\nexport type Props = {\n  files: readonly MentoringSessionExemplarFile[]\n  language: string\n}\n\nexport const ExemplarFilesList = ({ files, language }: Props): JSX.Element => {\n  return (\n    <React.Fragment>\n      {files.map((file) => (\n        <ExemplarFile key={file.filename}>\n          {files.length > 1 ? (\n            <ExemplarFile.Header filename={file.filename} />\n          ) : null}\n          <ExemplarFile.Content content={file.content} language={language} />\n        </ExemplarFile>\n      ))}\n    </React.Fragment>\n  )\n}\n\nconst ExemplarFile = ({ children }: { children?: React.ReactNode }) => {\n  return <div className=\"exemplar-files\">{children}</div>\n}\n\nExemplarFile.Header = ({ filename }: { filename: string }) => {\n  return <div className=\"filename\">{filename}</div>\n}\n\nExemplarFile.Content = ({\n  content,\n  language,\n}: {\n  content: string\n  language: string\n}) => {\n  return (\n    <pre className=\"overflow-auto\">\n      <code className={language}>{content}</code>\n    </pre>\n  )\n}\n", "import React, { useCallback, useState, useEffect } from 'react'\nimport { sendRequest } from '../../../utils/send-request'\nimport { typecheck } from '../../../utils/typecheck'\nimport { camelizeKeys } from 'humps'\nimport {\n  Loading,\n  TrackIcon,\n  Introducer,\n  AlertTag,\n  MarkdownEditor,\n} from '../../common'\nimport {\n  MentorSessionTrack as Track,\n  MentorSessionExercise as Exercise,\n  RepresentationTrack,\n  RepresentationExercise,\n} from '../../types'\nimport { Scratchpad as ScratchpadProps } from '../Session'\nimport { useMutation } from 'react-query'\n\ntype ScratchpadPage = {\n  contentMarkdown: string\n}\n\nexport const Scratchpad = ({\n  scratchpad,\n  track,\n  exercise,\n}: {\n  scratchpad: ScratchpadProps\n  track: Track | RepresentationTrack\n  exercise: Exercise | RepresentationExercise\n}): JSX.Element => {\n  const [content, setContent] = useState('')\n  const [error, setError] = useState('')\n  const [page, setPage] = useState<ScratchpadPage | null>(null)\n\n  const handleChange = useCallback((content) => {\n    setContent(content)\n  }, [])\n\n  const [mutation] = useMutation<ScratchpadPage>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: scratchpad.links.self,\n        method: 'PATCH',\n        body: JSON.stringify({\n          scratchpad_page: { content_markdown: content },\n        }),\n      })\n\n      return fetch.then((json) =>\n        typecheck<ScratchpadPage>(camelizeKeys(json), 'scratchpadPage')\n      )\n    },\n    {\n      onSuccess: (page) => setPage(page),\n      onError: (err) => {\n        if (err instanceof Response) {\n          err.json().then((res: any) => setError(res.error.message))\n        }\n      },\n    }\n  )\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      setError('')\n      mutation()\n    },\n    [mutation]\n  )\n\n  const pullPage = useCallback(() => {\n    const { fetch } = sendRequest({\n      endpoint: scratchpad.links.self,\n      body: null,\n      method: 'GET',\n    })\n\n    fetch\n      .then((json) => {\n        const page = typecheck<ScratchpadPage>(\n          camelizeKeys(json),\n          'scratchpadPage'\n        )\n\n        setPage({\n          ...page,\n          contentMarkdown:\n            page.contentMarkdown === null ? '' : page.contentMarkdown,\n        })\n      })\n      .catch(() => {\n        // TODO: (required) do something\n      })\n  }, [scratchpad.links.self])\n\n  useEffect(pullPage, [pullPage])\n\n  const revert = useCallback(() => {\n    if (!page) {\n      return\n    }\n\n    setContent(page.contentMarkdown)\n  }, [page])\n\n  useEffect(() => {\n    if (!page) {\n      return\n    }\n\n    setContent(page.contentMarkdown)\n  }, [page])\n\n  if (!page) {\n    return <Loading />\n  }\n\n  return (\n    <>\n      {scratchpad.isIntroducerHidden ? null : (\n        <Introducer\n          icon=\"scratchpad\"\n          endpoint={scratchpad.links.hideIntroducer}\n          size=\"small\"\n        >\n          <h2>Introducing your scratchpad</h2>\n          <p>\n            A{' '}\n            <a\n              target=\"_blank\"\n              rel=\"noreferrer\"\n              href={scratchpad.links.markdown}\n            >\n              Markdown-supported\n            </a>{' '}\n            place for you to write notes and add code snippets you\u2019d like to\n            refer to during mentoring.\n          </p>\n        </Introducer>\n      )}\n      <div className=\"flex flex-row justify-between\">\n        <div className=\"title\">\n          Your notes for <strong>{exercise.title}</strong> in\n          <TrackIcon iconUrl={track.iconUrl} title={track.title} />\n          <strong>{track.title}</strong>\n        </div>\n\n        {content === page.contentMarkdown ? null : <AlertTag>Unsaved</AlertTag>}\n      </div>\n\n      <form\n        data-turbo=\"false\"\n        onSubmit={handleSubmit}\n        className=\"c-markdown-editor\"\n      >\n        <MarkdownEditor\n          onChange={handleChange}\n          contextId={`scratchpad-${scratchpad.links.self}`}\n          options={{ status: [] }}\n          value={content}\n        />\n        <footer className=\"editor-footer scratchpad-footer\">\n          {content === page.contentMarkdown ? null : (\n            <button\n              className=\"btn-small-discourage\"\n              type=\"button\"\n              onClick={revert}\n            >\n              Revert to saved\n            </button>\n          )}\n\n          <button type=\"submit\" className=\"btn-primary btn-s\">\n            Save\n          </button>\n        </footer>\n      </form>\n      {error ? <p>{error}</p> : null}\n    </>\n  )\n}\n", "import React from 'react'\nimport { Student } from '../../types'\nimport { Avatar, Reputation } from '../../common'\nimport { FavoritableStudent, FavoriteButton } from './FavoriteButton'\nimport { PreviousSessionsLink } from './PreviousSessionsLink'\nimport { HandleWithFlair } from '@/components/common/HandleWithFlair'\n\nexport const StudentInfo = ({\n  student,\n  setStudent,\n}: {\n  student: Student\n  setStudent: (student: Student) => void\n}): JSX.Element => {\n  return (\n    <div className=\"student-info\">\n      <div className=\"info\">\n        <div className=\"subtitle\">Who you&apos;re mentoring</div>\n        <div className=\"handle-block\">\n          <div className=\"handle\">\n            <HandleWithFlair\n              handle={student.handle}\n              flair={student.flair}\n              size=\"medium\"\n            />\n          </div>\n          <Reputation\n            value={student.reputation.toString()}\n            type=\"primary\"\n            size=\"small\"\n          />\n        </div>\n        <div className=\"name\">{student.name}</div>\n        <div className=\"bio\">{student.bio}</div>\n        <div className=\"options\">\n          {student.links ? (\n            <StudentInfoActions student={student} setStudent={setStudent} />\n          ) : null}\n          <PreviousSessionsLink student={student} setStudent={setStudent} />\n        </div>\n      </div>\n      <Avatar src={student.avatarUrl} handle={student.handle} />\n    </div>\n  )\n}\n\nconst StudentInfoActions = ({\n  student,\n  setStudent,\n}: {\n  student: Student\n  setStudent: (student: Student) => void\n}) => {\n  return (\n    <React.Fragment>\n      {student.links.favorite ? (\n        <FavoriteButton\n          student={student as FavoritableStudent}\n          onSuccess={(student) => setStudent(student)}\n        />\n      ) : null}\n    </React.Fragment>\n  )\n}\n", "import React from 'react'\nimport { AddFavoriteButton } from './favorite-button/AddFavoriteButton'\nimport { RemoveFavoriteButton } from './favorite-button/RemoveFavoriteButton'\nimport { Student } from '../../types'\n\nexport type FavoritableStudent = Student & { links: { favorite: string } }\n\nexport const FavoriteButton = ({\n  student,\n  onSuccess,\n}: {\n  student: FavoritableStudent\n  onSuccess: (student: FavoritableStudent) => void\n}): JSX.Element | null => {\n  return (\n    <div className=\"button-wrapper\">\n      {student.isFavorited ? (\n        <RemoveFavoriteButton\n          endpoint={student.links.favorite}\n          onSuccess={(student) => onSuccess(student)}\n        />\n      ) : (\n        <AddFavoriteButton\n          endpoint={student.links.favorite}\n          onSuccess={(student) => onSuccess(student)}\n        />\n      )}\n    </div>\n  )\n}\n", "import React from 'react'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { GraphicalIcon } from '../../../common/GraphicalIcon'\nimport { ErrorBoundary, useErrorHandler } from '../../../ErrorBoundary'\nimport { FavoritableStudent } from '../FavoriteButton'\nimport { FormButton } from '../../../common'\nimport { typecheck } from '../../../../utils/typecheck'\n\ntype ComponentProps = {\n  endpoint: string\n  onSuccess: (student: FavoritableStudent) => void\n}\n\nexport const AddFavoriteButton = (props: ComponentProps): JSX.Element => {\n  return (\n    <ErrorBoundary>\n      <Component {...props} />\n    </ErrorBoundary>\n  )\n}\n\nconst DEFAULT_ERROR = new Error('Unable to mark student as a favorite')\n\nconst Component = ({\n  endpoint,\n  onSuccess,\n}: ComponentProps): JSX.Element | null => {\n  const [mutation, { status, error }] = useMutation<FavoritableStudent>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'POST',\n        body: null,\n      })\n\n      return fetch.then((json) =>\n        typecheck<FavoritableStudent>(json, 'student')\n      )\n    },\n    {\n      onSuccess: (student) => onSuccess(student),\n    }\n  )\n\n  /* TODO: (required) Style this */\n  useErrorHandler(error, { defaultError: DEFAULT_ERROR })\n\n  return (\n    <FormButton\n      onClick={() => {\n        mutation()\n      }}\n      type=\"button\"\n      className=\"btn-small\"\n      status={status}\n    >\n      <GraphicalIcon icon=\"plus\" />\n      <span>Add to favorites</span>\n    </FormButton>\n  )\n}\n", "import React, { useState } from 'react'\nimport { FormButton } from '../../../common'\nimport { GraphicalIcon } from '../../../common/GraphicalIcon'\nimport { useMutation } from 'react-query'\nimport { ErrorBoundary, useErrorHandler } from '../../../ErrorBoundary'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { FavoritableStudent } from '../FavoriteButton'\nimport { typecheck } from '../../../../utils/typecheck'\n\ntype ComponentProps = {\n  endpoint: string\n  onSuccess: (student: FavoritableStudent) => void\n}\n\nexport const RemoveFavoriteButton = (props: ComponentProps): JSX.Element => {\n  return (\n    <ErrorBoundary>\n      <Component {...props} />\n    </ErrorBoundary>\n  )\n}\n\nconst DEFAULT_ERROR = new Error('Unable to remove student as a favorite')\n\nconst Component = ({\n  endpoint,\n  onSuccess,\n  ...props\n}: ComponentProps): JSX.Element | null => {\n  const [isHovering, setIsHovering] = useState(false)\n\n  const [mutation, { status, error }] = useMutation<FavoritableStudent>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'DELETE',\n        body: null,\n      })\n\n      return fetch.then((json) =>\n        typecheck<FavoritableStudent>(json, 'student')\n      )\n    },\n    {\n      onSuccess: (student) => onSuccess(student),\n    }\n  )\n\n  useErrorHandler(error, { defaultError: DEFAULT_ERROR })\n\n  return (\n    <FormButton\n      {...props}\n      onClick={() => {\n        mutation()\n      }}\n      type=\"button\"\n      className={\n        // We use a hover class, rather than the hover css construct\n        // so that the button doesn't immediately switch to its hover\n        // state once it's been clicked. By using onMouseEnter that state\n        // only gets set when someone is moving into the box afresh.\n        'btn-small unfavorite-button ' + (isHovering ? 'hover' : '')\n      }\n      // TODO: (required) These do not work on tab (a11y).\n      // When tabbing this should be set to true.\n      onMouseEnter={() => setIsHovering(true)}\n      onMouseLeave={() => setIsHovering(false)}\n      status={status}\n    >\n      {isHovering ? (\n        'Unfavorite?'\n      ) : (\n        <>\n          <GraphicalIcon icon=\"star\" />\n          <span>Favorited</span>\n        </>\n      )}\n    </FormButton>\n  )\n}\n", "import React, { useState } from 'react'\nimport { Icon } from '../../common/Icon'\nimport pluralize from 'pluralize'\nimport { PreviousMentoringSessionsModal } from '../../modals/PreviousMentoringSessionsModal'\nimport { Student } from '../../types'\n\nexport const PreviousSessionsLink = ({\n  student,\n  setStudent,\n}: {\n  student: Student\n  setStudent: (student: Student) => void\n}): JSX.Element | null => {\n  const [open, setOpen] = useState(false)\n\n  if (student.numDiscussionsWithMentor < 2) {\n    return null\n  }\n\n  const numPrevious = student.numDiscussionsWithMentor - 1\n\n  return (\n    <React.Fragment>\n      <button\n        type=\"button\"\n        className=\"previous-sessions\"\n        onClick={() => setOpen(true)}\n      >\n        See {numPrevious} previous {pluralize('session', numPrevious)}\n        <Icon icon=\"modal\" alt=\"Opens in modal\" />\n      </button>\n      {open ? (\n        <PreviousMentoringSessionsModal\n          open={open}\n          student={student}\n          setStudent={setStudent}\n          onClose={() => setOpen(false)}\n        />\n      ) : null}\n    </React.Fragment>\n  )\n}\n", "import React from 'react'\nimport { fromNow } from '../../utils/time'\nimport {\n  Avatar,\n  GraphicalIcon,\n  Pagination,\n  TrackIcon,\n  ExerciseIcon,\n} from '../common'\nimport { Modal, ModalProps } from './Modal'\nimport pluralize from 'pluralize'\nimport {\n  FavoritableStudent,\n  FavoriteButton,\n} from '../mentoring/session/FavoriteButton'\nimport { useList } from '../../hooks/use-list'\nimport { PaginatedResult, MentorDiscussion, Student } from '../types'\nimport { usePaginatedRequestQuery } from '../../hooks/request-query'\nimport { FetchingBoundary } from '../FetchingBoundary'\nimport { ResultsZone } from '../ResultsZone'\n\nconst DEFAULT_ERROR = new Error('Unable to load discussions')\n\nexport const PreviousMentoringSessionsModal = ({\n  onClose,\n  student,\n  setStudent,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  student: Student\n  setStudent: (student: Student) => void\n}): JSX.Element => {\n  const { request, setPage } = useList({\n    endpoint: student.links.previousSessions,\n    options: {},\n  })\n  const {\n    status,\n    resolvedData,\n    latestData,\n    isFetching,\n    error,\n  } = usePaginatedRequestQuery<\n    PaginatedResult<readonly MentorDiscussion[]>,\n    Error | Response\n  >([request.endpoint, request.query], request)\n\n  const numPrevious = student.numDiscussionsWithMentor - 1\n\n  const DiscussionLink = ({ discussion }: { discussion: MentorDiscussion }) => {\n    return (\n      <a\n        href={discussion.links.self}\n        key={discussion.uuid}\n        className=\"discussion\"\n      >\n        <TrackIcon\n          iconUrl={discussion.track.iconUrl}\n          title={discussion.track.title}\n        />\n        <ExerciseIcon\n          iconUrl={discussion.exercise.iconUrl}\n          title={discussion.exercise.title}\n          className=\"exercise-icon\"\n        />\n        <div className=\"exercise-title\">{discussion.exercise.title}</div>\n        <div className=\"num-comments\">\n          <GraphicalIcon icon=\"comment\" />\n          {discussion.postsCount}\n        </div>\n        <div className=\"num-iterations\">\n          <GraphicalIcon icon=\"iteration\" />\n          {discussion.iterationsCount}\n        </div>\n        <time dateTime={discussion.createdAt}>\n          {fromNow(discussion.createdAt)}\n        </time>\n        <GraphicalIcon icon=\"chevron-right\" className=\"action-icon\" />\n      </a>\n    )\n  }\n\n  return (\n    <Modal\n      {...props}\n      closeButton\n      onClose={onClose}\n      className=\"m-mentoring-sessions\"\n    >\n      <header>\n        <strong>\n          You have {numPrevious} previous {pluralize('discussion', numPrevious)}\n        </strong>\n        with\n        <Avatar src={student.avatarUrl} handle={student.handle} />\n        <div className=\"student-name\">{student.handle}</div>\n        {student.links.favorite ? (\n          <FavoriteButton\n            student={student as FavoritableStudent}\n            onSuccess={(student) => setStudent(student)}\n          />\n        ) : null}\n      </header>\n      <div className=\"discussions\">\n        <ResultsZone isFetching={isFetching}>\n          <FetchingBoundary\n            status={status}\n            error={error}\n            defaultError={DEFAULT_ERROR}\n          >\n            {resolvedData ? (\n              <React.Fragment>\n                {resolvedData.results.map((discussion: MentorDiscussion) => (\n                  <DiscussionLink\n                    discussion={discussion}\n                    key={discussion.uuid}\n                  />\n                ))}\n                <Pagination\n                  disabled={latestData === undefined}\n                  current={request.query.page}\n                  total={resolvedData.meta.totalPages}\n                  setPage={setPage}\n                />\n              </React.Fragment>\n            ) : null}\n          </FetchingBoundary>\n        </ResultsZone>\n      </div>\n    </Modal>\n  )\n}\n", "import React from 'react'\nimport { Iteration, IterationStatus, MentorDiscussion } from '../../types'\nimport { IterationsList } from './IterationsList'\nimport { FilePanel } from './FilePanel'\nimport { IterationHeader } from './iteration-view/IterationHeader'\nimport { usePaginatedRequestQuery } from '../../../hooks/request-query'\nimport { FetchingBoundary } from '../../FetchingBoundary'\nimport { File, TestFile } from '../../types'\nimport { ResultsZone } from '../../ResultsZone'\nimport { LinkButton } from './LinkButton'\n\nconst DEFAULT_ERROR = new Error('Unable to load files')\n\nexport const IterationView = ({\n  iterations,\n  instructions,\n  testFiles,\n  currentIteration,\n  onClick,\n  language,\n  indentSize,\n  isOutOfDate,\n  isLinked,\n  setIsLinked,\n  discussion,\n  downloadCommand,\n}: {\n  iterations: readonly Iteration[]\n  instructions?: string\n  testFiles?: readonly TestFile[]\n  currentIteration: Iteration\n  onClick: (iteration: Iteration) => void\n  language: string\n  indentSize: number\n  isOutOfDate: boolean\n  isLinked: boolean\n  setIsLinked: (linked: boolean) => void\n  discussion?: MentorDiscussion\n  downloadCommand: string\n}): JSX.Element => {\n  /* TODO: (required) Don't do this if currentIteration.links.files is null */\n  const { resolvedData, error, status, isFetching } = usePaginatedRequestQuery<{\n    files: readonly File[]\n  }>(currentIteration.links.files, {\n    endpoint: currentIteration.links.files,\n    options: {},\n  })\n\n  return (\n    <React.Fragment>\n      <IterationHeader\n        iteration={currentIteration}\n        isOutOfDate={isOutOfDate}\n        downloadCommand={downloadCommand}\n        files={resolvedData?.files}\n      />\n      {currentIteration.status == IterationStatus.DELETED ? (\n        <div className=\"deleted\">This iteration has been deleted</div>\n      ) : (\n        <ResultsZone isFetching={isFetching}>\n          <FetchingBoundary\n            error={error}\n            status={status}\n            defaultError={DEFAULT_ERROR}\n          >\n            {resolvedData ? (\n              <FilePanel\n                files={resolvedData.files}\n                language={language}\n                indentSize={indentSize}\n                instructions={instructions}\n                testFiles={testFiles}\n              />\n            ) : null}\n          </FetchingBoundary>\n        </ResultsZone>\n      )}\n      {iterations.length > 1 ? (\n        <footer className=\"c-iterations-footer\">\n          <IterationsList\n            iterations={iterations}\n            onClick={onClick}\n            current={currentIteration}\n          />\n          {discussion ? (\n            <LinkButton value={isLinked} setValue={setIsLinked} />\n          ) : null}\n        </footer>\n      ) : null}\n    </React.Fragment>\n  )\n}\n", "import React from 'react'\nimport { Iteration, File } from '../../../types'\nimport { DownloadButton } from './iteration-header/DownloadButton'\nimport { CopyButton } from './iteration-header/CopyButton'\nimport {\n  IterationSummaryWithWebsockets,\n  IterationSummary,\n} from '../../../track/IterationSummary'\nimport { GenericTooltip } from '../../../misc/ExercismTippy'\n\nexport type Props = {\n  iteration: Iteration\n  isOutOfDate: boolean\n  downloadCommand: string\n  files: readonly File[] | undefined\n}\n\nexport const IterationHeader = ({\n  iteration,\n  isOutOfDate,\n  downloadCommand,\n  files,\n}: Props): JSX.Element => {\n  return (\n    <header className=\"iteration-header\">\n      <IterationSummaryWithWebsockets\n        iteration={iteration}\n        showSubmissionMethod={false}\n        OutOfDateNotice={isOutOfDate ? <OutOfDateNotice /> : null}\n        showTestsStatusAsButton={true}\n        showFeedbackIndicator={false}\n      />\n      <DownloadButton command={downloadCommand} />\n      {files ? <CopyButton files={files} /> : null}\n    </header>\n  )\n}\n\nconst OutOfDateNotice = () => {\n  return (\n    <GenericTooltip\n      content={`This exercise has been updated since the student submitted this\n        iteration. It might not pass the most recent set of tests. Exercises\n        can be updated by students by clicking on the yellow bar in the main\n        exercise page.`}\n    >\n      <div>\n        <IterationSummary.OutOfDateNotice />\n      </div>\n    </GenericTooltip>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { LazyTippy } from '../../../../misc/LazyTippy'\nimport { CopyToClipboardButton, Icon } from '../../../../common'\n\nexport const DownloadButton = ({\n  command,\n}: {\n  command: string\n}): JSX.Element => {\n  const [isPanelOpen, setIsPanelOpen] = useState(false)\n\n  const handlePanelToggle = useCallback(() => {\n    setIsPanelOpen(!isPanelOpen)\n  }, [isPanelOpen])\n\n  const handlePanelClose = useCallback(() => {\n    setIsPanelOpen(false)\n  }, [])\n\n  return (\n    <LazyTippy\n      content={<DownloadPanel command={command} />}\n      interactive={true}\n      visible={isPanelOpen}\n      maxWidth=\"none\"\n      onClickOutside={handlePanelClose}\n    >\n      <button\n        className=\"btn-s btn-default download-btn\"\n        type=\"button\"\n        onClick={handlePanelToggle}\n      >\n        <Icon icon=\"download\" alt=\"Download solution\" />\n      </button>\n    </LazyTippy>\n  )\n}\n\n{\n  /*TODO: Style dropdown */\n}\nconst DownloadPanel = ({ command }: { command: string }): JSX.Element => {\n  return (\n    <div className=\"z-tooltip bg-backgroundColorA shadow-lgZ1 py-24 px-24 rounded-8\">\n      <h3 className=\"text-h5 mb-8\">Download this solution via the CLI</h3>\n      <p className=\"text-p-base mb-8\">\n        This solution will be downloaded into a subdirectory specifically for\n        this student.\n      </p>\n      <CopyToClipboardButton textToCopy={command} />\n    </div>\n  )\n}\n", "import React, { useState, useCallback, useEffect } from 'react'\nimport { Icon } from '../../../../common'\nimport { File } from '../../../../types'\nimport { copyToClipboard } from '../../../../../utils/copyToClipboard'\n\nconst formatForClipboard = (\n  files: readonly File[],\n  separator = '\\n\\n\\n\\n\\n'\n): string => {\n  return files.map((f) => f.content).join(separator)\n}\n\nconst JUST_COPIED_TIMEOUT = 1000\n\nexport const CopyButton = ({\n  files,\n}: {\n  files: readonly File[]\n}): JSX.Element => {\n  const [justCopied, setJustCopied] = useState(false)\n  const textToCopy = formatForClipboard(files)\n  const classNames = [\n    'c-copy-text-to-clipboard',\n    justCopied ? '--copied' : '',\n  ].filter((c) => c.length > 0)\n\n  const handleCopy = useCallback(async () => {\n    await copyToClipboard(textToCopy)\n\n    setJustCopied(true)\n  }, [textToCopy])\n  useEffect(() => {\n    if (!justCopied) {\n      return\n    }\n\n    const timer = setTimeout(() => setJustCopied(false), JUST_COPIED_TIMEOUT)\n\n    return () => clearTimeout(timer)\n  }, [justCopied, setJustCopied])\n\n  return (\n    <button type=\"button\" className={classNames.join(' ')} onClick={handleCopy}>\n      <Icon icon=\"clipboard\" alt=\"Copy solution\" />\n      {justCopied ? <span className=\"message\">Copied</span> : null}\n      <span data-test-clipboard data-content={textToCopy} />\n    </button>\n  )\n}\n", "import React from 'react'\nimport { Icon } from '../../common/Icon'\nimport { GenericTooltip } from '../../misc/ExercismTippy'\n\nexport const LinkButton = ({\n  value,\n  setValue,\n}: {\n  value: boolean\n  setValue: (settings: boolean) => void\n}): JSX.Element => {\n  const classNames = ['link-button btn-enhanced', value ? 'linked' : 'unlinked']\n\n  const content = value ? (\n    <div className=\"c-mentoring-link-tooltip\">\n      <h3>Your code and mentoring conversation are currently linked.</h3>\n      <p>\n        This means as you navigate to another iteration, the mentoring\n        conversation will follow and vice versa.\n        <strong>Click or tap on the icon to unlink.</strong>\n      </p>\n    </div>\n  ) : (\n    <div className=\"c-mentoring-link-tooltip\">\n      <h3>Your code and mentoring conversation are currently unlinked.</h3>\n      <p>\n        This means the left and right panes operate independently.\n        <strong>Click or tap on the icon to link.</strong>\n      </p>\n    </div>\n  )\n\n  return (\n    <GenericTooltip content={content}>\n      <button className={classNames.join(' ')} onClick={() => setValue(!value)}>\n        <Icon\n          icon={value ? 'mentoring-linked' : 'mentoring-unlinked'}\n          alt=\"Link conversation\"\n        />\n      </button>\n    </GenericTooltip>\n  )\n}\n", "import React, { useState } from 'react'\nimport { Iteration, MentorDiscussion } from '../../types'\nimport { FinishedWizard, ModalStep } from './FinishedWizard'\nimport { DiscussionPostList } from './DiscussionPostList'\nimport { QueryStatus } from 'react-query'\nimport { FavoritableStudent } from '../session/FavoriteButton'\n\nexport const DiscussionDetails = ({\n  discussion,\n  iterations,\n  student,\n  setStudent,\n  userHandle,\n  onIterationScroll,\n  status,\n}: {\n  discussion: MentorDiscussion\n  iterations: readonly Iteration[]\n  student: FavoritableStudent\n  setStudent: (student: FavoritableStudent) => void\n  userHandle: string\n  onIterationScroll: (iteration: Iteration) => void\n  status: QueryStatus\n}): JSX.Element => {\n  const [defaultWizardStep, setDefaultWizardStep] = useState<ModalStep>(\n    discussion.isFinished ? 'finish' : 'mentorAgain'\n  )\n\n  return (\n    <div className=\"c-discussion-timeline\">\n      <DiscussionPostList\n        iterations={iterations}\n        userIsStudent={false}\n        discussionUuid={discussion.uuid}\n        userHandle={userHandle}\n        onIterationScroll={onIterationScroll}\n        status={status}\n      />\n      {discussion.isFinished ? (\n        <FinishedWizard\n          student={student}\n          defaultStep={defaultWizardStep}\n          setStudent={setStudent}\n        />\n      ) : null}\n    </div>\n  )\n}\n", "import React, { useReducer, useEffect, useRef } from 'react'\nimport { MentorAgainStep } from './finished-wizard/MentorAgainStep'\nimport { FavoriteStep } from './finished-wizard/FavoriteStep'\nimport { FinishStep } from './finished-wizard/FinishStep'\nimport { GraphicalIcon } from '../../common/GraphicalIcon'\nimport { FavoritableStudent } from '../session/FavoriteButton'\n\ntype State = {\n  student: FavoritableStudent\n  step: ModalStep\n}\n\nexport type ModalStep = 'mentorAgain' | 'favorite' | 'finish'\n\ntype Action =\n  | {\n      type: 'MENTOR_AGAIN'\n      payload: { student: FavoritableStudent }\n    }\n  | {\n      type: 'WONT_MENTOR_AGAIN'\n      payload: { student: FavoritableStudent }\n    }\n  | { type: 'FAVORITED'; payload: { student: FavoritableStudent } }\n  | { type: 'SKIP_FAVORITE' }\n  | { type: 'RESET' }\n\ntype Props = {\n  student: FavoritableStudent\n  setStudent: (student: FavoritableStudent) => void\n  defaultStep: ModalStep\n}\n\nfunction reducer(state: State, action: Action): State {\n  switch (action.type) {\n    case 'MENTOR_AGAIN':\n      return {\n        student: action.payload.student,\n        step: 'favorite',\n      }\n    case 'WONT_MENTOR_AGAIN':\n      return {\n        student: action.payload.student,\n        step: 'finish',\n      }\n    case 'FAVORITED':\n      return {\n        student: action.payload.student,\n        step: 'finish',\n      }\n    case 'SKIP_FAVORITE':\n      return { ...state, step: 'finish' }\n    case 'RESET':\n      return { ...state, step: 'mentorAgain' }\n  }\n}\n\nexport const FinishedWizard = ({ student, setStudent, defaultStep }: Props) => {\n  const finishedWizardRef = useRef<HTMLDivElement>(null)\n  const [state, dispatch] = useReducer(reducer, {\n    student: student,\n    step: defaultStep,\n  })\n\n  useEffect(() => {\n    if (!finishedWizardRef.current) {\n      return\n    }\n\n    finishedWizardRef.current.scrollIntoView()\n  }, [student])\n\n  return (\n    <div ref={finishedWizardRef} className=\"finished-wizard timeline-entry\">\n      <GraphicalIcon\n        icon=\"completed-check-circle\"\n        className=\"timeline-marker\"\n      />\n      <div className=\"--details timeline-content\">\n        <h3>You&apos;ve finished your discussion with {student.handle}.</h3>\n        <div className=\"--step\">\n          {state.step === 'mentorAgain' ? (\n            <MentorAgainStep\n              student={state.student}\n              onYes={(student) => {\n                dispatch({\n                  type: 'MENTOR_AGAIN',\n                  payload: { student: student },\n                })\n              }}\n              onNo={(student) => {\n                dispatch({\n                  type: 'WONT_MENTOR_AGAIN',\n                  payload: { student: student },\n                })\n              }}\n            />\n          ) : state.step === 'favorite' ? (\n            <FavoriteStep\n              student={state.student}\n              onFavorite={(student) => {\n                dispatch({\n                  type: 'FAVORITED',\n                  payload: { student: student },\n                })\n\n                setStudent(student)\n              }}\n              onSkip={() => {\n                dispatch({ type: 'SKIP_FAVORITE' })\n              }}\n            />\n          ) : state.step === 'finish' ? (\n            <FinishStep\n              student={state.student}\n              onReset={() => {\n                dispatch({ type: 'RESET' })\n              }}\n            />\n          ) : (\n            <>Incorrect state: {state.step} </>\n          )}\n        </div>\n      </div>\n    </div>\n  )\n}\n", "import React, { useState, useEffect } from 'react'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { typecheck } from '../../../../utils/typecheck'\nimport { Loading } from '../../../common'\nimport { GraphicalIcon } from '../../../common/GraphicalIcon'\nimport { ErrorBoundary, useErrorHandler } from '../../../ErrorBoundary'\nimport { FavoritableStudent } from '../../session/FavoriteButton'\n\ntype SuccessFn = (student: FavoritableStudent) => void\ntype Choice = 'yes' | 'no'\n\nconst DEFAULT_ERROR = new Error('Unable to update student')\n\nconst ErrorHandler = ({ error }: { error: unknown }) => {\n  useErrorHandler(error, { defaultError: DEFAULT_ERROR })\n\n  return null\n}\n\nexport const MentorAgainStep = ({\n  student,\n  onYes,\n  onNo,\n}: {\n  student: FavoritableStudent\n  onYes: SuccessFn\n  onNo: SuccessFn\n}): JSX.Element => {\n  const [choice, setChoice] = useState<Choice | null>(null)\n  const [mutate, { status, error }] = useMutation<FavoritableStudent>(\n    () => {\n      const method = choice === 'yes' ? 'DELETE' : 'POST'\n\n      const { fetch } = sendRequest({\n        endpoint: student.links.block,\n        method: method,\n        body: null,\n      })\n\n      return fetch.then((json) =>\n        typecheck<FavoritableStudent>(json, 'student')\n      )\n    },\n    {\n      onSuccess: (student) => {\n        choice === 'yes' ? onYes(student) : onNo(student)\n      },\n    }\n  )\n\n  useEffect(() => {\n    if (!choice) {\n      return\n    }\n\n    mutate()\n  }, [choice, mutate])\n\n  return (\n    <div>\n      <p>Do you want to mentor {student.handle} again?</p>\n      <div className=\"buttons\">\n        <button\n          className=\"btn-small\"\n          onClick={() => setChoice('yes')}\n          disabled={status === 'loading'}\n        >\n          <GraphicalIcon icon=\"checkmark\" />\n          <span>Yes</span>\n        </button>\n        <button\n          className=\"btn-small\"\n          onClick={() => setChoice('no')}\n          disabled={status === 'loading'}\n        >\n          <GraphicalIcon icon=\"cross\" />\n          <span>No</span>\n        </button>\n      </div>\n      {status === 'loading' ? <Loading /> : null}\n      {status === 'error' ? (\n        <ErrorBoundary>\n          <ErrorHandler error={error} />\n        </ErrorBoundary>\n      ) : null}\n    </div>\n  )\n}\n", "import React from 'react'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { typecheck } from '../../../../utils/typecheck'\nimport { Loading } from '../../../common'\nimport { GraphicalIcon } from '../../../common/GraphicalIcon'\nimport { ErrorBoundary, useErrorHandler } from '../../../ErrorBoundary'\nimport { Student } from '../../../types'\nimport { FavoritableStudent } from '../../session/FavoriteButton'\n\nconst DEFAULT_ERROR = new Error('Unable to mark student as a favorite')\n\nconst ErrorHandler = ({ error }: { error: unknown }) => {\n  useErrorHandler(error, { defaultError: DEFAULT_ERROR })\n\n  return null\n}\n\nexport const FavoriteStep = ({\n  student,\n  onFavorite,\n  onSkip,\n}: {\n  student: FavoritableStudent\n  onFavorite: (student: FavoritableStudent) => void\n  onSkip: () => void\n}): JSX.Element => {\n  const [handleFavorite, { status, error }] = useMutation<FavoritableStudent>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: student.links.favorite,\n        method: 'POST',\n        body: null,\n      })\n\n      return fetch.then((json) =>\n        typecheck<FavoritableStudent>(json, 'student')\n      )\n    },\n    {\n      onSuccess: (student) => {\n        if (!onFavorite) {\n          return\n        }\n\n        onFavorite(student)\n      },\n    }\n  )\n\n  return (\n    <div>\n      <p>Add {student.handle} to your favorites?</p>\n      <div className=\"buttons\">\n        <button\n          className=\"btn-small\"\n          type=\"button\"\n          onClick={() => handleFavorite()}\n          disabled={status === 'loading'}\n        >\n          <GraphicalIcon icon=\"plus\" />\n          Add to favorites\n        </button>\n        <button\n          className=\"btn-small\"\n          type=\"button\"\n          onClick={() => onSkip()}\n          disabled={status === 'loading'}\n        >\n          Skip\n        </button>\n      </div>\n      {status === 'loading' ? <Loading /> : null}\n      {status === 'error' ? (\n        <ErrorBoundary>\n          <ErrorHandler error={error} />\n        </ErrorBoundary>\n      ) : null}\n    </div>\n  )\n}\n", "import React from 'react'\nimport { GraphicalIcon } from '../../../common/GraphicalIcon'\nimport { Student } from '../../../types'\n\nexport const FinishStep = ({\n  student,\n  onReset,\n}: {\n  student: Student\n  onReset: () => void\n}): JSX.Element => {\n  return (\n    <div>\n      {student.isFavorited ? (\n        <p>{student.handle} is one of your favorites.</p>\n      ) : student.isBlocked ? (\n        <p>You will not see future mentor requests from {student.handle}.</p>\n      ) : (\n        <p>Thanks for mentoring {student.handle}.</p>\n      )}\n      <button\n        className=\"btn-link-legacy\"\n        type=\"button\"\n        onClick={() => onReset()}\n      >\n        <GraphicalIcon icon=\"reset\" />\n        <span>Change preferences</span>\n      </button>\n    </div>\n  )\n}\n", "import React, { useContext } from 'react'\nimport { usePostHighlighting } from './usePostHighlighting'\nimport { QueryStatus, useQueryCache } from 'react-query'\nimport { DiscussionPostProps } from './DiscussionPost'\nimport { Loading } from '../../common/Loading'\nimport { Iteration } from '../../types'\nimport { IterationMarker } from '../session/IterationMarker'\nimport { PostsContext } from './PostsContext'\nimport { usePosts } from './discussion-post-list/use-posts'\nimport { useItemList } from '../../common/use-item-list'\nimport {\n  usePostScrolling,\n  IterationWithRef,\n} from './discussion-post-list/use-post-scrolling'\nimport { useListTrimming } from './discussion-post-list/use-list-trimming'\nimport { useChannel } from './discussion-post-list/use-channel'\nimport { DiscussionPost } from './DiscussionPost'\n\nexport const DiscussionPostList = ({\n  discussionUuid,\n  iterations,\n  userHandle,\n  userIsStudent,\n  onIterationScroll,\n  status,\n}: {\n  discussionUuid: string\n  iterations: readonly Iteration[]\n  userHandle: string\n  userIsStudent: boolean\n  onIterationScroll: (iteration: Iteration) => void\n  status: QueryStatus\n}): JSX.Element | null => {\n  const queryCache = useQueryCache()\n  const { cacheKey } = useContext(PostsContext)\n  const posts = usePosts(iterations)\n  const { highlightedPost, highlightedPostRef } = usePostHighlighting(\n    posts,\n    userHandle\n  )\n  const {\n    getItemAction,\n    handleEdit,\n    handleEditCancel,\n    handleUpdate,\n    handleDelete,\n  } = useItemList<DiscussionPostProps>(cacheKey)\n  const { iterationsWithRef } = usePostScrolling({\n    iterations: iterations,\n    onScroll: onIterationScroll,\n  })\n  const iterationsToShow = useListTrimming<IterationWithRef>(iterationsWithRef)\n  useChannel(discussionUuid, () => queryCache.invalidateQueries(cacheKey))\n\n  if (status === 'loading') {\n    return (\n      <div role=\"status\" aria-label=\"Discussion post list loading indicator\">\n        <Loading />\n      </div>\n    )\n  }\n\n  return (\n    <>\n      {iterationsToShow.map((iteration) => {\n        return (\n          <React.Fragment key={iteration.idx}>\n            <IterationMarker\n              iteration={iteration}\n              userIsStudent={userIsStudent}\n              ref={iteration.ref}\n            />\n            {iteration.posts?.map((post) => {\n              return (\n                <DiscussionPost\n                  key={post.uuid}\n                  ref={highlightedPost === post ? highlightedPostRef : null}\n                  post={post}\n                  action={getItemAction(post)}\n                  onEdit={handleEdit(post)}\n                  onEditCancel={handleEditCancel}\n                  onUpdate={handleUpdate}\n                  onDelete={handleDelete}\n                />\n              )\n            })}\n          </React.Fragment>\n        )\n      })}\n    </>\n  )\n}\n", "import { useState, useRef, useEffect, useContext } from 'react'\nimport { PostsContext } from './PostsContext'\nimport { DiscussionPostProps } from './DiscussionPost'\n\nexport const usePostHighlighting = (\n  posts: DiscussionPostProps[],\n  userHandle: string\n) => {\n  const prevLastPost = useRef<DiscussionPostProps | null>(null)\n  const [\n    highlightedPost,\n    setHighlightedPost,\n  ] = useState<DiscussionPostProps | null>(null)\n  const { setHasNewMessages, highlightedPostRef } = useContext(PostsContext)\n  const observer = useRef<IntersectionObserver | null>()\n\n  useEffect(() => {\n    if (!highlightedPost || highlightedPost.authorHandle === userHandle) {\n      return\n    }\n\n    setHasNewMessages(true)\n  }, [highlightedPost, setHasNewMessages, userHandle])\n\n  useEffect(() => {\n    if (posts.length === 0) {\n      return\n    }\n\n    const lastPost = posts[posts.length - 1]\n\n    if (prevLastPost.current === lastPost) {\n      return\n    }\n\n    if (prevLastPost.current === null) {\n      prevLastPost.current = lastPost\n      return\n    }\n\n    setHighlightedPost(lastPost)\n  }, [JSON.stringify(posts)])\n\n  useEffect(() => {\n    if (!highlightedPostRef.current || !highlightedPost) {\n      return\n    }\n\n    if (highlightedPost.authorHandle === userHandle) {\n      highlightedPostRef.current.scrollIntoView()\n    }\n  }, [highlightedPost, highlightedPostRef, userHandle])\n\n  useEffect(() => {\n    if (!highlightedPostRef.current) {\n      return\n    }\n\n    observer.current = new IntersectionObserver((entries) => {\n      if (!entries[0].isIntersecting) {\n        return\n      }\n\n      setHasNewMessages(false)\n    })\n    observer.current.observe(highlightedPostRef.current)\n\n    return () => {\n      observer.current?.disconnect()\n    }\n  }, [highlightedPost, highlightedPostRef, setHasNewMessages])\n\n  return { highlightedPost, highlightedPostRef }\n}\n", "import React, { createContext, useRef, useState } from 'react'\nimport { MentorDiscussion } from '../../types'\n\ntype PostsContextType = {\n  cacheKey: string\n  hasNewMessages: boolean\n  setHasNewMessages: (value: boolean) => void\n  highlightedPostRef: React.MutableRefObject<HTMLDivElement | null>\n}\n\nexport const PostsContext = createContext<PostsContextType>({\n  cacheKey: '',\n  hasNewMessages: false,\n  setHasNewMessages: () => {},\n  highlightedPostRef: { current: null },\n})\n\nexport const PostsWrapper = ({\n  discussion,\n  children,\n}: React.PropsWithChildren<{ discussion?: MentorDiscussion }>): JSX.Element => {\n  const cacheKey = `posts-discussion-${discussion?.uuid}`\n  const [hasNewMessages, setHasNewMessages] = useState(false)\n  const highlightedPostRef = useRef<HTMLDivElement | null>(null)\n\n  if (!discussion) {\n    return <React.Fragment>{children}</React.Fragment>\n  }\n\n  return (\n    <PostsContext.Provider\n      value={{\n        cacheKey,\n        hasNewMessages,\n        setHasNewMessages,\n        highlightedPostRef,\n      }}\n    >\n      {children}\n    </PostsContext.Provider>\n  )\n}\n", "import React, { forwardRef } from 'react'\nimport { GraphicalIcon } from '../../common/GraphicalIcon'\nimport { shortFromNow } from '../../../utils/time'\nimport { Iteration } from '../../types'\nimport { AutomatedFeedbackSummary } from './AutomatedFeedbackSummary'\nimport { iterationId } from '../session/useIterationScrolling'\n\ntype Props = {\n  iteration: Iteration\n  userIsStudent: boolean\n}\n\nexport const IterationMarker = forwardRef<HTMLDivElement, Props>(\n  ({ iteration, userIsStudent }, ref) => {\n    return (\n      <a id={iterationId(iteration)} className=\"timeline-entry iteration-entry\">\n        <div className=\"timeline-marker\">\n          <GraphicalIcon icon=\"iteration\" />\n        </div>\n        <div className=\"timeline-content\">\n          <div className=\"timeline-entry-header\" ref={ref}>\n            <div className=\"info\">\n              <strong>Iteration {iteration.idx}</strong>\n              was submitted\n            </div>\n            <time>{shortFromNow(iteration.createdAt)}</time>\n          </div>\n          {iteration.numActionableAutomatedComments !== 0 ||\n          iteration.numEssentialAutomatedComments !== 0 ||\n          iteration.numNonActionableAutomatedComments !== 0 ? (\n            <AutomatedFeedbackSummary\n              userIsStudent={userIsStudent}\n              iteration={iteration}\n            />\n          ) : null}\n        </div>\n      </a>\n    )\n  }\n)\nIterationMarker.displayName = 'IterationMarker'\n", "import React, { useState, useCallback } from 'react'\nimport { Icon } from '../../common'\nimport { GraphicalIcon } from '../../common/GraphicalIcon'\nimport { Iteration } from '../../types'\nimport { AutomatedFeedbackModal } from './AutomatedFeedbackModal'\n\nexport const AutomatedFeedbackSummary = ({\n  userIsStudent,\n  iteration,\n}: {\n  userIsStudent: boolean\n  iteration: Iteration\n}): JSX.Element => {\n  const addressedTo = userIsStudent ? 'You' : 'Student'\n\n  const [modalOpen, setModalOpen] = useState(false)\n\n  const handleModalOpen = useCallback(() => {\n    setModalOpen(true)\n  }, [])\n\n  const handleModalClose = useCallback(() => {\n    setModalOpen(false)\n  }, [])\n\n  return (\n    <React.Fragment>\n      <button className=\"auto-feedback\" onClick={handleModalOpen} type=\"button\">\n        <GraphicalIcon icon=\"automation\" className=\"info-icon\" />\n        <div className=\"info\">{addressedTo} received automated feedback</div>\n        <Icon icon=\"modal\" alt=\"Opens in a modal\" className=\"modal-icon\" />\n      </button>\n      <AutomatedFeedbackModal\n        iteration={iteration}\n        open={modalOpen}\n        onClose={handleModalClose}\n      />\n    </React.Fragment>\n  )\n}\n", "import React from 'react'\nimport { FetchingBoundary } from '../../FetchingBoundary'\nimport { Modal, ModalProps } from '../../modals/Modal'\nimport { Icon, GraphicalIcon } from '../../common'\nimport { useRequestQuery } from '../../../hooks/request-query'\nimport {\n  AnalyzerFeedback as AnalyzerFeedbackProps,\n  Iteration,\n  MentorSessionTrack,\n  RepresenterFeedback as RepresenterFeedbackProps,\n} from '../../types'\nimport { AnalyzerFeedback } from '../../student/iterations-list/AnalyzerFeedback'\nimport { RepresenterFeedback } from '../../student/iterations-list/RepresenterFeedback'\n\nconst DEFAULT_ERROR = new Error('Unable to load automated feedback')\n\ntype APIResponse = {\n  automatedFeedback: {\n    representerFeedback?: RepresenterFeedbackProps\n    analyzerFeedback?: AnalyzerFeedbackProps\n    links: {\n      info: string\n    }\n    track: MentorSessionTrack\n  }\n}\n\nexport const AutomatedFeedbackModal = ({\n  iteration,\n  ...props\n}: Omit<ModalProps, 'className'> & { iteration: Iteration }): JSX.Element => {\n  const { data, status, error } = useRequestQuery<APIResponse>(\n    ['automated-feedback', iteration.links.automatedFeedback],\n    { endpoint: iteration.links.automatedFeedback, options: {} }\n  )\n  return (\n    <Modal {...props} className=\"m-automated-feedback\">\n      <FetchingBoundary\n        LoadingComponent={LoadingComponent}\n        status={status}\n        error={error}\n        defaultError={DEFAULT_ERROR}\n      >\n        <header>\n          <GraphicalIcon icon=\"automation\" />\n          <div className=\"info\">\n            <h2 className=\"text-h5\">Automated Analysis</h2>\n            <div className=\"text-textColor6 text-15 leading-150\">\n              for Iteration {iteration.idx}\n            </div>\n          </div>\n        </header>\n        {data ? (\n          <div className=\"feedback\">\n            {data.automatedFeedback.analyzerFeedback ? (\n              <AnalyzerFeedback\n                track={data.automatedFeedback.track}\n                {...data.automatedFeedback.analyzerFeedback}\n                automatedFeedbackInfoLink={data.automatedFeedback.links.info}\n              />\n            ) : null}\n            {data.automatedFeedback.representerFeedback ? (\n              <RepresenterFeedback\n                {...data.automatedFeedback.representerFeedback}\n              />\n            ) : null}\n          </div>\n        ) : null}\n      </FetchingBoundary>\n    </Modal>\n  )\n}\n\nconst LoadingComponent = () => (\n  <Icon icon=\"spinner\" alt=\"Loading automated feedback\" />\n)\n", "import { useCallback, useState } from 'react'\nimport { Iteration } from '../../types'\n\nexport const iterationId = (iteration: Iteration): string => {\n  return `iteration-${iteration.idx}`\n}\n\nexport const useIterationScrolling = ({\n  iterations,\n  on,\n}: {\n  iterations: readonly Iteration[]\n  on: boolean\n}) => {\n  const [currentIteration, setCurrentIteration] = useState(\n    iterations[iterations.length - 1]\n  )\n\n  const handleIterationScroll = useCallback(\n    (iteration) => {\n      if (!on) {\n        return\n      }\n\n      setCurrentIteration(iteration)\n    },\n    [on]\n  )\n\n  const handleIterationClick = useCallback(\n    (iteration) => {\n      setCurrentIteration(iteration)\n\n      if (!on) {\n        return\n      }\n\n      window.location.href = `#${iterationId(iteration)}`\n    },\n    [on]\n  )\n\n  return { currentIteration, handleIterationScroll, handleIterationClick }\n}\n", "import { useMemo } from 'react'\nimport { DiscussionPostProps } from '../DiscussionPost'\nimport { Iteration } from '../../../types'\n\nexport const usePosts = (\n  iterations: readonly Iteration[]\n): DiscussionPostProps[] => {\n  return useMemo(() => {\n    return iterations.reduce<DiscussionPostProps[]>((posts, iteration) => {\n      return posts.concat(iteration.posts || [])\n    }, [])\n  }, [JSON.stringify(iterations)])\n}\n", "import { useState, useEffect, useCallback, createRef } from 'react'\nimport { Iteration } from '../../../types'\n\ntype IntersectionStatus = {\n  iteration: Iteration\n  isIntersecting: boolean\n}\n\nexport type IterationWithRef = Iteration & {\n  ref: React.RefObject<HTMLDivElement>\n}\n\nexport const usePostScrolling = ({\n  iterations,\n  onScroll,\n}: {\n  iterations: readonly Iteration[]\n  onScroll: (iteration: Iteration) => void\n}): { iterationsWithRef: IterationWithRef[] } => {\n  const [iterationsWithRef, setIterationsWithRef] = useState<\n    IterationWithRef[]\n  >([])\n  const [intersectionStatus, setIntersectionStatus] = useState<\n    IntersectionStatus[]\n  >([])\n\n  const registerEntry = useCallback(\n    (entries: IntersectionObserverEntry[]) => {\n      setIntersectionStatus(\n        iterationsWithRef.map((i) => {\n          const matchingEntry = entries.find((e) => e.target === i.ref.current)\n\n          return {\n            iteration: i,\n            isIntersecting: matchingEntry\n              ? matchingEntry.isIntersecting\n              : false,\n          }\n        })\n      )\n    },\n    [iterationsWithRef]\n  )\n\n  useEffect(() => {\n    setIterationsWithRef(\n      iterations.map((iteration) => {\n        return { ...iteration, ref: createRef<HTMLDivElement>() }\n      })\n    )\n  }, [JSON.stringify(iterations)])\n\n  useEffect(() => {\n    const observer = new IntersectionObserver(registerEntry, {\n      threshold: 1,\n      root: null,\n      rootMargin: '0px',\n    })\n\n    iterationsWithRef.forEach((i) => {\n      if (!i.ref.current) {\n        return\n      }\n\n      observer.observe(i.ref.current)\n    })\n\n    return () => {\n      observer.disconnect()\n    }\n  }, [iterationsWithRef, registerEntry])\n\n  useEffect(() => {\n    const intersectingIteration = intersectionStatus.filter(\n      (s) => s.isIntersecting\n    )[0]\n\n    if (!intersectingIteration) {\n      return\n    }\n\n    onScroll(intersectingIteration.iteration)\n  }, [intersectionStatus, onScroll])\n\n  return { iterationsWithRef }\n}\n", "import { Iteration } from '../../../types'\n\nexport const useListTrimming = <T extends Iteration>(iterations: T[]): T[] => {\n  const startIteration = iterations.findIndex(\n    (iteration) => iteration.posts && iteration.posts.length !== 0\n  )\n\n  return iterations.slice(startIteration)\n}\n", "import { useEffect } from 'react'\nimport { DiscussionPostChannel } from '../../../../channels/discussionPostChannel'\n\nexport const useChannel = (\n  discussionUuid: string,\n  onReceive: () => void\n): void => {\n  useEffect(() => {\n    const channel = new DiscussionPostChannel(\n      { discussionUuid: discussionUuid },\n      onReceive\n    )\n\n    return () => {\n      channel.disconnect()\n    }\n  }, [discussionUuid, onReceive])\n}\n", "import consumer from '../utils/action-cable-consumer'\n\nexport class DiscussionPostChannel {\n  subscription: ActionCable.Channel\n\n  constructor(\n    { discussionUuid }: { discussionUuid: string },\n    onReceive: () => void\n  ) {\n    this.subscription = consumer.subscriptions.create(\n      {\n        channel: 'DiscussionPostListChannel',\n        discussion_uuid: discussionUuid,\n      },\n      {\n        received: onReceive,\n      }\n    )\n  }\n\n  disconnect(): void {\n    this.subscription.unsubscribe()\n  }\n}\n", "import React, { forwardRef } from 'react'\nimport { DiscussionPostView } from './discussion-post/DiscussionPostView'\nimport { DiscussionPostEdit } from './discussion-post/DiscussionPostEdit'\nimport { ListItem, ListItemAction, ListItemProps } from '../../common/ListItem'\n\ntype DiscussionPostLinks = {\n  edit?: string\n  delete?: string\n}\n\nexport type DiscussionPostProps = {\n  uuid: string\n  iterationIdx: number\n  links: DiscussionPostLinks\n  authorHandle: string\n  authorFlair: string\n  authorAvatarUrl: string\n  byStudent: boolean\n  contentMarkdown: string\n  contentHtml: string\n  updatedAt: string\n}\n\nexport type DiscussionPostAction = ListItemAction\n\ntype Props = { post: DiscussionPostProps } & Omit<\n  ListItemProps<DiscussionPostProps>,\n  'item' | 'ViewingComponent' | 'EditingComponent'\n>\n\nexport const DiscussionPost = forwardRef<HTMLDivElement, Props>(\n  ({ post, ...props }, ref) => {\n    return (\n      <ListItem<DiscussionPostProps>\n        itemRef={ref}\n        item={post}\n        ViewingComponent={DiscussionPostView}\n        EditingComponent={DiscussionPostEdit}\n        {...props}\n      />\n    )\n  }\n)\n", "import React from 'react'\nimport { DiscussionPostProps } from '../DiscussionPost'\nimport { shortFromNow } from '../../../../utils/time'\nimport { Avatar } from '../../../common/Avatar'\nimport { Icon } from '../../../common/Icon'\nimport { ViewingComponentType } from '../../../common/ListItem'\nimport { DiscussionPostContent } from './DiscussionPostContent'\nimport { HandleWithFlair } from '@/components/common/HandleWithFlair'\n\nexport const DiscussionPostView = ({\n  onEdit,\n  item: post,\n  className = '',\n  itemRef,\n}: ViewingComponentType<DiscussionPostProps>): JSX.Element => {\n  const isEditable = post.links.edit\n\n  const classNames = [\n    'post',\n    'timeline-entry',\n    isEditable ? '--editable' : '',\n    className,\n  ].filter((c) => c.length > 0)\n\n  return (\n    <div ref={itemRef} className={classNames.join(' ')}>\n      <Avatar\n        handle={post.authorHandle}\n        src={post.authorAvatarUrl}\n        className=\"timeline-marker\"\n      />\n      <div className=\"timeline-content\">\n        <header className=\"timeline-entry-header\">\n          <div className=\"author\">\n            <HandleWithFlair\n              handle={post.authorHandle}\n              flair={post.authorFlair}\n            />\n          </div>\n          <time>{shortFromNow(post.updatedAt)}</time>\n\n          {isEditable ? (\n            <button type=\"button\" className=\"edit-button\" onClick={onEdit}>\n              <Icon icon=\"edit\" alt=\"Edit\" />\n            </button>\n          ) : null}\n        </header>\n        <DiscussionPostContent contentHtml={post.contentHtml} />\n      </div>\n    </div>\n  )\n}\n", "import React from 'react'\nimport { DiscussionPostProps } from '../DiscussionPost'\nimport { Avatar } from '../../../common/Avatar'\nimport { EditingComponentType } from '../../../common/ListItem'\nimport { EditListItemForm } from '../../../common/EditListItemForm'\nimport { HandleWithFlair } from '@/components/common/HandleWithFlair'\n\nconst DEFAULT_ERROR = new Error('Unable to edit post')\n\nexport const DiscussionPostEdit = ({\n  item: post,\n  onUpdate,\n  onDelete,\n  onCancel,\n}: EditingComponentType<DiscussionPostProps>): JSX.Element => {\n  return (\n    <div className={`post timeline-entry`}>\n      <Avatar\n        handle={post.authorHandle}\n        src={post.authorAvatarUrl}\n        className=\"timeline-marker\"\n      />\n      <div className=\"timeline-content\">\n        <header className=\"timeline-entry-header\">\n          <div className=\"author\">\n            <HandleWithFlair\n              handle={post.authorHandle}\n              flair={post.authorFlair}\n            />\n          </div>\n        </header>\n        <EditListItemForm<DiscussionPostProps>\n          item={post}\n          onUpdate={onUpdate}\n          onDelete={onDelete}\n          onCancel={onCancel}\n          defaultError={DEFAULT_ERROR}\n        />\n      </div>\n    </div>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { MarkAsNothingToDoButton } from './MarkAsNothingToDoButton'\nimport { FinishButton } from './FinishButton'\nimport { GraphicalIcon } from '../../common'\nimport { SessionProps } from '../Session'\nimport { MentorDiscussion as Discussion } from '../../types'\n\nexport const DiscussionActions = ({\n  status,\n  links,\n  session,\n  setSession,\n  isFinished,\n}: Discussion & {\n  session: SessionProps\n  setSession: (session: SessionProps) => void\n}): JSX.Element => {\n  const handleSuccess = useCallback(\n    (discussion) => {\n      const { student, ...discussionProps } = discussion\n\n      setSession({\n        ...session,\n        discussion: discussionProps,\n        student: student,\n      })\n    },\n    [setSession, session]\n  )\n\n  return (\n    <>\n      {status === 'awaiting_mentor' ? (\n        <MarkAsNothingToDoButton endpoint={links.markAsNothingToDo} />\n      ) : null}\n\n      {isFinished ? (\n        <div className=\"finished\">\n          <GraphicalIcon icon=\"completed-check-circle\" />\n          Ended\n        </div>\n      ) : links.finish ? (\n        <FinishButton endpoint={links.finish} onSuccess={handleSuccess} />\n      ) : null}\n    </>\n  )\n}\n", "import React from 'react'\nimport { useMutation } from 'react-query'\nimport { Loading } from '../../common'\nimport { ErrorBoundary, useErrorHandler } from '../../ErrorBoundary'\nimport { sendRequest } from '../../../utils/send-request'\n\ntype ComponentProps = {\n  endpoint: string\n}\n\nexport const MarkAsNothingToDoButton = (props: ComponentProps): JSX.Element => {\n  return (\n    <ErrorBoundary>\n      <Component {...props} />\n    </ErrorBoundary>\n  )\n}\n\nconst DEFAULT_ERROR = new Error('Unable to mark discussion as nothing to do')\n\nconst Component = ({ endpoint }: ComponentProps): JSX.Element | null => {\n  const [mutation, { status, error }] = useMutation(() => {\n    const { fetch } = sendRequest({\n      endpoint: endpoint,\n      method: 'PATCH',\n      body: null,\n    })\n\n    return fetch\n  })\n\n  useErrorHandler(error, { defaultError: DEFAULT_ERROR })\n\n  switch (status) {\n    case 'idle':\n      return (\n        <button\n          onClick={() => {\n            mutation()\n          }}\n          type=\"button\"\n          className=\"btn-xs btn-enhanced\"\n        >\n          <div className=\"--hint\">Remove from Inbox</div>\n        </button>\n      )\n    case 'loading':\n      return <Loading />\n    default:\n      return null\n  }\n}\n", "import React, { useState, useCallback, useEffect } from 'react'\nimport { FinishMentorDiscussionModal } from '../../modals/mentor/FinishMentorDiscussionModal'\nimport { ModalProps } from '../../modals/Modal'\nimport { MentorDiscussion as Discussion } from '../../types'\nimport Mousetrap from 'mousetrap'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../utils/send-request'\nimport { typecheck } from '../../../utils/typecheck'\n\nexport const FinishButton = ({\n  endpoint,\n  modalProps,\n  onSuccess,\n}: {\n  endpoint: string\n  modalProps?: ModalProps\n  onSuccess: (discussion: Discussion) => void\n}): JSX.Element => {\n  const [open, setOpen] = useState(false)\n  const [mutation, { status, error }] = useMutation<Discussion>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'PATCH',\n        body: null,\n      })\n\n      return fetch.then((json) => typecheck<Discussion>(json, 'discussion'))\n    },\n    {\n      onSuccess: (discussion) => onSuccess(discussion),\n    }\n  )\n\n  const handleClose = useCallback(() => {\n    if (status === 'loading') {\n      return\n    }\n\n    setOpen(false)\n  }, [status])\n\n  return (\n    <React.Fragment>\n      <button\n        type=\"button\"\n        className=\"btn-xs btn-enhanced finish-button ml-20\"\n        onClick={() => {\n          setOpen(true)\n        }}\n      >\n        <div className=\"--hint\">End discussion</div>\n      </button>\n      <FinishMentorDiscussionModal\n        endpoint={endpoint}\n        open={open}\n        onFinish={() => mutation()}\n        onCancel={handleClose}\n        status={status}\n        error={error}\n        {...modalProps}\n      />\n    </React.Fragment>\n  )\n}\n", "import React from 'react'\nimport { Modal } from '../Modal'\nimport { Loading, FormButton } from '../../common'\nimport { ErrorBoundary, useErrorHandler } from '../../ErrorBoundary'\nimport { QueryStatus } from 'react-query'\n\nconst DEFAULT_ERROR = new Error('Unable to end discussion')\n\nconst ErrorHandler = ({ error }: { error: unknown }) => {\n  useErrorHandler(error, { defaultError: DEFAULT_ERROR })\n\n  return null\n}\n\nexport const FinishMentorDiscussionModal = ({\n  open,\n  onFinish,\n  onCancel,\n  status,\n  error,\n  ...props\n}: {\n  endpoint: string\n  open: boolean\n  status: QueryStatus\n  error: unknown\n  onFinish: () => void\n  onCancel: () => void\n}): JSX.Element => {\n  return (\n    <Modal\n      open={open}\n      onClose={onCancel}\n      className=\"m-generic-confirmation\"\n      {...props}\n    >\n      <h3>Are you sure you want to end this discussion?</h3>\n      <p>\n        It&apos;s normally time to end a discussion when the student has got\n        what they wanted from the conversation, or you have taken the\n        conversation as far as you like. It&apos;s generally polite to leave the\n        student a final goodbye.\n      </p>\n      <div className=\"buttons\">\n        <FormButton\n          type=\"button\"\n          className=\"btn-small-discourage\"\n          onClick={onCancel}\n          status={status}\n        >\n          Cancel\n        </FormButton>\n        <FormButton\n          type=\"button\"\n          className=\"btn-primary btn-s\"\n          onClick={onFinish}\n          status={status}\n        >\n          End discussion\n        </FormButton>\n      </div>\n\n      {status === 'loading' ? <Loading /> : null}\n      {status === 'error' ? (\n        <ErrorBoundary>\n          <ErrorHandler error={error} />\n        </ErrorBoundary>\n      ) : null}\n    </Modal>\n  )\n}\n", "import React, { useContext } from 'react'\nimport { TabsContext } from '../Session'\nimport { AddDiscussionPost } from './AddDiscussionPost'\nimport { NewMessageAlert } from './NewMessageAlert'\nimport { MentorDiscussion as Discussion } from '../../types'\nimport { MentoringNote } from '../session/MentoringNote'\n\ntype Links = {\n  mentoringDocs: string\n}\n\nexport const AddDiscussionPostPanel = ({\n  discussion,\n  links,\n}: {\n  discussion: Discussion\n  links: Links\n}): JSX.Element => {\n  const { switchToTab } = useContext(TabsContext)\n\n  return (\n    <section className=\"comment-section --comment\">\n      <NewMessageAlert\n        onClick={() => {\n          switchToTab('discussion')\n        }}\n      />\n      <AddDiscussionPost\n        discussion={discussion}\n        onSuccess={() => {\n          switchToTab('discussion')\n        }}\n      >\n        <MentoringNote links={links} />\n      </AddDiscussionPost>\n    </section>\n  )\n}\n", "import React, { useCallback, useState } from 'react'\nimport { MentorDiscussion } from '../../types'\nimport { AddDiscussionPostForm } from './AddDiscussionPostForm'\n\nexport const AddDiscussionPost = ({\n  discussion,\n  children,\n  onSuccess = () => null,\n}: React.PropsWithChildren<{\n  discussion: MentorDiscussion\n  onSuccess?: () => void\n}>): JSX.Element => {\n  const [stillPosting, setStillPosting] = useState(!discussion.isFinished)\n\n  const handleSuccess = useCallback(() => {\n    onSuccess()\n  }, [onSuccess])\n\n  const handleContinue = useCallback(() => {\n    setStillPosting(true)\n  }, [])\n\n  if (stillPosting) {\n    return (\n      <React.Fragment>\n        <AddDiscussionPostForm\n          discussion={discussion}\n          onSuccess={handleSuccess}\n        />\n        {children}\n      </React.Fragment>\n    )\n  } else {\n    return (\n      <button\n        onClick={handleContinue}\n        className=\"continuation-btn\"\n        type=\"button\"\n      >\n        <strong>This discussion has ended.</strong> Have more to say? You can{' '}\n        <em>still post</em>.\n      </button>\n    )\n  }\n}\n", "import React, { useCallback, useContext, useMemo, useState } from 'react'\nimport { PostsContext } from './PostsContext'\nimport { DiscussionPostProps } from './DiscussionPost'\nimport { MentorDiscussion } from '../../types'\nimport { NewListItemForm } from '../../common/NewListItemForm'\nimport { useQueryCache } from 'react-query'\n\nconst DEFAULT_ERROR = new Error('Unable to save post')\n\nexport const AddDiscussionPostForm = ({\n  discussion,\n  onSuccess,\n}: {\n  discussion: MentorDiscussion\n  onSuccess: () => void\n}): JSX.Element => {\n  const queryCache = useQueryCache()\n  const contextId = useMemo(() => `${discussion.uuid}_new_post`, [discussion])\n  const [expanded, setExpanded] = useState(false)\n  const { cacheKey } = useContext(PostsContext)\n\n  const handleSuccess = useCallback(\n    (post: DiscussionPostProps) => {\n      queryCache.setQueryData<{ items: DiscussionPostProps[] }>(\n        [cacheKey],\n        (oldData) => {\n          if (!oldData) {\n            return { items: [post] }\n          }\n\n          return { items: [...oldData.items, post] }\n        }\n      )\n\n      setExpanded(false)\n      onSuccess()\n    },\n    [cacheKey, onSuccess, queryCache]\n  )\n\n  const handleExpanded = useCallback(() => {\n    setExpanded(true)\n  }, [])\n\n  const handleCompressed = useCallback(() => {\n    setExpanded(false)\n  }, [])\n\n  return (\n    <NewListItemForm<DiscussionPostProps>\n      endpoint={discussion.links.posts}\n      expanded={expanded}\n      contextId={contextId}\n      onSuccess={handleSuccess}\n      onExpanded={handleExpanded}\n      onCompressed={handleCompressed}\n      defaultError={DEFAULT_ERROR}\n    />\n  )\n}\n", "import React, { useContext } from 'react'\nimport { PostsContext } from './PostsContext'\nimport { GraphicalIcon } from '../../common'\n\nexport const NewMessageAlert = ({\n  onClick = () => {},\n}: {\n  onClick?: () => void\n}): JSX.Element | null => {\n  const { hasNewMessages, highlightedPostRef } = useContext(PostsContext)\n\n  if (!hasNewMessages) {\n    return null\n  }\n\n  return (\n    <button\n      className=\"new-messages-button\"\n      type=\"button\"\n      onClick={() => {\n        onClick()\n        highlightedPostRef.current?.scrollIntoView()\n      }}\n    >\n      <GraphicalIcon icon=\"comment\" />\n      <span>New Message</span>\n    </button>\n  )\n}\n", "import React from 'react'\n\ntype Links = {\n  mentoringDocs: string\n}\n\nexport const MentoringNote = ({ links }: { links: Links }): JSX.Element => {\n  return (\n    <div className=\"note\">\n      Check out our{' '}\n      <a href={links.mentoringDocs} target=\"_blank\" rel=\"noreferrer\">\n        mentoring docs\n      </a>{' '}\n      and be the best mentor you can be.\n    </div>\n  )\n}\n", "import { useRequestQuery } from '../../../hooks/request-query'\nimport { DiscussionPostProps } from './DiscussionPost'\nimport { MentorDiscussion, Iteration } from '../../types'\nimport { QueryStatus } from 'react-query'\n\nconst matchIterationsToPosts = ({\n  iterations,\n  posts,\n}: {\n  iterations: readonly Iteration[]\n  posts: DiscussionPostProps[]\n}): Iteration[] => {\n  return iterations.reduce<Iteration[]>((iterationsWithPosts, iteration) => {\n    const iterationPosts = posts\n      ? posts.filter((post) => post.iterationIdx === iteration.idx)\n      : []\n\n    iterationsWithPosts.push({ ...iteration, posts: iterationPosts })\n\n    return iterationsWithPosts\n  }, [])\n}\n\nexport const useDiscussionIterations = ({\n  discussion,\n  iterations,\n}: {\n  discussion?: MentorDiscussion\n  iterations: readonly Iteration[]\n}): { iterations: readonly Iteration[]; status: QueryStatus } => {\n  const { data, status } = useRequestQuery<{ items: DiscussionPostProps[] }>(\n    `posts-discussion-${discussion?.uuid}`,\n    { endpoint: discussion?.links.posts, options: { enabled: !!discussion } }\n  )\n\n  return {\n    iterations: data\n      ? matchIterationsToPosts({ iterations: iterations, posts: data.items })\n      : iterations,\n    status: status,\n  }\n}\n", "import React from 'react'\nimport { DiscussionPost } from '../discussion/DiscussionPost'\nimport { MentorSessionRequest as Request, Iteration } from '../../types'\nimport { IterationMarker } from '../session/IterationMarker'\n\nexport const RequestDetails = ({\n  iteration,\n  request,\n}: {\n  iteration: Iteration\n  request: Request\n}): JSX.Element => {\n  if (!request.comment) {\n    throw 'request comment expected'\n  }\n  return (\n    <div className=\"c-discussion-timeline\">\n      <IterationMarker iteration={iteration} userIsStudent={false} />\n      {request.comment.contentHtml.length > 0 ? (\n        <DiscussionPost action=\"viewing\" post={request.comment} />\n      ) : null}\n    </div>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { SessionProps } from '../Session'\nimport { MentorSessionRequest as Request, Iteration } from '../../types'\nimport { StartMentoringPanel } from './StartMentoringPanel'\nimport { StartDiscussionPanel } from './StartDiscussionPanel'\n\ntype Links = {\n  mentoringDocs: string\n}\n\nexport const MentoringRequestPanel = ({\n  iterations,\n  request,\n  session,\n  setSession,\n  links,\n}: {\n  iterations: readonly Iteration[]\n  request: Request\n  session: SessionProps\n  setSession: (session: SessionProps) => void\n  links: Links\n}): JSX.Element => {\n  const [justLocked, setJustLocked] = useState(false)\n\n  const handleRequestLock = useCallback(\n    (request: Request) => {\n      setJustLocked(true)\n      setSession({ ...session, request: request })\n    },\n    [session, setSession]\n  )\n\n  if (request.isLocked) {\n    return (\n      <StartDiscussionPanel\n        iterations={iterations}\n        request={request}\n        links={links}\n        defaultExpanded={justLocked}\n      />\n    )\n  } else {\n    return <StartMentoringPanel request={request} onLock={handleRequestLock} />\n  }\n}\n", "import React from 'react'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../utils/send-request'\nimport { typecheck } from '../../../utils/typecheck'\nimport { MentorSessionRequest as Request } from '../../types'\nimport { Loading } from '../../common'\nimport { ErrorBoundary, useErrorHandler } from '../../ErrorBoundary'\n\nconst DEFAULT_ERROR = new Error('Unable to lock solution')\n\nconst ErrorMessage = ({ error }: { error: unknown }) => {\n  useErrorHandler(error, { defaultError: DEFAULT_ERROR })\n\n  return null\n}\n\nconst ErrorFallback = ({ error }: { error: Error }) => {\n  return <p>{error.message}</p>\n}\n\nexport const StartMentoringPanel = ({\n  request,\n  onLock,\n}: {\n  request: Request\n  onLock: (request: Request) => void\n}): JSX.Element => {\n  const [lock, { status, error }] = useMutation<Request>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: request.links.lock,\n        body: null,\n        method: 'PATCH',\n      })\n\n      return fetch.then((json) => typecheck<Request>(json, 'request'))\n    },\n    {\n      onSuccess: (request) => onLock(request),\n    }\n  )\n\n  return (\n    <section className=\"comment-section --lock\">\n      <h2>\n        Help {request.student.handle} write better {request.track.title}?\n      </h2>\n      <p>\n        Feel you can help {request.student.handle} approach this in a better\n        way? Start mentoring and show them the way to code bliss.\n      </p>\n      <button\n        type=\"button\"\n        onClick={() => lock()}\n        disabled={status === 'loading'}\n        className=\"btn-primary btn-m\"\n      >\n        Start mentoring\n      </button>\n      <div className=\"note\">\n        You have 30 minutes until the session returns to the queue for others to\n        mentor.\n      </div>\n      {status === 'loading' ? <Loading /> : null}\n      <ErrorBoundary FallbackComponent={ErrorFallback} resetKeys={[status]}>\n        <ErrorMessage error={error} />\n      </ErrorBoundary>\n    </section>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport {\n  MentorDiscussion as Discussion,\n  Iteration,\n  MentorSessionRequest as Request,\n} from '../../types'\nimport { sendRequest } from '../../../utils/send-request'\nimport { typecheck } from '../../../utils/typecheck'\nimport { useMutation } from 'react-query'\nimport { MarkdownEditorForm } from '../../common/MarkdownEditorForm'\nimport { redirectTo } from '../../../utils/redirect-to'\nimport { MentoringNote } from '../session/MentoringNote'\n\nconst DEFAULT_ERROR = new Error('Unable to start discussion')\n\ntype Links = {\n  mentoringDocs: string\n}\n\nexport const StartDiscussionPanel = ({\n  iterations,\n  request,\n  defaultExpanded,\n  links,\n}: {\n  iterations: readonly Iteration[]\n  request: Request\n  defaultExpanded: boolean\n  links: Links\n}): JSX.Element => {\n  const contextId = `start-discussion-request-${request.uuid}`\n  const [state, setState] = useState({\n    expanded: defaultExpanded,\n    value: localStorage.getItem(`smde_${contextId}`) || '',\n  })\n  const lastIteration = iterations[iterations.length - 1]\n\n  const [mutation, { status, error }] = useMutation<Discussion>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: request.links.discussion,\n        method: 'POST',\n        body: JSON.stringify({\n          mentor_request_uuid: request.uuid,\n          content: state.value,\n          iteration_idx: lastIteration.idx,\n        }),\n      })\n\n      return fetch.then((json) => typecheck<Discussion>(json, 'discussion'))\n    },\n    {\n      onSuccess: (discussion) => redirectTo(discussion.links.self),\n    }\n  )\n\n  const handleSubmit = useCallback(() => {\n    mutation()\n  }, [mutation])\n\n  const handleClick = useCallback(() => {\n    if (state.expanded) {\n      return\n    }\n\n    setState({ ...state, expanded: true })\n  }, [state])\n\n  const handleCancel = useCallback(() => {\n    setState({ ...state, expanded: false })\n  }, [state])\n\n  const handleChange = useCallback(\n    (value: string) => {\n      setState({ ...state, value: value })\n    },\n    [state]\n  )\n\n  return (\n    <section className=\"comment-section --comment\">\n      <MarkdownEditorForm\n        onSubmit={handleSubmit}\n        onClick={handleClick}\n        onCancel={handleCancel}\n        onChange={handleChange}\n        contextId={contextId}\n        value={state.value}\n        expanded={state.expanded}\n        status={status}\n        error={error}\n        defaultError={DEFAULT_ERROR}\n        action=\"new\"\n      />\n      <MentoringNote links={links} />\n    </section>\n  )\n}\n", "import React from 'react'\nimport { AutomationProps, Representations } from './Representation'\n\nexport type RepresentationsWithFeedbackProps = {\n  data: AutomationProps\n}\nexport function RepresentationsWithFeedback({\n  data,\n}: RepresentationsWithFeedbackProps): JSX.Element {\n  return (\n    <Representations\n      {...data}\n      trackCacheKey=\"automation-with-feedback-track-cache-key\"\n      selectedTab=\"with_feedback\"\n    />\n  )\n}\n", "import React, { useCallback, useRef } from 'react'\nimport { TrackFilterList } from './TrackFilterList'\nimport { Request } from '../../../hooks/request-query'\nimport { AutomationStatus } from '../../types'\nimport { Sorter } from '../Sorter'\nimport { StatusTab } from '../inbox/StatusTab'\nimport { Checkbox, SearchInput } from '../../common'\nimport { AutomationIntroducer } from './AutomationIntroducer'\nimport { ResultsZone } from '../../ResultsZone'\nimport { RepresentationList } from './RepresentationList'\nimport { SortOption } from '../Inbox'\nimport { error } from 'jquery'\nimport { useAutomation } from './useAutomation'\n\nexport type AutomationLinks = {\n  withFeedback?: string\n  withoutFeedback?: string\n  admin?: string\n  hideIntroducer: string\n}\n\nexport type SelectedTab = 'admin' | 'with_feedback' | 'without_feedback'\nexport type AutomationProps = {\n  tracksRequest: Request\n  links: AutomationLinks\n  representationsRequest: Request\n  sortOptions: SortOption[]\n  selectedTab: SelectedTab\n  representationsWithoutFeedbackCount?: number\n  representationsWithFeedbackCount?: number\n  allRepresentationsWithFeedbackCount?: number\n  trackCacheKey: string\n  isIntroducerHidden: boolean\n}\n\nexport function Representations({\n  tracksRequest,\n  sortOptions,\n  links,\n  representationsRequest,\n  selectedTab,\n  allRepresentationsWithFeedbackCount,\n  representationsWithoutFeedbackCount,\n  representationsWithFeedbackCount,\n  trackCacheKey,\n  isIntroducerHidden,\n}: AutomationProps): JSX.Element {\n  const withFeedback = selectedTab === 'with_feedback'\n  const {\n    feedbackCount,\n    checked,\n    handleTrackChange,\n    isFetching,\n    isTrackListFetching,\n    latestData,\n    order,\n    page,\n    resolvedData,\n    selectedTrack,\n    handleOnlyMentoredSolutions,\n    setCriteria,\n    setOrder,\n    setPage,\n    status,\n    trackListError,\n    trackListStatus,\n    tracks,\n    criteria,\n  } = useAutomation(\n    representationsRequest,\n    allRepresentationsWithFeedbackCount,\n    representationsWithFeedbackCount,\n    representationsWithoutFeedbackCount,\n    tracksRequest,\n    trackCacheKey,\n    selectedTab\n  )\n\n  // timeout is stored in a useRef, so it can be cancelled\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const timer = useRef<any>()\n\n  const handlePageResetOnInputChange = useCallback(\n    (input: string) => {\n      //clears it on any input\n      clearTimeout(timer.current)\n      if (criteria && (input.length > 2 || input.length === 0)) {\n        timer.current = setTimeout(() => setPage(1), 500)\n      }\n    },\n\n    [criteria, setPage]\n  )\n\n  return (\n    <div className=\"c-mentor-inbox\">\n      {!isIntroducerHidden && (\n        <AutomationIntroducer hideEndpoint={links.hideIntroducer} />\n      )}\n      <div className=\"flex justify-between items-center\">\n        <div className=\"tabs\">\n          <StatusTab<AutomationStatus>\n            status=\"without_feedback\"\n            currentStatus={selectedTab}\n            setStatus={() => null}\n          >\n            <a href={links.withoutFeedback}>Need feedback</a>\n            {resolvedData ? (\n              <div className=\"count\">\n                {feedbackCount['without_feedback']?.toLocaleString()}\n              </div>\n            ) : null}\n          </StatusTab>\n          <StatusTab<AutomationStatus>\n            status=\"with_feedback\"\n            currentStatus={selectedTab}\n            setStatus={() => null}\n          >\n            <a href={links.withFeedback}>Feedback submitted</a>\n            {resolvedData ? (\n              <div className=\"count\">\n                {feedbackCount['with_feedback']?.toLocaleString()}\n              </div>\n            ) : null}\n          </StatusTab>\n          <StatusTab<AutomationStatus>\n            status=\"admin\"\n            currentStatus={selectedTab}\n            setStatus={() => null}\n          >\n            <a href={links.admin}>Admin</a>\n            {resolvedData ? (\n              <div className=\"count\">\n                {feedbackCount['all_with_feedback']?.toLocaleString()}\n              </div>\n            ) : null}\n          </StatusTab>\n        </div>\n        {!withFeedback && (\n          <Checkbox\n            className=\"mb-20\"\n            checked={checked}\n            setChecked={handleOnlyMentoredSolutions}\n          >\n            Only show solutions I&apos;ve mentored before\n          </Checkbox>\n        )}\n      </div>\n      <div className=\"container\">\n        <header className=\"c-search-bar automation-header\">\n          <TrackFilterList\n            status={trackListStatus}\n            error={trackListError}\n            tracks={tracks}\n            countText={withFeedback ? 'submission' : 'request'}\n            isFetching={isTrackListFetching}\n            cacheKey={trackCacheKey}\n            value={selectedTrack}\n            setValue={handleTrackChange}\n            sizeVariant={'automation'}\n          />\n\n          <div className=\"flex flex-row flex-grow justify-between\">\n            <SearchInput\n              className=\"mr-24\"\n              setFilter={(input) => {\n                setCriteria(input)\n                handlePageResetOnInputChange(input)\n              }}\n              filter={criteria}\n              placeholder=\"Filter by exercise (min 3 chars)\"\n            />\n            <Sorter\n              componentClassName=\"automation-sorter\"\n              sortOptions={sortOptions}\n              order={order}\n              setOrder={setOrder}\n              setPage={setPage}\n            />\n          </div>\n        </header>\n        <ResultsZone isFetching={isFetching}>\n          <RepresentationList\n            withFeedback={withFeedback}\n            error={error}\n            latestData={latestData}\n            page={page}\n            setPage={setPage}\n            resolvedData={resolvedData}\n            status={status}\n          />\n        </ResultsZone>\n      </div>\n    </div>\n  )\n}\n", "import React, { useCallback, useRef } from 'react'\nimport { TrackIcon, Icon } from '../../common'\nimport { FetchingBoundary } from '../../FetchingBoundary'\nimport { AutomationTrack } from '../../types'\nimport { QueryStatus } from 'react-query'\nimport { useDropdown } from '../../dropdowns/useDropdown'\nimport { ResultsZone } from '../../ResultsZone'\nimport { pluralizeWithNumber } from '../../../utils/pluralizeWithNumber'\n\ntype TrackFilterProps = AutomationTrack & {\n  checked: boolean\n  onChange: (e: React.ChangeEvent) => void\n  countText: string\n}\n\nconst TrackFilter = ({\n  title,\n  iconUrl,\n  numSubmissions,\n  checked,\n  onChange,\n  countText,\n}: TrackFilterProps): JSX.Element => {\n  return (\n    <label className=\"c-radio-wrapper\">\n      <input\n        type=\"radio\"\n        onChange={onChange}\n        checked={checked}\n        name=\"queue_track\"\n      />\n      <div className=\"row\">\n        <TrackIcon iconUrl={iconUrl} title={title} />\n        <div className=\"title\">{title}</div>\n        <div className=\"count\">\n          {pluralizeWithNumber(numSubmissions, countText)}\n        </div>\n      </div>\n    </label>\n  )\n}\n\nconst DEFAULT_ERROR = new Error('Unable to fetch tracks')\n\nexport const TrackFilterList = ({\n  status,\n  error,\n  children,\n  ...props\n}: React.PropsWithChildren<\n  Props & { status: QueryStatus; error: unknown }\n>): JSX.Element => {\n  return (\n    <FetchingBoundary\n      error={error}\n      status={status}\n      defaultError={DEFAULT_ERROR}\n    >\n      <Component {...props}>{children}</Component>\n    </FetchingBoundary>\n  )\n}\n\ntype Props = {\n  tracks: AutomationTrack[] | undefined\n  isFetching: boolean\n  value: AutomationTrack\n  setValue: (value: AutomationTrack) => void\n  cacheKey: string\n  sizeVariant?: 'large' | 'multi' | 'inline' | 'single' | 'automation'\n  countText: string\n}\n\nconst Component = ({\n  sizeVariant = 'large',\n  tracks,\n  isFetching,\n  value,\n  setValue,\n  countText,\n}: Props): JSX.Element | null => {\n  const changeTracksRef = useRef<HTMLButtonElement>(null)\n  const {\n    buttonAttributes,\n    panelAttributes,\n    listAttributes,\n    itemAttributes,\n    setOpen,\n    open,\n  } = useDropdown((tracks?.length || 0) + 1, (i) => handleItemSelect(i), {\n    placement: 'bottom',\n    modifiers: [\n      {\n        name: 'offset',\n        options: {\n          offset: [0, 8],\n        },\n      },\n    ],\n  })\n  const handleItemSelect = useCallback(\n    (index) => {\n      if (!tracks) {\n        return\n      }\n\n      const track = tracks[index]\n\n      track ? setValue(tracks[index]) : changeTracksRef.current?.click()\n      setOpen(false)\n    },\n    [setValue, tracks, setOpen]\n  )\n\n  if (!tracks) {\n    return null\n  }\n\n  return (\n    <div className={`c-single-select c-track-select --size-${sizeVariant}`}>\n      <ResultsZone isFetching={isFetching}>\n        <button\n          className=\"current-track\"\n          aria-label=\"Open the track filter\"\n          {...buttonAttributes}\n        >\n          <TrackIcon iconUrl={value.iconUrl} title={value.title} />\n          <div className=\"track-title\">{value.title}</div>\n          <div className=\"count\">\n            {pluralizeWithNumber(value.numSubmissions, countText)}\n          </div>\n          <Icon\n            icon=\"chevron-down\"\n            alt=\"Click to change\"\n            className=\"action-icon\"\n          />\n        </button>\n      </ResultsZone>\n      {open ? (\n        <div {...panelAttributes} className=\"--options\">\n          <ul {...listAttributes}>\n            {tracks.map((track, i) => {\n              return (\n                <li key={track.slug} {...itemAttributes(i)}>\n                  <TrackFilter\n                    countText={countText}\n                    onChange={() => {\n                      setValue(track)\n                      setOpen(false)\n                    }}\n                    checked={value.slug === track.slug}\n                    {...track}\n                  />\n                </li>\n              )\n            })}\n          </ul>\n        </div>\n      ) : null}\n    </div>\n  )\n}\n", "import React from 'react'\nimport { Introducer } from '../../common'\n\nexport function AutomationIntroducer({\n  hideEndpoint,\n}: {\n  hideEndpoint: string\n}): JSX.Element {\n  return (\n    <Introducer\n      endpoint={hideEndpoint}\n      additionalClassNames=\"mb-24\"\n      icon=\"automation\"\n    >\n      <h2>Initiate feedback automation...Beep boop bop...</h2>\n      <p>\n        Automation is a space that allows you to see common solutions to\n        exercises and write feedback once for all students with that particular\n        solution.\n      </p>\n    </Introducer>\n  )\n}\n", "import React from 'react'\nimport type { QueryStatus } from 'react-query'\nimport { Pagination, FilterFallback } from '@/components/common/'\nimport { FetchingBoundary } from '@/components/FetchingBoundary'\nimport { AutomationListElement } from './AutomationListElement'\nimport type { APIResponse } from './useMentoringAutomation'\n\nconst DEFAULT_ERROR = new Error('Unable to fetch queue')\n\ntype Props = {\n  resolvedData: APIResponse | undefined\n  latestData: APIResponse | undefined\n  page: number\n  setPage: (page: number) => void\n  withFeedback: boolean\n}\n\nexport const RepresentationList = ({\n  status,\n  error,\n  ...props\n}: { status: QueryStatus; error: unknown } & Props): JSX.Element => {\n  return (\n    <FetchingBoundary\n      status={status}\n      error={error}\n      defaultError={DEFAULT_ERROR}\n    >\n      <Component {...props} />\n    </FetchingBoundary>\n  )\n}\n\nfunction Component({\n  resolvedData,\n  latestData,\n  page,\n  setPage,\n  withFeedback,\n}: Props) {\n  return (\n    <>\n      {resolvedData && resolvedData.results && (\n        <React.Fragment>\n          <div className=\"--solutions\">\n            {resolvedData.results.length > 0 ? (\n              resolvedData.results.map((representation, key) => (\n                <AutomationListElement\n                  withFeedback={withFeedback}\n                  key={key}\n                  representation={representation}\n                />\n              ))\n            ) : resolvedData.meta.unscopedTotal === 1 ? (\n              <NoResultsYet />\n            ) : (\n              <NoResultsOfQuery />\n            )}\n          </div>\n          <footer>\n            <Pagination\n              disabled={latestData === undefined}\n              current={page}\n              total={resolvedData.meta.totalPages}\n              setPage={setPage}\n            />\n          </footer>\n        </React.Fragment>\n      )}\n    </>\n  )\n}\n\nfunction NoResultsOfQuery() {\n  return (\n    <FilterFallback\n      icon=\"no-result-magnifier\"\n      title=\"No solutions found.\"\n      description=\"Try changing your filters to find solutions that need feedback.\"\n    />\n  )\n}\n\nfunction NoResultsYet() {\n  return (\n    <FilterFallback\n      icon=\"automation\"\n      svgFilter=\"filter-textColor6\"\n      title=\"There are currently no solutions that need feedback.\"\n      description=\"Check back here later for more!\"\n    />\n  )\n}\n", "import React, { useMemo } from 'react'\nimport { pluralizeWithNumber, fromNow } from '@/utils'\nimport { TrackIcon, ExerciseIcon, GraphicalIcon } from '@/components/common'\nimport { MostPopularTag } from './MostPopularTag'\nimport type { Representation } from '@/components/types'\n\nexport const AutomationListElement = ({\n  representation,\n  withFeedback,\n}: {\n  representation: Representation\n  withFeedback: boolean\n}): JSX.Element => {\n  const ELEMENT_LABELS = useMemo(() => {\n    const pluralizeNumSubmissions = pluralizeWithNumber.bind(\n      null,\n      representation.numSubmissions\n    )\n    return {\n      counterElement: withFeedback\n        ? `Shown ${pluralizeNumSubmissions('time')}`\n        : `${pluralizeNumSubmissions('occurrence')}`,\n      dateElement: (\n        <>\n          Last {withFeedback ? 'shown' : 'occurrence'}\n          <br />\n          {fromNow(representation.lastSubmittedAt)}\n        </>\n      ),\n    }\n  }, [representation, withFeedback])\n\n  return (\n    <a className=\"--representer\" href={representation.links.edit}>\n      <TrackIcon\n        title={representation.track.title}\n        iconUrl={representation.track.iconUrl}\n      />\n      <ExerciseIcon\n        title={representation.exercise.title}\n        iconUrl={representation.exercise.iconUrl}\n      />\n      <div className=\"--info\">\n        <div className=\"--exercise-title whitespace-nowrap\">\n          <div>{representation.exercise.title}</div>{' '}\n          {representation.appearsFrequently && <MostPopularTag />}\n        </div>\n        <div className=\"--track-title\">\n          in {representation.track.title} (#{representation.id})\n        </div>\n      </div>\n      <div\n        className=\"--feedback-glimpse\"\n        dangerouslySetInnerHTML={{ __html: representation.feedbackHtml }}\n      ></div>\n      <div className=\"--occurencies\">{ELEMENT_LABELS['counterElement']}</div>\n      <time className=\"whitespace-nowrap\">{ELEMENT_LABELS['dateElement']}</time>\n      <GraphicalIcon\n        icon=\"chevron-right\"\n        className=\"action-icon filter-textColor6\"\n      />\n    </a>\n  )\n}\n", "import React from 'react'\n\nexport function MostPopularTag(): JSX.Element {\n  return (\n    <div className=\"flex items-center justify-center font-medium text-12 leading-[18px] py-2 px-8 border-1 border-orange rounded-5 bg-bgCAlert ml-8 text-textCAlertLabel whitespace-nowrap\">\n      Most Popular\n    </div>\n  )\n}\n", "import {\n  SetStateAction,\n  useCallback,\n  useEffect,\n  useMemo,\n  useState,\n} from 'react'\nimport {\n  ListState,\n  useList,\n  usePaginatedRequestQuery,\n  Request,\n  useHistory,\n  removeEmpty,\n} from '@/hooks'\nimport { useTrackList } from '../queue/useTrackList'\nimport { SelectedTab } from './Representation'\nimport type { QueryStatus } from 'react-query'\nimport type { AutomationTrack, Representation } from '@/components/types'\n\nexport type APIResponse = {\n  results: Representation[]\n  meta: {\n    currentPage: number\n    totalCount: number\n    totalPages: number\n    unscopedTotal: number\n  }\n}\n\ntype returnMentoringAutomation = {\n  request: ListState\n  criteria?: string\n  setCriteria: (criteria: string) => void\n  order: string\n  setOrder: (order: string) => void\n  page: number\n  setPage: (page: number) => void\n  handleTrackChange: (track: AutomationTrack) => void\n  handleOnlyMentoredSolutions: (checked: boolean) => void\n  selectedTrack: AutomationTrack\n  status: QueryStatus\n  resolvedData: APIResponse | undefined\n  latestData: APIResponse | undefined\n  isFetching: boolean\n  checked: boolean\n  setChecked: React.Dispatch<SetStateAction<boolean>>\n  tracks: AutomationTrack[]\n  trackListStatus: QueryStatus\n  trackListError: unknown\n  isTrackListFetching: boolean\n  feedbackCount: {\n    all_with_feedback: number | undefined\n    with_feedback: number | undefined\n    without_feedback: number | undefined\n  }\n}\n\nconst initialTrackData: AutomationTrack = {\n  slug: '',\n  title: '',\n  iconUrl: '',\n  numSubmissions: 0,\n}\n\nexport function useAutomation(\n  representationsRequest: Request,\n  allRepresentationsWithFeedbackCount: number | undefined,\n  representationsWithFeedbackCount: number | undefined,\n  representationsWithoutFeedbackCount: number | undefined,\n  tracksRequest: Request,\n  cacheKey: string,\n  selectedTab: SelectedTab\n): returnMentoringAutomation {\n  const [checked, setChecked] = useState(false)\n  const [criteria, setCriteria] = useState(\n    representationsRequest.query?.criteria || ''\n  )\n\n  const {\n    request,\n    setCriteria: setRequestCriteria,\n    setOrder,\n    setPage,\n    setQuery,\n  } = useList(representationsRequest)\n\n  const {\n    resolvedData: tracks,\n    status: trackListStatus,\n    error: trackListError,\n    isFetching: isTrackListFetching,\n  } = useTrackList({\n    cacheKey: cacheKey,\n    request: tracksRequest,\n  })\n\n  const [selectedTrack, setSelectedTrack] =\n    useState<AutomationTrack>(initialTrackData)\n\n  const { status, resolvedData, latestData, isFetching } =\n    usePaginatedRequestQuery<APIResponse>(\n      ['mentor-representations-list', request],\n      request\n    )\n\n  // TODO: refactor this and probably all query with the debounce hook\n  useEffect(() => {\n    const handler = setTimeout(() => {\n      if (criteria.length > 2 || criteria === '') {\n        setRequestCriteria(criteria)\n      }\n    }, 500)\n\n    return () => {\n      clearTimeout(handler)\n    }\n  }, [setRequestCriteria, criteria])\n\n  useHistory({ pushOn: removeEmpty(request.query) })\n\n  const handleTrackChange = useCallback(\n    (track) => {\n      setPage(1)\n      setCriteria('')\n      setSelectedTrack(track)\n\n      setQuery({ ...request.query, trackSlug: track.slug, page: 1 })\n    },\n    [setPage, setQuery, request.query]\n  )\n\n  // Automatically set a selected track based on query or the lack of it\n  useEffect(() => {\n    // don't repeat `find` on track change, only when page loads\n    if (tracks.length > 0 && selectedTrack === initialTrackData) {\n      const foundTrack = tracks.find(\n        (t: AutomationTrack) => t.slug == request.query.trackSlug\n      )\n      setSelectedTrack(foundTrack || tracks[0])\n    }\n  }, [request.query.trackSlug, selectedTrack, tracks])\n\n  // If only_mentored_solutions === null or undefined remove it completely from query obj and query string\n  const handleOnlyMentoredSolutions = useCallback(\n    (checked) => {\n      const queryObject: { onlyMentoredSolutions?: true } = {}\n      if (checked) {\n        Object.assign(queryObject, {\n          ...request.query,\n          onlyMentoredSolutions: true,\n        })\n      } else {\n        delete queryObject.onlyMentoredSolutions\n      }\n      setQuery(queryObject)\n      setPage(1)\n      setChecked((checked) => !checked)\n    },\n    [request.query, setPage, setQuery]\n  )\n\n  // Get the proper count number of automation requests for tabs\n  const getFeedbackCount = useCallback(\n    (selectedTab: SelectedTab) => {\n      if (resolvedData) {\n        switch (selectedTab) {\n          case 'with_feedback':\n            return {\n              all_with_feedback: allRepresentationsWithFeedbackCount,\n              with_feedback: resolvedData.meta.totalCount,\n              without_feedback: representationsWithoutFeedbackCount,\n            }\n          case 'without_feedback':\n            return {\n              all_with_feedback: allRepresentationsWithFeedbackCount,\n              with_feedback: representationsWithFeedbackCount,\n              without_feedback: resolvedData.meta.totalCount,\n            }\n          case 'admin':\n            return {\n              all_with_feedback: resolvedData.meta.totalCount,\n              with_feedback: representationsWithFeedbackCount,\n              without_feedback: representationsWithoutFeedbackCount,\n            }\n        }\n      } else\n        return {\n          all_with_feedback: 0,\n          with_feedback: 0,\n          without_feedback: 0,\n        }\n    },\n    [\n      allRepresentationsWithFeedbackCount,\n      representationsWithFeedbackCount,\n      representationsWithoutFeedbackCount,\n      resolvedData,\n    ]\n  )\n\n  const feedbackCount = useMemo(\n    () => getFeedbackCount(selectedTab),\n    [getFeedbackCount, selectedTab]\n  )\n\n  return {\n    handleTrackChange,\n    handleOnlyMentoredSolutions,\n    selectedTrack,\n    status,\n    resolvedData,\n    latestData,\n    isFetching,\n    checked,\n    setChecked,\n    order: request.query.order,\n    setOrder,\n    page: request.query.page || 1,\n    setPage,\n    tracks,\n    trackListStatus,\n    trackListError,\n    isTrackListFetching,\n    criteria,\n    setCriteria,\n    feedbackCount,\n    request,\n  }\n}\n", "import React from 'react'\nimport { AutomationProps, Representations } from './Representation'\n\ntype RepresentationsWithoutFeedbackProps = {\n  data: AutomationProps\n}\nexport function RepresentationsWithoutFeedback({\n  data,\n}: RepresentationsWithoutFeedbackProps): JSX.Element {\n  return (\n    <Representations\n      {...data}\n      trackCacheKey=\"automation-without-feedback-track-cache-key\"\n      selectedTab=\"without_feedback\"\n    />\n  )\n}\n", "import React from 'react'\nimport { AutomationProps, Representations } from './Representation'\n\nexport type RepresentationsWithFeedbackProps = {\n  data: AutomationProps\n}\nexport function RepresentationsAdmin({\n  data,\n}: RepresentationsWithFeedbackProps): JSX.Element {\n  return (\n    <Representations\n      {...data}\n      trackCacheKey=\"automation-admin-track-cache-key\"\n      selectedTab=\"admin\"\n    />\n  )\n}\n", "import React, { useState } from 'react'\nimport { MentorRegistrationModal } from '../modals/MentorRegistrationModal'\nimport { Links as ChooseTrackStepLinks } from '../modals/mentor-registration-modal/ChooseTrackStep'\nimport { Links as CommitStepLinks } from '../modals/mentor-registration-modal/CommitStep'\nimport { Links as CongratulationsStepLinks } from '../modals/mentor-registration-modal/CongratulationsStep'\n\nexport type Links = {\n  chooseTrackStep: ChooseTrackStepLinks\n  commitStep: CommitStepLinks\n  congratulationsStep: CongratulationsStepLinks\n}\n\nexport type Size = 'm' | 'l'\n\nexport const TryMentoringButton = ({\n  links,\n  text,\n  size,\n}: {\n  links: Links\n  text: string\n  size: Size\n}): JSX.Element => {\n  const [open, setOpen] = useState(false)\n\n  return (\n    <div>\n      <button\n        type=\"button\"\n        className={`btn-primary btn-${size}`}\n        onClick={() => setOpen(true)}\n      >\n        {text}\n      </button>\n      <MentorRegistrationModal\n        open={open}\n        links={links}\n        onClose={() => setOpen(false)}\n      />\n    </div>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { Modal, ModalProps } from './Modal'\nimport { StepIndicator } from './mentor-registration-modal/StepIndicator'\nimport { CloseButton } from './mentor-registration-modal/CloseButton'\nimport { ChooseTrackStep } from './mentor-registration-modal/ChooseTrackStep'\nimport { CommitStep } from './mentor-registration-modal/CommitStep'\nimport { CongratulationsStep } from './mentor-registration-modal/CongratulationsStep'\nimport { Links } from '../mentoring/TryMentoringButton'\n\nexport type ModalStep = 'CHOOSE_TRACK' | 'COMMIT' | 'CONGRATULATIONS'\n\nexport type StepProps = {\n  id: ModalStep\n  label: string\n}\n\nconst STEPS: StepProps[] = [\n  {\n    id: 'CHOOSE_TRACK',\n    label: 'Select the tracks you want to mentor',\n  },\n  {\n    id: 'COMMIT',\n    label: 'Commit to being a good mentor',\n  },\n  {\n    id: 'CONGRATULATIONS',\n    label: 'Congratulations',\n  },\n]\n\nconst ModalHeader = ({\n  children,\n}: {\n  children?: React.ReactNode\n}): JSX.Element => {\n  return <header>{children}</header>\n}\n\nconst ModalBody = ({\n  currentStep,\n  links,\n  onContinue,\n  onBack,\n}: {\n  currentStep: ModalStep\n  links: Links\n  onContinue: () => void\n  onBack: () => void\n}): JSX.Element => {\n  const [selected, setSelected] = useState<string[]>([])\n\n  switch (currentStep) {\n    case 'CHOOSE_TRACK':\n      return (\n        <ChooseTrackStep\n          links={links.chooseTrackStep}\n          selected={selected}\n          setSelected={setSelected}\n          onContinue={onContinue}\n        />\n      )\n    case 'COMMIT':\n      return (\n        <CommitStep\n          links={links.commitStep}\n          selected={selected}\n          onContinue={onContinue}\n          onBack={onBack}\n        />\n      )\n    case 'CONGRATULATIONS':\n      return <CongratulationsStep links={links.congratulationsStep} />\n  }\n}\n\nexport const MentorRegistrationModal = ({\n  onClose,\n  links,\n  ...props\n}: Omit<ModalProps, 'className'> & { links: Links }): JSX.Element => {\n  const [currentStep, setCurrentStep] = useState<ModalStep>('CHOOSE_TRACK')\n\n  const moveForward = useCallback(() => {\n    const nextStep = STEPS.findIndex((step) => step.id === currentStep) + 1\n\n    setCurrentStep(STEPS[nextStep].id)\n  }, [currentStep])\n\n  const moveBack = useCallback(() => {\n    const prevStep = STEPS.findIndex((step) => step.id === currentStep) - 1\n\n    setCurrentStep(STEPS[prevStep].id)\n  }, [currentStep])\n\n  return (\n    <Modal\n      {...props}\n      onClose={onClose}\n      className=\"m-become-mentor\"\n      cover={true}\n    >\n      <div className=\"md-container\">\n        <ModalHeader>\n          <StepIndicator steps={STEPS} currentStep={currentStep} />\n          <CloseButton onClick={onClose} />\n        </ModalHeader>\n        <ModalBody\n          currentStep={currentStep}\n          links={links}\n          onContinue={moveForward}\n          onBack={moveBack}\n        />\n      </div>\n    </Modal>\n  )\n}\n", "import React from 'react'\nimport { StepProps, ModalStep } from '../MentorRegistrationModal'\n\nconst Step = ({\n  num,\n  label,\n  selected,\n}: {\n  num: number\n  label: string\n  selected: boolean\n}) => {\n  const srText = `Step ${num}: ${label}`\n\n  const classNames = ['step', selected ? 'selected' : '']\n\n  return (\n    <li\n      className={classNames.join(' ')}\n      aria-current={selected ? 'step' : undefined}\n    >\n      <span className=\"sr-only\">{srText}</span>\n    </li>\n  )\n}\n\nexport const StepIndicator = ({\n  steps,\n  currentStep,\n}: {\n  steps: StepProps[]\n  currentStep: ModalStep\n}): JSX.Element => {\n  return (\n    <ul aria-label=\"Become a mentor progress\" className=\"steps\">\n      {steps.map((step, i) => {\n        return (\n          <Step\n            label={step.label}\n            key={step.id}\n            num={i + 1}\n            selected={step.id === currentStep}\n          />\n        )\n      })}\n    </ul>\n  )\n}\n", "import React from 'react'\nimport { Icon } from '../../common'\n\nexport const CloseButton = ({\n  onClick,\n}: {\n  onClick: () => void\n}): JSX.Element => {\n  return (\n    <button type=\"button\" className=\"close-btn\" onClick={onClick}>\n      <Icon icon=\"close\" alt=\"Close the modal\" className=\"filter-textColor6\" />\n    </button>\n  )\n}\n", "import React from 'react'\nimport { TrackSelector } from '../../mentoring/TrackSelector'\n\nexport type Links = {\n  tracks: string\n}\n\nexport const ChooseTrackStep = ({\n  links,\n  selected,\n  setSelected,\n  onContinue,\n}: {\n  links: Links\n  selected: string[]\n  setSelected: (selected: string[]) => void\n  onContinue: () => void\n}): JSX.Element => {\n  return (\n    <section className=\"tracks-section\">\n      <h2>Select the tracks you want to mentor</h2>\n      <p>\n        This allows us to only show you the solutions you want to mentor.{' '}\n        <strong>\n          Don\u2019t worry, you can change these selections at anytime.\n        </strong>\n      </p>\n      <TrackSelector\n        tracksEndpoint={links.tracks}\n        selected={selected}\n        setSelected={setSelected}\n        onContinue={onContinue}\n      />\n    </section>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { Icon, GraphicalIcon, FormButton } from '../../common'\nimport { ReputationInfo } from './commit-step/ReputationInfo'\nimport { Checkbox } from './commit-step/Checkbox'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../utils/send-request'\nimport { ErrorMessage, ErrorBoundary } from '../../ErrorBoundary'\n\nexport type Links = {\n  codeOfConduct: string\n  intellectualHumility: string\n  registration: string\n}\n\nconst NUM_TO_CHECK = 4\nconst DEFAULT_ERROR = new Error('Unable to complete registration')\n\nexport const CommitStep = ({\n  links,\n  selected,\n  onContinue,\n  onBack,\n}: {\n  links: Links\n  selected: string[]\n  onContinue: () => void\n  onBack: () => void\n}): JSX.Element => {\n  const [mutation, { status, error }] = useMutation(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: links.registration,\n        method: 'POST',\n        body: JSON.stringify({\n          track_slugs: selected,\n          accept_terms: true,\n        }),\n      })\n\n      return fetch\n    },\n    {\n      onSuccess: () => {\n        onContinue()\n      },\n    }\n  )\n\n  const [numChecked, setNumChecked] = useState(0)\n  const handleChange = useCallback(\n    (e) => {\n      if (e.target.checked) {\n        setNumChecked(numChecked + 1)\n      } else {\n        setNumChecked(numChecked - 1)\n      }\n    },\n    [numChecked]\n  )\n\n  const handleSubmit = useCallback(() => {\n    mutation()\n  }, [mutation])\n\n  return (\n    <section className=\"commit-section\">\n      <div className=\"lhs\">\n        <h2>Commit to being a good mentor</h2>\n        <p>\n          Mentoring on Exercism can be an incredible experience for students and\n          mentors alike. To ensure it remains a positive place for everyone, we\n          ask all mentors to affirm Exercism&apos;s values before they mentor\n          their first solution.\n        </p>\n        <ReputationInfo />\n        <div className=\"commitment\">\n          <h3>You agree to:</h3>\n          <Checkbox onChange={handleChange}>\n            <span>\n              Abide by the{' '}\n              <a href={links.codeOfConduct} target=\"_blank\" rel=\"noreferrer\">\n                Code of Conduct{' '}\n                <Icon icon=\"external-link\" alt=\"Opens in a new tab\" />\n              </a>\n            </span>\n          </Checkbox>\n          <Checkbox onChange={handleChange}>\n            <span>\n              Be patient, empathic and kind to those you&apos;re mentoring\n            </span>\n          </Checkbox>\n          <Checkbox onChange={handleChange}>\n            <span>\n              Demonstrate{' '}\n              <a\n                href={links.intellectualHumility}\n                target=\"_blank\"\n                rel=\"noreferrer\"\n              >\n                intellectual humility{' '}\n                <Icon icon=\"external-link\" alt=\"Opens in a new tab\" />\n              </a>\n            </span>\n          </Checkbox>\n          <Checkbox onChange={handleChange}>\n            <span>Not use Exercism to promote personal agendas</span>\n          </Checkbox>\n        </div>\n\n        <div className=\"flex\">\n          <FormButton\n            onClick={onBack}\n            status={status}\n            className=\"btn-default btn-m mr-16\"\n          >\n            Back\n          </FormButton>\n          <FormButton\n            className=\"btn-primary btn-m\"\n            onClick={handleSubmit}\n            status={status}\n            disabled={numChecked !== NUM_TO_CHECK}\n          >\n            <span>Continue</span>\n            <GraphicalIcon icon=\"arrow-right\" />\n          </FormButton>\n        </div>\n        <ErrorBoundary>\n          <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n        </ErrorBoundary>\n      </div>\n      <div className=\"rhs\">\n        <GraphicalIcon icon=\"mentoring-screen\" category=\"graphics\" />\n      </div>\n    </section>\n  )\n}\n", "import React from 'react'\nimport { GraphicalIcon } from '../../../common'\n\nexport const ReputationInfo = (): JSX.Element => {\n  return (\n    <div className=\"reputation-info\">\n      <div className=\"inner\">\n        <GraphicalIcon icon=\"reputation\" />\n        <div className=\"info\">\n          <h3>Reputation &amp; testimonials</h3>\n          <p>\n            You&apos;ll gain <strong>6 reputation</strong> for each successful\n            mentoring session. At the end of every discussion, students are\n            invited to leave you a testimonial.\n          </p>\n        </div>\n      </div>\n    </div>\n  )\n}\n", "import React from 'react'\nimport { GraphicalIcon } from '../../../common'\n\nexport const Checkbox = ({\n  children,\n  onChange,\n}: {\n  children: React.ReactNode\n  onChange: (e: React.ChangeEvent<HTMLInputElement>) => void\n}): JSX.Element => {\n  return (\n    <label className=\"c-checkbox-wrapper\">\n      <input onChange={onChange} required type=\"checkbox\" />\n      <div className=\"row\">\n        <div className=\"c-checkbox\">\n          <GraphicalIcon icon=\"checkmark\" />\n        </div>\n        {children}\n      </div>\n    </label>\n  )\n}\n", "import React from 'react'\nimport { GraphicalIcon, Icon } from '../../common'\n\nexport type Links = {\n  video: string\n  dashboard: string\n}\n\nexport const CongratulationsStep = ({\n  links,\n}: {\n  links: Links\n}): JSX.Element => {\n  return (\n    <section className=\"celebrate-section\">\n      <GraphicalIcon icon=\"confetti\" category=\"graphics\" />\n      <h2>You\u2019re now a mentor!</h2>\n      <h3>Thank you - we\u2019re so grateful for your commitment \uD83D\uDE4F</h3>\n      <p className=\"welcome\">\n        We want to make getting started with mentoring as easy as possible.\n        Watch the video below to learn how to get started.\n      </p>\n      <div className=\"video-frame\">\n        <header className=\"video-header\">\n          <Icon icon=\"video\" alt=\"This is a video\" />\n          <div className=\"info\">\n            <h3>Welcome to the Mentor Team!</h3>\n            <p>Video \u00B7 0:24</p>\n          </div>\n        </header>\n        <div\n          className=\"video\"\n          style={{ padding: '56.25% 0 0 0', position: 'relative' }}\n        >\n          <iframe\n            src={links.video}\n            style={{\n              position: 'absolute',\n              top: 0,\n              left: 0,\n              width: '100%',\n              height: '100%',\n            }}\n            frameBorder=\"0\"\n            allow=\"autoplay; fullscreen; picture-in-picture\"\n            allowFullScreen\n          ></iframe>\n        </div>\n        <script src=\"https://player.vimeo.com/api/player.js\"></script>\n      </div>\n      <a href={links.dashboard} className=\"btn-primary btn-m\">\n        I&apos;m ready to get started!\n      </a>\n    </section>\n  )\n}\n", "import React, { useCallback, useState, useEffect } from 'react'\nimport {\n  Request as BaseRequest,\n  usePaginatedRequestQuery,\n  useHistory,\n  removeEmpty,\n  useList,\n} from '@/hooks'\nimport { FetchingBoundary } from '../FetchingBoundary'\nimport { ResultsZone } from '../ResultsZone'\nimport { SharePlatform, Testimonial } from '../types'\nimport { RevealedTestimonial } from './testimonials-list/RevealedTestimonial'\nimport { UnrevealedTestimonial } from './testimonials-list/UnrevealedTestimonial'\nimport { GraphicalIcon, Pagination } from '../common'\nimport { TrackDropdown } from './testimonials-list/TrackDropdown'\nimport { OrderSelect } from './testimonials-list/OrderSelect'\n\nexport type PaginatedResult = {\n  results: readonly Testimonial[]\n  meta: {\n    currentPage: number\n    totalCount: number\n    totalPages: number\n  }\n}\n\nexport type Track = {\n  slug: string\n  title: string\n  iconUrl: string\n}\n\nexport type Order = 'unrevealed' | 'newest' | 'oldest'\n\nexport type Request = BaseRequest<{\n  criteria?: string\n  order?: string\n  trackSlug?: string\n  page?: number\n}>\n\nconst DEFAULT_ERROR = new Error('Unable to load testimonials')\nconst DEFAULT_ORDER = 'unrevealed'\n\nexport const TestimonialsList = ({\n  request: initialRequest,\n  tracks,\n  platforms,\n}: {\n  request: Request\n  tracks: readonly Track[]\n  platforms: readonly SharePlatform[]\n}): JSX.Element => {\n  const {\n    request,\n    setQuery,\n    setCriteria: setRequestCriteria,\n    setPage,\n    setOrder,\n  } = useList(initialRequest)\n  const [criteria, setCriteria] = useState(request.query?.criteria || '')\n  const cacheKey = [\n    'mentor-testimonials',\n    request.endpoint,\n    removeEmpty(request.query),\n  ]\n  const { status, resolvedData, latestData, isFetching, error } =\n    usePaginatedRequestQuery<PaginatedResult, Error | Response>(cacheKey, {\n      ...request,\n      query: removeEmpty(request.query),\n    })\n\n  const setTrack = useCallback(\n    (trackSlug) => {\n      setQuery({ ...request.query, trackSlug: trackSlug, page: undefined })\n    },\n    [request.query, setQuery]\n  )\n  const [revealedTestimonials, setRevealedTestimonials] = useState<string[]>([])\n\n  useHistory({ pushOn: removeEmpty(request.query) })\n\n  useEffect(() => {\n    const handler = setTimeout(() => {\n      setRequestCriteria(criteria)\n    }, 200)\n\n    return () => {\n      clearTimeout(handler)\n    }\n  }, [setRequestCriteria, criteria])\n\n  return (\n    <div className=\"lg-container\">\n      <article className=\"content\">\n        <div className=\"c-search-bar\">\n          <TrackDropdown\n            tracks={tracks}\n            value={request.query.trackSlug || ''}\n            setValue={setTrack}\n          />\n          <input\n            className=\"--search\"\n            placeholder=\"Search by student name or testimonial\"\n            value={criteria}\n            onChange={(e) => {\n              setCriteria(e.target.value)\n            }}\n          />\n          <OrderSelect\n            value={request.query.order || DEFAULT_ORDER}\n            setValue={setOrder}\n          />\n        </div>\n        <ResultsZone isFetching={isFetching}>\n          <FetchingBoundary\n            status={status}\n            error={error}\n            defaultError={DEFAULT_ERROR}\n          >\n            {resolvedData ? (\n              resolvedData.results.length == 0 ? (\n                <div className=\"no-testimonials\">\n                  <GraphicalIcon icon=\"testimonials\" />\n                  <h2>You currently have no testimonials</h2>\n                  <p>\n                    Testimonials are left by students on ending successful\n                    mentoring discussions.\n                  </p>\n                </div>\n              ) : (\n                <React.Fragment>\n                  <div className=\"testimonials\">\n                    {resolvedData.results.map((testimonial) => {\n                      return testimonial.isRevealed ? (\n                        <RevealedTestimonial\n                          key={testimonial.uuid}\n                          testimonial={testimonial}\n                          cacheKey={cacheKey}\n                          isRevealed={revealedTestimonials.includes(\n                            testimonial.uuid\n                          )}\n                          platforms={platforms}\n                        />\n                      ) : (\n                        <UnrevealedTestimonial\n                          key={testimonial.uuid}\n                          testimonial={testimonial}\n                          cacheKey={cacheKey}\n                          onRevealed={() =>\n                            setRevealedTestimonials([\n                              ...revealedTestimonials,\n                              testimonial.uuid,\n                            ])\n                          }\n                          platforms={platforms}\n                        />\n                      )\n                    })}\n                  </div>\n                </React.Fragment>\n              )\n            ) : null}\n          </FetchingBoundary>\n        </ResultsZone>\n      </article>\n      {resolvedData ? (\n        <Pagination\n          disabled={latestData === undefined}\n          current={request.query.page || 1}\n          total={resolvedData.meta.totalPages}\n          setPage={setPage}\n        />\n      ) : null}\n    </div>\n  )\n}\n", "import React, { useState } from 'react'\nimport { QueryKey } from 'react-query'\nimport { fromNow } from '@/utils'\nimport { Avatar, GraphicalIcon, HandleWithFlair, TrackIcon } from '../../common'\nimport { TestimonialModal } from '../../modals/TestimonialModal'\nimport { Testimonial, SharePlatform } from '../../types'\nimport { OptionsDropdown } from './revealed-testimonial/OptionsDropdown'\n\nexport const RevealedTestimonial = ({\n  testimonial,\n  cacheKey,\n  isRevealed,\n  platforms,\n}: {\n  testimonial: Testimonial\n  cacheKey: QueryKey\n  isRevealed: boolean\n  platforms: readonly SharePlatform[]\n}): JSX.Element => {\n  const [open, setOpen] = useState(false)\n\n  return (\n    <React.Fragment>\n      <div className=\"testimonial\">\n        <a\n          href=\"#\"\n          onClick={(e) => {\n            setOpen(true)\n            e.preventDefault()\n          }}\n        >\n          <TrackIcon {...testimonial.track} />\n          <Avatar\n            src={testimonial.student.avatarUrl}\n            handle={testimonial.student.handle}\n          />\n          <div className=\"info\">\n            <div className=\"student\">\n              <HandleWithFlair\n                handle={testimonial.student.handle}\n                flair={testimonial.student.flair}\n              />\n            </div>\n            <div className=\"exercise\">\n              on {testimonial.exercise.title} in {testimonial.track.title}\n            </div>\n          </div>\n          {isRevealed ? <div className=\"new\">New</div> : null}\n          <div className=\"content\">{testimonial.content}</div>\n          <time dateTime={testimonial.createdAt}>\n            {fromNow(testimonial.createdAt)}\n          </time>\n          <GraphicalIcon icon=\"modal\" className=\"action-icon\" />\n        </a>\n        <OptionsDropdown testimonial={testimonial} cacheKey={cacheKey} />\n      </div>\n      <TestimonialModal\n        open={open}\n        testimonial={testimonial}\n        onClose={() => setOpen(false)}\n        platforms={platforms}\n      />\n    </React.Fragment>\n  )\n}\n", "import React from 'react'\nimport { SharePlatform, Testimonial } from '../types'\nimport { Modal, ModalProps } from './Modal'\nimport { Avatar, HandleWithFlair, TrackIcon } from '../common'\nimport { fromNow } from '../../utils/time'\nimport { SharePanel } from '../common/SharePanel'\n\nexport const TestimonialModal = ({\n  testimonial,\n  platforms,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  testimonial: Testimonial\n  platforms: readonly SharePlatform[]\n}): JSX.Element => {\n  return (\n    <Modal\n      closeButton={true}\n      cover={true}\n      celebratory\n      className=\"m-testimonial\"\n      {...props}\n    >\n      <Avatar\n        src={testimonial.student.avatarUrl}\n        handle={testimonial.student.handle}\n      />\n      <div className=\"testimonial-section\">\n        <div className=\"content\">{testimonial.content}</div>\n        <div className=\"student\">\n          by&nbsp;\n          <strong>\n            <HandleWithFlair\n              handle={testimonial.student.handle}\n              flair={testimonial.student.flair}\n              size=\"large\"\n            />\n          </strong>\n        </div>\n        <div className=\"exercise\">\n          on <strong>{testimonial.exercise.title}</strong> in\n          <TrackIcon\n            iconUrl={testimonial.track.iconUrl}\n            title={testimonial.track.title}\n          />\n          <div className=\"track-title\">{testimonial.track.title}</div>\n        </div>\n        <time dateTime={testimonial.createdAt}>\n          {fromNow(testimonial.createdAt)}\n        </time>\n      </div>\n      <SharePanel\n        title=\"Share your testimonial with the world\"\n        url={testimonial.links.self}\n        shareTitle=\"View this testimonial on Exercism\"\n        platforms={platforms}\n      />\n    </Modal>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { QueryKey } from 'react-query'\nimport { Icon } from '../../../common'\nimport { useDropdown } from '../../../dropdowns/useDropdown'\nimport { Testimonial } from '../../../types'\nimport { DeleteTestimonialModal } from './DeleteTestimonialModal'\n\nexport const OptionsDropdown = ({\n  testimonial,\n  cacheKey,\n}: {\n  testimonial: Testimonial\n  cacheKey: QueryKey\n}): JSX.Element => {\n  const {\n    buttonAttributes,\n    panelAttributes,\n    listAttributes,\n    itemAttributes,\n    setOpen,\n    open,\n  } = useDropdown(1)\n  const [isModalOpen, setIsModalOpen] = useState(false)\n\n  const handleDelete = useCallback(() => {\n    setOpen(false)\n    setIsModalOpen(true)\n  }, [setOpen])\n\n  const handleModalClose = useCallback(() => {\n    setIsModalOpen(false)\n  }, [])\n\n  return (\n    <React.Fragment>\n      <button className=\"options-button\" {...buttonAttributes}>\n        <Icon icon=\"more-horizontal\" alt=\"Options\" />\n      </button>\n      {open ? (\n        <div {...panelAttributes} className=\"c-dropdown-generic-menu\">\n          <ul {...listAttributes}>\n            <li {...itemAttributes(0)}>\n              <button onClick={handleDelete}>Delete testimonial</button>\n            </li>\n          </ul>\n        </div>\n      ) : null}\n      <DeleteTestimonialModal\n        open={isModalOpen}\n        onClose={handleModalClose}\n        testimonial={testimonial}\n        cacheKey={cacheKey}\n      />\n    </React.Fragment>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { QueryKey, useQueryCache } from 'react-query'\nimport { Modal, ModalProps } from '../../../modals/Modal'\nimport { Testimonial } from '../../../types'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { FormButton } from '../../../common'\nimport { ErrorBoundary, ErrorMessage } from '../../../ErrorBoundary'\nimport { PaginatedResult } from '../../TestimonialsList'\n\nconst DEFAULT_ERROR = new Error('Unable to delete testimonial')\n\nexport const DeleteTestimonialModal = ({\n  testimonial,\n  cacheKey,\n  onClose,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  testimonial: Testimonial\n  cacheKey: QueryKey\n}): JSX.Element => {\n  const queryCache = useQueryCache()\n  const [mutation, { status, error }] = useMutation(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: testimonial.links.delete,\n        method: 'DELETE',\n        body: null,\n      })\n\n      return fetch\n    },\n    {\n      onSuccess: () => {\n        queryCache.setQueryData<PaginatedResult | undefined>(\n          cacheKey,\n          (result) => {\n            if (!result) {\n              return\n            }\n\n            return {\n              ...result,\n              results: result.results.filter(\n                (t) => t.uuid !== testimonial.uuid\n              ),\n            }\n          }\n        )\n      },\n    }\n  )\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  const handleClose = useCallback(() => {\n    if (status === 'loading') {\n      return\n    }\n\n    onClose()\n  }, [onClose, status])\n\n  return (\n    <Modal className=\"m-generic-confirmation\" onClose={handleClose} {...props}>\n      <h3>Are you sure you want to delete this testimonial?</h3>\n      <p>\n        Deleting the testimonial will hide it from this list, your profile and\n        mentoring stats. <strong>This action is irreversible.</strong>\n      </p>\n      <form data-turbo=\"false\" onSubmit={handleSubmit} className=\"buttons\">\n        <FormButton type=\"submit\" status={status} className=\"btn-warning btn-s\">\n          Delete testimonial\n        </FormButton>\n        <FormButton\n          type=\"button\"\n          status={status}\n          onClick={handleClose}\n          className=\"btn-enhanced btn-s\"\n        >\n          Cancel\n        </FormButton>\n      </form>\n      <ErrorBoundary resetKeys={[status]}>\n        <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n      </ErrorBoundary>\n    </Modal>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { useMutation, QueryKey, useQueryCache } from 'react-query'\nimport { fromNow } from '../../../utils/time'\nimport { GraphicalIcon, TrackIcon } from '../../common'\nimport { SharePlatform, Testimonial } from '../../types'\nimport { sendRequest } from '../../../utils/send-request'\nimport { typecheck } from '../../../utils/typecheck'\nimport { PaginatedResult } from '../TestimonialsList'\nimport { FetchingBoundary } from '../../FetchingBoundary'\nimport { TestimonialModal } from '../../modals/TestimonialModal'\nimport { useIsMounted } from 'use-is-mounted'\n\nconst DEFAULT_ERROR = new Error('Unable to reveal testimonial')\n\nexport const UnrevealedTestimonial = ({\n  testimonial,\n  onRevealed,\n  cacheKey,\n  platforms,\n}: {\n  testimonial: Testimonial\n  onRevealed: () => void\n  cacheKey: QueryKey\n  platforms: readonly SharePlatform[]\n}): JSX.Element => {\n  const queryCache = useQueryCache()\n  const isMountedRef = useIsMounted()\n  const [open, setOpen] = useState(false)\n  const [\n    revealedTestimonial,\n    setRevealedTestimonial,\n  ] = useState<Testimonial | null>(null)\n  const [reveal, { status, error }] = useMutation<Testimonial>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: testimonial.links.reveal,\n        method: 'PATCH',\n        body: null,\n      })\n\n      return fetch.then((json) => typecheck<Testimonial>(json, 'testimonial'))\n    },\n    {\n      onSuccess: (testimonial) => {\n        if (!isMountedRef.current) {\n          return\n        }\n\n        setRevealedTestimonial(testimonial)\n        setOpen(true)\n      },\n    }\n  )\n  const updateCache = useCallback(() => {\n    const oldData = queryCache.getQueryData<PaginatedResult>(cacheKey)\n\n    if (!oldData || !revealedTestimonial) {\n      return\n    }\n\n    queryCache.setQueryData(cacheKey, {\n      ...oldData,\n      results: oldData.results.map((oldTestimonial) => {\n        return oldTestimonial.uuid === revealedTestimonial.uuid\n          ? revealedTestimonial\n          : oldTestimonial\n      }),\n    })\n  }, [cacheKey, revealedTestimonial, queryCache])\n\n  return (\n    <a\n      href=\"#\"\n      onClick={(e) => {\n        reveal()\n        e.preventDefault()\n      }}\n      className=\"unrevealed-testimonial\"\n    >\n      <TrackIcon {...testimonial.track} />\n      <GraphicalIcon icon=\"avatar-placeholder\" className=\"c-avatar\" />\n      <div className=\"info\">\n        <div className=\"student\">Someone left you a testimonial\u2026 \uD83D\uDE32</div>\n        <div className=\"exercise\">Click / tap to reveal</div>\n      </div>\n      <time dateTime={testimonial.createdAt}>\n        {fromNow(testimonial.createdAt)}\n      </time>\n      <GraphicalIcon icon=\"modal\" className=\"action-icon\" />\n      <FetchingBoundary\n        error={error}\n        status={status}\n        defaultError={DEFAULT_ERROR}\n      />\n      {revealedTestimonial ? (\n        <TestimonialModal\n          open={open}\n          testimonial={revealedTestimonial}\n          onClose={() => {\n            setOpen(false)\n            updateCache()\n            onRevealed()\n          }}\n          platforms={platforms}\n        />\n      ) : null}\n    </a>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { TrackSelect, TrackLogo } from '../../common/TrackSelect'\nimport { Track } from '../TestimonialsList'\n\nconst OptionComponent = ({ option: track }: { option: Track }) => {\n  return (\n    <React.Fragment>\n      <TrackLogo track={track} />\n      <div className=\"title\">{track.title}</div>\n    </React.Fragment>\n  )\n}\n\nconst SelectedComponent = ({ option: track }: { option: Track }) => {\n  return (\n    <>\n      <TrackLogo track={track} />\n      <div className=\"sr-only\">{track.title}</div>\n    </>\n  )\n}\n\nexport const TrackDropdown = ({\n  tracks,\n  value,\n  setValue,\n}: {\n  tracks: readonly Track[]\n  value: string\n  setValue: (value: string) => void\n}): JSX.Element => {\n  const track = tracks.find((track) => track.slug === value) || tracks[0]\n  const handleSet = useCallback(\n    (track: Track) => {\n      setValue(track.slug)\n    },\n    [setValue]\n  )\n\n  return (\n    <TrackSelect\n      tracks={tracks}\n      value={track}\n      setValue={handleSet}\n      OptionComponent={OptionComponent}\n      SelectedComponent={SelectedComponent}\n      size=\"inline\"\n    />\n  )\n}\n", "import React from 'react'\nimport { SingleSelect } from '../../common/SingleSelect'\nimport { Order } from '../TestimonialsList'\n\nconst OptionComponent = ({ option: order }: { option: Order }) => {\n  switch (order) {\n    case 'unrevealed':\n      return <React.Fragment>Sort by Unrevealed First</React.Fragment>\n    case 'newest':\n      return <React.Fragment>Sort by Newest First</React.Fragment>\n    case 'oldest':\n      return <React.Fragment>Sort by Oldest First</React.Fragment>\n  }\n}\n\nexport const OrderSelect = ({\n  value,\n  setValue,\n}: {\n  value: Order\n  setValue: (value: Order) => void\n}): JSX.Element => {\n  return (\n    <SingleSelect<Order>\n      options={['unrevealed', 'newest', 'oldest']}\n      value={value}\n      setValue={setValue}\n      SelectedComponent={OptionComponent}\n      OptionComponent={OptionComponent}\n    />\n  )\n}\n", "import React from 'react'\nimport { SplitPane } from '../common'\nimport { CompleteRepresentationData } from '../types'\nimport { LeftPane } from './representation/left-pane'\nimport { RightPane } from './representation/right-pane'\n\nexport function Representation({\n  data,\n}: {\n  data: CompleteRepresentationData\n}): JSX.Element {\n  return (\n    <div className=\"c-mentor-discussion\">\n      <SplitPane\n        defaultLeftWidth=\"90%\"\n        leftMinWidth={550}\n        rightMinWidth={625}\n        id=\"mentoring-session\"\n        left={\n          <LeftPane links={data.links} representation={data.representation} />\n        }\n        right={<RightPane data={data} />}\n      />\n    </div>\n  )\n}\n", "import React from 'react'\nimport { CloseButton } from '../../session/CloseButton'\nimport { IterationView } from './RepresentationIterationView'\nimport RepresentationInfo from './RepresentationInfo'\nimport { CompleteRepresentationData, RepresentationData } from '../../../types'\n\nexport type PanesProps = {\n  representation: RepresentationData\n} & Pick<CompleteRepresentationData, 'links'>\n\nexport function LeftPane({ representation, links }: PanesProps): JSX.Element {\n  return (\n    <>\n      <header className=\"discussion-header\">\n        <CloseButton url={links.back} />\n        <RepresentationInfo\n          exercise={representation.exercise}\n          track={representation.track}\n        />\n      </header>\n      <IterationView representationData={representation} />\n    </>\n  )\n}\n", "import React from 'react'\nimport { fromNow } from '../../../../utils/date'\nimport { pluralizeWithNumber } from '../../../../utils/pluralizeWithNumber'\nimport { ResultsZone } from '../../../ResultsZone'\nimport { RepresentationData } from '../../../types'\nimport { MostPopularTag } from '../../automation/MostPopularTag'\nimport { FilePanel } from '../../session/FilePanel'\n\nexport const IterationView = ({\n  representationData,\n}: {\n  representationData: RepresentationData\n}): JSX.Element => {\n  return (\n    <React.Fragment>\n      <SimpleIterationHeader\n        solutionNumber={representationData.id}\n        appearsFrequently={representationData.appearsFrequently}\n        lastOccurred={fromNow(representationData.lastSubmittedAt)}\n        occurrenceNumber={representationData.numSubmissions}\n      />\n      <ResultsZone isFetching={false}>\n        <FilePanel\n          files={representationData.files}\n          language={representationData.track.highlightjsLanguage}\n          indentSize={2}\n          instructions={representationData.instructions}\n          testFiles={representationData.testFiles}\n        />\n      </ResultsZone>\n    </React.Fragment>\n  )\n}\n\nexport function SimpleIterationHeader({\n  solutionNumber,\n  occurrenceNumber,\n  lastOccurred,\n  appearsFrequently,\n}: {\n  solutionNumber: number\n  occurrenceNumber: number\n  lastOccurred: string\n  appearsFrequently: boolean\n}): JSX.Element {\n  return (\n    <header className=\"iteration-header\">\n      <div>\n        <div className=\"flex flex-row items-center text-15 text-textColor1 font-semibold leading-170\">\n          Solution #{solutionNumber} {appearsFrequently && <MostPopularTag />}\n        </div>\n        <div className=\"text-14 text-textColor6 font-medium leading-160\">\n          {pluralizeWithNumber(occurrenceNumber, 'occurrence')} \u00B7 Last occurred{' '}\n          {lastOccurred}\n        </div>\n      </div>\n      <div></div>\n    </header>\n  )\n}\n", "import React from 'react'\nimport { TrackIcon, Avatar } from '../../../common'\n\nexport default function RepresentationInfo({\n  track,\n  exercise,\n}: {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  track: any\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  exercise: any\n}): JSX.Element {\n  return (\n    <>\n      <TrackIcon\n        title={track.title}\n        className={'!w-[32px] !h-[32px]'}\n        iconUrl={track.iconUrl}\n      />\n      <div className=\"student\">\n        <Avatar src={exercise.iconUrl} />\n        <div className=\"info\">\n          <div className=\"exercise\">\n            You\u2019re giving feedback on a solution set for\n          </div>\n          <div className=\"handle\">\n            {exercise.title} in {track.title}\n          </div>\n        </div>\n      </div>\n    </>\n  )\n}\n", "import React, { useState } from 'react'\nimport {\n  CompleteRepresentationData,\n  RepresentationFeedbackType,\n} from '@/components/types'\nimport HowImportant from './HowImportant'\nimport MentoringConversation from './MentoringConversation'\nimport { UtilityTabs } from './UtilityTabs'\n\nexport function RightPane({\n  data,\n}: {\n  data: CompleteRepresentationData\n}): JSX.Element {\n  const [feedbackType, setFeedbackType] = useState<RepresentationFeedbackType>(\n    data.representation.feedbackType ||\n      data.representation.draftFeedbackType ||\n      'essential'\n  )\n\n  return (\n    <div className=\"!h-100 flex flex-col justify-between\">\n      <UtilityTabs data={data} />\n      <div className=\"comment-section --comment\">\n        <HowImportant\n          feedbackType={feedbackType}\n          setFeedbackType={setFeedbackType}\n        />\n\n        <MentoringConversation feedbackType={feedbackType} data={data} />\n      </div>\n    </div>\n  )\n}\n", "import React, { SetStateAction } from 'react'\nimport { RepresentationFeedbackType } from '../../../types'\nimport RadioGroup from './RadioGroup'\n\nexport type HowImportantProps = {\n  feedbackType: RepresentationFeedbackType\n  setFeedbackType: React.Dispatch<SetStateAction<RepresentationFeedbackType>>\n}\n\nexport default function HowImportant({\n  feedbackType,\n  setFeedbackType,\n}: HowImportantProps): JSX.Element {\n  return (\n    <div className=\"mb-4\">\n      <h2 className=\"text-h6 mb-8\">How important is this?</h2>\n      <RadioGroup\n        feedbackType={feedbackType}\n        setFeedbackType={setFeedbackType}\n      />\n    </div>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { HowImportantProps } from './HowImportant'\nimport RadioButton from './RadioButton'\n\nconst RADIO_DATA = [\n  {\n    label: 'Essential',\n    value: 'essential',\n    tooltip: {\n      title: 'If you mark this as Essential',\n      body: 'Student is prompted heavily to action this before proceeding. Essential enhancement.',\n    },\n  },\n  {\n    label: 'Recommended',\n    value: 'actionable',\n    tooltip: {\n      title: 'If you mark this as Recommended',\n      body: 'Student is prompted to action this before proceeding, but not considered essential. High-value enhancement.',\n    },\n  },\n  {\n    label: 'Optional',\n    value: 'non_actionable',\n    tooltip: {\n      title: 'If you mark this as Optional',\n      body: 'Student is not prompted to action this before proceeding, entirely a low-value enhancement.',\n    },\n  },\n  {\n    label: 'Celebratory',\n    value: 'celebratory',\n    tooltip: {\n      title: 'If you mark this as Celebratory',\n      body: 'Student is not prompted to action this before proceeding, congratules the student on their solution.',\n    },\n  },\n]\nexport default function RadioGroup({\n  feedbackType,\n  setFeedbackType,\n}: HowImportantProps): JSX.Element {\n  const handleRadioCheck = useCallback(\n    (e) => {\n      setFeedbackType(e.target.value)\n    },\n    [setFeedbackType]\n  )\n\n  return (\n    <div>\n      {RADIO_DATA.map((i) => (\n        <RadioButton\n          key={i.label}\n          value={i.value}\n          checked={feedbackType == i.value}\n          onChange={handleRadioCheck}\n          label={i.label}\n          tooltip={i.tooltip}\n        />\n      ))}\n    </div>\n  )\n}\n", "import React, { useCallback, useState } from 'react'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '@/utils'\nimport {\n  CompleteRepresentationData,\n  RepresentationFeedbackType,\n} from '@/components/types'\nimport { PreviewAutomationModal } from '../modals/PreviewAutomationModal'\nimport { SubmittedAutomationModal } from '../modals/SubmittedAutomationModal'\nimport { RepresentationFeedbackEditor } from './RepresentationFeedbackEditor'\n\nexport default function MentoringConversation({\n  data,\n  feedbackType,\n}: {\n  data: CompleteRepresentationData\n  feedbackType: RepresentationFeedbackType\n}): JSX.Element {\n  const [value, setValue] = useState(\n    data.representation.feedbackMarkdown ||\n      data.representation.draftFeedbackMarkdown ||\n      ''\n  )\n  const [isSuccessModalOpen, setIsSuccessModalOpen] = useState(false)\n  const [isPreviewModalOpen, setIsPreviewModalOpen] = useState(false)\n  const [expanded, setExpanded] = useState(\n    !!data.representation.feedbackMarkdown ||\n      !!data.representation.draftFeedbackMarkdown ||\n      false\n  )\n  const [html, setHtml] = useState('<p>Loading..</p>')\n\n  const handleChange = useCallback((value) => setValue(value), [setValue])\n\n  const handleExpansion = useCallback((expanded) => {\n    if (!expanded) {\n      setExpanded(true)\n    }\n  }, [])\n\n  const handleCompression = useCallback((value) => {\n    if (!value) {\n      setExpanded(false)\n    }\n  }, [])\n\n  const [generateHTML] = useMutation(async (markdown: string) => {\n    const { fetch } = sendRequest<{ html: string }>({\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      // querySelector may return undefined, but not in this case.\n      endpoint: document.querySelector<HTMLMetaElement>(\n        'meta[name=\"parse-markdown-url\"]'\n      )?.content,\n      method: 'POST',\n      body: JSON.stringify({\n        parse_options: {\n          strip_h1: false,\n          lower_heading_levels_by: 2,\n        },\n        markdown,\n      }),\n    })\n    return fetch.then((res) => {\n      setHtml(`<div class=\"c-textual-content --small\">${res.html}</div>`)\n    })\n  })\n\n  const handlePreviewClick = useCallback(() => {\n    setIsPreviewModalOpen(true)\n    generateHTML(value)\n  }, [generateHTML, value])\n\n  return (\n    <div>\n      <RepresentationFeedbackEditor\n        onChange={handleChange}\n        value={value}\n        expanded={expanded}\n        onFocus={() => handleExpansion(expanded)}\n        onBlur={() => handleCompression(value)}\n        onPreviewClick={handlePreviewClick}\n      />\n\n      {/*<div className=\"mt-12 text-textColor6 bg-veryLightBlue py-4 px-8 rounded-5 leading-150\">\n        We imported your last mentoring feedback to this solution above\n      </div>*/}\n\n      <PreviewAutomationModal\n        feedbackType={feedbackType}\n        markdown={value}\n        data={data}\n        isOpen={isPreviewModalOpen}\n        html={html}\n        onClose={() => setIsPreviewModalOpen(false)}\n        onSuccessfulSubmit={() => {\n          setIsPreviewModalOpen(false)\n          setIsSuccessModalOpen(true)\n        }}\n      />\n      <SubmittedAutomationModal\n        goBackLink={data.links.success}\n        isOpen={isSuccessModalOpen}\n        onClose={() => setIsSuccessModalOpen(false)}\n      />\n    </div>\n  )\n}\n", "import React, { useCallback, useState } from 'react'\nimport { useMutation } from 'react-query'\nimport {\n  CompleteRepresentationData,\n  RepresentationFeedbackType,\n} from '@/components/types'\nimport { SplitPane } from '@/components/common'\nimport { Modal } from '@/components/modals'\nimport { sendRequest } from '@/utils'\nimport { IterationView } from '../left-pane/RepresentationIterationView'\nimport { PreviewFeedbackComment } from './PreviewFeedbackComment'\nimport { PreviewFooter } from './PreviewFooter'\nimport { AutomationModalProps } from './SubmittedAutomationModal'\n\ntype PreviewAutomationModalProps = AutomationModalProps & {\n  data: CompleteRepresentationData\n  html: string\n  markdown: string\n  feedbackType: RepresentationFeedbackType\n  onSuccessfulSubmit: () => void\n}\n\nexport function PreviewAutomationModal({\n  data,\n  onClose,\n  isOpen,\n  html,\n  markdown,\n  feedbackType,\n  onSuccessfulSubmit,\n}: PreviewAutomationModalProps): JSX.Element {\n  const [selectedExample, setSelectedExample] = useState<number>(0)\n\n  async function SubmitFeedback() {\n    const { fetch } = sendRequest<{ html: string }>({\n      endpoint: data.representation.links.update!,\n      method: 'PATCH',\n      body: JSON.stringify({\n        representation: {\n          feedback_type: feedbackType,\n          feedback_markdown: markdown,\n        },\n      }),\n    })\n    return fetch\n  }\n\n  const [submitFeedback] = useMutation(SubmitFeedback, {\n    onSuccess: onSuccessfulSubmit,\n  })\n\n  const handleSubmit = useCallback(() => {\n    submitFeedback()\n  }, [submitFeedback])\n\n  return (\n    <Modal\n      ReactModalClassName=\"c-mentor-discussion !p-0 !w-[80%] !h-[65vh] flex flex-col\"\n      onClose={onClose}\n      open={isOpen}\n    >\n      <SplitPane\n        id=\"automation-preview\"\n        rightMinWidth={350}\n        leftMinWidth={550}\n        defaultLeftWidth=\"100%\"\n        left={\n          <IterationView\n            representationData={{\n              ...data.representation,\n              ...data.examples[selectedExample],\n            }}\n          />\n        }\n        right={\n          <PreviewFeedbackComment\n            feedbackType={feedbackType}\n            mentor={data.mentor}\n            html={html}\n          />\n        }\n      />\n      <PreviewFooter\n        onSubmit={handleSubmit}\n        examples={data.examples}\n        selectedExample={selectedExample}\n        setSelectedExample={setSelectedExample}\n        numOfSolutions={data.representation.numSubmissions}\n        onClose={onClose}\n      />\n    </Modal>\n  )\n}\n", "import React from 'react'\nimport dayjs from 'dayjs'\nimport { Avatar } from '@/components/common'\nimport { RepresentationFeedbackType, User } from '@/components/types'\nimport { useHighlighting } from '@/hooks'\nimport { CommentTag } from '../common/CommentTag'\n\nexport type PreviewFeedbackCommentProps = {\n  html: string\n  feedbackType: RepresentationFeedbackType\n  mentor: Pick<User, 'avatarUrl' | 'handle'> & { name: string }\n}\n\nexport function PreviewFeedbackComment({\n  html,\n  mentor,\n  feedbackType,\n}: PreviewFeedbackCommentProps): JSX.Element {\n  const htmlRef = useHighlighting<HTMLDivElement>(html)\n\n  return (\n    <div className=\"px-24 py-16 leading-160 overflow-auto\">\n      <div className=\"flex flex-row items-center mb-12\">\n        <Avatar className=\"w-[32px] h-[32px] mr-16\" src={mentor.avatarUrl} />\n        <div className=\"text-15 text-textColor6 font-medium\">\n          <span className=\"text-textColor1\">{mentor.name}</span> gave this\n          feedback on a solution exactly like yours:\n        </div>{' '}\n      </div>\n\n      <div className=\"flex flex-start\">\n        <CommentTag type={feedbackType} />\n      </div>\n      <div\n        className=\"mb-4\"\n        ref={htmlRef}\n        dangerouslySetInnerHTML={{ __html: html }}\n      ></div>\n      <div className=\"text-textColor6 font-medium\">\n        Commented on {`${dayjs(Date.now()).format('D MMM YYYY')}`}\n      </div>\n    </div>\n  )\n}\n", "import React from 'react'\nimport { RepresentationFeedbackType } from '../../../types'\nexport const CommentTag = ({ type }: { type: RepresentationFeedbackType }):JSX.Element|null => {\n  switch (type) {\n    case 'essential':\n      return (\n        <div className=\"text-13 leading-170 font-mono font-bold rounded-3 px-8 mb-8 bg-red text-white !w-fit\">\n          Essential\n        </div>\n      )\n    case 'actionable':\n      return (\n        <div className=\"text-13 leading-170 font-mono font-bold rounded-3 px-8 mb-8 bg-warning text-white !w-fit\">\n          Recommended\n        </div>\n      )\n    default:\n      return null\n  }\n}\n", "import React, { SetStateAction } from 'react'\nimport { pluralizeWithNumber } from '@/utils/pluralizeWithNumber'\nimport { StatusTab } from '../../inbox/StatusTab'\nimport { CancelButton } from '../common/CancelButton'\nimport { PrimaryButton } from '../common/PrimaryButton'\nimport type { RepresentationData } from '@/components/types'\n\ntype Example = Pick<RepresentationData, 'files' | 'instructions' | 'testFiles'>\nexport function PreviewFooter({\n  numOfSolutions,\n  examples,\n  selectedExample,\n  setSelectedExample,\n  onClose,\n  onSubmit,\n}: {\n  numOfSolutions: number\n  examples: Example[]\n  selectedExample: number\n  setSelectedExample: React.Dispatch<SetStateAction<number>>\n  onClose: () => void\n  onSubmit: () => void\n}): JSX.Element {\n  return (\n    <div className=\"flex flex-row justify-between items-center h-[70px] border-t-1 border-borderColor6 px-24 flex-shrink-0\">\n      <div className=\"tabs flex flex-row child:px-12 child:py-10 child:text-14\">\n        {examples.map((_: Example, k: number) => {\n          return (\n            <StatusTab\n              key={`example-tab-${k}`}\n              currentStatus={selectedExample}\n              status={k}\n              setStatus={setSelectedExample}\n            >\n              Example {k + 1}\n            </StatusTab>\n          )\n        })}\n      </div>\n\n      <div className=\"flex flex-row items-center\">\n        <div className=\"mr-32 text-right leading-150 text-15 text-textColor6\">\n          You can edit this feedback anytime.\n          <br />\n          Your feedback will appear on{' '}\n          <strong className=\"font-medium text-textColor1\">\n            {pluralizeWithNumber(numOfSolutions, 'solution')}\n          </strong>\n        </div>\n        <CancelButton onClick={onClose} />\n        <PrimaryButton onClick={onSubmit} className=\"px-[18px] py-12 !m-0\">\n          Submit\n        </PrimaryButton>\n      </div>\n    </div>\n  )\n}\n", "import React from 'react'\n\nexport function CancelButton({\n  onClick,\n}: {\n  onClick: () => void\n}): JSX.Element {\n  return (\n    <button\n      onClick={onClick}\n      className=\"mr-16 px-[18px] py-[12px] border border-1 border-textColor1 text-textColor1 text-16 rounded-8 font-semibold shadow-xsZ1v2\"\n    >\n      Cancel\n    </button>\n  )\n}\n", "import React from 'react'\n\nexport function PrimaryButton({\n  onClick,\n  children,\n  className,\n  disabled,\n}: {\n  onClick: () => void\n  children: React.ReactChild\n  className?: string\n  disabled?: boolean\n}): JSX.Element {\n  const disabledStyle =\n    'bg-disabledLight text-disabledLabel !border-transparent !shadow-none'\n\n  return (\n    <button\n      onClick={onClick}\n      className={`border-1 border-primaryBtnBorder shadow-xsZ1v3 bg-purple text-white text-16 font-semibold rounded-8 ${className} ${\n        disabled ? disabledStyle : ''\n      }`}\n      disabled={disabled}\n    >\n      {children}\n    </button>\n  )\n}\n", "import React from 'react'\nimport { Modal } from '@/components/modals/Modal'\nimport { GraphicalIcon, Icon, Reputation } from '@/components/common'\nimport { PrimaryButton } from '../common/PrimaryButton'\n\nexport type AutomationModalProps = {\n  isOpen: boolean\n  onClose: () => void\n}\nexport function SubmittedAutomationModal({\n  isOpen,\n  onClose,\n  goBackLink,\n}: AutomationModalProps & { goBackLink: string }): JSX.Element {\n  return (\n    <Modal ReactModalClassName=\"!rounded-24\" open={isOpen} onClose={onClose}>\n      <div className=\"flex flex-col items-center rounded-24\">\n        <GraphicalIcon icon=\"green-check\" className=\"w-[64px] h-[64px] mb-12\" />\n        <h2 className=\"text-h2 mb-12\">Thanks for submitting feedback!</h2>\n        <p className=\"w-[640px] text-18 leading-paragraph text-center mb-20\">\n          This will get shown to the relevant students on their solutions as\n          they work through exercises.{' '}\n          <strong className=\"font-medium\">\n            We\u2019ll show you how many times your solution gets shown to students\n            too.\n          </strong>\n        </p>\n        <div className=\"flex flex-row items-center border-gradient-primary text-white font-medium text-18 border border-4 rounded-12  px-24 py-8 mb-32 child:mx-12\">\n          You earned <Reputation value=\"+3\" type=\"primary\" size=\"small\" />{' '}\n          Reputation for this, thanks \uD83D\uDE0A\n        </div>\n\n        <a href={goBackLink}>\n          <PrimaryButton\n            className=\"!w-[100%] py-[16px] px-[24px] mb-16\"\n            onClick={() => null}\n          >\n            <div className=\"flex flex-row justify-center text-18\">\n              Continue to solutions requiring feedback{' '}\n              <Icon\n                alt=\"right\"\n                icon=\"arrow-right\"\n                className=\"w-[16px] h-[16px] filter-white ml-12\"\n              />\n            </div>\n          </PrimaryButton>\n        </a>\n      </div>\n    </Modal>\n  )\n}\n", "import React, {\n  FocusEventHandler,\n  MouseEventHandler,\n  useCallback,\n  useEffect,\n  useState,\n} from 'react'\nimport {\n  MarkdownEditorHandle,\n  MarkdownEditor,\n} from '@/components/common/MarkdownEditor'\nimport { PrimaryButton } from '../common/PrimaryButton'\n\nexport function RepresentationFeedbackEditor({\n  onChange,\n  value,\n  expanded,\n  onFocus,\n  onBlur,\n  onPreviewClick,\n}: {\n  onChange: (value: string) => void\n  onFocus: MouseEventHandler<HTMLDivElement>\n  onBlur: FocusEventHandler<HTMLDivElement>\n  value: string\n  expanded: boolean\n  onPreviewClick: () => void\n}): JSX.Element {\n  const [editor, setEditor] = useState<MarkdownEditorHandle | null>(null)\n\n  const handleEditorDidMount = useCallback((editor) => {\n    setEditor(editor)\n  }, [])\n\n  useEffect(() => {\n    if (!expanded) {\n      return\n    }\n\n    editor?.focus()\n  }, [editor, expanded])\n\n  return (\n    <div\n      id=\"markdown-editor\"\n      onClick={onFocus}\n      onBlur={onBlur}\n      className={`c-markdown-editor ${\n        expanded ? '--expanded' : '--compressed'\n      }`}\n    >\n      <MarkdownEditor\n        onChange={onChange}\n        editorDidMount={handleEditorDidMount}\n        value={value}\n      />\n\n      <div className=\"editor-footer\">\n        <PrimaryButton\n          disabled={!/[a-zA-Z0-9]/.test(value)}\n          className=\"px-[18px] py-[12px] \"\n          onClick={onPreviewClick}\n        >\n          Preview & Submit\n        </PrimaryButton>\n      </div>\n    </div>\n  )\n}\n", "import { AnalyzerFeedback } from '@/components/student/iterations-list/AnalyzerFeedback'\nimport React, { useState } from 'react'\nimport { Tab, GraphicalIcon } from '../../../common'\nimport { CompleteRepresentationData } from '../../../types'\nimport { TabsContext } from '../../Session'\nimport { Guidance } from '../../session/Guidance'\n// import { Guidance } from '../../session/Guidance'\nimport { Scratchpad } from '../../session/Scratchpad'\nimport AutomationRules from './AutomationRules'\nimport Considerations from './Considerations'\n\ntype RepresentationTabIndex = 'information' | 'scratchpad' | 'guidance'\n\nexport function UtilityTabs({\n  data,\n}: {\n  data: CompleteRepresentationData\n}): JSX.Element {\n  const [tab, setTab] = useState<RepresentationTabIndex>('information')\n\n  return (\n    <TabsContext.Provider\n      value={{\n        current: tab,\n        switchToTab: (id: string) => setTab(id as RepresentationTabIndex),\n      }}\n    >\n      <div className=\"tabs\" role=\"tablist\">\n        <Tab id=\"information\" context={TabsContext}>\n          <GraphicalIcon icon=\"comment\" />\n          <Tab.Title text=\"Information\" />\n        </Tab>\n        <Tab id=\"scratchpad\" context={TabsContext}>\n          <GraphicalIcon icon=\"scratchpad\" />\n          <Tab.Title text=\"Scratchpad\" />\n        </Tab>\n        <Tab id=\"guidance\" context={TabsContext}>\n          <GraphicalIcon icon=\"guidance\" />\n          <Tab.Title text=\"Guidance\" />\n        </Tab>\n      </div>\n      <Tab.Panel id=\"information\" context={TabsContext}>\n        <Considerations guidance={data.guidance} />\n        <AutomationRules guidance={data.guidance} />\n\n        {data.analyzerFeedback && (\n          <div className=\"mx-24 my-16 border-t-2 border-borderColor6 pt-16 \">\n            <AnalyzerFeedback\n              summary={data.analyzerFeedback.summary}\n              comments={data.analyzerFeedback.comments}\n              automatedFeedbackInfoLink={'???'}\n              track={data.representation.track}\n            />\n          </div>\n        )}\n      </Tab.Panel>\n      <Tab.Panel id=\"scratchpad\" context={TabsContext}>\n        <Scratchpad\n          scratchpad={data.scratchpad}\n          track={data.representation.track}\n          exercise={data.representation.exercise}\n        />\n      </Tab.Panel>\n      <Tab.Panel id=\"guidance\" context={TabsContext}>\n        <Guidance\n          guidance={data.guidance}\n          mentorSolution={data.mentorSolution}\n          exemplarFiles={data.guidance.exemplarFiles}\n          language={data.representation.track.highlightjsLanguage}\n          links={data.guidance.links}\n        />\n      </Tab.Panel>\n    </TabsContext.Provider>\n  )\n}\n", "import React from 'react'\nimport { CompleteRepresentationData } from '../../../types'\n\nexport default function AutomationRules({\n  guidance,\n}: Pick<CompleteRepresentationData, 'guidance'>): JSX.Element | null {\n  const prLink = (\n    <a\n      href={guidance.links.improveRepresenterGuidance}\n      target=\"_blank\"\n      rel=\"noreferrer\"\n    >\n      Pull Request on GitHub\n    </a>\n  )\n\n  if (!guidance.representations) {\n    return (\n      <p className=\"px-24 mb-16 text-p-base\">\n        This representer doesn&apos;t have any guidance yet. Guidance notes are\n        written by our maintainers to explain what normalizations occur during\n        the representation process. If you are a maintainer, please help get\n        them started for this representer by sending a {prLink}.\n      </p>\n    )\n  }\n\n  return (\n    <div className=\"px-24 shadow-xsZ1v2 pt-12 pb-24\">\n      <h2 className=\"text-h4 mb-12\">Please read before giving feedback</h2>\n      <div\n        dangerouslySetInnerHTML={{\n          __html: `<div class=\"c-textual-content --base\">${guidance.representations}</div>`,\n        }}\n      />\n    </div>\n  )\n}\n", "import React from 'react'\nimport { CompleteRepresentationData } from '../../../types'\n\nexport default function Considerations({\n  guidance,\n}: Pick<CompleteRepresentationData, 'guidance'>): JSX.Element | null {\n  return (\n    <p className=\"flex items-center justify-center font-medium text-16 leading-[24px] py-8 px-16 border-2 border-orange rounded-8 bg-bgCAlert text-textCAlert whitespace-nowrap my-16 mx-24\">\n      Please&nbsp;\n      <a\n        href={guidance.links.representationFeedbackGuide}\n        target=\"_blank\"\n        rel=\"noreferrer\"\n        className=\"!text-textCAlertLabel underline\"\n      >\n        read this\n      </a>\n      &nbsp;before giving your first feedback.\n    </p>\n  )\n}\n", "import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport { Avatar, GraphicalIcon, HandleWithFlair, Icon } from '../common'\nimport {\n  IterationStatus,\n  SolutionForStudent,\n  ExerciseType,\n  Iteration,\n} from '../types'\nimport { CompleteExerciseButton } from './CompleteExerciseButton'\nimport { MentoringComboButton } from './MentoringComboButton'\nimport {\n  MentorDiscussion,\n  SolutionStatus,\n  SolutionMentoringStatus,\n} from '../types'\nimport { LatestIterationStatusChannel } from '../../channels/latestIterationStatusChannel'\nimport { usePaginatedRequestQuery, Request } from '../../hooks/request-query'\nimport pluralize from 'pluralize'\nimport { useQueryCache } from 'react-query'\n\nexport type Track = {\n  title: string\n  medianWaitTime?: number\n}\n\nexport type Links = {\n  mentoringInfo: string\n  completeExercise: string\n  requestMentoring: string\n  shareMentoring: string\n  pendingMentorRequest: string\n  inProgressDiscussion?: string\n}\n\ntype Props = {\n  solution: SolutionForStudent\n  exerciseType: ExerciseType\n  request: Request\n  discussions: readonly MentorDiscussion[]\n  links: Links\n  iterations: readonly Iteration[]\n  track: Track\n}\n\ntype NudgeType =\n  | 'mentoringRequested'\n  | 'inProgress'\n  | 'completeExercise'\n  | 'mentoring'\n  | 'testsFailed'\n\nconst REFETCH_INTERVAL = 2000\n\nexport const Nudge = ({\n  solution,\n  exerciseType,\n  request,\n  discussions,\n  links,\n  iterations,\n  track,\n}: Props): JSX.Element | null => {\n  const queryCache = useQueryCache()\n  const CACHE_KEY = `nudge-${solution.uuid}`\n  const [queryEnabled, setQueryEnabled] = useState(true)\n  const { resolvedData } = usePaginatedRequestQuery<{\n    status: IterationStatus\n  }>(CACHE_KEY, {\n    ...request,\n    options: {\n      ...request.options,\n      refetchInterval: queryEnabled ? REFETCH_INTERVAL : false,\n    },\n  })\n\n  const iterationStatus = resolvedData?.status\n\n  useEffect(() => {\n    switch (iterationStatus) {\n      case IterationStatus.DELETED:\n      case IterationStatus.TESTING:\n      case IterationStatus.ANALYZING:\n        setQueryEnabled(true)\n        break\n      default:\n        setQueryEnabled(false)\n        break\n    }\n  }, [iterationStatus])\n\n  const getNudgeType = useCallback(() => {\n    switch (solution.mentoringStatus) {\n      case 'requested':\n        return 'mentoringRequested'\n      case 'in_progress':\n        return 'inProgress'\n      default: {\n        switch (iterationStatus) {\n          case IterationStatus.NON_ACTIONABLE_AUTOMATED_FEEDBACK:\n          case IterationStatus.NO_AUTOMATED_FEEDBACK: {\n            switch (exerciseType) {\n              case 'concept':\n              case 'tutorial':\n                return 'completeExercise'\n              case 'practice':\n                return 'mentoring'\n            }\n            break\n          }\n          case IterationStatus.TESTS_FAILED:\n            return 'testsFailed'\n          default:\n            return null\n        }\n      }\n    }\n  }, [exerciseType, iterationStatus, solution.mentoringStatus])\n  const [nudgeType, setNudgeType] = useState<NudgeType | null>(getNudgeType())\n  const initNudgeTypeRef = useRef<NudgeType | null>(nudgeType)\n  const [shouldAnimate, setShouldAnimate] = useState(false)\n\n  useEffect(() => {\n    const channel = new LatestIterationStatusChannel(\n      solution.uuid,\n      (response) => {\n        queryCache.setQueryData(CACHE_KEY, response)\n      }\n    )\n\n    return () => {\n      channel.disconnect()\n    }\n  }, [CACHE_KEY, solution])\n\n  useEffect(() => {\n    setNudgeType(getNudgeType())\n  }, [getNudgeType])\n\n  useEffect(() => {\n    if (initNudgeTypeRef.current === nudgeType) {\n      return\n    }\n\n    setShouldAnimate(true)\n  }, [nudgeType])\n\n  const className = shouldAnimate ? 'animate' : ''\n\n  switch (nudgeType) {\n    case 'mentoringRequested':\n      return <MentoringRequestedNudge links={links} className={className} />\n    case 'inProgress':\n      return (\n        <InProgressMentoringNudge\n          discussion={discussions[0]}\n          className={className}\n        />\n      )\n    case 'completeExercise':\n      return (\n        <CompleteExerciseNudge\n          status={solution.status}\n          iterations={iterations}\n          completeExerciseLink={links.completeExercise}\n          className={className}\n        />\n      )\n    case 'mentoring':\n      return (\n        <MentoringNudge\n          mentoringStatus={solution.mentoringStatus}\n          discussions={discussions}\n          links={links}\n          className={className}\n        />\n      )\n    case 'testsFailed':\n      return (\n        <TestsFailedNudge track={track} links={links} className={className} />\n      )\n    default:\n      return null\n  }\n}\n\nconst CompleteExerciseNudge = ({\n  status,\n  iterations,\n  completeExerciseLink,\n  className = '',\n}: {\n  status: SolutionStatus\n  iterations: readonly Iteration[]\n  completeExerciseLink: string\n  className?: string\n}) => {\n  if (status == 'published' || status == 'completed') {\n    return null\n  }\n\n  const classNames = ['completion-nudge', className].filter(\n    (className) => className.length > 0\n  )\n\n  return (\n    <section className={classNames.join(' ')}>\n      <GraphicalIcon icon=\"complete\" category=\"graphics\" />\n      <div className=\"info\">\n        <h3>Nice, it looks like you\u2019re done here!</h3>\n        <p>\n          Complete the exercise to unlock new concepts and exercises.{' '}\n          <strong>\n            Remember, you can request code review even after you\u2019ve completed\n            the exercise.\n          </strong>\n        </p>\n      </div>\n      <CompleteExerciseButton\n        iterations={iterations}\n        endpoint={completeExerciseLink}\n      />\n    </section>\n  )\n}\n\nconst MentoringNudge = ({\n  mentoringStatus,\n  discussions,\n  links,\n  className = '',\n}: {\n  mentoringStatus: SolutionMentoringStatus\n  discussions: readonly MentorDiscussion[]\n  className?: string\n  links: {\n    mentoringInfo: string\n    requestMentoring: string\n    shareMentoring: string\n    pendingMentorRequest: string\n    inProgressDiscussion?: string\n  }\n}) => {\n  const classNames = ['mentoring-prompt-nudge', className].filter(\n    (className) => className.length > 0\n  )\n\n  if (mentoringStatus === 'finished') {\n    return null\n  }\n\n  return (\n    <section className={classNames.join(' ')}>\n      <GraphicalIcon icon=\"mentoring-screen\" category=\"graphics\" />\n      <div className=\"info\">\n        <h3>Improve your solution with code review</h3>\n        <p>\n          Having your code reviewed by a mentor is an incredible way to identify\n          your knowledge gaps and accelerate your learning. It&apos;s totally\n          free.\n        </p>\n        <div className=\"options\">\n          <MentoringComboButton\n            mentoringStatus={mentoringStatus}\n            discussions={discussions}\n            links={links}\n          />{' '}\n          <a\n            href={links.mentoringInfo}\n            className=\"more-info\"\n            target=\"_blank\"\n            rel=\"noreferrer\"\n          >\n            What is Code Review?\n            <Icon icon=\"external-link\" alt=\"Opens in a new tab\" />\n          </a>\n        </div>\n      </div>\n    </section>\n  )\n}\n\nconst TestsFailedNudge = ({\n  track,\n  links,\n  className = '',\n}: {\n  track: Track\n  links: {\n    mentoringInfo: string\n    requestMentoring: string\n  }\n  className?: string\n}) => {\n  const classNames = ['mentoring-prompt-nudge', className].filter(\n    (className) => className.length > 0\n  )\n\n  return (\n    <section className={classNames.join(' ')}>\n      <GraphicalIcon icon=\"mentoring-screen\" category=\"graphics\" />\n      <div className=\"info\">\n        <h3>Struggling with this exercise?</h3>\n        <p>Get some help from our awesome {track.title} mentors.</p>\n        <div className=\"options\">\n          <a href={links.requestMentoring} className=\"btn-primary btn-s\">\n            Submit for Code Review\n          </a>\n          <a\n            href={links.mentoringInfo}\n            className=\"more-info\"\n            target=\"_blank\"\n            rel=\"noreferrer\"\n          >\n            What is Mentoring?\n            <Icon icon=\"external-link\" alt=\"Opens in a new tab\" />\n          </a>\n        </div>\n      </div>\n    </section>\n  )\n}\n\nconst MentoringRequestedNudge = ({\n  links,\n  className = '',\n}: {\n  links: {\n    mentoringInfo: string\n    pendingMentorRequest: string\n  }\n  className?: string\n}) => {\n  const classNames = ['mentoring-request-nudge', className].filter(\n    (className) => className.length > 0\n  )\n\n  return (\n    <section className={classNames.join(' ')}>\n      <div className=\"info\">\n        <h3>You&apos;ve requested mentoring</h3>\n        <p>Waiting on a mentor...</p>\n      </div>\n      <a href={links.pendingMentorRequest} className=\"btn-primary btn-s\">\n        Open request\n      </a>\n    </section>\n  )\n}\n\nconst InProgressMentoringNudge = ({\n  discussion,\n  className = '',\n}: {\n  discussion: MentorDiscussion\n  className?: string\n}) => {\n  const classNames = [\n    'mentoring-discussion-nudge',\n    'c-mentor-discussion-widget',\n    className,\n  ].filter((className) => className.length > 0)\n\n  return (\n    <section className={classNames.join(' ')}>\n      <Avatar\n        src={discussion.student.avatarUrl}\n        handle={discussion.student.handle}\n        className=\"student-avatar\"\n      />\n      <Avatar\n        src={discussion.mentor.avatarUrl}\n        handle={discussion.mentor.handle}\n        className=\"mentor-avatar\"\n      />\n\n      <div className=\"info\">\n        <h3 className=\"flex\">\n          You&apos;re being mentored by&nbsp;\n          <strong>\n            {\n              <HandleWithFlair\n                handle={discussion.mentor.handle}\n                flair={discussion.mentor.flair}\n                size=\"large\"\n              />\n            }\n          </strong>\n        </h3>\n        <div className=\"details\">\n          {discussion.status === 'awaiting_student' ? (\n            <div className=\"--turn\">Your turn to respond</div>\n          ) : null}\n          <div className=\"--comments\">\n            <GraphicalIcon icon=\"comment\" />\n            {discussion.postsCount}{' '}\n            {pluralize('comments', discussion.postsCount)}\n          </div>\n        </div>\n      </div>\n      <a href={discussion.links.self} className=\"btn-primary btn-s\">\n        Open discussion\n      </a>\n    </section>\n  )\n}\n", "import React from 'react'\nimport { MentoringDropdown } from './MentoringDropdown'\nimport { MentorDiscussion, SolutionMentoringStatus } from '../types'\nimport {\n  ComboButton,\n  PrimarySegment,\n  DropdownSegment,\n} from '../common/ComboButton'\n\ntype Links = {\n  requestMentoring: string\n  shareMentoring: string\n  pendingMentorRequest: string\n  inProgressDiscussion?: string\n}\n\nexport const MentoringComboButton = ({\n  mentoringStatus,\n  discussions,\n  className = '',\n  links,\n}: {\n  mentoringStatus: SolutionMentoringStatus\n  discussions: readonly MentorDiscussion[]\n  className?: string\n  links: Links\n}): JSX.Element => {\n  return (\n    <ComboButton className={className}>\n      <PrimarySegment>\n        {mentoringStatus === 'in_progress' && links.inProgressDiscussion ? (\n          <a href={links.inProgressDiscussion}>Continue code review</a>\n        ) : mentoringStatus === 'requested' ? (\n          <a href={links.pendingMentorRequest}>View request</a>\n        ) : (\n          <a href={links.requestMentoring}>Submit for Code Review</a>\n        )}\n      </PrimarySegment>\n      <DropdownSegment>\n        <MentoringDropdown\n          mentoringStatus={mentoringStatus}\n          discussions={discussions}\n          links={{ share: links.shareMentoring }}\n        />\n      </DropdownSegment>\n    </ComboButton>\n  )\n}\n", "import consumer from '../utils/action-cable-consumer'\nimport { IterationStatus } from '../components/types'\n\nexport type ChannelResponse = {\n  status: IterationStatus\n}\n\nexport class LatestIterationStatusChannel {\n  subscription: ActionCable.Channel\n\n  constructor(uuid: string, onReceive: (response: ChannelResponse) => void) {\n    this.subscription = consumer.subscriptions.create(\n      {\n        channel: 'LatestIterationStatusChannel',\n        uuid: uuid,\n      },\n      {\n        received: (response: ChannelResponse) => {\n          onReceive(response)\n        },\n      }\n    )\n  }\n\n  disconnect() {\n    this.subscription.unsubscribe()\n  }\n}\n", "import React, { useEffect, useState } from 'react'\nimport { Header } from './solution-summary/Header'\nimport { IterationLink } from './solution-summary/IterationLink'\nimport { CommunitySolutions } from './solution-summary/CommunitySolutions'\nimport { Mentoring } from './solution-summary/Mentoring'\nimport { Loading, ProminentLink } from '../common'\nimport { SolutionChannel } from '../../channels/solutionChannel'\nimport { usePaginatedRequestQuery } from '../../hooks/request-query'\nimport { useQueryCache } from 'react-query'\nimport {\n  Iteration,\n  MentorDiscussion,\n  SolutionForStudent,\n  ExerciseType,\n  IterationStatus,\n} from '../types'\n\nexport type SolutionSummaryLinks = {\n  testsPassLocallyArticle: string\n  allIterations: string\n  communitySolutions: string\n  learnMoreAboutMentoringArticle: string\n  mentoringInfo: string\n  completeExercise: string\n  shareMentoring: string\n  requestMentoring: string\n  pendingMentorRequest: string\n  inProgressDiscussion?: string\n}\n\nexport type SolutionSummaryRequest = {\n  endpoint: string\n  options: {\n    initialData: {\n      iterations: readonly Iteration[]\n    }\n  }\n}\n\nexport type Track = {\n  title: string\n  medianWaitTime?: number\n}\n\nexport type Exercise = {\n  title: string\n  type: ExerciseType\n}\n\nconst REFETCH_INTERVAL = 2000\n\nexport const SolutionSummary = ({\n  solution,\n  track,\n  discussions,\n  request,\n  exercise,\n  links,\n}: {\n  solution: SolutionForStudent\n  track: Track\n  discussions: readonly MentorDiscussion[]\n  request: SolutionSummaryRequest\n  exercise: Exercise\n  links: SolutionSummaryLinks\n}): JSX.Element | null => {\n  const queryCache = useQueryCache()\n  const CACHE_KEY = `solution-${solution.uuid}-summary`\n  const [queryEnabled, setQueryEnabled] = useState(true)\n  const { resolvedData } = usePaginatedRequestQuery<{\n    iterations: Iteration[]\n  }>(CACHE_KEY, {\n    ...request,\n    options: {\n      ...request.options,\n      refetchInterval: queryEnabled ? REFETCH_INTERVAL : false,\n    },\n  })\n\n  useEffect(() => {\n    const solutionChannel = new SolutionChannel(\n      { uuid: solution.uuid },\n      (response) => {\n        queryCache.setQueryData(CACHE_KEY, response)\n      }\n    )\n\n    return () => {\n      solutionChannel.disconnect()\n    }\n  }, [CACHE_KEY, solution, queryCache])\n\n  const latestIteration =\n    resolvedData?.iterations[resolvedData?.iterations.length - 1]\n\n  useEffect(() => {\n    if (!latestIteration) {\n      return\n    }\n\n    switch (latestIteration.status) {\n      case IterationStatus.DELETED:\n      case IterationStatus.UNTESTED:\n      case IterationStatus.TESTING:\n      case IterationStatus.ANALYZING:\n        setQueryEnabled(true)\n        break\n      default:\n        setQueryEnabled(false)\n        break\n    }\n  }, [latestIteration])\n\n  if (status === 'loading') {\n    return <Loading />\n  }\n\n  if (!resolvedData) {\n    return null\n  }\n\n  return (\n    <>\n      {latestIteration ? (\n        <section className=\"latest-iteration\">\n          <Header\n            iteration={latestIteration}\n            exercise={exercise}\n            links={links}\n          />\n          <IterationLink iteration={latestIteration} />\n          <ProminentLink\n            link={links.allIterations}\n            text=\"See all of your iterations\"\n          />\n          <div className=\"next-steps\">\n            <CommunitySolutions\n              link={links.communitySolutions}\n              isTutorial={exercise.type === 'tutorial'}\n            />\n            <Mentoring\n              mentoringStatus={solution.mentoringStatus}\n              discussions={discussions}\n              links={links}\n              isTutorial={exercise.type === 'tutorial'}\n              trackTitle={track.title}\n            />\n          </div>\n        </section>\n      ) : null}\n    </>\n  )\n}\n", "import React from 'react'\nimport { GraphicalIcon, Icon } from '../../common'\nimport { Iteration, IterationStatus } from '../../types'\nimport { Exercise } from '../SolutionSummary'\nimport pluralize from 'pluralize'\nimport { toSentence } from '../../../utils/toSentence'\n\nexport type SolutionSummaryLinks = {\n  testsPassLocallyArticle: string\n}\n\nconst TutorialHeader = ({ exercise }: { exercise: Exercise }) => {\n  return (\n    <header>\n      <div className=\"info\">\n        <h2>Your solution looks good!</h2>\n        <p>\n          <strong>Good job.</strong> Your solution to &quot;{exercise.title}\n          !&quot; has passed all the tests \uD83D\uDE0A\n        </p>\n      </div>\n      <div className=\"status passed\">Tests Passed</div>\n    </header>\n  )\n}\n\nexport const Header = ({\n  iteration,\n  exercise,\n  links,\n}: {\n  iteration: Iteration\n  exercise: Exercise\n  links: SolutionSummaryLinks\n}): JSX.Element => {\n  switch (iteration.status) {\n    case IterationStatus.DELETED:\n    case IterationStatus.UNTESTED:\n      return <></>\n    case IterationStatus.TESTING:\n    case IterationStatus.ANALYZING:\n      return (\n        <header>\n          <div className=\"info\">\n            <h2>Your solution is being processed\u2026</h2>\n            <p>\n              Your solution is currently being tested, analysed, and compared to\n              other solutions to find potential improvements. This should only\n              take a few seconds.\n            </p>\n          </div>\n          <GraphicalIcon icon=\"spinner\" className=\"spinner\" />\n        </header>\n      )\n    case IterationStatus.TESTS_FAILED:\n      return (\n        <header>\n          <div className=\"info\">\n            <h2>Your solution failed the tests.</h2>\n            <p>\n              Hmmm, it looks like your solution isn&apos;t working. Please check\n              that the tests pass locally on your machine. If they do pass for\n              you, please read{' '}\n              <a\n                href={links.testsPassLocallyArticle}\n                rel=\"noreferrer\"\n                target=\"_blank\"\n              >\n                this article{' '}\n                <Icon icon=\"external-link\" alt=\"Opens in a new tab\" />\n              </a>\n            </p>\n          </div>\n          <div className=\"status failed\">Tests Failed</div>\n        </header>\n      )\n    case IterationStatus.ESSENTIAL_AUTOMATED_FEEDBACK: {\n      if (exercise.type === 'tutorial') {\n        return <TutorialHeader exercise={exercise} />\n      }\n\n      const comments = [\n        `${iteration.numEssentialAutomatedComments} essential ${pluralize(\n          'improvement',\n          iteration.numEssentialAutomatedComments\n        )}`,\n        iteration.numActionableAutomatedComments > 0\n          ? `${iteration.numActionableAutomatedComments} ${pluralize(\n              'recommendation',\n              iteration.numActionableAutomatedComments\n            )}`\n          : '',\n        iteration.numNonActionableAutomatedComments > 0\n          ? `${\n              iteration.numNonActionableAutomatedComments\n            } additional ${pluralize(\n              'comment',\n              iteration.numNonActionableAutomatedComments\n            )}`\n          : '',\n      ].filter((comment) => comment.length > 0)\n\n      return (\n        <header>\n          <div className=\"info\">\n            <h2>Your solution worked, but you can take it further\u2026</h2>\n            <p>\n              We\u2019ve analysed your solution and have {toSentence(comments)}.\n              Address the essential improvements before proceeding.\n            </p>\n          </div>\n          <div className=\"status passed\">Tests Passed</div>\n        </header>\n      )\n    }\n    case IterationStatus.NO_AUTOMATED_FEEDBACK:\n      if (exercise.type === 'tutorial') {\n        return <TutorialHeader exercise={exercise} />\n      }\n\n      return (\n        <header>\n          <div className=\"info\">\n            <h2>Your solution looks great!</h2>\n            <p>\n              Your solution passed the tests and we don&apos;t have any\n              recommendations.{' '}\n              {exercise.type === 'practice'\n                ? 'You might want to work with a mentor to make it even better.'\n                : null}{' '}\n              <strong>Great Job! \uD83C\uDF89</strong>\n            </p>\n          </div>\n          <div className=\"status passed\">Tests Passed</div>\n        </header>\n      )\n    case IterationStatus.NON_ACTIONABLE_AUTOMATED_FEEDBACK:\n      if (exercise.type === 'tutorial') {\n        return <TutorialHeader exercise={exercise} />\n      }\n\n      return (\n        <header>\n          <div className=\"info\">\n            <h2>Your solution looks great!</h2>\n            <p>\n              We\u2019ve analysed your solution and not found anything that needs\n              changing. We do have{' '}\n              <span className=\"non-actionable\">\n                {iteration.numNonActionableAutomatedComments} additional{' '}\n                {pluralize(\n                  'comment',\n                  iteration.numNonActionableAutomatedComments\n                )}\n              </span>{' '}\n              that you might like to check.{' '}\n              {exercise.type === 'practice'\n                ? 'Consider working with a mentor to make it even better. '\n                : ' '}\n              <strong>Great Job! \uD83C\uDF89</strong>\n            </p>\n          </div>\n          <div className=\"status passed\">Tests Passed</div>\n        </header>\n      )\n    case IterationStatus.ACTIONABLE_AUTOMATED_FEEDBACK: {\n      if (exercise.type === 'tutorial') {\n        return <TutorialHeader exercise={exercise} />\n      }\n\n      const comments = [\n        `${iteration.numActionableAutomatedComments} ${pluralize(\n          'recommendation',\n          iteration.numActionableAutomatedComments\n        )}`,\n        iteration.numNonActionableAutomatedComments > 0\n          ? `${\n              iteration.numNonActionableAutomatedComments\n            } additional ${pluralize(\n              'comment',\n              iteration.numNonActionableAutomatedComments\n            )}`\n          : '',\n      ].filter((comment) => comment.length > 0)\n\n      switch (exercise.type) {\n        case 'concept':\n          return (\n            <header>\n              <div className=\"info\">\n                <h2>Your solution is good enough to continue!</h2>\n                <p>\n                  We\u2019ve analysed your solution and have {toSentence(comments)}.\n                  You can either continue or address the{' '}\n                  {pluralize(\n                    'recommendation',\n                    iteration.numActionableAutomatedComments\n                  )}{' '}\n                  first - your choice!\n                </p>\n              </div>\n              <div className=\"status passed\">Tests Passed</div>\n            </header>\n          )\n        case 'practice':\n          return (\n            <header>\n              <div className=\"info\">\n                <h2>Your solution worked, but you can take it further\u2026</h2>\n                <p>\n                  We\u2019ve analysed your solution and have {toSentence(comments)}.\n                  We suggest addressing the{' '}\n                  {pluralize(\n                    'recommendation',\n                    iteration.numActionableAutomatedComments\n                  )}{' '}\n                  before proceeding.\n                </p>\n              </div>\n              <div className=\"status passed\">Tests Passed</div>\n            </header>\n          )\n      }\n    }\n  }\n}\n", "export function toSentence(arr: string[]): string {\n  if (arr.length === 0) {\n    return ''\n  }\n  if (arr.length === 1) {\n    return arr[0]\n  }\n\n  const last = arr.pop()\n\n  return `${arr.join(', ')} and ${last}`\n}\n", "import React from 'react'\nimport { GraphicalIcon } from '../../common'\nimport { IterationSummary } from '../../track/IterationSummary'\nimport { Iteration } from '../../types'\n\nexport const IterationLink = ({\n  iteration,\n}: {\n  iteration: Iteration\n}): JSX.Element => {\n  return (\n    <a className=\"iteration\" href={iteration.links.self}>\n      <IterationSummary\n        iteration={iteration}\n        showSubmissionMethod={true}\n        showTestsStatusAsButton={false}\n        showFeedbackIndicator={true}\n      />\n\n      <GraphicalIcon icon=\"chevron-right\" className=\"action-icon\" />\n    </a>\n  )\n}\n", "import React from 'react'\nimport { GraphicalIcon } from '../../common'\n\nexport const CommunitySolutions = ({\n  link,\n  isTutorial,\n}: {\n  link: string\n  isTutorial: boolean\n}): JSX.Element => {\n  return (\n    <div className=\"community-solutions\">\n      <GraphicalIcon\n        icon=\"community-solutions\"\n        category=\"graphics\"\n        className=\"header-icon\"\n      />\n      <h3>Learn from others&apos; solutions</h3>\n      {isTutorial ? (\n        <p>\n          This is where we\u2019d usually link you to other peoples\u2019 solutions to the\n          same exercise.\n        </p>\n      ) : (\n        <>\n          <p>\n            Explore their approaches to learn new tips and tricks. Discover\n            popular solutions to this exercise.\n          </p>\n          <a href={link} className=\"btn-small-discourage\">\n            View community solutions\n          </a>\n        </>\n      )}\n    </div>\n  )\n}\n", "import React from 'react'\nimport { GraphicalIcon, Icon } from '../../common'\nimport { MentorDiscussion, SolutionMentoringStatus } from '../../types'\nimport { MentoringComboButton } from '../MentoringComboButton'\n\ntype Links = {\n  learnMoreAboutMentoringArticle: string\n  shareMentoring: string\n  requestMentoring: string\n  pendingMentorRequest: string\n  inProgressDiscussion?: string\n}\n\nexport const Mentoring = ({\n  mentoringStatus,\n  discussions,\n  links,\n  isTutorial,\n  trackTitle,\n}: {\n  mentoringStatus: SolutionMentoringStatus\n  discussions: readonly MentorDiscussion[]\n  links: Links\n  isTutorial: boolean\n  trackTitle: string\n}): JSX.Element => {\n  return (\n    <div className=\"mentoring\">\n      <GraphicalIcon\n        icon=\"mentoring-screen\"\n        className=\"header-icon\"\n        category=\"graphics\"\n      />\n      <h3>Get mentored by a human</h3>\n      {isTutorial ? (\n        <p>\n          You also get the opportunity to be mentored by {trackTitle} experts.\n        </p>\n      ) : (\n        <>\n          <p>\n            On average, students iterate a further 3.5 times when mentored on a\n            solution.\n          </p>\n          <MentoringComboButton\n            mentoringStatus={mentoringStatus}\n            discussions={discussions}\n            links={links}\n          />\n          <a href={links.learnMoreAboutMentoringArticle} className=\"learn-more\">\n            Learn more\n            <Icon icon=\"external-link\" alt=\"Opens in new tab\" />\n          </a>\n        </>\n      )}\n    </div>\n  )\n}\n", "import React, { useCallback, useState } from 'react'\n\nimport { CloseButton } from '../mentoring/session/CloseButton'\nimport { IterationView } from './mentoring-session/IterationView'\nimport { useIterationScrolling } from '../mentoring/session/useIterationScrolling'\nimport { SessionInfo } from './mentoring-session/SessionInfo'\nimport { DiscussionInfo } from './mentoring-session/DiscussionInfo'\nimport { DiscussionActions } from './mentoring-session/DiscussionActions'\n\nimport { useDiscussionIterations } from '../mentoring/discussion/use-discussion-iterations'\n\nimport {\n  Iteration,\n  MentorDiscussion,\n  MentorSessionRequest as Request,\n  MentorSessionTrack as Track,\n  MentorSessionExercise as Exercise,\n} from '../types'\nimport { MentoringRequest } from './mentoring-session/MentoringRequest'\nimport { SplitPane } from '../common'\nimport { Flair } from '../common/HandleWithFlair'\n\nexport type Links = {\n  exercise: string\n  learnMoreAboutPrivateMentoring: string\n  privateMentoring: string\n  mentoringGuide: string\n  createMentorRequest: string\n}\n\nexport type Video = {\n  url: string\n  thumb: string\n  title: string\n  date: string\n}\n\nexport type Mentor = {\n  id: number\n  avatarUrl: string\n  name: string\n  bio: string\n  handle: string\n  flair: Flair\n  reputation: number\n  numDiscussions: number\n}\n\nexport const MentoringSession = ({\n  userHandle,\n  discussion,\n  mentor,\n  iterations: initialIterations,\n  exercise,\n  trackObjectives,\n  videos,\n  track,\n  request: initialRequest,\n  links,\n  outOfDate,\n}: {\n  userHandle: string\n  discussion?: MentorDiscussion\n  mentor?: Mentor\n  iterations: readonly Iteration[]\n  exercise: Exercise\n  trackObjectives: string\n  videos: Video[]\n  track: Track\n  request?: Request\n  links: Links\n  outOfDate: boolean\n}): JSX.Element => {\n  const [mentorRequest, setMentorRequest] = useState(initialRequest)\n\n  const handleCreateMentorRequest = useCallback((mentorRequest) => {\n    setMentorRequest(mentorRequest)\n  }, [])\n\n  const { iterations, status } = useDiscussionIterations({\n    discussion: discussion,\n    iterations: initialIterations,\n  })\n\n  const [isLinked, setIsLinked] = useState(false)\n  const { currentIteration, handleIterationClick, handleIterationScroll } =\n    useIterationScrolling({\n      iterations: iterations,\n      on: isLinked,\n    })\n\n  return (\n    <div className=\"c-mentor-discussion\">\n      <SplitPane\n        id=\"mentoring-session\"\n        defaultLeftWidth=\"90%\"\n        leftMinWidth={550}\n        rightMinWidth={625}\n        left={\n          <>\n            <header className=\"discussion-header\">\n              <CloseButton url={links.exercise} />\n              <SessionInfo track={track} exercise={exercise} mentor={mentor} />\n              {discussion ? (\n                <DiscussionActions\n                  discussion={discussion}\n                  links={{ exercise: exercise.links.self }}\n                />\n              ) : null}\n            </header>\n            <IterationView\n              iterations={iterations}\n              currentIteration={currentIteration}\n              onClick={handleIterationClick}\n              language={track.highlightjsLanguage}\n              indentSize={track.indentSize}\n              isOutOfDate={outOfDate}\n              isLinked={isLinked}\n              setIsLinked={setIsLinked}\n              discussion={discussion}\n            />\n          </>\n        }\n        right={\n          <>\n            {discussion && mentor ? (\n              <DiscussionInfo\n                discussion={discussion}\n                mentor={mentor}\n                userHandle={userHandle}\n                iterations={iterations}\n                onIterationScroll={handleIterationScroll}\n                links={{ exercise: exercise.links.self }}\n                status={status}\n              />\n            ) : (\n              <MentoringRequest\n                trackObjectives={trackObjectives}\n                track={track}\n                exercise={exercise}\n                request={mentorRequest}\n                latestIteration={iterations[iterations.length - 1]}\n                videos={videos}\n                links={links}\n                onCreate={handleCreateMentorRequest}\n              />\n            )}\n          </>\n        }\n      />\n    </div>\n  )\n}\n", "import React from 'react'\nimport {\n  Iteration,\n  IterationStatus,\n  MentorDiscussion,\n  TestFile,\n} from '../../types'\nimport { IterationsList } from '../../mentoring/session/IterationsList'\nimport { FilePanel } from '../../mentoring/session/FilePanel'\nimport { IterationHeader } from './iteration-view/IterationHeader'\nimport { usePaginatedRequestQuery } from '../../../hooks/request-query'\nimport { FetchingBoundary } from '../../FetchingBoundary'\nimport { File } from '../../types'\nimport { ResultsZone } from '../../ResultsZone'\nimport { LinkButton } from '../../mentoring/session/LinkButton'\n\nconst DEFAULT_ERROR = new Error('Unable to load files')\n\nexport const IterationView = ({\n  iterations,\n  instructions,\n  testFiles,\n  currentIteration,\n  onClick,\n  language,\n  indentSize,\n  isOutOfDate,\n  isLinked,\n  setIsLinked,\n  discussion,\n}: {\n  iterations: readonly Iteration[]\n  instructions?: string\n  testFiles?: readonly TestFile[]\n  currentIteration: Iteration\n  onClick: (iteration: Iteration) => void\n  language: string\n  indentSize: number\n  isOutOfDate: boolean\n  isLinked: boolean\n  setIsLinked: (linked: boolean) => void\n  discussion?: MentorDiscussion\n}): JSX.Element => {\n  /* TODO: (required) Don't do this if currentIteration.links.files is null */\n  const { resolvedData, error, status, isFetching } = usePaginatedRequestQuery<{\n    files: File[]\n  }>(currentIteration.links.files, {\n    endpoint: currentIteration.links.files,\n    options: {},\n  })\n\n  return (\n    <React.Fragment>\n      <IterationHeader iteration={currentIteration} isOutOfDate={isOutOfDate} />\n\n      {currentIteration.status == IterationStatus.DELETED ? (\n        <div className=\"deleted\">This iteration has been deleted</div>\n      ) : (\n        <ResultsZone isFetching={isFetching}>\n          <FetchingBoundary\n            error={error}\n            status={status}\n            defaultError={DEFAULT_ERROR}\n          >\n            {resolvedData ? (\n              <FilePanel\n                files={resolvedData.files}\n                language={language}\n                indentSize={indentSize}\n                instructions={instructions}\n                testFiles={testFiles}\n              />\n            ) : null}\n          </FetchingBoundary>\n        </ResultsZone>\n      )}\n      {iterations.length > 1 ? (\n        <footer className=\"c-iterations-footer\">\n          <IterationsList\n            iterations={iterations}\n            onClick={onClick}\n            current={currentIteration}\n          />\n          {discussion ? (\n            <LinkButton value={isLinked} setValue={setIsLinked} />\n          ) : null}\n        </footer>\n      ) : null}\n    </React.Fragment>\n  )\n}\n", "import React from 'react'\nimport { Iteration } from '../../../types'\nimport {\n  IterationSummaryWithWebsockets,\n  IterationSummary,\n} from '../../../track/IterationSummary'\nimport { GenericTooltip } from '../../../misc/ExercismTippy'\n\nexport type Props = {\n  iteration: Iteration\n  isOutOfDate: boolean\n}\n\nexport const IterationHeader = ({\n  iteration,\n  isOutOfDate,\n}: Props): JSX.Element => {\n  return (\n    <header className=\"iteration-header\">\n      <IterationSummaryWithWebsockets\n        iteration={iteration}\n        showSubmissionMethod={false}\n        OutOfDateNotice={isOutOfDate ? <OutOfDateNotice /> : null}\n        showTestsStatusAsButton={true}\n        showFeedbackIndicator={false}\n      />\n    </header>\n  )\n}\n\nconst OutOfDateNotice = () => {\n  return (\n    <GenericTooltip\n      content={`\n        This exercise has been updated since this iteration was submitted.\n        You can update to the latest version by clicking on the yellow bar at the top of the main exercise page.`}\n    >\n      <div>\n        <IterationSummary.OutOfDateNotice />\n      </div>\n    </GenericTooltip>\n  )\n}\n", "import React from 'react'\nimport { TrackIcon, ExerciseIcon, HandleWithFlair } from '@/components/common'\nimport { Mentor } from '../MentoringSession'\nimport type {\n  MentorSessionTrack as Track,\n  MentorSessionExercise as Exercise,\n} from '@/components/types'\n\nexport const SessionInfo = ({\n  mentor,\n  track,\n  exercise,\n}: {\n  mentor?: Mentor\n  track: Track\n  exercise: Exercise\n}): JSX.Element => {\n  return (\n    <>\n      <TrackIcon title={track.title} iconUrl={track.iconUrl} />\n      <ExerciseIcon iconUrl={exercise.iconUrl} />\n      <div className=\"info-for-student\">\n        {mentor ? (\n          <React.Fragment>\n            <div className=\"flex items-center\">\n              You&apos;re being mentored by&nbsp;\n              <strong className=\"flex\">\n                {\n                  <HandleWithFlair\n                    handle={mentor.handle}\n                    flair={mentor.flair}\n                    size=\"small\"\n                  />\n                }\n                &nbsp;\n              </strong>\n              on\n            </div>{' '}\n            <div className=\"exercise-title\">{exercise.title}</div>\n          </React.Fragment>\n        ) : (\n          <React.Fragment>\n            Get mentoring on\n            <div className=\"exercise-title\">{exercise.title}</div>\n          </React.Fragment>\n        )}\n      </div>\n    </>\n  )\n}\n", "import React from 'react'\nimport { DiscussionPostList } from '../../mentoring/discussion/DiscussionPostList'\nimport { AddDiscussionPost } from '../../mentoring/discussion/AddDiscussionPost'\nimport { NewMessageAlert } from '../../mentoring/discussion/NewMessageAlert'\nimport { PostsWrapper } from '../../mentoring/discussion/PostsContext'\nimport { MentorInfo } from './MentorInfo'\nimport { MentorDiscussion, Iteration } from '../../types'\nimport { Mentor } from '../MentoringSession'\nimport { GraphicalIcon } from '../../common'\nimport { FinishButton } from './FinishButton'\nimport { QueryStatus } from 'react-query'\n\ntype Links = {\n  exercise: string\n}\n\nexport const DiscussionInfo = ({\n  discussion,\n  mentor,\n  userHandle,\n  iterations,\n  onIterationScroll,\n  links,\n  status,\n}: {\n  discussion: MentorDiscussion\n  mentor: Mentor\n  userHandle: string\n  iterations: readonly Iteration[]\n  onIterationScroll: (iteration: Iteration) => void\n  links: Links\n  status: QueryStatus\n}): JSX.Element => {\n  return (\n    <PostsWrapper discussion={discussion}>\n      <div id=\"panel-discussion\">\n        <MentorInfo mentor={mentor} />\n        <div className=\"c-discussion-timeline\">\n          <DiscussionPostList\n            iterations={iterations}\n            userIsStudent={true}\n            discussionUuid={discussion.uuid}\n            userHandle={userHandle}\n            onIterationScroll={onIterationScroll}\n            status={status}\n          />\n          {discussion.status === 'mentor_finished' ? (\n            <div className=\"student-review timeline-entry\">\n              <GraphicalIcon\n                icon=\"completed-check-circle\"\n                className=\"timeline-marker\"\n              />\n              <div className=\"--details timeline-content\">\n                <h3>{mentor.handle} ended this discussion.</h3>\n                <p>\n                  <strong>\n                    It&apos;s time to review {mentor.handle}&apos;s mentoring\n                  </strong>\n                  You&apos;ll be able to leave feedback and share what you\n                  thought of your experience.\n                </p>\n                <FinishButton\n                  discussion={discussion}\n                  links={links}\n                  className=\"btn-primary btn-s\"\n                >\n                  Review &amp; finish discussion\n                </FinishButton>\n              </div>\n            </div>\n          ) : null}\n        </div>\n      </div>\n      <section className=\"comment-section --comment\">\n        <NewMessageAlert />\n        <AddDiscussionPost discussion={discussion} />\n      </section>\n    </PostsWrapper>\n  )\n}\n", "import React from 'react'\nimport { Avatar, HandleWithFlair, Reputation } from '@/components/common'\nimport { Mentor } from '../MentoringSession'\n\nexport const MentorInfo = ({ mentor }: { mentor: Mentor }): JSX.Element => {\n  return (\n    <div className=\"mentor-info\">\n      <div className=\"info\">\n        <div className=\"subtitle\">Meet your mentor</div>\n        <div className=\"handle-block\">\n          <div className=\"handle\">\n            {\n              <HandleWithFlair\n                handle={mentor.handle}\n                flair={mentor.flair}\n                size=\"medium\"\n              />\n            }\n          </div>\n          <Reputation\n            value={mentor.reputation.toString()}\n            type=\"primary\"\n            size=\"small\"\n          />\n        </div>\n        <div className=\"name\">{mentor.name}</div>\n        <div className=\"bio\">{mentor.bio}</div>\n        {/* TODO: (required) View previous sessions as a student */}\n      </div>\n      <Avatar src={mentor.avatarUrl} handle={mentor.handle} />\n    </div>\n  )\n}\n", "import React, { useState, useEffect } from 'react'\nimport { FinishMentorDiscussionModal } from '../../modals/student/FinishMentorDiscussionModal'\nimport { ConfirmFinishMentorDiscussionModal } from '../../modals/student/ConfirmFinishMentorDiscussionModal'\nimport { MentorDiscussion } from '../../types'\nimport Mousetrap from 'mousetrap'\n\ntype Links = {\n  exercise: string\n}\n\ntype Status = 'initialized' | 'confirming' | 'finishing'\n\nexport const FinishButton = ({\n  discussion,\n  className,\n  children,\n  links,\n}: React.PropsWithChildren<{\n  className: string\n  discussion: MentorDiscussion\n  links: Links\n}>): JSX.Element => {\n  const [status, setStatus] = useState<Status>('initialized')\n\n  return (\n    <React.Fragment>\n      <button\n        type=\"button\"\n        className={className}\n        onClick={() => {\n          setStatus('confirming')\n        }}\n      >\n        {children}\n      </button>\n      <ConfirmFinishMentorDiscussionModal\n        open={status === 'confirming'}\n        onConfirm={() => {\n          setStatus('finishing')\n        }}\n        onCancel={() => {\n          setStatus('initialized')\n        }}\n      />\n      <FinishMentorDiscussionModal\n        discussion={discussion}\n        links={links}\n        open={status === 'finishing'}\n        onClose={() => {\n          setStatus('initialized')\n        }}\n        onCancel={() => {\n          setStatus('initialized')\n        }}\n      />\n    </React.Fragment>\n  )\n}\n", "import React, { useState } from 'react'\nimport { MentorDiscussion } from '../../types'\nimport { Modal, ModalProps } from '../Modal'\nimport { RateMentorStep } from './finish-mentor-discussion-modal/RateMentorStep'\nimport { AddTestimonialStep } from './finish-mentor-discussion-modal/AddTestimonialStep'\nimport { CelebrationStep } from './finish-mentor-discussion-modal/CelebrationStep'\nimport { UnhappyStep } from './finish-mentor-discussion-modal/UnhappyStep'\nimport { RequeuedStep } from './finish-mentor-discussion-modal/RequeuedStep'\nimport { SatisfiedStep } from './finish-mentor-discussion-modal/SatisfiedStep'\nimport { ReportStep } from './finish-mentor-discussion-modal/ReportStep'\nimport { useMachine } from '@xstate/react'\nimport { Machine } from 'xstate'\nimport { redirectTo } from '../../../utils/redirect-to'\n\nexport type Links = {\n  exercise: string\n}\n\nexport type ReportReason = 'coc' | 'incorrect' | 'other'\n\nexport type MentorReport = {\n  requeue: boolean\n  report: boolean\n  reason: ReportReason\n}\n\nconst modalStepMachine = Machine({\n  id: 'modalStep',\n  initial: 'rateMentor',\n  states: {\n    rateMentor: {\n      on: {\n        HAPPY: 'addTestimonial',\n        SATISFIED: 'satisfied',\n        UNHAPPY: 'report',\n      },\n    },\n    satisfied: {\n      on: { REQUEUED: 'requeued', BACK: 'rateMentor' },\n    },\n    addTestimonial: {\n      on: { SUBMIT: 'celebration', BACK: 'rateMentor' },\n    },\n    celebration: {},\n    requeued: {},\n    report: {\n      on: { SUBMIT: 'unhappy', BACK: 'rateMentor' },\n    },\n    unhappy: {},\n  },\n})\n\nconst Inner = ({\n  discussion,\n  links,\n}: {\n  discussion: MentorDiscussion\n  links: Links\n}): JSX.Element => {\n  const [currentStep, send] = useMachine(modalStepMachine)\n  const [report, setReport] = useState<MentorReport | null>(null)\n\n  switch (currentStep.value) {\n    case 'rateMentor':\n      return (\n        <RateMentorStep\n          discussion={discussion}\n          onHappy={() => send('HAPPY')}\n          onSatisfied={() => send('SATISFIED')}\n          onUnhappy={() => send('UNHAPPY')}\n        />\n      )\n    case 'addTestimonial':\n      return (\n        <AddTestimonialStep\n          onSubmit={() => send('SUBMIT')}\n          onSkip={() => redirectTo(links.exercise)}\n          onBack={() => send('BACK')}\n          discussion={discussion}\n        />\n      )\n    case 'celebration':\n      return (\n        <CelebrationStep\n          mentorHandle={discussion.mentor.handle}\n          links={links}\n        />\n      )\n    case 'satisfied':\n      return (\n        <SatisfiedStep\n          discussion={discussion}\n          onRequeued={() => send('REQUEUED')}\n          onBack={() => send('BACK')}\n          onNotRequeued={() => {\n            redirectTo(links.exercise)\n          }}\n        />\n      )\n    case 'requeued':\n      return <RequeuedStep links={links} />\n    case 'report':\n      return (\n        <ReportStep\n          discussion={discussion}\n          onSubmit={(report) => {\n            setReport(report)\n            send('SUBMIT')\n          }}\n          onBack={() => send('BACK')}\n        />\n      )\n    case 'unhappy': {\n      if (!report) {\n        throw new Error('Report should not be null')\n      }\n\n      return <UnhappyStep report={report} links={links} />\n    }\n    default:\n      throw new Error('Unknown modal step')\n  }\n}\n\nexport const FinishMentorDiscussionModal = ({\n  links,\n  discussion,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  links: Links\n  discussion: MentorDiscussion\n  onCancel: () => void\n}): JSX.Element => {\n  return (\n    <Modal cover className=\"m-finish-student-mentor-discussion\" {...props}>\n      <Inner links={links} discussion={discussion} />\n    </Modal>\n  )\n}\n", "import React from 'react'\nimport { MentorDiscussion } from '../../../types'\nimport { Avatar, ExerciseIcon, GraphicalIcon } from '../../../common'\nimport { fromNow } from '../../../../utils/time'\n\nexport const RateMentorStep = ({\n  discussion,\n  onHappy,\n  onSatisfied,\n  onUnhappy,\n}: {\n  discussion: MentorDiscussion\n  onHappy: () => void\n  onSatisfied: () => void\n  onUnhappy: () => void\n}): JSX.Element => {\n  return (\n    <section className=\"rate-step\">\n      <h2>It&apos;s time to review this discussion</h2>\n      <div className=\"container\">\n        <div className=\"lhs\">\n          {discussion.finishedBy === 'mentor' &&\n          discussion.finishedAt !== undefined ? (\n            <div className=\"finished-info\">\n              <Avatar\n                src={discussion.mentor.avatarUrl}\n                handle={discussion.mentor.handle}\n              />\n              <div className=\"info\">\n                <div className=\"mentor\">\n                  {discussion.mentor.handle} has finished mentoring you on\n                </div>\n                <div className=\"exercise\">\n                  <ExerciseIcon iconUrl={discussion.exercise.iconUrl} />\n                  <strong>{discussion.exercise.title}</strong> in{' '}\n                  {discussion.track.title}\n                </div>\n              </div>\n              <time>{fromNow(discussion.finishedAt)}</time>\n            </div>\n          ) : null}\n          <p className=\"explanation\">\n            To help us and our mentors understand how well we're doing, we\u2019d\n            love some feedback on your discussion with{' '}\n            {discussion.mentor.handle}. Good mentors will answer your questions,\n            introduce you to new ideas, or encourage you to try new things.\n          </p>\n          <div className=\"buttons-section\">\n            <h3>How was your discussion with {discussion.mentor.handle}?</h3>\n            <div className=\"buttons\">\n              <button type=\"button\" onClick={onUnhappy} className=\"sad\">\n                <GraphicalIcon icon=\"sad-face\" />\n                Problematic\n              </button>\n              <button type=\"button\" onClick={onSatisfied} className=\"neutral\">\n                <GraphicalIcon icon=\"neutral-face\" />\n                Acceptable\n              </button>\n              <button type=\"button\" onClick={onHappy} className=\"happy\">\n                <GraphicalIcon icon=\"happy-face\" />\n                It was good!\n              </button>\n            </div>\n          </div>\n        </div>\n        <div className=\"rhs\">\n          <Avatar\n            src={discussion.mentor.avatarUrl}\n            handle={discussion.mentor.handle}\n          />\n        </div>\n      </div>\n    </section>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { MentorDiscussion } from '../../../types'\nimport { Avatar, GraphicalIcon } from '../../../common'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { FormButton } from '../../../common'\nimport { FetchingBoundary } from '../../../FetchingBoundary'\nimport { TestimonialField } from './TestimonialField'\n\nconst DEFAULT_ERROR = new Error('Unable to submit mentor rating')\n\nexport const AddTestimonialStep = ({\n  onSubmit,\n  onSkip,\n  onBack,\n  discussion,\n}: {\n  onSubmit: () => void\n  onSkip: () => void\n  onBack: () => void\n  discussion: MentorDiscussion\n}): JSX.Element => {\n  const [value, setValue] = useState('')\n  const [mutation, { status, error }] = useMutation(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: discussion.links.finish,\n        method: 'PATCH',\n        body: JSON.stringify({\n          rating: 5,\n          testimonial: value,\n        }),\n      })\n\n      return fetch\n    },\n    {\n      onSuccess: () => {\n        value.length === 0 ? onSkip() : onSubmit()\n      },\n    }\n  )\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n  const handleBack = useCallback(() => {\n    onBack()\n  }, [onBack])\n  const handleChange = useCallback((e) => {\n    setValue(e.target.value)\n  }, [])\n  const primaryButtonText = value.length === 0 ? 'Skip' : 'Finish'\n  const primaryButtonClass =\n    value.length === 0 ? 'btn-default btn-m' : 'btn-primary btn-m'\n\n  return (\n    <section className=\"testimonial-step\">\n      <h2>We're glad you had a good discussion!</h2>\n      <div className=\"container\">\n        <div className=\"lhs\">\n          <p className=\"explanation\">\n            Mentors volunteer their time for free. A nice testimonial is a great\n            way of thanking them, and encouraging them to continue helping\n            others.\n          </p>\n          <form data-turbo=\"false\" onSubmit={handleSubmit}>\n            <label htmlFor=\"testimonial\">\n              Leave {discussion.mentor.handle} a testimonial (optional)\n            </label>\n            <TestimonialField\n              id=\"testimonial\"\n              min={30}\n              max={160}\n              value={value}\n              onChange={handleChange}\n            />\n            {/*<p className=\"help\">\n              Testimonials are a place to write what impressed you about a\n              mentor.\n              <br />\n              Mentors can choose to display them on their profiles.\n            </p>*/}\n            <div className=\"form-buttons\">\n              <FormButton\n                type=\"button\"\n                onClick={handleBack}\n                status={status}\n                className=\"btn-default btn-m\"\n              >\n                <GraphicalIcon icon=\"arrow-left\" />\n                <span>Back</span>\n              </FormButton>\n\n              <FormButton\n                type=\"submit\"\n                status={status}\n                className={primaryButtonClass}\n              >\n                <span>{primaryButtonText}</span>\n              </FormButton>\n            </div>\n          </form>\n          <FetchingBoundary\n            status={status}\n            error={error}\n            defaultError={DEFAULT_ERROR}\n          />\n        </div>\n        <div className=\"rhs\">\n          <div className=\"avatar-wrapper\">\n            <Avatar\n              src={discussion.mentor.avatarUrl}\n              handle={discussion.mentor.handle}\n            />\n            {value.length !== 0 ? (\n              <GraphicalIcon icon=\"thumb-up-white-on-green\" />\n            ) : null}\n          </div>\n        </div>\n      </div>\n    </section>\n  )\n}\n", "import React, { ChangeEvent } from 'react'\n\nexport const TestimonialField = ({\n  id,\n  min,\n  max,\n  value,\n  onChange,\n}: {\n  id: string\n  min: number\n  max: number\n  value: string\n  onChange: (e: ChangeEvent) => void\n}): JSX.Element => {\n  return (\n    <>\n      <textarea\n        value={value}\n        onChange={onChange}\n        id={id}\n        placeholder=\"Write your testimonial here\"\n        minLength={min}\n        maxLength={max}\n      />\n      <div className=\"counter\">\n        <div>\n          {value.length} / {max}\n        </div>\n        <div>{min} minimum</div>\n      </div>\n    </>\n  )\n}\n", "import React from 'react'\nimport { GraphicalIcon } from '../../../common'\n\ntype Links = {\n  exercise: string\n}\n\n/* TODO: (required) Use correct gif */\nexport const CelebrationStep = ({\n  mentorHandle,\n  links,\n}: {\n  mentorHandle: string\n  links: Links\n}): JSX.Element => {\n  return (\n    <section className=\"celebrate-step neon-cat\">\n      <img\n        src=\"https://media.giphy.com/media/sIIhZliB2McAo/source.gif\"\n        className=\"gif\"\n      />\n      <h2>Thank you for leaving a testimonial \uD83D\uDC99</h2>\n      <p>\n        <strong>You\u2019ve helped make {mentorHandle}'s day.</strong>\n        Please be sure to share your experience of Exercism with others.\n      </p>\n      <a href={links.exercise} className=\"btn-primary btn-l\">\n        <span>Back to the exercise</span>\n        <GraphicalIcon icon=\"arrow-right\" />\n      </a>\n    </section>\n  )\n}\n", "import React from 'react'\nimport { MentorReport } from '../FinishMentorDiscussionModal'\n\ntype Links = {\n  exercise: string\n}\n\nexport const UnhappyStep = ({\n  report,\n  links,\n}: {\n  report: MentorReport\n  links: Links\n}): JSX.Element => {\n  return (\n    <section className=\"unhappy-final-step\">\n      {report.report ? (\n        <React.Fragment>\n          <h2>Thank you for your report</h2>\n          <p className=\"explanation\">\n            Thanks for letting us know. We will look into your report and get\n            back to you in the next few days. In the meantime we hope you have a\n            better next experience.\n          </p>\n        </React.Fragment>\n      ) : report.requeue ? (\n        <React.Fragment>\n          <h2>Your solution has been be requeued</h2>\n          <p className=\"explanation\">\n            Your solution has been put back in the queue and another mentor will\n            hopefully pick it up soon. We hope you have a positive mentoring\n            session on this solution next time!\n          </p>\n        </React.Fragment>\n      ) : (\n        <React.Fragment>\n          <h2>We hope you have a better next experience</h2>\n          <p className=\"explanation\">\n            Sorry this experience wasn't great. We hope the next one will be\n            better.\n          </p>\n        </React.Fragment>\n      )}\n\n      <div className=\"form-buttons\">\n        <a href={links.exercise} className=\"btn-primary btn-m\">\n          Go back to your solution\n        </a>\n      </div>\n    </section>\n  )\n}\n", "import React from 'react'\n\ntype Links = {\n  exercise: string\n}\n\nexport const RequeuedStep = ({ links }: { links: Links }): JSX.Element => {\n  return (\n    <section className=\"acceptable-final-step\">\n      <h2>Your solution has been requeued.</h2>\n      <p className=\"explanation\">\n        Your solution has been put back in the queue and another mentor will\n        hopefully pick it up soon. We hope you have a positive mentoring session\n        on this solution next time!\n      </p>\n\n      <div className=\"form-buttons\">\n        <a href={links.exercise} className=\"btn-primary btn-m\">\n          Go back to your solution\n        </a>\n      </div>\n    </section>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { FormButton } from '../../../common'\nimport { FetchingBoundary } from '../../../FetchingBoundary'\nimport { MentorDiscussion } from '../../../types'\n\nconst DEFAULT_ERROR = new Error('Unable to submit mentor rating')\n\nexport const SatisfiedStep = ({\n  discussion,\n  onRequeued,\n  onNotRequeued,\n  onBack,\n}: {\n  discussion: MentorDiscussion\n  onRequeued: () => void\n  onNotRequeued: () => void\n  onBack: () => void\n}): JSX.Element => {\n  const [finish, { status, error }] = useMutation(\n    (requeue: boolean) => {\n      const { fetch } = sendRequest({\n        endpoint: discussion.links.finish,\n        method: 'PATCH',\n        body: JSON.stringify({ rating: 3, requeue: requeue }),\n      })\n\n      return fetch\n    },\n    {\n      onSuccess: (data, requeue) => {\n        requeue ? onRequeued() : onNotRequeued()\n      },\n    }\n  )\n  const handleBack = useCallback(() => {\n    onBack()\n  }, [onBack])\n\n  return (\n    <section className=\"acceptable-decision-step\">\n      <h2>Sorry that this mentoring wasn't great.</h2>\n      <p className=\"explanation\">\n        Would you like to put this exercise back in the queue for another mentor\n        to look at?\n      </p>\n\n      <div className=\"form-buttons\">\n        <FormButton\n          type=\"button\"\n          onClick={handleBack}\n          status={status}\n          className=\"btn-default btn-m\"\n        >\n          Back\n        </FormButton>\n        <FormButton\n          type=\"button\"\n          onClick={() => finish(false)}\n          status={status}\n          className=\"btn-enhanced btn-m\"\n        >\n          No thanks\n        </FormButton>\n        <FormButton\n          type=\"button\"\n          onClick={() => finish(true)}\n          status={status}\n          className=\"btn-enhanced btn-m\"\n        >\n          Yes please\n        </FormButton>\n        <FetchingBoundary\n          status={status}\n          error={error}\n          defaultError={DEFAULT_ERROR}\n        />\n      </div>\n    </section>\n  )\n}\n", "import React, { useCallback, useState, useRef } from 'react'\nimport { MentorDiscussion } from '../../../types'\nimport { Avatar, GraphicalIcon } from '../../../common'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { FormButton } from '../../../common'\nimport { FetchingBoundary } from '../../../FetchingBoundary'\nimport { MentorReport } from '../FinishMentorDiscussionModal'\nimport { ReasonSelect } from './ReasonSelect'\n\nconst DEFAULT_ERROR = new Error('Unable to submit mentor rating')\n\nexport const ReportStep = ({\n  discussion,\n  onSubmit,\n  onBack,\n}: {\n  onSubmit: (report: MentorReport) => void\n  onBack: () => void\n  discussion: MentorDiscussion\n}): JSX.Element => {\n  const [state, setState] = useState<MentorReport>({\n    requeue: true,\n    report: false,\n    reason: 'coc',\n  })\n  const messageRef = useRef<HTMLTextAreaElement>(null)\n  const [mutation, { status, error }] = useMutation(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: discussion.links.finish,\n        method: 'PATCH',\n        body: JSON.stringify({\n          rating: 1,\n          requeue: state.requeue,\n          report: state.report,\n          report_reason: state.reason,\n          report_message: messageRef.current?.value,\n        }),\n      })\n\n      return fetch\n    },\n    {\n      onSuccess: () => {\n        onSubmit(state)\n      },\n    }\n  )\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n      mutation()\n    },\n    [mutation]\n  )\n\n  const handleBack = useCallback(() => {\n    onBack()\n  }, [onBack])\n\n  return (\n    <section className=\"report-step\">\n      <h2>How can we help?</h2>\n      <div className=\"container\">\n        <div className=\"lhs\">\n          <p className=\"explanation\">\n            We\u2019re really sorry that you experienced a problematic mentoring\n            discussion, and would like to help ensure your next experience is a\n            positive one.\n          </p>\n          <form data-turbo=\"false\" onSubmit={handleSubmit}>\n            <h3>How would you like to resolve the issue?</h3>\n\n            <label className=\"c-checkbox-wrapper\">\n              <input type=\"checkbox\" checked={true} disabled={true} />\n              <div className=\"row\">\n                <div className=\"c-checkbox\">\n                  <GraphicalIcon icon=\"checkmark\" />\n                </div>\n                Block further interactions with this mentor\n              </div>\n            </label>\n            <label htmlFor=\"requeue\" className=\"c-checkbox-wrapper\">\n              <input\n                type=\"checkbox\"\n                checked={state.requeue}\n                onChange={() => setState({ ...state, requeue: !state.requeue })}\n                id=\"requeue\"\n              />\n              <div className=\"row\">\n                <div className=\"c-checkbox\">\n                  <GraphicalIcon icon=\"checkmark\" />\n                </div>\n                Put your solution back in the queue for mentoring\n              </div>\n            </label>\n            <label htmlFor=\"report\" className=\"c-checkbox-wrapper\">\n              <input\n                type=\"checkbox\"\n                checked={state.report}\n                onChange={() => setState({ ...state, report: !state.report })}\n                id=\"report\"\n              />\n              <div className=\"row\">\n                <div className=\"c-checkbox\">\n                  <GraphicalIcon icon=\"checkmark\" />\n                </div>\n                Report this discussion to an admin\n              </div>\n            </label>\n\n            {state.report ? (\n              <div className=\"report\">\n                <div className=\"field\">\n                  <label htmlFor=\"reason\">\n                    Why are you reporting this conversation?\n                  </label>\n                  <ReasonSelect\n                    value={state.reason}\n                    setValue={(reason) =>\n                      setState({ ...state, reason: reason })\n                    }\n                  />\n                </div>\n\n                <div className=\"field\">\n                  <label htmlFor=\"message\">What went wrong?</label>\n                  <textarea\n                    required\n                    ref={messageRef}\n                    id=\"message\"\n                    placeholder=\"Please provide exactly why you are making this report, and tell us what happened.\"\n                  />\n                </div>\n                <div className=\"assurance\">\n                  Your report will be sent to our adminstrators who will\n                  investigate further\n                </div>\n              </div>\n            ) : null}\n\n            <div className=\"form-buttons\">\n              <FormButton\n                type=\"button\"\n                onClick={handleBack}\n                status={status}\n                className=\"btn-default btn-m\"\n              >\n                <GraphicalIcon icon=\"arrow-left\" />\n                <span>Back</span>\n              </FormButton>\n              <FormButton\n                status={status}\n                type=\"submit\"\n                className=\"btn-primary btn-m\"\n              >\n                Finish\n              </FormButton>\n            </div>\n          </form>\n          <FetchingBoundary\n            status={status}\n            error={error}\n            defaultError={DEFAULT_ERROR}\n          />\n        </div>\n        <div className=\"rhs\">\n          <Avatar\n            src={discussion.mentor.avatarUrl}\n            handle={discussion.mentor.handle}\n          />\n        </div>\n      </div>\n    </section>\n  )\n}\n", "import React from 'react'\nimport { SingleSelect } from '../../../common/SingleSelect'\nimport { ReportReason } from '../FinishMentorDiscussionModal'\n\nconst OptionComponent = ({ option: reason }: { option: ReportReason }) => {\n  switch (reason) {\n    case 'coc':\n      return <React.Fragment>Code of Conduct violation</React.Fragment>\n    case 'incorrect':\n      return <React.Fragment>Wrong or misleading information</React.Fragment>\n    case 'other':\n      return <React.Fragment>Other</React.Fragment>\n  }\n}\n\nexport const ReasonSelect = ({\n  value,\n  setValue,\n}: {\n  value: ReportReason\n  setValue: (value: ReportReason) => void\n}): JSX.Element => {\n  return (\n    <SingleSelect<ReportReason>\n      options={['coc', 'incorrect', 'other']}\n      value={value}\n      setValue={setValue}\n      SelectedComponent={OptionComponent}\n      OptionComponent={OptionComponent}\n    />\n  )\n}\n", "var __read = (this && this.__read) || function (o, n) {\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n    if (!m) return o;\n    var i = m.call(o), r, ar = [], e;\n    try {\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n    }\n    catch (error) { e = { error: error }; }\n    finally {\n        try {\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\n        }\n        finally { if (e) throw e.error; }\n    }\n    return ar;\n};\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nimport { useCallback, useState } from 'react';\nimport { State } from 'xstate';\nimport { ReactEffectType } from './types';\nimport { useInterpret } from './useInterpret';\nfunction createReactActionFunction(exec, tag) {\n    var effectExec = function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        // don't execute; just return\n        return function () {\n            return exec.apply(void 0, __spreadArray([], __read(args), false));\n        };\n    };\n    Object.defineProperties(effectExec, {\n        name: { value: \"effect:\".concat(exec.name) },\n        __effect: { value: tag }\n    });\n    return effectExec;\n}\nexport function asEffect(exec) {\n    return createReactActionFunction(exec, ReactEffectType.Effect);\n}\nexport function asLayoutEffect(exec) {\n    return createReactActionFunction(exec, ReactEffectType.LayoutEffect);\n}\nexport function useMachine(getMachine, options) {\n    if (options === void 0) { options = {}; }\n    var listener = useCallback(function (nextState) {\n        // Only change the current state if:\n        // - the incoming state is the \"live\" initial state (since it might have new actors)\n        // - OR the incoming state actually changed.\n        //\n        // The \"live\" initial state will have .changed === undefined.\n        var initialStateChanged = nextState.changed === undefined &&\n            Object.keys(nextState.children).length;\n        if (nextState.changed || initialStateChanged) {\n            setState(nextState);\n        }\n    }, []);\n    var service = useInterpret(getMachine, options, listener);\n    var _a = __read(useState(function () {\n        var initialState = service.machine.initialState;\n        return (options.state\n            ? State.create(options.state)\n            : initialState);\n    }), 2), state = _a[0], setState = _a[1];\n    return [state, service.send, service];\n}\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nvar __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\n\r\nfunction __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nfunction __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nfunction __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\n\nexport { __assign, __read, __rest, __spreadArray, __values };\n", "var STATE_DELIMITER = '.';\nvar EMPTY_ACTIVITY_MAP = {};\nvar DEFAULT_GUARD_TYPE = 'xstate.guard';\nvar TARGETLESS_KEY = '';\n\nexport { DEFAULT_GUARD_TYPE, EMPTY_ACTIVITY_MAP, STATE_DELIMITER, TARGETLESS_KEY };\n", "var IS_PRODUCTION = process.env.NODE_ENV === 'production';\n\nexport { IS_PRODUCTION };\n", "import { __spreadArray, __read, __values, __assign } from './_virtual/_tslib.js';\nimport { DEFAULT_GUARD_TYPE, TARGETLESS_KEY, STATE_DELIMITER } from './constants.js';\nimport { IS_PRODUCTION } from './environment.js';\n\nvar _a;\nfunction keys(value) {\n  return Object.keys(value);\n}\nfunction matchesState(parentStateId, childStateId, delimiter) {\n  if (delimiter === void 0) {\n    delimiter = STATE_DELIMITER;\n  }\n\n  var parentStateValue = toStateValue(parentStateId, delimiter);\n  var childStateValue = toStateValue(childStateId, delimiter);\n\n  if (isString(childStateValue)) {\n    if (isString(parentStateValue)) {\n      return childStateValue === parentStateValue;\n    } // Parent more specific than child\n\n\n    return false;\n  }\n\n  if (isString(parentStateValue)) {\n    return parentStateValue in childStateValue;\n  }\n\n  return keys(parentStateValue).every(function (key) {\n    if (!(key in childStateValue)) {\n      return false;\n    }\n\n    return matchesState(parentStateValue[key], childStateValue[key]);\n  });\n}\nfunction getEventType(event) {\n  try {\n    return isString(event) || typeof event === 'number' ? \"\".concat(event) : event.type;\n  } catch (e) {\n    throw new Error('Events must be strings or objects with a string event.type property.');\n  }\n}\nfunction toStatePath(stateId, delimiter) {\n  try {\n    if (isArray(stateId)) {\n      return stateId;\n    }\n\n    return stateId.toString().split(delimiter);\n  } catch (e) {\n    throw new Error(\"'\".concat(stateId, \"' is not a valid state path.\"));\n  }\n}\nfunction isStateLike(state) {\n  return typeof state === 'object' && 'value' in state && 'context' in state && 'event' in state && '_event' in state;\n}\nfunction toStateValue(stateValue, delimiter) {\n  if (isStateLike(stateValue)) {\n    return stateValue.value;\n  }\n\n  if (isArray(stateValue)) {\n    return pathToStateValue(stateValue);\n  }\n\n  if (typeof stateValue !== 'string') {\n    return stateValue;\n  }\n\n  var statePath = toStatePath(stateValue, delimiter);\n  return pathToStateValue(statePath);\n}\nfunction pathToStateValue(statePath) {\n  if (statePath.length === 1) {\n    return statePath[0];\n  }\n\n  var value = {};\n  var marker = value;\n\n  for (var i = 0; i < statePath.length - 1; i++) {\n    if (i === statePath.length - 2) {\n      marker[statePath[i]] = statePath[i + 1];\n    } else {\n      marker[statePath[i]] = {};\n      marker = marker[statePath[i]];\n    }\n  }\n\n  return value;\n}\nfunction mapValues(collection, iteratee) {\n  var result = {};\n  var collectionKeys = keys(collection);\n\n  for (var i = 0; i < collectionKeys.length; i++) {\n    var key = collectionKeys[i];\n    result[key] = iteratee(collection[key], key, collection, i);\n  }\n\n  return result;\n}\nfunction mapFilterValues(collection, iteratee, predicate) {\n  var e_1, _a;\n\n  var result = {};\n\n  try {\n    for (var _b = __values(keys(collection)), _c = _b.next(); !_c.done; _c = _b.next()) {\n      var key = _c.value;\n      var item = collection[key];\n\n      if (!predicate(item)) {\n        continue;\n      }\n\n      result[key] = iteratee(item, key, collection);\n    }\n  } catch (e_1_1) {\n    e_1 = {\n      error: e_1_1\n    };\n  } finally {\n    try {\n      if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n    } finally {\n      if (e_1) throw e_1.error;\n    }\n  }\n\n  return result;\n}\n/**\r\n * Retrieves a value at the given path.\r\n * @param props The deep path to the prop of the desired value\r\n */\n\nvar path = function (props) {\n  return function (object) {\n    var e_2, _a;\n\n    var result = object;\n\n    try {\n      for (var props_1 = __values(props), props_1_1 = props_1.next(); !props_1_1.done; props_1_1 = props_1.next()) {\n        var prop = props_1_1.value;\n        result = result[prop];\n      }\n    } catch (e_2_1) {\n      e_2 = {\n        error: e_2_1\n      };\n    } finally {\n      try {\n        if (props_1_1 && !props_1_1.done && (_a = props_1.return)) _a.call(props_1);\n      } finally {\n        if (e_2) throw e_2.error;\n      }\n    }\n\n    return result;\n  };\n};\n/**\r\n * Retrieves a value at the given path via the nested accessor prop.\r\n * @param props The deep path to the prop of the desired value\r\n */\n\nfunction nestedPath(props, accessorProp) {\n  return function (object) {\n    var e_3, _a;\n\n    var result = object;\n\n    try {\n      for (var props_2 = __values(props), props_2_1 = props_2.next(); !props_2_1.done; props_2_1 = props_2.next()) {\n        var prop = props_2_1.value;\n        result = result[accessorProp][prop];\n      }\n    } catch (e_3_1) {\n      e_3 = {\n        error: e_3_1\n      };\n    } finally {\n      try {\n        if (props_2_1 && !props_2_1.done && (_a = props_2.return)) _a.call(props_2);\n      } finally {\n        if (e_3) throw e_3.error;\n      }\n    }\n\n    return result;\n  };\n}\nfunction toStatePaths(stateValue) {\n  if (!stateValue) {\n    return [[]];\n  }\n\n  if (isString(stateValue)) {\n    return [[stateValue]];\n  }\n\n  var result = flatten(keys(stateValue).map(function (key) {\n    var subStateValue = stateValue[key];\n\n    if (typeof subStateValue !== 'string' && (!subStateValue || !Object.keys(subStateValue).length)) {\n      return [[key]];\n    }\n\n    return toStatePaths(stateValue[key]).map(function (subPath) {\n      return [key].concat(subPath);\n    });\n  }));\n  return result;\n}\nfunction flatten(array) {\n  var _a;\n\n  return (_a = []).concat.apply(_a, __spreadArray([], __read(array), false));\n}\nfunction toArrayStrict(value) {\n  if (isArray(value)) {\n    return value;\n  }\n\n  return [value];\n}\nfunction toArray(value) {\n  if (value === undefined) {\n    return [];\n  }\n\n  return toArrayStrict(value);\n}\nfunction mapContext(mapper, context, _event) {\n  var e_5, _a;\n\n  if (isFunction(mapper)) {\n    return mapper(context, _event.data);\n  }\n\n  var result = {};\n\n  try {\n    for (var _b = __values(Object.keys(mapper)), _c = _b.next(); !_c.done; _c = _b.next()) {\n      var key = _c.value;\n      var subMapper = mapper[key];\n\n      if (isFunction(subMapper)) {\n        result[key] = subMapper(context, _event.data);\n      } else {\n        result[key] = subMapper;\n      }\n    }\n  } catch (e_5_1) {\n    e_5 = {\n      error: e_5_1\n    };\n  } finally {\n    try {\n      if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n    } finally {\n      if (e_5) throw e_5.error;\n    }\n  }\n\n  return result;\n}\nfunction isBuiltInEvent(eventType) {\n  return /^(done|error)\\./.test(eventType);\n}\nfunction isPromiseLike(value) {\n  if (value instanceof Promise) {\n    return true;\n  } // Check if shape matches the Promise/A+ specification for a \"thenable\".\n\n\n  if (value !== null && (isFunction(value) || typeof value === 'object') && isFunction(value.then)) {\n    return true;\n  }\n\n  return false;\n}\nfunction isBehavior(value) {\n  return value !== null && typeof value === 'object' && 'transition' in value && typeof value.transition === 'function';\n}\nfunction partition(items, predicate) {\n  var e_6, _a;\n\n  var _b = __read([[], []], 2),\n      truthy = _b[0],\n      falsy = _b[1];\n\n  try {\n    for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {\n      var item = items_1_1.value;\n\n      if (predicate(item)) {\n        truthy.push(item);\n      } else {\n        falsy.push(item);\n      }\n    }\n  } catch (e_6_1) {\n    e_6 = {\n      error: e_6_1\n    };\n  } finally {\n    try {\n      if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);\n    } finally {\n      if (e_6) throw e_6.error;\n    }\n  }\n\n  return [truthy, falsy];\n}\nfunction updateHistoryStates(hist, stateValue) {\n  return mapValues(hist.states, function (subHist, key) {\n    if (!subHist) {\n      return undefined;\n    }\n\n    var subStateValue = (isString(stateValue) ? undefined : stateValue[key]) || (subHist ? subHist.current : undefined);\n\n    if (!subStateValue) {\n      return undefined;\n    }\n\n    return {\n      current: subStateValue,\n      states: updateHistoryStates(subHist, subStateValue)\n    };\n  });\n}\nfunction updateHistoryValue(hist, stateValue) {\n  return {\n    current: stateValue,\n    states: updateHistoryStates(hist, stateValue)\n  };\n}\nfunction updateContext(context, _event, assignActions, state) {\n  if (!IS_PRODUCTION) {\n    warn(!!context, 'Attempting to update undefined context');\n  }\n\n  var updatedContext = context ? assignActions.reduce(function (acc, assignAction) {\n    var e_7, _a;\n\n    var assignment = assignAction.assignment;\n    var meta = {\n      state: state,\n      action: assignAction,\n      _event: _event\n    };\n    var partialUpdate = {};\n\n    if (isFunction(assignment)) {\n      partialUpdate = assignment(acc, _event.data, meta);\n    } else {\n      try {\n        for (var _b = __values(keys(assignment)), _c = _b.next(); !_c.done; _c = _b.next()) {\n          var key = _c.value;\n          var propAssignment = assignment[key];\n          partialUpdate[key] = isFunction(propAssignment) ? propAssignment(acc, _event.data, meta) : propAssignment;\n        }\n      } catch (e_7_1) {\n        e_7 = {\n          error: e_7_1\n        };\n      } finally {\n        try {\n          if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n        } finally {\n          if (e_7) throw e_7.error;\n        }\n      }\n    }\n\n    return Object.assign({}, acc, partialUpdate);\n  }, context) : context;\n  return updatedContext;\n} // tslint:disable-next-line:no-empty\n\nvar warn = function () {};\n\nif (!IS_PRODUCTION) {\n  warn = function (condition, message) {\n    var error = condition instanceof Error ? condition : undefined;\n\n    if (!error && condition) {\n      return;\n    }\n\n    if (console !== undefined) {\n      var args = [\"Warning: \".concat(message)];\n\n      if (error) {\n        args.push(error);\n      } // tslint:disable-next-line:no-console\n\n\n      console.warn.apply(console, args);\n    }\n  };\n}\nfunction isArray(value) {\n  return Array.isArray(value);\n} // tslint:disable-next-line:ban-types\n\nfunction isFunction(value) {\n  return typeof value === 'function';\n}\nfunction isString(value) {\n  return typeof value === 'string';\n} // export function memoizedGetter<T, TP extends { prototype: object }>(\n//   o: TP,\n//   property: string,\n//   getter: () => T\n// ): void {\n//   Object.defineProperty(o.prototype, property, {\n//     get: getter,\n//     enumerable: false,\n//     configurable: false\n//   });\n// }\n\nfunction toGuard(condition, guardMap) {\n  if (!condition) {\n    return undefined;\n  }\n\n  if (isString(condition)) {\n    return {\n      type: DEFAULT_GUARD_TYPE,\n      name: condition,\n      predicate: guardMap ? guardMap[condition] : undefined\n    };\n  }\n\n  if (isFunction(condition)) {\n    return {\n      type: DEFAULT_GUARD_TYPE,\n      name: condition.name,\n      predicate: condition\n    };\n  }\n\n  return condition;\n}\nfunction isObservable(value) {\n  try {\n    return 'subscribe' in value && isFunction(value.subscribe);\n  } catch (e) {\n    return false;\n  }\n}\nvar symbolObservable = /*#__PURE__*/function () {\n  return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n}();\nvar interopSymbols = (_a = {}, _a[symbolObservable] = function () {\n  return this;\n}, _a);\nfunction isMachine(value) {\n  try {\n    return '__xstatenode' in value;\n  } catch (e) {\n    return false;\n  }\n}\nfunction isActor(value) {\n  return !!value && typeof value.send === 'function';\n}\nvar uniqueId = /*#__PURE__*/function () {\n  var currentId = 0;\n  return function () {\n    currentId++;\n    return currentId.toString(16);\n  };\n}();\nfunction toEventObject(event, payload // id?: TEvent['type']\n) {\n  if (isString(event) || typeof event === 'number') {\n    return __assign({\n      type: event\n    }, payload);\n  }\n\n  return event;\n}\nfunction toSCXMLEvent(event, scxmlEvent) {\n  if (!isString(event) && '$$type' in event && event.$$type === 'scxml') {\n    return event;\n  }\n\n  var eventObject = toEventObject(event);\n  return __assign({\n    name: eventObject.type,\n    data: eventObject,\n    $$type: 'scxml',\n    type: 'external'\n  }, scxmlEvent);\n}\nfunction toTransitionConfigArray(event, configLike) {\n  var transitions = toArrayStrict(configLike).map(function (transitionLike) {\n    if (typeof transitionLike === 'undefined' || typeof transitionLike === 'string' || isMachine(transitionLike)) {\n      return {\n        target: transitionLike,\n        event: event\n      };\n    }\n\n    return __assign(__assign({}, transitionLike), {\n      event: event\n    });\n  });\n  return transitions;\n}\nfunction normalizeTarget(target) {\n  if (target === undefined || target === TARGETLESS_KEY) {\n    return undefined;\n  }\n\n  return toArray(target);\n}\nfunction reportUnhandledExceptionOnInvocation(originalError, currentError, id) {\n  if (!IS_PRODUCTION) {\n    var originalStackTrace = originalError.stack ? \" Stacktrace was '\".concat(originalError.stack, \"'\") : '';\n\n    if (originalError === currentError) {\n      // tslint:disable-next-line:no-console\n      console.error(\"Missing onError handler for invocation '\".concat(id, \"', error was '\").concat(originalError, \"'.\").concat(originalStackTrace));\n    } else {\n      var stackTrace = currentError.stack ? \" Stacktrace was '\".concat(currentError.stack, \"'\") : ''; // tslint:disable-next-line:no-console\n\n      console.error(\"Missing onError handler and/or unhandled exception/promise rejection for invocation '\".concat(id, \"'. \") + \"Original error: '\".concat(originalError, \"'. \").concat(originalStackTrace, \" Current error is '\").concat(currentError, \"'.\").concat(stackTrace));\n    }\n  }\n}\nfunction evaluateGuard(machine, guard, context, _event, state) {\n  var guards = machine.options.guards;\n  var guardMeta = {\n    state: state,\n    cond: guard,\n    _event: _event\n  }; // TODO: do not hardcode!\n\n  if (guard.type === DEFAULT_GUARD_TYPE) {\n    return ((guards === null || guards === void 0 ? void 0 : guards[guard.name]) || guard.predicate)(context, _event.data, guardMeta);\n  }\n\n  var condFn = guards === null || guards === void 0 ? void 0 : guards[guard.type];\n\n  if (!condFn) {\n    throw new Error(\"Guard '\".concat(guard.type, \"' is not implemented on machine '\").concat(machine.id, \"'.\"));\n  }\n\n  return condFn(context, _event.data, guardMeta);\n}\nfunction toInvokeSource(src) {\n  if (typeof src === 'string') {\n    return {\n      type: src\n    };\n  }\n\n  return src;\n}\nfunction toObserver(nextHandler, errorHandler, completionHandler) {\n  if (typeof nextHandler === 'object') {\n    return nextHandler;\n  }\n\n  var noop = function () {\n    return void 0;\n  };\n\n  return {\n    next: nextHandler,\n    error: errorHandler || noop,\n    complete: completionHandler || noop\n  };\n}\nfunction createInvokeId(stateNodeId, index) {\n  return \"\".concat(stateNodeId, \":invocation[\").concat(index, \"]\");\n}\n\nexport { createInvokeId, evaluateGuard, flatten, getEventType, interopSymbols, isActor, isArray, isBehavior, isBuiltInEvent, isFunction, isMachine, isObservable, isPromiseLike, isStateLike, isString, keys, mapContext, mapFilterValues, mapValues, matchesState, nestedPath, normalizeTarget, partition, path, pathToStateValue, reportUnhandledExceptionOnInvocation, symbolObservable, toArray, toArrayStrict, toEventObject, toGuard, toInvokeSource, toObserver, toSCXMLEvent, toStatePath, toStatePaths, toStateValue, toTransitionConfigArray, uniqueId, updateContext, updateHistoryStates, updateHistoryValue, warn };\n", "var ActionTypes;\n\n(function (ActionTypes) {\n  ActionTypes[\"Start\"] = \"xstate.start\";\n  ActionTypes[\"Stop\"] = \"xstate.stop\";\n  ActionTypes[\"Raise\"] = \"xstate.raise\";\n  ActionTypes[\"Send\"] = \"xstate.send\";\n  ActionTypes[\"Cancel\"] = \"xstate.cancel\";\n  ActionTypes[\"NullEvent\"] = \"\";\n  ActionTypes[\"Assign\"] = \"xstate.assign\";\n  ActionTypes[\"After\"] = \"xstate.after\";\n  ActionTypes[\"DoneState\"] = \"done.state\";\n  ActionTypes[\"DoneInvoke\"] = \"done.invoke\";\n  ActionTypes[\"Log\"] = \"xstate.log\";\n  ActionTypes[\"Init\"] = \"xstate.init\";\n  ActionTypes[\"Invoke\"] = \"xstate.invoke\";\n  ActionTypes[\"ErrorExecution\"] = \"error.execution\";\n  ActionTypes[\"ErrorCommunication\"] = \"error.communication\";\n  ActionTypes[\"ErrorPlatform\"] = \"error.platform\";\n  ActionTypes[\"ErrorCustom\"] = \"xstate.error\";\n  ActionTypes[\"Update\"] = \"xstate.update\";\n  ActionTypes[\"Pure\"] = \"xstate.pure\";\n  ActionTypes[\"Choose\"] = \"xstate.choose\";\n})(ActionTypes || (ActionTypes = {}));\n\nvar SpecialTargets;\n\n(function (SpecialTargets) {\n  SpecialTargets[\"Parent\"] = \"#_parent\";\n  SpecialTargets[\"Internal\"] = \"#_internal\";\n})(SpecialTargets || (SpecialTargets = {}));\n\nexport { ActionTypes, SpecialTargets };\n", "import { ActionTypes } from './types.js';\n\nvar start = ActionTypes.Start;\nvar stop = ActionTypes.Stop;\nvar raise = ActionTypes.Raise;\nvar send = ActionTypes.Send;\nvar cancel = ActionTypes.Cancel;\nvar nullEvent = ActionTypes.NullEvent;\nvar assign = ActionTypes.Assign;\nvar after = ActionTypes.After;\nvar doneState = ActionTypes.DoneState;\nvar log = ActionTypes.Log;\nvar init = ActionTypes.Init;\nvar invoke = ActionTypes.Invoke;\nvar errorExecution = ActionTypes.ErrorExecution;\nvar errorPlatform = ActionTypes.ErrorPlatform;\nvar error = ActionTypes.ErrorCustom;\nvar update = ActionTypes.Update;\nvar choose = ActionTypes.Choose;\nvar pure = ActionTypes.Pure;\n\nexport { after, assign, cancel, choose, doneState, error, errorExecution, errorPlatform, init, invoke, log, nullEvent, pure, raise, send, start, stop, update };\n", "import { __assign, __read, __spreadArray } from './_virtual/_tslib.js';\nimport { IS_PRODUCTION } from './environment.js';\nimport { isFunction, toEventObject, getEventType, toSCXMLEvent, isString, partition, updateContext, flatten, toArray, toGuard, evaluateGuard, warn, isArray } from './utils.js';\nimport { SpecialTargets, ActionTypes } from './types.js';\nimport { send as send$1, update, assign as assign$1, init, raise as raise$1, log as log$1, cancel as cancel$1, error as error$1, stop as stop$1, pure as pure$1, choose as choose$1 } from './actionTypes.js';\n\nvar initEvent = /*#__PURE__*/toSCXMLEvent({\n  type: init\n});\nfunction getActionFunction(actionType, actionFunctionMap) {\n  return actionFunctionMap ? actionFunctionMap[actionType] || undefined : undefined;\n}\nfunction toActionObject(action, actionFunctionMap) {\n  var actionObject;\n\n  if (isString(action) || typeof action === 'number') {\n    var exec = getActionFunction(action, actionFunctionMap);\n\n    if (isFunction(exec)) {\n      actionObject = {\n        type: action,\n        exec: exec\n      };\n    } else if (exec) {\n      actionObject = exec;\n    } else {\n      actionObject = {\n        type: action,\n        exec: undefined\n      };\n    }\n  } else if (isFunction(action)) {\n    actionObject = {\n      // Convert action to string if unnamed\n      type: action.name || action.toString(),\n      exec: action\n    };\n  } else {\n    var exec = getActionFunction(action.type, actionFunctionMap);\n\n    if (isFunction(exec)) {\n      actionObject = __assign(__assign({}, action), {\n        exec: exec\n      });\n    } else if (exec) {\n      var actionType = exec.type || action.type;\n      actionObject = __assign(__assign(__assign({}, exec), action), {\n        type: actionType\n      });\n    } else {\n      actionObject = action;\n    }\n  }\n\n  return actionObject;\n}\nvar toActionObjects = function (action, actionFunctionMap) {\n  if (!action) {\n    return [];\n  }\n\n  var actions = isArray(action) ? action : [action];\n  return actions.map(function (subAction) {\n    return toActionObject(subAction, actionFunctionMap);\n  });\n};\nfunction toActivityDefinition(action) {\n  var actionObject = toActionObject(action);\n  return __assign(__assign({\n    id: isString(action) ? action : actionObject.id\n  }, actionObject), {\n    type: actionObject.type\n  });\n}\n/**\r\n * Raises an event. This places the event in the internal event queue, so that\r\n * the event is immediately consumed by the machine in the current step.\r\n *\r\n * @param eventType The event to raise.\r\n */\n\nfunction raise(event) {\n  if (!isString(event)) {\n    return send(event, {\n      to: SpecialTargets.Internal\n    });\n  }\n\n  return {\n    type: raise$1,\n    event: event\n  };\n}\nfunction resolveRaise(action) {\n  return {\n    type: raise$1,\n    _event: toSCXMLEvent(action.event)\n  };\n}\n/**\r\n * Sends an event. This returns an action that will be read by an interpreter to\r\n * send the event in the next step, after the current step is finished executing.\r\n *\r\n * @param event The event to send.\r\n * @param options Options to pass into the send event:\r\n *  - `id` - The unique send event identifier (used with `cancel()`).\r\n *  - `delay` - The number of milliseconds to delay the sending of the event.\r\n *  - `to` - The target of this event (by default, the machine the event was sent from).\r\n */\n\nfunction send(event, options) {\n  return {\n    to: options ? options.to : undefined,\n    type: send$1,\n    event: isFunction(event) ? event : toEventObject(event),\n    delay: options ? options.delay : undefined,\n    id: options && options.id !== undefined ? options.id : isFunction(event) ? event.name : getEventType(event)\n  };\n}\nfunction resolveSend(action, ctx, _event, delaysMap) {\n  var meta = {\n    _event: _event\n  }; // TODO: helper function for resolving Expr\n\n  var resolvedEvent = toSCXMLEvent(isFunction(action.event) ? action.event(ctx, _event.data, meta) : action.event);\n  var resolvedDelay;\n\n  if (isString(action.delay)) {\n    var configDelay = delaysMap && delaysMap[action.delay];\n    resolvedDelay = isFunction(configDelay) ? configDelay(ctx, _event.data, meta) : configDelay;\n  } else {\n    resolvedDelay = isFunction(action.delay) ? action.delay(ctx, _event.data, meta) : action.delay;\n  }\n\n  var resolvedTarget = isFunction(action.to) ? action.to(ctx, _event.data, meta) : action.to;\n  return __assign(__assign({}, action), {\n    to: resolvedTarget,\n    _event: resolvedEvent,\n    event: resolvedEvent.data,\n    delay: resolvedDelay\n  });\n}\n/**\r\n * Sends an event to this machine's parent.\r\n *\r\n * @param event The event to send to the parent machine.\r\n * @param options Options to pass into the send event.\r\n */\n\nfunction sendParent(event, options) {\n  return send(event, __assign(__assign({}, options), {\n    to: SpecialTargets.Parent\n  }));\n}\n/**\r\n * Sends an event to an actor.\r\n *\r\n * @param actor The `ActorRef` to send the event to.\r\n * @param event The event to send, or an expression that evaluates to the event to send\r\n * @param options Send action options\r\n * @returns An XState send action object\r\n */\n\nfunction sendTo(actor, event, options) {\n  return send(event, __assign(__assign({}, options), {\n    to: actor\n  }));\n}\n/**\r\n * Sends an update event to this machine's parent.\r\n */\n\nfunction sendUpdate() {\n  return sendParent(update);\n}\n/**\r\n * Sends an event back to the sender of the original event.\r\n *\r\n * @param event The event to send back to the sender\r\n * @param options Options to pass into the send event\r\n */\n\nfunction respond(event, options) {\n  return send(event, __assign(__assign({}, options), {\n    to: function (_, __, _a) {\n      var _event = _a._event;\n      return _event.origin; // TODO: handle when _event.origin is undefined\n    }\n  }));\n}\n\nvar defaultLogExpr = function (context, event) {\n  return {\n    context: context,\n    event: event\n  };\n};\n/**\r\n *\r\n * @param expr The expression function to evaluate which will be logged.\r\n *  Takes in 2 arguments:\r\n *  - `ctx` - the current state context\r\n *  - `event` - the event that caused this action to be executed.\r\n * @param label The label to give to the logged expression.\r\n */\n\n\nfunction log(expr, label) {\n  if (expr === void 0) {\n    expr = defaultLogExpr;\n  }\n\n  return {\n    type: log$1,\n    label: label,\n    expr: expr\n  };\n}\nvar resolveLog = function (action, ctx, _event) {\n  return __assign(__assign({}, action), {\n    value: isString(action.expr) ? action.expr : action.expr(ctx, _event.data, {\n      _event: _event\n    })\n  });\n};\n/**\r\n * Cancels an in-flight `send(...)` action. A canceled sent action will not\r\n * be executed, nor will its event be sent, unless it has already been sent\r\n * (e.g., if `cancel(...)` is called after the `send(...)` action's `delay`).\r\n *\r\n * @param sendId The `id` of the `send(...)` action to cancel.\r\n */\n\nvar cancel = function (sendId) {\n  return {\n    type: cancel$1,\n    sendId: sendId\n  };\n};\n/**\r\n * Starts an activity.\r\n *\r\n * @param activity The activity to start.\r\n */\n\nfunction start(activity) {\n  var activityDef = toActivityDefinition(activity);\n  return {\n    type: ActionTypes.Start,\n    activity: activityDef,\n    exec: undefined\n  };\n}\n/**\r\n * Stops an activity.\r\n *\r\n * @param actorRef The activity to stop.\r\n */\n\nfunction stop(actorRef) {\n  var activity = isFunction(actorRef) ? actorRef : toActivityDefinition(actorRef);\n  return {\n    type: ActionTypes.Stop,\n    activity: activity,\n    exec: undefined\n  };\n}\nfunction resolveStop(action, context, _event) {\n  var actorRefOrString = isFunction(action.activity) ? action.activity(context, _event.data) : action.activity;\n  var resolvedActorRef = typeof actorRefOrString === 'string' ? {\n    id: actorRefOrString\n  } : actorRefOrString;\n  var actionObject = {\n    type: ActionTypes.Stop,\n    activity: resolvedActorRef\n  };\n  return actionObject;\n}\n/**\r\n * Updates the current context of the machine.\r\n *\r\n * @param assignment An object that represents the partial context to update.\r\n */\n\nvar assign = function (assignment) {\n  return {\n    type: assign$1,\n    assignment: assignment\n  };\n};\n/**\r\n * Returns an event type that represents an implicit event that\r\n * is sent after the specified `delay`.\r\n *\r\n * @param delayRef The delay in milliseconds\r\n * @param id The state node ID where this event is handled\r\n */\n\nfunction after(delayRef, id) {\n  var idSuffix = id ? \"#\".concat(id) : '';\n  return \"\".concat(ActionTypes.After, \"(\").concat(delayRef, \")\").concat(idSuffix);\n}\n/**\r\n * Returns an event that represents that a final state node\r\n * has been reached in the parent state node.\r\n *\r\n * @param id The final state node's parent state node `id`\r\n * @param data The data to pass into the event\r\n */\n\nfunction done(id, data) {\n  var type = \"\".concat(ActionTypes.DoneState, \".\").concat(id);\n  var eventObject = {\n    type: type,\n    data: data\n  };\n\n  eventObject.toString = function () {\n    return type;\n  };\n\n  return eventObject;\n}\n/**\r\n * Returns an event that represents that an invoked service has terminated.\r\n *\r\n * An invoked service is terminated when it has reached a top-level final state node,\r\n * but not when it is canceled.\r\n *\r\n * @param id The final state node ID\r\n * @param data The data to pass into the event\r\n */\n\nfunction doneInvoke(id, data) {\n  var type = \"\".concat(ActionTypes.DoneInvoke, \".\").concat(id);\n  var eventObject = {\n    type: type,\n    data: data\n  };\n\n  eventObject.toString = function () {\n    return type;\n  };\n\n  return eventObject;\n}\nfunction error(id, data) {\n  var type = \"\".concat(ActionTypes.ErrorPlatform, \".\").concat(id);\n  var eventObject = {\n    type: type,\n    data: data\n  };\n\n  eventObject.toString = function () {\n    return type;\n  };\n\n  return eventObject;\n}\nfunction pure(getActions) {\n  return {\n    type: ActionTypes.Pure,\n    get: getActions\n  };\n}\n/**\r\n * Forwards (sends) an event to a specified service.\r\n *\r\n * @param target The target service to forward the event to.\r\n * @param options Options to pass into the send action creator.\r\n */\n\nfunction forwardTo(target, options) {\n  return send(function (_, event) {\n    return event;\n  }, __assign(__assign({}, options), {\n    to: target\n  }));\n}\n/**\r\n * Escalates an error by sending it as an event to this machine's parent.\r\n *\r\n * @param errorData The error data to send, or the expression function that\r\n * takes in the `context`, `event`, and `meta`, and returns the error data to send.\r\n * @param options Options to pass into the send action creator.\r\n */\n\nfunction escalate(errorData, options) {\n  return sendParent(function (context, event, meta) {\n    return {\n      type: error$1,\n      data: isFunction(errorData) ? errorData(context, event, meta) : errorData\n    };\n  }, __assign(__assign({}, options), {\n    to: SpecialTargets.Parent\n  }));\n}\nfunction choose(conds) {\n  return {\n    type: ActionTypes.Choose,\n    conds: conds\n  };\n}\nfunction resolveActions(machine, currentState, currentContext, _event, actions, preserveActionOrder) {\n  if (preserveActionOrder === void 0) {\n    preserveActionOrder = false;\n  }\n\n  var _a = __read(preserveActionOrder ? [[], actions] : partition(actions, function (action) {\n    return action.type === assign$1;\n  }), 2),\n      assignActions = _a[0],\n      otherActions = _a[1];\n\n  var updatedContext = assignActions.length ? updateContext(currentContext, _event, assignActions, currentState) : currentContext;\n  var preservedContexts = preserveActionOrder ? [currentContext] : undefined;\n  var resolvedActions = flatten(otherActions.map(function (actionObject) {\n    var _a;\n\n    switch (actionObject.type) {\n      case raise$1:\n        return resolveRaise(actionObject);\n\n      case send$1:\n        var sendAction = resolveSend(actionObject, updatedContext, _event, machine.options.delays); // TODO: fix ActionTypes.Init\n\n        if (!IS_PRODUCTION) {\n          // warn after resolving as we can create better contextual message here\n          warn(!isString(actionObject.delay) || typeof sendAction.delay === 'number', // tslint:disable-next-line:max-line-length\n          \"No delay reference for delay expression '\".concat(actionObject.delay, \"' was found on machine '\").concat(machine.id, \"'\"));\n        }\n\n        return sendAction;\n\n      case log$1:\n        return resolveLog(actionObject, updatedContext, _event);\n\n      case choose$1:\n        {\n          var chooseAction = actionObject;\n          var matchedActions = (_a = chooseAction.conds.find(function (condition) {\n            var guard = toGuard(condition.cond, machine.options.guards);\n            return !guard || evaluateGuard(machine, guard, updatedContext, _event, currentState);\n          })) === null || _a === void 0 ? void 0 : _a.actions;\n\n          if (!matchedActions) {\n            return [];\n          }\n\n          var _b = __read(resolveActions(machine, currentState, updatedContext, _event, toActionObjects(toArray(matchedActions), machine.options.actions), preserveActionOrder), 2),\n              resolvedActionsFromChoose = _b[0],\n              resolvedContextFromChoose = _b[1];\n\n          updatedContext = resolvedContextFromChoose;\n          preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);\n          return resolvedActionsFromChoose;\n        }\n\n      case pure$1:\n        {\n          var matchedActions = actionObject.get(updatedContext, _event.data);\n\n          if (!matchedActions) {\n            return [];\n          }\n\n          var _c = __read(resolveActions(machine, currentState, updatedContext, _event, toActionObjects(toArray(matchedActions), machine.options.actions), preserveActionOrder), 2),\n              resolvedActionsFromPure = _c[0],\n              resolvedContext = _c[1];\n\n          updatedContext = resolvedContext;\n          preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);\n          return resolvedActionsFromPure;\n        }\n\n      case stop$1:\n        {\n          return resolveStop(actionObject, updatedContext, _event);\n        }\n\n      case assign$1:\n        {\n          updatedContext = updateContext(updatedContext, _event, [actionObject], currentState);\n          preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);\n          break;\n        }\n\n      default:\n        var resolvedActionObject = toActionObject(actionObject, machine.options.actions);\n        var exec_1 = resolvedActionObject.exec;\n\n        if (exec_1 && preservedContexts) {\n          var contextIndex_1 = preservedContexts.length - 1;\n          resolvedActionObject = __assign(__assign({}, resolvedActionObject), {\n            exec: function (_ctx) {\n              var args = [];\n\n              for (var _i = 1; _i < arguments.length; _i++) {\n                args[_i - 1] = arguments[_i];\n              }\n\n              exec_1.apply(void 0, __spreadArray([preservedContexts[contextIndex_1]], __read(args), false));\n            }\n          });\n        }\n\n        return resolvedActionObject;\n    }\n  }).filter(function (a) {\n    return !!a;\n  }));\n  return [resolvedActions, updatedContext];\n}\n\nexport { after, assign, cancel, choose, done, doneInvoke, error, escalate, forwardTo, getActionFunction, initEvent, log, pure, raise, resolveActions, resolveLog, resolveRaise, resolveSend, resolveStop, respond, send, sendParent, sendTo, sendUpdate, start, stop, toActionObject, toActionObjects, toActivityDefinition };\n", "import { __values, __spreadArray, __read } from './_virtual/_tslib.js';\nimport { flatten, keys } from './utils.js';\n\nvar isLeafNode = function (stateNode) {\n  return stateNode.type === 'atomic' || stateNode.type === 'final';\n};\nfunction getChildren(stateNode) {\n  return keys(stateNode.states).map(function (key) {\n    return stateNode.states[key];\n  });\n}\nfunction getAllStateNodes(stateNode) {\n  var stateNodes = [stateNode];\n\n  if (isLeafNode(stateNode)) {\n    return stateNodes;\n  }\n\n  return stateNodes.concat(flatten(getChildren(stateNode).map(getAllStateNodes)));\n}\nfunction getConfiguration(prevStateNodes, stateNodes) {\n  var e_1, _a, e_2, _b, e_3, _c, e_4, _d;\n\n  var prevConfiguration = new Set(prevStateNodes);\n  var prevAdjList = getAdjList(prevConfiguration);\n  var configuration = new Set(stateNodes);\n\n  try {\n    // add all ancestors\n    for (var configuration_1 = __values(configuration), configuration_1_1 = configuration_1.next(); !configuration_1_1.done; configuration_1_1 = configuration_1.next()) {\n      var s = configuration_1_1.value;\n      var m = s.parent;\n\n      while (m && !configuration.has(m)) {\n        configuration.add(m);\n        m = m.parent;\n      }\n    }\n  } catch (e_1_1) {\n    e_1 = {\n      error: e_1_1\n    };\n  } finally {\n    try {\n      if (configuration_1_1 && !configuration_1_1.done && (_a = configuration_1.return)) _a.call(configuration_1);\n    } finally {\n      if (e_1) throw e_1.error;\n    }\n  }\n\n  var adjList = getAdjList(configuration);\n\n  try {\n    // add descendants\n    for (var configuration_2 = __values(configuration), configuration_2_1 = configuration_2.next(); !configuration_2_1.done; configuration_2_1 = configuration_2.next()) {\n      var s = configuration_2_1.value; // if previously active, add existing child nodes\n\n      if (s.type === 'compound' && (!adjList.get(s) || !adjList.get(s).length)) {\n        if (prevAdjList.get(s)) {\n          prevAdjList.get(s).forEach(function (sn) {\n            return configuration.add(sn);\n          });\n        } else {\n          s.initialStateNodes.forEach(function (sn) {\n            return configuration.add(sn);\n          });\n        }\n      } else {\n        if (s.type === 'parallel') {\n          try {\n            for (var _e = (e_3 = void 0, __values(getChildren(s))), _f = _e.next(); !_f.done; _f = _e.next()) {\n              var child = _f.value;\n\n              if (child.type === 'history') {\n                continue;\n              }\n\n              if (!configuration.has(child)) {\n                configuration.add(child);\n\n                if (prevAdjList.get(child)) {\n                  prevAdjList.get(child).forEach(function (sn) {\n                    return configuration.add(sn);\n                  });\n                } else {\n                  child.initialStateNodes.forEach(function (sn) {\n                    return configuration.add(sn);\n                  });\n                }\n              }\n            }\n          } catch (e_3_1) {\n            e_3 = {\n              error: e_3_1\n            };\n          } finally {\n            try {\n              if (_f && !_f.done && (_c = _e.return)) _c.call(_e);\n            } finally {\n              if (e_3) throw e_3.error;\n            }\n          }\n        }\n      }\n    }\n  } catch (e_2_1) {\n    e_2 = {\n      error: e_2_1\n    };\n  } finally {\n    try {\n      if (configuration_2_1 && !configuration_2_1.done && (_b = configuration_2.return)) _b.call(configuration_2);\n    } finally {\n      if (e_2) throw e_2.error;\n    }\n  }\n\n  try {\n    // add all ancestors\n    for (var configuration_3 = __values(configuration), configuration_3_1 = configuration_3.next(); !configuration_3_1.done; configuration_3_1 = configuration_3.next()) {\n      var s = configuration_3_1.value;\n      var m = s.parent;\n\n      while (m && !configuration.has(m)) {\n        configuration.add(m);\n        m = m.parent;\n      }\n    }\n  } catch (e_4_1) {\n    e_4 = {\n      error: e_4_1\n    };\n  } finally {\n    try {\n      if (configuration_3_1 && !configuration_3_1.done && (_d = configuration_3.return)) _d.call(configuration_3);\n    } finally {\n      if (e_4) throw e_4.error;\n    }\n  }\n\n  return configuration;\n}\n\nfunction getValueFromAdj(baseNode, adjList) {\n  var childStateNodes = adjList.get(baseNode);\n\n  if (!childStateNodes) {\n    return {}; // todo: fix?\n  }\n\n  if (baseNode.type === 'compound') {\n    var childStateNode = childStateNodes[0];\n\n    if (childStateNode) {\n      if (isLeafNode(childStateNode)) {\n        return childStateNode.key;\n      }\n    } else {\n      return {};\n    }\n  }\n\n  var stateValue = {};\n  childStateNodes.forEach(function (csn) {\n    stateValue[csn.key] = getValueFromAdj(csn, adjList);\n  });\n  return stateValue;\n}\n\nfunction getAdjList(configuration) {\n  var e_5, _a;\n\n  var adjList = new Map();\n\n  try {\n    for (var configuration_4 = __values(configuration), configuration_4_1 = configuration_4.next(); !configuration_4_1.done; configuration_4_1 = configuration_4.next()) {\n      var s = configuration_4_1.value;\n\n      if (!adjList.has(s)) {\n        adjList.set(s, []);\n      }\n\n      if (s.parent) {\n        if (!adjList.has(s.parent)) {\n          adjList.set(s.parent, []);\n        }\n\n        adjList.get(s.parent).push(s);\n      }\n    }\n  } catch (e_5_1) {\n    e_5 = {\n      error: e_5_1\n    };\n  } finally {\n    try {\n      if (configuration_4_1 && !configuration_4_1.done && (_a = configuration_4.return)) _a.call(configuration_4);\n    } finally {\n      if (e_5) throw e_5.error;\n    }\n  }\n\n  return adjList;\n}\nfunction getValue(rootNode, configuration) {\n  var config = getConfiguration([rootNode], configuration);\n  return getValueFromAdj(rootNode, getAdjList(config));\n}\nfunction has(iterable, item) {\n  if (Array.isArray(iterable)) {\n    return iterable.some(function (member) {\n      return member === item;\n    });\n  }\n\n  if (iterable instanceof Set) {\n    return iterable.has(item);\n  }\n\n  return false; // TODO: fix\n}\nfunction nextEvents(configuration) {\n  return __spreadArray([], __read(new Set(flatten(__spreadArray([], __read(configuration.map(function (sn) {\n    return sn.ownEvents;\n  })), false)))), false);\n}\nfunction isInFinalState(configuration, stateNode) {\n  if (stateNode.type === 'compound') {\n    return getChildren(stateNode).some(function (s) {\n      return s.type === 'final' && has(configuration, s);\n    });\n  }\n\n  if (stateNode.type === 'parallel') {\n    return getChildren(stateNode).every(function (sn) {\n      return isInFinalState(configuration, sn);\n    });\n  }\n\n  return false;\n}\nfunction getMeta(configuration) {\n  if (configuration === void 0) {\n    configuration = [];\n  }\n\n  return configuration.reduce(function (acc, stateNode) {\n    if (stateNode.meta !== undefined) {\n      acc[stateNode.id] = stateNode.meta;\n    }\n\n    return acc;\n  }, {});\n}\nfunction getTagsFromConfiguration(configuration) {\n  return new Set(flatten(configuration.map(function (sn) {\n    return sn.tags;\n  })));\n}\n\nexport { getAdjList, getAllStateNodes, getChildren, getConfiguration, getMeta, getTagsFromConfiguration, getValue, has, isInFinalState, isLeafNode, nextEvents };\n", "import { __spreadArray, __read, __rest, __assign } from './_virtual/_tslib.js';\nimport { EMPTY_ACTIVITY_MAP } from './constants.js';\nimport { IS_PRODUCTION } from './environment.js';\nimport { isString, matchesState, warn, keys } from './utils.js';\nimport { getMeta, nextEvents } from './stateUtils.js';\nimport { initEvent } from './actions.js';\n\nfunction stateValuesEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n\n  if (a === undefined || b === undefined) {\n    return false;\n  }\n\n  if (isString(a) || isString(b)) {\n    return a === b;\n  }\n\n  var aKeys = keys(a);\n  var bKeys = keys(b);\n  return aKeys.length === bKeys.length && aKeys.every(function (key) {\n    return stateValuesEqual(a[key], b[key]);\n  });\n}\nfunction isState(state) {\n  if (isString(state)) {\n    return false;\n  }\n\n  return 'value' in state && 'history' in state;\n}\nfunction bindActionToState(action, state) {\n  var exec = action.exec;\n\n  var boundAction = __assign(__assign({}, action), {\n    exec: exec !== undefined ? function () {\n      return exec(state.context, state.event, {\n        action: action,\n        state: state,\n        _event: state._event\n      });\n    } : undefined\n  });\n\n  return boundAction;\n}\n\nvar State =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n  /**\r\n   * Creates a new State instance.\r\n   * @param value The state value\r\n   * @param context The extended state\r\n   * @param historyValue The tree representing historical values of the state nodes\r\n   * @param history The previous state\r\n   * @param actions An array of action objects to execute as side-effects\r\n   * @param activities A mapping of activities and whether they are started (`true`) or stopped (`false`).\r\n   * @param meta\r\n   * @param events Internal event queue. Should be empty with run-to-completion semantics.\r\n   * @param configuration\r\n   */\n  function State(config) {\n    var _this = this;\n\n    var _a;\n\n    this.actions = [];\n    this.activities = EMPTY_ACTIVITY_MAP;\n    this.meta = {};\n    this.events = [];\n    this.value = config.value;\n    this.context = config.context;\n    this._event = config._event;\n    this._sessionid = config._sessionid;\n    this.event = this._event.data;\n    this.historyValue = config.historyValue;\n    this.history = config.history;\n    this.actions = config.actions || [];\n    this.activities = config.activities || EMPTY_ACTIVITY_MAP;\n    this.meta = getMeta(config.configuration);\n    this.events = config.events || [];\n    this.matches = this.matches.bind(this);\n    this.toStrings = this.toStrings.bind(this);\n    this.configuration = config.configuration;\n    this.transitions = config.transitions;\n    this.children = config.children;\n    this.done = !!config.done;\n    this.tags = (_a = Array.isArray(config.tags) ? new Set(config.tags) : config.tags) !== null && _a !== void 0 ? _a : new Set();\n    this.machine = config.machine;\n    Object.defineProperty(this, 'nextEvents', {\n      get: function () {\n        return nextEvents(_this.configuration);\n      }\n    });\n  }\n  /**\r\n   * Creates a new State instance for the given `stateValue` and `context`.\r\n   * @param stateValue\r\n   * @param context\r\n   */\n\n\n  State.from = function (stateValue, context) {\n    if (stateValue instanceof State) {\n      if (stateValue.context !== context) {\n        return new State({\n          value: stateValue.value,\n          context: context,\n          _event: stateValue._event,\n          _sessionid: null,\n          historyValue: stateValue.historyValue,\n          history: stateValue.history,\n          actions: [],\n          activities: stateValue.activities,\n          meta: {},\n          events: [],\n          configuration: [],\n          transitions: [],\n          children: {}\n        });\n      }\n\n      return stateValue;\n    }\n\n    var _event = initEvent;\n    return new State({\n      value: stateValue,\n      context: context,\n      _event: _event,\n      _sessionid: null,\n      historyValue: undefined,\n      history: undefined,\n      actions: [],\n      activities: undefined,\n      meta: undefined,\n      events: [],\n      configuration: [],\n      transitions: [],\n      children: {}\n    });\n  };\n  /**\r\n   * Creates a new State instance for the given `config`.\r\n   * @param config The state config\r\n   */\n\n\n  State.create = function (config) {\n    return new State(config);\n  };\n  /**\r\n   * Creates a new `State` instance for the given `stateValue` and `context` with no actions (side-effects).\r\n   * @param stateValue\r\n   * @param context\r\n   */\n\n\n  State.inert = function (stateValue, context) {\n    if (stateValue instanceof State) {\n      if (!stateValue.actions.length) {\n        return stateValue;\n      }\n\n      var _event = initEvent;\n      return new State({\n        value: stateValue.value,\n        context: context,\n        _event: _event,\n        _sessionid: null,\n        historyValue: stateValue.historyValue,\n        history: stateValue.history,\n        activities: stateValue.activities,\n        configuration: stateValue.configuration,\n        transitions: [],\n        children: {}\n      });\n    }\n\n    return State.from(stateValue, context);\n  };\n  /**\r\n   * Returns an array of all the string leaf state node paths.\r\n   * @param stateValue\r\n   * @param delimiter The character(s) that separate each subpath in the string state node path.\r\n   */\n\n\n  State.prototype.toStrings = function (stateValue, delimiter) {\n    var _this = this;\n\n    if (stateValue === void 0) {\n      stateValue = this.value;\n    }\n\n    if (delimiter === void 0) {\n      delimiter = '.';\n    }\n\n    if (isString(stateValue)) {\n      return [stateValue];\n    }\n\n    var valueKeys = keys(stateValue);\n    return valueKeys.concat.apply(valueKeys, __spreadArray([], __read(valueKeys.map(function (key) {\n      return _this.toStrings(stateValue[key], delimiter).map(function (s) {\n        return key + delimiter + s;\n      });\n    })), false));\n  };\n\n  State.prototype.toJSON = function () {\n    var _a = this,\n        configuration = _a.configuration,\n        transitions = _a.transitions,\n        tags = _a.tags,\n        machine = _a.machine,\n        jsonValues = __rest(_a, [\"configuration\", \"transitions\", \"tags\", \"machine\"]);\n\n    return __assign(__assign({}, jsonValues), {\n      tags: Array.from(tags)\n    });\n  };\n  /**\r\n   * Whether the current state value is a subset of the given parent state value.\r\n   * @param parentStateValue\r\n   */\n\n\n  State.prototype.matches = function (parentStateValue) {\n    return matchesState(parentStateValue, this.value);\n  };\n  /**\r\n   * Whether the current state configuration has a state node with the specified `tag`.\r\n   * @param tag\r\n   */\n\n\n  State.prototype.hasTag = function (tag) {\n    return this.tags.has(tag);\n  };\n  /**\r\n   * Determines whether sending the `event` will cause a non-forbidden transition\r\n   * to be selected, even if the transitions have no actions nor\r\n   * change the state value.\r\n   *\r\n   * @param event The event to test\r\n   * @returns Whether the event will cause a transition\r\n   */\n\n\n  State.prototype.can = function (event) {\n    var _a;\n\n    if (IS_PRODUCTION) {\n      warn(!!this.machine, \"state.can(...) used outside of a machine-created State object; this will always return false.\");\n    }\n\n    var transitionData = (_a = this.machine) === null || _a === void 0 ? void 0 : _a.getTransitionData(this, event);\n    return !!(transitionData === null || transitionData === void 0 ? void 0 : transitionData.transitions.length) && // Check that at least one transition is not forbidden\n    transitionData.transitions.some(function (t) {\n      return t.target !== undefined || t.actions.length;\n    });\n  };\n\n  return State;\n}();\n\nexport { State, bindActionToState, isState, stateValuesEqual };\n", "/**\r\n * Maintains a stack of the current service in scope.\r\n * This is used to provide the correct service to spawn().\r\n */\nvar serviceStack = [];\nvar provide = function (service, fn) {\n  serviceStack.push(service);\n  var result = fn(service);\n  serviceStack.pop();\n  return result;\n};\nvar consume = function (fn) {\n  return fn(serviceStack[serviceStack.length - 1]);\n};\n\nexport { consume, provide };\n", "import { __assign } from './_virtual/_tslib.js';\nimport { toInvokeSource, mapContext, interopSymbols, isMachine } from './utils.js';\nimport { provide } from './serviceScope.js';\n\nfunction createNullActor(id) {\n  return __assign({\n    id: id,\n    send: function () {\n      return void 0;\n    },\n    subscribe: function () {\n      return {\n        unsubscribe: function () {\n          return void 0;\n        }\n      };\n    },\n    getSnapshot: function () {\n      return undefined;\n    },\n    toJSON: function () {\n      return {\n        id: id\n      };\n    }\n  }, interopSymbols);\n}\n/**\r\n * Creates a deferred actor that is able to be invoked given the provided\r\n * invocation information in its `.meta` value.\r\n *\r\n * @param invokeDefinition The meta information needed to invoke the actor.\r\n */\n\nfunction createInvocableActor(invokeDefinition, machine, context, _event) {\n  var _a;\n\n  var invokeSrc = toInvokeSource(invokeDefinition.src);\n  var serviceCreator = (_a = machine === null || machine === void 0 ? void 0 : machine.options.services) === null || _a === void 0 ? void 0 : _a[invokeSrc.type];\n  var resolvedData = invokeDefinition.data ? mapContext(invokeDefinition.data, context, _event) : undefined;\n  var tempActor = serviceCreator ? createDeferredActor(serviceCreator, invokeDefinition.id, resolvedData) : createNullActor(invokeDefinition.id); // @ts-ignore\n\n  tempActor.meta = invokeDefinition;\n  return tempActor;\n}\nfunction createDeferredActor(entity, id, data) {\n  var tempActor = createNullActor(id); // @ts-ignore\n\n  tempActor.deferred = true;\n\n  if (isMachine(entity)) {\n    // \"mute\" the existing service scope so potential spawned actors within the `.initialState` stay deferred here\n    var initialState_1 = tempActor.state = provide(undefined, function () {\n      return (data ? entity.withContext(data) : entity).initialState;\n    });\n\n    tempActor.getSnapshot = function () {\n      return initialState_1;\n    };\n  }\n\n  return tempActor;\n}\nfunction isActor(item) {\n  try {\n    return typeof item.send === 'function';\n  } catch (e) {\n    return false;\n  }\n}\nfunction isSpawnedActor(item) {\n  return isActor(item) && 'id' in item;\n}\nfunction toActorRef(actorRefLike) {\n  return __assign(__assign({\n    subscribe: function () {\n      return {\n        unsubscribe: function () {\n          return void 0;\n        }\n      };\n    },\n    id: 'anonymous',\n    getSnapshot: function () {\n      return undefined;\n    }\n  }, interopSymbols), actorRefLike);\n}\n\nexport { createDeferredActor, createInvocableActor, createNullActor, isActor, isSpawnedActor, toActorRef };\n", "import { __assign, __rest } from './_virtual/_tslib.js';\nimport './environment.js';\nimport './utils.js';\nimport './types.js';\nimport { invoke } from './actionTypes.js';\n\nfunction toInvokeSource(src) {\n  if (typeof src === 'string') {\n    var simpleSrc = {\n      type: src\n    };\n\n    simpleSrc.toString = function () {\n      return src;\n    }; // v4 compat - TODO: remove in v5\n\n\n    return simpleSrc;\n  }\n\n  return src;\n}\nfunction toInvokeDefinition(invokeConfig) {\n  return __assign(__assign({\n    type: invoke\n  }, invokeConfig), {\n    toJSON: function () {\n      var onDone = invokeConfig.onDone,\n          onError = invokeConfig.onError,\n          invokeDef = __rest(invokeConfig, [\"onDone\", \"onError\"]);\n\n      return __assign(__assign({}, invokeDef), {\n        type: invoke,\n        src: toInvokeSource(invokeConfig.src)\n      });\n    }\n  });\n}\n\nexport { toInvokeDefinition, toInvokeSource };\n", "import { __assign, __spreadArray, __read, __values, __rest } from './_virtual/_tslib.js';\nimport { STATE_DELIMITER } from './constants.js';\nimport { IS_PRODUCTION } from './environment.js';\nimport { isFunction, mapValues, isArray, flatten, keys, toArray, toStateValue, isString, getEventType, toSCXMLEvent, matchesState, path, evaluateGuard, mapContext, pathToStateValue, isBuiltInEvent, partition, updateHistoryValue, toStatePath, mapFilterValues, warn, toStatePaths, nestedPath, normalizeTarget, toGuard, toTransitionConfigArray, isMachine, createInvokeId } from './utils.js';\nimport { SpecialTargets } from './types.js';\nimport { getAllStateNodes, getConfiguration, isInFinalState, getTagsFromConfiguration, has, getChildren, getValue, isLeafNode } from './stateUtils.js';\nimport { start as start$1, stop as stop$1, invoke, update, nullEvent, raise as raise$1, send as send$1 } from './actionTypes.js';\nimport { done, start, raise, stop, toActionObjects, resolveActions, doneInvoke, error, toActionObject, toActivityDefinition, after, send, cancel, initEvent } from './actions.js';\nimport { State, stateValuesEqual } from './State.js';\nimport { createInvocableActor } from './Actor.js';\nimport { toInvokeDefinition } from './invokeUtils.js';\n\nvar NULL_EVENT = '';\nvar STATE_IDENTIFIER = '#';\nvar WILDCARD = '*';\nvar EMPTY_OBJECT = {};\n\nvar isStateId = function (str) {\n  return str[0] === STATE_IDENTIFIER;\n};\n\nvar createDefaultOptions = function () {\n  return {\n    actions: {},\n    guards: {},\n    services: {},\n    activities: {},\n    delays: {}\n  };\n};\n\nvar validateArrayifiedTransitions = function (stateNode, event, transitions) {\n  var hasNonLastUnguardedTarget = transitions.slice(0, -1).some(function (transition) {\n    return !('cond' in transition) && !('in' in transition) && (isString(transition.target) || isMachine(transition.target));\n  });\n  var eventText = event === NULL_EVENT ? 'the transient event' : \"event '\".concat(event, \"'\");\n  warn(!hasNonLastUnguardedTarget, \"One or more transitions for \".concat(eventText, \" on state '\").concat(stateNode.id, \"' are unreachable. \") + \"Make sure that the default transition is the last one defined.\");\n};\n\nvar StateNode =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n  function StateNode(\n  /**\r\n   * The raw config used to create the machine.\r\n   */\n  config, options,\n  /**\r\n   * The initial extended state\r\n   */\n  _context, // TODO: this is unsafe, but we're removing it in v5 anyway\n  _stateInfo) {\n    var _this = this;\n\n    if (_context === void 0) {\n      _context = 'context' in config ? config.context : undefined;\n    }\n\n    var _a;\n\n    this.config = config;\n    this._context = _context;\n    /**\r\n     * The order this state node appears. Corresponds to the implicit SCXML document order.\r\n     */\n\n    this.order = -1;\n    this.__xstatenode = true;\n    this.__cache = {\n      events: undefined,\n      relativeValue: new Map(),\n      initialStateValue: undefined,\n      initialState: undefined,\n      on: undefined,\n      transitions: undefined,\n      candidates: {},\n      delayedTransitions: undefined\n    };\n    this.idMap = {};\n    this.tags = [];\n    this.options = Object.assign(createDefaultOptions(), options);\n    this.parent = _stateInfo === null || _stateInfo === void 0 ? void 0 : _stateInfo.parent;\n    this.key = this.config.key || (_stateInfo === null || _stateInfo === void 0 ? void 0 : _stateInfo.key) || this.config.id || '(machine)';\n    this.machine = this.parent ? this.parent.machine : this;\n    this.path = this.parent ? this.parent.path.concat(this.key) : [];\n    this.delimiter = this.config.delimiter || (this.parent ? this.parent.delimiter : STATE_DELIMITER);\n    this.id = this.config.id || __spreadArray([this.machine.key], __read(this.path), false).join(this.delimiter);\n    this.version = this.parent ? this.parent.version : this.config.version;\n    this.type = this.config.type || (this.config.parallel ? 'parallel' : this.config.states && keys(this.config.states).length ? 'compound' : this.config.history ? 'history' : 'atomic');\n    this.schema = this.parent ? this.machine.schema : (_a = this.config.schema) !== null && _a !== void 0 ? _a : {};\n    this.description = this.config.description;\n\n    if (!IS_PRODUCTION) {\n      warn(!('parallel' in this.config), \"The \\\"parallel\\\" property is deprecated and will be removed in version 4.1. \".concat(this.config.parallel ? \"Replace with `type: 'parallel'`\" : \"Use `type: '\".concat(this.type, \"'`\"), \" in the config for state node '\").concat(this.id, \"' instead.\"));\n    }\n\n    this.initial = this.config.initial;\n    this.states = this.config.states ? mapValues(this.config.states, function (stateConfig, key) {\n      var _a;\n\n      var stateNode = new StateNode(stateConfig, {}, undefined, {\n        parent: _this,\n        key: key\n      });\n      Object.assign(_this.idMap, __assign((_a = {}, _a[stateNode.id] = stateNode, _a), stateNode.idMap));\n      return stateNode;\n    }) : EMPTY_OBJECT; // Document order\n\n    var order = 0;\n\n    function dfs(stateNode) {\n      var e_1, _a;\n\n      stateNode.order = order++;\n\n      try {\n        for (var _b = __values(getChildren(stateNode)), _c = _b.next(); !_c.done; _c = _b.next()) {\n          var child = _c.value;\n          dfs(child);\n        }\n      } catch (e_1_1) {\n        e_1 = {\n          error: e_1_1\n        };\n      } finally {\n        try {\n          if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n        } finally {\n          if (e_1) throw e_1.error;\n        }\n      }\n    }\n\n    dfs(this); // History config\n\n    this.history = this.config.history === true ? 'shallow' : this.config.history || false;\n    this._transient = !!this.config.always || (!this.config.on ? false : Array.isArray(this.config.on) ? this.config.on.some(function (_a) {\n      var event = _a.event;\n      return event === NULL_EVENT;\n    }) : NULL_EVENT in this.config.on);\n    this.strict = !!this.config.strict; // TODO: deprecate (entry)\n\n    this.onEntry = toArray(this.config.entry || this.config.onEntry).map(function (action) {\n      return toActionObject(action);\n    }); // TODO: deprecate (exit)\n\n    this.onExit = toArray(this.config.exit || this.config.onExit).map(function (action) {\n      return toActionObject(action);\n    });\n    this.meta = this.config.meta;\n    this.doneData = this.type === 'final' ? this.config.data : undefined;\n    this.invoke = toArray(this.config.invoke).map(function (invokeConfig, i) {\n      var _a, _b;\n\n      if (isMachine(invokeConfig)) {\n        var invokeId = createInvokeId(_this.id, i);\n        _this.machine.options.services = __assign((_a = {}, _a[invokeId] = invokeConfig, _a), _this.machine.options.services);\n        return toInvokeDefinition({\n          src: invokeId,\n          id: invokeId\n        });\n      } else if (isString(invokeConfig.src)) {\n        var invokeId = invokeConfig.id || createInvokeId(_this.id, i);\n        return toInvokeDefinition(__assign(__assign({}, invokeConfig), {\n          id: invokeId,\n          src: invokeConfig.src\n        }));\n      } else if (isMachine(invokeConfig.src) || isFunction(invokeConfig.src)) {\n        var invokeId = invokeConfig.id || createInvokeId(_this.id, i);\n        _this.machine.options.services = __assign((_b = {}, _b[invokeId] = invokeConfig.src, _b), _this.machine.options.services);\n        return toInvokeDefinition(__assign(__assign({\n          id: invokeId\n        }, invokeConfig), {\n          src: invokeId\n        }));\n      } else {\n        var invokeSource = invokeConfig.src;\n        return toInvokeDefinition(__assign(__assign({\n          id: createInvokeId(_this.id, i)\n        }, invokeConfig), {\n          src: invokeSource\n        }));\n      }\n    });\n    this.activities = toArray(this.config.activities).concat(this.invoke).map(function (activity) {\n      return toActivityDefinition(activity);\n    });\n    this.transition = this.transition.bind(this);\n    this.tags = toArray(this.config.tags); // TODO: this is the real fix for initialization once\n    // state node getters are deprecated\n    // if (!this.parent) {\n    //   this._init();\n    // }\n  }\n\n  StateNode.prototype._init = function () {\n    if (this.__cache.transitions) {\n      return;\n    }\n\n    getAllStateNodes(this).forEach(function (stateNode) {\n      return stateNode.on;\n    });\n  };\n  /**\r\n   * Clones this state machine with custom options and context.\r\n   *\r\n   * @param options Options (actions, guards, activities, services) to recursively merge with the existing options.\r\n   * @param context Custom context (will override predefined context)\r\n   */\n\n\n  StateNode.prototype.withConfig = function (options, context) {\n    var _a = this.options,\n        actions = _a.actions,\n        activities = _a.activities,\n        guards = _a.guards,\n        services = _a.services,\n        delays = _a.delays;\n    return new StateNode(this.config, {\n      actions: __assign(__assign({}, actions), options.actions),\n      activities: __assign(__assign({}, activities), options.activities),\n      guards: __assign(__assign({}, guards), options.guards),\n      services: __assign(__assign({}, services), options.services),\n      delays: __assign(__assign({}, delays), options.delays)\n    }, context !== null && context !== void 0 ? context : this.context);\n  };\n  /**\r\n   * Clones this state machine with custom context.\r\n   *\r\n   * @param context Custom context (will override predefined context, not recursive)\r\n   */\n\n\n  StateNode.prototype.withContext = function (context) {\n    return new StateNode(this.config, this.options, context);\n  };\n\n  Object.defineProperty(StateNode.prototype, \"context\", {\n    get: function () {\n      return isFunction(this._context) ? this._context() : this._context;\n    },\n    enumerable: false,\n    configurable: true\n  });\n  Object.defineProperty(StateNode.prototype, \"definition\", {\n    /**\r\n     * The well-structured state node definition.\r\n     */\n    get: function () {\n      return {\n        id: this.id,\n        key: this.key,\n        version: this.version,\n        context: this.context,\n        type: this.type,\n        initial: this.initial,\n        history: this.history,\n        states: mapValues(this.states, function (state) {\n          return state.definition;\n        }),\n        on: this.on,\n        transitions: this.transitions,\n        entry: this.onEntry,\n        exit: this.onExit,\n        activities: this.activities || [],\n        meta: this.meta,\n        order: this.order || -1,\n        data: this.doneData,\n        invoke: this.invoke,\n        description: this.description,\n        tags: this.tags\n      };\n    },\n    enumerable: false,\n    configurable: true\n  });\n\n  StateNode.prototype.toJSON = function () {\n    return this.definition;\n  };\n\n  Object.defineProperty(StateNode.prototype, \"on\", {\n    /**\r\n     * The mapping of events to transitions.\r\n     */\n    get: function () {\n      if (this.__cache.on) {\n        return this.__cache.on;\n      }\n\n      var transitions = this.transitions;\n      return this.__cache.on = transitions.reduce(function (map, transition) {\n        map[transition.eventType] = map[transition.eventType] || [];\n        map[transition.eventType].push(transition);\n        return map;\n      }, {});\n    },\n    enumerable: false,\n    configurable: true\n  });\n  Object.defineProperty(StateNode.prototype, \"after\", {\n    get: function () {\n      return this.__cache.delayedTransitions || (this.__cache.delayedTransitions = this.getDelayedTransitions(), this.__cache.delayedTransitions);\n    },\n    enumerable: false,\n    configurable: true\n  });\n  Object.defineProperty(StateNode.prototype, \"transitions\", {\n    /**\r\n     * All the transitions that can be taken from this state node.\r\n     */\n    get: function () {\n      return this.__cache.transitions || (this.__cache.transitions = this.formatTransitions(), this.__cache.transitions);\n    },\n    enumerable: false,\n    configurable: true\n  });\n\n  StateNode.prototype.getCandidates = function (eventName) {\n    if (this.__cache.candidates[eventName]) {\n      return this.__cache.candidates[eventName];\n    }\n\n    var transient = eventName === NULL_EVENT;\n    var candidates = this.transitions.filter(function (transition) {\n      var sameEventType = transition.eventType === eventName; // null events should only match against eventless transitions\n\n      return transient ? sameEventType : sameEventType || transition.eventType === WILDCARD;\n    });\n    this.__cache.candidates[eventName] = candidates;\n    return candidates;\n  };\n  /**\r\n   * All delayed transitions from the config.\r\n   */\n\n\n  StateNode.prototype.getDelayedTransitions = function () {\n    var _this = this;\n\n    var afterConfig = this.config.after;\n\n    if (!afterConfig) {\n      return [];\n    }\n\n    var mutateEntryExit = function (delay, i) {\n      var delayRef = isFunction(delay) ? \"\".concat(_this.id, \":delay[\").concat(i, \"]\") : delay;\n      var eventType = after(delayRef, _this.id);\n\n      _this.onEntry.push(send(eventType, {\n        delay: delay\n      }));\n\n      _this.onExit.push(cancel(eventType));\n\n      return eventType;\n    };\n\n    var delayedTransitions = isArray(afterConfig) ? afterConfig.map(function (transition, i) {\n      var eventType = mutateEntryExit(transition.delay, i);\n      return __assign(__assign({}, transition), {\n        event: eventType\n      });\n    }) : flatten(keys(afterConfig).map(function (delay, i) {\n      var configTransition = afterConfig[delay];\n      var resolvedTransition = isString(configTransition) ? {\n        target: configTransition\n      } : configTransition;\n      var resolvedDelay = !isNaN(+delay) ? +delay : delay;\n      var eventType = mutateEntryExit(resolvedDelay, i);\n      return toArray(resolvedTransition).map(function (transition) {\n        return __assign(__assign({}, transition), {\n          event: eventType,\n          delay: resolvedDelay\n        });\n      });\n    }));\n    return delayedTransitions.map(function (delayedTransition) {\n      var delay = delayedTransition.delay;\n      return __assign(__assign({}, _this.formatTransition(delayedTransition)), {\n        delay: delay\n      });\n    });\n  };\n  /**\r\n   * Returns the state nodes represented by the current state value.\r\n   *\r\n   * @param state The state value or State instance\r\n   */\n\n\n  StateNode.prototype.getStateNodes = function (state) {\n    var _a;\n\n    var _this = this;\n\n    if (!state) {\n      return [];\n    }\n\n    var stateValue = state instanceof State ? state.value : toStateValue(state, this.delimiter);\n\n    if (isString(stateValue)) {\n      var initialStateValue = this.getStateNode(stateValue).initial;\n      return initialStateValue !== undefined ? this.getStateNodes((_a = {}, _a[stateValue] = initialStateValue, _a)) : [this, this.states[stateValue]];\n    }\n\n    var subStateKeys = keys(stateValue);\n    var subStateNodes = [this];\n    subStateNodes.push.apply(subStateNodes, __spreadArray([], __read(flatten(subStateKeys.map(function (subStateKey) {\n      return _this.getStateNode(subStateKey).getStateNodes(stateValue[subStateKey]);\n    }))), false));\n    return subStateNodes;\n  };\n  /**\r\n   * Returns `true` if this state node explicitly handles the given event.\r\n   *\r\n   * @param event The event in question\r\n   */\n\n\n  StateNode.prototype.handles = function (event) {\n    var eventType = getEventType(event);\n    return this.events.includes(eventType);\n  };\n  /**\r\n   * Resolves the given `state` to a new `State` instance relative to this machine.\r\n   *\r\n   * This ensures that `.events` and `.nextEvents` represent the correct values.\r\n   *\r\n   * @param state The state to resolve\r\n   */\n\n\n  StateNode.prototype.resolveState = function (state) {\n    var configuration = Array.from(getConfiguration([], this.getStateNodes(state.value)));\n    return new State(__assign(__assign({}, state), {\n      value: this.resolve(state.value),\n      configuration: configuration,\n      done: isInFinalState(configuration, this),\n      tags: getTagsFromConfiguration(configuration)\n    }));\n  };\n\n  StateNode.prototype.transitionLeafNode = function (stateValue, state, _event) {\n    var stateNode = this.getStateNode(stateValue);\n    var next = stateNode.next(state, _event);\n\n    if (!next || !next.transitions.length) {\n      return this.next(state, _event);\n    }\n\n    return next;\n  };\n\n  StateNode.prototype.transitionCompoundNode = function (stateValue, state, _event) {\n    var subStateKeys = keys(stateValue);\n    var stateNode = this.getStateNode(subStateKeys[0]);\n\n    var next = stateNode._transition(stateValue[subStateKeys[0]], state, _event);\n\n    if (!next || !next.transitions.length) {\n      return this.next(state, _event);\n    }\n\n    return next;\n  };\n\n  StateNode.prototype.transitionParallelNode = function (stateValue, state, _event) {\n    var e_2, _a;\n\n    var transitionMap = {};\n\n    try {\n      for (var _b = __values(keys(stateValue)), _c = _b.next(); !_c.done; _c = _b.next()) {\n        var subStateKey = _c.value;\n        var subStateValue = stateValue[subStateKey];\n\n        if (!subStateValue) {\n          continue;\n        }\n\n        var subStateNode = this.getStateNode(subStateKey);\n\n        var next = subStateNode._transition(subStateValue, state, _event);\n\n        if (next) {\n          transitionMap[subStateKey] = next;\n        }\n      }\n    } catch (e_2_1) {\n      e_2 = {\n        error: e_2_1\n      };\n    } finally {\n      try {\n        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n      } finally {\n        if (e_2) throw e_2.error;\n      }\n    }\n\n    var stateTransitions = keys(transitionMap).map(function (key) {\n      return transitionMap[key];\n    });\n    var enabledTransitions = flatten(stateTransitions.map(function (st) {\n      return st.transitions;\n    }));\n    var willTransition = stateTransitions.some(function (st) {\n      return st.transitions.length > 0;\n    });\n\n    if (!willTransition) {\n      return this.next(state, _event);\n    }\n\n    var entryNodes = flatten(stateTransitions.map(function (t) {\n      return t.entrySet;\n    }));\n    var configuration = flatten(keys(transitionMap).map(function (key) {\n      return transitionMap[key].configuration;\n    }));\n    return {\n      transitions: enabledTransitions,\n      entrySet: entryNodes,\n      exitSet: flatten(stateTransitions.map(function (t) {\n        return t.exitSet;\n      })),\n      configuration: configuration,\n      source: state,\n      actions: flatten(keys(transitionMap).map(function (key) {\n        return transitionMap[key].actions;\n      }))\n    };\n  };\n\n  StateNode.prototype._transition = function (stateValue, state, _event) {\n    // leaf node\n    if (isString(stateValue)) {\n      return this.transitionLeafNode(stateValue, state, _event);\n    } // hierarchical node\n\n\n    if (keys(stateValue).length === 1) {\n      return this.transitionCompoundNode(stateValue, state, _event);\n    } // orthogonal node\n\n\n    return this.transitionParallelNode(stateValue, state, _event);\n  };\n\n  StateNode.prototype.getTransitionData = function (state, event) {\n    return this._transition(state.value, state, toSCXMLEvent(event));\n  };\n\n  StateNode.prototype.next = function (state, _event) {\n    var e_3, _a;\n\n    var _this = this;\n\n    var eventName = _event.name;\n    var actions = [];\n    var nextStateNodes = [];\n    var selectedTransition;\n\n    try {\n      for (var _b = __values(this.getCandidates(eventName)), _c = _b.next(); !_c.done; _c = _b.next()) {\n        var candidate = _c.value;\n        var cond = candidate.cond,\n            stateIn = candidate.in;\n        var resolvedContext = state.context;\n        var isInState = stateIn ? isString(stateIn) && isStateId(stateIn) ? // Check if in state by ID\n        state.matches(toStateValue(this.getStateNodeById(stateIn).path, this.delimiter)) : // Check if in state by relative grandparent\n        matchesState(toStateValue(stateIn, this.delimiter), path(this.path.slice(0, -2))(state.value)) : true;\n        var guardPassed = false;\n\n        try {\n          guardPassed = !cond || evaluateGuard(this.machine, cond, resolvedContext, _event, state);\n        } catch (err) {\n          throw new Error(\"Unable to evaluate guard '\".concat(cond.name || cond.type, \"' in transition for event '\").concat(eventName, \"' in state node '\").concat(this.id, \"':\\n\").concat(err.message));\n        }\n\n        if (guardPassed && isInState) {\n          if (candidate.target !== undefined) {\n            nextStateNodes = candidate.target;\n          }\n\n          actions.push.apply(actions, __spreadArray([], __read(candidate.actions), false));\n          selectedTransition = candidate;\n          break;\n        }\n      }\n    } catch (e_3_1) {\n      e_3 = {\n        error: e_3_1\n      };\n    } finally {\n      try {\n        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n      } finally {\n        if (e_3) throw e_3.error;\n      }\n    }\n\n    if (!selectedTransition) {\n      return undefined;\n    }\n\n    if (!nextStateNodes.length) {\n      return {\n        transitions: [selectedTransition],\n        entrySet: [],\n        exitSet: [],\n        configuration: state.value ? [this] : [],\n        source: state,\n        actions: actions\n      };\n    }\n\n    var allNextStateNodes = flatten(nextStateNodes.map(function (stateNode) {\n      return _this.getRelativeStateNodes(stateNode, state.historyValue);\n    }));\n    var isInternal = !!selectedTransition.internal;\n    var reentryNodes = isInternal ? [] : flatten(allNextStateNodes.map(function (n) {\n      return _this.nodesFromChild(n);\n    }));\n    return {\n      transitions: [selectedTransition],\n      entrySet: reentryNodes,\n      exitSet: isInternal ? [] : [this],\n      configuration: allNextStateNodes,\n      source: state,\n      actions: actions\n    };\n  };\n\n  StateNode.prototype.nodesFromChild = function (childStateNode) {\n    if (childStateNode.escapes(this)) {\n      return [];\n    }\n\n    var nodes = [];\n    var marker = childStateNode;\n\n    while (marker && marker !== this) {\n      nodes.push(marker);\n      marker = marker.parent;\n    }\n\n    nodes.push(this); // inclusive\n\n    return nodes;\n  };\n  /**\r\n   * Whether the given state node \"escapes\" this state node. If the `stateNode` is equal to or the parent of\r\n   * this state node, it does not escape.\r\n   */\n\n\n  StateNode.prototype.escapes = function (stateNode) {\n    if (this === stateNode) {\n      return false;\n    }\n\n    var parent = this.parent;\n\n    while (parent) {\n      if (parent === stateNode) {\n        return false;\n      }\n\n      parent = parent.parent;\n    }\n\n    return true;\n  };\n\n  StateNode.prototype.getActions = function (transition, currentContext, _event, prevState) {\n    var e_4, _a, e_5, _b;\n\n    var prevConfig = getConfiguration([], prevState ? this.getStateNodes(prevState.value) : [this]);\n    var resolvedConfig = transition.configuration.length ? getConfiguration(prevConfig, transition.configuration) : prevConfig;\n\n    try {\n      for (var resolvedConfig_1 = __values(resolvedConfig), resolvedConfig_1_1 = resolvedConfig_1.next(); !resolvedConfig_1_1.done; resolvedConfig_1_1 = resolvedConfig_1.next()) {\n        var sn = resolvedConfig_1_1.value;\n\n        if (!has(prevConfig, sn)) {\n          transition.entrySet.push(sn);\n        }\n      }\n    } catch (e_4_1) {\n      e_4 = {\n        error: e_4_1\n      };\n    } finally {\n      try {\n        if (resolvedConfig_1_1 && !resolvedConfig_1_1.done && (_a = resolvedConfig_1.return)) _a.call(resolvedConfig_1);\n      } finally {\n        if (e_4) throw e_4.error;\n      }\n    }\n\n    try {\n      for (var prevConfig_1 = __values(prevConfig), prevConfig_1_1 = prevConfig_1.next(); !prevConfig_1_1.done; prevConfig_1_1 = prevConfig_1.next()) {\n        var sn = prevConfig_1_1.value;\n\n        if (!has(resolvedConfig, sn) || has(transition.exitSet, sn.parent)) {\n          transition.exitSet.push(sn);\n        }\n      }\n    } catch (e_5_1) {\n      e_5 = {\n        error: e_5_1\n      };\n    } finally {\n      try {\n        if (prevConfig_1_1 && !prevConfig_1_1.done && (_b = prevConfig_1.return)) _b.call(prevConfig_1);\n      } finally {\n        if (e_5) throw e_5.error;\n      }\n    }\n\n    var doneEvents = flatten(transition.entrySet.map(function (sn) {\n      var events = [];\n\n      if (sn.type !== 'final') {\n        return events;\n      }\n\n      var parent = sn.parent;\n\n      if (!parent.parent) {\n        return events;\n      }\n\n      events.push(done(sn.id, sn.doneData), // TODO: deprecate - final states should not emit done events for their own state.\n      done(parent.id, sn.doneData ? mapContext(sn.doneData, currentContext, _event) : undefined));\n      var grandparent = parent.parent;\n\n      if (grandparent.type === 'parallel') {\n        if (getChildren(grandparent).every(function (parentNode) {\n          return isInFinalState(transition.configuration, parentNode);\n        })) {\n          events.push(done(grandparent.id));\n        }\n      }\n\n      return events;\n    }));\n    transition.exitSet.sort(function (a, b) {\n      return b.order - a.order;\n    });\n    transition.entrySet.sort(function (a, b) {\n      return a.order - b.order;\n    });\n    var entryStates = new Set(transition.entrySet);\n    var exitStates = new Set(transition.exitSet);\n\n    var _c = __read([flatten(Array.from(entryStates).map(function (stateNode) {\n      return __spreadArray(__spreadArray([], __read(stateNode.activities.map(function (activity) {\n        return start(activity);\n      })), false), __read(stateNode.onEntry), false);\n    })).concat(doneEvents.map(raise)), flatten(Array.from(exitStates).map(function (stateNode) {\n      return __spreadArray(__spreadArray([], __read(stateNode.onExit), false), __read(stateNode.activities.map(function (activity) {\n        return stop(activity);\n      })), false);\n    }))], 2),\n        entryActions = _c[0],\n        exitActions = _c[1];\n\n    var actions = toActionObjects(exitActions.concat(transition.actions).concat(entryActions), this.machine.options.actions);\n    return actions;\n  };\n  /**\r\n   * Determines the next state given the current `state` and sent `event`.\r\n   *\r\n   * @param state The current State instance or state value\r\n   * @param event The event that was sent at the current state\r\n   * @param context The current context (extended state) of the current state\r\n   */\n\n\n  StateNode.prototype.transition = function (state, event, context) {\n    if (state === void 0) {\n      state = this.initialState;\n    }\n\n    var _event = toSCXMLEvent(event);\n\n    var currentState;\n\n    if (state instanceof State) {\n      currentState = context === undefined ? state : this.resolveState(State.from(state, context));\n    } else {\n      var resolvedStateValue = isString(state) ? this.resolve(pathToStateValue(this.getResolvedPath(state))) : this.resolve(state);\n      var resolvedContext = context !== null && context !== void 0 ? context : this.machine.context;\n      currentState = this.resolveState(State.from(resolvedStateValue, resolvedContext));\n    }\n\n    if (!IS_PRODUCTION && _event.name === WILDCARD) {\n      throw new Error(\"An event cannot have the wildcard type ('\".concat(WILDCARD, \"')\"));\n    }\n\n    if (this.strict) {\n      if (!this.events.includes(_event.name) && !isBuiltInEvent(_event.name)) {\n        throw new Error(\"Machine '\".concat(this.id, \"' does not accept event '\").concat(_event.name, \"'\"));\n      }\n    }\n\n    var stateTransition = this._transition(currentState.value, currentState, _event) || {\n      transitions: [],\n      configuration: [],\n      entrySet: [],\n      exitSet: [],\n      source: currentState,\n      actions: []\n    };\n    var prevConfig = getConfiguration([], this.getStateNodes(currentState.value));\n    var resolvedConfig = stateTransition.configuration.length ? getConfiguration(prevConfig, stateTransition.configuration) : prevConfig;\n    stateTransition.configuration = __spreadArray([], __read(resolvedConfig), false);\n    return this.resolveTransition(stateTransition, currentState, currentState.context, _event);\n  };\n\n  StateNode.prototype.resolveRaisedTransition = function (state, _event, originalEvent) {\n    var _a;\n\n    var currentActions = state.actions;\n    state = this.transition(state, _event); // Save original event to state\n    // TODO: this should be the raised event! Delete in V5 (breaking)\n\n    state._event = originalEvent;\n    state.event = originalEvent.data;\n\n    (_a = state.actions).unshift.apply(_a, __spreadArray([], __read(currentActions), false));\n\n    return state;\n  };\n\n  StateNode.prototype.resolveTransition = function (stateTransition, currentState, context, _event) {\n    var e_6, _a;\n\n    var _this = this;\n\n    if (_event === void 0) {\n      _event = initEvent;\n    }\n\n    var configuration = stateTransition.configuration; // Transition will \"apply\" if:\n    // - this is the initial state (there is no current state)\n    // - OR there are transitions\n\n    var willTransition = !currentState || stateTransition.transitions.length > 0;\n    var resolvedStateValue = willTransition ? getValue(this.machine, configuration) : undefined;\n    var historyValue = currentState ? currentState.historyValue ? currentState.historyValue : stateTransition.source ? this.machine.historyValue(currentState.value) : undefined : undefined;\n    var actions = this.getActions(stateTransition, context, _event, currentState);\n    var activities = currentState ? __assign({}, currentState.activities) : {};\n\n    try {\n      for (var actions_1 = __values(actions), actions_1_1 = actions_1.next(); !actions_1_1.done; actions_1_1 = actions_1.next()) {\n        var action = actions_1_1.value;\n\n        if (action.type === start$1) {\n          activities[action.activity.id || action.activity.type] = action;\n        } else if (action.type === stop$1) {\n          activities[action.activity.id || action.activity.type] = false;\n        }\n      }\n    } catch (e_6_1) {\n      e_6 = {\n        error: e_6_1\n      };\n    } finally {\n      try {\n        if (actions_1_1 && !actions_1_1.done && (_a = actions_1.return)) _a.call(actions_1);\n      } finally {\n        if (e_6) throw e_6.error;\n      }\n    }\n\n    var _b = __read(resolveActions(this, currentState, context, _event, actions, this.machine.config.preserveActionOrder), 2),\n        resolvedActions = _b[0],\n        updatedContext = _b[1];\n\n    var _c = __read(partition(resolvedActions, function (action) {\n      return action.type === raise$1 || action.type === send$1 && action.to === SpecialTargets.Internal;\n    }), 2),\n        raisedEvents = _c[0],\n        nonRaisedActions = _c[1];\n\n    var invokeActions = resolvedActions.filter(function (action) {\n      var _a;\n\n      return action.type === start$1 && ((_a = action.activity) === null || _a === void 0 ? void 0 : _a.type) === invoke;\n    });\n    var children = invokeActions.reduce(function (acc, action) {\n      acc[action.activity.id] = createInvocableActor(action.activity, _this.machine, updatedContext, _event);\n      return acc;\n    }, currentState ? __assign({}, currentState.children) : {});\n    var resolvedConfiguration = willTransition ? stateTransition.configuration : currentState ? currentState.configuration : [];\n    var isDone = isInFinalState(resolvedConfiguration, this);\n    var nextState = new State({\n      value: resolvedStateValue || currentState.value,\n      context: updatedContext,\n      _event: _event,\n      // Persist _sessionid between states\n      _sessionid: currentState ? currentState._sessionid : null,\n      historyValue: resolvedStateValue ? historyValue ? updateHistoryValue(historyValue, resolvedStateValue) : undefined : currentState ? currentState.historyValue : undefined,\n      history: !resolvedStateValue || stateTransition.source ? currentState : undefined,\n      actions: resolvedStateValue ? nonRaisedActions : [],\n      activities: resolvedStateValue ? activities : currentState ? currentState.activities : {},\n      events: [],\n      configuration: resolvedConfiguration,\n      transitions: stateTransition.transitions,\n      children: children,\n      done: isDone,\n      tags: currentState === null || currentState === void 0 ? void 0 : currentState.tags,\n      machine: this\n    });\n    var didUpdateContext = context !== updatedContext;\n    nextState.changed = _event.name === update || didUpdateContext; // Dispose of penultimate histories to prevent memory leaks\n\n    var history = nextState.history;\n\n    if (history) {\n      delete history.history;\n    } // There are transient transitions if the machine is not in a final state\n    // and if some of the state nodes have transient (\"always\") transitions.\n\n\n    var isTransient = !isDone && (this._transient || configuration.some(function (stateNode) {\n      return stateNode._transient;\n    })); // If there are no enabled transitions, check if there are transient transitions.\n    // If there are transient transitions, continue checking for more transitions\n    // because an transient transition should be triggered even if there are no\n    // enabled transitions.\n    //\n    // If we're already working on an transient transition (by checking\n    // if the event is a NULL_EVENT), then stop to prevent an infinite loop.\n    //\n    // Otherwise, if there are no enabled nor transient transitions, we are done.\n\n    if (!willTransition && (!isTransient || _event.name === NULL_EVENT)) {\n      return nextState;\n    }\n\n    var maybeNextState = nextState;\n\n    if (!isDone) {\n      if (isTransient) {\n        maybeNextState = this.resolveRaisedTransition(maybeNextState, {\n          type: nullEvent\n        }, _event);\n      }\n\n      while (raisedEvents.length) {\n        var raisedEvent = raisedEvents.shift();\n        maybeNextState = this.resolveRaisedTransition(maybeNextState, raisedEvent._event, _event);\n      }\n    } // Detect if state changed\n\n\n    var changed = maybeNextState.changed || (history ? !!maybeNextState.actions.length || didUpdateContext || typeof history.value !== typeof maybeNextState.value || !stateValuesEqual(maybeNextState.value, history.value) : undefined);\n    maybeNextState.changed = changed; // Preserve original history after raised events\n\n    maybeNextState.history = history;\n    maybeNextState.tags = getTagsFromConfiguration(maybeNextState.configuration);\n    return maybeNextState;\n  };\n  /**\r\n   * Returns the child state node from its relative `stateKey`, or throws.\r\n   */\n\n\n  StateNode.prototype.getStateNode = function (stateKey) {\n    if (isStateId(stateKey)) {\n      return this.machine.getStateNodeById(stateKey);\n    }\n\n    if (!this.states) {\n      throw new Error(\"Unable to retrieve child state '\".concat(stateKey, \"' from '\").concat(this.id, \"'; no child states exist.\"));\n    }\n\n    var result = this.states[stateKey];\n\n    if (!result) {\n      throw new Error(\"Child state '\".concat(stateKey, \"' does not exist on '\").concat(this.id, \"'\"));\n    }\n\n    return result;\n  };\n  /**\r\n   * Returns the state node with the given `stateId`, or throws.\r\n   *\r\n   * @param stateId The state ID. The prefix \"#\" is removed.\r\n   */\n\n\n  StateNode.prototype.getStateNodeById = function (stateId) {\n    var resolvedStateId = isStateId(stateId) ? stateId.slice(STATE_IDENTIFIER.length) : stateId;\n\n    if (resolvedStateId === this.id) {\n      return this;\n    }\n\n    var stateNode = this.machine.idMap[resolvedStateId];\n\n    if (!stateNode) {\n      throw new Error(\"Child state node '#\".concat(resolvedStateId, \"' does not exist on machine '\").concat(this.id, \"'\"));\n    }\n\n    return stateNode;\n  };\n  /**\r\n   * Returns the relative state node from the given `statePath`, or throws.\r\n   *\r\n   * @param statePath The string or string array relative path to the state node.\r\n   */\n\n\n  StateNode.prototype.getStateNodeByPath = function (statePath) {\n    if (typeof statePath === 'string' && isStateId(statePath)) {\n      try {\n        return this.getStateNodeById(statePath.slice(1));\n      } catch (e) {// try individual paths\n        // throw e;\n      }\n    }\n\n    var arrayStatePath = toStatePath(statePath, this.delimiter).slice();\n    var currentStateNode = this;\n\n    while (arrayStatePath.length) {\n      var key = arrayStatePath.shift();\n\n      if (!key.length) {\n        break;\n      }\n\n      currentStateNode = currentStateNode.getStateNode(key);\n    }\n\n    return currentStateNode;\n  };\n  /**\r\n   * Resolves a partial state value with its full representation in this machine.\r\n   *\r\n   * @param stateValue The partial state value to resolve.\r\n   */\n\n\n  StateNode.prototype.resolve = function (stateValue) {\n    var _a;\n\n    var _this = this;\n\n    if (!stateValue) {\n      return this.initialStateValue || EMPTY_OBJECT; // TODO: type-specific properties\n    }\n\n    switch (this.type) {\n      case 'parallel':\n        return mapValues(this.initialStateValue, function (subStateValue, subStateKey) {\n          return subStateValue ? _this.getStateNode(subStateKey).resolve(stateValue[subStateKey] || subStateValue) : EMPTY_OBJECT;\n        });\n\n      case 'compound':\n        if (isString(stateValue)) {\n          var subStateNode = this.getStateNode(stateValue);\n\n          if (subStateNode.type === 'parallel' || subStateNode.type === 'compound') {\n            return _a = {}, _a[stateValue] = subStateNode.initialStateValue, _a;\n          }\n\n          return stateValue;\n        }\n\n        if (!keys(stateValue).length) {\n          return this.initialStateValue || {};\n        }\n\n        return mapValues(stateValue, function (subStateValue, subStateKey) {\n          return subStateValue ? _this.getStateNode(subStateKey).resolve(subStateValue) : EMPTY_OBJECT;\n        });\n\n      default:\n        return stateValue || EMPTY_OBJECT;\n    }\n  };\n\n  StateNode.prototype.getResolvedPath = function (stateIdentifier) {\n    if (isStateId(stateIdentifier)) {\n      var stateNode = this.machine.idMap[stateIdentifier.slice(STATE_IDENTIFIER.length)];\n\n      if (!stateNode) {\n        throw new Error(\"Unable to find state node '\".concat(stateIdentifier, \"'\"));\n      }\n\n      return stateNode.path;\n    }\n\n    return toStatePath(stateIdentifier, this.delimiter);\n  };\n\n  Object.defineProperty(StateNode.prototype, \"initialStateValue\", {\n    get: function () {\n      var _a;\n\n      if (this.__cache.initialStateValue) {\n        return this.__cache.initialStateValue;\n      }\n\n      var initialStateValue;\n\n      if (this.type === 'parallel') {\n        initialStateValue = mapFilterValues(this.states, function (state) {\n          return state.initialStateValue || EMPTY_OBJECT;\n        }, function (stateNode) {\n          return !(stateNode.type === 'history');\n        });\n      } else if (this.initial !== undefined) {\n        if (!this.states[this.initial]) {\n          throw new Error(\"Initial state '\".concat(this.initial, \"' not found on '\").concat(this.key, \"'\"));\n        }\n\n        initialStateValue = isLeafNode(this.states[this.initial]) ? this.initial : (_a = {}, _a[this.initial] = this.states[this.initial].initialStateValue, _a);\n      } else {\n        // The finite state value of a machine without child states is just an empty object\n        initialStateValue = {};\n      }\n\n      this.__cache.initialStateValue = initialStateValue;\n      return this.__cache.initialStateValue;\n    },\n    enumerable: false,\n    configurable: true\n  });\n\n  StateNode.prototype.getInitialState = function (stateValue, context) {\n    var configuration = this.getStateNodes(stateValue);\n    return this.resolveTransition({\n      configuration: configuration,\n      entrySet: configuration,\n      exitSet: [],\n      transitions: [],\n      source: undefined,\n      actions: []\n    }, undefined, context !== null && context !== void 0 ? context : this.machine.context, undefined);\n  };\n\n  Object.defineProperty(StateNode.prototype, \"initialState\", {\n    /**\r\n     * The initial State instance, which includes all actions to be executed from\r\n     * entering the initial state.\r\n     */\n    get: function () {\n      this._init(); // TODO: this should be in the constructor (see note in constructor)\n\n\n      var initialStateValue = this.initialStateValue;\n\n      if (!initialStateValue) {\n        throw new Error(\"Cannot retrieve initial state from simple state '\".concat(this.id, \"'.\"));\n      }\n\n      return this.getInitialState(initialStateValue);\n    },\n    enumerable: false,\n    configurable: true\n  });\n  Object.defineProperty(StateNode.prototype, \"target\", {\n    /**\r\n     * The target state value of the history state node, if it exists. This represents the\r\n     * default state value to transition to if no history value exists yet.\r\n     */\n    get: function () {\n      var target;\n\n      if (this.type === 'history') {\n        var historyConfig = this.config;\n\n        if (isString(historyConfig.target)) {\n          target = isStateId(historyConfig.target) ? pathToStateValue(this.machine.getStateNodeById(historyConfig.target).path.slice(this.path.length - 1)) : historyConfig.target;\n        } else {\n          target = historyConfig.target;\n        }\n      }\n\n      return target;\n    },\n    enumerable: false,\n    configurable: true\n  });\n  /**\r\n   * Returns the leaf nodes from a state path relative to this state node.\r\n   *\r\n   * @param relativeStateId The relative state path to retrieve the state nodes\r\n   * @param history The previous state to retrieve history\r\n   * @param resolve Whether state nodes should resolve to initial child state nodes\r\n   */\n\n  StateNode.prototype.getRelativeStateNodes = function (relativeStateId, historyValue, resolve) {\n    if (resolve === void 0) {\n      resolve = true;\n    }\n\n    return resolve ? relativeStateId.type === 'history' ? relativeStateId.resolveHistory(historyValue) : relativeStateId.initialStateNodes : [relativeStateId];\n  };\n\n  Object.defineProperty(StateNode.prototype, \"initialStateNodes\", {\n    get: function () {\n      var _this = this;\n\n      if (isLeafNode(this)) {\n        return [this];\n      } // Case when state node is compound but no initial state is defined\n\n\n      if (this.type === 'compound' && !this.initial) {\n        if (!IS_PRODUCTION) {\n          warn(false, \"Compound state node '\".concat(this.id, \"' has no initial state.\"));\n        }\n\n        return [this];\n      }\n\n      var initialStateNodePaths = toStatePaths(this.initialStateValue);\n      return flatten(initialStateNodePaths.map(function (initialPath) {\n        return _this.getFromRelativePath(initialPath);\n      }));\n    },\n    enumerable: false,\n    configurable: true\n  });\n  /**\r\n   * Retrieves state nodes from a relative path to this state node.\r\n   *\r\n   * @param relativePath The relative path from this state node\r\n   * @param historyValue\r\n   */\n\n  StateNode.prototype.getFromRelativePath = function (relativePath) {\n    if (!relativePath.length) {\n      return [this];\n    }\n\n    var _a = __read(relativePath),\n        stateKey = _a[0],\n        childStatePath = _a.slice(1);\n\n    if (!this.states) {\n      throw new Error(\"Cannot retrieve subPath '\".concat(stateKey, \"' from node with no states\"));\n    }\n\n    var childStateNode = this.getStateNode(stateKey);\n\n    if (childStateNode.type === 'history') {\n      return childStateNode.resolveHistory();\n    }\n\n    if (!this.states[stateKey]) {\n      throw new Error(\"Child state '\".concat(stateKey, \"' does not exist on '\").concat(this.id, \"'\"));\n    }\n\n    return this.states[stateKey].getFromRelativePath(childStatePath);\n  };\n\n  StateNode.prototype.historyValue = function (relativeStateValue) {\n    if (!keys(this.states).length) {\n      return undefined;\n    }\n\n    return {\n      current: relativeStateValue || this.initialStateValue,\n      states: mapFilterValues(this.states, function (stateNode, key) {\n        if (!relativeStateValue) {\n          return stateNode.historyValue();\n        }\n\n        var subStateValue = isString(relativeStateValue) ? undefined : relativeStateValue[key];\n        return stateNode.historyValue(subStateValue || stateNode.initialStateValue);\n      }, function (stateNode) {\n        return !stateNode.history;\n      })\n    };\n  };\n  /**\r\n   * Resolves to the historical value(s) of the parent state node,\r\n   * represented by state nodes.\r\n   *\r\n   * @param historyValue\r\n   */\n\n\n  StateNode.prototype.resolveHistory = function (historyValue) {\n    var _this = this;\n\n    if (this.type !== 'history') {\n      return [this];\n    }\n\n    var parent = this.parent;\n\n    if (!historyValue) {\n      var historyTarget = this.target;\n      return historyTarget ? flatten(toStatePaths(historyTarget).map(function (relativeChildPath) {\n        return parent.getFromRelativePath(relativeChildPath);\n      })) : parent.initialStateNodes;\n    }\n\n    var subHistoryValue = nestedPath(parent.path, 'states')(historyValue).current;\n\n    if (isString(subHistoryValue)) {\n      return [parent.getStateNode(subHistoryValue)];\n    }\n\n    return flatten(toStatePaths(subHistoryValue).map(function (subStatePath) {\n      return _this.history === 'deep' ? parent.getFromRelativePath(subStatePath) : [parent.states[subStatePath[0]]];\n    }));\n  };\n\n  Object.defineProperty(StateNode.prototype, \"stateIds\", {\n    /**\r\n     * All the state node IDs of this state node and its descendant state nodes.\r\n     */\n    get: function () {\n      var _this = this;\n\n      var childStateIds = flatten(keys(this.states).map(function (stateKey) {\n        return _this.states[stateKey].stateIds;\n      }));\n      return [this.id].concat(childStateIds);\n    },\n    enumerable: false,\n    configurable: true\n  });\n  Object.defineProperty(StateNode.prototype, \"events\", {\n    /**\r\n     * All the event types accepted by this state node and its descendants.\r\n     */\n    get: function () {\n      var e_7, _a, e_8, _b;\n\n      if (this.__cache.events) {\n        return this.__cache.events;\n      }\n\n      var states = this.states;\n      var events = new Set(this.ownEvents);\n\n      if (states) {\n        try {\n          for (var _c = __values(keys(states)), _d = _c.next(); !_d.done; _d = _c.next()) {\n            var stateId = _d.value;\n            var state = states[stateId];\n\n            if (state.states) {\n              try {\n                for (var _e = (e_8 = void 0, __values(state.events)), _f = _e.next(); !_f.done; _f = _e.next()) {\n                  var event_1 = _f.value;\n                  events.add(\"\".concat(event_1));\n                }\n              } catch (e_8_1) {\n                e_8 = {\n                  error: e_8_1\n                };\n              } finally {\n                try {\n                  if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\n                } finally {\n                  if (e_8) throw e_8.error;\n                }\n              }\n            }\n          }\n        } catch (e_7_1) {\n          e_7 = {\n            error: e_7_1\n          };\n        } finally {\n          try {\n            if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n          } finally {\n            if (e_7) throw e_7.error;\n          }\n        }\n      }\n\n      return this.__cache.events = Array.from(events);\n    },\n    enumerable: false,\n    configurable: true\n  });\n  Object.defineProperty(StateNode.prototype, \"ownEvents\", {\n    /**\r\n     * All the events that have transitions directly from this state node.\r\n     *\r\n     * Excludes any inert events.\r\n     */\n    get: function () {\n      var events = new Set(this.transitions.filter(function (transition) {\n        return !(!transition.target && !transition.actions.length && transition.internal);\n      }).map(function (transition) {\n        return transition.eventType;\n      }));\n      return Array.from(events);\n    },\n    enumerable: false,\n    configurable: true\n  });\n\n  StateNode.prototype.resolveTarget = function (_target) {\n    var _this = this;\n\n    if (_target === undefined) {\n      // an undefined target signals that the state node should not transition from that state when receiving that event\n      return undefined;\n    }\n\n    return _target.map(function (target) {\n      if (!isString(target)) {\n        return target;\n      }\n\n      var isInternalTarget = target[0] === _this.delimiter; // If internal target is defined on machine,\n      // do not include machine key on target\n\n      if (isInternalTarget && !_this.parent) {\n        return _this.getStateNodeByPath(target.slice(1));\n      }\n\n      var resolvedTarget = isInternalTarget ? _this.key + target : target;\n\n      if (_this.parent) {\n        try {\n          var targetStateNode = _this.parent.getStateNodeByPath(resolvedTarget);\n\n          return targetStateNode;\n        } catch (err) {\n          throw new Error(\"Invalid transition definition for state node '\".concat(_this.id, \"':\\n\").concat(err.message));\n        }\n      } else {\n        return _this.getStateNodeByPath(resolvedTarget);\n      }\n    });\n  };\n\n  StateNode.prototype.formatTransition = function (transitionConfig) {\n    var _this = this;\n\n    var normalizedTarget = normalizeTarget(transitionConfig.target);\n    var internal = 'internal' in transitionConfig ? transitionConfig.internal : normalizedTarget ? normalizedTarget.some(function (_target) {\n      return isString(_target) && _target[0] === _this.delimiter;\n    }) : true;\n    var guards = this.machine.options.guards;\n    var target = this.resolveTarget(normalizedTarget);\n\n    var transition = __assign(__assign({}, transitionConfig), {\n      actions: toActionObjects(toArray(transitionConfig.actions)),\n      cond: toGuard(transitionConfig.cond, guards),\n      target: target,\n      source: this,\n      internal: internal,\n      eventType: transitionConfig.event,\n      toJSON: function () {\n        return __assign(__assign({}, transition), {\n          target: transition.target ? transition.target.map(function (t) {\n            return \"#\".concat(t.id);\n          }) : undefined,\n          source: \"#\".concat(_this.id)\n        });\n      }\n    });\n\n    return transition;\n  };\n\n  StateNode.prototype.formatTransitions = function () {\n    var e_9, _a;\n\n    var _this = this;\n\n    var onConfig;\n\n    if (!this.config.on) {\n      onConfig = [];\n    } else if (Array.isArray(this.config.on)) {\n      onConfig = this.config.on;\n    } else {\n      var _b = this.config.on,\n          _c = WILDCARD,\n          _d = _b[_c],\n          wildcardConfigs = _d === void 0 ? [] : _d,\n          strictTransitionConfigs_1 = __rest(_b, [typeof _c === \"symbol\" ? _c : _c + \"\"]);\n\n      onConfig = flatten(keys(strictTransitionConfigs_1).map(function (key) {\n        if (!IS_PRODUCTION && key === NULL_EVENT) {\n          warn(false, \"Empty string transition configs (e.g., `{ on: { '': ... }}`) for transient transitions are deprecated. Specify the transition in the `{ always: ... }` property instead. \" + \"Please check the `on` configuration for \\\"#\".concat(_this.id, \"\\\".\"));\n        }\n\n        var transitionConfigArray = toTransitionConfigArray(key, strictTransitionConfigs_1[key]);\n\n        if (!IS_PRODUCTION) {\n          validateArrayifiedTransitions(_this, key, transitionConfigArray);\n        }\n\n        return transitionConfigArray;\n      }).concat(toTransitionConfigArray(WILDCARD, wildcardConfigs)));\n    }\n\n    var eventlessConfig = this.config.always ? toTransitionConfigArray('', this.config.always) : [];\n    var doneConfig = this.config.onDone ? toTransitionConfigArray(String(done(this.id)), this.config.onDone) : [];\n\n    if (!IS_PRODUCTION) {\n      warn(!(this.config.onDone && !this.parent), \"Root nodes cannot have an \\\".onDone\\\" transition. Please check the config of \\\"\".concat(this.id, \"\\\".\"));\n    }\n\n    var invokeConfig = flatten(this.invoke.map(function (invokeDef) {\n      var settleTransitions = [];\n\n      if (invokeDef.onDone) {\n        settleTransitions.push.apply(settleTransitions, __spreadArray([], __read(toTransitionConfigArray(String(doneInvoke(invokeDef.id)), invokeDef.onDone)), false));\n      }\n\n      if (invokeDef.onError) {\n        settleTransitions.push.apply(settleTransitions, __spreadArray([], __read(toTransitionConfigArray(String(error(invokeDef.id)), invokeDef.onError)), false));\n      }\n\n      return settleTransitions;\n    }));\n    var delayedTransitions = this.after;\n    var formattedTransitions = flatten(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(doneConfig), false), __read(invokeConfig), false), __read(onConfig), false), __read(eventlessConfig), false).map(function (transitionConfig) {\n      return toArray(transitionConfig).map(function (transition) {\n        return _this.formatTransition(transition);\n      });\n    }));\n\n    try {\n      for (var delayedTransitions_1 = __values(delayedTransitions), delayedTransitions_1_1 = delayedTransitions_1.next(); !delayedTransitions_1_1.done; delayedTransitions_1_1 = delayedTransitions_1.next()) {\n        var delayedTransition = delayedTransitions_1_1.value;\n        formattedTransitions.push(delayedTransition);\n      }\n    } catch (e_9_1) {\n      e_9 = {\n        error: e_9_1\n      };\n    } finally {\n      try {\n        if (delayedTransitions_1_1 && !delayedTransitions_1_1.done && (_a = delayedTransitions_1.return)) _a.call(delayedTransitions_1);\n      } finally {\n        if (e_9) throw e_9.error;\n      }\n    }\n\n    return formattedTransitions;\n  };\n\n  return StateNode;\n}();\n\nexport { StateNode };\n", "import { StateNode } from './StateNode.js';\n\nfunction Machine(config, options, initialContext) {\n  if (initialContext === void 0) {\n    initialContext = config.context;\n  }\n\n  return new StateNode(config, options, initialContext);\n}\nfunction createMachine(config, options) {\n  return new StateNode(config, options);\n}\n\nexport { Machine, createMachine };\n", "import { __assign } from './_virtual/_tslib.js';\n\nvar defaultOptions = {\n  deferEvents: false\n};\n\nvar Scheduler =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n  function Scheduler(options) {\n    this.processingEvent = false;\n    this.queue = [];\n    this.initialized = false;\n    this.options = __assign(__assign({}, defaultOptions), options);\n  }\n\n  Scheduler.prototype.initialize = function (callback) {\n    this.initialized = true;\n\n    if (callback) {\n      if (!this.options.deferEvents) {\n        this.schedule(callback);\n        return;\n      }\n\n      this.process(callback);\n    }\n\n    this.flushEvents();\n  };\n\n  Scheduler.prototype.schedule = function (task) {\n    if (!this.initialized || this.processingEvent) {\n      this.queue.push(task);\n      return;\n    }\n\n    if (this.queue.length !== 0) {\n      throw new Error('Event queue should be empty when it is not processing events');\n    }\n\n    this.process(task);\n    this.flushEvents();\n  };\n\n  Scheduler.prototype.clear = function () {\n    this.queue = [];\n  };\n\n  Scheduler.prototype.flushEvents = function () {\n    var nextCallback = this.queue.shift();\n\n    while (nextCallback) {\n      this.process(nextCallback);\n      nextCallback = this.queue.shift();\n    }\n  };\n\n  Scheduler.prototype.process = function (callback) {\n    this.processingEvent = true;\n\n    try {\n      callback();\n    } catch (e) {\n      // there is no use to keep the future events\n      // as the situation is not anymore the same\n      this.clear();\n      throw e;\n    } finally {\n      this.processingEvent = false;\n    }\n  };\n\n  return Scheduler;\n}();\n\nexport { Scheduler };\n", "var children = /*#__PURE__*/new Map();\nvar sessionIdIndex = 0;\nvar registry = {\n  bookId: function () {\n    return \"x:\".concat(sessionIdIndex++);\n  },\n  register: function (id, actor) {\n    children.set(id, actor);\n    return id;\n  },\n  get: function (id) {\n    return children.get(id);\n  },\n  free: function (id) {\n    children.delete(id);\n  }\n};\n\nexport { registry };\n", "// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis\nfunction getGlobal() {\n  if (typeof globalThis !== 'undefined') {\n    return globalThis;\n  }\n\n  if (typeof self !== 'undefined') {\n    return self;\n  }\n\n  if (typeof window !== 'undefined') {\n    return window;\n  }\n\n  if (typeof global !== 'undefined') {\n    return global;\n  }\n\n  return undefined;\n}\n\nfunction getDevTools() {\n  var global = getGlobal();\n\n  if (global && '__xstate__' in global) {\n    return global.__xstate__;\n  }\n\n  return undefined;\n}\n\nfunction registerService(service) {\n  if (!getGlobal()) {\n    return;\n  }\n\n  var devTools = getDevTools();\n\n  if (devTools) {\n    devTools.register(service);\n  }\n}\n\nexport { getGlobal, registerService };\n", "import './environment.js';\nimport { toObserver } from './utils.js';\nimport './types.js';\nimport './actionTypes.js';\nimport { toActorRef } from './Actor.js';\n\nfunction spawnBehavior(behavior, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var state = behavior.initialState;\n  var observers = new Set();\n  var mailbox = [];\n  var flushing = false;\n\n  var flush = function () {\n    if (flushing) {\n      return;\n    }\n\n    flushing = true;\n\n    while (mailbox.length > 0) {\n      var event_1 = mailbox.shift();\n      state = behavior.transition(state, event_1, actorCtx);\n      observers.forEach(function (observer) {\n        return observer.next(state);\n      });\n    }\n\n    flushing = false;\n  };\n\n  var actor = toActorRef({\n    id: options.id,\n    send: function (event) {\n      mailbox.push(event);\n      flush();\n    },\n    getSnapshot: function () {\n      return state;\n    },\n    subscribe: function (next, handleError, complete) {\n      var observer = toObserver(next, handleError, complete);\n      observers.add(observer);\n      observer.next(state);\n      return {\n        unsubscribe: function () {\n          observers.delete(observer);\n        }\n      };\n    }\n  });\n  var actorCtx = {\n    parent: options.parent,\n    self: actor,\n    id: options.id || 'anonymous',\n    observers: observers\n  };\n  state = behavior.start ? behavior.start(actorCtx) : state;\n  return actor;\n}\n\nexport { spawnBehavior };\n", "import { __values, __spreadArray, __read, __assign } from './_virtual/_tslib.js';\nimport { IS_PRODUCTION } from './environment.js';\nimport { warn, mapContext, isFunction, keys, toSCXMLEvent, toInvokeSource, isMachine, isPromiseLike, isObservable, isBehavior, reportUnhandledExceptionOnInvocation, interopSymbols, symbolObservable, isArray, toEventObject, isString, isActor, toObserver, uniqueId } from './utils.js';\nimport { ActionTypes, SpecialTargets } from './types.js';\nimport { isInFinalState } from './stateUtils.js';\nimport { errorPlatform, log, stop, start, cancel, send, update, error as error$1 } from './actionTypes.js';\nimport { doneInvoke, initEvent, getActionFunction, error } from './actions.js';\nimport { isState, State, bindActionToState } from './State.js';\nimport { provide, consume } from './serviceScope.js';\nimport { isSpawnedActor, createDeferredActor } from './Actor.js';\nimport { Scheduler } from './scheduler.js';\nimport { registry } from './registry.js';\nimport { registerService, getGlobal } from './devTools.js';\nimport { spawnBehavior } from './behaviors.js';\n\nvar DEFAULT_SPAWN_OPTIONS = {\n  sync: false,\n  autoForward: false\n};\nvar InterpreterStatus;\n\n(function (InterpreterStatus) {\n  InterpreterStatus[InterpreterStatus[\"NotStarted\"] = 0] = \"NotStarted\";\n  InterpreterStatus[InterpreterStatus[\"Running\"] = 1] = \"Running\";\n  InterpreterStatus[InterpreterStatus[\"Stopped\"] = 2] = \"Stopped\";\n})(InterpreterStatus || (InterpreterStatus = {}));\n\nvar Interpreter =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n  /**\r\n   * Creates a new Interpreter instance (i.e., service) for the given machine with the provided options, if any.\r\n   *\r\n   * @param machine The machine to be interpreted\r\n   * @param options Interpreter options\r\n   */\n  function Interpreter(machine, options) {\n    var _this = this;\n\n    if (options === void 0) {\n      options = Interpreter.defaultOptions;\n    }\n\n    this.machine = machine;\n    this.scheduler = new Scheduler();\n    this.delayedEventsMap = {};\n    this.listeners = new Set();\n    this.contextListeners = new Set();\n    this.stopListeners = new Set();\n    this.doneListeners = new Set();\n    this.eventListeners = new Set();\n    this.sendListeners = new Set();\n    /**\r\n     * Whether the service is started.\r\n     */\n\n    this.initialized = false;\n    this.status = InterpreterStatus.NotStarted;\n    this.children = new Map();\n    this.forwardTo = new Set();\n    /**\r\n     * Alias for Interpreter.prototype.start\r\n     */\n\n    this.init = this.start;\n    /**\r\n     * Sends an event to the running interpreter to trigger a transition.\r\n     *\r\n     * An array of events (batched) can be sent as well, which will send all\r\n     * batched events to the running interpreter. The listeners will be\r\n     * notified only **once** when all events are processed.\r\n     *\r\n     * @param event The event(s) to send\r\n     */\n\n    this.send = function (event, payload) {\n      if (isArray(event)) {\n        _this.batch(event);\n\n        return _this.state;\n      }\n\n      var _event = toSCXMLEvent(toEventObject(event, payload));\n\n      if (_this.status === InterpreterStatus.Stopped) {\n        // do nothing\n        if (!IS_PRODUCTION) {\n          warn(false, \"Event \\\"\".concat(_event.name, \"\\\" was sent to stopped service \\\"\").concat(_this.machine.id, \"\\\". This service has already reached its final state, and will not transition.\\nEvent: \").concat(JSON.stringify(_event.data)));\n        }\n\n        return _this.state;\n      }\n\n      if (_this.status !== InterpreterStatus.Running && !_this.options.deferEvents) {\n        throw new Error(\"Event \\\"\".concat(_event.name, \"\\\" was sent to uninitialized service \\\"\").concat(_this.machine.id // tslint:disable-next-line:max-line-length\n        , \"\\\". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.\\nEvent: \").concat(JSON.stringify(_event.data)));\n      }\n\n      _this.scheduler.schedule(function () {\n        // Forward copy of event to child actors\n        _this.forward(_event);\n\n        var nextState = _this.nextState(_event);\n\n        _this.update(nextState, _event);\n      });\n\n      return _this._state; // TODO: deprecate (should return void)\n      // tslint:disable-next-line:semicolon\n    };\n\n    this.sendTo = function (event, to) {\n      var isParent = _this.parent && (to === SpecialTargets.Parent || _this.parent.id === to);\n      var target = isParent ? _this.parent : isString(to) ? _this.children.get(to) || registry.get(to) : isActor(to) ? to : undefined;\n\n      if (!target) {\n        if (!isParent) {\n          throw new Error(\"Unable to send event to child '\".concat(to, \"' from service '\").concat(_this.id, \"'.\"));\n        } // tslint:disable-next-line:no-console\n\n\n        if (!IS_PRODUCTION) {\n          warn(false, \"Service '\".concat(_this.id, \"' has no parent: unable to send event \").concat(event.type));\n        }\n\n        return;\n      }\n\n      if ('machine' in target) {\n        // Send SCXML events to machines\n        target.send(__assign(__assign({}, event), {\n          name: event.name === error$1 ? \"\".concat(error(_this.id)) : event.name,\n          origin: _this.sessionId\n        }));\n      } else {\n        // Send normal events to other targets\n        target.send(event.data);\n      }\n    };\n\n    var resolvedOptions = __assign(__assign({}, Interpreter.defaultOptions), options);\n\n    var clock = resolvedOptions.clock,\n        logger = resolvedOptions.logger,\n        parent = resolvedOptions.parent,\n        id = resolvedOptions.id;\n    var resolvedId = id !== undefined ? id : machine.id;\n    this.id = resolvedId;\n    this.logger = logger;\n    this.clock = clock;\n    this.parent = parent;\n    this.options = resolvedOptions;\n    this.scheduler = new Scheduler({\n      deferEvents: this.options.deferEvents\n    });\n    this.sessionId = registry.bookId();\n  }\n\n  Object.defineProperty(Interpreter.prototype, \"initialState\", {\n    get: function () {\n      var _this = this;\n\n      if (this._initialState) {\n        return this._initialState;\n      }\n\n      return provide(this, function () {\n        _this._initialState = _this.machine.initialState;\n        return _this._initialState;\n      });\n    },\n    enumerable: false,\n    configurable: true\n  });\n  Object.defineProperty(Interpreter.prototype, \"state\", {\n    get: function () {\n      if (!IS_PRODUCTION) {\n        warn(this.status !== InterpreterStatus.NotStarted, \"Attempted to read state from uninitialized service '\".concat(this.id, \"'. Make sure the service is started first.\"));\n      }\n\n      return this._state;\n    },\n    enumerable: false,\n    configurable: true\n  });\n  /**\r\n   * Executes the actions of the given state, with that state's `context` and `event`.\r\n   *\r\n   * @param state The state whose actions will be executed\r\n   * @param actionsConfig The action implementations to use\r\n   */\n\n  Interpreter.prototype.execute = function (state, actionsConfig) {\n    var e_1, _a;\n\n    try {\n      for (var _b = __values(state.actions), _c = _b.next(); !_c.done; _c = _b.next()) {\n        var action = _c.value;\n        this.exec(action, state, actionsConfig);\n      }\n    } catch (e_1_1) {\n      e_1 = {\n        error: e_1_1\n      };\n    } finally {\n      try {\n        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n      } finally {\n        if (e_1) throw e_1.error;\n      }\n    }\n  };\n\n  Interpreter.prototype.update = function (state, _event) {\n    var e_2, _a, e_3, _b, e_4, _c, e_5, _d;\n\n    var _this = this; // Attach session ID to state\n\n\n    state._sessionid = this.sessionId; // Update state\n\n    this._state = state; // Execute actions\n\n    if (this.options.execute) {\n      this.execute(this.state);\n    } // Update children\n\n\n    this.children.forEach(function (child) {\n      _this.state.children[child.id] = child;\n    }); // Dev tools\n\n    if (this.devTools) {\n      this.devTools.send(_event.data, state);\n    } // Execute listeners\n\n\n    if (state.event) {\n      try {\n        for (var _e = __values(this.eventListeners), _f = _e.next(); !_f.done; _f = _e.next()) {\n          var listener = _f.value;\n          listener(state.event);\n        }\n      } catch (e_2_1) {\n        e_2 = {\n          error: e_2_1\n        };\n      } finally {\n        try {\n          if (_f && !_f.done && (_a = _e.return)) _a.call(_e);\n        } finally {\n          if (e_2) throw e_2.error;\n        }\n      }\n    }\n\n    try {\n      for (var _g = __values(this.listeners), _h = _g.next(); !_h.done; _h = _g.next()) {\n        var listener = _h.value;\n        listener(state, state.event);\n      }\n    } catch (e_3_1) {\n      e_3 = {\n        error: e_3_1\n      };\n    } finally {\n      try {\n        if (_h && !_h.done && (_b = _g.return)) _b.call(_g);\n      } finally {\n        if (e_3) throw e_3.error;\n      }\n    }\n\n    try {\n      for (var _j = __values(this.contextListeners), _k = _j.next(); !_k.done; _k = _j.next()) {\n        var contextListener = _k.value;\n        contextListener(this.state.context, this.state.history ? this.state.history.context : undefined);\n      }\n    } catch (e_4_1) {\n      e_4 = {\n        error: e_4_1\n      };\n    } finally {\n      try {\n        if (_k && !_k.done && (_c = _j.return)) _c.call(_j);\n      } finally {\n        if (e_4) throw e_4.error;\n      }\n    }\n\n    var isDone = isInFinalState(state.configuration || [], this.machine);\n\n    if (this.state.configuration && isDone) {\n      // get final child state node\n      var finalChildStateNode = state.configuration.find(function (sn) {\n        return sn.type === 'final' && sn.parent === _this.machine;\n      });\n      var doneData = finalChildStateNode && finalChildStateNode.doneData ? mapContext(finalChildStateNode.doneData, state.context, _event) : undefined;\n\n      try {\n        for (var _l = __values(this.doneListeners), _m = _l.next(); !_m.done; _m = _l.next()) {\n          var listener = _m.value;\n          listener(doneInvoke(this.id, doneData));\n        }\n      } catch (e_5_1) {\n        e_5 = {\n          error: e_5_1\n        };\n      } finally {\n        try {\n          if (_m && !_m.done && (_d = _l.return)) _d.call(_l);\n        } finally {\n          if (e_5) throw e_5.error;\n        }\n      }\n\n      this.stop();\n    }\n  };\n  /*\r\n   * Adds a listener that is notified whenever a state transition happens. The listener is called with\r\n   * the next state and the event object that caused the state transition.\r\n   *\r\n   * @param listener The state listener\r\n   */\n\n\n  Interpreter.prototype.onTransition = function (listener) {\n    this.listeners.add(listener); // Send current state to listener\n\n    if (this.status === InterpreterStatus.Running) {\n      listener(this.state, this.state.event);\n    }\n\n    return this;\n  };\n\n  Interpreter.prototype.subscribe = function (nextListenerOrObserver, _, // TODO: error listener\n  completeListener) {\n    var _this = this;\n\n    if (!nextListenerOrObserver) {\n      return {\n        unsubscribe: function () {\n          return void 0;\n        }\n      };\n    }\n\n    var listener;\n    var resolvedCompleteListener = completeListener;\n\n    if (typeof nextListenerOrObserver === 'function') {\n      listener = nextListenerOrObserver;\n    } else {\n      listener = nextListenerOrObserver.next.bind(nextListenerOrObserver);\n      resolvedCompleteListener = nextListenerOrObserver.complete.bind(nextListenerOrObserver);\n    }\n\n    this.listeners.add(listener); // Send current state to listener\n\n    if (this.status === InterpreterStatus.Running) {\n      listener(this.state);\n    }\n\n    if (resolvedCompleteListener) {\n      this.onDone(resolvedCompleteListener);\n    }\n\n    return {\n      unsubscribe: function () {\n        listener && _this.listeners.delete(listener);\n        resolvedCompleteListener && _this.doneListeners.delete(resolvedCompleteListener);\n      }\n    };\n  };\n  /**\r\n   * Adds an event listener that is notified whenever an event is sent to the running interpreter.\r\n   * @param listener The event listener\r\n   */\n\n\n  Interpreter.prototype.onEvent = function (listener) {\n    this.eventListeners.add(listener);\n    return this;\n  };\n  /**\r\n   * Adds an event listener that is notified whenever a `send` event occurs.\r\n   * @param listener The event listener\r\n   */\n\n\n  Interpreter.prototype.onSend = function (listener) {\n    this.sendListeners.add(listener);\n    return this;\n  };\n  /**\r\n   * Adds a context listener that is notified whenever the state context changes.\r\n   * @param listener The context listener\r\n   */\n\n\n  Interpreter.prototype.onChange = function (listener) {\n    this.contextListeners.add(listener);\n    return this;\n  };\n  /**\r\n   * Adds a listener that is notified when the machine is stopped.\r\n   * @param listener The listener\r\n   */\n\n\n  Interpreter.prototype.onStop = function (listener) {\n    this.stopListeners.add(listener);\n    return this;\n  };\n  /**\r\n   * Adds a state listener that is notified when the statechart has reached its final state.\r\n   * @param listener The state listener\r\n   */\n\n\n  Interpreter.prototype.onDone = function (listener) {\n    this.doneListeners.add(listener);\n    return this;\n  };\n  /**\r\n   * Removes a listener.\r\n   * @param listener The listener to remove\r\n   */\n\n\n  Interpreter.prototype.off = function (listener) {\n    this.listeners.delete(listener);\n    this.eventListeners.delete(listener);\n    this.sendListeners.delete(listener);\n    this.stopListeners.delete(listener);\n    this.doneListeners.delete(listener);\n    this.contextListeners.delete(listener);\n    return this;\n  };\n  /**\r\n   * Starts the interpreter from the given state, or the initial state.\r\n   * @param initialState The state to start the statechart from\r\n   */\n\n\n  Interpreter.prototype.start = function (initialState) {\n    var _this = this;\n\n    if (this.status === InterpreterStatus.Running) {\n      // Do not restart the service if it is already started\n      return this;\n    }\n\n    registry.register(this.sessionId, this);\n    this.initialized = true;\n    this.status = InterpreterStatus.Running;\n    var resolvedState = initialState === undefined ? this.initialState : provide(this, function () {\n      return isState(initialState) ? _this.machine.resolveState(initialState) : _this.machine.resolveState(State.from(initialState, _this.machine.context));\n    });\n\n    if (this.options.devTools) {\n      this.attachDev();\n    }\n\n    this.scheduler.initialize(function () {\n      _this.update(resolvedState, initEvent);\n    });\n    return this;\n  };\n  /**\r\n   * Stops the interpreter and unsubscribe all listeners.\r\n   *\r\n   * This will also notify the `onStop` listeners.\r\n   */\n\n\n  Interpreter.prototype.stop = function () {\n    var e_6, _a, e_7, _b, e_8, _c, e_9, _d, e_10, _e;\n\n    var _this = this;\n\n    try {\n      for (var _f = __values(this.listeners), _g = _f.next(); !_g.done; _g = _f.next()) {\n        var listener = _g.value;\n        this.listeners.delete(listener);\n      }\n    } catch (e_6_1) {\n      e_6 = {\n        error: e_6_1\n      };\n    } finally {\n      try {\n        if (_g && !_g.done && (_a = _f.return)) _a.call(_f);\n      } finally {\n        if (e_6) throw e_6.error;\n      }\n    }\n\n    try {\n      for (var _h = __values(this.stopListeners), _j = _h.next(); !_j.done; _j = _h.next()) {\n        var listener = _j.value; // call listener, then remove\n\n        listener();\n        this.stopListeners.delete(listener);\n      }\n    } catch (e_7_1) {\n      e_7 = {\n        error: e_7_1\n      };\n    } finally {\n      try {\n        if (_j && !_j.done && (_b = _h.return)) _b.call(_h);\n      } finally {\n        if (e_7) throw e_7.error;\n      }\n    }\n\n    try {\n      for (var _k = __values(this.contextListeners), _l = _k.next(); !_l.done; _l = _k.next()) {\n        var listener = _l.value;\n        this.contextListeners.delete(listener);\n      }\n    } catch (e_8_1) {\n      e_8 = {\n        error: e_8_1\n      };\n    } finally {\n      try {\n        if (_l && !_l.done && (_c = _k.return)) _c.call(_k);\n      } finally {\n        if (e_8) throw e_8.error;\n      }\n    }\n\n    try {\n      for (var _m = __values(this.doneListeners), _o = _m.next(); !_o.done; _o = _m.next()) {\n        var listener = _o.value;\n        this.doneListeners.delete(listener);\n      }\n    } catch (e_9_1) {\n      e_9 = {\n        error: e_9_1\n      };\n    } finally {\n      try {\n        if (_o && !_o.done && (_d = _m.return)) _d.call(_m);\n      } finally {\n        if (e_9) throw e_9.error;\n      }\n    }\n\n    if (!this.initialized) {\n      // Interpreter already stopped; do nothing\n      return this;\n    }\n\n    __spreadArray([], __read(this.state.configuration), false).sort(function (a, b) {\n      return b.order - a.order;\n    }).forEach(function (stateNode) {\n      var e_11, _a;\n\n      try {\n        for (var _b = __values(stateNode.definition.exit), _c = _b.next(); !_c.done; _c = _b.next()) {\n          var action = _c.value;\n\n          _this.exec(action, _this.state);\n        }\n      } catch (e_11_1) {\n        e_11 = {\n          error: e_11_1\n        };\n      } finally {\n        try {\n          if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n        } finally {\n          if (e_11) throw e_11.error;\n        }\n      }\n    }); // Stop all children\n\n\n    this.children.forEach(function (child) {\n      if (isFunction(child.stop)) {\n        child.stop();\n      }\n    });\n\n    try {\n      // Cancel all delayed events\n      for (var _p = __values(keys(this.delayedEventsMap)), _q = _p.next(); !_q.done; _q = _p.next()) {\n        var key = _q.value;\n        this.clock.clearTimeout(this.delayedEventsMap[key]);\n      }\n    } catch (e_10_1) {\n      e_10 = {\n        error: e_10_1\n      };\n    } finally {\n      try {\n        if (_q && !_q.done && (_e = _p.return)) _e.call(_p);\n      } finally {\n        if (e_10) throw e_10.error;\n      }\n    }\n\n    this.scheduler.clear();\n    this.initialized = false;\n    this.status = InterpreterStatus.Stopped;\n    registry.free(this.sessionId);\n    return this;\n  };\n\n  Interpreter.prototype.batch = function (events) {\n    var _this = this;\n\n    if (this.status === InterpreterStatus.NotStarted && this.options.deferEvents) {\n      // tslint:disable-next-line:no-console\n      if (!IS_PRODUCTION) {\n        warn(false, \"\".concat(events.length, \" event(s) were sent to uninitialized service \\\"\").concat(this.machine.id, \"\\\" and are deferred. Make sure .start() is called for this service.\\nEvent: \").concat(JSON.stringify(event)));\n      }\n    } else if (this.status !== InterpreterStatus.Running) {\n      throw new Error( // tslint:disable-next-line:max-line-length\n      \"\".concat(events.length, \" event(s) were sent to uninitialized service \\\"\").concat(this.machine.id, \"\\\". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.\"));\n    }\n\n    this.scheduler.schedule(function () {\n      var e_12, _a;\n\n      var nextState = _this.state;\n      var batchChanged = false;\n      var batchedActions = [];\n\n      var _loop_1 = function (event_1) {\n        var _event = toSCXMLEvent(event_1);\n\n        _this.forward(_event);\n\n        nextState = provide(_this, function () {\n          return _this.machine.transition(nextState, _event);\n        });\n        batchedActions.push.apply(batchedActions, __spreadArray([], __read(nextState.actions.map(function (a) {\n          return bindActionToState(a, nextState);\n        })), false));\n        batchChanged = batchChanged || !!nextState.changed;\n      };\n\n      try {\n        for (var events_1 = __values(events), events_1_1 = events_1.next(); !events_1_1.done; events_1_1 = events_1.next()) {\n          var event_1 = events_1_1.value;\n\n          _loop_1(event_1);\n        }\n      } catch (e_12_1) {\n        e_12 = {\n          error: e_12_1\n        };\n      } finally {\n        try {\n          if (events_1_1 && !events_1_1.done && (_a = events_1.return)) _a.call(events_1);\n        } finally {\n          if (e_12) throw e_12.error;\n        }\n      }\n\n      nextState.changed = batchChanged;\n      nextState.actions = batchedActions;\n\n      _this.update(nextState, toSCXMLEvent(events[events.length - 1]));\n    });\n  };\n  /**\r\n   * Returns a send function bound to this interpreter instance.\r\n   *\r\n   * @param event The event to be sent by the sender.\r\n   */\n\n\n  Interpreter.prototype.sender = function (event) {\n    return this.send.bind(this, event);\n  };\n  /**\r\n   * Returns the next state given the interpreter's current state and the event.\r\n   *\r\n   * This is a pure method that does _not_ update the interpreter's state.\r\n   *\r\n   * @param event The event to determine the next state\r\n   */\n\n\n  Interpreter.prototype.nextState = function (event) {\n    var _this = this;\n\n    var _event = toSCXMLEvent(event);\n\n    if (_event.name.indexOf(errorPlatform) === 0 && !this.state.nextEvents.some(function (nextEvent) {\n      return nextEvent.indexOf(errorPlatform) === 0;\n    })) {\n      throw _event.data.data;\n    }\n\n    var nextState = provide(this, function () {\n      return _this.machine.transition(_this.state, _event);\n    });\n    return nextState;\n  };\n\n  Interpreter.prototype.forward = function (event) {\n    var e_13, _a;\n\n    try {\n      for (var _b = __values(this.forwardTo), _c = _b.next(); !_c.done; _c = _b.next()) {\n        var id = _c.value;\n        var child = this.children.get(id);\n\n        if (!child) {\n          throw new Error(\"Unable to forward event '\".concat(event, \"' from interpreter '\").concat(this.id, \"' to nonexistant child '\").concat(id, \"'.\"));\n        }\n\n        child.send(event);\n      }\n    } catch (e_13_1) {\n      e_13 = {\n        error: e_13_1\n      };\n    } finally {\n      try {\n        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n      } finally {\n        if (e_13) throw e_13.error;\n      }\n    }\n  };\n\n  Interpreter.prototype.defer = function (sendAction) {\n    var _this = this;\n\n    this.delayedEventsMap[sendAction.id] = this.clock.setTimeout(function () {\n      if (sendAction.to) {\n        _this.sendTo(sendAction._event, sendAction.to);\n      } else {\n        _this.send(sendAction._event);\n      }\n    }, sendAction.delay);\n  };\n\n  Interpreter.prototype.cancel = function (sendId) {\n    this.clock.clearTimeout(this.delayedEventsMap[sendId]);\n    delete this.delayedEventsMap[sendId];\n  };\n\n  Interpreter.prototype.exec = function (action, state, actionFunctionMap) {\n    if (actionFunctionMap === void 0) {\n      actionFunctionMap = this.machine.options.actions;\n    }\n\n    var context = state.context,\n        _event = state._event;\n    var actionOrExec = action.exec || getActionFunction(action.type, actionFunctionMap);\n    var exec = isFunction(actionOrExec) ? actionOrExec : actionOrExec ? actionOrExec.exec : action.exec;\n\n    if (exec) {\n      try {\n        return exec(context, _event.data, {\n          action: action,\n          state: this.state,\n          _event: _event\n        });\n      } catch (err) {\n        if (this.parent) {\n          this.parent.send({\n            type: 'xstate.error',\n            data: err\n          });\n        }\n\n        throw err;\n      }\n    }\n\n    switch (action.type) {\n      case send:\n        var sendAction = action;\n\n        if (typeof sendAction.delay === 'number') {\n          this.defer(sendAction);\n          return;\n        } else {\n          if (sendAction.to) {\n            this.sendTo(sendAction._event, sendAction.to);\n          } else {\n            this.send(sendAction._event);\n          }\n        }\n\n        break;\n\n      case cancel:\n        this.cancel(action.sendId);\n        break;\n\n      case start:\n        {\n          if (this.status !== InterpreterStatus.Running) {\n            return;\n          }\n\n          var activity = action.activity; // If the activity will be stopped right after it's started\n          // (such as in transient states)\n          // don't bother starting the activity.\n\n          if (!this.state.activities[activity.id || activity.type]) {\n            break;\n          } // Invoked services\n\n\n          if (activity.type === ActionTypes.Invoke) {\n            var invokeSource = toInvokeSource(activity.src);\n            var serviceCreator = this.machine.options.services ? this.machine.options.services[invokeSource.type] : undefined;\n            var id = activity.id,\n                data = activity.data;\n\n            if (!IS_PRODUCTION) {\n              warn(!('forward' in activity), // tslint:disable-next-line:max-line-length\n              \"`forward` property is deprecated (found in invocation of '\".concat(activity.src, \"' in in machine '\").concat(this.machine.id, \"'). \") + \"Please use `autoForward` instead.\");\n            }\n\n            var autoForward = 'autoForward' in activity ? activity.autoForward : !!activity.forward;\n\n            if (!serviceCreator) {\n              // tslint:disable-next-line:no-console\n              if (!IS_PRODUCTION) {\n                warn(false, \"No service found for invocation '\".concat(activity.src, \"' in machine '\").concat(this.machine.id, \"'.\"));\n              }\n\n              return;\n            }\n\n            var resolvedData = data ? mapContext(data, context, _event) : undefined;\n\n            if (typeof serviceCreator === 'string') {\n              // TODO: warn\n              return;\n            }\n\n            var source = isFunction(serviceCreator) ? serviceCreator(context, _event.data, {\n              data: resolvedData,\n              src: invokeSource,\n              meta: activity.meta\n            }) : serviceCreator;\n\n            if (!source) {\n              // TODO: warn?\n              return;\n            }\n\n            var options = void 0;\n\n            if (isMachine(source)) {\n              source = resolvedData ? source.withContext(resolvedData) : source;\n              options = {\n                autoForward: autoForward\n              };\n            }\n\n            this.spawn(source, id, options);\n          } else {\n            this.spawnActivity(activity);\n          }\n\n          break;\n        }\n\n      case stop:\n        {\n          this.stopChild(action.activity.id);\n          break;\n        }\n\n      case log:\n        var label = action.label,\n            value = action.value;\n\n        if (label) {\n          this.logger(label, value);\n        } else {\n          this.logger(value);\n        }\n\n        break;\n\n      default:\n        if (!IS_PRODUCTION) {\n          warn(false, \"No implementation found for action type '\".concat(action.type, \"'\"));\n        }\n\n        break;\n    }\n\n    return undefined;\n  };\n\n  Interpreter.prototype.removeChild = function (childId) {\n    var _a;\n\n    this.children.delete(childId);\n    this.forwardTo.delete(childId); // this.state might not exist at the time this is called,\n    // such as when a child is added then removed while initializing the state\n\n    (_a = this.state) === null || _a === void 0 ? true : delete _a.children[childId];\n  };\n\n  Interpreter.prototype.stopChild = function (childId) {\n    var child = this.children.get(childId);\n\n    if (!child) {\n      return;\n    }\n\n    this.removeChild(childId);\n\n    if (isFunction(child.stop)) {\n      child.stop();\n    }\n  };\n\n  Interpreter.prototype.spawn = function (entity, name, options) {\n    if (isPromiseLike(entity)) {\n      return this.spawnPromise(Promise.resolve(entity), name);\n    } else if (isFunction(entity)) {\n      return this.spawnCallback(entity, name);\n    } else if (isSpawnedActor(entity)) {\n      return this.spawnActor(entity, name);\n    } else if (isObservable(entity)) {\n      return this.spawnObservable(entity, name);\n    } else if (isMachine(entity)) {\n      return this.spawnMachine(entity, __assign(__assign({}, options), {\n        id: name\n      }));\n    } else if (isBehavior(entity)) {\n      return this.spawnBehavior(entity, name);\n    } else {\n      throw new Error(\"Unable to spawn entity \\\"\".concat(name, \"\\\" of type \\\"\").concat(typeof entity, \"\\\".\"));\n    }\n  };\n\n  Interpreter.prototype.spawnMachine = function (machine, options) {\n    var _this = this;\n\n    if (options === void 0) {\n      options = {};\n    }\n\n    var childService = new Interpreter(machine, __assign(__assign({}, this.options), {\n      parent: this,\n      id: options.id || machine.id\n    }));\n\n    var resolvedOptions = __assign(__assign({}, DEFAULT_SPAWN_OPTIONS), options);\n\n    if (resolvedOptions.sync) {\n      childService.onTransition(function (state) {\n        _this.send(update, {\n          state: state,\n          id: childService.id\n        });\n      });\n    }\n\n    var actor = childService;\n    this.children.set(childService.id, actor);\n\n    if (resolvedOptions.autoForward) {\n      this.forwardTo.add(childService.id);\n    }\n\n    childService.onDone(function (doneEvent) {\n      _this.removeChild(childService.id);\n\n      _this.send(toSCXMLEvent(doneEvent, {\n        origin: childService.id\n      }));\n    }).start();\n    return actor;\n  };\n\n  Interpreter.prototype.spawnBehavior = function (behavior, id) {\n    var actorRef = spawnBehavior(behavior, {\n      id: id,\n      parent: this\n    });\n    this.children.set(id, actorRef);\n    return actorRef;\n  };\n\n  Interpreter.prototype.spawnPromise = function (promise, id) {\n    var _this = this;\n\n    var canceled = false;\n    var resolvedData;\n    promise.then(function (response) {\n      if (!canceled) {\n        resolvedData = response;\n\n        _this.removeChild(id);\n\n        _this.send(toSCXMLEvent(doneInvoke(id, response), {\n          origin: id\n        }));\n      }\n    }, function (errorData) {\n      if (!canceled) {\n        _this.removeChild(id);\n\n        var errorEvent = error(id, errorData);\n\n        try {\n          // Send \"error.platform.id\" to this (parent).\n          _this.send(toSCXMLEvent(errorEvent, {\n            origin: id\n          }));\n        } catch (error) {\n          reportUnhandledExceptionOnInvocation(errorData, error, id);\n\n          if (_this.devTools) {\n            _this.devTools.send(errorEvent, _this.state);\n          }\n\n          if (_this.machine.strict) {\n            // it would be better to always stop the state machine if unhandled\n            // exception/promise rejection happens but because we don't want to\n            // break existing code so enforce it on strict mode only especially so\n            // because documentation says that onError is optional\n            _this.stop();\n          }\n        }\n      }\n    });\n\n    var actor = __assign({\n      id: id,\n      send: function () {\n        return void 0;\n      },\n      subscribe: function (next, handleError, complete) {\n        var observer = toObserver(next, handleError, complete);\n        var unsubscribed = false;\n        promise.then(function (response) {\n          if (unsubscribed) {\n            return;\n          }\n\n          observer.next(response);\n\n          if (unsubscribed) {\n            return;\n          }\n\n          observer.complete();\n        }, function (err) {\n          if (unsubscribed) {\n            return;\n          }\n\n          observer.error(err);\n        });\n        return {\n          unsubscribe: function () {\n            return unsubscribed = true;\n          }\n        };\n      },\n      stop: function () {\n        canceled = true;\n      },\n      toJSON: function () {\n        return {\n          id: id\n        };\n      },\n      getSnapshot: function () {\n        return resolvedData;\n      }\n    }, interopSymbols);\n\n    this.children.set(id, actor);\n    return actor;\n  };\n\n  Interpreter.prototype.spawnCallback = function (callback, id) {\n    var _this = this;\n\n    var canceled = false;\n    var receivers = new Set();\n    var listeners = new Set();\n    var emitted;\n\n    var receive = function (e) {\n      emitted = e;\n      listeners.forEach(function (listener) {\n        return listener(e);\n      });\n\n      if (canceled) {\n        return;\n      }\n\n      _this.send(toSCXMLEvent(e, {\n        origin: id\n      }));\n    };\n\n    var callbackStop;\n\n    try {\n      callbackStop = callback(receive, function (newListener) {\n        receivers.add(newListener);\n      });\n    } catch (err) {\n      this.send(error(id, err));\n    }\n\n    if (isPromiseLike(callbackStop)) {\n      // it turned out to be an async function, can't reliably check this before calling `callback`\n      // because transpiled async functions are not recognizable\n      return this.spawnPromise(callbackStop, id);\n    }\n\n    var actor = __assign({\n      id: id,\n      send: function (event) {\n        return receivers.forEach(function (receiver) {\n          return receiver(event);\n        });\n      },\n      subscribe: function (next) {\n        listeners.add(next);\n        return {\n          unsubscribe: function () {\n            listeners.delete(next);\n          }\n        };\n      },\n      stop: function () {\n        canceled = true;\n\n        if (isFunction(callbackStop)) {\n          callbackStop();\n        }\n      },\n      toJSON: function () {\n        return {\n          id: id\n        };\n      },\n      getSnapshot: function () {\n        return emitted;\n      }\n    }, interopSymbols);\n\n    this.children.set(id, actor);\n    return actor;\n  };\n\n  Interpreter.prototype.spawnObservable = function (source, id) {\n    var _this = this;\n\n    var emitted;\n    var subscription = source.subscribe(function (value) {\n      emitted = value;\n\n      _this.send(toSCXMLEvent(value, {\n        origin: id\n      }));\n    }, function (err) {\n      _this.removeChild(id);\n\n      _this.send(toSCXMLEvent(error(id, err), {\n        origin: id\n      }));\n    }, function () {\n      _this.removeChild(id);\n\n      _this.send(toSCXMLEvent(doneInvoke(id), {\n        origin: id\n      }));\n    });\n\n    var actor = __assign({\n      id: id,\n      send: function () {\n        return void 0;\n      },\n      subscribe: function (next, handleError, complete) {\n        return source.subscribe(next, handleError, complete);\n      },\n      stop: function () {\n        return subscription.unsubscribe();\n      },\n      getSnapshot: function () {\n        return emitted;\n      },\n      toJSON: function () {\n        return {\n          id: id\n        };\n      }\n    }, interopSymbols);\n\n    this.children.set(id, actor);\n    return actor;\n  };\n\n  Interpreter.prototype.spawnActor = function (actor, name) {\n    this.children.set(name, actor);\n    return actor;\n  };\n\n  Interpreter.prototype.spawnActivity = function (activity) {\n    var implementation = this.machine.options && this.machine.options.activities ? this.machine.options.activities[activity.type] : undefined;\n\n    if (!implementation) {\n      if (!IS_PRODUCTION) {\n        warn(false, \"No implementation found for activity '\".concat(activity.type, \"'\"));\n      } // tslint:disable-next-line:no-console\n\n\n      return;\n    } // Start implementation\n\n\n    var dispose = implementation(this.state.context, activity);\n    this.spawnEffect(activity.id, dispose);\n  };\n\n  Interpreter.prototype.spawnEffect = function (id, dispose) {\n    this.children.set(id, __assign({\n      id: id,\n      send: function () {\n        return void 0;\n      },\n      subscribe: function () {\n        return {\n          unsubscribe: function () {\n            return void 0;\n          }\n        };\n      },\n      stop: dispose || undefined,\n      getSnapshot: function () {\n        return undefined;\n      },\n      toJSON: function () {\n        return {\n          id: id\n        };\n      }\n    }, interopSymbols));\n  };\n\n  Interpreter.prototype.attachDev = function () {\n    var global = getGlobal();\n\n    if (this.options.devTools && global) {\n      if (global.__REDUX_DEVTOOLS_EXTENSION__) {\n        var devToolsOptions = typeof this.options.devTools === 'object' ? this.options.devTools : undefined;\n        this.devTools = global.__REDUX_DEVTOOLS_EXTENSION__.connect(__assign(__assign({\n          name: this.id,\n          autoPause: true,\n          stateSanitizer: function (state) {\n            return {\n              value: state.value,\n              context: state.context,\n              actions: state.actions\n            };\n          }\n        }, devToolsOptions), {\n          features: __assign({\n            jump: false,\n            skip: false\n          }, devToolsOptions ? devToolsOptions.features : undefined)\n        }), this.machine);\n        this.devTools.init(this.state);\n      } // add XState-specific dev tooling hook\n\n\n      registerService(this);\n    }\n  };\n\n  Interpreter.prototype.toJSON = function () {\n    return {\n      id: this.id\n    };\n  };\n\n  Interpreter.prototype[symbolObservable] = function () {\n    return this;\n  }; // this gets stripped by Babel to avoid having \"undefined\" property in environments without this non-standard Symbol\n  // it has to be here to be included in the generated .d.ts\n\n\n  Interpreter.prototype.getSnapshot = function () {\n    if (this.status === InterpreterStatus.NotStarted) {\n      return this.initialState;\n    }\n\n    return this._state;\n  };\n  /**\r\n   * The default interpreter options:\r\n   *\r\n   * - `clock` uses the global `setTimeout` and `clearTimeout` functions\r\n   * - `logger` uses the global `console.log()` method\r\n   */\n\n\n  Interpreter.defaultOptions = /*#__PURE__*/function (global) {\n    return {\n      execute: true,\n      deferEvents: true,\n      clock: {\n        setTimeout: function (fn, ms) {\n          return setTimeout(fn, ms);\n        },\n        clearTimeout: function (id) {\n          return clearTimeout(id);\n        }\n      },\n      logger: global.console.log.bind(console),\n      devTools: false\n    };\n  }(typeof self !== 'undefined' ? self : global);\n\n  Interpreter.interpret = interpret;\n  return Interpreter;\n}();\n\nvar resolveSpawnOptions = function (nameOrOptions) {\n  if (isString(nameOrOptions)) {\n    return __assign(__assign({}, DEFAULT_SPAWN_OPTIONS), {\n      name: nameOrOptions\n    });\n  }\n\n  return __assign(__assign(__assign({}, DEFAULT_SPAWN_OPTIONS), {\n    name: uniqueId()\n  }), nameOrOptions);\n};\n\nfunction spawn(entity, nameOrOptions) {\n  var resolvedOptions = resolveSpawnOptions(nameOrOptions);\n  return consume(function (service) {\n    if (!IS_PRODUCTION) {\n      var isLazyEntity = isMachine(entity) || isFunction(entity);\n      warn(!!service || isLazyEntity, \"Attempted to spawn an Actor (ID: \\\"\".concat(isMachine(entity) ? entity.id : 'undefined', \"\\\") outside of a service. This will have no effect.\"));\n    }\n\n    if (service) {\n      return service.spawn(entity, resolvedOptions.name, resolvedOptions);\n    } else {\n      return createDeferredActor(entity, resolvedOptions.name);\n    }\n  });\n}\n/**\r\n * Creates a new Interpreter instance for the given machine with the provided options, if any.\r\n *\r\n * @param machine The machine to interpret\r\n * @param options Interpreter options\r\n */\n\nfunction interpret(machine, options) {\n  var interpreter = new Interpreter(machine, options);\n  return interpreter;\n}\n\nexport { Interpreter, InterpreterStatus, interpret, spawn };\n", "export var ReactEffectType;\n(function (ReactEffectType) {\n    ReactEffectType[ReactEffectType[\"Effect\"] = 1] = \"Effect\";\n    ReactEffectType[ReactEffectType[\"LayoutEffect\"] = 2] = \"LayoutEffect\";\n})(ReactEffectType || (ReactEffectType = {}));\n", "var __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n    var t = {};\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n        t[p] = s[p];\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                t[p[i]] = s[p[i]];\n        }\n    return t;\n};\nvar __read = (this && this.__read) || function (o, n) {\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n    if (!m) return o;\n    var i = m.call(o), r, ar = [], e;\n    try {\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n    }\n    catch (error) { e = { error: error }; }\n    finally {\n        try {\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\n        }\n        finally { if (e) throw e.error; }\n    }\n    return ar;\n};\nimport { useState } from 'react';\nimport useIsomorphicLayoutEffect from 'use-isomorphic-layout-effect';\nimport { interpret, State } from 'xstate';\nimport useConstant from './useConstant';\nimport { useReactEffectActions } from './useReactEffectActions';\n// copied from core/src/utils.ts\n// it avoids a breaking change between this package and XState which is its peer dep\nfunction toObserver(nextHandler, errorHandler, completionHandler) {\n    if (typeof nextHandler === 'object') {\n        return nextHandler;\n    }\n    var noop = function () { return void 0; };\n    return {\n        next: nextHandler,\n        error: errorHandler || noop,\n        complete: completionHandler || noop\n    };\n}\nexport function useInterpret(getMachine, options, observerOrListener) {\n    if (options === void 0) { options = {}; }\n    var machine = useConstant(function () {\n        return typeof getMachine === 'function' ? getMachine() : getMachine;\n    });\n    if (process.env.NODE_ENV !== 'production' &&\n        typeof getMachine !== 'function') {\n        var _a = __read(useState(machine), 1), initialMachine = _a[0];\n        if (getMachine !== initialMachine) {\n            console.warn('Machine given to `useMachine` has changed between renders. This is not supported and might lead to unexpected results.\\n' +\n                'Please make sure that you pass the same Machine as argument each time.');\n        }\n    }\n    var context = options.context, guards = options.guards, actions = options.actions, activities = options.activities, services = options.services, delays = options.delays, rehydratedState = options.state, interpreterOptions = __rest(options, [\"context\", \"guards\", \"actions\", \"activities\", \"services\", \"delays\", \"state\"]);\n    var service = useConstant(function () {\n        var machineConfig = {\n            context: context,\n            guards: guards,\n            actions: actions,\n            activities: activities,\n            services: services,\n            delays: delays\n        };\n        var machineWithConfig = machine.withConfig(machineConfig, function () { return (__assign(__assign({}, machine.context), context)); });\n        return interpret(machineWithConfig, __assign({ deferEvents: true }, interpreterOptions));\n    });\n    useIsomorphicLayoutEffect(function () {\n        var sub;\n        if (observerOrListener) {\n            sub = service.subscribe(toObserver(observerOrListener));\n        }\n        return function () {\n            sub === null || sub === void 0 ? void 0 : sub.unsubscribe();\n        };\n    }, [observerOrListener]);\n    useIsomorphicLayoutEffect(function () {\n        service.start(rehydratedState ? State.create(rehydratedState) : undefined);\n        return function () {\n            service.stop();\n        };\n    }, []);\n    // Make sure options are kept updated when they change.\n    // This mutation assignment is safe because the service instance is only used\n    // in one place -- this hook's caller.\n    useIsomorphicLayoutEffect(function () {\n        Object.assign(service.machine.options.actions, actions);\n        Object.assign(service.machine.options.guards, guards);\n        Object.assign(service.machine.options.activities, activities);\n        Object.assign(service.machine.options.services, services);\n        Object.assign(service.machine.options.delays, delays);\n    }, [actions, guards, activities, services, delays]);\n    useReactEffectActions(service);\n    return service;\n}\n", "import { useLayoutEffect } from 'react';\n\nvar index =  useLayoutEffect ;\n\nexport default index;\n", "import * as React from 'react';\nexport default function useConstant(fn) {\n    var ref = React.useRef();\n    if (!ref.current) {\n        ref.current = { v: fn() };\n    }\n    return ref.current.v;\n}\n", "var __read = (this && this.__read) || function (o, n) {\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n    if (!m) return o;\n    var i = m.call(o), r, ar = [], e;\n    try {\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n    }\n    catch (error) { e = { error: error }; }\n    finally {\n        try {\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\n        }\n        finally { if (e) throw e.error; }\n    }\n    return ar;\n};\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nimport { useEffect, useRef } from 'react';\nimport useIsomorphicLayoutEffect from 'use-isomorphic-layout-effect';\nimport { ReactEffectType } from './types';\nimport { partition } from './utils';\nfunction executeEffect(action, state) {\n    var exec = action.exec;\n    var originalExec = exec(state.context, state._event.data, {\n        action: action,\n        state: state,\n        _event: state._event\n    });\n    originalExec();\n}\nexport function useReactEffectActions(service) {\n    var effectActionsRef = useRef([]);\n    var layoutEffectActionsRef = useRef([]);\n    useIsomorphicLayoutEffect(function () {\n        var sub = service.subscribe(function (currentState) {\n            var _a, _b;\n            if (currentState.actions.length) {\n                var reactEffectActions = currentState.actions.filter(function (action) {\n                    return (typeof action.exec === 'function' &&\n                        '__effect' in action.exec);\n                });\n                var _c = __read(partition(reactEffectActions, function (action) {\n                    return action.exec.__effect === ReactEffectType.Effect;\n                }), 2), effectActions = _c[0], layoutEffectActions = _c[1];\n                (_a = effectActionsRef.current).push.apply(_a, __spreadArray([], __read(effectActions.map(function (effectAction) { return [effectAction, currentState]; })), false));\n                (_b = layoutEffectActionsRef.current).push.apply(_b, __spreadArray([], __read(layoutEffectActions.map(function (layoutEffectAction) { return [layoutEffectAction, currentState]; })), false));\n            }\n        });\n        return function () {\n            sub.unsubscribe();\n        };\n    }, []);\n    // this is somewhat weird - this should always be flushed within useLayoutEffect\n    // but we don't want to receive warnings about useLayoutEffect being used on the server\n    // so we have to use `useIsomorphicLayoutEffect` to silence those warnings\n    useIsomorphicLayoutEffect(function () {\n        while (layoutEffectActionsRef.current.length) {\n            var _a = __read(layoutEffectActionsRef.current.shift(), 2), layoutEffectAction = _a[0], effectState = _a[1];\n            executeEffect(layoutEffectAction, effectState);\n        }\n    }); // https://github.com/davidkpiano/xstate/pull/1202#discussion_r429677773\n    useEffect(function () {\n        while (effectActionsRef.current.length) {\n            var _a = __read(effectActionsRef.current.shift(), 2), effectAction = _a[0], effectState = _a[1];\n            executeEffect(effectAction, effectState);\n        }\n    });\n}\n", "var __read = (this && this.__read) || function (o, n) {\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n    if (!m) return o;\n    var i = m.call(o), r, ar = [], e;\n    try {\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n    }\n    catch (error) { e = { error: error }; }\n    finally {\n        try {\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\n        }\n        finally { if (e) throw e.error; }\n    }\n    return ar;\n};\nvar __values = (this && this.__values) || function(o) {\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n    if (m) return m.call(o);\n    if (o && typeof o.length === \"number\") return {\n        next: function () {\n            if (o && i >= o.length) o = void 0;\n            return { value: o && o[i++], done: !o };\n        }\n    };\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nexport function partition(items, predicate) {\n    var e_1, _a;\n    var _b = __read([[], []], 2), truthy = _b[0], falsy = _b[1];\n    try {\n        for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {\n            var item = items_1_1.value;\n            if (predicate(item)) {\n                truthy.push(item);\n            }\n            else {\n                falsy.push(item);\n            }\n        }\n    }\n    catch (e_1_1) { e_1 = { error: e_1_1 }; }\n    finally {\n        try {\n            if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);\n        }\n        finally { if (e_1) throw e_1.error; }\n    }\n    return [truthy, falsy];\n}\n", "import React from 'react'\nimport { Modal } from '../Modal'\n\nexport const ConfirmFinishMentorDiscussionModal = ({\n  open,\n  onConfirm,\n  onCancel,\n}: {\n  open: boolean\n  onCancel: () => void\n  onConfirm: () => void\n}): JSX.Element => {\n  return (\n    <Modal\n      open={open}\n      onClose={onCancel}\n      className=\"m-confirm-finish-student-mentor-discussion\"\n    >\n      <h3>Are you sure you want to end this discussion?</h3>\n      <p>\n        When you feel like the mentoring has reached its natural conclusion, or\n        you simply don&apos;t wish to proceed further, it&apos;s time to end the\n        discussion.\n      </p>\n      <div className=\"buttons\">\n        <button\n          type=\"button\"\n          className=\"btn-small-discourage\"\n          onClick={() => onCancel()}\n        >\n          Cancel\n        </button>\n        <button\n          type=\"button\"\n          className=\"btn-primary btn-s\"\n          onClick={() => onConfirm()}\n        >\n          Review and end discussion...\n        </button>\n      </div>\n    </Modal>\n  )\n}\n", "import React from 'react'\nimport { FinishButton } from './FinishButton'\nimport { MentorDiscussion } from '../../types'\nimport { GraphicalIcon } from '../../common'\n\ntype Links = {\n  exercise: string\n}\n\nexport const DiscussionActions = ({\n  discussion,\n  links,\n}: {\n  discussion: MentorDiscussion\n  links: Links\n}): JSX.Element => {\n  return discussion.isFinished || discussion.status === 'mentor_finished' ? (\n    <div className=\"finished\">\n      <GraphicalIcon icon=\"completed-check-circle\" />\n      Ended\n    </div>\n  ) : (\n    <FinishButton\n      discussion={discussion}\n      links={links}\n      className=\"btn-keyboard-shortcut finish-button\"\n    >\n      <div className=\"--hint\">End discussion</div>\n    </FinishButton>\n  )\n}\n", "import React from 'react'\nimport { MentoringRequestForm } from './mentoring-request/MentoringRequestForm'\nimport { MentoringRequestInfo } from './mentoring-request/MentoringRequestInfo'\nimport {\n  Iteration,\n  MentorSessionRequest as Request,\n  MentorSessionTrack as Track,\n  MentorSessionExercise as Exercise,\n} from '../../types'\nimport { Video } from '../MentoringSession'\n\ntype Links = {\n  learnMoreAboutPrivateMentoring: string\n  privateMentoring: string\n  mentoringGuide: string\n  createMentorRequest: string\n}\n\nexport const MentoringRequest = ({\n  trackObjectives,\n  track,\n  exercise,\n  request,\n  latestIteration,\n  videos,\n  links,\n  onCreate,\n}: {\n  trackObjectives: string\n  track: Track\n  exercise: Exercise\n  request?: Request\n  latestIteration: Iteration\n  videos: Video[]\n  links: Links\n  onCreate: (mentorRequest: Request) => void\n}): JSX.Element => {\n  return request ? (\n    <MentoringRequestInfo\n      request={request}\n      links={links}\n      track={track}\n      videos={videos}\n      iteration={latestIteration}\n    />\n  ) : (\n    <MentoringRequestForm\n      trackObjectives={trackObjectives}\n      track={track}\n      exercise={exercise}\n      onSuccess={onCreate}\n      links={links}\n    />\n  )\n}\n", "import React, { useRef, useCallback } from 'react'\nimport {\n  CopyToClipboardButton,\n  FormButton,\n  GraphicalIcon,\n  MedianWaitTime,\n} from '../../../common'\nimport {\n  MentorSessionTrack as Track,\n  MentorSessionExercise as Exercise,\n} from '../../../types'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { typecheck } from '../../../../utils/typecheck'\nimport { MentorSessionRequest as Request } from '../../../types'\nimport { FetchingBoundary } from '../../../FetchingBoundary'\n\ntype Links = {\n  learnMoreAboutPrivateMentoring: string\n  privateMentoring: string\n  mentoringGuide: string\n  createMentorRequest: string\n}\n\nconst DEFAULT_ERROR = new Error('Unable to create mentor request')\n\nexport const MentoringRequestForm = ({\n  trackObjectives,\n  track,\n  exercise,\n  links,\n  onSuccess,\n}: {\n  trackObjectives: string\n  track: Track\n  exercise: Exercise\n  links: Links\n  onSuccess: (mentorRequest: Request) => void\n}): JSX.Element => {\n  const [mutation, { status, error }] = useMutation<Request>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: links.createMentorRequest,\n        method: 'POST',\n        body: JSON.stringify({\n          comment: solutionCommentRef.current?.value,\n          track_objectives: trackObjectivesRef.current?.value,\n        }),\n      })\n\n      return fetch.then((json) => typecheck<Request>(json, 'mentorRequest'))\n    },\n    {\n      onSuccess: onSuccess,\n    }\n  )\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  const trackObjectivesRef = useRef<HTMLTextAreaElement>(null)\n  const solutionCommentRef = useRef<HTMLTextAreaElement>(null)\n\n  return (\n    <div className=\"mentoring-request-section\">\n      <div className=\"direct\">\n        <h3>\n          Send this link to a friend for private mentoring.{' '}\n          <a href={links.learnMoreAboutPrivateMentoring}>Learn more</a>.\n        </h3>\n        <CopyToClipboardButton textToCopy={links.privateMentoring} />\n      </div>\n      <form data-turbo=\"false\" className=\"community\" onSubmit={handleSubmit}>\n        <div className=\"heading\">\n          <div className=\"info\">\n            <h2>It\u2019s time to deepen your knowledge.</h2>\n            <p>\n              Start a mentoring discussion on <strong>{exercise.title}</strong>{' '}\n              to discover new and exciting ways to approach it. Expand and\n              deepen your knowledge.\n            </p>\n          </div>\n          <GraphicalIcon icon=\"mentoring\" category=\"graphics\" />\n        </div>\n        <div className=\"question\">\n          <label htmlFor=\"request-mentoring-form-track-objectives\">\n            What are you hoping to learn from this track?\n          </label>\n          <p id=\"request-mentoring-form-track-description\">\n            Tell our mentors a little about your programming background and what\n            you\u2019re aiming to learn from {track.title}.\n          </p>\n          <textarea\n            ref={trackObjectivesRef}\n            id=\"request-mentoring-form-track-objectives\"\n            required\n            aria-describedby=\"request-mentoring-form-track-description\"\n            defaultValue={trackObjectives}\n          />\n        </div>\n        <div className=\"question\">\n          <label htmlFor=\"request-mentoring-form-solution-comment\">\n            How can a mentor help you with this solution?\n          </label>\n          <p id=\"request-mentoring-form-solution-description\">\n            Give your mentor a starting point for the conversation. This will be\n            your first comment during the session. Markdown is permitted.\n          </p>\n          <textarea\n            ref={solutionCommentRef}\n            id=\"request-mentoring-form-solution-comment\"\n            required\n            aria-describedby=\"request-mentoring-form-solution-description\"\n          />\n        </div>\n        <FormButton status={status} className=\"btn-primary btn-m\">\n          Submit mentoring request\n        </FormButton>\n        <FetchingBoundary\n          status={status}\n          error={error}\n          defaultError={DEFAULT_ERROR}\n        ></FetchingBoundary>\n        <p className=\"flow-explanation\">\n          Once you submit, your request will be open for a mentor to join and\n          start providing feedback.\n          <MedianWaitTime seconds={track.medianWaitTime} />\n        </p>\n      </form>\n    </div>\n  )\n}\n", "import React, { useState } from 'react'\nimport {\n  CopyToClipboardButton,\n  GraphicalIcon,\n  Icon,\n  MedianWaitTime,\n} from '../../../common'\nimport { MentorSessionRequest as Request, Iteration } from '../../../types'\nimport { timeFormat } from '../../../../utils/time'\nimport { Video as VideoProps } from '../../MentoringSession'\nimport { MentorSessionTrack as Track } from '../../../types'\nimport { IterationMarker } from '../../../mentoring/session/IterationMarker'\nimport {\n  DiscussionPost,\n  DiscussionPostProps,\n  DiscussionPostAction,\n} from '../../../mentoring/discussion/DiscussionPost'\nimport { CancelRequestButton } from './CancelRequestButton'\n\ntype Links = {\n  privateMentoring: string\n  mentoringGuide: string\n}\n\nconst placeholder = {\n  contentMarkdown: '',\n  contentHtml:\n    \"<p>Please update this comment to tell a mentor what you'd like to learn in this exercise</p>\",\n}\n\nexport const MentoringRequestInfo = ({\n  track,\n  links,\n  videos,\n  request,\n  iteration,\n}: {\n  track: Track\n  links: Links\n  videos: VideoProps[]\n  request: Request\n  iteration: Iteration\n}): JSX.Element => {\n  if (!request.comment) {\n    throw 'Request comment expected'\n  }\n\n  const [action, setAction] = useState<DiscussionPostAction>('viewing')\n  const [post, setPost] = useState<DiscussionPostProps>(request.comment)\n  const showPlaceholder = post.contentHtml.length === 0\n\n  const postProps = {\n    action,\n    post: showPlaceholder ? { ...post, ...placeholder } : post,\n    onEdit: () => setAction('editing'),\n    onEditCancel: () => setAction('viewing'),\n    onUpdate: (post: DiscussionPostProps) => setPost(post),\n  }\n\n  return (\n    <div className=\"mentoring-requested-section\" id=\"panel-discussion\">\n      <div className=\"content\">\n        <div className=\"status\">\n          <div className=\"info\">\n            <h3>Waiting on a mentor...</h3>\n            <MedianWaitTime seconds={track.medianWaitTime} />\n          </div>\n          <CancelRequestButton request={request} />\n        </div>\n        <div className=\"placeholder\">\n          <div className=\"info\">\n            <div className=\"title\">\n              <div className=\"name\" />\n              <div className=\"rep\" />\n            </div>\n            <div className=\"desc\" />\n          </div>\n          <div className=\"avatar\">\n            <GraphicalIcon icon=\"avatar-placeholder\" />\n          </div>\n        </div>\n\n        <div className=\"c-discussion-timeline\">\n          <IterationMarker iteration={iteration} userIsStudent={false} />\n          <DiscussionPost {...postProps} />\n        </div>\n\n        <div className=\"waiting-box\">\n          <h3>Waiting on a mentor?</h3>\n          <h4>Learn how to get the most out of mentoring</h4>\n          <p>\n            Mentoring relies on mentors and students having a shared\n            understanding of how it works.{' '}\n            <a href={links.mentoringGuide} target=\"_blank\" rel=\"noreferrer\">\n              Read our guide\n              <Icon\n                icon=\"external-link\"\n                alt=\"The link opens in a new window or tab\"\n              />\n            </a>{' '}\n            or watch the videos below to get that understanding.\n          </p>\n          <div className=\"videos\">\n            {videos.map((video, i) => (\n              <Video key={i} {...video} />\n            ))}\n          </div>\n        </div>\n      </div>\n\n      <div className=\"direct\">\n        <h3>Want a friend to mentor your solution?</h3>\n        <p>Send this link to a friend for private mentoring.</p>\n        <CopyToClipboardButton textToCopy={links.privateMentoring} />\n      </div>\n    </div>\n  )\n}\n\nconst Video = ({ title, date, thumb, url }: VideoProps) => {\n  return (\n    <a href={url} target=\"_blank\" rel=\"noreferrer\" className=\"video\">\n      <div\n        className=\"img\"\n        style={{\n          backgroundImage: `url('${thumb}')`,\n        }}\n      />\n      <div className=\"info\">\n        <div className=\"title\">{title}</div>\n        <time dateTime={date} className=\"date\">\n          {timeFormat(date, 'DD MMM YYYY')}\n        </time>\n      </div>\n      <Icon icon=\"external-link\" alt=\"The link opens in a new window or tab\" />\n    </a>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { MentorSessionRequest } from '../../../types'\nimport { CancelRequestModal } from './CancelRequestModal'\n\nexport const CancelRequestButton = ({\n  request,\n}: {\n  request: MentorSessionRequest\n}): JSX.Element => {\n  const [modalOpen, setModalOpen] = useState(false)\n\n  const handleModalOpen = useCallback(() => {\n    setModalOpen(true)\n  }, [])\n\n  const handleModalClose = useCallback(() => {\n    setModalOpen(false)\n  }, [])\n\n  return (\n    <React.Fragment>\n      <button type=\"button\" onClick={handleModalOpen}>\n        Cancel Request\n      </button>\n      <CancelRequestModal\n        open={modalOpen}\n        request={request}\n        onClose={handleModalClose}\n      />\n    </React.Fragment>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { Modal, ModalProps } from '../../../modals/Modal'\nimport { FormButton } from '../../../common'\nimport { ErrorBoundary, ErrorMessage } from '../../../ErrorBoundary'\nimport { MentorSessionRequest } from '../../../types'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { redirectTo } from '../../../../utils/redirect-to'\n\nconst DEFAULT_ERROR = new Error('Unable to cancel request')\n\ntype APIResponse = {\n  links: {\n    home: string\n  }\n}\n\nexport const CancelRequestModal = ({\n  open,\n  onClose,\n  request,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  request: MentorSessionRequest\n}): JSX.Element => {\n  const [mutation, { status, error }] = useMutation<APIResponse>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: request.links.cancel,\n        method: 'PATCH',\n        body: null,\n      })\n\n      return fetch\n    },\n    {\n      onSuccess: (response) => {\n        redirectTo(response.links.home)\n      },\n    }\n  )\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  const handleClose = useCallback(() => {\n    if (status === 'loading') {\n      return\n    }\n\n    onClose()\n  }, [status, onClose])\n\n  return (\n    <Modal\n      open={open}\n      onClose={handleClose}\n      className=\"m-generic-confirmation\"\n      {...props}\n    >\n      <h3>Cancel mentoring request?</h3>\n      <p>\n        Are you sure you want to cancel this mentoring request? Please note that\n        if someone has started giving feedback in the last few minutes, the\n        session may continue regardless of this cancellation.\n      </p>\n      <form data-turbo=\"false\" onSubmit={handleSubmit} className=\"buttons\">\n        <FormButton status={status} type=\"submit\" className=\"btn-primary btn-s\">\n          Cancel mentoring request\n        </FormButton>\n        <FormButton\n          status={status}\n          type=\"button\"\n          className=\"btn-enhanced btn-s\"\n          onClick={handleClose}\n        >\n          Close\n        </FormButton>\n      </form>\n      <ErrorBoundary resetKeys={[status]}>\n        <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n      </ErrorBoundary>\n    </Modal>\n  )\n}\n", "import React, {\n  useEffect,\n  useState,\n  useCallback,\n  createContext,\n  useRef,\n} from 'react'\nimport { GraphicalIcon } from '../common'\nimport { type TabContext, Tab } from '../common/Tab'\nimport { ContributionsList } from './ContributionsList'\nimport { SolutionsList } from './SolutionsList'\nimport { BadgesList } from './BadgesList'\nimport { Overview } from './Overview'\nimport type { Request } from '@/hooks'\n\ntype CategoryId = 'solutions' | 'reputation'\n\nconst TabsContext = createContext<TabContext>({\n  current: '',\n  switchToTab: () => null,\n})\n\nexport type Category = {\n  id: string\n  title: string\n  icon: string\n  path: string\n  request: Request\n}\n\nexport const JourneyPage = ({\n  defaultCategory,\n  categories,\n}: {\n  defaultCategory: CategoryId\n  categories: readonly Category[]\n}): JSX.Element => {\n  const isMounted = useRef(false)\n  const [currentCategory, setCurrentCategory] = useState<Category>(() => {\n    const category = categories.find((c) => c.id === defaultCategory)\n\n    if (!category) {\n      throw new Error('Category not found')\n    }\n\n    return category\n  })\n\n  const switchToTab = useCallback(\n    (id: string) => {\n      const category = categories.find((c) => c.id === id)\n\n      if (!category) {\n        throw new Error('Category not found')\n      }\n\n      setCurrentCategory(category)\n    },\n    [categories]\n  )\n\n  useEffect(() => {\n    if (!isMounted.current) {\n      isMounted.current = true\n      return\n    }\n\n    history.pushState(history.state, '', currentCategory.path)\n  }, [currentCategory])\n\n  return (\n    <TabsContext.Provider\n      value={{ current: currentCategory.id, switchToTab: switchToTab }}\n    >\n      <div className=\"tabs theme-dark\">\n        {categories.map((category) => {\n          return (\n            <Tab key={category.id} context={TabsContext} id={category.id}>\n              <GraphicalIcon icon={category.icon} />\n              {category.title}\n            </Tab>\n          )\n        })}\n      </div>\n      {categories.map((category) => {\n        return (\n          <Tab.Panel id={category.id} context={TabsContext} key={category.id}>\n            {category.id === 'overview' ? (\n              <Overview\n                isEnabled={currentCategory.id === 'overview'}\n                request={category.request}\n              />\n            ) : null}\n            {category.id === 'solutions' ? (\n              <SolutionsList\n                isEnabled={currentCategory.id === 'solutions'}\n                request={category.request}\n              />\n            ) : null}\n            {category.id === 'reputation' ? (\n              <ContributionsList\n                isEnabled={currentCategory.id === 'reputation'}\n                request={category.request}\n              />\n            ) : null}\n            {category.id === 'badges' ? (\n              <BadgesList\n                isEnabled={currentCategory.id === 'badges'}\n                request={category.request}\n              />\n            ) : null}\n          </Tab.Panel>\n        )\n      })}\n    </TabsContext.Provider>\n  )\n}\n", "import React, { useState, useCallback, useEffect } from 'react'\nimport { ContributionResults } from './ContributionResults'\nimport { Request } from '../../hooks/request-query'\nimport { Contribution } from '../types'\nimport { useList } from '../../hooks/use-list'\nimport { removeEmpty, useHistory } from '../../hooks/use-history'\nimport { usePaginatedRequestQuery } from '../../hooks/request-query'\nimport { ResultsZone } from '../ResultsZone'\nimport { Pagination } from '../common'\nimport { FetchingBoundary } from '../FetchingBoundary'\nimport { CategorySelect } from './contributions-list/CategorySelect'\n\nconst DEFAULT_ERROR = new Error('Unable to load contributions list')\n\nexport type APIResult = {\n  results: Contribution[]\n  meta: {\n    currentPage: number\n    totalPages: number\n    totalCount: number\n    links: {\n      markAllAsSeen: string\n    }\n    unseenTotal: number\n  }\n}\n\nexport const ContributionsList = ({\n  request: initialRequest,\n  isEnabled,\n}: {\n  request: Request\n  isEnabled: boolean\n}): JSX.Element => {\n  const {\n    request,\n    setPage,\n    setCriteria: setRequestCriteria,\n    setQuery,\n  } = useList(initialRequest)\n  const [criteria, setCriteria] = useState(request.query?.criteria || '')\n  const cacheKey = [\n    'contributions-list',\n    request.endpoint,\n    removeEmpty(request.query),\n  ]\n  const {\n    status,\n    resolvedData,\n    latestData,\n    isFetching,\n    error,\n  } = usePaginatedRequestQuery<APIResult>(cacheKey, {\n    ...request,\n    query: removeEmpty(request.query),\n    options: { ...request.options, enabled: isEnabled },\n  })\n\n  const setCategory = useCallback(\n    (category) => {\n      setQuery({ ...request.query, category: category, page: undefined })\n    },\n    [JSON.stringify(request.query), setQuery]\n  )\n\n  useEffect(() => {\n    const handler = setTimeout(() => {\n      setRequestCriteria(criteria)\n    }, 200)\n\n    return () => {\n      clearTimeout(handler)\n    }\n  }, [setRequestCriteria, criteria])\n\n  useHistory({ pushOn: removeEmpty(request.query) })\n\n  return (\n    <article className=\"reputation-tab theme-dark\">\n      <div className=\"md-container container\">\n        <div className=\"c-search-bar\">\n          <input\n            className=\"--search\"\n            onChange={(e) => {\n              setCriteria(e.target.value)\n            }}\n            value={criteria}\n            placeholder=\"Search by contribution name\"\n          />\n          <CategorySelect\n            value={request.query.category}\n            setValue={setCategory}\n          />\n        </div>\n        <ResultsZone isFetching={isFetching}>\n          <FetchingBoundary\n            status={status}\n            error={error}\n            defaultError={DEFAULT_ERROR}\n          >\n            {resolvedData ? (\n              <React.Fragment>\n                <ContributionResults data={resolvedData} cacheKey={cacheKey} />\n                <Pagination\n                  disabled={latestData === undefined}\n                  current={request.query.page}\n                  total={resolvedData.meta.totalPages}\n                  setPage={setPage}\n                />\n              </React.Fragment>\n            ) : null}\n          </FetchingBoundary>\n        </ResultsZone>\n      </div>\n    </article>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { Contribution } from './Contribution'\nimport pluralize from 'pluralize'\nimport { MarkAllAsSeenModal } from './contribution-results/MarkAllAsSeenModal'\nimport { MarkAllAsSeenButton } from './contribution-results/MarkAllAsSeenButton'\nimport { APIResult } from './ContributionsList'\nimport { QueryKey, useQueryCache } from 'react-query'\n\nexport type Order = 'newest_first' | 'oldest_first'\n\nexport const ContributionResults = ({\n  cacheKey,\n  data,\n}: {\n  cacheKey: QueryKey\n  data: APIResult\n}): JSX.Element => {\n  const queryCache = useQueryCache()\n  const [modalOpen, setModalOpen] = useState(false)\n\n  const handleModalOpen = useCallback(() => {\n    setModalOpen(true)\n  }, [])\n\n  const handleModalClose = useCallback(() => {\n    setModalOpen(false)\n  }, [])\n\n  const handleSuccess = useCallback(\n    (response: APIResult) => {\n      const oldData = queryCache.getQueryData<APIResult>(cacheKey)\n\n      queryCache.setQueryData(cacheKey, {\n        ...oldData,\n        meta: { ...oldData?.meta, unseenTotal: response.meta.unseenTotal },\n      })\n    },\n    [cacheKey, queryCache]\n  )\n\n  return (\n    <div>\n      <div className=\"results-title-bar\">\n        <h3>\n          Showing {data.meta.totalCount}{' '}\n          {pluralize('contribution', data.meta.totalCount)}\n        </h3>\n        <MarkAllAsSeenButton\n          onClick={handleModalOpen}\n          unseenTotal={data.meta.unseenTotal}\n        />\n      </div>\n      <div className=\"reputation-tokens\">\n        {data.results.map((contribution) => {\n          return <Contribution {...contribution} key={contribution.uuid} />\n        })}\n      </div>\n      <MarkAllAsSeenModal\n        endpoint={data.meta.links.markAllAsSeen}\n        open={modalOpen}\n        onSuccess={handleSuccess}\n        onClose={handleModalClose}\n        unseenTotal={data.meta.unseenTotal}\n      />\n    </div>\n  )\n}\n", "import React from 'react'\nimport { fromNow } from '../../utils/date'\nimport {\n  missingExerciseIconErrorHandler,\n  GraphicalIcon,\n  TrackIcon,\n  Reputation,\n} from '../common'\nimport { Contribution as ContributionProps } from '../types'\n\nexport const Contribution = ({\n  value,\n  text,\n  iconUrl,\n  internalUrl,\n  externalUrl,\n  createdAt,\n  track,\n}: ContributionProps): JSX.Element => {\n  const url = internalUrl || externalUrl\n  const linkIcon = url === internalUrl ? 'chevron-right' : 'external-link'\n\n  return (\n    <a href={url} className=\"reputation-token\">\n      <img\n        alt=\"\"\n        role=\"presentation\"\n        src={iconUrl}\n        className=\"c-icon primary-icon\"\n        onError={missingExerciseIconErrorHandler}\n      />\n      <div className=\"info\">\n        <div className=\"title\" dangerouslySetInnerHTML={{ __html: text }} />\n        <div className=\"extra\">\n          {track ? (\n            <div className=\"exercise\">\n              in\n              <TrackIcon\n                iconUrl={track.iconUrl}\n                title={track.title}\n                className=\"primary-icon\"\n              />\n              <div className=\"name\">{track.title}</div>\n            </div>\n          ) : (\n            <div className=\"generic\">Generic</div>\n          )}\n          <time dateTime={createdAt}>{fromNow(createdAt)}</time>\n        </div>\n      </div>\n      <Reputation value={`+ ${value}`} type=\"primary\" />\n      <GraphicalIcon icon={linkIcon} className=\"action-button\" />\n    </a>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { Modal, ModalProps } from '../../modals/Modal'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../utils/send-request'\nimport { FormButton } from '../../common'\nimport { ErrorBoundary, ErrorMessage } from '../../ErrorBoundary'\nimport { APIResult } from '../ContributionsList'\n\nconst DEFAULT_ERROR = new Error('Unable to mark all as seen')\n\nexport const MarkAllAsSeenModal = ({\n  endpoint,\n  onClose,\n  onSuccess,\n  unseenTotal,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  endpoint: string\n  onSuccess: (response: APIResult) => void\n  unseenTotal: number\n}): JSX.Element => {\n  const [mutation, { status, error }] = useMutation<APIResult>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'PATCH',\n        body: null,\n      })\n\n      return fetch\n    },\n    {\n      onSuccess: (result) => {\n        onSuccess(result)\n        onClose()\n      },\n    }\n  )\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  const handleClose = useCallback(() => {\n    if (status === 'loading') {\n      return\n    }\n\n    onClose()\n  }, [onClose, status])\n\n  return (\n    <Modal\n      theme=\"dark\"\n      className=\"m-generic-confirmation\"\n      onClose={handleClose}\n      {...props}\n    >\n      <h3>Mark all as seen?</h3>\n      <p>\n        Are you sure you want to mark all {unseenTotal} contributions as seen?\n        Note that these contributions may span multiple pages.\n      </p>\n      <form data-turbo=\"false\" onSubmit={handleSubmit} className=\"buttons\">\n        <FormButton type=\"submit\" status={status} className=\"btn-primary btn-s\">\n          Continue\n        </FormButton>\n        <FormButton\n          type=\"button\"\n          status={status}\n          onClick={handleClose}\n          className=\"btn-enhanced btn-s\"\n        >\n          Cancel\n        </FormButton>\n      </form>\n      <ErrorBoundary resetKeys={[status]}>\n        <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n      </ErrorBoundary>\n    </Modal>\n  )\n}\n", "import React from 'react'\n\nexport const MarkAllAsSeenButton = ({\n  unseenTotal,\n  onClick,\n}: {\n  unseenTotal: number\n  onClick: () => void\n}): JSX.Element => {\n  return (\n    <button\n      type=\"button\"\n      onClick={onClick}\n      className=\"btn-m btn-default\"\n      disabled={unseenTotal === 0}\n    >\n      Mark all as seen\n    </button>\n  )\n}\n", "import React from 'react'\nimport { SingleSelect } from '../../common'\nimport { ContributionCategoryId } from '../../types'\n\nconst OptionComponent = ({\n  option: category,\n}: {\n  option: ContributionCategoryId | undefined\n}): JSX.Element => {\n  switch (category) {\n    case 'authoring':\n      return (\n        <div className=\"info\">\n          <div className=\"title\">Contributing to Exercises</div>\n        </div>\n      )\n    case 'building':\n      return (\n        <div className=\"info\">\n          <div className=\"title\">Building Exercism</div>\n        </div>\n      )\n    case 'maintaining':\n      return (\n        <div className=\"info\">\n          <div className=\"title\">Maintaining</div>\n        </div>\n      )\n    case 'mentoring':\n      return (\n        <div className=\"info\">\n          <div className=\"title\">Mentoring</div>\n        </div>\n      )\n    case 'publishing':\n      return (\n        <div className=\"info\">\n          <div className=\"title\">Publishing</div>\n        </div>\n      )\n    case 'other':\n      return (\n        <div className=\"info\">\n          <div className=\"title\">Other</div>\n        </div>\n      )\n    case undefined:\n      return (\n        <div className=\"info\">\n          <div className=\"title\">Any category</div>\n        </div>\n      )\n  }\n}\n\nconst SelectedComponent = () => {\n  return <>Category</>\n}\n\nexport const CategorySelect = ({\n  value,\n  setValue,\n}: {\n  value: ContributionCategoryId | undefined\n  setValue: (value: ContributionCategoryId | undefined) => void\n}): JSX.Element => {\n  return (\n    <SingleSelect<ContributionCategoryId | undefined>\n      options={[\n        undefined,\n        'building',\n        'authoring',\n        'maintaining',\n        'mentoring',\n        'publishing',\n        'other',\n      ]}\n      value={value}\n      setValue={setValue}\n      SelectedComponent={SelectedComponent}\n      OptionComponent={OptionComponent}\n    />\n  )\n}\n", "import React, { useState, useCallback, useEffect } from 'react'\nimport { SolutionProps, Solution } from './Solution'\nimport { Request } from '../../hooks/request-query'\nimport { useList } from '../../hooks/use-list'\nimport { removeEmpty, useHistory } from '../../hooks/use-history'\nimport { usePaginatedRequestQuery } from '../../hooks/request-query'\nimport { ResultsZone } from '../ResultsZone'\nimport { Pagination, GraphicalIcon } from '../common'\nimport { FetchingBoundary } from '../FetchingBoundary'\nimport { PaginatedResult } from '../types'\nimport { OrderSwitcher } from './solutions-list/OrderSwitcher'\nimport pluralize from 'pluralize'\nimport { SolutionFilter } from './solutions-list/SolutionFilter'\nimport { ExerciseStatus } from './solutions-list/ExerciseStatusSelect'\nimport { MentoringStatus } from './solutions-list/MentoringStatusSelect'\nimport { SyncStatus } from './solutions-list/SyncStatusSelect'\nimport { TestsStatus } from './solutions-list/TestsStatusSelect'\nimport { HeadTestsStatus } from './solutions-list/HeadTestsStatusSelect'\n\nexport type Order = 'newest_first' | 'oldest_first'\n\nconst DEFAULT_ORDER = 'newest_first'\nconst DEFAULT_ERROR = new Error('Unable to load solutions')\n\nexport const SolutionsList = ({\n  request: initialRequest,\n  isEnabled,\n}: {\n  request: Request\n  isEnabled: boolean\n}): JSX.Element => {\n  const {\n    request,\n    setPage,\n    setCriteria: setRequestCriteria,\n    setQuery,\n    setOrder,\n  } = useList(initialRequest)\n  const [criteria, setCriteria] = useState(request.query?.criteria || '')\n  const cacheKey = [\n    'contributions-list',\n    request.endpoint,\n    removeEmpty(request.query),\n  ]\n  const { status, resolvedData, latestData, isFetching, error } =\n    usePaginatedRequestQuery<PaginatedResult<SolutionProps[]>>(cacheKey, {\n      ...request,\n      query: removeEmpty(request.query),\n      options: { ...request.options, enabled: isEnabled },\n    })\n\n  useEffect(() => {\n    const handler = setTimeout(() => {\n      setRequestCriteria(criteria)\n    }, 200)\n\n    return () => {\n      clearTimeout(handler)\n    }\n  }, [setRequestCriteria, criteria])\n\n  useHistory({ pushOn: removeEmpty(request.query) })\n\n  const handleApply = useCallback(\n    (\n      status: ExerciseStatus,\n      mentoringStatus: MentoringStatus,\n      syncStatus: SyncStatus,\n      testsStatus: TestsStatus,\n      headTestsStatus: HeadTestsStatus\n    ) => {\n      setQuery({\n        ...request.query,\n        page: undefined,\n        status: status,\n        mentoringStatus: mentoringStatus,\n        syncStatus: syncStatus,\n        testsStatus: testsStatus,\n        headTestsStatus: headTestsStatus,\n      })\n    },\n    [request.query, setQuery]\n  )\n\n  const handleReset = useCallback(() => {\n    setQuery({\n      ...request.query,\n      page: undefined,\n      status: undefined,\n      mentoringStatus: undefined,\n      syncStatus: undefined,\n      testsStatus: undefined,\n      headTestsStatus: undefined,\n    })\n  }, [request.query, setQuery])\n\n  return (\n    <article className=\"solutions-tab theme-dark\">\n      <div className=\"c-search-bar\">\n        <div className=\"md-container container\">\n          <input\n            className=\"--search\"\n            onChange={(e) => {\n              setCriteria(e.target.value)\n            }}\n            value={criteria}\n            placeholder=\"Search by exercise or track name\"\n          />\n          <SolutionFilter request={request} onApply={handleApply} />\n          <OrderSwitcher\n            value={(request.query.order || DEFAULT_ORDER) as Order}\n            setValue={setOrder}\n          />\n        </div>\n      </div>\n      <div className=\"md-container container\">\n        <ResultsZone isFetching={isFetching}>\n          <FetchingBoundary\n            status={status}\n            error={error}\n            defaultError={DEFAULT_ERROR}\n          >\n            {resolvedData ? (\n              <React.Fragment>\n                <div>\n                  <div className=\"results-title-bar\">\n                    <h3>\n                      Showing {resolvedData.meta.totalCount}{' '}\n                      {pluralize('solution', resolvedData.meta.totalCount)}\n                    </h3>\n                    <button\n                      type=\"button\"\n                      onClick={handleReset}\n                      className=\"btn-link\"\n                    >\n                      <GraphicalIcon icon=\"reset\" />\n                      <span>Reset filters</span>\n                    </button>\n                  </div>\n                  <div className=\"solutions\">\n                    {resolvedData.results.map((solution) => {\n                      return <Solution {...solution} key={solution.uuid} />\n                    })}\n                  </div>\n                </div>\n                <Pagination\n                  disabled={latestData === undefined}\n                  current={request.query.page}\n                  total={resolvedData.meta.totalPages}\n                  setPage={setPage}\n                />\n              </React.Fragment>\n            ) : null}\n          </FetchingBoundary>\n        </ResultsZone>\n      </div>\n    </article>\n  )\n}\n", "import React from 'react'\nimport { fromNow } from '../../utils/time'\nimport { GraphicalIcon, TrackIcon, ExerciseIcon, Icon } from '../common'\nimport { GenericTooltip } from '../misc/ExercismTippy'\nimport pluralize from 'pluralize'\n\nexport type SolutionProps = {\n  uuid: string\n  privateUrl: string\n  status: string\n  publishedIterationHeadTestsStatus: string\n  numViews?: number\n  numStars: number\n  numComments: number\n  numIterations: number\n  numLoc?: string\n  lastIteratedAt: string\n  isOutOfDate: boolean\n  exercise: {\n    title: string\n    iconUrl: string\n  }\n  track: {\n    title: string\n    iconUrl: string\n  }\n}\n\nexport const Solution = ({\n  privateUrl,\n  status,\n  publishedIterationHeadTestsStatus,\n  numViews,\n  numStars,\n  numComments,\n  numIterations,\n  numLoc,\n  lastIteratedAt,\n  exercise,\n  track,\n  isOutOfDate,\n}: SolutionProps): JSX.Element => {\n  return (\n    <a href={privateUrl} className=\"solution\">\n      <div className=\"main\">\n        <div className=\"exercise\">\n          <ExerciseIcon iconUrl={exercise.iconUrl} />\n          <div className=\"info\">\n            <div className=\"flex items-center mb-8\">\n              <div className=\"exercise-title\">{exercise.title}</div>\n\n              {isOutOfDate ? (\n                <GenericTooltip content=\"There is a newer version of this exercise. Visit the exercise page to upgrade to the latest version.\">\n                  <div>\n                    <Icon\n                      icon=\"warning\"\n                      alt=\"There is a newer version of this exercise. Visit the exercise page to upgrade.\"\n                      className=\"--out-of-date\"\n                    />\n                  </div>\n                </GenericTooltip>\n              ) : null}\n\n              {publishedIterationHeadTestsStatus === 'passed' ? (\n                <Icon\n                  icon=\"golden-check\"\n                  alt=\"Passes tests of the latest version of the exercise\"\n                  className=\"head-tests-status --passed\"\n                />\n              ) : publishedIterationHeadTestsStatus === 'failed' ||\n                publishedIterationHeadTestsStatus === 'errored' ? (\n                <GenericTooltip content=\"This solution fails the tests of the latest version of this exercise. Try updating the exercise and checking it locally or in the online editor.\">\n                  <div>\n                    <Icon\n                      icon=\"cross-circle\"\n                      alt=\"Failed tests of the latest version of the exercise\"\n                      className=\"head-tests-status --failed\"\n                    />\n                  </div>\n                </GenericTooltip>\n              ) : null}\n            </div>\n            <div className=\"extra\">\n              <div className=\"track\">\n                in\n                <TrackIcon iconUrl={track.iconUrl} title={track.title} />\n                <div className=\"track-title\">{track.title}</div>\n              </div>\n              {status === 'completed' ? (\n                <div className=\"status\">\n                  <GraphicalIcon icon=\"completed-check-circle\" />\n                  Completed\n                </div>\n              ) : status === 'published' ? (\n                <div className=\"status\">\n                  <GraphicalIcon icon=\"completed-check-circle\" />\n                  Published\n                </div>\n              ) : (\n                <></>\n              )}\n            </div>\n          </div>\n        </div>\n        <div className=\"stats\">\n          <div className=\"stat\">\n            <GraphicalIcon icon=\"iteration\" />\n            {numIterations} {pluralize('iteration', numIterations)}\n          </div>\n          {numLoc ? (\n            <div className=\"stat\">\n              <GraphicalIcon icon=\"loc\" />\n              {numLoc} lines\n            </div>\n          ) : null}\n          {numViews ? (\n            <div className=\"stat\">\n              <GraphicalIcon icon=\"views\" />\n              {numViews} {pluralize('view', numViews)}\n            </div>\n          ) : null}\n        </div>\n        {lastIteratedAt ? (\n          <time className=\"iterated-at\" dateTime={lastIteratedAt}>\n            Last submitted {fromNow(lastIteratedAt)}\n          </time>\n        ) : null}\n      </div>\n      <div className=\"counts\">\n        <div className=\"count\">\n          <GraphicalIcon icon=\"star\" />\n          <div className=\"num\">{numStars}</div>\n        </div>\n        <div className=\"count\">\n          <GraphicalIcon icon=\"comment\" />\n          <div className=\"num\">{numComments}</div>\n        </div>\n      </div>\n    </a>\n  )\n}\n", "import React from 'react'\nimport { SingleSelect } from '../../common/SingleSelect'\nimport { Order } from '../SolutionsList'\n\nconst OptionComponent = ({ option: order }: { option: Order }) => {\n  switch (order) {\n    case 'oldest_first':\n      return <>Oldest First</>\n    case 'newest_first':\n      return <>Newest First</>\n  }\n}\n\nexport const OrderSwitcher = ({\n  value,\n  setValue,\n}: {\n  value: Order\n  setValue: (value: Order) => void\n}): JSX.Element => {\n  return (\n    <SingleSelect<Order>\n      options={['newest_first', 'oldest_first']}\n      value={value}\n      setValue={setValue}\n      SelectedComponent={OptionComponent}\n      OptionComponent={OptionComponent}\n    />\n  )\n}\n", "import React, { useState, useEffect, useRef, useCallback } from 'react'\nimport { GraphicalIcon } from '../../common/GraphicalIcon'\nimport { ExerciseStatus, ExerciseStatusSelect } from './ExerciseStatusSelect'\nimport { HeadTestsStatus, HeadTestsStatusSelect } from './HeadTestsStatusSelect'\nimport { MentoringStatus, MentoringStatusSelect } from './MentoringStatusSelect'\nimport { SyncStatus, SyncStatusSelect } from './SyncStatusSelect'\nimport { TestsStatus, TestsStatusSelect } from './TestsStatusSelect'\n\nexport const SolutionFilter = ({\n  request,\n  onApply,\n}: {\n  request: any\n  onApply: (\n    status: ExerciseStatus,\n    mentoringStatus: MentoringStatus,\n    syncStatus: SyncStatus,\n    testsStatus: TestsStatus,\n    headTestsStatus: HeadTestsStatus\n  ) => void\n}): JSX.Element => {\n  const [status, setStatus] = useState<ExerciseStatus>(request.query.status)\n  const [mentoringStatus, setMentoringStatus] = useState<MentoringStatus>(\n    request.query.mentoringStatus\n  )\n  const [syncStatus, setSyncStatus] = useState<SyncStatus>(\n    request.query.syncStatus\n  )\n  const [testsStatus, setTestsStatus] = useState<TestsStatus>(\n    request.query.testsStatus\n  )\n  const [headTestsStatus, setHeadTestsStatus] = useState<HeadTestsStatus>(\n    request.query.headTestsStatus\n  )\n\n  const [expanded, setExpanded] = useState(false)\n  const [hasExpandedEver, markAsExpanded] = useState(false)\n\n  const dialogRef = useRef<HTMLDivElement>(null)\n  const filterButtonRef = useRef<HTMLButtonElement>(null)\n\n  useEffect(() => {\n    if (expanded) {\n      if (!dialogRef.current) {\n        return\n      }\n\n      dialogRef.current.focus()\n      markAsExpanded(true)\n    } else if (hasExpandedEver) {\n      if (!filterButtonRef.current) {\n        return\n      }\n\n      filterButtonRef.current.focus()\n    }\n  }, [expanded, hasExpandedEver])\n\n  useEffect(() => {\n    if (!expanded) {\n      return\n    }\n\n    const handleEscape = (e: KeyboardEvent) => {\n      if (e.key !== 'Escape') {\n        return\n      }\n\n      e.stopPropagation()\n      setExpanded(false)\n    }\n\n    document.addEventListener('keyup', handleEscape)\n    return () => {\n      document.removeEventListener('keyup', handleEscape)\n    }\n  }, [expanded])\n\n  const handleApply = useCallback(\n    (e) => {\n      e.preventDefault()\n      onApply(status, mentoringStatus, syncStatus, testsStatus, headTestsStatus)\n      setExpanded(false)\n    },\n    [\n      setExpanded,\n      status,\n      mentoringStatus,\n      syncStatus,\n      testsStatus,\n      headTestsStatus,\n    ]\n  )\n\n  const handleClose = useCallback(\n    (e) => {\n      e.preventDefault()\n      setExpanded(false)\n    },\n    [setExpanded]\n  )\n\n  return (\n    <>\n      <button\n        ref={filterButtonRef}\n        onClick={() => setExpanded(!expanded)}\n        className=\"--filter-btn\"\n        aria-haspopup=\"true\"\n        aria-expanded={expanded}\n      >\n        <span className=\"hidden sm:block sm:mr-12\">Filter by</span>\n        <GraphicalIcon icon=\"chevron-down\" />\n      </button>\n      <div\n        className=\"filter-options\"\n        ref={dialogRef}\n        tabIndex={-1}\n        role=\"dialog\"\n        aria-label=\"A series of options to filter Exercism tracks\"\n        {...(expanded ? {} : { hidden: true })}\n      >\n        <div className=\"md-container container\">\n          <div className=\"options\">\n            <ExerciseStatusSelect value={status} setValue={setStatus} />\n            <MentoringStatusSelect\n              value={mentoringStatus}\n              setValue={setMentoringStatus}\n            />\n            <SyncStatusSelect value={syncStatus} setValue={setSyncStatus} />\n            <TestsStatusSelect value={testsStatus} setValue={setTestsStatus} />\n            <HeadTestsStatusSelect\n              value={headTestsStatus}\n              setValue={setHeadTestsStatus}\n            />\n          </div>\n          <footer className=\"buttons\">\n            <button className=\"btn-primary btn-m\" onClick={handleApply}>\n              Apply filters\n            </button>\n            <button className=\"btn-default btn-m\" onClick={handleClose}>\n              Close\n            </button>\n          </footer>\n        </div>\n      </div>\n    </>\n  )\n}\n", "import React from 'react'\nimport { SingleSelect } from '../../common'\n\nexport type ExerciseStatus =\n  | undefined\n  | 'started'\n  | 'iterated'\n  | 'completed'\n  | 'published'\n\nconst OptionComponent = ({\n  option: status,\n}: {\n  option: ExerciseStatus\n}): JSX.Element => {\n  switch (status) {\n    case 'started':\n      return <>Started</>\n    case 'iterated':\n      return <>Iterated</>\n    case 'completed':\n      return <>Completed</>\n    case 'published':\n      return <>Published</>\n    case undefined:\n      return <>All</>\n  }\n}\n\nconst SelectedComponent = ({ option }: { option: ExerciseStatus }) => {\n  switch (option) {\n    case undefined:\n      return <>Exercise status</>\n    default:\n      return <OptionComponent option={option} />\n  }\n}\n\nexport const ExerciseStatusSelect = ({\n  value,\n  setValue,\n}: {\n  value: ExerciseStatus\n  setValue: (value: ExerciseStatus) => void\n}): JSX.Element => {\n  return (\n    <SingleSelect<ExerciseStatus>\n      options={[undefined, 'started', 'iterated', 'completed', 'published']}\n      value={value}\n      setValue={setValue}\n      SelectedComponent={SelectedComponent}\n      OptionComponent={OptionComponent}\n    />\n  )\n}\n", "import React from 'react'\nimport { SingleSelect } from '../../common'\n\nexport type HeadTestsStatus =\n  | undefined\n  | 'passed'\n  | 'failed'\n  | 'errored'\n  | 'exceptioned'\n\nconst OptionComponent = ({\n  option: status,\n}: {\n  option: HeadTestsStatus\n}): JSX.Element => {\n  switch (status) {\n    case 'passed':\n      return <>Passed</>\n    case 'failed':\n      return <>Failed</>\n    case 'errored':\n      return <>Errored</>\n    case 'exceptioned':\n      return <>Exceptioned</>\n    case undefined:\n      return <>All</>\n  }\n}\n\nconst SelectedComponent = ({ option }: { option: HeadTestsStatus }) => {\n  switch (option) {\n    case undefined:\n      return <>Latest Tests status</>\n    default:\n      return <OptionComponent option={option} />\n  }\n}\n\nexport const HeadTestsStatusSelect = ({\n  value,\n  setValue,\n}: {\n  value: HeadTestsStatus\n  setValue: (value: HeadTestsStatus) => void\n}): JSX.Element => {\n  return (\n    <SingleSelect<HeadTestsStatus>\n      options={[undefined, 'passed', 'failed', 'errored', 'exceptioned']}\n      value={value}\n      setValue={setValue}\n      SelectedComponent={SelectedComponent}\n      OptionComponent={OptionComponent}\n    />\n  )\n}\n", "import React from 'react'\nimport { SingleSelect } from '../../common'\n\nexport type MentoringStatus =\n  | undefined\n  | 'none'\n  | 'requested'\n  | 'in_progress'\n  | 'finished'\n\nconst OptionComponent = ({\n  option: status,\n}: {\n  option: MentoringStatus\n}): JSX.Element => {\n  switch (status) {\n    case 'none':\n      return <>No mentoring</>\n    case 'requested':\n      return <>Mentoring Requested</>\n    case 'in_progress':\n      return <>Mentoring in progress</>\n    case 'finished':\n      return <>Mentoring Completed</>\n    case undefined:\n      return <>Any</>\n  }\n}\n\nconst SelectedComponent = ({ option }: { option: MentoringStatus }) => {\n  switch (option) {\n    case undefined:\n      return <>Mentoring status</>\n    default:\n      return <OptionComponent option={option} />\n  }\n}\n\nexport const MentoringStatusSelect = ({\n  value,\n  setValue,\n}: {\n  value: MentoringStatus\n  setValue: (value: MentoringStatus) => void\n}): JSX.Element => {\n  return (\n    <SingleSelect<MentoringStatus>\n      options={[undefined, 'none', 'requested', 'in_progress', 'finished']}\n      value={value}\n      setValue={setValue}\n      SelectedComponent={SelectedComponent}\n      OptionComponent={OptionComponent}\n    />\n  )\n}\n", "import React from 'react'\nimport { SingleSelect } from '../../common'\n\nexport type SyncStatus = undefined | 'up_to_date' | 'out_of_date'\n\nconst OptionComponent = ({\n  option: status,\n}: {\n  option: SyncStatus\n}): JSX.Element => {\n  switch (status) {\n    case 'up_to_date':\n      return <>Up-to-date</>\n    case 'out_of_date':\n      return <>Out-of-date</>\n    case undefined:\n      return <>All</>\n  }\n}\n\nconst SelectedComponent = ({ option }: { option: SyncStatus }) => {\n  switch (option) {\n    case undefined:\n      return <>Sync status</>\n    default:\n      return <OptionComponent option={option} />\n  }\n}\n\nexport const SyncStatusSelect = ({\n  value,\n  setValue,\n}: {\n  value: SyncStatus\n  setValue: (value: SyncStatus) => void\n}): JSX.Element => {\n  return (\n    <SingleSelect<SyncStatus>\n      options={[undefined, 'up_to_date', 'out_of_date']}\n      value={value}\n      setValue={setValue}\n      SelectedComponent={SelectedComponent}\n      OptionComponent={OptionComponent}\n    />\n  )\n}\n", "import React from 'react'\nimport { SingleSelect } from '../../common'\n\nexport type TestsStatus =\n  | undefined\n  | 'passed'\n  | 'failed'\n  | 'errored'\n  | 'exceptioned'\n\nconst OptionComponent = ({\n  option: status,\n}: {\n  option: TestsStatus\n}): JSX.Element => {\n  switch (status) {\n    case 'passed':\n      return <>Passed</>\n    case 'failed':\n      return <>Failed</>\n    case 'errored':\n      return <>Errored</>\n    case 'exceptioned':\n      return <>Exceptioned</>\n    case undefined:\n      return <>All</>\n  }\n}\n\nconst SelectedComponent = ({ option }: { option: TestsStatus }) => {\n  switch (option) {\n    case undefined:\n      return <>Tests status</>\n    default:\n      return <OptionComponent option={option} />\n  }\n}\n\nexport const TestsStatusSelect = ({\n  value,\n  setValue,\n}: {\n  value: TestsStatus\n  setValue: (value: TestsStatus) => void\n}): JSX.Element => {\n  return (\n    <SingleSelect<TestsStatus>\n      options={[undefined, 'passed', 'failed', 'errored', 'exceptioned']}\n      value={value}\n      setValue={setValue}\n      SelectedComponent={SelectedComponent}\n      OptionComponent={OptionComponent}\n    />\n  )\n}\n", "import React, { useState, useEffect } from 'react'\nimport { BadgeResults } from './BadgeResults'\nimport { Request } from '../../hooks/request-query'\nimport { useList } from '../../hooks/use-list'\nimport { removeEmpty, useHistory } from '../../hooks/use-history'\nimport { usePaginatedRequestQuery } from '../../hooks/request-query'\nimport { ResultsZone } from '../ResultsZone'\nimport { Pagination } from '../common'\nimport { FetchingBoundary } from '../FetchingBoundary'\nimport { OrderSwitcher } from './badges-list/OrderSwitcher'\nimport { PaginatedResult, Badge } from '../types'\n\nconst DEFAULT_ORDER = 'unrevealed_first'\nconst DEFAULT_ERROR = new Error('Unable to load badge list')\n\nexport const BadgesList = ({\n  request: initialRequest,\n  isEnabled,\n}: {\n  request: Request\n  isEnabled: boolean\n}): JSX.Element => {\n  const {\n    request,\n    setPage,\n    setCriteria: setRequestCriteria,\n    setOrder,\n  } = useList(initialRequest)\n  const [criteria, setCriteria] = useState(request.query?.criteria || '')\n  const cacheKey = ['badges-list', request.endpoint, removeEmpty(request.query)]\n  const {\n    status,\n    resolvedData,\n    latestData,\n    isFetching,\n    error,\n  } = usePaginatedRequestQuery<PaginatedResult<Badge[]>>(cacheKey, {\n    ...request,\n    query: removeEmpty(request.query),\n    options: { ...request.options, enabled: isEnabled },\n  })\n\n  useEffect(() => {\n    const handler = setTimeout(() => {\n      setRequestCriteria(criteria)\n    }, 200)\n\n    return () => {\n      clearTimeout(handler)\n    }\n  }, [setRequestCriteria, criteria])\n\n  useHistory({ pushOn: removeEmpty(request.query) })\n\n  return (\n    <article className=\"badges-tab theme-dark\">\n      <div className=\"md-container container\">\n        <div className=\"c-search-bar\">\n          <input\n            className=\"--search\"\n            onChange={(e) => {\n              setCriteria(e.target.value)\n            }}\n            value={criteria}\n            placeholder=\"Search by badge name or description\"\n          />\n          <OrderSwitcher\n            value={request.query.order || DEFAULT_ORDER}\n            setValue={setOrder}\n          />\n        </div>\n        <ResultsZone isFetching={isFetching}>\n          <FetchingBoundary\n            status={status}\n            error={error}\n            defaultError={DEFAULT_ERROR}\n          >\n            {resolvedData ? (\n              <React.Fragment>\n                <BadgeResults data={resolvedData} cacheKey={cacheKey} />\n                <Pagination\n                  disabled={latestData === undefined}\n                  current={request.query.page}\n                  total={resolvedData.meta.totalPages}\n                  setPage={setPage}\n                />\n              </React.Fragment>\n            ) : null}\n          </FetchingBoundary>\n        </ResultsZone>\n      </div>\n    </article>\n  )\n}\n", "import React from 'react'\nimport { RevealedBadge } from './RevealedBadge'\nimport { UnrevealedBadge } from './UnrevealedBadge'\nimport pluralize from 'pluralize'\nimport { Badge as BadgeProps } from '../types'\nimport { QueryKey } from 'react-query'\nimport { PaginatedResult } from '../common/SearchableList'\n\nexport type Order = 'unrevealed_first' | 'newest_first' | 'oldest_first'\n\nexport const BadgeResults = ({\n  data,\n  cacheKey,\n}: {\n  data: PaginatedResult<BadgeProps>\n  cacheKey: QueryKey\n}): JSX.Element => {\n  return (\n    <div>\n      <div className=\"results-title-bar\">\n        <h3>\n          Showing {data.meta.totalCount}{' '}\n          {pluralize('badge', data.meta.totalCount)}\n        </h3>\n      </div>\n      <div className=\"badges\">\n        {data.results.map((badge) => {\n          return badge.isRevealed ? (\n            <RevealedBadge badge={badge} key={badge.uuid} />\n          ) : (\n            <UnrevealedBadge\n              badge={badge}\n              cacheKey={cacheKey}\n              key={badge.uuid}\n            />\n          )\n        })}\n      </div>\n    </div>\n  )\n}\n", "import React, { useState } from 'react'\nimport { BadgeMedallion } from '../common/BadgeMedallion'\nimport { Badge as BadgeProps } from '../types'\nimport { BadgeModal } from '../modals/BadgeModal'\n\nexport const RevealedBadge = ({\n  badge,\n}: {\n  badge: BadgeProps\n}): JSX.Element => {\n  const [open, setOpen] = useState(false)\n  return (\n    <React.Fragment>\n      <button className=\"c-badge\" onClick={() => setOpen(!open)}>\n        <BadgeMedallion badge={badge} />\n        <div className=\"--info\">\n          <div className=\"--name\">{badge.name}</div>\n          <div className=\"--desc\">{badge.description}</div>\n        </div>\n      </button>\n      <BadgeModal\n        badge={badge}\n        open={open}\n        onClose={() => {\n          setOpen(false)\n        }}\n      />\n    </React.Fragment>\n  )\n}\n", "import React from 'react'\nimport { Badge as BadgeProps } from '../types'\nimport { GraphicalIcon } from '../common'\nimport { BadgeMedallion } from '../common/BadgeMedallion'\nimport { Modal, ModalProps } from './Modal'\nimport { timeFormat } from '../../utils/time'\nimport pluralize from 'pluralize'\n\nexport const BadgeModal = ({\n  badge,\n  wasUnrevealed,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  badge: BadgeProps\n  wasUnrevealed?: boolean\n}): JSX.Element => {\n  const classNames = ['m-badge', `--${badge.rarity}`, 'theme-dark']\n\n  return (\n    <Modal\n      {...props}\n      closeButton={true}\n      className={classNames.join(' ')}\n      cover={true}\n    >\n      <BadgeMedallion badge={badge} />\n      {wasUnrevealed ? <h2>New Badge Earned</h2> : null}\n      <div className=\"name\">{badge.name}</div>\n      <div className=\"rarity\">{badge.rarity}</div>\n      <hr className=\"c-divider --small\" />\n      <div className=\"reason\">{badge.description}</div>\n      <div className=\"earned-at\">\n        Earned on{' '}\n        <time dateTime={badge.unlockedAt}>\n          {timeFormat(badge.unlockedAt, 'Do MMM YYYY')}\n        </time>\n      </div>\n      <div className=\"num-awardees text-p-base\">\n        <GraphicalIcon icon=\"students\" />\n        <strong>{badge.numAwardees}</strong>{' '}\n        {pluralize('member', badge.numAwardees)}{' '}\n        {pluralize('has', badge.numAwardees)} earned this badge.\n      </div>\n      <div className=\"percentage-awardees\">\n        That&apos;s <strong>{badge.percentageAwardees}%</strong> of all Exercism\n        users\n      </div>\n    </Modal>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { Badge as BadgeProps } from '../types'\nimport { useMutation, QueryKey, useQueryCache } from 'react-query'\nimport { FormButton } from '../common'\nimport { ErrorMessage, ErrorBoundary } from '../ErrorBoundary'\nimport { sendRequest } from '../../utils/send-request'\nimport { typecheck } from '../../utils/typecheck'\nimport { PaginatedResult } from '../common/SearchableList'\nimport { BadgeModal } from '../modals/BadgeModal'\n\nconst DEFAULT_ERROR = new Error('Unable to reveal badge')\n\nexport const UnrevealedBadge = ({\n  badge,\n  cacheKey,\n}: {\n  badge: BadgeProps\n  cacheKey: QueryKey\n}): JSX.Element => {\n  const queryCache = useQueryCache()\n  const [isModalOpen, setIsModalOpen] = useState(false)\n  const [revealedBadge, setRevealedBadge] = useState<BadgeProps | null>(null)\n  const [mutation, { status, error }] = useMutation<BadgeProps>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: badge.links.reveal,\n        method: 'PATCH',\n        body: null,\n      })\n\n      return fetch.then((json) => typecheck<BadgeProps>(json, 'badge'))\n    },\n    {\n      onSuccess: (badge) => {\n        setRevealedBadge(badge)\n        setIsModalOpen(true)\n      },\n    }\n  )\n\n  const updateCache = useCallback(() => {\n    const oldData = queryCache.getQueryData<PaginatedResult<BadgeProps>>(\n      cacheKey\n    )\n\n    if (!oldData || !revealedBadge) {\n      return\n    }\n\n    queryCache.setQueryData(cacheKey, {\n      ...oldData,\n      results: oldData.results.map((oldBadge) => {\n        return oldBadge.uuid === revealedBadge.uuid ? revealedBadge : oldBadge\n      }),\n    })\n  }, [cacheKey, revealedBadge, queryCache])\n\n  return (\n    <React.Fragment>\n      <FormButton\n        status={status}\n        className=\"c-badge\"\n        onClick={() => mutation()}\n      >\n        <div className={`c-badge-medallion --${badge.rarity} --unrevealed`}>\n          <div className=\"--unknown\">?</div>\n        </div>\n        <div className=\"--info\">\n          <div className=\"--name\">Unrevealed</div>\n          <div className=\"--desc\">Click/tap to reveal</div>\n        </div>\n      </FormButton>\n      <ErrorBoundary resetKeys={[status]}>\n        <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n      </ErrorBoundary>\n      {revealedBadge ? (\n        <BadgeModal\n          badge={revealedBadge}\n          open={isModalOpen}\n          onClose={() => {\n            setIsModalOpen(false)\n            updateCache()\n          }}\n          wasUnrevealed\n        />\n      ) : null}\n    </React.Fragment>\n  )\n}\n", "import React from 'react'\nimport { SingleSelect } from '../../common/SingleSelect'\nimport { Order } from '../BadgeResults'\n\nconst OptionComponent = ({ option: order }: { option: Order }) => {\n  switch (order) {\n    case 'unrevealed_first':\n      return <React.Fragment>Sort by Unrevealed First</React.Fragment>\n    case 'newest_first':\n      return <React.Fragment>Sort by Newest First</React.Fragment>\n    case 'oldest_first':\n      return <React.Fragment>Sort by Oldest First</React.Fragment>\n  }\n}\n\nexport const OrderSwitcher = ({\n  value,\n  setValue,\n}: {\n  value: Order\n  setValue: (value: Order) => void\n}): JSX.Element => {\n  return (\n    <SingleSelect<Order>\n      options={['unrevealed_first', 'newest_first', 'oldest_first']}\n      value={value}\n      setValue={setValue}\n      SelectedComponent={OptionComponent}\n      OptionComponent={OptionComponent}\n    />\n  )\n}\n", "import React from 'react'\nimport {\n  LearningSection,\n  Props as LearningSectionProps,\n} from './overview/LearningSection'\nimport {\n  MentoringSection,\n  Props as MentoringSectionProps,\n} from './overview/MentoringSection'\nimport {\n  ContributingSection,\n  Props as ContributingSectionProps,\n} from './overview/ContributingSection'\nimport {\n  BadgesSection,\n  Props as BadgesSectionProps,\n} from './overview/BadgesSection'\nimport { usePaginatedRequestQuery, Request } from '../../hooks/request-query'\nimport { ResultsZone } from '../ResultsZone'\nimport { FetchingBoundary } from '../FetchingBoundary'\nimport {\n  MentoringTotals,\n  MentoringRanks,\n  MentoredTrackProgressList,\n  MentoredTrackProgress,\n  TrackProgress,\n  TrackProgressList,\n} from './types'\nimport { TrackContribution, Badge, BadgeList } from '../types'\n\ntype JourneyOverview = {\n  learning: { tracks: readonly TrackProgress[] } & Omit<\n    LearningSectionProps,\n    'tracks'\n  >\n  mentoring: {\n    tracks: readonly MentoredTrackProgress[]\n    totals: MentoringTotals\n    ranks: MentoringRanks\n  } & Omit<MentoringSectionProps, 'tracks'>\n  contributing: { tracks: readonly TrackContribution[] } & Omit<\n    ContributingSectionProps,\n    'tracks'\n  >\n  badges: { badges: readonly Badge[] } & Omit<BadgesSectionProps, 'badges'>\n}\n\nconst DEFAULT_ERROR = new Error('Unable to load journey overview')\n\nconst formatData = ({ overview }: { overview: JourneyOverview }) => {\n  return {\n    overview: {\n      learning: {\n        ...overview.learning,\n        tracks: new TrackProgressList({ items: overview.learning.tracks }),\n      },\n      mentoring: {\n        ...overview.mentoring,\n        tracks: new MentoredTrackProgressList({\n          items: overview.mentoring.tracks,\n          totals: overview.mentoring.totals,\n          ranks: overview.mentoring.ranks,\n        }),\n      },\n      contributing: {\n        ...overview.contributing,\n        tracks: overview.contributing.tracks.map(\n          (track) => new TrackContribution(track)\n        ),\n      },\n      badges: {\n        ...overview.badges,\n        badges: new BadgeList({ items: overview.badges.badges }),\n      },\n    },\n  }\n}\n\nexport const Overview = ({\n  request,\n  isEnabled,\n}: {\n  request: Request\n  isEnabled: boolean\n}): JSX.Element => {\n  const { status, resolvedData, isFetching, error } = usePaginatedRequestQuery<{\n    overview: JourneyOverview\n  }>('journey-overview', {\n    ...request,\n    options: { ...request.options, enabled: isEnabled },\n  })\n  const formattedData = resolvedData ? formatData(resolvedData) : null\n\n  return (\n    <article className=\"overview-tab theme-dark\">\n      <ResultsZone isFetching={isFetching}>\n        <FetchingBoundary\n          status={status}\n          error={error}\n          defaultError={DEFAULT_ERROR}\n        >\n          {formattedData ? (\n            <React.Fragment>\n              <div className=\"md-container\">\n                <LearningSection {...formattedData.overview.learning} />\n                <MentoringSection {...formattedData.overview.mentoring} />\n              </div>\n              <div className=\"lg-container\">\n                <ContributingSection {...formattedData.overview.contributing} />\n              </div>\n              <div className=\"md-container\">\n                <BadgesSection {...formattedData.overview.badges} />\n              </div>\n            </React.Fragment>\n          ) : null}\n        </FetchingBoundary>\n      </ResultsZone>\n    </article>\n  )\n}\n", "import React from 'react'\nimport { GraphicalIcon } from '../../common'\nimport { TrackProgressList } from '../types'\nimport { HeaderSummary } from './learning-section/HeaderSummary'\nimport { TracksEnrolledSummary } from './learning-section/TracksEnrolledSummary'\nimport { ExercisesCompletedSummary } from './learning-section/ExercisesCompletedSummary'\nimport { ConceptsLearntSummary } from './learning-section/ConceptsLearntSummary'\nimport { LearningOverview } from './learning-section/LearningOverview'\nimport { TrackSummary } from './learning-section/TrackSummary'\nimport { LearningStats } from './learning-section/LearningStats'\n\nexport type Props = {\n  tracks: TrackProgressList\n  links: Links\n}\n\ntype Links = {\n  solutions: string\n  fable: string\n}\n\nexport const LearningSection = ({ tracks, links }: Props): JSX.Element => {\n  if (tracks.length === 0) {\n    return (\n      <section className=\"empty-section\">\n        <GraphicalIcon icon=\"exercises\" hex />\n        <h3 className=\"journey-h3 mb-24\">\n          You haven&apos;t joined any tracks yet\n        </h3>\n        {/* TODO get link from rails */}\n        <a href=\"/tracks\" className=\"btn-l btn-primary\">\n          Choose a track to get started.\n        </a>\n      </section>\n    )\n  }\n\n  return (\n    <section className=\"learning-section\">\n      <header className=\"section-header\">\n        <GraphicalIcon icon=\"exercises\" hex />\n        <h2 className=\"journey-h2\">Your learning</h2>\n        <HeaderSummary tracks={tracks} />\n      </header>\n      <div className=\"summary-boxes\">\n        <TracksEnrolledSummary tracks={tracks} />\n        <ExercisesCompletedSummary tracks={tracks} />\n        <ConceptsLearntSummary tracks={tracks} />\n      </div>\n      <LearningOverview tracks={tracks} />\n      <div className=\"tracks\">\n        {tracks.sort().items.map((track, idx) => (\n          <TrackSummary\n            key={track.slug}\n            track={track}\n            avgVelocity={null}\n            expanded={idx == 0}\n          />\n        ))}\n      </div>\n      {/*<LearningStats tracks={tracks} links={links} />*/}\n    </section>\n  )\n}\n", "import React from 'react'\nimport { TrackProgress, TrackProgressList } from '../../types'\nimport { TrackHeaderSpan } from '../TrackHeaderSpan'\nimport { TrackHeaderSummaryText } from '../TrackHeaderSummaryText'\n\nconst MAX_TRACKS = 4\n\nexport const HeaderSummary = ({\n  tracks,\n}: {\n  tracks: TrackProgressList\n}): JSX.Element => {\n  const tracksToDisplay = tracks.sort().items.slice(0, MAX_TRACKS)\n\n  return (\n    <p>\n      You&apos;ve progressed the furthest in{' '}\n      <TrackHeaderSummaryText<TrackProgress>\n        tracks={tracksToDisplay}\n        SpanComponent={TrackSummary}\n      />\n    </p>\n  )\n}\n\nconst TrackSummary = ({ track }: { track: TrackProgress }): JSX.Element => {\n  return (\n    <TrackHeaderSpan slug={track.slug}>\n      {track.title} ({track.completion.toFixed(2)}%)\n    </TrackHeaderSpan>\n  )\n}\n", "import React from 'react'\n\nexport const TrackHeaderSpan = ({\n  slug,\n  children,\n}: React.PropsWithChildren<{ slug: string }>): JSX.Element => {\n  const classNames = ['track', `t-b-${slug}`]\n\n  return <span className={classNames.join(' ')}>{children}</span>\n}\n", "import React from 'react'\n\nexport const TrackHeaderSummaryText = <T extends unknown>({\n  tracks,\n  SpanComponent,\n}: {\n  tracks: readonly T[]\n  SpanComponent: React.ComponentType<{ track: T }>\n}): JSX.Element | null => {\n  switch (tracks.length) {\n    case 4:\n      return (\n        <React.Fragment>\n          <SpanComponent track={tracks[0]} />\n          {', '} followed by <SpanComponent track={tracks[1]} />\n          {', '}\n          <SpanComponent track={tracks[2]} />\n          {' and '}\n          <SpanComponent track={tracks[3]} />.\n        </React.Fragment>\n      )\n    case 3:\n      return (\n        <React.Fragment>\n          <SpanComponent track={tracks[0]} />\n          {', '} followed by <SpanComponent track={tracks[1]} />\n          {' and '}\n          <SpanComponent track={tracks[2]} />.\n        </React.Fragment>\n      )\n    case 2:\n      return (\n        <React.Fragment>\n          <SpanComponent track={tracks[0]} /> followed by{' '}\n          <SpanComponent track={tracks[1]} />.\n        </React.Fragment>\n      )\n    case 1:\n      return (\n        <React.Fragment>\n          <SpanComponent track={tracks[0]} />.\n        </React.Fragment>\n      )\n    default:\n      return null\n  }\n}\n", "import React from 'react'\nimport pluralize from 'pluralize'\nimport { TrackProgressList } from '../../types'\n\nexport const TracksEnrolledSummary = ({\n  tracks,\n}: {\n  tracks: TrackProgressList\n}): JSX.Element => {\n  return (\n    <div className=\"box\">\n      <div className=\"journey-h3\">{tracks.length}</div>\n      <div className=\"journey-label\">\n        {pluralize('Track', tracks.length)} enrolled\n      </div>\n    </div>\n  )\n}\n", "import React from 'react'\nimport pluralize from 'pluralize'\nimport { TrackProgressList } from '../../types'\n\nexport const ExercisesCompletedSummary = ({\n  tracks,\n}: {\n  tracks: TrackProgressList\n}): JSX.Element => {\n  return (\n    <div className=\"box\">\n      <div className=\"journey-h3\">{tracks.numCompletedExercises}</div>\n      <div className=\"journey-label\">\n        {pluralize('Exercise', tracks.numCompletedExercises)} completed\n      </div>\n    </div>\n  )\n}\n", "import React from 'react'\nimport pluralize from 'pluralize'\nimport { TrackProgressList } from '../../types'\n\nexport const ConceptsLearntSummary = ({\n  tracks,\n}: {\n  tracks: TrackProgressList\n}): JSX.Element => {\n  return (\n    <div className=\"box\">\n      <div className=\"journey-h3\">{tracks.numConceptsLearnt}</div>\n      <div className=\"journey-label\">\n        {pluralize('Concept', tracks.numConceptsLearnt)} learnt\n      </div>\n    </div>\n  )\n}\n", "import pluralize from 'pluralize'\nimport React from 'react'\nimport { TrackProgressList } from '../../types'\n\nexport const LearningOverview = ({\n  tracks,\n}: {\n  tracks: TrackProgressList\n}): JSX.Element => {\n  return (\n    <div className=\"overview\">\n      <h3>\n        You&apos;re{' '}\n        <em className=\"text-gradient\">{tracks.completion.toFixed(2)}%</em>{' '}\n        through your enrolled {pluralize('Track', tracks.length)}.{' '}\n        {tracks.completion > 1 ? <strong>Keep it up! \uD83D\uDE80</strong> : null}\n      </h3>\n      <div className=\"c-progress --large\">\n        <div className=\"bar\" style={{ width: `${tracks.completion}%` }} />\n      </div>\n      <div className=\"count\">\n        {tracks.numCompletedExercises} / {tracks.numExercises} exercises\n        completed\n      </div>\n    </div>\n  )\n}\n", "import React from 'react'\nimport { TrackSummaryHeader } from './track-summary/TrackSummaryHeader'\nimport { GraphicalIcon, ProgressGraph } from '../../../common'\nimport { TrackProgress } from '../../types'\nimport { timeFormat, fromNow } from '../../../../utils/time'\nimport pluralize from 'pluralize'\n\nexport const TrackSummary = ({\n  track,\n  expanded,\n  avgVelocity,\n}: {\n  track: TrackProgress\n  expanded: boolean\n  avgVelocity: number | null\n}): JSX.Element => {\n  return (\n    <details className=\"c-details track\" open={expanded}>\n      <summary className=\"--summary\">\n        <TrackSummaryHeader track={track} />\n      </summary>\n      <div className=\"track-details\">\n        <div className=\"time-area\">\n          <ProgressGraph\n            data={track.progressChart.data}\n            height={120}\n            width={300}\n          />\n          <div className=\"info\">\n            <h4>{track.progressChart.period}</h4>\n            <p>\n              {track.numCompletedExercises} / {track.numExercises} (\n              {track.completion.toFixed(2)}%) exercises completed\n            </p>\n          </div>\n        </div>\n        <div className=\"date-area\">\n          <GraphicalIcon icon=\"entry\" />\n          <h4 className=\"journey-h3\">\n            {timeFormat(track.startedAt, 'DD MMM YYYY')}\n          </h4>\n          <h5 className=\"text-h6\">When you joined the {track.title} Track</h5>\n          <p>\n            You started working through the {track.title} Track{' '}\n            <strong>{fromNow(track.startedAt)}</strong>.\n          </p>\n        </div>\n        <div className=\"mentor-history-area\">\n          <GraphicalIcon icon=\"mentoring\" />\n          <h4 className=\"journey-h3\">\n            {track.numCompletedMentoringDiscussions}\n          </h4>\n          <h5 className=\"text-h6\">\n            Mentoring{' '}\n            {pluralize('session', track.numCompletedMentoringDiscussions)}{' '}\n            completed\n          </h5>\n\n          <p>\n            You have{' '}\n            <strong>\n              {track.numInProgressMentoringDiscussions === 0\n                ? 'none'\n                : `${track.numInProgressMentoringDiscussions} ${pluralize(\n                    'discussion',\n                    track.numInProgressMentoringDiscussions\n                  )}`}\n            </strong>{' '}\n            in progress and{' '}\n            <strong>\n              {track.numInProgressMentoringDiscussions === 0\n                ? 'none'\n                : `${track.numQueuedMentoringRequests} ${pluralize(\n                    'solution',\n                    track.numQueuedMentoringRequests\n                  )}`}\n            </strong>{' '}\n            in the queue.\n          </p>\n        </div>\n        {track.velocity ? (\n          <div className=\"velocity-area\">\n            <GraphicalIcon icon=\"velocity\" />\n            <div className=\"journey-h3\">{track.velocity}</div>\n            <h4>Progression Velocity</h4>\n            {avgVelocity ? (\n              <div className=\"note\">Avg. on Exercism = {avgVelocity}</div>\n            ) : null}\n            <div className=\"info\">\n              This is a measure of how quickly you\u2019ve progressed through the\n              track in the last 6 months\n            </div>\n          </div>\n        ) : null}\n      </div>\n    </details>\n  )\n}\n", "import React from 'react'\nimport { TrackProgress } from '../../../types'\nimport { GraphicalIcon, TrackIcon } from '../../../../common'\nimport { TrackProgressBar } from './TrackProgressBar'\n\nexport const TrackSummaryHeader = ({\n  track,\n}: {\n  track: TrackProgress\n}): JSX.Element => {\n  return (\n    <div className=\"--summary-inner\">\n      <TrackIcon iconUrl={track.iconUrl} title={track.title} />\n      <h3>{track.title}</h3>\n      <TrackProgressBar completion={track.completion} />\n      <div className=\"percentage\">{track.completion.toFixed(2)}%</div>\n      <GraphicalIcon icon=\"chevron-right\" className=\"--closed-icon\" />\n      <GraphicalIcon icon=\"chevron-down\" className=\"--open-icon\" />\n    </div>\n  )\n}\n", "import React from 'react'\nimport { Icon } from '../../../../common'\n\nexport const TrackProgressBar = ({\n  completion,\n}: {\n  completion: number\n}): JSX.Element => {\n  const isComplete = completion === 100\n  const classNames = [\n    'c-progress',\n    '--small',\n    isComplete ? '--completed' : '',\n  ].filter((className) => className.length > 0)\n\n  return (\n    <div className={classNames.join(' ')}>\n      <div className=\"bar\" style={{ width: `${completion}%` }} />\n      {isComplete ? (\n        <div className=\"completed-icon\">\n          <Icon\n            icon=\"completed-check-circle\"\n            alt=\"Completed\"\n            className=\"completed\"\n          />\n        </div>\n      ) : null}\n    </div>\n  )\n}\n", "import React from 'react'\nimport { GraphicalIcon } from '../../common'\nimport { MentoredTrackProgressList, MentoringRanks } from '../types'\nimport { HeaderSummary } from './mentoring-section/HeaderSummary'\nimport { MentoringChart } from './mentoring-section/MentoringChart'\nimport { SessionsMentoredSummary } from './mentoring-section/SessionsMentoredSummary'\nimport { StudentsMentoredSummary } from './mentoring-section/StudentsMentoredSummary'\nimport { SessionRatioSummary } from './mentoring-section/SessionRatioSummary'\nimport { TrackSummary } from './mentoring-section/TrackSummary'\n\nexport type Props = {\n  tracks: MentoredTrackProgressList\n  ranks: MentoringRanks\n}\n\nexport const MentoringSection = ({ tracks, ranks }: Props): JSX.Element => {\n  if (tracks.length === 0) {\n    return (\n      <section className=\"empty-section\">\n        <GraphicalIcon icon=\"mentoring\" hex />\n        <h3 className=\"journey-h3 mb-24\">\n          You haven&apos;t mentored anyone yet\n        </h3>\n        {/* TODO get link from rails */}\n        <a href=\"/mentoring\" className=\"btn-l btn-primary\">\n          Try mentoring\n        </a>\n      </section>\n    )\n  }\n\n  return (\n    <section className=\"mentoring-section\">\n      <header className=\"section-header\">\n        <GraphicalIcon icon=\"mentoring\" hex />\n        <h2 className=\"journey-h2\">Your mentoring</h2>\n        <HeaderSummary tracks={tracks} />\n      </header>\n      <div className=\"content\">\n        <div className=\"info\">\n          <div className=\"summary-boxes\">\n            <SessionsMentoredSummary tracks={tracks} rank={ranks.discussions} />\n            <StudentsMentoredSummary tracks={tracks} rank={ranks.students} />\n            <SessionRatioSummary tracks={tracks} />\n          </div>\n          <div className=\"track-metrics\">\n            {tracks.sort().items.map((track) => (\n              <TrackSummary key={track.slug} track={track} />\n            ))}\n          </div>\n        </div>\n        <MentoringChart tracks={tracks} />\n      </div>\n    </section>\n  )\n}\n", "import React from 'react'\nimport { MentoredTrackProgress, MentoredTrackProgressList } from '../../types'\nimport { TrackHeaderSpan } from '../TrackHeaderSpan'\nimport { TrackHeaderSummaryText } from '../TrackHeaderSummaryText'\n\nclass MentoredTrackProgressWithPercentage {\n  track: MentoredTrackProgress\n  numTotalSessions: number\n\n  get percentage(): number {\n    return (100 * this.track.numDiscussions) / this.numTotalSessions\n  }\n\n  get slug(): string {\n    return this.track.slug\n  }\n\n  get title(): string {\n    return this.track.title\n  }\n\n  constructor(track: MentoredTrackProgress, numTotalSessions: number) {\n    this.track = track\n    this.numTotalSessions = numTotalSessions\n  }\n}\n\nconst MAX_TRACKS = 4\n\nexport const HeaderSummary = ({\n  tracks,\n}: {\n  tracks: MentoredTrackProgressList\n}): JSX.Element => {\n  const tracksToDisplay = tracks\n    .sort()\n    .items.slice(0, MAX_TRACKS)\n    .map(\n      (track) =>\n        new MentoredTrackProgressWithPercentage(\n          track,\n          tracks.totals.discussions\n        )\n    )\n\n  return (\n    <p>\n      You&apos;ve mostly mentored in{' '}\n      <TrackHeaderSummaryText<MentoredTrackProgressWithPercentage>\n        tracks={tracksToDisplay}\n        SpanComponent={TrackSummary}\n      />\n    </p>\n  )\n}\n\nconst TrackSummary = ({\n  track,\n}: {\n  track: MentoredTrackProgressWithPercentage\n}): JSX.Element => {\n  return (\n    <TrackHeaderSpan slug={track.slug}>\n      {track.title} ({track.percentage.toFixed(2)}%)\n    </TrackHeaderSpan>\n  )\n}\n", "import React, { useState, useEffect } from 'react'\nimport Chart from 'chart.js/auto'\nimport { ChartConfiguration, ChartDataset } from 'chart.js'\nimport { MentoredTrackProgressList } from '../../types'\n\nconst CONFIG: ChartConfiguration<'doughnut'> = {\n  type: 'doughnut',\n  data: {\n    labels: [],\n    datasets: [],\n  },\n  options: {\n    cutout: 150,\n    plugins: {\n      legend: { display: false },\n    },\n  },\n}\n\nexport const MentoringChart = ({\n  tracks,\n}: {\n  tracks: MentoredTrackProgressList\n}): JSX.Element => {\n  const [canvas, setCanvas] = useState<HTMLCanvasElement | null>(null)\n  const [chart, setChart] = useState<Chart<'doughnut'> | null>(null)\n\n  useEffect(() => {\n    if (!canvas) {\n      return\n    }\n    const chart = new Chart<'doughnut'>(canvas, CONFIG)\n\n    setChart(chart)\n\n    return () => chart.destroy()\n  }, [canvas])\n\n  useEffect(() => {\n    if (!chart) {\n      return\n    }\n\n    const dataset: ChartDataset<'doughnut'> = {\n      label: 'Sessions mentored per track',\n      data: tracks.items.map((track) => track.numDiscussions),\n      backgroundColor: tracks.items.map(\n        (track) =>\n          `rgb(${getComputedStyle(document.documentElement).getPropertyValue(\n            `--track-color-${track.slug}`\n          )})`\n      ),\n      borderWidth: 0,\n      hoverOffset: 4,\n    }\n    chart.data.labels = tracks.items.map((track) => track.title)\n    chart.data.datasets = [dataset]\n\n    chart.update()\n  }, [chart, tracks.items])\n\n  return (\n    <div className=\"chart\">\n      <canvas id=\"mentoring-chart\" width=\"350\" height=\"350\" ref={setCanvas} />\n    </div>\n  )\n}\n", "import React from 'react'\nimport { MentoredTrackProgressList } from '../../types'\nimport { CommunityRank } from './CommunityRank'\n\nexport const SessionsMentoredSummary = ({\n  tracks,\n  rank,\n}: {\n  tracks: MentoredTrackProgressList\n  rank?: number\n}): JSX.Element => {\n  return (\n    <div className=\"box\">\n      <div className=\"journey-h3\">{tracks.totals.discussions}</div>\n      <div className=\"journey-label\">Total sessions mentored</div>\n      {rank ? <CommunityRank rank={rank} /> : null}\n    </div>\n  )\n}\n", "import React from 'react'\n\nexport const CommunityRank = ({ rank }: { rank: number }): JSX.Element => {\n  const classNames = ['c-community-rank-tag', `--top-${rank}`]\n\n  return <div className={classNames.join(' ')}>Top {rank}%</div>\n}\n", "import React from 'react'\nimport { MentoredTrackProgressList } from '../../types'\nimport { CommunityRank } from './CommunityRank'\n\nexport const StudentsMentoredSummary = ({\n  tracks,\n  rank,\n}: {\n  tracks: MentoredTrackProgressList\n  rank?: number\n}): JSX.Element => {\n  return (\n    <div className=\"box\">\n      <div className=\"journey-h3\">{tracks.totals.students}</div>\n      <div className=\"journey-label\">Total students mentored</div>\n      {rank ? <CommunityRank rank={rank} /> : null}\n    </div>\n  )\n}\n", "import React from 'react'\nimport { MentoredTrackProgressList } from '../../types'\nimport { CommunityRank } from './CommunityRank'\n\nexport const SessionRatioSummary = ({\n  tracks,\n}: {\n  tracks: MentoredTrackProgressList\n}): JSX.Element => {\n  return (\n    <div className=\"box\">\n      <div className=\"journey-h3\">{tracks.sessionRatio.toFixed(2)}</div>\n      <div className=\"journey-label\">Sessions per student</div>\n    </div>\n  )\n}\n", "import React from 'react'\nimport { TrackIcon } from '../../../common'\nimport { MentoredTrackProgress } from '../../types'\nimport pluralize from 'pluralize'\n\nexport const TrackSummary = ({\n  track,\n}: {\n  track: MentoredTrackProgress\n}): JSX.Element => {\n  return (\n    <div className=\"track\">\n      <div className=\"dot t-b-csharp\" />\n      <TrackIcon iconUrl={track.iconUrl} title={track.title} />\n      <div className=\"details\">\n        <div className=\"journey-label\">{track.title}</div>\n        <div className=\"journey-h4\">\n          {track.numDiscussions} {pluralize('session', track.numDiscussions)}\n        </div>\n      </div>\n    </div>\n  )\n}\n", "import React from 'react'\nimport { TrackContribution } from '../../types'\nimport { ContributionsSummary } from '../../profile/ContributionsSummary'\nimport { GraphicalIcon } from '../../common'\nimport { HeaderSummary } from './contributing-section/HeaderSummary'\n\nexport type Props = {\n  tracks: readonly TrackContribution[]\n  handle: string\n  links: Links\n}\n\ntype Links = {\n  contributions: string\n}\n\nexport const ContributingSection = ({\n  tracks,\n  handle,\n  links,\n}: Props): JSX.Element => {\n  const allTrack = tracks.find((track) => track.slug === null)\n\n  if (!allTrack) {\n    throw new Error('No data found for all track')\n  }\n\n  if (allTrack.totalReputation === 0) {\n    return (\n      <section className=\"empty-section\">\n        <GraphicalIcon icon=\"mentoring\" hex />\n        <h3 className=\"journey-h3 mb-24\">\n          You haven&apos;t contributed to Exercism yet\n        </h3>\n        {/* TODO get link from rails */}\n        <a href=\"/contributing\" className=\"btn-l btn-primary\">\n          See how you can contribute\n        </a>\n      </section>\n    )\n  }\n  return (\n    <section className=\"contributing-section\">\n      <header className=\"section-header\">\n        <GraphicalIcon icon=\"contribute\" hex />\n        <h2 className=\"journey-h2\">Your contributions</h2>\n        <HeaderSummary tracks={tracks} />\n        <hr className=\"c-divider\" />\n      </header>\n      <div className=\"content\">\n        <ContributionsSummary\n          tracks={tracks}\n          handle={handle}\n          links={links}\n          showHeader={false}\n        />\n      </div>\n    </section>\n  )\n}\n", "import React from 'react'\nimport { TrackContribution } from '../../../types'\nimport { TrackHeaderSummaryText } from '../TrackHeaderSummaryText'\nimport { TrackHeaderSpan } from '../TrackHeaderSpan'\n\nconst MAX_TRACKS = 4\n\nclass TrackContributionWithPercentage {\n  track: TrackContribution\n  totalReputation: number\n\n  get percentage(): number {\n    return (100 * this.track.totalReputation) / this.totalReputation\n  }\n\n  get slug(): string | null {\n    return this.track.slug\n  }\n\n  get title(): string {\n    return this.track.title\n  }\n\n  constructor(track: TrackContribution, totalReputation: number) {\n    this.track = track\n    this.totalReputation = totalReputation\n  }\n}\n\nexport const HeaderSummary = ({\n  tracks,\n}: {\n  tracks: readonly TrackContribution[]\n}): JSX.Element => {\n  const allTrack = tracks.find((track) => track.slug === null)\n\n  if (!allTrack) {\n    throw new Error('Incomplete track data')\n  }\n\n  const tracksToDisplay = tracks\n    .filter((track) => track !== allTrack)\n    .sort((a, b) => (a.totalReputation < b.totalReputation ? 1 : -1))\n    .slice(0, MAX_TRACKS)\n    .map(\n      (track) =>\n        new TrackContributionWithPercentage(track, allTrack.totalReputation)\n    )\n\n  return (\n    <p>\n      You&apos;ve contributed most to{' '}\n      <TrackHeaderSummaryText<TrackContributionWithPercentage>\n        tracks={tracksToDisplay}\n        SpanComponent={TrackSummary}\n      />\n    </p>\n  )\n}\n\nconst TrackSummary = ({\n  track,\n}: {\n  track: TrackContributionWithPercentage\n}): JSX.Element => {\n  if (!track.slug) {\n    throw new Error('No summary for track')\n  }\n\n  return (\n    <TrackHeaderSpan slug={track.slug}>\n      {track.title} ({track.percentage.toFixed(2)}%)\n    </TrackHeaderSpan>\n  )\n}\n", "import React from 'react'\nimport { ProminentLink } from '../../common'\nimport { BadgeMedallion } from '../../common/BadgeMedallion'\nimport { BadgeList } from '../../types'\nimport { BadgeSummary } from './badges-section/BadgeSummary'\n\nexport type Props = {\n  badges: BadgeList\n  links: Links\n}\n\ntype Links = {\n  badges: string\n}\n\nconst MAX_BADGES = 4\n\nexport const BadgesSection = ({ badges, links }: Props): JSX.Element => {\n  const badgesToShow = badges.sort().items.slice(0, MAX_BADGES)\n\n  return (\n    <section className=\"badges-section\">\n      <div className=\"info\">\n        <div className=\"journey-h3\">A glimpse of your badges collection</div>\n        <BadgeSummary badges={badges} />\n        <ProminentLink\n          link={links.badges}\n          text=\"See your entire badge collection\"\n          withBg\n        />\n      </div>\n      <div className=\"badges\">\n        {badgesToShow.map((badge) => (\n          <BadgeMedallion key={badge.uuid} badge={badge} />\n        ))}\n      </div>\n    </section>\n  )\n}\n", "import pluralize from 'pluralize'\nimport React from 'react'\nimport { BadgeList, BadgeRarity } from '../../../types'\nimport { toSentence } from '../../../../utils/toSentence'\n\nconst BADGE_RARITIES: BadgeRarity[] = [\n  'legendary',\n  'ultimate',\n  'rare',\n  'common',\n]\n\nexport const BadgeSummary = ({\n  badges,\n}: {\n  badges: BadgeList\n}): JSX.Element => {\n  const parts = BADGE_RARITIES.map<string>((rarity: BadgeRarity) => {\n    const badgesWithRarity = badges.filter(rarity)\n\n    return badgesWithRarity.length > 0\n      ? `${badgesWithRarity.length} ${rarity} ${pluralize(\n          'badge',\n          badgesWithRarity.length\n        )}`\n      : ''\n  }).filter((part) => part.length > 0)\n\n  return (\n    <p className=\"text-p-large\">\n      You have {parts.length == 0 ? 'no badges' : toSentence(parts)}.\n    </p>\n  )\n}\n", "export type MentoringTotals = {\n  discussions: number\n  students: number\n  ratio: number\n}\n\nexport type MentoringRanks = {\n  discussions?: number\n  students?: number\n}\n\nexport type TrackProgressChart = {\n  data: number[]\n  period: string\n}\n\nexport class TrackProgress {\n  title: string\n  slug: string\n  numExercises: number\n  numCompletedExercises: number\n  numCompletedMentoringDiscussions: number\n  numInProgressMentoringDiscussions: number\n  numQueuedMentoringRequests: number\n  numSolutions: number\n  numLines: number\n  numConceptsLearnt: number\n  iconUrl: string\n  startedAt: string\n  progressChart: TrackProgressChart\n\n  get completion(): number {\n    return (100 * this.numCompletedExercises) / this.numExercises\n  }\n\n  // TODO: (required)\n  get velocity(): number | null {\n    return null\n  }\n\n  constructor({\n    title,\n    slug,\n    numExercises,\n    numCompletedExercises,\n    numCompletedMentoringDiscussions,\n    numInProgressMentoringDiscussions,\n    numQueuedMentoringRequests,\n    numConceptsLearnt,\n    numSolutions,\n    numLines,\n    iconUrl,\n    startedAt,\n    progressChart,\n  }: {\n    title: string\n    slug: string\n    numExercises: number\n    numCompletedMentoringDiscussions: number\n    numInProgressMentoringDiscussions: number\n    numQueuedMentoringRequests: number\n    numCompletedExercises: number\n    numSolutions: number\n    numLines: number\n    numConceptsLearnt: number\n    iconUrl: string\n    startedAt: string\n    progressChart: TrackProgressChart\n  }) {\n    this.title = title\n    this.slug = slug\n    this.numExercises = numExercises\n    this.numCompletedExercises = numCompletedExercises\n    this.numCompletedMentoringDiscussions = numCompletedMentoringDiscussions\n    this.numInProgressMentoringDiscussions = numInProgressMentoringDiscussions\n    this.numQueuedMentoringRequests = numQueuedMentoringRequests\n    this.numConceptsLearnt = numConceptsLearnt\n    this.numSolutions = numSolutions\n    this.numLines = numLines\n    this.iconUrl = iconUrl\n    this.startedAt = startedAt\n    this.progressChart = progressChart\n  }\n}\n\nexport class TrackProgressList {\n  items: readonly TrackProgress[]\n\n  get numConceptsLearnt(): number {\n    return this.items.reduce<number>(\n      (sum, track) => (sum += track.numConceptsLearnt),\n      0\n    )\n  }\n\n  get completion(): number {\n    return (100 * this.numCompletedExercises) / this.numExercises\n  }\n\n  get numCompletedExercises(): number {\n    return this.items.reduce<number>(\n      (sum, track) => (sum += track.numCompletedExercises),\n      0\n    )\n  }\n\n  get numExercises(): number {\n    return this.items.reduce<number>(\n      (sum, track) => (sum += track.numExercises),\n      0\n    )\n  }\n\n  get numSolutions(): number {\n    return this.items.reduce<number>(\n      (sum, track) => (sum += track.numSolutions),\n      0\n    )\n  }\n\n  get numLines(): number {\n    return this.items.reduce<number>((sum, track) => (sum += track.numLines), 0)\n  }\n\n  get length(): number {\n    return this.items.length\n  }\n\n  sort(): TrackProgressList {\n    return new TrackProgressList({\n      items: [...this.items]\n        .sort((a, b) => (a.completion < b.completion ? -1 : 1))\n        .reverse(),\n    })\n  }\n\n  constructor({ items }: { items: readonly TrackProgress[] }) {\n    this.items = items.map((item) => new TrackProgress(item))\n  }\n}\n\nexport class MentoredTrackProgress {\n  title: string\n  slug: string\n  iconUrl: string\n  numDiscussions: number\n  numStudents: number\n\n  constructor({\n    title,\n    slug,\n    iconUrl,\n    numDiscussions,\n    numStudents,\n  }: {\n    title: string\n    slug: string\n    iconUrl: string\n    numDiscussions: number\n    numStudents: number\n  }) {\n    this.title = title\n    this.slug = slug\n    this.iconUrl = iconUrl\n    this.numDiscussions = numDiscussions\n    this.numStudents = numStudents\n  }\n}\n\nexport class MentoredTrackProgressList {\n  items: readonly MentoredTrackProgress[]\n  totals: MentoringTotals\n  ranks: MentoringRanks\n\n  constructor({\n    items,\n    totals,\n    ranks,\n  }: {\n    items: readonly MentoredTrackProgress[]\n    totals: MentoringTotals\n    ranks: MentoringRanks\n  }) {\n    this.items = items.map((item) => new MentoredTrackProgress(item))\n    this.totals = totals\n    this.ranks = ranks\n  }\n\n  sort(): MentoredTrackProgressList {\n    return new MentoredTrackProgressList({\n      totals: this.totals,\n      ranks: this.ranks,\n      items: [...this.items]\n        .sort((a, b) => (a.numDiscussions < b.numDiscussions ? -1 : 1))\n        .reverse(),\n    })\n  }\n\n  get length(): number {\n    return this.items.length\n  }\n\n  get sessionRatio(): number {\n    return this.totals.discussions / this.totals.students\n  }\n}\n", "import React, { useState, useCallback } from 'react'\nimport { FormButton, GraphicalIcon, Icon } from '../common'\nimport { useSettingsMutation } from './useSettingsMutation'\nimport { FormMessage } from './FormMessage'\n\ntype User = {\n  name: string\n  location: string\n  bio: string\n}\n\ntype Profile = {\n  twitter: string\n  github: string\n  linkedin: string\n}\n\ntype Links = {\n  update: string\n}\n\nconst DEFAULT_ERROR = new Error('Unable to save profile')\n\nexport const ProfileForm = ({\n  defaultUser,\n  defaultProfile,\n  links,\n}: {\n  defaultUser: User\n  defaultProfile: Profile | null\n  links: Links\n}): JSX.Element => {\n  const [user, setUser] = useState<User>(defaultUser)\n  const [profile, setProfile] = useState<Profile | null>(defaultProfile)\n\n  const { mutation, status, error } = useSettingsMutation<{\n    user: User\n    profile: Profile | null\n  }>({\n    endpoint: links.update,\n    method: 'PATCH',\n    body: { user: user, profile: profile },\n  })\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  return (\n    <form data-turbo=\"false\" onSubmit={handleSubmit}>\n      <h2>Profile</h2>\n      <div className=\"details\">\n        <div className=\"name field\">\n          <label htmlFor=\"user_name\" className=\"label\">\n            Name\n          </label>\n          <input\n            id=\"user_name\"\n            type=\"text\"\n            value={user.name || ''}\n            onChange={(e) => setUser({ ...user, name: e.target.value })}\n            required\n          />\n        </div>\n        <div className=\"location field\">\n          <label htmlFor=\"user_location\" className=\"label\">\n            Location\n          </label>\n          <label className=\"c-faux-input\">\n            <GraphicalIcon icon=\"location\" />\n            <input\n              id=\"user_location\"\n              type=\"text\"\n              value={user.location || ''}\n              onChange={(e) => setUser({ ...user, location: e.target.value })}\n            />\n          </label>\n        </div>\n      </div>\n      <div className=\"bio field\">\n        <label htmlFor=\"user_bio\" className=\"label\">\n          Bio\n        </label>\n        <textarea\n          id=\"user_bio\"\n          value={user.bio || ''}\n          onChange={(e) => setUser({ ...user, bio: e.target.value })}\n        />\n        <div className=\"instructions\">\n          Tell the world about you \uD83C\uDF0E. Emojis encouraged!\n        </div>\n      </div>\n      {profile ? (\n        <div className=\"pt-20 mt-24 border-t-1 border-borderColor6\">\n          <h2>Your social accounts</h2>\n          <div className=\"field\">\n            <label htmlFor=\"profile_github\" className=\"label\">\n              Github (Handle)\n            </label>\n            <input\n              type=\"text\"\n              id=\"profile_github\"\n              placeholder=\"Your GitHub handle\"\n              value={profile.github || ''}\n              onChange={(e) =>\n                setProfile({ ...profile, github: e.target.value })\n              }\n            />\n          </div>\n          <div className=\"field\">\n            <label htmlFor=\"profile_twitter\" className=\"label\">\n              Twitter (Handle)\n            </label>\n            <input\n              type=\"text\"\n              id=\"profile_twitter\"\n              placeholder=\"Your Twitter handle\"\n              value={profile.twitter || ''}\n              onChange={(e) =>\n                setProfile({ ...profile, twitter: e.target.value })\n              }\n            />\n          </div>\n          <div className=\"field\">\n            <label htmlFor=\"profile_linkedin\" className=\"label\">\n              LinkedIn (Full URL)\n            </label>\n            <input\n              type=\"text\"\n              id=\"profile_linkedin\"\n              placeholder=\"Your LinkedIn profile url\"\n              value={profile.linkedin || ''}\n              onChange={(e) =>\n                setProfile({ ...profile, linkedin: e.target.value })\n              }\n            />\n          </div>\n        </div>\n      ) : null}\n      <div className=\"form-footer\">\n        <FormButton status={status} className=\"btn-primary btn-m\">\n          Save profile data\n        </FormButton>\n        <FormMessage\n          status={status}\n          defaultError={DEFAULT_ERROR}\n          error={error}\n          SuccessMessage={SuccessMessage}\n        />\n      </div>\n    </form>\n  )\n}\n\nconst SuccessMessage = () => {\n  return (\n    <div className=\"status success\">\n      <Icon icon=\"completed-check-circle\" alt=\"Success\" />\n      Your profile has been saved\n    </div>\n  )\n}\n", "import React from 'react'\nimport { ErrorBoundary, useErrorHandler } from '../ErrorBoundary'\nimport { FallbackProps } from 'react-error-boundary'\nimport { QueryStatus } from 'react-query'\nimport { Icon } from '../common'\n\nconst ErrorMessage = ({ error }: FallbackProps): JSX.Element => {\n  return (\n    <div className=\"status error\">\n      <Icon icon=\"failed-cross-circle\" alt=\"Error\" />\n      {error.message}\n    </div>\n  )\n}\n\nexport const FormMessage = ({\n  status,\n  error,\n  defaultError,\n  SuccessMessage,\n}: {\n  status: QueryStatus\n  error: unknown\n  defaultError: Error\n  SuccessMessage: React.ComponentType<{}>\n}): JSX.Element => {\n  return (\n    <ErrorBoundary FallbackComponent={ErrorMessage} resetKeys={[status]}>\n      <Message\n        status={status}\n        error={error}\n        SuccessMessage={SuccessMessage}\n        defaultError={defaultError}\n      />\n    </ErrorBoundary>\n  )\n}\n\nconst Message = ({\n  status,\n  SuccessMessage,\n  defaultError,\n  error,\n}: {\n  status: QueryStatus\n  SuccessMessage: React.ComponentType<{}>\n  defaultError: Error\n  error: unknown\n}): JSX.Element | null => {\n  useErrorHandler(error, { defaultError: defaultError })\n\n  switch (status) {\n    case 'success':\n      return <SuccessMessage />\n    default:\n      return null\n  }\n}\n", "import React, { useState, useCallback } from 'react'\nimport { FormButton, Icon } from '../common'\nimport { useSettingsMutation } from './useSettingsMutation'\nimport { FormMessage } from './FormMessage'\n\ntype Links = {\n  update: string\n  info: string\n}\n\ntype RequestBody = {\n  user: {\n    pronoun_parts: readonly string[]\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to update pronouns')\n\nexport const PronounsForm = ({\n  handle,\n  defaultPronounParts,\n  links,\n}: {\n  handle: string\n  defaultPronounParts: readonly string[]\n  links: Links\n}): JSX.Element => {\n  const [pronounParts, setPronounParts] = useState<readonly string[]>(\n    defaultPronounParts || ['', '', '']\n  )\n\n  const setPronounPart = useCallback(\n    (part: string, index: number) => {\n      const newPronounParts = [...pronounParts]\n      newPronounParts[index] = part\n\n      setPronounParts(newPronounParts)\n    },\n    [pronounParts]\n  )\n\n  const { mutation, status, error } = useSettingsMutation<RequestBody>({\n    endpoint: links.update,\n    method: 'PATCH',\n    body: { user: { pronoun_parts: pronounParts } },\n  })\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  return (\n    <form data-turbo=\"false\" onSubmit={handleSubmit}>\n      <h2>How would you like to be addressed? (optional)</h2>\n      <hr className=\"c-divider --small\" />\n      <div className=\"instructions\">\n        We recommend listing the pronouns you&apos;d like people to use when\n        referring to you.{' '}\n        <strong>\n          In the example testimonial below, enter the pronouns you&apos;d like\n          us to show to your mentors and students.\n        </strong>{' '}\n        You can leave this blank, in which case we will not suggest any\n        pronouns.{' '}\n        <a href={links.info} target=\"_blank\" rel=\"noreferrer\">\n          Learn more about how we use pronouns.\n        </a>\n      </div>\n      <div className=\"testimonial\">\n        <div className=\"text\">\n          {handle} was really great.\n          <input\n            type=\"text\"\n            value={pronounParts[0] || ''}\n            placeholder=\"e.g. They\"\n            maxLength={100}\n            onChange={(e) => setPronounPart(e.target.value, 0)}\n          />\n          answered all my questions. I&apos;ll recommend\n          <input\n            type=\"text\"\n            value={pronounParts[1] || ''}\n            placeholder=\"e.g. them\"\n            maxLength={100}\n            onChange={(e) => setPronounPart(e.target.value, 1)}\n          />\n          to others because\n          <input\n            type=\"text\"\n            value={pronounParts[2] || ''}\n            placeholder=\"e.g. their\"\n            maxLength={100}\n            onChange={(e) => setPronounPart(e.target.value, 2)}\n          />\n          advice was very helpful.\n        </div>\n        <div className=\"commonly-used\">\n          <div className=\"info\">Frequently used:</div>\n          <button\n            type=\"button\"\n            onClick={() => setPronounParts(['She', 'her', 'her'])}\n          >\n            she / her / her\n          </button>\n          <button\n            type=\"button\"\n            onClick={() => setPronounParts(['He', 'him', 'his'])}\n          >\n            he / him / his\n          </button>\n          <button\n            type=\"button\"\n            onClick={() => setPronounParts(['They', 'them', 'their'])}\n          >\n            they / them / their\n          </button>\n          <button\n            type=\"button\"\n            onClick={() => setPronounParts([handle, handle, handle])}\n          >\n            Use handle\n          </button>\n          <button type=\"button\" onClick={() => setPronounParts(['', '', ''])}>\n            Leave blank\n          </button>\n        </div>\n      </div>\n      <div className=\"form-footer\">\n        <FormButton status={status} className=\"btn-primary btn-m\">\n          Save pronouns\n        </FormButton>\n        <FormMessage\n          status={status}\n          error={error}\n          defaultError={DEFAULT_ERROR}\n          SuccessMessage={SuccessMessage}\n        />\n      </div>\n    </form>\n  )\n}\n\nconst SuccessMessage = () => {\n  return (\n    <div className=\"status success\">\n      <Icon icon=\"completed-check-circle\" alt=\"Success\" />\n      Your pronouns have been updated\n    </div>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { GraphicalIcon, FormButton, Icon } from '../common'\nimport { useSettingsMutation } from './useSettingsMutation'\nimport { FormMessage } from './FormMessage'\n\ntype Links = {\n  update: string\n}\n\ntype RequestBody = {\n  user: {\n    handle: string\n    sudo_password: string\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to change handle')\n\nexport const HandleForm = ({\n  defaultHandle,\n  links,\n}: {\n  defaultHandle: string\n  links: Links\n}): JSX.Element => {\n  const [state, setState] = useState({ handle: defaultHandle, password: '' })\n  const { mutation, status, error } = useSettingsMutation<RequestBody>({\n    endpoint: links.update,\n    method: 'PATCH',\n    body: {\n      user: {\n        handle: state.handle,\n        sudo_password: state.password,\n      },\n    },\n  })\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  return (\n    <form data-turbo=\"false\" onSubmit={handleSubmit}>\n      <h2>Change your handle</h2>\n      <hr className=\"c-divider --small\" />\n      <div className=\"field\">\n        <label htmlFor=\"user_handle\" className=\"label\">\n          Your handle\n        </label>\n        <label className=\"c-faux-input\">\n          <GraphicalIcon icon=\"at-symbol\" />\n          <input\n            type=\"text\"\n            id=\"user_handle\"\n            value={state.handle}\n            onChange={(e) => setState({ ...state, handle: e.target.value })}\n            required\n          />\n        </label>\n      </div>\n      <div className=\"field\">\n        <label htmlFor=\"user_sudo_password\" className=\"label\">\n          Confirm your password\n        </label>\n        <input\n          type=\"password\"\n          id=\"user_sudo_password\"\n          value={state.password}\n          onChange={(e) => setState({ ...state, password: e.target.value })}\n          required\n        />\n        <p className=\"info\">\n          We recommend only changing your handle in rare circumstances as public\n          solution links will break, and it is confusing for mentors.\n        </p>\n      </div>\n      <div className=\"form-footer\">\n        <FormButton status={status} className=\"btn-primary btn-m\">\n          Change handle\n        </FormButton>\n        <FormMessage\n          status={status}\n          defaultError={DEFAULT_ERROR}\n          error={error}\n          SuccessMessage={SuccessMessage}\n        />\n      </div>\n    </form>\n  )\n}\n\nconst SuccessMessage = () => {\n  return (\n    <div className=\"status success\">\n      <Icon icon=\"completed-check-circle\" alt=\"Success\" />\n      Your handle has been changed\n    </div>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { useSettingsMutation } from './useSettingsMutation'\nimport { FormButton, Icon } from '../common'\nimport { FormMessage } from './FormMessage'\n\ntype Links = {\n  update: string\n}\n\ntype RequestBody = {\n  user: {\n    email: string\n    sudo_password: string\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to change email')\n\nexport const EmailForm = ({\n  defaultEmail,\n  links,\n}: {\n  defaultEmail: string\n  links: Links\n}): JSX.Element => {\n  const [state, setState] = useState({ email: defaultEmail, password: '' })\n  const { mutation, status, error } = useSettingsMutation<RequestBody>({\n    endpoint: links.update,\n    method: 'PATCH',\n    body: {\n      user: {\n        email: state.email,\n        sudo_password: state.password,\n      },\n    },\n  })\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  return (\n    <form data-turbo=\"false\" onSubmit={handleSubmit}>\n      <h2>Change your email</h2>\n      <hr className=\"c-divider --small\" />\n      <div className=\"field\">\n        <label htmlFor=\"user_email\" className=\"label\">\n          Your email address\n        </label>\n        <input\n          type=\"email\"\n          id=\"user_email\"\n          value={state.email}\n          onChange={(e) => setState({ ...state, email: e.target.value })}\n          required\n        />\n      </div>\n      <div className=\"field\">\n        <label htmlFor=\"user_sudo_password\" className=\"label\">\n          Confirm your password\n        </label>\n        <input\n          type=\"password\"\n          id=\"user_sudo_password\"\n          value={state.password}\n          onChange={(e) => setState({ ...state, password: e.target.value })}\n          required\n        />\n        <p className=\"info\">\n          You can change your email using the form above. We will send you a new\n          confirmation email for you to accept.\n        </p>\n      </div>\n      <div className=\"form-footer\">\n        <FormButton status={status} className=\"btn-primary btn-m\">\n          Change email\n        </FormButton>\n        <FormMessage\n          status={status}\n          defaultError={DEFAULT_ERROR}\n          error={error}\n          SuccessMessage={() => <SuccessMessage email={state.email} />}\n        />\n      </div>\n    </form>\n  )\n}\n\nconst SuccessMessage = ({ email }: { email: string }) => {\n  return (\n    <div className=\"status success\">\n      <Icon icon=\"completed-check-circle\" alt=\"Success\" />\n      We&apos;ve sent a confirmation email to {email}\n    </div>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { useSettingsMutation } from './useSettingsMutation'\nimport { FormButton, Icon } from '../common'\nimport { FormMessage } from './FormMessage'\n\ntype Links = {\n  update: string\n}\n\ntype RequestBody = {\n  user: {\n    sudo_password: string\n    password: string\n    password_confirmation: string\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to change password')\n\nexport const PasswordForm = ({ links }: { links: Links }): JSX.Element => {\n  const [state, setState] = useState({\n    sudoPassword: '',\n    password: '',\n    passwordConfirmation: '',\n  })\n  const { mutation, status, error } = useSettingsMutation<RequestBody>({\n    endpoint: links.update,\n    method: 'PATCH',\n    body: {\n      user: {\n        sudo_password: state.sudoPassword,\n        password: state.password,\n        password_confirmation: state.passwordConfirmation,\n      },\n    },\n    onSuccess: () => window.location.reload(),\n  })\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  return (\n    <form data-turbo=\"false\" onSubmit={handleSubmit}>\n      <h2>Change your password</h2>\n      <hr className=\"c-divider --small\" />\n      <div className=\"field\">\n        <label htmlFor=\"user_sudo_password\" className=\"label\">\n          Current password\n        </label>\n        <input\n          type=\"password\"\n          id=\"user_sudo_password\"\n          value={state.sudoPassword}\n          onChange={(e) => setState({ ...state, sudoPassword: e.target.value })}\n          required\n        />\n      </div>\n      <div className=\"field\">\n        <label htmlFor=\"user_password\" className=\"label\">\n          New password\n        </label>\n        <input\n          type=\"password\"\n          id=\"user_password\"\n          value={state.password}\n          onChange={(e) => setState({ ...state, password: e.target.value })}\n          required\n        />\n      </div>\n      <div className=\"field\">\n        <label htmlFor=\"user_password_confirmation\" className=\"label\">\n          Confirm new password\n        </label>\n        <input\n          type=\"password\"\n          id=\"user_password_confirmation\"\n          value={state.passwordConfirmation}\n          onChange={(e) =>\n            setState({ ...state, passwordConfirmation: e.target.value })\n          }\n          required\n        />\n        <p className=\"info\">\n          <strong>Warning: Changing your password will sign you out.</strong>{' '}\n          You can then sign back in with your new password.\n        </p>\n      </div>\n      <div className=\"form-footer\">\n        <FormButton status={status} className=\"btn-primary btn-m\">\n          Change password\n        </FormButton>\n        <FormMessage\n          status={status}\n          defaultError={DEFAULT_ERROR}\n          error={error}\n          SuccessMessage={() => null}\n        />\n      </div>\n    </form>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { CopyToClipboardButton, FormButton } from '../common'\nimport { useSettingsMutation } from './useSettingsMutation'\nimport { FormMessage } from './FormMessage'\nimport { ProminentLink, Icon } from '../common'\n\ntype Links = {\n  reset: string\n  info: string\n}\n\nconst DEFAULT_ERROR = new Error('Unable to reset token')\n\nexport const TokenForm = ({\n  defaultToken,\n  links,\n}: {\n  defaultToken: string\n  links: Links\n}): JSX.Element => {\n  const [token, setToken] = useState(defaultToken)\n\n  const { mutation, status, error } = useSettingsMutation<\n    { token: string },\n    { authToken: string }\n  >({\n    endpoint: links.reset,\n    method: 'PATCH',\n    body: { token: token },\n    onSuccess: (response) => {\n      setToken(response.authToken)\n    },\n  })\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  return (\n    <form data-turbo=\"false\" onSubmit={handleSubmit}>\n      <h2>API / CLI Token</h2>\n      <div className=\"label\">Your authentication token is:</div>\n      <CopyToClipboardButton textToCopy={token} />\n      <ProminentLink link={links.info} text=\"Where do I use this?\" />\n\n      <div className=\"form-footer\">\n        <FormButton status={status} className=\"btn-warning btn-m\">\n          Reset token\n        </FormButton>\n        <FormMessage\n          status={status}\n          defaultError={DEFAULT_ERROR}\n          error={error}\n          SuccessMessage={SuccessMessage}\n        />\n      </div>\n    </form>\n  )\n}\n\nconst SuccessMessage = () => {\n  return (\n    <div className=\"status success\">\n      <Icon icon=\"completed-check-circle\" alt=\"Success\" />\n      Your token has been reset\n    </div>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { useSettingsMutation } from './useSettingsMutation'\nimport { FormButton, Icon, GraphicalIcon } from '../common'\nimport { FormMessage } from './FormMessage'\nimport { UserPreference } from '../types'\n\ntype Links = {\n  update: string\n}\n\ntype UserPreferences = {\n  automation: readonly UserPreference[]\n}\n\nconst DEFAULT_ERROR = new Error('Unable to change preferences')\n\nexport const UserPreferencesForm = ({\n  defaultPreferences,\n  links,\n}: {\n  defaultPreferences: UserPreferences\n  links: Links\n}): JSX.Element => {\n  const [preferences, setPreferences] = useState(defaultPreferences)\n  const { mutation, status, error } = useSettingsMutation({\n    endpoint: links.update,\n    method: 'PATCH',\n    body: {\n      user_preferences: [...preferences.automation].reduce<\n        Record<string, boolean>\n      >((data, p) => {\n        data[p.key] = p.value\n\n        return data\n      }, {}),\n    },\n  })\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  const handlePreferenceChange = useCallback(\n    (changedPreference, key: keyof UserPreferences) => {\n      return (e: React.ChangeEvent<HTMLInputElement>) => {\n        setPreferences({\n          ...preferences,\n          [key]: preferences[key].map((p) =>\n            p.key === changedPreference.key\n              ? { ...changedPreference, value: e.target.checked }\n              : p\n          ),\n        })\n      }\n    },\n    [preferences]\n  )\n\n  return (\n    <form data-turbo=\"false\" onSubmit={handleSubmit}>\n      <h2>Automation</h2>\n      {preferences.automation.map((p) => (\n        <label className=\"c-checkbox-wrapper\" key={p.key}>\n          <input\n            type=\"checkbox\"\n            checked={p.value}\n            onChange={handlePreferenceChange(p, 'automation')}\n          />\n          <div className=\"row\">\n            <div className=\"c-checkbox\">\n              <GraphicalIcon icon=\"checkmark\" />\n            </div>\n            {p.label}\n          </div>\n        </label>\n      ))}\n      <div className=\"form-footer\">\n        <FormButton status={status} className=\"btn-primary btn-m\">\n          Change preferences\n        </FormButton>\n        <FormMessage\n          status={status}\n          defaultError={DEFAULT_ERROR}\n          error={error}\n          SuccessMessage={SuccessMessage}\n        />\n      </div>\n    </form>\n  )\n}\n\nconst SuccessMessage = () => {\n  return (\n    <div className=\"status success\">\n      <Icon icon=\"completed-check-circle\" alt=\"Success\" />\n      Your preferences have been updated\n    </div>\n  )\n}\n", "import React from 'react'\nimport {\n  InfoMessage,\n  THEMES,\n  ThemeButton,\n  isDisabled,\n  useTheme,\n} from './theme-preference-form'\nimport { useThemeObserver } from '@/hooks'\n\nexport type ThemePreferenceLinks = {\n  update: string\n  insidersPath: string\n  premiumPath: string\n}\n\nexport type Theme = {\n  label: string\n  background: string\n  icon: string\n  value: string\n}\n\nexport const ThemePreferenceForm = ({\n  defaultThemePreference,\n  insidersStatus,\n  isPremium,\n  links,\n}: {\n  defaultThemePreference: string\n  insidersStatus: string\n  isPremium: boolean\n  links: ThemePreferenceLinks\n}): JSX.Element => {\n  const { handleThemeUpdate } = useTheme(defaultThemePreference, links)\n  const { theme } = useThemeObserver()\n\n  return (\n    <form data-turbo=\"false\">\n      <h2 className=\"!mb-4\">Theme</h2>\n      <InfoMessage\n        isPremium={isPremium}\n        premiumPath={links.premiumPath}\n        insidersStatus={insidersStatus}\n        insidersPath={links.insidersPath}\n      />\n      <div className=\"flex gap-32\">\n        {THEMES.map((t: Theme) => (\n          <ThemeButton\n            key={t.label}\n            links={links}\n            theme={t}\n            currentTheme={theme.split('-')[1]}\n            disabledInfo={isDisabled(isPremium, t.value, theme)}\n            onClick={(e) => handleThemeUpdate(t, e)}\n          />\n        ))}\n      </div>\n    </form>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { useSettingsMutation } from './useSettingsMutation'\nimport { FormButton, Icon, GraphicalIcon } from '../common'\nimport { FormMessage } from './FormMessage'\nimport { CommunicationPreferences } from '../types'\n\ntype Links = {\n  update: string\n}\n\nconst DEFAULT_ERROR = new Error('Unable to change preferences')\n\nexport const CommunicationPreferencesForm = ({\n  defaultPreferences,\n  links,\n}: {\n  defaultPreferences: CommunicationPreferences\n  links: Links\n}): JSX.Element => {\n  const [preferences, setPreferences] = useState(defaultPreferences)\n  const { mutation, status, error } = useSettingsMutation({\n    endpoint: links.update,\n    method: 'PATCH',\n    body: {\n      communication_preferences: [\n        ...preferences.mentoring,\n        ...preferences.product,\n      ].reduce<Record<string, boolean>>((data, p) => {\n        data[p.key] = p.value\n\n        return data\n      }, {}),\n    },\n  })\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  const handlePreferenceChange = useCallback(\n    (changedPreference, key: keyof CommunicationPreferences) => {\n      return (e: React.ChangeEvent<HTMLInputElement>) => {\n        setPreferences({\n          ...preferences,\n          [key]: preferences[key].map((p) =>\n            p.key === changedPreference.key\n              ? { ...changedPreference, value: e.target.checked }\n              : p\n          ),\n        })\n      }\n    },\n    [preferences]\n  )\n\n  return (\n    <form data-turbo=\"false\" onSubmit={handleSubmit}>\n      <h2>Mentoring</h2>\n      {preferences.mentoring.map((p) => (\n        <label className=\"c-checkbox-wrapper\" key={p.key}>\n          <input\n            type=\"checkbox\"\n            checked={p.value}\n            onChange={handlePreferenceChange(p, 'mentoring')}\n          />\n          <div className=\"row\">\n            <div className=\"c-checkbox\">\n              <GraphicalIcon icon=\"checkmark\" />\n            </div>\n            {p.label}\n          </div>\n        </label>\n      ))}\n      <h2>Product</h2>\n      {preferences.product.map((p) => (\n        <label className=\"c-checkbox-wrapper\" key={p.key}>\n          <input\n            type=\"checkbox\"\n            checked={p.value}\n            onChange={handlePreferenceChange(p, 'product')}\n          />\n          <div className=\"row\">\n            <div className=\"c-checkbox\">\n              <GraphicalIcon icon=\"checkmark\" />\n            </div>\n            {p.label}\n          </div>\n        </label>\n      ))}\n      <div className=\"form-footer\">\n        <FormButton status={status} className=\"btn-primary btn-m\">\n          Change preferences\n        </FormButton>\n        <FormMessage\n          status={status}\n          defaultError={DEFAULT_ERROR}\n          error={error}\n          SuccessMessage={SuccessMessage}\n        />\n      </div>\n    </form>\n  )\n}\n\nconst SuccessMessage = () => {\n  return (\n    <div className=\"status success\">\n      <Icon icon=\"completed-check-circle\" alt=\"Success\" />\n      Your preferences have been updated\n    </div>\n  )\n}\n", "import React, { useState } from 'react'\nimport { DeleteAccountModal } from '../modals/DeleteAccountModal'\n\ntype Links = {\n  delete: string\n}\n\nexport const DeleteAccountButton = ({\n  handle,\n  links,\n  ariaHideApp = true,\n}: {\n  handle: string\n  links: Links\n  ariaHideApp?: boolean\n}): JSX.Element => {\n  const [open, setOpen] = useState(false)\n\n  return (\n    <React.Fragment>\n      <button\n        type=\"button\"\n        className=\"c-delete-account-button btn-alert btn-m\"\n        onClick={() => setOpen(!open)}\n      >\n        Delete account\n      </button>\n      <DeleteAccountModal\n        open={open}\n        onClose={() => setOpen(false)}\n        handle={handle}\n        endpoint={links.delete}\n        ariaHideApp={ariaHideApp}\n      />\n    </React.Fragment>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { Modal, ModalProps } from './Modal'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../utils/send-request'\nimport { FormButton } from '../common'\nimport { ErrorBoundary, ErrorMessage } from '../ErrorBoundary'\nimport { useConfirmation } from '../../hooks/use-confirmation'\nimport { redirectTo } from '../../utils/redirect-to'\n\ntype APIResponse = {\n  links: {\n    home: string\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to delete account')\n\nexport const DeleteAccountModal = ({\n  handle,\n  endpoint,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  handle: string\n  endpoint: string\n}): JSX.Element => {\n  const [mutation, { status, error }] = useMutation<APIResponse>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'DELETE',\n        body: JSON.stringify({ handle: handle }),\n      })\n\n      return fetch\n    },\n    {\n      onSuccess: (response) => {\n        redirectTo(response.links.home)\n      },\n    }\n  )\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n      mutation()\n    },\n    [mutation]\n  )\n\n  const { attempt, setAttempt, isAttemptPass } = useConfirmation(handle)\n\n  return (\n    <Modal {...props} className=\"m-delete-account m-generic-destructive\">\n      <form data-turbo=\"false\" onSubmit={handleSubmit}>\n        <div className=\"info\">\n          <h2>You&apos;re about to delete your Exercism account</h2>\n          <p>\n            <strong>Please read this carefully before continuing.</strong>\n          </p>\n          <p>\n            This is <em>irreversible</em> and will mean you\u2019ll lose everything\n            you\u2019ve done on your account.\n          </p>\n          <hr />\n          <p>\n            <strong>By deleting your account, you will lose access to:</strong>\n          </p>\n          <ul>\n            <li>All solutions you have submitted</li>\n            <li>All mentoring you have received</li>\n            <li>All mentoring you have given and any testimonials received.</li>\n            <li>All your personal data, which will be deleted</li>\n          </ul>\n        </div>\n        <hr />\n        <label htmlFor=\"confirmation\">\n          To confirm, write your handle <pre>{handle}</pre> in the box below:\n        </label>\n\n        <input\n          id=\"confirmation\"\n          type=\"text\"\n          value={attempt}\n          onChange={(e) => setAttempt(e.target.value)}\n          autoComplete=\"off\"\n        />\n        <hr />\n        <div className=\"btns\">\n          <FormButton\n            status={status}\n            className=\"btn-default btn-m\"\n            type=\"button\"\n            onClick={props.onClose}\n          >\n            Cancel\n          </FormButton>\n\n          <FormButton\n            type=\"submit\"\n            disabled={!isAttemptPass}\n            status={status}\n            className=\"btn-primary btn-m\"\n          >\n            Delete account\n          </FormButton>\n        </div>\n        <ErrorBoundary resetKeys={[status]}>\n          <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n        </ErrorBoundary>\n      </form>\n    </Modal>\n  )\n}\n", "import { useState } from 'react'\n\nexport const useConfirmation = (toMatch: string) => {\n  const [attempt, setAttempt] = useState('')\n\n  return {\n    attempt,\n    setAttempt,\n    isAttemptPass: attempt === toMatch,\n  }\n}\n", "import React, { useState } from 'react'\nimport { ResetAccountModal } from '../modals/ResetAccountModal'\n\ntype Links = {\n  reset: string\n}\n\nexport const ResetAccountButton = ({\n  handle,\n  links,\n  ariaHideApp = true,\n}: {\n  handle: string\n  links: Links\n  ariaHideApp?: boolean\n}): JSX.Element => {\n  const [open, setOpen] = useState(false)\n\n  return (\n    <React.Fragment>\n      <button\n        type=\"button\"\n        className=\"c-reset-account-button btn-alert btn-m\"\n        onClick={() => setOpen(!open)}\n      >\n        Reset account\n      </button>\n      <ResetAccountModal\n        open={open}\n        onClose={() => setOpen(false)}\n        handle={handle}\n        endpoint={links.reset}\n        ariaHideApp={ariaHideApp}\n      />\n    </React.Fragment>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { Modal, ModalProps } from './Modal'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../utils/send-request'\nimport { FormButton } from '../common'\nimport { ErrorBoundary, ErrorMessage } from '../ErrorBoundary'\nimport { useConfirmation } from '../../hooks/use-confirmation'\nimport { redirectTo } from '../../utils/redirect-to'\n\ntype APIResponse = {\n  links: {\n    home: string\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to reset account')\n\nexport const ResetAccountModal = ({\n  handle,\n  endpoint,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  handle: string\n  endpoint: string\n}): JSX.Element => {\n  const [mutation, { status, error }] = useMutation<APIResponse>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'PATCH',\n        body: JSON.stringify({ handle: handle }),\n      })\n\n      return fetch\n    },\n    {\n      onSuccess: (response) => {\n        redirectTo(response.links.home)\n      },\n    }\n  )\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  const { attempt, setAttempt, isAttemptPass } = useConfirmation(handle)\n\n  return (\n    <Modal {...props} className=\"m-reset-account m-generic-destructive\">\n      <form data-turbo=\"false\" onSubmit={handleSubmit}>\n        <div className=\"info\">\n          <h2>You&apos;re about to reset your Exercism account</h2>\n          <p>\n            <strong>\n              Please read this carefully before commiting to reset your account.\n            </strong>\n          </p>\n          <p>\n            This is <em>irreversible</em> and will mean you\u2019ll lose everything\n            you\u2019ve done on your account.\n          </p>\n          <hr />\n          <p>\n            <strong>By resetting your account, you will lose:</strong>\n          </p>\n          <ul>\n            <li>All solutions you have submitted</li>\n            <li>All mentoring you have received</li>\n            <li>All mentoring you have given and any testimonials received.</li>\n            <li>\n              Any reputation you have earned through mentoring or publishing\n              solutions.\n            </li>\n          </ul>\n        </div>\n        <hr />\n        <label htmlFor=\"confirmation\">\n          To confirm, write your handle <pre>{handle}</pre> in the box below:\n        </label>\n\n        <input\n          id=\"confirmation\"\n          type=\"text\"\n          value={attempt}\n          onChange={(e) => setAttempt(e.target.value)}\n          autoComplete=\"off\"\n        />\n        <hr />\n        <div className=\"btns\">\n          <FormButton\n            status={status}\n            className=\"btn-default btn-m\"\n            type=\"button\"\n            onClick={props.onClose}\n          >\n            Cancel\n          </FormButton>\n          <FormButton\n            type=\"submit\"\n            disabled={!isAttemptPass}\n            status={status}\n            className=\"btn-primary btn-m\"\n          >\n            Reset account\n          </FormButton>\n        </div>\n        <ErrorBoundary resetKeys={[status]}>\n          <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n        </ErrorBoundary>\n      </form>\n    </Modal>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { DeleteProfileModal } from './delete-profile-form/DeleteProfileModal'\n\ntype Links = {\n  delete: string\n}\n\nexport const DeleteProfileForm = ({ links }: { links: Links }): JSX.Element => {\n  const [modalOpen, setModalOpen] = useState(false)\n\n  const handleModalOpen = useCallback(() => {\n    setModalOpen(true)\n  }, [])\n\n  const handleModalClose = useCallback(() => {\n    setModalOpen(false)\n  }, [])\n\n  return (\n    <React.Fragment>\n      <h2>Delete your public profile</h2>\n      <p className=\"mb-16 text-p-base\">\n        This will delete your public profile from the website. You can recreate\n        your profile at any time, and the only data that will be deleted is\n        links to your social profiles.\n      </p>\n      <button\n        type=\"button\"\n        className=\"btn-warning btn-m\"\n        onClick={handleModalOpen}\n      >\n        Delete your profile\n      </button>\n      <DeleteProfileModal\n        open={modalOpen}\n        onClose={handleModalClose}\n        endpoint={links.delete}\n      />\n    </React.Fragment>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { Modal, ModalProps } from '../../modals/Modal'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../utils/send-request'\nimport { FormButton } from '../../common'\nimport { ErrorBoundary, ErrorMessage } from '../../ErrorBoundary'\nimport { redirectTo } from '../../../utils/redirect-to'\n\nconst DEFAULT_ERROR = new Error('Unable to delete profile')\n\nexport const DeleteProfileModal = ({\n  endpoint,\n  onClose,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  endpoint: string\n}): JSX.Element => {\n  const [mutation, { status, error }] = useMutation(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'DELETE',\n        body: null,\n      })\n\n      return fetch\n    },\n    {\n      onSuccess: () => redirectTo(''),\n    }\n  )\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  const handleClose = useCallback(() => {\n    if (status === 'loading') {\n      return\n    }\n\n    onClose()\n  }, [onClose, status])\n\n  return (\n    <Modal className=\"m-generic-confirmation\" onClose={handleClose} {...props}>\n      <h3>Delete profile?</h3>\n      <p>Are you sure you want to delete your profile?</p>\n      <form data-turbo=\"false\" onSubmit={handleSubmit} className=\"buttons\">\n        <FormButton type=\"submit\" status={status} className=\"btn-primary btn-s\">\n          Continue\n        </FormButton>\n        <FormButton\n          type=\"button\"\n          status={status}\n          onClick={handleClose}\n          className=\"btn-enhanced btn-s\"\n        >\n          Cancel\n        </FormButton>\n      </form>\n      <ErrorBoundary resetKeys={[status]}>\n        <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n      </ErrorBoundary>\n    </Modal>\n  )\n}\n", "import React from 'react'\nimport { User } from '../types'\nimport { AvatarSelector } from '../profile'\n\ntype Links = {\n  update: string\n  delete: string\n}\n\nexport const PhotoForm = ({\n  defaultUser,\n  links,\n}: {\n  defaultUser: User\n  links: Links\n}): JSX.Element => {\n  return (\n    <div className=\"c-settings-photo-form\">\n      <h2>Change your photo</h2>\n      <hr className=\"c-divider --small\" />\n      <AvatarSelector defaultUser={defaultUser} links={links} />\n    </div>\n  )\n}\n", "import React, { useState, useCallback } from 'react'\nimport { GraphicalIcon } from '../common'\nimport { useSettingsMutation } from './useSettingsMutation'\n\ntype Links = {\n  update: string\n}\n\ntype RequestBody = {\n  user: {\n    show_on_supporters_page: boolean\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to change setting')\n\nexport const ShowOnSupportersPageButton = ({\n  defaultValue,\n  links,\n}: {\n  defaultValue: boolean\n  links: Links\n}): JSX.Element => {\n  const [value, setValue] = useState(defaultValue)\n\n  const { mutation, status, error } = useSettingsMutation<RequestBody>({\n    endpoint: links.update,\n    method: 'PATCH',\n    body: { user: { show_on_supporters_page: value } },\n  })\n\n  const handleChange = useCallback(\n    (e) => {\n      setValue(e.target.checked)\n      mutation()\n    },\n    [mutation]\n  )\n\n  return (\n    <label className=\"c-checkbox-wrapper ml-auto\">\n      <input type=\"checkbox\" checked={value} onChange={handleChange} />\n      <div className=\"row\">\n        <div className=\"c-checkbox\">\n          <GraphicalIcon icon=\"checkmark\" />\n        </div>\n        <span className={'text-16 font-medium text-textColor2'}>\n          Appear on supporters page?\n        </span>\n      </div>\n    </label>\n  )\n}\n", "import React, { useEffect, useState } from 'react'\nimport consumer from '../../utils/action-cable-consumer'\nimport { GraphicalIcon } from '../common/GraphicalIcon'\nimport { NotificationsIcon } from './notifications/NotificationsIcon'\nimport { Notification } from '../notifications/notifications-list/Notification'\nimport { Notification as NotificationType } from '../types'\nimport { useNotificationDropdown } from './notifications/useNotificationDropdown'\nimport { DropdownAttributes } from './useDropdown'\nimport { usePaginatedRequestQuery } from '../../hooks/request-query'\nimport { useErrorHandler, ErrorBoundary } from '../ErrorBoundary'\nimport { Loading } from '../common/Loading'\nimport { QueryStatus } from 'react-query'\n\nexport type APIResponse = {\n  results: NotificationType[]\n  meta: {\n    total: number\n    unreadCount: number\n    links: {\n      all: string\n    }\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to load notifications')\n\nconst ErrorMessage = ({ error }: { error: unknown }) => {\n  useErrorHandler(error, { defaultError: DEFAULT_ERROR })\n\n  return null\n}\n\nconst ErrorFallback = ({ error }: { error: Error }) => {\n  return <p>{error.message}</p>\n}\n\nconst DropdownContent = ({\n  data,\n  status,\n  error,\n  listAttributes,\n  itemAttributes,\n}: {\n  data: APIResponse | undefined\n  status: QueryStatus\n  error: unknown\n} & Pick<DropdownAttributes, 'listAttributes' | 'itemAttributes'>) => {\n  if (data) {\n    return (\n      <ul {...listAttributes}>\n        {data.results.map((notification, i) => {\n          return (\n            <li {...itemAttributes(i)} key={i}>\n              <Notification {...notification} />\n            </li>\n          )\n        })}\n        <li {...itemAttributes(data.results.length)}>\n          <a href={data.meta.links.all} className=\"c-prominent-link\">\n            <span>See all your notifications</span>\n            <GraphicalIcon icon=\"arrow-right\" />\n          </a>\n        </li>\n      </ul>\n    )\n  } else {\n    const { id, hidden } = listAttributes\n\n    return (\n      <div id={id} hidden={hidden}>\n        {status === 'loading' ? <Loading /> : null}\n        <ErrorBoundary FallbackComponent={ErrorFallback}>\n          <ErrorMessage error={error} />\n        </ErrorBoundary>\n      </div>\n    )\n  }\n}\n\nconst MAX_NOTIFICATIONS = 5\nconst CACHE_KEY = 'notifications'\n\nexport const Notifications = ({\n  endpoint,\n}: {\n  endpoint: string\n}): JSX.Element => {\n  const [isStale, setIsStale] = useState(false)\n  const { resolvedData, error, status, refetch } = usePaginatedRequestQuery<\n    APIResponse\n  >(CACHE_KEY, {\n    endpoint: endpoint,\n    query: { per_page: MAX_NOTIFICATIONS },\n    options: {},\n  })\n  const {\n    buttonAttributes,\n    panelAttributes,\n    listAttributes,\n    itemAttributes,\n    open,\n  } = useNotificationDropdown(resolvedData)\n\n  useEffect(() => {\n    const subscription = consumer.subscriptions.create(\n      { channel: 'NotificationsChannel' },\n      {\n        received: () => {\n          setIsStale(true)\n        },\n      }\n    )\n\n    return () => subscription.unsubscribe()\n  }, [])\n\n  useEffect(() => {\n    if (!listAttributes.hidden || !isStale) {\n      return\n    }\n\n    refetch()\n    setIsStale(false)\n  }, [isStale, listAttributes.hidden, refetch])\n\n  return (\n    <React.Fragment>\n      <NotificationsIcon\n        count={resolvedData?.meta?.unreadCount || 0}\n        aria-label=\"Open notifications\"\n        {...buttonAttributes}\n      />\n      {open ? (\n        <div className=\"c-notifications-dropdown\" {...panelAttributes}>\n          <DropdownContent\n            data={resolvedData}\n            status={status}\n            error={error}\n            itemAttributes={itemAttributes}\n            listAttributes={listAttributes}\n          />\n        </div>\n      ) : null}\n    </React.Fragment>\n  )\n}\n", "import React, { useMemo, forwardRef } from 'react'\nimport { Icon } from '../../common/Icon'\n\ntype NotificationsIconProps = {\n  count: number\n}\n\nexport const NotificationsIcon = forwardRef<\n  HTMLButtonElement,\n  NotificationsIconProps\n>((props, ref) => {\n  const { count, ...buttonProps } = props\n  const variantClass = useMemo(() => {\n    switch (true) {\n      case count === 0:\n        return '--none'\n      case count >= 1 && count <= 9:\n        return '--single-digit'\n      case count >= 10 && count <= 99:\n        return '--double-digit'\n      case count >= 100:\n        return '--triple-digit'\n    }\n  }, [count])\n\n  return (\n    <button\n      ref={ref}\n      className={`c-notification ${variantClass}`}\n      {...buttonProps}\n    >\n      <Icon icon=\"notifications\" alt={`You have ${count} notifications`} />\n      <div className=\"--count\">{count}</div>\n    </button>\n  )\n})\n", "import React from 'react'\nimport { Notification as NotificationType } from '../../types'\nimport { fromNow } from '../../../utils/time'\nimport { GraphicalIcon } from '../../common'\n\nconst NotificationImage = ({\n  imageType,\n  imageUrl,\n}: Pick<NotificationType, 'imageType' | 'imageUrl'>) => {\n  switch (imageType) {\n    case 'avatar':\n      return (\n        <div\n          className=\"c-avatar\"\n          style={{ backgroundImage: `url(${imageUrl})` }}\n        />\n      )\n    default:\n      return <img alt=\"\" role=\"presentation\" src={imageUrl} className=\"icon\" />\n  }\n}\n\nconst NotificationStatus = ({ isRead }: Pick<NotificationType, 'isRead'>) => {\n  const className = isRead ? 'read' : 'unread'\n\n  return <div className={className} />\n}\n\nconst NotificationContent = ({\n  text,\n  createdAt,\n}: Pick<NotificationType, 'text' | 'createdAt'>) => {\n  return (\n    <div className=\"content\">\n      <div className=\"text\" dangerouslySetInnerHTML={{ __html: text }} />\n      <div className=\"created-at\">{fromNow(createdAt)}</div>\n    </div>\n  )\n}\n\nexport const Notification = ({\n  url,\n  imageType,\n  imageUrl,\n  text,\n  createdAt,\n  isRead,\n}: NotificationType): JSX.Element => {\n  return (\n    <a href={url} className={`notification ${isRead ? '--read' : '--unread'}`}>\n      <NotificationImage imageType={imageType} imageUrl={imageUrl} />\n      <NotificationContent text={text} createdAt={createdAt} />\n      <NotificationStatus isRead={isRead} />\n      <GraphicalIcon icon=\"chevron-right\" className=\"action-icon\" />\n    </a>\n  )\n}\n", "import { useDropdown } from '../useDropdown'\nimport { APIResponse } from '../Notifications'\n\nexport const useNotificationDropdown = (data: APIResponse | undefined) => {\n  const dropdownLength = data ? data.results.length + 1 : 0\n\n  return useDropdown(dropdownLength, undefined, {\n    placement: 'bottom-end',\n    modifiers: [\n      {\n        name: 'offset',\n        options: {\n          offset: [0, 8],\n        },\n      },\n    ],\n  })\n}\n", "import React, { useEffect, useState } from 'react'\nimport { ReputationIcon } from './reputation/ReputationIcon'\nimport { ReputationMenu } from './reputation/ReputationMenu'\nimport { ReputationChannel } from '../../channels/reputationChannel'\nimport { useDropdown, DropdownAttributes } from './useDropdown'\nimport { QueryStatus } from 'react-query'\nimport { useErrorHandler, ErrorBoundary } from '../ErrorBoundary'\nimport { Loading } from '../common/Loading'\nimport { usePaginatedRequestQuery } from '../../hooks/request-query'\n\nexport type Links = {\n  tokens: string\n}\n\nexport type ReputationToken = {\n  uuid: string\n  internalUrl?: string\n  externalUrl?: string\n  iconUrl: string\n  text: string\n  createdAt: string\n  value: string\n  isSeen: boolean\n  links: {\n    markAsSeen: string\n  }\n}\n\nexport type APIResponse = {\n  results: ReputationToken[]\n  meta: {\n    links: {\n      tokens: string\n    }\n    totalReputation: number\n    unseenTotal: number\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to retrieve reputation tokens')\n\nconst ErrorMessage = ({ error }: { error: unknown }) => {\n  useErrorHandler(error, { defaultError: DEFAULT_ERROR })\n\n  return null\n}\n\nconst ErrorFallback = ({ error }: { error: Error }) => {\n  return <p>{error.message}</p>\n}\n\nconst DropdownContent = ({\n  data,\n  cacheKey,\n  status,\n  error,\n  listAttributes,\n  itemAttributes,\n}: {\n  data: APIResponse | undefined\n  cacheKey: string\n  status: QueryStatus\n  error: unknown\n} & Pick<DropdownAttributes, 'listAttributes' | 'itemAttributes'>) => {\n  if (data) {\n    return (\n      <ReputationMenu\n        tokens={data.results}\n        links={data.meta.links}\n        listAttributes={listAttributes}\n        itemAttributes={itemAttributes}\n        cacheKey={cacheKey}\n      />\n    )\n  } else {\n    const { id, hidden } = listAttributes\n\n    return (\n      <div id={id} hidden={hidden}>\n        {status === 'loading' ? <Loading /> : null}\n        <ErrorBoundary FallbackComponent={ErrorFallback}>\n          <ErrorMessage error={error} />\n        </ErrorBoundary>\n      </div>\n    )\n  }\n}\n\nconst MAX_TOKENS = 5\n\nexport const Reputation = ({\n  defaultReputation,\n  defaultIsSeen,\n  endpoint,\n}: {\n  defaultReputation: number\n  defaultIsSeen: boolean\n  endpoint: string\n}): JSX.Element => {\n  const [isStale, setIsStale] = useState(false)\n  const [reputation, setReputation] = useState(defaultReputation)\n  const [isSeen, setIsSeen] = useState(defaultIsSeen)\n  const cacheKey = 'reputations'\n  const { resolvedData, error, status, refetch } = usePaginatedRequestQuery<\n    APIResponse\n  >(cacheKey, {\n    endpoint: endpoint,\n    query: { per_page: MAX_TOKENS },\n    options: {},\n  })\n  const {\n    buttonAttributes,\n    panelAttributes,\n    listAttributes,\n    itemAttributes,\n    open,\n  } = useDropdown((resolvedData?.results.length || 0) + 1, undefined, {\n    placement: 'bottom-start',\n    modifiers: [\n      {\n        name: 'offset',\n        options: {\n          offset: [0, 8],\n        },\n      },\n    ],\n  })\n\n  useEffect(() => {\n    const connection = new ReputationChannel(() => setIsStale(true))\n\n    return () => connection.disconnect()\n  }, [])\n\n  useEffect(() => {\n    if (!resolvedData) {\n      return\n    }\n\n    setReputation(resolvedData.meta.totalReputation)\n  }, [resolvedData])\n\n  useEffect(() => {\n    if (!resolvedData) {\n      return\n    }\n\n    setIsSeen(resolvedData.meta.unseenTotal === 0)\n  }, [resolvedData])\n\n  useEffect(() => {\n    if (!listAttributes.hidden || !isStale) {\n      return\n    }\n\n    refetch()\n    setIsStale(false)\n  }, [isStale, listAttributes.hidden, refetch])\n\n  return (\n    <React.Fragment>\n      <ReputationIcon\n        reputation={reputation}\n        isSeen={isSeen}\n        {...buttonAttributes}\n      />\n      {open ? (\n        <div className=\"c-reputation-dropdown\" {...panelAttributes}>\n          <DropdownContent\n            data={resolvedData}\n            cacheKey={cacheKey}\n            status={status}\n            error={error}\n            itemAttributes={itemAttributes}\n            listAttributes={listAttributes}\n          />\n        </div>\n      ) : null}\n    </React.Fragment>\n  )\n}\n", "import React, { forwardRef } from 'react'\nimport { Icon } from '../../common/Icon'\n\ntype ReputationIconProps = {\n  reputation: number\n  isSeen: boolean\n}\n\nexport const ReputationIcon = forwardRef<\n  HTMLButtonElement,\n  ReputationIconProps\n>((props, ref) => {\n  const { reputation, isSeen, ...buttonProps } = props\n\n  return (\n    <button\n      ref={ref}\n      className=\"c-primary-reputation\"\n      aria-label={`${reputation} reputation`}\n      {...buttonProps}\n    >\n      <Icon icon=\"reputation\" alt=\"Reputation\" />\n      <span>{reputation}</span>\n      <div className={'--notification ' + (isSeen ? '' : 'unseen')} />\n    </button>\n  )\n})\n", "import React from 'react'\nimport { ReputationMenuItem } from './ReputationMenuItem'\nimport { GraphicalIcon } from '../../common'\nimport { ReputationToken, APIResponse } from '../Reputation'\nimport { DropdownAttributes } from '../useDropdown'\nimport { useMutation, useQueryCache } from 'react-query'\nimport { sendRequest } from '../../../utils/send-request'\nimport { typecheck } from '../../../utils/typecheck'\n\nexport const ReputationMenu = ({\n  tokens,\n  listAttributes,\n  cacheKey,\n  itemAttributes,\n  links,\n}: {\n  tokens: ReputationToken[]\n  links: { tokens: string }\n  cacheKey: string\n} & Pick<\n  DropdownAttributes,\n  'listAttributes' | 'itemAttributes'\n>): JSX.Element => {\n  const queryCache = useQueryCache()\n  const [markAsSeen] = useMutation<ReputationToken, unknown, ReputationToken>(\n    (token) => {\n      if (token.isSeen) {\n        return Promise.resolve(token)\n      }\n\n      const { fetch } = sendRequest({\n        endpoint: token.links.markAsSeen,\n        method: 'PATCH',\n        body: null,\n      })\n\n      return fetch.then((json) =>\n        typecheck<ReputationToken>(json, 'reputation')\n      )\n    },\n    {\n      onSuccess: (token) => {\n        const oldData = queryCache.getQueryData<APIResponse>(cacheKey)\n\n        if (!oldData) {\n          return\n        }\n\n        queryCache.setQueryData(cacheKey, {\n          ...oldData,\n          results: oldData.results.map((oldToken) => {\n            return oldToken.uuid === token.uuid ? token : oldToken\n          }),\n        })\n      },\n    }\n  )\n\n  return (\n    <ul {...listAttributes}>\n      {tokens.map((token, i) => {\n        return (\n          <li\n            key={token.uuid}\n            {...itemAttributes(i)}\n            onMouseEnter={() => {\n              markAsSeen(token)\n            }}\n            onFocus={() => {\n              markAsSeen(token)\n            }}\n          >\n            <ReputationMenuItem {...token} />\n          </li>\n        )\n      })}\n      <li {...itemAttributes(tokens.length)}>\n        <a href={links.tokens} className=\"c-prominent-link\">\n          See how you earned all your reputation\n          <GraphicalIcon icon=\"arrow-right\" />\n        </a>\n      </li>\n    </ul>\n  )\n}\n", "import React from 'react'\nimport { fromNow } from '../../../utils/time'\nimport {\n  missingExerciseIconErrorHandler,\n  GraphicalIcon,\n  Reputation,\n} from '../../common'\nimport { ReputationToken } from '../Reputation'\n\nexport const ReputationMenuItem = ({\n  internalUrl,\n  externalUrl,\n  iconUrl,\n  text,\n  createdAt,\n  value,\n  isSeen,\n}: ReputationToken): JSX.Element => {\n  const url = internalUrl ? internalUrl : externalUrl\n  const icon = internalUrl ? (\n    <GraphicalIcon icon=\"chevron-right\" className=\"action-icon\" />\n  ) : (\n    <GraphicalIcon icon=\"external-link\" className=\"action-icon\" />\n  )\n\n  return (\n    <a href={url} className=\"token\">\n      <img\n        alt=\"\"\n        role=\"presentation\"\n        src={iconUrl}\n        className=\"reason-icon\"\n        onError={missingExerciseIconErrorHandler}\n      />\n      <div className=\"content\">\n        <div\n          className=\"description\"\n          dangerouslySetInnerHTML={{ __html: text }}\n        />\n        <div className=\"earned-on\">{fromNow(createdAt)}</div>\n      </div>\n      <Reputation value={`+${value}`} />\n      <div className={'indicator ' + (isSeen ? 'seen' : 'unseen')} />\n      {icon}\n    </a>\n  )\n}\n", "import consumer from '../utils/action-cable-consumer'\n\nexport class ReputationChannel {\n  subscription: ActionCable.Channel\n\n  constructor(onReceive: () => void) {\n    this.subscription = consumer.subscriptions.create(\n      {\n        channel: 'ReputationChannel',\n      },\n      {\n        received: onReceive,\n      }\n    )\n  }\n\n  disconnect(): void {\n    this.subscription.unsubscribe()\n  }\n}\n", "import React, { useState } from 'react'\nimport { useDropdown } from './useDropdown'\nimport { Track } from '../types'\nimport { Icon, GraphicalIcon } from '../common'\nimport { ActivatePracticeModeModal } from './track-menu/ActivatePracticeModeModal'\nimport { ActivateLearningModeModal } from './track-menu/ActivateLearningModeModal'\nimport { ResetTrackModal } from './track-menu/ResetTrackModal'\nimport { LeaveTrackModal } from './track-menu/LeaveTrackModal'\n\nexport type Links = {\n  repo: string\n  documentation: string\n  activatePracticeMode?: string\n  activateLearningMode?: string\n  reset?: string\n  leave?: string\n}\n\ntype ModalType = 'learning' | 'practice' | 'reset' | 'leave'\n\nexport const TrackMenu = ({\n  track,\n  links,\n  ariaHideApp = false,\n}: {\n  track: Track\n  links: Links\n  ariaHideApp?: boolean\n}): JSX.Element => {\n  const [modal, setModal] = useState<ModalType | null>(null)\n  const {\n    buttonAttributes,\n    panelAttributes,\n    listAttributes,\n    itemAttributes,\n    open,\n  } = useDropdown(5, undefined, {\n    placement: 'bottom-start',\n    modifiers: [\n      {\n        name: 'offset',\n        options: {\n          offset: [0, 8],\n        },\n      },\n    ],\n  })\n\n  return (\n    <div className=\"c-track-menu\">\n      <button {...buttonAttributes}>\n        <Icon icon=\"more-horizontal\" alt=\"Track options\" />\n      </button>\n      {open ? (\n        <div {...panelAttributes} className=\"c-dropdown-generic-menu\">\n          <ul {...listAttributes}>\n            <li {...itemAttributes(0)}>\n              <a href={links.repo} target=\"_blank\" rel=\"noreferrer\">\n                <GraphicalIcon icon=\"external-site-github\" />\n                See {track.title} track on Github\n                <GraphicalIcon icon=\"external-link\" className=\"external-link\" />\n              </a>\n            </li>\n            <li {...itemAttributes(1)}>\n              <a href={links.documentation} target=\"_blank\" rel=\"noreferrer\">\n                <GraphicalIcon icon=\"docs\" />\n                {track.title} documentation\n              </a>\n            </li>\n            {links.activatePracticeMode ? (\n              <li {...itemAttributes(2)}>\n                <button type=\"button\" onClick={() => setModal('practice')}>\n                  <GraphicalIcon icon=\"practice-mode\" />\n                  Disable Learning Mode\u2026\n                </button>\n              </li>\n            ) : links.activateLearningMode ? (\n              <li {...itemAttributes(2)}>\n                <button type=\"button\" onClick={() => setModal('learning')}>\n                  <GraphicalIcon icon=\"concepts\" />\n                  Enable Learning Mode\u2026\n                </button>\n              </li>\n            ) : null}\n            {links.reset ? (\n              <li {...itemAttributes(3)}>\n                <button type=\"button\" onClick={() => setModal('reset')}>\n                  <GraphicalIcon icon=\"reset\" />\n                  Reset track\u2026\n                </button>\n              </li>\n            ) : null}\n            {links.leave ? (\n              <li {...itemAttributes(4)}>\n                <button type=\"button\" onClick={() => setModal('leave')}>\n                  <div className=\"emoji\">\uD83D\uDC4B</div>\n                  Leave track\u2026\n                </button>\n              </li>\n            ) : null}\n          </ul>\n        </div>\n      ) : null}\n      {links.activatePracticeMode ? (\n        <ActivatePracticeModeModal\n          open={modal === 'practice'}\n          onClose={() => setModal(null)}\n          endpoint={links.activatePracticeMode}\n          ariaHideApp={ariaHideApp}\n        />\n      ) : null}\n      {links.activateLearningMode ? (\n        <ActivateLearningModeModal\n          open={modal === 'learning'}\n          onClose={() => setModal(null)}\n          endpoint={links.activateLearningMode}\n          ariaHideApp={ariaHideApp}\n        />\n      ) : null}\n      {links.reset ? (\n        <ResetTrackModal\n          open={modal === 'reset'}\n          track={track}\n          onClose={() => setModal(null)}\n          endpoint={links.reset}\n          ariaHideApp={ariaHideApp}\n        />\n      ) : null}\n      {links.leave ? (\n        <LeaveTrackModal\n          open={modal === 'leave'}\n          track={track}\n          onClose={() => setModal(null)}\n          endpoint={links.leave}\n          ariaHideApp={ariaHideApp}\n        />\n      ) : null}\n    </div>\n  )\n}\n", "import React, { useState } from 'react'\nimport { Modal, ModalProps } from '../../modals/Modal'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../utils/send-request'\nimport { typecheck } from '../../../utils/typecheck'\nimport { FormButton, GraphicalIcon } from '../../common'\nimport { ErrorBoundary, ErrorMessage } from '../../ErrorBoundary'\nimport { redirectTo } from '../../../utils/redirect-to'\n\ntype UserTrack = {\n  links: {\n    self: string\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to switch to practice mode')\n\nexport const ActivatePracticeModeModal = ({\n  endpoint,\n  onClose,\n  ...props\n}: Omit<ModalProps, 'className'> & { endpoint: string }): JSX.Element => {\n  const [mutation, { status, error }] = useMutation<UserTrack | undefined>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'PATCH',\n        body: null,\n      })\n      return fetch.then((json) => {\n        if (!json) {\n          return\n        }\n\n        return typecheck<UserTrack>(json, 'userTrack')\n      })\n    },\n    {\n      onSuccess: (track) => {\n        if (!track) {\n          return\n        }\n\n        redirectTo(track.links.self)\n      },\n    }\n  )\n\n  return (\n    <Modal className=\"m-activate-practice-mode\" onClose={onClose} {...props}>\n      <GraphicalIcon icon=\"practice-mode\" category=\"graphics\" />\n      <h2>Disable Learning Mode</h2>\n      <p>\n        Disabling Learning Mode will unlock all the Practice Exercises on this\n        track, but will disable Concepts and Learning Exercises.\n      </p>\n      <div className=\"warning\">\n        You can switch in and out of Practice Mode at any time.\n      </div>\n\n      <FormButton\n        onClick={() => mutation()}\n        status={status}\n        className=\"btn-primary btn-m\"\n      >\n        Disable Learning Mode\n      </FormButton>\n      <ErrorBoundary>\n        <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n      </ErrorBoundary>\n    </Modal>\n  )\n}\n", "import React, { useState } from 'react'\nimport { Modal, ModalProps } from '../../modals/Modal'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../utils/send-request'\nimport { typecheck } from '../../../utils/typecheck'\nimport { FormButton, GraphicalIcon } from '../../common'\nimport { ErrorBoundary, ErrorMessage } from '../../ErrorBoundary'\nimport { redirectTo } from '../../../utils/redirect-to'\n\ntype UserTrack = {\n  links: {\n    self: string\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to switch to learning mode')\n\nexport const ActivateLearningModeModal = ({\n  endpoint,\n  onClose,\n  ...props\n}: Omit<ModalProps, 'className'> & { endpoint: string }): JSX.Element => {\n  const [mutation, { status, error }] = useMutation<UserTrack | undefined>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'PATCH',\n        body: null,\n      })\n      return fetch.then((json) => {\n        if (!json) {\n          return\n        }\n\n        return typecheck<UserTrack>(json, 'userTrack')\n      })\n    },\n    {\n      onSuccess: (track) => {\n        if (!track) {\n          return\n        }\n\n        redirectTo(track.links.self)\n      },\n    }\n  )\n\n  return (\n    <Modal className=\"m-activate-learning-mode\" onClose={onClose} {...props}>\n      <GraphicalIcon icon=\"learning-mode\" category=\"graphics\" />\n      <h2>Activate Learning Mode</h2>\n      <p>\n        Activating Learning Mode will enable Concepts and Learning Exercises on\n        this track, but will lock Exercises that you've not yet complete\n        prerequisites for. You will still have access to any exercises you have\n        started.\n      </p>\n      <div className=\"warning\">\n        You can switch in and out of Learning Mode at any time.\n      </div>\n\n      <FormButton\n        onClick={() => mutation()}\n        status={status}\n        className=\"btn-primary btn-m\"\n      >\n        Activate Learning Mode\n      </FormButton>\n      <ErrorBoundary>\n        <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n      </ErrorBoundary>\n    </Modal>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { Modal, ModalProps } from '../../modals/Modal'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../utils/send-request'\nimport { typecheck } from '../../../utils/typecheck'\nimport { FormButton } from '../../common/FormButton'\nimport { ErrorBoundary, ErrorMessage } from '../../ErrorBoundary'\nimport { useConfirmation } from '../../../hooks/use-confirmation'\nimport { Track } from '../../types'\nimport { redirectTo } from '../../../utils/redirect-to'\n\ntype UserTrack = {\n  links: {\n    self: string\n  }\n}\n\nconst DEFAULT_ERROR = new Error('Unable to reset track')\n\nexport const ResetTrackModal = ({\n  endpoint,\n  track,\n  onClose,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  endpoint: string\n  track: Track\n}): JSX.Element => {\n  const confirmation = `reset ${track.slug}`\n  const [mutation, { status, error }] = useMutation<UserTrack | undefined>(\n    () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'PATCH',\n        body: null,\n      })\n\n      return fetch.then((json) => {\n        if (!json) {\n          return\n        }\n\n        return typecheck<UserTrack>(json, 'userTrack')\n      })\n    },\n    {\n      onSuccess: (track) => {\n        if (!track) {\n          return\n        }\n\n        redirectTo(track.links.self)\n      },\n    }\n  )\n\n  const { attempt, setAttempt, isAttemptPass } = useConfirmation(confirmation)\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  return (\n    <Modal\n      className=\"m-reset-track m-generic-destructive\"\n      onClose={onClose}\n      {...props}\n    >\n      <form onSubmit={handleSubmit}>\n        <div className=\"info\">\n          <h2>You\u2019re about to reset all your {track.title} progress.</h2>\n          <p>\n            <strong>Please read this carefully before continuing.</strong>\n          </p>\n          <p>\n            This is <em>irreversible</em> and will mean you\u2019ll lose everything\n            you\u2019ve done on this track.\n          </p>\n          <hr />\n          <p>\n            <strong>By resetting this track, you will lose access to:</strong>\n          </p>\n          <ul>\n            <li>All solutions you have submitted in {track.title}</li>\n            <li>All mentoring you have received in {track.title}</li>\n            <li>\n              Lose any reputation you have earned for publishing solutions in{' '}\n              {track.title}\n            </li>\n          </ul>\n        </div>\n        <hr />\n        <label htmlFor=\"confirmation\">\n          To confirm, write <pre>{confirmation}</pre> in the box below:\n        </label>\n\n        <input\n          id=\"confirmation\"\n          type=\"text\"\n          autoComplete=\"off\"\n          value={attempt}\n          onChange={(e) => setAttempt(e.target.value)}\n        />\n        <hr />\n        <div className=\"btns\">\n          <FormButton\n            onClick={() => onClose()}\n            status={status}\n            type=\"button\"\n            className=\"btn-default btn-m\"\n          >\n            Cancel\n          </FormButton>\n          <FormButton\n            status={status}\n            disabled={!isAttemptPass}\n            className=\"btn-primary btn-m\"\n          >\n            Reset track\n          </FormButton>\n        </div>\n        <ErrorBoundary>\n          <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n        </ErrorBoundary>\n      </form>\n    </Modal>\n  )\n}\n", "import React, { createContext, useState } from 'react'\nimport { Modal, ModalProps } from '../../modals/Modal'\nimport { Track } from '../../types'\nimport { LeaveTrackForm } from './leave-track-modal/LeaveTrackForm'\nimport { LeaveResetTrackForm } from './leave-track-modal/LeaveResetTrackForm'\nimport { Tab, TabContext } from '../../common/Tab'\n\nconst TabsContext = createContext<TabContext>({\n  current: 'leave',\n  switchToTab: () => {},\n})\n\nexport type UserTrack = {\n  links: {\n    self: string\n  }\n}\n\ntype TabIndex = 'leave' | 'reset'\n\nexport const LeaveTrackModal = ({\n  endpoint,\n  onClose,\n  track,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  endpoint: string\n  track: Track\n}): JSX.Element => {\n  const [tab, setTab] = useState<TabIndex>('leave')\n\n  return (\n    <Modal\n      className=\"m-leave-track m-generic-destructive\"\n      onClose={onClose}\n      {...props}\n    >\n      <div className=\"info\">\n        <h2>You\u2019re about to leave the {track.title} track.</h2>\n        <p className=\"large\">\n          No longer interested in learning {track.title}? No problem!\n        </p>\n      </div>\n\n      <TabsContext.Provider\n        value={{\n          current: tab,\n          switchToTab: (id: string) => setTab(id as TabIndex),\n        }}\n      >\n        <div className=\"tabs\">\n          <Tab context={TabsContext} id=\"leave\">\n            Leave\n          </Tab>\n          <Tab context={TabsContext} id=\"reset\">\n            Leave + Reset\n          </Tab>\n        </div>\n        <Tab.Panel context={TabsContext} id=\"leave\">\n          <LeaveTrackForm\n            endpoint={endpoint}\n            track={track}\n            onCancel={onClose}\n          />\n        </Tab.Panel>\n        <Tab.Panel context={TabsContext} id=\"reset\">\n          <LeaveResetTrackForm\n            endpoint={endpoint}\n            track={track}\n            onCancel={onClose}\n          />\n        </Tab.Panel>\n      </TabsContext.Provider>\n    </Modal>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { typecheck } from '../../../../utils/typecheck'\nimport { FormButton } from '../../../common/FormButton'\nimport { Icon } from '../../../common'\nimport { ErrorBoundary, ErrorMessage } from '../../../ErrorBoundary'\nimport { Track } from '../../../types'\nimport { UserTrack } from '../LeaveTrackModal'\nimport { redirectTo } from '../../../../utils/redirect-to'\n\nconst DEFAULT_ERROR = new Error('Unable to leave track')\n\nexport const LeaveTrackForm = ({\n  endpoint,\n  track,\n  onCancel,\n}: {\n  endpoint: string\n  track: Track\n  onCancel: () => void\n}): JSX.Element => {\n  const [mutation, { status, error }] = useMutation<UserTrack | undefined>(\n    async () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'PATCH',\n        body: null,\n      })\n      return fetch.then((json) => {\n        if (!json) {\n          return\n        }\n\n        return typecheck<UserTrack>(json, 'userTrack')\n      })\n    },\n    {\n      onSuccess: (track) => {\n        if (!track) {\n          return\n        }\n\n        redirectTo(track.links.self)\n      },\n    }\n  )\n  const handleCancel = useCallback(() => {\n    onCancel()\n  }, [onCancel])\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  return (\n    <form onSubmit={handleSubmit}>\n      <div className=\"info\">\n        <p>\n          <strong>When you leave the track, you still keep:</strong>\n        </p>\n        <ul>\n          <li>All solutions you have submitted in {track.title}</li>\n          <li>All mentoring you have received in {track.title}</li>\n        </ul>\n        <p>\n          <strong>However, we will:</strong>\n        </p>\n        <ul>\n          <li>End all mentoring discussions in {track.title}</li>\n          <li>Remove {track.title} from your active tracks list</li>\n        </ul>\n        <div className=\"info-box\">\n          <Icon icon=\"info-circle\" alt=\"Info\" />\n          You\u2019re free to join back at anytime and return to where you left off.\n        </div>\n      </div>\n      <div className=\"btns\">\n        <FormButton\n          onClick={handleCancel}\n          status={status}\n          className=\"btn-default btn-m\"\n        >\n          Cancel\n        </FormButton>\n        <FormButton status={status} className=\"btn-primary btn-m\">\n          Leave track\n        </FormButton>\n      </div>\n      <ErrorBoundary>\n        <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n      </ErrorBoundary>\n    </form>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { useMutation } from 'react-query'\nimport { sendRequest } from '../../../../utils/send-request'\nimport { typecheck } from '../../../../utils/typecheck'\nimport { FormButton } from '../../../common/FormButton'\nimport { ErrorBoundary, ErrorMessage } from '../../../ErrorBoundary'\nimport { Track } from '../../../types'\nimport { UserTrack } from '../LeaveTrackModal'\nimport { useConfirmation } from '../../../../hooks/use-confirmation'\nimport { redirectTo } from '../../../../utils/redirect-to'\n\nconst DEFAULT_ERROR = new Error('Unable to leave and reset track')\n\nexport const LeaveResetTrackForm = ({\n  endpoint,\n  track,\n  onCancel,\n}: {\n  endpoint: string\n  track: Track\n  onCancel: () => void\n}): JSX.Element => {\n  const confirmation = `reset ${track.slug}`\n  const [mutation, { status, error }] = useMutation<UserTrack | undefined>(\n    async () => {\n      const { fetch } = sendRequest({\n        endpoint: endpoint,\n        method: 'PATCH',\n        body: JSON.stringify({ reset: true }),\n      })\n      return fetch.then((json) => {\n        if (!json) {\n          return\n        }\n\n        return typecheck<UserTrack>(json, 'userTrack')\n      })\n    },\n    {\n      onSuccess: (track) => {\n        if (!track) {\n          return\n        }\n\n        redirectTo(track.links.self)\n      },\n    }\n  )\n  const handleCancel = useCallback(() => {\n    onCancel()\n  }, [onCancel])\n  const { attempt, setAttempt, isAttemptPass } = useConfirmation(confirmation)\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      mutation()\n    },\n    [mutation]\n  )\n\n  return (\n    <form onSubmit={handleSubmit}>\n      <div className=\"info\">\n        <p>\n          <strong>By leaving and resetting this track, you will:</strong>\n        </p>\n        <ul>\n          <li>\n            Lose access to all solutions you have submitted in {track.title}\n          </li>\n          <li>\n            Lose access to all mentoring you have received in {track.title}\n          </li>\n          <li>\n            Lose any reputation you have earned for publishing solutions in{' '}\n            {track.title}\n          </li>\n          <li>Remove {track.title} from your active tracks list</li>\n        </ul>\n\n        <p>\n          This is <em>irreversible</em> and will mean you\u2019ll lose everything\n          you\u2019ve done on this track.\n        </p>\n      </div>\n      <hr />\n      <label htmlFor=\"confirmation\">\n        To confirm, write <pre>{confirmation}</pre> in the box below:\n      </label>\n\n      <input\n        id=\"confirmation\"\n        type=\"text\"\n        autoComplete=\"off\"\n        value={attempt}\n        onChange={(e) => setAttempt(e.target.value)}\n      />\n      <hr />\n      <div className=\"btns\">\n        <FormButton\n          onClick={handleCancel}\n          status={status}\n          className=\"btn-default btn-m\"\n        >\n          Cancel\n        </FormButton>\n        <FormButton\n          status={status}\n          disabled={!isAttemptPass}\n          className=\"btn-primary btn-m\"\n        >\n          Leave + Reset\n        </FormButton>\n      </div>\n      <ErrorBoundary>\n        <ErrorMessage error={error} defaultError={DEFAULT_ERROR} />\n      </ErrorBoundary>\n    </form>\n  )\n}\n", "import React, { useState, useCallback, useMemo } from 'react'\nimport { Request, usePaginatedRequestQuery } from '../../hooks/request-query'\nimport { FetchingBoundary } from '../FetchingBoundary'\nimport { Notification } from '../types'\nimport { ResultsZone } from '../ResultsZone'\nimport { List } from './notifications-list/List'\nimport { useList } from '../../hooks/use-list'\nimport { Pagination, GraphicalIcon } from '../common'\nimport { useHistory, removeEmpty } from '../../hooks/use-history'\nimport { useNotificationMutation } from './notifications-list/useNotificationMutation'\nimport { MutationButton } from './notifications-list/MutationButton'\nimport { MarkAllNotificationsAsReadModal } from './notifications-list/MarkAllNotificationsAsReadModal'\nimport { useQueryCache } from 'react-query'\n\nconst DEFAULT_ERROR = new Error('Unable to load notifications')\nconst MARK_AS_READ_DEFAULT_ERROR = new Error(\n  'Unable to mark notifications as read'\n)\nconst MARK_AS_UNREAD_DEFAULT_ERROR = new Error(\n  'Unable to mark notifications as unread'\n)\n\nexport type Links = {\n  markAsRead: string\n  markAllAsRead: string\n  markAsUnread: string\n}\n\ntype APIResponse = {\n  results: readonly Notification[]\n  meta: {\n    currentPage: number\n    totalCount: number\n    totalPages: number\n    links: {\n      all: string\n    }\n    unreadCount: number\n  }\n}\n\nexport const NotificationsList = ({\n  request: initialRequest,\n  links,\n}: {\n  request: Request\n  links: Links\n}): JSX.Element => {\n  const queryCache = useQueryCache()\n  const { request, setPage } = useList(initialRequest)\n  const cacheKey = useMemo(\n    () => ['notifications-list', removeEmpty(request.query)],\n    [request.query]\n  )\n  const {\n    status,\n    resolvedData,\n    latestData,\n    error,\n    isFetching,\n  } = usePaginatedRequestQuery<APIResponse, Error | Response>(cacheKey, request)\n\n  const [selected, setSelected] = useState<Notification[]>([])\n\n  const handleSelect = useCallback(\n    (notification: Notification) => {\n      if (selected.includes(notification)) {\n        setSelected(selected.filter((s) => s !== notification))\n      } else {\n        setSelected([...selected, notification])\n      }\n    },\n    [selected]\n  )\n\n  const markAsReadMutation = useNotificationMutation({\n    endpoint: links.markAsRead,\n    body: { uuids: selected.map((s) => s.uuid) },\n  })\n  const markAsUnreadMutation = useNotificationMutation({\n    endpoint: links.markAsUnread,\n    body: { uuids: selected.map((s) => s.uuid) },\n  })\n  const markAllAsReadMutation = useNotificationMutation({\n    endpoint: links.markAllAsRead,\n    body: null,\n  })\n  const mutations = [\n    markAsReadMutation,\n    markAsUnreadMutation,\n    markAllAsReadMutation,\n  ]\n\n  const [modalOpen, setModalOpen] = useState(false)\n  const handleModalOpen = useCallback(() => {\n    setModalOpen(true)\n  }, [])\n  const handleModalClose = useCallback(() => {\n    setModalOpen(false)\n  }, [])\n\n  const handleMutation = useCallback(\n    (mutation) => {\n      return () => {\n        mutation.mutation(\n          { uuids: selected.map((s) => s.uuid) },\n          {\n            onSuccess: () => {\n              setSelected([])\n              queryCache.invalidateQueries(cacheKey)\n            },\n          }\n        )\n      }\n    },\n    [cacheKey, selected, queryCache]\n  )\n\n  const disabled = isFetching || mutations.some((m) => m.status === 'loading')\n\n  useHistory({ pushOn: removeEmpty(request.query) })\n\n  return (\n    <>\n      <ResultsZone isFetching={disabled}>\n        <header className=\"notifications-header\">\n          <h1 className=\"text-h1\">Notifications</h1>\n          <div className=\"actions\">\n            <MutationButton\n              mutation={markAsReadMutation}\n              onClick={handleMutation(markAsReadMutation)}\n              disabled={\n                selected.length === 0 ||\n                disabled ||\n                selected.every((s) => s.isRead)\n              }\n              defaultError={MARK_AS_READ_DEFAULT_ERROR}\n            >\n              Mark as read\n            </MutationButton>\n            <MutationButton\n              mutation={markAsUnreadMutation}\n              onClick={handleMutation(markAsUnreadMutation)}\n              disabled={\n                selected.length === 0 ||\n                disabled ||\n                selected.every((s) => !s.isRead)\n              }\n              defaultError={MARK_AS_UNREAD_DEFAULT_ERROR}\n            >\n              Mark as unread\n            </MutationButton>\n            <button\n              type=\"button\"\n              onClick={handleModalOpen}\n              disabled={disabled || resolvedData?.meta.unreadCount === 0}\n              className=\"btn-s btn-enhanced\"\n            >\n              <GraphicalIcon icon=\"double-checkmark\" />\n              <span>Mark all as read</span>\n            </button>\n          </div>\n        </header>\n        <FetchingBoundary\n          error={error}\n          status={status}\n          defaultError={DEFAULT_ERROR}\n        >\n          {resolvedData ? (\n            <React.Fragment>\n              <List\n                notifications={resolvedData.results}\n                selected={selected}\n                onSelect={handleSelect}\n                disabled={disabled}\n              />\n              <Pagination\n                disabled={latestData === undefined}\n                current={request.query.page}\n                total={resolvedData.meta.totalPages}\n                setPage={setPage}\n              />\n            </React.Fragment>\n          ) : null}\n        </FetchingBoundary>\n      </ResultsZone>\n      <MarkAllNotificationsAsReadModal\n        open={modalOpen}\n        onClose={handleModalClose}\n        onSubmit={handleMutation(markAllAsReadMutation)}\n        mutation={markAllAsReadMutation}\n      />\n    </>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { Notification as NotificationType } from '../../types'\nimport { Notification } from './Notification'\nimport { EmptyList } from './EmptyList'\nimport { GraphicalIcon } from '../../common'\n\nexport const List = ({\n  notifications,\n  selected,\n  onSelect,\n  disabled,\n}: {\n  notifications: readonly NotificationType[]\n  selected: readonly NotificationType[]\n  onSelect: (notification: NotificationType) => void\n  disabled: boolean\n}): JSX.Element => {\n  const handleChange = useCallback(\n    (notification: NotificationType) => {\n      return () => onSelect(notification)\n    },\n    [onSelect]\n  )\n\n  if (notifications.length === 0) {\n    return <EmptyList />\n  }\n\n  return (\n    <div className=\"notifications\">\n      {notifications.map((notification) => (\n        <div key={notification.uuid} className=\"notification-row\">\n          <label\n            className={`c-checkbox-wrapper notification-cb-${notification.uuid}`}\n          >\n            <input\n              disabled={disabled}\n              type=\"checkbox\"\n              checked={selected.map((s) => s.uuid).includes(notification.uuid)}\n              onChange={handleChange(notification)}\n              id={`notification-cb-${notification.uuid}`}\n            />\n            <div className=\"row\">\n              <div className=\"c-checkbox\">\n                <GraphicalIcon icon=\"checkmark\" />\n              </div>\n            </div>\n          </label>\n          <Notification {...notification} />\n        </div>\n      ))}\n    </div>\n  )\n}\n", "import React from 'react'\n\nexport const EmptyList = (): JSX.Element => {\n  return <div>You have no notifications</div>\n}\n", "import { sendRequest } from '../../../utils/send-request'\nimport { useMutation } from 'react-query'\n\nexport const useNotificationMutation = ({\n  endpoint,\n  body,\n}: {\n  endpoint: string\n  body: { uuids: readonly string[] } | null\n}) => {\n  const [mutation, { status, error }] = useMutation(() => {\n    const { fetch } = sendRequest({\n      endpoint: endpoint,\n      method: 'PATCH',\n      body: JSON.stringify(body),\n    })\n\n    return fetch\n  })\n\n  return {\n    mutation,\n    status,\n    error,\n  }\n}\n", "import React from 'react'\nimport { QueryStatus } from 'react-query'\nimport { FormButton } from '../../common'\nimport { ErrorBoundary, ErrorMessage } from '../../ErrorBoundary'\n\nexport const MutationButton = ({\n  onClick,\n  disabled,\n  mutation,\n  defaultError,\n  children,\n}: React.PropsWithChildren<{\n  onClick: () => void\n  disabled: boolean\n  mutation: { status: QueryStatus; error: unknown }\n  defaultError: Error\n}>): JSX.Element => {\n  return (\n    <React.Fragment>\n      <FormButton\n        type=\"button\"\n        onClick={onClick}\n        disabled={disabled}\n        status={mutation.status}\n        className=\"btn-s btn-enhanced\"\n      >\n        {children}\n      </FormButton>\n      <ErrorBoundary resetKeys={[mutation.status]}>\n        <ErrorMessage error={mutation.error} defaultError={defaultError} />\n      </ErrorBoundary>\n    </React.Fragment>\n  )\n}\n", "import React, { useCallback } from 'react'\nimport { Modal, ModalProps } from '../../modals/Modal'\nimport { QueryStatus } from 'react-query'\nimport { FormButton } from '../../common'\nimport { ErrorBoundary, ErrorMessage } from '../../ErrorBoundary'\n\nconst DEFAULT_ERROR = new Error('Unable to mark all notifications as read')\n\nexport const MarkAllNotificationsAsReadModal = ({\n  mutation,\n  onClose,\n  onSubmit,\n  ...props\n}: Omit<ModalProps, 'className'> & {\n  mutation: {\n    status: QueryStatus\n    error: unknown\n  }\n  onSubmit: () => void\n}): JSX.Element => {\n  const handleClose = useCallback(() => {\n    if (mutation.status === 'loading') {\n      return\n    }\n\n    onClose()\n  }, [mutation.status, onClose])\n\n  const handleSubmit = useCallback(\n    (e) => {\n      e.preventDefault()\n\n      onSubmit()\n      handleClose()\n    },\n    [onSubmit, handleClose]\n  )\n\n  return (\n    <Modal className=\"m-generic-confirmation\" onClose={handleClose} {...props}>\n      <h3>Mark all as read?</h3>\n      <p>Are you sure you want to mark all notifications as read?</p>\n      <form data-turbo=\"false\" onSubmit={handleSubmit} className=\"buttons\">\n        <FormButton\n          type=\"submit\"\n          status={mutation.status}\n          className=\"btn-primary btn-s\"\n        >\n          Continue\n        </FormButton>\n        <FormButton\n          type=\"button\"\n          status={mutation.status}\n          onClick={handleClose}\n          className=\"btn-enhanced btn-s\"\n        >\n          Cancel\n        </FormButton>\n      </form>\n      <ErrorBoundary resetKeys={[mutation.status]}>\n        <ErrorMessage error={mutation.error} defaultError={DEFAULT_ERROR} />\n      </ErrorBoundary>\n    </Modal>\n  )\n}\n"],
  "mappings": "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",
  "names": []
}
