{"version":3,"file":"index-CxPS8GAP.js","sources":["../../src/kognia/theme/index.tsx","../../src/api/config.ts","../../src/shared/utils/env-variables/index.ts","../../src/api/utils/index.ts","../../src/api/routes.ts","../../src/api/types.ts","../../src/api/hooks/useBackendApi/index.ts","../../src/shared/components/icons/svg-icon/SvgIcon.tsx","../../src/shared/components/icons/icon-close/index.tsx","../../src/shared/hooks/notifications/index.tsx","../../src/api/hooks/useFetchRequest/index.ts","../../src/api/user/use-logout-account/index.ts","../../src/kognia/router/routes.ts","../../src/shared/utils/is-form-tag/index.ts","../../src/shared/components/icons/icon-chevron-down/index.tsx","../../src/shared/components/icons/icon-done/index.tsx","../../src/kognia/error-tracking/register-user/index.ts","../../src/shared/types/user/types.ts","../../src/shared/hooks/use-page-state-machine/index.ts","../../src/shared/contexts/app-state/atoms/index.ts","../../src/api/user/use-fetch-account/index.ts","../../src/api/user/use-fetch-feature-flags/index.ts","../../src/shared/contexts/app-state/use-app-data/index.ts","../../src/shared/components/icons/icon-loading/index.tsx","../../src/shared/components/spinner/index.tsx","../../src/shared/components/app-loading/index.tsx","../../src/shared/contexts/app-state/index.tsx","../../src/shared/components/sidebar-layout/SideBarLayout.styled.tsx","../../src/shared/components/sidebar-layout/client-dropdown/ClientDropdown.tsx","../../src/shared/assets/kognia-sports-logo-small.svg","../../src/shared/assets/kognia-sports-logotype.svg","../../public/favicon.ico","../../src/shared/hooks/use-current-client/useCurrentClient.ts","../../src/shared/hooks/use-branding/useBranding.ts","../../src/shared/components/sidebar-layout/sidebar-logo/styled/LogoImg.tsx","../../src/shared/components/sidebar-layout/sidebar-logo/index.tsx","../../src/shared/components/sidebar-layout/sidebar-menu/hooks/use-redirect-to/index.tsx","../../src/shared/components/sidebar-layout/sidebar-menu/styled.tsx","../../src/shared/components/sidebar-layout/sidebar-menu/utils.ts","../../src/shared/components/sidebar-layout/sidebar-menu/sidebar-menu-item/index.tsx","../../src/shared/components/sidebar-layout/sidebar-menu/sidebar-menu-item-title/index.tsx","../../src/shared/components/sidebar-layout/sidebar-menu/sidebar-menu-item-with-options/index.tsx","../../src/shared/components/sidebar-layout/sidebar-menu/index.tsx","../../src/shared/hooks/use-sidebar/index.tsx","../../src/shared/assets/icon-whistle.svg","../../src/shared/assets/page-background.svg","../../src/shared/components/container/index.styled.tsx","../../src/shared/assets/icon-circle-background.svg","../../src/shared/components/error-boundary/error-container/index.styled.tsx","../../src/shared/components/error-boundary/error-container/index.tsx","../../src/shared/components/icons/icon-ball/index.tsx","../../src/shared/components/icons/icon-dashboard/index.tsx","../../src/shared/components/icons/icon-double-arrow-left/index.tsx","../../src/shared/components/icons/icon-double-arrow-right/index.tsx","../../src/shared/components/icons/icon-home/index.tsx","../../src/shared/components/icons/icon-info/index.tsx","../../src/shared/components/icons/icon-keypad-empty/index.tsx","../../src/shared/components/icons/icon-playlist/index.tsx","../../src/shared/components/icons/icon-tag/index.tsx","../../src/shared/components/icons/icon-tutorial/index.tsx","../../src/shared/components/icons/icon-user/index.tsx","../../src/shared/components/dialog/index.tsx","../../src/shared/components/icons/icon-arrow-left/index.tsx","../../src/shared/components/icons/icon-arrow-right/index.tsx","../../src/shared/components/icons/icon-minus/index.tsx","../../src/shared/components/icons/icon-plus/index.tsx","../../src/shared/components/icons/icon-scroll-down/index.tsx","../../src/shared/components/icons/icon-scroll-up/index.tsx","../../src/shared/components/keyboard-shortcuts/types/keyboard-key-options/index.ts","../../src/shared/components/keyboard-shortcuts/components/keyboard-key/index.tsx","../../src/shared/components/keyboard-shortcuts/components/keyboard-shortcut/index.tsx","../../src/shared/utils/is-mac-os/index.ts","../../src/shared/components/keyboard-shortcuts-modal/index.tsx","../../src/shared/components/sidebar-layout/index.tsx","../../src/shared/components/error-boundary/error-page/index.tsx","../../src/shared/components/error-boundary/index.tsx","../../src/api/context/index.tsx","../../src/shared/contexts/app-context/index.tsx","../../src/browserHistory.ts","../../src/kognia/i18n/types.ts","../../src/kognia/i18n/locales/de-DE/index.ts","../../src/kognia/i18n/locales/en-US/index.ts","../../src/kognia/i18n/locales/es-ES/index.ts","../../src/kognia/i18n/index.ts","../../src/shared/components/input/index.tsx","../../src/shared/components/input-list/index.tsx","../../src/pages/account/components/account-form/index.tsx","../../src/shared/components/container/index.tsx","../../src/pages/account/AccountPageContainer.tsx","../../src/pages/home/types/solutionCardVariants.ts","../../src/pages/home/ui/solutions/ui/icons/solution-svg-icon-container/SolutionSvgIconContainer.ts","../../src/pages/home/ui/solutions/ui/icons/icon-match-analysis/IconMatchAnalysis.tsx","../../src/pages/home/ui/solutions/ui/icons/icon-playlists/IconPlaylists.tsx","../../src/pages/home/ui/solutions/ui/icons/icon-tagging-tool/IconTaggingTool.tsx","../../src/kognia/router/link-with-external/index.tsx","../../src/pages/home/ui/solutions/ui/solution-card/ui/solution-card-wrapper/SolutionCardWrapper.ts","../../src/pages/home/ui/solutions/ui/solution-card/SolutionCard.tsx","../../src/pages/home/ui/solutions/Solutions.tsx","../../src/pages/home/HomeContainer.page.tsx","../../src/api/hooks/useAppQueryClient/index.ts","../../src/api/tagging-tool/use-fetch-live-session/index.ts","../../src/api/tagging-tool/use-update-live-session/index.ts","../../src/pages/live-tagging-sessions/components/live-tagging-session-edit-form/index.tsx","../../src/pages/live-tagging-sessions/components/live-tagging-session-edit-page/index.tsx","../../src/shared/components/dialog/dialog-actions/index.tsx","../../src/shared/components/dialog/dialog-content/index.tsx","../../src/shared/components/dialog/dialog-content-text/index.tsx","../../src/shared/components/dialog/dialog-header/index.tsx","../../src/shared/components/icons/icon-chevron-right/index.tsx","../../src/shared/hooks/use-source-client/index.tsx","../../src/shared/components/switch-environment/index.tsx","../../src/entities/playlist/config/Playlist.config.ts","../../src/entities/playlist/ui/PlaylistVideoPlayerContainer.tsx","../../src/pages/playlist-detail/components/playlists-detail-skeleton/PlaylistDetailSkeleton.tsx","../../src/shared/types/recording/types.ts","../../src/shared/utils/get-video-sources/index.ts","../../src/shared/utils/iso-8601-duration-to-time/index.ts","../../src/shared/utils/round/index.ts","../../src/shared/types/segment/types.ts","../../src/api/match/transformers/match/matchWithEpisodes/utils.ts","../../src/api/recording/utils.ts","../../src/api/match/transformers/match/matchWithEpisodes/index.ts","../../src/pages/recordings-list/types.ts","../../src/api/recording/transformers/index.ts","../../src/api/playlist/transformers/index.ts","../../src/api/playlist/usePlaylist/index.ts","../../src/api/user-presets/transformers/index.ts","../../src/api/user-presets/use-user-presets/index.ts","../../src/shared/types/user-preset/types.ts","../../src/shared/constants/user-presets/userPresetsKeys.ts","../../src/shared/constants/user-presets/userPresetsPlayList.ts","../../../../packages/overlay-generator/src/store/utils/validateChunkData.ts","../../../../packages/overlay-generator/src/store/index.ts","../../../../packages/overlay-generator/src/store/utils/preloadData.ts","../../../../packages/overlay-generator/src/utils/getChunkNumberFromFrameAndChunkSize.ts","../../../../packages/overlay-generator/src/utils/getVideoScale.ts","../../../../packages/overlay-generator/src/utils/makeFetch.ts","../../../../packages/overlay-generator/src/utils/transformTimeSeries.ts","../../../../packages/overlay-generator/src/utils/loaders.ts","../../../../packages/overlay-generator/src/utils/scaleMatrix.ts","../../../../packages/overlay-generator/src/utils/transformHomographyIntoMatrix3d.ts","../../../../packages/overlay-generator/src/main.ts","../../../../packages/overlay-generator/src/hooks/useOverlayGenerator.ts","../../../../packages/overlay-generator/src/overlay-mapping/index.ts","../../src/shared/components/video-player/types.ts","../../src/shared/types/tactics/types.ts","../../src/shared/types/recording/schemas.ts","../../src/shared/constants/playback-rates/paybackRates.ts","../../src/shared/constants/zoom-range/zoomLevelsValues.ts","../../src/shared/constants/user-presets/userPresetsSchema.ts","../../src/shared/utils/user-presets/getPreset.ts","../../src/pages/playlist-detail/store/atoms.ts","../../src/pages/playlist-detail/hooks/useMultimatchAppliedFiltersPreset.ts","../../src/pages/playlist-detail/hooks/usePlaylistPage.ts","../../src/shared/components/video-player/defaultPlayingModes.ts","../../src/entities/playlist/hooks/use-map-videos/utils/generateVideoSourcesFromVideoTypes.ts","../../src/entities/playlist/hooks/use-map-videos/useMapVideos.ts","../../src/shared/components/video-player/state/states.ts","../../src/shared/components/video-player/state/atoms/index.ts","../../src/shared/components/video-player/is-full-match-video/index.ts","../../src/shared/components/video-player/util/index.ts","../../src/shared/components/video-player/hooks/use-overlays-controller/index.tsx","../../src/shared/components/video-player/state/atoms/hooks/index.ts","../../src/shared/components/video-player/state/utils/get-current-playlist-item-time/index.ts","../../src/shared/components/video-player/hooks/index.ts","../../src/shared/components/video-player/state/change-source-and-time-machine/types.ts","../../src/shared/components/video-player/state/change-source-and-time-machine/utils/guards.ts","../../src/shared/components/video-player/state/change-source-and-time-machine/index.ts","../../src/shared/components/video-player/state/hooks/utils.ts","../../src/shared/components/video-player/state/hooks/index.ts","../../src/shared/components/video-player/state/utils/get-next-playlist-item/index.ts","../../src/shared/components/video-player/state/utils/get-previous-playlist-item/index.ts","../../src/shared/components/video-player/state/utils/get-video-source-index/index.ts","../../src/shared/components/video-player/state/utils/guards.ts","../../src/shared/components/video-player/state/utils/jump-to-playlist-item/index.ts","../../src/shared/components/video-player/state/utils/jump-to-video-source/index.ts","../../src/shared/components/video-player/state/utils/playing-control-queue/index.ts","../../src/shared/components/video-player/state/utils/replace-playlist-item-by-index/index.ts","../../src/shared/components/video-player/state/utils/skip-time/index.ts","../../src/shared/components/video-player/state/utils/actions.ts","../../src/shared/components/video-player/state/index.ts","../../src/shared/components/video-player/index.tsx","../../src/api/playlist/useUpdatePlaylist/index.ts","../../src/entities/playlist/store/UserPlaylist.state.tsx","../../src/entities/playlist/hooks/useIsBulkModeActive.tsx","../../src/entities/playlist/ui/PlaylistActions.tsx","../../src/entities/playlist/ui/PlaylistContainerGrid.tsx","../../src/shared/components/icons/icon-time/index.tsx","../../src/shared/utils/seconds-as-duration/index.ts","../../src/entities/playlist/ui/BadgetText.tsx","../../src/entities/playlist/ui/PlaylistDetails.tsx","../../src/entities/playlist/ui/PlaylistHeaderGrid.tsx","../../src/entities/playlist/ui/PlaylistTimelineContainer.tsx","../../src/entities/playlist/ui/PlaylistTimelineHeader.tsx","../../src/api/hooks/useMutationRequest/index.ts","../../src/api/playlist/useDownloadPlaylist/index.tsx","../../src/api/playlist/useDownloadPlaylistItems/index.tsx","../../src/api/playlist/useDownloadPlaylistXml/index.ts","../../src/shared/components/icons/icon-download/index.tsx","../../src/features/playlist/download-playlist-items-modal/ui/download-modal-wrapper/DownloadModalWrapper.ts","../../src/features/playlist/download-playlist-items-modal/DownloadPlaylistItemsModal.tsx","../../src/features/playlist/DownloadCurrentPlaylistItemModal.tsx","../../src/features/playlist/EnableBulkModeButton.tsx","../../src/api/playlist/useBatchUpdatePlaylistItems/index.ts","../../src/shared/components/icons/icon-overlays/index.tsx","../../src/shared/components/video-player/video-player-component/hooks/overlay-panel/index.tsx","../../src/shared/components/CheckboxWithCustomColor/CheckboxWithCustomColor.tsx","../../src/shared/components/tabs/index.ts","../../src/shared/components/tabs/components/tab-panel/index.tsx","../../src/shared/components/tactic-checkbox/index.tsx","../../src/shared/components/icons/icon-chevron-left/index.tsx","../../src/shared/components/overlay-selector-panel/styled.tsx","../../src/shared/components/overlay-selector-panel/overlay-selector-content/index.tsx","../../src/shared/components/overlay-selector-panel/index.tsx","../../src/entities/playlist/hooks/useBulkSelectedItems.tsx","../../src/features/playlist/playlist-overlay-selector-panel/hooks/useActivePlaylistItemIds.ts","../../src/features/playlist/playlist-overlay-selector-panel/api/useTacticsInRange.ts","../../src/features/playlist/playlist-overlay-selector-panel/hooks/useSelectedItemsOverlayTactics.ts","../../src/features/playlist/playlist-overlay-selector-panel/PlaylistOverlaySelectorPanel.feature.tsx","../../src/api/playlist/useDeletePlaylistItems/index.ts","../../src/api/playlist/useDuplicatePlaylistItems/index.ts","../../src/entities/playlist/ui/ItemsListBulk.tsx","../../src/entities/playlist/ui/ItemsListContainer.tsx","../../src/shared/assets/cameras.svg","../../src/entities/playlist/ui/PlaylistItemsListEmptyImg.tsx","../../src/entities/playlist/ui/PlaylistItemsEmpty.tsx","../../src/features/playlist/PlaylistBulkButton.tsx","../../src/api/playlist/useAddManyToPlaylist/index.ts","../../src/shared/hooks/use-dates/index.ts","../../src/shared/utils/guid/index.ts","../../src/shared/types/filters/types.ts","../../src/api/playlist/useFetchPlaylists/types.ts","../../src/api/playlist/useFetchPlaylists/atoms.ts","../../src/api/playlist/useFetchPlaylists/util.ts","../../src/api/playlist/useFetchPlaylists/index.ts","../../src/shared/components/NotificationLink.tsx","../../src/api/playlist/useCreatePlaylist/index.tsx","../../src/shared/components/icons/icon-add-folder/index.tsx","../../src/shared/components/select-playlist-dialog/menu-item-new-playlist/MenuItemNewPlaylist.tsx","../../src/shared/components/autocomplete/styles.ts","../../src/shared/components/icons/icon-search/index.tsx","../../src/shared/components/autocomplete/index.tsx","../../src/shared/components/search-playlist-results/index.tsx","../../src/shared/components/search-playlist-autocomplete/index.tsx","../../src/shared/components/select-playlist-dialog/SelectPlaylistDialog.tsx","../../src/features/playlist/CopyToDialog.tsx","../../src/features/playlist/SelectedItemsCopyToDialog.tsx","../../src/api/playlist/useUpdatePlaylistItemOrder/index.ts","../../src/entities/playlist/hooks/useHandleSelect.tsx","../../src/features/playlist/PlaylistItemsList.tsx","../../src/api/playlist/useDeletePlaylistItem/index.ts","../../src/api/playlist/useUpdatePlaylistItem/index.ts","../../src/entities/playlist/hooks/useHandleSetPlaylistItem.tsx","../../src/entities/playlist/hooks/useHandlePlaylistItemClick.tsx","../../src/entities/playlist/ui/PlaylistItemWrapper.tsx","../../src/entities/playlist/util/getPlaylistItemFirstVideoSource.ts","../../src/entities/playlist/util/generateCopyToPlaylistItem.ts","../../src/entities/playlist/ui/ContentBottomRow.tsx","../../src/entities/playlist/ui/ContentTopRow.tsx","../../src/entities/playlist/ui/CounterBadge.tsx","../../src/entities/playlist/ui/ItemContentWrapper.tsx","../../src/shared/components/icons/icon-play/index.tsx","../../src/shared/components/icons/icon-vertical-menu/index.tsx","../../src/shared/components/menu-list/index.tsx","../../src/shared/components/kebab-menu/index.tsx","../../src/shared/components/icons/icon-pause/index.tsx","../../src/features/playlist/playlist-item-content/ui/PlayButton.tsx","../../src/features/playlist/playlist-item-content/ui/PlaylistItemProgressBar.tsx","../../src/features/playlist/playlist-item-content/PlaylistItemContent.tsx","../../src/shared/components/confirm-popover-dialog/index.tsx","../../src/shared/components/icons/icon-analysis/index.tsx","../../src/shared/components/icons/icon-backward/index.tsx","../../src/shared/components/icons/icon-backward-5/index.tsx","../../src/shared/components/icons/icon-camera/index.tsx","../../src/shared/components/icons/icon-chevron-up/index.tsx","../../src/shared/components/icons/icon-copy/index.tsx","../../src/shared/components/icons/icon-defense/index.tsx","../../src/shared/components/icons/icon-delete/index.tsx","../../src/shared/components/icons/icon-edit/index.tsx","../../src/shared/components/icons/icon-export/index.tsx","../../src/shared/components/icons/icon-filter/index.tsx","../../src/shared/components/icons/icon-folder/index.tsx","../../src/shared/components/icons/icon-forward/index.tsx","../../src/shared/components/icons/icon-forward-5/index.tsx","../../src/shared/components/icons/icon-full-screen/index.tsx","../../src/shared/components/icons/icon-keyboard/index.tsx","../../src/shared/components/icons/icon-keypad/index.tsx","../../src/shared/components/icons/icon-offense/index.tsx","../../src/shared/components/icons/icon-open-in/index.tsx","../../src/shared/components/icons/icon-order/index.tsx","../../src/shared/components/icons/icon-play-speed/index.tsx","../../src/shared/components/icons/icon-replay/index.tsx","../../src/shared/components/icons/icon-save/index.tsx","../../src/shared/components/icons/icon-share/index.tsx","../../src/shared/components/icons/icon-shield/index.tsx","../../src/shared/components/icons/icon-sort/index.tsx","../../src/shared/components/icons/icon-star/index.tsx","../../src/shared/components/icons/icon-strawberry/index.tsx","../../src/shared/components/icons/icon-sync/index.tsx","../../src/shared/components/icons/icon-timeline/index.tsx","../../src/shared/components/icons/icon-transition/index.tsx","../../src/shared/components/icons/icon-trim/index.tsx","../../src/shared/components/icons/icon-copy-to/index.tsx","../../src/features/playlist/user-playlist-items-list/ui/user-playlist-item/hooks/useUserPlaylistItemOptions.tsx","../../src/features/playlist/user-playlist-items-list/ui/user-playlist-item/ui/rename-dialog/RenameDialog.tsx","../../src/features/playlist/user-playlist-items-list/ui/user-playlist-item/UserPlaylistItem.tsx","../../src/shared/components/sortable-item-list/index.tsx","../../src/shared/components/sortable-item-list/sortable-item/index.tsx","../../src/features/playlist/user-playlist-items-list/ui/SortablePlaylistItemsList.tsx","../../src/shared/components/dialog-new/dialog-actions/index.tsx","../../src/shared/components/dialog-new/dialog-button-container/index.tsx","../../src/shared/components/dialog-new/dialog-content/index.tsx","../../src/shared/components/dialog-new/dialog-header/index.tsx","../../src/shared/components/dialog-new/index.tsx","../../src/shared/components/input-pill-adornment/InputPillAdornment.tsx","../../src/shared/components/number-field/NumberField.tsx","../../src/features/playlist/user-playlist-items-list/ui/trim-modal/trimForm.ts","../../src/features/playlist/user-playlist-items-list/ui/trim-modal/trimFormSchema.ts","../../src/features/playlist/user-playlist-items-list/ui/trim-modal/TrimModal.tsx","../../src/features/playlist/user-playlist-items-list/UserPlaylistItemsList.tsx","../../src/api/recording/use-tactical-analyses-filters/index.tsx","../../src/api/recording/useEpisodesWithFilters/useTacticalAnalysesPlaylistItems.ts","../../src/api/user-presets/use-save-user-preset/index.ts","../../src/shared/constants/user-presets/userPresetsTimeline.ts","../../src/shared/constants/user-presets/userPresetsVideoPlayer.ts","../../src/shared/constants/user-presets/userPresetsClasses.ts","../../src/shared/types/user-preset/hooks/use-save-playlist-multimatch-filters-applied-preset/index.tsx","../../src/shared/components/filter-container/index.tsx","../../src/shared/components/filter-tabs/index.tsx","../../src/shared/components/loading-block/index.tsx","../../src/features/multi-analysis-filters/hooks/use-multiple-recordings-filters/reducer.ts","../../src/features/multi-analysis-filters/hooks/use-multiple-recordings-filters/useMultipleRecordingsFilters.tsx","../../src/shared/components/active-filters/index.tsx","../../src/shared/components/filter-block/index.tsx","../../src/shared/components/filter-block-clear/index.tsx","../../src/shared/components/filter-block-status/index.tsx","../../src/shared/components/filter-column/index.tsx","../../src/shared/components/notification-circle/index.tsx","../../src/shared/components/button-dropdown/index.tsx","../../src/shared/components/filter-multi-select/index.tsx","../../src/pages/tactical-analysis/api/types.ts","../../src/pages/tactical-analysis/components/tactical-analysis/utils/get-team-type/index.ts","../../src/shared/components/filter-player/filter-player-tab-panel/index.tsx","../../src/shared/components/filter-player/filter-players-list/index.tsx","../../src/shared/components/filter-player-tab/index.tsx","../../src/shared/components/filter-player/index.tsx","../../src/shared/components/filter-select/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters/types.ts","../../src/shared/components/filter-zone/checkbox-zone/index.tsx","../../src/shared/components/filter-zone/index.tsx","../../src/shared/utils/recordings/index.ts","../../src/features/multi-analysis-filters/ui/filter-events/FilterEvents.tsx","../../src/features/multi-analysis-filters/ui/recordings-filters-actions/RecordingsFiltersActions.tsx","../../src/pages/tactical-analysis/config.ts","../../src/features/multi-analysis-filters/ui/recordings-filters-inside-an-episode/components/recordings-filters-inside-an-episode-tactics/components/recording-tactics-players-filter/RecordingTacticsPlayersFilter.tsx","../../src/features/multi-analysis-filters/ui/recordings-filters-inside-an-episode/components/recordings-filters-inside-an-episode-tactics/RecordingsFilterInsideAnEpisodeTactics.tsx","../../src/features/multi-analysis-filters/ui/recordings-filters-inside-an-episode/RecordingsFiltersInsideAnEpisode.tsx","../../src/features/multi-analysis-filters/utils/getFilterStatus.ts","../../src/features/multi-analysis-filters/MultiAnalysisFilters.tsx","../../src/pages/playlist-detail/components/add-multiple-clips/components/multimatch-filters-modal/components/multi-analysis-filters-playlist/MultiAnalysisFiltersPlaylist.tsx","../../src/pages/playlist-detail/components/add-multiple-clips/components/recordings-filters-content/RecordingsFiltersContent.tsx","../../src/pages/playlist-detail/components/add-multiple-clips/components/recordings-filters-header/RecordingsFiltersHeader.tsx","../../src/api/recording/useRecordingsByName/useRecordingsByName.ts","../../src/shared/components/active-filter/index.tsx","../../src/pages/playlist-detail/components/add-multiple-clips/components/select-recordings/components/active-recording-filter/ActiveRecordingFilter.tsx","../../src/pages/playlist-detail/components/add-multiple-clips/components/select-recordings/components/header-add-clips-container/HeaderAddClipsContainer.ts","../../src/pages/playlist-detail/components/add-multiple-clips/components/select-recordings/components/recording-result/RecordingResult.tsx","../../src/pages/playlist-detail/components/add-multiple-clips/components/select-recordings/components/results-wrapper/ResultsWrapper.tsx","../../src/pages/playlist-detail/components/add-multiple-clips/components/select-recordings/hooks/useSyncRecordingsSelection.tsx","../../src/pages/playlist-detail/components/add-multiple-clips/components/select-recordings/SelectRecordings.tsx","../../src/pages/playlist-detail/components/add-multiple-clips/components/multimatch-filters-modal/MultimatchFiltersModal.tsx","../../src/pages/playlist-detail/components/add-multiple-clips/AddMultipleClips.tsx","../../src/shared/components/editable-text/plain-text/index.tsx","../../src/shared/components/editable-text/input-text-field/index.tsx","../../src/shared/components/PlaylistTitle.tsx","../../src/shared/components/editable-text/EditableText.tsx","../../src/shared/components/share-playlist-modal/index.tsx","../../src/shared/components/vertical-icon-button/index.tsx","../../src/shared/components/video-player/video-player-component/components/next-video-source-button/index.tsx","../../src/shared/components/video-player/video-player-component/components/player-skeleton/play-circle/index.tsx","../../src/shared/components/video-player/video-player-component/components/button-controls/index.tsx","../../src/shared/components/video-player/video-player-component/components/button-controls-left/index.tsx","../../src/shared/components/video-player/video-player-component/components/button-controls-right/index.tsx","../../src/shared/components/video-player/video-player-component/components/video-controls/index.tsx","../../src/shared/components/video-player/video-player-component/components/player-skeleton/index.tsx","../../src/shared/components/video-player/video-player-component/components/previous-video-source-button/index.tsx","../../src/shared/components/video-player/video-player-component/components/progress-bar-video-source/index.tsx","../../src/pages/tactical-analysis/utils/formatted-time/index.ts","../../src/shared/components/video-player/video-player-component/components/progress-time-video-source/index.tsx","../../src/shared/streams/actionTypes.ts","../../src/shared/types/metrics/index.ts","../../src/shared/streams/eventEmitter.ts","../../src/shared/components/video-player/video-player-component/components/backward-5-button/index.tsx","../../src/shared/components/video-player/video-player-component/components/download-button/index.tsx","../../src/shared/components/video-player/video-player-component/components/forward-5-button/index.tsx","../../src/shared/components/video-player/video-player-component/components/fullscreen-button/index.tsx","../../src/shared/components/video-player/video-player-component/components/next-button/index.tsx","../../src/shared/components/video-player/video-player-component/components/playback-button/index.tsx","../../src/shared/components/video-player/video-player-component/components/previous-button/index.tsx","../../src/shared/components/video-player/video-player-component/components/progress-bar/index.tsx","../../src/shared/components/video-player/video-player-component/components/progress-time/index.tsx","../../src/shared/components/video-player/video-player-component/components/rules/index.tsx","../../src/shared/components/video-player/video-player-component/components/speed-button/styled.ts","../../src/shared/components/video-player/hooks/use-video-player-speed/index.ts","../../src/shared/components/video-player/video-player-component/components/speed-button/index.tsx","../../src/shared/components/video-player/video-player-component/components/text-overlay/index.tsx","../../src/shared/components/video-player/video-player-component/components/video-player-debug/video-player-debug-content/video-overlays-tab/index.tsx","../../src/shared/components/video-player/video-player-component/components/video-player-debug/video-player-debug-content/video-player-tab/index.tsx","../../src/shared/components/video-player/video-player-component/components/video-player-debug/video-player-debug-content/index.tsx","../../src/shared/components/video-player/video-player-component/components/video-player-debug/index.tsx","../../src/shared/components/video-player/video-player-component/components/video-spinner/index.tsx","../../src/shared/components/video-player/video-player-bar/styled.tsx","../../src/shared/components/video-player/video-player-component/hooks/use-video-aspect-ratio/index.ts","../../src/shared/components/video-player/overlays/index.tsx","../../src/shared/components/toggle/index.tsx","../../src/shared/components/video-player/video-player-bar/video-bar-tactic-drawings-mode/overlays-quality-selector/index.tsx","../../src/shared/components/video-player/video-player-bar/video-bar-block/index.tsx","../../src/shared/components/video-player/video-player-bar/video-bar-tactic-drawings-mode/index.tsx","../../src/shared/components/video-player/video-player-bar/video-bar-header/index.tsx","../../src/shared/components/video-player/video-player-bar/video-source-select/index.styled.tsx","../../src/shared/components/video-player/video-player-bar/video-source-select-list/index.styled.tsx","../../src/shared/components/video-player/video-player-bar/video-source-select-list/index.tsx","../../src/shared/components/video-player/video-player-bar/video-source-select/index.tsx","../../src/shared/components/video-player/video-player-bar/index.tsx","../../src/shared/components/video-player/video-player-component/index.tsx","../../src/widgets/playlist/user-playlist/ui/playlist-item-trim-player/ui/TrimSlider.tsx","../../src/widgets/playlist/user-playlist/ui/playlist-item-trim-player/utils/generateTrimmedPlaylistItem.ts","../../src/widgets/playlist/user-playlist/ui/playlist-item-trim-player/PlaylistItemTrimPlayer.tsx","../../src/widgets/playlist/user-playlist/ui/PlaylistItemTrimDialog.tsx","../../src/widgets/playlist/user-playlist/ui/PlaylistItemTrim.tsx","../../src/widgets/playlist/user-playlist/ui/UserPlaylist.tsx","../../src/widgets/playlist/user-playlist/UserPlaylist.widget.tsx","../../src/pages/playlist-detail/PlaylistDetailContainer.page.tsx","../../src/pages/recording-playlists/components/empty-cell-grid/empty-cell/index.tsx","../../src/pages/recording-playlists/components/empty-cell-grid/index.tsx","../../src/shared/components/not-found/index.tsx","../../src/shared/components/empty-page/index.tsx","../../src/shared/hooks/use-query-params/index.ts","../../src/api/playlist/useDuplicatePlaylist/index.ts","../../src/shared/components/dialog/dialog-button-container/index.tsx","../../src/pages/playlists/components/copy-playlist-modal/index.tsx","../../src/pages/playlists/components/copy-playlist/index.tsx","../../src/shared/components/list/index.tsx","../../src/shared/components/list/list-container/index.tsx","../../src/shared/components/list/list-header/index.tsx","../../src/shared/components/list/list-header-option/index.tsx","../../src/shared/components/list/list-title/index.tsx","../../src/shared/components/list/list-title-actions/index.tsx","../../src/shared/components/list/list-title-container/index.tsx","../../src/shared/components/pagination/Pagination.styled.ts","../../src/shared/components/pagination/index.tsx","../../src/pages/playlists/components/playlists-list/components/create-playlist/index.tsx","../../src/shared/components/date-range/index.tsx","../../src/shared/components/filter-label/index.tsx","../../src/shared/components/filter-v2/index.tsx","../../src/shared/components/filter-v2-menu/checkbox/CheckboxMenu.styled.ts","../../src/shared/components/filter-v2/filter-controls/index.tsx","../../src/shared/components/filter-v2-menu/checkbox/index.tsx","../../src/pages/playlists/components/playlists-list/components/filters/search-playlist/index.styled.tsx","../../src/pages/playlists/components/playlists-list/components/filters/search-playlist/index.tsx","../../src/pages/playlists/components/playlists-list/components/filters/index.tsx","../../src/shared/hooks/use-query-string-state/index.ts","../../src/pages/playlists/components/playlists-list/hooks/usePlaylistsWithQueryStringState/index.ts","../../src/api/playlist/useDeletePlaylist/index.ts","../../src/pages/recordings-list/components/recording-card/utils/index.ts","../../src/shared/components/list/list-item/index.tsx","../../src/shared/components/list/list-item-title/index.tsx","../../src/shared/hooks/use-confirm-popover-dialog/index.tsx","../../src/pages/recording-playlists/components/duplicate-playlist-dialog/index.tsx","../../src/pages/recordings-list/components/live-recording-card/date-info/index.tsx","../../src/pages/playlists/components/playlist-duration/index.tsx","../../src/pages/playlists/components/playlist-number-of-clips/index.tsx","../../src/pages/playlists/components/playlists-list-item-details/index.tsx","../../src/pages/playlists/components/playlist-card/index.tsx","../../src/pages/playlists/components/playlists-skeleton/playlist-list-skeleton/index.tsx","../../src/pages/playlists/components/playlists-list/index.tsx","../../src/pages/playlists/components/playlists-skeleton/index.tsx","../../src/pages/playlists/PlaylistsContainer.tsx","../../src/pages/recording-edit/hooks/useGetRecording/index.ts","../../src/tagging-tool/utility/date.ts","../../src/pages/recording-edit/hooks/useUpdateRecording/index.ts","../../src/shared/components/date-selector/index.tsx","../../src/shared/components/atomize-icons/index.jsx","../../src/shared/components/radio-button/index.tsx","../../src/pages/recording-edit/components/recording-edit-form/index.tsx","../../src/pages/recording-edit/components/recording-edit-page/index.tsx","../../src/api/playlist/useFetchRecordingPlaylists/index.ts","../../src/shared/components/card/index.tsx","../../src/pages/recording-playlists/components/playlists-grid/playlist-card/index.tsx","../../src/pages/recording-playlists/components/playlists-grid/index.tsx","../../src/pages/recording-playlists/components/recording-playlists-page/index.tsx","../../src/pages/recording-playlists/components/recording-playlists-skeleton/index.tsx","../../src/pages/recording-playlists/RecordingPlaylistsContainer.tsx","../../src/api/recording/useFetchRecordings/util/transform-filters-for-request/index.ts","../../src/api/recording/useFetchRecordings/index.tsx","../../src/pages/recordings-list/components/vod-recording-card/loading/index.tsx","../../src/pages/recordings-list/components/recordings-list/loading/index.tsx","../../src/pages/recordings-list/components/recording-list-page-skeleton/index.tsx","../../src/api/recording/useFetchRecordings/util/get-initial-filters/index.ts","../../src/pages/recordings-list/components/recordings-list-page/filters-bar/annotation-type-filter/index.tsx","../../src/pages/recordings-list/components/recordings-list-page/filters-bar/hooks/useRecordingsFilters/reducer.ts","../../src/pages/recordings-list/components/recordings-list-page/filters-bar/hooks/useRecordingsFilters/index.tsx","../../src/api/recording/useDeleteLiveRecording/index.ts","../../src/shared/hooks/is-tagging-tool/index.ts","../../src/api/tactical-analysis/useInvalidateTacticalAnalysis.ts","../../src/api/tactical-analysis/useValidateTacticalAnalysis.ts","../../src/shared/types/episodes/types.ts","../../src/shared/types/teams/types.ts","../../src/shared/hooks/use-recording-validation-option/index.tsx","../../src/pages/recordings-list/components/kebab-menu-recordings/index.tsx","../../src/pages/recordings-list/components/recordings-list-item-details/index.tsx","../../src/pages/recordings-list/components/recording-card/index.tsx","../../src/shared/components/list/list-info/index.tsx","../../src/tagging-tool/utility/navigation.ts","../../src/pages/recordings-list/components/live-recording-card/competition-info/index.tsx","../../src/pages/recordings-list/components/live-recording-card/live-recording-info/index.tsx","../../src/pages/recordings-list/components/live-recording-card/match-day-info/index.tsx","../../src/pages/recordings-list/components/live-recording-card/index.tsx","../../src/pages/recordings-list/components/recordings-list/not-found/assets/tactics-not-found.svg","../../src/pages/recordings-list/components/recordings-list/not-found/index.tsx","../../src/api/recording/useDeleteRecording/index.ts","../../src/pages/recordings-list/components/vod-recording-card/recording-states/state-analysis/index.tsx","../../src/pages/recordings-list/components/vod-recording-card/recording-states/state-camera/index.tsx","../../src/pages/recordings-list/components/vod-recording-card/recording-states/state-tags/index.tsx","../../src/pages/recordings-list/components/vod-recording-card/state-info/index.tsx","../../src/pages/recordings-list/components/vod-recording-card/competition-info/index.tsx","../../src/pages/recordings-list/components/vod-recording-card/date-info/index.tsx","../../src/pages/recordings-list/components/vod-recording-card/match-day-info/index.tsx","../../src/pages/recordings-list/components/vod-recording-card/scores-info/index.tsx","../../src/pages/recordings-list/components/vod-recording-card/index.tsx","../../src/pages/recordings-list/components/recordings-list/index.tsx","../../src/pages/recordings-list/components/recordings-list-page/recording-list-with-filters/index.tsx","../../src/shared/utils/environment/index.ts","../../src/kognia/metrics/utils.ts","../../src/kognia/metrics/hooks/use-metrics/index.ts","../../src/pages/recordings-list/components/recordings-list-page/filters-bar/filters/index.tsx","../../src/pages/recordings-list/components/recordings-list-page/recording-types-tabs-and-filters/index.tsx","../../src/pages/recordings-list/components/recordings-list-page/index.tsx","../../src/pages/recordings-list/RecordingsListPageContainer.tsx","../../src/shared/types/type-of-play/types.tsx","../../src/shared/utils/group-tags-by-type/index.ts","../../src/pages/tactical-analysis/components/tactical-analysis/resize-bar/ResizeBar.styled.ts","../../src/pages/tactical-analysis/components/tactical-analysis/resize-bar/utils/apply-resize-limits.ts","../../src/pages/tactical-analysis/components/tactical-analysis/resize-bar/utils/resizer.ts","../../src/pages/tactical-analysis/components/tactical-analysis/resize-bar/utils/resizer-touch.ts","../../src/pages/tactical-analysis/components/tactical-analysis/resize-bar/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/styled.tsx","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/generateEpisodeClips.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/generateEpisodesRows.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/generateBlockContainerClip.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/sortByTitle.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/generateEventsRows.ts","../../src/shared/utils/generateRandomUUID.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/generateClips.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/getClipsForFilters.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/generateFiltersRow.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/generateFullMatchTimelineBlockFromDuration.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/getClipsFromTaggingEvent.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/generateManualTagsRows.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/sortScenarios.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/generateScenariosRows.ts","../../src/pages/tactical-analysis/types.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/getClipsFromTacticalFundamental.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/utils/generateTacticsRows.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/generateTimelineRows.ts","../../src/pages/tactical-analysis/types/tactical-analysis-playing-mode/index.ts","../../src/pages/tactical-analysis/atoms/index.ts","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-episodes/index.ts","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-match/index.ts","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-match-segments/index.ts","../../src/pages/tactical-analysis/components/tactical-analysis/utils/get-duration-from-episodes/index.ts","../../src/pages/tactical-analysis/components/tactical-analysis/utils/generate-timeline-playlist/index.ts","../../src/api/match/useMatchWithEpisodes/index.tsx","../../src/api/tagging-tool/use-fetch-tagging-events/utils/index.ts","../../src/api/tagging-tool/transformers/tagging-events/index.ts","../../src/api/tagging-tool/use-fetch-tagging-events/index.ts","../../src/pages/tactical-analysis/utils/generate-tactical-analysis-playlist-items/index.ts","../../src/pages/tactical-analysis/components/timeline/timeline-table/store/atoms.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/atoms.ts","../../src/pages/tactical-analysis/hooks/use-pin-scenarios/index.ts","../../src/pages/tactical-analysis/hooks/use-preset-playing-mode/index.ts","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-applied-filters/index.ts","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-selected-tactics/index.ts","../../src/pages/tactical-analysis/hooks/use-timeline-ball-possession/index.ts","../../src/pages/tactical-analysis/hooks/use-timeline-headers-width/index.ts","../../src/pages/tactical-analysis/hooks/use-timeline-height/index.ts","../../src/pages/tactical-analysis/hooks/use-timeline-initial-time/index.ts","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-teams/index.ts","../../src/pages/tactical-analysis/hooks/use-timeline-team-id-focus/index.ts","../../src/shared/components/range-slider/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/zoom-range/ZoomRage.styled.ts","../../src/pages/tactical-analysis/components/tactical-analysis/zoom-range/index.tsx","../../src/pages/tactical-analysis/hooks/use-timeline-zoom-level/index.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/use-tactical-analysis-presets/index.tsx","../../src/api/recording/use-tactical-analysis-filtered-items/index.ts","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-available-filters/index.ts","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-filters-results/index.ts","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-id/index.ts","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-mode/index.ts","../../src/pages/tactical-analysis/api/use-tactical-analysis-data/index.ts","../../src/pages/tactical-analysis/hooks/use-timeline-table-data/index.ts","../../src/pages/tactical-analysis/hooks/use-timeline-tactics/index.ts","../../src/pages/tactical-analysis/hooks/use-generate-timeline-playlist/index.tsx","../../src/pages/tactical-analysis/hooks/use-timeline-playing-mode/index.ts","../../src/pages/tactical-analysis/components/tactical-analysis/timeline-overlays-selector-panel/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/tactical-analysis-video-player/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary-item/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters/default.ts","../../src/pages/tactical-analysis/components/tactical-analysis/utils/find-team-by-id/index.ts","../../src/shared/components/active-filter-team/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary/events-ending-episode-summary/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary/events-starting-episode-summary/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary/scenarios-inside-episode-summary/fundamentals-summary/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary/scenarios-inside-episode-summary/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters/components/filters-bar-summary/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters/components/filters-modal/styled.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters/components/filters-modal/index.tsx","../../src/pages/tactical-analysis/utils/create-video-sources-from-clips/utils.ts","../../src/pages/tactical-analysis/utils/create-video-sources-from-clips/index.ts","../../src/pages/tactical-analysis/hooks/use-selection-playing/index.ts","../../src/pages/tactical-analysis/components/tactical-analysis/filters/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters-bar/export-button/export-modal/ExportModal.styled.ts","../../src/api/video-sources/use-download-effective-time-videos/useDownloadEffectiveTimeVideos.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters-bar/export-button/export-modal/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters-bar/export-button/export-video-modal/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters-bar/export-button/export-xml-modal/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters-bar/export-button/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/filters-bar/FiltersBar.styled.ts","../../src/pages/tactical-analysis/hooks/use-timeline-is-multiselect-mode-active/index.ts","../../src/pages/tactical-analysis/components/tactical-analysis/filters-bar/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/add-to-playlist-menu-state/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/add-to-playlist-menu-state/hooks/index.ts","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/add-to-playlist-menu-state/atoms/index.ts","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/AddToPlaylistMenu.styled.ts","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/current-playlist-menu/styled.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/current-playlist-menu/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/playlist-items-selector-menu/PlaylistItemsSelectorMenu.styled.ts","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/playlist-items-selector-menu/selected-playslist-item/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/playlist-items-selector-menu/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/playlist-selector-menu/PlaylistSelectorMenu.styled.ts","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/playlist-selector-menu/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/unsaved-changes-dialog/UnsavedChangesDialog.styled.ts","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/unsaved-changes-dialog/index.tsx","../../src/pages/tactical-analysis/hooks/use-get-selected-clips/useGetSelectedClips.ts","../../src/pages/tactical-analysis/components/timeline/timeline-table/hooks/use-generate-playlist-item-name/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/index.tsx","../../src/shared/hooks/use-map-clips-to-post-playlist-items/useMapClipsToPlaylistItems.ts","../../src/pages/tactical-analysis/hooks/use-add-to-playlist-validator/useAddToPlaylistValidator.ts","../../src/pages/tactical-analysis/components/timeline/overlapping-clips-modal/OverlappingClipsModal.tsx","../../src/pages/tactical-analysis/components/timeline/add-to-playlist-menu-timeline/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/utils/adjust-time-by-zoom-level/index.ts","../../src/pages/tactical-analysis/components/timeline/config.ts","../../src/pages/tactical-analysis/components/timeline/timeline-table/hooks/use-generate-timeline-width/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/timeline-css-variables/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/clip/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/hooks/use-row-team/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/parent-clip/ParentClip.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/block-clips-list/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/clip-block-container/index.tsx","../../src/pages/tactical-analysis/hooks/useTimelineConfigs/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/clip-episode/ClipEpisode.styled.ts","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/clip-episode/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/no-effective-time-clips-list/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/clip-not-effective-time/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/clip-timeline/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/episodes-clips/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/episodes-row/index.tsx","../../src/pages/tactical-analysis/utils/get-row-total-clips/index.ts","../../src/pages/tactical-analysis/utils/has-filters-results/index.ts","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/clips-list/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/TimelineTable.styled.ts","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-content-container/RowContentContainer.styled.ts","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-content-container/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-content/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/filters-content-row/index.tsx","../../src/shared/components/vertical-separator/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-header-container/RowHeaderContainer.styled.ts","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-header-container/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-header-content/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-header-total/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-headers-group/util.ts","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-scenarios-content/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/team-row-highlight/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-header-scenario/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-header-tactic/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-header/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/filters-headers-row/index.tsx","../../src/shared/components/chevron/index.tsx","../../src/shared/components/icons/icon-pin/index.tsx","../../src/shared/components/icons/icon-pin-solid/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-group-list/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-headers-group/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-groups-list/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-headers-content/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-headers-resize-bar/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/rows-content/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/rows-content-container/RowsContentContainer.styled.ts","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-group-rows/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-content-group/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-groups/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/rows-content-container/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/rows-content-inner/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/rows-headers/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/scenarios-row-group-content/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/scenarios-row-group-header/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/timeline-content-header-container/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/hooks/use-jump-to-time-in-match/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/hooks/use-timeline-events-handlers/index.tsx","../../src/shared/components/icons/icon-select/index.tsx","../../src/shared/components/icons/icon-select-all/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/clip-actions/ClipActions.styled.ts","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/clip-actions/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/row-actions/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/components/timeline-table-wrapper/index.tsx","../../src/pages/tactical-analysis/hooks/use-is-timeline-ready-to-render/index.ts","../../src/pages/tactical-analysis/utils/get-play-head-position-by-time/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/hooks/use-sync-row-content/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/hooks/use-play-head-position-in-timeline/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/hooks/use-sync-height/index.tsx","../../src/pages/tactical-analysis/hooks/use-timeline-wheel-zoom/index.tsx","../../src/pages/tactical-analysis/components/timeline/effective-time-separators/EffectiveTimeSeparator.styled.ts","../../src/pages/tactical-analysis/components/timeline/effective-time-separators/index.tsx","../../src/pages/tactical-analysis/components/timeline/filter-highlights/FilterHighlights.styled.ts","../../src/pages/tactical-analysis/components/timeline/filter-highlights/index.tsx","../../src/pages/tactical-analysis/components/timeline/play-head/play-head-shadow/atoms.ts","../../src/pages/tactical-analysis/components/timeline/play-head/PlayHead.styled.ts","../../src/pages/tactical-analysis/components/timeline/play-head/play-head-shadow/index.tsx","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-timeline-time/index.tsx","../../src/pages/tactical-analysis/components/timeline/play-head/index.tsx","../../src/pages/tactical-analysis/components/timeline/time-ruler/time-ruler-block-container/TimeRulerBlockContainer.styled.ts","../../src/pages/tactical-analysis/components/timeline/time-ruler/time-ruler-block-container/index.tsx","../../src/pages/tactical-analysis/components/timeline/time-ruler/time-ruler-effective-time/index.tsx","../../src/pages/tactical-analysis/components/timeline/time-ruler/time-ruler-full-time/index.tsx","../../src/pages/tactical-analysis/components/timeline/time-ruler/index.tsx","../../src/shared/components/icons/icon-no-ball/index.tsx","../../src/shared/components/team-logo/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-controls/playing-mode-toggle/index.tsx","../../src/shared/utils/get-css-variables/index.ts","../../src/pages/tactical-analysis/hooks/use-team-color/index.ts","../../src/pages/tactical-analysis/components/timeline/timeline-controls/index.tsx","../../src/pages/tactical-analysis/components/timeline/timeline-table/index.tsx","../../src/pages/tactical-analysis/components/timeline/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/index.tsx","../../src/pages/tactical-analysis/components/tactical-analysis/tactical-analysis-page-skeleton/styled.ts","../../src/pages/tactical-analysis/components/tactical-analysis/tactical-analysis-page-skeleton/index.tsx","../../src/pages/tactical-analysis/hooks/use-tactical-analysis-page/index.ts","../../src/pages/tactical-analysis/TacticalAnalysisContainer.tsx","../../src/pages/tagging-tool-keypad-edit/components/keypad-edit/index.styled.ts","../../src/tagging-tool/utility/uuid.ts","../../src/tagging-tool/model/Keypad.ts","../../src/tagging-tool/service/storage.ts","../../src/tagging-tool/container/base.tsx","../../src/tagging-tool/container/serviceError.tsx","../../src/tagging-tool/service/base.ts","../../src/tagging-tool/service/keypad.service.ts","../../src/tagging-tool/utility/hotkeys.ts","../../src/pages/tagging-tool-keypad-edit/components/keypad-edit/state.tsx","../../src/pages/tagging-tool-keypad-edit/components/custom-buttons/components/custom-buttons-box/styled.ts","../../src/pages/tagging-tool-keypad-edit/components/custom-buttons-skeleton/index.styled.ts","../../src/pages/tagging-tool-keypad-edit/components/custom-buttons-skeleton/index.tsx","../../src/shared/components/dot/index.tsx","../../src/pages/tagging-tool-keypad-edit/components/EventButton/state.ts","../../src/pages/tagging-tool-keypad-edit/components/EventButton/EventButton.tsx","../../src/pages/tagging-tool-keypad-edit/components/custom-buttons/components/custom-buttons-box/index.tsx","../../src/pages/tagging-tool-keypad-edit/components/custom-buttons/index.tsx","../../src/pages/tagging-tool-keypad-edit/components/keypad-goal/index.tsx","../../src/shared/components/form/form-input-label/index.tsx","../../src/pages/tagging-tool-keypad-edit/components/keypad-tag-form-modal/index.styled.ts","../../src/pages/tagging-tool-keypad-edit/components/keypad-tag-form-modal/types.ts","../../src/pages/tagging-tool-keypad-edit/components/hot-key-input/HotkeyInput.tsx","../../src/pages/tagging-tool-keypad-edit/components/keypad-tag-form-modal/index.tsx","../../src/shared/components/dialog-new/dialog-content-text/index.tsx","../../src/pages/tagging-tool-keypad-edit/components/remove-button-modal/index.tsx","../../src/pages/tagging-tool-keypad-edit/components/keypad-edit/index.tsx","../../src/pages/tagging-tool-keypad-edit/index.tsx","../../src/shared/components/page-sub-title/index.tsx","../../src/shared/components/page-title/index.tsx","../../src/pages/tagging-tool-keypad-list/components/keypad-list/components/keypad-list-item/index.styled.tsx","../../src/pages/tagging-tool-keypad-list/components/keypad-list/components/keypad-list-item/index.tsx","../../src/pages/tagging-tool-keypad-list/components/keypad-list/components/keypad-name-modal/index.tsx","../../src/pages/tagging-tool-keypad-list/components/keypad-list/components/keypad-remove-modal/index.tsx","../../src/pages/tagging-tool-keypad-list/components/keypad-list/index.styled.tsx","../../src/tagging-tool/utility/arrays.ts","../../src/pages/tagging-tool-keypad-list/components/keypad-list/state.ts","../../src/pages/tagging-tool-keypad-list/components/keypad-list/styled.ts","../../src/pages/tagging-tool-keypad-list/components/keypad-list/KeypadListScreen.tsx","../../src/pages/tagging-tool-keypad-list/index.tsx","../../src/api/tagging-tool/use-create-tagging-event/index.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-recording-screen/hooks/use-create-tagging-event-from-current-video/index.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-recording-screen/styled.ts","../../src/api/tagging-tool/transformers/keypads/index.ts","../../src/api/tagging-tool/use-fetch-keypad/index.ts","../../src/api/tagging-tool/use-fetch-keypads/index.ts","../../src/pages/tagging-tool-tag-recording/hooks/use-keypads/index.tsx","../../src/pages/tagging-tool-tag-recording/components/clip-player-dialog/styled.ts","../../src/pages/tagging-tool-tag-recording/components/clip-player-dialog/index.tsx","../../src/pages/tagging-tool-tag-recording/components/clip-trimmer/styled.ts","../../src/tagging-tool/utility/sanitizer.ts","../../src/tagging-tool/service/taggingEvent.service.ts","../../src/pages/tagging-tool-tag-recording/components/clip-trimmer/index.tsx","../../src/pages/tagging-tool-tag-recording/components/keypads-panel/components/keypad-section/styled.ts","../../src/pages/tagging-tool-tag-recording/components/keypads-panel/components/keypad-section/index.tsx","../../src/pages/tagging-tool-tag-recording/components/keypads-panel/styled.ts","../../src/pages/tagging-tool-tag-recording/components/tag-button/Button.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-button/TagButtonBase.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-button/LiveStreamTagButton.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-button/RecordingTagButton.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-button/TagButton.tsx","../../src/pages/tagging-tool-tag-recording/components/keypads-panel/index.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-filters-dialog/styled.ts","../../src/pages/tagging-tool-tag-recording/components/tag-filters-dialog/tag-filter-type/index.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-filters-dialog/index.tsx","../../src/shared/components/action-icon/index.tsx","../../src/pages/tagging-tool-tag-recording/components/import-uploader/index.styled.ts","../../src/pages/tagging-tool-tag-recording/components/tag-event-clip-actions/styled.ts","../../src/pages/tagging-tool-tag-recording/components/tag-event-clip-actions/index.tsx","../../src/pages/tagging-tool-tag-recording/components/import-uploader/index.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-recording-actions/index.tsx","../../src/shared/components/sort-by/index.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-recording-filters/index.tsx","../../src/shared/components/type-counter/styled.ts","../../src/shared/components/type-counter/index.tsx","../../src/shared/utils/get-icon-play-color/index.tsx","../../src/shared/utils/tagging-event-clip-type/index.ts","../../src/pages/tagging-tool-tag-recording/components/tag-event-clip/styled.ts","../../src/pages/tagging-tool-tag-recording/components/tag-event-clip-menu/index.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-event-clip/index.tsx","../../src/pages/tagging-tool-tag-recording/components/tagging-events-list/styled.ts","../../src/pages/tagging-tool-tag-recording/components/tag-events-list-skeleton/styled.ts","../../src/pages/tagging-tool-tag-recording/components/tag-events-list-skeleton/index.tsx","../../src/pages/tagging-tool-tag-recording/components/tagging-events-list/index.tsx","../../src/pages/tagging-tool-tag-recording/components/tag-recording-screen/index.tsx","../../src/api/tagging-tool/use-fetch-live-session-as-match/index.ts","../../src/pages/tagging-tool-tag-recording/hooks/use-tagging-tool-tag-recording-data/index.tsx","../../src/pages/tagging-tool-tag-recording/hooks/use-tagging-tool-tag-recording-page/index.ts","../../src/pages/tagging-tool-tag-recording/utils/index.ts","../../src/pages/tagging-tool-tag-recording/TaggingToolTagContainer.tsx","../../src/kognia/metrics/hooks/use-set-user-and-client-id-for-metrics/index.tsx","../../src/shared/utils/redirect-to-external-login/index.ts","../../src/shared/components/protected-route/index.tsx","../../src/kognia/i18n/hooks/use-is-language-detection-ready/index.tsx","../../src/pages/backoffice/components/backoffice-protected-route/index.styled.ts","../../src/pages/backoffice/api/routes.ts","../../src/pages/backoffice/api/use-is-google-authorized/index.tsx","../../src/pages/backoffice/utils/redirect-to-google-login/index.ts","../../src/pages/backoffice/components/backoffice-protected-route/index.tsx","../../src/shared/components/icons/icon-system-admin/index.tsx","../../src/pages/backoffice/components/backoffice-sidebar-layout/index.styled.tsx","../../src/pages/backoffice/hooks/use-backoffice-sidebar/index.tsx","../../src/pages/backoffice/components/backoffice-sidebar-layout/index.tsx","../../src/api/backoffice/user/use-add-clients-to-users/index.tsx","../../src/api/backoffice/user/use-kognia-users/types.ts","../../src/pages/backoffice/pages/add-user-to-environment/utils/add-users-to-clients-form/index.ts","../../src/pages/backoffice/components/backoffice-content-container/index.tsx","../../src/api/hooks/useInfinityQuery/utils.ts","../../src/api/hooks/useInfinityQuery/index.ts","../../src/shared/utils/choose-next-cursor-value/index.ts","../../src/api/backoffice/client/transformer.ts","../../src/api/backoffice/client/hooks/use-clients/useClients.tsx","../../src/shared/components/autocomplete-multi-select/components/autocomplete-active-filter/index.tsx","../../src/shared/components/autocomplete-multi-select/components/autocomplete-dropdown-button/index.tsx","../../src/shared/components/autocomplete-multi-select/components/autocomplete-popper/index.tsx","../../src/shared/components/autocomplete-multi-select/components/autocomplete-popper-wrapper/index.tsx","../../src/shared/components/autocomplete-multi-select/components/autocomplete-result/index.tsx","../../src/shared/components/autocomplete-multi-select/components/autocomplete-results-wrapper/index.tsx","../../src/shared/components/autocomplete-multi-select/components/autocomplete-tag/index.tsx","../../src/pages/backoffice/components/select-clients/use-sync-clients-selection/index.tsx","../../src/pages/backoffice/components/select-clients/index.tsx","../../src/api/backoffice/user/transformer.ts","../../src/api/backoffice/user/use-kognia-users/index.tsx","../../src/pages/backoffice/components/select-users/index.tsx","../../src/pages/backoffice/pages/add-user-to-environment/AddUserToEnvironmentContainer.tsx","../../src/pages/backoffice/utils/get-query-params/index.ts","../../src/pages/backoffice/api/use-allowed-backoffice-origin/index.tsx","../../src/pages/backoffice/api/utils.ts","../../src/pages/backoffice/api/operations/use-annotation-task/index.tsx","../../src/pages/backoffice/pages/annotation/utils/form-fields-validation/types.ts","../../src/pages/backoffice/api/types.ts","../../src/pages/backoffice/pages/annotation/utils/form-fields-validation/index.tsx","../../src/pages/backoffice/pages/annotation/components/annotation-form-actions/index.tsx","../../src/shared/components/form/styled.tsx","../../src/shared/components/form/form-field/index.tsx","../../src/shared/components/form/form-select-field/index.tsx","../../src/shared/components/form/get-type-options/index.tsx","../../src/pages/backoffice/pages/annotation/components/form-fields/annotation-tool-field/index.tsx","../../src/shared/components/form/form-input-field/index.tsx","../../src/pages/backoffice/pages/annotation/components/form-fields/end-ix-field/index.tsx","../../src/pages/backoffice/pages/annotation/components/form-fields/start-ix-field/index.tsx","../../src/pages/backoffice/pages/annotation/components/form-fields/index-type-group/index.tsx","../../src/pages/backoffice/pages/annotation/components/form-fields/pipeline-type-field/index.tsx","../../src/pages/backoffice/pages/annotation/components/form-fields/recording-id-field/index.tsx","../../src/pages/backoffice/pages/annotation/components/form-fields/task-type-field/index.tsx","../../src/pages/backoffice/pages/annotation/components/annotations-task/index.tsx","../../src/pages/backoffice/api/operations/use-create-task/index.tsx","../../src/shared/components/form/form-switch-field/index.tsx","../../src/pages/backoffice/pages/annotation/components/form-fields/load-annotations-field/index.tsx","../../src/pages/backoffice/pages/annotation/components/create-task/index.tsx","../../src/pages/backoffice/pages/annotation/components/delete-episode-overlays/form.ts","../../src/pages/backoffice/api/operations/use-delete-episode-overlays/index.ts","../../src/pages/backoffice/pages/annotation/components/form-fields/episode-index-field/index.tsx","../../src/pages/backoffice/pages/annotation/components/delete-episode-overlays/index.tsx","../../src/pages/backoffice/api/operations/use-delete-task/index.tsx","../../src/pages/backoffice/pages/annotation/components/delete-task/index.tsx","../../src/pages/backoffice/api/operations/use-labels-task/index.tsx","../../src/pages/backoffice/pages/annotation/components/labels-task/index.tsx","../../src/pages/backoffice/pages/annotation/components/process-episode/form.ts","../../src/pages/backoffice/api/operations/use-process-episode/index.ts","../../src/pages/backoffice/pages/annotation/components/process-episode/index.tsx","../../src/pages/backoffice/api/operations/use-reprocess-sync/index.ts","../../src/pages/backoffice/pages/annotation/components/reprocess-sync/index.tsx","../../src/pages/backoffice/api/operations/use-reprocess-third-party-events/index.ts","../../src/pages/backoffice/pages/annotation/components/reprocess-third-party-events/index.tsx","../../src/pages/backoffice/api/operations/use-validate-task/index.tsx","../../src/pages/backoffice/pages/annotation/components/form-fields/dry-run-field/index.tsx","../../src/pages/backoffice/pages/annotation/components/validate-task/index.tsx","../../src/pages/backoffice/pages/annotation/Annotation.tsx","../../src/pages/backoffice/api/season-clients/transformer.ts","../../src/pages/backoffice/api/season-clients/use-season-clients/index.tsx","../../src/shared/components/confirm-dialog/index.tsx","../../src/pages/backoffice/pages/associate-season-with-clients/components/season-clients-item/styled.ts","../../src/pages/backoffice/api/season-clients/use-delete-season-clients/index.tsx","../../src/pages/backoffice/pages/associate-season-with-clients/components/season-clients-form/types.ts","../../src/pages/backoffice/api/season-clients/use-create-season-clients/index.tsx","../../src/pages/backoffice/api/season-clients/use-update-season-clients/index.tsx","../../src/pages/backoffice/pages/stages/components/select-season/use-on-change-season-selection/index.tsx","../../src/pages/backoffice/api/stages/use-stages/transformer.ts","../../src/pages/backoffice/api/seasons/transformers.ts","../../src/pages/backoffice/api/seasons/use-seasons/index.ts","../../src/pages/backoffice/components/select-components/render-option.tsx","../../src/pages/backoffice/utils/print-season-name/index.ts","../../src/pages/backoffice/pages/stages/components/select-season/index.tsx","../../src/pages/backoffice/pages/associate-season-with-clients/components/search-results/index.tsx","../../src/pages/backoffice/pages/associate-season-with-clients/components/select-client/index.tsx","../../src/pages/backoffice/pages/associate-season-with-clients/components/season-clients-form/index.tsx","../../src/pages/backoffice/types/seasons.ts","../../src/pages/backoffice/pages/associate-season-with-clients/components/season-clients-form/form.ts","../../src/pages/backoffice/pages/associate-season-with-clients/components/season-clients-modal/index.tsx","../../src/pages/backoffice/pages/associate-season-with-clients/components/season-clients-item/index.tsx","../../src/pages/backoffice/pages/associate-season-with-clients/components/season-clients-list/index.tsx","../../src/pages/backoffice/pages/associate-season-with-clients/styled.ts","../../src/pages/backoffice/components/list-skeleton/index.tsx","../../src/pages/backoffice/pages/associate-season-with-clients/index.tsx","../../src/pages/backoffice/api/coaches/use-coaches/transformer.ts","../../src/pages/backoffice/api/coaches/use-coaches/index.ts","../../src/pages/backoffice/api/coaches/use-create-coach/index.tsx","../../src/pages/backoffice/api/coaches/use-update-coach/index.tsx","../../src/shared/components/form/form-form-label/index.tsx","../../src/pages/backoffice/pages/coaches/components/coach-form/types.ts","../../src/pages/backoffice/pages/coaches/components/coach-form/index.tsx","../../src/pages/backoffice/pages/coaches/components/coach-form/form.ts","../../src/pages/backoffice/pages/coaches/components/coach-photo-preview/styled.ts","../../src/pages/backoffice/pages/coaches/components/coach-photo/styled.ts","../../src/pages/backoffice/pages/coaches/components/coach-photo/index.tsx","../../src/pages/backoffice/pages/coaches/components/coach-photo-skeleton/styled.ts","../../src/pages/backoffice/pages/coaches/components/coach-photo-skeleton/index.tsx","../../src/pages/backoffice/pages/coaches/components/coach-photo-preview/index.tsx","../../src/pages/backoffice/pages/coaches/components/coach-modal/index.tsx","../../src/pages/backoffice/pages/coaches/components/coach-item/styled.ts","../../src/pages/backoffice/api/coaches/use-delete-coach/index.tsx","../../src/pages/backoffice/pages/coaches/components/coach-item/index.tsx","../../src/pages/backoffice/pages/coaches/components/coaches-list/index.tsx","../../src/pages/backoffice/pages/coaches/index.tsx","../../src/pages/backoffice/api/competitions/use-competitions/transformer.ts","../../src/pages/backoffice/api/competitions/use-competitions/index.ts","../../src/pages/backoffice/api/competitions/use-create-competition/index.tsx","../../src/pages/backoffice/api/competitions/use-update-competition/index.tsx","../../src/pages/backoffice/pages/competitions/components/competition-form/types.ts","../../src/pages/backoffice/pages/competitions/components/competition-form/index.tsx","../../src/pages/backoffice/pages/competitions/components/competition-form/form.ts","../../src/pages/backoffice/pages/competitions/components/competition-modal/index.tsx","../../src/pages/backoffice/pages/competitions/components/competition-item/styled.ts","../../src/pages/backoffice/api/competitions/use-delete-competition/index.tsx","../../src/pages/backoffice/pages/competitions/components/competition-item/index.tsx","../../src/pages/backoffice/pages/competitions/components/competitions-list/index.tsx","../../src/pages/backoffice/pages/competitions/index.tsx","../../src/api/backoffice/client/hooks/use-create-client/useCreateClient.tsx","../../src/shared/utils/get-error-by-field-name/getErrorByFieldName.ts","../../src/pages/backoffice/features/environment-form/utils/environmentFormFieldsNames.ts","../../src/pages/backoffice/features/environment-form/utils/environmentFormLabels.ts","../../src/pages/backoffice/features/environment-form/utils/environmentFormSchema.ts","../../src/pages/backoffice/utils/countries.ts","../../src/pages/backoffice/features/environment-form/utils/generateEnvironmentFormFields.ts","../../src/pages/backoffice/features/environment-form/EnvironmentForm.feature.tsx","../../src/pages/backoffice/pages/create-environment/CreateEnvironment.page.tsx","../../src/api/backoffice/client/utils/transformClient.ts","../../src/api/backoffice/client/hooks/use-create-branding/useCreateBranding.ts","../../src/pages/backoffice/features/branding-form/BrandingForm.styled.ts","../../src/pages/backoffice/features/branding-form/utils/brandingFormFieldsNames.ts","../../src/pages/backoffice/features/branding-form/utils/brandingFormLabels.ts","../../src/pages/backoffice/features/branding-form/utils/brandingFormOptionalSchema.ts","../../src/pages/backoffice/features/branding-form/utils/generateBrandingFormFields.ts","../../src/pages/backoffice/features/branding-form/BrandingForm.feature.tsx","../../src/pages/backoffice/pages/create-environment-branding/CreateEnvironmentBranding.page.tsx","../../src/api/utils/backend-api-error-parser.ts","../../src/api/backoffice/user/use-create-user/index.tsx","../../src/pages/backoffice/pages/create-user/utils/create-user-form/index.ts","../../src/pages/backoffice/pages/create-user/CreateUserContainer.tsx","../../src/api/backoffice/client/hooks/use-edit-client/useEditClient.tsx","../../src/pages/backoffice/pages/edit-environment/EditEnvironment.page.tsx","../../src/api/backoffice/client/hooks/use-edit-branding/useEditBranding.ts","../../src/pages/backoffice/pages/edit-environment-branding/EditEnvironmentBranding.page.tsx","../../src/api/backoffice/client/hooks/use-remove-branding/useRemoveBranding.ts","../../src/pages/backoffice/pages/environment-detail/EnvironmentDetail.page.tsx","../../src/pages/backoffice/pages/environments/components/environment-item-column/EnvironmentItemColumn.tsx","../../src/shared/components/icons/icon-eye/index.tsx","../../src/pages/backoffice/pages/environments/components/environment-item/EnvironmentItem.tsx","../../src/pages/backoffice/pages/environments/components/environments-list/EnvironmentsList.tsx","../../src/pages/backoffice/pages/environments/Environments.page.tsx","../../src/pages/backoffice/api/games/transformers.ts","../../src/pages/backoffice/api/games/use-metadata-game/index.ts","../../src/pages/backoffice/api/games/use-metadata-games/index.ts","../../src/pages/backoffice/api/recordings/use-metadata-recordings/index.tsx","../../src/pages/backoffice/api/recordings/use-create-metadata-recording/index.tsx","../../src/pages/backoffice/api/games/use-update-recording/index.tsx","../../src/pages/backoffice/pages/games/styled.ts","../../src/pages/backoffice/pages/games/components/grid-list-item-recording/index.tsx","../../src/pages/backoffice/pages/games/components/game-recording/index.tsx","../../src/pages/backoffice/pages/games/components/game-recordings-list/index.tsx","../../src/pages/backoffice/pages/games/components/metadata-game-item/add-recording-id-dialog/utils.ts","../../src/pages/backoffice/pages/games/components/metadata-game-item/add-recording-id-dialog/add-recording-id-dialog-form/index.tsx","../../src/pages/backoffice/pages/games/components/metadata-game-item/add-recording-id-dialog/index.tsx","../../src/pages/backoffice/pages/games/components/metadata-game-item/styled.ts","../../src/pages/backoffice/api/games/use-delete-metadata-game/index.tsx","../../src/pages/backoffice/pages/players/components/player-photo-skeleton/styled.ts","../../src/pages/backoffice/pages/players/components/player-photo-skeleton/index.tsx","../../src/pages/backoffice/pages/games/components/metadata-game-item/index.tsx","../../src/pages/backoffice/pages/games/components/metadata-game-list/index.tsx","../../src/pages/backoffice/pages/games/game-form/atoms.ts","../../src/pages/backoffice/pages/games/game-form/config.ts","../../src/pages/backoffice/pages/games/index.tsx","../../src/pages/backoffice/pages/games/edit-game/index.tsx","../../src/pages/backoffice/api/use-players-mappings/index.tsx","../../src/pages/backoffice/pages/games/game-form/steps/game-summary/index.tsx","../../src/pages/backoffice/pages/games/game-form/components/game-form-navigation/index.tsx","../../src/pages/backoffice/pages/games/game-form/components/game-form-stepper/index.tsx","../../src/pages/backoffice/pages/games/game-form/components/game-info-form/texts-with-field-hover-label/index.tsx","../../src/pages/backoffice/api/games/use-add-players-to-game/index.tsx","../../src/pages/backoffice/api/games/use-create-metadata-game/index.tsx","../../src/pages/backoffice/types/shared.ts","../../src/pages/backoffice/pages/games/game-form/components/game-info-form/use-create-new-game-with-players/index.tsx","../../src/pages/backoffice/api/games/use-delete-metadata-game-players/index.tsx","../../src/pages/backoffice/api/games/use-update-metadata-game/index.tsx","../../src/pages/backoffice/pages/games/game-form/components/game-info-form/use-update-new-game-with-players/index.tsx","../../src/pages/backoffice/components/select-coach/index.tsx","../../src/pages/backoffice/api/venues/use-venues/transformer.ts","../../src/pages/backoffice/api/venues/use-venues/index.ts","../../src/pages/backoffice/components/select-venue/index.tsx","../../src/pages/backoffice/api/stages/use-stages/index.ts","../../src/pages/backoffice/api/stages/use-create-stage/index.tsx","../../src/pages/backoffice/api/stages/use-update-stage/index.tsx","../../src/pages/backoffice/pages/stages/components/stage-form/types.ts","../../src/pages/backoffice/api/seasons/use-season/index.tsx","../../src/pages/backoffice/pages/stages/utils.ts","../../src/pages/backoffice/pages/stages/components/stage-form/index.tsx","../../src/shared/utils/zod/number-text-field.ts","../../src/pages/backoffice/pages/stages/components/stage-form/form.ts","../../src/pages/backoffice/components/stage-modal/index.tsx","../../src/pages/backoffice/api/venues/use-venues/types.ts","../../src/pages/backoffice/types/games.ts","../../src/pages/backoffice/types/players.ts","../../src/pages/backoffice/pages/games/game-form/forms.ts","../../src/pages/backoffice/pages/games/game-form/components/game-info-form/index.tsx","../../src/pages/backoffice/pages/games/game-form/steps/game-info-form/index.tsx","../../src/pages/backoffice/pages/games/game-form/utils.ts","../../src/pages/backoffice/pages/games/game-form/components/player-list/player-list-header/index.tsx","../../src/shared/components/icons/icon-remove/index.tsx","../../src/pages/backoffice/pages/players/components/player-photo/styled.ts","../../src/pages/backoffice/pages/players/components/player-photo/player-photo.tsx","../../src/pages/backoffice/pages/games/game-form/components/selected-players/utils.ts","../../src/pages/backoffice/pages/games/game-form/components/selected-players/selected-player-item/index.tsx","../../src/pages/backoffice/pages/games/game-form/components/selected-players/selected-players-list/index.tsx","../../src/pages/backoffice/pages/games/game-form/components/selected-players/index.tsx","../../src/pages/backoffice/pages/games/game-form/components/team-form/utils/get-latest-players-from-games/index.ts","../../src/pages/backoffice/api/teams/transformers.ts","../../src/pages/backoffice/api/teams/use-team/index.tsx","../../src/pages/backoffice/api/players/use-players/transformer.ts","../../src/pages/backoffice/api/players/use-create-player/index.tsx","../../src/pages/backoffice/api/players/use-players/index.ts","../../src/pages/backoffice/pages/players/components/player-form/types.ts","../../src/pages/backoffice/pages/players/components/player-form/index.tsx","../../src/pages/backoffice/pages/players/components/player-form/form.ts","../../src/pages/backoffice/pages/players/components/player-photo-preview/styled.ts","../../src/pages/backoffice/pages/players/components/player-photo-preview/index.tsx","../../src/pages/backoffice/components/create-player-modal/index.tsx","../../src/pages/backoffice/api/teams/use-teams/index.ts","../../src/pages/backoffice/api/use-create-backoffice-team/index.tsx","../../src/pages/backoffice/pages/teams/components/team-form/types.ts","../../src/pages/backoffice/pages/teams/components/team-form/form.ts","../../src/pages/backoffice/pages/teams/components/team-form/index.tsx","../../src/pages/backoffice/components/create-team-modal/index.tsx","../../src/pages/backoffice/hooks/use-metadata-game-queries/index.ts","../../src/pages/backoffice/pages/games/game-form/components/last-games-players-selector/index.tsx","../../src/shared/components/autocomplete-multi-select/components/autocomplete-player-result/index.tsx","../../src/pages/backoffice/pages/games/game-form/components/select-metadata-players/index.tsx","../../src/pages/backoffice/pages/games/game-form/components/select-metadata-team/index.tsx","../../src/pages/backoffice/pages/games/game-form/components/team-form/index.tsx","../../src/pages/backoffice/pages/games/game-form/steps/home-team-form/index.tsx","../../src/pages/backoffice/pages/games/game-form/steps/opponent-team-form/index.tsx","../../src/pages/backoffice/components/backoffice-section-header/index.tsx","../../src/pages/backoffice/pages/games/game-form/index.tsx","../../src/pages/backoffice/pages/games/new-game/index.tsx","../../src/pages/backoffice/api/players/use-edit-player/index.tsx","../../src/pages/backoffice/pages/players/components/edit-player-modal/index.tsx","../../src/pages/backoffice/pages/players/components/player-details-modal/index.tsx","../../src/pages/backoffice/pages/players/components/players-list/styled.ts","../../src/pages/backoffice/pages/players/components/player-item/index.tsx","../../src/pages/backoffice/pages/players/components/players-list/index.tsx","../../src/pages/backoffice/pages/players/components/players-list-skeleton/index.tsx","../../src/pages/backoffice/pages/players/index.tsx","../../src/pages/backoffice/entities/process-game/types/processGame.types.ts","../../src/pages/backoffice/features/process-game/PresetSelector.tsx","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/types/processGameFormSubforms.types.ts","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/types/processGameForm.types.ts","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/config/ProcessGameForm.config.ts","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/components/BundesligaForm.tsx","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/components/ChyronHegoForm.tsx","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/components/HawkeyeForm.tsx","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/components/OptaForm.tsx","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/components/SecondSpectrumForm.tsx","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/components/SignalityForm.tsx","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/components/SportlogiqForm.tsx","../../src/pages/backoffice/api/operations/use-process-game/index.ts","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/utils/is-event-file.ts","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/utils/is-tracking-file.ts","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/hooks/useHandleProcessGameSubmit.tsx","../../src/pages/backoffice/widgets/process-game/ProcessGameForm/ProcessGameForm.widget.tsx","../../src/pages/backoffice/pages/process-game/ProcessGame.page.tsx","../../src/pages/backoffice/api/seasons/use-create-season/index.tsx","../../src/pages/backoffice/api/seasons/use-update-season/index.tsx","../../src/pages/backoffice/pages/season-competitions/components/season-competition-form/types.ts","../../src/pages/backoffice/utils/years.ts","../../src/pages/backoffice/pages/season-competitions/components/search-results/index.tsx","../../src/pages/backoffice/pages/season-competitions/components/select-competition/index.tsx","../../src/pages/backoffice/pages/season-competitions/components/season-competition-form/index.tsx","../../src/pages/backoffice/pages/season-competitions/components/season-competition-form/form.ts","../../src/pages/backoffice/pages/season-competitions/components/season-competition-modal/index.tsx","../../src/pages/backoffice/pages/season-competitions/components/season-competition-item/season-competition-stages/index.tsx","../../src/pages/backoffice/pages/season-competitions/components/season-competition-item/styled.ts","../../src/pages/backoffice/api/seasons/use-delete-season/index.tsx","../../src/pages/backoffice/pages/season-competitions/components/season-competition-item/index.tsx","../../src/pages/backoffice/pages/season-competitions/components/season-competitions-list/index.tsx","../../src/pages/backoffice/pages/season-competitions/styled.ts","../../src/pages/backoffice/pages/season-competitions/index.tsx","../../src/pages/backoffice/pages/stages/components/stage-item/styled.ts","../../src/pages/backoffice/api/stages/use-delete-stage/index.tsx","../../src/pages/backoffice/pages/stages/components/stage-item/index.tsx","../../src/pages/backoffice/pages/stages/components/stage-list/index.tsx","../../src/pages/backoffice/pages/stages/styled.ts","../../src/pages/backoffice/pages/stages/index.tsx","../../src/pages/backoffice/pages/teams/components/team-item/styled.ts","../../src/pages/backoffice/api/teams/use-update-team/index.tsx","../../src/pages/backoffice/pages/teams/components/edit-team-modal/index.tsx","../../src/pages/backoffice/pages/teams/components/team-details-modal/index.tsx","../../src/pages/backoffice/pages/teams/components/team-item/index.tsx","../../src/pages/backoffice/pages/teams/components/teams-list/index.tsx","../../src/pages/backoffice/pages/teams/components/teams-list-skeleton/index.tsx","../../src/pages/backoffice/pages/teams/styled.ts","../../src/pages/backoffice/pages/teams/index.tsx","../../src/pages/backoffice/api/venues/use-create-venue/index.tsx","../../src/pages/backoffice/api/venues/use-update-venue/index.tsx","../../src/pages/backoffice/pages/venues/components/venue-form/types.ts","../../src/pages/backoffice/pages/venues/components/venue-form/index.tsx","../../src/pages/backoffice/pages/venues/components/venue-form/form.ts","../../src/pages/backoffice/pages/venues/components/venue-modal/index.tsx","../../src/pages/backoffice/pages/venues/components/venue-item/styled.ts","../../src/pages/backoffice/api/venues/use-delete-venue/index.tsx","../../src/pages/backoffice/pages/venues/components/venue-item/index.tsx","../../src/pages/backoffice/pages/venues/components/venues-list/index.tsx","../../src/pages/backoffice/pages/venues/styled.ts","../../src/pages/backoffice/pages/venues/index.tsx","../../src/pages/backoffice/BackofficeContainer.tsx","../../src/features/dashboard/embedded-dashboard/api/useGenerateTemporaryPlaylist.tsx","../../src/config.ts","../../src/features/dashboard/embedded-dashboard/hooks/useEmbeddedDashboard.tsx","../../src/features/dashboard/embedded-dashboard/EmbeddedDashboard.feature.tsx","../../src/features/dashboard/embedded-dashboard/types/embeddedDashboard.types.ts","../../src/features/dashboard/embedded-dashboard/hooks/useDashboardEvents.tsx","../../src/features/playlist/save-temporary-playlist/SaveTemporaryPlaylist.feature.tsx","../../src/entities/playlist/ui/PlaylistItemPositionWrapper.tsx","../../src/features/playlist/temporary-playlist-items-list/ui/temporary-playlist-item/hooks/useTemporaryPlaylistItemOptions.tsx","../../src/features/playlist/temporary-playlist-items-list/ui/temporary-playlist-item/TemporaryPlaylistItem.tsx","../../src/features/playlist/temporary-playlist-items-list/TemporaryPlaylistItemsList.tsx","../../src/widgets/playlist/temporary-playlist/ui/TemporaryPlaylist.tsx","../../src/widgets/playlist/temporary-playlist/TemporaryPlaylist.widget.tsx","../../src/pages/dashboard-preview/DashboardPreview.page.tsx","../../src/pages/player-profile-dashboard/PlayerProfileDashboard.page.tsx","../../src/shared/components/message/index.styled.ts","../../src/shared/components/message/index.tsx","../../src/tagging-tool/service/taggingRecording.service.ts","../../src/pages/tagging-tool-align-recording/components/align-recording/styled.ts","../../src/pages/tagging-tool-align-recording/components/align-recording-clip/styled.ts","../../src/pages/tagging-tool-align-recording/components/align-recording-clip/index.tsx","../../src/pages/tagging-tool-align-recording/components/align-recording/index.tsx","../../src/pages/tagging-tool-align-recording/index.tsx","../../src/api/recording/useFetchTaggingRecordings/index.ts","../../src/pages/tagging-tool-aling-sources/components/alignment-source-list/styled.ts","../../src/pages/tagging-tool-aling-sources/components/alignment-source-list/index.tsx","../../src/pages/tagging-tool-aling-sources/AlignmentSourceListContainer.tsx","../../src/api/tagging-tool/use-live-sessions-with-filters/hooks/use-live-sessions-filters/index.ts","../../src/api/tagging-tool/use-live-sessions-with-filters/transformer.ts","../../src/api/tagging-tool/use-live-sessions-with-filters/index.ts","../../src/pages/tagging-tool-recording-list/components/tagging-recording-list/index.tsx","../../src/pages/tagging-tool-recording-list/index.tsx","../../src/pages/tagging-tool-upload-video-step-one/styled.ts","../../src/pages/tagging-tool-upload-video-step-one/utils/upload-video-step-one-form/index.ts","../../src/tagging-tool/service/teams.service.ts","../../src/pages/tagging-tool-upload-video-step-one/index.tsx","../../src/shared/assets/upload-icon.svg","../../src/pages/tagging-tool-upload-video-step-two/index.styled.ts","../../src/pages/tagging-tool-upload-video-step-two/UploadVideoStep2Screen.tsx","../../src/Routes.tsx","../../src/shared/hooks/use-subscribe-events/index.ts","../../src/App.tsx","../../src/kognia/error-tracking/init/index.ts","../../src/kognia/metrics/init.ts","../../src/index.tsx"],"sourcesContent":["import { StyledEngineProvider, ThemeProvider } from '@mui/material';\nimport { theme } from 'kognia-ui';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const AppTheme = ({ children }: Props) => {\n return (\n \n {children}\n \n );\n};\n","import { QueryClient } from '@tanstack/react-query';\n\nexport const apiHost = '/api';\n\nexport const DEFAULT_VIDEO_TYPE = 'application/dash+xml';\n\nexport const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n});\n","const {\n MODE: ENVIRONMENT,\n VITE_REACT_APP_RELEASE_VERSION,\n VITE_SUPERSET_URL,\n VITE_SUPERSET_PLAYER_PROFILE_DASHBOARD_ID,\n PUBLIC_URL,\n DEV,\n PROD,\n BASE_URL,\n} = import.meta.env;\n\nexport {\n ENVIRONMENT,\n VITE_REACT_APP_RELEASE_VERSION,\n PUBLIC_URL,\n DEV,\n PROD,\n BASE_URL,\n VITE_SUPERSET_URL,\n VITE_SUPERSET_PLAYER_PROFILE_DASHBOARD_ID,\n};\n","import reduce from 'lodash/reduce';\n\ntype QueryParamFilters = { [key in string]: string | number | boolean | undefined | Array };\ntype QueryParamOptions = { [key in string]: string | number | boolean | undefined | Array };\n\nexport const generateQueryParamsFromOptionsAndFilters = (options: QueryParamOptions, filters: QueryParamFilters) => {\n return reduce(\n { ...filters, ...options },\n (result, filter, key) =>\n filter\n ? {\n ...result,\n [key]: filter,\n }\n : { ...result },\n {},\n );\n};\n","import reduce from 'lodash/reduce';\nimport queryString from 'query-string';\n\nimport { apiHost } from 'api/config';\nimport { ENVIRONMENT } from 'shared/utils/env-variables';\n\nimport { ClientsFilters } from './backoffice/client/hooks/use-clients/types';\nimport { KogniaUsersFilters } from './backoffice/user/use-kognia-users/types';\nimport { SharedQueryOptions } from './hooks/useInfinityQuery/types';\nimport { PlaylistsWithFiltersEndpointFilters } from './playlist/types';\nimport { RecordingEndpointFilters } from './recording/useFetchRecordings';\nimport { generateQueryParamsFromOptionsAndFilters } from './utils';\nimport { VODVideoSourcesFilters } from './video-sources/use-fetch-vod-video-sources';\nimport { RecordingCompetitionsFilters } from '../pages/backoffice/api/season-clients/use-recording-competitions/types';\n\nexport const FeatureFlagsUrl = `${apiHost}/feature-toggles`;\n\nexport const matchWithEpisodesUrl = (recordingId: string) => `${apiHost}/match-with-episodes/${recordingId}`;\nexport const liveTaggingSessionAsMatchUrl = (liveTaggingSessionId: string) =>\n `${apiHost}/live-tagging-session-as-match/${liveTaggingSessionId}`;\n\nexport const tacticalAnalysesAsItems = `${apiHost}/tactical-analyses-playlist-items`;\nexport const tacticalAnalysisWithFilters = (tacticalAnalysisId: string) =>\n `${apiHost}/tactical-analyses/${tacticalAnalysisId}/episodes`;\nexport const tacticalAnalysesFilters = (recordingIds: string[]) => {\n return queryString.stringifyUrl(\n {\n url: `${apiHost}/tactical-analyses-filters`,\n query: { recordingIds },\n },\n { arrayFormat: 'comma' },\n );\n};\n\n// keypads\nexport const keypadsUrl = () => `${apiHost}/keypad`;\nexport const keypadUrl = (id: string) => `${apiHost}/keypad/${id}`;\nexport const keypadCopyUrl = (id: string) => `${apiHost}/keypad/${id}/copy`;\nexport const keypadTagsUrl = (keypadId: string) => `${keypadsUrl()}/${keypadId}/tag`;\nexport const deleteKeypadTagsUrl = (keypadId: string, tagId: string) => `${keypadsUrl()}/${keypadId}/tag/${tagId}`;\n\n// playlists\nexport const playlistsUrl = `${apiHost}/playlists`;\nexport const playlistUrl = (id: string) => `${apiHost}/playlists/${id}`;\nexport const duplicatePlaylistUrl = (playlistId: string) => `${apiHost}/playlists/${playlistId}/copy`;\nexport const recordingPlaylistsUrl = (id: string, includeEmpty = true) => {\n const includeEmptyParam = includeEmpty ? '' : '&includeEmpty=false';\n return `${apiHost}/playlists?recordingId=${id}${includeEmptyParam}`;\n};\nexport const tacticsInRange = `${apiHost}/tactical-analyses/tactics-in-range`;\nexport const downloadPlaylistUrl = ({\n playlistId,\n joinSources,\n showOverlays,\n showTitles,\n}: {\n playlistId: string;\n joinSources: boolean;\n showOverlays: boolean;\n showTitles: boolean;\n}) =>\n `${apiHost}/playlist-download-requests/${playlistId}?joinSources=${joinSources}&showOverlays=${showOverlays}&showTitles=${showTitles}&timeZoneId=${\n Intl.DateTimeFormat().resolvedOptions().timeZone\n }`;\nexport const downloadClipsUrl = ({\n playlistId,\n joinSources,\n showOverlays,\n showTitles,\n}: {\n playlistId: string;\n joinSources: boolean;\n showOverlays: boolean;\n showTitles: boolean;\n}) =>\n `${apiHost}/playlist-download-requests/${playlistId}/playlistItems?joinSources=${joinSources}&showOverlays=${showOverlays}&showTitles=${showTitles}&timeZoneId=${\n Intl.DateTimeFormat().resolvedOptions().timeZone\n }`;\nexport const downloadEffectiveTimeVideosUrl = () =>\n `${apiHost}/effective-time-download-requests?timeZoneId=${Intl.DateTimeFormat().resolvedOptions().timeZone}`;\n\nexport const playlistsWithFiltersUrl = (filters: PlaylistsWithFiltersEndpointFilters) => {\n return queryString.stringifyUrl({\n url: `${apiHost}/playlists-with-filters`,\n query: reduce(filters, (result, filter, key) => (filter ? { ...result, [key]: filter } : { ...result }), {}),\n });\n};\n\nexport const playlistItemsBaseUrl = (playlistId: string) => `${apiHost}/playlists/${playlistId}/playlist-items`;\nexport const deletePlaylistItemUrl = (playlistId: string, playlistItemId: string) =>\n `${apiHost}/playlists/${playlistId}/playlist-items/${playlistItemId}`;\nexport const deletePlaylistItemsUrl = (playlistId: string) => `${apiHost}/playlists/${playlistId}/playlist-items`;\nexport const updatePlaylistItemUrl = (playlistId: string, playlistItemId: string) =>\n `${apiHost}/playlists/${playlistId}/playlist-items/${playlistItemId}`;\nexport const postManyPlaylistItem = (playlistId: string) => `${apiHost}/playlists/${playlistId}/playlist-items`;\nexport const duplicatePlaylistItemsUrl = (playlistId: string) => `${playlistItemsBaseUrl(playlistId)}/copy`;\nexport const downloadPlaylistXmlUrl = (playlistId: string) => `${apiHost}/playlists/${playlistId}/xml`;\nexport const playlistPreview = `${apiHost}/playlists/preview`;\n\n// presigned uploads\nexport const initiateMultipartUploadUrl = (recordingId: string) =>\n `${apiHost}/initiate-multipart-upload/${recordingId}`;\nexport const getMultipartUploadUrl = (recordingId: string, uploadId: string, partNumber: number, partLength: number) =>\n `${apiHost}/get-multipart-upload-url/${recordingId}?uploadId=${uploadId}&partNumber=${partNumber}&partLength=${partLength}`;\nexport const completeMultipartUploadUrl = (recordingId: string) =>\n `${apiHost}/complete-multipart-upload/${recordingId}`;\nexport const abortMultipartUploadUrl = (recordingId: string, uploadId: string) =>\n `${apiHost}/abort-multipart-upload/${recordingId}?uploadId=${uploadId}`;\n\n// recordings\nexport const recordingsBaseUrl = `${apiHost}/recordings`;\nexport const recordingsListUrl = (filters: RecordingEndpointFilters) => {\n return queryString.stringifyUrl({\n url: recordingsBaseUrl,\n query: reduce(filters, (result, filter, key) => ({ ...result, [key]: filter }), {}),\n });\n};\nexport const specificRecordingUrl = (id: string) => `${recordingsBaseUrl}/${id}`;\nexport const recordingsByNameUrl = `${apiHost}/recordings-by-name`;\n\n// tactical analyses\nexport const tacticalAnalysesBaseUrl = `${apiHost}/tactical-analyses`;\nexport const tacticalAnalysesInRecording = (recordingId: string) => {\n return queryString.stringifyUrl({\n url: tacticalAnalysesBaseUrl,\n query: { recordingId },\n });\n};\nexport const invalidateTacticalAnalysisUrl = (tacticalAnalysisId: string) =>\n `${tacticalAnalysesBaseUrl}/${tacticalAnalysisId}/invalidate`;\nexport const validateTacticalAnalysisUrl = (tacticalAnalysisId: string) =>\n `${tacticalAnalysesBaseUrl}/${tacticalAnalysisId}/validate`;\n\n// tagging-tool\nexport const taggingRecordingsBaseUrl = `${apiHost}/tagging-recordings`;\nexport const liveSessionsWithFiltersBaseUrl = `${apiHost}/live-tagging-sessions-with-filters`;\nexport const liveSessionsWithFiltersUrl = (filters: any) => {\n return queryString.stringifyUrl({\n url: liveSessionsWithFiltersBaseUrl,\n query: reduce(filters, (result, filter, key) => ({ ...result, [key]: filter }), {}),\n });\n};\nexport const taggingEventBaseUrl = `${apiHost}/tagging-events`;\nexport const matchOrLiveTaggingEventsUrl = (recordingId: string, isLive: boolean) =>\n `${apiHost}/tagging-events-data?referenceId=${recordingId}&isLive=${isLive}`;\nexport const matchTaggingEventUrl = (taggingEventId: string) => `${taggingEventBaseUrl}/${taggingEventId}`;\nexport const cropTaggingEventUrl = (taggingEventId: string) => `${taggingEventBaseUrl}/${taggingEventId}/crop`;\nexport const editAllAlignmentsUrl = (recordingId: string) =>\n `${taggingEventBaseUrl}/edit-alignment?recordingId=${recordingId}`;\nexport const alignAllWithRecordingUrl = `${taggingEventBaseUrl}/align-with-recording`;\nexport const liveTaggingSessionsBaseUrl = `${apiHost}/live-tagging-sessions`;\nexport const liveTaggingSessionUrl = (id: string) => `${liveTaggingSessionsBaseUrl}/${id}`;\nexport const importTaggingEventUrl = (recordingId: string) => `${apiHost}/import/${recordingId}`;\nexport const exportTaggingEventUrl = (recordingId: string, isLive: boolean) =>\n `${apiHost}/export/${recordingId}?isLive=${isLive}`;\n\n// teams\nexport const teamUrl = `${apiHost}/teams`;\n\n// users\nexport const userBatchClientIdsUrl = `${apiHost}/users/batch-client-ids`;\nexport const userAuth0Url = `${apiHost}/users/create-auth0`;\nconst userUrl = `${apiHost}/users`;\nexport const usersWithFiltersUrl = (options: SharedQueryOptions, filters: KogniaUsersFilters) => {\n return queryString.stringifyUrl({\n url: userUrl,\n query: generateQueryParamsFromOptionsAndFilters(options, filters),\n });\n};\n\nconst loginUrl = `${apiHost}/oauth2/authorization/oidc`;\nexport const LogoutUrl = `${userUrl}/logout?returnTo=${location.protocol}//${location.host}`;\nexport const AccountUrl = `${apiHost}/account`;\nexport const VODVideoSourcesUrl = (filters: VODVideoSourcesFilters) => {\n return queryString.stringifyUrl({\n url: `${apiHost}/vod-video-sources`,\n query: reduce(filters, (result, filter, key) => ({ ...result, [key]: filter }), {}),\n });\n};\nexport const getOauth2LoginUrl = (path = '/') => {\n const returnTo = `?returnTo=${encodeURIComponent(path)}`;\n return ENVIRONMENT === 'development' || (ENVIRONMENT === 'production' && location.hostname === 'localhost')\n ? `${location.protocol}//${location.hostname}:8280${loginUrl}${returnTo}`\n : `${location.protocol}//${location.hostname}${loginUrl}${returnTo}`;\n};\n\n// XML downloads\nexport const XMLDownloadUrl = (recordingId: string, tacticalAnalysisId?: string, isEffectiveTime = false) => {\n return queryString.stringifyUrl({\n url: `${apiHost}/nacsport-xml/${recordingId}`,\n query: { tacticalAnalysisId: tacticalAnalysisId, isEffectiveTime: isEffectiveTime ? 'true' : undefined },\n });\n};\n\n// Clients\nexport const clientBaseUrl = `${apiHost}/clients`;\nexport const clientEditUrl = (id: string) => `${clientBaseUrl}/${id}`;\nexport const clientsWithFiltersUrl = (options: SharedQueryOptions, filters: ClientsFilters) => {\n return queryString.stringifyUrl({\n url: clientBaseUrl,\n query: generateQueryParamsFromOptionsAndFilters(options, filters),\n });\n};\n\n// Clients Branding\nexport const clientBrandingUrl = (clientId: string) => `${clientBaseUrl}/${clientId}/branding`;\n\nexport const recordingCompetitionsBaseUrl = `${apiHost}/competitions`;\n\nexport const recordingCompetitionsWithFiltersUrl = (\n options: SharedQueryOptions,\n filters: RecordingCompetitionsFilters,\n) => {\n return queryString.stringifyUrl({\n url: recordingCompetitionsBaseUrl,\n query: generateQueryParamsFromOptionsAndFilters(options, filters),\n });\n};\n\nexport const userPresetsBaseUrl = `${apiHost}/user-presets`;\n\nexport const userPresetsWithFiltersUrl = ({ scope, key, ref }: { scope: string; key?: string; ref?: string }) => {\n return queryString.stringifyUrl({\n url: userPresetsBaseUrl,\n query: { scope, key, ref },\n });\n};\n\n// Dashboarding\nexport const dashboardGuestToken = (dashboardId: string) => `${apiHost}/superset-auth?dashboardId=${dashboardId}`;\n","import { TacticalAnalysisStates } from 'shared/types/recording/types';\n\nexport interface TacticalAnalysisApiResponse {\n id: string;\n recordingId: string;\n tacticalAnalysisGitCommit: string;\n numberOfEpisodes: number;\n startTime: Date;\n state: TacticalAnalysisStates;\n}\n\nexport enum HTTPMethod {\n CONNECT = 'CONNECT',\n DELETE = 'DELETE',\n GET = 'GET',\n HEAD = 'HEAD',\n OPTIONS = 'OPTIONS',\n PATCH = 'PATCH',\n POST = 'POST',\n PUT = 'PUT',\n TRACE = 'TRACE',\n}\n\nexport interface fetchQueryResponse {\n data: T;\n isFetching: boolean;\n isFetchingNextPage?: boolean;\n isError: boolean;\n isSuccess: boolean;\n isLoading: boolean;\n isMissingData?: boolean;\n refetch?: () => void;\n setQueryData?: (...args: any[]) => void;\n invalidateQuery?: () => Promise;\n}\n\nexport type LinkApiResponse = {\n rel: string;\n href: string;\n hreflang?: string;\n media?: string;\n title?: string;\n type?: string;\n deprecation?: string;\n profile?: string;\n name?: string;\n};\n","import axios, { AxiosError, AxiosRequestConfig } from 'axios';\n\nimport { HTTPMethod } from '../../types';\n\nexport type BackendApiRequestTypes =\n | HTTPMethod.GET\n | HTTPMethod.POST\n | HTTPMethod.PATCH\n | HTTPMethod.PUT\n | HTTPMethod.DELETE;\n\naxios.defaults.withCredentials = true;\n\nexport type UseBackendApiParams = AxiosRequestConfig['params'];\n\nexport const useBackendApi = (\n url: string,\n requestType: BackendApiRequestTypes,\n onSuccess: (response: any) => void = () => {},\n params: UseBackendApiParams = {},\n): Promise => {\n const handleError = (error: AxiosError) => {\n console.log(error);\n throw error;\n };\n\n switch (requestType) {\n case HTTPMethod.GET:\n return axios\n .get(url)\n .then((response) => onSuccess(response.data))\n .catch((e) => handleError(e));\n case HTTPMethod.PATCH:\n return axios\n .patch(url, params)\n .then((response) => onSuccess(response.data))\n .catch((e) => handleError(e));\n case HTTPMethod.POST:\n return axios\n .post(url, params)\n .then((response) => onSuccess(response.data))\n .catch((e) => handleError(e));\n case HTTPMethod.PUT:\n return axios\n .put(url, params)\n .then((response) => onSuccess(response.data))\n .catch((e) => handleError(e));\n case HTTPMethod.DELETE:\n return axios\n .delete(url, params)\n .then((response) => onSuccess(response.data))\n .catch((e) => handleError(e));\n }\n};\n","import { SvgIcon as MuiSvgIcon, styled, useTheme, type SvgIconProps as MuiSvgIconProps } from '@mui/material';\nimport { themeBaseSpacing } from 'kognia-ui';\n\nexport const ICON_SIZES = {\n xsmall: 2,\n small: 3,\n medium: 4,\n large: 5,\n xlarge: 6,\n} as const;\n\nexport type IconSizes = keyof typeof ICON_SIZES;\n\nexport interface SvgIconProps extends Omit {\n isButton?: boolean;\n size?: IconSizes;\n onClick?: (event: React.MouseEvent) => void;\n}\n\nconst SvgIconContainer = styled(MuiSvgIcon, {\n shouldForwardProp: (prop) => prop !== 'isButton',\n})(({ theme, isButton, size }) => ({\n transition: theme.transitions.create(['all'], {\n duration: theme.transitions.duration.shorter,\n easing: theme.transitions.easing.easeOut,\n }),\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n\n ...(isButton && {\n cursor: 'pointer',\n position: 'relative',\n userSelect: 'none',\n '&:hover': {\n opacity: '0.5',\n },\n '&:active': {\n opacity: 1,\n top: '1px',\n },\n }),\n\n ...(size && {\n minWidth: `${ICON_SIZES[size] * themeBaseSpacing}px`,\n minHeight: `${ICON_SIZES[size] * themeBaseSpacing}px`,\n height: `${ICON_SIZES[size] * themeBaseSpacing}px`,\n width: `${ICON_SIZES[size] * themeBaseSpacing}px`,\n }),\n}));\n\nexport const SvgIcon = ({ children, size = 'medium', htmlColor, color, ...restProps }: SvgIconProps) => {\n const theme = useTheme();\n\n return (\n \n {children}\n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconClose = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconClose;\n","import { IconButton, useMediaQuery } from '@mui/material';\nimport { SnackbarKey, useSnackbar } from 'notistack';\nimport { ReactNode } from 'react';\n\nimport IconClose from '../../components/icons/icon-close';\n\nexport enum NotificationType {\n DEFAULT = 'default',\n ERROR = 'error',\n SUCCESS = 'success',\n WARNING = 'warning',\n INFO = 'info',\n}\n\nconst DEFAULT_AUTO_HIDE_TIME = 4000;\nconst ERROR_AUTO_HIDE_TIME = 6000;\n\nconst getAutoHideDurationFromNotificationType = (type: NotificationType) => {\n return type === NotificationType.ERROR ? ERROR_AUTO_HIDE_TIME : DEFAULT_AUTO_HIDE_TIME;\n};\n\nexport interface TriggerNotificationOptions {\n message: string | ReactNode;\n persist?: boolean;\n type: NotificationType;\n}\n\ninterface TriggerNotificationFunction {\n (options: TriggerNotificationOptions): void;\n}\n\nexport function useNotifications() {\n const isMobile = useMediaQuery('(max-width:768px)');\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\n\n const closeButton = (key: SnackbarKey) => {\n return (\n closeSnackbar(key)}>\n \n \n );\n };\n\n const triggerNotification: TriggerNotificationFunction = ({\n message,\n persist = false,\n type = NotificationType.DEFAULT,\n }) => {\n enqueueSnackbar(message, {\n variant: type,\n action: closeButton,\n preventDuplicate: true,\n autoHideDuration: persist ? null : getAutoHideDurationFromNotificationType(type),\n anchorOrigin: {\n vertical: isMobile ? 'bottom' : 'top',\n horizontal: 'center',\n },\n });\n };\n\n return triggerNotification;\n}\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\n\nimport { useBackendApi, UseBackendApiParams } from 'api/hooks/useBackendApi';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\n\nimport { HTTPMethod } from '../../types';\n\nexport type UseApiFetchOptions = {\n enabled?: boolean;\n refetchOnReconnect?: boolean;\n refetchOnWindowFocus?: boolean;\n retry?: number | boolean;\n staleTime?: number;\n refetchInterval?: number;\n cacheTime?: number;\n keepPreviousData?: boolean;\n};\n\ninterface UseApiFetchInterface {\n errorMessage?: string;\n onError?: () => void;\n onSettled?: () => void;\n onSuccess?: (...args: any[]) => void;\n refetch?: () => void;\n queryRef: string[];\n successMessage?: string;\n transformer?: (response: any) => void;\n url: string;\n options?: UseApiFetchOptions;\n data?: UseBackendApiParams;\n method?: HTTPMethod.GET | HTTPMethod.POST;\n}\n\nexport const useFetchRequest = ({\n queryRef,\n url,\n onSuccess,\n onError,\n onSettled,\n options,\n transformer = (transformerData) => transformerData,\n errorMessage,\n successMessage,\n data,\n method = HTTPMethod.GET,\n}: UseApiFetchInterface): UseQueryResult => {\n const triggerNotification = useNotifications();\n\n return useQuery(queryRef, () => useBackendApi(url, method, transformer, data), {\n ...options,\n onError: () => {\n if (onError) onError();\n if (errorMessage) {\n triggerNotification({ type: NotificationType.ERROR, message: errorMessage });\n }\n },\n onSuccess: (response: any) => {\n if (onSuccess) onSuccess(response);\n if (successMessage) {\n triggerNotification({ type: NotificationType.SUCCESS, message: successMessage });\n }\n },\n onSettled: () => {\n if (onSettled) onSettled();\n },\n });\n};\n","import { useTranslation } from 'react-i18next';\n\nimport { LogoutUrl } from 'api/routes';\n\nimport { useFetchRequest } from '../../hooks/useFetchRequest';\n\nexport const logoutRedirect = (response: { logoutUrl: string }) => {\n if (response.logoutUrl) window.location.href = response.logoutUrl;\n};\n\nexport const useLogOutAccount = () => {\n const { t } = useTranslation();\n const fetchQueryRef = ['logoutAccount'];\n return useFetchRequest({\n queryRef: fetchQueryRef,\n url: LogoutUrl,\n errorMessage: t('api:use-logout-account.error'),\n onSuccess: (response: any) => {\n logoutRedirect(response);\n },\n options: {\n enabled: false,\n },\n });\n};\n","const routesPrefixes = {\n BACKOFFICE: '/kognia-backoffice',\n TAGGING_TOOL: '/tagging-tool',\n};\n\nexport const routes = {\n PERFORMANCE_REPORT_TIMELINE: '/performance-report/:id/timeline',\n RECORDING_PLAYLIST_DETAIL: '/recordings/playlists/:playlistId',\n RECORDING_PLAYLISTS: '/recordings/:id/playlists',\n RECORDING_EDIT: '/recordings/:id/edit',\n RECORDING_LIST: '/recordings',\n LIVE_TAGGING_SESSION_EDIT: '/live-tagging-sessions/:recordingId/edit',\n RECORDING_APP: '/recording-app',\n TAGGING_TOOL_TAG: `${routesPrefixes.TAGGING_TOOL}/:recordingId/tag`,\n TAGGING_TOOL: routesPrefixes.TAGGING_TOOL,\n TAGGING_TOOL_UPLOAD_STEP_ONE: `${routesPrefixes.TAGGING_TOOL}/upload`,\n TAGGING_TOOL_UPLOAD_STEP_TWO: `${routesPrefixes.TAGGING_TOOL}/upload/:recordingId`,\n TAGGING_TOOL_ALIGN_SOURCES: `${routesPrefixes.TAGGING_TOOL}/:recordingId/align/sources`,\n TAGGING_TOOL_ALIGN_RECORDING: `${routesPrefixes.TAGGING_TOOL}/:recordingId/align`,\n TAGGING_TOOL_ALIGN_RECORDING_WITH_SOURCE: `${routesPrefixes.TAGGING_TOOL}/:recordingId/align/:sourceRecordingId`,\n TAGGING_TOOL_RECORDING: `${routesPrefixes.TAGGING_TOOL}/:recordingId`,\n PLAYLISTS: '/playlists',\n ACCOUNT: '/account',\n KEYPADS_EDIT: '/keypads/:id',\n KEYPADS: '/keypads',\n LOGIN: '/login',\n BACKOFFICE: routesPrefixes.BACKOFFICE,\n BACKOFFICE_ANNOTATION: `${routesPrefixes.BACKOFFICE}/annotation`,\n BACKOFFICE_PLAYERS: `${routesPrefixes.BACKOFFICE}/players`,\n BACKOFFICE_TEAMS: `${routesPrefixes.BACKOFFICE}/teams`,\n PROCESS_GAME: `${routesPrefixes.BACKOFFICE}/process-game`,\n BACKOFFICE_ADD_USER_TO_ENVIRONMENT: `${routesPrefixes.BACKOFFICE}/users/add-user-to-environment`,\n BACKOFFICE_CREATE_USER: `${routesPrefixes.BACKOFFICE}/users/create-user`,\n BACKOFFICE_ENVIRONMENTS: `${routesPrefixes.BACKOFFICE}/environments`,\n BACKOFFICE_CREATE_ENVIRONMENT: `${routesPrefixes.BACKOFFICE}/create-environment`,\n BACKOFFICE_ENVIRONMENT_DETAIL: `${routesPrefixes.BACKOFFICE}/environments/:id`,\n BACKOFFICE_EDIT_ENVIRONMENT: `${routesPrefixes.BACKOFFICE}/environments/:id/edit`,\n BACKOFFICE_CREATE_ENVIRONMENT_BRANDING: `${routesPrefixes.BACKOFFICE}/environments/:id/add-branding`,\n BACKOFFICE_EDIT_ENVIRONMENT_BRANDING: `${routesPrefixes.BACKOFFICE}/environments/:id/edit-branding`,\n BACKOFFICE_ASSOCIATE_COMPETITION_WITH_CLIENTS: `${routesPrefixes.BACKOFFICE}/associate-competition-with-clients`,\n BACKOFFICE_COMPETITIONS: `${routesPrefixes.BACKOFFICE}/competitions`,\n BACKOFFICE_COACHES: `${routesPrefixes.BACKOFFICE}/coaches`,\n BACKOFFICE_GAMES: `${routesPrefixes.BACKOFFICE}/games`,\n BACKOFFICE_EDIT_GAME_FORM: `${routesPrefixes.BACKOFFICE}/edit-game-form/:id`,\n BACKOFFICE_GAME_FORM: `${routesPrefixes.BACKOFFICE}/game-form/(home-team|opponent-team|game-info|summary)/:id?`,\n BACKOFFICE_GAME_SUMMARY: `${routesPrefixes.BACKOFFICE}/game-summary/:id`,\n BACKOFFICE_GAME_FORM_STEP_1: `${routesPrefixes.BACKOFFICE}/game-form/home-team/:id?`,\n BACKOFFICE_GAME_FORM_STEP_2: `${routesPrefixes.BACKOFFICE}/game-form/opponent-team/:id?`,\n BACKOFFICE_GAME_FORM_STEP_3: `${routesPrefixes.BACKOFFICE}/game-form/game-info/:id?`,\n BACKOFFICE_NEW_GAME_SUMMARY: `${routesPrefixes.BACKOFFICE}/game-form/summary/:id`,\n BACKOFFICE_VENUES: `${routesPrefixes.BACKOFFICE}/venues`,\n BACKOFFICE_SEASON_COMPETITIONS: `${routesPrefixes.BACKOFFICE}/season-competitions`,\n BACKOFFICE_STAGES: `${routesPrefixes.BACKOFFICE}/stages`,\n SUBMIT_FEEDBACK:\n 'https://docs.google.com/forms/d/e/1FAIpQLSdIWFqMxFlxLmRNz4IVzrTmBYJHyOEhO_Ohmssph7-A510Mwg/viewform',\n HOME_PAGE: '/',\n PLAYER_PROFILE_DASHBOARD: '/player-profile-dashboard',\n DASHBOARD_PREVIEW: '/dashboard-preview',\n};\n\nconst routesSectionsList = {\n HOME: 'home',\n TACTICAL_ANALYSIS: 'tacticalAnalysis',\n TAGGING: 'tagging',\n PLAYLISTS: 'playlists',\n KEYPADS: 'keypads',\n ACCOUNT: 'account',\n SUPPORT: 'support',\n BACKOFFICE_ANNOTATION: 'backoffice-annotation',\n BACKOFFICE_METADATA_GAMES: 'backoffice-metadata-games',\n};\n\n// assign route to a section to set active specific link (sidebar-menu)\n\nexport const routesSections = {\n [routes.PERFORMANCE_REPORT_TIMELINE]: routesSectionsList.TACTICAL_ANALYSIS,\n [routes.RECORDING_PLAYLIST_DETAIL]: routesSectionsList.PLAYLISTS,\n [routes.RECORDING_PLAYLISTS]: routesSectionsList.PLAYLISTS,\n [routes.RECORDING_LIST]: routesSectionsList.TACTICAL_ANALYSIS,\n [routes.RECORDING_EDIT]: routesSectionsList.TACTICAL_ANALYSIS,\n [routes.LIVE_TAGGING_SESSION_EDIT]: routesSectionsList.TAGGING,\n [routes.TAGGING_TOOL_TAG]: routesSectionsList.TAGGING,\n [routes.TAGGING_TOOL]: routesSectionsList.TAGGING,\n [routes.PLAYLISTS]: routesSectionsList.PLAYLISTS,\n [routes.ACCOUNT]: routesSectionsList.ACCOUNT,\n [routes.KEYPADS_EDIT]: routesSectionsList.KEYPADS,\n [routes.KEYPADS]: routesSectionsList.KEYPADS,\n [routes.HOME_PAGE]: routesSectionsList.HOME,\n [routes.BACKOFFICE_ANNOTATION]: routesSectionsList.BACKOFFICE_ANNOTATION,\n [routes.BACKOFFICE_GAMES]: routesSectionsList.BACKOFFICE_METADATA_GAMES,\n [routes.BACKOFFICE]: routesSectionsList.BACKOFFICE_METADATA_GAMES,\n};\n\nexport const queryParams = {\n copyPlaylist: 'copyPlaylist',\n};\n","export const getIsFormTag = (tagName: string) => {\n const formTags = ['input', 'textarea', 'select'];\n return formTags.includes(tagName.toLowerCase());\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconChevronDown = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconChevronDown;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconDone = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconDone;\n","import * as Sentry from '@sentry/react';\n\nimport { User } from 'shared/types/user/types';\n\nexport const registerTrackedUser = (user: User) => {\n Sentry.setTag('locale', user.locale);\n Sentry.setUser({\n id: user.id,\n username: `${user.firstName} ${user.lastName}`,\n email: user.email,\n });\n};\n\nexport const unregisterTrackedUser = () => {\n Sentry.configureScope((scope) => scope.setUser(null));\n};\n","import { object, string, TypeOf } from 'zod';\n\nexport type UserRole =\n | null\n | 'Video Analyst'\n | 'Head Coach'\n | 'Assistant Coach'\n | 'Strength Coach'\n | 'Physical Therapist'\n | 'Scouter'\n | 'Manager';\n\nexport const clientBaseSchema = object({\n id: string(),\n name: string(),\n city: string(),\n country: string(),\n});\n\nexport const clientBrandingSchema = object({\n faviconUrl: string(),\n emailLogoUrl: string(),\n navbarLogoUrl: string(),\n navbarCollapsedLogoUrl: string(),\n displayName: string(),\n});\n\nexport const clientSchema = clientBaseSchema.extend({\n branding: clientBrandingSchema.nullable(),\n});\n\nexport type ClientBase = TypeOf;\nexport type ClientBranding = TypeOf;\nexport type Client = TypeOf;\n\nexport enum UserAuthority {\n ROLE_ADMIN = 'ROLE_ADMIN',\n ROLE_USER = 'ROLE_USER',\n}\n\nexport interface User {\n id: string;\n clients: Client[];\n email: string;\n firstName: string;\n lastName: string;\n phoneAreaCode?: string;\n phoneNumber?: string;\n role: UserRole;\n avatarUrl?: string;\n locale: string;\n authorities: UserAuthority[];\n}\n\nexport interface SeasonClients {\n id: string;\n originalClient: Client;\n seasonName: string;\n clients: Client[];\n updatedAt: Date;\n}\n\nexport type FeatureFlags = {\n [key in string]: string | boolean;\n};\n","import { useMachine } from '@xstate/react';\nimport { useEffect } from 'react';\nimport { AnyEventObject, createMachine, State } from 'xstate';\n\nimport { fetchQueryResponse } from 'api/types';\n\nexport enum PAGE_STATES {\n IDLE = 'IDLE',\n READY = 'READY',\n LOADING = 'LOADING',\n ERROR = 'ERROR',\n NOT_FOUND = 'NOT_FOUND',\n MISSING_DATA = 'MISSING_DATA',\n INVALID_CLIENT = 'INVALID_CLIENT',\n}\n\nexport enum PAGE_ACTIONS {\n READY = 'READY',\n LOAD = 'LOAD',\n ERROR = 'ERROR',\n NOT_FOUND = 'NOT_FOUND',\n MISSING_DATA = 'MISSING_DATA',\n SET_INVALID_CLIENT = 'SET_INVALID_CLIENT',\n}\n\nexport const pageStateMachine = createMachine({\n predictableActionArguments: true,\n id: 'recording-list',\n initial: PAGE_STATES.IDLE,\n states: {\n [PAGE_STATES.IDLE]: {\n on: {\n [PAGE_ACTIONS.LOAD]: PAGE_STATES.LOADING,\n },\n },\n [PAGE_STATES.LOADING]: {\n on: {\n [PAGE_ACTIONS.READY]: PAGE_STATES.READY,\n [PAGE_ACTIONS.ERROR]: PAGE_STATES.ERROR,\n [PAGE_ACTIONS.NOT_FOUND]: PAGE_STATES.NOT_FOUND,\n [PAGE_ACTIONS.MISSING_DATA]: PAGE_STATES.MISSING_DATA,\n [PAGE_ACTIONS.SET_INVALID_CLIENT]: PAGE_STATES.INVALID_CLIENT,\n },\n },\n [PAGE_STATES.ERROR]: {\n on: {\n [PAGE_ACTIONS.LOAD]: PAGE_STATES.LOADING,\n },\n },\n [PAGE_STATES.READY]: {},\n [PAGE_STATES.NOT_FOUND]: {\n on: {\n [PAGE_ACTIONS.LOAD]: PAGE_STATES.LOADING,\n },\n },\n [PAGE_STATES.MISSING_DATA]: {\n on: {\n [PAGE_ACTIONS.LOAD]: PAGE_STATES.LOADING,\n },\n },\n [PAGE_STATES.INVALID_CLIENT]: {\n on: {\n [PAGE_ACTIONS.LOAD]: PAGE_STATES.LOADING,\n [PAGE_ACTIONS.READY]: PAGE_STATES.READY,\n [PAGE_ACTIONS.ERROR]: PAGE_STATES.ERROR,\n [PAGE_ACTIONS.NOT_FOUND]: PAGE_STATES.NOT_FOUND,\n [PAGE_ACTIONS.MISSING_DATA]: PAGE_STATES.MISSING_DATA,\n [PAGE_ACTIONS.SET_INVALID_CLIENT]: PAGE_STATES.INVALID_CLIENT,\n },\n },\n },\n});\n\ntype Response = {\n PAGE_STATES: typeof PAGE_STATES;\n current: State;\n data: T | undefined;\n isPageLoading: boolean;\n isPageError: boolean;\n isPageNotFound: boolean;\n isPageMissingData: boolean;\n isPageReady: boolean;\n isInvalidClient: boolean;\n refetch?: () => void;\n invalidateQuery?: () => Promise;\n};\n\nexport type DataFetchingFields = {\n isInvalidClient?: boolean;\n};\n\nexport type DataFetching = fetchQueryResponse & DataFetchingFields;\n\nconst usePageStateMachine = (dataFetching: () => DataFetching): Response => {\n const {\n isError,\n isFetching,\n isSuccess,\n data,\n isMissingData = false,\n refetch,\n isInvalidClient: isInvalidDataClient,\n } = dataFetching();\n\n const [current, send] = useMachine(pageStateMachine);\n\n useEffect(() => {\n if (isFetching) {\n send(PAGE_ACTIONS.LOAD);\n }\n\n if (isError) {\n send(PAGE_ACTIONS.ERROR);\n }\n\n if (isSuccess && !isFetching) {\n if (!data) {\n send(PAGE_ACTIONS.NOT_FOUND);\n } else if (isMissingData) {\n send(PAGE_ACTIONS.MISSING_DATA);\n } else if (isInvalidDataClient) {\n send(PAGE_ACTIONS.SET_INVALID_CLIENT);\n } else {\n send(PAGE_ACTIONS.READY);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isFetching, isSuccess, isError, data, isInvalidDataClient]);\n\n const isPageReady = current.matches(PAGE_STATES.READY);\n const isPageLoading = current.matches(PAGE_STATES.LOADING);\n const isPageError = current.matches(PAGE_STATES.ERROR);\n const isPageNotFound = current.matches(PAGE_STATES.NOT_FOUND);\n const isPageMissingData = current.matches(PAGE_STATES.MISSING_DATA);\n const isInvalidClient = current.matches(PAGE_STATES.INVALID_CLIENT);\n\n return {\n PAGE_STATES,\n current,\n data,\n isPageReady,\n isPageLoading,\n isPageError,\n isPageNotFound,\n isPageMissingData,\n isInvalidClient,\n refetch,\n };\n};\n\nexport default usePageStateMachine;\n","import { atom } from 'recoil';\n\nimport { PAGE_STATES } from 'shared/hooks/use-page-state-machine';\nimport { FeatureFlags, User, UserAuthority, UserRole } from 'shared/types/user/types';\n\nexport const defaultUserState: User = {\n id: '',\n clients: [],\n email: '',\n firstName: '',\n lastName: '',\n role: 'Video Analyst' as UserRole,\n locale: 'en-US',\n authorities: [UserAuthority.ROLE_USER],\n};\n\nexport const defaultFeatureFlagsState = {};\n\nconst USER_ATOM_KEY = 'user';\nconst IS_AUTHORIZED_ATOM_KEY = 'isAuthorized';\nconst CURRENT_CLIENT_ID_ATOM_KEY = 'currentClientId';\nconst FEATURE_FLAGS_ATOM_KEY = 'featureFlags';\nconst APP_STATE_ATOM_KEY = 'appState';\n\nexport const userAtom = atom({\n key: USER_ATOM_KEY,\n default: defaultUserState,\n});\n\nexport const isAuthorizedAtom = atom({\n key: IS_AUTHORIZED_ATOM_KEY,\n default: false,\n});\n\nexport const currentClientIdAtom = atom({\n key: CURRENT_CLIENT_ID_ATOM_KEY,\n default: '',\n});\n\nexport const featureFlagsState = atom({\n key: FEATURE_FLAGS_ATOM_KEY,\n default: defaultFeatureFlagsState,\n});\n\nexport const appState = atom({\n key: APP_STATE_ATOM_KEY,\n default: PAGE_STATES.IDLE,\n});\n","import { UseQueryResult } from '@tanstack/react-query';\nimport { useCallback, useMemo } from 'react';\n\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { AccountUrl } from 'api/routes';\nimport { Client, User, UserAuthority, UserRole } from 'shared/types';\n\nimport { queryClient } from '../../config';\n\nexport interface AccountAPIResponse {\n id: string;\n clients: Client[];\n email: string;\n firstName: string;\n lastName: string;\n phoneAreaCode?: string | null;\n phoneNumber?: string | null;\n role: UserRole;\n avatarUrl?: string;\n locale: string;\n authorities: string[];\n}\n\ninterface useFetchAccountInterface {\n (onError: () => void, onSuccess: (user: User) => void): UseQueryResult & { setQueryData: (user: User) => void };\n}\n\nexport const transformUser = (user: AccountAPIResponse): User => ({\n id: user.id,\n clients: user.clients,\n email: user.email,\n firstName: user.firstName,\n lastName: user.lastName,\n phoneAreaCode: user.phoneAreaCode ?? undefined,\n phoneNumber: user.phoneNumber ?? undefined,\n role: user.role as UserRole,\n avatarUrl: user.avatarUrl,\n locale: user.locale,\n authorities: user.authorities.map((authority) => authority as UserAuthority),\n});\n\nexport const useFetchAccount: useFetchAccountInterface = (onError, onSuccess) => {\n const queryRef = useMemo(() => ['fetchAccount'], []);\n const fetchRequest = useFetchRequest({\n onError,\n queryRef: queryRef,\n url: AccountUrl,\n transformer: transformUser,\n onSuccess,\n options: {\n retry: false,\n refetchOnWindowFocus: true,\n refetchInterval: 900000,\n },\n });\n\n const setQueryData = useCallback((user: User) => queryClient.setQueryData(queryRef, user), [queryRef]);\n return { ...fetchRequest, setQueryData };\n};\n","import { UseQueryResult } from '@tanstack/react-query';\nimport { useCallback, useMemo } from 'react';\n\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { FeatureFlagsUrl } from 'api/routes';\nimport { FeatureFlags } from 'shared/types';\n\nimport { queryClient } from '../../config';\n\ntype UseFetchAccountResponse = UseQueryResult & { setQueryData: (user: FeatureFlags) => void };\n\ninterface UseFetchAccountInterface {\n (): UseFetchAccountResponse;\n}\n\nexport const transformFeatureFlags = (featureFlags: FeatureFlags): FeatureFlags => {\n return featureFlags;\n};\n\nexport enum FEATURE_FLAG {\n DOWNLOAD_PLAYLIST = 'app-download-playlist',\n CUSTOM_OVERLAYS = 'app-custom-overlays',\n APP_DASHBOARDS = 'app-dashboards',\n APP_DASHBOARD_PREVIEW = 'app-dashboard-preview',\n CUSTOM_OVERLAYS_QUALITY_DROPDOWN = 'app-custom-overlays-quality-dropdown',\n}\n\nconst FEATURE_FLAGS_VALUES = {\n [FEATURE_FLAG.DOWNLOAD_PLAYLIST]: true,\n [FEATURE_FLAG.CUSTOM_OVERLAYS]: true,\n [FEATURE_FLAG.APP_DASHBOARDS]: true,\n [FEATURE_FLAG.APP_DASHBOARD_PREVIEW]: true,\n [FEATURE_FLAG.CUSTOM_OVERLAYS_QUALITY_DROPDOWN]: true,\n};\n\nconst LOCALHOST_HOSTNAME = 'localhost';\n\nexport const useFetchFeatureFlags: UseFetchAccountInterface = () => {\n const fetchQueryRef = useMemo(() => ['fetchFeatureFlags'], []);\n const fetchRequest = useFetchRequest({\n queryRef: fetchQueryRef,\n url: FeatureFlagsUrl,\n transformer: transformFeatureFlags,\n options: { enabled: false },\n });\n\n const includeLocalhostFeatureFlags = window.location.hostname === LOCALHOST_HOSTNAME;\n\n const featureFlags =\n includeLocalhostFeatureFlags && fetchRequest.data\n ? { ...FEATURE_FLAGS_VALUES, ...fetchRequest.data }\n : fetchRequest.data;\n\n const setQueryData = useCallback(\n (data: FeatureFlags) => queryClient.setQueryData(fetchQueryRef, data),\n [fetchQueryRef],\n );\n\n return { ...fetchRequest, data: featureFlags, setQueryData } as UseFetchAccountResponse;\n};\n","import { useEffect } from 'react';\n\nimport { useFetchAccount } from 'api/user/use-fetch-account';\nimport { useFetchFeatureFlags } from 'api/user/use-fetch-feature-flags';\nimport { registerTrackedUser } from 'kognia/error-tracking/register-user';\nimport { FeatureFlags, User } from 'shared/types';\n\nexport type UseAppDataType = {\n featureFlags: FeatureFlags | undefined;\n user: User | undefined;\n};\n\ninterface UseAppDataInterface {\n data: UseAppDataType;\n isFetching: boolean;\n isError: boolean;\n isSuccess: boolean;\n isLoading: boolean;\n setQueryData: (...args: any[]) => void;\n}\n\nconst useAppData = (onAuthorizationError: () => void): UseAppDataInterface => {\n const fetchAccount = useFetchAccount(onAuthorizationError, registerTrackedUser);\n const fetchFeatureFlags = useFetchFeatureFlags();\n\n useEffect(() => {\n if (fetchAccount.isSuccess && !fetchAccount.isFetching) {\n fetchFeatureFlags.refetch && fetchFeatureFlags.refetch();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fetchAccount.isSuccess]);\n\n const setQueryData = (user: User, featureFlags: { [key in string]: string }) => {\n fetchAccount.setQueryData && fetchAccount.setQueryData(user);\n fetchFeatureFlags.setQueryData && fetchFeatureFlags.setQueryData(featureFlags);\n };\n\n return {\n data: {\n user: fetchAccount.data,\n featureFlags: fetchFeatureFlags.data,\n },\n isError: fetchAccount.isError || fetchFeatureFlags.isError,\n isSuccess: fetchAccount.isSuccess && fetchFeatureFlags.isSuccess,\n isFetching: fetchAccount.isFetching || fetchFeatureFlags.isFetching,\n isLoading: fetchAccount.isLoading || fetchFeatureFlags.isLoading,\n setQueryData,\n };\n};\n\nexport default useAppData;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconLoading = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconLoading;\n","import classNames from 'classnames';\nimport { animations } from 'kognia-ui';\n\nimport IconLoading from 'shared/components/icons/icon-loading';\nimport { SvgIconProps } from 'shared/components/icons/svg-icon/SvgIcon';\n\nimport styles from './Spinner.module.scss';\n\ninterface SpinnerProps extends SvgIconProps {\n isFullPage?: boolean;\n}\n\nconst Spinner = ({\n className,\n size = 'medium',\n color = 'primary',\n isFullPage = false,\n sx,\n ...restProps\n}: SpinnerProps) => (\n \n \n \n);\n\nexport default Spinner;\n","import { Backdrop } from '@mui/material';\n\nimport Spinner from '../spinner';\n\ninterface Props {\n isLoaded: boolean;\n}\n\nexport const AppLoading = ({ isLoaded }: Props) => {\n return (\n theme.palette.common.white, zIndex: (theme) => theme.zIndex.drawer + 1 }}\n open={!isLoaded}\n transitionDuration={500}\n >\n \n \n );\n};\n","import Cookies from 'js-cookie';\nimport React, { useCallback, useEffect } from 'react';\nimport { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { unregisterTrackedUser } from 'kognia/error-tracking/register-user';\nimport { User, UserAuthority } from 'shared/types/user/types';\n\nimport {\n appState,\n currentClientIdAtom,\n defaultFeatureFlagsState,\n defaultUserState,\n featureFlagsState,\n isAuthorizedAtom,\n userAtom,\n} from './atoms';\nimport useAppData, { UseAppDataType } from './use-app-data';\nimport { AppLoading } from '../../components/app-loading';\nimport usePageStateMachine, { PAGE_STATES } from '../../hooks/use-page-state-machine';\n\ntype AppStateProviderProps = { children: React.ReactNode };\n\nfunction useClientId() {\n const [clientId, updateClientId] = useRecoilState(currentClientIdAtom);\n\n const setClientId = useCallback(\n (newClientId: string) => {\n Cookies.set('current-client-id', newClientId, { expires: 365 });\n updateClientId(newClientId);\n },\n [updateClientId],\n );\n\n return {\n clientId,\n setClientId,\n };\n}\n\nexport const useClientIdValue = () => useRecoilValue(currentClientIdAtom);\n\nfunction useUnauthorize() {\n const setAppState = useSetRecoilState(appState);\n const setUserState = useSetRecoilState(userAtom);\n const setIsAuthorized = useSetRecoilState(isAuthorizedAtom);\n const setFeatureFlagState = useSetRecoilState(featureFlagsState);\n\n return () => {\n unregisterTrackedUser();\n setIsAuthorized(false);\n setFeatureFlagState(defaultFeatureFlagsState);\n setUserState(defaultUserState);\n setAppState(PAGE_STATES.ERROR);\n };\n}\n\nfunction AppStateProvider({ children }: AppStateProviderProps) {\n const setUser = useSetRecoilState(userAtom);\n const setFeatureFlags = useSetRecoilState(featureFlagsState);\n const logout = useUnauthorize();\n const setIsAuthorized = useSetRecoilState(isAuthorizedAtom);\n const setCurrentClientId = useSetRecoilState(currentClientIdAtom);\n const setAppState = useSetRecoilState(appState);\n\n const { current, data, PAGE_STATES } = usePageStateMachine(() =>\n useAppData(() => {\n logout();\n }),\n );\n\n useEffect(() => {\n if (current.matches(PAGE_STATES.READY) && data?.user && data?.featureFlags) {\n setUser(data.user);\n setIsAuthorized(true);\n setCurrentClientId(Cookies.get('current-client-id') || data.user.clients[0].id);\n setFeatureFlags(data.featureFlags);\n setAppState(PAGE_STATES.READY);\n } else {\n setAppState(current.value as PAGE_STATES);\n }\n }, [\n current.value,\n data?.user,\n data?.featureFlags,\n current,\n PAGE_STATES.READY,\n setUser,\n setIsAuthorized,\n setCurrentClientId,\n setFeatureFlags,\n setAppState,\n data,\n ]);\n\n const isAppSettled = current.matches(PAGE_STATES.READY) || current.matches(PAGE_STATES.ERROR);\n\n return (\n <>\n \n {children}\n \n );\n}\n\nfunction useFeatureFlag(featureFlag?: FEATURE_FLAG) {\n const featureFlags = useRecoilValue(featureFlagsState);\n\n return Boolean(featureFlags && !!featureFlag && featureFlags[featureFlag]);\n}\n\nfunction useAppStatus() {\n return useRecoilValue(appState);\n}\n\nfunction useIsAppSettled() {\n const status = useRecoilValue(appState);\n\n return status === PAGE_STATES.READY || status === PAGE_STATES.ERROR;\n}\n\nfunction useUser(): User {\n return useRecoilValue(userAtom);\n}\n\nfunction isUserAdmin() {\n const user = useRecoilValue(userAtom);\n\n return user.authorities.includes(UserAuthority.ROLE_ADMIN);\n}\n\nfunction useUserActiveClient() {\n const currentClientId = useRecoilValue(currentClientIdAtom);\n const user = useRecoilValue(userAtom);\n\n return user.clients.find((client) => client.id === currentClientId);\n}\n\nfunction useIsUserAuthorized() {\n return useRecoilValue(isAuthorizedAtom);\n}\n\nexport {\n AppStateProvider,\n useFeatureFlag,\n useAppStatus,\n useUser,\n useClientId,\n useUserActiveClient,\n useIsUserAuthorized,\n isUserAdmin,\n useIsAppSettled,\n useUnauthorize,\n};\n","import { Box, CSSObject, styled, Theme } from '@mui/material';\nimport MuiDrawer from '@mui/material/Drawer';\nimport { Colors } from 'kognia-ui';\n\nexport const openSidebarWidth = 256;\nexport const collapsedSidebarWidth = 73;\n\nconst openedMixin = (theme: Theme): CSSObject => ({\n width: openSidebarWidth,\n padding: `${theme.spacing(5)} ${theme.spacing(2)}`,\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflowX: 'hidden',\n});\n\nconst closedMixin = (theme: Theme): CSSObject => ({\n width: collapsedSidebarWidth,\n padding: `${theme.spacing(5)} ${theme.spacing(2)}`,\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n overflowX: 'hidden',\n});\n\nexport const SidebarLayoutSidebar = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open' })(\n ({ theme, open }) => ({\n width: openSidebarWidth,\n flexShrink: 0,\n whiteSpace: 'nowrap',\n boxSizing: 'border-box',\n ...(open && {\n ...openedMixin(theme),\n '& .MuiDrawer-paper': openedMixin(theme),\n }),\n ...(!open && {\n ...closedMixin(theme),\n '& .MuiDrawer-paper': closedMixin(theme),\n }),\n }),\n);\n\nexport const SidebarLayoutWrapper = styled(Box)({\n display: 'flex',\n width: '100%',\n minHeight: '100%',\n});\n\nexport const SidebarLayoutContent = styled(Box, { shouldForwardProp: (prop) => prop !== 'open' })<{ open: boolean }>(\n ({ open }) => ({\n backgroundColor: Colors.background,\n display: 'flex',\n justifyContent: 'center',\n flexGrow: 1,\n minHeight: '100%',\n maxWidth: open ? `calc(100% - ${openSidebarWidth}px)` : `calc(100% - ${collapsedSidebarWidth}px)`,\n }),\n);\n\nexport const UserAvatar = styled(Box)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n width: '24px',\n minWidth: '24px',\n height: '24px',\n marginRight: theme.spacing(0.25),\n borderRadius: '50%',\n overflow: 'hidden',\n '& img': {\n maxWidth: '100%',\n },\n}));\n\nexport const SidebarLogoWrapper = styled(Box, { shouldForwardProp: (prop) => prop !== 'spacingBottom' })<{\n spacingBottom: boolean;\n}>(({ theme, spacingBottom }) => ({\n ...(spacingBottom && {\n marginBottom: theme.spacing(2),\n }),\n}));\n\nexport const SidebarHeader = styled(Box, { shouldForwardProp: (prop) => prop !== 'open' })<{\n open: boolean;\n}>(({ theme, open }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexDirection: 'column',\n marginBottom: theme.spacing(1),\n paddingLeft: theme.spacing(0.5),\n paddingRight: theme.spacing(0.5),\n\n ...(open && {\n flexDirection: 'row',\n marginBottom: theme.spacing(6),\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(1),\n }),\n}));\n","import { Button, Tooltip, Popover, List, ListItem, Box, Divider, TextField } from '@mui/material';\nimport { Colors, fontSizes, themeBaseSpacing } from 'kognia-ui';\nimport React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport IconChevronDown from 'shared/components/icons/icon-chevron-down';\nimport IconDone from 'shared/components/icons/icon-done';\nimport { useClientId, useUser } from 'shared/contexts/app-state';\n\nimport { openSidebarWidth } from '../SideBarLayout.styled';\n\nconst LIST_ITEM_HEIGHT = 40;\nconst VISIBLE_CLIENTS_AMOUNT = 7;\nconst PADDING = themeBaseSpacing;\nconst LIST_HEIGHT = `${VISIBLE_CLIENTS_AMOUNT * LIST_ITEM_HEIGHT + PADDING}px`;\n\ntype Props = {\n isSidebarOpen: boolean;\n};\n\nexport const ClientDropdown = ({ isSidebarOpen }: Props) => {\n const { t } = useTranslation();\n const [anchorEl, setAnchorEl] = useState(null);\n const [searchValue, setSearchValue] = useState('');\n const history = useHistory();\n const user = useUser();\n const { clientId, setClientId } = useClientId();\n\n const open = Boolean(anchorEl);\n const hideText = !isSidebarOpen;\n const isLimitedListHeight = user.clients.length > VISIBLE_CLIENTS_AMOUNT;\n const getCurrentClient = () => user.clients.find((client) => client.id === clientId);\n const currentClientName = getCurrentClient()?.name || '';\n\n const handleClick = (event: React.MouseEvent) => {\n setSearchValue('');\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => setAnchorEl(null);\n\n const handleListItemClick = (id: string) => () => {\n setClientId(id);\n history.push(routes.HOME_PAGE);\n handleClose();\n };\n\n const handleChange = (event: React.ChangeEvent) => setSearchValue(event.target.value);\n\n const clients = user.clients.filter((client) => {\n if (!searchValue.trim()) {\n return true;\n }\n\n return client.name.toLocaleLowerCase().trim().includes(searchValue.toLocaleLowerCase());\n });\n\n return (\n <>\n \n }\n fullWidth\n sx={{\n justifyContent: hideText ? 'center' : 'space-between',\n paddingX: hideText ? 0 : 1,\n borderRadius: 1,\n // TODO use color from theme\n borderColor: Colors.iron,\n minWidth: 'auto',\n '& .MuiButton-endIcon': {\n marginLeft: 0,\n marginRight: 0,\n },\n }}\n size={'large'}\n >\n {!hideText && (\n \n {currentClientName}\n \n )}\n \n \n\n ({\n marginTop: theme.spacing(1),\n boxSizing: 'border-box',\n '& .MuiPaper-root': {\n minWidth: `calc(${openSidebarWidth}px - ${theme.spacing(4)})`,\n // TODO use color from theme\n border: `solid 1px ${Colors.ghost}`,\n boxShadow: '0 32px 40px -2px rgba(10, 22, 70, 0.12), 0 0 1px 0 rgba(10, 22, 70, 0.06)',\n },\n })}\n >\n \n {isLimitedListHeight && (\n <>\n \n ({\n width: `calc(100% - ${theme.spacing(3)})`,\n margin: theme.spacing(1, 0),\n })}\n />\n \n \n \n )}\n\n ({\n maxHeight: isLimitedListHeight ? LIST_HEIGHT : 'auto',\n height: isLimitedListHeight ? LIST_HEIGHT : 'auto',\n padding: theme.spacing(0.5, 0),\n overflowY: 'auto',\n })}\n >\n {clients.length ? (\n clients.map(({ name, id }) => (\n ({\n display: 'flex',\n justifyContent: 'space-between',\n height: `${LIST_ITEM_HEIGHT}px`,\n padding: theme.spacing(1, 2),\n fontSize: fontSizes.default,\n fontWeight: theme.typography.fontWeightMedium,\n cursor: 'pointer',\n '&: hover': {\n backgroundColor: theme.palette.action.hover,\n },\n })}\n >\n {name}\n {id === clientId && }\n \n ))\n ) : (\n {t('common:clients-dropdown.no-environments-found')}\n )}\n \n \n \n \n );\n};\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='30'%20height='28'%20fill='none'%20fill-rule='evenodd'%3e%3cpath%20d='M21.164%2018.978a2%202%200%200%201-1.998%201.998%202%202%200%200%201-1.998-1.998%202%202%200%200%201%201.998-1.998%202%202%200%200%201%201.998%201.998z'%20fill='%235ae2de'/%3e%3cpath%20d='M29.813%209.938a2%202%200%200%201-1.998%201.998%202%202%200%200%201-1.998-1.998%202%202%200%200%201%201.998-1.998%202%202%200%200%201%201.998%201.998z'%20fill='%235440f7'/%3e%3cpath%20d='M14.181%208.99c0%202.763-2.24%205.002-5.002%205.002s-5.002-2.24-5.002-5.002%202.24-5.002%205.002-5.002%205.002%202.24%205.002%205.002z'%20fill='%23205cfa'/%3e%3cg%20fill='%23111135'%3e%3cpath%20d='M28.155%200H18.114L.188%2017.926V28h10.041l17.927-17.958V0zm-.589.587v9.211L9.984%2027.413H.774V18.17L18.356.587h9.21zM10.176%200H.188v15.028l9.988-10.034V0zm-.589.587v4.164L.774%2013.605V.587h8.813z'/%3e%3cpath%20d='M19.165%208.989l-9.988%209.989%208.99%208.99h9.989v-9.989l-8.99-8.99zm0%20.831l8.402%208.402v9.158H18.41l-8.402-8.402%209.158-9.158z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"__VITE_ASSET__DskDv$7c__\"","export default \"__VITE_ASSET__CR4MNr49__\"","import { useClientIdValue, useUser } from '../../contexts/app-state';\nimport { Client } from '../../types/user/types';\n\nexport const useCurrentClient = (): Client => {\n const clientId = useClientIdValue();\n const user = useUser();\n\n return user.clients.find((client) => client.id === clientId) as Client;\n};\n","import KogniaLogoSmall from 'shared/assets/kognia-sports-logo-small.svg';\nimport KogniaLogotype from 'shared/assets/kognia-sports-logotype.svg';\nimport { ClientBranding } from 'shared/types/user/types';\n\nimport KogniaFavicon from '../../../../public/favicon.ico';\nimport { useCurrentClient } from '../use-current-client/useCurrentClient';\n\nexport const useBranding = (): ClientBranding => {\n const currentClient = useCurrentClient();\n\n return currentClient?.branding\n ? currentClient.branding\n : {\n displayName: 'Kognia Sports',\n navbarCollapsedLogoUrl: KogniaLogoSmall,\n navbarLogoUrl: KogniaLogotype,\n emailLogoUrl: KogniaLogotype,\n faviconUrl: KogniaFavicon,\n };\n};\n","import { styled } from '@mui/material';\n\nexport const LogoImg = styled('img')({\n width: '100%',\n maxWidth: '100%',\n});\n\nexport const LogoImgSmall = styled('img')({\n width: '100%',\n maxWidth: '40px',\n});\n","import { Box } from '@mui/material';\n\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\n\nimport { LogoImg, LogoImgSmall } from './styled/LogoImg';\n\ninterface Props {\n isSmall: boolean;\n}\n\nexport const SidebarLogo = ({ isSmall }: Props) => {\n const branding = useBranding();\n\n return (\n \n {isSmall ? (\n \n ) : (\n \n )}\n \n );\n};\n","import { useCallback } from 'react';\nimport { useHistory } from 'react-router-dom';\n\nexport const useRedirectTo = () => {\n const history = useHistory();\n\n return useCallback(\n (link: string) => {\n if (link.startsWith('http')) {\n return window.open(link);\n }\n\n return history.push(link);\n },\n [history],\n );\n};\n","import { List, ListItem, ListItemButton, ListItemIcon, Paper, styled } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nimport { openSidebarWidth } from '../SideBarLayout.styled';\n\nexport const MenuItem = styled(ListItem)(({ theme }) => ({\n paddingLeft: 0,\n paddingRight: 0,\n paddingBottom: theme.spacing(0.5),\n paddingTop: theme.spacing(0.5),\n}));\n\nexport const MenuButton = styled(ListItemButton)(({ theme }) => ({\n borderRadius: 8,\n paddingLeft: theme.spacing(1),\n paddingRight: 0,\n fontSize: fontSizes.default,\n '&:hover': {\n backgroundColor: Colors.titanPurple,\n },\n '&.Mui-selected': {\n backgroundColor: Colors.lavender,\n },\n}));\n\nexport const MenuIcon = styled(ListItemIcon)(({ theme }) => ({\n flexGrow: 0,\n minWidth: '24px',\n marginRight: theme.spacing(1),\n}));\n\ninterface SubMenuItemProps {\n bottomDivider?: boolean;\n}\n\nexport const SubMenuItem = styled(ListItem, {\n shouldForwardProp: (prop) => prop !== 'bottomDivider',\n})(({ bottomDivider }) => ({\n paddingLeft: 0,\n paddingRight: 0,\n paddingTop: 0,\n paddingBottom: 0,\n ...(bottomDivider && {\n borderBottom: `1px solid ${Colors.athens}`,\n }),\n}));\n\nexport const SubMenuButton = styled(ListItemButton)(({ theme }) => ({\n borderRadius: 0,\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(2),\n lineHeight: '22px',\n fontSize: fontSizes.default,\n '&:hover': {\n backgroundColor: 'transparent',\n color: theme.palette.primary.main,\n },\n '&.Mui-selected': {\n backgroundColor: 'transparent',\n color: theme.palette.primary.main,\n },\n}));\n\nexport const SubMenuPaper = styled(Paper)(({ theme }) => ({\n paddingTop: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n width: `calc(${openSidebarWidth}px - ${theme.spacing(4)})`,\n marginBottom: theme.spacing(1),\n}));\n\nexport const Menu = styled(List)(({ theme }) => ({\n paddingTop: 0,\n paddingBottom: 0,\n marginTop: theme.spacing(-0.5),\n marginBottom: theme.spacing(-0.5),\n}));\n","import { fontSizes } from 'kognia-ui';\nimport { matchPath } from 'react-router-dom';\n\nimport { routes, routesSections } from 'kognia/router/routes';\n\nconst routesValues = Object.values(routes);\n\nconst findRouteByLink = (link: string) => {\n return routesValues.find((route) => matchPath(link, { path: route, exact: true }));\n};\n\nconst isMatchingRoute = (currentLocation: string, link?: string) => {\n if (!link) return false;\n\n const currentMatchedRoute = findRouteByLink(currentLocation);\n const currentMatchedLink = findRouteByLink(link);\n\n return currentMatchedRoute === currentMatchedLink;\n};\n\nconst isMatchingAnyMenuItemLinkRoute = (currentLocation: string, itemLinks: string[]) => {\n return itemLinks.some((link) => isMatchingRoute(currentLocation, link));\n};\n\nconst isMatchingSection = (currentLocation: string, link?: string) => {\n if (!link) return false;\n\n const currentRouteSection = routesSections[findRouteByLink(currentLocation) ?? ''];\n const currentMatchedLink = routesSections[findRouteByLink(link) ?? ''];\n\n return Boolean(currentRouteSection && currentRouteSection && currentRouteSection === currentMatchedLink);\n};\n\nexport const getMenuItemSelected = (currentLocation: string, itemLinks: string[], link?: string) => {\n if (isMatchingRoute(currentLocation, link)) return true;\n if (isMatchingAnyMenuItemLinkRoute(currentLocation, itemLinks)) return true;\n if (isMatchingSection(currentLocation, link)) return true;\n\n return false;\n};\n\nexport const ListItemTextStyles = {\n fontSize: fontSizes.default,\n lineHeight: '24px',\n};\n","import { ListItemText, Tooltip } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React, { useCallback, useRef } from 'react';\n\nimport { MenuItem } from '..';\nimport { MenuButton, MenuIcon } from '../styled';\nimport { getMenuItemSelected, ListItemTextStyles } from '../utils';\n\ninterface Props {\n item: MenuItem;\n isSelected?: boolean;\n isSidebarOpen: boolean;\n onClick: (ref: React.RefObject) => void;\n}\n\nexport const SidebarMenuItem = ({ item, isSelected, onClick, isSidebarOpen }: Props) => {\n const ref = useRef(null);\n\n const isMenuItemSelected =\n isSelected || ('link' in item ? getMenuItemSelected(location.pathname, [], item.link) : false);\n\n const handleOnClick = useCallback(() => {\n onClick(ref);\n }, [onClick]);\n\n return (\n \n \n {item.icon}\n \n \n \n );\n};\n","import { ListItemText, Stack, Tooltip } from '@mui/material';\n\nimport { MenuItemTitle } from '../index';\nimport { MenuIcon } from '../styled';\nimport { ListItemTextStyles } from '../utils';\n\ninterface Props {\n item: MenuItemTitle;\n isSidebarOpen: boolean;\n}\n\nexport const SidebarMenuItemTitle = ({ item, isSidebarOpen }: Props) => {\n return (\n `1px solid ${theme.palette.divider}`,\n }}\n >\n \n {item.icon}\n \n \n \n );\n};\n","import { ClickAwayListener, Grow, ListItemText, Popper } from '@mui/material';\nimport React, { useCallback, useState } from 'react';\n\nimport { MenuItemLink, MenuItemParent, MenuItemType, MenuSubmenuItem } from '..';\nimport { useRedirectTo } from '../hooks/use-redirect-to';\nimport { SidebarMenuItem } from '../sidebar-menu-item';\nimport { Menu, SubMenuButton, SubMenuItem, SubMenuPaper } from '../styled';\nimport { getMenuItemSelected, ListItemTextStyles } from '../utils';\n\ninterface Props {\n item: MenuItemParent;\n isSidebarOpen: boolean;\n}\n\nexport const SidebarMenuItemWithOptions = ({ item, isSidebarOpen }: Props) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [popperRef, setPopperRef] = useState | null>(null);\n const redirectTo = useRedirectTo();\n\n const handleOnClick = useCallback((ref: React.RefObject) => {\n setPopperRef(ref);\n setIsMenuOpen(true);\n }, []);\n\n const handleOnClose = useCallback(() => {\n setIsMenuOpen(false);\n }, []);\n\n const subMenuLinks = item.items.filter((item) => item.type === MenuItemType.LINK) as MenuItemLink[];\n\n const isMenuSelected = getMenuItemSelected(\n location.pathname,\n subMenuLinks.map((item) => item.link),\n );\n\n const handleSubMenuClick = useCallback(\n (item: MenuSubmenuItem) => {\n if (item.type === MenuItemType.LINK) {\n redirectTo(item.link);\n handleOnClose();\n } else if (item.type === MenuItemType.CUSTOM_CLICK) {\n item.onClick();\n handleOnClose();\n }\n },\n [handleOnClose, redirectTo],\n );\n\n return (\n <>\n \n \n {({ TransitionProps }) => (\n \n \n \n \n {item.items?.map((subMenuItem, index) => (\n \n handleSubMenuClick(subMenuItem)}>\n \n \n \n ))}\n \n \n \n \n )}\n \n \n );\n};\n","import { useCallback, useMemo } from 'react';\n\nimport { isUserAdmin } from 'shared/contexts/app-state';\n\nimport { useRedirectTo } from './hooks/use-redirect-to';\nimport { SidebarMenuItem } from './sidebar-menu-item';\nimport { SidebarMenuItemTitle } from './sidebar-menu-item-title';\nimport { SidebarMenuItemWithOptions } from './sidebar-menu-item-with-options';\nimport { Menu, MenuItem } from './styled';\n\nexport enum MenuItemType {\n LINK = 'link',\n CUSTOM_CLICK = 'custom_click',\n PARENT = 'parent',\n TITLE = 'title',\n}\ninterface MenuItemBase {\n label: string;\n isAdminAccess?: boolean;\n isDisabled?: boolean;\n isHidden?: boolean;\n icon?: JSX.Element;\n bottomDivider?: boolean;\n}\n\nexport type MenuItemTitle = MenuItemBase & {\n type: MenuItemType.TITLE;\n};\n\nexport interface MenuItemLink extends MenuItemBase {\n link: string;\n type: MenuItemType.LINK;\n}\n\nexport interface MenuItemCustomClick extends MenuItemBase {\n onClick: () => void;\n type: MenuItemType.CUSTOM_CLICK;\n}\n\nexport type MenuSubmenuItem = MenuItemLink | MenuItemCustomClick;\n\nexport interface MenuItemParent extends MenuItemBase {\n items: MenuSubmenuItem[];\n type: MenuItemType.PARENT;\n}\n\nexport type MenuItem = MenuItemLink | MenuItemCustomClick | MenuItemParent | MenuItemTitle;\n\ninterface Props {\n menuItems: MenuItem[];\n isSidebarOpen: boolean;\n}\n\nexport const SidebarMenu = ({ menuItems, isSidebarOpen }: Props) => {\n const isAdmin = isUserAdmin();\n const redirectTo = useRedirectTo();\n\n const allowedMenuItems = useMemo(\n () => menuItems.filter((item) => !item.isAdminAccess || (item.isAdminAccess && isAdmin)),\n [isAdmin, menuItems],\n );\n\n const handleItemClick = useCallback(\n (item: MenuItem) => {\n if (item.type === MenuItemType.LINK) {\n redirectTo(item.link);\n } else if (item.type === MenuItemType.CUSTOM_CLICK) {\n item.onClick();\n }\n },\n [redirectTo],\n );\n\n return (\n \n {allowedMenuItems.map((item, index) => {\n if (item.isHidden) return null;\n if (item.type === MenuItemType.TITLE)\n return (\n \n \n \n );\n\n if (item.type === MenuItemType.PARENT) {\n return (\n \n \n \n );\n }\n\n return (\n \n handleItemClick(item)} isSidebarOpen={isSidebarOpen} />\n \n );\n })}\n \n );\n};\n","import { useCallback } from 'react';\nimport { atom, useRecoilState } from 'recoil';\n\nconst sidebarOpenState = atom({\n key: 'isSidebarOpen',\n default: true,\n});\n\nexport const useSidebar = () => {\n const [isSidebarOpen, setIsSidebarOpen] = useRecoilState(sidebarOpenState);\n\n const toggleSidebar = useCallback(() => setIsSidebarOpen(!isSidebarOpen), [setIsSidebarOpen, isSidebarOpen]);\n\n return {\n isSidebarOpen,\n toggleSidebar,\n };\n};\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='94'%20height='65'%20fill='%235440f7'%3e%3cpath%20d='M21.791%207.62c-.56-.544-.574-1.439-.03-2s1.439-.574%202-.03l6.284%206.099c.56.544.574%201.439.03%202s-1.439.574-2%20.03L21.791%207.62zm19.066-6.115c.253-.739%201.057-1.133%201.796-.88s1.133%201.057.88%201.796l-2.828%208.267c-.253.739-1.057%201.133-1.796.88s-1.133-1.057-.88-1.796l2.828-8.267zm-9.923.403c-.143-.768.363-1.506%201.131-1.649s1.506.363%201.649%201.131l1.715%209.205c.143.768-.363%201.506-1.131%201.649s-1.506-.363-1.649-1.131l-1.715-9.205z'/%3e%3cpath%20fill-rule='evenodd'%20d='M19.325%2057.552c4.725%204.725%2010.521%207.088%2017.388%207.088s12.663-2.363%2017.388-7.088%207.088-10.521%207.088-17.388v-.141a12.1%2012.1%200%200%201%2012.097-12.097h20.285V15.69H36.815c-3.331%200-6.476.629-9.433%201.887s-5.49%202.838-7.597%204.742c-.748-1.904-2.006-3.484-3.773-4.742s-3.705-1.887-5.813-1.887c-2.991%200-5.439.952-7.343%202.855S0%2022.896%200%2025.887s.952%205.439%202.855%207.343%204.351%202.855%207.343%202.855c.408%200%20.833-.034%201.275-.102s.833-.17%201.173-.306c-.136.612-.238%201.326-.306%202.142a28.31%2028.31%200%200%200-.102%202.346c0%206.867%202.362%2012.663%207.088%2017.388zm-6.17-28.707c-.748.748-1.734%201.122-2.957%201.122s-2.21-.374-2.957-1.122-1.122-1.734-1.122-2.957.374-2.209%201.122-2.957%201.734-1.122%202.957-1.122%202.21.374%202.957%201.122%201.122%201.734%201.122%202.957-.374%202.21-1.122%202.957zm23.714%2029.881c10.112%200%2018.309-8.197%2018.309-18.309s-8.197-18.309-18.309-18.309S18.56%2030.305%2018.56%2040.417s8.197%2018.309%2018.309%2018.309zm0-3.863a14.45%2014.45%200%200%201-14.446-14.446A14.45%2014.45%200%200%201%2036.869%2025.97a14.45%2014.45%200%200%201%2014.446%2014.446%2014.45%2014.45%200%200%201-14.446%2014.446zm10.159-14.446a10.16%2010.16%200%200%201-10.159%2010.159A10.16%2010.16%200%200%201%2026.71%2040.417a10.16%2010.16%200%200%201%2010.159-10.159%2010.16%2010.16%200%200%201%2010.159%2010.159zm18.477-23.556h-1v2.523h1v-2.523z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='1440'%20height='973'%20fill='none'%3e%3cmask%20id='A'%20maskUnits='userSpaceOnUse'%20x='0'%20y='0'%20width='1441'%20height='973'%3e%3cpath%20fill='%23d9d9d9'%20d='M0%20.764h1441V973H0z'/%3e%3c/mask%3e%3cg%20mask='url(%23A)'%3e%3cg%20opacity='.03'%3e%3cpath%20d='M1037.27-204.694h365.74l699.51%20699.115V860.6h-367.08l-698.17-699.116v-366.178zM1014-227.995v399.214l711.92%20712.785H2126V484.79l-713.27-712.785H1014zm23.35%20738.68h165.93L1556%20860.633h-518.65V510.685zM1014%20487.417v396.587h598.77l-399.73-396.587H1014z'%20fill='%235440f7'/%3e%3cpath%20d='M1404.73%20129.27l333.98-333.976h364v363.998l-333.98%20333.976-364-363.998zm-33.02%200l397.02%20397.023L2126%20169.024V-228h-397.02l-357.27%20357.27z'%20fill='%235440f7'/%3e%3c/g%3e%3cg%20opacity='.03'%3e%3cpath%20d='M947.79%2071.179v332.845L311.547%201040.63H-21.701V706.559l636.243-635.38H947.79zM968.995%2050H605.683L-43%20697.899v364.091h363.312l648.683-649.118V50zM296.746%2071.249v151.01L-21.73%20543.261V71.249h318.477zM317.921%2050H-43v544.92l360.921-363.784V50z'%20fill='%235440f7'/%3e%3cpath%20d='M643.861%20405.592l303.941%20303.941V1040.8H616.538L312.597%20736.855l331.264-331.263zm0-30.055L282.542%20736.855l325.14%20325.135H969V700.677l-325.139-325.14z'%20fill='%235440f7'/%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","import { Box, styled } from '@mui/material';\n\nexport interface ContainerWrapperProps {\n backgroundImage?: string;\n backgroundSize?: string;\n backgroundColor?: string;\n}\n\nexport const ContainerWrapper = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'backgroundImage' && prop !== 'backgroundSize' && prop !== 'backgroundColor',\n})(({ backgroundImage, backgroundSize, backgroundColor }) => ({\n display: 'flex',\n maxWidth: '100%',\n flexGrow: 1,\n justifyContent: 'center',\n ...(backgroundImage && {\n backgroundImage: `url(${backgroundImage})`,\n }),\n ...(backgroundSize && {\n backgroundSize: backgroundSize,\n }),\n ...(backgroundColor && {\n backgroundColor: backgroundColor,\n }),\n}));\n\ninterface ContentProps {\n fullScreen: boolean;\n}\n\nexport const Content = styled(Box, { shouldForwardProp: (prop) => prop !== 'fullScreen' })(\n ({ theme, fullScreen }) => ({\n [theme.breakpoints.up('md')]: {\n maxWidth: '992px',\n },\n [theme.breakpoints.up('lg')]: {\n maxWidth: '1200px',\n },\n [theme.breakpoints.down('md')]: {\n maxWidth: '100%',\n },\n width: '100%',\n ...(fullScreen && {\n height: '100vh',\n maxWidth: '100% !important',\n }),\n ...(!fullScreen && {\n paddingTop: theme.spacing(4),\n paddingBottom: theme.spacing(4),\n paddingRight: theme.spacing(6),\n paddingLeft: theme.spacing(6),\n }),\n }),\n);\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='236'%20height='236'%20fill='none'%3e%3ccircle%20cx='118'%20cy='118'%20r='118'%20fill='%23ededf2'/%3e%3cpath%20opacity='.48'%20fill-rule='evenodd'%20d='M234.918%20101.949l-27.876%2027.895%2023.556%2023.555-1.636%204.839-25.156-25.156-71.347%2071.396%2024.825%2024.825-4.874%201.601-23.188-23.188-27.193%2027.212-5.595-.894%2029.544-29.561-35.84-35.841%2077.846-77.847%2035.819%2035.819%2029.664-29.681v-3.357l1.451%208.383zm-50.216-81.301H159.76L20%20160.239v23.51l4.589%206.36v-28.005L161.668%2025.211h29.239l-6.205-4.563zm-133.404%200h46.463v39.026L20%20138.052V52.251l4.583-6.352v81.023l68.616-69.161V25.226H45.074l6.223-4.578zm77.917%20180.586l71.351-71.391-32.582-32.582-71.371%2071.371%2032.602%2032.602z'%20fill='%23bbb3ff'/%3e%3c/svg%3e\"","import { Box, Button, Link, styled, Typography } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\n\nimport IconCircleBackground from 'shared/assets/icon-circle-background.svg';\n\nexport const ErrorContainerWrapper = styled(Box)(() => ({\n minHeight: '100%',\n display: 'flex',\n width: '100%',\n}));\n\nexport const ErrorContainerContent = styled(Box)(() => ({\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n alignContent: 'center',\n alignItems: 'center',\n height: '100%',\n paddingBottom: '15%',\n}));\n\nexport const ErrorContainerTitle = styled(Typography)(({ theme }) => ({\n fontSize: fontSizes.xxLarge,\n color: Colors.primary,\n fontWeight: fontWeight['700'],\n textAlign: 'center',\n marginBottom: theme.spacing(1),\n}));\n\nexport const ErrorContainerText = styled(Typography)(() => ({\n fontSize: fontSizes.large,\n textAlign: 'center',\n}));\n\nexport const ErrorContainerButton = styled(Button)(({ theme }) => ({\n marginTop: theme.spacing(6),\n minWidth: '288px',\n}));\n\nexport const ErrorContainerLink = styled(Link)(() => ({\n '&.MuiLink-root': {\n color: Colors.primary,\n textDecoration: 'none',\n '&::after': {\n display: 'none !important',\n },\n '&:hover': {\n color: Colors.linkHover,\n },\n },\n}));\n\nexport const ErrorContainerImage = styled(Box)(({ theme }) => ({\n width: '236px',\n height: '236px',\n background: `url(${IconCircleBackground})`,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n marginBottom: theme.spacing(3.5),\n}));\n","import { Colors } from 'kognia-ui';\nimport React, { useCallback } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\n\nimport { routes } from 'kognia/router/routes';\nimport IconWhistle from 'shared/assets/icon-whistle.svg';\nimport PageBackground from 'shared/assets/page-background.svg';\nimport { ContainerWrapper } from 'shared/components/container/index.styled';\n\nimport {\n ErrorContainerButton,\n ErrorContainerContent,\n ErrorContainerImage,\n ErrorContainerLink,\n ErrorContainerText,\n ErrorContainerTitle,\n ErrorContainerWrapper,\n} from './index.styled';\n\nexport const ErrorContainer = () => {\n const { t } = useTranslation();\n\n const handleRefreshPage = useCallback(() => {\n window.location.reload();\n }, []);\n\n return (\n \n \n \n \n \n \n {t('common:error.something-went-wrong')}\n {t('common:error.try-again')}\n \n ,\n }}\n />\n \n \n {t('common:error.refresh-page')}\n \n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconBall = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconBall;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconDashboard = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconDoubleArrowLeft = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconDoubleArrowRight = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconHome = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconInfo = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconKeypadEmpty = (props: Omit): JSX.Element => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconPlaylist = (props: Omit): JSX.Element => {\n return (\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default IconPlaylist;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconTag = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconTag;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconTutorial = (props: Omit): JSX.Element => {\n return (\n \n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconUser = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { Backdrop, IconButton, styled } from '@mui/material';\nimport MuiDialog, { DialogProps } from '@mui/material/Dialog';\nimport React from 'react';\n\nimport IconClose from '../icons/icon-close';\n\ninterface DialogBackdropProps {\n disableBackground: boolean;\n}\n\nconst DialogBackdrop = styled(Backdrop, {\n shouldForwardProp: (prop) => prop !== 'disableBackground',\n})(({ disableBackground }) => ({\n ...(disableBackground && {\n backgroundColor: 'transparent',\n }),\n pointerEvents: 'none',\n}));\n\nconst DialogCloseButton = styled(IconButton)(({ theme }) => ({\n position: 'absolute',\n top: theme.spacing(1),\n right: theme.spacing(1),\n}));\n\ninterface Props extends DialogProps {\n disableBackground?: boolean;\n disableBackdropOnClose?: boolean;\n}\n\nexport const Dialog = ({\n disableBackground = false,\n disableBackdropOnClose = false,\n onClose,\n children,\n ...rest\n}: Props) => {\n return (\n ({ disableBackground }),\n }}\n >\n {children}\n\n {typeof onClose === 'function' ? (\n onClose && onClose(event, 'backdropClick')}>\n \n \n ) : null}\n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconArrowLeft = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconArrowRight = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconMinus = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconMinus;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconPlus = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconPlus;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconScrollDown = (props: Omit): JSX.Element => {\n return (\n \n \n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconScrollUp = (props: Omit): JSX.Element => {\n return (\n \n \n \n \n \n );\n};\n","export enum KeyboardKeyOptions {\n SpaceBar,\n ArrowRight,\n ArrowLeft,\n Control,\n Command,\n Alt,\n Plus,\n Minus,\n ScrollUp,\n ScrollDown,\n o,\n c,\n QuestionMark,\n f,\n}\n","import { styled } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nimport { IconArrowLeft } from 'shared/components/icons/icon-arrow-left';\nimport { IconArrowRight } from 'shared/components/icons/icon-arrow-right';\nimport IconMinus from 'shared/components/icons/icon-minus';\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { IconScrollDown } from 'shared/components/icons/icon-scroll-down';\nimport { IconScrollUp } from 'shared/components/icons/icon-scroll-up';\n\nimport { KeyboardKeyOptions } from '../../types/keyboard-key-options';\n\nconst KeyboardKeyContainer = styled('div')(({ theme }) => ({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '32px',\n backgroundColor: theme.palette.background.default,\n color: Colors.night,\n fontSize: fontSizes.small,\n padding: theme.spacing(0, 1),\n border: `1px solid ${Colors.storm}`,\n borderRadius: theme.shape.borderRadius,\n boxShadow: theme.shadows[3],\n}));\n\ninterface Props {\n keyItem: KeyboardKeyOptions;\n}\n\nexport const KeyboardKey = ({ keyItem }: Props) => {\n switch (keyItem) {\n case KeyboardKeyOptions.SpaceBar:\n return Space bar;\n case KeyboardKeyOptions.ArrowRight:\n return (\n \n \n \n );\n case KeyboardKeyOptions.ArrowLeft:\n return (\n \n \n \n );\n case KeyboardKeyOptions.Control:\n return Ctrl;\n case KeyboardKeyOptions.Command:\n return Cmd;\n case KeyboardKeyOptions.Alt:\n return Alt;\n case KeyboardKeyOptions.Plus:\n return (\n \n \n \n );\n case KeyboardKeyOptions.Minus:\n return (\n \n \n \n );\n case KeyboardKeyOptions.ScrollDown:\n return ;\n case KeyboardKeyOptions.ScrollUp:\n return ;\n case KeyboardKeyOptions.c:\n return c;\n case KeyboardKeyOptions.o:\n return o;\n case KeyboardKeyOptions.f:\n return f;\n case KeyboardKeyOptions.QuestionMark:\n return ?;\n default:\n return null;\n }\n};\n","import { Stack } from '@mui/material';\nimport { isArray } from 'lodash';\nimport { useTranslation } from 'react-i18next';\n\nimport { KeyboardKeyOptions } from '../../types/keyboard-key-options';\nimport { KeyboardKey } from '../keyboard-key';\n\ninterface Props {\n keys: KeyboardKeyOptions[][];\n}\n\nconst SingleShortcut = ({ keys }: { keys: KeyboardKeyOptions[] }) => {\n const shortcut = keys.map((key, index) => {\n if (index === keys.length - 1) {\n return ;\n }\n\n return (\n \n \n +\n \n );\n });\n\n return <>{shortcut};\n};\n\nexport const KeyboardShortcut = ({ keys }: Props) => {\n const { t } = useTranslation();\n if (!isArray(keys[0]) && keys.length === 1) {\n if (keys.length === 1) {\n return ;\n }\n\n return ;\n }\n\n if (keys.length === 1) {\n return ;\n }\n\n const keysGroups = keys.map((keyGroup, index) => {\n const isLast = index === keys.length - 1;\n\n return (\n \n \n {!isLast ? {t('common:keyboard-shortcuts.or')} : null}\n \n );\n });\n\n return <>{keysGroups};\n};\n","export const getIsMacOS = () => {\n if (typeof window !== 'undefined' && window.navigator) {\n const userAgent = window.navigator.userAgent;\n return /Mac OS X|Macintosh/.test(userAgent);\n }\n return false;\n};\n","import { Box, DialogContent, DialogTitle, Stack, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Dialog } from 'shared/components/dialog';\nimport { KeyboardShortcut } from 'shared/components/keyboard-shortcuts/components/keyboard-shortcut';\nimport { KeyboardKeyOptions } from 'shared/components/keyboard-shortcuts/types/keyboard-key-options';\nimport { getIsMacOS } from 'shared/utils/is-mac-os';\n\ntype ShortCut = {\n name: string;\n shortcut: ReactNode;\n};\n\ntype ShortCutsList = {\n name: string;\n shortcuts: ShortCut[];\n};\n\ninterface Props {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport const KeyboardShortcutsModal = ({ isOpen, onClose }: Props) => {\n const { t } = useTranslation();\n const isMacOs = getIsMacOS();\n\n const keyboardShortcuts: ShortCutsList[] = [\n {\n name: t('common:keyboard-shortcuts.global-shortcuts'),\n shortcuts: [\n {\n name: t('common:keyboard-shortcuts.toggle-help'),\n shortcut: ,\n },\n ],\n },\n {\n name: t('common:keyboard-shortcuts.video-player'),\n shortcuts: [\n {\n name: t('common:keyboard-shortcuts.play-pause'),\n shortcut: ,\n },\n {\n name: t('common:keyboard-shortcuts.fullscreen'),\n shortcut: ,\n },\n {\n name: t('common:keyboard-shortcuts.plus-five-seconds'),\n shortcut: ,\n },\n {\n name: t('common:keyboard-shortcuts.minus-five-seconds'),\n shortcut: ,\n },\n {\n name: t('common:keyboard-shortcuts.next-playlist-item'),\n shortcut: ,\n },\n {\n name: t('common:keyboard-shortcuts.previous-playlist-item'),\n shortcut: ,\n },\n {\n name: t('common:keyboard-shortcuts.hide-show-overlays'),\n shortcut: ,\n },\n ],\n },\n {\n name: t('common:keyboard-shortcuts.timeline'),\n shortcuts: [\n {\n name: t('common:keyboard-shortcuts.center-playhead'),\n shortcut: ,\n },\n {\n name: t('common:keyboard-shortcuts.zoom-in'),\n shortcut: (\n \n ),\n },\n {\n name: t('common:keyboard-shortcuts.zoom-out'),\n shortcut: (\n \n ),\n },\n ],\n },\n ];\n\n const keyboardShortcutsList = keyboardShortcuts.map((sectionItem) => {\n const shortcutsList = sectionItem.shortcuts.map((shortcutItem) => {\n return (\n \n \n {shortcutItem.shortcut}\n \n \n \n {shortcutItem.name}\n \n \n \n );\n });\n\n return (\n \n \n \n {sectionItem.name}\n \n \n {shortcutsList}\n \n );\n });\n\n return (\n \n \n Keyboard shortcuts\n \n \n {keyboardShortcutsList}\n \n \n );\n};\n","import { Box, Divider, IconButton } from '@mui/material';\nimport { ErrorBoundary } from '@sentry/react';\nimport React, { ReactNode, useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router-dom';\n\nimport { useLogOutAccount } from 'api/user/use-logout-account';\nimport { routes } from 'kognia/router/routes';\nimport { getIsFormTag } from 'shared/utils/is-form-tag';\n\nimport { ClientDropdown } from './client-dropdown/ClientDropdown';\nimport { SidebarLogo } from './sidebar-logo';\nimport { MenuItem, MenuItemType, SidebarMenu } from './sidebar-menu';\nimport {\n SidebarHeader,\n SidebarLayoutContent,\n SidebarLayoutSidebar,\n SidebarLayoutWrapper,\n SidebarLogoWrapper,\n UserAvatar,\n} from './SideBarLayout.styled';\nimport { FEATURE_FLAG } from '../../../api/user/use-fetch-feature-flags';\nimport { useFeatureFlag, useUser } from '../../contexts/app-state';\nimport { useSidebar } from '../../hooks/use-sidebar';\nimport { ErrorContainer } from '../error-boundary/error-container';\nimport IconBall from '../icons/icon-ball';\nimport { IconDashboard } from '../icons/icon-dashboard';\nimport { IconDoubleArrowLeft } from '../icons/icon-double-arrow-left';\nimport { IconDoubleArrowRight } from '../icons/icon-double-arrow-right';\nimport { IconHome } from '../icons/icon-home';\nimport { IconInfo } from '../icons/icon-info';\nimport { IconKeypadEmpty } from '../icons/icon-keypad-empty';\nimport IconPlaylist from '../icons/icon-playlist';\nimport IconTag from '../icons/icon-tag';\nimport { IconTutorial } from '../icons/icon-tutorial';\nimport { IconUser } from '../icons/icon-user';\nimport { KeyboardShortcutsModal } from '../keyboard-shortcuts-modal';\n\ninterface Props {\n children: ReactNode;\n}\n\nexport const SidebarLayoutComponent = ({ children }: Props) => {\n const history = useHistory();\n const [isKeyboardShortcutsModalOpen, setIsKeyboardShortcutsModalOpen] = useState(false);\n const showAppDashboards = useFeatureFlag(FEATURE_FLAG.APP_DASHBOARDS);\n const showAppDashboardPreview = useFeatureFlag(FEATURE_FLAG.APP_DASHBOARD_PREVIEW);\n\n const { t } = useTranslation();\n const { isSidebarOpen, toggleSidebar } = useSidebar();\n const { firstName, lastName, avatarUrl } = useUser();\n const { refetch: logOutUser } = useLogOutAccount();\n\n const handleDrawerChange = useCallback(() => toggleSidebar(), [toggleSidebar]);\n const handleKeyboardShortcutsModalOpen = useCallback(() => setIsKeyboardShortcutsModalOpen(true), []);\n const handleKeyboardShortcutsModalClose = useCallback(() => setIsKeyboardShortcutsModalOpen(false), []);\n const toggleKeyboardShortcutsModal = useCallback(() => setIsKeyboardShortcutsModalOpen((prev) => !prev), []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n const isFormTag = getIsFormTag((event.target as HTMLElement).tagName);\n if (isFormTag) return;\n if (event.key === '?') {\n toggleKeyboardShortcutsModal();\n }\n },\n [toggleKeyboardShortcutsModal],\n );\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown]);\n\n const primaryMenuItems: MenuItem[] = useMemo(() => {\n const items: MenuItem[] = [\n {\n label: t('common:navigation.home'),\n link: routes.HOME_PAGE,\n icon: ,\n type: MenuItemType.LINK,\n },\n {\n label: t('common:navigation.tactical-analysis'),\n link: routes.RECORDING_LIST,\n icon: ,\n type: MenuItemType.LINK,\n },\n {\n label: t('common:navigation.tagging'),\n link: routes.TAGGING_TOOL,\n icon: ,\n type: MenuItemType.LINK,\n },\n {\n label: t('common:navigation.playlists'),\n link: routes.PLAYLISTS,\n icon: ,\n type: MenuItemType.LINK,\n },\n {\n label: t('common:navigation.keypads'),\n link: routes.KEYPADS,\n icon: ,\n type: MenuItemType.LINK,\n },\n {\n label: t('Backoffice'),\n isAdminAccess: true,\n icon: ,\n onClick: () => history.push(routes.BACKOFFICE_GAMES),\n type: MenuItemType.CUSTOM_CLICK,\n },\n ];\n\n const dashboardPreviewItem: MenuItem[] = showAppDashboardPreview\n ? [\n {\n label: 'Dashboard preview',\n link: routes.DASHBOARD_PREVIEW,\n icon: ,\n type: MenuItemType.LINK,\n },\n ]\n : [];\n\n const dashboardItem: MenuItem[] = showAppDashboards\n ? [\n {\n label: t('common:navigation.explore'),\n link: routes.PLAYER_PROFILE_DASHBOARD,\n icon: ,\n type: MenuItemType.LINK,\n },\n ]\n : [];\n\n return [...items, ...dashboardItem, ...dashboardPreviewItem];\n }, [showAppDashboards, showAppDashboardPreview, history, t]);\n\n const footerMenuItems: MenuItem[] = useMemo(\n () => [\n {\n label: t('common:navigation.help'),\n icon: ,\n type: MenuItemType.PARENT,\n items: [\n {\n label: t('common:navigation.feedback'),\n link: routes.SUBMIT_FEEDBACK,\n type: MenuItemType.LINK,\n bottomDivider: true,\n },\n {\n label: t('common:navigation.keyboard-shortcuts'),\n type: MenuItemType.CUSTOM_CLICK,\n onClick: handleKeyboardShortcutsModalOpen,\n },\n ],\n },\n ],\n [t, handleKeyboardShortcutsModalOpen],\n );\n\n const accountMenuItems: MenuItem[] = [\n {\n label: `${firstName} ${lastName}`,\n type: MenuItemType.PARENT,\n icon: (\n \n {avatarUrl ? {`${firstName} : }\n \n ),\n items: [\n {\n label: t('common:navigation.user-profile'),\n link: routes.ACCOUNT,\n type: MenuItemType.LINK,\n },\n {\n label: t('common:actions.logout'),\n onClick: logOutUser,\n type: MenuItemType.CUSTOM_CLICK,\n },\n ],\n },\n ];\n\n return (\n \n \n \n
\n \n \n \n \n \n \n {isSidebarOpen ? : }\n \n \n \n\n \n
\n \n \n \n \n \n spacing(2, 0) }} />\n \n \n
\n
\n \n {children}\n \n \n
\n );\n};\n\nconst SidebarLayoutWithErrorBoundary = (props: JSX.IntrinsicAttributes & Props) => {\n return (\n }>\n \n \n );\n};\n\nexport { SidebarLayoutWithErrorBoundary as SidebarLayout };\n","import { SidebarLayout } from 'shared/components/sidebar-layout';\n\nimport { ErrorContainer } from '../error-container';\n\nexport const ErrorPage = () => {\n return (\n \n \n \n );\n};\n","import { useEffect, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { ErrorPage } from './error-page';\n\nexport const ErrorBoundaryPage = (props: { error: Error; resetError: () => void }) => {\n const [errorPageId, setErrorPageId] = useState('');\n const location = useLocation();\n\n useEffect(() => {\n if (props?.error && !errorPageId && location.key) {\n setErrorPageId(location.key);\n }\n }, [errorPageId, location.key, props?.error]);\n\n useEffect(() => {\n if (errorPageId && errorPageId !== location.key && props?.resetError) {\n setErrorPageId('');\n props.resetError();\n }\n }, [errorPageId, location.key, props, props?.resetError]);\n\n return ;\n};\n","import { QueryClientProvider } from '@tanstack/react-query';\nimport { ReactQueryDevtools } from '@tanstack/react-query-devtools';\nimport { ReactNode } from 'react';\n\nimport { queryClient } from '../config';\n\nexport const ApiQueryProvider = ({ children }: { children?: ReactNode }) => {\n return (\n \n \n {children}\n \n );\n};\n","import { SnackbarProvider } from 'notistack';\nimport React from 'react';\nimport { RecoilRoot } from 'recoil';\n\nimport { ApiQueryProvider } from 'api/context';\n\nimport { AppStateProvider } from '../app-state';\n\nconst AppContext = ({ children }: any) => {\n return (\n <>\n \n \n \n {children}\n \n \n \n \n );\n};\n\nexport default AppContext;\n","import { createBrowserHistory } from 'history';\n\nconst browserHistory = createBrowserHistory();\n\nexport default browserHistory;\n","export enum Locales {\n 'en-US' = 'en-US',\n 'es-ES' = 'es-ES',\n 'de-DE' = 'de-DE',\n}\n\nexport type Translations = {\n [key in Namespaces]: any;\n};\n\nexport enum Namespaces {\n 'ACCOUNT' = 'account',\n 'API' = 'api',\n 'CAMERA-SYSTEMS' = 'camera-systems',\n 'COMMON' = 'common',\n 'CREATE-TEAM' = 'create-team',\n 'DESCRIPTIONS' = 'descriptions',\n 'FORMS' = 'forms',\n 'FUNDAMENTALS' = 'fundamentals',\n 'HOME' = 'home',\n 'LANGUAGES' = 'languages',\n 'PLAYLISTS' = 'playlists',\n 'LOGIN' = 'login',\n 'PLAYLIST-DETAIL' = 'playlist-detail',\n 'RECORDINGS' = 'recordings',\n 'RECORDING' = 'recording',\n 'RECORDING-EDIT' = 'recording-edit',\n 'RECORDING-LIST' = 'recordings-list',\n 'RECORDING-PLAYLISTS' = 'recording-playlists',\n 'SHARE-PLAYLIST-MODAL' = 'share-playlist-modal',\n 'SWITCH_ENVIRONMENT' = 'switch-environment',\n 'TAGGING-TOOL' = 'tagging-tool',\n 'TIMELINE' = 'timeline',\n 'TUTORIALS' = 'tutorials',\n 'VIDEO-PLAYER' = 'video-player',\n 'FAQS' = 'faqs',\n 'FILTERS' = 'filters',\n}\n","import account from './account.json';\nimport api from './api.json';\nimport common from './common.json';\nimport createTeam from './create-team.json';\nimport descriptions from './descriptions.json';\nimport faqs from './faqs.json';\nimport filters from './filters.json';\nimport forms from './forms.json';\nimport fundamentals from './fundamentals.json';\nimport home from './home.json';\nimport languages from './languages.json';\nimport playlistDetail from './playlist-detail.json';\nimport playlists from './playlists.json';\nimport recordingEdit from './recording-edit.json';\nimport recordingPlaylists from './recording-playlists.json';\nimport recording from './recording.json';\nimport recordingsList from './recordings-list.json';\nimport recordings from './recordings.json';\nimport sharePlaylistModal from './share-playlist-modal.json';\nimport switchEnvironment from './switch-environment.json';\nimport taggingTool from './tagging-tool.json';\nimport timeline from './timeline.json';\nimport tutorials from './tutorials.json';\nimport videoPlayer from './video-player.json';\nimport { Namespaces } from '../../types';\n\nconst translations = {\n [Namespaces['ACCOUNT']]: account,\n [Namespaces['API']]: api,\n [Namespaces['COMMON']]: common,\n [Namespaces['CREATE-TEAM']]: createTeam,\n [Namespaces['DESCRIPTIONS']]: descriptions,\n [Namespaces['FORMS']]: forms,\n [Namespaces['FUNDAMENTALS']]: fundamentals,\n [Namespaces['HOME']]: home,\n [Namespaces['LANGUAGES']]: languages,\n [Namespaces['PLAYLIST-DETAIL']]: playlistDetail,\n [Namespaces['PLAYLISTS']]: playlists,\n [Namespaces['RECORDING']]: recording,\n [Namespaces['RECORDING-EDIT']]: recordingEdit,\n [Namespaces['RECORDING-LIST']]: recordingsList,\n [Namespaces['RECORDING-PLAYLISTS']]: recordingPlaylists,\n [Namespaces['RECORDINGS']]: recordings,\n [Namespaces['SHARE-PLAYLIST-MODAL']]: sharePlaylistModal,\n [Namespaces['SWITCH_ENVIRONMENT']]: switchEnvironment,\n [Namespaces['TAGGING-TOOL']]: taggingTool,\n [Namespaces['TIMELINE']]: timeline,\n [Namespaces['TUTORIALS']]: tutorials,\n [Namespaces['VIDEO-PLAYER']]: videoPlayer,\n [Namespaces['FAQS']]: faqs,\n [Namespaces['FILTERS']]: filters,\n};\n\nexport default translations;\n","import account from './account.json';\nimport api from './api.json';\nimport common from './common.json';\nimport createTeam from './create-team.json';\nimport descriptions from './descriptions.json';\nimport faqs from './faqs.json';\nimport filters from './filters.json';\nimport forms from './forms.json';\nimport fundamentals from './fundamentals.json';\nimport home from './home.json';\nimport languages from './languages.json';\nimport playlistDetail from './playlist-detail.json';\nimport playlists from './playlists.json';\nimport recordingEdit from './recording-edit.json';\nimport recordingPlaylists from './recording-playlists.json';\nimport recording from './recording.json';\nimport recordingsList from './recordings-list.json';\nimport recordings from './recordings.json';\nimport sharePlaylistModal from './share-playlist-modal.json';\nimport switchEnvironment from './switch-environment.json';\nimport taggingTool from './tagging-tool.json';\nimport timeline from './timeline.json';\nimport tutorials from './tutorials.json';\nimport videoPlayer from './video-player.json';\nimport { Namespaces } from '../../types';\n\nconst translations = {\n [Namespaces['ACCOUNT']]: account,\n [Namespaces['API']]: api,\n [Namespaces['COMMON']]: common,\n [Namespaces['CREATE-TEAM']]: createTeam,\n [Namespaces['DESCRIPTIONS']]: descriptions,\n [Namespaces['FORMS']]: forms,\n [Namespaces['FUNDAMENTALS']]: fundamentals,\n [Namespaces['HOME']]: home,\n [Namespaces['LANGUAGES']]: languages,\n [Namespaces['PLAYLIST-DETAIL']]: playlistDetail,\n [Namespaces['PLAYLISTS']]: playlists,\n [Namespaces['RECORDING']]: recording,\n [Namespaces['RECORDING-EDIT']]: recordingEdit,\n [Namespaces['RECORDING-LIST']]: recordingsList,\n [Namespaces['RECORDING-PLAYLISTS']]: recordingPlaylists,\n [Namespaces['RECORDINGS']]: recordings,\n [Namespaces['SHARE-PLAYLIST-MODAL']]: sharePlaylistModal,\n [Namespaces['SWITCH_ENVIRONMENT']]: switchEnvironment,\n [Namespaces['TAGGING-TOOL']]: taggingTool,\n [Namespaces['TIMELINE']]: timeline,\n [Namespaces['TUTORIALS']]: tutorials,\n [Namespaces['VIDEO-PLAYER']]: videoPlayer,\n [Namespaces['FAQS']]: faqs,\n [Namespaces['FILTERS']]: filters,\n};\n\nexport default translations;\n","import account from './account.json';\nimport api from './api.json';\nimport common from './common.json';\nimport createTeam from './create-team.json';\nimport descriptions from './descriptions.json';\nimport faqs from './faqs.json';\nimport filters from './filters.json';\nimport forms from './forms.json';\nimport fundamentals from './fundamentals.json';\nimport home from './home.json';\nimport languages from './languages.json';\nimport playlistDetail from './playlist-detail.json';\nimport playlists from './playlists.json';\nimport recordingEdit from './recording-edit.json';\nimport recordingPlaylists from './recording-playlists.json';\nimport recording from './recording.json';\nimport recordingsList from './recordings-list.json';\nimport recordings from './recordings.json';\nimport sharePlaylistModal from './share-playlist-modal.json';\nimport switchEnvironment from './switch-environment.json';\nimport taggingTool from './tagging-tool.json';\nimport timeline from './timeline.json';\nimport tutorials from './tutorials.json';\nimport videoPlayer from './video-player.json';\nimport { Namespaces } from '../../types';\n\nconst translations = {\n [Namespaces['ACCOUNT']]: account,\n [Namespaces['API']]: api,\n [Namespaces['COMMON']]: common,\n [Namespaces['CREATE-TEAM']]: createTeam,\n [Namespaces['DESCRIPTIONS']]: descriptions,\n [Namespaces['FORMS']]: forms,\n [Namespaces['FUNDAMENTALS']]: fundamentals,\n [Namespaces['HOME']]: home,\n [Namespaces['LANGUAGES']]: languages,\n [Namespaces['PLAYLIST-DETAIL']]: playlistDetail,\n [Namespaces['PLAYLISTS']]: playlists,\n [Namespaces['RECORDING']]: recording,\n [Namespaces['RECORDING-EDIT']]: recordingEdit,\n [Namespaces['RECORDING-LIST']]: recordingsList,\n [Namespaces['RECORDING-PLAYLISTS']]: recordingPlaylists,\n [Namespaces['RECORDINGS']]: recordings,\n [Namespaces['SHARE-PLAYLIST-MODAL']]: sharePlaylistModal,\n [Namespaces['SWITCH_ENVIRONMENT']]: switchEnvironment,\n [Namespaces['TAGGING-TOOL']]: taggingTool,\n [Namespaces['TIMELINE']]: timeline,\n [Namespaces['TUTORIALS']]: tutorials,\n [Namespaces['VIDEO-PLAYER']]: videoPlayer,\n [Namespaces['FAQS']]: faqs,\n [Namespaces['FILTERS']]: filters,\n};\n\nexport default translations;\n","import i18n, { Resource } from 'i18next';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport { initReactI18next } from 'react-i18next';\n\nimport deDE from './locales/de-DE';\nimport enUS from './locales/en-US';\nimport esES from './locales/es-ES';\nimport { Locales, Namespaces } from './types';\n\nexport const namespaces = Object.values(Namespaces);\n\nexport const resources: Resource = {\n [Locales['en-US']]: enUS,\n [Locales['es-ES']]: esES,\n [Locales['de-DE']]: deDE,\n};\n\nexport const initConfig = {\n resources,\n ns: namespaces,\n fallbackLng: Locales['en-US'],\n supportedLngs: [Locales['en-US'], Locales['es-ES'], Locales['de-DE']],\n defaultNS: 'common',\n interpolation: {\n escapeValue: false,\n },\n};\n\ni18n.use(initReactI18next).use(LanguageDetector).init(initConfig);\n\nexport default i18n;\n","import classnames from 'classnames';\nimport React, { useLayoutEffect, useRef } from 'react';\nimport './index.scss';\n\nexport type Props = React.HTMLProps & {\n id: string;\n label?: string;\n type?: string;\n suffix?: JSX.Element;\n autoSelect?: boolean;\n fullWidth?: boolean;\n};\n\nconst Input = (props: Props) => {\n const inputRef = useRef(null);\n const { type = 'text', id, label, suffix, autoSelect, ...rest } = props;\n\n useLayoutEffect(() => {\n if (autoSelect) {\n inputRef?.current?.select();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!label)\n return (\n <>\n \n {suffix ? {suffix} : null}\n \n );\n\n return (\n \n {label}\n \n {suffix ? {suffix} : null}\n \n );\n};\n\nexport default Input;\n","import Select, { Theme } from 'react-select';\n\nimport styles from './InputList.module.scss';\n\nexport type InputListOption = {\n value: string;\n label: string;\n};\n\ntype InputListProps = {\n disabled?: boolean;\n id: string;\n label?: string;\n onSelect: (option: InputListOption) => void;\n options: InputListOption[];\n selectedOption?: InputListOption;\n};\n\nconst InputList = ({ disabled, id, label, onSelect, options, selectedOption }: InputListProps) => {\n const handleChange = (option: InputListOption | null) => {\n option && onSelect(option);\n };\n\n const className = disabled ? styles.disabledInput : styles.inputList;\n\n return (\n
\n {label && (\n \n )}\n ({\n ...theme,\n colors: {\n ...theme.colors,\n primary: styles.colorBrand,\n primary25: styles.colorGrey,\n primary50: styles.colorGrey,\n },\n })}\n value={selectedOption}\n />\n
\n );\n};\n\nexport default InputList;\n","import Alert from '@mui/material/Alert';\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Locales } from 'kognia/i18n/types';\nimport Input from 'shared/components/input';\nimport InputList, { InputListOption } from 'shared/components/input-list';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\nimport { User } from 'shared/types';\n\nimport styles from './AccountForm.module.scss';\n\ntype AccountFormProps = {\n user: User;\n};\n\nconst AccountForm = ({ user }: AccountFormProps): JSX.Element => {\n const { t } = useTranslation();\n const branding = useBranding();\n const languageOptions = useMemo(\n () =>\n [\n { label: t('languages:english'), value: Locales['en-US'] },\n { label: t('languages:spanish'), value: Locales['es-ES'] },\n ] as InputListOption[],\n [t],\n );\n\n const getSelectedLocale = (locale: string, options: InputListOption[]) => {\n return options.find((option) => option.value === locale);\n };\n\n const selectedLocale = useMemo(() => getSelectedLocale(user.locale, languageOptions), [languageOptions, user.locale]);\n\n return (\n
\n
\n
\n {}} disabled />\n
\n\n
\n {}} disabled />\n
\n\n
\n {}} disabled />\n
\n\n
\n {}}\n selectedOption={selectedLocale}\n disabled\n />\n
\n\n
\n \n {t('account:info-alert', {\n clientDisplayName: branding.displayName,\n })}\n \n
\n
\n );\n};\n\nexport default AccountForm;\n","import { ErrorBoundary } from '@sentry/react';\nimport { ReactNode } from 'react';\n\nimport { ContainerWrapper, ContainerWrapperProps, Content } from './index.styled';\nimport { ErrorContainer } from '../error-boundary/error-container';\n\ninterface Props extends ContainerWrapperProps {\n children: ReactNode;\n fullScreen?: boolean;\n}\n\nconst Container = ({ children, fullScreen = false, backgroundImage, backgroundSize, backgroundColor }: Props) => {\n return (\n }>\n \n {children}\n \n \n );\n};\n\nexport default Container;\n","import { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport AccountForm from 'pages/account/components/account-form';\nimport Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { useUser } from 'shared/contexts/app-state';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\n\nconst AccountPageContainer = () => {\n const user = useUser();\n const { t } = useTranslation();\n const branding = useBranding();\n\n useEffect(() => {\n document.title = t('common:metas.title.account', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n return (\n \n \n \n \n \n );\n};\n\nexport default AccountPageContainer;\n","export enum SolutionCardVariants {\n TAGGING_TOOL = 'taggingTool',\n LIVE_RECORDINGS = 'liveRecordings',\n RECORDINGS = 'recordings',\n PLAYLISTS = 'playlists',\n}\n","import { SvgIcon, styled } from '@mui/material';\n\nexport const SolutionSvgIconContainer = styled(SvgIcon)(({ theme }) => ({\n maxWidth: '100%',\n height: 'auto',\n margin: theme.spacing(2, 0, 4, 0),\n}));\n","import { SvgIconProps } from '@mui/material';\n\nimport { SolutionSvgIconContainer } from '../solution-svg-icon-container/SolutionSvgIconContainer';\n\nexport const IconMatchAnalysis = ({ sx, ...props }: SvgIconProps) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n","import { SvgIconProps } from '@mui/material';\n\nimport { SolutionSvgIconContainer } from '../solution-svg-icon-container/SolutionSvgIconContainer';\n\nexport const IconPlaylists = ({ sx, ...props }: SvgIconProps) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n","import { SvgIconProps } from '@mui/material';\n\nimport { SolutionSvgIconContainer } from '../solution-svg-icon-container/SolutionSvgIconContainer';\n\nexport const IconTaggingTool = ({ sx, ...props }: SvgIconProps) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n","import React, { ReactNode } from 'react';\nimport { Link } from 'react-router-dom';\n\ntype LinkWithExternalProps = {\n to: string;\n onClick: ((event: any) => any) | undefined;\n children: ReactNode;\n className?: string;\n};\n\nconst LinkWithExternal = ({ to, children, ...props }: LinkWithExternalProps) => {\n // It is intended to be an external link\n if (/^https?:\\/\\//.test(to))\n return (\n \n {children}\n \n );\n\n // Finally, it is an internal link\n return (\n \n {children}\n \n );\n};\n\nexport default LinkWithExternal;\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nimport { SolutionCardVariants } from 'pages/home/types/solutionCardVariants';\n\nexport const SolutionCardWrapper = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'disabled' && prop !== 'variant',\n})<{ disabled?: boolean; variant: SolutionCardVariants }>(({ theme, variant, disabled }) => ({\n flex: 1,\n width: '224px',\n height: '352px',\n borderRadius: '8px',\n borderWidth: '4px',\n borderStyle: 'solid',\n transition: theme.transitions.create('all', {\n easing: theme.transitions.easing.easeInOut,\n duration: theme.transitions.duration.shorter,\n }),\n userSelect: 'none',\n\n '&:hover': {\n div: {\n opacity: 1,\n },\n },\n\n '&:active': {\n // TODO use from theme\n borderColor: Colors.ghost,\n },\n\n a: {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n alignItems: 'center',\n flex: 1,\n height: '100%',\n padding: theme.spacing(3, 2, 2),\n borderRadius: '8px',\n textDecoration: 'none',\n cursor: 'pointer',\n transition: theme.transitions.create('all', {\n easing: theme.transitions.easing.easeInOut,\n duration: theme.transitions.duration.shorter,\n }),\n\n '&:active, &:hover, &:focus, &:focus-within': {\n zIndex: 'auto',\n color: 'inherit',\n // TODO use from theme\n boxShadow: `0 32px 40px -2px rgba(10, 22, 70, 0.12), 0 0 1px 0 rgba(10, 22, 70, 0.06)`,\n },\n\n '&:after': {\n content: 'none',\n border: 0,\n },\n\n '&:active:after': {\n content: 'none',\n border: 'none',\n },\n\n [theme.breakpoints.up('xl')]: {\n padding: theme.spacing(4, 3, 3),\n },\n\n h3: {\n textAlign: 'center',\n },\n },\n\n ...(variant === SolutionCardVariants.TAGGING_TOOL && {\n '& h3': {\n color: theme.palette.common.white,\n },\n // TODO use from theme\n backgroundColor: Colors.brandPastel,\n borderColor: Colors.brandPastel,\n }),\n\n ...(variant === SolutionCardVariants.LIVE_RECORDINGS && {\n '& h3': {\n color: theme.palette.common.white,\n },\n background: theme.palette.tertiary.main,\n borderColor: theme.palette.tertiary.main,\n }),\n\n ...(variant === SolutionCardVariants.PLAYLISTS && {\n // TODO use from theme\n backgroundColor: Colors.peach,\n borderColor: Colors.peach,\n }),\n\n ...(variant === SolutionCardVariants.RECORDINGS && {\n // TODO use from theme\n backgroundColor: Colors.aqua,\n borderColor: Colors.aqua,\n }),\n\n ...(disabled && {\n background: theme.palette.grey[200],\n borderColor: theme.palette.grey[200],\n\n pointerEvents: 'none',\n\n '& h3': {\n color: theme.palette.secondary.light,\n },\n\n '& a': {\n cursor: 'default',\n\n '&:hover, &:focus, &:focus-within': {\n boxShadow: 'none',\n },\n },\n }),\n}));\n","import { ReactNode } from 'react';\n\nimport LinkWithExternal from 'kognia/router/link-with-external';\nimport { SolutionCardVariants } from 'pages/home/types/solutionCardVariants';\n\nimport { SolutionCardWrapper } from './ui/solution-card-wrapper/SolutionCardWrapper';\n\ninterface Props {\n variant: SolutionCardVariants;\n children: ReactNode;\n disabled?: boolean;\n to: string;\n}\n\nconst SolutionCard = ({ children, variant, disabled, to }: Props) => {\n return (\n \n event.preventDefault() : undefined}\n to={to}\n data-testid={`solution-card-${variant}`}\n >\n {children}\n \n \n );\n};\n\nexport default SolutionCard;\n","import { Box, Grid, styled } from '@mui/material';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport { SolutionCardVariants } from 'pages/home/types/solutionCardVariants';\n\nimport { IconMatchAnalysis } from './ui/icons/icon-match-analysis/IconMatchAnalysis';\nimport { IconPlaylists } from './ui/icons/icon-playlists/IconPlaylists';\nimport { IconTaggingTool } from './ui/icons/icon-tagging-tool/IconTaggingTool';\nimport SolutionCard from './ui/solution-card/SolutionCard';\n\nconst SolutionActionDescription = styled(Box)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n width: '100%',\n minHeight: '48px',\n padding: theme.spacing(1),\n borderRadius: '2px',\n backgroundColor: theme.palette.common.white,\n opacity: 0.6,\n lineHeight: '24px',\n textAlign: 'center',\n textTransform: 'uppercase',\n transition: theme.transitions.create('all', {\n easing: theme.transitions.easing.easeInOut,\n duration: theme.transitions.duration.shorter,\n }),\n}));\n\nconst SolutionCardContainer = styled(Box)(({ theme }) => ({\n margin: theme.spacing(2),\n}));\n\nexport const Solutions = () => {\n const { t } = useTranslation();\n\n return (\n \n \n \n \n

{t('home:solutions.tactical-analysis.title')}

\n \n {t('home:solutions.tactical-analysis.cta')}\n
\n
\n
\n\n \n \n \n

{t('home:solutions.tagging.title')}

\n \n {t('home:solutions.tagging.cta.start-tagging')}\n
\n
\n\n \n \n

{t('home:solutions.playlists.title')}

\n \n {t('home:solutions.playlists.cta')}\n
\n
\n
\n
\n );\n};\n","import { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { useUser } from 'shared/contexts/app-state';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\n\nimport styles from './HomeContainer.module.scss';\nimport { Solutions } from './ui/solutions/Solutions';\n\nexport const HomeContainer = () => {\n const user = useUser();\n const { t } = useTranslation();\n const branding = useBranding();\n\n useEffect(() => {\n document.title = t('common:metas.title.home', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n return (\n \n \n
\n

{t('home:welcome', { firstName: user.firstName })}

\n

{t('home:what-would-you-like-to-do')}

\n \n
\n
\n
\n );\n};\n\nexport default HomeContainer;\n","import { queryClient } from '../../config';\n\nexport const useAppQueryClient = () => {\n return { queryClient: queryClient };\n};\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { useAppQueryClient } from 'api/hooks/useAppQueryClient';\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { liveTaggingSessionUrl } from 'api/routes';\n\nimport { LiveTaggingSession } from '../types';\n\nexport const generateLiveSessionRef = (liveTaggingSessionId: string) => {\n return [`fetch-live-tagging-session:${liveTaggingSessionId}`];\n};\n\ninterface useFetchLiveTaggingSessionInterface {\n (liveTaggingSessionId: string): UseQueryResult & {\n setQueryData: (data: LiveTaggingSession) => void;\n };\n}\n\nexport const useFetchLiveTaggingSession: useFetchLiveTaggingSessionInterface = (liveTaggingSessionId) => {\n const fetchQueryRef = generateLiveSessionRef(liveTaggingSessionId);\n const { queryClient } = useAppQueryClient();\n\n const fetchRequest = useFetchRequest({\n queryRef: fetchQueryRef,\n url: liveTaggingSessionUrl(liveTaggingSessionId),\n transformer: (response: LiveTaggingSession) => response,\n });\n\n const invalidateQuery = () => queryClient.invalidateQueries(fetchQueryRef);\n const setQueryData = (data: LiveTaggingSession) => queryClient.setQueryData(fetchQueryRef, data);\n\n return { ...fetchRequest, invalidateQuery, setQueryData };\n};\n","import { useMutation } from '@tanstack/react-query';\nimport { useTranslation } from 'react-i18next';\n\nimport { useBackendApi } from 'api/hooks/useBackendApi';\nimport { liveTaggingSessionUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\n\nimport { LiveTaggingSession } from '../types';\nimport { useFetchLiveTaggingSession } from '../use-fetch-live-session';\n\ntype LiveTaggingSessionUpdate = {\n name: string;\n};\n\nexport const useUpdateLiveTaggingSession = (\n liveTaggingSessionId: string,\n onSuccess?: () => void,\n onError?: () => void,\n onSettled?: () => void,\n) => {\n const { t } = useTranslation();\n const { setQueryData } = useFetchLiveTaggingSession(liveTaggingSessionId);\n\n const onPatchSuccess = (data: LiveTaggingSession) => data;\n const triggerNotification = useNotifications();\n\n const updateLiveTaggingSession = useMutation(\n (params) => useBackendApi(liveTaggingSessionUrl(liveTaggingSessionId), HTTPMethod.PATCH, onPatchSuccess, params),\n {\n onMutate: async (params: LiveTaggingSessionUpdate) => {},\n onError: () => {\n if (onError) onError();\n triggerNotification({ type: NotificationType.ERROR, message: t('api:use-update-playlist.error') });\n },\n onSuccess: (updatedLiveTaggingSession) => {\n setQueryData && setQueryData(updatedLiveTaggingSession);\n if (onSuccess) onSuccess();\n },\n onSettled: () => {\n if (onSettled) onSettled();\n },\n },\n );\n\n const sendLiveTaggingSessionUpdate = (name: string) => {\n const updateParams = { name: name } as LiveTaggingSessionUpdate;\n updateLiveTaggingSession.mutate(updateParams);\n };\n\n return { sendLiveTaggingSessionUpdate, isLoading: updateLiveTaggingSession.isLoading };\n};\n","import { Button } from '@mui/material';\nimport isEqual from 'lodash/isEqual';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { LiveTaggingSession } from 'api/tagging-tool/types';\nimport Input from 'shared/components/input';\n\nimport styles from './LiveTaggingSessionEditForm.module.scss';\n\ntype LiveTaggingSessionEditFormProps = {\n initialData: LiveTaggingSession;\n onCancel: () => void;\n onSubmit: (params: string) => void;\n};\n\nconst LiveTaggingSessionEditForm = ({ initialData, onCancel, onSubmit }: LiveTaggingSessionEditFormProps) => {\n const { t } = useTranslation();\n const [liveTaggingSessionData, setLiveTaggingSessionData] = useState(initialData);\n\n const onChange = (event: React.ChangeEvent) => {\n setLiveTaggingSessionData({ ...liveTaggingSessionData, ...{ name: event.target.value } });\n };\n\n return (\n <>\n

{t('recording-edit:form.title')}

\n
\n \n
\n
\n \n {\n onSubmit(liveTaggingSessionData.name);\n }}\n variant='contained'\n >\n {t('common:actions.update')}\n \n
\n \n );\n};\n\nexport default LiveTaggingSessionEditForm;\n","import React, { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath, RouteComponentProps, useHistory } from 'react-router-dom';\n\nimport { useFetchLiveTaggingSession } from 'api/tagging-tool/use-fetch-live-session';\nimport { useUpdateLiveTaggingSession } from 'api/tagging-tool/use-update-live-session';\nimport { routes } from 'kognia/router/routes';\nimport Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport Spinner from 'shared/components/spinner';\n\nimport styles from './LiveTaggingSessionEditPage.module.scss';\nimport LiveTaggingSessionEditForm from '../live-tagging-session-edit-form';\n\ntype RouteParams = { recordingId: string };\n\nconst LiveTaggingSessionEditPage = ({ liveTaggingSessionId }: LiveTaggingSessionEditPageProps) => {\n const { data, isError, isFetching, isSuccess } = useFetchLiveTaggingSession(liveTaggingSessionId);\n const history = useHistory();\n const redirectToRecordingListPage = () => {\n const recordingListPath = generatePath(routes.TAGGING_TOOL);\n history.push(recordingListPath);\n };\n\n const { sendLiveTaggingSessionUpdate } = useUpdateLiveTaggingSession(liveTaggingSessionId, () =>\n redirectToRecordingListPage(),\n );\n\n const { t } = useTranslation();\n\n const [isPageReady, setIsPageReady] = useState(false);\n\n useEffect(() => {\n if (isError || (!isFetching && !isPageReady)) {\n if (isSuccess) {\n setIsPageReady(true);\n } else {\n setIsPageReady(false);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isFetching, isError]);\n\n const showLoading = !isPageReady && isFetching;\n const showPage = isPageReady && isSuccess;\n const showError = !isPageReady && isError;\n\n const onSubmit = (params: string) => {\n sendLiveTaggingSessionUpdate(params);\n };\n\n return (\n \n {showLoading && (\n \n \n \n )}\n {showPage && (\n \n {data && (\n redirectToRecordingListPage()}\n onSubmit={onSubmit}\n />\n )}\n \n )}\n {showError &&

{t('live-session-edit:error')}

}\n
\n );\n};\n\nconst LiveTaggingSessionEditContainer = (props: RouteComponentProps) => {\n const {\n match: {\n params: { recordingId },\n },\n } = props;\n\n return ;\n};\n\ntype LiveTaggingSessionEditPageProps = {\n liveTaggingSessionId: string;\n};\n\nexport default LiveTaggingSessionEditContainer;\n","import { Box, styled } from '@mui/material';\nimport React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst DialogActionsWrapper = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: `0 ${theme.spacing(4)} ${theme.spacing(4)} ${theme.spacing(4)}`,\n}));\n\nexport const DialogActions = ({ children }: Props) => {\n return {children};\n};\n","import { Box, styled } from '@mui/material';\nimport React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst DialogContentWrapper = styled(Box)(({ theme }) => ({\n padding: `0 ${theme.spacing(4)} ${theme.spacing(4)} ${theme.spacing(4)}`,\n}));\n\nexport const DialogContent = ({ children }: Props) => {\n return {children};\n};\n","import { DialogContentTextProps, styled } from '@mui/material';\nimport MuiDialogContentText from '@mui/material/DialogContentText';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nexport enum DialogTextVariants {\n Primary = 'primary',\n Secondary = 'secondary',\n}\n\ninterface DialogContentTextWrapperProps {\n textVariant: DialogTextVariants.Primary | DialogTextVariants.Secondary;\n}\n\nconst DialogContentTextWrapper = styled(MuiDialogContentText, {\n shouldForwardProp: (prop) => prop !== 'textVariant',\n})(({ theme, textVariant }) => ({\n fontSize: fontSizes.default,\n color: textVariant === DialogTextVariants.Secondary ? Colors.storm : Colors.night,\n marginBottom: theme.spacing(1),\n}));\n\ninterface Props extends DialogContentTextProps {\n textVariant?: DialogTextVariants.Primary | DialogTextVariants.Secondary;\n}\n\nexport const DialogContentText = ({\n children,\n textVariant = DialogTextVariants.Secondary,\n textAlign = 'center',\n ...rest\n}: Props) => {\n return (\n \n {children}\n \n );\n};\n","import { Box, styled } from '@mui/material';\nimport MuiDialogTitle from '@mui/material/DialogTitle';\nimport { Colors, fontSizes, fontWeight, letterSpacing } from 'kognia-ui';\nimport React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n icon?: React.ReactNode;\n}\n\nconst DialogHeaderWrapper = styled(Box)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n textTransform: 'uppercase',\n flexDirection: 'column',\n padding: theme.spacing(3),\n}));\n\nconst DialogTitle = styled(MuiDialogTitle)({\n fontSize: fontSizes.modalTitle,\n letterSpacing: letterSpacing.modalTitle,\n padding: 0,\n fontWeight: fontWeight.modalTitle,\n color: Colors.night,\n});\n\nconst DialogIcon = styled(Box)(({ theme }) => ({\n padding: theme.spacing(1.5),\n backgroundColor: Colors.background,\n borderRadius: '50%',\n marginBottom: theme.spacing(3),\n}));\n\nexport const DialogHeader = ({ children, icon }: Props) => {\n return (\n \n {icon && {icon}}\n {children}\n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconChevronRight = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { useUser } from 'shared/contexts/app-state';\nimport { Client } from 'shared/types/user/types';\n\ninterface UseSourceClientReturn {\n (clientIds: string[]): Client[];\n}\nexport const useCommonResourceClients = (): UseSourceClientReturn => {\n const user = useUser();\n\n return (clientIds: string[]) =>\n user.clients.reduce((acc: Client[], client: Client) => {\n if (!clientIds.includes(client.id)) return acc;\n\n return [...acc, client];\n }, []);\n};\n","import { Box, Button, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport debounce from 'lodash/debounce';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport SwitchEnvironmentBackground from 'shared/assets/page-background.svg';\nimport Container from 'shared/components/container';\nimport { Dialog } from 'shared/components/dialog';\nimport { DialogActions } from 'shared/components/dialog/dialog-actions';\nimport { DialogContent } from 'shared/components/dialog/dialog-content';\nimport { DialogContentText, DialogTextVariants } from 'shared/components/dialog/dialog-content-text';\nimport { DialogHeader } from 'shared/components/dialog/dialog-header';\nimport { IconChevronRight } from 'shared/components/icons/icon-chevron-right';\nimport { IconUser } from 'shared/components/icons/icon-user';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport Spinner from 'shared/components/spinner';\nimport { useClientId } from 'shared/contexts/app-state';\nimport { useCommonResourceClients } from 'shared/hooks/use-source-client';\nimport { Client } from 'shared/types/user/types';\n\nconst ClientButton = styled(Button)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'space-between',\n backgroundColor: Colors.background,\n height: '48px',\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(2),\n textTransform: 'none',\n}));\n\nconst ClientButtonsWrapper = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n gap: theme.spacing(1),\n}));\n\ninterface SwitchEnvironmentProps {\n resourceClientsIds: string[];\n}\n\nexport const SwitchEnvironment = ({ resourceClientsIds }: SwitchEnvironmentProps) => {\n const { t } = useTranslation();\n const [newClientId, setNewClientId] = useState(null);\n const history = useHistory();\n const { setClientId } = useClientId();\n const getCommonClients = useCommonResourceClients();\n const commonClients = getCommonClients(resourceClientsIds);\n const isLoading = Boolean(newClientId);\n\n const handleEnvironmentSwitch = useCallback((client: Client) => {\n setNewClientId(client.id);\n }, []);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleClientChange = useCallback(\n debounce((newClientId: string) => {\n setClientId(newClientId);\n setNewClientId(null);\n }, 500),\n [history, setClientId],\n );\n\n useEffect(() => {\n if (newClientId) {\n handleClientChange(newClientId);\n }\n }, [handleClientChange, newClientId, setClientId]);\n\n const handleClose = useCallback(() => {\n history.replace(routes.HOME_PAGE);\n }, [history]);\n\n const isSingleSelection = commonClients.length === 1;\n\n return (\n \n \n \n }>{t('switch-environment:modal.title')}\n \n \n {t('switch-environment:modal.text')}\n \n \n \n {isSingleSelection ? (\n handleEnvironmentSwitch(commonClients[0])}\n disabled={isLoading}\n >\n {t('switch-environment:modal.button', { clientName: commonClients[0].name })}\n \n ) : (\n \n {commonClients.map((client) => (\n \n ) : (\n \n )\n }\n key={client.id}\n fullWidth={true}\n size='large'\n disabled={isLoading}\n onClick={() => handleEnvironmentSwitch(client)}\n >\n {client.name}\n \n ))}\n \n )}\n \n \n \n \n );\n};\n","export const PLAYLIST_ITEM_GAP = 4;\nexport const PLAYLIST_ITEM_WIDTH = 152;\nexport const PLAYLIST_ITEM_HEIGHT = 70;\nexport const PLAYLIST_ITEM_FULL_WIDTH = PLAYLIST_ITEM_WIDTH + PLAYLIST_ITEM_GAP * 2;\n\nexport const PLAYLIST_TIMELINE_HEIGHT = 172;\nexport const PLAYLIST_TIMELINE_HEADER_HEIGHT = 56;\n\nexport const PLAYLIST_HEADER_HEIGHT = 56;\n","import { Grid, styled } from '@mui/material';\n\nimport { PLAYLIST_HEADER_HEIGHT, PLAYLIST_TIMELINE_HEIGHT } from '../config/Playlist.config';\n\nexport const PLAYLIST_VIDEO_PLAYER_HEIGHT = `calc(100% - ${PLAYLIST_HEADER_HEIGHT}px - ${PLAYLIST_TIMELINE_HEIGHT}px)`;\n\nexport const PlaylistVideoPlayerContainer = styled(Grid)({\n height: PLAYLIST_VIDEO_PLAYER_HEIGHT,\n});\n","import { Grid, Skeleton } from '@mui/material';\n\nimport { PLAYLIST_HEADER_HEIGHT, PLAYLIST_TIMELINE_HEIGHT } from 'entities/playlist/config/Playlist.config';\n\nimport { PlaylistVideoPlayerContainer } from '../../../../entities/playlist/ui/PlaylistVideoPlayerContainer';\n\nconst PlaylistDetailSkeleton = () => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default PlaylistDetailSkeleton;\n","import { z } from 'zod';\n\nimport { RecordingTeam } from 'pages/recordings-list/types';\nimport { Zones } from 'pages/tactical-analysis/components/tactical-analysis/filters/types';\n\nimport {\n RecordingFiltersScenariosOrTacticsInsideSchema,\n RecordingFiltersTacticSchema,\n RecordingFiltersTacticsSchema,\n RecordingsFiltersEventsSchema,\n RecordingsFiltersSchema,\n} from './schemas';\n\nexport enum RecordingTypes {\n ALL = 'all',\n TRAINING = 'training',\n GAME = 'game',\n}\n\nexport enum TacticalAnalysisStates {\n STARTED = 'STARTED',\n FINISHED = 'FINISHED',\n VALIDATED = 'VALIDATED',\n}\n\nexport interface TacticalAnalysis {\n id: string;\n recordingId: string;\n tacticalAnalysisGitCommit: string;\n numberOfEpisodes: number;\n startTime: Date;\n state: TacticalAnalysisStates;\n}\n\nexport enum VideoSourceStates {\n STARTED = 'STARTED',\n FINISHED = 'FINISHED',\n}\n\nexport interface VideoSourceState {\n playBackType: PlayBackTypes;\n viewType: ViewTypes;\n state: VideoSourceStates;\n}\n\nexport type Recording = {\n competitionName: string;\n date: Date;\n duration: number | null;\n extraTime: number | null;\n hasTaggingEvents: boolean;\n id: string;\n isLive: boolean;\n isProcessingVideo: boolean;\n matchDay: string;\n name: string;\n tacticalAnalysis: TacticalAnalysis | null;\n teams: RecordingTeam[];\n type: RecordingTypes;\n videoSourcesStates: VideoSourceState[];\n matchReportDownloadUrl: string | null;\n};\n\nexport type EditFormRecording = {\n homeTeamScore: number;\n awayTeamScore: number;\n competitionName: string;\n date: Date;\n duration: number | null;\n id: string;\n matchDay: string;\n name: string;\n type: RecordingTypes;\n};\n\nexport interface RecordingsGroup {\n matchDay: string;\n recordings: Recording[];\n}\n\nexport interface VideoSourceBase {\n id: string;\n recordingId: string;\n playBackType: PlayBackTypes;\n poster?: string | null;\n src: string;\n srcDownload?: string;\n videoView: VideoView;\n}\n\nexport interface VideoSource extends VideoSourceBase {\n duration: number;\n}\n\nexport interface VideoSourceAPI extends VideoSourceBase {\n duration: string;\n}\n\nexport interface VideoView {\n type: ViewTypes;\n}\n\nexport enum ViewTypes {\n TACTICAL = 'tactical',\n PANORAMA = 'panorama',\n UPLOAD = 'upload',\n}\n\nexport enum PlayBackTypes {\n VOD = 'vod',\n LIVE = 'live',\n}\n\nexport type RecordingByName = {\n awayTeamScore: number | null;\n competitionName?: string;\n date: Date;\n duration: number | null;\n homeTeamScore: number | null;\n id: string;\n matchDay?: string;\n name: string;\n videoSources: VideoSource[];\n type: RecordingTypes;\n hasTacticalAnalysis?: boolean;\n hasHomographies: boolean;\n};\n\nexport type ZoneValues = {\n [Zones.zone1]: boolean;\n [Zones.zone2]: boolean;\n [Zones.zone3]: boolean;\n [Zones.zone4]: boolean;\n};\n\nexport type RecordingFiltersTactic = z.TypeOf;\nexport type RecordingFiltersTactics = z.TypeOf;\nexport type RecordingsFiltersEvents = z.TypeOf;\nexport type RecordingFiltersScenariosOrTacticsInside = z.TypeOf;\nexport type RecordingsFilters = z.TypeOf;\n","import { PlayBackTypes, VideoSource, ViewTypes } from 'shared/types/recording/types';\n\nexport const getVODTacticalCameraVideo = (videoSources: VideoSource[]): VideoSource | undefined => {\n return videoSources.find(\n (source) => source.playBackType === PlayBackTypes.VOD && source.videoView.type === ViewTypes.TACTICAL,\n );\n};\n\nexport const getVODPanoramaVideoSource = (videoSources: VideoSource[]): VideoSource => {\n return (\n videoSources.find(\n (source) => source.playBackType === PlayBackTypes.VOD && source.videoView.type === ViewTypes.PANORAMA,\n )\n );\n};\n\nexport const getVODUploadedVideoSource = (videoSources: VideoSource[]): VideoSource | undefined => {\n return videoSources.find(\n (source) => source.playBackType === PlayBackTypes.VOD && source.videoView.type === ViewTypes.UPLOAD,\n );\n};\n\nexport const defaultEmptyVideoSource = {\n id: '',\n recordingId: '',\n playBackType: PlayBackTypes.LIVE,\n videoView: {\n type: ViewTypes.TACTICAL,\n },\n src: '',\n};\n\nexport const getDefaultVideoSource = (videoSources: VideoSource[]): VideoSource => {\n // TODO when the separation of recording and live tagging is done default parameter should be removed\n return (\n getVODTacticalCameraVideo(videoSources) ??\n getVODPanoramaVideoSource(videoSources) ??\n getVODUploadedVideoSource(videoSources) ??\n defaultEmptyVideoSource\n );\n};\n\nexport interface GetVideoSourcesResponse {\n tacticalCameraVideo: VideoSource;\n panoramicVideo: VideoSource;\n uploadedVideo: VideoSource;\n}\n\nexport const getVideoSources = (videoSources: VideoSource[]): GetVideoSourcesResponse => {\n return {\n tacticalCameraVideo: getVODTacticalCameraVideo(videoSources),\n panoramicVideo: getVODPanoramaVideoSource(videoSources),\n uploadedVideo: getVODUploadedVideoSource(videoSources),\n };\n};\n","export function iso8601DurationToSeconds(duration: string): number {\n const regex = /P(?:([0-9]+)D)?T?(?:([0-9]+)H)?(?:([0-9]+)M)?(?:([0-9.]+)S)?/;\n const matches = duration.match(regex);\n\n if (!matches) {\n throw new Error('Invalid ISO 8601 duration format');\n }\n\n const days = parseInt(matches[1], 10) || 0;\n const hours = parseInt(matches[2], 10) || 0;\n const minutes = parseInt(matches[3], 10) || 0;\n const seconds = parseFloat(matches[4]) || 0;\n\n return days * 86400 + hours * 3600 + minutes * 60 + seconds; // 86400 seconds in a day\n}\n","import memoize from 'lodash/memoize';\n\nexport const round = memoize((time: number) => {\n return Math.round((time + Number.EPSILON) * 100) / 100;\n});\n","export enum MatchSegmentTypes {\n FIRST = 'first',\n SECOND = 'second',\n FIRST_EXTRA = 'firstextra',\n SECOND_EXTRA = 'secondextra',\n PENALTY = 'penalty',\n}\n\nexport type SegmentConfig = {\n length: number;\n start: number;\n segment: {\n length: number;\n name: MatchSegmentTypes;\n start: number;\n };\n};\n","import { Episode } from 'shared/types';\nimport { MatchSegmentTypes, SegmentConfig } from 'shared/types/segment/types';\n\nexport const enrichEpisodesWithName = (episodes: Episode[]): Episode[] => {\n return episodes\n .sort((a, b) => (a.startTime > b.startTime ? 1 : -1))\n .map((episode, idx) => ({\n ...episode,\n name: `${idx + 1}`,\n }));\n};\nconst defaultMatchSegments = [\n {\n segment: {\n name: MatchSegmentTypes.FIRST,\n start: 0,\n length: 2700,\n },\n start: 0,\n length: 2700,\n },\n {\n segment: {\n name: MatchSegmentTypes.SECOND,\n start: 2700,\n length: 2700,\n },\n start: 2700,\n length: 2700,\n },\n];\nexport const enrichSegmentMatchStarts = (episodes: Episode[]): SegmentConfig[] => {\n if (episodes.length === 0) {\n return [];\n }\n\n const segments: SegmentConfig[] = [];\n\n defaultMatchSegments.forEach((matchSegment) => {\n const filteredEpisodes = episodes.filter((episode) => episode.matchSegment === matchSegment.segment.name);\n if (!filteredEpisodes.length) return;\n\n const episodeStartTime = Math.min(\n ...filteredEpisodes.map((episode) => {\n return episode.startTime;\n }),\n );\n const episodeEndTime = Math.max(\n ...filteredEpisodes.map((episode) => {\n return episode.endTime;\n }),\n );\n\n segments.push({\n ...matchSegment,\n start: episodeStartTime,\n length: episodeEndTime - episodeStartTime,\n });\n });\n\n return segments;\n};\nexport const generateMatchSegments = (episodes: Episode[]): SegmentConfig[] => {\n return enrichSegmentMatchStarts(episodes);\n};\n","import map from 'lodash/map';\n\nimport { RecordingFiltersScenariosOrTacticsInside, RecordingsFilters } from 'shared/types/recording/types';\nimport { MatchTeam } from 'shared/types/teams/types';\n\nimport { TacticalAnalysesFilters, TacticalAnalysesPlaylistItemsFiltersAPI } from './useEpisodesWithFilters/types';\n\nexport const transformFilters = (filters: TacticalAnalysesPlaylistItemsFiltersAPI): TacticalAnalysesFilters => {\n const eventsStarting = new Set(\n map(filters.eventStarting.options, (event, key: string) => {\n return key;\n }),\n );\n\n const eventsEnding = new Set(\n map(filters.eventEnding.options, (event, key: string) => {\n return key;\n }),\n );\n\n const scenarios = map(filters.scenario.options, (scenario, key: string) => {\n return { id: key, name: scenario.title };\n });\n\n const offensiveTactics = filters.tactic.options.offensive?.options\n ? map(filters.tactic.options.offensive.options, (tactic, key: string) => {\n return { id: key, name: tactic.title };\n })\n : [];\n\n const defensiveTactics = filters.tactic.options.defensive?.options\n ? map(filters.tactic.options.defensive.options, (tactic, key: string) => {\n return { id: key, name: tactic.title };\n })\n : [];\n\n function sortByJerseyNumber() {\n return (player1: { name: string }, player2: { name: string }) => {\n const matchPlayer1Number = player1.name.split('.')[0].split('-')[0];\n const matchPlayer2Number = player2.name.split('.')[0].split('-')[0];\n\n return Number(matchPlayer1Number) > Number(matchPlayer2Number) ? 1 : -1;\n };\n }\n\n const teams: MatchTeam[] = map(filters.team.options, (team, teamId) => {\n return {\n id: teamId,\n name: team.title,\n logo: '',\n players: map(team.options.players.options, (player, playerId) => ({\n id: playerId,\n name: player.title,\n })).sort(sortByJerseyNumber()),\n };\n });\n\n return {\n eventsStarting,\n eventsEnding,\n scenarios,\n tactics: {\n offensive: offensiveTactics,\n defensive: defensiveTactics,\n },\n teams,\n };\n};\n\nexport const transformScenariosOrTacticsInside = (\n filtersScenariosOrTacticsInside?: RecordingFiltersScenariosOrTacticsInside,\n) => {\n if (!filtersScenariosOrTacticsInside) return [];\n\n const offensiveTactics = filtersScenariosOrTacticsInside.tactics.offensive.filter((tactic) => {\n return tactic.tacticalFundamentalType !== '' || tactic.teamIds.length > 0 || tactic.playerIds.length > 0;\n });\n\n const defensiveTactics = filtersScenariosOrTacticsInside.tactics.defensive.filter((tactic) => {\n return tactic.tacticalFundamentalType !== '' || tactic.teamIds.length > 0 || tactic.playerIds.length > 0;\n });\n\n const tactics = offensiveTactics.concat(defensiveTactics);\n\n return [\n {\n ...filtersScenariosOrTacticsInside,\n tactics: tactics.length > 0 ? tactics : [],\n },\n ];\n};\n\nexport const transformFiltersForRequest = (filters: RecordingsFilters) => {\n return {\n ...filters,\n scenariosOrTacticsInside: transformScenariosOrTacticsInside(filters.scenariosOrTacticsInside),\n eventsEnding: filters.eventsEnding ?? undefined,\n eventsStarting: filters.eventsStarting ?? undefined,\n };\n};\n","import { RecordingVideoSourceAPI } from 'pages/recordings-list/api/types';\nimport { Episode, Match, MatchApi } from 'shared/types';\nimport { MatchWithEpisodes } from 'shared/types/match/types';\nimport { PlayBackTypes, VideoSource, ViewTypes } from 'shared/types/recording/types';\nimport { getDefaultVideoSource } from 'shared/utils/get-video-sources';\nimport { iso8601DurationToSeconds } from 'shared/utils/iso-8601-duration-to-time';\nimport { round } from 'shared/utils/round';\n\nimport { enrichEpisodesWithName, generateMatchSegments } from './utils';\nimport { TacticalAnalysesPlaylistItemsFiltersAPI } from '../../../../recording/useEpisodesWithFilters/types';\nimport { transformFilters } from '../../../../recording/utils';\n\nexport const transformRecordingVideoSources = (videoSources: RecordingVideoSourceAPI[]): VideoSource[] => {\n return videoSources.map((video) => ({\n id: video.id,\n recordingId: video.recordingId,\n src: video.src,\n srcDownload: video.srcDownload,\n poster: video.poster,\n duration: iso8601DurationToSeconds(video.duration),\n playBackType: video.playBackType as PlayBackTypes,\n videoView: {\n type: video.videoView.type as ViewTypes,\n },\n }));\n};\n\nexport interface MatchWithEpisodesAPIResponse {\n match: MatchApi;\n episodes: Episode[];\n filters: TacticalAnalysesPlaylistItemsFiltersAPI;\n}\n\nexport const transformMatchWithEpisodes = ({\n match,\n episodes,\n filters,\n}: MatchWithEpisodesAPIResponse): MatchWithEpisodes => {\n const videoSources = transformRecordingVideoSources(match.videoSources);\n\n const defaultVideoSource = getDefaultVideoSource(videoSources);\n const recordingMatch: Match = {\n id: match.id,\n clientIds: match.clientIds,\n title: match.title,\n videoSources,\n hasHomographies: match.hasHomographies,\n segments: match.segments.map((segment) => ({\n length: round(segment.length),\n start: round(segment.start),\n segment: {\n length: round(segment.segmentType.length),\n name: segment.segmentType.name,\n start: round(segment.segmentType.start),\n },\n })),\n teams: match.teams,\n defaultVideoSource,\n showOverlays: match.showOverlays,\n };\n\n const recordingEpisodes = enrichEpisodesWithName(episodes);\n\n return {\n matchSegments: generateMatchSegments(recordingEpisodes),\n match: recordingMatch,\n episodes: recordingEpisodes,\n filters: Object.keys(filters).length === 0 ? undefined : transformFilters(filters),\n };\n};\n","export interface RecordingTeam {\n name: string;\n logo: string;\n score: number;\n}\n\nexport enum RecordingAnnotationTypes {\n all = 'ALL',\n}\n\nexport enum RecordingFilters {\n ANNOTATION_TYPE = 'annotationType',\n COMPETITION = 'competition',\n DATE = 'date',\n MATCHDAY = 'matchday',\n TEAM = 'team',\n TYPE = 'type',\n}\n","import map from 'lodash/map';\n\nimport { transformRecordingVideoSources } from 'api/match/transformers/match/matchWithEpisodes';\nimport { LinkApiResponse } from 'api/types';\nimport { APIRecording, RecordingEditAPI } from 'pages/recordings-list/api/types';\nimport { RecordingFilters } from 'pages/recordings-list/types';\nimport { FilterOptions, FiltersList } from 'shared/types/filters/types';\nimport { Pagination } from 'shared/types/pagination/types';\nimport {\n EditFormRecording,\n PlayBackTypes,\n Recording,\n RecordingByName,\n RecordingTypes,\n TacticalAnalysis,\n VideoSourceStates,\n ViewTypes,\n} from 'shared/types/recording/types';\n\nimport { RecordingByNameAPIResponse } from '../types';\n\ninterface RecordingsResponseData {\n filters: FiltersList;\n page: Pagination;\n recordings: Recording[];\n}\n\ninterface RecordingsResponse {\n data: RecordingsResponseData;\n nextCursor: number;\n}\n\nconst mapAnnotationTypeFilters = (filters: FiltersList): FiltersList => {\n const allAnnotationFiltersApplied =\n map(filters[RecordingFilters.ANNOTATION_TYPE].options, (option) => option.isApplied).every(Boolean) ||\n map(filters[RecordingFilters.ANNOTATION_TYPE].options, (option) => !option.isApplied).every(Boolean);\n\n if (allAnnotationFiltersApplied)\n Object.values(filters[RecordingFilters.ANNOTATION_TYPE].options).forEach((option) => (option.isApplied = false));\n\n const newAnnotationTypeFilterOptions: FilterOptions = {\n ALL: { title: 'All', isApplied: allAnnotationFiltersApplied, options: {} },\n };\n Object.entries(filters[RecordingFilters.ANNOTATION_TYPE].options).forEach(\n (option) => (newAnnotationTypeFilterOptions[option[0]] = option[1]),\n );\n\n filters[RecordingFilters.ANNOTATION_TYPE].options = newAnnotationTypeFilterOptions;\n return filters;\n};\n\nexport const transformRecording = (r: APIRecording): Recording => {\n const isProcessingVideo =\n Boolean(r.videoSourcesStates?.length > 0) &&\n r.videoSourcesStates.every((videoSourceState) => videoSourceState.state === VideoSourceStates.STARTED);\n\n return {\n competitionName: r.competitionName ?? '',\n duration: r.duration,\n id: r.id,\n matchDay: r.matchday ?? '',\n name: r.name,\n type: r.type as RecordingTypes,\n isLive: r.isLive,\n date: new Date(r.date),\n extraTime: r.extraTime,\n teams: r.teams,\n hasTaggingEvents: r.hasTaggingEvents,\n tacticalAnalysis: r.tacticalAnalysis as TacticalAnalysis | null,\n videoSourcesStates: r?.videoSourcesStates\n ? r.videoSourcesStates.map((videoSourceState) => ({\n playBackType: videoSourceState.playBackType as PlayBackTypes,\n viewType: videoSourceState.viewType as ViewTypes,\n state: videoSourceState.state as VideoSourceStates,\n }))\n : [],\n isProcessingVideo,\n matchReportDownloadUrl: r.matchReportDownloadUrl,\n };\n};\n\nexport const transformEditRecording = (r: RecordingEditAPI): EditFormRecording => {\n return {\n awayTeamScore: r.away_team_score,\n homeTeamScore: r.home_team_score,\n competitionName: r.competitionName ?? '',\n duration: r.duration,\n id: r.id,\n matchDay: r.matchday ?? '',\n name: r.name,\n type: r.type as RecordingTypes,\n date: new Date(r.date),\n };\n};\n\nexport const transformRecordingByName = (r: RecordingByNameAPIResponse): RecordingByName => {\n return {\n awayTeamScore: r.away_team_score,\n competitionName: r.competitionName,\n duration: r.duration,\n homeTeamScore: r.home_team_score,\n id: r.id,\n matchDay: r.matchday,\n name: r.name,\n type: r.type as RecordingTypes,\n date: new Date(r.date),\n videoSources: transformRecordingVideoSources(r.videoSources),\n hasTacticalAnalysis: r.hasTacticalAnalysis,\n hasHomographies: r.hasHomographies,\n };\n};\n\nexport interface RecordingsAPIResponse {\n cards: {\n links: LinkApiResponse[];\n content: APIRecording[];\n page: Pagination;\n };\n filters: FiltersList;\n}\n\nexport const transformRecordings = (recording: RecordingsAPIResponse): RecordingsResponse => {\n return {\n data: {\n recordings: recording.cards.content.map(transformRecording),\n page: recording.cards.page,\n filters: mapAnnotationTypeFilters(recording.filters),\n },\n nextCursor: recording.cards.page.totalPages > recording.cards.page.number ? recording.cards.page.number + 1 : 0,\n };\n};\n","import reduce from 'lodash/reduce';\n\nimport { FilterOptions, FiltersList, Playlist, PlaylistItemWithoutVideoSources, TacticIdOrAll } from 'shared/types';\nimport { Pagination } from 'shared/types/pagination/types';\n\nimport { transformRecordingByName } from '../../recording/transformers';\nimport {\n PlaylistApiResponse,\n PlaylistFiltersAPIResponse,\n PlaylistItemApiResponse,\n PlaylistsWithFiltersAPIResponse,\n} from '../types';\n\nexport const transformPlaylistItem = (\n playlistItem: PlaylistItemApiResponse,\n recordingHasHomographies = false,\n): PlaylistItemWithoutVideoSources => {\n return {\n id: playlistItem.id,\n endTime: playlistItem.endTime,\n name: playlistItem.name,\n startTime: playlistItem.startTime,\n index: playlistItem.index,\n origin: playlistItem.origin,\n recordingId: playlistItem.recordingId,\n hasHomographies: recordingHasHomographies,\n fundamentalsSelected: {\n tacticalAnalysisId: playlistItem.fundamentalsSelected.tacticalAnalysisId,\n fundamentalsSelected: playlistItem.fundamentalsSelected.fundamentalsSelected as TacticIdOrAll[],\n },\n episodesVideos: playlistItem.episodesVideos.map((episodeVideo) => ({\n startTime: episodeVideo.startTime,\n endTime: episodeVideo.endTime,\n videoSrc: {\n endTime: episodeVideo.endTime,\n endTimeInMatch: episodeVideo.endTime,\n poster: episodeVideo.videoSrc.poster,\n src: episodeVideo.videoSrc.src,\n srcDownload: episodeVideo.videoSrc.srcDownload,\n startTime: episodeVideo.startTime,\n startTimeInMatch: episodeVideo.startTime,\n type: episodeVideo.videoSrc.playBackType,\n id: episodeVideo.videoSrc.id,\n },\n })),\n };\n};\n\nexport const transformPlaylist = (data: PlaylistApiResponse): Playlist => {\n const recordingsByName = data.recordings.map((recordingItem) => transformRecordingByName(recordingItem));\n return {\n createdAt: data.createdAt,\n clientId: data.clientId,\n description: data.description,\n id: data.id,\n name: data.name,\n playlistItems: data.playlistItems.map((playlistItem) =>\n transformPlaylistItem(\n playlistItem,\n recordingsByName.find((recording) => recording.id === playlistItem.recordingId)?.hasHomographies || false,\n ),\n ),\n poster: data.poster,\n duration: data.duration,\n user: {\n userId: data.user.userId,\n firstName: data.user.firstName,\n lastName: data.user.lastName,\n },\n updatedAt: data.updatedAt,\n recordings: recordingsByName,\n teams: data.teams,\n };\n};\n\ninterface PlaylistsResponseData {\n filters: FiltersList;\n page: Pagination;\n playlists: Playlist[];\n}\n\ninterface PlaylistsResponse {\n data: PlaylistsResponseData;\n nextCursor?: number;\n}\n\nconst transformFilters = (filters: PlaylistFiltersAPIResponse) => {\n return reduce(\n filters,\n (acc, filter, filterKey) => {\n return {\n ...acc,\n [filterKey]: {\n title: filter.title,\n options: reduce(\n filter.options,\n (acc, option, optionKey) => {\n return {\n ...acc,\n [optionKey]: { title: option.title },\n };\n },\n {} as FilterOptions,\n ),\n },\n };\n },\n {} as FiltersList,\n );\n};\n\nexport const transformPlaylists = (response: PlaylistsWithFiltersAPIResponse): PlaylistsResponse => {\n return {\n data: {\n playlists: response.playlists.content.map(transformPlaylist),\n page: response.playlists.page,\n filters: transformFilters(response.filters),\n },\n nextCursor:\n response.playlists.page.totalPages > response.playlists.page.number\n ? response.playlists.page.number + 1\n : undefined,\n };\n};\n","import { UseQueryResult } from '@tanstack/react-query';\nimport { useCallback, useMemo } from 'react';\n\nimport { transformPlaylist } from 'api/playlist/transformers';\nimport { playlistUrl } from 'api/routes';\nimport { Playlist } from 'shared/types';\n\nimport { queryClient } from '../../config';\nimport { useFetchRequest } from '../../hooks/useFetchRequest';\n\nexport const generateFetchPlaylistQueryRef = (playlistId: string) => `fetchPlaylist-playlistId:${playlistId}`;\n\ntype UseGetPlaylistResult = UseQueryResult & {\n setQueryData: (...args: any[]) => void;\n};\n\ninterface Parameters {\n playlistId: string;\n onSuccess?: (data: Playlist) => void;\n}\n\nconst fetchPlaylistQueryRef = 'fetchPlaylist';\n\nexport const invalidatePlaylistQuery = () => queryClient.invalidateQueries({ queryKey: [fetchPlaylistQueryRef] });\n\nexport const usePlaylist = ({ playlistId, onSuccess }: Parameters): UseGetPlaylistResult => {\n const queryRef = useMemo(() => [fetchPlaylistQueryRef, generateFetchPlaylistQueryRef(playlistId)], [playlistId]);\n const fetchRequest = useFetchRequest({\n queryRef: [fetchPlaylistQueryRef, generateFetchPlaylistQueryRef(playlistId)],\n url: playlistUrl(playlistId),\n transformer: transformPlaylist,\n options: {\n enabled: !!playlistId,\n },\n onSuccess,\n });\n\n const setQueryData = useCallback((data: Playlist) => queryClient.setQueryData(queryRef, data), [queryRef]);\n return { ...fetchRequest, setQueryData };\n};\n","import { UserPreset } from 'shared/types/user-preset/types';\n\nexport const transformUserPreset = (data: UserPreset[]): UserPreset[] => {\n return data;\n};\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { queryClient } from 'api/config';\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { userPresetsWithFiltersUrl } from 'api/routes';\nimport { UserPreset, UserPresetScope } from 'shared/types/user-preset/types';\n\nimport { transformUserPreset } from '../transformers';\n\ntype Result = UseQueryResult[]>;\n\ninterface Parameters {\n scope: UserPresetScope;\n onSuccess?: (data: UserPreset[]) => void;\n key?: string;\n ref?: string;\n prefix?: string;\n}\n\nconst queryRef = 'user-presets';\n\nexport const invalidateUserPresetsQuery = () => queryClient.invalidateQueries({ queryKey: [queryRef] });\n\nexport const useUserPresets = ({ scope, onSuccess, ref, key, prefix = '' }: Parameters): Result => {\n return useFetchRequest[]>({\n queryRef: [queryRef, `${queryRef}-${scope}-${key ?? ''}-${ref ?? ''}-${prefix}`],\n url: userPresetsWithFiltersUrl({ scope, ref, key }),\n transformer: transformUserPreset,\n onSuccess,\n options: {\n cacheTime: Infinity,\n staleTime: Infinity,\n },\n });\n};\n","import { z } from 'zod';\n\nimport { PRESET_SCHEMA } from 'shared/constants/user-presets/userPresetsSchema';\n\nexport type UserPresetValues = {\n [K in keyof typeof PRESET_SCHEMA]: z.TypeOf<(typeof PRESET_SCHEMA)[K]>;\n};\n\nexport type UserPresetKeysUnion = keyof UserPresetValues;\n\nexport enum UserPresetScope {\n timeline = 'timeline',\n playlist = 'playlist',\n videoPlayer = 'video-player',\n}\n\nexport interface UserPreset {\n scope: UserPresetScope;\n key: UserPresetKeysUnion;\n value: T;\n ref?: string;\n}\n","// NOTE: schema for getPreset function created based on this object\nexport const USER_PRESET_KEYS = {\n multiMatchAppliedFilters: 'multimatch-applied-filters',\n playingMode: 'playing-mode',\n selectedTactics: 'selected-tactics',\n zoomLevel: 'zoom-level',\n height: 'height',\n pinScenarios: 'pin-scenarios',\n headersWidth: 'headers-width',\n timeLineAppliedFilters: 'timeline-applied-filters',\n filters: 'filters',\n time: 'time',\n teamIdFocus: 'team-id-focus',\n showBallPossession: 'show-ball-possession',\n showNoBallPossession: 'show-no-ball-possession',\n speed: 'speed',\n} as const;\n","import { UserPresetScope } from 'shared/types/user-preset/types';\n\nimport { USER_PRESET_KEYS } from './userPresetsKeys';\n\nexport const playlistMultimatchAppliedFilters = {\n scope: UserPresetScope.playlist,\n key: USER_PRESET_KEYS.multiMatchAppliedFilters,\n} as const;\n","import { OverlayGeneratorChunkData, OverlayGeneratorStore } from '../index';\n\nconst CHUNKS_QUANTITY_TO_STORE = 10;\n\nconst getChunksToKeep = (data: OverlayGeneratorChunkData, currentChunkNumber: number): OverlayGeneratorChunkData => {\n const nextChunkNumber = currentChunkNumber + 1;\n const chunksToKeep = Object.entries(data).filter(\n ([key]) => Number(key) === currentChunkNumber || Number(key) === nextChunkNumber,\n );\n const chunksQuantityToRemove = CHUNKS_QUANTITY_TO_STORE - chunksToKeep.length;\n const chunksCleaned = Object.entries(data)\n .filter(([key]) => Number(key) !== currentChunkNumber && Number(key) !== nextChunkNumber)\n .slice(-chunksQuantityToRemove);\n\n const chunksToStore = [...chunksToKeep, ...chunksCleaned];\n\n return { ...chunksToStore.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}) };\n};\n\nexport const validateChunkData = (state: OverlayGeneratorStore, currentChunkNumber: number) => {\n const chunksToKeep = getChunksToKeep(state.chunkData, currentChunkNumber);\n\n return { ...state, data: chunksToKeep };\n};\n","import { createStore, StoreApi } from 'zustand/vanilla';\nimport { Homographies, INITIAL_QUALITY, PlayersPositions, QUALITY_TO_SCALE_FACTOR, TacticId } from '../main';\nimport { OverlayElementDebugInfo } from '../overlay-canvas-renderer';\nimport { Teams } from '../overlay-canvas-renderer/types';\nimport { PitchSize } from '../types';\nimport { OverlayTactic, Segment } from '../utils/loaders';\nimport { validateChunkData } from './utils/validateChunkData';\n\nconst DEFAULT_CHUNK_SIZE = 3750;\n\nexport const DEFAULT_DATA: OverlayGeneratorChunkData = {};\n\nexport type FrameInfo = {\n frameNumber: number;\n frameTactics: TacticId[];\n overlayElementsDebugInfo: OverlayElementDebugInfo[];\n};\n\nexport type MetaData = {\n pitch: { size: PitchSize; originalSize: PitchSize };\n video: { width: number; height: number; frameRate: number; duration: number; frameCount: number };\n teams: Teams;\n segments: Segment[];\n chunkSize: number;\n};\n\nexport const DEFAULT_META_DATA: MetaData = {\n pitch: {\n size: {\n width: 0,\n length: 0,\n },\n originalSize: { width: 0, length: 0 },\n },\n segments: [],\n video: { width: 0, height: 0, frameRate: 25, duration: 0, frameCount: 0 },\n teams: { homeTeam: { id: '', playerIds: [] }, awayTeam: { id: '', playerIds: [] } },\n chunkSize: DEFAULT_CHUNK_SIZE,\n};\n\nconst INITIAL_STATUS = {\n isLoadingData: false,\n isLoadingAsyncData: false,\n};\n\nexport const INITIAL_FRAME_INFO = {\n frameNumber: 0,\n frameTactics: [],\n overlayElementsDebugInfo: [],\n};\n\ntype OverlayGeneratorData = {\n homographies: Homographies;\n playersPositions: PlayersPositions;\n overlayTactics: OverlayTactic[];\n};\n\nexport type OverlayGeneratorChunkData = {\n [key in number]:\n | {\n status: 'success';\n data: OverlayGeneratorData;\n }\n | {\n status: 'error';\n data: undefined;\n };\n};\n\ntype Status = {\n isLoadingData: boolean;\n isLoadingAsyncData: boolean;\n};\n\nexport type OverlayGeneratorStore = {\n chunkData: OverlayGeneratorChunkData;\n renderScale: number;\n tacticalAnalysisId: string;\n recordingId: string;\n metaData: MetaData;\n status: Status;\n frameInfo: FrameInfo;\n};\n\nenum ActionTypes {\n SET_SUCCESS_CHUNK_DATA = 'SET_SUCCESS_CHUNK_DATA',\n SET_ERROR_CHUNK_DATA = 'SET_ERROR_CHUNK_DATA',\n SET_TACTICAL_ANALYSIS_ID = 'SET_TACTICAL_ANALYSIS_ID',\n SET_RECORDING_ID = 'SET_RECORDING_ID',\n SET_META_DATA = 'SET_META_DATA',\n RESET = 'RESET',\n SET_RENDER_SCALE = 'SET_RENDER_SCALE',\n START_LOADING_DATA = 'START_LOADING_DATA',\n START_LOADING_ASYNC_DATA = 'START_LOADING_ASYNC_DATA',\n FINISH_LOADING_DATA = 'FINISH_LOADING_DATA',\n FINISH_LOADING_ASYNC_DATA = 'FINISH_LOADING_ASYNC_DATA',\n SET_FRAME_INFO = 'SET_FRAME_INFO',\n VALIDATE_CHUNK_DATA_MEMORY = 'VALIDATE_CHUNK_DATA_MEMORY',\n}\n\ntype Actions =\n | { type: ActionTypes.SET_SUCCESS_CHUNK_DATA; chunkNumber: number; payload: OverlayGeneratorData }\n | { type: ActionTypes.SET_ERROR_CHUNK_DATA; chunkNumber: number }\n | { type: ActionTypes.SET_TACTICAL_ANALYSIS_ID; tacticalAnalysisId: string }\n | { type: ActionTypes.SET_RECORDING_ID; recordingId: string }\n | { type: ActionTypes.SET_META_DATA; payload: MetaData }\n | { type: ActionTypes.RESET }\n | { type: ActionTypes.START_LOADING_DATA }\n | { type: ActionTypes.START_LOADING_ASYNC_DATA }\n | { type: ActionTypes.FINISH_LOADING_DATA }\n | { type: ActionTypes.FINISH_LOADING_ASYNC_DATA }\n | { type: ActionTypes.SET_FRAME_INFO; frameInfo: FrameInfo }\n | { type: ActionTypes.SET_RENDER_SCALE; renderScale: number }\n | { type: ActionTypes.VALIDATE_CHUNK_DATA_MEMORY; chunkNumber: number };\n\nconst reducer = (state: OverlayGeneratorStore, action: Actions): OverlayGeneratorStore => {\n switch (action.type) {\n case ActionTypes.SET_SUCCESS_CHUNK_DATA:\n return {\n ...state,\n chunkData: { ...state.chunkData, [action.chunkNumber]: { status: 'success', data: action.payload } },\n };\n case ActionTypes.SET_ERROR_CHUNK_DATA:\n return {\n ...state,\n chunkData: { ...state.chunkData, [action.chunkNumber]: { status: 'error', data: undefined } },\n };\n case ActionTypes.SET_TACTICAL_ANALYSIS_ID:\n return { ...state, tacticalAnalysisId: action.tacticalAnalysisId, chunkData: DEFAULT_DATA };\n case ActionTypes.SET_RECORDING_ID:\n return { ...state, recordingId: action.recordingId, chunkData: DEFAULT_DATA };\n case ActionTypes.SET_META_DATA:\n return { ...state, metaData: action.payload };\n case ActionTypes.SET_RENDER_SCALE:\n return { ...state, renderScale: action.renderScale };\n case ActionTypes.START_LOADING_DATA:\n return { ...state, status: { ...state.status, isLoadingData: true } };\n case ActionTypes.START_LOADING_ASYNC_DATA:\n return { ...state, status: { ...state.status, isLoadingAsyncData: true } };\n case ActionTypes.FINISH_LOADING_DATA:\n return { ...state, status: { ...state.status, isLoadingData: false } };\n case ActionTypes.FINISH_LOADING_ASYNC_DATA:\n return { ...state, status: { ...state.status, isLoadingAsyncData: false } };\n case ActionTypes.SET_FRAME_INFO:\n return { ...state, frameInfo: action.frameInfo };\n case ActionTypes.VALIDATE_CHUNK_DATA_MEMORY:\n return validateChunkData(state, action.chunkNumber);\n case ActionTypes.RESET:\n return { ...state, chunkData: DEFAULT_DATA, metaData: DEFAULT_META_DATA, status: INITIAL_STATUS };\n default:\n return state;\n }\n};\n\ntype StoreActions = {\n setChunkData: (chunkNumber: number, payload: OverlayGeneratorData) => void;\n setErrorChunkData: (chunkNumber: number) => void;\n setTacticalAnalysisId: (tacticalAnalysisId: string) => void;\n setRecordingId: (recordingId: string) => void;\n setMetaData: (payload: MetaData) => void;\n reset: () => void;\n setRenderScale: (renderScale: number) => void;\n setFrameInfo: (frameInfo: FrameInfo) => void;\n startLoadingData: () => void;\n startLoadingAsyncData: () => void;\n finishLoadingData: () => void;\n finishLoadingAsyncData: () => void;\n validateChunkDataMemory: (chunkNumber: number) => void;\n};\n\nconst initStore = (): { store: StoreApi; actions: StoreActions } => {\n const store = createStore(() => ({\n chunkData: DEFAULT_DATA,\n metaData: DEFAULT_META_DATA,\n tacticalAnalysisId: '',\n recordingId: '',\n renderScale: QUALITY_TO_SCALE_FACTOR[INITIAL_QUALITY],\n status: INITIAL_STATUS,\n frameInfo: INITIAL_FRAME_INFO,\n }));\n\n const { getState, setState } = store;\n\n const actions = {\n setChunkData: (chunkNumber: number, payload: OverlayGeneratorData) =>\n setState(\n reducer(getState(), {\n type: ActionTypes.SET_SUCCESS_CHUNK_DATA,\n chunkNumber: chunkNumber,\n payload,\n }),\n ),\n setErrorChunkData: (chunkNumber: number) =>\n setState(\n reducer(getState(), {\n type: ActionTypes.SET_ERROR_CHUNK_DATA,\n chunkNumber: chunkNumber,\n }),\n ),\n setTacticalAnalysisId: (tacticalAnalysisId: string) =>\n setState(reducer(getState(), { type: ActionTypes.SET_TACTICAL_ANALYSIS_ID, tacticalAnalysisId })),\n setRecordingId: (recordingId: string) =>\n setState(reducer(getState(), { type: ActionTypes.SET_RECORDING_ID, recordingId })),\n setMetaData: (payload: MetaData) => setState(reducer(getState(), { type: ActionTypes.SET_META_DATA, payload })),\n reset: () => setState(reducer(getState(), { type: ActionTypes.RESET })),\n setRenderScale: (renderScale: number) =>\n setState(reducer(getState(), { type: ActionTypes.SET_RENDER_SCALE, renderScale })),\n startLoadingData: () => setState(reducer(getState(), { type: ActionTypes.START_LOADING_DATA })),\n finishLoadingData: () => setState(reducer(getState(), { type: ActionTypes.FINISH_LOADING_DATA })),\n startLoadingAsyncData: () => setState(reducer(getState(), { type: ActionTypes.START_LOADING_ASYNC_DATA })),\n finishLoadingAsyncData: () => setState(reducer(getState(), { type: ActionTypes.FINISH_LOADING_ASYNC_DATA })),\n setFrameInfo: (frameInfo: FrameInfo) =>\n setState(reducer(getState(), { type: ActionTypes.SET_FRAME_INFO, frameInfo })),\n validateChunkDataMemory: (chunkNumber: number) =>\n setState(reducer(getState(), { type: ActionTypes.VALIDATE_CHUNK_DATA_MEMORY, chunkNumber: chunkNumber })),\n };\n\n return { actions, store };\n};\n\nexport { initStore };\n","import { OverlayGeneratorChunkData } from '../index';\n\nexport const preloadData = (\n data: OverlayGeneratorChunkData,\n currentChunkNumber: number,\n currentFrame: number,\n chunkSize: number,\n) => {\n const percentageOfChunkToStartPreload = 0.5;\n const isNextChunkLoaded = data[currentChunkNumber + 1];\n const shouldPreloadNextChunk = currentFrame % chunkSize > chunkSize * percentageOfChunkToStartPreload;\n\n return !isNextChunkLoaded && shouldPreloadNextChunk;\n};\n","export const getChunkNumberFromFrameAndChunkSize = (frame: number, chunkSize: number) => {\n return Math.floor(frame / chunkSize);\n};\n","export const getVideoScale = (videoWidth: number, newWidth: number) => {\n return newWidth / videoWidth;\n};\n","interface MakeFetchParams {\n url: string;\n fetchInterface: any;\n headers?: HeadersInit;\n}\n\nexport const makeFetch = async ({ url, headers, fetchInterface }: MakeFetchParams): Promise => {\n const response = await fetch(url, { headers });\n\n if (response.status !== 200) {\n throw new Error(`Error fetching ${url}, status: ${response.status}, statusText: ${response.statusText}`);\n }\n\n return response.json();\n};\n","import { Homographies, TimeSeries } from '../main';\n\nexport const transformTimeSeries = (timeSeries: TimeSeries) => {\n const homographies: Homographies = {};\n\n for (const [frame, series] of Object.entries(timeSeries)) {\n homographies[Number(frame)] = [\n [series[1], series[2], series[3]],\n [series[4], series[6], series[7]],\n [series[8], series[9], series[10]],\n ];\n }\n\n return homographies;\n};\n","import { Duration } from 'luxon';\nimport { Homographies, PlayersPositions, TacticId, TimeSeries } from '../main';\nimport { OverlayElementGlyphs } from '../overlay-canvas-renderer/overlay-elements/interface';\nimport { Teams } from '../overlay-canvas-renderer/types';\nimport { OverlayElementNames } from '../types';\nimport { makeFetch } from './makeFetch';\nimport { transformTimeSeries } from './transformTimeSeries';\n\nexport interface RecordingOverlayData {\n overlayTactics: OverlayTactic[];\n trajectories: PlayersPositions;\n homographies: Homographies;\n}\n\ninterface OverlayData {\n overlayTactics: OverlayTactic[];\n trajectories: PlayersPositions;\n timeSeries: TimeSeries;\n}\n\nexport interface OverlayTactic {\n tacticTypeId: TacticId;\n startFrame: number;\n endFrame: number;\n overlayElements: OverlayElement[];\n}\n\nexport interface OverlayTacticWithGlyphs {\n tacticId: TacticId;\n startFrame: number;\n endFrame: number;\n overlayElementsGlyphs: OverlayElementGlyphs[];\n}\n\nexport interface OverlayElement {\n overlayElementTypeId: OverlayElementNames;\n startFrame: number;\n endFrame: number;\n references: Reference[];\n}\n\nexport type Reference =\n | {\n referenceType: ReferenceType.Players;\n values: string[];\n }\n | {\n referenceType: ReferenceType.StaticCoordinates;\n values: [[number, number][]];\n };\n\nexport enum ReferenceType {\n Players = 'players',\n StaticCoordinates = 'static-coordinates',\n}\n\nexport type Segment = {\n segmentType: {\n name: string;\n start: number;\n length: number;\n };\n startFrame: number;\n endFrame: number;\n pitchLeftSideTeamId: string;\n pitchRightSideTeamId: string;\n};\n\ninterface OverlayElementsMetaDataApi {\n pitchSize: { length: number; width: number };\n segments: Segment[];\n video: { height: number; width: number; frameRate: number; duration: string };\n teams: Teams;\n}\n\nexport interface OverlayElementsMetaData extends OverlayElementsMetaDataApi {\n video: { height: number; width: number; frameRate: number; duration: string; frameCount: number };\n}\n\ninterface LoadMetaDataParams {\n recordingId: string;\n domainUrl?: string;\n headers?: HeadersInit;\n fetchInterface: any;\n}\n\nexport const loadMetaData = async ({\n recordingId,\n domainUrl = '',\n headers,\n fetchInterface,\n}: LoadMetaDataParams): Promise => {\n const overlayMetaData = await makeFetch({\n url: `${domainUrl}/api/overlay-elements-metadata?recordingId=${recordingId}`,\n headers,\n fetchInterface,\n });\n\n return {\n ...overlayMetaData,\n video: {\n ...overlayMetaData.video,\n frameCount:\n (Duration.fromISO(overlayMetaData.video.duration).toMillis() / 1000) * overlayMetaData.video.frameRate,\n },\n };\n};\n\ninterface LoadChunkParams {\n tacticalAnalysisId: string;\n startFrame: number;\n endFrame: number;\n domainUrl?: string;\n headers?: HeadersInit;\n fetchInterface: any;\n}\n\nexport const loadChunk = async ({\n tacticalAnalysisId,\n startFrame,\n endFrame,\n domainUrl = '',\n headers,\n fetchInterface,\n}: LoadChunkParams) => {\n const { overlayTactics, trajectories, timeSeries } = await makeFetch({\n url: `${domainUrl}/api/overlay-data/${tacticalAnalysisId}?startFrame=${startFrame}&endFrame=${endFrame}&smoothingEnabled=true`,\n headers,\n fetchInterface,\n });\n\n const homographies = transformTimeSeries(timeSeries);\n\n return {\n homographies,\n trajectories,\n overlayTactics,\n };\n};\n","import { multiply } from 'mathjs';\nimport { Homography } from '../types';\n\n// Function that given a 3x3 homography matrix it returns the matrix upscale by a value\nexport const scaleMatrix = (matrix: number[][], matrixScale: number, videoScale: number): Homography => {\n const upscaleMatrix = [\n [1 / matrixScale, 0, 0],\n [0, 1 / matrixScale, 0],\n [0, 0, 1],\n ];\n\n const videoScaleMatrix = [\n [videoScale, 0, 0],\n [0, videoScale, 0],\n [0, 0, 1],\n ];\n\n const adjustedByVideoScale = multiply(videoScaleMatrix, matrix);\n\n return multiply(adjustedByVideoScale, upscaleMatrix) as Homography;\n};\n","export const transformHomographyIntoMatrix3d = (h: number[][]) => {\n return [h[0][0], h[1][0], 0, h[2][0], h[0][1], h[1][1], 0, h[2][1], 0, 0, 1, 0, h[0][2], h[1][2], 0, h[2][2]];\n};\n","import { OverlayRenderer } from './overlay-canvas-renderer';\nimport { initStore, MetaData, OverlayGeneratorChunkData } from './store';\nimport { preloadData } from './store/utils/preloadData';\nimport { Coordinates, Events, Homography, Size } from './types';\n\nimport { LogEvent, Time } from './utils/decorators';\nimport { getChunkNumberFromFrameAndChunkSize } from './utils/getChunkNumberFromFrameAndChunkSize';\nimport { getVideoScale } from './utils/getVideoScale';\nimport { loadChunk, loadMetaData, OverlayElementsMetaData, RecordingOverlayData } from './utils/loaders';\nimport { scaleMatrix } from './utils/scaleMatrix';\nimport { transformHomographyIntoMatrix3d } from './utils/transformHomographyIntoMatrix3d';\n\nexport const offensiveTactics = [\n 'accompany-play-team-together',\n 'balance-of-the-team-after-recovery',\n 'cross-into-the-box',\n 'finishing',\n 'finishing-after-cross',\n 'finishing-pass',\n 'goal',\n 'goal-assist',\n 'goal-chance',\n 'goal-kick-start-long-inside-channels',\n 'goal-kick-start-long-outside-channels',\n 'goal-kick-start-short-inside-channels',\n 'goal-kick-start-short-outside-channels',\n 'identifying-passing-lines-under-pressure',\n 'long-ball',\n 'lost-ball',\n 'moving-behind-the-defensive-line',\n 'occupying-space-in-the-box',\n 'open-passing-lines-after-long-ball',\n 'overcoming-opponents-with-vertical-passes',\n 'passing-between-lines',\n 'pass-behind-defensive-line',\n 'positioning-behind-center-backs-when-lateral-balls',\n 'possession-after-recovery',\n 'progression-after-recovery',\n 'realized-emergency-support',\n 'realized-finishing-support',\n 'realized-horizontal-overcoming-support',\n 'realized-striker-support',\n 'realized-vertical-overcoming-support',\n 'receive-foul-after-recovery',\n 'receiving-between-lines',\n 'receiving-positioning-between-lines',\n 'running-into-the-box',\n 'second-ball-offensive-winning-after-cross',\n 'second-ball-offensive-winning-after-direct-play',\n 'second-ball-offensive-winning-after-finishing',\n 'second-ball-offensive-winning-after-set-piece',\n 'space-between-defensive-line-and-halfway-line',\n 'supports',\n 'switch-of-play',\n 'taking-advantage-of-defensive-line-imbalances',\n 'width-of-the-team',\n 'width-of-the-team-opposite-channel',\n] as const;\n\nexport const defensiveTactics = [\n 'balance-of-the-team',\n 'balance-of-the-team-after-loss',\n 'clear-the-box',\n 'commit-foul-after-loss',\n 'compactness-of-team',\n 'defending-against-the-possessor',\n 'defending-moving-behind-the-defensive-line',\n 'defending-running-into-the-box',\n 'defensive-line-imbalance-in-depth',\n 'defensive-line-imbalance-in-width',\n 'hold-after-loss',\n 'marking-opponents-inside-the-box',\n 'marking-supports',\n 'moving-forward-during-organized-pressure',\n 'neutralizing-opponent-advantage-of-defensive-line-imbalance',\n 'press-after-loss',\n 'pressure-on-the-ball-possessor',\n 'recovered-ball',\n 'second-ball-defensive-winning-after-cross',\n 'second-ball-defensive-winning-after-direct-play',\n 'second-ball-defensive-winning-after-finishing',\n 'second-ball-defensive-winning-after-set-piece',\n 'tackle',\n] as const;\n\nexport type OffensiveTacticId = (typeof offensiveTactics)[number];\nexport type DefensiveTacticId = (typeof defensiveTactics)[number];\n\nexport type TacticId = OffensiveTacticId | DefensiveTacticId;\n\nexport type PlayersPosition = { [key in string]: Coordinates };\nexport type PlayersPositions = { [key in string]: PlayersPosition };\nexport type Homographies = { [key in number]: Homography };\nexport type TimeSeries = { [key in number]: Array };\n\nexport enum Quality {\n LOW = 'low',\n MEDIUM = 'medium',\n HIGH = 'high',\n VERY_HIGH = 'veryHigh',\n}\n\nexport const INITIAL_QUALITY = Quality.VERY_HIGH;\n\nexport const QUALITY_TO_SCALE_FACTOR = {\n [Quality.LOW]: 8,\n [Quality.MEDIUM]: 10,\n [Quality.HIGH]: 12,\n [Quality.VERY_HIGH]: 16,\n};\n\nexport const IDENTIFY_TRANSFORMATION_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0];\nconst CHUNK_SIZE = 3750;\n\nexport interface OverlayGeneratorConfig {\n domainUrl?: string;\n headers?: HeadersInit;\n imageInterface: unknown;\n fetchInterface: unknown;\n useContainer?: boolean;\n recordingData?: RecordingOverlayData | undefined;\n overlayElementsMetaData?: OverlayElementsMetaData | undefined;\n}\n\nexport class OverlayGenerator {\n overlayRendered: OverlayRenderer;\n store = initStore();\n config: OverlayGeneratorConfig;\n overlayElementsMetaData?: OverlayElementsMetaData | undefined;\n\n constructor(config: OverlayGeneratorConfig) {\n this.config = config;\n this.overlayRendered = new OverlayRenderer({\n imageInterface: this.config.imageInterface,\n useContainer: this.config.useContainer ?? true,\n });\n }\n\n @LogEvent({ type: Events.INIT })\n async init({ tacticalAnalysisId, recordingId }: { tacticalAnalysisId: string; recordingId: string }) {\n if (this.getTacticalAnalysisId() !== tacticalAnalysisId || this.getRecordingId() !== recordingId) {\n this.overlayRendered = new OverlayRenderer({\n imageInterface: this.config.imageInterface,\n useContainer: this.config.useContainer ?? true,\n });\n this.store.actions.setTacticalAnalysisId(tacticalAnalysisId);\n this.store.actions.setRecordingId(recordingId);\n }\n\n return await this.loadMetadata();\n }\n\n @Time()\n @LogEvent({ type: Events.DRAW_FRAME_IN_CANVAS })\n async drawFrameInCanvas(\n container: HTMLDivElement,\n frame: number,\n options: {\n tactics?: TacticId[];\n },\n ) {\n if (this.store.store.getState().status.isLoadingData) return false;\n const currentFrameChunkNumber = this.getChunkNumberFromFrame(frame);\n const isCurrentFrameChunkLoaded = Object.keys(this.getChunksData()).includes(currentFrameChunkNumber.toString());\n const shouldPreloadNextChunk = preloadData(\n this.getChunksData(),\n currentFrameChunkNumber,\n frame,\n this.getChunkSize(),\n );\n\n if (!isCurrentFrameChunkLoaded && !this.store.store.getState().status.isLoadingData) {\n // TODO How to handle when trajectories are not available?\n await this.load(currentFrameChunkNumber);\n this.store.actions.validateChunkDataMemory(currentFrameChunkNumber);\n }\n\n if (shouldPreloadNextChunk && !this.store.store.getState().status.isLoadingAsyncData) {\n this.load(currentFrameChunkNumber + 1, true);\n }\n\n const metaData = this.getMetaData();\n const frameInfo = this.overlayRendered.renderFrame({\n frame,\n playersPositions: this.getTrajectories(currentFrameChunkNumber),\n scale: this.getRenderScale(),\n overlayTactics: this.getOverlayTactics(currentFrameChunkNumber),\n filters: { tactics: options.tactics },\n pitchSize: metaData.pitch.originalSize,\n segments: metaData.segments,\n teams: metaData.teams,\n container,\n });\n\n this.store.actions.setFrameInfo(frameInfo);\n }\n\n getHomography(frame: number): Homography | undefined {\n const chunkNumber = this.getChunkNumberFromFrame(frame);\n const homographies = this.getHomographies(chunkNumber);\n return homographies[frame];\n }\n\n getTransformationMatrix(frame: number, videoSourceSize: Size): number[] | undefined {\n const metaData = this.getMetaData();\n const videoScale = getVideoScale(metaData.video.width, videoSourceSize.width);\n\n return this.generateTransformationMatrix(frame, videoScale);\n }\n\n @LogEvent({ type: Events.SET_RECORDING_DATA })\n reset() {\n this.config.recordingData = undefined;\n this.config.overlayElementsMetaData = undefined;\n this.store.actions.reset();\n }\n\n @LogEvent({ type: Events.SET_RECORDING_DATA })\n setRecordingData(recordingData?: RecordingOverlayData | undefined) {\n if (!recordingData) return;\n this.config.recordingData = recordingData;\n }\n\n @LogEvent({ type: Events.OVERLAY_ELEMENTS_META_DATA })\n setOverlayElementsMetaData(overlayElementsMetaData?: OverlayElementsMetaData | undefined) {\n if (!overlayElementsMetaData) return;\n this.config.overlayElementsMetaData = overlayElementsMetaData;\n }\n\n @LogEvent({ type: Events.CHANGE_QUALITY })\n setQuality(quality: Quality) {\n if (!quality) return;\n this.setRenderScale(QUALITY_TO_SCALE_FACTOR[quality]);\n }\n\n getMetaData() {\n return this.store.store.getState().metaData;\n }\n\n @LogEvent({ type: Events.CHANGE_RENDER_SCALE })\n setRenderScale(renderScale: number) {\n const metaData = this.getMetaData();\n const updatedMetadata = {\n ...metaData,\n pitch: {\n ...metaData.pitch,\n size: {\n width: metaData.pitch.originalSize.width * renderScale,\n length: metaData.pitch.originalSize.length * renderScale,\n },\n },\n };\n this.setMetaData(updatedMetadata);\n this.store.actions.setRenderScale(renderScale);\n }\n\n @LogEvent({ type: Events.LOAD_METADATA })\n private async loadMetadata() {\n const resultMetaData = this.config.overlayElementsMetaData\n ? this.config.overlayElementsMetaData\n : await loadMetaData({\n recordingId: this.getRecordingId(),\n domainUrl: this.config.domainUrl,\n headers: this.config.headers,\n fetchInterface: this.config.fetchInterface,\n });\n\n const metaData = {\n pitch: {\n size: {\n length: resultMetaData.pitchSize.length * this.getRenderScale(),\n width: resultMetaData.pitchSize.width * this.getRenderScale(),\n },\n originalSize: {\n length: resultMetaData.pitchSize.length,\n width: resultMetaData.pitchSize.width,\n },\n },\n segments: resultMetaData.segments,\n teams: resultMetaData.teams,\n video: { ...resultMetaData.video, duration: 0 },\n chunkSize: CHUNK_SIZE,\n };\n\n this.setMetaData(metaData);\n }\n\n @LogEvent({ type: Events.LOAD })\n private async load(chunkNumber: number = 0, async: boolean = false) {\n if (!async) this.startDataLoading();\n if (async) this.startDataLoadingAsync();\n const startFrame = chunkNumber * this.getMetaData().chunkSize;\n const endFrame = startFrame + this.getMetaData().chunkSize;\n try {\n const { homographies, trajectories, overlayTactics } = this.config.recordingData\n ? this.config.recordingData\n : await loadChunk({\n domainUrl: this.config?.domainUrl,\n tacticalAnalysisId: this.getTacticalAnalysisId(),\n startFrame,\n endFrame,\n headers: this.config.headers,\n fetchInterface: this.config.fetchInterface,\n });\n\n this.store.actions.setChunkData(chunkNumber, {\n homographies,\n playersPositions: trajectories,\n overlayTactics,\n });\n } catch (e) {\n console.error(`Error loading chunk ${chunkNumber} - ${e}`);\n this.store.actions.setErrorChunkData(chunkNumber);\n }\n\n if (!async) this.endDataLoading();\n if (async) this.endDataLoadingAsync();\n }\n\n @LogEvent({ type: Events.START_LOADING_DATA })\n private startDataLoading() {\n this.store.actions.startLoadingData();\n }\n\n @LogEvent({ type: Events.START_LOADING_ASYNC_DATA })\n private startDataLoadingAsync() {\n this.store.actions.startLoadingAsyncData();\n }\n\n @LogEvent({ type: Events.END_LOADING_DATA })\n private endDataLoading() {\n this.store.actions.finishLoadingData();\n }\n\n @LogEvent({ type: Events.END_LOADING_ASYNC_DATA })\n private endDataLoadingAsync() {\n this.store.actions.finishLoadingAsyncData();\n }\n\n @LogEvent({ type: Events.UPDATE_METADATA })\n private setMetaData(metaData: MetaData) {\n this.store.actions.setMetaData(metaData);\n }\n\n private generateTransformationMatrix(frame: number, videoScale: number) {\n const homographies = this.getHomographies(this.getChunkNumberFromFrame(frame));\n\n if (!homographies || !homographies[frame]) {\n return;\n }\n\n const scaledMatrix = scaleMatrix(homographies[frame], this.getRenderScale(), videoScale);\n return transformHomographyIntoMatrix3d(scaledMatrix);\n }\n\n private getChunkNumberFromFrame = (frame: number) => {\n return getChunkNumberFromFrameAndChunkSize(frame, this.getChunkSize());\n };\n\n private getTacticalAnalysisId = () => {\n return this.store.store.getState().tacticalAnalysisId;\n };\n\n private getRecordingId = () => {\n return this.store.store.getState().recordingId;\n };\n\n private getChunksData = (): OverlayGeneratorChunkData => {\n return this.store.store.getState().chunkData;\n };\n\n private getChunkSize = () => {\n return this.store.store.getState().metaData.chunkSize;\n };\n\n private getRenderScale() {\n return this.store.store.getState().renderScale;\n }\n\n private getHomographies(chunkNumber: number) {\n return this.getChunksData()[chunkNumber]?.data?.homographies ?? [];\n }\n\n private getTrajectories(chunkNumber: number) {\n return this.getChunksData()[chunkNumber]?.data?.playersPositions ?? {};\n }\n\n private getOverlayTactics(chunkNumber: number) {\n return this.getChunksData()[chunkNumber]?.data?.overlayTactics ?? [];\n }\n}\n","import Konva from 'konva';\nimport { IFrame } from 'konva/lib/types';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { create, StoreApi, UseBoundStore } from 'zustand';\nimport { OverlayGenerator, Quality } from '../main';\nimport { OverlayGeneratorStore } from '../store';\nimport { OverlayElementsMetaData, RecordingOverlayData } from '../utils/loaders';\n\ninterface UseOverlayGeneratorParams {\n id?: string;\n recordingData?: RecordingOverlayData;\n overlayElementsMetaData?: OverlayElementsMetaData;\n containerRef?: React.RefObject;\n}\n\nconst cache: {\n [key in string]: {\n overlayGenerator: OverlayGenerator;\n useStore: UseBoundStore>;\n };\n} = {};\n\nexport const useOverlayGeneratorById = (\n id: string,\n): [OverlayGenerator, UseBoundStore>] => {\n return useMemo(() => {\n if (!cache[id]) {\n const generator = new OverlayGenerator({\n imageInterface: Image,\n fetchInterface: fetch,\n });\n const useStore = create(generator.store.store);\n\n cache[id] = { overlayGenerator: generator, useStore };\n return [generator, useStore];\n }\n\n return [cache[id].overlayGenerator, cache[id].useStore];\n }, [id]);\n};\n\nexport const useOverlayGenerator = ({\n id = 'default-overlay-generator',\n recordingData,\n overlayElementsMetaData,\n}: UseOverlayGeneratorParams = {}) => {\n const [overlayGenerator, useStore] = useOverlayGeneratorById(id);\n\n useEffect(() => {\n recordingData && overlayGenerator.setRecordingData(recordingData);\n overlayElementsMetaData && overlayGenerator.setOverlayElementsMetaData(overlayElementsMetaData);\n\n return () => {\n overlayGenerator.reset();\n };\n }, [overlayGenerator, recordingData, overlayElementsMetaData]);\n\n const frameRate = useStore((state) => state.metaData.video.frameRate);\n const isReady = useStore((state) => !state.status.isLoadingData);\n const frameInfo = useStore((state) => state.frameInfo);\n\n const createAnimation = useCallback(\n (callback: (frame?: IFrame) => void) => {\n return new Konva.Animation((frame) => {\n return callback(frame);\n }, overlayGenerator.overlayRendered.stage);\n },\n [overlayGenerator.overlayRendered.stage],\n );\n\n const changeQuality = useCallback(\n (quality: Quality) => {\n if (!quality) return;\n\n overlayGenerator.setQuality(quality);\n },\n [overlayGenerator],\n );\n\n return {\n overlayGenerator,\n isReady,\n frameRate,\n frameInfo,\n changeQuality,\n createAnimation,\n };\n};\n","import { OverlayElementNames } from '../types';\nimport { ReferenceType } from '../utils/loaders';\n\nexport enum OffensiveTacticNames {\n ACCOMPANY_PLAY_TEAM_TOGETHER = 'accompany-play-team-together',\n FINISHING = 'finishing',\n FINISHING_PASS = 'finishing-pass',\n IDENTIFYING_PASSING_LINES_UNDER_PRESSURE = 'identifying-passing-lines-under-pressure',\n LONG_BALL = 'long-ball',\n MOVING_BEHIND_THE_DEFENSIVE_LINE = 'moving-behind-the-defensive-line',\n OCCUPYING_SPACE_IN_THE_BOX = 'occupying-space-in-the-box',\n OPEN_PASSING_LINES_AFTER_LONG_BALL = 'open-passing-lines-after-long-ball',\n OVERCOMING_OPPONENTS_WITH_VERTICAL_PASSES = 'overcoming-opponents-with-vertical-passes',\n POSITIONING_BEHIND_CENTER_BACKS_WHEN_LATERAL_BALLS = 'positioning-behind-center-backs-when-lateral-balls',\n REALIZED_EMERGENCY_SUPPORT = 'realized-emergency-support',\n REALIZED_STRIKER_SUPPORT = 'realized-striker-support',\n REALIZED_FINISHING_SUPPORT = 'realized-finishing-support',\n REALIZED_HORIZONTAL_OVERCOMING_SUPPORT = 'realized-horizontal-overcoming-support',\n REALIZED_VERTICAL_OVERCOMING_SUPPORT = 'realized-vertical-overcoming-support',\n RECEIVING_BETWEEN_LINES = 'receiving-between-lines',\n RECEIVING_POSITIONING_BETWEEN_LINES = 'receiving-positioning-between-lines',\n PASSING_BETWEEN_LINES = 'passing-between-lines',\n SPACE_BETWEEN_DEFENSIVE_LINE_AND_HALFWAY_LINE = 'space-between-defensive-line-and-halfway-line',\n SUPPORTS = 'supports',\n SWITCH_OF_PLAY = 'switch-of-play',\n BALANCE_OF_THE_TEAM_AFTER_RECOVERY = 'balance-of-the-team-after-recovery',\n TAKING_ADVANTAGE_OF_DEFENSIVE_LINE_IMBALANCES = 'taking-advantage-of-defensive-line-imbalances',\n WIDTH_OF_THE_TEAM = 'width-of-the-team',\n WIDTH_OF_THE_TEAM_OPPOSITE_CHANNEL = 'width-of-the-team-opposite-channel',\n GOAL_KICK_START_LONG_OUTSIDE_CHANNELS = 'goal-kick-start-long-outside-channels',\n GOAL_KICK_START_LONG_INSIDE_CHANNELS = 'goal-kick-start-long-inside-channels',\n GOAL_KICK_START_SHORT_OUTSIDE_CHANNELS = 'goal-kick-start-short-outside-channels',\n GOAL_KICK_START_SHORT_INSIDE_CHANNELS = 'goal-kick-start-short-inside-channels',\n CROSS_INTO_THE_BOX = 'cross-into-the-box',\n FINISHING_AFTER_CROSS = 'finishing-after-cross',\n PROGRESSION_AFTER_RECOVERY = 'progression-after-recovery',\n POSSESSION_AFTER_RECOVERY = 'possession-after-recovery',\n RECEIVE_FOUL_AFTER_RECOVERY = 'receive-foul-after-recovery',\n GOAL_CHANCE = 'goal-chance',\n GOAL = 'goal',\n GOAL_ASSIST = 'goal-assist',\n LOST_BALL = 'lost-ball',\n RUNNING_INTO_THE_BOX = 'running-into-the-box',\n SECOND_BALL_OFFENSIVE_WINNING_AFTER_DIRECT_PLAY = 'second-ball-offensive-winning-after-direct-play',\n SECOND_BALL_OFFENSIVE_WINNING_AFTER_FINISHING = 'second-ball-offensive-winning-after-finishing',\n SECOND_BALL_OFFENSIVE_WINNING_AFTER_CROSS = 'second-ball-offensive-winning-after-cross',\n SECOND_BALL_OFFENSIVE_WINNING_AFTER_SET_PIECE = 'second-ball-offensive-winning-after-set-piece',\n PASS_BEHIND_DEFENSIVE_LINE = 'pass-behind-defensive-line',\n}\n\nexport enum DefensiveTacticNames {\n BALANCE_OF_THE_TEAM = 'balance-of-the-team',\n BALANCE_OF_THE_TEAM_AFTER_LOSS = 'balance-of-the-team-after-loss',\n COMPACTNESS_OF_TEAM = 'compactness-of-team',\n DEFENDING_AGAINST_THE_POSSESSOR = 'defending-against-the-possessor',\n DEFENSIVE_LINE_IMBALANCE_IN_DEPTH = 'defensive-line-imbalance-in-depth',\n DEFENSIVE_LINE_IMBALANCE_IN_WIDTH = 'defensive-line-imbalance-in-width',\n MARKING_OPPONENTS_INSIDE_THE_BOX = 'marking-opponents-inside-the-box',\n MARKING_SUPPORTS = 'marking-supports',\n NEUTRALIZING_OPPONENT_ADVANTAGE_OF_DEFENSIVE_LINE_IMBALANCE = 'neutralizing-opponent-advantage-of-defensive-line-imbalance',\n HOLD_AFTER_LOSS = 'hold-after-loss',\n PRESS_AFTER_LOSS = 'press-after-loss',\n COMMIT_FOUL_AFTER_LOSS = 'commit-foul-after-loss',\n RECOVERED_BALL = 'recovered-ball',\n TACKLE = 'tackle',\n PRESSURE_ON_THE_BALL_POSSESSOR = 'pressure-on-the-ball-possessor',\n MOVING_FORWARD_DURING_ORGANIZED_PRESSURE = 'moving-forward-during-organized-pressure',\n DEFENDING_MOVING_BEHIND_THE_DEFENSIVE_LINE = 'defending-moving-behind-the-defensive-line',\n DEFENDING_RUNNING_INTO_THE_BOX = 'defending-running-into-the-box',\n CLEAR_THE_BOX = 'clear-the-box',\n SECOND_BALL_DEFENSIVE_WINNING_AFTER_DIRECT_PLAY = 'second-ball-defensive-winning-after-direct-play',\n SECOND_BALL_DEFENSIVE_WINNING_AFTER_FINISHING = 'second-ball-defensive-winning-after-finishing',\n SECOND_BALL_DEFENSIVE_WINNING_AFTER_CROSS = 'second-ball-defensive-winning-after-cross',\n SECOND_BALL_DEFENSIVE_WINNING_AFTER_SET_PIECE = 'second-ball-defensive-winning-after-set-piece',\n}\n\nexport type OverlayElement = {\n overlayElementTypeId: OverlayElementNames;\n references: {\n referenceType: ReferenceType;\n }[];\n};\n\nexport type TacticConfig = {\n name: OffensiveTacticNames | DefensiveTacticNames;\n overlayElements: OverlayElement[];\n};\n\nexport type TacticsConfig = {\n [key in OffensiveTacticNames | DefensiveTacticNames]?: TacticConfig;\n};\n\nexport const tacticsConfig: TacticsConfig = {\n [OffensiveTacticNames.WIDTH_OF_THE_TEAM]: {\n name: OffensiveTacticNames.WIDTH_OF_THE_TEAM,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.WIDE_PLAYER_HIGHLIGHT,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [DefensiveTacticNames.PRESSURE_ON_THE_BALL_POSSESSOR]: {\n name: DefensiveTacticNames.PRESSURE_ON_THE_BALL_POSSESSOR,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.DEFENDER_PRESSING_POSSESSOR_HIGHLIGHT,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [DefensiveTacticNames.MOVING_FORWARD_DURING_ORGANIZED_PRESSURE]: {\n name: DefensiveTacticNames.MOVING_FORWARD_DURING_ORGANIZED_PRESSURE,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.MOVING_FORWARD_DURING_ORGANIZED_PRESSURE_ARROWS,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [DefensiveTacticNames.DEFENDING_MOVING_BEHIND_THE_DEFENSIVE_LINE]: {\n name: DefensiveTacticNames.DEFENDING_MOVING_BEHIND_THE_DEFENSIVE_LINE,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.DEFENDING_RUN_BEHIND_DEFENSIVE_LINE,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [OffensiveTacticNames.MOVING_BEHIND_THE_DEFENSIVE_LINE]: {\n name: OffensiveTacticNames.MOVING_BEHIND_THE_DEFENSIVE_LINE,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.RUN_BEHIND_DEFENSIVE_LINE,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [DefensiveTacticNames.CLEAR_THE_BOX]: {\n name: DefensiveTacticNames.CLEAR_THE_BOX,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.CLEAR_THE_BOX_DEFENDER_ARROW,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [DefensiveTacticNames.SECOND_BALL_DEFENSIVE_WINNING_AFTER_DIRECT_PLAY]: {\n name: DefensiveTacticNames.SECOND_BALL_DEFENSIVE_WINNING_AFTER_DIRECT_PLAY,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.SECOND_BALL_DEFENSIVE_CONTROLLER_HIGHLIGHT,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [DefensiveTacticNames.SECOND_BALL_DEFENSIVE_WINNING_AFTER_FINISHING]: {\n name: DefensiveTacticNames.SECOND_BALL_DEFENSIVE_WINNING_AFTER_FINISHING,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.SECOND_BALL_DEFENSIVE_CONTROLLER_HIGHLIGHT,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [DefensiveTacticNames.SECOND_BALL_DEFENSIVE_WINNING_AFTER_CROSS]: {\n name: DefensiveTacticNames.SECOND_BALL_DEFENSIVE_WINNING_AFTER_CROSS,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.SECOND_BALL_DEFENSIVE_CONTROLLER_HIGHLIGHT,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [DefensiveTacticNames.SECOND_BALL_DEFENSIVE_WINNING_AFTER_SET_PIECE]: {\n name: DefensiveTacticNames.SECOND_BALL_DEFENSIVE_WINNING_AFTER_SET_PIECE,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.SECOND_BALL_DEFENSIVE_CONTROLLER_HIGHLIGHT,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [OffensiveTacticNames.SECOND_BALL_OFFENSIVE_WINNING_AFTER_DIRECT_PLAY]: {\n name: OffensiveTacticNames.SECOND_BALL_OFFENSIVE_WINNING_AFTER_DIRECT_PLAY,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.SECOND_BALL_OFFENSIVE_CONTROLLER_HIGHLIGHT,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [OffensiveTacticNames.SECOND_BALL_OFFENSIVE_WINNING_AFTER_FINISHING]: {\n name: OffensiveTacticNames.SECOND_BALL_OFFENSIVE_WINNING_AFTER_FINISHING,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.SECOND_BALL_OFFENSIVE_CONTROLLER_HIGHLIGHT,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [OffensiveTacticNames.SECOND_BALL_OFFENSIVE_WINNING_AFTER_CROSS]: {\n name: OffensiveTacticNames.SECOND_BALL_OFFENSIVE_WINNING_AFTER_CROSS,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.SECOND_BALL_OFFENSIVE_CONTROLLER_HIGHLIGHT,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [OffensiveTacticNames.SECOND_BALL_OFFENSIVE_WINNING_AFTER_SET_PIECE]: {\n name: OffensiveTacticNames.SECOND_BALL_OFFENSIVE_WINNING_AFTER_SET_PIECE,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.SECOND_BALL_OFFENSIVE_CONTROLLER_HIGHLIGHT,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [DefensiveTacticNames.DEFENDING_RUNNING_INTO_THE_BOX]: {\n name: DefensiveTacticNames.DEFENDING_RUNNING_INTO_THE_BOX,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.DEFENDING_RUN_INTO_THE_BOX,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [OffensiveTacticNames.RUNNING_INTO_THE_BOX]: {\n name: OffensiveTacticNames.RUNNING_INTO_THE_BOX,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.RUN_INTO_THE_BOX,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n [OffensiveTacticNames.PASS_BEHIND_DEFENSIVE_LINE]: {\n name: OffensiveTacticNames.PASS_BEHIND_DEFENSIVE_LINE,\n overlayElements: [\n {\n overlayElementTypeId: OverlayElementNames.PASS_BEHIND_DEFENSIVE_LINE_RECEIVER_HIGHLIGHT,\n references: [\n {\n referenceType: ReferenceType.StaticCoordinates,\n },\n ],\n },\n {\n overlayElementTypeId: OverlayElementNames.PASS_BEHIND_DEFENSIVE_LINE_ARROW,\n references: [\n {\n referenceType: ReferenceType.Players,\n },\n ],\n },\n ],\n },\n};\n","import { RefObject } from 'react';\n\nimport { PLAYER_ACTIONS } from './state/states';\nimport { FundamentalsSelection } from '../../types/playlist/types';\n\nexport type PlayerType = RefObject;\nexport type PlayerContainerType = RefObject;\n\nexport enum PlayingModes {\n TACTICAL_CAMERA = 'TACTICAL_CAMERA',\n EPISODES = 'EPISODES',\n PLAYLIST = 'PLAYLIST',\n PANORAMIC = 'PANORAMIC',\n}\n\nexport interface PlayingMode {\n mode: PlayingModes;\n showOverlays: boolean;\n useEffectiveTime: boolean;\n isPreferred?: boolean;\n}\n\nexport interface PlayerStatePlaylist {\n preferredPlayingMode: PlayingMode;\n currentSelectedPlayingMode: PlayingMode;\n currentPlaylistItemId: string;\n playlistItems: PlaylistItemType[];\n playingItem: {\n currentSourceTime: number;\n videoSourceIndex: number;\n playlistItem: PlaylistItemType;\n };\n}\n\nexport interface PlayerStateMachineContext {\n currentTime: number;\n isFullScreen: boolean;\n isInStandBy: boolean;\n isPlaying: boolean;\n autoPlayNextPlaylistItem: boolean;\n playerId: string;\n playlist: PlayerStatePlaylist;\n videoRef: PlayerType | undefined;\n}\n\nexport type SetPlaylistAction = {\n autoplay?: boolean;\n playerRef?: PlayerType;\n playingMode?: PlayingMode;\n playlistItems: PlaylistItemType[];\n tryToKeepCurrentTime?: boolean;\n type: PLAYER_ACTIONS.LOAD_PLAYLIST;\n initialStartTime: number;\n};\n\nexport type AddPlaylistItemsAction = {\n type: PLAYER_ACTIONS.REPLACE_PLAYLIST_ITEMS;\n playlistItems: PlaylistItemType[];\n initialStartTime?: number;\n};\nexport type UpdatePlaylistItemsAction = {\n type: PLAYER_ACTIONS.UPDATE_PLAYLIST_ITEMS;\n playlistItems: PlaylistItemType[];\n};\nexport type JumpToPercentTimeAction = { type: PLAYER_ACTIONS.JUMP_TO_TIME_PERCENT; percent: number };\nexport type JumpToMatchTimeAction = { type: PLAYER_ACTIONS.JUMP_TO_MATCH_TIME; time: number };\n\nexport type SetPlaylistItemAction = {\n type: PLAYER_ACTIONS.LOAD_PLAYLIST_ITEM;\n playlistItemId: string;\n autoPlay: boolean;\n};\nexport type SetReplacePlaylistItemAction = {\n type: PLAYER_ACTIONS.REPLACE_PLAYLIST;\n playlistItems: PlaylistItemType[];\n playingMode: PlayingMode;\n tryToKeepCurrentTime?: boolean;\n autoplay?: boolean;\n};\nexport type RemovePlaylistAction = { type: PLAYER_ACTIONS.REMOVE_PLAYLIST_ITEM; playlistItemId: string };\nexport type RemovePlaylistItemsAction = { type: PLAYER_ACTIONS.REMOVE_PLAYLIST_ITEMS; playlistItemsIds: string[] };\nexport type ChangePlayingModeAction = {\n type: PLAYER_ACTIONS.CHANGE_PLAYING_MODE;\n playingMode: PlayingMode;\n tryToKeepCurrentTime?: boolean;\n autoplay?: boolean;\n};\n\nexport type UpdatePlaylistItemAction = {\n type: PLAYER_ACTIONS.UPDATE_PLAYLIST_ITEM;\n playlistItem: PlaylistItemType;\n currentTime?: number;\n};\n\nexport type ReorderPlaylistItemAction = {\n type: PLAYER_ACTIONS.REORDER_PLAYLIST_ITEM;\n currentVideoIndex: number;\n newVideoIndex: number;\n};\n\nexport type ChangeAutoplayPlaylistItemAction = {\n type: PLAYER_ACTIONS.CHANGE_AUTOPLAY_NEXT_PLAYLIST_ITEM;\n autoplayNextPlaylistItem: boolean;\n};\n\nexport type PlayerStateMachineEvent =\n | AddPlaylistItemsAction\n | ChangePlayingModeAction\n | JumpToMatchTimeAction\n | JumpToPercentTimeAction\n | RemovePlaylistAction\n | RemovePlaylistItemsAction\n | ReorderPlaylistItemAction\n | SetPlaylistAction\n | SetPlaylistItemAction\n | SetReplacePlaylistItemAction\n | UpdatePlaylistItemAction\n | UpdatePlaylistItemsAction\n | ChangeAutoplayPlaylistItemAction\n | { type: PLAYER_ACTIONS };\n\nexport interface VideoSourceWithTimes {\n endTime: number;\n endTimeInMatch?: number;\n poster?: string | null;\n src: string;\n srcDownload?: string;\n startTime: number;\n startTimeInMatch?: number;\n type?: string | null;\n id: string;\n}\n\nexport interface VideoSourceType {\n playingMode: PlayingMode;\n videoSources: VideoSourceWithTimes[];\n}\n\nexport interface PlaylistItemType {\n id: string;\n duration: number;\n name?: string;\n index?: number;\n videoTypes: VideoSourceType[];\n fundamentalsSelected: FundamentalsSelection;\n hasHomographies: boolean;\n origin?: {\n type: string;\n id: string;\n };\n recordingName?: string | undefined;\n recordingMatchday?: string | undefined;\n recordingId: string;\n}\n\nexport type PlaylistVideo = {\n id: string;\n startTime: number;\n endTime: number;\n videoSource: VideoSource;\n};\n\nexport interface VideoSource {\n id: string;\n poster?: string | null;\n src: string;\n srcDownload?: string;\n type?: string | null;\n}\n","export enum TacticsVariants {\n OFFENSIVE = 'offensive',\n DEFENSIVE = 'defensive',\n}\n","import { z } from 'zod';\n\nimport { TacticsVariants } from '../tactics/types';\n\nexport const RecordingsFiltersEventsSchema = z.object({\n teams: z.array(z.string()),\n event: z.string(),\n zones: z.array(z.number()),\n players: z.array(z.string()),\n});\n\nexport const RecordingFiltersTacticSchema = z.object({\n teamIds: z.array(z.string()),\n tacticalFundamentalType: z.string(),\n playerIds: z.array(z.string()),\n category: z.enum([TacticsVariants.OFFENSIVE, TacticsVariants.DEFENSIVE]),\n});\n\nexport const RecordingFiltersTacticsSchema = z.object({\n offensive: z.array(RecordingFiltersTacticSchema),\n defensive: z.array(RecordingFiltersTacticSchema),\n});\n\nexport const RecordingFiltersScenariosOrTacticsInsideSchema = z.object({\n teams: z.array(z.string()),\n scenario: z.string(),\n zones: z.array(z.number()),\n tactics: RecordingFiltersTacticsSchema,\n});\n\nexport const RecordingsFiltersSchema = z.object({\n recordingIds: z.array(z.string()),\n eventsStarting: RecordingsFiltersEventsSchema.optional(),\n eventsEnding: RecordingsFiltersEventsSchema.optional(),\n scenariosOrTacticsInside: RecordingFiltersScenariosOrTacticsInsideSchema.optional(),\n});\n","export const PLAYBACK_RATES = {\n extraSlow: 0.25,\n slow: 0.5,\n normal: 1,\n fast: 1.5,\n extraFast: 2,\n} as const;\n\nexport const PLAYBACK_RATES_VALUES = Object.values(PLAYBACK_RATES);\n","export const ZOOM_LEVELS = {\n extraLarge: 0,\n large: 1,\n mediumLarge: 2,\n medium: 3,\n mediumSmall: 4,\n small: 5,\n extraSmall: 6,\n} as const;\n\nexport const ZOOM_LEVELS_VALUES = Object.values(ZOOM_LEVELS);\n","import { defensiveTactics, offensiveTactics } from 'overlay-generator';\nimport { z } from 'zod';\n\nimport { PlayingModes } from 'shared/components/video-player/types';\nimport { RecordingsFiltersSchema } from 'shared/types/recording/schemas';\n\nimport { USER_PRESET_KEYS } from './userPresetsKeys';\nimport { PLAYBACK_RATES } from '../playback-rates/paybackRates';\nimport { ZOOM_LEVELS } from '../zoom-range/zoomLevelsValues';\n\nconst selectedTacticsValidateData = [...defensiveTactics, ...offensiveTactics, 'all'] as const;\n\n// NOTE: schema based on USER_PRESET_KEYS object\nexport const PRESET_SCHEMA = {\n [USER_PRESET_KEYS.multiMatchAppliedFilters]: RecordingsFiltersSchema,\n [USER_PRESET_KEYS.playingMode]: z.object({\n mode: z.nativeEnum(PlayingModes),\n showOverlays: z.boolean(),\n useEffectiveTime: z.boolean(),\n isPreferred: z.boolean().optional(),\n }),\n [USER_PRESET_KEYS.selectedTactics]: z.array(z.enum(selectedTacticsValidateData)),\n [USER_PRESET_KEYS.zoomLevel]: z.union([\n z.literal(ZOOM_LEVELS.extraLarge),\n z.literal(ZOOM_LEVELS.large),\n z.literal(ZOOM_LEVELS.mediumLarge),\n z.literal(ZOOM_LEVELS.medium),\n z.literal(ZOOM_LEVELS.mediumSmall),\n z.literal(ZOOM_LEVELS.small),\n z.literal(ZOOM_LEVELS.extraSmall),\n ]),\n [USER_PRESET_KEYS.height]: z.number(),\n [USER_PRESET_KEYS.pinScenarios]: z.boolean(),\n [USER_PRESET_KEYS.headersWidth]: z.number(),\n [USER_PRESET_KEYS.timeLineAppliedFilters]: RecordingsFiltersSchema,\n [USER_PRESET_KEYS.filters]: z.string(),\n [USER_PRESET_KEYS.time]: z.number(),\n [USER_PRESET_KEYS.teamIdFocus]: z.string(),\n [USER_PRESET_KEYS.showBallPossession]: z.boolean(),\n [USER_PRESET_KEYS.showNoBallPossession]: z.boolean(),\n [USER_PRESET_KEYS.speed]: z.union([\n z.literal(PLAYBACK_RATES.extraSlow),\n z.literal(PLAYBACK_RATES.slow),\n z.literal(PLAYBACK_RATES.normal),\n z.literal(PLAYBACK_RATES.fast),\n z.literal(PLAYBACK_RATES.extraFast),\n ]),\n} as const;\n","import { ZodSchema } from 'zod';\n\nimport { PRESET_SCHEMA } from 'shared/constants/user-presets/userPresetsSchema';\nimport { UserPreset, UserPresetKeysUnion, UserPresetValues } from 'shared/types/user-preset/types';\n\nexport function validateWithSchema(data: unknown, schema: ZodSchema): boolean {\n const result = schema.safeParse(data);\n return result.success;\n}\n\nexport const getPreset = (data: UserPreset[], key: T) => {\n const value = data.find((preset) => preset.key === key)?.value;\n\n if (value === undefined || !validateWithSchema(value, PRESET_SCHEMA[key])) {\n return undefined;\n }\n\n return value as UserPresetValues[T];\n};\n","import { atomFamily, useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { RecordingsFilters } from 'shared/types/recording/types';\n\nconst playlistMultimatchAppliedFiltersAtom = atomFamily({\n key: 'playlist-multimatch-applied-filters',\n default: {\n recordingIds: [],\n },\n});\nexport const useSetPlaylistMultimatchAppliedFilters = (id: string) => {\n return useSetRecoilState(playlistMultimatchAppliedFiltersAtom(id));\n};\nexport const usePlaylistMultimatchAppliedFilters = (id: string) => {\n return useRecoilValue(playlistMultimatchAppliedFiltersAtom(id));\n};\n","import { useUserPresets } from 'api/user-presets/use-user-presets';\nimport { playlistMultimatchAppliedFilters } from 'shared/constants/user-presets/userPresetsPlayList';\nimport { UserPresetScope } from 'shared/types/user-preset/types';\nimport { getPreset } from 'shared/utils/user-presets/getPreset';\n\nimport { useSetPlaylistMultimatchAppliedFilters } from '../store/atoms';\n\ninterface UseAppDataInterface {\n isFetching: boolean;\n isError: boolean;\n isSuccess: boolean;\n isLoading: boolean;\n}\n\ntype Options = {\n playlistId: string;\n};\n\nexport const useMultimatchAppliedFiltersPreset = ({ playlistId }: Options): UseAppDataInterface => {\n const setPlaylistMultimatchAppliedFilters = useSetPlaylistMultimatchAppliedFilters(playlistId);\n\n const fetchUserPresets = useUserPresets({\n prefix: 'playlist',\n scope: UserPresetScope.playlist,\n ref: playlistId,\n onSuccess: (data) => {\n const preset = getPreset(data, playlistMultimatchAppliedFilters.key);\n if (preset) setPlaylistMultimatchAppliedFilters(preset);\n },\n });\n\n const isLoading = fetchUserPresets.isLoading;\n const isFetching = fetchUserPresets.isFetching;\n const isSuccess = fetchUserPresets.isSuccess;\n const isError = fetchUserPresets.isError;\n\n return {\n isError,\n isSuccess,\n isFetching,\n isLoading,\n };\n};\n","import { usePlaylist } from 'api/playlist/usePlaylist';\nimport { useClientId } from 'shared/contexts/app-state';\n\nimport { useMultimatchAppliedFiltersPreset } from './useMultimatchAppliedFiltersPreset';\n\nexport const usePlaylistPage = ({ playlistId }: { playlistId: string }) => {\n const { isLoading } = useMultimatchAppliedFiltersPreset({ playlistId });\n const { clientId } = useClientId();\n const playlist = usePlaylist({ playlistId });\n\n const isInvalidClient = clientId !== playlist?.data?.clientId;\n\n return {\n ...playlist,\n isLoading: isLoading || playlist.isLoading,\n isInvalidClient,\n };\n};\n","import { PlayingMode, PlayingModes } from './types';\n\nexport const TACTICAL_CAMERA_WITH_OVERLAYS_PLAYING_MODE: PlayingMode = {\n mode: PlayingModes.TACTICAL_CAMERA,\n showOverlays: true,\n useEffectiveTime: true,\n};\n\nexport const TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE: PlayingMode = {\n mode: PlayingModes.TACTICAL_CAMERA,\n showOverlays: false,\n useEffectiveTime: false,\n};\n\nexport const PANORAMIC_PLAYING_MODE: PlayingMode = {\n mode: PlayingModes.PANORAMIC,\n showOverlays: false,\n useEffectiveTime: false,\n};\n\nexport const EPISODES_PLAYING_MODE: PlayingMode = {\n mode: PlayingModes.EPISODES,\n showOverlays: true,\n useEffectiveTime: true,\n};\n\nexport const PLAYLIST_WITH_OVERLAYS_PLAYING_MODE: PlayingMode = {\n mode: PlayingModes.PLAYLIST,\n showOverlays: true,\n useEffectiveTime: false,\n};\n\nexport const PLAYLIST_WITHOUT_OVERLAYS_PLAYING_MODE: PlayingMode = {\n mode: PlayingModes.PLAYLIST,\n showOverlays: false,\n useEffectiveTime: false,\n};\n\nexport const getPlayingMode = ({\n playingMode,\n mode,\n showOverlays,\n useEffectiveTime,\n}: {\n playingMode: PlayingMode;\n mode?: PlayingModes;\n showOverlays?: boolean;\n useEffectiveTime?: boolean;\n}): PlayingMode => {\n return {\n ...playingMode,\n mode: mode ?? playingMode.mode,\n showOverlays: showOverlays ?? playingMode.showOverlays,\n useEffectiveTime: useEffectiveTime ?? playingMode.useEffectiveTime,\n };\n};\n\nexport const DEFAULT_TACTICAL_CAMERA_PLAYING_MODE = TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE;\nexport const DEFAULT_EFFECTIVE_TIME_PLAYING_MODE = EPISODES_PLAYING_MODE;\n","import isEmpty from 'lodash/isEmpty';\n\nimport {\n EPISODES_PLAYING_MODE,\n PANORAMIC_PLAYING_MODE,\n TACTICAL_CAMERA_WITH_OVERLAYS_PLAYING_MODE,\n TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE,\n} from 'shared/components/video-player/defaultPlayingModes';\nimport { VideoSourceType, VideoSourceWithTimes } from 'shared/components/video-player/types';\nimport { EpisodeClip } from 'shared/types';\nimport { VideoSource } from 'shared/types/recording/types';\nimport { GetVideoSourcesResponse } from 'shared/utils/get-video-sources';\n\ninterface GenerateVideoSourcesFromVideoTypes {\n startTime: number;\n endTime: number;\n episodesVideos: EpisodeClip[];\n videoSources?: GetVideoSourcesResponse;\n useCustomOverlays: boolean;\n}\n\nconst findEpisodeForPlaylistItem = (startTime: number, endTime: number, episodeClips: EpisodeClip[]) => {\n return episodeClips.find((episodeClip) => startTime >= episodeClip.startTime && endTime <= episodeClip.endTime);\n};\n\nconst generateFullMatchVideoSource = (\n startTime: number,\n endTime: number,\n fullMatchVideo: VideoSource,\n): VideoSourceWithTimes => {\n return {\n startTime,\n endTime,\n src: fullMatchVideo.src,\n srcDownload: fullMatchVideo.srcDownload,\n id: fullMatchVideo.id,\n };\n};\n\nconst generatePlaylistVideoSource = (\n startTime: number,\n endTime: number,\n episodeClip: EpisodeClip,\n): VideoSourceWithTimes => {\n return {\n startTime: startTime - episodeClip.startTime,\n startTimeInMatch: episodeClip.startTime,\n endTimeInMatch: endTime,\n endTime: endTime - episodeClip.startTime,\n src: episodeClip.videoSrc.src,\n srcDownload: episodeClip.videoSrc.srcDownload,\n id: episodeClip.videoSrc.id,\n };\n};\n\nexport const generateVideoSourcesFromVideoTypes = ({\n startTime,\n endTime,\n episodesVideos,\n videoSources,\n useCustomOverlays = false,\n}: GenerateVideoSourcesFromVideoTypes): VideoSourceType[] => {\n const episodeClip = findEpisodeForPlaylistItem(startTime, endTime, episodesVideos);\n const hasEpisodes = !isEmpty(episodesVideos) && !!episodeClip;\n const hasTacticalCameraVideo = videoSources?.tacticalCameraVideo;\n const hasUploadedVideo = videoSources?.uploadedVideo;\n const hasPanoramaVideo = videoSources?.panoramicVideo;\n\n return [\n ...(hasEpisodes && !useCustomOverlays\n ? [\n {\n playingMode: EPISODES_PLAYING_MODE,\n videoSources: [generatePlaylistVideoSource(startTime, endTime, episodeClip)],\n },\n ]\n : []),\n ...(useCustomOverlays && hasTacticalCameraVideo\n ? [\n {\n playingMode: TACTICAL_CAMERA_WITH_OVERLAYS_PLAYING_MODE,\n videoSources: [generateFullMatchVideoSource(startTime, endTime, videoSources.tacticalCameraVideo)],\n },\n ]\n : []),\n ...(hasTacticalCameraVideo && (!useCustomOverlays || !hasEpisodes)\n ? [\n {\n playingMode: TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE,\n videoSources: [generateFullMatchVideoSource(startTime, endTime, videoSources.tacticalCameraVideo)],\n },\n ]\n : []),\n ...(hasUploadedVideo\n ? [\n {\n playingMode: TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE,\n videoSources: [generateFullMatchVideoSource(startTime, endTime, videoSources.uploadedVideo)],\n },\n ]\n : []),\n ...(hasPanoramaVideo\n ? [\n {\n playingMode: PANORAMIC_PLAYING_MODE,\n videoSources: [generateFullMatchVideoSource(startTime, endTime, videoSources.panoramicVideo)],\n },\n ]\n : []),\n ];\n};\n","import { useCallback } from 'react';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { PlaylistItemType, VideoSourceType } from 'shared/components/video-player/types';\nimport { useFeatureFlag } from 'shared/contexts/app-state';\nimport { Playlist } from 'shared/types';\nimport { getVideoSources } from 'shared/utils/get-video-sources';\n\nimport { generateVideoSourcesFromVideoTypes } from './utils/generateVideoSourcesFromVideoTypes';\n\nexport const useMapVideos = () => {\n const customOverlaysFeatureFlag = useFeatureFlag(FEATURE_FLAG.CUSTOM_OVERLAYS);\n\n return useCallback(\n (playlist: Playlist): PlaylistItemType[] => {\n return playlist.playlistItems.map((playlistItem) => {\n const playlistItemRecording = playlist.recordings.find(\n (recording) => recording.id === playlistItem.recordingId,\n );\n const videoSources = getVideoSources(playlistItemRecording?.videoSources || []);\n const videoTypes: VideoSourceType[] = generateVideoSourcesFromVideoTypes({\n startTime: playlistItem.startTime,\n endTime: playlistItem.endTime,\n episodesVideos: playlistItem.episodesVideos,\n videoSources,\n useCustomOverlays: customOverlaysFeatureFlag && playlistItem.hasHomographies,\n });\n\n return {\n id: playlistItem.id,\n name: playlistItem.name,\n index: playlistItem.index,\n duration: playlistItem.endTime - playlistItem.startTime,\n videoTypes,\n recordingName: playlistItemRecording?.name,\n recordingMatchday: playlistItemRecording?.matchDay,\n recordingId: playlistItem.recordingId,\n hasHomographies: playlistItem.hasHomographies,\n fundamentalsSelected: playlistItem.fundamentalsSelected,\n };\n });\n },\n [customOverlaysFeatureFlag],\n );\n};\n","export const VIDEO_PLAYER_MACHINE_ID = 'video-player-machine';\n\nexport enum PLAYER_STATES {\n CHECKING_NEXT_PLAYLIST_ITEM = 'CHECKING_NEXT_PLAYLIST_ITEM',\n ENDED = 'ENDED',\n ERROR = 'ERROR',\n IDLE = 'IDLE',\n EMPTY_PLAYLIST = 'EMPTY_PLAYLIST',\n JUMP_TO_TIME_PERCENT = 'JUMP_TO_TIME_PERCENT',\n LOADING = 'LOADING',\n LOADING_PLAYLIST_ITEM = 'LOADING_PLAYLIST_ITEM',\n LOADING_VIDEO_SOURCE = 'LOADING_VIDEO_SOURCE',\n READY = 'READY',\n}\n\nexport enum READY_STATES {\n ENDED = 'ENDED',\n IDLE = 'IDLE',\n PAUSED = 'PAUSED',\n PLAYING = 'PLAYING',\n SEEKING_NEW_TIME = 'SEEKING_NEW_TIME',\n STAND_BY = 'STAND_BY',\n TIMING = 'TIMING',\n}\n\nexport enum PLAYER_ACTIONS {\n ENDED = 'READY.ENDED',\n ERROR = 'ERROR',\n REFRESH = 'REFRESH',\n RESTART = 'RESTART',\n TOGGLE_FULL_SCREEN = 'READY.TOGGLE_FULL_SCREEN',\n CHANGE_PLAYING_MODE = 'CHANGE_PLAYING_MODE',\n JUMP_TO_TIME_PERCENT = 'JUMP_TO_TIME_PERCENT',\n JUMP_TO_MATCH_TIME = 'JUMP_TO_MATCH_TIME',\n LOAD_PLAYLIST = 'LOAD_PLAYLIST',\n REPLACE_PLAYLIST = 'READY.REPLACE_PLAYLIST',\n CHANGE_AUTOPLAY_NEXT_PLAYLIST_ITEM = 'READY.CHANGE_AUTOPLAY_NEXT_PLAYLIST_ITEM',\n REPLACE_PLAYLIST_ITEMS = 'READY.REPLACE_PLAYLIST_ITEMS',\n LOAD_PLAYLIST_ITEM = 'READY.LOAD_PLAYLIST_ITEM',\n NEXT_PLAYLIST_ITEM = 'READY.NEXT_PLAYLIST_ITEM',\n AUTOPLAY_NEXT_PLAYLIST_ITEM = 'READY.AUTOPLAY_NEXT_PLAYLIST_ITEM',\n NEXT_VIDEO_SOURCE = 'READY.NEXT_VIDEO_SOURCE',\n PREVIOUS_VIDEO_SOURCE = 'READY.PREVIOUS_VIDEO_SOURCE',\n PAUSE = 'READY.PAUSE',\n PLAY = 'READY.PLAY',\n PREVIOUS_PLAYLIST_ITEM = 'READY.PREVIOUS_PLAYLIST_ITEM',\n READY = 'READY',\n REMOVE_PLAYLIST_ITEM = 'READY.REMOVE_PLAYLIST_ITEM',\n REMOVE_PLAYLIST_ITEMS = 'READY.REMOVE_PLAYLIST_ITEMS',\n REORDER_PLAYLIST_ITEM = 'REORDER_PLAYLIST_ITEM',\n REPLAY = 'REPLAY',\n RESUME_STAND_BY = 'READY.RESUME_STAND_BY',\n SKIP_BACKWARD = 'READY.SKIP_BACKWARD',\n SKIP_FORWARD = 'READY.SKIP_FORWARD',\n STAND_BY = 'READY.STAND_BY',\n TIMING = 'READY.TIMING',\n TOGGLE_PLAYING = 'READY.TOGGLE_PLAYING',\n UPDATE_PLAYLIST_ITEM = 'READY.UPDATE_PLAYLIST_ITEM',\n UPDATE_PLAYLIST_ITEMS = 'READY.UPDATE_PLAYLIST_ITEMS',\n UPDATE_PLAYLIST_ITEM_CUSTOM_VIEW = 'READY.UPDATE_PLAYLIST_ITEM_CUSTOM_VIEW',\n ADD_PLAYLIST_ITEM_CUSTOM_VIEW = 'READY.ADD_PLAYLIST_ITEM_CUSTOM_VIEW',\n REMOVE_PLAYLIST_ITEM_CUSTOM_VIEW = 'READY.REMOVE_PLAYLIST_ITEM_CUSTOM_VIEW',\n}\n","import { atomFamily } from 'recoil';\n\nimport { PLAYER_STATES, READY_STATES } from 'shared/components/video-player/state/states';\nimport { PlayerStatePlaylist } from 'shared/components/video-player/types';\n\nimport { EPISODES_PLAYING_MODE } from '../../defaultPlayingModes';\n\nconst currentTime = atomFamily({\n key: 'video-player-current-time',\n default: 0,\n});\n\ntype States = READY_STATES | PLAYER_STATES;\nconst playerStatus = atomFamily({\n key: 'video-player-state',\n default: PLAYER_STATES.IDLE,\n});\n\nconst isPlaying = atomFamily({\n key: 'video-player-is-playing',\n default: false,\n});\n\nconst playlistDefault: PlayerStatePlaylist = {\n preferredPlayingMode: EPISODES_PLAYING_MODE,\n currentSelectedPlayingMode: EPISODES_PLAYING_MODE,\n currentPlaylistItemId: '',\n playlistItems: [],\n playingItem: {\n currentSourceTime: 0,\n playlistItem: {\n videoTypes: [],\n duration: 0,\n name: '',\n id: '',\n index: 0,\n recordingMatchday: '',\n recordingName: '',\n recordingId: '',\n hasHomographies: false,\n fundamentalsSelected: {\n tacticalAnalysisId: undefined,\n fundamentalsSelected: [],\n },\n },\n videoSourceIndex: 0,\n },\n};\n\nconst playlist = atomFamily({\n key: 'video-player-playlist',\n default: playlistDefault,\n});\n\nconst isInStandBy = atomFamily({\n key: 'video-player-is-stand-by',\n default: false,\n});\n\nexport const videoPlayerStateAtoms = {\n currentTime,\n isPlaying,\n isInStandBy,\n playlist,\n playerStatus,\n};\n","import { PlayingModes } from '../types';\n\nexport const isFullMatchVideo = (playingMode: PlayingModes) => {\n return playingMode === PlayingModes.PANORAMIC || playingMode === PlayingModes.TACTICAL_CAMERA;\n};\n","import isEmpty from 'lodash/isEmpty';\n\nimport { PlayingMode, PlayingModes, VideoSourceType } from 'shared/components/video-player/types';\n\nimport { PlaylistItemWithoutVideoSources } from '../../../types/playlist/types';\nimport { isFullMatchVideo } from '../is-full-match-video';\nimport { PlayerStateMachineContext, PlaylistItemType, VideoSourceWithTimes } from '../types';\n\nexport const getVideoByVideoType = (playlistItem: PlaylistItemType, playingMode: PlayingMode): VideoSourceType => {\n // Search for preferred video type\n const preferredVideoType = playlistItem.videoTypes.find((videoType) => videoType.playingMode.isPreferred);\n if (preferredVideoType) return preferredVideoType;\n\n // Find video with overlays\n const videoTypeWithOverlays = playlistItem.videoTypes.find(\n (videoType) =>\n videoType.playingMode.showOverlays &&\n videoType.playingMode.showOverlays === playingMode.showOverlays &&\n !isEmpty(videoType.videoSources),\n );\n if (videoTypeWithOverlays) return videoTypeWithOverlays;\n\n // Find video type more similar to current PlayingMode\n const videoType = playlistItem.videoTypes.find(\n (videoType) =>\n videoType.playingMode.mode === playingMode.mode ||\n (playingMode.mode === PlayingModes.PLAYLIST &&\n isFullMatchVideo(videoType.playingMode.mode) &&\n !isEmpty(videoType.videoSources)),\n );\n if (videoType) return videoType;\n\n //Return first videoType that has no empty videoSources\n const isAnyVideoTypeWithSources = playlistItem.videoTypes.find((item) => !isEmpty(item.videoSources));\n if (isAnyVideoTypeWithSources) return isAnyVideoTypeWithSources;\n\n // Return an empty value\n return {\n playingMode,\n videoSources: [{ startTime: 0, endTime: 0, src: '', id: '' }],\n };\n};\n\nexport const getVideoSourceByIndex = (\n playlistItem: PlaylistItemType,\n playingMode: PlayingMode,\n videoSourceIndex: number,\n): VideoSourceWithTimes => {\n const { videoSources } = getVideoByVideoType(playlistItem, playingMode);\n\n return videoSources[videoSourceIndex];\n};\n\nexport const getCurrentVideoSource = (context: PlayerStateMachineContext): VideoSourceWithTimes => {\n const { currentSelectedPlayingMode } = context.playlist;\n const { playlistItem, videoSourceIndex } = context.playlist.playingItem;\n return getVideoSourceByIndex(playlistItem, currentSelectedPlayingMode, videoSourceIndex);\n};\n\nconst getClosestMatchingVideoSourceIndex = (\n matchTime: number,\n startTime: number,\n endTime: number,\n currentVideoIndex: number,\n newVideoIndex: number,\n): number => {\n if (matchTime <= endTime && matchTime >= startTime) {\n return newVideoIndex;\n }\n\n if (startTime >= matchTime && currentVideoIndex === -1) {\n return newVideoIndex;\n }\n\n return currentVideoIndex;\n};\n\nexport const getCurrentTimeAndVideoSourceIndex = (\n matchTime: number,\n videoSources: VideoSourceWithTimes[],\n playingMode: PlayingMode,\n): { currentTime: number; videoIndex: number } => {\n const result = videoSources.reduce(\n (result, videoSource, currentVideoIndex) => {\n const endTime = videoSource.endTimeInMatch ? videoSource.endTimeInMatch : videoSource.endTime;\n const startTime = videoSource.startTimeInMatch ? videoSource.startTimeInMatch : videoSource.startTime;\n const isFullMatch = isFullMatchVideo(playingMode.mode);\n\n const foundVideoIndex = getClosestMatchingVideoSourceIndex(\n matchTime,\n startTime,\n endTime,\n result.videoIndex,\n currentVideoIndex,\n );\n\n if (foundVideoIndex === result.videoIndex) return result;\n\n const time = isFullMatch ? matchTime : matchTime - startTime;\n\n return {\n videoIndex: foundVideoIndex,\n currentTime: foundVideoIndex !== result.videoIndex ? time : result.currentTime,\n };\n },\n {\n videoIndex: -1,\n currentTime: isFullMatchVideo(playingMode.mode) || !playingMode.useEffectiveTime ? matchTime : 0,\n },\n );\n\n const videoSourceIndex = result.videoIndex >= 0 ? result.videoIndex : 0;\n const currentTime =\n result.currentTime > 0 &&\n result.currentTime > videoSources[videoSourceIndex].startTime &&\n result.currentTime < videoSources[videoSourceIndex].endTime\n ? result.currentTime\n : videoSources[videoSourceIndex].startTime;\n\n return {\n videoIndex: videoSourceIndex,\n currentTime: currentTime > 0 ? currentTime : videoSources[videoSourceIndex].startTime,\n };\n};\n\nexport const areAllOverlayTacticsSelected = (playlistItems: PlaylistItemType | PlaylistItemWithoutVideoSources) => {\n return playlistItems.fundamentalsSelected.fundamentalsSelected[0] === 'all';\n};\n","import { FrameInfo, TacticId, useOverlayGenerator } from 'overlay-generator';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { atomFamily, useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { useCurrentPlaylistItem, useVideoPlayerActions, useVideoPlayerId, useVideoPlayerRef } from '../';\n\nconst areOverlaysReady = atomFamily({\n key: 'overlays-ready',\n default: false,\n});\n\nconst frameRate = atomFamily({\n key: 'overlays-render-frame-rate',\n default: 0,\n});\n\nconst frameInfo = atomFamily({\n key: 'overlays-frame-info',\n default: {\n frameNumber: 0,\n frameTactics: [],\n overlayElementsDebugInfo: [],\n },\n});\n\nexport const useSetAreOverlaysReady = () => {\n const playerId = useVideoPlayerId();\n return useSetRecoilState(areOverlaysReady(playerId));\n};\n\nexport const useAreOverlaysReady = () => {\n const playerId = useVideoPlayerId();\n return useRecoilValue(areOverlaysReady(playerId));\n};\n\nexport const useSetOverlaysFrameInfo = () => {\n const playerId = useVideoPlayerId();\n return useSetRecoilState(frameInfo(playerId));\n};\n\nexport const useOverlaysFrameInfo = () => {\n const playerId = useVideoPlayerId();\n return useRecoilValue(frameInfo(playerId));\n};\n\nexport const useRenderFrameRate = () => {\n const playerId = useVideoPlayerId();\n return useRecoilValue(frameRate(playerId));\n};\n\nexport const useOverlaysController = (videoPlayerContainerRef: React.RefObject) => {\n const playlistItem = useCurrentPlaylistItem();\n const container = useRef(null);\n const { overlayGenerator, frameRate, frameInfo, isReady } = useOverlayGenerator({\n id: playlistItem.recordingId,\n });\n\n const videoPlayerRef = useVideoPlayerRef();\n const setAreOverlaysReady = useSetAreOverlaysReady();\n const setOverlaysFrameInfo = useSetOverlaysFrameInfo();\n const actions = useVideoPlayerActions();\n const [matrix3dTransformation, setMatrix3dTransformation] = useState([]);\n\n useEffect(() => {\n isReady ? actions.resumeStandBy() : actions.handleStandBy();\n setAreOverlaysReady(isReady);\n }, [actions, setAreOverlaysReady, isReady]);\n\n useEffect(() => {\n setOverlaysFrameInfo(frameInfo);\n }, [setOverlaysFrameInfo, frameInfo]);\n\n const handleUpdateFrame = useCallback(\n async ({\n frame,\n tactics,\n videoPlayerWidth,\n videoPlayerHeight,\n overlayContainer,\n }: {\n frame: number;\n tactics: TacticId[] | undefined;\n videoPlayerWidth: number;\n videoPlayerHeight: number;\n overlayContainer: HTMLDivElement;\n }) => {\n await overlayGenerator.drawFrameInCanvas(overlayContainer, frame, {\n tactics,\n });\n\n const matrix3d = overlayGenerator.getTransformationMatrix(frame, {\n width: videoPlayerWidth,\n height: videoPlayerHeight,\n });\n\n setMatrix3dTransformation(matrix3d);\n return Boolean(matrix3d);\n },\n [overlayGenerator],\n );\n\n const handleVideoTimeUpdate = useCallback(async () => {\n const videoPlayerWidth = videoPlayerRef.current?.offsetWidth;\n const videoPlayerHeight = videoPlayerRef.current?.offsetHeight;\n if (!container.current || !videoPlayerRef.current || !videoPlayerWidth || !videoPlayerHeight) return;\n\n const videoFrame = Math.round(videoPlayerRef.current.currentTime * frameRate) - 1;\n\n const tactics =\n playlistItem.fundamentalsSelected && playlistItem.fundamentalsSelected.fundamentalsSelected[0] === 'all'\n ? undefined\n : (playlistItem.fundamentalsSelected.fundamentalsSelected as TacticId[]);\n\n return await handleUpdateFrame({\n frame: videoFrame,\n tactics,\n videoPlayerWidth,\n videoPlayerHeight,\n overlayContainer: container.current,\n });\n }, [container, frameRate, handleUpdateFrame, playlistItem.fundamentalsSelected, videoPlayerRef]);\n\n useEffect(() => {\n if (!videoPlayerContainerRef?.current) return;\n\n const video = videoPlayerRef.current;\n const videoPlayerContainer = videoPlayerContainerRef.current;\n\n const update = () => {\n handleVideoTimeUpdate();\n };\n\n const observer = new ResizeObserver(update);\n observer.observe(videoPlayerContainer as HTMLElement);\n video?.addEventListener('vmFullscreenChange', update);\n video?.addEventListener('vmCurrentTimeChange', update);\n video?.addEventListener('vmBufferingChange', update);\n video?.addEventListener('vmCurrentSrcChange', update);\n video?.addEventListener('vmDurationChange', update);\n video?.addEventListener('vmPausedChange', update);\n video?.addEventListener('vmSeeked', update);\n\n return () => {\n observer.unobserve(video as HTMLElement);\n video?.removeEventListener('vmFullscreenChange', update);\n video?.removeEventListener('vmCurrentTimeChange', update);\n video?.removeEventListener('vmBufferingChange', update);\n video?.removeEventListener('vmCurrentSrcChange', update);\n video?.removeEventListener('vmDurationChange', update);\n video?.removeEventListener('vmPausedChange', update);\n video?.removeEventListener('vmSeeked', update);\n observer.disconnect();\n };\n }, [handleVideoTimeUpdate, videoPlayerRef, videoPlayerContainerRef]);\n\n return { container, overlayGenerator, matrix3dTransformation };\n};\n","import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { videoPlayerStateAtoms } from '../';\n\nexport const usePlayerSetIsPlaying = (playerId: string) => {\n return useSetRecoilState(videoPlayerStateAtoms.isPlaying(playerId));\n};\n\nexport const usePlayerSetPlaylist = (playerId: string) => {\n return useSetRecoilState(videoPlayerStateAtoms.playlist(playerId));\n};\n\nexport const usePlayerUpdateStandBy = (playerId: string) => {\n return useSetRecoilState(videoPlayerStateAtoms.isInStandBy(playerId));\n};\n\nexport const useSetCurrentTime = (playerId: string) => {\n return useSetRecoilState(videoPlayerStateAtoms.currentTime(playerId));\n};\n\nexport const useGetCurrentTime = (playerId: string) => {\n return useRecoilValue(videoPlayerStateAtoms.currentTime(playerId));\n};\n\nexport const usePlayerState = (playerId: string) => {\n return useRecoilState(videoPlayerStateAtoms.playerStatus(playerId));\n};\n","import { PlayingMode } from 'shared/components/video-player/types';\nimport { round } from 'shared/utils/round';\n\nimport { PlaylistItemType } from '../../../types';\nimport { getVideoByVideoType } from '../../../util';\n\nexport const getCurrentPlaylistItemTime = (\n playingMode: PlayingMode,\n absoluteCurrentTime: number,\n videoSourceIndex: number,\n playlistItem?: PlaylistItemType,\n) => {\n if (!playlistItem) return 0;\n\n const isFullMatchNotEffectiveTime = playingMode.mode === 'TACTICAL_CAMERA' && !playingMode.useEffectiveTime;\n\n const { videoSources } = getVideoByVideoType(playlistItem, playingMode);\n\n const adjustedStartTime = videoSources.reduce((startTime, source, idx) => {\n return videoSourceIndex > idx ? startTime + (source.endTime - source.startTime) : startTime;\n }, 0);\n\n const currentTime = isFullMatchNotEffectiveTime\n ? absoluteCurrentTime\n : absoluteCurrentTime - videoSources[videoSourceIndex].startTime + adjustedStartTime;\n\n return round(currentTime > 0 ? currentTime : 0);\n};\n","import { usePlayerContext } from '@vime/react';\nimport get from 'lodash/get';\nimport React, { useMemo } from 'react';\nimport { useRouteMatch } from 'react-router-dom';\nimport { atomFamily, useRecoilValue } from 'recoil';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { routes } from 'kognia/router/routes';\nimport { videoPlayerStateAtoms } from 'shared/components/video-player/state/atoms';\nimport { PlayingMode, PlayingModes, VideoSourceType, VideoSourceWithTimes } from 'shared/components/video-player/types';\nimport { getVideoByVideoType, getVideoSourceByIndex } from 'shared/components/video-player/util';\n\nimport { useAreOverlaysReady } from './use-overlays-controller';\nimport { useFeatureFlag } from '../../../contexts/app-state';\nimport { VideoPlayerActions, VideoPlayerStateFixedContext } from '../index';\nimport { useGetCurrentTime } from '../state/atoms/hooks';\nimport { PLAYER_STATES, READY_STATES } from '../state/states';\nimport { getCurrentPlaylistItemTime } from '../state/utils/get-current-playlist-item-time';\nimport { PlaylistItemType } from '../types';\n\nconst getVideoPlayerFixedStateContext = (hookName: string) => {\n const context = React.useContext(VideoPlayerStateFixedContext);\n\n if (context === undefined) {\n throw new Error(`${hookName} must be used within a VideoPlayerStateFixedContext`);\n }\n\n return context;\n};\n\nexport const useVideoPlayerRef = () => {\n const context = getVideoPlayerFixedStateContext('useVideoPlayerRef');\n\n return context.state.videoPlayerRef;\n};\n\nexport const useVideoPlayerContainerRef = () => {\n const context = getVideoPlayerFixedStateContext('useVideoPlayerContainerRef');\n\n return context.state.videoPlayerContainerRef;\n};\n\nexport const useVideoPlayerId = (): string => {\n const context = getVideoPlayerFixedStateContext('useVideoPlayerId');\n\n return context.state.videoPlayerId;\n};\n\nexport const useVideoPlayerRefreshData = (): (() => void) | (() => Promise) | undefined => {\n const context = getVideoPlayerFixedStateContext('useVideoPlayerRefreshData');\n\n return context.state.refreshData;\n};\n\nexport const useVideoPlayerActions = (): VideoPlayerActions => {\n const context = getVideoPlayerFixedStateContext('useVideoPlayerActions');\n\n return context.state.actions;\n};\n\nexport const usePlayerCurrentSource = () => {\n const playerId = useVideoPlayerId();\n const playlist = useRecoilValue(videoPlayerStateAtoms.playlist(playerId));\n\n return useMemo(\n () =>\n getVideoSourceByIndex(\n playlist.playingItem.playlistItem,\n playlist.currentSelectedPlayingMode,\n playlist.playingItem.videoSourceIndex,\n ),\n [playlist.playingItem.playlistItem, playlist.currentSelectedPlayingMode, playlist.playingItem.videoSourceIndex],\n );\n};\n\nexport const useCurrentVideoSourceDuration = () => {\n const videoSource = usePlayerCurrentSource();\n\n const startTime = videoSource?.startTime ?? 0;\n const endTime = videoSource?.endTime ?? 0;\n\n return endTime - startTime;\n};\n\nexport const useVideoPlayerPlayingMode = (): PlayingMode => {\n const playerId = useVideoPlayerId();\n const playlist = useRecoilValue(videoPlayerStateAtoms.playlist(playerId));\n\n return playlist.currentSelectedPlayingMode;\n};\n\nexport const useCurrentPlaylistItemId = (): string => {\n const playerId = useVideoPlayerId();\n const playlist = useRecoilValue(videoPlayerStateAtoms.playlist(playerId));\n\n return playlist.currentPlaylistItemId;\n};\n\nexport const useVideoPlayerPlaylistItem = (id: string): PlaylistItemType => {\n const playerId = useVideoPlayerId();\n const playlist = useRecoilValue(videoPlayerStateAtoms.playlist(playerId));\n\n const playlistItem = playlist.playlistItems.find((playlistItem) => playlistItem.id === id);\n\n if (!playlistItem) return playlist.playlistItems[0];\n\n return playlistItem;\n};\n\nexport const useCurrentPlaylistItem = (): PlaylistItemType => {\n const playerId = useVideoPlayerId();\n const playlist = useRecoilValue(videoPlayerStateAtoms.playlist(playerId));\n\n return useMemo(() => {\n const currentPlaylistItem = playlist.playlistItems.find(\n (playlistItem) => playlistItem.id === playlist.currentPlaylistItemId,\n );\n if (!currentPlaylistItem) return playlist.playingItem.playlistItem;\n return currentPlaylistItem;\n }, [playlist.playlistItems, playlist.currentPlaylistItemId, playlist.playingItem.playlistItem]);\n};\n\nexport const useDuration = () => {\n const playerId = useVideoPlayerId();\n const playlist = useRecoilValue(videoPlayerStateAtoms.playlist(playerId));\n\n return playlist.playingItem.playlistItem.duration ?? 0;\n};\n\nexport const useIsSeeking = (): boolean => {\n const context = getVideoPlayerFixedStateContext('useIsSeeking');\n const [seeking] = usePlayerContext(context.state.videoPlayerRef, 'seeking', false);\n\n return seeking;\n};\n\nexport const useIsBuffering = () => {\n const showCustomOverlaysFlag = useFeatureFlag(FEATURE_FLAG.CUSTOM_OVERLAYS);\n const matchPath = useRouteMatch(routes.RECORDING_PLAYLIST_DETAIL);\n const areOverlaysReady = useAreOverlaysReady();\n const { showOverlays } = useVideoPlayerPlayingMode();\n const playlistItem = useCurrentPlaylistItem();\n const context = getVideoPlayerFixedStateContext('useIsBuffering');\n const [buffering] = usePlayerContext(context.state.videoPlayerRef, 'buffering', false);\n\n return matchPath && showOverlays && playlistItem.hasHomographies && showCustomOverlaysFlag\n ? buffering || !areOverlaysReady\n : buffering;\n};\n\nexport const useVideoPlayerIsPlaying = () => {\n const playerId = useVideoPlayerId();\n\n return useRecoilValue(videoPlayerStateAtoms.isPlaying(playerId));\n};\n\nexport const useVideoPlayerIsInStandBy = () => {\n const playerId = useVideoPlayerId();\n\n return useRecoilValue(videoPlayerStateAtoms.isInStandBy(playerId));\n};\n\nexport const useVideoPlayerState = () => {\n const playerId = useVideoPlayerId();\n const state = useRecoilValue(videoPlayerStateAtoms.playerStatus(playerId));\n\n const readyState = get(state, 'READY');\n\n return {\n state: readyState ? PLAYER_STATES.READY : state,\n isEnded: state === READY_STATES.ENDED,\n readyState: readyState,\n isPlaylistEmpty: state === PLAYER_STATES.EMPTY_PLAYLIST && readyState,\n };\n};\n\nexport const usePlaylistCurrentPlaylistItemId = (): string => {\n const playerId = useVideoPlayerId();\n const playlist = useRecoilValue(videoPlayerStateAtoms.playlist(playerId));\n\n return playlist.currentPlaylistItemId;\n};\n\nexport const useIsCurrentPlaylistItem = (id: string): boolean => {\n const playerId = useVideoPlayerId();\n const playlist = useRecoilValue(videoPlayerStateAtoms.playlist(playerId));\n\n return playlist.currentPlaylistItemId === id;\n};\n\nexport const usePlaylistItems = (): PlaylistItemType[] => {\n const playerId = useVideoPlayerId();\n const playlist = useRecoilValue(videoPlayerStateAtoms.playlist(playerId));\n\n return playlist.playlistItems;\n};\n\nexport const useCurrentPlaylistItemVideoSources = (): VideoSourceWithTimes[] => {\n const playlistItem = useCurrentPlaylistItem();\n const playingMode = useVideoPlayerPlayingMode();\n const { videoSources } = getVideoByVideoType(playlistItem, playingMode);\n\n return videoSources;\n};\n\nexport const useCurrentPlaylistItemVideo = (): ((playingMode: PlayingMode) => VideoSourceType) => {\n const playlistItem = useCurrentPlaylistItem();\n\n return (playingMode: PlayingMode) => getVideoByVideoType(playlistItem, playingMode);\n};\n\nexport const useCurrentVideoSourceIndex = (): number => {\n const playerId = useVideoPlayerId();\n const playlist = useRecoilValue(videoPlayerStateAtoms.playlist(playerId));\n\n return playlist.playingItem.videoSourceIndex;\n};\n\nexport const useCurrentVideoSource = (): VideoSourceWithTimes => {\n const index = useCurrentVideoSourceIndex();\n const videoSources = useCurrentPlaylistItemVideoSources();\n\n return videoSources[index];\n};\n\nexport const useCurrentVideoSourceTime = () => {\n const playerId = useVideoPlayerId();\n return useGetCurrentTime(playerId);\n};\n\nconst nonReactiveCurrentMatchTimeAtomFamily = atomFamily<{ time: number }, string>({\n key: 'non-reactive-current-match-time',\n default: { time: 0 },\n dangerouslyAllowMutability: true,\n});\n\nexport const useNonReactiveCurrentTime = () => {\n return useRecoilValue(nonReactiveCurrentMatchTimeAtomFamily(useVideoPlayerId()));\n};\n\nconst getCurrentTimeByVideoSource = (\n currentTime: number,\n currentVideoSource: VideoSourceWithTimes,\n hasMultipleVideoSources: boolean,\n playingMode: PlayingMode,\n): number => {\n if (playingMode.mode !== PlayingModes.EPISODES) return currentTime;\n if (!hasMultipleVideoSources) return currentTime;\n\n return (currentVideoSource.startTimeInMatch ?? 0) + currentTime;\n};\n\nexport const useCurrentMatchTime = () => {\n const mutableMatchTime = useNonReactiveCurrentTime();\n const playlistItem = useCurrentPlaylistItem();\n const currentTime = useCurrentVideoSourceTime();\n const videoSourceIndex = useCurrentVideoSourceIndex();\n const playingMode = useVideoPlayerPlayingMode();\n const { videoSources } = getVideoByVideoType(playlistItem, playingMode);\n\n const time = getCurrentTimeByVideoSource(\n currentTime,\n videoSources[videoSourceIndex],\n videoSources.length > 1,\n playingMode,\n );\n\n mutableMatchTime.time = time;\n\n return time;\n};\n\nexport const useCurrentTime = () => {\n const playlistItem = useCurrentPlaylistItem();\n const currentTime = useCurrentVideoSourceTime();\n const videoSourceIndex = useCurrentVideoSourceIndex();\n const playingMode = useVideoPlayerPlayingMode();\n\n return getCurrentPlaylistItemTime(playingMode, currentTime, videoSourceIndex, playlistItem);\n};\n","import { PlayingMode } from 'shared/components/video-player/types';\n\nimport { PlayerType, PlaylistItemType } from '../../types';\n\nexport interface ChangeSourceAndTimeMachineContext {\n playingMode: PlayingMode;\n playlistItem: PlaylistItemType | undefined;\n videoRef: PlayerType | undefined;\n videoSourceIndex: number;\n currentTime: number;\n}\n\nexport enum CHANGE_SOURCE_STATES {\n CHECK_CURRENT_INITIAL_STATE = 'CHECK_INITIAL_STATE',\n CHECK_CURRENT_SOURCE = 'CHECK_CURRENT_SOURCE',\n CHECK_CURRENT_TIME = 'CHECK_CURRENT_TIME',\n ENDED = 'ENDED',\n}\n\nexport enum CHANGE_SOURCE_ACTIONS {\n CHECK_CURRENT_SOURCE = 'CHECK_CURRENT_SOURCE',\n CHECK_CURRENT_TIME = 'CHECK_CURRENT_TIME',\n}\n","import { sendParent } from 'xstate';\n\nimport { getVideoSourceByIndex } from '../../../util';\nimport { PLAYER_ACTIONS } from '../../states';\nimport { ChangeSourceAndTimeMachineContext } from '../types';\n\nexport const isSameVideoSource = (context: ChangeSourceAndTimeMachineContext) => {\n if (!context.videoRef?.current || !context.playlistItem) return false;\n const videoSource = getVideoSourceByIndex(context.playlistItem, context.playingMode, context.videoSourceIndex);\n\n return context.videoRef?.current?.currentSrc === videoSource?.src;\n};\n\nexport const isVideoSourceReady = (context: ChangeSourceAndTimeMachineContext) => {\n if (!context.videoRef?.current || !context.playlistItem) return false;\n\n const videoSource = getVideoSourceByIndex(context.playlistItem, context.playingMode, context.videoSourceIndex);\n const isCurrentSource = context.videoRef?.current?.currentSrc === videoSource?.src;\n\n if (!isCurrentSource) {\n if (!context.videoRef?.current?.paused) {\n context.videoRef?.current?.pause();\n }\n\n context.videoRef.current.currentSrc = videoSource?.src;\n return false;\n }\n\n return isCurrentSource;\n};\n\nexport const isCurrentTime = (context: ChangeSourceAndTimeMachineContext) => {\n if (!context.videoRef?.current?.currentTime && context.videoRef?.current?.currentTime !== 0) return false;\n\n const correction = context.currentTime === 0 ? 0.0001 : 0;\n const timeDifference = Math.abs(context.videoRef?.current?.currentTime - context.currentTime + correction);\n\n const isInStartTime =\n context.videoRef?.current?.currentTime === context.currentTime + correction || timeDifference < 0.1;\n\n if (!isInStartTime) {\n context.videoRef.current.currentTime = context.currentTime + correction;\n return false;\n }\n\n sendParent({ type: PLAYER_ACTIONS.TIMING, time: context.currentTime });\n return isInStartTime;\n};\n","import { createMachine } from 'xstate';\n\nimport { CHANGE_SOURCE_ACTIONS, CHANGE_SOURCE_STATES, ChangeSourceAndTimeMachineContext } from './types';\nimport { isCurrentTime, isSameVideoSource, isVideoSourceReady } from './utils/guards';\n\nexport const changeSourceMachine = createMachine(\n {\n predictableActionArguments: true,\n id: 'change-source-machine',\n initial: CHANGE_SOURCE_STATES.CHECK_CURRENT_INITIAL_STATE,\n states: {\n [CHANGE_SOURCE_STATES.CHECK_CURRENT_INITIAL_STATE]: {\n always: [\n { target: CHANGE_SOURCE_STATES.CHECK_CURRENT_TIME, cond: 'isSameVideoSource' },\n { target: CHANGE_SOURCE_STATES.CHECK_CURRENT_SOURCE },\n ],\n },\n [CHANGE_SOURCE_STATES.CHECK_CURRENT_SOURCE]: {\n after: {\n 10: [\n { target: CHANGE_SOURCE_ACTIONS.CHECK_CURRENT_TIME, cond: 'isVideoSourceReady' },\n { target: CHANGE_SOURCE_ACTIONS.CHECK_CURRENT_SOURCE },\n ],\n },\n },\n [CHANGE_SOURCE_STATES.CHECK_CURRENT_TIME]: {\n after: {\n 10: [{ target: 'ENDED', cond: 'isCurrentTime' }, { target: CHANGE_SOURCE_ACTIONS.CHECK_CURRENT_TIME }],\n },\n },\n ENDED: { type: 'final' },\n },\n },\n { guards: { isVideoSourceReady, isCurrentTime, isSameVideoSource } },\n);\n","import { PlayingMode, PlaylistItemType } from '../../types';\nimport { PLAYER_ACTIONS } from '../states';\nimport { Send } from '../types';\n\nexport const createActions = (send: Send) => {\n return {\n reorder: (currentVideoIndex: number, newVideoIndex: number) => {\n send({\n type: PLAYER_ACTIONS.REORDER_PLAYLIST_ITEM,\n currentVideoIndex,\n newVideoIndex,\n });\n },\n toggleFullScreen: () => send({ type: PLAYER_ACTIONS.TOGGLE_FULL_SCREEN }),\n changeAutoplayNextPlaylistItem: (autoplayNextPlaylistItem: boolean) =>\n send({\n type: PLAYER_ACTIONS.CHANGE_AUTOPLAY_NEXT_PLAYLIST_ITEM,\n autoplayNextPlaylistItem: autoplayNextPlaylistItem,\n }),\n changePlayingMode: (playingMode: PlayingMode, tryToKeepCurrentTime = true, autoplay = false) =>\n send({\n type: PLAYER_ACTIONS.CHANGE_PLAYING_MODE,\n playingMode,\n tryToKeepCurrentTime,\n autoplay,\n }),\n jumpToMatchTime: (time: number) => send({ type: PLAYER_ACTIONS.JUMP_TO_MATCH_TIME, time }),\n jumpToTimePercent: (percent: number) => {\n send({ type: PLAYER_ACTIONS.JUMP_TO_TIME_PERCENT, percent });\n },\n loadPlaylist: (playlistItems: PlaylistItemType[], initialStartTime = 0) =>\n send({ type: PLAYER_ACTIONS.LOAD_PLAYLIST, playlistItems, initialStartTime }),\n restart: () => send({ type: PLAYER_ACTIONS.RESTART }),\n refresh: () => send({ type: PLAYER_ACTIONS.REFRESH }),\n setPlaylist: (\n playlistItems: PlaylistItemType[],\n playingMode: PlayingMode,\n autoplay?: boolean,\n tryToKeepCurrentTime?: boolean,\n ) => send({ type: PLAYER_ACTIONS.REPLACE_PLAYLIST, playlistItems, playingMode, tryToKeepCurrentTime, autoplay }),\n pause: () => send({ type: PLAYER_ACTIONS.PAUSE }),\n play: () => send({ type: PLAYER_ACTIONS.PLAY }),\n replacePlaylistItems: (playlistItems: PlaylistItemType[]) => {\n send({ type: PLAYER_ACTIONS.REPLACE_PLAYLIST_ITEMS, playlistItems });\n },\n updatePlaylistItems: (playlistItems: PlaylistItemType[]) => {\n send({ type: PLAYER_ACTIONS.UPDATE_PLAYLIST_ITEMS, playlistItems });\n },\n togglePlaying: () => send({ type: PLAYER_ACTIONS.TOGGLE_PLAYING }),\n setPlaylistItem: (id: string, autoPlay: boolean) =>\n send({\n type: PLAYER_ACTIONS.LOAD_PLAYLIST_ITEM,\n playlistItemId: id,\n autoPlay,\n }),\n removePlaylistItem: (id: string) => send({ type: PLAYER_ACTIONS.REMOVE_PLAYLIST_ITEM, playlistItemId: id }),\n removePlaylistItems: (playlistItemsIds: string[]) =>\n send({ type: PLAYER_ACTIONS.REMOVE_PLAYLIST_ITEMS, playlistItemsIds }),\n updatePlaylistItem: (playlistItem: PlaylistItemType, currentTime?: number) =>\n send({ type: PLAYER_ACTIONS.UPDATE_PLAYLIST_ITEM, playlistItem, currentTime }),\n skipForward5s: () => send({ type: PLAYER_ACTIONS.SKIP_FORWARD }),\n skipBackward5s: () => send({ type: PLAYER_ACTIONS.SKIP_BACKWARD }),\n nextPlaylistItem: () => send({ type: PLAYER_ACTIONS.NEXT_PLAYLIST_ITEM }),\n autoplayNextPlaylistItem: () => send({ type: PLAYER_ACTIONS.AUTOPLAY_NEXT_PLAYLIST_ITEM }),\n previousPlaylistItem: () => send({ type: PLAYER_ACTIONS.PREVIOUS_PLAYLIST_ITEM }),\n nextVideoSource: () => send({ type: PLAYER_ACTIONS.NEXT_VIDEO_SOURCE }),\n previousVideoSource: () => send({ type: PLAYER_ACTIONS.PREVIOUS_VIDEO_SOURCE }),\n replay: () => send({ type: PLAYER_ACTIONS.REPLAY }),\n resumeStandBy: () => send({ type: PLAYER_ACTIONS.RESUME_STAND_BY }),\n handleStandBy: () => send({ type: PLAYER_ACTIONS.STAND_BY }),\n };\n};\n","import throttle from 'lodash/throttle';\nimport { useCallback, useEffect, useMemo } from 'react';\n\nimport { getIsFormTag } from 'shared/utils/is-form-tag';\n\nimport { createActions } from './utils';\nimport { Send } from '../types';\n\nconst CONTROLS_THROTTLE_TIME = 10;\n\nexport const useGenerateVideoPlayerActions = (send: Send) => {\n const actions = useMemo(() => createActions(send), [send]);\n\n const throttlePlay = useMemo(() => throttle(actions.play, CONTROLS_THROTTLE_TIME), [actions]);\n\n const throttlePause = useMemo(\n () =>\n throttle(async () => {\n actions.pause();\n }, CONTROLS_THROTTLE_TIME),\n [actions],\n );\n\n const throttlePreviousPlaylistItem = useMemo(\n () =>\n throttle(async () => {\n actions.previousPlaylistItem();\n }, CONTROLS_THROTTLE_TIME),\n [actions],\n );\n\n const throttleNextPlaylistItem = useMemo(\n () =>\n throttle(async () => {\n actions.nextPlaylistItem();\n }, CONTROLS_THROTTLE_TIME),\n [actions],\n );\n\n const throttlePreviousVideoSource = useMemo(\n () =>\n throttle(async () => {\n actions.previousVideoSource();\n }, CONTROLS_THROTTLE_TIME),\n [actions],\n );\n\n const throttleNextVideoSource = useMemo(\n () =>\n throttle(async () => {\n actions.nextVideoSource();\n }, CONTROLS_THROTTLE_TIME),\n [actions],\n );\n\n const throttleRemovePlaylistItem = useMemo(\n () =>\n throttle(async (id: string) => {\n actions.removePlaylistItem(id);\n }, CONTROLS_THROTTLE_TIME),\n [actions],\n );\n\n const throttleTogglePlaying = useMemo(\n () =>\n throttle(async () => {\n actions.togglePlaying();\n }, CONTROLS_THROTTLE_TIME),\n [actions],\n );\n\n const throttleSkipForward5s = useMemo(\n () =>\n throttle(async () => {\n actions.skipForward5s();\n }, CONTROLS_THROTTLE_TIME),\n [actions],\n );\n\n const throttleSkipBackward5s = useMemo(\n () =>\n throttle(async () => {\n actions.skipBackward5s();\n }, CONTROLS_THROTTLE_TIME),\n [actions],\n );\n\n const throttleJumpToTimeInMatch = useMemo(\n () =>\n throttle((time: number) => {\n actions.jumpToMatchTime(time);\n }, CONTROLS_THROTTLE_TIME),\n [actions],\n );\n\n const throttleJumpToTimePercentage = useMemo(\n () =>\n throttle((percent: number) => {\n actions.jumpToTimePercent(percent);\n }, CONTROLS_THROTTLE_TIME),\n [actions],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n const isFormTag = getIsFormTag((event.target as HTMLElement).tagName);\n if (isFormTag) return;\n\n if (event.key === ' ') throttleTogglePlaying();\n if (event.key === 'ArrowRight') {\n event.ctrlKey ? throttleNextVideoSource() : throttleSkipForward5s();\n }\n if (event.key === 'ArrowLeft') {\n event.ctrlKey ? throttlePreviousVideoSource() : throttleSkipBackward5s();\n }\n },\n [\n throttlePreviousVideoSource,\n throttleNextVideoSource,\n throttleSkipBackward5s,\n throttleSkipForward5s,\n throttleTogglePlaying,\n ],\n );\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown]);\n\n return useMemo(\n () => ({\n ...actions,\n jumpToTimeInMatch: throttleJumpToTimeInMatch,\n jumpToTimePercent: throttleJumpToTimePercentage,\n nextPlaylistItem: throttleNextPlaylistItem,\n nextVideoSource: throttleNextVideoSource,\n pause: throttlePause,\n play: throttlePlay,\n previousPlaylistItem: throttlePreviousPlaylistItem,\n previousVideoSource: throttlePreviousVideoSource,\n removePlaylistItem: throttleRemovePlaylistItem,\n }),\n [\n actions,\n throttleJumpToTimeInMatch,\n throttleJumpToTimePercentage,\n throttleNextPlaylistItem,\n throttleNextVideoSource,\n throttlePause,\n throttlePlay,\n throttlePreviousPlaylistItem,\n throttlePreviousVideoSource,\n throttleRemovePlaylistItem,\n ],\n );\n};\n","import { PlaylistItemType } from '../../../types';\n\nexport const getNextPlaylistItem = (playlistItemId: string, playlistItems: PlaylistItemType[]) => {\n const currentPlaylistItemIndex = playlistItems.findIndex(\n (playlistItem: PlaylistItemType) => playlistItem.id === playlistItemId,\n );\n const nextVideoIndex = currentPlaylistItemIndex + 1;\n return playlistItems[nextVideoIndex < playlistItems.length ? nextVideoIndex : 0];\n};\n","import { PlaylistItemType } from '../../../types';\n\nexport const getPreviousPlaylistItem = (playlistItemId: string, playlistItems: PlaylistItemType[]) => {\n const currentPlaylistItemIndex = playlistItems.findIndex(\n (playlistItem: PlaylistItemType) => playlistItem.id === playlistItemId,\n );\n const previousVideoIndex = currentPlaylistItemIndex - 1;\n\n return playlistItems[previousVideoIndex < 0 ? 0 : previousVideoIndex];\n};\n","import { PlayingMode, PlayingModes, PlaylistItemType } from '../../../types';\nimport { getVideoByVideoType } from '../../../util';\n\nconst getVideoSourceIndexAndTimeFromPlaylistTime = (\n playingMode: PlayingMode,\n playlistItem: PlaylistItemType | undefined,\n time: number,\n) => {\n if (!playlistItem) throw Error('Playlist is mandatory');\n\n const { videoSources } = getVideoByVideoType(playlistItem, playingMode);\n\n const result = videoSources.reduce(\n (result, videoSource, currentVideoIndex) => {\n const timeInVideoSource = videoSource.startTime + (time - result.startTime);\n\n const foundVideoIndex =\n timeInVideoSource <= videoSource.endTime && timeInVideoSource >= videoSource.startTime\n ? currentVideoIndex\n : result.videoIndex;\n\n const accumulatedStartTime = videoSource.endTime - videoSource.startTime + result.startTime;\n\n return {\n startTime: accumulatedStartTime,\n videoIndex: foundVideoIndex,\n timeInVideoSource: foundVideoIndex !== result.videoIndex ? timeInVideoSource : result.timeInVideoSource,\n };\n },\n { startTime: 0, videoIndex: -1, timeInVideoSource: 0 },\n );\n\n return { videoSourceIndex: result.videoIndex, currentSourceTime: result.timeInVideoSource };\n};\n\nexport const getVideoSourceIndexAndTimeFromMatchTime = (\n playingMode: PlayingMode,\n playlistItem: PlaylistItemType,\n timeInMatch: number,\n): { currentSourceTime: number; videoSourceIndex: number } => {\n const { videoSources } = getVideoByVideoType(playlistItem, playingMode);\n const isPlayingSelectionNotEffectiveTime =\n playingMode.mode === 'TACTICAL_CAMERA' && !playingMode.useEffectiveTime && videoSources.length > 1;\n\n for (let x = 0; x <= videoSources.length; x++) {\n const videoSource = videoSources[x];\n\n if (playingMode.mode !== PlayingModes.EPISODES) {\n if (timeInMatch >= videoSource.startTime && timeInMatch <= videoSource.endTime) {\n return { videoSourceIndex: x, currentSourceTime: timeInMatch };\n }\n\n if (!playingMode.useEffectiveTime && !isPlayingSelectionNotEffectiveTime) {\n return { videoSourceIndex: x, currentSourceTime: timeInMatch };\n }\n\n if (timeInMatch > videoSource.endTime && videoSources[x + 1] === undefined) {\n return { videoSourceIndex: x, currentSourceTime: videoSources[x].startTime };\n }\n\n if (timeInMatch > videoSource.endTime && timeInMatch < videoSources[x + 1].startTime) {\n return { videoSourceIndex: x + 1, currentSourceTime: videoSources[x + 1].startTime };\n }\n\n if (timeInMatch < videoSource.startTime) {\n return { videoSourceIndex: x, currentSourceTime: videoSource.startTime };\n }\n\n continue;\n }\n\n if (videoSource.startTimeInMatch === undefined || videoSource.endTimeInMatch === undefined) {\n throw Error('Action not valid in context without a game');\n }\n\n const diff = timeInMatch - videoSource.startTimeInMatch;\n\n if (\n timeInMatch >= videoSource.startTimeInMatch &&\n timeInMatch <= videoSource.endTimeInMatch &&\n diff >= videoSource.startTime &&\n diff <= videoSource.endTime\n ) {\n return { videoSourceIndex: x, currentSourceTime: diff };\n }\n\n if (\n timeInMatch >= videoSource.startTimeInMatch &&\n timeInMatch <= videoSource.endTimeInMatch &&\n diff < videoSource.startTime\n ) {\n return { videoSourceIndex: x, currentSourceTime: videoSource.startTime };\n }\n\n if (timeInMatch < videoSource.startTimeInMatch) {\n return { videoSourceIndex: x, currentSourceTime: videoSource.startTime };\n }\n }\n\n return { videoSourceIndex: 0, currentSourceTime: 0 };\n};\n\nexport const getVideoSourceIndexAndTimeFromPercentTime = (\n playingMode: PlayingMode,\n playlistItem: PlaylistItemType,\n timeInPercentage: number,\n): { currentSourceTime: number; videoSourceIndex: number } => {\n const secondInPercent = (timeInPercentage * playlistItem.duration) / 100;\n\n const isFullMatchNotEffectiveTime = playingMode.mode === 'TACTICAL_CAMERA' && !playingMode.useEffectiveTime;\n\n return isFullMatchNotEffectiveTime\n ? getVideoSourceIndexAndTimeFromMatchTime(playingMode, playlistItem, secondInPercent)\n : getVideoSourceIndexAndTimeFromPlaylistTime(playingMode, playlistItem, secondInPercent);\n};\n","import { PlayerStateMachineContext, PlayerStateMachineEvent, UpdatePlaylistItemAction } from '../../types';\nimport { getVideoByVideoType } from '../../util';\n\nexport function isPaused(context: PlayerStateMachineContext) {\n return !context.isPlaying;\n}\n\nexport function isPlaying(context: PlayerStateMachineContext) {\n return context.isPlaying;\n}\n\nexport function isInStandBy(context: PlayerStateMachineContext) {\n return context.isInStandBy;\n}\n\nexport function isLastVideoSource(context: PlayerStateMachineContext) {\n if (!context.playlist.playingItem.playlistItem) return false;\n\n const { videoSources } = getVideoByVideoType(\n context.playlist.playingItem.playlistItem,\n context.playlist.currentSelectedPlayingMode,\n );\n\n return videoSources.length - 1 === context.playlist.playingItem.videoSourceIndex;\n}\n\nexport function isLastPlaylistItem(context: PlayerStateMachineContext) {\n if (!context.playlist.playingItem.playlistItem) return false;\n\n const currentPlaylistItemIndex = context.playlist.playlistItems.findIndex(\n (playlistItem) => playlistItem.id === context.playlist.currentPlaylistItemId,\n );\n\n return currentPlaylistItemIndex === context.playlist.playlistItems.length - 1;\n}\n\nexport function isFirstPlaylistItem(context: PlayerStateMachineContext) {\n if (!context.playlist.playingItem.playlistItem) return false;\n\n const currentPlaylistItemIndex = context.playlist.playlistItems.findIndex(\n (playlistItem) => playlistItem.id === context.playlist.currentPlaylistItemId,\n );\n\n return currentPlaylistItemIndex === 0;\n}\n\nexport function isPlaylistEmpty(context: PlayerStateMachineContext) {\n return !Boolean(context.playlist.playlistItems.length);\n}\n\nexport function isPlayerNotReady(context: PlayerStateMachineContext) {\n return !Boolean(context.videoRef?.current);\n}\n\nexport function isPlayerReady(context: PlayerStateMachineContext) {\n return Boolean(context.videoRef?.current);\n}\n\nexport function isNotLastPlaylistItem(context: PlayerStateMachineContext) {\n return !isLastPlaylistItem(context);\n}\n\nexport function shouldAutoplayNextPlaylistItem(context: PlayerStateMachineContext) {\n return context.autoPlayNextPlaylistItem && isNotLastPlaylistItem(context);\n}\n\nexport function isCurrentPlaylistItem(context: PlayerStateMachineContext, _event: PlayerStateMachineEvent) {\n const event = _event as UpdatePlaylistItemAction;\n return context.playlist.currentPlaylistItemId === event.playlistItem.id;\n}\n\nexport const hasPlaylistItemNoDuration = (context: PlayerStateMachineContext) => {\n return context.playlist.playingItem.playlistItem.duration === 0;\n};\n","import { PlayerStateMachineContext, PlaylistItemType } from '../../../types';\nimport { getVideoByVideoType } from '../../../util';\n\nexport const jumpToPlaylistItem = (context: PlayerStateMachineContext, playlistItem: PlaylistItemType) => {\n const selectedVideoType = getVideoByVideoType(playlistItem, context.playlist.preferredPlayingMode);\n const videoSource = selectedVideoType.videoSources[0];\n\n return {\n currentTime: videoSource.startTime,\n playlist: {\n ...context.playlist,\n currentPlaylistItemId: playlistItem.id,\n currentSelectedPlayingMode: selectedVideoType.playingMode,\n playingItem: {\n currentSourceTime: 0,\n playlistItem,\n videoSourceIndex: 0,\n },\n },\n };\n};\n","import { PlayerStateMachineContext } from '../../../types';\nimport { getVideoSourceByIndex } from '../../../util';\n\nexport const jumpToVideoSource = (videoSourceIndex: number, context: PlayerStateMachineContext) => {\n const videoSource = getVideoSourceByIndex(\n context.playlist.playingItem.playlistItem,\n context.playlist.currentSelectedPlayingMode,\n videoSourceIndex,\n );\n\n return {\n currentTime: videoSource.startTime,\n playlist: {\n ...context.playlist,\n playingItem: {\n ...context.playlist.playingItem,\n videoSourceIndex: videoSourceIndex,\n },\n },\n };\n};\n","export class AsyncQueue {\n private queue: (() => Promise)[] = [];\n private isProcessing = false;\n\n public enqueue(task: () => Promise): void {\n this.queue.push(task);\n if (!this.isProcessing) this.processQueue();\n }\n\n private async processQueue() {\n if (this.isProcessing) return;\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n const currentTask = this.queue.shift();\n if (currentTask) {\n try {\n await currentTask();\n } catch (error) {\n console.error('Error processing task:', error);\n }\n }\n }\n\n this.isProcessing = false;\n }\n}\n\nexport const playerPlayingControlQueue = new AsyncQueue();\n","import { PlaylistItemType } from '../../../types';\n\nexport const replacePlayListItemByIndex = (array: Array, index: number, value: PlaylistItemType) => {\n const ret = array.slice(0);\n ret[index] = value;\n return ret;\n};\n","import { PlayerStateMachineContext } from '../../../types';\nimport { getCurrentPlaylistItemTime } from '../get-current-playlist-item-time';\nimport { getVideoSourceIndexAndTimeFromPercentTime } from '../get-video-source-index';\n\nexport const SKIP_STEP_SIZE = 5;\n\nexport const skipTime = (context: PlayerStateMachineContext, time: number) => {\n const currentPlaylistItemTime = getCurrentPlaylistItemTime(\n context.playlist.currentSelectedPlayingMode,\n context.videoRef?.current?.currentTime ?? 0,\n context.playlist.playingItem.videoSourceIndex,\n context.playlist.playingItem.playlistItem,\n );\n\n const percent = ((currentPlaylistItemTime + time) * 100) / context.playlist.playingItem.playlistItem.duration;\n\n const { videoSourceIndex, currentSourceTime } = getVideoSourceIndexAndTimeFromPercentTime(\n context.playlist.currentSelectedPlayingMode,\n context.playlist.playingItem.playlistItem,\n percent <= 0 ? 0 : percent >= 100 ? 100 : percent,\n );\n\n return {\n currentTime: currentSourceTime,\n playlist: {\n ...context.playlist,\n playingItem: {\n ...context.playlist.playingItem,\n videoSourceIndex,\n },\n },\n };\n};\n","import { arrayMoveImmutable } from 'array-move';\nimport isEmpty from 'lodash/isEmpty';\nimport { assign } from 'xstate';\n\nimport {\n AddPlaylistItemsAction,\n ChangeAutoplayPlaylistItemAction,\n PlayingModes,\n RemovePlaylistItemsAction,\n UpdatePlaylistItemAction,\n VideoSourceWithTimes,\n} from 'shared/components/video-player/types';\n\nimport { getNextPlaylistItem } from './get-next-playlist-item';\nimport { getPreviousPlaylistItem } from './get-previous-playlist-item';\nimport {\n getVideoSourceIndexAndTimeFromMatchTime,\n getVideoSourceIndexAndTimeFromPercentTime,\n} from './get-video-source-index';\nimport { isFirstPlaylistItem, isLastPlaylistItem } from './guards';\nimport { jumpToPlaylistItem } from './jump-to-playlist-item';\nimport { jumpToVideoSource } from './jump-to-video-source';\nimport { playerPlayingControlQueue } from './playing-control-queue';\nimport { replacePlayListItemByIndex } from './replace-playlist-item-by-index';\nimport { SKIP_STEP_SIZE, skipTime } from './skip-time';\nimport {\n ChangePlayingModeAction,\n JumpToMatchTimeAction,\n JumpToPercentTimeAction,\n PlayerStateMachineContext,\n PlayerStateMachineEvent,\n PlaylistItemType,\n RemovePlaylistAction,\n ReorderPlaylistItemAction,\n SetPlaylistAction,\n SetPlaylistItemAction,\n VideoSourceType,\n} from '../../types';\nimport {\n getCurrentTimeAndVideoSourceIndex,\n getCurrentVideoSource,\n getVideoByVideoType,\n getVideoSourceByIndex,\n} from '../../util';\n\nexport const nextVideoSource = assign((context) => {\n const { videoSources } = getVideoByVideoType(\n context.playlist.playingItem.playlistItem,\n context.playlist.currentSelectedPlayingMode,\n );\n\n const nextVideoSourceIndex = context.playlist.playingItem.videoSourceIndex + 1;\n const isLastVideoSource = nextVideoSourceIndex >= videoSources.length;\n\n if (isLastVideoSource) {\n return !isLastPlaylistItem(context) && context.autoPlayNextPlaylistItem\n ? jumpToPlaylistItem(\n context,\n getNextPlaylistItem(context.playlist.currentPlaylistItemId, context.playlist.playlistItems),\n )\n : {\n isPlaying: false,\n ...(context?.videoRef?.current && {\n currentTime: context.videoRef.current.currentTime,\n }),\n };\n }\n\n return jumpToVideoSource(nextVideoSourceIndex, context);\n});\n\nexport const previousVideoSource = assign((context) => {\n const previousVideoSourceIndex = context.playlist.playingItem.videoSourceIndex - 1;\n\n if (context.playlist.playingItem.videoSourceIndex === 0 && !isFirstPlaylistItem(context)) {\n return jumpToPlaylistItem(\n context,\n getPreviousPlaylistItem(context.playlist.currentPlaylistItemId, context.playlist.playlistItems),\n );\n }\n\n return jumpToVideoSource(previousVideoSourceIndex >= 0 ? previousVideoSourceIndex : 0, context);\n});\n\nexport const restart = assign((context) => {\n const videoSource = getVideoSourceByIndex(\n context.playlist.playingItem.playlistItem,\n context.playlist.currentSelectedPlayingMode,\n 0,\n );\n\n return {\n currentTime: videoSource.startTime,\n playlist: {\n ...context.playlist,\n playingItem: {\n ...context.playlist.playingItem,\n videoSourceIndex: 0,\n },\n },\n };\n});\n\nexport const seekNewTime = assign((context, _event) => {\n const event = _event as JumpToPercentTimeAction;\n\n const { videoSourceIndex, currentSourceTime } = getVideoSourceIndexAndTimeFromPercentTime(\n context.playlist.currentSelectedPlayingMode,\n context.playlist.playingItem.playlistItem,\n event.percent,\n );\n\n return {\n currentTime: currentSourceTime,\n playlist: {\n ...context.playlist,\n playingItem: {\n ...context.playlist.playingItem,\n videoSourceIndex,\n },\n },\n };\n});\n\nexport const jumpToMatchTime = assign((context, _event) => {\n const event = _event as JumpToMatchTimeAction;\n\n const { videoSourceIndex, currentSourceTime } = getVideoSourceIndexAndTimeFromMatchTime(\n context.playlist.currentSelectedPlayingMode,\n context.playlist.playingItem.playlistItem,\n event.time,\n );\n\n return {\n currentTime: currentSourceTime,\n playlist: {\n ...context.playlist,\n playingItem: {\n ...context.playlist.playingItem,\n videoSourceIndex,\n },\n },\n };\n});\n\nexport const setVideoRef = assign({\n videoRef: (context: PlayerStateMachineContext, _event: PlayerStateMachineEvent) => {\n const event = _event as SetPlaylistAction;\n return event.playerRef;\n },\n});\n\nconst getValidCurrentTime = (newTime: number | undefined, videoSource: VideoSourceWithTimes) => {\n if (!newTime) return videoSource.startTime;\n if (newTime < videoSource.startTime || newTime > videoSource.endTime) return videoSource.startTime;\n\n return newTime;\n};\n\nexport const addPlaylistItems = assign(\n (context: PlayerStateMachineContext, _event: PlayerStateMachineEvent) => {\n const event = _event as AddPlaylistItemsAction;\n\n if (event.playlistItems.length === 0) return context;\n const isCurrentPlaylistEmpty = context.playlist.playlistItems.length === 0;\n\n if (isCurrentPlaylistEmpty) {\n const { videoSources: currentVideoSource } = getVideoByVideoType(\n event.playlistItems[0],\n context.playlist.currentSelectedPlayingMode,\n );\n context.currentTime = currentVideoSource[0].startTime;\n\n const playingItem = isCurrentPlaylistEmpty\n ? {\n ...context.playlist.playingItem,\n currentSourceTime: currentVideoSource[0].startTime,\n videoSourceIndex: 0,\n playlistItem: event.playlistItems[0],\n }\n : context.playlist.playingItem;\n\n const currentPlaylistItemId = isCurrentPlaylistEmpty\n ? event.playlistItems[0].id\n : context.playlist.currentPlaylistItemId;\n\n return {\n playlist: {\n ...context.playlist,\n currentPlaylistItemId,\n playlistItems: event.playlistItems,\n playingItem,\n },\n };\n }\n\n const updatedPlaylistItem =\n event.playlistItems.find((item) => item.id === context.playlist.playingItem.playlistItem.id) ||\n context.playlist.playingItem.playlistItem;\n\n const { videoSources } = getVideoByVideoType(updatedPlaylistItem, context.playlist.currentSelectedPlayingMode);\n const currentTime = getValidCurrentTime(\n context.videoRef?.current?.currentTime,\n videoSources[context.playlist.playingItem.currentSourceTime],\n );\n\n return {\n ...context,\n currentTime,\n playlist: {\n ...context.playlist,\n playlistItems: event.playlistItems,\n playingItem: {\n ...context.playlist.playingItem,\n playlistItem: updatedPlaylistItem,\n },\n },\n };\n },\n);\n\nexport const updatePlaylistItem = assign((context, _event) => {\n const event = _event as UpdatePlaylistItemAction;\n\n let currentTime = context.currentTime;\n\n const playlistItemIndex = context.playlist.playlistItems.findIndex(\n (playlistItem: PlaylistItemType) => playlistItem.id === event.playlistItem.id,\n );\n\n const isCurrentPlaylistItem = context.playlist.currentPlaylistItemId === context.playlist.playingItem.playlistItem.id;\n\n if (isCurrentPlaylistItem) {\n const { videoSources } = getVideoByVideoType(event.playlistItem, context.playlist.currentSelectedPlayingMode);\n currentTime = event.currentTime\n ? event.currentTime\n : getValidCurrentTime(context.videoRef?.current?.currentTime, videoSources[0]) ?? videoSources[0].startTime;\n }\n\n return {\n currentTime,\n playlist: {\n ...context.playlist,\n playingItem: {\n ...context.playlist.playingItem,\n playlistItem: isCurrentPlaylistItem ? event.playlistItem : context.playlist.playingItem.playlistItem,\n },\n playlistItems: replacePlayListItemByIndex(context.playlist.playlistItems, playlistItemIndex, event.playlistItem),\n },\n };\n});\n\nconst EMPTY_PLAYLIST = {\n playlistItems: [],\n currentPlaylistItemId: '',\n playingItem: {\n currentSourceTime: 0,\n playlistItem: {\n videoTypes: [],\n id: '',\n\n duration: 0,\n recordingId: '',\n fundamentalsSelected: {\n tacticalAnalysisId: undefined,\n fundamentalsSelected: [],\n },\n hasHomographies: false,\n },\n videoSourceIndex: 0,\n },\n};\n\nexport const updatePlaylistItems = assign((context, _event) => {\n const event = _event as SetPlaylistAction;\n\n if (!event.playlistItems || event.playlistItems.length === 0) {\n return {\n currentTime: 0,\n playlist: {\n ...context.playlist,\n ...EMPTY_PLAYLIST,\n },\n };\n }\n\n return {\n playlist: {\n ...context.playlist,\n playlistItems: event.playlistItems,\n },\n };\n});\n\nexport const setPlaylistItems = assign((context, _event) => {\n const event = _event as SetPlaylistAction;\n const currentVideoSource = getCurrentVideoSource(context);\n\n if (!event.playlistItems || event.playlistItems.length === 0) {\n return {\n isPlaying: !!event.autoplay,\n playlist: {\n ...context.playlist,\n ...EMPTY_PLAYLIST,\n preferredPlayingMode: event.playingMode ?? context.playlist.preferredPlayingMode,\n },\n };\n }\n\n const playingMode = event.playingMode ? event.playingMode : context.playlist.preferredPlayingMode;\n const { id } = event.playlistItems[0];\n const currentPlaylistItem = event.playlistItems[0];\n\n const { videoSources, playingMode: currentPlayingMode } = getVideoByVideoType(currentPlaylistItem, playingMode);\n const currentMatchTime =\n currentPlayingMode.mode === PlayingModes.EPISODES\n ? (context.videoRef?.current?.currentTime ?? 0) + (currentVideoSource?.startTimeInMatch ?? 0)\n : context.videoRef?.current?.currentTime ?? 0;\n\n const initialTime = event.tryToKeepCurrentTime ? currentMatchTime : event.initialStartTime ?? 0;\n\n // TODO: when setting new playlist items there is a case when videoSources are empty for a split of second.\n // This is a temporary fix.\n // it's happening when we play the row with episodes videos.\n if (videoSources.length === 0) return context;\n\n const { videoIndex, currentTime } = getCurrentTimeAndVideoSourceIndex(initialTime, videoSources, playingMode);\n // TODO: return it instead of modifying the context. Return doesn't work with trim player.\n context.isPlaying = event.autoplay ? context.isPlaying : false;\n context.playlist = {\n ...context.playlist,\n currentPlaylistItemId: id,\n currentSelectedPlayingMode: currentPlayingMode,\n playlistItems: event.playlistItems,\n playingItem: {\n currentSourceTime: 0,\n playlistItem: currentPlaylistItem,\n videoSourceIndex: videoIndex,\n },\n };\n\n context.currentTime = currentTime;\n\n return context;\n});\n\nexport const setPlayerToPlay = assign({\n isPlaying: true,\n});\n\nexport const setResumeStandBy = assign({\n isInStandBy: false,\n});\n\nexport const setStandBy = assign({\n isInStandBy: true,\n});\n\nexport const toggleFullScreen = assign({\n isFullScreen: (context: PlayerStateMachineContext) => !context.isFullScreen,\n});\n\nexport const setPlayerToPause = assign({\n isPlaying: false,\n});\n\nexport const reorderPlaylistItem = assign({\n playlist: (context: PlayerStateMachineContext, _event: PlayerStateMachineEvent) => {\n const event = _event as ReorderPlaylistItemAction;\n\n const reorderedPlaylistItems = arrayMoveImmutable(\n context.playlist.playlistItems,\n event.currentVideoIndex,\n event.newVideoIndex,\n );\n\n return {\n ...context.playlist,\n playlistItems: reorderedPlaylistItems,\n };\n },\n});\n\nexport const changeAutoplayNextPlaylistItem = assign(\n (context: PlayerStateMachineContext, _event: PlayerStateMachineEvent) => {\n const event = _event as ChangeAutoplayPlaylistItemAction;\n\n return {\n autoPlayNextPlaylistItem: event.autoplayNextPlaylistItem,\n };\n },\n);\n\nconst findNearestPlaylistItem = (playlistItems: PlaylistItemType[], playlistItemIndex: number) => {\n return playlistItemIndex <= playlistItems.length - 1 ? playlistItemIndex + 1 : playlistItems.length - 1;\n};\n\nexport const changePlayingMode = assign((context, _event) => {\n const event = _event as ChangePlayingModeAction;\n\n const playlistItemIndex = context.playlist.playlistItems.findIndex(\n (playlistItem: PlaylistItemType) => playlistItem.id === context.playlist.currentPlaylistItemId,\n );\n const videoSource = getVideoSourceByIndex(context.playlist.playlistItems[playlistItemIndex], event.playingMode, 0);\n const oldVideoSource = getVideoSourceByIndex(\n context.playlist.playlistItems[playlistItemIndex],\n context.playlist.currentSelectedPlayingMode,\n 0,\n );\n\n context.currentTime =\n videoSource.src === oldVideoSource.src\n ? context.videoRef?.current?.currentTime ?? videoSource.startTime\n : videoSource.startTime + context.currentTime - oldVideoSource.startTime;\n\n context.playlist = {\n ...context.playlist,\n currentSelectedPlayingMode: event.playingMode,\n playingItem: {\n currentSourceTime: 0,\n videoSourceIndex: 0,\n playlistItem: context.playlist.playlistItems[playlistItemIndex],\n },\n };\n\n return context;\n});\n\nexport const removePlaylistItem = assign((context, _event) => {\n const event = _event as RemovePlaylistAction;\n\n const playlistItemIndex = context.playlist.playlistItems.findIndex(\n (playlistItem: PlaylistItemType) => playlistItem.id === event.playlistItemId,\n );\n\n const isCurrentPlaylistItem = event.playlistItemId === context.playlist.currentPlaylistItemId;\n const modifiedPlaylistItems = context.playlist.playlistItems.filter((item, index) => index !== playlistItemIndex);\n\n if (isCurrentPlaylistItem) {\n const newCurrentVideoIndex = modifiedPlaylistItems[playlistItemIndex]\n ? playlistItemIndex\n : findNearestPlaylistItem(modifiedPlaylistItems, playlistItemIndex);\n\n const videoSource = isEmpty(modifiedPlaylistItems)\n ? { currentTime: 0, endTime: 0, startTime: 0, duration: 0 }\n : getVideoSourceByIndex(\n modifiedPlaylistItems[newCurrentVideoIndex],\n context.playlist.currentSelectedPlayingMode,\n 0,\n );\n\n return {\n currentTime: videoSource.startTime,\n playlist: {\n ...context.playlist,\n playlistItems: modifiedPlaylistItems,\n currentPlaylistItemId: isEmpty(modifiedPlaylistItems) ? '' : modifiedPlaylistItems[newCurrentVideoIndex].id,\n playingItem: {\n currentSourceTime: 0,\n videoSourceIndex: 0,\n playlistItem: isEmpty(modifiedPlaylistItems)\n ? {\n videoTypes: [],\n id: '',\n\n duration: 0,\n recordingId: '',\n fundamentalsSelected: {\n tacticalAnalysisId: undefined,\n fundamentalsSelected: [],\n },\n hasHomographies: false,\n }\n : modifiedPlaylistItems[newCurrentVideoIndex],\n },\n },\n };\n }\n\n return {\n playlist: {\n ...context.playlist,\n playlistItems: modifiedPlaylistItems,\n },\n };\n});\n\nexport const removePlaylistItems = assign((context, _event) => {\n const event = _event as RemovePlaylistItemsAction;\n\n let currentTime = context.currentTime;\n\n const isCurrentPlaylistItem = event.playlistItemsIds.includes(context.playlist.currentPlaylistItemId);\n\n const modifiedPlaylistItems = context.playlist.playlistItems.filter(\n (item) => !event.playlistItemsIds.includes(item.id),\n );\n\n if (isEmpty(modifiedPlaylistItems)) {\n return {\n currentTime: 0,\n playlist: {\n ...context.playlist,\n playlistItems: [],\n currentPlaylistItemId: '',\n playingItem: {\n currentSourceTime: 0,\n playlistItem: {\n videoTypes: [],\n id: '',\n\n duration: 0,\n recordingId: '',\n fundamentalsSelected: {\n tacticalAnalysisId: undefined,\n fundamentalsSelected: [],\n },\n hasHomographies: false,\n },\n videoSourceIndex: 0,\n },\n },\n };\n }\n\n if (isCurrentPlaylistItem && !isEmpty(modifiedPlaylistItems)) {\n const videoSource = getVideoSourceByIndex(modifiedPlaylistItems[0], context.playlist.currentSelectedPlayingMode, 0);\n\n currentTime = videoSource.startTime;\n }\n\n return {\n currentTime,\n playlist: {\n ...context.playlist,\n playlistItems: modifiedPlaylistItems,\n ...(isCurrentPlaylistItem && {\n currentPlaylistItemId: isEmpty(modifiedPlaylistItems) ? '' : modifiedPlaylistItems[0]?.id,\n playingItem: {\n currentSourceTime: 0,\n videoSourceIndex: 0,\n playlistItem: isEmpty(modifiedPlaylistItems)\n ? {\n videoTypes: [],\n id: '',\n\n duration: 0,\n recordingId: '',\n fundamentalsSelected: {\n tacticalAnalysisId: undefined,\n fundamentalsSelected: [],\n },\n hasHomographies: false,\n }\n : modifiedPlaylistItems[0],\n },\n }),\n },\n };\n});\n\nexport const setPlaylistItem = assign((context, _event) => {\n const event = _event as SetPlaylistItemAction;\n\n const playlistItemIndex = context.playlist.playlistItems.findIndex(\n (playlistItem: PlaylistItemType) => playlistItem.id === event.playlistItemId,\n );\n\n const currentPlaylistItem = context.playlist.playlistItems[playlistItemIndex];\n\n const selectedVideoType = getVideoByVideoType(currentPlaylistItem, context.playlist.preferredPlayingMode);\n const videoSource = selectedVideoType.videoSources[0];\n\n return {\n currentTime: videoSource.startTime,\n isPlaying: event.autoPlay,\n playlist: {\n ...context.playlist,\n currentPlaylistItemId: currentPlaylistItem.id,\n currentSelectedPlayingMode: selectedVideoType.playingMode,\n playingItem: {\n currentSourceTime: 0,\n playlistItem: currentPlaylistItem,\n videoSourceIndex: 0,\n },\n },\n };\n});\n\nexport const play = async (context: PlayerStateMachineContext) => {\n if (!context.videoRef?.current) return;\n\n if ((!context.videoRef.current.playing && !context.isInStandBy) || context.videoRef.current.playing) {\n playerPlayingControlQueue.enqueue(async () => context.videoRef?.current?.play());\n } else if (context.isInStandBy) {\n playerPlayingControlQueue.enqueue(async () => context.videoRef?.current?.pause());\n }\n};\n\nexport const pause = async (context: PlayerStateMachineContext) => {\n if (!context.videoRef?.current) return;\n\n if (context.videoRef.current.playing) {\n playerPlayingControlQueue.enqueue(async () => context.videoRef?.current?.pause());\n }\n};\n\nexport const skipForward = assign((context) => {\n return skipTime(context, SKIP_STEP_SIZE);\n});\n\nexport const skipBackward = assign((context) => {\n return skipTime(context, -SKIP_STEP_SIZE);\n});\n\nexport const nextPlaylistItem = assign((context) => {\n const nextPlaylistItem = getNextPlaylistItem(context.playlist.currentPlaylistItemId, context.playlist.playlistItems);\n\n return jumpToPlaylistItem(context, nextPlaylistItem);\n});\n\nexport const firstPlaylistItem = assign((context) => {\n const firstPlaylistItem = context.playlist.playlistItems[0];\n\n const selectedVideoType = getVideoByVideoType(firstPlaylistItem, context.playlist.preferredPlayingMode);\n const videoSource = selectedVideoType.videoSources[0];\n\n return {\n currentTime: videoSource.startTime,\n playlist: {\n ...context.playlist,\n currentPlaylistItemId: firstPlaylistItem.id,\n currentSelectedPlayingMode: selectedVideoType.playingMode,\n playingItem: {\n currentSourceTime: 0,\n playlistItem: firstPlaylistItem,\n videoSourceIndex: 0,\n },\n },\n };\n});\n\nexport const previousPlaylistItem = assign((context) => {\n const previousPlaylistItem = getPreviousPlaylistItem(\n context.playlist.currentPlaylistItemId,\n context.playlist.playlistItems,\n );\n\n const selectedVideoType = getVideoByVideoType(previousPlaylistItem, context.playlist.preferredPlayingMode);\n const videoSource = selectedVideoType.videoSources[0];\n\n return {\n currentTime: videoSource.startTime,\n playlist: {\n ...context.playlist,\n currentPlaylistItemId: previousPlaylistItem.id,\n currentSelectedPlayingMode: selectedVideoType.playingMode,\n playingItem: {\n currentSourceTime: 0,\n playlistItem: previousPlaylistItem,\n videoSourceIndex: 0,\n },\n },\n };\n});\n\nconst canDurationToPlaylistItemBeChanged = (videoTypes: VideoSourceType[], hasHomographies: boolean) => {\n if (!hasHomographies && videoTypes.some((videoType) => videoType.videoSources.length > 1)) {\n console.error('Not possible to add duration to VideoSourceType with more the one VideoSource');\n return false;\n }\n\n return true;\n};\n\nconst addDurationToPlaylistItem = (videoTypes: VideoSourceType[], duration: number): VideoSourceType[] => {\n return videoTypes.map((videoType) => {\n return {\n ...videoType,\n videoSources: videoType.videoSources.map((videoSource) => ({\n ...videoSource,\n ...(!videoSource?.startTimeInMatch && {\n startTimeInMatch: videoSource.startTime,\n }),\n endTime: duration,\n endTimeInMatch: duration,\n })),\n };\n });\n};\n\nexport const fixPlaylistItemWithoutNoDuration = assign(\n (context) => {\n const playlistItem = context.playlist.playingItem.playlistItem;\n\n if (!canDurationToPlaylistItemBeChanged(playlistItem.videoTypes, playlistItem.hasHomographies)) return context;\n\n const duration = context.videoRef?.current?.duration ?? 0;\n\n const videoTypes = addDurationToPlaylistItem(playlistItem.videoTypes, duration);\n\n const adjustedPlaylistItem = {\n ...playlistItem,\n duration,\n videoTypes,\n };\n\n return {\n playlist: {\n ...context.playlist,\n playingItem: {\n ...context.playlist.playingItem,\n playlistItem: adjustedPlaylistItem,\n },\n },\n };\n },\n);\n","import { useMachine } from '@xstate/react';\nimport { useEffect, useRef } from 'react';\nimport { createMachine, send } from 'xstate';\n\nimport { PlayingMode } from 'shared/components/video-player/types';\n\nimport {\n usePlayerSetIsPlaying,\n usePlayerSetPlaylist,\n usePlayerState,\n usePlayerUpdateStandBy,\n useSetCurrentTime,\n} from './atoms/hooks';\nimport { changeSourceMachine } from './change-source-and-time-machine';\nimport { useGenerateVideoPlayerActions } from './hooks';\nimport { PLAYER_ACTIONS, PLAYER_STATES, READY_STATES, VIDEO_PLAYER_MACHINE_ID } from './states';\nimport {\n addPlaylistItems,\n changeAutoplayNextPlaylistItem,\n changePlayingMode,\n firstPlaylistItem,\n fixPlaylistItemWithoutNoDuration,\n jumpToMatchTime,\n nextPlaylistItem,\n nextVideoSource,\n pause,\n play,\n previousPlaylistItem,\n previousVideoSource,\n removePlaylistItem,\n removePlaylistItems,\n reorderPlaylistItem,\n restart,\n seekNewTime,\n setPlayerToPause,\n setPlayerToPlay,\n setPlaylistItem,\n setPlaylistItems,\n setResumeStandBy,\n setStandBy,\n setVideoRef,\n skipBackward,\n skipForward,\n toggleFullScreen,\n updatePlaylistItem,\n updatePlaylistItems,\n} from './utils/actions';\nimport {\n hasPlaylistItemNoDuration,\n isCurrentPlaylistItem,\n isInStandBy,\n isLastPlaylistItem,\n isLastVideoSource,\n isNotLastPlaylistItem,\n isPaused,\n isPlayerNotReady,\n isPlayerReady,\n isPlaying,\n isPlaylistEmpty,\n shouldAutoplayNextPlaylistItem,\n} from './utils/guards';\nimport {\n PlayerStateMachineContext,\n PlayerStateMachineEvent,\n PlayerType,\n SetPlaylistAction,\n SetReplacePlaylistItemAction,\n} from '../types';\n\nconst defaultPlayerState = (playingMode: PlayingMode, playerId: string, player: PlayerType, currentTime: number) => {\n const initialState: PlayerStateMachineContext = {\n playerId,\n playlist: {\n preferredPlayingMode: playingMode,\n currentSelectedPlayingMode: playingMode,\n currentPlaylistItemId: '',\n playlistItems: [],\n playingItem: {\n currentSourceTime: 0,\n playlistItem: {\n videoTypes: [],\n duration: 0,\n name: '',\n id: '',\n index: 0,\n recordingId: '',\n hasHomographies: false,\n fundamentalsSelected: {\n tacticalAnalysisId: undefined,\n fundamentalsSelected: [],\n },\n },\n videoSourceIndex: 0,\n },\n },\n isFullScreen: false,\n isInStandBy: false,\n isPlaying: false,\n autoPlayNextPlaylistItem: true,\n currentTime,\n videoRef: player,\n };\n return {\n context: initialState,\n };\n};\n\nexport const playerStateMachine = createMachine(\n {\n predictableActionArguments: true,\n id: VIDEO_PLAYER_MACHINE_ID,\n initial: PLAYER_STATES.IDLE,\n states: {\n [PLAYER_STATES.IDLE]: {\n on: {\n [PLAYER_ACTIONS.LOAD_PLAYLIST]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['setPlaylistItems'],\n cond: 'isPlayerReady',\n },\n {\n target: PLAYER_STATES.IDLE,\n actions: ['setPlaylistItems'],\n cond: 'isPlayerNotReady',\n },\n ],\n [PLAYER_ACTIONS.REFRESH]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n },\n ],\n },\n },\n [PLAYER_STATES.EMPTY_PLAYLIST]: {\n on: {\n [PLAYER_ACTIONS.REPLACE_PLAYLIST_ITEMS]: {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['addPlaylistItems'],\n },\n [PLAYER_ACTIONS.REPLACE_PLAYLIST]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['setPlaylistItems'],\n },\n ],\n [PLAYER_ACTIONS.LOAD_PLAYLIST]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['setPlaylistItems'],\n },\n ],\n },\n },\n [PLAYER_STATES.ERROR]: {\n on: {\n [PLAYER_ACTIONS.LOAD_PLAYLIST]: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n },\n },\n [PLAYER_STATES.LOADING_VIDEO_SOURCE]: {\n on: {\n [PLAYER_ACTIONS.STAND_BY]: {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['setStandBy'],\n },\n [PLAYER_ACTIONS.PLAY]: {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['setPlayerToPlay', 'play'],\n },\n [PLAYER_ACTIONS.PAUSE]: {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['setPlayerToPause', 'pause'],\n },\n [PLAYER_ACTIONS.RESUME_STAND_BY]: {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['setResumeStandBy'],\n },\n [PLAYER_ACTIONS.CHANGE_PLAYING_MODE]: {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['changePlayingMode', 'pause'],\n },\n },\n always: {\n target: PLAYER_STATES.EMPTY_PLAYLIST,\n cond: 'isPlaylistEmpty',\n },\n invoke: {\n src: changeSourceMachine,\n onDone: { target: PLAYER_STATES.READY },\n data: {\n playingMode: (context: PlayerStateMachineContext) => context.playlist.currentSelectedPlayingMode,\n videoRef: (context: PlayerStateMachineContext) => context.videoRef,\n playlistItem: (context: PlayerStateMachineContext) => context.playlist.playingItem.playlistItem,\n videoSourceIndex: (context: PlayerStateMachineContext) => context.playlist.playingItem.videoSourceIndex,\n currentTime: (context: PlayerStateMachineContext): number => context.currentTime,\n },\n },\n },\n [PLAYER_STATES.READY]: {\n initial: READY_STATES.IDLE,\n on: {\n [PLAYER_ACTIONS.UPDATE_PLAYLIST_ITEMS]: [\n {\n target: PLAYER_STATES.READY,\n actions: ['updatePlaylistItems'],\n },\n ],\n [PLAYER_ACTIONS.CHANGE_AUTOPLAY_NEXT_PLAYLIST_ITEM]: [\n {\n target: PLAYER_STATES.READY,\n actions: ['changeAutoplayNextPlaylistItem'],\n },\n ],\n [PLAYER_ACTIONS.REORDER_PLAYLIST_ITEM]: [\n {\n target: PLAYER_STATES.READY,\n actions: ['reorderPlaylistItem', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.REPLACE_PLAYLIST_ITEMS]: {\n target: PLAYER_STATES.READY,\n actions: ['addPlaylistItems'],\n },\n [PLAYER_ACTIONS.REMOVE_PLAYLIST_ITEM]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['removePlaylistItem', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.REMOVE_PLAYLIST_ITEMS]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['removePlaylistItems', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.NEXT_PLAYLIST_ITEM]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['nextPlaylistItem', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.AUTOPLAY_NEXT_PLAYLIST_ITEM]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n cond: 'shouldAutoplayNextPlaylistItem',\n actions: ['nextPlaylistItem', 'pause'],\n },\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n cond: 'isLastPlaylistItem',\n actions: ['setPlayerToPause', 'pause', 'firstPlaylistItem'],\n },\n {\n target: PLAYER_STATES.READY,\n actions: ['setPlayerToPause', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.PREVIOUS_PLAYLIST_ITEM]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['previousPlaylistItem', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.NEXT_VIDEO_SOURCE]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n cond: 'isNotLastPlaylistItem',\n actions: ['nextVideoSource', 'pause'],\n },\n {\n target: PLAYER_STATES.READY,\n cond: 'isLastVideoSource',\n actions: ['setPlayerToPause', 'pause'],\n },\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['nextVideoSource', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.PREVIOUS_VIDEO_SOURCE]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['previousVideoSource', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.UPDATE_PLAYLIST_ITEM]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['updatePlaylistItem'],\n },\n ],\n [PLAYER_ACTIONS.CHANGE_PLAYING_MODE]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['changePlayingMode', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.TOGGLE_FULL_SCREEN]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['toggleFullScreen'],\n },\n ],\n [PLAYER_ACTIONS.JUMP_TO_MATCH_TIME]: [\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['pause', 'jumpToMatchTime', 'setPlayerToPlay'],\n },\n ],\n [PLAYER_ACTIONS.REPLACE_PLAYLIST]: [\n {\n target: PLAYER_STATES.IDLE,\n actions: [\n send((context, _event) => {\n const event = _event as SetReplacePlaylistItemAction;\n\n return {\n type: PLAYER_ACTIONS.LOAD_PLAYLIST,\n playlistItems: event.playlistItems,\n playingMode: event.playingMode,\n autoplay: event.autoplay,\n tryToKeepCurrentTime: event.tryToKeepCurrentTime,\n } as SetPlaylistAction;\n }),\n ],\n },\n ],\n [PLAYER_ACTIONS.RESUME_STAND_BY]: {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['setResumeStandBy'],\n },\n [PLAYER_ACTIONS.RESTART]: {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['setPlayerToPlay', 'restart'],\n },\n },\n states: {\n [READY_STATES.IDLE]: {\n always: [\n {\n target: READY_STATES.SEEKING_NEW_TIME,\n cond: 'hasPlaylistItemNoDuration',\n actions: ['fixPlaylistItemWithoutNoDuration'],\n },\n { target: READY_STATES.STAND_BY, cond: 'isInStandBy', actions: ['pause'] },\n { target: READY_STATES.PAUSED, cond: 'isPaused', actions: ['pause', 'setPlayerToPause'] },\n { target: READY_STATES.PLAYING, cond: 'isPlaying', actions: ['play', 'setPlayerToPlay'] },\n ],\n },\n [READY_STATES.STAND_BY]: {\n on: {\n [PLAYER_ACTIONS.REPLACE_PLAYLIST_ITEMS]: {\n target: READY_STATES.STAND_BY,\n actions: ['addPlaylistItems'],\n },\n [PLAYER_ACTIONS.RESUME_STAND_BY]: [\n {\n target: READY_STATES.PLAYING,\n cond: 'isPlaying',\n actions: ['setResumeStandBy', 'play'],\n },\n { target: READY_STATES.PAUSED, cond: 'isPaused', actions: ['setResumeStandBy', 'pause'] },\n ],\n [PLAYER_ACTIONS.JUMP_TO_TIME_PERCENT]: {\n target: READY_STATES.STAND_BY,\n actions: ['seekNewTime', 'pause'],\n },\n },\n },\n [READY_STATES.SEEKING_NEW_TIME]: {\n invoke: {\n src: changeSourceMachine,\n onDone: { target: READY_STATES.IDLE },\n data: {\n playingMode: (context: PlayerStateMachineContext) => context.playlist.currentSelectedPlayingMode,\n videoRef: (context: PlayerStateMachineContext) => context.videoRef,\n playlistItem: (context: PlayerStateMachineContext) => context.playlist.playingItem.playlistItem,\n videoSourceIndex: (context: PlayerStateMachineContext) => context.playlist.playingItem.videoSourceIndex,\n currentTime: (context: PlayerStateMachineContext) => context.currentTime,\n },\n },\n },\n [PLAYER_STATES.LOADING_PLAYLIST_ITEM]: {\n always: { target: READY_STATES.SEEKING_NEW_TIME, actions: ['pause'] },\n },\n [READY_STATES.PLAYING]: {\n on: {\n [PLAYER_ACTIONS.REPLACE_PLAYLIST_ITEMS]: {\n target: READY_STATES.SEEKING_NEW_TIME,\n actions: ['addPlaylistItems'],\n },\n [PLAYER_ACTIONS.LOAD_PLAYLIST_ITEM]: [\n {\n target: PLAYER_STATES.LOADING_PLAYLIST_ITEM,\n actions: ['setPlaylistItem', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.TOGGLE_PLAYING]: [\n { target: READY_STATES.PAUSED, cond: 'isPlaying', actions: ['setPlayerToPause', 'pause'] },\n { target: READY_STATES.PLAYING, cond: 'isPaused', actions: ['setPlayerToPlay', 'play'] },\n ],\n [PLAYER_ACTIONS.SKIP_FORWARD]: [\n {\n target: READY_STATES.SEEKING_NEW_TIME,\n actions: ['skipForward', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.SKIP_BACKWARD]: [\n {\n target: READY_STATES.SEEKING_NEW_TIME,\n actions: ['skipBackward', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.JUMP_TO_TIME_PERCENT]: {\n target: READY_STATES.SEEKING_NEW_TIME,\n actions: ['seekNewTime', 'pause'],\n },\n [PLAYER_ACTIONS.STAND_BY]: { target: READY_STATES.STAND_BY, actions: ['pause', 'setStandBy'] },\n [PLAYER_ACTIONS.PAUSE]: { target: READY_STATES.PAUSED, actions: ['setPlayerToPause', 'pause'] },\n },\n },\n [READY_STATES.PAUSED]: {\n on: {\n [PLAYER_ACTIONS.REPLACE_PLAYLIST_ITEMS]: {\n target: READY_STATES.SEEKING_NEW_TIME,\n actions: ['addPlaylistItems'],\n },\n [PLAYER_ACTIONS.PAUSE]: { target: READY_STATES.PAUSED, actions: ['setPlayerToPause', 'pause'] },\n [PLAYER_ACTIONS.LOAD_PLAYLIST_ITEM]: [\n {\n target: PLAYER_STATES.LOADING_PLAYLIST_ITEM,\n actions: ['setPlaylistItem', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.TOGGLE_PLAYING]: [\n { target: READY_STATES.PAUSED, cond: 'isPlaying', actions: ['setPlayerToPause', 'pause'] },\n { target: READY_STATES.PLAYING, cond: 'isPaused', actions: ['setPlayerToPlay', 'play'] },\n ],\n [PLAYER_ACTIONS.SKIP_FORWARD]: [\n {\n target: READY_STATES.SEEKING_NEW_TIME,\n actions: ['skipForward', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.SKIP_BACKWARD]: [\n {\n target: READY_STATES.SEEKING_NEW_TIME,\n actions: ['skipBackward', 'pause'],\n },\n ],\n [PLAYER_ACTIONS.JUMP_TO_TIME_PERCENT]: {\n target: READY_STATES.SEEKING_NEW_TIME,\n actions: ['seekNewTime'],\n },\n [PLAYER_ACTIONS.PLAY]: {\n target: READY_STATES.PLAYING,\n actions: ['setPlayerToPlay', 'play'],\n },\n [PLAYER_ACTIONS.STAND_BY]: {\n target: READY_STATES.STAND_BY,\n actions: ['pause', 'setStandBy'],\n },\n },\n },\n },\n onDone: [\n { target: PLAYER_STATES.CHECKING_NEXT_PLAYLIST_ITEM, cond: 'isLastVideoSource' },\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n actions: ['nextVideoSource', 'pause'],\n },\n ],\n },\n [PLAYER_STATES.CHECKING_NEXT_PLAYLIST_ITEM]: {\n always: [\n {\n target: PLAYER_STATES.READY,\n cond: 'isLastPlaylistItem',\n actions: ['pause', 'setPlayerToPause'],\n },\n {\n target: PLAYER_STATES.LOADING_VIDEO_SOURCE,\n cond: 'isNotLastPlaylistItem',\n actions: ['pause', 'nextPlaylistItem'],\n },\n ],\n },\n [PLAYER_STATES.JUMP_TO_TIME_PERCENT]: {\n invoke: {\n src: changeSourceMachine,\n onDone: { target: PLAYER_STATES.READY },\n data: {\n videoRef: (context: PlayerStateMachineContext) => context.videoRef,\n playlistItem: (context: PlayerStateMachineContext) => context.playlist.playingItem.playlistItem,\n videoSourceIndex: (context: PlayerStateMachineContext) => context.playlist.playingItem.videoSourceIndex,\n currentTime: (context: PlayerStateMachineContext) => context.currentTime,\n },\n },\n },\n },\n },\n {\n actions: {\n changePlayingMode,\n fixPlaylistItemWithoutNoDuration,\n jumpToMatchTime,\n nextPlaylistItem,\n firstPlaylistItem,\n nextVideoSource,\n pause,\n play,\n previousPlaylistItem,\n previousVideoSource,\n removePlaylistItem,\n removePlaylistItems,\n reorderPlaylistItem,\n changeAutoplayNextPlaylistItem,\n restart,\n seekNewTime,\n setPlayerToPause,\n setPlayerToPlay,\n setPlaylistItem,\n setPlaylistItems,\n updatePlaylistItems,\n addPlaylistItems,\n setResumeStandBy,\n setStandBy,\n setVideoRef,\n skipBackward,\n skipForward,\n toggleFullScreen,\n updatePlaylistItem,\n },\n guards: {\n hasPlaylistItemNoDuration,\n isInStandBy,\n isLastPlaylistItem,\n shouldAutoplayNextPlaylistItem,\n isCurrentPlaylistItem,\n isLastVideoSource,\n isNotLastPlaylistItem,\n isPaused,\n isPlayerNotReady,\n isPlayerReady,\n isPlaying,\n isPlaylistEmpty,\n },\n },\n);\n\nexport const usePlayerStateMachine = (playerId: string, playingMode: PlayingMode) => {\n const [playerStatus, setPlayerState] = usePlayerState(playerId);\n const setIsPlaying = usePlayerSetIsPlaying(playerId);\n const setPlaylist = usePlayerSetPlaylist(playerId);\n const setIsInStandBy = usePlayerUpdateStandBy(playerId);\n const player = useRef(null);\n const playerContainerRef = useRef(null);\n const setCurrentTime = useSetCurrentTime(playerId);\n\n const [current, send] = useMachine(\n playerStateMachine,\n defaultPlayerState(playingMode, playerId, player, 0),\n );\n const actions = useGenerateVideoPlayerActions(send);\n\n useEffect(() => {\n if (!current.context.videoRef?.current?.ready) return;\n\n setCurrentTime(current.context.currentTime);\n }, [\n current.context.videoRef,\n current.context.currentTime,\n current.context.playlist.playingItem.videoSourceIndex,\n current.context.playlist.playingItem.playlistItem,\n setCurrentTime,\n ]);\n\n useEffect(() => {\n if (playerStatus !== current.value) {\n const value = current.value as PLAYER_STATES;\n setPlayerState(value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [current.value]);\n\n useEffect(() => {\n setIsPlaying(current.context.isPlaying);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [current.context.isPlaying]);\n\n useEffect(() => {\n if (!current.context.videoRef?.current?.ready && current.context.playlist.currentPlaylistItemId === '') return;\n setPlaylist(current.context.playlist);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [current.context.playlist, current.context.videoRef]);\n\n useEffect(() => {\n setIsInStandBy(current.context.isInStandBy);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [current.context.isInStandBy]);\n\n return {\n PLAYER_STATES,\n READY_STATES,\n PLAYER_ACTIONS,\n actions,\n send,\n player,\n playerContainerRef,\n };\n};\n","import { createContext, useEffect, useMemo } from 'react';\n\nimport { PlayerContainerType, PlayingMode } from 'shared/components/video-player/types';\n\nimport {\n useCurrentPlaylistItem,\n useCurrentTime,\n useDuration,\n useIsBuffering,\n useIsCurrentPlaylistItem,\n useIsSeeking,\n usePlayerCurrentSource,\n usePlaylistCurrentPlaylistItemId,\n usePlaylistItems,\n useVideoPlayerActions,\n useVideoPlayerPlayingMode,\n useVideoPlayerPlaylistItem,\n useVideoPlayerRef,\n useVideoPlayerState,\n} from './hooks';\nimport { usePlayerStateMachine } from './state';\nimport { PlayerType, PlaylistItemType } from './types';\n\nexport interface VideoPlayerActions {\n skipBackward5s: () => void;\n changePlayingMode: (playingMode: PlayingMode, tryToKeepCurrentTime?: boolean, autoplay?: boolean) => void;\n changeAutoplayNextPlaylistItem: (autoplayNextPlaylistItem: boolean) => void;\n skipForward5s: () => void;\n handleStandBy: () => void;\n jumpToTimeInMatch: (time: number) => void;\n jumpToTimePercent: (percent: number) => void;\n nextPlaylistItem: () => void;\n autoplayNextPlaylistItem: () => void;\n nextVideoSource: () => void;\n previousVideoSource: () => void;\n restart: () => void;\n refresh: () => void;\n pause: () => void;\n play: () => void;\n replacePlaylistItems: (playlistItems: PlaylistItemType[]) => void;\n setPlaylist: (\n playlist: PlaylistItemType[],\n playingMode: PlayingMode,\n autoplay?: boolean,\n tryToKeepCurrentTime?: boolean,\n ) => void;\n previousPlaylistItem: () => void;\n removePlaylistItem: (id: string) => void;\n removePlaylistItems: (ids: string[]) => void;\n reorder: (currentVideoIndex: number, newVideoIndex: number) => void;\n replay: () => void;\n resumeStandBy: () => void;\n setPlaylistItem: (id: string, autoPlay: boolean) => void;\n updatePlaylistItem: (playlistItem: PlaylistItemType, currenTime?: number) => void;\n updatePlaylistItems: (playlistItems: PlaylistItemType[]) => void;\n loadPlaylist: (playlistItems: PlaylistItemType[], initialStartTime: number) => void;\n}\n\ninterface VideoPlayerFixedState {\n videoPlayerRef: PlayerType;\n videoPlayerContainerRef: PlayerContainerType;\n videoPlayerId: string;\n refreshData?: (() => void) | (() => Promise);\n actions: VideoPlayerActions;\n}\n\ntype VideoPlayerStateProviderProps = {\n children: React.ReactNode;\n refreshData?: (() => void) | (() => Promise);\n playerId: string;\n playingMode: PlayingMode;\n playlistItems: PlaylistItemType[];\n initialStartTime?: number | undefined;\n};\n\nexport const VideoPlayerStateFixedContext = createContext<{ state: VideoPlayerFixedState } | undefined>(undefined);\n\nfunction VideoPlayerStateProvider({\n children,\n refreshData,\n playerId,\n playingMode,\n playlistItems,\n initialStartTime,\n}: VideoPlayerStateProviderProps) {\n const { actions, player, playerContainerRef } = usePlayerStateMachine(playerId, playingMode);\n\n useEffect(() => {\n actions.loadPlaylist(playlistItems, initialStartTime);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [playlistItems]);\n\n return (\n ({\n state: {\n refreshData,\n videoPlayerId: playerId,\n videoPlayerRef: player,\n videoPlayerContainerRef: playerContainerRef,\n actions,\n },\n }),\n [actions, player, playerContainerRef, playerId, refreshData],\n )}\n >\n {children}\n \n );\n}\n\nexport {\n VideoPlayerStateProvider,\n useCurrentTime,\n useDuration,\n useIsBuffering,\n useIsCurrentPlaylistItem,\n useIsSeeking,\n usePlayerCurrentSource,\n useVideoPlayerRef,\n useCurrentPlaylistItem,\n useVideoPlayerActions,\n usePlaylistCurrentPlaylistItemId,\n usePlaylistItems,\n useVideoPlayerPlayingMode,\n useVideoPlayerPlaylistItem,\n useVideoPlayerState,\n};\n","import { useMutation } from '@tanstack/react-query';\nimport { useTranslation } from 'react-i18next';\n\nimport { useBackendApi } from 'api/hooks/useBackendApi';\nimport { transformPlaylist } from 'api/playlist/transformers';\nimport { playlistUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\n\nimport { PlaylistApiResponse } from '../types';\nimport { usePlaylist } from '../usePlaylist';\n\ntype UpdatePlaylistParams = {\n name: string;\n onSuccess?: (data: unknown) => void;\n};\n\ntype PlaylistUpdate = {\n name: string;\n};\n\nexport const useUpdatePlaylist = (\n playlistId: string,\n onSuccess?: () => void,\n onError?: () => void,\n onSettled?: () => void,\n) => {\n const { t } = useTranslation();\n const { setQueryData } = usePlaylist({ playlistId });\n const onPatchSuccess = (data: PlaylistApiResponse) => transformPlaylist(data);\n const patchUrl = playlistUrl(playlistId);\n const triggerNotification = useNotifications();\n const updatePlaylist = useMutation((params) => useBackendApi(patchUrl, HTTPMethod.PATCH, onPatchSuccess, params), {\n onMutate: async (params: PlaylistUpdate) => {},\n onError: () => {\n if (onError) onError();\n triggerNotification({ type: NotificationType.ERROR, message: t('api:use-update-playlist.error') });\n },\n onSuccess: (updatedPlaylist) => {\n setQueryData(updatedPlaylist);\n if (onSuccess) onSuccess();\n },\n onSettled: () => {\n if (onSettled) onSettled();\n },\n });\n\n const updatePlaylistName = ({ name, onSuccess }: UpdatePlaylistParams) => {\n const updateParams = { name: name };\n updatePlaylist.mutate(updateParams, { onSuccess: onSuccess });\n };\n\n return { updatePlaylistName, isLoading: updatePlaylist.isLoading };\n};\n","import { atomFamily } from 'recoil';\n\nexport const bulkMode = atomFamily({\n key: 'bulk-mode',\n default: false,\n});\n\nexport const bulkSelectedItems = atomFamily({\n key: 'selected-items-bulk-mode',\n default: [],\n});\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { bulkMode } from '../store/UserPlaylist.state';\n\nexport const useIsBulkModeActive = (id: string) => {\n return useRecoilValue(bulkMode(id));\n};\n\nexport const useSetIsBulkModeActive = (id: string) => {\n return useSetRecoilState(bulkMode(id));\n};\n","import { Stack } from '@mui/material';\nimport React from 'react';\n\nexport const PlaylistActions = ({ children }: React.PropsWithChildren) => {\n return (\n \n {children}\n \n );\n};\n","import { Grid, styled } from '@mui/material';\n\nexport const PlaylistContainerGrid = styled(Grid)({\n height: '100%',\n overflow: 'hidden',\n});\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconTime = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconTime;\n","import memoize from 'lodash/memoize';\n\nconst formatDuration = (seconds: number, shortForm: boolean) => {\n const mins = ~~(seconds / 60);\n const secs = ~~seconds % 60;\n const ret = [];\n\n ret.push(`${String(mins).padStart(shortForm ? 1 : 2, '0')}:${secs < 10 ? '0' : ''}`);\n ret.push(`${secs}`);\n return ret.join('');\n};\n\nexport const secondsAsDuration = memoize(formatDuration, (seconds: number, shortForm: boolean) =>\n [seconds, shortForm].join('-'),\n);\n","import { Box, styled } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nexport const BadgeText = styled(Box)(({ theme }) => ({\n background: Colors.background,\n display: 'flex',\n fontSize: fontSizes.xxSmall,\n fontWeight: theme.typography.fontWeightMedium,\n alignItems: 'center',\n padding: theme.spacing(0, 1),\n borderRadius: '2px',\n height: '24px',\n lineHeight: fontSizes.xxSmall,\n}));\n","import { Stack, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport { useTranslation } from 'react-i18next';\n\nimport IconTime from 'shared/components/icons/icon-time';\nimport { Playlist } from 'shared/types';\nimport { secondsAsDuration } from 'shared/utils/seconds-as-duration';\n\nimport { BadgeText } from './BadgetText';\n\ntype Props = {\n playlist: Playlist;\n};\n\nexport const PlaylistDetails = ({ playlist }: Props) => {\n const { t } = useTranslation();\n\n return (\n \n {t('playlist-detail:all-playlist')}\n {t('playlist-detail:clips', { count: playlist.playlistItems.length })}\n \n {secondsAsDuration(playlist.duration, false)}\n \n \n );\n};\n","import { Grid, styled } from '@mui/material';\n\nimport { PLAYLIST_HEADER_HEIGHT } from '../config/Playlist.config';\n\nexport const PlaylistHeaderGrid = styled(Grid)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'space-between',\n padding: theme.spacing(1, 8, 1, 4),\n height: PLAYLIST_HEADER_HEIGHT,\n}));\n","import { Grid, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nimport { PLAYLIST_TIMELINE_HEIGHT } from '../config/Playlist.config';\n\nexport const PlaylistTimelineContainer = styled(Grid)(() => ({\n height: PLAYLIST_TIMELINE_HEIGHT,\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n // TODO use from theme\n backgroundColor: Colors.background,\n}));\n","import { Stack, styled } from '@mui/material';\nimport { boxShadows } from 'kognia-ui';\n\nimport { PLAYLIST_TIMELINE_HEADER_HEIGHT } from '../config/Playlist.config';\n\nexport const PlaylistTimelineHeader = styled(Stack)(({ theme }) => ({\n alignItems: 'center',\n justifyContent: 'space-between',\n flexDirection: 'row',\n padding: theme.spacing(0, 2),\n boxShadow: boxShadows[2],\n height: PLAYLIST_TIMELINE_HEADER_HEIGHT,\n background: theme.palette.common.white,\n}));\n","import { useMutation, UseMutationResult } from '@tanstack/react-query';\nimport { AxiosError } from 'axios';\nimport { isFunction } from 'lodash';\nimport { ReactNode } from 'react';\n\nimport { BackendApiRequestTypes, useBackendApi } from 'api/hooks/useBackendApi';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\n\nimport { HTTPMethod } from '../../types';\n\nexport interface MutationRequestParams {\n transformer?: (response: TApiData) => void;\n onSuccess?: (response: TData) => void;\n onError?: (data: AxiosError) => void;\n onSettled?: () => void;\n errorMessage?: string | ((data: TApiError | undefined) => string | ReactNode);\n successMessage?: string;\n type?: BackendApiRequestTypes;\n}\n\ntype Params = {\n url: string;\n data?: {\n [key: string]: any;\n };\n};\n\nexport const useMutationRequest = ({\n onSuccess,\n onError,\n onSettled,\n transformer = (response: TApiData) => response,\n errorMessage,\n successMessage,\n type = HTTPMethod.POST,\n}: MutationRequestParams): UseMutationResult => {\n const triggerNotification = useNotifications();\n\n return useMutation(\n ({ url, data = {} }: Params) => {\n return useBackendApi(url, type, transformer, data);\n },\n {\n onMutate: async (params: any) => {\n return params;\n },\n onError: (error: AxiosError) => {\n if (onError) onError(error);\n if (errorMessage) {\n triggerNotification({\n type: NotificationType.ERROR,\n message: isFunction(errorMessage) ? errorMessage(error.response?.data) : errorMessage,\n });\n }\n },\n onSuccess: (response: any) => {\n if (onSuccess) onSuccess(response);\n if (successMessage) {\n triggerNotification({ type: NotificationType.SUCCESS, message: successMessage });\n }\n },\n onSettled: () => {\n if (onSettled) onSettled();\n },\n },\n );\n};\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useMutationRequest } from '../../hooks/useMutationRequest';\nimport { downloadPlaylistUrl } from '../../routes';\n\nexport const useDownloadPlaylist = () => {\n const { t } = useTranslation();\n const { mutate } = useMutationRequest({\n successMessage: t('api:use-download-playlist.success'),\n errorMessage: t('api:use-download-playlist.error'),\n });\n\n return useCallback(\n ({\n playlistId,\n joinSources,\n showOverlays = true,\n showTitles = true,\n }: {\n playlistId: string;\n joinSources: boolean;\n showOverlays: boolean;\n showTitles: boolean;\n }) => {\n mutate({\n url: downloadPlaylistUrl({ playlistId, joinSources, showOverlays, showTitles }),\n data: { playlistId },\n });\n },\n [mutate],\n );\n};\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useMutationRequest } from '../../hooks/useMutationRequest';\nimport { downloadClipsUrl } from '../../routes';\n\nexport const useDownloadPlaylistItems = () => {\n const { t } = useTranslation();\n const { mutate } = useMutationRequest({\n successMessage: t('api:use-download-playlist-items.success'),\n errorMessage: t('api:use-download-playlist-items.error'),\n });\n\n return useCallback(\n ({\n playlistId,\n playlistItems,\n joinSources,\n showOverlays = true,\n showTitles = true,\n }: {\n playlistId: string;\n playlistItems: string[];\n joinSources: boolean;\n showOverlays: boolean;\n showTitles: boolean;\n }) => {\n mutate({\n url: downloadClipsUrl({ playlistId, joinSources, showOverlays, showTitles }),\n data: playlistItems,\n });\n },\n [mutate],\n );\n};\n","import { useBackendApi } from 'api/hooks/useBackendApi';\nimport { downloadPlaylistXmlUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\n\nexport const useDownloadPlaylistXml = (playlistId: string, playlistItems: string[]) => {\n const downloadXmlFile = (response: any) => {\n const blob = new Blob([response], {\n type: 'text/xml',\n });\n const blobURL = window.URL.createObjectURL(blob);\n\n const downloadLink = document.createElement('a');\n downloadLink.target = '_blank';\n downloadLink.href = blobURL;\n downloadLink.download = `playlist-${playlistId}.xml`;\n downloadLink.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window,\n }),\n );\n setTimeout(function () {\n window.URL.revokeObjectURL(blobURL);\n }, 200);\n };\n\n return () =>\n useBackendApi(downloadPlaylistXmlUrl(playlistId), HTTPMethod.POST, downloadXmlFile, playlistItems as any);\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconDownload = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { Box, styled } from '@mui/material';\n\nexport const DownloadModalWrapper = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: '50%',\n left: '50%',\n maxWidth: '510px',\n width: '100%',\n padding: theme.spacing(3, 4.5),\n borderRadius: '8px',\n backgroundColor: theme.palette.common.white,\n transform: 'translate(-50%, -50%)',\n}));\n","import {\n Box,\n Button,\n Checkbox,\n FormControl,\n FormControlLabel,\n FormGroup,\n Modal,\n Radio,\n RadioGroup,\n Typography,\n} from '@mui/material';\nimport classNames from 'classnames';\nimport { Colors, fontSizes } from 'kognia-ui';\nimport isEmpty from 'lodash/isEmpty';\nimport React, { SyntheticEvent, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useDownloadPlaylist } from 'api/playlist/useDownloadPlaylist';\nimport { useDownloadPlaylistItems } from 'api/playlist/useDownloadPlaylistItems';\nimport { useDownloadPlaylistXml } from 'api/playlist/useDownloadPlaylistXml';\nimport IconClose from 'shared/components/icons/icon-close';\nimport { IconDownload } from 'shared/components/icons/icon-download';\n\nimport styles from './DownloadModal.module.scss';\nimport { DownloadModalWrapper } from './ui/download-modal-wrapper/DownloadModalWrapper';\n\ninterface Props {\n isPlaylistDownload?: boolean;\n itemsToDownload?: string[];\n onClose: () => void;\n playlistId: string;\n}\n\nconst DOWNLOAD_TYPE = {\n SINGLE_VIDEO_FILE: 'single-video-file',\n MULTIPLE_VIDEO_FILES: 'multiple-video-files',\n};\n\nconst DOWNLOAD_BUTTON_MIN_WIDTH = 136;\n\nexport const DownloadPlaylistItemsModal = ({\n onClose,\n playlistId,\n isPlaylistDownload = true,\n itemsToDownload,\n}: Props): JSX.Element => {\n const { t } = useTranslation();\n const [showOverlays, setShowOverlays] = React.useState(true);\n const [downloadTypeValue, setDownloadTypeValue] = React.useState(DOWNLOAD_TYPE.SINGLE_VIDEO_FILE);\n const [showTitles, setShowTitles] = React.useState(true);\n const [exportXml, setExportXml] = React.useState(false);\n const downloadPlaylist = useDownloadPlaylist();\n const downloadPlaylistItems = useDownloadPlaylistItems();\n const downloadPlaylistXml = useDownloadPlaylistXml(playlistId, itemsToDownload ?? []);\n\n const isSinglePlaylistItemDownload = itemsToDownload?.length === 1;\n\n const handleSubmit = useCallback(() => {\n const joinSources = isSinglePlaylistItemDownload ? false : downloadTypeValue === DOWNLOAD_TYPE.SINGLE_VIDEO_FILE;\n\n if (isPlaylistDownload) {\n downloadPlaylist({\n playlistId,\n joinSources,\n showOverlays,\n showTitles,\n });\n } else if (!isPlaylistDownload && itemsToDownload && !isEmpty(itemsToDownload)) {\n downloadPlaylistItems({\n playlistId,\n playlistItems: itemsToDownload,\n joinSources,\n showOverlays,\n showTitles,\n });\n }\n if (exportXml) downloadPlaylistXml();\n\n onClose();\n }, [\n isSinglePlaylistItemDownload,\n downloadTypeValue,\n showOverlays,\n isPlaylistDownload,\n itemsToDownload,\n onClose,\n downloadPlaylist,\n playlistId,\n showTitles,\n exportXml,\n downloadPlaylistXml,\n downloadPlaylistItems,\n ]);\n\n const handleDownloadTypeChange = useCallback((event: React.ChangeEvent) => {\n setDownloadTypeValue((event.target as HTMLInputElement).value);\n }, []);\n\n const handleShowOverlaysChange = useCallback((event: SyntheticEvent) => {\n const showOverlays = (event.target as HTMLInputElement).checked;\n setShowOverlays(showOverlays);\n }, []);\n\n const handleTitleChange = useCallback((event: SyntheticEvent) => {\n const showTitle = (event.target as HTMLInputElement).checked;\n setShowTitles(showTitle);\n }, []);\n\n const handleExportXml = useCallback((event: SyntheticEvent) => {\n const exportXmlChecked = (event.target as HTMLInputElement).checked;\n setExportXml(exportXmlChecked);\n }, []);\n\n return (\n \n \n \n \n \n \n\n \n {t('playlist-detail:download-modal.title')}\n \n \n\n \n {!isSinglePlaylistItemDownload ? (\n \n \n
{t('playlist-detail:download-modal.choose-download-type')}
\n \n }\n label={\n
\n {t('playlist-detail:download-modal.single-video-file')}\n
\n }\n />\n }\n label={\n
\n {t('playlist-detail:download-modal.multiple-video-files')}\n
\n }\n />\n \n
\n
\n ) : null}\n
\n\n \n
{t('playlist-detail:download-modal.choose-preferences')}
\n \n }\n label={\n \n {t('playlist-detail:download-modal.show-tactical-drawings')}\n \n }\n onChange={handleShowOverlaysChange}\n />\n }\n label={\n {t('playlist-detail:download-modal.show-titles')}\n }\n onChange={handleTitleChange}\n />\n }\n label={\n {t('playlist-detail:download-modal.export-xml')}\n }\n onChange={handleExportXml}\n />\n \n
\n\n \n \n \n \n\n spacing(1)} right={({ spacing }) => spacing(1)}>\n \n \n
\n
\n );\n};\n","import React from 'react';\n\nimport { DownloadPlaylistItemsModal } from 'features/playlist/download-playlist-items-modal/DownloadPlaylistItemsModal';\nimport { useCurrentPlaylistItem } from 'shared/components/video-player';\n\ninterface Props {\n playlistId: string;\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport const DownloadCurrentPlaylistItemModal = ({ playlistId, isOpen, onClose }: Props) => {\n const playlistItem = useCurrentPlaylistItem();\n\n return isOpen ? (\n \n ) : null;\n};\n","import { Button } from '@mui/material';\nimport isEmpty from 'lodash/isEmpty';\nimport { useTranslation } from 'react-i18next';\n\nimport { useIsBulkModeActive, useSetIsBulkModeActive } from 'entities/playlist/hooks/useIsBulkModeActive';\nimport { usePlaylistItems, useVideoPlayerActions } from 'shared/components/video-player';\n\ntype Props = {\n playlistId: string;\n};\n\nexport const EnableBulkModeButton = ({ playlistId }: Props) => {\n const { t } = useTranslation();\n const playingItems = usePlaylistItems();\n const actions = useVideoPlayerActions();\n const enabledBulkMode = useIsBulkModeActive(playlistId);\n const setEnabledBulkMode = useSetIsBulkModeActive(playlistId);\n\n const handleSelectClick = () => {\n setEnabledBulkMode(!enabledBulkMode);\n\n actions.pause();\n };\n\n if (isEmpty(playingItems)) return null;\n\n return (\n \n );\n};\n","import throttle from 'lodash/throttle';\nimport { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { playlistItemsBaseUrl } from 'api/routes';\nimport { Playlist } from 'shared/types';\n\nimport { useMutationRequest } from '../../hooks/useMutationRequest';\nimport { HTTPMethod } from '../../types';\nimport { transformPlaylist } from '../transformers';\nimport { PlaylistApiResponse } from '../types';\n\nenum BatchUpdatePlaylistItemsActions {\n SELECT_FUNDAMENTALS = 'selectFundamentals',\n TRIM_TIME = 'trimTime',\n}\n\nexport type SelectFundamentalsInItems = {\n action: BatchUpdatePlaylistItemsActions.SELECT_FUNDAMENTALS;\n playlistItemIds: string[];\n fundamentalsSelected: string[];\n};\n\nexport type TrimItems = {\n action: BatchUpdatePlaylistItemsActions.TRIM_TIME;\n playlistItemIds: string[];\n timeToTrim: {\n before: number;\n after: number;\n };\n};\n\nexport type BatchUpdatePlaylistItems = SelectFundamentalsInItems | TrimItems;\n\nexport const createSelectFundamentalsPayload = (\n playlistItemIds: string[],\n fundamentalsSelected: string[],\n): SelectFundamentalsInItems => ({\n action: BatchUpdatePlaylistItemsActions.SELECT_FUNDAMENTALS,\n playlistItemIds,\n fundamentalsSelected,\n});\n\nexport const createTrimItemsPayload = ({\n playlistItemIds,\n before,\n after,\n}: {\n playlistItemIds: string[];\n before?: number;\n after?: number;\n}): TrimItems => ({\n action: BatchUpdatePlaylistItemsActions.TRIM_TIME,\n playlistItemIds,\n timeToTrim: {\n before: before ?? 0,\n after: after ?? 0,\n },\n});\n\nexport const useBatchUpdatePlaylistItems = (playlistId: string, onSuccess?: (playlist: Playlist) => void) => {\n const { t } = useTranslation();\n\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n transformer: transformPlaylist,\n type: HTTPMethod.PATCH,\n errorMessage: t('api:use-update-playlist-item.error'),\n onSuccess: async (playlist: Playlist) => {\n onSuccess && onSuccess(playlist);\n },\n });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const updateBatchPlaylistItems = useCallback(\n throttle(\n (data: BatchUpdatePlaylistItems, onSuccess?: (playlist: Playlist) => void) => {\n mutate(\n {\n url: playlistItemsBaseUrl(playlistId),\n data,\n },\n { onSuccess },\n );\n },\n 1000,\n { leading: true },\n ),\n [],\n );\n\n return { updateBatchPlaylistItems, isLoading, isError, isSuccess };\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconOverlays = (props: Omit): JSX.Element => {\n return (\n \n \n \n \n \n \n \n \n \n );\n};\n","import { useCallback } from 'react';\nimport { atomFamily, useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil';\n\nconst overlayPanelOpenState = atomFamily({\n key: 'is-overlay-panel-open',\n default: false,\n});\n\nexport const useIsOverlayPanelOpen = (id: string) => {\n return useRecoilValue(overlayPanelOpenState(id));\n};\n\nconst overlayPanelSelectedTab = atomFamily({\n key: 'overlay-selected-tab',\n default: 0,\n});\n\nexport const useOverlaySelectedTab = (id: string) => {\n return useRecoilValue(overlayPanelSelectedTab(id));\n};\n\nexport const useSetOverlaySelectedTab = (id: string) => {\n return useSetRecoilState(overlayPanelSelectedTab(id));\n};\n\nexport const useSetIsOverlayPanelOpen = (id: string, callback?: (isOpen: boolean) => void) => {\n const [isOverlayPanelOpen, setIsOverlayPanelOpen] = useRecoilState(overlayPanelOpenState(id));\n\n return useCallback(\n (open: boolean) => {\n if (isOverlayPanelOpen !== open) {\n callback?.(open);\n setIsOverlayPanelOpen(open);\n }\n },\n [callback, setIsOverlayPanelOpen, isOverlayPanelOpen],\n );\n};\n","import { Checkbox as MuiCheckbox, CheckboxProps, styled } from '@mui/material';\n\ntype CustomColors = 'white' | 'typography' | 'tertiaryLight' | 'quaternaryLight';\n\ninterface Props extends CheckboxProps {\n customColor: CustomColors;\n}\n\nexport const CheckboxWithCustomColor = styled(MuiCheckbox, {\n shouldForwardProp: (prop) => prop !== 'customColor',\n})(({ theme, customColor }) => ({\n ...(customColor === 'white' && {\n color: theme.palette.common.white,\n '&.Mui-checked': {\n color: theme.palette.common.white,\n },\n '&.MuiCheckbox-indeterminate': {\n color: theme.palette.common.white,\n },\n }),\n\n ...(customColor === 'typography' && {\n '&.Mui-checked': {\n color: theme.palette.text.primary,\n },\n '&.MuiCheckbox-indeterminate': {\n color: theme.palette.text.primary,\n },\n }),\n\n ...(customColor === 'tertiaryLight' && {\n color: theme.palette.tertiary.light,\n '&.Mui-checked': {\n color: theme.palette.tertiary.light,\n },\n '&.MuiCheckbox-indeterminate': {\n color: theme.palette.tertiary.light,\n },\n }),\n\n ...(customColor === 'quaternaryLight' && {\n color: theme.palette.quaternary.light,\n '&.Mui-checked': {\n color: theme.palette.quaternary.light,\n },\n '&.MuiCheckbox-indeterminate': {\n color: theme.palette.quaternary.light,\n },\n }),\n}));\n","import { styled, Tabs as MUITabs } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nexport const Tabs = styled(MUITabs)(({ theme }) => ({\n '& .MuiTab-root': {\n fontWeight: 'normal',\n fontSize: fontSizes.default,\n textTransform: 'none',\n borderBottom: `2px solid ${theme.palette.secondary.main}`,\n color: theme.palette.secondary.main,\n },\n '& .Mui-selected': {\n '&.MuiTab-root': {\n color: theme.palette.text.primary,\n },\n },\n '& .MuiTabs-indicator': {\n height: theme.spacing(0.5),\n backgroundColor: theme.palette.text.primary,\n },\n}));\n","import { Box, styled } from '@mui/material';\n\ninterface Props {\n children?: React.ReactNode;\n dir?: string;\n index: number;\n value: number;\n}\n\nexport const TabPanelContainer = styled(Box)(({ theme }) => ({\n padding: theme.spacing(0, 1, 1),\n}));\n\nexport function TabPanel(props: Props) {\n const { children, value, index, ...other } = props;\n\n return (\n \n );\n}\n\nexport const TabsPanel = styled(Box)(({ theme }) => ({ overflowY: 'scroll', marginTop: theme.spacing(2) }));\n","import { Box, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport { TacticId } from 'overlay-generator';\nimport { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { CheckboxWithCustomColor } from '../CheckboxWithCustomColor/CheckboxWithCustomColor';\n\ntype TacticCheckBoxProps = {\n tactic: TacticId;\n selected: boolean;\n onChange: (tactic: TacticId) => void;\n isAvailableInFrame: boolean;\n};\n\nexport const TacticCheckBox = ({ tactic, selected, onChange, isAvailableInFrame }: TacticCheckBoxProps) => {\n const { t } = useTranslation();\n const handleToggleTactic = useCallback(() => {\n onChange(tactic);\n }, [tactic, onChange]);\n\n return (\n \n \n {/* TODO use font styles from theme */}\n \n {t(`fundamentals:fundamentals.${tactic}`)}\n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconChevronLeft = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { Box, Stack, styled } from '@mui/material';\nimport { animationDurations, animations, fontSizes } from 'kognia-ui';\n\nimport { IconChevronLeft } from 'shared/components/icons/icon-chevron-left';\n\ntype PanelProps = {\n isOpen: boolean;\n};\n\nexport const Panel = styled(Stack, { shouldForwardProp: (prop) => prop !== 'isOpen' })(\n ({ theme, isOpen }) => ({\n background: isOpen ? theme.palette.common.white : 'transparent',\n display: 'grid',\n gridTemplateRows: 'auto 1fr',\n maxHeight: '100%',\n paddingLeft: theme.spacing(2),\n paddingRight: isOpen ? theme.spacing(2) : 0,\n paddingTop: isOpen ? theme.spacing() : 0,\n transition: 'width 0.2s ease-out',\n }),\n);\n\ntype PanelContentProps = {\n width: number;\n isOpen: boolean;\n};\n\nexport const PanelContent = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isOpen' && prop !== 'width',\n})(({ width, isOpen, theme }) => ({\n width: `${width - 32}px`,\n display: isOpen ? 'flex' : 'none',\n flexDirection: 'column',\n overflow: 'hidden',\n maxHeight: '100%',\n paddingBottom: theme.spacing(2),\n animation: `${animations.fadeIn} ${animationDurations.fast} ease-out`,\n}));\n\nexport const PanelTitle = styled(Stack)(({ theme }) => ({\n alignItems: 'center',\n fontSize: fontSizes.default,\n gap: theme.spacing(1),\n}));\n\nexport const PanelSectionTitle = styled(Stack)(({ theme }) => ({\n background: theme.palette.secondary.light,\n fontSize: fontSizes.default,\n padding: theme.spacing(1),\n}));\n\ntype IconChevronProps = {\n isOpen: boolean;\n};\n\nexport const IconChevron = styled(IconChevronLeft, {\n shouldForwardProp: (prop) => prop !== 'isOpen',\n})(({ isOpen }) => ({\n transition: 'transform 0.3s',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n}));\n\nexport const ClosedPanelButton = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n border: `1px solid ${theme.palette.secondary.light}`,\n borderRight: 0,\n borderTopLeftRadius: '8px',\n borderBottomLeftRadius: '8px',\n background: theme.palette.common.white,\n padding: theme.spacing(1, 1, 1, 0),\n}));\n","import { Alert, Stack, Tab } from '@mui/material';\nimport { DefensiveTacticId, defensiveTactics, OffensiveTacticId, offensiveTactics, TacticId } from 'overlay-generator';\nimport React, { useCallback, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { CheckboxWithCustomColor } from 'shared/components/CheckboxWithCustomColor/CheckboxWithCustomColor';\nimport { Tabs } from 'shared/components/tabs';\nimport { TabPanel, TabsPanel } from 'shared/components/tabs/components/tab-panel';\n\nimport { TacticCheckBox } from '../../tactic-checkbox';\nimport {\n useOverlaySelectedTab,\n useSetOverlaySelectedTab,\n} from '../../video-player/video-player-component/hooks/overlay-panel';\nimport { PanelContent, PanelSectionTitle } from '../styled';\n\ntype Props = {\n id: string;\n width: number;\n isOpen: boolean;\n availableTactics: TacticId[];\n initialSelectedTactics: TacticId[];\n frameTactics: TacticId[];\n onTacticsChange: (tactic: TacticId[]) => void;\n};\n\nexport const OverlaySelectorContent = ({\n id,\n width,\n isOpen,\n availableTactics,\n initialSelectedTactics,\n frameTactics,\n onTacticsChange,\n}: Props) => {\n const { t } = useTranslation();\n const selectedTab = useOverlaySelectedTab(id);\n const setSelectedTab = useSetOverlaySelectedTab(id);\n\n const selectedTactics = useMemo(() => new Set(initialSelectedTactics), [initialSelectedTactics]);\n\n const availableOffensiveTactics = useMemo(\n () =>\n availableTactics.filter((tactic) => offensiveTactics.includes(tactic as OffensiveTacticId), [availableTactics]),\n [availableTactics],\n );\n\n const availableDefensiveTactics = useMemo(\n () =>\n availableTactics.filter((tactic) => defensiveTactics.includes(tactic as DefensiveTacticId), [availableTactics]),\n [availableTactics],\n );\n\n const selectedOffensiveTactics = useMemo(\n () =>\n availableTactics.filter(\n (tactic) => offensiveTactics.includes(tactic as OffensiveTacticId) && selectedTactics.has(tactic),\n [selectedTactics],\n ),\n [availableTactics, selectedTactics],\n );\n\n const selectedDefensiveTactics = useMemo(\n () =>\n availableTactics.filter(\n (tactic) => defensiveTactics.includes(tactic as DefensiveTacticId) && selectedTactics.has(tactic),\n [selectedTactics],\n ),\n [availableTactics, selectedTactics],\n );\n\n const handleTabChange = (event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue);\n };\n\n const handleTacticToggle = useCallback(\n (tacticId: TacticId) => {\n if (selectedTactics.has(tacticId)) {\n selectedTactics.delete(tacticId);\n } else {\n selectedTactics.add(tacticId);\n }\n onTacticsChange(Array.from(selectedTactics));\n },\n [onTacticsChange, selectedTactics],\n );\n\n const areAllOffensiveTacticsSelected = useMemo(() => {\n return (\n availableOffensiveTactics.filter((tactic) => selectedTactics.has(tactic)).length ===\n availableOffensiveTactics.length\n );\n }, [availableOffensiveTactics, selectedTactics]);\n\n const areAllDefensiveTacticsSelected = useMemo(\n () =>\n availableDefensiveTactics.filter((tactic) => selectedTactics.has(tactic)).length ===\n availableDefensiveTactics.length,\n [availableDefensiveTactics, selectedTactics],\n );\n\n const handleToggleAllOffensiveTactics = useCallback(() => {\n if (areAllOffensiveTacticsSelected) {\n availableOffensiveTactics.forEach((tactic) => {\n selectedTactics.delete(tactic);\n });\n } else {\n availableOffensiveTactics.forEach((tactic) => {\n selectedTactics.add(tactic);\n });\n }\n onTacticsChange(Array.from(selectedTactics));\n }, [availableOffensiveTactics, onTacticsChange, areAllOffensiveTacticsSelected, selectedTactics]);\n\n const handleToggleAllDefensiveTactics = useCallback(() => {\n if (areAllDefensiveTacticsSelected) {\n availableDefensiveTactics.forEach((tactic) => {\n selectedTactics.delete(tactic);\n });\n } else {\n availableDefensiveTactics.forEach((tactic) => {\n selectedTactics.add(tactic);\n });\n }\n onTacticsChange(Array.from(selectedTactics));\n }, [areAllDefensiveTacticsSelected, availableDefensiveTactics, onTacticsChange, selectedTactics]);\n\n if (availableTactics.length === 0) return No tactics available;\n\n return (\n \n \n {t('video-player:overlays.tactics')}\n \n \n \n \n \n \n \n \n \n 0 && !areAllOffensiveTacticsSelected}\n />\n {t('video-player:overlays.all-tactics')} ({selectedOffensiveTactics.length} /{' '}\n {availableOffensiveTactics.length})\n \n \n {availableOffensiveTactics.map((tactic) => (\n \n ))}\n \n \n \n \n \n \n 0 && !areAllDefensiveTacticsSelected}\n />\n {t('video-player:overlays.all-tactics')} ({selectedDefensiveTactics.length} /{' '}\n {availableDefensiveTactics.length})\n \n \n {availableDefensiveTactics.map((tactic) => (\n \n ))}\n \n \n \n \n \n );\n};\n","import { Box, Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport { TacticId } from 'overlay-generator';\nimport React, { useCallback, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { IconOverlays } from 'shared/components/icons/icon-overlays';\nimport Spinner from 'shared/components/spinner';\nimport {\n useIsOverlayPanelOpen,\n useSetIsOverlayPanelOpen,\n} from 'shared/components/video-player/video-player-component/hooks/overlay-panel';\n\nimport { OverlaySelectorContent } from './overlay-selector-content';\nimport { ClosedPanelButton, IconChevron, Panel, PanelTitle } from './styled';\n\ntype Props = {\n id: string;\n availableTactics: TacticId[] | undefined;\n initialSelectedTactics: TacticId[] | undefined;\n frameTactics: TacticId[];\n onTacticsChange: (tactics: TacticId[]) => void;\n onIsOverlayPanelOpenChange?: (isOpen: boolean) => void;\n isLoading: boolean;\n};\n\nexport const MAX_PANEL_WIDTH = 354;\nexport const MIN_PANEL_WIDTH = 74;\n\nexport const OverlaySelectorPanel = ({\n id,\n availableTactics,\n frameTactics,\n initialSelectedTactics,\n onTacticsChange,\n isLoading,\n onIsOverlayPanelOpenChange,\n}: Props) => {\n const { t } = useTranslation();\n const isOverlayPanelOpen = useIsOverlayPanelOpen(id);\n const setIsOverlayPanelOpenState = useSetIsOverlayPanelOpen(id, onIsOverlayPanelOpenChange);\n const handlePanelToggle = useCallback(() => {\n setIsOverlayPanelOpenState(!isOverlayPanelOpen);\n }, [setIsOverlayPanelOpenState, isOverlayPanelOpen]);\n\n const panelWidth = useMemo(() => (isOverlayPanelOpen ? MAX_PANEL_WIDTH : MIN_PANEL_WIDTH), [isOverlayPanelOpen]);\n\n return (\n \n \n {isOverlayPanelOpen ? (\n <>\n \n \n \n \n \n {t('video-player:overlays.overlays-settings')}\n \n \n ) : (\n \n \n \n \n )}\n \n {isLoading ? (\n \n \n \n ) : null}\n {availableTactics && initialSelectedTactics && isOverlayPanelOpen && !isLoading ? (\n \n ) : null}\n \n );\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { bulkSelectedItems } from 'entities/playlist/store/UserPlaylist.state';\n\nexport const useBulkSelectedItems = (id: string) => {\n return useRecoilValue(bulkSelectedItems(id));\n};\n\nexport const useSetBulkSelectedItems = (id: string) => {\n return useSetRecoilState(bulkSelectedItems(id));\n};\n","import { useMemo } from 'react';\n\nimport { useBulkSelectedItems } from 'entities/playlist/hooks/useBulkSelectedItems';\nimport { useIsBulkModeActive } from 'entities/playlist/hooks/useIsBulkModeActive';\nimport { useCurrentPlaylistItem, usePlaylistItems } from 'shared/components/video-player';\n\nimport { SelectedPlaylistItems } from '../types/PlaylistOverlaySelector.types';\n\nexport const useActivePlaylistItemIds = (playlistId: string): SelectedPlaylistItems => {\n const playlistItems = usePlaylistItems();\n const playlistItem = useCurrentPlaylistItem();\n const isBulkModeActive = useIsBulkModeActive(playlistId);\n const bulkSelectedPlaylistItems = useBulkSelectedItems(playlistId);\n\n return useMemo(() => {\n const playlistItemsIds = isBulkModeActive ? bulkSelectedPlaylistItems : [playlistItem.id];\n\n return playlistItemsIds.reduce(\n (selectedPlaylistItems, id) => {\n const playlistItem = playlistItems.find((playlistItem) => playlistItem.id === id);\n\n if (!playlistItem || !playlistItem.hasHomographies) return selectedPlaylistItems;\n\n return {\n ids: [...selectedPlaylistItems.ids, playlistItem.id],\n playlistItems: [...selectedPlaylistItems.playlistItems, playlistItem],\n };\n },\n { ids: [], playlistItems: [] },\n );\n }, [playlistItems, isBulkModeActive, bulkSelectedPlaylistItems, playlistItem]);\n};\n","import { MutateOptions } from '@tanstack/react-query';\nimport { TacticId } from 'overlay-generator';\nimport { useCallback } from 'react';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { tacticsInRange } from 'api/routes';\n\ntype TacticsInRangeApiResponse = { [key in TacticId]: { itemIds: string[]; teamIds: string[] } };\nexport type TacticsInRange = { tactics: TacticId[]; playlistItemsTactics: { [key in string]: TacticId[] } };\n\nconst transformTactics = (response: TacticsInRangeApiResponse): TacticsInRange => {\n const tacticsList = Object.keys(response) as TacticId[];\n\n return {\n tactics: tacticsList,\n playlistItemsTactics: tacticsList.reduce<{ [key in string]: TacticId[] }>((playlistItemsTactics, tacticId) => {\n response[tacticId].itemIds.forEach((playlistItemId: string) => {\n if (!playlistItemsTactics[playlistItemId]) playlistItemsTactics[playlistItemId] = [];\n playlistItemsTactics[playlistItemId].push(tacticId);\n });\n\n return playlistItemsTactics;\n }, {}),\n };\n};\n\nexport const useTacticsInRange = () => {\n const { mutate, ...rest } = useMutationRequest({\n transformer: transformTactics,\n });\n\n const getTacticsInRange = useCallback(\n (\n data: { startTime: number; endTime: number; itemId: string; tacticalAnalysisId: string }[],\n options?: MutateOptions,\n ) => {\n mutate({ url: tacticsInRange, data }, options);\n },\n [mutate],\n );\n\n return { ...rest, getTacticsInRange };\n};\n","import { useEffect, useState } from 'react';\n\nimport { useVideoPlayerPlayingMode } from 'shared/components/video-player';\nimport { getVideoByVideoType } from 'shared/components/video-player/util';\n\nimport { useActivePlaylistItemIds } from './useActivePlaylistItemIds';\nimport { TacticsInRange, useTacticsInRange } from '../api/useTacticsInRange';\n\nexport const useSelectedItemsOverlayTactics = (playlistId: string) => {\n const [overlayTacticsAndSelectedItems, setOverlayTacticsAndSelectedItems] = useState();\n const response = useTacticsInRange();\n const playingMode = useVideoPlayerPlayingMode();\n const playlistItemIds = useActivePlaylistItemIds(playlistId);\n const { getTacticsInRange } = response;\n\n useEffect(() => {\n const data = playlistItemIds.playlistItems\n .filter((item) => item.fundamentalsSelected.tacticalAnalysisId)\n .map((item) => {\n const { videoSources } = getVideoByVideoType(item, playingMode);\n\n return {\n startTime: videoSources[0].startTime,\n endTime: videoSources[0].endTime,\n itemId: item.id,\n tacticalAnalysisId: item.fundamentalsSelected.tacticalAnalysisId ?? '',\n };\n });\n\n getTacticsInRange(data, {\n onSuccess: setOverlayTacticsAndSelectedItems,\n onError: () => setOverlayTacticsAndSelectedItems(undefined),\n });\n }, [playingMode, getTacticsInRange, playlistItemIds]);\n\n return { ...response, data: overlayTacticsAndSelectedItems };\n};\n","import { TacticId } from 'overlay-generator';\nimport React, { useCallback, useMemo } from 'react';\n\nimport { createSelectFundamentalsPayload, useBatchUpdatePlaylistItems } from 'api/playlist/useBatchUpdatePlaylistItems';\nimport { useMapVideos } from 'entities/playlist/hooks/use-map-videos/useMapVideos';\nimport { useIsBulkModeActive } from 'entities/playlist/hooks/useIsBulkModeActive';\nimport { OverlaySelectorPanel } from 'shared/components/overlay-selector-panel';\nimport {\n useCurrentPlaylistItem,\n usePlaylistItems,\n useVideoPlayerActions,\n useVideoPlayerId,\n} from 'shared/components/video-player/hooks';\nimport { useOverlaysFrameInfo } from 'shared/components/video-player/hooks/use-overlays-controller';\nimport { areAllOverlayTacticsSelected } from 'shared/components/video-player/util';\nimport { Playlist, TacticIdOrAll } from 'shared/types/playlist/types';\n\nimport { useActivePlaylistItemIds } from './hooks/useActivePlaylistItemIds';\nimport { useSelectedItemsOverlayTactics } from './hooks/useSelectedItemsOverlayTactics';\n\ntype Props = {\n playlistId: string;\n readOnly?: boolean;\n};\n\nexport const PlaylistOverlaysSelectorPanelFeature = ({ playlistId, readOnly = false }: Props) => {\n const isBulkModeActive = useIsBulkModeActive(playlistId);\n const videoPlayerId = useVideoPlayerId();\n const playlistItems = usePlaylistItems();\n const playlistItem = useCurrentPlaylistItem();\n const actions = useVideoPlayerActions();\n const mapVideos = useMapVideos();\n const playlistItemIds = useActivePlaylistItemIds(playlistId);\n const { data, isLoading } = useSelectedItemsOverlayTactics(playlistId);\n const frameInfo = useOverlaysFrameInfo();\n\n const handleReplacePlaylistItem = useCallback(\n (playlist: Playlist) => {\n actions.updatePlaylistItems(mapVideos(playlist));\n },\n [mapVideos, actions],\n );\n\n const { updateBatchPlaylistItems } = useBatchUpdatePlaylistItems(playlistId);\n\n const handleToggleTactic = useCallback(\n (tactics: TacticId[]) => {\n const selectedTactics = (tactics.length === data?.tactics.length ? ['all'] : tactics) as TacticIdOrAll[];\n updateBatchPlaylistItems(\n createSelectFundamentalsPayload(playlistItemIds.ids, selectedTactics),\n handleReplacePlaylistItem,\n );\n },\n [handleReplacePlaylistItem, updateBatchPlaylistItems, playlistItemIds, data],\n );\n\n const handleToggleTacticReadOnly = useCallback(\n (tactics: TacticId[]) => {\n const selectedTactics = (tactics.length === data?.tactics.length ? ['all'] : tactics) as TacticIdOrAll[];\n\n actions.updatePlaylistItem({\n ...playlistItem,\n fundamentalsSelected: { ...playlistItem.fundamentalsSelected, fundamentalsSelected: selectedTactics },\n });\n },\n [actions, data, playlistItem],\n );\n\n const onIsOverlayPanelOpenChange = useCallback(\n (open: boolean) => {\n actions.changeAutoplayNextPlaylistItem(!open);\n },\n [actions],\n );\n\n const selectedTactics = useMemo(() => {\n const activePlaylistItems = playlistItems.filter((playlistItem) => playlistItemIds.ids.includes(playlistItem.id));\n\n return activePlaylistItems\n .map((item) =>\n areAllOverlayTacticsSelected(item)\n ? data?.playlistItemsTactics[item.id] ?? []\n : (item.fundamentalsSelected.fundamentalsSelected as TacticId[]),\n )\n .flat();\n }, [data, playlistItemIds, playlistItems]);\n\n return (\n \n );\n};\n","import { useTranslation } from 'react-i18next';\n\nimport { queryClient } from 'api/config';\nimport { deletePlaylistItemsUrl } from 'api/routes';\n\nimport { useMutationRequest } from '../../hooks/useMutationRequest';\nimport { HTTPMethod } from '../../types';\nimport { generateFetchPlaylistQueryRef } from '../usePlaylist';\n\nexport const useDeletePlaylistItems = (playlistId: string) => {\n const { t } = useTranslation();\n const fetchQueryRef = generateFetchPlaylistQueryRef(playlistId);\n const { mutate, isLoading, isError } = useMutationRequest({\n type: HTTPMethod.DELETE,\n errorMessage: t('api:use-delete-playlist-items.error'),\n successMessage: t('api:use-delete-playlist-items.success'),\n onSuccess: async () => {\n if (fetchQueryRef) await queryClient.invalidateQueries([fetchQueryRef]);\n },\n });\n\n const deletePlaylistItems = (playlistItemsIds: string[], onSuccess?: (data: unknown) => void) => {\n mutate({ url: deletePlaylistItemsUrl(playlistId), data: { data: playlistItemsIds } }, { onSuccess });\n };\n\n return { deletePlaylistItems, isLoading, isError };\n};\n","import { MutateOptions } from '@tanstack/react-query';\nimport { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { duplicatePlaylistItemsUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { Playlist } from 'shared/types';\n\nimport { useMutationRequest } from '../../hooks/useMutationRequest';\nimport { transformPlaylist } from '../transformers';\nimport { PlaylistApiResponse } from '../types';\n\nexport const useDuplicatePlaylistItems = (playlistId: string) => {\n const { t } = useTranslation();\n\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n type: HTTPMethod.POST,\n transformer: transformPlaylist,\n errorMessage: t('api:use-duplicate-playlist-items.error'),\n successMessage: t('api:use-duplicate-playlist-items.success'),\n });\n\n const duplicatePlaylistItems = useCallback(\n ({\n playlistItemIds,\n options,\n }: {\n playlistItemIds: string[];\n options?: MutateOptions;\n }) => {\n const url = duplicatePlaylistItemsUrl(playlistId);\n\n return mutate({ url, data: playlistItemIds }, options);\n },\n [mutate, playlistId],\n );\n\n return { duplicatePlaylistItems, isLoading, isError, isSuccess };\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nimport { PLAYLIST_TIMELINE_HEADER_HEIGHT } from '../config/Playlist.config';\n\nexport const ItemsListBulk = styled(Box)(({ theme }) => ({\n height: PLAYLIST_TIMELINE_HEADER_HEIGHT,\n backgroundColor: Colors.shark,\n color: theme.palette.common.white,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: theme.spacing(0.5, 1),\n position: 'absolute',\n top: 0,\n width: '100%',\n}));\n","import { Box, styled } from '@mui/material';\n\nexport const ItemsListContainer = styled(Box)(({ theme }) => ({\n flexGrow: 1,\n padding: theme.spacing(2, 0, 1, 2),\n}));\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='192'%20height='120'%20fill='none'%3e%3cstyle%3e.B{fill-rule:evenodd}.C{fill:%23ceced9}.D{stroke:%23ceced9}.E{fill:%23c4c4c4}%3c/style%3e%3cg%20fill='%23fff'%20class='D'%3e%3crect%20x='56.5'%20y='.5'%20width='135'%20height='95'%20rx='3.5'/%3e%3crect%20x='61.5'%20y='5.5'%20width='125'%20height='85'%20rx='1.5'/%3e%3c/g%3e%3cmask%20id='A'%20maskUnits='userSpaceOnUse'%20x='96'%20y='32'%20width='56'%20height='32'%3e%3cpath%20d='M96%2032h56v32H96z'%20class='E'/%3e%3c/mask%3e%3cg%20mask='url(%23A)'%20class='B%20C'%3e%3cpath%20d='M108.437%2060.5h20.126c4.105-.003%207.433-2.644%207.437-5.903v-.805l.132.106%206.892%205.215c.071.054.147.1.226.138a2.51%202.51%200%20001.083.248v-.001c1.473%200%202.667-1.283%202.667-2.866V39.366c0-.97-.457-1.875-1.214-2.404s-1.711-.61-2.536-.216a1.315%201.315%200%2000-.226.138l-6.892%205.215-.132.106v-.845c-.005-3.235-3.308-5.857-7.385-5.861h-20.178c-4.105.003-7.433%202.644-7.437%205.903v13.194c.004%203.259%203.332%205.899%207.437%205.903z'/%3e%3c/g%3e%3ccircle%20cx='174'%20cy='78'%20r='7'%20class='C'/%3e%3cg%20fill='%23fff'%3e%3cpath%20d='M171.922%2081.818l6-3.818-6-3.818v7.636z'%20class='B'/%3e%3cg%20class='D'%3e%3crect%20x='28.5'%20y='12.5'%20width='135'%20height='95'%20rx='3.5'/%3e%3crect%20x='33.5'%20y='17.5'%20width='125'%20height='85'%20rx='1.5'/%3e%3c/g%3e%3c/g%3e%3cmask%20id='B'%20maskUnits='userSpaceOnUse'%20x='68'%20y='44'%20width='56'%20height='32'%3e%3cpath%20d='M68%2044h56v32H68z'%20class='E'/%3e%3c/mask%3e%3cg%20mask='url(%23B)'%20class='B%20C'%3e%3cpath%20d='M80.438%2072.5h20.126c4.105-.003%207.433-2.644%207.437-5.903v-.805l.132.106%206.892%205.215c.071.054.147.1.226.138a2.51%202.51%200%20001.083.248v-.001c1.473%200%202.667-1.283%202.667-2.866V51.366c0-.97-.457-1.875-1.214-2.404s-1.711-.61-2.536-.216a1.315%201.315%200%2000-.226.138l-6.892%205.215-.132.106v-.845c-.005-3.235-3.308-5.857-7.385-5.861H80.438c-4.106.003-7.433%202.644-7.437%205.903v13.194c.004%203.259%203.332%205.899%207.438%205.903z'/%3e%3c/g%3e%3ccircle%20cx='146'%20cy='90'%20r='7'%20class='C'/%3e%3cg%20fill='%23fff'%3e%3cpath%20d='M143.922%2093.818l6-3.818-6-3.818v7.636z'%20class='B'/%3e%3cg%20class='D'%3e%3crect%20x='.5'%20y='24.5'%20width='135'%20height='95'%20rx='3.5'/%3e%3crect%20x='5.5'%20y='29.5'%20width='125'%20height='85'%20rx='1.5'/%3e%3c/g%3e%3c/g%3e%3cmask%20id='C'%20maskUnits='userSpaceOnUse'%20x='40'%20y='56'%20width='56'%20height='32'%3e%3cpath%20d='M40%2056h56v32H40z'%20class='E'/%3e%3c/mask%3e%3cg%20mask='url(%23C)'%20class='B'%3e%3cpath%20d='M52.438%2084.5h20.125c4.106-.003%207.433-2.644%207.437-5.903v-.805l.132.106%206.892%205.215a1.31%201.31%200%2000.226.138%202.51%202.51%200%20001.084.248v-.001c1.473%200%202.667-1.283%202.667-2.866V63.366c0-.97-.457-1.875-1.214-2.404s-1.711-.61-2.536-.216a1.315%201.315%200%2000-.226.138L80.132%2066.1l-.132.106v-.845c-.005-3.235-3.308-5.857-7.385-5.861H52.438c-4.106.003-7.433%202.644-7.437%205.903v13.194c.004%203.259%203.332%205.899%207.438%205.903z'%20fill='%235440f7'/%3e%3c/g%3e%3ccircle%20cx='118'%20cy='102'%20r='7'%20fill='%23171928'/%3e%3cpath%20d='M115.922%20105.818l6-3.818-6-3.818v7.636z'%20fill='%23fff'%20class='B'/%3e%3c/svg%3e\"","import { styled } from '@mui/material';\n\nexport const PlaylistItemsListEmptyImg = styled('img')({\n width: '72px',\n});\n","import { Stack, Typography } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\nimport { useTranslation } from 'react-i18next';\n\nimport NotFoundImg from 'shared/assets/cameras.svg';\n\nimport { PlaylistItemsListEmptyImg } from './PlaylistItemsListEmptyImg';\n\nexport const PlaylistItemsEmpty = () => {\n const { t } = useTranslation();\n\n return (\n \n \n\n \n {t('playlist-detail:not-found.header')}\n \n {t('playlist-detail:not-found.description')}\n \n \n \n );\n};\n","import { ButtonBase, styled, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport React, { ComponentType } from 'react';\n\nimport { IconSizes, SvgIconProps } from 'shared/components/icons/svg-icon/SvgIcon';\n\nexport const PlaylistBulkButtonBase = styled(ButtonBase)(({ theme }) => ({\n borderRadius: theme.shape.borderRadius,\n display: 'flex',\n flexDirection: 'column',\n padding: theme.spacing(0.5, 1),\n transition: theme.transitions.create(['color']),\n ':disabled': { opacity: 0.8 },\n '&:hover': {\n color: theme.palette.primary.light,\n\n '& svg': {\n fill: theme.palette.primary.light,\n },\n },\n}));\n\ninterface Props {\n onClick: () => void;\n IconComponent: ComponentType;\n iconColor?: SvgIconProps['color'];\n iconSize?: IconSizes;\n label?: string;\n disabled?: boolean;\n}\n\nexport const PlaylistBulkButton = ({\n onClick,\n IconComponent,\n label,\n iconColor,\n iconSize = 'small',\n disabled = false,\n}: Props) => {\n return (\n \n \n {label ? (\n \n {label}\n \n ) : null}\n \n );\n};\n","import { MutateOptions } from '@tanstack/react-query';\nimport { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { postManyPlaylistItem } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { Playlist } from 'shared/types';\n\nimport { transformPlaylist } from '../transformers';\nimport { PlaylistApiResponse, PostNewPlaylistItem } from '../types';\n\ninterface Params {\n successMessage?: string;\n}\n\nexport const useAddManyToPlaylist = ({ successMessage }: Params = {}) => {\n const { t } = useTranslation();\n\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n type: HTTPMethod.POST,\n transformer: transformPlaylist,\n errorMessage: t('api:use-add-many-to-playlist.error'),\n successMessage: successMessage !== undefined ? successMessage : t('api:use-add-many-to-playlist.success'),\n });\n\n const addManyToPlaylist = useCallback(\n ({ items, options }: { items: PostNewPlaylistItem[]; options?: MutateOptions }) => {\n const { playlistId } = items[0];\n const url = postManyPlaylistItem(playlistId);\n\n return mutate({ url, data: items }, options);\n },\n [mutate],\n );\n\n return { addManyToPlaylist, isLoading, isError, isSuccess };\n};\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nexport const useDates = () => {\n const { i18n } = useTranslation();\n\n const parseBackendDateString = useCallback((dateString: string): Date => {\n return new Date(dateString);\n }, []);\n\n const dateToString = useCallback(\n (date: Date | string): string => {\n const options = { year: 'numeric', month: 'short', day: 'numeric' } as Intl.DateTimeFormatOptions;\n\n if (date instanceof Date) {\n return date.toLocaleDateString(i18n.language, options);\n }\n\n return parseBackendDateString(date).toLocaleDateString(i18n.language, options);\n },\n [i18n.language, parseBackendDateString],\n );\n\n const dateAndTimeToString = useCallback(\n (date: Date | string): string => {\n const options = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n } as Intl.DateTimeFormatOptions;\n\n if (date instanceof Date) {\n return date.toLocaleDateString(i18n.language, options);\n }\n\n return parseBackendDateString(date).toLocaleDateString(i18n.language, options);\n },\n [i18n.language, parseBackendDateString],\n );\n\n const dateToTime = useCallback(\n (date: Date | string): string => {\n const options = { hour: 'numeric', minute: 'numeric', second: 'numeric' } as Intl.DateTimeFormatOptions;\n\n if (date instanceof Date) {\n return date.toLocaleTimeString(i18n.language, options);\n }\n\n return parseBackendDateString(date).toLocaleTimeString(i18n.language, options);\n },\n [i18n.language, parseBackendDateString],\n );\n\n const parseDateForApi = useCallback((date: Date): string => {\n return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date\n .getDate()\n .toString()\n .padStart(2, '0')}`;\n }, []);\n\n return { dateToString, dateAndTimeToString, dateToTime, parseBackendDateString, parseDateForApi };\n};\n","export const guid = () => {\n const s4 = () => {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n };\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n};\n","export interface FiltersKeyValuesHash {\n [key: string]: string[];\n}\n\nexport interface FilterOption {\n title: string;\n isApplied?: boolean;\n options?: FilterOptions;\n}\n\nexport interface FilterOptions {\n [key: string]: FilterOption;\n}\n\nexport interface Filter {\n title: string;\n options: FilterOptions;\n}\n\nexport interface FiltersList {\n [key: string]: Filter;\n}\n\nexport enum SortDirection {\n DESC = 'desc',\n ASC = 'asc',\n}\n","import { FiltersList, Playlist, SortDirection } from 'shared/types';\n\nexport enum PlaylistSortOptions {\n UPDATED_AT = 'updatedAt',\n NAME = 'name',\n}\n\nexport enum PlaylistFiltersNames {\n name = 'name',\n competition = 'competition',\n from = 'from',\n to = 'to',\n type = 'type',\n sort = 'sort',\n sortDirection = 'sortDirection',\n}\n\nexport interface PlaylistsFilters {\n [PlaylistFiltersNames.name]: string;\n [PlaylistFiltersNames.competition]: string[];\n [PlaylistFiltersNames.from]: string | null;\n [PlaylistFiltersNames.to]: string | null;\n [PlaylistFiltersNames.type]: string[];\n [PlaylistFiltersNames.sort]: PlaylistSortOptions;\n [PlaylistFiltersNames.sortDirection]: SortDirection;\n}\n\nexport interface PlaylistsWithFiltersPage {\n data: {\n nextCursor: number;\n page: { size: number; totalElements: number; totalPages: number; number: number };\n playlists: Playlist[];\n filters: FiltersList;\n };\n nextCursor: number;\n}\n\nexport interface PlaylistsWithFiltersPageQueryData {\n pages: PlaylistsWithFiltersPage[];\n pageParams: any;\n}\n","import { atomFamily, useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { SortDirection } from 'shared/types/filters/types';\n\nimport { PlaylistsFilters, PlaylistSortOptions } from './types';\n\nexport const INITIAL_PLAYLISTS_FILTERS: PlaylistsFilters = {\n competition: [],\n from: '',\n name: '',\n to: '',\n type: [],\n sort: PlaylistSortOptions.UPDATED_AT,\n sortDirection: SortDirection.DESC,\n};\n\nconst playlistFilters = atomFamily({\n key: 'playlists-filters',\n default: INITIAL_PLAYLISTS_FILTERS,\n});\n\nexport const usePlaylistsFilters = (id: string) => {\n return useRecoilValue(playlistFilters(id));\n};\n\nexport const useSetPlaylistsFilters = (id: string) => {\n return useSetRecoilState(playlistFilters(id));\n};\n","import { Playlist } from 'shared/types';\nimport { FiltersList } from 'shared/types/filters/types';\n\nimport { PlaylistsWithFiltersPage } from './types';\n\nexport const getTotalElementsFromPage = (pages: PlaylistsWithFiltersPage[] | undefined): number => {\n if (!pages || pages.length === 0) return 0;\n\n const lastPage = pages[pages.length - 1];\n\n return lastPage.data.page.totalElements;\n};\n\nexport const getFilters = (pages: PlaylistsWithFiltersPage[] | undefined): FiltersList => {\n if (!pages || pages.length === 0) return {};\n\n const lastPage = pages[pages.length - 1];\n\n return lastPage.data.filters;\n};\n\nexport const getPlaylistItems = (pages: PlaylistsWithFiltersPage[] | undefined): Playlist[] => {\n return pages\n ? pages.reduce((acc: Playlist[], page: any) => {\n return acc.concat(page.data.playlists);\n }, [])\n : [];\n};\n\nconst AUTOCOMPLETE_PAGE_SIZE_INITIAL = 6;\nconst AUTOCOMPLETE_PAGE_SIZE_SEARCH = 10;\n\nexport const getTimelinePlaylistPageSize = (nameParam: string) => {\n if (nameParam) {\n return AUTOCOMPLETE_PAGE_SIZE_SEARCH;\n }\n\n return AUTOCOMPLETE_PAGE_SIZE_INITIAL;\n};\n","import { useInfiniteQuery } from '@tanstack/react-query';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { queryClient } from 'api/config';\nimport { useBackendApi } from 'api/hooks/useBackendApi';\nimport { playlistsWithFiltersUrl } from 'api/routes';\nimport { fetchQueryResponse, HTTPMethod } from 'api/types';\nimport { useDates } from 'shared/hooks/use-dates';\nimport { FiltersList, Playlist, SortDirection } from 'shared/types';\nimport { guid } from 'shared/utils/guid';\n\nimport { INITIAL_PLAYLISTS_FILTERS, usePlaylistsFilters, useSetPlaylistsFilters } from './atoms';\nimport {\n PlaylistFiltersNames,\n PlaylistsFilters,\n PlaylistSortOptions,\n PlaylistsWithFiltersPage,\n PlaylistsWithFiltersPageQueryData,\n} from './types';\nimport { getFilters, getPlaylistItems, getTimelinePlaylistPageSize, getTotalElementsFromPage } from './util';\nimport { transformPlaylists } from '../transformers';\n\nexport type PlaylistsData = {\n fetchNextPage: () => void;\n filters: FiltersList;\n playlists: Playlist[];\n totalElements: number;\n};\n\nexport interface PlaylistsFilterActions {\n setCompetitions: (competition: string[]) => void;\n setDateRange: (from: Date | null, to: Date | null) => void;\n setName: (name: string) => void;\n setTypes: (name: string[]) => void;\n setSort: (sort: PlaylistSortOptions, sortDirection: SortDirection) => void;\n}\n\ninterface useFetchPlaylistInterface extends fetchQueryResponse {\n fetchNextPage: () => void;\n filterActions: PlaylistsFilterActions;\n setPageSizeParam: (pageSize: number) => void;\n appliedFilters: PlaylistsFilters;\n}\n\nconst PAGE_SIZE = 8;\n\nconst NAME_SEARCH_LENGTH_LIMIT = 2;\nexport const FETCH_PLAYLIST_QUERY_KEY = 'fetchPlaylists';\n\nexport const invalidatePlaylistsQuery = () => queryClient.invalidateQueries([FETCH_PLAYLIST_QUERY_KEY]);\n\ninterface Options {\n enabled?: boolean;\n initialFilters?: PlaylistsFilters;\n isAutocomplete?: boolean;\n refetchInterval?: number | false;\n playlistId?: string;\n}\n\nconst usePlaylists = ({\n initialFilters = INITIAL_PLAYLISTS_FILTERS,\n refetchInterval = 60000,\n enabled = true,\n isAutocomplete = false,\n playlistId = guid(),\n}: Options): useFetchPlaylistInterface => {\n const { parseDateForApi } = useDates();\n const appliedFilters = usePlaylistsFilters(playlistId);\n const setFilters = useSetPlaylistsFilters(playlistId);\n\n useEffect(() => {\n setFilters(initialFilters);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [pageSizeParam, setPageSizeParam] = useState(\n isAutocomplete ? getTimelinePlaylistPageSize(appliedFilters['name']) : PAGE_SIZE,\n );\n\n const queryRef = useMemo(\n () => [FETCH_PLAYLIST_QUERY_KEY, pageSizeParam, appliedFilters],\n [pageSizeParam, appliedFilters],\n );\n\n const fetchRequest = useInfiniteQuery(\n queryRef,\n (options) => {\n return useBackendApi(\n playlistsWithFiltersUrl({\n size: pageSizeParam,\n sort: `${appliedFilters.sort},${appliedFilters.sortDirection}`,\n page: options.pageParam,\n name: appliedFilters[PlaylistFiltersNames.name],\n competition: appliedFilters[PlaylistFiltersNames.competition],\n from: appliedFilters[PlaylistFiltersNames.from] ?? undefined,\n to: appliedFilters[PlaylistFiltersNames.to] ?? undefined,\n type: appliedFilters[PlaylistFiltersNames.type] ?? undefined,\n }),\n HTTPMethod.GET,\n transformPlaylists,\n );\n },\n {\n getNextPageParam: (lastPage: PlaylistsWithFiltersPage) => {\n return lastPage.nextCursor;\n },\n refetchInterval,\n enabled,\n staleTime: 200,\n },\n );\n\n const setQueryData = (data: any) => queryClient.setQueryData(queryRef, data);\n const invalidateQuery = () => queryClient.invalidateQueries(queryRef);\n\n const setName = useCallback(\n (name: PlaylistsFilters[PlaylistFiltersNames.name]) => {\n name.length >= NAME_SEARCH_LENGTH_LIMIT\n ? setFilters({ ...appliedFilters, name })\n : setFilters({ ...appliedFilters, name: '' });\n },\n [setFilters, appliedFilters],\n );\n\n const setTypes = useCallback(\n (type: PlaylistsFilters[PlaylistFiltersNames.type]) => {\n setFilters({ ...appliedFilters, type });\n },\n [setFilters, appliedFilters],\n );\n\n const setCompetitions = useCallback(\n (competition: PlaylistsFilters[PlaylistFiltersNames.competition]) => {\n setFilters({ ...appliedFilters, competition });\n },\n [setFilters, appliedFilters],\n );\n\n const setDateRange = useCallback(\n (from: Date | null, to: Date | null) => {\n setFilters({ ...appliedFilters, from: from ? parseDateForApi(from) : null, to: to ? parseDateForApi(to) : null });\n },\n [parseDateForApi, setFilters, appliedFilters],\n );\n\n const setSort = useCallback(\n (sort: PlaylistSortOptions, sortDirection: SortDirection) => {\n setFilters({ ...appliedFilters, sort, sortDirection });\n },\n [setFilters, appliedFilters],\n );\n\n const filterActions = useMemo(\n () => ({ setCompetitions, setDateRange, setName, setTypes, setSort }),\n [setCompetitions, setDateRange, setName, setTypes, setSort],\n );\n\n const data = useMemo(\n () => ({\n playlists: getPlaylistItems(fetchRequest?.data?.pages),\n totalElements: getTotalElementsFromPage(fetchRequest?.data?.pages),\n fetchNextPage: fetchRequest?.fetchNextPage,\n filters: getFilters(fetchRequest?.data?.pages),\n }),\n [fetchRequest?.data?.pages, fetchRequest?.fetchNextPage],\n );\n\n return {\n ...fetchRequest,\n data,\n setQueryData,\n appliedFilters,\n filterActions,\n invalidateQuery,\n setPageSizeParam,\n };\n};\n\nconst removePlaylistItemFromList = async (playlistId: string) => {\n queryClient.setQueryData([FETCH_PLAYLIST_QUERY_KEY], (data) => {\n if (!data) return;\n\n return {\n pages: data.pages.map((page: PlaylistsWithFiltersPage) => {\n return {\n ...page,\n data: {\n ...page.data,\n playlists: page.data.playlists.filter((playlist: Playlist) => playlist.id !== playlistId),\n },\n };\n }),\n pageParams: data.pageParams,\n };\n });\n\n await queryClient.invalidateQueries([FETCH_PLAYLIST_QUERY_KEY]);\n};\n\nexport { usePlaylists, removePlaylistItemFromList };\n","import { styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport { Link } from 'react-router-dom';\n\nexport const NotificationLink = styled(Link)(({ theme }) => ({\n marginLeft: theme.spacing(0.5),\n marginRight: theme.spacing(0.5),\n color: theme.palette.common.white,\n '&::after': {\n backgroundColor: theme.palette.common.white,\n },\n '&:focus': {\n //TODO use theme color\n color: Colors.ghost,\n },\n '&:hover': {\n //TODO use theme color\n color: Colors.ghost,\n },\n}));\n","import { useCallback } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { generatePath } from 'react-router-dom';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { playlistsUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { routes } from 'kognia/router/routes';\nimport { NotificationLink } from 'shared/components/NotificationLink';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\nimport { Playlist } from 'shared/types/playlist/types';\n\nimport { transformPlaylist } from '../transformers';\nimport { PlaylistApiResponse, PostNewPlaylist } from '../types';\n\nexport const generateFetchPlaylistsQueryRef = (recordingId: string) => [`fetchPlaylists-recordingId:${recordingId}`];\n\nexport const useCreatePlaylist = () => {\n const triggerNotification = useNotifications();\n const { t } = useTranslation();\n\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n type: HTTPMethod.POST,\n errorMessage: t('api:use-add-playlist.error'),\n transformer: transformPlaylist,\n });\n\n const handleAddToPlaylistSuccess = useCallback(\n (playlist: Playlist) => {\n const translation = (\n \n ),\n }}\n values={{ playlistName: playlist.name }}\n />\n );\n\n triggerNotification({\n type: NotificationType.SUCCESS,\n message: translation,\n });\n },\n [triggerNotification],\n );\n\n const createPlaylist = ({\n data,\n onSuccess = () => {},\n }: {\n data: PostNewPlaylist;\n onSuccess?: (res: Playlist) => void;\n }) => {\n mutate(\n { url: playlistsUrl, data },\n {\n onSuccess: (res: Playlist) => {\n onSuccess && onSuccess(res);\n handleAddToPlaylistSuccess(res);\n },\n },\n );\n };\n\n return { createPlaylist, isLoading, isError, isSuccess };\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconAddFolder = (props: Omit): JSX.Element => {\n return (\n \n \n \n \n \n );\n};\n\nexport default IconAddFolder;\n","import { Button, MenuItem, TextField } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useCreatePlaylist } from 'api/playlist/useCreatePlaylist';\nimport { invalidatePlaylistsQuery } from 'api/playlist/useFetchPlaylists';\nimport IconAddFolder from 'shared/components/icons/icon-add-folder';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\n\nimport styles from './MenuItemNewPlaylist.module.scss';\n\nconst MenuItemNewPlaylist = () => {\n const { t } = useTranslation();\n const [showForm, setShowForm] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const triggerNotification = useNotifications();\n const { createPlaylist } = useCreatePlaylist();\n\n const handleSubmit = useCallback(\n (event: React.FormEvent) => {\n event.preventDefault();\n if (!inputValue.trim()) {\n return triggerNotification({\n type: NotificationType.ERROR,\n message: t('playlists:forms.add-a-name-for-the-playlist'),\n });\n }\n\n createPlaylist({ data: { name: inputValue as string }, onSuccess: invalidatePlaylistsQuery });\n setInputValue('');\n setShowForm(false);\n },\n [createPlaylist, inputValue, t, triggerNotification],\n );\n\n const handleInputChange = useCallback((event: React.ChangeEvent) => {\n setInputValue(event.target.value);\n }, []);\n\n return (\n <>\n {!showForm && (\n ({\n padding: spacing(1, 3),\n // TODO use from theme\n borderTop: `1px solid ${Colors.ghost}`,\n fontSize: fontSizes.default,\n lineHeight: 1.77,\n\n '& svg': {\n marginRight: spacing(1),\n },\n })}\n onClick={(event) => {\n event.stopPropagation();\n setShowForm(true);\n }}\n >\n {t('playlists:forms.new-playlist')}\n \n )}\n\n {showForm && (\n
event.stopPropagation()} className={styles.formContainer}>\n
\n
\n {' '}\n \n
\n
\n \n
\n
\n
\n )}\n \n );\n};\n\nexport default MenuItemNewPlaylist;\n","import makeStyles from '@mui/styles/makeStyles';\nimport { Colors } from 'kognia-ui';\n\nexport const useAutocompleteStyles = makeStyles(() => ({\n root: {\n minHeight: '40px',\n },\n inputRoot: {\n paddingRight: `8px !important`,\n },\n endAdornment: {\n position: 'absolute',\n top: `calc(50% - 16px})`,\n },\n option: {\n padding: '0 !important',\n transition: 'all 0.2s ease-out',\n // Hover\n '&[data-focus=\"true\"]': {\n backgroundColor: Colors.athens,\n },\n // Selected\n '&[aria-selected=\"true\"]': {\n backgroundColor: 'transparent',\n '&:hover': {\n backgroundColor: Colors.athens,\n },\n },\n },\n}));\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconSearch = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\nexport default IconSearch;\n","import { AutocompleteChangeReason, AutocompleteCloseReason } from '@mui/base';\nimport {\n Autocomplete as AutocompleteMUI,\n AutocompleteRenderInputParams,\n PopperProps,\n Stack,\n TextField,\n} from '@mui/material';\nimport { AutocompleteRenderOptionState } from '@mui/material/Autocomplete/Autocomplete';\nimport { AutocompleteGetTagProps, AutocompleteValue } from '@mui/material/useAutocomplete';\nimport debounce from 'lodash/debounce';\nimport React, { KeyboardEventHandler, useCallback, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useAutocompleteStyles } from './styles';\nimport { guid } from '../../utils/guid';\nimport IconClose from '../icons/icon-close';\nimport IconSearch from '../icons/icon-search';\nimport Spinner from '../spinner';\n\nexport type UpdateAutocompleteValue = (item: T) => void;\n\ninterface Props {\n autoFocus?: boolean;\n PaperComponent?: React.JSXElementConstructor>;\n PopperComponent?: React.JSXElementConstructor;\n fetchNextPage: () => void;\n getItemLabel: (item: TItem) => string;\n getOptionDisabled?: (item: TItem) => boolean;\n isOptionEqualToValue?: (option: TItem, value: TItem) => boolean;\n inputWidth?: number | string;\n isLoading: boolean;\n className?: string;\n listWidth?: number;\n inputValue?: string;\n useInputChange?: boolean;\n multiple?: Multiple;\n onChange: (searchTerm: string) => void;\n open?: boolean | undefined;\n options: TItem[];\n onClose?: (event: React.SyntheticEvent, reason: AutocompleteCloseReason) => void;\n onSearchTermChange?: (name: string) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onSubmit?: () => void;\n onKeyUp?: (key: string) => void;\n placeholder?: string;\n autoHighlight?: boolean;\n renderOption: (\n props: React.HTMLAttributes,\n item: TItem,\n state: AutocompleteRenderOptionState,\n ) => JSX.Element;\n renderTags?: (value: TItem[], getTagProps: AutocompleteGetTagProps) => React.ReactNode;\n resultsHeight?: number | string;\n debounceTime?: number;\n resultsNoMatches?: string | React.ReactNode;\n updateValue: (\n item: AutocompleteValue,\n reason: AutocompleteChangeReason,\n ) => void;\n value?: AutocompleteValue | undefined;\n}\n\nconst specialKeysCodes = [\n 'Alt',\n 'ArrowDown',\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'CapsLock',\n 'Control',\n 'End',\n 'Enter',\n 'Escape',\n 'Home',\n 'Insert',\n 'PageDown',\n 'PageUp',\n 'Pause',\n 'PrintScreen',\n 'Shift',\n 'Tab',\n];\n\nconst DEFAULT_RESULTS_HEIGHT = 100;\nconst DEFAULT_INPUT_WIDTH = 400;\nconst DEFAULT_LIST_WIDTH = 400;\nconst CONTAINER_PADDING = 4;\nconst DEBOUNCE_TIME = 300;\n\nexport const Autocomplete = ({\n autoFocus = false,\n getItemLabel,\n getOptionDisabled,\n inputWidth = DEFAULT_INPUT_WIDTH,\n listWidth = DEFAULT_LIST_WIDTH,\n multiple,\n className = '',\n placeholder = '',\n renderOption,\n renderTags,\n resultsHeight = DEFAULT_RESULTS_HEIGHT,\n resultsNoMatches,\n updateValue,\n inputValue,\n open = undefined,\n PopperComponent,\n autoHighlight = true,\n PaperComponent,\n isOptionEqualToValue,\n useInputChange,\n options,\n value,\n onBlur,\n onChange,\n onClose,\n onKeyUp,\n onSubmit,\n onSearchTermChange,\n onFocus,\n isLoading,\n fetchNextPage,\n}: Props) => {\n const [autocompleteKey, setAutocompleteKey] = React.useState(guid());\n const autocompleteClasses = useAutocompleteStyles();\n const { t } = useTranslation();\n\n const loadNextPageOnScrollEnd = useCallback(\n async (event: React.UIEvent | React.KeyboardEvent) => {\n const target = event.currentTarget;\n const isScrollBottom = target.offsetHeight + target.scrollTop + CONTAINER_PADDING >= target.scrollHeight;\n\n if (isScrollBottom) {\n await fetchNextPage();\n }\n },\n [fetchNextPage],\n );\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleOnChange = useCallback(\n debounce(async (searchTerm: string) => {\n onChange(searchTerm);\n }, DEBOUNCE_TIME),\n [DEBOUNCE_TIME, onChange],\n );\n\n const handleOnKeyUp: KeyboardEventHandler = useCallback(\n (event) => {\n if (specialKeysCodes.includes(event.key)) return;\n\n onKeyUp && onKeyUp(event.key);\n const target = event.target as HTMLInputElement;\n if (!(target.value.length === 1)) {\n handleOnChange(target.value);\n }\n },\n [onKeyUp, handleOnChange],\n );\n\n const handleOnKeyDown: KeyboardEventHandler = useCallback(\n (event) => {\n if (event.key !== 'Enter' || !onSubmit) return;\n\n event.preventDefault();\n onBlur && onBlur();\n onSubmit();\n },\n [onBlur, onSubmit],\n );\n\n const renderInput = useCallback(\n (params: AutocompleteRenderInputParams) => {\n return (\n ) => {\n onChange && onChange('');\n onSearchTermChange && onSearchTermChange('');\n setAutocompleteKey(guid());\n event.preventDefault();\n event.stopPropagation();\n }}\n isButton\n size='small'\n color='secondary'\n />\n ) : (\n \n ),\n }}\n placeholder={inputValue ? inputValue : placeholder}\n size='small'\n sx={{ paddingTop: 0.25, paddingBottom: 0.25, marginBottom: 0 }}\n variant='outlined'\n onClick={(event) => event.stopPropagation()}\n onMouseEnter={(event) => event.stopPropagation()}\n onMouseDown={(event) => event.stopPropagation()}\n onFocus={(event) => {\n event.stopPropagation();\n onFocus && onFocus();\n }}\n />\n );\n },\n [autoFocus, onChange, inputValue, onSearchTermChange, onFocus, placeholder],\n );\n\n const style = useMemo(() => ({ width: inputWidth }), [inputWidth]);\n\n const listProps = useMemo(\n () => ({\n style: {\n maxHeight: resultsHeight,\n padding: 0,\n maxWidth: listWidth,\n },\n onScroll: loadNextPageOnScrollEnd,\n role: 'list-box',\n }),\n [listWidth, resultsHeight, loadNextPageOnScrollEnd],\n );\n\n const handleAutocompleteOnChange = useCallback(\n (\n event: React.SyntheticEvent,\n newValue: AutocompleteValue,\n reason: AutocompleteChangeReason,\n ) => {\n event.stopPropagation();\n updateValue(newValue, reason);\n },\n [updateValue],\n );\n\n const handleInputChange = useCallback(\n (event: React.SyntheticEvent, newValue: string) => {\n event.stopPropagation();\n onChange(newValue);\n },\n [onChange],\n );\n\n return (\n options}\n noOptionsText={resultsNoMatches !== undefined ? resultsNoMatches : t('common:no-results')}\n onInputChange={useInputChange ? handleInputChange : undefined}\n onChange={handleAutocompleteOnChange}\n className={className}\n autoSelect={false}\n renderTags={renderTags}\n ListboxProps={listProps}\n getOptionLabel={getItemLabel}\n getOptionDisabled={getOptionDisabled}\n loading={isLoading}\n onClose={onClose}\n onFocus={onFocus}\n onBlur={onBlur}\n loadingText={\n \n \n \n }\n renderInput={renderInput}\n renderOption={renderOption}\n style={style}\n open={open}\n PopperComponent={PopperComponent}\n PaperComponent={PaperComponent}\n />\n );\n};\n","import { Card } from '@mui/material';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport styles from './PlaylistResults.module.scss';\n\ninterface ResultsWrapperProps {\n children?: React.ReactNode;\n showSearchResults?: boolean;\n open: boolean;\n title?: string;\n}\n\nexport const SearchPlaylistResults = (props: ResultsWrapperProps) => {\n const { t } = useTranslation();\n\n if (!open) return null;\n\n return (\n
\n {props.showSearchResults && (\n
{props.title ? props.title : t('timeline:latest-playlists')}
\n )}\n
{props.children}
\n
\n );\n};\n\nexport const SearchPlaylistResultsPopOver = (props: ResultsWrapperProps) => {\n const { t } = useTranslation();\n\n if (!open) return null;\n\n return (\n \n {props.showSearchResults && (\n
{props.title ? props.title : t('timeline:latest-playlists')}
\n )}\n
{props.children}
\n
\n );\n};\n","import { AutocompleteChangeReason, AutocompleteCloseReason } from '@mui/base';\nimport { Box, ListItem, PopperProps, styled } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\nimport debounce from 'lodash/debounce';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { usePlaylists } from 'api/playlist/useFetchPlaylists';\n\nimport { usePlaylistsFilters } from '../../../api/playlist/useFetchPlaylists/atoms';\nimport { Playlist } from '../../types';\nimport { Autocomplete } from '../autocomplete';\nimport { SearchPlaylistResults, SearchPlaylistResultsPopOver } from '../search-playlist-results';\n\nconst PopperWrapper: React.JSXElementConstructor = ({ children, open }) => {\n if (!open) return null;\n return
{children as React.ReactNode}
;\n};\n\nconst SearchItemClipsCount = styled('span')(({ theme }) => ({\n marginLeft: theme.spacing(1),\n marginRight: theme.spacing(0.5),\n fontSize: fontSizes.default,\n color: Colors.storm,\n}));\n\ninterface Props {\n playlistId: string;\n className?: string;\n onUpdateValue?: (playlist: Playlist | null, name: string, reason: AutocompleteChangeReason) => void;\n onClickElement?: (item: Playlist) => void;\n onClose?: (event: React.SyntheticEvent, reason: AutocompleteCloseReason) => void;\n onFocus?: () => void;\n onSearchTermChange?: (name: string) => void;\n onKeyDown?: (key: string) => void;\n onSubmit?: (name?: string) => void;\n onBlur?: (name?: string) => void;\n open?: boolean;\n showResultsInPopOver?: boolean;\n title?: string;\n}\n\nconst DEBOUNCE_TIME = 300;\n\nexport const SearchPlaylistAutocomplete = ({\n playlistId,\n onUpdateValue,\n className,\n onFocus,\n onBlur,\n onSearchTermChange,\n onSubmit,\n onKeyDown,\n onClickElement,\n open = false,\n title,\n showResultsInPopOver = false,\n}: Props) => {\n const filters = usePlaylistsFilters(playlistId);\n const [searchTerm, setSearchTerm] = React.useState(filters.name);\n const { t } = useTranslation();\n const [isActive, setIsActive] = useState(false);\n const { data, isLoading, appliedFilters, filterActions, fetchNextPage } = usePlaylists({\n playlistId,\n refetchInterval: false,\n isAutocomplete: true,\n });\n\n useEffect(() => {\n setSearchTerm(filters.name);\n }, [filters.name]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleTermChange = useCallback(\n debounce((name: string) => {\n setSearchTerm(name);\n filterActions.setName(name);\n }, DEBOUNCE_TIME),\n [filterActions.setName],\n );\n\n const handleOnFocus = useCallback(() => {\n onFocus && onFocus();\n setIsActive(true);\n }, [onFocus]);\n\n const handleOnBlur = useCallback(() => {\n onBlur && onBlur(appliedFilters.name);\n setIsActive(false);\n }, [appliedFilters.name, onBlur]);\n\n const handleOnClose = useCallback(() => {\n setIsActive(false);\n }, []);\n\n const handleOnSubmit = useCallback(() => {\n onSubmit && onSubmit(appliedFilters.name);\n setIsActive(false);\n }, [appliedFilters.name, onSubmit]);\n\n const handleOnKeyUp = useCallback(\n (key: string) => {\n onKeyDown && onKeyDown(key);\n setIsActive(true);\n },\n [onKeyDown],\n );\n\n const isOpen = open || isActive;\n\n const PlaylistResultsComponent = useCallback(\n (props: any) => (\n \n ),\n [appliedFilters.name, isOpen, title],\n );\n\n const PlaylistResultsPopOverComponent = useCallback(\n (props: any) => (\n \n ),\n [appliedFilters.name, isOpen, title],\n );\n\n const renderOption = useCallback((props: React.ComponentProps, item: Playlist) => {\n return (\n \n \n {item.name} {item.playlistItems.length}\n \n \n );\n }, []);\n\n const handleUpdateValue = useCallback(\n (playlist: Playlist | Playlist[] | null, reason: AutocompleteChangeReason) => {\n if (Array.isArray(playlist)) return;\n\n if (reason === 'selectOption') {\n onClickElement && playlist && onClickElement(playlist);\n }\n\n onUpdateValue && onUpdateValue(playlist, appliedFilters.name, reason);\n },\n [appliedFilters.name, onClickElement, onUpdateValue],\n );\n\n return (\n item.name}\n inputValue={searchTerm}\n inputWidth='100%'\n isLoading={isLoading}\n onBlur={handleOnBlur}\n onChange={handleTermChange}\n onClose={handleOnClose}\n onFocus={handleOnFocus}\n onKeyUp={handleOnKeyUp}\n onSearchTermChange={onSearchTermChange}\n onSubmit={handleOnSubmit}\n open={open}\n options={data.playlists}\n placeholder={t('common:actions.search')}\n renderOption={renderOption}\n resultsHeight={288}\n updateValue={handleUpdateValue}\n useInputChange\n />\n );\n};\n","import { AutocompleteChangeReason } from '@mui/base';\nimport { Box, Popover, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React from 'react';\n\nimport MenuItemNewPlaylist from './menu-item-new-playlist/MenuItemNewPlaylist';\nimport { Playlist } from '../../types';\nimport { SearchPlaylistAutocomplete } from '../search-playlist-autocomplete';\n\nexport enum PlaylistMenuVerticalPosition {\n Top = 'top',\n Bottom = 'bottom',\n Center = 'center',\n}\n\nexport enum PlaylistMenuHorizontalPosition {\n Left = 'left',\n Right = 'right',\n Center = 'center',\n}\n\ninterface Props {\n anchorEl: HTMLElement | null;\n onClose?: (event: React.MouseEvent) => void;\n onPopoverClose?: (event: React.MouseEvent) => void;\n onClickItem?: (playlist: Playlist | null, name: string, reason: AutocompleteChangeReason) => void;\n verticalPosition?: PlaylistMenuVerticalPosition;\n horizontalPosition?: PlaylistMenuHorizontalPosition;\n}\n\nconst AutoCompleteWrapper = styled(Box)(({ theme }) => ({\n backgroundColor: Colors.white,\n padding: theme.spacing(3),\n width: '385px',\n}));\n\nconst PLAYLIST_ID = 'search-playlist-dialog';\n\nexport const SelectPlaylistDialog = ({\n anchorEl,\n onClose = () => {},\n onPopoverClose,\n onClickItem = () => {},\n verticalPosition = PlaylistMenuVerticalPosition.Bottom,\n horizontalPosition = PlaylistMenuHorizontalPosition.Left,\n}: Props) => {\n const openPopover = Boolean(anchorEl);\n\n return (\n \n \n \n \n \n \n );\n};\n","import React, { useCallback } from 'react';\nimport { Trans } from 'react-i18next';\nimport { generatePath } from 'react-router-dom';\n\nimport { useAddManyToPlaylist } from 'api/playlist/useAddManyToPlaylist';\nimport { usePlaylists } from 'api/playlist/useFetchPlaylists';\nimport { routes } from 'kognia/router/routes';\nimport { NotificationLink } from 'shared/components/NotificationLink';\nimport {\n PlaylistMenuHorizontalPosition,\n PlaylistMenuVerticalPosition,\n SelectPlaylistDialog,\n} from 'shared/components/select-playlist-dialog/SelectPlaylistDialog';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\nimport { FundamentalsSelection, Playlist } from 'shared/types/index';\n\nimport { PostNewPlaylistItem } from '../../api/playlist/types';\n\nexport interface CopyToPlaylistItemDetails {\n endTime: number;\n name: string;\n startTime: number;\n recordingId: string;\n fundamentalsSelected: FundamentalsSelection;\n}\n\ninterface Props {\n anchorEl: HTMLElement | null;\n onClose: () => void;\n onSettled?: () => void;\n playlistItems: CopyToPlaylistItemDetails[];\n}\n\nexport const CopyToDialog = ({ anchorEl, playlistItems, onClose, onSettled }: Props) => {\n const { addManyToPlaylist } = useAddManyToPlaylist({ successMessage: '' });\n const { invalidateQuery } = usePlaylists({ refetchInterval: false, enabled: false });\n const triggerNotification = useNotifications();\n\n const handleAddToPlaylistSuccess = useCallback(\n (playlist: Playlist) => {\n const translation = (\n \n ),\n }}\n values={{ playlistName: playlist.name }}\n />\n );\n\n triggerNotification({\n type: NotificationType.SUCCESS,\n message: translation,\n });\n },\n [triggerNotification],\n );\n\n const handleAddToPlaylistSettle = useCallback(() => {\n invalidateQuery && invalidateQuery();\n onSettled && onSettled();\n onClose();\n }, [invalidateQuery, onClose, onSettled]);\n\n const handleCopyToPlaylist = useCallback(\n (playlist: Playlist | null) => {\n if (playlist === null) return;\n\n const data: PostNewPlaylistItem[] = playlistItems.map((item) => {\n return {\n startTime: item.startTime,\n endTime: item.endTime,\n playlistId: playlist.id,\n name: item.name,\n recordingId: item.recordingId ?? '',\n fundamentalsSelected: item.fundamentalsSelected,\n };\n });\n\n addManyToPlaylist({\n items: data,\n options: {\n onSuccess: handleAddToPlaylistSuccess,\n onSettled: handleAddToPlaylistSettle,\n },\n });\n },\n [addManyToPlaylist, handleAddToPlaylistSettle, handleAddToPlaylistSuccess, playlistItems],\n );\n\n return (\n \n );\n};\n","import { Playlist } from 'shared/types/index';\n\nimport { CopyToDialog } from './CopyToDialog';\n\ntype Props = {\n anchor: HTMLElement | null;\n onClose: () => void;\n playlist: Playlist;\n selectedItems: string[];\n};\n\nexport const SelectedItemsCopyToDialog = ({ playlist, selectedItems, onClose, anchor }: Props) => {\n return (\n {\n const playlistItem = playlist.playlistItems.find((item) => item.id === id);\n\n return {\n startTime: playlistItem?.startTime ?? 0,\n endTime: playlistItem?.endTime ?? 0,\n name: playlistItem?.name ?? '',\n recordingId: playlistItem?.recordingId ?? '',\n fundamentalsSelected: playlistItem?.fundamentalsSelected ?? {\n tacticalAnalysisId: undefined,\n fundamentalsSelected: [],\n },\n };\n })}\n onClose={onClose}\n anchorEl={anchor}\n />\n );\n};\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { updatePlaylistItemUrl } from 'api/routes';\nimport { useVideoPlayerId } from 'shared/components/video-player/hooks';\nimport { usePlayerSetPlaylist } from 'shared/components/video-player/state/atoms/hooks';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\n\nimport { useMutationRequest } from '../../hooks/useMutationRequest';\nimport { HTTPMethod } from '../../types';\nimport { transformPlaylist } from '../transformers';\n\nconst moveTo = function (arrayToReorder: T[], from: number, to: number) {\n const reorderedArray = [...arrayToReorder];\n reorderedArray.splice(to, 0, reorderedArray.splice(from, 1)[0]);\n\n return reorderedArray;\n};\n\nexport const useUpdatePlaylistItemOrder = (playlistId: string) => {\n const { t } = useTranslation();\n const playerId = useVideoPlayerId();\n const setPlaylist = usePlayerSetPlaylist(playerId);\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n type: HTTPMethod.PATCH,\n transformer: transformPlaylist,\n errorMessage: t('api:use-update-playlist-item-order.error'),\n });\n\n const updatePlaylistItemOrder = useCallback(\n (playlistItemId: string, newIndex: number) => {\n //Optimistic update of the reordered playlist\n setPlaylist((playlist) => {\n const playlistItemIndex = playlist.playlistItems.findIndex(\n (playlistItem) => playlistItem.id === playlistItemId,\n );\n const playlistItems = [...playlist.playlistItems];\n\n const reorderedItems = moveTo(playlistItems, playlistItemIndex, newIndex);\n return { ...playlist, playlistItems: reorderedItems };\n });\n mutate({ url: updatePlaylistItemUrl(playlistId, playlistItemId), data: { index: newIndex } });\n },\n [setPlaylist, mutate, playlistId],\n );\n\n return { updatePlaylistItemOrder, isLoading, isError, isSuccess };\n};\n","import { useCallback } from 'react';\n\nimport { useBulkSelectedItems, useSetBulkSelectedItems } from 'entities/playlist/hooks/useBulkSelectedItems';\n\nexport const useHandleSelect = (playlistId: string) => {\n const selectedItems = useBulkSelectedItems(playlistId);\n const setSelectedItems = useSetBulkSelectedItems(playlistId);\n\n return useCallback(\n (value: string) => {\n if (!selectedItems.includes(value)) {\n return setSelectedItems([...selectedItems, value]);\n }\n\n const filteredItems = selectedItems.filter((item) => item !== value);\n\n return setSelectedItems(filteredItems);\n },\n [setSelectedItems, selectedItems],\n );\n};\n","import { CSSProperties, forwardRef } from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { FixedSizeList as List } from 'react-window';\n\nimport { PlaylistItemType } from 'shared/components/video-player/types';\n\nimport { PLAYLIST_ITEM_FULL_WIDTH, PLAYLIST_ITEM_HEIGHT } from '../../entities/playlist/config/Playlist.config';\n\nexport type RowProps = {\n data: PlaylistItemType[];\n index: number;\n style: CSSProperties;\n};\n\ntype Props = {\n playlistItems: PlaylistItemType[];\n Row: React.FC;\n};\n\nexport const PlaylistItemsList = forwardRef(({ playlistItems, Row }: Props, ref: any) => {\n return (\n \n {({ height, width }) => (\n data[index].id}\n >\n {Row}\n \n )}\n \n );\n});\n\nPlaylistItemsList.displayName = 'PlaylistItemsList';\n","import { useTranslation } from 'react-i18next';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { invalidatePlaylistQuery } from 'api/playlist/usePlaylist';\nimport { deletePlaylistItemUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\n\nimport { invalidatePlaylistsQuery } from '../useFetchPlaylists';\n\nexport const useDeletePlaylistItem = (playlistId: string) => {\n const { t } = useTranslation();\n const { mutate, isLoading, isError } = useMutationRequest({\n type: HTTPMethod.DELETE,\n errorMessage: t('api:use-delete-playlist-item.error'),\n successMessage: t('api:use-delete-playlist-item.success'),\n });\n\n const deletePlaylistItem = (playlistItemId: string, onSuccess?: () => void) => {\n mutate(\n { url: deletePlaylistItemUrl(playlistId, playlistItemId) },\n {\n onSuccess: () => {\n invalidatePlaylistQuery();\n invalidatePlaylistsQuery();\n if (onSuccess) onSuccess();\n },\n },\n );\n };\n\n return { deletePlaylistItem, isLoading, isError };\n};\n","import { useTranslation } from 'react-i18next';\n\nimport { updatePlaylistItemUrl } from 'api/routes';\nimport { Playlist } from 'shared/types';\n\nimport { useMutationRequest } from '../../hooks/useMutationRequest';\nimport { HTTPMethod } from '../../types';\nimport { transformPlaylist } from '../transformers';\nimport { PlaylistApiResponse, UpdateParams } from '../types';\n\nexport const useUpdatePlaylistItem = (playlistId: string, onSuccess?: (playlist: Playlist) => void) => {\n const { t } = useTranslation();\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n transformer: transformPlaylist,\n type: HTTPMethod.PATCH,\n errorMessage: t('api:use-update-playlist-item.error'),\n onSuccess: async (playlist: Playlist) => {\n onSuccess && onSuccess(playlist);\n },\n });\n\n const updatePlaylistItem = (\n playlistItemId: string,\n values: UpdateParams,\n onSuccess?: (playlist: Playlist) => void,\n ) => {\n mutate({ url: updatePlaylistItemUrl(playlistId, playlistItemId), data: values }, { onSuccess });\n };\n\n return { updatePlaylistItem, isLoading, isError, isSuccess };\n};\n","import { useCallback } from 'react';\n\nimport { useVideoPlayerActions, useVideoPlayerId } from 'shared/components/video-player/hooks';\nimport { useSetCurrentTime } from 'shared/components/video-player/state/atoms/hooks';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\n\nexport const useHandleSetPlaylistItem = (playlistItem: PlaylistItemType) => {\n const playerId = useVideoPlayerId();\n const actions = useVideoPlayerActions();\n const setCurrentTime = useSetCurrentTime(playerId);\n\n return useCallback(\n (autoPlay = true) => {\n setCurrentTime(0);\n actions.setPlaylistItem(playlistItem.id, autoPlay);\n },\n [setCurrentTime, actions, playlistItem.id],\n );\n};\n","import { useCallback } from 'react';\n\nimport { useIsBulkModeActive } from 'entities/playlist/hooks/useIsBulkModeActive';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\n\nimport { useHandleSelect } from './useHandleSelect';\nimport { useHandleSetPlaylistItem } from './useHandleSetPlaylistItem';\n\nexport const useHandlePlaylistItemClick = (playlistItem: PlaylistItemType, playlistId: string) => {\n const handleSelectItem = useHandleSelect(playlistId);\n const enabledBulkMode = useIsBulkModeActive(playlistId);\n const handleSetPlaylistItem = useHandleSetPlaylistItem(playlistItem);\n\n return useCallback(\n (event?: React.MouseEvent) => {\n event && event.stopPropagation();\n if (enabledBulkMode) {\n return handleSelectItem(playlistItem.id);\n }\n\n return handleSetPlaylistItem(true);\n },\n [enabledBulkMode, handleSetPlaylistItem, handleSelectItem, playlistItem.id],\n );\n};\n","import { Stack, styled } from '@mui/material';\nimport { boxShadows, Colors } from 'kognia-ui';\n\nimport { PLAYLIST_ITEM_HEIGHT } from '../config/Playlist.config';\n\ninterface PlaylistItemWrapperProps {\n isCurrent: boolean;\n isDeleting?: boolean;\n isEditing: boolean;\n isDisabled: boolean;\n isDraggable: boolean;\n}\n\nexport const PlaylistItemWrapper = styled(Stack, {\n shouldForwardProp: (prop) =>\n prop !== 'isCurrent' &&\n prop !== 'isEditing' &&\n prop !== 'isDraggable' &&\n prop !== 'isDisabled' &&\n prop !== 'isDeleting',\n})(({ theme, isCurrent, isDeleting = false, isEditing, isDisabled, isDraggable }) => ({\n borderRadius: theme.shape.borderRadius,\n border: `1px solid transparent`,\n backgroundColor: theme.palette.common.white,\n alignItems: 'center',\n height: PLAYLIST_ITEM_HEIGHT,\n position: 'relative',\n overflow: 'hidden',\n cursor: isDraggable ? 'pointer' : 'default',\n transition: theme.transitions.easing.easeOut,\n\n '&:hover': {\n borderColor: theme.palette.primary.main,\n },\n\n ...(isCurrent && {\n borderColor: 'transparent',\n backgroundColor: theme.palette.primary.light,\n boxShadow: boxShadows[2],\n\n '[data-element-name=\"name-text\"], [data-element-name=\"duration\"]': {\n color: theme.palette.common.white,\n },\n\n '[data-element-name=\"counter\"]': {\n backgroundColor: theme.palette.common.white,\n color: theme.palette.primary.main,\n },\n\n svg: {\n fill: theme.palette.common.white,\n },\n }),\n\n ...(isDisabled && {\n backdropFilter: 'grayscale(100%)',\n pointerEvents: 'none',\n borderColor: theme.palette.secondary.main,\n // TODO use from theme\n backgroundColor: Colors.background,\n opacity: 0.5,\n\n '[data-element-name=\"name-text\"], [data-element-name=\"duration\"]': {\n color: theme.palette.secondary.main,\n },\n\n '[data-element-name=\"counter\"]': {\n backgroundColor: theme.palette.secondary.main,\n color: theme.palette.common.white,\n },\n\n svg: {\n fill: theme.palette.secondary.main,\n },\n }),\n\n ...(isEditing && {\n pointerEvents: 'none',\n borderColor: theme.palette.warning.main,\n backgroundColor: theme.palette.warning.light,\n opacity: 0.5,\n\n '[data-element-name=\"name-text\"], [data-element-name=\"duration\"]': {\n color: theme.palette.warning.main,\n },\n\n '[data-element-name=\"counter\"]': {\n backgroundColor: theme.palette.warning.main,\n color: theme.palette.common.white,\n },\n\n svg: {\n fill: theme.palette.warning.main,\n },\n }),\n\n ...(isDeleting && {\n boxShadows: boxShadows[1],\n borderColor: theme.palette.error.main,\n opacity: 0.3,\n backgroundColor: theme.palette.error.main,\n\n '[data-element-name=\"name-text\"], [data-element-name=\"duration\"]': {\n color: theme.palette.common.white,\n },\n\n '[data-element-name=\"counter\"]': {\n backgroundColor: theme.palette.common.white,\n color: theme.palette.error.main,\n },\n\n svg: {\n fill: theme.palette.error.main,\n },\n }),\n}));\n","import { isFullMatchVideo } from 'shared/components/video-player/is-full-match-video';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\n\nexport const getPlaylistItemFirstVideoSource = (playlistItem: PlaylistItemType) => {\n return playlistItem.videoTypes.find((videoType) => isFullMatchVideo(videoType.playingMode.mode))?.videoSources[0];\n};\n","import { PlaylistItemType } from 'shared/components/video-player/types';\n\nimport { getPlaylistItemFirstVideoSource } from './getPlaylistItemFirstVideoSource';\n\nexport const generateCopyToPlaylistItem = (playlistItem: PlaylistItemType) => {\n const playlistItemVideoSource = getPlaylistItemFirstVideoSource(playlistItem);\n\n return {\n startTime: playlistItemVideoSource?.startTime ?? 0,\n endTime: playlistItemVideoSource?.endTime ?? 0,\n name: playlistItem.name ?? '',\n recordingId: playlistItem.recordingId ?? '',\n fundamentalsSelected: playlistItem.fundamentalsSelected,\n };\n};\n","import { Box, styled } from '@mui/material';\n\nexport const ContentBottomRow = styled(Box)(({ theme }) => ({\n paddingLeft: theme.spacing(1),\n paddingTop: theme.spacing(0.5),\n}));\n","import { Stack, styled } from '@mui/material';\n\nexport const ContentTopRow = styled(Stack)(({ theme }) => ({\n paddingLeft: theme.spacing(0.5),\n paddingTop: theme.spacing(0.5),\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'row',\n}));\n","import { Box, styled } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nexport const CounterBadge = styled(Box)(({ theme }) => ({\n display: 'flex',\n fontWeight: theme.typography.fontWeightMedium,\n fontSize: fontSizes.xxSmall,\n // TODO use from theme\n backgroundColor: Colors.melrose,\n color: theme.palette.primary.main,\n padding: theme.spacing(0, 0.5),\n borderRadius: '2px',\n alignItems: 'center',\n height: '18px',\n lineHeight: 1,\n}));\n","import { Box, styled } from '@mui/material';\n\nexport const ItemContentWrapper = styled(Box)({\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n flexGrow: 1,\n justifyContent: 'space-between',\n maxWidth: '100%',\n});\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconPlay = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconPlay;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconVerticalMenu = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconVerticalMenu;\n","import { Box, Button, Divider, Stack } from '@mui/material';\nimport Fade from '@mui/material/Fade';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport { PopoverProps } from '@mui/material/Popover';\nimport { PopoverOrigin } from '@mui/material/Popover/Popover';\nimport React, { useCallback } from 'react';\n\nimport IconClose from '../icons/icon-close';\nimport { MenuListOption } from '../kebab-menu';\n\ninterface Props {\n isOpen: boolean;\n id?: string;\n onClose: (event: React.SyntheticEvent | React.MouseEvent | MouseEvent | TouchEvent) => void;\n anchorEl: PopoverProps['anchorEl'];\n options: MenuListOption[];\n anchorOrigin?: PopoverOrigin;\n transformOrigin?: PopoverOrigin;\n}\nexport const MenuList = ({\n id = '',\n anchorEl,\n isOpen,\n onClose,\n options,\n anchorOrigin = { vertical: 'top', horizontal: 'left' },\n transformOrigin = { vertical: 'top', horizontal: 'left' },\n}: Props) => {\n const handleOnClick = useCallback(\n (event: React.SyntheticEvent | React.MouseEvent | MouseEvent | TouchEvent) => {\n event.stopPropagation();\n },\n [],\n );\n return (\n \n \n \n \n \n {options.map((option, idx) =>\n !option.displayText ? (\n \n ) : (\n ) => {\n if (!option.avoidCloseOnClick) onClose(event);\n option.onClick && option.onClick(event);\n }}\n sx={{ display: 'flex', gap: 1 }}\n {...option.menuItemProps}\n >\n {option.icon}\n {option.displayText}\n \n ),\n )}\n \n \n );\n};\n","import { Button } from '@mui/material';\nimport { MenuItemProps } from '@mui/material/MenuItem/MenuItem';\nimport { PopoverOrigin } from '@mui/material/Popover/Popover';\nimport React, { forwardRef, useCallback, useState } from 'react';\n\nimport IconVerticalMenu from 'shared/components/icons/icon-vertical-menu';\n\nimport { MenuList } from '../menu-list';\n\nexport type MenuListOption = {\n avoidCloseOnClick?: boolean;\n displayText?: string | JSX.Element;\n icon?: JSX.Element;\n isHidden?: boolean | undefined;\n onClick?: (event: React.MouseEvent) => void;\n selected?: boolean;\n menuItemProps?: MenuItemProps;\n};\n\ntype Props = {\n id?: string;\n options?: MenuListOption[];\n triggerComponent?: JSX.Element;\n anchorOrigin?: PopoverOrigin;\n transformOrigin?: PopoverOrigin;\n disableButtonPadding?: boolean;\n};\n\nexport type Ref = HTMLDivElement;\n\nconst defaultTriggerComponent = ;\n\nconst KebabMenu = forwardRef(\n (\n {\n anchorOrigin,\n transformOrigin,\n options = [],\n triggerComponent = defaultTriggerComponent,\n id,\n disableButtonPadding,\n },\n ref,\n ) => {\n const [anchorEl, setAnchorEl] = useState(null);\n const menuId = id ? `kebab-menu-${id}` : 'kebab-menu';\n\n const handleClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = useCallback(\n (event: React.SyntheticEvent | React.MouseEvent | MouseEvent | TouchEvent) => {\n event && event.stopPropagation();\n if (!anchorEl) return;\n\n setAnchorEl(null);\n },\n [anchorEl],\n );\n\n const menuOptions = options.filter((option) => !option.isHidden);\n\n return (\n
\n (disableButtonPadding ? 0 : theme.spacing(0.5)), minWidth: 'auto' }}\n >\n {triggerComponent}\n \n \n
\n );\n },\n);\n\nKebabMenu.displayName = 'KebabMenu';\n\nexport default KebabMenu;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconPause = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconPause;\n","import React, { useCallback } from 'react';\n\nimport IconPause from 'shared/components/icons/icon-pause';\nimport IconPlay from 'shared/components/icons/icon-play';\nimport {\n useVideoPlayerActions,\n useVideoPlayerIsPlaying,\n useVideoPlayerState,\n} from 'shared/components/video-player/hooks';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\n\ninterface Props {\n playlistItem: PlaylistItemType;\n}\n\nexport const PlayButton = ({ playlistItem }: Props) => {\n const isPlaying = useVideoPlayerIsPlaying();\n const { isEnded } = useVideoPlayerState();\n const actions = useVideoPlayerActions();\n\n const handlePause = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n actions.pause();\n },\n [actions],\n );\n\n const handlePlay = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n !isPlaying && !isEnded ? actions.play() : actions.setPlaylistItem(playlistItem.id, true);\n },\n [playlistItem, isPlaying, actions, isEnded],\n );\n\n return isPlaying ? (\n \n ) : (\n \n );\n};\n","import { motion, useMotionTemplate, useMotionValue } from 'framer-motion';\nimport { Colors } from 'kognia-ui';\nimport { useEffect } from 'react';\n\nimport { useCurrentTime, useDuration, useVideoPlayerPlayingMode } from 'shared/components/video-player';\nimport { useCurrentVideoSource } from 'shared/components/video-player/hooks';\n\ntype ProgressBarProps = {\n isEditing: boolean;\n};\n\nconst ProgressBar = ({ isEditing }: ProgressBarProps) => {\n const duration = useDuration();\n const currentTime = useCurrentTime();\n const videoSource = useCurrentVideoSource();\n const playingMode = useVideoPlayerPlayingMode();\n const width = useMotionValue(0);\n const widthPercent = useMotionTemplate`${width}%`;\n\n useEffect(() => {\n const currentSourceTime = playingMode.useEffectiveTime ? currentTime : currentTime - videoSource.startTime;\n const currentPercent = (100 * currentSourceTime) / duration;\n\n width.set(currentSourceTime > 0.1 ? currentPercent : 0);\n }, [duration, videoSource.startTime, width, currentTime, playingMode]);\n\n return (\n \n );\n};\n\ntype Props = {\n isEditing: boolean;\n isVisible: boolean;\n};\n\nexport const PlaylistItemProgressBar = ({ isEditing, isVisible }: Props) => {\n if (!isVisible) return null;\n\n return ;\n};\n","import { Checkbox, Stack, Typography } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nimport { useIsBulkModeActive } from 'entities/playlist/hooks/useIsBulkModeActive';\nimport { ContentBottomRow } from 'entities/playlist/ui/ContentBottomRow';\nimport { ContentTopRow } from 'entities/playlist/ui/ContentTopRow';\nimport { CounterBadge } from 'entities/playlist/ui/CounterBadge';\nimport { ItemContentWrapper } from 'entities/playlist/ui/ItemContentWrapper';\nimport IconPlay from 'shared/components/icons/icon-play';\nimport IconTime from 'shared/components/icons/icon-time';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport { useIsCurrentPlaylistItem } from 'shared/components/video-player';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\nimport { secondsAsDuration } from 'shared/utils/seconds-as-duration';\n\nimport { PlayButton } from './ui/PlayButton';\nimport { PlaylistItemProgressBar } from './ui/PlaylistItemProgressBar';\n\ntype Props = {\n showProgressBar: boolean;\n isEditingMode: boolean;\n isChecked: boolean;\n getMenuOptions: (hasOverlays: boolean) => MenuListOption[];\n playlistItem: PlaylistItemType;\n videoIndex: number;\n onClick: (value: boolean) => void;\n playlistId: string;\n kebabRef: React.MutableRefObject;\n};\n\nexport const PlaylistItemContent = ({\n playlistId,\n onClick,\n showProgressBar,\n isEditingMode,\n getMenuOptions,\n playlistItem,\n videoIndex,\n isChecked,\n kebabRef,\n}: Props) => {\n const enabledBulkMode = useIsBulkModeActive(playlistId);\n const isCurrentPlaylistItem = useIsCurrentPlaylistItem(playlistItem.id);\n\n return (\n \n \n \n \n {enabledBulkMode ? : null}\n {isCurrentPlaylistItem && !enabledBulkMode ? (\n \n ) : enabledBulkMode ? null : (\n onClick(true)} isButton size={'small'} color={'primary'} />\n )}\n {(videoIndex + 1).toString().padStart(3, '0')}\n \n \n {secondsAsDuration(playlistItem.duration, false)}\n \n \n \n \n {playlistItem.name}\n \n \n {`${playlistItem.recordingName} (${playlistItem.recordingMatchday})`}\n \n \n \n {!enabledBulkMode ? (\n \n \n \n ) : null}\n \n );\n};\n","import {\n Button,\n ButtonProps,\n DialogActions,\n DialogContent,\n DialogContentText,\n Popover,\n PopoverOrigin,\n} from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport React from 'react';\n\nimport styles from './ConfirmPopoverDialog.module.scss';\nimport IconClose from '../icons/icon-close';\n\ninterface Props {\n cancelLabel: string;\n confirmLabel: string;\n description: string;\n onCancel?: () => void;\n onConfirm: () => void;\n isOpen: boolean;\n buttonColor?: ButtonProps['color'];\n anchorEl: HTMLDivElement | HTMLElement | null;\n setIsOpen: (isOpen: boolean) => void;\n anchorOrigin?: PopoverOrigin | undefined;\n transformOrigin?: PopoverOrigin | undefined;\n}\n\nconst ConfirmPopoverDialog = ({\n anchorEl,\n isOpen,\n cancelLabel,\n confirmLabel,\n description,\n onCancel,\n onConfirm,\n setIsOpen,\n buttonColor = 'error',\n anchorOrigin = {\n vertical: 'bottom',\n horizontal: 'left',\n },\n transformOrigin = {\n vertical: 'center',\n horizontal: 'left',\n },\n}: Props) => {\n const handleCancel = (event: React.MouseEvent) => {\n event.stopPropagation();\n if (onCancel) onCancel();\n setIsOpen(false);\n };\n\n const handleConfirm = (event: React.MouseEvent) => {\n event.stopPropagation();\n onConfirm();\n setIsOpen(false);\n };\n\n return (\n \n
event.stopPropagation()}>\n
\n \n
\n \n \n {description}\n \n \n \n \n \n {confirmLabel}\n \n \n
\n \n );\n};\n\nexport default ConfirmPopoverDialog;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconAnalysis = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconAnalysis;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconBackward = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconBackward;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconBackward5 = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconBackward5;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconCamera = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconCamera;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconChevronUp = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconChevronUp;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconCopy = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconCopy;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconDefense = (props: Omit): JSX.Element => {\n return (\n \n \n \n \n );\n};\n\nexport default IconDefense;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconDelete = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconDelete;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconEdit = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconEdit;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconExport = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconExport;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconFilter = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconFilter;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconFolder = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconFolder;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconForward = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconForward;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconForward5 = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconForward5;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconFullScreen = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconFullScreen;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconKeyboard = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconKeyboard;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconKeypad = (props: Omit): JSX.Element => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default IconKeypad;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconOffense = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconOffense;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconOpenIn = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconOpenIn;\n","import { styled } from '@mui/material';\n\nimport { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\ninterface Props {\n order?: 'asc' | 'desc';\n}\n\ninterface PathProps {\n className?: string;\n}\n\nconst AscArrowPath = ({ className }: PathProps) => (\n \n);\nconst DescArrowPath = ({ className }: PathProps) => (\n \n);\n\nconst StyledAscPath = styled(AscArrowPath)(({ theme, order }) => ({\n color: order === 'asc' ? theme.palette.text.primary : theme.palette.secondary.main,\n}));\n\nconst StyledDescPath = styled(DescArrowPath)(({ theme, order }) => ({\n color: order === 'desc' ? theme.palette.text.primary : theme.palette.secondary.main,\n}));\n\nconst IconOrder = (props: Omit & Props): JSX.Element => {\n const { order, ...svgProps } = props;\n\n return (\n \n \n \n \n );\n};\n\nexport default IconOrder;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconPlaySpeed = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconPlaySpeed;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconReplay = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\nexport default IconReplay;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\n// TODO unused\nexport const IconSave = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconShare = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconShare;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconShield = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconShield;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconSort = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconSort;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconStar = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconStar;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconStrawberry = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\nexport default IconStrawberry;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconSync = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconSync;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconTimeline = (props: Omit): JSX.Element => {\n return (\n \n \n \n \n \n \n \n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconTransition = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconTransition;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nconst IconTrim = (props: Omit): JSX.Element => {\n return (\n \n \n \n );\n};\n\nexport default IconTrim;\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconCopyTo = (props: Omit): JSX.Element => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath, useHistory } from 'react-router-dom';\n\nimport { useDuplicatePlaylistItems } from 'api/playlist/useDuplicatePlaylistItems';\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { useMapVideos } from 'entities/playlist/hooks/use-map-videos/useMapVideos';\nimport { useHandleSetPlaylistItem } from 'entities/playlist/hooks/useHandleSetPlaylistItem';\nimport { getPlaylistItemFirstVideoSource } from 'entities/playlist/util/getPlaylistItemFirstVideoSource';\nimport { routes } from 'kognia/router/routes';\nimport { IconTimeline } from 'shared/components/icons';\nimport IconCopy from 'shared/components/icons/icon-copy';\nimport { IconCopyTo } from 'shared/components/icons/icon-copy-to';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport { IconDownload } from 'shared/components/icons/icon-download';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport { IconOverlays } from 'shared/components/icons/icon-overlays';\nimport IconTrim from 'shared/components/icons/icon-trim';\nimport { MenuListOption } from 'shared/components/kebab-menu';\nimport { useVideoPlayerActions, useVideoPlayerId } from 'shared/components/video-player/hooks';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\nimport { useSetIsOverlayPanelOpen } from 'shared/components/video-player/video-player-component/hooks/overlay-panel';\nimport { useFeatureFlag } from 'shared/contexts/app-state';\nimport { Playlist } from 'shared/types/index';\n\nexport const useUserPlaylistItemOptions = (\n playlist: Playlist,\n playlistItem: PlaylistItemType,\n setTrimmingPlaylistItem: (id: string) => void,\n setCopyToAnchor: (value: HTMLElement | null) => void,\n setIsOpenRenameDialog: (value: boolean) => void,\n setIsOpenDeleteDialog: (value: boolean) => void,\n setIsDownloadModalOpen: (value: boolean) => void,\n onPlaylistItemDuplicate?: () => void,\n): ((hasOverlays: boolean) => MenuListOption[]) => {\n const { t } = useTranslation();\n const history = useHistory();\n const mapVideos = useMapVideos();\n const playerId = useVideoPlayerId();\n const actions = useVideoPlayerActions();\n const handleSetPlaylistItem = useHandleSetPlaylistItem(playlistItem);\n const setIsOverlayPanelOpenState = useSetIsOverlayPanelOpen(playerId);\n const { duplicatePlaylistItems } = useDuplicatePlaylistItems(playlist.id);\n const customOverlaysFeatureFlag = useFeatureFlag(FEATURE_FLAG.CUSTOM_OVERLAYS);\n const downloadPlaylistFeatureFlag = useFeatureFlag(FEATURE_FLAG.DOWNLOAD_PLAYLIST);\n\n const handleDuplicate = useCallback(\n () =>\n duplicatePlaylistItems({\n playlistItemIds: [playlistItem.id],\n options: {\n onSuccess: (data: Playlist) => {\n onPlaylistItemDuplicate && onPlaylistItemDuplicate();\n actions.replacePlaylistItems(mapVideos(data));\n actions.resumeStandBy();\n },\n },\n }),\n [duplicatePlaylistItems, playlistItem.id, onPlaylistItemDuplicate, actions, mapVideos],\n );\n\n const handleOpenCopyToDialog = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n setCopyToAnchor(event.currentTarget);\n },\n [setCopyToAnchor],\n );\n\n const playlistItemVideoSource = getPlaylistItemFirstVideoSource(playlistItem);\n\n const handleGoToTimeline = useCallback(\n (event?: React.MouseEvent) => {\n event && event.stopPropagation();\n const path = generatePath(routes.PERFORMANCE_REPORT_TIMELINE, { id: playlistItem.recordingId });\n\n history.push(path, { initialStartTimeFromClip: playlistItemVideoSource?.startTime, playlist });\n },\n [history, playlist, playlistItem.recordingId, playlistItemVideoSource?.startTime],\n );\n\n return useCallback(\n (hasOverlays: boolean) => {\n const overlayOption = {\n displayText: t('video-player:overlays.edit-overlays'),\n icon: ,\n onClick: () => {\n handleSetPlaylistItem(false);\n setIsOverlayPanelOpenState(true);\n },\n };\n const options = [\n {\n displayText: t('common:actions.rename'),\n icon: ,\n onClick: () => {\n setIsOpenRenameDialog(true);\n actions.handleStandBy();\n },\n },\n {\n displayText: t('common:actions.trim'),\n icon: ,\n onClick: () => {\n setTrimmingPlaylistItem(playlistItem.id);\n },\n },\n {\n displayText: t('common:actions.download'),\n icon: ,\n onClick: () => {\n setIsDownloadModalOpen(true);\n actions.handleStandBy();\n },\n isHidden: !downloadPlaylistFeatureFlag,\n },\n {\n displayText: t('common:actions.duplicate'),\n icon: ,\n onClick: () => handleDuplicate(),\n },\n {\n displayText: t('common:actions.copy-to'),\n icon: ,\n onClick: (event: React.MouseEvent) => {\n handleOpenCopyToDialog(event);\n actions.handleStandBy();\n },\n avoidCloseOnClick: true,\n },\n {\n displayText: t('common:actions.remove'),\n icon: ,\n onClick: () => {\n setIsOpenDeleteDialog(true);\n actions.handleStandBy();\n },\n },\n {\n displayText: '',\n },\n {\n displayText: t('playlist-detail:go-to-timeline'),\n icon: ,\n onClick: handleGoToTimeline,\n },\n ];\n return hasOverlays && customOverlaysFeatureFlag ? [overlayOption, ...options] : options;\n },\n [\n actions,\n customOverlaysFeatureFlag,\n downloadPlaylistFeatureFlag,\n handleDuplicate,\n handleGoToTimeline,\n handleOpenCopyToDialog,\n handleSetPlaylistItem,\n playlistItem.id,\n setIsDownloadModalOpen,\n setIsOpenDeleteDialog,\n setIsOpenRenameDialog,\n setIsOverlayPanelOpenState,\n setTrimmingPlaylistItem,\n t,\n ],\n );\n};\n","import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Typography } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\nimport React, { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { CounterBadge } from 'entities/playlist/ui/CounterBadge';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport IconPlay from 'shared/components/icons/icon-play';\nimport Input from 'shared/components/input';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\nimport { secondsAsDuration } from 'shared/utils/seconds-as-duration';\n\nimport styles from './RenameDialog.module.scss';\n\ninterface Props {\n videoIndex: number;\n isOpen: boolean;\n playlistItem: PlaylistItemType;\n setIsOpen: (isOpen: boolean) => void;\n onClose: () => void;\n updatePlaylistItem: (playlistItemId: string, data: { [key: string]: any }) => void;\n}\n\nconst RenameDialog = ({ isOpen = false, onClose, setIsOpen, playlistItem, updatePlaylistItem, videoIndex }: Props) => {\n const { t } = useTranslation();\n const [inputName, setInputName] = useState(playlistItem.name);\n\n useEffect(() => {\n setInputName(playlistItem.name);\n }, [playlistItem.name]);\n\n const handleNameChange = (event: React.FormEvent) => {\n setInputName(event.currentTarget.value);\n };\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n if (inputName === '') {\n return false;\n }\n updatePlaylistItem(playlistItem.id, { name: inputName });\n onClose();\n setIsOpen(false);\n };\n\n const handleClose = (event: React.MouseEvent) => {\n event.stopPropagation();\n setInputName(playlistItem.name);\n setIsOpen(false);\n onClose();\n };\n\n return (\n event.stopPropagation()}\n aria-labelledby='confirm-dialog-title'\n aria-describedby='confirm-dialog-description'\n >\n
\n
\n \n \n \n \n {t('playlist-detail:rename-dialog.title')}\n \n ({\n alignItems: 'center',\n borderRadius: '4px',\n border: `1px solid ${palette.primary.main}`,\n display: 'flex',\n gap: spacing(0.5),\n marginBottom: spacing(2),\n padding: `${spacing(0.5, 1, 0.5)} !important`,\n })}\n >\n ({ backgroundColor: palette.primary.main, color: palette.common.white })}\n >\n {(videoIndex + 1).toString().padStart(3, '0')}\n \n \n \n \n {secondsAsDuration(playlistItem.duration, false)}\n \n \n \n \n \n \n \n
\n \n );\n};\n\nexport default RenameDialog;\n","import { useAnimation } from 'framer-motion';\nimport React, { memo, useCallback, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useDeletePlaylistItem } from 'api/playlist/useDeletePlaylistItem';\nimport { useUpdatePlaylistItem } from 'api/playlist/useUpdatePlaylistItem';\nimport { useMapVideos } from 'entities/playlist/hooks/use-map-videos/useMapVideos';\nimport { useHandlePlaylistItemClick } from 'entities/playlist/hooks/useHandlePlaylistItemClick';\nimport { useHandleSetPlaylistItem } from 'entities/playlist/hooks/useHandleSetPlaylistItem';\nimport { PlaylistItemWrapper } from 'entities/playlist/ui/PlaylistItemWrapper';\nimport { generateCopyToPlaylistItem } from 'entities/playlist/util/generateCopyToPlaylistItem';\nimport { CopyToDialog } from 'features/playlist/CopyToDialog';\nimport { DownloadPlaylistItemsModal } from 'features/playlist/download-playlist-items-modal/DownloadPlaylistItemsModal';\nimport { PlaylistItemContent } from 'features/playlist/playlist-item-content/PlaylistItemContent';\nimport ConfirmPopoverDialog from 'shared/components/confirm-popover-dialog';\nimport { useIsCurrentPlaylistItem, useVideoPlayerActions } from 'shared/components/video-player';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\nimport { Playlist } from 'shared/types/index';\n\nimport { useUserPlaylistItemOptions } from './hooks/useUserPlaylistItemOptions';\nimport RenameDialog from './ui/rename-dialog/RenameDialog';\n\ninterface Props {\n isDisabled?: boolean;\n isEditing?: boolean;\n playlist: Playlist;\n playlistItem: PlaylistItemType;\n setTrimmingPlaylistItem: (id: string) => void;\n videoIndex: number;\n enabledBulkMode?: boolean;\n onSelect?: (value: string) => void;\n isChecked?: boolean;\n onPlaylistItemDelete?: (id: string) => void;\n onPlaylistItemDuplicate?: () => void;\n}\n\nexport const UserPlaylistItem = memo(\n ({\n isDisabled = false,\n isEditing = false,\n playlist,\n playlistItem,\n setTrimmingPlaylistItem,\n videoIndex,\n isChecked = false,\n onPlaylistItemDelete,\n onPlaylistItemDuplicate,\n }: Props) => {\n const { t } = useTranslation();\n const mapVideos = useMapVideos();\n const isCurrentPlaylistItem = useIsCurrentPlaylistItem(playlistItem.id);\n const actions = useVideoPlayerActions();\n const [copyToAnchor, setCopyToAnchor] = useState(null);\n\n const [isDeleted, setIsDeleted] = useState(false);\n const [isDownloadModalOpen, setIsDownloadModalOpen] = useState(false);\n const [isOpenRenameDialog, setIsOpenRenameDialog] = useState(false);\n const [isOpenDeleteDialog, setIsOpenDeleteDialog] = useState(false);\n const { deletePlaylistItem, isLoading, isError } = useDeletePlaylistItem(playlist.id);\n const kebabRef = useRef(null);\n const isEditingMode = Boolean(isOpenDeleteDialog || isOpenRenameDialog || isEditing);\n\n const { updatePlaylistItem } = useUpdatePlaylistItem(playlist.id);\n const handleSetPlaylistItem = useHandleSetPlaylistItem(playlistItem);\n const handleItemClick = useHandlePlaylistItemClick(playlistItem, playlist.id);\n\n const getMenuOptions = useUserPlaylistItemOptions(\n playlist,\n playlistItem,\n setTrimmingPlaylistItem,\n setCopyToAnchor,\n setIsOpenRenameDialog,\n setIsOpenDeleteDialog,\n setIsDownloadModalOpen,\n onPlaylistItemDuplicate,\n );\n\n const handleUpdatePlaylistItem = useCallback(\n (playlistItemId: string, data: { [key: string]: any }) => {\n updatePlaylistItem(playlistItemId, data, (playlist: Playlist) => {\n actions.updatePlaylistItems(mapVideos(playlist));\n });\n },\n [actions, mapVideos, updatePlaylistItem],\n );\n\n const handleRenameDialogClose = useCallback(() => {\n actions.resumeStandBy();\n }, [actions]);\n\n const handleCloseCopyToDialog = useCallback(() => {\n actions.resumeStandBy();\n setCopyToAnchor(null);\n }, [actions]);\n\n const handleCloseDownloadModal = useCallback(() => {\n setIsDownloadModalOpen(false);\n actions.resumeStandBy();\n }, [actions]);\n\n const controls = useAnimation();\n\n const handleConfirmDelete = useCallback(async () => {\n setIsDeleted(true);\n await controls.start({ opacity: 0 });\n deletePlaylistItem(playlistItem.id, () => {\n actions.resumeStandBy();\n actions.removePlaylistItem(playlistItem.id);\n\n if (onPlaylistItemDelete) {\n onPlaylistItemDelete(playlistItem.id);\n }\n });\n\n if (isError) {\n setIsDeleted(false);\n }\n }, [actions, controls, deletePlaylistItem, isError, onPlaylistItemDelete, playlistItem.id]);\n\n const showProgressBar = isCurrentPlaylistItem && !isDisabled && !isDeleted;\n\n return (\n <>\n \n \n \n\n \n\n \n\n {isDownloadModalOpen ? (\n \n ) : null}\n\n \n \n );\n },\n);\n\nUserPlaylistItem.displayName = 'EditablePlaylistItem';\n","import React, { ReactElement, ReactNode } from 'react';\nimport {\n DragDropContext,\n DraggableChildrenFn,\n Droppable,\n DroppableMode,\n DroppableProvided,\n DropResult,\n} from 'react-beautiful-dnd';\n\nexport type SortableItem = {\n id: string;\n};\n\nexport const reorder = (list: T[], startIndex: number, endIndex: number) => {\n if (startIndex < 0 || endIndex < 0) return [...list];\n if (startIndex > list.length - 1 || endIndex > list.length - 1) return [...list];\n\n const result = Array.from(list);\n const [removed] = result.splice(startIndex, 1);\n result.splice(endIndex, 0, removed);\n\n return result;\n};\n\ninterface Props {\n children?: ReactNode;\n id: string;\n items: T[];\n onDragEnd?: () => void;\n onDragStart?: () => void;\n onOrderChange: (playlistItemId: string, currentIndex: number, nextIndex: number) => void;\n mode?: DroppableMode | undefined;\n renderClone?: DraggableChildrenFn | undefined;\n renderChildren?: (droppableProvided: DroppableProvided) => ReactElement;\n isDropDisabled?: boolean;\n direction?: 'vertical' | 'horizontal';\n}\n\nconst SortableItemList = ({\n id = 'sortable-list',\n items,\n onOrderChange,\n onDragStart,\n onDragEnd,\n mode = 'standard',\n renderClone,\n renderChildren,\n children,\n isDropDisabled = false,\n direction = 'vertical',\n}: Props) => {\n const handleDragStart = () => {\n if (onDragStart) onDragStart();\n };\n\n const handleDragEnd = (result: DropResult) => {\n if (onDragEnd) onDragEnd();\n\n if (!result.destination) {\n return;\n }\n\n if (result.destination.index === result.source.index) {\n return;\n }\n\n onOrderChange(items[result.source.index].id, result.source.index, result.destination.index);\n };\n\n return (\n \n \n {mode === 'virtual' && renderChildren && !children\n ? (droppableProvided: DroppableProvided) => renderChildren(droppableProvided)\n : (provided) => (\n
\n {children}\n {provided.placeholder}\n
\n )}\n \n
\n );\n};\n\nexport default SortableItemList;\n","import React, { ReactElement } from 'react';\nimport { Draggable, DraggableProvided } from 'react-beautiful-dnd';\n\ninterface Props {\n id: string;\n index: number;\n renderChildren?: (provided: DraggableProvided) => ReactElement;\n children?: ReactElement;\n isDragDisabled?: boolean;\n}\n\nexport const SortableItem = ({ id, index, renderChildren, children, isDragDisabled = false }: Props) => {\n return (\n \n {renderChildren && !children\n ? (draggableProvided) => renderChildren(draggableProvided)\n : (draggableProvided) => (\n \n {children}\n
\n )}\n \n );\n};\n","import { CSSProperties, useCallback } from 'react';\nimport { DraggableProvided, DraggableRubric, DraggableStateSnapshot, DroppableProvided } from 'react-beautiful-dnd';\n\nimport { invalidatePlaylistQuery } from 'api/playlist/usePlaylist';\nimport { useUpdatePlaylistItemOrder } from 'api/playlist/useUpdatePlaylistItemOrder';\nimport { PLAYLIST_ITEM_GAP } from 'entities/playlist/config/Playlist.config';\nimport { useBulkSelectedItems, useSetBulkSelectedItems } from 'entities/playlist/hooks/useBulkSelectedItems';\nimport { useHandleSelect } from 'entities/playlist/hooks/useHandleSelect';\nimport { useIsBulkModeActive } from 'entities/playlist/hooks/useIsBulkModeActive';\nimport { PlaylistItemsList, RowProps } from 'features/playlist/PlaylistItemsList';\nimport { UserPlaylistItem } from 'features/playlist/user-playlist-items-list/ui/user-playlist-item/UserPlaylistItem';\nimport SortableItemList from 'shared/components/sortable-item-list';\nimport { SortableItem } from 'shared/components/sortable-item-list/sortable-item';\nimport { useVideoPlayerActions } from 'shared/components/video-player';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\nimport { Playlist } from 'shared/types/index';\n\ntype Props = {\n playlist: Playlist;\n setTrimmingPlaylistItem: (videoId: string) => void;\n trimmingPlaylistItemId?: string;\n playlistItems: PlaylistItemType[];\n};\n\nexport const SortablePlaylistItemsList = ({\n playlist,\n playlistItems,\n setTrimmingPlaylistItem,\n trimmingPlaylistItemId,\n}: Props) => {\n const actions = useVideoPlayerActions();\n const handleSelect = useHandleSelect(playlist.id);\n const enabledBulkMode = useIsBulkModeActive(playlist.id);\n const { updatePlaylistItemOrder } = useUpdatePlaylistItemOrder(playlist.id);\n const onOrderChangeStart = useCallback(() => actions.handleStandBy(), [actions]);\n const onOrderChangeEnd = useCallback(() => actions.resumeStandBy(), [actions]);\n const selectedItems = useBulkSelectedItems(playlist.id);\n const setSelectedItems = useSetBulkSelectedItems(playlist.id);\n const onPlaylistOrderChange = useCallback(\n (currentVideoIndex: number, newVideoIndex: number) => {\n actions.reorder(currentVideoIndex, newVideoIndex);\n\n actions.resumeStandBy();\n },\n [actions],\n );\n\n const handleOrderChange = useCallback(\n (playlistItemId: string, currentIndex: number, newIndex: number) => {\n updatePlaylistItemOrder(playlistItemId, newIndex);\n if (onPlaylistOrderChange) onPlaylistOrderChange(currentIndex, newIndex);\n },\n [onPlaylistOrderChange, updatePlaylistItemOrder],\n );\n\n const handlePlaylistItemDuplicate = useCallback(() => {\n invalidatePlaylistQuery();\n }, []);\n\n const handlePlaylistItemDelete = useCallback(\n (playlistId: string) => {\n setSelectedItems(selectedItems.filter((item) => item !== playlistId));\n },\n [selectedItems, setSelectedItems],\n );\n\n const PlaylistItemElement = useCallback(\n (\n draggableProvided: DraggableProvided,\n currentPlaylistItem: PlaylistItemType,\n index: number,\n style?: CSSProperties,\n ) => (\n \n \n \n ),\n [\n enabledBulkMode,\n handlePlaylistItemDelete,\n handlePlaylistItemDuplicate,\n handleSelect,\n playlist,\n selectedItems,\n setTrimmingPlaylistItem,\n trimmingPlaylistItemId,\n ],\n );\n\n const Row = useCallback(\n ({ data, index, style }: RowProps) => {\n const currentPlaylistItem = data[index];\n return (\n \n PlaylistItemElement(draggableProvided, currentPlaylistItem, index, style)\n }\n key={currentPlaylistItem.id}\n />\n );\n },\n [PlaylistItemElement, enabledBulkMode],\n );\n\n const VirtualizedList = useCallback(\n (droppableProvided: DroppableProvided) => (\n \n ),\n [Row, playlistItems],\n );\n\n const handleRenderClone = useCallback(\n (draggableProvided: DraggableProvided, snapshot: DraggableStateSnapshot, rubric: DraggableRubric) =>\n PlaylistItemElement(draggableProvided, playlistItems[rubric.source.index], rubric.source.index),\n [PlaylistItemElement, playlistItems],\n );\n\n return (\n \n );\n};\n","import { Box, styled } from '@mui/material';\nimport React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst DialogActionsWrapper = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: `0 ${theme.spacing(4)} ${theme.spacing(4)} ${theme.spacing(4)}`,\n}));\n\nexport const DialogActions = ({ children }: Props) => {\n return {children};\n};\n","import { Box } from '@mui/material';\nimport React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const DialogButtonContainer = ({ children }: Props) => {\n return {children};\n};\n","import { Box, styled } from '@mui/material';\nimport React from 'react';\n\ninterface DialogContentWrapperProps {\n noHeader?: boolean;\n}\n\ninterface Props extends DialogContentWrapperProps {\n children: React.ReactNode;\n}\n\nconst DialogContentWrapper = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'noHeader',\n})(({ theme, noHeader }) => ({\n display: 'flex',\n flexGrow: 1,\n padding: `${noHeader ? theme.spacing(7) : '0'} ${theme.spacing(4)} ${theme.spacing(4)} ${theme.spacing(4)}`,\n}));\n\nexport const DialogContent = ({ children, noHeader }: Props) => {\n return (\n \n {children}\n \n );\n};\n","import { Box, styled } from '@mui/material';\nimport MuiDialogTitle from '@mui/material/DialogTitle';\nimport { Colors, fontSizes, fontWeight, letterSpacing } from 'kognia-ui';\nimport React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n icon?: React.ReactNode;\n}\n\nconst DialogHeaderWrapper = styled(Box, { shouldForwardProp: (prop) => prop !== 'hasIcon' })<{ hasIcon: boolean }>(\n ({ theme, hasIcon }) => ({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n textTransform: 'uppercase',\n flexDirection: 'column',\n padding: hasIcon ? theme.spacing(3) : theme.spacing(6, 3),\n }),\n);\n\nconst DialogTitle = styled(MuiDialogTitle)({\n fontSize: fontSizes.modalTitle,\n letterSpacing: letterSpacing.modalTitle,\n padding: 0,\n fontWeight: fontWeight.modalTitle,\n color: Colors.night,\n});\n\nconst DialogIcon = styled(Box)(({ theme }) => ({\n padding: theme.spacing(1.5),\n backgroundColor: Colors.background,\n borderRadius: '50%',\n marginBottom: theme.spacing(3),\n}));\n\nexport const DialogHeader = ({ children, icon }: Props) => {\n return (\n \n {icon && {icon}}\n {children}\n \n );\n};\n","import { Backdrop, Button, IconButton, styled } from '@mui/material';\nimport MuiDialog, { DialogProps } from '@mui/material/Dialog';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { DialogActions } from './dialog-actions';\nimport { DialogButtonContainer } from './dialog-button-container';\nimport { DialogContent } from './dialog-content';\nimport { DialogHeader } from './dialog-header';\nimport IconClose from '../icons/icon-close';\n\ninterface DialogBackdropProps {\n disableBackground: boolean;\n}\n\nconst DialogBackdrop = styled(Backdrop, {\n shouldForwardProp: (prop) => prop !== 'disableBackground',\n})(({ disableBackground }) => ({\n ...(disableBackground && {\n backgroundColor: 'transparent',\n }),\n pointerEvents: 'none',\n}));\n\nconst DialogCloseButton = styled(IconButton)(({ theme }) => ({\n position: 'absolute',\n top: theme.spacing(1),\n right: theme.spacing(1),\n}));\n\ninterface Props extends DialogProps {\n disableBackground?: boolean;\n disableBackdropOnClose?: boolean;\n hiddenActions?: boolean;\n title?: string;\n icon?: JSX.Element;\n onCancel?: () => void;\n onSubmit?: () => void;\n buttonCancelText?: string;\n buttonSubmitText?: string;\n error?: boolean;\n submitDisabled?: boolean;\n buttonFormId?: string;\n}\n\nexport const DialogNew = ({\n disableBackground = false,\n disableBackdropOnClose = false,\n hiddenActions = false,\n onClose,\n children,\n title,\n icon,\n onCancel,\n onSubmit,\n buttonCancelText,\n buttonSubmitText,\n error = false,\n submitDisabled = false,\n buttonFormId,\n ...rest\n}: Props) => {\n const { t } = useTranslation();\n\n return (\n ({ disableBackground }),\n }}\n >\n {title ? {title} : null}\n {children}\n {!hiddenActions ? (\n \n {onCancel ? (\n \n \n \n ) : null}\n {onSubmit || buttonFormId ? (\n \n \n {buttonSubmitText ? buttonSubmitText : t('common:actions.done')}\n \n \n ) : null}\n \n ) : null}\n\n {typeof onClose === 'function' ? (\n onClose && onClose(event, 'backdropClick')}>\n \n \n ) : null}\n \n );\n};\n","import { styled } from '@mui/material';\nimport { css } from '@mui/system';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nexport const InputAdornment = styled('div')(\n ({ theme }) => css`\n padding: ${theme.spacing(0, 0.5)};\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: ${Colors.storm};\n background-color: ${Colors.athens};\n border-radius: ${theme.shape.borderRadius}px;\n font-size: ${fontSizes.xxSmall};\n font-weight: ${theme.typography.fontWeightMedium};\n `,\n);\n","import { IconButton, Stack, styled, TextField, TextFieldProps } from '@mui/material';\nimport { css } from '@mui/system';\nimport { Colors } from 'kognia-ui';\nimport { ChangeEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport IconMinus from '../icons/icon-minus';\nimport IconPlus from '../icons/icon-plus';\n\nconst TextFieldWithHiddenArrows = styled(TextField, { shouldForwardProp: (prop) => prop !== 'showControls' })(\n () => css`\n input {\n -moz-appearance: textfield;\n\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n `,\n);\n\nconst ControlButton = styled(IconButton)(\n () => css`\n padding: 0;\n background-color: ${Colors.athens};\n\n &:hover {\n background-color: ${Colors.lavender};\n }\n `,\n);\n\ninterface DefaultInputProps {\n min?: number;\n max?: number;\n step: number;\n}\n\nconst defaultInputProps: DefaultInputProps = {\n min: undefined,\n max: undefined,\n step: 1,\n};\n\ntype Props = Omit & {\n showControls?: boolean;\n};\n\nfunction isNumber(value: unknown) {\n const number = Number(value);\n return typeof number === 'number' && !isNaN(number);\n}\n\nexport const NumberField = (props: Props) => {\n const { value: valueProp, ...restProps } = props;\n const ref = useRef(null);\n const [value, setValue] = useState(isNumber(valueProp) ? Number(valueProp) : undefined);\n\n const inputSettings: DefaultInputProps = useMemo(() => {\n return {\n min: props.inputProps?.min ?? defaultInputProps.min,\n max: props.inputProps?.max ?? defaultInputProps.max,\n step: props.inputProps?.step ?? defaultInputProps.step,\n };\n }, [props]);\n\n const simulateChangeEvent = useCallback(\n (customValue: number) => {\n const event: ChangeEvent = {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n target: { value: customValue },\n };\n props.onChange?.(event);\n },\n [props],\n );\n\n useEffect(() => {\n if (isNumber(valueProp)) setValue(Number(valueProp));\n }, [valueProp]);\n\n const handleIncrement = useCallback(() => {\n setValue((prev) => {\n if (!isNumber(prev) || prev === undefined) {\n simulateChangeEvent(+inputSettings.step);\n return +inputSettings.step;\n }\n simulateChangeEvent(prev + inputSettings.step);\n return prev + inputSettings.step;\n });\n }, [inputSettings.step, simulateChangeEvent]);\n\n const handleDecrement = useCallback(() => {\n setValue((prev) => {\n if (!isNumber(prev) || prev === undefined) {\n simulateChangeEvent(-inputSettings.step);\n return -inputSettings.step;\n }\n\n simulateChangeEvent(prev - inputSettings.step);\n return prev - inputSettings.step;\n });\n }, [inputSettings.step, simulateChangeEvent]);\n\n return (\n \n \n {props.showControls && (\n \n \n \n \n \n \n \n \n )}\n \n );\n};\n","import { TypeOf } from 'zod';\n\nimport { trimFormSchema } from './trimFormSchema';\n\nexport const trimFormId = 'trim-form';\n\nexport enum TrimFormFieldsNames {\n startTime = 'startTime',\n endTime = 'endTime',\n}\n\nexport type TrimFormSchema = TypeOf;\n","import { z } from 'zod';\n\nimport { TrimFormFieldsNames } from './trimForm';\n\nexport const trimFormSchema = z.object({\n [TrimFormFieldsNames.startTime]: z.number().int().optional(),\n [TrimFormFieldsNames.endTime]: z.number().int().optional(),\n});\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { Stack, Typography } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\nimport { useCallback, useRef } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\n\nimport { createTrimItemsPayload, useBatchUpdatePlaylistItems } from 'api/playlist/useBatchUpdatePlaylistItems';\nimport { invalidatePlaylistQuery } from 'api/playlist/usePlaylist';\nimport { useMapVideos } from 'entities/playlist/hooks/use-map-videos/useMapVideos';\nimport { DialogNew } from 'shared/components/dialog-new';\nimport IconTrim from 'shared/components/icons/icon-trim';\nimport { InputAdornment } from 'shared/components/input-pill-adornment/InputPillAdornment';\nimport { NumberField } from 'shared/components/number-field/NumberField';\nimport { useVideoPlayerActions } from 'shared/components/video-player';\n\nimport { TrimFormFieldsNames, trimFormId, TrimFormSchema } from './trimForm';\nimport { trimFormSchema } from './trimFormSchema';\nimport { useSetIsBulkModeActive } from '../../../../../entities/playlist/hooks/useIsBulkModeActive';\n\ninterface Props {\n onClose: () => void;\n itemsToTrim: string[];\n playlistId: string;\n}\n\nconst MINIMUM_SECONDS = -99;\nconst MAXIMUM_SECONDS = 99;\nconst SECONDS_INPUT_CONTAINER_WIDTH = 112;\n\nexport const TrimModal = ({ onClose, itemsToTrim, playlistId }: Props) => {\n const { t } = useTranslation();\n const formRef = useRef(null);\n const videoPlayerActions = useVideoPlayerActions();\n const mapVideos = useMapVideos();\n const setEnabledBulkMode = useSetIsBulkModeActive(playlistId);\n const {\n handleSubmit,\n control,\n formState: { isDirty },\n } = useForm({\n resolver: zodResolver(trimFormSchema),\n });\n\n const { updateBatchPlaylistItems } = useBatchUpdatePlaylistItems(playlistId);\n\n const onSubmit = useCallback(\n (data: TrimFormSchema) => {\n const payload = createTrimItemsPayload({\n playlistItemIds: itemsToTrim,\n before: data.startTime,\n after: data.endTime,\n });\n\n updateBatchPlaylistItems(payload, (playlist) => {\n invalidatePlaylistQuery && invalidatePlaylistQuery();\n videoPlayerActions.replacePlaylistItems(mapVideos(playlist));\n setEnabledBulkMode(false);\n onClose();\n });\n },\n [itemsToTrim, mapVideos, onClose, setEnabledBulkMode, updateBatchPlaylistItems, videoPlayerActions],\n );\n\n return (\n }\n fullWidth\n maxWidth={'xs'}\n onCancel={onClose}\n buttonFormId={trimFormId}\n submitDisabled={!isDirty}\n >\n
\n \n \n \n {t('playlist-detail:trim-clips.start-time')}\n \n \n (\n {t('playlist-detail:trim-clips.seconds')},\n sx: { width: SECONDS_INPUT_CONTAINER_WIDTH },\n }}\n />\n )}\n name={TrimFormFieldsNames.startTime}\n />\n \n \n \n \n {t('playlist-detail:trim-clips.end-time')}\n \n \n (\n {t('playlist-detail:trim-clips.seconds')},\n sx: { width: SECONDS_INPUT_CONTAINER_WIDTH },\n }}\n />\n )}\n name={TrimFormFieldsNames.endTime}\n />\n \n \n \n \n \n );\n};\n","import { Stack } from '@mui/material';\nimport isEmpty from 'lodash/isEmpty';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useDeletePlaylistItems } from 'api/playlist/useDeletePlaylistItems';\nimport { useDuplicatePlaylistItems } from 'api/playlist/useDuplicatePlaylistItems';\nimport { invalidatePlaylistQuery } from 'api/playlist/usePlaylist';\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { useMapVideos } from 'entities/playlist/hooks/use-map-videos/useMapVideos';\nimport { useBulkSelectedItems, useSetBulkSelectedItems } from 'entities/playlist/hooks/useBulkSelectedItems';\nimport { ItemsListBulk } from 'entities/playlist/ui/ItemsListBulk';\nimport { ItemsListContainer } from 'entities/playlist/ui/ItemsListContainer';\nimport { PlaylistItemsEmpty } from 'entities/playlist/ui/PlaylistItemsEmpty';\nimport { DownloadPlaylistItemsModal } from 'features/playlist/download-playlist-items-modal/DownloadPlaylistItemsModal';\nimport { PlaylistBulkButton } from 'features/playlist/PlaylistBulkButton';\nimport { SelectedItemsCopyToDialog } from 'features/playlist/SelectedItemsCopyToDialog';\nimport { SortablePlaylistItemsList } from 'features/playlist/user-playlist-items-list/ui/SortablePlaylistItemsList';\nimport { TrimModal } from 'features/playlist/user-playlist-items-list/ui/trim-modal/TrimModal';\nimport { CheckboxWithCustomColor } from 'shared/components/CheckboxWithCustomColor/CheckboxWithCustomColor';\nimport ConfirmPopoverDialog from 'shared/components/confirm-popover-dialog';\nimport IconClose from 'shared/components/icons/icon-close';\nimport IconCopy from 'shared/components/icons/icon-copy';\nimport { IconCopyTo } from 'shared/components/icons/icon-copy-to';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport { IconDownload } from 'shared/components/icons/icon-download';\nimport IconTrim from 'shared/components/icons/icon-trim';\nimport { usePlaylistItems, useVideoPlayerActions } from 'shared/components/video-player';\nimport { useFeatureFlag } from 'shared/contexts/app-state';\nimport { Playlist } from 'shared/types/index';\n\ninterface Props {\n onPlaylistOrderChange?: (currentVideoIndex: number, newVideoIndex: number) => void;\n playlist: Playlist;\n setTrimmingPlaylistItem: (videoId: string) => void;\n trimmingPlaylistItemId?: string;\n enabledBulkMode?: boolean;\n setEnabledBulkMode?: (value: boolean) => void;\n}\n\nexport const UserPlaylistItemsList = ({\n playlist,\n setTrimmingPlaylistItem,\n trimmingPlaylistItemId,\n enabledBulkMode = false,\n setEnabledBulkMode = () => {},\n}: Props) => {\n const { t } = useTranslation();\n const mapVideos = useMapVideos();\n const selectedItems = useBulkSelectedItems(playlist.id);\n const setSelectedItems = useSetBulkSelectedItems(playlist.id);\n const [deleteModalOpen, setDeleteModalOpen] = useState(false);\n const [trimModalOpen, setTrimModalOpen] = useState(false);\n const [isDownloadModalOpen, setIsDownloadModalOpen] = useState(false);\n const [copyToModalOpen, setCopyToModalOpen] = useState(false);\n const playlistItems = usePlaylistItems();\n const downloadPlaylistFeatureFlag = useFeatureFlag(FEATURE_FLAG.DOWNLOAD_PLAYLIST);\n\n const { duplicatePlaylistItems } = useDuplicatePlaylistItems(playlist.id);\n const { deletePlaylistItems } = useDeletePlaylistItems(playlist.id);\n const downloadRef = useRef(null);\n const copyToRef = useRef(null);\n const deleteRef = useRef(null);\n const actions = useVideoPlayerActions();\n\n useEffect(() => {\n if (selectedItems.length > 0 && !enabledBulkMode) {\n setSelectedItems([]);\n }\n }, [enabledBulkMode, setSelectedItems, selectedItems.length]);\n\n const playlistItemsIds = playlistItems.map((item) => item.id);\n\n const allItemsSelected = selectedItems.length === playlistItems.length;\n const selectAllIndeterminate = selectedItems.length > 0 && !allItemsSelected;\n\n const handleSelectAll = useCallback(() => {\n if (selectAllIndeterminate || allItemsSelected) {\n return setSelectedItems([]);\n }\n\n return setSelectedItems(playlistItemsIds);\n }, [allItemsSelected, playlistItemsIds, selectAllIndeterminate, setSelectedItems]);\n\n const handleTrimModalOpen = useCallback(() => setTrimModalOpen(true), []);\n const handleTrimModalClose = useCallback(() => setTrimModalOpen(false), []);\n\n const handleTrimClick = useCallback(() => handleTrimModalOpen(), [handleTrimModalOpen]);\n\n const handleDuplicateAll = useCallback(() => {\n duplicatePlaylistItems({\n playlistItemIds: selectedItems,\n options: {\n onSuccess: (playlist: Playlist) => {\n invalidatePlaylistQuery();\n actions.replacePlaylistItems(mapVideos(playlist));\n setEnabledBulkMode(false);\n setSelectedItems([]);\n },\n },\n });\n }, [mapVideos, setEnabledBulkMode, actions, duplicatePlaylistItems, selectedItems, setSelectedItems]);\n\n const handleDeleteAll = useCallback(() => {\n deletePlaylistItems(selectedItems, () => {\n invalidatePlaylistQuery();\n actions.removePlaylistItems(selectedItems);\n setEnabledBulkMode(false);\n setSelectedItems([]);\n });\n }, [setEnabledBulkMode, actions, deletePlaylistItems, selectedItems, setSelectedItems]);\n\n const handleSetDisabledBulkMode = useCallback(() => {\n setEnabledBulkMode(false);\n }, [setEnabledBulkMode]);\n\n const handleSetDownloadModalOpen = useCallback(() => {\n setIsDownloadModalOpen(true);\n }, [setIsDownloadModalOpen]);\n\n const handleCloseDeleteModal = useCallback(() => {\n setDeleteModalOpen(true);\n }, [setDeleteModalOpen]);\n\n const handleCloseCopyToModal = useCallback(() => {\n setCopyToModalOpen(true);\n }, [setCopyToModalOpen]);\n\n const handleOpenCopyToModal = useCallback(() => {\n setCopyToModalOpen(false);\n setEnabledBulkMode(false);\n setSelectedItems([]);\n }, [setEnabledBulkMode, setCopyToModalOpen, setSelectedItems]);\n\n const handleOpenDeleteModal = useCallback(() => {\n setIsDownloadModalOpen(false);\n }, [setIsDownloadModalOpen]);\n\n return (\n <>\n {enabledBulkMode ? (\n
\n \n \n \n \n \n {t('playlist-detail:all-clips')} ({selectedItems.length}/{playlistItems.length})\n \n \n\n \n {downloadPlaylistFeatureFlag ? (\n
\n \n
\n ) : null}\n\n \n\n \n\n
\n \n
\n\n
\n \n
\n\n {isDownloadModalOpen ? (\n \n ) : null}\n\n {trimModalOpen ? (\n \n ) : null}\n
\n
\n {deleteModalOpen ? (\n \n ) : null}\n\n {copyToModalOpen && (\n \n )}\n
\n ) : null}\n \n {isEmpty(playlistItems) ? (\n \n ) : (\n \n )}\n \n \n );\n};\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { useFetchRequest } from '../../hooks/useFetchRequest';\nimport { tacticalAnalysesFilters } from '../../routes';\nimport { TacticalAnalysesFilters } from '../useEpisodesWithFilters/types';\nimport { transformFilters } from '../utils';\n\nconst generateQueryRef = (recordingIds: string[]) => [`fetchTacticalAnalysesFilters:${recordingIds.join(',')}`];\n\nexport const useTacticalAnalysesFilters = (recordingIds: string[]): UseQueryResult => {\n const fetchQueryRef = generateQueryRef(recordingIds);\n\n return useFetchRequest({\n queryRef: fetchQueryRef,\n url: tacticalAnalysesFilters(recordingIds),\n transformer: transformFilters,\n options: {\n enabled: recordingIds.length > 0,\n },\n });\n};\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport {\n RecordingFiltersScenariosOrTacticsInside,\n RecordingFiltersTactic,\n RecordingFiltersTactics,\n RecordingsFilters,\n} from 'shared/types/recording/types';\nimport { TacticsVariants } from 'shared/types/tactics/types';\n\nimport { TacticalAnalysesPlaylistItemsResponse } from './types';\nimport { PlaylistItemWithoutVideoSources } from '../../../shared/types/playlist/types';\nimport { useMutationRequest } from '../../hooks/useMutationRequest';\nimport { transformPlaylistItem } from '../../playlist/transformers';\nimport { PlaylistItemApiResponse } from '../../playlist/types';\nimport { tacticalAnalysesAsItems } from '../../routes';\nimport { HTTPMethod } from '../../types';\nimport { transformFiltersForRequest } from '../utils';\n\nexport const TIMELINE_DEFAULT_FILTERS = {\n teams: [],\n eventsStarting: new Set([]),\n eventsEnding: new Set([]),\n scenarios: [],\n tactics: { offensive: [], defensive: [] },\n};\nexport const defaultRecordingsFiltersEvents = { teams: [], event: '', zones: [], players: [] };\nexport const defaultRecordingsFiltersTactic = (category: TacticsVariants): RecordingFiltersTactic => ({\n tacticalFundamentalType: '',\n teamIds: [],\n playerIds: [],\n category,\n});\n\nexport const defaultRecordingsFiltersTactics: RecordingFiltersTactics = {\n offensive: [defaultRecordingsFiltersTactic(TacticsVariants.OFFENSIVE)],\n defensive: [defaultRecordingsFiltersTactic(TacticsVariants.DEFENSIVE)],\n};\n\nexport const defaultRecordingFiltersScenariosOrTacticsInside: RecordingFiltersScenariosOrTacticsInside = {\n teams: [],\n zones: [],\n scenario: '',\n tactics: defaultRecordingsFiltersTactics,\n};\n\nexport const useTacticalAnalysesPlaylistItems = (): TacticalAnalysesPlaylistItemsResponse => {\n const { t } = useTranslation();\n\n const { mutate, isLoading, isError, isSuccess, data } = useMutationRequest<\n PlaylistItemApiResponse[],\n PlaylistItemWithoutVideoSources[]\n >({\n type: HTTPMethod.POST,\n errorMessage: t('api:use-tactical-analysis-filter.error'),\n transformer: (data: PlaylistItemApiResponse[]): PlaylistItemWithoutVideoSources[] => {\n return data.map((playlistItem) => transformPlaylistItem(playlistItem));\n },\n });\n\n const getFilteredItems = useCallback(\n (params: RecordingsFilters) => {\n mutate({ url: tacticalAnalysesAsItems, data: transformFiltersForRequest(params) });\n },\n [mutate],\n );\n\n return { getFilteredItems, isLoading, isError, isSuccess, data: !data ? [] : data };\n};\n","import { useCallback } from 'react';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { userPresetsBaseUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { UserPreset } from 'shared/types/user-preset/types';\n\nimport { transformUserPreset } from '../transformers';\nimport { PostUserPreset } from '../types';\n\nexport const useSaveUserPreset = () => {\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest[], UserPreset>({\n type: HTTPMethod.POST,\n transformer: transformUserPreset,\n });\n\n const savePreset = useCallback(\n ({\n data,\n onSuccess = () => {},\n }: {\n data: PostUserPreset;\n onSuccess?: (res: UserPreset) => void;\n }) => {\n mutate(\n { url: userPresetsBaseUrl, data },\n { onSuccess: (res: UserPreset) => onSuccess && onSuccess(res) },\n );\n },\n [mutate],\n );\n\n return { savePreset, isLoading, isError, isSuccess };\n};\n","import { UserPresetScope } from 'shared/types/user-preset/types';\n\nimport { USER_PRESET_KEYS } from './userPresetsKeys';\n\nexport const timelinePlayingModePreset = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.playingMode,\n} as const;\n\nexport const timelineSelectedTacticsPreset = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.selectedTactics,\n} as const;\n\nexport const timelineZoomPreset = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.zoomLevel,\n} as const;\n\nexport const timelineHeightPreset = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.height,\n} as const;\n\nexport const timelinePinScenariosPreset = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.pinScenarios,\n} as const;\n\nexport const timelineHeadersWidthPreset = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.headersWidth,\n} as const;\n\nexport const timelineAppliedFiltersPreset = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.timeLineAppliedFilters,\n} as const;\n\n// NOTE: not used in the app\nexport const timelineFiltersPreset = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.filters,\n};\n\nexport const timelineTimePreset = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.time,\n} as const;\n\nexport const timelineTeamIdFocus = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.teamIdFocus,\n} as const;\n\nexport const timelineShowBallPossession = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.showBallPossession,\n} as const;\n\nexport const timelineShowNoBallPossession = {\n scope: UserPresetScope.timeline,\n key: USER_PRESET_KEYS.showNoBallPossession,\n} as const;\n","import { UserPresetScope } from 'shared/types/user-preset/types';\n\nimport { USER_PRESET_KEYS } from './userPresetsKeys';\n\nexport const videoPlayerSpeedPreset = {\n scope: UserPresetScope.videoPlayer,\n key: USER_PRESET_KEYS.speed,\n} as const;\n","import { PlayingMode } from 'shared/components/video-player/types';\nimport { TacticIdOrAll } from 'shared/types';\nimport { PlaybackRate } from 'shared/types/payback-rates/payback-rates';\nimport { RecordingsFilters } from 'shared/types/recording/types';\nimport { UserPreset, UserPresetScope, UserPresetKeysUnion } from 'shared/types/user-preset/types';\nimport { ZoomLevelsType } from 'shared/types/zoom-range/zoomLevels';\n\nimport { playlistMultimatchAppliedFilters } from './userPresetsPlayList';\nimport {\n timelineAppliedFiltersPreset,\n timelineHeadersWidthPreset,\n timelineHeightPreset,\n timelinePinScenariosPreset,\n timelinePlayingModePreset,\n timelineSelectedTacticsPreset,\n timelineShowBallPossession,\n timelineShowNoBallPossession,\n timelineTeamIdFocus,\n timelineTimePreset,\n timelineZoomPreset,\n} from './userPresetsTimeline';\nimport { videoPlayerSpeedPreset } from './userPresetsVideoPlayer';\n\nclass PlaylistCommonUserPreset implements UserPreset {\n scope: UserPresetScope = UserPresetScope.playlist;\n key = '' as UserPresetKeysUnion;\n value = {} as T;\n ref?: string;\n}\n\nexport class PlaylistMultimatchAppliedFiltersPreset extends PlaylistCommonUserPreset {\n key = playlistMultimatchAppliedFilters.key;\n scope = playlistMultimatchAppliedFilters.scope;\n value: RecordingsFilters;\n ref: string;\n\n constructor(value: RecordingsFilters, ref: string) {\n super();\n this.value = value;\n this.ref = ref;\n }\n}\n\nclass CommonUserPreset implements UserPreset {\n scope: UserPresetScope = UserPresetScope.timeline;\n key = '' as UserPresetKeysUnion;\n value = {} as T;\n ref?: string;\n}\n\nexport class TimelinePlayingModePreset extends CommonUserPreset {\n key = timelinePlayingModePreset.key;\n scope = timelinePlayingModePreset.scope;\n value: PlayingMode;\n ref: string;\n\n constructor(value: PlayingMode, ref: string) {\n super();\n this.value = value;\n this.ref = ref;\n }\n}\n\nexport class TimelineZoomPreset extends CommonUserPreset {\n key = timelineZoomPreset.key;\n scope = timelineZoomPreset.scope;\n value: ZoomLevelsType;\n\n constructor(value: ZoomLevelsType) {\n super();\n this.value = value;\n }\n}\n\nexport class TimelineSelectedTacticsPreset extends CommonUserPreset {\n key = timelineSelectedTacticsPreset.key;\n scope = timelineSelectedTacticsPreset.scope;\n value: TacticIdOrAll[];\n ref: string;\n\n constructor(value: TacticIdOrAll[], ref: string) {\n super();\n this.value = value;\n this.ref = ref;\n }\n}\n\nexport class TimelineHeightPreset extends CommonUserPreset {\n key = timelineHeightPreset.key;\n scope = timelineHeightPreset.scope;\n value: number;\n\n constructor(value: number) {\n super();\n this.value = value;\n }\n}\n\nexport class TimelinePinScenariosPreset extends CommonUserPreset {\n key = timelinePinScenariosPreset.key;\n scope = timelinePinScenariosPreset.scope;\n value: boolean;\n\n constructor(value: boolean) {\n super();\n this.value = value;\n }\n}\n\nexport class TimelineAppliedFiltersPreset extends CommonUserPreset {\n key = timelineAppliedFiltersPreset.key;\n scope = timelineAppliedFiltersPreset.scope;\n value: RecordingsFilters;\n ref: string;\n\n constructor(value: RecordingsFilters, ref: string) {\n super();\n this.value = value;\n this.ref = ref;\n }\n}\n\nexport class TimelineHeadersWidthPreset extends CommonUserPreset {\n key = timelineHeadersWidthPreset.key;\n scope = timelineHeadersWidthPreset.scope;\n value: number;\n\n constructor(value: number) {\n super();\n this.value = value;\n }\n}\n\nexport class TimelineTimePreset extends CommonUserPreset {\n key = timelineTimePreset.key;\n scope = timelineTimePreset.scope;\n value: number;\n ref: string;\n\n constructor(value: number, ref: string) {\n super();\n this.value = value;\n this.ref = ref;\n }\n}\n\nexport class TimelineTeamIdFocusPreset extends CommonUserPreset {\n key = timelineTeamIdFocus.key;\n scope = timelineTeamIdFocus.scope;\n value: string;\n\n constructor(value: string, ref: string) {\n super();\n this.value = value;\n this.ref = ref;\n }\n}\n\nexport class TimelineShowBallPossession extends CommonUserPreset {\n key = timelineShowBallPossession.key;\n scope = timelineShowBallPossession.scope;\n value: boolean;\n\n constructor(value: boolean, ref: string) {\n super();\n this.value = value;\n this.ref = ref;\n }\n}\n\nexport class TimelineShowNoBallPossession extends CommonUserPreset {\n key = timelineShowNoBallPossession.key;\n scope = timelineShowNoBallPossession.scope;\n value: boolean;\n\n constructor(value: boolean, ref: string) {\n super();\n this.value = value;\n this.ref = ref;\n }\n}\n\nexport class VideoPlayerSpeedPreset extends CommonUserPreset {\n key = videoPlayerSpeedPreset.key;\n scope = videoPlayerSpeedPreset.scope;\n value: PlaybackRate;\n\n constructor(value: PlaybackRate) {\n super();\n this.value = value;\n }\n}\n","import { useCallback } from 'react';\n\nimport { useSaveUserPreset } from 'api/user-presets/use-save-user-preset';\nimport { PlaylistMultimatchAppliedFiltersPreset } from 'shared/constants/user-presets/userPresetsClasses';\n\nimport { RecordingsFilters } from '../../../recording/types';\n\nexport const useSavePlaylistMultimatchFiltersAppliedPreset = () => {\n const { savePreset } = useSaveUserPreset();\n\n return useCallback(\n (playlistId: string, filters: RecordingsFilters) => {\n const playingModePreset = new PlaylistMultimatchAppliedFiltersPreset(filters, playlistId);\n savePreset({ data: playingModePreset });\n },\n [savePreset],\n );\n};\n","import classNames from 'classnames';\n\nimport styles from './FilterContainer.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n disabled?: boolean;\n}\n\nexport const FilterContainer = ({ children, disabled }: Props) => {\n return
{children}
;\n};\n","import { Tab, Tabs, Theme } from '@mui/material';\nimport createStyles from '@mui/styles/createStyles';\nimport withStyles from '@mui/styles/withStyles';\n\nimport styles from './FilterTabs.module.scss';\n\ninterface FilterTabsProps {\n value: string;\n disabled?: boolean;\n onChange: (event: React.ChangeEvent, newValue: string) => void;\n children: React.ReactNode;\n}\n\nexport const FilterTabs = withStyles(\n createStyles({\n root: {\n width: '100%',\n },\n }),\n)((props: FilterTabsProps) => }} />);\n\ninterface FilterTabProps {\n active?: boolean;\n disabled?: boolean;\n label: string;\n value: string;\n}\n\nconst TabSelectedBadge = () => {\n return
;\n};\n\nconst TabUnSelectedBadge = () => {\n return
;\n};\n\nexport const FilterTab = withStyles((theme: Theme) =>\n createStyles({\n root: {\n textTransform: 'none',\n maxWidth: '100%',\n marginRight: theme.spacing(1),\n '&:focus': {\n opacity: 1,\n },\n },\n }),\n)((props: FilterTabProps) => {\n const { active, ...tabProps } = props;\n return (\n : }\n className={styles.tab}\n disableRipple\n {...tabProps}\n />\n );\n});\n\ninterface TabPanelProps {\n children?: React.ReactNode;\n index: any;\n value: any;\n}\n\nexport const FilterTabPanel = (props: TabPanelProps) => {\n const { children, value, index, ...other } = props;\n\n return (\n
\n );\n};\n","import { Fade } from '@mui/material';\n\nimport styles from './LoadingBlock.module.scss';\nimport Spinner from '../spinner';\ninterface Props {\n isLoading: boolean;\n children: React.ReactNode;\n}\n\nexport const LoadingBlock = ({ isLoading, children }: Props) => {\n return (\n
\n \n
\n \n
\n
\n {children}\n
\n );\n};\n","import {\n RecordingFiltersScenariosOrTacticsInside,\n RecordingsFilters,\n RecordingsFiltersEvents,\n} from 'shared/types/recording/types';\n\nexport enum ActionType {\n SET_EVENTS_STARTING_FILTER,\n SET_EVENTS_ENDING_FILTER,\n SET_RECORDING_IDS,\n SET_SCENARIOS_OR_TACTICS_INSIDE,\n RESET,\n}\n\nexport type Action =\n | { type: ActionType.SET_EVENTS_STARTING_FILTER; payload: RecordingsFiltersEvents | undefined }\n | { type: ActionType.SET_EVENTS_ENDING_FILTER; payload: RecordingsFiltersEvents | undefined }\n | { type: ActionType.SET_RECORDING_IDS; payload: string[] }\n | { type: ActionType.SET_SCENARIOS_OR_TACTICS_INSIDE; payload: RecordingFiltersScenariosOrTacticsInside | undefined }\n | { type: ActionType.RESET };\n\nexport const reducer = (state: RecordingsFilters, action: Action): RecordingsFilters => {\n switch (action.type) {\n case ActionType.RESET:\n return { recordingIds: state.recordingIds };\n\n case ActionType.SET_EVENTS_STARTING_FILTER: {\n return {\n ...state,\n eventsStarting: action.payload,\n };\n }\n\n case ActionType.SET_EVENTS_ENDING_FILTER: {\n return {\n ...state,\n eventsEnding: action.payload,\n };\n }\n\n case ActionType.SET_SCENARIOS_OR_TACTICS_INSIDE: {\n return {\n ...state,\n scenariosOrTacticsInside: action.payload,\n };\n }\n default:\n return state;\n }\n};\n","import { useCallback, useReducer } from 'react';\n\nimport {\n RecordingFiltersScenariosOrTacticsInside,\n RecordingsFilters,\n RecordingsFiltersEvents,\n} from 'shared/types/recording/types';\n\nimport { ActionType, reducer } from './reducer';\n\nexport const useMultipleRecordingsFilters = (initialFilters: RecordingsFilters) => {\n const [filters, dispatch] = useReducer(reducer, initialFilters);\n\n const reset = useCallback(() => {\n dispatch({ type: ActionType.RESET });\n }, [dispatch]);\n\n const setEventsStartingFilter = useCallback(\n (payload: RecordingsFiltersEvents | undefined) => {\n dispatch({ type: ActionType.SET_EVENTS_STARTING_FILTER, payload });\n },\n [dispatch],\n );\n\n const setEventsEndingFilter = useCallback(\n (payload: RecordingsFiltersEvents | undefined) => {\n dispatch({ type: ActionType.SET_EVENTS_ENDING_FILTER, payload });\n },\n [dispatch],\n );\n\n const setScenariosInsideAnEpisodeFilter = useCallback(\n (payload: RecordingFiltersScenariosOrTacticsInside | undefined) => {\n dispatch({ type: ActionType.SET_SCENARIOS_OR_TACTICS_INSIDE, payload });\n },\n [dispatch],\n );\n\n return {\n filters,\n reset,\n setEventsEndingFilter,\n setScenariosInsideAnEpisodeFilter,\n setEventsStartingFilter,\n };\n};\n","import React from 'react';\n\nimport styles from './ActiveFilters.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst ActiveFilters = ({ children }: Props) => {\n return
{children}
;\n};\n\nexport default ActiveFilters;\n","import React from 'react';\n\nimport styles from './FilterBlock.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst FilterBlock = ({ children }: Props) => {\n return
{children}
;\n};\n\nexport default FilterBlock;\n","import { Button, Stack } from '@mui/material';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\ninterface Props {\n onClick: () => void;\n}\n\nconst FilterBlockClear = ({ onClick }: Props) => {\n const { t } = useTranslation();\n\n return (\n \n \n \n );\n};\n\nexport default FilterBlockClear;\n","import classNames from 'classnames';\nimport React from 'react';\n\nimport { TeamTypes } from 'pages/tactical-analysis/api/types';\n\nimport styles from './FilterBlockStatus.module.scss';\n\nexport enum FilterBlockVariants {\n DEFAULT = 'default',\n NO_TEAM = 'noTeam',\n}\n\ninterface Props {\n variant?: TeamTypes | FilterBlockVariants;\n active?: boolean;\n}\n\nconst FilterBlockStatus = ({ active = false, variant = FilterBlockVariants.DEFAULT }: Props) => {\n return (\n \n );\n};\n\nexport default FilterBlockStatus;\n","import classNames from 'classnames';\nimport React from 'react';\n\nimport styles from './FilterColumn.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n expand?: boolean;\n}\n\nconst FilterColumn = ({ children, expand = false }: Props) => {\n return
{children}
;\n};\n\nexport default FilterColumn;\n","import { Fade } from '@mui/material';\nimport classNames from 'classnames';\n\nimport styles from './NotificationCircle.module.scss';\n\ntype Variants = 'error' | 'warning' | 'success' | 'primary';\n\ninterface Props {\n visible?: boolean;\n variant: Variants;\n}\n\nexport const NotificationCircle = ({ variant, visible = true }: Props) => {\n return (\n \n
\n \n );\n};\n","import { Button, ButtonProps } from '@mui/material';\nimport React from 'react';\n\nimport IconChevronDown from '../icons/icon-chevron-down';\nimport IconChevronUp from '../icons/icon-chevron-up';\n\ninterface Props {\n disabled?: boolean;\n type?: ButtonProps['type'];\n fullWidth?: ButtonProps['fullWidth'];\n isOpen: boolean;\n isSelected: boolean;\n onClick?: (event: React.MouseEvent) => void;\n title: string;\n size?: ButtonProps['size'];\n minWidth?: number;\n}\nexport const ButtonDropdown = ({\n disabled,\n isOpen,\n isSelected,\n onClick,\n title,\n size,\n type,\n fullWidth,\n minWidth = 192,\n}: Props) => {\n return (\n \n ) : (\n \n )\n }\n >\n {title}\n \n );\n};\n","import { Checkbox, Button, Grid, PopoverActions } from '@mui/material';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Fade from '@mui/material/Fade';\nimport Menu from '@mui/material/Menu';\nimport classNames from 'classnames';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { NotificationCircle } from 'shared/components/notification-circle';\n\nimport styles from './FilterSelect.module.scss';\nimport { ButtonDropdown } from '../button-dropdown';\n\ntype FilterSelectOption = {\n disabled?: boolean;\n displayName: string;\n value: string;\n};\n\nexport type FilterProps = {\n disabled?: boolean;\n displayName: string;\n invalid?: boolean;\n onUpdate: (values: string[]) => void;\n options: FilterSelectOption[];\n selectedValues?: string[];\n};\n\nexport const FilterMultiSelect = ({\n disabled = false,\n displayName,\n invalid = false,\n onUpdate,\n options,\n selectedValues = [],\n}: FilterProps) => {\n const { t } = useTranslation();\n const [values, setValues] = useState(selectedValues);\n const [isOpen, setIsOpen] = useState(false);\n const actionRef = useRef(null);\n const [anchorEl, setAnchorEl] = useState();\n\n useEffect(() => {\n setValues(selectedValues);\n }, [selectedValues]);\n\n const handleButtonClick = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n setIsOpen(true);\n },\n [setAnchorEl, setIsOpen],\n );\n\n const handleClose = useCallback(() => {\n if (!anchorEl) return;\n\n onUpdate(values);\n setAnchorEl(undefined);\n setIsOpen(false);\n }, [setIsOpen, setAnchorEl, anchorEl, values, onUpdate]);\n\n const handleAddValue = useCallback(\n (option: string) => {\n setValues((values) => [...values, option]);\n },\n [setValues],\n );\n\n const handleRemoveValue = useCallback(\n (option: string) => {\n setValues((values) => values.filter((value) => value !== option));\n },\n [setValues],\n );\n\n const currentOptions = options.filter((option) => values.includes(option.value));\n const title =\n currentOptions && values?.length > 0 ? currentOptions.map((option) => option.displayName).join(', ') : displayName;\n\n return (\n \n \n 0}\n isOpen={isOpen}\n disabled={Boolean(disabled)}\n />\n\n {isOpen && anchorEl && (\n \n \n \n \n {options.map((option) => (\n {\n !values?.includes(option.value) ? handleAddValue(option.value) : handleRemoveValue(option.value);\n }}\n >\n {option.value && }\n {option.displayName}\n
\n ))}\n \n \n \n \n \n \n \n \n \n )}\n \n );\n};\n","export enum TeamTypes {\n HOME = 'homeTeam',\n OPPONENT = 'opponentTeam',\n}\n","import memoize from 'lodash/memoize';\n\nimport { TeamTypes } from 'pages/tactical-analysis/api/types';\nimport { MatchTeam, MatchTeams } from 'shared/types/teams/types';\n\nexport const getTeamType = memoize((teamId: string, teams: MatchTeams): TeamTypes => {\n if (teamId === teams.homeTeam.id) return TeamTypes.HOME;\n return TeamTypes.OPPONENT;\n});\n\nexport const getPlayerName = (playerId: string, teams: MatchTeam[]): string | undefined =>\n teams.flatMap((team) => team.players).find((teamPlayer) => teamPlayer.id === playerId)?.name;\n","import { styled } from '@mui/material';\n\ninterface PlayerTabPanelProps {\n children?: React.ReactNode;\n index: any;\n value: any;\n}\n\nconst TabPanel = styled('div')(({ theme }) => ({\n padding: theme.spacing(2, 0),\n width: '100%',\n}));\n\nexport const FilterPlayerTabPanel = (props: PlayerTabPanelProps) => {\n const { children, value, index, ...other } = props;\n\n return (\n
\n );\n })}\n \n );\n};\n","import { Tab, Tabs, Theme } from '@mui/material';\nimport createStyles from '@mui/styles/createStyles';\nimport withStyles from '@mui/styles/withStyles';\n\nimport styles from './FilterPlayerTabs.module.scss';\n\ninterface FilterPlayerTabsProps {\n value: string;\n onChange: (event: React.ChangeEvent, newValue: string) => void;\n children: React.ReactNode;\n}\n\nexport const FilterPlayerTabs = withStyles(\n createStyles({\n root: {\n width: '100%',\n },\n }),\n)((props: FilterPlayerTabsProps) => (\n }} />\n));\n\ninterface FilterPlayerTabProps {\n active?: boolean;\n label: string;\n value: string;\n}\n\nexport const FilterPlayerTab = withStyles((theme: Theme) =>\n createStyles({\n root: {\n textTransform: 'none',\n maxWidth: '100%',\n '&:focus': {\n opacity: 1,\n },\n },\n }),\n)((props: FilterPlayerTabProps) => {\n const { active, ...tabProps } = props;\n return (\n <>\n \n \n );\n});\n","import { Button, ClickAwayListener, Fade, Menu, PopoverActions, Stack } from '@mui/material';\nimport flatten from 'lodash/flatten';\nimport isEqual from 'lodash/isEqual';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { getPlayerName } from 'pages/tactical-analysis/components/tactical-analysis/utils/get-team-type';\nimport IconClose from 'shared/components/icons/icon-close';\nimport { NotificationCircle } from 'shared/components/notification-circle';\nimport { MatchTeam, TeamPlayer } from 'shared/types';\n\nimport { FilterPlayerTabPanel } from './filter-player-tab-panel';\nimport { PlayersList } from './filter-players-list';\nimport styles from './FilterPlayer.module.scss';\nimport { ButtonDropdown } from '../button-dropdown';\nimport { FilterPlayerTab, FilterPlayerTabs } from '../filter-player-tab';\n\nexport type FilterProps = {\n disabled?: boolean;\n idx: number;\n displayName: string;\n filteredPlayers?: Set;\n onRemove?: () => void;\n onUpdate: (values: string[]) => void;\n teamsWithPlayers: MatchTeam[];\n selectedValues?: string[];\n showRemoveButton?: boolean;\n};\n\nconst getSelectedValues = (selectedValues: string[], players?: TeamPlayer[]) => {\n return selectedValues.filter((playerId) => players?.some((teamPlayer) => teamPlayer.id === playerId)) ?? [];\n};\n\nexport const FilterPlayer = ({\n disabled,\n idx,\n displayName,\n filteredPlayers,\n onRemove,\n onUpdate,\n teamsWithPlayers,\n selectedValues = [],\n showRemoveButton,\n}: FilterProps) => {\n const { t } = useTranslation();\n const [selectedTab, setSelectedTab] = useState('0');\n const [values, setValues] = useState(teamsWithPlayers.map((team) => getSelectedValues(selectedValues, team.players)));\n const [isOpen, setIsOpen] = useState(false);\n const actionRef = useRef(null);\n const [anchorEl, setAnchorEl] = useState();\n\n useEffect(() => {\n setValues((values) => {\n const newValues = teamsWithPlayers.map((team) => getSelectedValues(selectedValues, team.players));\n return !isEqual(values, newValues) ? newValues : values;\n });\n }, [selectedValues, teamsWithPlayers]);\n\n const hasInvalidPlayersSelected = useMemo(\n () =>\n selectedValues.some((player) => {\n if (!filteredPlayers) return false;\n return player !== '' && !filteredPlayers.has(player);\n }),\n [selectedValues, filteredPlayers],\n );\n\n const handleButtonClick = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n setIsOpen(true);\n },\n [setAnchorEl, setIsOpen],\n );\n\n const handleChangeTab = useCallback(\n (event: React.ChangeEvent, newValue: string) => {\n setSelectedTab(newValue);\n },\n [setSelectedTab],\n );\n\n const handleClose = useCallback(() => {\n if (!anchorEl) return;\n\n setAnchorEl(undefined);\n setIsOpen(false);\n }, [setAnchorEl, setIsOpen, anchorEl]);\n\n const handleChangeValues = (\n event: React.ChangeEvent,\n team: MatchTeam,\n checked: boolean,\n idx: number,\n ) => {\n setValues((values) => {\n let newValues: string[];\n const currentValues = flatten(values);\n\n if (event.currentTarget.id.startsWith('all-') && checked) {\n newValues = currentValues.filter((player) => !team.players.some((teamPlayer) => teamPlayer.id === player));\n } else {\n newValues = checked\n ? [...currentValues, event.currentTarget.id]\n : currentValues.filter((playerId) => event.currentTarget.id !== playerId);\n }\n\n onUpdate(newValues);\n return Object.assign([], values, { [idx]: newValues });\n });\n };\n\n const handleResetAll = useCallback(() => {\n setValues([]);\n onUpdate([]);\n }, [setValues, onUpdate]);\n\n const generateDisplayName = useCallback((): string => {\n const playerValues = values.reduce((acc, value) => {\n value.map((player) => acc.push(player));\n return acc;\n }, []);\n if (playerValues.length === 1) return getPlayerName(playerValues[0], teamsWithPlayers) || displayName;\n\n return `${playerValues.length} ${displayName}`;\n }, [values, displayName, teamsWithPlayers]);\n\n return (\n \n \n 0 || values[idx].some((value) => value.length > 0))}\n disabled={Boolean(disabled)}\n isOpen={isOpen}\n />\n {showRemoveButton && (\n
\n
\n \n
\n
\n )}\n {isOpen && anchorEl && (\n \n \n
\n <>\n \n \n \n \n {teamsWithPlayers.map((team, idx) => (\n \n ))}\n \n {teamsWithPlayers.map((team, idx) => (\n \n , checked: boolean) =>\n handleChangeValues(event, team, checked, idx)\n }\n />\n \n ))}\n \n
\n {t('recordings:filters:players.message')}\n
\n
\n \n
\n
\n \n
\n )}\n
\n );\n};\n","import { PopoverActions } from '@mui/material';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Fade from '@mui/material/Fade';\nimport Menu from '@mui/material/Menu';\nimport classNames from 'classnames';\nimport head from 'lodash/head';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport IconClose from 'shared/components/icons/icon-close';\nimport { NotificationCircle } from 'shared/components/notification-circle';\n\nimport styles from './FilterSelect.module.scss';\nimport { ButtonDropdown } from '../button-dropdown';\n\ntype FilterSelectOption = {\n disabled?: boolean;\n displayName: string;\n value: string;\n};\n\nexport type FilterProps = {\n disabled?: boolean;\n displayName: string;\n invalid?: boolean;\n onRemove?: () => void;\n onUpdate: (value: string) => void;\n options: FilterSelectOption[];\n selectedValue?: string;\n showRemoveButton?: boolean;\n};\n\nconst FilterSelect = ({\n disabled,\n displayName,\n invalid = false,\n onRemove,\n onUpdate,\n options,\n selectedValue = undefined,\n showRemoveButton,\n}: FilterProps) => {\n const [value, setValue] = useState(selectedValue);\n const [isOpen, setIsOpen] = useState(false);\n const actionRef = useRef(null);\n const [anchorEl, setAnchorEl] = useState();\n const filterId = 'filter-menu';\n\n useEffect(() => {\n if (value !== selectedValue) {\n setValue(selectedValue);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedValue]);\n\n const handleButtonClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n setIsOpen(true);\n };\n\n const handleClose = () => {\n if (!anchorEl) return;\n\n setAnchorEl(undefined);\n setIsOpen(false);\n };\n\n const currentOption = head(options.filter((option) => option.value === value));\n const title = currentOption && value ? currentOption.displayName : displayName;\n\n return (\n \n \n \n {showRemoveButton && (\n
\n
\n \n
\n
\n )}\n {isOpen && anchorEl && (\n \n \n
\n {options.map((option) => (\n {\n onUpdate(option.value);\n setValue(option.value);\n setIsOpen(false);\n }}\n >\n {option.displayName}\n
\n ))}\n \n \n
\n )}\n
\n );\n};\n\nexport default FilterSelect;\n","import { ZoneValues } from 'shared/types/recording/types';\n\nexport enum Zones {\n 'zone1' = 1,\n 'zone2' = 2,\n 'zone3' = 3,\n 'zone4' = 4,\n}\n\nexport interface FiltersStateEventsStartingAnEpisode {\n team?: string;\n tacticalScenario?: string;\n zones: ZoneValues;\n}\n\nexport interface FiltersStateScenariosInsideAnEpisode {\n team?: string;\n tacticalScenario?: string;\n zones: ZoneValues;\n fundamentals: {\n offensive: FiltersFundamentals;\n defensive: FiltersFundamentals;\n };\n}\n\nexport interface FiltersStateEventsEndingAnEpisode {\n team?: string;\n tacticalScenario?: string;\n zones: ZoneValues;\n}\n\nexport interface FundamentalWithPlayers {\n id: string;\n players: string[];\n}\n\nexport interface FiltersFundamentals {\n team?: string;\n fundamentals: FundamentalWithPlayers[];\n}\n\nexport interface FiltersState {\n eventsStartingAnEpisode: FiltersStateEventsStartingAnEpisode;\n eventsEndingAnEpisode: FiltersStateEventsEndingAnEpisode;\n scenariosInsideAnEpisode: FiltersStateScenariosInsideAnEpisode;\n}\n","import { styled, FormLabel, FormLabelProps } from '@mui/material';\nimport classnames from 'classnames';\nimport React from 'react';\n\n// NOTE: It's used in FilterZone.module.scss file\nconst LABEL_REQUIRED_CLASS_NAME = 'checkbox-label--checked';\nconst CONTENT_REQUIRED_CLASS_NAME = 'checkbox__content';\n\ntype Props = React.HTMLProps & {\n zone: number;\n id: string | number;\n labelProps?: FormLabelProps;\n};\n\nexport const Label = styled(FormLabel)({\n display: 'flex',\n flexWrap: 'wrap',\n overflow: 'hidden',\n});\n\nexport const CheckboxZone = ({ zone, id, checked, labelProps, ...restProps }: Props) => {\n const idString = id.toString();\n\n return (\n \n );\n};\n","import { PopoverActions } from '@mui/material';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Fade from '@mui/material/Fade';\nimport Menu from '@mui/material/Menu';\nimport filter from 'lodash/filter';\nimport map from 'lodash/map';\nimport some from 'lodash/some';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Zones } from 'pages/tactical-analysis/components/tactical-analysis/filters/types';\nimport styles from 'shared/components/filter-zone/FilterZone.module.scss';\n\nimport { CheckboxZone } from './checkbox-zone';\nimport { ZoneValues } from '../../types/recording/types';\nimport { ButtonDropdown } from '../button-dropdown';\n\nexport type FilterProps = {\n disabled?: boolean;\n displayName: string;\n onUpdate: (zones: ZoneValues) => void;\n selectedValue?: ZoneValues;\n};\n\nexport const defaultZoneValues: ZoneValues = {\n [Zones.zone1]: false,\n [Zones.zone2]: false,\n [Zones.zone3]: false,\n [Zones.zone4]: false,\n};\n\nconst FilterZone = ({ disabled, displayName, onUpdate, selectedValue = defaultZoneValues }: FilterProps) => {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const actionRef = useRef(null);\n const [anchorEl, setAnchorEl] = useState();\n const filterId = 'filter-menu';\n\n const generateDisplayName = useCallback((): string => {\n if (!some(selectedValue, (value) => value)) return displayName;\n\n return `${t('recordings:filters:zone', {\n count: filter(selectedValue, (value) => value).length,\n })} ${map(selectedValue, (value, zoneId) => ({ zone: zoneId, value }))\n .filter(({ value }) => value)\n .map((value) => {\n return `${value.zone}`;\n })\n .join(', ')}`;\n }, [displayName, selectedValue, t]);\n\n const handleSetValue = (zoneNumber: Zones) => {\n onUpdate({\n ...selectedValue,\n [zoneNumber]: !selectedValue[zoneNumber],\n });\n };\n\n const handleButtonClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n setIsOpen(true);\n };\n\n const handleClose = () => {\n if (!anchorEl) return;\n\n setAnchorEl(undefined);\n setIsOpen(false);\n };\n\n return (\n \n value)}\n disabled={Boolean(disabled)}\n isOpen={isOpen}\n />\n {isOpen && anchorEl && (\n \n \n
\n
\n {Array(4)\n .fill('')\n .map((_, idx: number) => {\n const zone = (idx + 1) as Zones;\n return (\n
\n {\n handleSetValue(zone);\n }}\n />\n
\n );\n })}\n
\n
\n \n
\n )}\n
\n );\n};\n\nexport default FilterZone;\n","import {\n EndPlayTacticalScenarioType,\n ListedTacticalScenarioType,\n StartPlayTacticalScenarioType,\n} from '../../types/episodes/types';\n\nexport const endPlayFundamentals: { [key in EndPlayTacticalScenarioType]: string } = {\n 'out_of_play|out_of_bounds|touch_line': 'Throw-in',\n 'out_of_play|out_of_bounds|attacking_goal_line': 'Corner Kick',\n 'out_of_play|out_of_bounds|defending_goal_line': 'Goal Kick',\n 'out_of_play|goal': 'Goal',\n 'out_of_play|stopped_by_referee|foul|offside': 'Offside',\n 'out_of_play|stopped_by_referee|foul': 'Foul (Free Kick)',\n 'out_of_play|stopped_by_referee|foul|in_penalty_area': 'Foul (Penalty Kick)',\n 'out_of_play|stopped_by_referee|other_stop': 'Other',\n 'out_of_play|end_of_play': 'End of time',\n};\n\nexport const startPlayFundamentals: { [key in StartPlayTacticalScenarioType]: string } = {\n 'in_play|pass|kickoff': 'Kick-off',\n 'in_play|pass|goal_kick': 'Goal Kick',\n 'in_play|pass|throw_in': 'Throw-in',\n 'in_play|pass|corner_kick': 'Corner Kick',\n 'in_play|pass|free_kick': 'Free Kick (Pass)',\n 'in_play|pass|drop_ball': 'Dropped ball',\n 'in_play|shot|free_kick': 'Free Kick (Shot)',\n 'in_play|shot|penalty_kick': 'Penalty Kick',\n 'in_play|shot|corner_kick': 'Corner Kick (Shot)',\n};\n\nexport const isEndingAPlayEvent = (event: string): boolean => {\n return Boolean(endPlayFundamentals[event as EndPlayTacticalScenarioType]);\n};\n\nexport const isStartingAPlayEvent = (event: string): boolean => {\n return Boolean(startPlayFundamentals[event as StartPlayTacticalScenarioType]);\n};\n\nexport const scenariosInsideAndEpisode: { [key in ListedTacticalScenarioType]: number } = {\n 'build-up': 1,\n 'build-up-ab': 2,\n 'build-up-cd': 3,\n 'possession-a': 4,\n 'possession-bc': 5,\n 'possession-d': 6,\n finishing: 7,\n 'possession-a-no-possession': 8,\n 'possession-bc-no-possession': 9,\n 'possession-d-no-possession': 10,\n 'recovery-ball': 11,\n 'change-of-possession': 12,\n 'change-of-possession-no-possession': 13,\n 'long-game': 14,\n};\n","import { Grid, Typography } from '@mui/material';\nimport map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { defaultRecordingsFiltersEvents } from 'api/recording/useEpisodesWithFilters/useTacticalAnalysesPlaylistItems';\nimport ActiveFilters from 'shared/components/active-filters';\nimport FilterBlock from 'shared/components/filter-block';\nimport FilterBlockClear from 'shared/components/filter-block-clear';\nimport FilterBlockStatus from 'shared/components/filter-block-status';\nimport FilterColumn from 'shared/components/filter-column';\nimport { FilterMultiSelect } from 'shared/components/filter-multi-select';\nimport { FilterPlayer } from 'shared/components/filter-player';\nimport FilterSelect from 'shared/components/filter-select';\nimport FilterZone from 'shared/components/filter-zone';\nimport { RecordingsFiltersEvents, ZoneValues } from 'shared/types/recording/types';\nimport { MatchTeam } from 'shared/types/teams/types';\nimport { isEndingAPlayEvent, isStartingAPlayEvent } from 'shared/utils/recordings';\n\nexport enum EventType {\n STARTING = 'starting',\n ENDING = 'ending',\n}\n\ninterface Props {\n disabled?: boolean;\n type: EventType;\n teams: MatchTeam[];\n actionsStarting: Set;\n filters?: RecordingsFiltersEvents;\n onUpdate: (filters: RecordingsFiltersEvents | undefined) => void;\n}\n\nconst checkAppliedFilters = (filters: RecordingsFiltersEvents) => {\n return Object.keys(filters).some((key) => filters[key as keyof RecordingsFiltersEvents].length);\n};\n\nexport const FilterEvents = ({\n actionsStarting,\n disabled = false,\n filters = defaultRecordingsFiltersEvents,\n onUpdate,\n teams,\n type,\n}: Props) => {\n const { t } = useTranslation();\n const [appliedFilter, setAppliedFilter] = useState(filters);\n const isAppliedFilters = useMemo(() => checkAppliedFilters(appliedFilter), [appliedFilter]);\n\n useEffect(() => {\n setAppliedFilter(filters);\n }, [filters]);\n\n useEffect(() => {\n onUpdate(appliedFilter);\n }, [appliedFilter, onUpdate]);\n\n const clearFilters = useCallback(() => {\n onUpdate(undefined);\n setAppliedFilter(defaultRecordingsFiltersEvents);\n }, [setAppliedFilter, onUpdate]);\n\n const handleUpdateZoneFilter = useCallback(\n (zones: ZoneValues) => {\n setAppliedFilter((appliedFilter) => ({\n ...appliedFilter,\n zones: reduce(\n zones,\n (acc, zone, idx) => {\n const value = parseFloat(idx);\n if (zone) acc.push(value);\n\n return acc;\n },\n [] as number[],\n ),\n }));\n },\n [setAppliedFilter],\n );\n\n const handleUpdateTeamFilter = useCallback(\n (teams: string[]) => {\n setAppliedFilter((appliedFilter) => ({\n ...appliedFilter,\n teams,\n }));\n },\n [setAppliedFilter],\n );\n\n const handleUpdateTacticalScenarioFilter = useCallback(\n (event: string) => {\n setAppliedFilter((appliedFilter) => ({\n ...appliedFilter,\n event,\n }));\n },\n [setAppliedFilter],\n );\n\n const handleUpdatePlayerFilter = useCallback(\n (players: string[]) => {\n setAppliedFilter((appliedFilter) => ({\n ...appliedFilter,\n players,\n }));\n },\n [setAppliedFilter],\n );\n\n const generateEventActionsOptions = useCallback(\n (action: Set) => {\n return Array.from(action.values())\n .filter((eventAction) => {\n return type === EventType.STARTING ? isStartingAPlayEvent(eventAction) : isEndingAPlayEvent(eventAction);\n })\n .map((eventAction) => ({\n displayName: t(`fundamentals:${type}-event-fundamentals.${eventAction}`),\n value: eventAction.toString(),\n }));\n },\n [t, type],\n );\n\n const teamsOptions = useMemo(\n () => [\n {\n displayName: t(`recordings:filters.events-${type}-episode.select-team`),\n value: '',\n },\n ...map(teams, (team) => ({\n displayName: team.name,\n value: team.id,\n })),\n ],\n [type, t, teams],\n );\n\n const eventsOptions = useMemo(\n () => [\n {\n displayName: t(`recordings:filters.events-${type}-episode.select-tactical-scenario`),\n value: '',\n },\n ...generateEventActionsOptions(actionsStarting),\n ],\n [t, type, actionsStarting, generateEventActionsOptions],\n );\n\n const teamsWithPlayers = useMemo(() => teams.filter((team) => team.players.length > 0), [teams]);\n const hasPlayers = teamsWithPlayers.length > 0;\n\n return (\n
\n \n \n {t(`recordings:filters.events-${type}-episode.title`)}\n {t(`recordings:filters.events-${type}-episode.description`)}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {isAppliedFilters && (\n \n \n \n )}\n \n \n \n \n
\n );\n};\n","import { Box, Grid } from '@mui/material';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const RecordingsFiltersActions = ({ children }: Props) => {\n return (\n \n \n {children}\n \n \n );\n};\n","export const offensiveTactics = [\n 'accompany-play-team-together',\n 'finishing',\n 'finishing-pass',\n 'identifying-passing-lines-under-pressure',\n 'long-ball',\n 'moving-behind-the-defensive-line',\n 'occupying-space-in-the-box',\n 'open-passing-lines-after-long-ball',\n 'overcoming-opponents-with-vertical-passes',\n 'positioning-behind-center-backs-when-lateral-balls',\n 'realized-emergency-support',\n 'realized-striker-support',\n 'realized-finishing-support',\n 'realized-horizontal-overcoming-support',\n 'realized-vertical-overcoming-support',\n 'receiving-between-lines',\n 'receiving-positioning-between-lines',\n 'passing-between-lines',\n 'space-between-defensive-line-and-halfway-line',\n 'supports',\n 'switch-of-play',\n 'balance-of-the-team-after-recovery',\n 'taking-advantage-of-defensive-line-imbalances',\n 'width-of-the-team',\n 'width-of-the-team-opposite-channel',\n 'goal-kick-start-long-outside-channels',\n 'goal-kick-start-long-inside-channels',\n 'goal-kick-start-short-outside-channels',\n 'goal-kick-start-short-inside-channels',\n 'cross-into-the-box',\n 'finishing-after-cross',\n 'progression-after-recovery',\n 'possession-after-recovery',\n 'receive-foul-after-recovery',\n 'goal-chance',\n 'goal',\n 'goal-assist',\n 'lost-ball',\n 'running-into-the-box',\n 'second-ball-offensive-winning-after-direct-play',\n 'second-ball-offensive-winning-after-finishing',\n 'second-ball-offensive-winning-after-cross',\n 'second-ball-offensive-winning-after-set-piece',\n 'completed-forward-pass',\n 'uncompleted-forward-pass',\n 'completed-backward-pass',\n 'uncompleted-backward-pass',\n 'completed-horizontal-pass',\n 'uncompleted-horizontal-pass',\n 'pass-behind-defensive-line',\n];\n\nexport const defensiveTactics = [\n 'balance-of-the-team',\n 'balance-of-the-team-after-loss',\n 'compactness-of-team',\n 'defending-against-the-possessor',\n 'defensive-line-imbalance-in-depth',\n 'defensive-line-imbalance-in-width',\n 'marking-opponents-inside-the-box',\n 'marking-supports',\n 'neutralizing-opponent-advantage-of-defensive-line-imbalance',\n 'hold-after-loss',\n 'press-after-loss',\n 'commit-foul-after-loss',\n 'recovered-ball',\n 'tackle',\n 'pressure-on-the-ball-possessor',\n 'moving-forward-during-organized-pressure',\n 'defending-moving-behind-the-defensive-line',\n 'defending-running-into-the-box',\n 'second-ball-defensive-winning-after-direct-play',\n 'second-ball-defensive-winning-after-finishing',\n 'second-ball-defensive-winning-after-cross',\n 'second-ball-defensive-winning-after-set-piece',\n 'clear-the-box',\n];\n\nexport const isOffensiveTactic = (tacticId: string) => offensiveTactics.includes(tacticId);\n","import { Grid } from '@mui/material';\nimport map from 'lodash/map';\nimport sortBy from 'lodash/sortBy';\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { FilterMultiSelect } from 'shared/components/filter-multi-select';\nimport { FilterPlayer } from 'shared/components/filter-player';\nimport FilterSelect from 'shared/components/filter-select';\nimport { RecordingFiltersTactic } from 'shared/types/recording/types';\nimport { TacticsVariants } from 'shared/types/tactics/types';\nimport { MatchTeam } from 'shared/types/teams/types';\n\ninterface Props {\n appliedFilters: RecordingFiltersTactic[];\n disabled?: boolean;\n handleRemove: (removeIdx: number) => void;\n onPlayersChange: (players: string[], idx: number) => void;\n onScenarioChange: (fundamental: string, idx: number) => void;\n onTeamsChange: (teams: string[], idx: number) => void;\n tactics: { id: string; name: string }[];\n teams: MatchTeam[];\n variant: TacticsVariants;\n}\n\nexport const RecordingTacticsPlayersFilter = ({\n appliedFilters,\n disabled,\n handleRemove,\n onPlayersChange,\n onScenarioChange,\n onTeamsChange,\n tactics,\n teams,\n variant,\n}: Props) => {\n const { t } = useTranslation();\n\n const teamsWithPlayers = useMemo(() => teams.filter((team) => team.players.length > 0), [teams]);\n\n const hasPlayers = teamsWithPlayers.length > 0;\n\n const teamsOptions = useMemo(\n () => [\n {\n displayName: t(`recordings:filters.scenarios-inside-episode.select-team`),\n value: '',\n },\n ...map(teams, (team) => ({\n displayName: team.name,\n value: team.id,\n })),\n ],\n [teams, t],\n );\n\n return (\n <>\n {appliedFilters.map((value, idx) => {\n const listOfTactics = tactics\n .map((tactic) => ({\n displayName: t(`fundamentals:fundamentals.${tactic.id}`),\n value: tactic.id,\n }))\n .filter((fundamental) => {\n return (\n appliedFilters.every((tactic) => tactic.tacticalFundamentalType !== fundamental.value) ||\n appliedFilters[idx].tacticalFundamentalType === fundamental.value\n );\n });\n\n const listOfTacticsOptions = [\n {\n displayName: t('recordings:filters.scenarios-inside-episode.select-tactical-fundamental'),\n value: '',\n },\n ...sortBy(listOfTactics, 'displayName'),\n ];\n\n return (\n \n {idx === 0 && (\n \n {\n onTeamsChange(value, idx);\n }}\n options={teamsOptions}\n selectedValues={value?.teamIds}\n />\n \n )}\n \n {\n onScenarioChange(value, idx);\n }}\n options={listOfTacticsOptions}\n />\n \n\n \n handleRemove(idx)}\n onUpdate={(values: string[]) => onPlayersChange(values, idx)}\n selectedValues={value.playerIds}\n showRemoveButton={idx !== 0}\n teamsWithPlayers={teamsWithPlayers}\n />\n \n \n );\n })}\n \n );\n};\n","import { Button, Grid, Paper } from '@mui/material';\nimport { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { defaultRecordingsFiltersTactic } from 'api/recording/useEpisodesWithFilters/useTacticalAnalysesPlaylistItems';\nimport ActiveFilters from 'shared/components/active-filters';\nimport FilterBlock from 'shared/components/filter-block';\nimport FilterBlockClear from 'shared/components/filter-block-clear';\nimport FilterBlockStatus from 'shared/components/filter-block-status';\nimport FilterColumn from 'shared/components/filter-column';\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { MatchTeam, TacticsVariants } from 'shared/types';\nimport { RecordingFiltersTactic } from 'shared/types/recording/types';\n\nimport { RecordingTacticsPlayersFilter } from './components/recording-tactics-players-filter/RecordingTacticsPlayersFilter';\n\ninterface Props {\n disabled?: boolean;\n filters: RecordingFiltersTactic[];\n onUpdate: (filters: RecordingFiltersTactic[]) => void;\n tactics: { id: string; name: string }[];\n teams: MatchTeam[];\n variant: TacticsVariants;\n}\n\nconst checkAppliedFilters = (filters: RecordingFiltersTactic[]) => {\n return filters.some(\n (filter) => filter.playerIds.length || filter.tacticalFundamentalType.length || filter.teamIds.length,\n );\n};\n\nexport const RecordingsFilterInsideAnEpisodeTactics = ({\n disabled,\n filters,\n onUpdate,\n tactics,\n teams,\n variant,\n}: Props) => {\n const { t } = useTranslation();\n const isFiltersApplied = checkAppliedFilters(filters);\n\n const handleSetTacticFilters = useCallback(\n (filters: RecordingFiltersTactic[]) => {\n onUpdate(filters);\n },\n [onUpdate],\n );\n\n const clearFilters = useCallback(() => {\n handleSetTacticFilters([defaultRecordingsFiltersTactic(variant)]);\n }, [handleSetTacticFilters, variant]);\n\n const handleUpdateTacticalScenarioFilter = useCallback(\n (fundamental: string, idx: number) => {\n handleSetTacticFilters(\n Object.assign([], filters, { [idx]: { ...filters[idx], tacticalFundamentalType: fundamental } }),\n );\n },\n [filters, handleSetTacticFilters],\n );\n\n const handleUpdatePlayersFilter = useCallback(\n (players: string[], idx: number) => {\n handleSetTacticFilters(\n Object.assign([], filters, {\n [idx]: {\n ...filters[idx],\n playerIds: players,\n },\n }),\n );\n },\n [filters, handleSetTacticFilters],\n );\n\n const handleUpdateTeamsFilter = useCallback(\n (teams: string[]) => {\n const tacticFiltersWithTeams = filters.map(\n (filters): RecordingFiltersTactic => ({\n ...filters,\n teamIds: teams,\n }),\n );\n\n handleSetTacticFilters(tacticFiltersWithTeams);\n },\n [filters, handleSetTacticFilters],\n );\n\n const handleRemove = useCallback(\n (removeIdx: number) => {\n const tactics = [...filters];\n tactics.splice(removeIdx, 1);\n\n handleSetTacticFilters(tactics);\n },\n [filters, handleSetTacticFilters],\n );\n\n const handleAddFundamental = useCallback(() => {\n const firstRowTeamIds = filters[0].teamIds;\n handleSetTacticFilters([...filters, { ...defaultRecordingsFiltersTactic(variant), teamIds: firstRowTeamIds }]);\n }, [handleSetTacticFilters, filters, variant]);\n\n return (\n
\n \n \n \n \n \n \n \n \n {isFiltersApplied && (\n \n \n \n )}\n \n \n \n \n }\n sx={{ alignItems: 'center', mt: 2 }}\n onClick={handleAddFundamental}\n >\n {t(`recordings:filters.scenarios-inside-episode.add-${variant}-fundamental`)}\n \n \n \n \n
\n );\n};\n","import { Grid, Typography } from '@mui/material';\nimport map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport { useCallback, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TacticalAnalysesTacticsFilters } from 'api/recording/useEpisodesWithFilters/types';\nimport { defaultRecordingFiltersScenariosOrTacticsInside } from 'api/recording/useEpisodesWithFilters/useTacticalAnalysesPlaylistItems';\nimport { defensiveTactics, offensiveTactics } from 'pages/tactical-analysis/config';\nimport ActiveFilters from 'shared/components/active-filters';\nimport FilterBlock from 'shared/components/filter-block';\nimport FilterBlockClear from 'shared/components/filter-block-clear';\nimport FilterBlockStatus from 'shared/components/filter-block-status';\nimport FilterColumn from 'shared/components/filter-column';\nimport { FilterMultiSelect } from 'shared/components/filter-multi-select';\nimport FilterSelect from 'shared/components/filter-select';\nimport FilterZone from 'shared/components/filter-zone';\nimport { ListedTacticalScenarioType } from 'shared/types/episodes/types';\nimport {\n RecordingFiltersScenariosOrTacticsInside,\n RecordingFiltersTactic,\n ZoneValues,\n} from 'shared/types/recording/types';\nimport { TacticsVariants } from 'shared/types/tactics/types';\nimport { MatchTeam } from 'shared/types/teams/types';\nimport { scenariosInsideAndEpisode } from 'shared/utils/recordings';\n\nimport { RecordingsFilterInsideAnEpisodeTactics } from './components/recordings-filters-inside-an-episode-tactics/RecordingsFilterInsideAnEpisodeTactics';\n\ninterface Props {\n disabled?: boolean;\n filters?: RecordingFiltersScenariosOrTacticsInside;\n onUpdate: (filters: RecordingFiltersScenariosOrTacticsInside) => void;\n scenarios: { id: string; name: string }[];\n tactics: TacticalAnalysesTacticsFilters;\n teams: MatchTeam[];\n}\n\nexport const RecordingsFiltersInsideAnEpisode = ({\n disabled = false,\n filters = defaultRecordingFiltersScenariosOrTacticsInside,\n onUpdate,\n scenarios,\n tactics,\n teams,\n}: Props) => {\n const { t } = useTranslation();\n const isFiltersApplied = useMemo(\n () => filters.teams.length || filters.scenario.length || filters.zones.length,\n [filters],\n );\n\n const clearFilters = useCallback(() => {\n onUpdate({\n ...filters,\n teams: [],\n scenario: '',\n zones: [],\n });\n }, [filters, onUpdate]);\n\n const handleUpdateZoneFilter = useCallback(\n (zones: ZoneValues) => {\n onUpdate({\n ...filters,\n zones: reduce(\n zones,\n (acc, zone, idx) => {\n const value = parseFloat(idx);\n if (zone) acc.push(value);\n\n return acc;\n },\n [] as number[],\n ),\n });\n },\n [onUpdate, filters],\n );\n\n const handleUpdateTeamFilter = useCallback(\n (teams: string[]) => {\n onUpdate({\n ...filters,\n teams,\n });\n },\n [onUpdate, filters],\n );\n\n const handleUpdateTacticalScenarioFilter = useCallback(\n (scenario: string) => {\n onUpdate({\n ...filters,\n scenario,\n });\n },\n [onUpdate, filters],\n );\n\n const handleUpdateOffensiveTacticsAndPlayers = useCallback(\n (offensiveTacticFilters: RecordingFiltersTactic[]) => {\n onUpdate({\n ...filters,\n tactics: {\n ...filters.tactics,\n offensive: offensiveTacticFilters,\n },\n });\n },\n [filters, onUpdate],\n );\n\n const handleUpdateDefensiveTacticsAndPlayers = useCallback(\n (defensiveTacticFilters: RecordingFiltersTactic[]) => {\n onUpdate({\n ...filters,\n tactics: {\n ...filters.tactics,\n defensive: defensiveTacticFilters,\n },\n });\n },\n [filters, onUpdate],\n );\n\n const scenariosOptions = useMemo(\n () => [\n {\n displayName: t('recordings:filters.scenarios-inside-episode.select-tactical-scenario'),\n value: '',\n },\n ...Array.from(scenarios.values())\n .filter((tacticalScenario) => {\n const key = tacticalScenario.id as ListedTacticalScenarioType;\n return !!scenariosInsideAndEpisode[key];\n })\n .sort(({ id: a }, { id: b }) => {\n return (\n scenariosInsideAndEpisode[a as ListedTacticalScenarioType] -\n scenariosInsideAndEpisode[b as ListedTacticalScenarioType]\n );\n })\n .map((tacticalScenario) => ({\n displayName: t(`fundamentals:tactical-scenario-types.${tacticalScenario.id}`),\n value: tacticalScenario.id.toString(),\n })),\n ],\n [scenarios, t],\n );\n\n const teamsOptions = useMemo(\n () => [\n {\n displayName: t(`recordings:filters.scenarios-inside-episode.select-team`),\n value: '',\n },\n ...map(teams, (team) => ({\n displayName: team.name,\n value: team.id,\n })),\n ],\n [teams, t],\n );\n\n return (\n
\n \n \n {t('recordings:filters.scenarios-inside-episode.title')}\n {t('recordings:filters.scenarios-inside-episode.description')}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {isFiltersApplied > 0 && (\n \n \n \n )}\n \n \n \n \n {t('recordings:filters.scenarios-inside-episode.select-fundamentals')}\n \n offensiveTactics.includes(tactic.tacticalFundamentalType) || tactic.tacticalFundamentalType === '',\n )}\n onUpdate={handleUpdateOffensiveTacticsAndPlayers}\n tactics={tactics.offensive}\n teams={teams}\n variant={TacticsVariants.OFFENSIVE}\n />\n \n defensiveTactics.includes(tactic.tacticalFundamentalType) || tactic.tacticalFundamentalType === '',\n )}\n onUpdate={handleUpdateDefensiveTacticsAndPlayers}\n tactics={tactics.defensive}\n teams={teams}\n variant={TacticsVariants.DEFENSIVE}\n />\n \n \n
\n );\n};\n","import isEqual from 'lodash/isEqual';\n\nimport {\n defaultRecordingFiltersScenariosOrTacticsInside,\n defaultRecordingsFiltersEvents,\n} from 'api/recording/useEpisodesWithFilters/useTacticalAnalysesPlaylistItems';\nimport { RecordingsFilters } from 'shared/types/recording/types';\n\nconst isTacticsApplied = (\n tactics: Required['scenariosOrTacticsInside']['tactics']['offensive' | 'defensive'],\n) => {\n return tactics.some(\n (tactic) => tactic.playerIds.length || tactic.tacticalFundamentalType.length || tactic.teamIds.length,\n );\n};\n\nconst isAppliedInsideFilters = (filters: RecordingsFilters['scenariosOrTacticsInside']) => {\n if (!filters) {\n return false;\n }\n\n if (filters.teams.length || filters.zones.length || filters.scenario.length) {\n return true;\n }\n\n return isTacticsApplied(filters.tactics.defensive) || isTacticsApplied(filters.tactics.offensive);\n};\n\nexport const getFilterStatus = (filters: RecordingsFilters) => {\n const areFiltersStartingApplied =\n Boolean(filters.eventsStarting) && !isEqual(filters.eventsStarting, defaultRecordingsFiltersEvents);\n const areFiltersEndingApplied =\n Boolean(filters.eventsEnding) && !isEqual(filters.eventsEnding, defaultRecordingsFiltersEvents);\n const areFiltersInsideApplied =\n Boolean(filters.scenariosOrTacticsInside) &&\n isAppliedInsideFilters(filters?.scenariosOrTacticsInside) &&\n !isEqual(filters.scenariosOrTacticsInside, defaultRecordingFiltersScenariosOrTacticsInside);\n\n return {\n areFiltersEndingApplied,\n areFiltersStartingApplied,\n areFiltersInsideApplied,\n };\n};\n","import { LoadingButton } from '@mui/lab';\nimport { Button, Grid } from '@mui/material';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TacticalAnalysesFilters } from 'api/recording/useEpisodesWithFilters/types';\nimport { FilterContainer } from 'shared/components/filter-container';\nimport { FilterTab, FilterTabPanel, FilterTabs } from 'shared/components/filter-tabs';\nimport { LoadingBlock } from 'shared/components/loading-block';\nimport { RecordingsFilters } from 'shared/types/recording/types';\n\nimport { useMultipleRecordingsFilters } from './hooks/use-multiple-recordings-filters/useMultipleRecordingsFilters';\nimport { FilterEvents, EventType } from './ui/filter-events/FilterEvents';\nimport { RecordingsFiltersActions } from './ui/recordings-filters-actions/RecordingsFiltersActions';\nimport { RecordingsFiltersInsideAnEpisode } from './ui/recordings-filters-inside-an-episode/RecordingsFiltersInsideAnEpisode';\nimport { getFilterStatus } from './utils/getFilterStatus';\n\ninterface Props {\n filtersData: TacticalAnalysesFilters;\n recordingIds: string[];\n isLoadingFilters: boolean;\n isLoading: boolean;\n isDisabled: boolean;\n onApply: (filters: RecordingsFilters) => void;\n applyButtonLabel: string;\n applyButtonDefaultLabel: string;\n resetButtonLabel: string;\n onUpdate?: (filters: RecordingsFilters) => void;\n getFilteredItems?: (params: RecordingsFilters) => void;\n appliedFilters?: RecordingsFilters;\n clearFilters?: () => void;\n}\n\nconst Tabs = {\n Starting: '0',\n Inside: '1',\n Ending: '2',\n};\n\nexport const MultiAnalysisFilters = ({\n recordingIds,\n applyButtonLabel,\n applyButtonDefaultLabel,\n resetButtonLabel,\n isDisabled,\n filtersData,\n isLoading,\n isLoadingFilters,\n appliedFilters,\n onUpdate,\n getFilteredItems,\n onApply,\n clearFilters,\n}: Props) => {\n const { filters, reset, setEventsEndingFilter, setEventsStartingFilter, setScenariosInsideAnEpisodeFilter } =\n useMultipleRecordingsFilters(appliedFilters ? { ...appliedFilters } : { recordingIds });\n\n const isPrevAppliedFilters = !!appliedFilters?.recordingIds?.length;\n const { areFiltersStartingApplied, areFiltersInsideApplied, areFiltersEndingApplied } = getFilterStatus(filters);\n const areFiltersApplied = areFiltersStartingApplied || areFiltersEndingApplied || areFiltersInsideApplied;\n\n useEffect(() => {\n onUpdate && onUpdate(filters);\n }, [areFiltersApplied, filters, onUpdate]);\n\n const handleOnApply = useCallback(() => {\n if (clearFilters && isPrevAppliedFilters && !areFiltersApplied) {\n clearFilters();\n return;\n }\n\n onApply(filters);\n }, [areFiltersApplied, clearFilters, filters, isPrevAppliedFilters, onApply]);\n\n const { t } = useTranslation();\n const [selectedTabIndex, setSelectedTabIndex] = useState(Tabs.Starting);\n\n const handleTabChange = useCallback((event: React.ChangeEvent, newValue: string) => {\n setSelectedTabIndex(newValue);\n }, []);\n\n const areFiltersDisabled = recordingIds.length === 0;\n\n useEffect(() => {\n if (getFilteredItems && filters.recordingIds.length > 0 && areFiltersApplied) {\n getFilteredItems(filters);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filters, getFilteredItems]);\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {areFiltersApplied ? applyButtonLabel : applyButtonDefaultLabel}\n \n \n \n \n \n );\n};\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useAddManyToPlaylist } from 'api/playlist/useAddManyToPlaylist';\nimport { invalidatePlaylistQuery } from 'api/playlist/usePlaylist';\nimport { TacticalAnalysesFilters } from 'api/recording/useEpisodesWithFilters/types';\nimport { useTacticalAnalysesPlaylistItems } from 'api/recording/useEpisodesWithFilters/useTacticalAnalysesPlaylistItems';\nimport { useMapVideos } from 'entities/playlist/hooks/use-map-videos/useMapVideos';\nimport { MultiAnalysisFilters } from 'features/multi-analysis-filters/MultiAnalysisFilters';\nimport { useVideoPlayerActions } from 'shared/components/video-player';\nimport { Playlist } from 'shared/types';\nimport { RecordingsFilters } from 'shared/types/recording/types';\n\nimport { PostNewPlaylistItem } from '../../../../../../../../api/playlist/types';\n\ninterface Props {\n appliedFilters: RecordingsFilters | undefined;\n filtersData: TacticalAnalysesFilters;\n isLoadingRecordings: boolean;\n onClose: () => void;\n onUpdate: (filters: RecordingsFilters) => void;\n playlistId: string;\n}\n\nexport const MultiAnalysisFiltersPlaylist = ({\n appliedFilters,\n filtersData,\n isLoadingRecordings,\n onClose,\n onUpdate,\n playlistId,\n}: Props) => {\n const { t } = useTranslation();\n const mapVideos = useMapVideos();\n const actions = useVideoPlayerActions();\n\n const { addManyToPlaylist, isLoading: isAddManyToPlaylistLoading } = useAddManyToPlaylist();\n\n const { isLoading: isLoadingFilteredData, getFilteredItems, data } = useTacticalAnalysesPlaylistItems();\n\n const addPlaylistItemsToPlaylist = useCallback(() => {\n if (!(data.length > 0)) return;\n const playlistItems: PostNewPlaylistItem[] = data\n .filter((playlistItem) => playlistItem.origin)\n .map((playlistItem) => {\n return {\n endTime: playlistItem.endTime,\n name: playlistItem.name || '',\n playlistId,\n startTime: playlistItem.startTime,\n recordingId: playlistItem.recordingId,\n fundamentalsSelected: playlistItem.fundamentalsSelected,\n };\n });\n addManyToPlaylist({\n items: playlistItems,\n options: {\n onSuccess: (response: Playlist) => {\n const playlistItems = mapVideos(response);\n actions.replacePlaylistItems(playlistItems);\n invalidatePlaylistQuery();\n onClose();\n },\n },\n });\n }, [mapVideos, onClose, actions, data, addManyToPlaylist, playlistId]);\n\n return (\n \n );\n};\n","import { Box } from '@mui/material';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const RecordingsFiltersContent = ({ children }: Props) => {\n return (\n \n {children}\n \n );\n};\n","import { Box } from '@mui/material';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const RecordingsFiltersHeader = ({ children }: Props) => {\n return (\n \n {children}\n \n );\n};\n","import { useInfiniteQuery } from '@tanstack/react-query';\nimport isEmpty from 'lodash/isEmpty';\nimport omitBy from 'lodash/omitBy';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport { queryClient } from 'api/config';\nimport { useBackendApi } from 'api/hooks/useBackendApi';\nimport { recordingsByNameUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { RecordingByName } from 'shared/types/recording/types';\n\nimport { transformRecordingByName } from '../transformers';\nimport { RecordingByNameAPIResponse } from '../types';\n\nconst transformRecordings = (data: {\n content: RecordingByNameAPIResponse[];\n page: { totalPages: number; number: number };\n}) => {\n return {\n data: {\n recordings: data.content.map(transformRecordingByName),\n page: data.page,\n },\n nextCursor: data.page.totalPages > data.page.number ? (data.page.number + 1).toString() : undefined,\n };\n};\n\ninterface useRecordingsByNameInterface {\n data: RecordingByName[];\n fetchNextPage: () => void;\n isLoading: boolean;\n isSuccess: boolean;\n isFetching: boolean;\n isError: boolean;\n isEnabled: boolean;\n setName: (name: string) => void;\n setRecordingIds: (recordingIds: string[]) => void;\n setPageSize: (page: number) => void;\n setEnabled: (isEnabled: boolean) => void;\n removeQueries: () => void;\n enabled?: boolean;\n}\n\ninterface Params {\n enabled?: boolean;\n}\n\nconst PAGE_SIZE = 10;\nconst recordingsByNameQueryRef = ['recordings-by-name'];\n\nconst getQueryParamsString = (queryParams: { size: string; name: string; recordingIds: string[]; page: string }) => {\n const { recordingIds, ...rest } = queryParams;\n const params = { ...rest, recordingIds: recordingIds.join(',') };\n return new URLSearchParams({ ...omitBy(params, isEmpty) }).toString();\n};\n\nconst getUrl = ({\n name,\n recordingIds,\n size,\n page,\n}: {\n size: string;\n name: string;\n recordingIds: string[];\n page: string;\n}): string => `${recordingsByNameUrl}?${getQueryParamsString({ name, recordingIds, size: size, page: page })}`;\n\nexport const useRecordingsByName = ({ enabled = true }: Params = {}): useRecordingsByNameInterface => {\n const [name, setName] = useState('');\n const [isQueryEnabled, setIsQueryEnabled] = useState(enabled);\n const [pageSize, setPageSize] = useState(PAGE_SIZE);\n const [recordingsIds, setRecordingIds] = useState([]);\n\n const removeQueries = useCallback(() => queryClient.removeQueries(recordingsByNameQueryRef), []);\n\n const { data, isLoading, isFetching, isSuccess, isError, fetchNextPage } = useInfiniteQuery(\n [recordingsByNameQueryRef, name, pageSize],\n ({ queryKey: [, nameParam, pageSizeParam], pageParam = 0 }) => {\n return useBackendApi(\n getUrl({\n name: nameParam.toString(),\n recordingIds: recordingsIds,\n size: pageSizeParam.toString(),\n page: pageParam,\n }),\n HTTPMethod.GET,\n transformRecordings,\n );\n },\n {\n getNextPageParam: (lastPage: { nextCursor: number }) => {\n return lastPage.nextCursor;\n },\n enabled: isQueryEnabled,\n },\n );\n\n const pages = useMemo(() => {\n return data?.pages?.length\n ? data.pages.reduce((acc: RecordingByName[], page: any) => {\n return acc.concat(page.data.recordings);\n }, [])\n : [];\n }, [data?.pages]);\n\n return {\n data: pages,\n fetchNextPage,\n isLoading,\n isFetching,\n isSuccess,\n isError,\n isEnabled: isQueryEnabled,\n removeQueries,\n setName,\n setPageSize,\n setEnabled: setIsQueryEnabled,\n setRecordingIds,\n };\n};\n","import classNames from 'classnames';\nimport React from 'react';\n\nimport { TeamTypes } from 'pages/tactical-analysis/api/types';\nimport IconClose from 'shared/components/icons/icon-close';\nimport { IconSizes } from 'shared/components/icons/svg-icon/SvgIcon';\n\nimport styles from './ActiveFilter.module.scss';\n\nexport enum DefaultVariant {\n DEFAULT = 'default',\n}\n\nexport type ActiveFilterTypes = TeamTypes | DefaultVariant;\n\ninterface Props {\n action?: string;\n size?: IconSizes;\n closeButton?: boolean;\n contained?: boolean;\n logo?: React.ReactNode;\n onClose?: () => void;\n title?: string | React.ReactNode;\n variant?: TeamTypes | DefaultVariant;\n hasTeamFocus?: boolean;\n}\n\nconst ActiveFilter = ({\n action,\n closeButton = false,\n logo,\n title,\n onClose,\n size,\n variant = DefaultVariant.DEFAULT,\n contained = false,\n hasTeamFocus = false,\n}: Props) => {\n return (\n \n {logo && logo}\n {title && title}\n {action && {action}}\n {closeButton && (\n \n )}\n \n );\n};\n\nexport default ActiveFilter;\n","import { useCallback } from 'react';\n\nimport ActiveFilter from 'shared/components/active-filter';\nimport { IconSizes } from 'shared/components/icons/svg-icon/SvgIcon';\nimport { RecordingByName } from 'shared/types/recording/types';\n\ninterface Props {\n onRemove: (recordingId: string) => void;\n recording: RecordingByName;\n size?: IconSizes;\n}\n\nexport const ActiveRecordingFilter = ({ recording, onRemove, size = 'medium' }: Props) => {\n const isScoreAvailable = recording.homeTeamScore !== null && recording.awayTeamScore !== null;\n\n const handleOnRemove = useCallback(() => {\n onRemove(recording.id);\n }, [onRemove, recording]);\n\n return (\n \n {recording.name}\n {isScoreAvailable && (\n \n {' '}\n ({recording.homeTeamScore}-{recording.awayTeamScore})\n \n )}\n \n }\n />\n );\n};\n","import { Box, alpha, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const HeaderAddClipsContainer = styled(Box)(({ theme }) => ({\n position: 'relative',\n padding: theme.spacing(2),\n backgroundColor: theme.palette.common.white,\n // TODO get from theme\n border: `1px solid ${Colors.ghost}`,\n borderRadius: '4px',\n boxShadow: `0 4px 8px ${alpha(theme.palette.text.primary, 0.2)}`,\n}));\n","import { Box, Checkbox, Grid, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nimport { useDates } from 'shared/hooks/use-dates';\nimport { RecordingByName } from 'shared/types/recording/types';\n\ninterface ResultsProps {\n recording: RecordingByName;\n isChecked: boolean;\n}\n\nexport const RecordingResult = ({ recording, isChecked }: ResultsProps) => {\n const { dateToString } = useDates();\n\n const isScoreAvailable = recording.homeTeamScore !== null && recording.awayTeamScore !== null;\n\n return (\n \n \n \n \n \n \n \n \n \n {recording.name}\n \n {isScoreAvailable && (\n \n ({recording.homeTeamScore}-{recording.awayTeamScore})\n \n )}\n \n \n \n \n \n {/* TODO define variant styles in theme */}\n \n {dateToString(recording.date)}\n \n \n \n );\n};\n","import { Button, Grid } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\ninterface Props {\n children: React.ReactNode;\n onApply: () => void;\n onResetRecordings: () => void;\n}\n\nexport const ResultsWrapper = ({ children, onApply, onResetRecordings }: Props) => {\n const { t } = useTranslation();\n\n const handleOnSubmit = useCallback(\n (event: React.FormEvent) => {\n event.preventDefault();\n onApply();\n },\n [onApply],\n );\n\n return (\n
\n \n \n \n \n \n \n {children}\n \n \n \n \n \n \n
\n );\n};\n","import { useCallback, useEffect } from 'react';\n\nimport { useRecordingsByName } from 'api/recording/useRecordingsByName/useRecordingsByName';\nimport { RecordingByName } from 'shared/types/recording/types';\n\ntype Options = {\n setRecordings: (recordings: RecordingByName[]) => void;\n};\n\nexport const useSyncRecordingsSelection = ({ setRecordings }: Options) => {\n const fetchRecordingsByName = useRecordingsByName({ enabled: false });\n\n useEffect(() => {\n if (fetchRecordingsByName.isEnabled && fetchRecordingsByName.data) {\n setRecordings(fetchRecordingsByName.data);\n }\n }, [fetchRecordingsByName.data, fetchRecordingsByName.isEnabled, setRecordings]);\n\n const handleSearchRecordings = useCallback(\n (recordingIds: string[]) => {\n fetchRecordingsByName.setPageSize(recordingIds.length);\n fetchRecordingsByName.setRecordingIds(recordingIds);\n fetchRecordingsByName.setEnabled(recordingIds.length > 0);\n },\n [fetchRecordingsByName],\n );\n\n return useCallback(\n (recordings: RecordingByName[], recordingIds: string[]) => {\n if (recordingIds.length === 0) return;\n\n recordings.length === 0 ? handleSearchRecordings(recordingIds) : fetchRecordingsByName.setEnabled(false);\n },\n [handleSearchRecordings, fetchRecordingsByName],\n );\n};\n","import { Box, ClickAwayListener, Grid, IconButton, ListItem, Popper, Tooltip } from '@mui/material';\nimport { PopperProps } from '@mui/material/Popper';\nimport isEmpty from 'lodash/isEmpty';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useRecordingsByName } from 'api/recording/useRecordingsByName/useRecordingsByName';\nimport ActiveFilter from 'shared/components/active-filter';\nimport ActiveFilters from 'shared/components/active-filters';\nimport { Autocomplete } from 'shared/components/autocomplete';\nimport { ButtonDropdown } from 'shared/components/button-dropdown';\nimport { IconInfo } from 'shared/components/icons/icon-info';\nimport { RecordingByName } from 'shared/types/recording/types';\n\nimport { ActiveRecordingFilter } from './components/active-recording-filter/ActiveRecordingFilter';\nimport { HeaderAddClipsContainer } from './components/header-add-clips-container/HeaderAddClipsContainer';\nimport { RecordingResult } from './components/recording-result/RecordingResult';\nimport { ResultsWrapper } from './components/results-wrapper/ResultsWrapper';\nimport { useSyncRecordingsSelection } from './hooks/useSyncRecordingsSelection';\nimport styles from './SelectRecordings.module.scss';\n\nconst PopperWrapper: React.JSXElementConstructor = (props) => {\n return
{props.children as React.ReactNode}
;\n};\n\ninterface Props {\n onChange: (oldRecordings: RecordingByName[], recordings: RecordingByName[]) => void;\n recordingIds: string[];\n}\n\nexport const SelectRecordings = ({ recordingIds, onChange }: Props) => {\n const [recordings, setRecordings] = useState([]);\n const { t } = useTranslation();\n const [anchorEl, setAnchorEl] = React.useState(null);\n const [autocompleteValues, setAutocompleteValues] = useState([]);\n const syncRecordings = useSyncRecordingsSelection({ setRecordings });\n\n useEffect(() => {\n syncRecordings(recordings, recordingIds);\n }, [syncRecordings, recordings, recordingIds]);\n\n const { data: recordingsByNameData, isLoading, setName, fetchNextPage, removeQueries } = useRecordingsByName();\n\n const isOpen = Boolean(anchorEl);\n\n const close = useCallback(() => {\n setName('');\n removeQueries();\n setAnchorEl(null);\n }, [setAnchorEl, setName, removeQueries]);\n\n const open = useCallback(\n (event: React.MouseEvent) => {\n setAutocompleteValues(recordings);\n setAnchorEl(event.currentTarget);\n },\n [setAutocompleteValues, recordings],\n );\n\n const handleAddClipsClick = useCallback(\n (event: React.MouseEvent) => {\n isOpen ? close() : open(event);\n },\n [isOpen, close, open],\n );\n\n const handleUpdateValue = useCallback(\n (newValues: RecordingByName[] | null) => {\n if (newValues === null) return;\n\n setAutocompleteValues(newValues);\n },\n [setAutocompleteValues],\n );\n\n const handleApply = useCallback(() => {\n setAutocompleteValues((autocompleteValues) => {\n setRecordings(autocompleteValues);\n onChange(recordings, autocompleteValues);\n return autocompleteValues;\n });\n close();\n }, [recordings, setAutocompleteValues, onChange, close]);\n\n const handleReset = useCallback(() => {\n setAutocompleteValues([]);\n }, [setAutocompleteValues]);\n\n const handleRemoveRecording = useCallback(\n (recordingId: string) => {\n const updatedRecordings = recordings.filter((value) => value.id !== recordingId);\n setRecordings(updatedRecordings);\n onChange(recordings, updatedRecordings);\n },\n [onChange, recordings],\n );\n\n const handleRemoveRecordings = useCallback(() => {\n setRecordings([]);\n onChange(recordings, []);\n }, [onChange, recordings]);\n\n const handleRemoveAutocompleteRecording = useCallback(\n (recordingId: string) => {\n setAutocompleteValues(autocompleteValues.filter((value) => value.id !== recordingId));\n },\n [setAutocompleteValues, autocompleteValues],\n );\n\n const handleRenderItem = useCallback(\n (props: React.ComponentProps, option: RecordingByName, { selected }: { selected: boolean }) => {\n return (\n \n \n \n );\n },\n [],\n );\n\n const renderTags = useCallback(\n (recordings: RecordingByName[]): React.ReactNode => {\n return (\n
\n {recordings.map((recording) => {\n return (\n \n );\n })}\n
\n );\n },\n [handleRemoveAutocompleteRecording],\n );\n\n const paperComponent: React.JSXElementConstructor> = useCallback(\n (props) => (\n \n {props.children}\n \n ),\n [handleReset, handleApply],\n );\n\n return (\n \n \n \n \n {t('playlists:multimatch-analysis.selected-recordings-title')}{' '}\n \n \n \n \n \n \n \n \n \n \n \n \n 0}\n onClick={handleAddClipsClick}\n size='large'\n title={\n recordings.length > 0\n ? t('playlists:multimatch-analysis.selected-recordings', { count: recordings.length })\n : t('playlists:multimatch-analysis.recordings')\n }\n />\n {anchorEl && (\n \n \n \n option.name}\n getOptionDisabled={(option) => isEmpty(option.videoSources) || !option.hasTacticalAnalysis}\n inputWidth={360}\n isLoading={isLoading}\n isOptionEqualToValue={(option, value) => option.id === value.id}\n listWidth={360}\n multiple={true}\n onChange={setName}\n open\n options={recordingsByNameData}\n renderOption={handleRenderItem}\n renderTags={renderTags}\n resultsHeight={310}\n resultsNoMatches={t('playlists:multimatch-analysis.no-recordings-found')}\n updateValue={handleUpdateValue}\n value={autocompleteValues}\n />\n \n \n \n )}\n {recordings && recordings.length > 0 && (\n <>\n {recordings.map((value) => (\n \n ))}\n \n \n \n \n \n \n )}\n \n \n \n );\n};\n","import { Box, IconButton, Modal } from '@mui/material';\nimport { useCallback } from 'react';\n\nimport { useTacticalAnalysesFilters } from 'api/recording/use-tactical-analyses-filters';\nimport { TIMELINE_DEFAULT_FILTERS } from 'api/recording/useEpisodesWithFilters/useTacticalAnalysesPlaylistItems';\nimport IconClose from 'shared/components/icons/icon-close';\nimport { RecordingByName, RecordingsFilters } from 'shared/types/recording/types';\nimport { useSavePlaylistMultimatchFiltersAppliedPreset } from 'shared/types/user-preset/hooks/use-save-playlist-multimatch-filters-applied-preset';\n\nimport { MultiAnalysisFiltersPlaylist } from './components/multi-analysis-filters-playlist/MultiAnalysisFiltersPlaylist';\nimport { usePlaylistMultimatchAppliedFilters, useSetPlaylistMultimatchAppliedFilters } from '../../../../store/atoms';\nimport { RecordingsFiltersContent } from '../recordings-filters-content/RecordingsFiltersContent';\nimport { RecordingsFiltersHeader } from '../recordings-filters-header/RecordingsFiltersHeader';\nimport { SelectRecordings } from '../select-recordings/SelectRecordings';\n\ninterface Props {\n isOpen: boolean;\n onClose: () => void;\n playlistId: string;\n}\n\nexport const MultimatchFiltersModal = ({ playlistId, isOpen, onClose }: Props) => {\n const appliedFilters = usePlaylistMultimatchAppliedFilters(playlistId);\n const setAppliedFilters = useSetPlaylistMultimatchAppliedFilters(playlistId);\n const { isLoading, data } = useTacticalAnalysesFilters(appliedFilters.recordingIds);\n const saveMultimatchAppliedFiltersPreset = useSavePlaylistMultimatchFiltersAppliedPreset();\n\n const handleUpdateMultimatchAppliedFilters = useCallback(\n (filters: RecordingsFilters) => {\n setAppliedFilters(filters);\n saveMultimatchAppliedFiltersPreset(playlistId, filters);\n },\n [setAppliedFilters, saveMultimatchAppliedFiltersPreset, playlistId],\n );\n\n const handleSetRecordings = useCallback(\n (currentRecordingsSelection: RecordingByName[], recordingsSelection: RecordingByName[]) => {\n const filters = currentRecordingsSelection.some((r) => !recordingsSelection.includes(r)) ? {} : appliedFilters;\n\n handleUpdateMultimatchAppliedFilters({ ...filters, recordingIds: recordingsSelection.map((r) => r.id) });\n },\n [appliedFilters, handleUpdateMultimatchAppliedFilters],\n );\n\n return (\n \n \n spacing(2)} top={({ spacing }) => spacing(2)}>\n \n \n \n \n \n \n \n \n 0}\n key={appliedFilters.recordingIds.join(',')}\n onClose={onClose}\n playlistId={playlistId}\n appliedFilters={appliedFilters}\n onUpdate={handleUpdateMultimatchAppliedFilters}\n />\n \n \n \n );\n};\n","import { Button } from '@mui/material';\nimport { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconPlus from 'shared/components/icons/icon-plus';\n\nimport { MultimatchFiltersModal } from './components/multimatch-filters-modal/MultimatchFiltersModal';\n\ninterface Props {\n playlistId: string;\n}\n\nexport const AddMultipleClips = ({ playlistId }: Props) => {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n\n const handleOnClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const handleOpen = useCallback(() => {\n setIsOpen(true);\n }, []);\n\n return (\n <>\n }\n onClick={handleOpen}\n size='small'\n >\n {t('common:actions.add-clips')}\n \n\n {isOpen ? : null}\n \n );\n};\n","import { Typography } from '@mui/material';\nimport { fontSizes, fontWeight } from 'kognia-ui';\n\ntype PlainTextProps = {\n originalText: string;\n};\n\nexport const PlainText = ({ originalText }: PlainTextProps) => (\n \n {originalText}\n \n);\n","import { ChangeEvent, forwardRef } from 'react';\n\nimport Input from 'shared/components/input';\n\nimport { PlainText } from '../plain-text';\n\ntype InputTextFieldProps = {\n isEditing: boolean;\n originalText: string;\n handleNameChange: (event: ChangeEvent) => void;\n};\n\ntype RefType = HTMLInputElement;\n\nconst InputTextField = forwardRef(\n ({ isEditing, originalText, handleNameChange }, ref) => {\n if (!isEditing) return ;\n\n return (\n <Input\n autoSelect\n autoFocus\n defaultValue={originalText}\n id='edit-recording-name'\n onChange={handleNameChange}\n ref={ref}\n />\n );\n },\n);\n\nInputTextField.displayName = 'InputTextField';\n\nexport default InputTextField;\n","import { Stack } from '@mui/material';\n\nimport { PlainText } from './editable-text/plain-text';\n\ntype Props = {\n title: string;\n};\nexport const PlaylistTitle = ({ title }: Props) => {\n return (\n <Stack justifyContent={'center'}>\n <PlainText originalText={title} />\n </Stack>\n );\n};\n","import { ClickAwayListener, IconButton, Stack } from '@mui/material';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport Spinner from 'shared/components/spinner';\n\nimport InputTextField from './input-text-field';\nimport { PlaylistTitle } from '../PlaylistTitle';\n\ntype UpdateTextProps = {\n canEdit?: boolean;\n isSubmitting?: boolean;\n onSubmit: (newText: string) => void;\n originalText: string;\n};\n\nexport const EditableText = ({ canEdit = true, isSubmitting = false, onSubmit, originalText }: UpdateTextProps) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isEditing, setIsEditing] = useState<boolean>(false);\n const [newText, setNewText] = useState<string>(originalText);\n\n useEffect(() => {\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.code === 'Escape') {\n setNewText(originalText);\n setIsEditing(false);\n }\n\n return false;\n };\n // TODO add tests to cover the space play/pause functionality\n document.body.addEventListener('keyup', handleKeyUp);\n\n return () => {\n document.body.removeEventListener('keyup', handleKeyUp);\n };\n }, [originalText]);\n\n const handleOnSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n onSubmit(newText);\n setIsEditing(false);\n };\n\n const onClickOutside = () => {\n if (!isEditing) return;\n\n setIsEditing(false);\n\n if (newText === originalText) return;\n\n if (isEditing) {\n onSubmit(newText);\n }\n };\n\n const handleIconClick = () => {\n if (!isEditing) {\n setIsEditing(true);\n } else {\n onClickOutside();\n }\n };\n\n const handleNameChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setNewText(event.target.value);\n };\n\n if (!canEdit) return <PlaylistTitle title={originalText} />;\n\n return (\n <ClickAwayListener onClickAway={onClickOutside}>\n <form onSubmit={handleOnSubmit}>\n <Stack direction={'row'} alignItems={'center'} gap={2} justifyContent={'center'}>\n <InputTextField\n ref={inputRef}\n isEditing={isEditing}\n originalText={originalText}\n handleNameChange={handleNameChange}\n />\n {isSubmitting && <Spinner />}\n {!isSubmitting && (\n <IconButton type={'button'} onClick={handleIconClick}>\n <IconEdit size='small' color='secondary' />\n </IconButton>\n )}\n </Stack>\n </form>\n </ClickAwayListener>\n );\n};\n","import { Box, Button, FormControl, FormControlLabel, Radio, RadioGroup, styled } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath } from 'react-router-dom';\n\nimport { queryParams, routes } from 'kognia/router/routes';\nimport { Dialog } from 'shared/components/dialog';\nimport { DialogActions } from 'shared/components/dialog/dialog-actions';\nimport { DialogContent } from 'shared/components/dialog/dialog-content';\nimport { DialogHeader } from 'shared/components/dialog/dialog-header';\nimport IconShare from 'shared/components/icons/icon-share';\nimport { useUserActiveClient } from 'shared/contexts/app-state';\nimport { Playlist } from 'shared/types';\n\nimport { DialogContentText, DialogTextVariants } from '../dialog/dialog-content-text';\n\ntype SharePlaylistModalProps = {\n playlist: Playlist;\n onCloseModal: () => void;\n open?: boolean;\n};\n\nenum SharePlaylistOptions {\n View = 'view',\n Edit = 'edit',\n}\n\ntype ShareCheckboxValue = SharePlaylistOptions.View | SharePlaylistOptions.Edit;\n\nconst CopyBarContainer = styled(Box)(({ theme }) => ({\n marginTop: theme.spacing(4.5),\n minHeight: theme.spacing(6),\n border: `1px solid ${Colors.storm}`,\n padding: theme.spacing(0.5),\n borderRadius: theme.shape.borderRadius,\n display: `flex`,\n flexDirection: 'row',\n alignItems: 'center',\n}));\n\nconst CopyBarUrl = styled(Box)({\n color: Colors.storm,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n\nconst FormLabel = styled(Box)({\n fontSize: fontSizes.default,\n});\n\nconst SharePlaylistModal = ({ playlist, onCloseModal, open = true }: SharePlaylistModalProps) => {\n const { t } = useTranslation();\n const [userCopiedUrl, setUserCopiedUrl] = useState(false);\n const [shareCheckboxValue, setShareCheckboxValue] = useState<ShareCheckboxValue>(SharePlaylistOptions.View);\n const activeClient = useUserActiveClient();\n const { origin } = window.location;\n const { id, name } = playlist;\n const playlistDetailUrl = origin + generatePath(routes.RECORDING_PLAYLIST_DETAIL, { playlistId: id });\n const copyPlaylistUrl = `${origin}${routes.PLAYLISTS}?${queryParams.copyPlaylist}=${id}`;\n const urlToCopy = shareCheckboxValue === SharePlaylistOptions.View ? playlistDetailUrl : copyPlaylistUrl;\n\n const closeModal = useCallback(() => onCloseModal(), [onCloseModal]);\n\n const copyUrl = () => {\n navigator.clipboard.writeText(urlToCopy).then(() => {\n setUserCopiedUrl(true);\n });\n };\n\n const handleShareCheckboxChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setShareCheckboxValue(event.target.value as ShareCheckboxValue);\n setUserCopiedUrl(false);\n }, []);\n\n return (\n <Dialog open={open} onClose={onCloseModal}>\n <DialogHeader icon={<IconShare size='small' />}>{t('share-playlist-modal:title')}</DialogHeader>\n <DialogContent>\n <DialogContentText textVariant={DialogTextVariants.Primary}>\n {t('share-playlist-modal:subtitle', { name })}\n </DialogContentText>\n <DialogContentText>\n {t('share-playlist-modal:description', {\n clientName: activeClient?.name,\n })}\n </DialogContentText>\n <Box>\n <FormControl>\n <RadioGroup\n aria-labelledby='share-option-type'\n name='share-option-type'\n onChange={handleShareCheckboxChange}\n value={shareCheckboxValue}\n >\n <FormControlLabel\n value={SharePlaylistOptions.View}\n control={<Radio color='primary' />}\n label={<FormLabel>{t('share-playlist-modal:share-original')}</FormLabel>}\n />\n <FormControlLabel\n value={SharePlaylistOptions.Edit}\n control={<Radio color='primary' />}\n label={<FormLabel>{t('share-playlist-modal:share-copy')}</FormLabel>}\n />\n </RadioGroup>\n </FormControl>\n </Box>\n <CopyBarContainer>\n <CopyBarUrl id='copy-url-contents'>{urlToCopy}</CopyBarUrl>\n <Button\n variant='contained'\n size='small'\n color={userCopiedUrl ? 'success' : 'primary'}\n onClick={copyUrl}\n sx={{ minWidth: 0, flex: '1 0 auto' }}\n >\n {userCopiedUrl ? t('common:actions.copied') : t('common:actions.copy')}\n </Button>\n </CopyBarContainer>\n </DialogContent>\n <DialogActions>\n <Button variant='outlined' color='secondary' onClick={closeModal}>\n {t('common:actions.done')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default SharePlaylistModal;\n","import classNames from 'classnames';\nimport React from 'react';\n\nimport styles from './VerticalIconButton.module.scss';\nimport { SvgIconProps } from '../icons/svg-icon/SvgIcon';\n\ninterface VerticalIconButtonProps {\n children: React.ReactChildren | string;\n Icon: React.JSXElementConstructor<React.PropsWithChildren<SvgIconProps>>;\n onClick: () => void;\n className?: string;\n}\n\nexport const VerticalIconButton = ({\n children,\n Icon,\n onClick,\n className = '',\n}: React.PropsWithChildren<VerticalIconButtonProps>) => {\n return (\n <button onClick={onClick} className={classNames(styles.root, className)}>\n <span>\n <Icon size='small' />\n </span>\n <span className={styles.text}>{children}</span>\n </button>\n );\n};\n","import { Button } from '@mui/material';\nimport classNames from 'classnames';\nimport React, { useRef } from 'react';\n\nimport IconForward from 'shared/components/icons/icon-forward';\nimport {\n useCurrentPlaylistItemVideoSources,\n useCurrentVideoSourceIndex,\n useVideoPlayerIsInStandBy,\n} from 'shared/components/video-player/hooks';\n\nimport { useVideoPlayerActions, useVideoPlayerState } from '../../../index';\nimport { PLAYER_STATES } from '../../../state/states';\nimport styles from '../Controls.module.scss';\n\nconst NextVideoSourceButton = () => {\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { state, readyState } = useVideoPlayerState();\n const isInStandBy = useVideoPlayerIsInStandBy();\n const videoSources = useCurrentPlaylistItemVideoSources();\n const actions = useVideoPlayerActions();\n const videoSourceIndex = useCurrentVideoSourceIndex();\n\n const isDisabled =\n !readyState || state === PLAYER_STATES.ENDED || isInStandBy || videoSourceIndex === videoSources.length - 1;\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n buttonRef?.current?.blur();\n actions.nextVideoSource();\n };\n\n if (videoSources.length <= 1) return null;\n\n return (\n <span>\n <Button\n ref={buttonRef}\n className={classNames({ [styles.disabled]: isDisabled })}\n disabled={isDisabled}\n size={'small'}\n onClick={handleClick}\n >\n <IconForward sx={{ color: 'common.white' }} />\n </Button>\n </span>\n );\n};\n\nexport default NextVideoSourceButton;\n","export const PlayCircle = () => {\n return (\n <svg xmlns='http://www.w3.org/2000/svg' width='122' height='122' fill='none'>\n <circle cx='61' cy='60.999' r='35.583' fill='#ceced9' />\n <path fillRule='evenodd' d='M50.437 80.408l30.5-19.409-30.5-19.409v38.818z' fill='#ededf2' />\n </svg>\n );\n};\n","import React from 'react';\n\nimport styles from './ButtonControls.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst ButtonControls = ({ children }: Props) => {\n return <div className={styles.controls}>{children}</div>;\n};\n\nexport default ButtonControls;\n","import React from 'react';\n\nimport styles from './ButtonControlsLeft.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst ButtonControlsLeft = ({ children }: Props) => {\n return <div className={styles.controlsLeft}>{children}</div>;\n};\n\nexport default ButtonControlsLeft;\n","import React from 'react';\n\nimport styles from './ButtonControlsRight.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst ButtonControlsRight = ({ children }: Props) => {\n return <div className={styles.controlsRight}>{children}</div>;\n};\n\nexport default ButtonControlsRight;\n","import classNames from 'classnames';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useVideoPlayerIsPlaying } from 'shared/components/video-player/hooks';\n\nimport styles from './VideoControls.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n disabled?: boolean;\n onClick?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n}\n\nconst VideoControls = ({ children, disabled = false, onClick }: Props) => {\n const controlsRef = useRef<HTMLDivElement>(null);\n const isPlaying = useVideoPlayerIsPlaying();\n const [isVisible, setIsVisible] = useState(!isPlaying);\n\n const handleOnClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n event.target === controlsRef.current && onClick?.(event);\n },\n [onClick, controlsRef],\n );\n\n const handleMouseLeave = () => {\n setIsVisible(false);\n };\n\n const handleMouseOver = () => {\n setIsVisible(true);\n };\n\n useEffect(() => {\n const controls = controlsRef?.current;\n\n controls?.addEventListener('mouseover', () => {\n handleMouseOver();\n });\n controls?.addEventListener('mouseleave', () => {\n handleMouseLeave();\n });\n\n return () => {\n controls?.replaceWith(controls?.cloneNode(true));\n };\n }, [controlsRef]);\n\n const isHidden = !isVisible && isPlaying;\n return (\n <div\n ref={controlsRef}\n className={classNames(styles.controls, { [styles.isHidden]: isHidden, [styles.controlsDisabled]: disabled })}\n onClick={handleOnClick}\n >\n <div className={styles.content}>{children}</div>\n </div>\n );\n};\n\nexport default VideoControls;\n","import React from 'react';\n\nimport { PlayCircle } from './play-circle';\nimport styles from './PlayerSkeleton.module.scss';\nimport IconBackward5 from '../../../../icons/icon-backward-5';\nimport { IconDownload } from '../../../../icons/icon-download';\nimport IconForward5 from '../../../../icons/icon-forward-5';\nimport IconFullScreen from '../../../../icons/icon-full-screen';\nimport IconPlay from '../../../../icons/icon-play';\nimport IconPlaySpeed from '../../../../icons/icon-play-speed';\nimport ButtonControls from '../button-controls';\nimport ButtonControlsLeft from '../button-controls-left';\nimport ButtonControlsRight from '../button-controls-right';\nimport VideoControls from '../video-controls';\n\nexport const PlayerSkeleton = () => {\n return (\n <div className={styles.container}>\n <div className={styles.playCircleContainer}>\n <PlayCircle />\n </div>\n\n <VideoControls disabled>\n <ButtonControls>\n <ButtonControlsLeft>\n <IconBackward5 color='disabled' />\n <IconPlay color='disabled' />\n <IconForward5 color='disabled' />\n </ButtonControlsLeft>\n\n <div className={styles.progressBar}>\n <div className={styles.progressBarInner}></div>\n </div>\n\n <ButtonControlsRight>\n <IconPlaySpeed color='disabled' />\n <IconDownload color='disabled' />\n <IconFullScreen color='disabled' />\n </ButtonControlsRight>\n </ButtonControls>\n </VideoControls>\n </div>\n );\n};\n","import { Button } from '@mui/material';\nimport classNames from 'classnames';\nimport React, { useRef } from 'react';\n\nimport IconBackward from 'shared/components/icons/icon-backward';\nimport {\n useCurrentPlaylistItemVideoSources,\n useCurrentVideoSourceIndex,\n useVideoPlayerIsInStandBy,\n} from 'shared/components/video-player/hooks';\n\nimport { useVideoPlayerActions, useVideoPlayerState } from '../../../index';\nimport { PLAYER_STATES } from '../../../state/states';\nimport styles from '../Controls.module.scss';\n\nconst PreviousVideoSourceButton = () => {\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { state, readyState } = useVideoPlayerState();\n const isInStandBy = useVideoPlayerIsInStandBy();\n const actions = useVideoPlayerActions();\n const videoSources = useCurrentPlaylistItemVideoSources();\n const videoSourceIndex = useCurrentVideoSourceIndex();\n\n const isDisabled = !readyState || state === PLAYER_STATES.ENDED || isInStandBy || videoSourceIndex === 0;\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n buttonRef?.current?.blur();\n actions.previousVideoSource();\n };\n\n if (videoSources.length <= 1) return null;\n\n return (\n <span>\n <Button\n ref={buttonRef}\n className={classNames({ [styles.disabled]: isDisabled })}\n disabled={isDisabled}\n size={'small'}\n onClick={handleClick}\n >\n <IconBackward size='medium' sx={{ color: 'common.white' }} />\n </Button>\n </span>\n );\n};\n\nexport default PreviousVideoSourceButton;\n","import { Fade } from '@mui/material';\nimport React, { useRef } from 'react';\n\nimport {\n useCurrentVideoSourceDuration,\n useCurrentVideoSourceTime,\n usePlayerCurrentSource,\n} from 'shared/components/video-player/hooks';\n\nimport styles from './ProgressBar.module.scss';\nimport { useIsBuffering, useIsSeeking, useVideoPlayerActions } from '../../../index';\n\nconst ProgressBarVideoSource = () => {\n const progressBarRef = useRef<HTMLDivElement>(null);\n const duration = useCurrentVideoSourceDuration();\n const currentTime = useCurrentVideoSourceTime();\n const isBuffering = useIsBuffering();\n const isSeeking = useIsSeeking();\n const actions = useVideoPlayerActions();\n const videoSource = usePlayerCurrentSource();\n\n const handleJumpToPercent = (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n event.stopPropagation();\n if (!progressBarRef.current) return;\n\n const clientRect = progressBarRef.current.getBoundingClientRect();\n const pageX = event.pageX;\n const clickPosition = pageX - clientRect.x;\n const percentPositionClick = (100 * clickPosition) / progressBarRef.current.clientWidth;\n\n const endTimeInMatch = videoSource?.endTimeInMatch ?? 0;\n const startTimeInMatch = videoSource?.startTimeInMatch ?? 0;\n\n const timeInMatch = ((endTimeInMatch - startTimeInMatch) * percentPositionClick) / 100 + startTimeInMatch;\n actions.jumpToTimeInMatch(timeInMatch);\n };\n\n const showBuffering = isBuffering || isSeeking;\n\n return (\n <div className={styles.container} ref={progressBarRef} onClick={handleJumpToPercent}>\n <div className={styles.content}>\n <Fade unmountOnExit in={showBuffering} exit={!showBuffering}>\n <div className={styles.buffering} />\n </Fade>\n <div className={styles.bar} style={{ width: `${(100 * (currentTime - videoSource.startTime)) / duration}%` }} />\n </div>\n </div>\n );\n};\n\nexport default ProgressBarVideoSource;\n","import { SegmentConfig } from 'shared/types/segment/types';\nimport { round } from 'shared/utils/round';\nimport { secondsAsDuration } from 'shared/utils/seconds-as-duration';\n\nconst MINUTE_TIME = 60;\n\nconst findSegmentForTime = (time: number, matchSegments: SegmentConfig[]): SegmentConfig | undefined => {\n for (const segment in matchSegments) {\n const matchSegment = matchSegments[segment];\n\n if (time >= round(matchSegment.start) && time <= round(matchSegment.start + matchSegment.length)) {\n return matchSegment;\n }\n }\n};\n\nexport const formattedTime = (time: number, matchSegments: SegmentConfig[], short = true) => {\n if (matchSegments.length === 0) return secondsAsDuration(round(Math.abs(time)), false);\n const matchSegment = findSegmentForTime(time, matchSegments);\n\n if (!matchSegment) {\n return '--:--';\n }\n\n const adjustedTime = time - matchSegment.start + matchSegment.segment.start;\n\n const exceededTime = adjustedTime - matchSegment.segment.start - matchSegment.segment.length;\n\n if (exceededTime > 0 && short) {\n return `${(matchSegment.segment.length + matchSegment.segment.start) / MINUTE_TIME}+${secondsAsDuration(\n exceededTime,\n true,\n )}`;\n }\n\n return secondsAsDuration(round(Math.abs(adjustedTime)), false);\n};\n","import React from 'react';\n\nimport { formattedTime } from 'pages/tactical-analysis/utils/formatted-time';\nimport {\n useCurrentVideoSourceDuration,\n useCurrentVideoSourceTime,\n usePlayerCurrentSource,\n} from 'shared/components/video-player/hooks';\nimport { SegmentConfig } from 'shared/types/segment/types';\nimport { secondsAsDuration } from 'shared/utils/seconds-as-duration';\n\nimport styles from './ProgressTime.module.scss';\n\nconst format = (time: number, matchSegments?: SegmentConfig[]) => {\n if (matchSegments) return formattedTime(time, matchSegments, false);\n\n return secondsAsDuration(time, false);\n};\n\nconst ProgressTimeVideoSource = () => {\n const currentTime = useCurrentVideoSourceTime();\n const duration = useCurrentVideoSourceDuration();\n const videoSource = usePlayerCurrentSource();\n\n return (\n <div className={styles.container}>\n {format(currentTime - videoSource.startTime)} / {secondsAsDuration(duration, false)}\n </div>\n );\n};\n\nexport default ProgressTimeVideoSource;\n","import { MetricsData, MetricsNames } from '../types/metrics';\n\nexport enum ActionTypes {\n VIEW_PAGE = 'VIEW_PAGE',\n OPEN_RECORDINGS_FILTER = 'OPEN_RECORDINGS_FILTER',\n APPLY_RECORDINGS_FILTER = 'APPLY_RECORDINGS_FILTER',\n OPEN_TACTICAL_ANALYSIS_FILTER = 'OPEN_TACTICAL_ANALYSIS_FILTER',\n APPLY_TACTICAL_ANALYSIS_FILTER = 'APPLY_TACTICAL_ANALYSIS_FILTER',\n PLAY_TACTICAL_ANALYSIS_ROW = 'PLAY_TACTICAL_ANALYSIS_ROW',\n PLAY_TACTICAL_ANALYSIS_SELECTED_CLIPS = 'PLAY_TACTICAL_ANALYSIS_SELECTED_CLIPS',\n OPEN_TACTICAL_ANALYSIS_EXPORT_XML = 'OPEN_TACTICAL_ANALYSIS_EXPORT_XML',\n EXPORT_TACTICAL_ANALYSIS_XML = 'EXPORT_TACTICAL_ANALYSIS_XML',\n OPEN_TACTICAL_ANALYSIS_EXPORT_VIDEO = 'OPEN_TACTICAL_ANALYSIS_EXPORT_VIDEO',\n EXPORT_TACTICAL_ANALYSIS_VIDEO = 'EXPORT_TACTICAL_ANALYSIS_VIDEO',\n CHANGE_TACTICAL_ANALYSIS_ZOOM = 'CHANGE_TACTICAL_ANALYSIS_ZOOM',\n LOG_OVERLAYS_FRAME_RATE = 'LOG_OVERLAYS_FRAME_RATE',\n SEND_METRICS = 'SEND_METRICS',\n}\n\nexport interface PageViewAction {\n type: ActionTypes.VIEW_PAGE;\n payload: {\n name: MetricsNames.PAGE_VIEW;\n data: MetricsData[MetricsNames.PAGE_VIEW];\n };\n}\n\nexport interface RecordingsOpenFilterAction {\n type: ActionTypes.OPEN_RECORDINGS_FILTER;\n payload: {\n name: MetricsNames.RECORDINGS_OPEN_FILTER;\n data: MetricsData[MetricsNames.RECORDINGS_OPEN_FILTER];\n };\n}\n\nexport interface RecordingsApplyFilterAction {\n type: ActionTypes.APPLY_RECORDINGS_FILTER;\n payload: {\n name: MetricsNames.RECORDINGS_APPLY_FILTER;\n data: MetricsData[MetricsNames.RECORDINGS_APPLY_FILTER];\n };\n}\n\nexport interface TacticalAnalysisOpenFilterAction {\n type: ActionTypes.OPEN_TACTICAL_ANALYSIS_FILTER;\n payload: {\n name: MetricsNames.TACTICAL_ANALYSIS_OPEN_FILTER;\n data?: MetricsData[MetricsNames.TACTICAL_ANALYSIS_OPEN_FILTER];\n };\n}\n\nexport interface TacticalAnalysisApplyFilterAction {\n type: ActionTypes.APPLY_TACTICAL_ANALYSIS_FILTER;\n payload: {\n name: MetricsNames.TACTICAL_ANALYSIS_APPLY_FILTER;\n data: MetricsData[MetricsNames.TACTICAL_ANALYSIS_APPLY_FILTER];\n };\n}\n\nexport interface TacticalAnalysisPlayRowAction {\n type: ActionTypes.PLAY_TACTICAL_ANALYSIS_ROW;\n payload: {\n name: MetricsNames.TACTICAL_ANALYSIS_PLAY_ROW;\n data?: MetricsData[MetricsNames.TACTICAL_ANALYSIS_PLAY_ROW];\n };\n}\n\nexport interface TacticalAnalysisPlaySelectedClipsAction {\n type: ActionTypes.PLAY_TACTICAL_ANALYSIS_SELECTED_CLIPS;\n payload: {\n name: MetricsNames.TACTICAL_ANALYSIS_PLAY_SELECTED_CLIPS;\n data?: MetricsData[MetricsNames.TACTICAL_ANALYSIS_PLAY_SELECTED_CLIPS];\n };\n}\n\nexport interface TacticalAnalysisOpenExportXmlAction {\n type: ActionTypes.OPEN_TACTICAL_ANALYSIS_EXPORT_XML;\n payload: {\n name: MetricsNames.TACTICAL_ANALYSIS_OPEN_EXPORT_XML;\n data?: MetricsData[MetricsNames.TACTICAL_ANALYSIS_OPEN_EXPORT_XML];\n };\n}\n\nexport interface TacticalAnalysisExportXmlAction {\n type: ActionTypes.EXPORT_TACTICAL_ANALYSIS_XML;\n payload: {\n name: MetricsNames.TACTICAL_ANALYSIS_EXPORT_XML;\n data?: MetricsData[MetricsNames.TACTICAL_ANALYSIS_EXPORT_XML];\n };\n}\n\nexport interface TacticalAnalysisOpenExportVideoAction {\n type: ActionTypes.OPEN_TACTICAL_ANALYSIS_EXPORT_VIDEO;\n payload: {\n name: MetricsNames.TACTICAL_ANALYSIS_OPEN_EXPORT_VIDEO;\n data?: MetricsData[MetricsNames.TACTICAL_ANALYSIS_OPEN_EXPORT_VIDEO];\n };\n}\n\nexport interface TacticalAnalysisExportVideoAction {\n type: ActionTypes.EXPORT_TACTICAL_ANALYSIS_VIDEO;\n payload: {\n name: MetricsNames.TACTICAL_ANALYSIS_EXPORT_VIDEO;\n data?: MetricsData[MetricsNames.TACTICAL_ANALYSIS_EXPORT_VIDEO];\n };\n}\n\nexport interface TacticalAnalysisChangeZoomAction {\n type: ActionTypes.CHANGE_TACTICAL_ANALYSIS_ZOOM;\n payload: {\n name: MetricsNames.TACTICAL_ANALYSIS_CHANGE_ZOOM;\n data: MetricsData[MetricsNames.TACTICAL_ANALYSIS_CHANGE_ZOOM];\n };\n}\n\nexport interface OverlaysFrameRateAction {\n type: ActionTypes.LOG_OVERLAYS_FRAME_RATE;\n payload: number;\n}\n\nexport interface MetricsAction {\n type: ActionTypes.SEND_METRICS;\n payload: {\n name: MetricsNames;\n data: MetricsData[MetricsNames];\n };\n}\n\nexport type Action =\n | PageViewAction\n | RecordingsOpenFilterAction\n | MetricsAction\n | OverlaysFrameRateAction\n | RecordingsApplyFilterAction\n | TacticalAnalysisOpenFilterAction\n | TacticalAnalysisApplyFilterAction\n | TacticalAnalysisPlayRowAction\n | TacticalAnalysisPlaySelectedClipsAction\n | TacticalAnalysisOpenExportXmlAction\n | TacticalAnalysisExportXmlAction\n | TacticalAnalysisOpenExportVideoAction\n | TacticalAnalysisExportVideoAction\n | TacticalAnalysisChangeZoomAction;\n","export enum MetricsNames {\n PAGE_VIEW = 'page_view',\n RECORDINGS_OPEN_FILTER = 'recordings_open_filter',\n RECORDINGS_APPLY_FILTER = 'recordings_apply_filter',\n TACTICAL_ANALYSIS_OPEN_FILTER = 'tactical_analysis_open_filter',\n TACTICAL_ANALYSIS_APPLY_FILTER = 'tactical_analysis_apply_filter',\n TACTICAL_ANALYSIS_PLAY_ROW = 'tactical_analysis_play_row',\n TACTICAL_ANALYSIS_PLAY_SELECTED_CLIPS = 'tactical_analysis_play_selected_clips',\n TACTICAL_ANALYSIS_OPEN_EXPORT_XML = 'tactical_analysis_open_export_xml',\n TACTICAL_ANALYSIS_EXPORT_XML = 'tactical_analysis_export_xml',\n TACTICAL_ANALYSIS_OPEN_EXPORT_VIDEO = 'tactical_analysis_open_export_video',\n TACTICAL_ANALYSIS_EXPORT_VIDEO = 'tactical_analysis_export_video',\n TACTICAL_ANALYSIS_CHANGE_ZOOM = 'tactical_analysis_change_zoom',\n OVERLAYS_AVERAGE_FRAME_RATE = 'overlays_average_frame_rate',\n}\n\nexport interface MetricsData {\n [MetricsNames.PAGE_VIEW]: {\n url: string;\n generic_url: string;\n };\n [MetricsNames.RECORDINGS_OPEN_FILTER]: {\n filter_name: string;\n };\n [MetricsNames.RECORDINGS_APPLY_FILTER]: {\n filter_name: string;\n };\n [MetricsNames.TACTICAL_ANALYSIS_APPLY_FILTER]: {\n filter: string;\n };\n [MetricsNames.TACTICAL_ANALYSIS_CHANGE_ZOOM]: {\n zoom_level: string;\n };\n [MetricsNames.OVERLAYS_AVERAGE_FRAME_RATE]: {\n value: string;\n };\n [MetricsNames.TACTICAL_ANALYSIS_PLAY_ROW]: never;\n [MetricsNames.TACTICAL_ANALYSIS_PLAY_SELECTED_CLIPS]: never;\n [MetricsNames.TACTICAL_ANALYSIS_OPEN_EXPORT_XML]: never;\n [MetricsNames.TACTICAL_ANALYSIS_EXPORT_XML]: never;\n [MetricsNames.TACTICAL_ANALYSIS_OPEN_EXPORT_VIDEO]: never;\n [MetricsNames.TACTICAL_ANALYSIS_EXPORT_VIDEO]: never;\n [MetricsNames.TACTICAL_ANALYSIS_OPEN_FILTER]: never;\n}\n","import { Subject, bufferTime, filter, map, merge } from 'rxjs';\n\nimport { Action, ActionTypes, MetricsAction, OverlaysFrameRateAction } from './actionTypes';\nimport { MetricsNames } from '../types/metrics';\n\nconst eventEmitter = new Subject<Action>();\nconst frameRateEmitter = new Subject<OverlaysFrameRateAction>();\n\nexport function publishEvent(action: Action) {\n eventEmitter.next(action);\n}\n\nexport function publishFrameRateEvent(action: OverlaysFrameRateAction) {\n frameRateEmitter.next(action);\n}\n\nconst OVERLAYS_FRAME_RATE_BUFFER_TIME = 5000;\n\nconst metrics$ = eventEmitter.pipe(\n filter(\n (action) =>\n action.type === ActionTypes.OPEN_RECORDINGS_FILTER ||\n action.type === ActionTypes.VIEW_PAGE ||\n action.type === ActionTypes.APPLY_RECORDINGS_FILTER ||\n action.type === ActionTypes.OPEN_TACTICAL_ANALYSIS_FILTER ||\n action.type === ActionTypes.APPLY_TACTICAL_ANALYSIS_FILTER ||\n action.type === ActionTypes.PLAY_TACTICAL_ANALYSIS_ROW ||\n action.type === ActionTypes.PLAY_TACTICAL_ANALYSIS_SELECTED_CLIPS ||\n action.type === ActionTypes.OPEN_TACTICAL_ANALYSIS_EXPORT_XML ||\n action.type === ActionTypes.EXPORT_TACTICAL_ANALYSIS_XML ||\n action.type === ActionTypes.OPEN_TACTICAL_ANALYSIS_EXPORT_VIDEO ||\n action.type === ActionTypes.EXPORT_TACTICAL_ANALYSIS_VIDEO ||\n action.type === ActionTypes.CHANGE_TACTICAL_ANALYSIS_ZOOM,\n ),\n map(\n (action) =>\n <MetricsAction>{\n type: ActionTypes.SEND_METRICS,\n payload: action.payload,\n },\n ),\n);\n\nconst overlaysFrameRate$ = frameRateEmitter.pipe(\n filter((action) => action.type === ActionTypes.LOG_OVERLAYS_FRAME_RATE),\n bufferTime(OVERLAYS_FRAME_RATE_BUFFER_TIME),\n filter((actions) => actions.length > 0),\n map((actions) => {\n const actionsFrameRateSum = actions.reduce<number>((acc, action) => {\n return acc + action.payload;\n }, 0);\n\n const averageFrameRate = Math.round(actionsFrameRateSum / actions.length);\n\n return <MetricsAction>{\n type: ActionTypes.SEND_METRICS,\n payload: {\n name: MetricsNames.OVERLAYS_AVERAGE_FRAME_RATE,\n data: { value: String(averageFrameRate) },\n },\n };\n }),\n);\n\nexport const applicationEvents$ = merge(overlaysFrameRate$, metrics$);\n","import { Button, Tooltip } from '@mui/material';\nimport classNames from 'classnames';\nimport { useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconBackward5 from 'shared/components/icons/icon-backward-5';\nimport { useVideoPlayerIsInStandBy } from 'shared/components/video-player/hooks';\n\nimport { useVideoPlayerActions, useVideoPlayerState } from '../../../index';\nimport { PLAYER_STATES } from '../../../state/states';\nimport styles from '../Controls.module.scss';\n\nconst Backward5Button = () => {\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { t } = useTranslation();\n const { state, readyState } = useVideoPlayerState();\n const isInStandBy = useVideoPlayerIsInStandBy();\n const actions = useVideoPlayerActions();\n\n const isDisabled = !readyState || state === PLAYER_STATES.ENDED || isInStandBy;\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n buttonRef?.current?.blur();\n actions.skipBackward5s();\n };\n\n return (\n <Tooltip enterDelay={2000} title={`${t('video-player:controls.skip-back')}`}>\n <span>\n <Button\n ref={buttonRef}\n className={classNames({ [styles.disabled]: isDisabled })}\n disabled={isDisabled}\n size={'small'}\n onClick={handleClick}\n >\n <IconBackward5 sx={{ color: 'common.white' }} />\n </Button>\n </span>\n </Tooltip>\n );\n};\n\nexport default Backward5Button;\n","import { Button, Tooltip } from '@mui/material';\nimport React, { useCallback, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { IconDownload } from 'shared/components/icons/icon-download';\n\nimport { usePlayerCurrentSource } from '../../../index';\n\ninterface Props {\n onDownloadSource?: () => void;\n}\nconst DownloadButton = ({ onDownloadSource }: Props) => {\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { t } = useTranslation();\n const videoSource = usePlayerCurrentSource();\n\n if (!videoSource?.srcDownload) return null;\n\n const handleDownloadCurrentVideo = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n buttonRef?.current?.blur();\n if (!videoSource?.srcDownload || !videoSource?.srcDownload?.length) return null;\n\n return window.open(videoSource.srcDownload);\n },\n [buttonRef, videoSource],\n );\n\n return (\n <Tooltip enterDelay={2000} title={`${t('video-player:controls.download-video')}`}>\n <Button ref={buttonRef} onClick={onDownloadSource ? onDownloadSource : handleDownloadCurrentVideo} size={'small'}>\n <IconDownload sx={{ color: 'common.white' }} />\n </Button>\n </Tooltip>\n );\n};\n\nexport default DownloadButton;\n","import { Button, Tooltip } from '@mui/material';\nimport classNames from 'classnames';\nimport { useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconForward5 from 'shared/components/icons/icon-forward-5';\nimport { useVideoPlayerIsInStandBy } from 'shared/components/video-player/hooks';\n\nimport { useVideoPlayerActions, useVideoPlayerState } from '../../../index';\nimport { PLAYER_STATES } from '../../../state/states';\nimport styles from '../Controls.module.scss';\n\nconst Forward5Button = () => {\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { t } = useTranslation();\n const { state, readyState } = useVideoPlayerState();\n const isInStandBy = useVideoPlayerIsInStandBy();\n const actions = useVideoPlayerActions();\n\n const isDisabled = !readyState || state === PLAYER_STATES.ENDED || isInStandBy;\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n buttonRef?.current?.blur();\n actions.skipForward5s();\n };\n\n return (\n <Tooltip enterDelay={2000} title={`${t('video-player:controls.skip-forward')}`}>\n <span>\n <Button\n ref={buttonRef}\n className={classNames({ [styles.disabled]: isDisabled })}\n disabled={isDisabled}\n size={'small'}\n onClick={handleClick}\n >\n <IconForward5 sx={{ color: 'common.white' }} />\n </Button>\n </span>\n </Tooltip>\n );\n};\n\nexport default Forward5Button;\n","import { Button, Tooltip } from '@mui/material';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconFullScreen from 'shared/components/icons/icon-full-screen';\nimport { getIsFormTag } from 'shared/utils/is-form-tag';\n\ndeclare global {\n interface HTMLElement {\n webkitRequestFullscreen: () => void;\n mozRequestFullScreen: () => void;\n msRequestFullscreen: () => void;\n }\n}\n\ndeclare global {\n interface Document {\n webkitExitFullscreen: () => void;\n mozCancelFullScreen: () => void;\n msExitFullscreen: () => void;\n webkitFullscreenElement: any | null | undefined;\n mozFullScreenElement: any | null | undefined;\n msFullscreenElement: any | null | undefined;\n }\n}\n\nconst requestFullscreen = (element: HTMLElement) => {\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n element.webkitRequestFullscreen();\n } else if (element.mozRequestFullScreen) {\n element.mozRequestFullScreen();\n } else if (element.msRequestFullscreen) {\n element.msRequestFullscreen();\n }\n};\n\nconst exitFullScreen = () => {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.msExitFullscreen) {\n document.msExitFullscreen();\n }\n};\n\nconst getFullScreenElement = () => {\n return (\n document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement\n );\n};\n\nconst prefixes = ['', 'moz', 'webkit', 'ms'];\n\ninterface Props {\n showFullScreen: string;\n setShowFullScreen: (param: ((showFullScreen: string) => string) | string) => void;\n containerRef: React.RefObject<HTMLElement>;\n}\n\nconst FullscreenButton = ({ containerRef, setShowFullScreen }: Props) => {\n const { t } = useTranslation();\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLElement> | KeyboardEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (getFullScreenElement()) {\n exitFullScreen();\n } else {\n if (containerRef.current) {\n requestFullscreen(containerRef.current);\n }\n }\n\n buttonRef?.current?.blur();\n },\n [containerRef, buttonRef],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n const tagName = (event.target as HTMLElement).tagName;\n const isFormTag = getIsFormTag(tagName);\n if (\n (event.key === 'f' || event.key === 'F') &&\n !isFormTag &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.metaKey\n ) {\n handleClick(event);\n }\n },\n [handleClick],\n );\n\n const handleOnFullscreenChange = useCallback(() => {\n setShowFullScreen(getFullScreenElement() ? 'visible' : 'hidden');\n }, [setShowFullScreen]);\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown]);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const containerCurrent = containerRef.current;\n\n prefixes.forEach((prefix) => {\n containerCurrent.addEventListener(`${prefix}fullscreenchange`, handleOnFullscreenChange);\n });\n\n return () => {\n if (containerCurrent) {\n prefixes.forEach((prefix) => {\n containerCurrent.removeEventListener(`${prefix}fullscreenchange`, handleOnFullscreenChange);\n });\n }\n };\n }, [containerRef, handleOnFullscreenChange]);\n\n return (\n <Tooltip enterDelay={2000} title={`${t('video-player:controls.fullscreen')}`}>\n <Button ref={buttonRef} size={'small'} onClick={handleClick}>\n <IconFullScreen sx={{ color: 'common.white' }} />\n </Button>\n </Tooltip>\n );\n};\n\nexport default FullscreenButton;\n","import { Button, Tooltip } from '@mui/material';\nimport classNames from 'classnames';\nimport React, { useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconForward from 'shared/components/icons/icon-forward';\nimport { useVideoPlayerIsInStandBy } from 'shared/components/video-player/hooks';\n\nimport { usePlaylistItems, useVideoPlayerActions, useVideoPlayerState } from '../../../index';\nimport { PLAYER_STATES } from '../../../state/states';\nimport styles from '../Controls.module.scss';\n\nconst ForwardButton = () => {\n const { t } = useTranslation();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { state, readyState } = useVideoPlayerState();\n const isInStandBy = useVideoPlayerIsInStandBy();\n const actions = useVideoPlayerActions();\n const playlistItems = usePlaylistItems();\n\n const isDisabled = !readyState || state === PLAYER_STATES.ENDED || isInStandBy;\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n buttonRef?.current?.blur();\n actions.nextPlaylistItem();\n };\n\n if (playlistItems.length <= 1) return null;\n\n return (\n <Tooltip enterDelay={2000} title={`${t('video-player:controls.next-video')}`}>\n <span>\n <Button\n ref={buttonRef}\n className={classNames({ [styles.disabled]: isDisabled })}\n disabled={isDisabled}\n size={'small'}\n onClick={handleClick}\n >\n <IconForward sx={{ color: 'common.white' }} />\n </Button>\n </span>\n </Tooltip>\n );\n};\n\nexport default ForwardButton;\n","import { Button, Tooltip } from '@mui/material';\nimport classNames from 'classnames';\nimport React, { useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconPause from 'shared/components/icons/icon-pause';\nimport IconPlay from 'shared/components/icons/icon-play';\nimport IconReplay from 'shared/components/icons/icon-replay';\nimport { useVideoPlayerIsInStandBy, useVideoPlayerIsPlaying } from 'shared/components/video-player/hooks';\nimport styles from 'shared/components/video-player/video-player-component/components/Controls.module.scss';\n\nimport { useVideoPlayerActions, useVideoPlayerState } from '../../../index';\nimport { PLAYER_STATES } from '../../../state/states';\n\nconst PlayBackButton = () => {\n const playButtonRef = useRef<HTMLButtonElement>(null);\n const pauseButtonRef = useRef<HTMLButtonElement>(null);\n const { t } = useTranslation();\n const { state } = useVideoPlayerState();\n const isPlaying = useVideoPlayerIsPlaying();\n const isInStandBy = useVideoPlayerIsInStandBy();\n const actions = useVideoPlayerActions();\n\n const isEnded = state === PLAYER_STATES.ENDED;\n\n if (isEnded) {\n return (\n <Tooltip enterDelay={2000} title={`${t('video-player:controls.replay')}`}>\n <span>\n <Button\n disabled={isInStandBy}\n className={classNames({ [styles.disabled]: isInStandBy })}\n size={'small'}\n onClick={actions.replay}\n >\n <IconReplay sx={{ color: 'common.white' }} />\n </Button>\n </span>\n </Tooltip>\n );\n }\n\n const handleClickPlay = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n playButtonRef?.current?.blur();\n actions.play();\n };\n\n const handleClickPause = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n pauseButtonRef?.current?.blur();\n actions.pause();\n };\n\n const isDisabled = isInStandBy;\n\n return (\n <>\n {isPlaying ? (\n <Tooltip enterDelay={2000} title={`${t('video-player:controls.pause')}`}>\n <span>\n <Button\n disabled={isDisabled}\n className={classNames({ [styles.disabled]: isDisabled })}\n ref={playButtonRef}\n size={'small'}\n onClick={handleClickPause}\n >\n <IconPause sx={{ color: 'common.white' }} />\n </Button>\n </span>\n </Tooltip>\n ) : (\n <Tooltip enterDelay={2000} title={`${t('video-player:controls.play')}`}>\n <span>\n <Button\n disabled={isDisabled}\n className={classNames({ [styles.disabled]: isDisabled })}\n ref={playButtonRef}\n size={'small'}\n onClick={handleClickPlay}\n >\n <IconPlay sx={{ color: 'common.white' }} />\n </Button>\n </span>\n </Tooltip>\n )}\n </>\n );\n};\n\nexport default PlayBackButton;\n","import { Button, Tooltip } from '@mui/material';\nimport classNames from 'classnames';\nimport React, { useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconBackward from 'shared/components/icons/icon-backward';\nimport { useVideoPlayerIsInStandBy } from 'shared/components/video-player/hooks';\n\nimport { usePlaylistItems, useVideoPlayerActions, useVideoPlayerState } from '../../../index';\nimport { PLAYER_STATES } from '../../../state/states';\nimport styles from '../Controls.module.scss';\n\nconst BackwardButton = () => {\n const { t } = useTranslation();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { state, readyState } = useVideoPlayerState();\n const isInStandBy = useVideoPlayerIsInStandBy();\n const actions = useVideoPlayerActions();\n const playlistItems = usePlaylistItems();\n\n const isDisabled = !readyState || state === PLAYER_STATES.ENDED || isInStandBy;\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n buttonRef?.current?.blur();\n actions.previousPlaylistItem();\n };\n\n if (playlistItems.length <= 1) return null;\n\n return (\n <Tooltip enterDelay={2000} title={`${t('video-player:controls.previous-video')}`}>\n <span>\n <Button\n ref={buttonRef}\n className={classNames({ [styles.disabled]: isDisabled })}\n disabled={isDisabled}\n size={'small'}\n onClick={handleClick}\n >\n <IconBackward size='medium' sx={{ color: 'common.white' }} />\n </Button>\n </span>\n </Tooltip>\n );\n};\n\nexport default BackwardButton;\n","import { Fade } from '@mui/material';\nimport React, { useRef } from 'react';\n\nimport { useVideoPlayerIsInStandBy } from 'shared/components/video-player/hooks';\n\nimport styles from './ProgressBar.module.scss';\nimport { useCurrentTime, useDuration, useIsBuffering, useIsSeeking, useVideoPlayerActions } from '../../../index';\n\nconst ProgressBar = () => {\n const ref = useRef<HTMLDivElement>(null);\n const duration = useDuration();\n const currentTime = useCurrentTime();\n const isBuffering = useIsBuffering();\n const isSeeking = useIsSeeking();\n const isInStandBy = useVideoPlayerIsInStandBy();\n const actions = useVideoPlayerActions();\n\n const handleJumpToPercent = (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const isDisabled = isInStandBy || isSeeking;\n\n event.stopPropagation();\n if (!ref.current || isDisabled) return;\n\n const clientRect = ref.current.getBoundingClientRect();\n const pageX = event.pageX;\n const clickPosition = pageX - clientRect.x;\n actions.jumpToTimePercent((100 * clickPosition) / ref.current.clientWidth);\n };\n\n const showBuffering = isBuffering || isSeeking;\n\n return (\n <div className={styles.container} ref={ref} onClick={handleJumpToPercent}>\n <div className={styles.content}>\n <Fade unmountOnExit in={showBuffering} exit={!showBuffering}>\n <div className={styles.buffering} />\n </Fade>\n <div className={styles.bar} style={{ width: `${(100 * currentTime) / duration}%` }} />\n </div>\n </div>\n );\n};\n\nexport default ProgressBar;\n","import { Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React from 'react';\n\nimport { formattedTime } from 'pages/tactical-analysis/utils/formatted-time';\nimport {\n useCurrentMatchTime,\n useCurrentPlaylistItemVideoSources,\n useVideoPlayerPlayingMode,\n} from 'shared/components/video-player/hooks';\nimport { PlayingMode, VideoSourceWithTimes } from 'shared/components/video-player/types';\nimport { SegmentConfig } from 'shared/types/segment/types';\nimport { secondsAsDuration } from 'shared/utils/seconds-as-duration';\n\nimport { useCurrentTime, useDuration } from '../../../index';\nimport { isFullMatchVideo } from '../../../is-full-match-video';\n\ninterface Props {\n useSegments?: boolean;\n matchSegments?: SegmentConfig[];\n}\n\nconst format = (time: number, matchSegments?: SegmentConfig[]) => {\n if (matchSegments) return formattedTime(time, matchSegments, false);\n\n return secondsAsDuration(time, false);\n};\n\nconst getEndTimeOfMatch = (duration: number, matchSegments?: SegmentConfig[]) => {\n if (matchSegments) {\n const endTime = format(duration, matchSegments);\n return endTime === '--:--' ? format(duration) : endTime;\n }\n\n return secondsAsDuration(duration, false);\n};\n\nconst getEndTimeByPlayingMode = (\n playingMode: PlayingMode,\n videoSources: VideoSourceWithTimes[],\n matchSegments?: SegmentConfig[],\n) => {\n const lastVideoSourceEndTime =\n videoSources.length > 0 ? videoSources[videoSources.length - 1].endTimeInMatch ?? 0 : 0;\n\n return lastVideoSourceEndTime === 0 && matchSegments && matchSegments.length > 0 && isFullMatchVideo(playingMode.mode)\n ? matchSegments[matchSegments.length - 1].start + matchSegments[matchSegments.length - 1].length\n : lastVideoSourceEndTime;\n};\n\nconst ProgressTime = ({ matchSegments }: Props) => {\n const duration = useDuration();\n const currentTime = useCurrentTime();\n const videoSources = useCurrentPlaylistItemVideoSources();\n const playingMode = useVideoPlayerPlayingMode();\n const currentVideoSourceTime = useCurrentMatchTime();\n\n const endTime = getEndTimeByPlayingMode(playingMode, videoSources, matchSegments);\n\n const formattedCurrentTime = format(matchSegments ? currentVideoSourceTime : currentTime, matchSegments);\n const formattedEndTimeOfMatch = getEndTimeOfMatch(\n matchSegments && endTime > 0 ? endTime - 0.1 : duration,\n matchSegments,\n );\n\n return (\n <Typography\n color={Colors.white}\n whiteSpace={'nowrap'}\n >{`${formattedCurrentTime} / ${formattedEndTimeOfMatch}`}</Typography>\n );\n};\n\nexport default ProgressTime;\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React from 'react';\n\nconst RulesWrapper = styled(Box)(() => ({\n position: 'absolute',\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n}));\n\nconst Line = styled(Box)(() => ({\n background: Colors.aqua,\n zIndex: 1,\n opacity: 0.2,\n}));\n\nconst LineVertical = styled(Line)(() => ({\n position: 'relative',\n left: '50%',\n justifyContent: 'center',\n height: '100%',\n width: ' 1px',\n}));\n\nconst LineHorizontal = styled(Line)(() => ({\n height: '1px',\n width: '100%',\n alignSelf: 'center',\n}));\n\nexport const Rules = () => {\n return (\n <RulesWrapper>\n <LineVertical />\n <LineHorizontal />\n </RulesWrapper>\n );\n};\n","import { Button, styled } from '@mui/material';\n\nexport const SpeedItemButton = styled(Button)({\n minWidth: 'auto',\n width: '40px',\n});\n","import { atom, useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { PLAYBACK_RATES } from 'shared/constants/playback-rates/paybackRates';\nimport { PlaybackRate } from 'shared/types/payback-rates/payback-rates';\n\nconst videoPlayerSpeedAtom = atom<PlaybackRate>({\n key: 'video-player-speed',\n default: PLAYBACK_RATES.normal,\n});\n\nexport const useVideoPlayerSpeed = () => {\n return useRecoilValue(videoPlayerSpeedAtom);\n};\n\nexport const useSetVideoPlayerSpeed = () => {\n return useSetRecoilState(videoPlayerSpeedAtom);\n};\n","import { Button, Menu, Stack, Tooltip } from '@mui/material';\nimport React, { useCallback, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useSaveUserPreset } from 'api/user-presets/use-save-user-preset';\nimport IconPlaySpeed from 'shared/components/icons/icon-play-speed';\nimport { PLAYBACK_RATES_VALUES } from 'shared/constants/playback-rates/paybackRates';\nimport { VideoPlayerSpeedPreset } from 'shared/constants/user-presets/userPresetsClasses';\nimport { PlaybackRate } from 'shared/types/payback-rates/payback-rates';\n\nimport { SpeedItemButton } from './styled';\nimport { useSetVideoPlayerSpeed } from '../../../hooks/use-video-player-speed';\n\ninterface Props {\n playbackRate: PlaybackRate;\n container: HTMLDivElement | null;\n}\n\nexport const SpeedButton = ({ playbackRate, container }: Props) => {\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { t } = useTranslation();\n const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n const setVideoPlayerSpeed = useSetVideoPlayerSpeed();\n const { savePreset } = useSaveUserPreset();\n\n const handleClick = useCallback((event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n }, []);\n\n const handleClose = useCallback((event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setAnchorEl(null);\n }, []);\n\n const handleChangeSpeed = useCallback(\n (speed: PlaybackRate, event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setVideoPlayerSpeed(speed);\n const speedPreset = new VideoPlayerSpeedPreset(speed);\n savePreset({ data: speedPreset });\n handleClose(event);\n },\n [handleClose, savePreset, setVideoPlayerSpeed],\n );\n\n return (\n <>\n <Tooltip enterDelay={2000} title={`${t('video-player:controls.video-speed')}`}>\n <Button ref={buttonRef} size={'small'} onClick={handleClick}>\n <IconPlaySpeed sx={{ color: 'common.white' }} />\n </Button>\n </Tooltip>\n <Menu\n id='speed-button-menu'\n aria-labelledby='speed-button-menu'\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n container={container}\n anchorOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n <Stack direction='row' paddingX={1} spacing={0.5}>\n {PLAYBACK_RATES_VALUES.map((playbackRateValue) => (\n <SpeedItemButton\n key={playbackRateValue}\n variant={playbackRate === playbackRateValue ? 'contained' : 'text'}\n color={playbackRate === playbackRateValue ? 'primary' : 'secondary'}\n size={'small'}\n onClick={(event) => handleChangeSpeed(playbackRateValue, event)}\n >\n {playbackRateValue}\n </SpeedItemButton>\n ))}\n </Stack>\n </Menu>\n </>\n );\n};\n","import classNames from 'classnames';\n\nimport styles from './TextOverlay.module.scss';\n\ninterface Props {\n prefix: string;\n description: string;\n fullScreen: boolean;\n}\n\nexport const TextOverlay = ({ prefix, description, fullScreen }: Props) => {\n return (\n <div className={classNames(styles.textOverlay, { [styles.textOverlayFullScreen]: fullScreen })}>\n <span className={styles.textOverlayPrefix}>{prefix}</span>\n <span className={styles.textOverlayDescription}>{description}</span>\n </div>\n );\n};\n","import {\n Alert,\n Box,\n Grid,\n Paper,\n Stack,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n} from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useVideoPlayerPlayingMode } from '../../../../../hooks';\nimport { useOverlaysFrameInfo } from '../../../../../hooks/use-overlays-controller';\n\nexport const VideoOverlaysTab = () => {\n const { showOverlays } = useVideoPlayerPlayingMode();\n const { t } = useTranslation();\n const overlaysFrameInfo = useOverlaysFrameInfo();\n\n if (!showOverlays) {\n return (\n <Alert severity={'info'} variant={'filled'}>\n No overlays activated\n </Alert>\n );\n }\n return (\n <Stack gap={2}>\n <Grid container spacing={1}>\n <Grid item xs={4}>\n <h4>Active tactics</h4>\n <TableContainer component={Paper}>\n <Table>\n <TableBody>\n {overlaysFrameInfo.frameTactics.length > 0 ? (\n overlaysFrameInfo.frameTactics.map((tactic) => (\n <TableRow key={tactic}>\n <TableCell>\n <Box>{t(`fundamentals:fundamentals.${tactic}`)}</Box>\n </TableCell>\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={5}>\n <Alert variant={'outlined'} color={'info'} sx={{ textAlign: 'center' }}>\n No tactics in this frame\n </Alert>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </TableContainer>\n </Grid>\n <Grid item xs={8}>\n <h4>Overlay elements</h4>\n <TableContainer component={Paper}>\n <Table>\n <TableHead>\n <TableRow>\n <TableCell>Id</TableCell>\n <TableCell>Priority</TableCell>\n <TableCell>Players</TableCell>\n <TableCell>Excluded Players</TableCell>\n <TableCell>Visibility</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {overlaysFrameInfo.overlayElementsDebugInfo.length > 0 ? (\n overlaysFrameInfo.overlayElementsDebugInfo.map((element, idx) => (\n <TableRow key={idx}>\n <TableCell title={element.id}>\n <Box\n sx={{\n maxWidth: '260px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {element.id}\n </Box>\n </TableCell>\n <TableCell>{element.priority}</TableCell>\n <TableCell>{element.players.join(', ')}</TableCell>\n <TableCell>{element.excludedPlayers.join(', ')}</TableCell>\n <TableCell>\n <Box sx={{ color: element.isVisible ? Colors.green : Colors.red }}>\n {element.isVisible ? 'visible' : 'hidden'}\n </Box>\n </TableCell>\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={5}>\n <Alert variant={'outlined'} color={'info'} sx={{ textAlign: 'center' }}>\n No overlay elements in this frame\n </Alert>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </TableContainer>\n </Grid>\n </Grid>\n </Stack>\n );\n};\n","import { Chip, Grid } from '@mui/material';\nimport { usePlayerContext } from '@vime/react';\nimport React, { useMemo } from 'react';\n\nimport { round } from 'shared/utils/round';\n\nimport {\n useCurrentTime,\n useCurrentVideoSourceTime,\n useDuration,\n usePlayerCurrentSource,\n usePlaylistCurrentPlaylistItemId,\n usePlaylistItems,\n useVideoPlayerPlayingMode,\n useVideoPlayerRef,\n useVideoPlayerState,\n} from '../../../../../hooks';\n\nexport const VideoPlayerTab = () => {\n const videoPlayerRef = useVideoPlayerRef();\n const [seeking] = usePlayerContext(videoPlayerRef, 'seeking', false);\n const [buffering] = usePlayerContext(videoPlayerRef, 'buffering', false);\n const videoSource = usePlayerCurrentSource();\n const playlistItemId = usePlaylistCurrentPlaylistItemId();\n const playlistItems = usePlaylistItems();\n const playingMode = useVideoPlayerPlayingMode();\n const duration = useDuration();\n const currentTime = useCurrentTime();\n const currentVideoSourceTime = useCurrentVideoSourceTime();\n const { state, readyState } = useVideoPlayerState();\n\n const videoSourceStartTime = videoSource?.startTime ?? 0;\n const videoSourceEndTime = videoSource?.endTime ?? 0;\n\n const shortcuts = useMemo(\n () => [\n { title: 'SPACE', value: 'play/pause' },\n { title: 'Arrow Right', value: '+5s' },\n { title: 'Arrow Left', value: '-5s' },\n { title: 'ctrl + Arrow Right', value: 'Next playlist item' },\n { title: 'ctrl + Arrow Left', value: 'Previous playlist item' },\n { title: 'alt + d', value: 'Hide and show debug (only admins)' },\n { title: 'alt + o', value: 'Hide and show custom overlays (only admins)' },\n ],\n [],\n );\n\n const values = useMemo(\n () => [\n { title: 'Current Time', value: currentTime ?? 0 },\n { title: 'currentVideoSourceTime', value: currentVideoSourceTime ?? 0 },\n { title: 'Percent', value: duration > 0 ? round((100 * currentTime) / duration) : 0 },\n {\n title: 'VideoSource Percent',\n value: round((100 * currentTime) / (videoSourceEndTime - videoSourceStartTime)),\n },\n { title: 'Start time', value: videoSourceStartTime },\n { title: 'End time', value: videoSourceEndTime },\n { title: 'Seeking', value: seeking ? 'true' : 'false' },\n { title: 'Buffering', value: buffering ? 'true' : 'false' },\n { title: 'Source', value: videoSource?.src },\n { title: 'Source Download', value: videoSource?.srcDownload },\n { title: 'Playing mode', value: playingMode.mode },\n { title: 'Playlist Id', value: playlistItemId },\n {\n title: 'Playlist index playing',\n value: playlistItems.findIndex((playlistItem) => playlistItem.id === playlistItemId),\n },\n { title: 'State', value: <Chip size='small' label={`${state}`} color='default' /> },\n { title: 'Ready state', value: <Chip size='small' label={readyState} color='default' /> },\n ],\n [\n buffering,\n currentTime,\n currentVideoSourceTime,\n duration,\n playingMode,\n playlistItemId,\n playlistItems,\n readyState,\n seeking,\n state,\n videoSource?.src,\n videoSource?.srcDownload,\n videoSourceEndTime,\n videoSourceStartTime,\n ],\n );\n\n if (!videoSource) return null;\n\n return (\n <>\n <h4>Player info</h4>\n <Grid container spacing={1}>\n {values.map((value) => (\n <React.Fragment key={value.title}>\n <Grid item xs={4}>\n <strong>{value.title}</strong>\n </Grid>\n <Grid item xs={8}>\n {value.value}\n </Grid>\n </React.Fragment>\n ))}\n </Grid>\n <br />\n <h4>Shortcuts</h4>\n <Grid container spacing={1}>\n {shortcuts.map((value) => (\n <React.Fragment key={value.title}>\n <Grid item xs={4}>\n <strong>{value.title}</strong>\n </Grid>\n <Grid item xs={8}>\n {value.value}\n </Grid>\n </React.Fragment>\n ))}\n </Grid>\n </>\n );\n};\n","import { Box, Card, CardContent, IconButton, Tab } from '@mui/material';\nimport React, { useCallback, useState } from 'react';\n\nimport IconClose from 'shared/components/icons/icon-close';\nimport { Tabs } from 'shared/components/tabs';\nimport { TabPanel, TabsPanel } from 'shared/components/tabs/components/tab-panel';\n\nimport { VideoOverlaysTab } from './video-overlays-tab';\nimport { VideoPlayerTab } from './video-player-tab';\nimport styles from './VideoPlayerDebugContent.module.scss';\n\ninterface Props {\n onClose: () => void;\n}\n\nexport const VideoPlayerDebugContent = ({ onClose }: Props) => {\n const [selectedTab, setSelectedTab] = useState(0);\n const handleTabChange = (event: React.SyntheticEvent, newValue: number) => {\n setSelectedTab(newValue);\n };\n\n const handleOnClose = useCallback(() => {\n onClose();\n }, [onClose]);\n\n return (\n <Card className={styles.container}>\n <CardContent className={styles.content}>\n <IconButton className={styles.close} size='small' onClick={handleOnClose}>\n <IconClose size='small' />\n </IconButton>\n <Box sx={{ padding: '16px' }}>\n <Tabs value={selectedTab} onChange={handleTabChange} variant={'fullWidth'}>\n <Tab label='Overlay frame info' />\n <Tab label='Video info' />\n </Tabs>\n <TabsPanel>\n <TabPanel value={selectedTab} index={1}>\n <VideoPlayerTab />\n </TabPanel>\n <TabPanel value={selectedTab} index={0}>\n <VideoOverlaysTab />\n </TabPanel>\n </TabsPanel>\n </Box>\n </CardContent>\n </Card>\n );\n};\n","import React, { useCallback, useEffect, useState } from 'react';\n\nimport { VideoPlayerDebugContent } from './video-player-debug-content';\n\nexport const VideoPlayerDebug = () => {\n const [isVisible, setIsVisible] = useState(false);\n\n const handleKeyDown = useCallback((event: KeyboardEvent) => {\n if (event.altKey && (event.code === 'KeyD' || event.code === 'keyd')) {\n event.preventDefault();\n event.stopPropagation();\n setIsVisible((isVisible) => !isVisible);\n }\n return false;\n }, []);\n\n const handleOnClose = useCallback(() => {\n setIsVisible(false);\n }, []);\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown]);\n\n if (!isVisible) return null;\n\n return <VideoPlayerDebugContent onClose={handleOnClose} />;\n};\n","import classNames from 'classnames';\n\nimport Spinner from 'shared/components/spinner';\n\nimport styles from './VideoSpinner.module.scss';\nimport { useIsBuffering, useIsSeeking } from '../../../hooks';\n\nconst VideoSpinner = () => {\n const isSeeking = useIsSeeking();\n const isBuffering = useIsBuffering();\n\n const isLoading = isSeeking || isBuffering;\n\n return (\n <div className={classNames(styles.spinner, { [styles.isLoading]: isLoading })}>\n <Spinner size='xlarge' />\n </div>\n );\n};\n\nexport default VideoSpinner;\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const videoPlayerBarContainerHeight = 40;\n\nexport const VideoPlayerBarContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n zIndex: 10,\n backgroundColor: Colors.night,\n color: Colors.white,\n paddingLeft: theme.spacing(2),\n paddingTop: theme.spacing(0.25),\n paddingBottom: theme.spacing(0.25),\n paddingRight: theme.spacing(2),\n minHeight: videoPlayerBarContainerHeight,\n}));\n\nexport const VideoBarContent = styled(Box)(() => ({\n display: 'flex',\n justifyContent: 'flex-start',\n alignItems: 'center',\n flex: 1,\n}));\n","import debounce from 'lodash/debounce';\nimport { RefObject, useCallback, useEffect, useLayoutEffect, useState } from 'react';\n\nimport { videoPlayerBarContainerHeight } from '../../../video-player-bar/styled';\n\nexport const aspectRatioFromSize = (size: { width: number; height: number }, separator: string) => {\n return `${size.width}${separator}${size.height}`;\n};\n\nexport const DEFAULT_VIDEO_ASPECT_RATIO = { width: 16, height: 9 };\nexport const defaultVideoAspectRatio = aspectRatioFromSize(DEFAULT_VIDEO_ASPECT_RATIO, '/');\n\ninterface Params {\n containerRef: RefObject<HTMLDivElement>;\n}\n\nconst getAspectRatioSizes = (width: number, height: number): { width: number; height: number } => {\n const ratioWidth = Math.floor((height * 16) / 9);\n const ratioHeight = Math.floor((width * 9) / 16);\n\n if (ratioHeight > height) {\n const adjustedWidth = Math.floor((height * 16) / 9);\n return { width: adjustedWidth, height: Math.floor((adjustedWidth * 9) / 16) };\n }\n\n if (ratioWidth > width) {\n const adjustedWidth = Math.floor((width * 9) / 16);\n return { width: Math.floor((adjustedWidth * 16) / 9), height };\n }\n\n return { width: ratioWidth, height: ratioHeight - videoPlayerBarContainerHeight };\n};\n\nexport const useVideoAspectRatio = ({ containerRef }: Params) => {\n const [videoAspectRatio, setVideoAspectRatio] = useState(DEFAULT_VIDEO_ASPECT_RATIO);\n\n const aspectRatioFromContainer = useCallback(\n () =>\n containerRef?.current\n ? getAspectRatioSizes(containerRef.current.clientWidth, containerRef.current.clientHeight)\n : DEFAULT_VIDEO_ASPECT_RATIO,\n [containerRef],\n );\n\n useLayoutEffect(() => {\n if (containerRef.current?.clientHeight && containerRef.current?.clientWidth) {\n setVideoAspectRatio(aspectRatioFromContainer());\n }\n }, [aspectRatioFromContainer, containerRef]);\n\n const handleUpdateSize = useCallback((element: HTMLDivElement) => {\n const { width, height } = element.getBoundingClientRect();\n\n setVideoAspectRatio(getAspectRatioSizes(width, height - videoPlayerBarContainerHeight));\n }, []);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleContainerResize = useCallback(\n debounce(() => {\n containerRef.current && handleUpdateSize(containerRef.current);\n }, 10),\n [containerRef.current],\n );\n\n useEffect(() => {\n if (containerRef?.current !== null) {\n window.addEventListener('resize', handleContainerResize);\n\n const observer = new ResizeObserver(() => {\n handleContainerResize();\n });\n\n const containerElement: HTMLElement = containerRef.current;\n observer.observe(containerElement);\n\n return () => {\n window.removeEventListener('resize', handleContainerResize);\n observer.unobserve(containerElement);\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerRef]);\n\n return {\n videoAspectRatio: videoAspectRatio,\n };\n};\n","import React, { useEffect } from 'react';\n\nimport styles from './Overlays.module.scss';\nimport { useCurrentPlaylistItem, useIsSeeking, useVideoPlayerState } from '../hooks';\nimport { useAreOverlaysReady, useOverlaysController } from '../hooks/use-overlays-controller';\nimport { READY_STATES } from '../state/states';\n\ntype Props = {\n disabled: boolean;\n videoPlayerContainerRef: React.RefObject<HTMLDivElement>;\n};\n\nexport const VideoOverlays = ({ disabled, videoPlayerContainerRef }: Props) => {\n const { container, overlayGenerator, matrix3dTransformation } = useOverlaysController(videoPlayerContainerRef);\n const { fundamentalsSelected, recordingId } = useCurrentPlaylistItem();\n const isSeeking = useIsSeeking();\n const areOverlaysReady = useAreOverlaysReady();\n const { readyState } = useVideoPlayerState();\n\n useEffect(() => {\n if (fundamentalsSelected.tacticalAnalysisId) {\n overlayGenerator.init({ tacticalAnalysisId: fundamentalsSelected.tacticalAnalysisId, recordingId });\n }\n }, [fundamentalsSelected.tacticalAnalysisId, overlayGenerator, recordingId]);\n\n const areOverlaysVisible =\n !disabled &&\n !!matrix3dTransformation &&\n areOverlaysReady &&\n !isSeeking &&\n fundamentalsSelected.tacticalAnalysisId &&\n (readyState === READY_STATES.PLAYING || readyState === READY_STATES.PAUSED || readyState === READY_STATES.STAND_BY);\n\n return (\n <div\n ref={container}\n key={recordingId}\n className={styles.overlays}\n style={{\n display: areOverlaysVisible ? 'block' : 'none',\n transform: matrix3dTransformation ? `matrix3d(${matrix3dTransformation.join(',')})` : 'none',\n }}\n />\n );\n};\n","import { styled, Switch as MuiSwitch, SwitchProps } from '@mui/material';\nimport { forwardRef } from 'react';\n\ninterface Props extends SwitchProps {\n onColor?: string;\n offColor?: string;\n}\n\nconst Switch = styled(MuiSwitch, {\n shouldForwardProp: (prop) => prop !== 'onColor' && prop !== 'offColor',\n})<Props>(({ theme, offColor, onColor }) => ({\n minWidth: 40,\n width: 40,\n height: 24,\n padding: 0,\n lineHeight: 1,\n '& .MuiSwitch-switchBase': {\n padding: theme.spacing(0.5),\n transitionDuration: theme.transitions.duration.shorter,\n '&.Mui-checked': {\n transform: 'translateX(16px)',\n color: theme.palette.common.white,\n '& + .MuiSwitch-track': {\n backgroundColor: onColor ?? theme.palette.primary.main,\n opacity: 1,\n },\n },\n '&.Mui-disabled': {\n filter: 'grayscale(100%)',\n },\n '&.Mui-focusVisible .MuiSwitch-thumb': {\n border: `6px solid ${theme.palette.common.white}`,\n },\n '&.Mui-disabled + .MuiSwitch-track': {\n opacity: 0.3,\n },\n },\n '& .MuiSwitch-thumb': {\n boxSizing: 'border-box',\n background: theme.palette.common.white,\n borderRadius: '50%',\n width: 16,\n height: 16,\n boxShadow: 'none',\n },\n '& .MuiSwitch-track': {\n borderRadius: 48,\n backgroundColor: offColor ?? theme.palette.secondary.main,\n opacity: 1,\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.shorter,\n }),\n },\n}));\n\nconst Toggle = forwardRef(\n (\n props: Props,\n ref?: ((instance: HTMLButtonElement | null) => void) | React.RefObject<HTMLButtonElement> | null | undefined,\n ) => {\n return <Switch ref={ref} {...props} />;\n },\n);\n\nToggle.displayName = 'Toggle';\n\nexport default Toggle;\n","import { Stack, Typography } from '@mui/material';\nimport { INITIAL_QUALITY, Quality, useOverlayGeneratorById } from 'overlay-generator';\nimport { ChangeEvent, useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useCurrentPlaylistItem } from '../../../hooks';\n\nexport const OverlaysQualitySelector = () => {\n const { t } = useTranslation();\n const playlistItem = useCurrentPlaylistItem();\n const [overlayGenerator] = useOverlayGeneratorById(playlistItem.recordingId);\n const [quality, setQuality] = useState(INITIAL_QUALITY);\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLSelectElement>) => {\n overlayGenerator.setQuality(event.target.value as Quality);\n setQuality(event.target.value as Quality);\n },\n [overlayGenerator],\n );\n\n return (\n <Stack direction={'row'} gap={1} alignItems={'center'}>\n <Typography variant={'caption'}>{t('video-player:overlays-quality.title')}</Typography>\n <select id='quality-select' value={quality} onChange={handleChange}>\n <option value={Quality.LOW}>{t('video-player:overlays-quality.low')}</option>\n <option value={Quality.MEDIUM}>{t('video-player:overlays-quality.medium')}</option>\n <option value={Quality.HIGH}>{t('video-player:overlays-quality.high')}</option>\n <option value={Quality.VERY_HIGH}>{t('video-player:overlays-quality.very-high')}</option>\n </select>\n </Stack>\n );\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React from 'react';\n\ninterface VideoBarBlockContainerProps {\n hideSeparator?: boolean;\n}\n\nconst VideoBarBlockContainer = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'hideSeparator',\n})<VideoBarBlockContainerProps>(({ theme, hideSeparator }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(),\n position: 'relative',\n color: Colors.white,\n flexGap: theme.spacing(2),\n ...(!hideSeparator && {\n position: 'relative',\n paddingLeft: theme.spacing(2),\n marginLeft: theme.spacing(2),\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n width: '1px',\n height: '100%',\n backgroundColor: Colors.athens,\n },\n }),\n}));\n\ninterface Props extends VideoBarBlockContainerProps {\n children: React.ReactNode;\n}\n\nexport const VideoBarBlock = ({ children, hideSeparator = false }: Props) => {\n return <VideoBarBlockContainer hideSeparator={hideSeparator}>{children}</VideoBarBlockContainer>;\n};\n\nexport const VideoBarActions = styled(Box)(() => ({\n display: 'flex',\n flex: 1,\n gap: 1,\n justifyContent: 'flex-end',\n}));\n","import { Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport React, { useCallback, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport Toggle from 'shared/components/toggle';\nimport { useFeatureFlag } from 'shared/contexts/app-state';\n\nimport { OverlaysQualitySelector } from './overlays-quality-selector';\nimport {\n EPISODES_PLAYING_MODE,\n getPlayingMode,\n TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE,\n} from '../../defaultPlayingModes';\nimport { useCurrentPlaylistItem, useVideoPlayerPlayingMode } from '../../hooks';\nimport { PlayingMode } from '../../types';\nimport { VideoBarBlock } from '../video-bar-block';\n\ninterface Props {\n showTacticDrawingsOnly: boolean;\n disabledTacticDrawings?: boolean;\n setPlayingMode: (playingMode: PlayingMode) => void;\n}\n\nconst useVideoPlayerChangePlayingMode = (setPlayingMode: (playingMode: PlayingMode) => void) => {\n const videoPlayerPlayingMode = useVideoPlayerPlayingMode();\n const playlistItem = useCurrentPlaylistItem();\n\n return useCallback(() => {\n if (playlistItem.hasHomographies) {\n return setPlayingMode(\n getPlayingMode({\n playingMode: videoPlayerPlayingMode,\n showOverlays: !videoPlayerPlayingMode.useEffectiveTime,\n useEffectiveTime: !videoPlayerPlayingMode.useEffectiveTime,\n }),\n );\n }\n\n setPlayingMode(\n !videoPlayerPlayingMode.useEffectiveTime ? EPISODES_PLAYING_MODE : TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE,\n );\n }, [playlistItem.hasHomographies, setPlayingMode, videoPlayerPlayingMode]);\n};\n\nexport const VideoBarTacticDrawingsMode = ({\n showTacticDrawingsOnly,\n disabledTacticDrawings,\n setPlayingMode,\n}: Props) => {\n const isOverlaysQualityDropDownAvailable = useFeatureFlag(FEATURE_FLAG.CUSTOM_OVERLAYS_QUALITY_DROPDOWN);\n const { t } = useTranslation();\n const videoPlayerPlayingMode = useVideoPlayerPlayingMode();\n const handleTacticDrawingsSwitch = useVideoPlayerChangePlayingMode(setPlayingMode);\n const customOverlaysFeatureFlag = useFeatureFlag(FEATURE_FLAG.CUSTOM_OVERLAYS);\n const currentPlaylistItem = useCurrentPlaylistItem();\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.altKey && (event.code === 'KeyO' || event.code === 'keyo')) {\n event.preventDefault();\n event.stopPropagation();\n handleTacticDrawingsSwitch();\n }\n },\n [handleTacticDrawingsSwitch],\n );\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown]);\n\n const showOverlaysQualityDropDown = Boolean(\n isOverlaysQualityDropDownAvailable && customOverlaysFeatureFlag && currentPlaylistItem.hasHomographies,\n );\n\n return (\n <VideoBarBlock hideSeparator={showTacticDrawingsOnly}>\n <Typography fontSize={fontSizes.small}>{t('common:tactic-drawings')}</Typography>\n <Toggle\n disabled={disabledTacticDrawings !== undefined ? disabledTacticDrawings : false}\n checked={videoPlayerPlayingMode.showOverlays}\n onClick={handleTacticDrawingsSwitch}\n />\n {showOverlaysQualityDropDown ? <OverlaysQualitySelector /> : null}\n </VideoBarBlock>\n );\n};\n","import React from 'react';\n\nimport { PlayingMode } from '../../types';\nimport { VideoBarTacticDrawingsMode } from '../video-bar-tactic-drawings-mode';\n\ninterface Props {\n disabledTacticDrawings?: boolean;\n setPlayingMode: (playingMode: PlayingMode) => void;\n shouldShowTacticDrawings: boolean;\n showTacticDrawingsOnly: boolean;\n}\n\nexport const VideoBarHeader = ({\n disabledTacticDrawings,\n setPlayingMode,\n shouldShowTacticDrawings,\n showTacticDrawingsOnly,\n}: Props) => {\n if (!shouldShowTacticDrawings) return null;\n\n return (\n <VideoBarTacticDrawingsMode\n showTacticDrawingsOnly={showTacticDrawingsOnly}\n disabledTacticDrawings={disabledTacticDrawings}\n setPlayingMode={setPlayingMode}\n />\n );\n};\n","import { Button, styled } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\n\nexport const SelectButton = styled(Button)({\n color: Colors.white,\n fontSize: fontSizes.xSmall,\n fontWeight: fontWeight['500'],\n\n '&.Mui-disabled': {\n color: Colors.storm,\n },\n});\n\nexport const sxSelectPaperStyles = {\n backgroundColor: Colors.night,\n color: Colors.white,\n minWidth: '327px',\n border: `1px solid ${Colors.storm}`,\n marginTop: 2,\n padding: 2,\n};\n","import {\n Box,\n Divider,\n IconButton,\n List,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n styled,\n TextField,\n} from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\n\nconst VIDEO_SOURCE_LIST_ITEM_INDENT = '32px';\n\ninterface VideoSourceListItemTextProps {\n inset?: boolean;\n isChecked?: boolean;\n}\n\nexport const VideoSourceList = styled(List)(() => ({\n padding: 0,\n}));\n\nexport const VideSourceListItemContent = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n paddingRight: theme.spacing(2),\n}));\n\nexport const VideoSourceListItemText = styled(ListItemText, {\n shouldForwardProp: (prop) => prop !== 'isChecked',\n})<VideoSourceListItemTextProps>(({ inset, isChecked }) => ({\n fontSize: fontSizes.default,\n paddingLeft: inset ? VIDEO_SOURCE_LIST_ITEM_INDENT : 0,\n fontWeight: isChecked ? fontWeight['500'] : fontWeight['400'],\n}));\n\nexport const VideoSourceListItemButton = styled(ListItemButton)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'space-between',\n paddingTop: theme.spacing(0.5),\n paddingBottom: theme.spacing(0.5),\n paddingRight: theme.spacing(1),\n borderRadius: theme.shape.borderRadius,\n '&:hover, &:focus': {\n backgroundColor: Colors.shark,\n },\n}));\n\nexport const VideoSourceListItemIconButton = styled(IconButton)(() => ({\n '& svg': {\n fill: Colors.storm,\n },\n '&:hover': {\n '& svg': {\n fill: Colors.white,\n },\n },\n}));\n\nexport const VideoSourceListItemIcon = styled(ListItemIcon)(() => ({\n width: VIDEO_SOURCE_LIST_ITEM_INDENT,\n minWidth: 'auto',\n}));\n\nexport const VideoSourceListDivider = styled(Divider)(({ theme }) => ({\n borderColor: Colors.storm,\n width: `calc(100% + ${theme.spacing(4)})`,\n transform: `translateX(-${theme.spacing(2)})`,\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n}));\n\nexport const VideoSourceListItemTextField = styled(TextField)({\n '& fieldset': {\n borderColor: Colors.storm,\n },\n '& input': {\n color: Colors.white,\n fontSize: fontSizes.default,\n },\n '&:hover': {\n '& .MuiOutlinedInput-notchedOutline': {\n borderColor: Colors.lavender,\n },\n },\n '& .MuiOutlinedInput-notchedOutline.Mui-focused, .MuiOutlinedInput-notchedOutline': {\n borderColor: `${Colors.lavender} !important`,\n },\n});\n","import { ListItem } from '@mui/material';\nimport { isEqual } from 'lodash';\nimport React, { useMemo } from 'react';\n\nimport IconDone from 'shared/components/icons/icon-done';\n\nimport {\n VideoSourceList,\n VideoSourceListDivider,\n VideoSourceListItemButton,\n VideoSourceListItemIcon,\n VideoSourceListItemText,\n VideSourceListItemContent,\n} from './index.styled';\nimport { PlayingMode } from '../../types';\n\nexport enum VideoSourceSelectListItemTypes {\n ListItemMode = 'ListItemMode',\n ListItemOption = 'ListItemOption',\n Separator = 'Separator',\n}\n\ninterface ListItemBase {\n id: string;\n label: string;\n onClick: () => void;\n}\n\nexport interface VideoSourceSelectListItemView extends ListItemBase {\n type: VideoSourceSelectListItemTypes.ListItemMode;\n playingMode: PlayingMode;\n onRemove?: (id: string) => void;\n onEdit?: (event: React.MouseEvent, playingMode: PlayingMode) => void;\n}\n\nexport interface VideoSourceSelectListItemOption extends ListItemBase {\n type: VideoSourceSelectListItemTypes.ListItemOption;\n icon: React.ReactNode;\n}\n\nexport interface VideoSourceSelectSeparator {\n type: VideoSourceSelectListItemTypes.Separator;\n}\n\nexport type VideoSourceSelectListItem =\n | VideoSourceSelectListItemView\n | VideoSourceSelectSeparator\n | VideoSourceSelectListItemOption;\n\ninterface Props {\n options: VideoSourceSelectListItem[];\n selected: VideoSourceSelectListItemView;\n onClose: () => void;\n}\n\nexport const VideoSourceSelectList = ({ options, selected, onClose }: Props) => {\n const optionsList = useMemo(\n () =>\n options.map((listItem: VideoSourceSelectListItem, index) => {\n if (listItem.type === VideoSourceSelectListItemTypes.Separator) {\n return <VideoSourceListDivider key='separator' />;\n }\n\n const hasPrefixIcon = 'icon' in listItem;\n\n const handleOnClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n listItem.onClick();\n onClose();\n };\n\n const isChecked = isEqual(selected, listItem);\n const isInset = hasPrefixIcon ? false : !isChecked;\n\n return (\n <ListItem key={`${listItem.label}_${index}`} disablePadding>\n <VideoSourceListItemButton onClick={handleOnClick}>\n <VideSourceListItemContent>\n {hasPrefixIcon ? <VideoSourceListItemIcon>{listItem.icon}</VideoSourceListItemIcon> : null}\n {isChecked ? (\n <VideoSourceListItemIcon>\n <IconDone size='small' sx={{ color: 'common.white' }} />\n </VideoSourceListItemIcon>\n ) : null}\n <VideoSourceListItemText disableTypography inset={isInset} isChecked={isChecked}>\n {listItem.label}\n </VideoSourceListItemText>\n </VideSourceListItemContent>\n </VideoSourceListItemButton>\n </ListItem>\n );\n }),\n [onClose, options, selected],\n );\n\n return <VideoSourceList>{optionsList}</VideoSourceList>;\n};\n","import { Box, Popover } from '@mui/material';\nimport React, { useState } from 'react';\n\nimport IconChevronDown from 'shared/components/icons/icon-chevron-down';\n\nimport { SelectButton, sxSelectPaperStyles } from './index.styled';\nimport {\n VideoSourceSelectList,\n VideoSourceSelectListItem,\n VideoSourceSelectListItemView,\n} from '../video-source-select-list';\n\ninterface Props {\n options: VideoSourceSelectListItem[];\n selected: VideoSourceSelectListItemView;\n disabled: boolean;\n}\n\nexport const VideoSourceSelect = ({ options, selected, disabled }: Props) => {\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const open = Boolean(anchorEl);\n const id = open ? 'video-source-select' : undefined;\n\n return (\n <Box>\n <SelectButton\n aria-describedby={id}\n variant='text'\n onClick={handleClick}\n endIcon={disabled ? null : <IconChevronDown size='small' sx={{ color: 'common white' }} />}\n disabled={disabled}\n >\n {selected.label}\n </SelectButton>\n <Popover\n id={id}\n open={open}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n PaperProps={{ sx: sxSelectPaperStyles }}\n >\n <VideoSourceSelectList options={options} selected={selected} onClose={handleClose} />\n </Popover>\n </Box>\n );\n};\n","import isEqual from 'lodash/isEqual';\nimport React, { useCallback, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { VideoBarContent, VideoPlayerBarContainer } from './styled';\nimport { VideoBarHeader } from './video-bar-header';\nimport { VideoSourceSelect } from './video-source-select';\nimport {\n VideoSourceSelectListItem,\n VideoSourceSelectListItemTypes,\n VideoSourceSelectListItemView,\n} from './video-source-select-list';\nimport { useCurrentPlaylistItem, useVideoPlayerActions, useVideoPlayerPlayingMode } from '../hooks';\nimport { PlayingMode, PlayingModes } from '../types';\n\ninterface Props {\n showTacticDrawingsOnly: boolean;\n showTacticDrawings?: boolean;\n disabledTacticDrawings?: boolean;\n setPlayingMode: (playingMode: PlayingMode) => void;\n}\n\nexport const VideoPlayerBar = ({\n showTacticDrawingsOnly = false,\n showTacticDrawings = true,\n disabledTacticDrawings,\n setPlayingMode,\n}: Props) => {\n const { t } = useTranslation();\n const playingMode = useVideoPlayerPlayingMode();\n const actions = useVideoPlayerActions();\n const currentPlaylistItem = useCurrentPlaylistItem();\n\n const shouldShowTacticDrawings = useMemo(\n () =>\n (showTacticDrawings && showTacticDrawingsOnly) ||\n (playingMode.mode !== PlayingModes.PANORAMIC &&\n showTacticDrawings &&\n currentPlaylistItem.videoTypes.some((item) => item.playingMode.showOverlays)),\n [currentPlaylistItem, showTacticDrawingsOnly, showTacticDrawings, playingMode],\n );\n\n const selectableVideoTypes = useMemo(\n () => currentPlaylistItem.videoTypes.filter((item) => item.playingMode.mode !== PlayingModes.EPISODES),\n [currentPlaylistItem],\n );\n\n const handlePlayingModeChange = useCallback(\n (playingMode: PlayingMode) => {\n actions.changePlayingMode(playingMode);\n },\n [actions],\n );\n\n const selectOptionsFromVideoSources: VideoSourceSelectListItemView[] = useMemo(\n () =>\n selectableVideoTypes.map((videoType) => {\n return {\n type: VideoSourceSelectListItemTypes.ListItemMode,\n playingMode: videoType.playingMode,\n id:\n videoType.playingMode.mode === PlayingModes.TACTICAL_CAMERA\n ? PlayingModes.PLAYLIST\n : videoType.playingMode.mode,\n label: t(`video-player:playing-modes.${videoType.playingMode.mode}`),\n onClick: () => handlePlayingModeChange(videoType.playingMode),\n };\n }),\n [handlePlayingModeChange, selectableVideoTypes, t],\n );\n\n const selectOptions: VideoSourceSelectListItem[] = selectOptionsFromVideoSources;\n\n const selectedOption = (selectOptions.find((option) => {\n return 'playingMode' in option && isEqual(playingMode, option.playingMode);\n }) || selectOptions[0]) as VideoSourceSelectListItemView;\n\n const isVideoSourceSelectDisabled = selectOptions.length === 1;\n\n if (showTacticDrawingsOnly && !shouldShowTacticDrawings) return null;\n\n return (\n <VideoPlayerBarContainer>\n <VideoBarContent>\n {!showTacticDrawingsOnly ? (\n <VideoSourceSelect options={selectOptions} selected={selectedOption} disabled={isVideoSourceSelectDisabled} />\n ) : null}\n <VideoBarHeader\n disabledTacticDrawings={disabledTacticDrawings}\n setPlayingMode={setPlayingMode}\n shouldShowTacticDrawings={shouldShowTacticDrawings}\n showTacticDrawingsOnly={showTacticDrawingsOnly}\n />\n </VideoBarContent>\n </VideoPlayerBarContainer>\n );\n};\n","import { Box } from '@mui/material';\nimport { ErrorBoundary } from '@sentry/react';\nimport { Dash, Player } from '@vime/react';\nimport classNames from 'classnames';\nimport React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { useRouteMatch } from 'react-router-dom';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { useUserPresets } from 'api/user-presets/use-user-presets';\nimport { routes } from 'kognia/router/routes';\nimport { READY_STATES } from 'shared/components/video-player/state/states';\nimport NextVideoSourceButton from 'shared/components/video-player/video-player-component/components/next-video-source-button';\nimport { PlayerSkeleton } from 'shared/components/video-player/video-player-component/components/player-skeleton';\nimport PreviousVideoSourceButton from 'shared/components/video-player/video-player-component/components/previous-video-source-button';\nimport ProgressBarVideoSource from 'shared/components/video-player/video-player-component/components/progress-bar-video-source';\nimport ProgressTimeVideoSource from 'shared/components/video-player/video-player-component/components/progress-time-video-source';\nimport { videoPlayerSpeedPreset } from 'shared/constants/user-presets/userPresetsVideoPlayer';\nimport { isUserAdmin, useFeatureFlag } from 'shared/contexts/app-state';\nimport { ActionTypes } from 'shared/streams/actionTypes';\nimport { publishFrameRateEvent } from 'shared/streams/eventEmitter';\nimport { SegmentConfig } from 'shared/types/segment/types';\nimport { UserPresetScope } from 'shared/types/user-preset/types';\nimport { getPreset } from 'shared/utils/user-presets/getPreset';\n\nimport Backward5Button from './components/backward-5-button';\nimport ButtonControls from './components/button-controls';\nimport ButtonControlsLeft from './components/button-controls-left';\nimport ButtonControlsRight from './components/button-controls-right';\nimport DownloadButton from './components/download-button';\nimport Forward5Button from './components/forward-5-button';\nimport FullscreenButton from './components/fullscreen-button';\nimport ForwardButton from './components/next-button';\nimport PlayBackButton from './components/playback-button';\nimport BackwardButton from './components/previous-button';\nimport ProgressBar from './components/progress-bar';\nimport ProgressTime from './components/progress-time';\nimport { Rules } from './components/rules';\nimport { SpeedButton } from './components/speed-button';\nimport { TextOverlay } from './components/text-overlay';\nimport VideoControls from './components/video-controls';\nimport { VideoPlayerDebug } from './components/video-player-debug';\nimport VideoSpinner from './components/video-spinner';\nimport { aspectRatioFromSize, DEFAULT_VIDEO_ASPECT_RATIO, useVideoAspectRatio } from './hooks/use-video-aspect-ratio';\nimport styles from './VideoPlayer.module.scss';\nimport {\n useCurrentPlaylistItem,\n useVideoPlayerContainerRef,\n useVideoPlayerId,\n useVideoPlayerIsPlaying,\n useVideoPlayerPlayingMode,\n} from '../hooks';\nimport { useRenderFrameRate } from '../hooks/use-overlays-controller';\nimport { useSetVideoPlayerSpeed, useVideoPlayerSpeed } from '../hooks/use-video-player-speed';\nimport { usePlayerCurrentSource, useVideoPlayerActions, useVideoPlayerRef, useVideoPlayerState } from '../index';\nimport { VideoOverlays } from '../overlays';\nimport { useSetCurrentTime } from '../state/atoms/hooks';\nimport { PlayingMode, PlayingModes } from '../types';\nimport { VideoPlayerBar } from '../video-player-bar';\n\ninterface Props {\n matchSegments?: SegmentConfig[];\n onDownloadSource?: () => void;\n showRules?: boolean;\n showVideoSourceControls?: boolean;\n showVideoPlayerBar?: boolean;\n showTacticDrawingsOnly?: boolean;\n showTacticDrawings?: boolean;\n disabledTacticDrawings?: boolean;\n onPlayingModeChange?: (playingMode: PlayingMode) => void;\n}\n\nconst VideoPlayerComponent = ({\n matchSegments,\n onDownloadSource,\n showRules,\n showVideoSourceControls = false,\n showVideoPlayerBar = false,\n showTacticDrawingsOnly = false,\n showTacticDrawings = true,\n disabledTacticDrawings,\n onPlayingModeChange,\n}: Props) => {\n const videoPlayerContainerRef = useRef<HTMLDivElement>(null);\n const showCustomOverlays = useFeatureFlag(FEATURE_FLAG.CUSTOM_OVERLAYS);\n const isPageWhitelisted = useRouteMatch([\n routes.RECORDING_PLAYLIST_DETAIL,\n routes.PLAYER_PROFILE_DASHBOARD,\n routes.DASHBOARD_PREVIEW,\n ]);\n const videoPlayerId = useVideoPlayerId();\n const isAdmin = isUserAdmin();\n const actions = useVideoPlayerActions();\n const playbackRate = useVideoPlayerSpeed();\n const containerRef = useVideoPlayerContainerRef();\n const videoPlayerRef = useVideoPlayerRef();\n const videoSource = usePlayerCurrentSource();\n const playlistItem = useCurrentPlaylistItem();\n const state = useVideoPlayerState();\n const isPlaying = useVideoPlayerIsPlaying();\n const [showFullScreen, setShowFullScreen] = useState('idle');\n const currentPlaylistItem = useCurrentPlaylistItem();\n const videoPlayerPlayingMode = useVideoPlayerPlayingMode();\n const setCurrentTime = useSetCurrentTime(videoPlayerId);\n const { videoAspectRatio } = useVideoAspectRatio({ containerRef });\n const areOverlaysEnabledInTimeline = useRouteMatch([routes.PERFORMANCE_REPORT_TIMELINE]);\n const setVideoPlayerSpeed = useSetVideoPlayerSpeed();\n const frameRate = useRenderFrameRate();\n\n useEffect(() => {\n if (isPlaying) {\n publishFrameRateEvent({ type: ActionTypes.LOG_OVERLAYS_FRAME_RATE, payload: frameRate });\n }\n }, [frameRate, isPlaying]);\n\n useUserPresets({\n scope: UserPresetScope.videoPlayer,\n onSuccess: (data) => {\n const speedPreset = getPreset(data, videoPlayerSpeedPreset.key);\n if (speedPreset !== undefined) setVideoPlayerSpeed(speedPreset);\n },\n });\n\n const handleChangePlayingMode = useCallback(\n (playingMode: PlayingMode) => {\n if (onPlayingModeChange) {\n onPlayingModeChange(playingMode);\n } else {\n actions.changePlayingMode(playingMode);\n }\n },\n [actions, onPlayingModeChange],\n );\n\n useLayoutEffect(() => {\n actions.refresh();\n }, [actions]);\n\n const handleTogglePlaying = useCallback(() => {\n isPlaying ? actions.pause() : actions.play();\n }, [actions, isPlaying]);\n\n const handleTimeUpdate = useCallback(\n (event: { detail: number }) => {\n if (state.readyState && isPlaying && videoPlayerRef.current?.paused) {\n actions.play();\n }\n\n if (state.readyState && !isPlaying && !videoPlayerRef.current?.paused) {\n actions.pause();\n }\n\n if (\n (state.readyState === READY_STATES.ENDED ||\n state.readyState === READY_STATES.PLAYING ||\n state.readyState === READY_STATES.PAUSED) &&\n videoPlayerRef.current?.ready\n ) {\n if (\n videoPlayerPlayingMode.mode === PlayingModes.TACTICAL_CAMERA &&\n !videoPlayerPlayingMode.useEffectiveTime &&\n playlistItem.videoTypes[0].videoSources.length <= 1\n ) {\n event.detail >= videoSource.endTime ? actions.nextPlaylistItem() : setCurrentTime(event.detail);\n } else {\n event.detail >= videoSource.endTime ? actions.nextVideoSource() : setCurrentTime(event.detail);\n }\n }\n },\n [\n state.readyState,\n isPlaying,\n videoPlayerRef,\n actions,\n playlistItem,\n videoPlayerPlayingMode.mode,\n videoPlayerPlayingMode.useEffectiveTime,\n videoSource.endTime,\n setCurrentTime,\n ],\n );\n\n const isFullScreen = showFullScreen === 'visible';\n const showVideoSourceTimeInFullscreen =\n isFullScreen &&\n matchSegments &&\n videoSource?.startTimeInMatch &&\n videoSource.startTimeInMatch >= 0 &&\n videoSource.endTimeInMatch &&\n videoSource?.endTimeInMatch >= 0;\n\n const videoSourceSrc = videoSource?.src;\n const isTextOverlayVisible = Boolean(currentPlaylistItem.recordingName) && Boolean(currentPlaylistItem.name);\n\n const handleNextVideoSource = useCallback(() => actions.nextVideoSource(), [actions]);\n\n return (\n <div id={videoPlayerId} className={classNames(styles.videoPlayerContainer)} ref={containerRef}>\n {showRules && <Rules />}\n\n {state.isPlaylistEmpty || !videoSourceSrc ? (\n <PlayerSkeleton />\n ) : (\n <>\n {showVideoPlayerBar && !isFullScreen ? (\n <VideoPlayerBar\n showTacticDrawingsOnly={showTacticDrawingsOnly}\n showTacticDrawings={showTacticDrawings}\n disabledTacticDrawings={disabledTacticDrawings}\n setPlayingMode={handleChangePlayingMode}\n />\n ) : null}\n <Box sx={{ display: 'flex', flex: 1, alignItems: 'center' }}>\n <Box\n ref={videoPlayerContainerRef}\n style={{\n width: `${videoAspectRatio.width}px`,\n maxHeight: '100%',\n position: 'relative',\n overflow: 'hidden',\n margin: '0 auto',\n }}\n >\n <Player\n aspectRatio={aspectRatioFromSize(DEFAULT_VIDEO_ASPECT_RATIO, ':')}\n autoplay={false}\n muted\n onVmPlaybackEnded={handleNextVideoSource}\n onVmCurrentTimeChange={handleTimeUpdate}\n playbackRate={playbackRate}\n ref={videoPlayerRef}\n onClick={handleTogglePlaying}\n >\n <Dash src={videoSourceSrc} version='3.2.2' />\n </Player>\n {isTextOverlayVisible ? (\n <TextOverlay\n prefix={currentPlaylistItem.recordingName || ''}\n description={currentPlaylistItem.name || ''}\n fullScreen={isFullScreen}\n />\n ) : null}\n {(isPageWhitelisted || areOverlaysEnabledInTimeline) &&\n showCustomOverlays &&\n playlistItem.hasHomographies &&\n !disabledTacticDrawings ? (\n <VideoOverlays\n videoPlayerContainerRef={videoPlayerContainerRef}\n disabled={!videoPlayerPlayingMode.showOverlays}\n />\n ) : null}\n </Box>\n <VideoControls onClick={handleTogglePlaying}>\n <ButtonControls>\n <ButtonControlsLeft>\n {showVideoSourceControls ? <PreviousVideoSourceButton /> : <BackwardButton />}\n <Backward5Button />\n <PlayBackButton />\n <Forward5Button />\n {showVideoSourceControls ? <NextVideoSourceButton /> : <ForwardButton />}\n </ButtonControlsLeft>\n\n {showVideoSourceTimeInFullscreen ? <ProgressBarVideoSource /> : <ProgressBar />}\n\n {showVideoSourceTimeInFullscreen ? (\n <ProgressTimeVideoSource />\n ) : (\n <ProgressTime matchSegments={matchSegments} />\n )}\n\n <ButtonControlsRight>\n <DownloadButton onDownloadSource={onDownloadSource} />\n <SpeedButton playbackRate={playbackRate} container={containerRef.current} />\n <FullscreenButton\n showFullScreen={showFullScreen}\n setShowFullScreen={setShowFullScreen}\n containerRef={containerRef}\n />\n </ButtonControlsRight>\n </ButtonControls>\n </VideoControls>\n <VideoSpinner />\n </Box>\n </>\n )}\n {isAdmin && <VideoPlayerDebug />}\n </div>\n );\n};\n\nconst VideoPlayerWithErrorBoundary = (props: JSX.IntrinsicAttributes & Props) => {\n return (\n <ErrorBoundary fallback={<PlayerSkeleton />}>\n <VideoPlayerComponent {...props} />\n </ErrorBoundary>\n );\n};\n\nexport default VideoPlayerWithErrorBoundary;\n","import { Slider, Tooltip } from '@mui/material';\nimport withStyles from '@mui/styles/withStyles';\nimport * as React from 'react';\n\nconst TrimSliderTooltip = withStyles(() => ({\n tooltip: {\n backgroundColor: '#ffad0d',\n color: 'rgba(0, 0, 0, 0.87)',\n fontSize: 11,\n position: 'absolute',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n top: -2,\n width: 32,\n left: -26,\n height: 20,\n padding: 2,\n },\n}))(Tooltip);\n\nexport const ValueLabelComponent = (props: { children: React.ReactElement; value: number }) => {\n const { children, value } = props;\n\n return (\n <TrimSliderTooltip open={true} placement={'top'} title={value}>\n {children}\n </TrimSliderTooltip>\n );\n};\n\nexport const TrimSlider = withStyles({\n root: {\n color: '#ffad0d',\n height: 40,\n padding: '0',\n top: 0,\n marginLeft: 16,\n width: 'calc(100% - 16px)',\n },\n thumb: {\n height: 38,\n width: 16,\n backgroundColor: '#ffad0d',\n border: '1px solid currentColor',\n marginTop: 0,\n borderRadius: 0,\n\n '&::before': {\n boxShadow: 'none',\n width: 2,\n height: 24,\n marginLeft: 1,\n marginRight: 1,\n backgroundColor: '#171928',\n },\n },\n active: {},\n track: {\n height: 38,\n borderTop: '4px solid #ffad0d',\n borderBottom: '4px solid #ffad0d',\n backgroundColor: '#fffbf3',\n },\n rail: {\n color: '#f5f5f7',\n opacity: 1,\n height: 40,\n },\n})(Slider);\n","import { PlayingModes, PlaylistItemType } from 'shared/components/video-player/types';\n\ninterface GeneratePlaylistItemOptions {\n playlistItem: PlaylistItemType;\n duration: number;\n startTime: number;\n endTime: number;\n}\n\nexport const generateTrimmedPlaylistItem = ({\n playlistItem,\n duration,\n startTime,\n endTime,\n}: GeneratePlaylistItemOptions) => {\n return {\n ...playlistItem,\n duration,\n videoTypes: playlistItem.videoTypes.map((videoType) => {\n if (videoType.playingMode.mode !== PlayingModes.TACTICAL_CAMERA) {\n return videoType;\n }\n\n return {\n ...videoType,\n videoSources: [{ ...videoType.videoSources[0], startTime, endTime }],\n };\n }),\n };\n};\n","import { Button, Stack } from '@mui/material';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { invalidatePlaylistQuery } from 'api/playlist/usePlaylist';\nimport { useUpdatePlaylistItem } from 'api/playlist/useUpdatePlaylistItem';\nimport { useMapVideos } from 'entities/playlist/hooks/use-map-videos/useMapVideos';\nimport IconClose from 'shared/components/icons/icon-close';\nimport IconDone from 'shared/components/icons/icon-done';\nimport IconPlay from 'shared/components/icons/icon-play';\nimport Spinner from 'shared/components/spinner';\nimport {\n useVideoPlayerActions,\n useVideoPlayerPlayingMode,\n useVideoPlayerPlaylistItem,\n useVideoPlayerState,\n} from 'shared/components/video-player';\nimport { useCurrentVideoSource } from 'shared/components/video-player/hooks';\nimport { PLAYER_STATES } from 'shared/components/video-player/state/states';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\nimport { getVideoSourceByIndex } from 'shared/components/video-player/util';\nimport VideoPlayerComponent from 'shared/components/video-player/video-player-component';\nimport { Playlist } from 'shared/types';\nimport { round } from 'shared/utils/round';\nimport { secondsAsDuration } from 'shared/utils/seconds-as-duration';\n\nimport styles from './PlaylistItemTrim.module.scss';\nimport { TrimSlider, ValueLabelComponent } from './ui/TrimSlider';\nimport { generateTrimmedPlaylistItem } from './utils/generateTrimmedPlaylistItem';\n\ninterface Props {\n onCancel: () => void;\n onConfirm: (playlistItem: PlaylistItemType) => void;\n playlistId: string;\n}\n\nconst generateState = (startTime: number, endTime: number) => {\n const correction = 10;\n const min = round(startTime) - correction;\n const max = round(endTime) + correction;\n\n const sliderMin = min > 0 ? min : 0;\n\n return {\n min: sliderMin,\n max,\n };\n};\n\nconst INITIAL_CLIP_DURATION = -1;\nconst INITIAL_VALUE = [-1, -1];\nconst INITIAL_LAST_VALUE = [-1, -1];\nconst INITIAL_SLIDER_STATE = { min: 0, max: 1 };\n\nconst PlaylistItemTrimPlayer = ({ onCancel, onConfirm, playlistId }: Props) => {\n const mapVideos = useMapVideos();\n const actions = useVideoPlayerActions();\n const playingMode = useVideoPlayerPlayingMode();\n const videoSource = useCurrentVideoSource();\n const playlistItem = useVideoPlayerPlaylistItem(playlistId);\n const [value, setValue] = useState(INITIAL_VALUE);\n const [sliderState, setSliderState] = useState(INITIAL_SLIDER_STATE);\n const [lastValue, setLastValue] = useState(INITIAL_LAST_VALUE);\n const [clipDuration, setClipDuration] = useState(INITIAL_CLIP_DURATION);\n const { state } = useVideoPlayerState();\n\n const isTrimmingReady = value[0] >= 0 && clipDuration >= 0;\n\n const handleReplacePlaylistItem = useCallback(\n (playlist: Playlist) => {\n const updatedPlaylistItem: PlaylistItemType | undefined = mapVideos(playlist).find(\n (item) => item.id === playlistItem.id,\n );\n if (updatedPlaylistItem) {\n onConfirm(updatedPlaylistItem);\n }\n onCancel();\n },\n [mapVideos, onConfirm, onCancel, playlistItem],\n );\n const { updatePlaylistItem, isLoading } = useUpdatePlaylistItem(playlistId, handleReplacePlaylistItem);\n\n useEffect(() => {\n if (sliderState === INITIAL_SLIDER_STATE) {\n setSliderState(generateState(videoSource.startTime, videoSource.endTime));\n }\n if (clipDuration === INITIAL_CLIP_DURATION) {\n setClipDuration(videoSource.endTime - videoSource.startTime);\n }\n if (value === INITIAL_VALUE) {\n setValue([videoSource.startTime, videoSource.endTime]);\n }\n if (lastValue === INITIAL_LAST_VALUE) {\n setLastValue([videoSource.startTime, videoSource.endTime]);\n }\n }, [videoSource, playingMode, playlistItem, clipDuration, value, lastValue, sliderState]);\n\n const handleConfirm = useCallback(() => {\n updatePlaylistItem(\n playlistItem.id,\n { name: playlistItem.name, timeRange: { start: value[0], end: value[1] } },\n () => {\n invalidatePlaylistQuery();\n },\n );\n }, [updatePlaylistItem, playlistItem, value]);\n\n const handleChange = useCallback(\n (event: Event, newValue: number | number[]) => {\n if (!Array.isArray(newValue)) return;\n\n const start = newValue[0] < value[1] ? newValue[0] : value[0];\n const end = newValue[1] > value[0] ? newValue[1] : value[1];\n\n setClipDuration(end - start);\n setSliderState(generateState(start, end));\n setValue([start, end]);\n },\n [value],\n );\n\n const handleChangeCommit = useCallback(() => {\n const videoSource = getVideoSourceByIndex(playlistItem, playingMode, 0);\n const hasStartTimeChanged = value[0] !== lastValue[0];\n const hasEndTimeChanged = value[1] !== lastValue[1];\n\n setLastValue(value);\n\n if (hasStartTimeChanged) {\n return actions.updatePlaylistItem(\n generateTrimmedPlaylistItem({\n playlistItem,\n duration: videoSource.endTime - value[0],\n startTime: value[0],\n endTime: videoSource.endTime,\n }),\n value[0],\n );\n }\n\n if (hasEndTimeChanged) {\n return actions.updatePlaylistItem(\n generateTrimmedPlaylistItem({\n playlistItem,\n duration: value[1] - videoSource.startTime,\n startTime: videoSource.startTime,\n endTime: value[1],\n }),\n value[1],\n );\n }\n }, [actions, lastValue, playingMode, playlistItem, value]);\n\n return (\n <Stack flexDirection='column' hidden={isTrimmingReady ? undefined : true} style={{ height: '100%' }}>\n <VideoPlayerComponent />\n {state !== PLAYER_STATES.IDLE && (\n <>\n <div className={styles.content}>\n <IconPlay size='small' color='primary' />\n <div>{playlistItem.name}</div>\n <Stack direction='row' justifyContent='flex-end' flex={1} alignItems='center' gap={1}>\n {isLoading ? (\n <Spinner />\n ) : (\n <Button\n variant='contained'\n size='small'\n color='primary'\n onClick={handleConfirm}\n sx={{ minWidth: 0, padding: 0 }}\n >\n <IconDone sx={{ color: 'common.white' }} />\n </Button>\n )}\n {!isLoading && (\n <Button variant='contained' color='secondary' onClick={onCancel} sx={{ minWidth: 0, padding: 0 }}>\n <IconClose sx={{ color: 'common.white' }} />\n </Button>\n )}\n </Stack>\n </div>\n <div className={styles.slider}>\n <TrimSlider\n min={sliderState.min}\n max={sliderState.max}\n step={1}\n value={value}\n components={{\n ValueLabel: ValueLabelComponent,\n }}\n valueLabelFormat={(seconds: number) => {\n return secondsAsDuration(seconds, false);\n }}\n onChangeCommitted={handleChangeCommit}\n onChange={handleChange}\n valueLabelDisplay='on'\n aria-labelledby='video-trim'\n />\n <div className={styles.duration}>{secondsAsDuration(clipDuration, false)}</div>\n </div>\n </>\n )}\n </Stack>\n );\n};\n\nexport default PlaylistItemTrimPlayer;\n","import { styled } from '@mui/material';\n\nimport { DialogNew } from 'shared/components/dialog-new';\n\nexport const PlaylistItemTrimDialog = styled(DialogNew)({\n '& .MuiDialog-container > .MuiPaper-root': {\n height: '100%',\n },\n});\n","import React, { useCallback } from 'react';\n\nimport { useVideoPlayerActions, VideoPlayerStateProvider } from 'shared/components/video-player';\nimport { DEFAULT_TACTICAL_CAMERA_PLAYING_MODE } from 'shared/components/video-player/defaultPlayingModes';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\n\nimport PlaylistItemTrimPlayer from './playlist-item-trim-player/PlaylistItemTrimPlayer';\nimport { PlaylistItemTrimDialog } from './PlaylistItemTrimDialog';\n\ninterface Props {\n open: boolean;\n playlistId: string;\n playlistItem: PlaylistItemType;\n setTrimmingPlaylistItem: (videoId: string) => void;\n}\n\nexport const PlaylistItemTrimModal = ({ open, playlistId, playlistItem, setTrimmingPlaylistItem }: Props) => {\n const actions = useVideoPlayerActions();\n\n const handleOnConfirm = useCallback(\n (playlistItem: PlaylistItemType) => {\n actions.updatePlaylistItem(playlistItem);\n actions.resumeStandBy();\n },\n [actions],\n );\n\n const handleCancel = useCallback(() => {\n actions.resumeStandBy();\n setTrimmingPlaylistItem('');\n }, [actions, setTrimmingPlaylistItem]);\n\n return (\n <PlaylistItemTrimDialog hiddenActions open={open} maxWidth='xl' fullWidth onClose={handleCancel}>\n <VideoPlayerStateProvider\n playerId={`${playlistId}-item-trim`}\n playlistItems={[playlistItem]}\n playingMode={DEFAULT_TACTICAL_CAMERA_PLAYING_MODE}\n >\n <PlaylistItemTrimPlayer onConfirm={handleOnConfirm} playlistId={playlistId} onCancel={handleCancel} />\n </VideoPlayerStateProvider>\n </PlaylistItemTrimDialog>\n );\n};\n","import { Stack } from '@mui/material';\nimport isEmpty from 'lodash/isEmpty';\nimport trim from 'lodash/trim';\nimport { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { invalidatePlaylistQuery } from 'api/playlist/usePlaylist';\nimport { useUpdatePlaylist } from 'api/playlist/useUpdatePlaylist';\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { useIsBulkModeActive, useSetIsBulkModeActive } from 'entities/playlist/hooks/useIsBulkModeActive';\nimport { PlaylistActions } from 'entities/playlist/ui/PlaylistActions';\nimport { PlaylistContainerGrid } from 'entities/playlist/ui/PlaylistContainerGrid';\nimport { PlaylistDetails } from 'entities/playlist/ui/PlaylistDetails';\nimport { PlaylistHeaderGrid } from 'entities/playlist/ui/PlaylistHeaderGrid';\nimport { PlaylistTimelineContainer } from 'entities/playlist/ui/PlaylistTimelineContainer';\nimport { PlaylistTimelineHeader } from 'entities/playlist/ui/PlaylistTimelineHeader';\nimport { PlaylistVideoPlayerContainer } from 'entities/playlist/ui/PlaylistVideoPlayerContainer';\nimport { DownloadPlaylistItemsModal } from 'features/playlist/download-playlist-items-modal/DownloadPlaylistItemsModal';\nimport { DownloadCurrentPlaylistItemModal } from 'features/playlist/DownloadCurrentPlaylistItemModal';\nimport { EnableBulkModeButton } from 'features/playlist/EnableBulkModeButton';\nimport { PlaylistOverlaysSelectorPanelFeature } from 'features/playlist/playlist-overlay-selector-panel/PlaylistOverlaySelectorPanel.feature';\nimport { UserPlaylistItemsList } from 'features/playlist/user-playlist-items-list/UserPlaylistItemsList';\nimport { AddMultipleClips } from 'pages/playlist-detail/components/add-multiple-clips/AddMultipleClips';\nimport { EditableText } from 'shared/components/editable-text/EditableText';\nimport { IconDownload } from 'shared/components/icons/icon-download';\nimport IconShare from 'shared/components/icons/icon-share';\nimport SharePlaylistModal from 'shared/components/share-playlist-modal';\nimport { VerticalIconButton } from 'shared/components/vertical-icon-button';\nimport { useCurrentPlaylistItem, usePlaylistItems, useVideoPlayerActions } from 'shared/components/video-player';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\nimport VideoPlayerComponent from 'shared/components/video-player/video-player-component';\nimport { useFeatureFlag, useUser } from 'shared/contexts/app-state';\nimport { Playlist } from 'shared/types';\n\nimport { PlaylistItemTrimModal } from './PlaylistItemTrim';\n\nconst findVideoById = (videos: PlaylistItemType[], id: string) => {\n return videos.find((video) => video.id === id);\n};\n\ntype Props = {\n playlist: Playlist;\n};\n\nexport const UserPlaylist = ({ playlist }: Props) => {\n const { t } = useTranslation();\n const enabledBulkMode = useIsBulkModeActive(playlist.id);\n const setEnabledBulkMode = useSetIsBulkModeActive(playlist.id);\n\n const actions = useVideoPlayerActions();\n const playingItems = usePlaylistItems();\n const playlistItem = useCurrentPlaylistItem();\n const { updatePlaylistName, isLoading: isPlaylistUpdating } = useUpdatePlaylist(playlist.id);\n const downloadPlaylistFeatureFlag = useFeatureFlag(FEATURE_FLAG.DOWNLOAD_PLAYLIST);\n const customOverlaysFeatureFlag = useFeatureFlag(FEATURE_FLAG.CUSTOM_OVERLAYS);\n\n const [trimmingPlaylistItem, setTrimmingPlaylistItem] = useState<string>('');\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [isDownloadModalOpen, setIsDownloadModalOpen] = useState(false);\n const [isCurrentItemDownloadModalOpen, setIsCurrentItemDownloadModalOpen] = useState(false);\n const user = useUser();\n\n const closeModal = useCallback(() => setIsModalOpen(false), []);\n const openModal = useCallback(() => setIsModalOpen(true), []);\n\n const onUpdateName = useCallback(\n (newText: string) => {\n if (newText === playlist.name || trim(newText).length === 0) return;\n\n updatePlaylistName({ name: newText, onSuccess: invalidatePlaylistQuery });\n },\n [playlist.name, updatePlaylistName],\n );\n\n const canEditName = user.id === playlist.user.userId;\n\n const trimmingPlaylistItemItem =\n trimmingPlaylistItem !== '' ? findVideoById(playingItems, trimmingPlaylistItem) : null;\n\n const handleTrimmingPlaylistItem = useCallback(\n (trimmingPlaylistItem: string) => {\n setTrimmingPlaylistItem(trimmingPlaylistItem);\n\n trimmingPlaylistItem ? actions.handleStandBy() : actions.resumeStandBy();\n },\n [actions],\n );\n\n const handleDownloadModalOpen = useCallback(() => setIsDownloadModalOpen(true), []);\n const handleDownloadModalClose = useCallback(() => setIsDownloadModalOpen(false), []);\n\n const handleOpenDownloadCurrentItemModal = useCallback(() => {\n actions.handleStandBy();\n setIsCurrentItemDownloadModalOpen(true);\n }, [actions]);\n\n const handleCloseDownloadCurrentItemModal = useCallback(() => {\n actions.resumeStandBy();\n setIsCurrentItemDownloadModalOpen(false);\n }, [actions]);\n\n return (\n <PlaylistContainerGrid container>\n <PlaylistHeaderGrid xs={12} item>\n <EditableText\n canEdit={canEditName}\n originalText={playlist.name}\n onSubmit={onUpdateName}\n isSubmitting={isPlaylistUpdating}\n />\n {!enabledBulkMode ? (\n <Stack direction='row' spacing={2}>\n <VerticalIconButton Icon={IconShare} onClick={openModal}>\n {t('common:actions.share')}\n </VerticalIconButton>\n\n {downloadPlaylistFeatureFlag && !isEmpty(playingItems) ? (\n <VerticalIconButton Icon={IconDownload} onClick={handleDownloadModalOpen}>\n {t('common:actions.download')}\n </VerticalIconButton>\n ) : null}\n </Stack>\n ) : null}\n </PlaylistHeaderGrid>\n <PlaylistVideoPlayerContainer display='flex' item xs={12}>\n <VideoPlayerComponent onDownloadSource={handleOpenDownloadCurrentItemModal} showVideoPlayerBar />\n {customOverlaysFeatureFlag && playlistItem.hasHomographies ? (\n <PlaylistOverlaysSelectorPanelFeature key={playlist.id} playlistId={playlist.id} />\n ) : null}\n\n {trimmingPlaylistItemItem && (\n <PlaylistItemTrimModal\n open={Boolean(trimmingPlaylistItemItem)}\n playlistId={playlist.id}\n playlistItem={trimmingPlaylistItemItem}\n setTrimmingPlaylistItem={handleTrimmingPlaylistItem}\n />\n )}\n </PlaylistVideoPlayerContainer>\n <PlaylistTimelineContainer item xs={12}>\n <PlaylistTimelineHeader>\n <PlaylistDetails playlist={playlist} />\n <PlaylistActions>\n <EnableBulkModeButton playlistId={playlist.id} />\n <AddMultipleClips playlistId={playlist.id} />\n </PlaylistActions>\n </PlaylistTimelineHeader>\n\n <UserPlaylistItemsList\n playlist={playlist}\n setTrimmingPlaylistItem={handleTrimmingPlaylistItem}\n trimmingPlaylistItemId={trimmingPlaylistItem}\n enabledBulkMode={enabledBulkMode}\n setEnabledBulkMode={setEnabledBulkMode}\n />\n </PlaylistTimelineContainer>\n\n {isModalOpen && <SharePlaylistModal onCloseModal={closeModal} playlist={playlist} />}\n {isDownloadModalOpen ? (\n <DownloadPlaylistItemsModal onClose={handleDownloadModalClose} playlistId={playlist.id} />\n ) : null}\n <DownloadCurrentPlaylistItemModal\n playlistId={playlist.id}\n isOpen={isCurrentItemDownloadModalOpen}\n onClose={handleCloseDownloadCurrentItemModal}\n />\n </PlaylistContainerGrid>\n );\n};\n","import { useMemo } from 'react';\n\nimport { useMapVideos } from 'entities/playlist/hooks/use-map-videos/useMapVideos';\nimport { VideoPlayerStateProvider } from 'shared/components/video-player';\nimport { PLAYLIST_WITH_OVERLAYS_PLAYING_MODE } from 'shared/components/video-player/defaultPlayingModes';\nimport { Playlist } from 'shared/types';\n\nimport { UserPlaylist } from './ui/UserPlaylist';\n\ntype Props = {\n playlist: Playlist;\n};\n\nexport const UserPlaylistWidget = ({ playlist }: Props) => {\n const mapVideos = useMapVideos();\n const playlistItems = useMemo(() => (playlist ? mapVideos(playlist) : []), [mapVideos, playlist]);\n\n return (\n <VideoPlayerStateProvider\n playerId={`playlist-${playlist.id}`}\n playlistItems={playlistItems}\n playingMode={PLAYLIST_WITH_OVERLAYS_PLAYING_MODE}\n >\n <UserPlaylist playlist={playlist} />\n </VideoPlayerStateProvider>\n );\n};\n","import { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { RouteComponentProps } from 'react-router-dom';\n\nimport Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { SwitchEnvironment } from 'shared/components/switch-environment';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\nimport usePageStateMachine from 'shared/hooks/use-page-state-machine';\nimport { Playlist } from 'shared/types';\n\nimport PlaylistDetailSkeleton from './components/playlists-detail-skeleton/PlaylistDetailSkeleton';\nimport { usePlaylistPage } from './hooks/usePlaylistPage';\nimport { UserPlaylistWidget } from '../../widgets/playlist/user-playlist/UserPlaylist.widget';\n\ntype RouteParams = { id: string; playlistId: string };\n\ntype PlaylistDetailPageProps = {\n playlistId: string;\n};\n\nconst PlaylistDetailContainer = ({ playlistId }: PlaylistDetailPageProps) => {\n const branding = useBranding();\n const { t } = useTranslation();\n const { isPageLoading, isPageReady, isInvalidClient, data } = usePageStateMachine<Playlist>(() =>\n usePlaylistPage({ playlistId }),\n );\n\n useEffect(() => {\n document.title = t('common:metas.title.playlist', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n if (isInvalidClient && data?.clientId) {\n return <SwitchEnvironment resourceClientsIds={[data.clientId]} />;\n }\n\n return (\n <SidebarLayout>\n <Container fullScreen>\n {isPageLoading && <PlaylistDetailSkeleton />}\n\n {isPageReady && data && <UserPlaylistWidget playlist={data} />}\n </Container>\n </SidebarLayout>\n );\n};\n\nconst PlaylistDetail = (props: RouteComponentProps<RouteParams>) => {\n const {\n match: {\n params: { playlistId },\n },\n } = props;\n\n return <PlaylistDetailContainer key={playlistId} playlistId={playlistId} />;\n};\n\nexport default PlaylistDetail;\n","import classNames from 'classnames';\n\nimport styles from './EmptyCell.module.scss';\n\ninterface Props {\n isLoading: boolean;\n}\nconst EmptyCell = ({ isLoading }: Props) => {\n return <div className={classNames(styles.emptyCell, { [styles.isLoading]: isLoading })} />;\n};\n\nexport default EmptyCell;\n","import { Grid, GridSize } from '@mui/material';\nimport React from 'react';\n\nimport EmptyCell from './empty-cell';\n\ninterface Props {\n cells: number;\n size?: GridSize;\n isLoading?: boolean;\n}\n\nconst EmptyCellGrid = ({ isLoading = false, cells, size = 3 }: Props) => {\n return (\n <Grid container spacing={4}>\n {Array(cells)\n .fill('')\n .map((_, idx) => (\n <Grid key={idx} item xs={size}>\n <EmptyCell isLoading={isLoading} />\n </Grid>\n ))}\n </Grid>\n );\n};\n\nexport default EmptyCellGrid;\n","import { Trans } from 'react-i18next';\n\nimport EmptyCellGrid from 'pages/recording-playlists/components/empty-cell-grid';\nimport NotFoundImg from 'shared/assets/cameras.svg';\n\nimport styles from './NotFound.module.scss';\n\ntype NotFoundProps = {\n header: string;\n description?: string;\n showGridBackground?: boolean;\n showContactLink?: boolean;\n};\n\nconst NotFound = ({\n header,\n description,\n showGridBackground = false,\n showContactLink = false,\n}: NotFoundProps): JSX.Element => {\n const contentStyle = showGridBackground ? styles.contentWithBackground : styles.content;\n\n return (\n <div className={styles.container}>\n {showGridBackground && <EmptyCellGrid cells={12} />}\n <div className={contentStyle}>\n <div>\n <img src={NotFoundImg} alt='' />\n <h5 className={styles.title}>{header}</h5>\n {description && <p className='text-medium'>{description}</p>}\n {showContactLink && (\n <Trans\n i18nKey='common:try-again-contact'\n components={{ mailto: <a href='mailto:support@kogniasports.com' /> }}\n />\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default NotFound;\n","import NotFound from 'shared/components/not-found';\n\nimport styles from './EmptyPage.module.scss';\n\ninterface Props {\n header: string;\n description?: string;\n}\n\nconst EmptyPage = ({ header, description }: Props) => {\n return (\n <div className={styles.content}>\n <main>\n <NotFound header={header} description={description} />\n </main>\n </div>\n );\n};\n\nexport default EmptyPage;\n","import { useMemo } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { noop } from 'lodash';\nimport { useTranslation } from 'react-i18next';\n\nimport { queryClient } from 'api/config';\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { duplicatePlaylistUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\n\nimport { generateFetchPlaylistsQueryRef } from '../useCreatePlaylist';\n\ntype PlaylistDuplicate = {\n name: string;\n onSuccess?: () => void;\n onSettled?: () => void;\n};\n\ninterface Parameters {\n playlistId: string;\n successMessage?: string;\n}\n\nexport const useDuplicatePlaylist = ({ playlistId, successMessage }: Parameters) => {\n const { t } = useTranslation();\n\n const fetchQueryRef = generateFetchPlaylistsQueryRef(playlistId);\n\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n type: HTTPMethod.POST,\n errorMessage: t('api:use-duplicate-playlist.error'),\n successMessage: successMessage ? successMessage : t('api:use-duplicate-playlist.success'),\n onSuccess: async () => {\n if (fetchQueryRef) await queryClient.invalidateQueries(fetchQueryRef);\n },\n });\n\n const duplicatePlaylist = ({ name, onSuccess = noop, onSettled = noop }: PlaylistDuplicate) => {\n mutate({ url: duplicatePlaylistUrl(playlistId), data: { name } }, { onSuccess, onSettled });\n };\n\n return { duplicatePlaylist, isLoading, isError, isSuccess };\n};\n","import { Box } from '@mui/material';\nimport React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const DialogButtonContainer = ({ children }: Props) => {\n return <Box sx={{ marginLeft: 1, marginRight: 1, paddingTop: 1, paddingBottom: 1 }}>{children}</Box>;\n};\n","import { Button } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router-dom';\n\nimport { useDuplicatePlaylist } from 'api/playlist/useDuplicatePlaylist';\nimport { usePlaylists } from 'api/playlist/useFetchPlaylists';\nimport { routes } from 'kognia/router/routes';\nimport { Dialog } from 'shared/components/dialog';\nimport { DialogActions } from 'shared/components/dialog/dialog-actions';\nimport { DialogButtonContainer } from 'shared/components/dialog/dialog-button-container';\nimport { DialogContent } from 'shared/components/dialog/dialog-content';\nimport { DialogContentText, DialogTextVariants } from 'shared/components/dialog/dialog-content-text';\nimport { DialogHeader } from 'shared/components/dialog/dialog-header';\nimport IconShare from 'shared/components/icons/icon-share';\n\ninterface Props {\n onClose: () => void;\n playlistId: string;\n playlistUserName: string;\n playlistName: string;\n}\n\nexport const CopyPlaylistModal = ({ onClose, playlistId, playlistUserName, playlistName }: Props) => {\n const { t } = useTranslation();\n const history = useHistory();\n const { invalidateQuery } = usePlaylists({});\n const { duplicatePlaylist } = useDuplicatePlaylist({\n playlistId,\n successMessage: t('playlists:copy-playlist.success-message', { playlistName }),\n });\n\n const handleSubmit = useCallback(() => {\n duplicatePlaylist({\n name: playlistName,\n onSuccess: invalidateQuery,\n onSettled: () => {\n onClose();\n history.replace(routes.PLAYLISTS);\n },\n });\n }, [duplicatePlaylist, history, invalidateQuery, onClose, playlistName]);\n\n const handleCancel = useCallback(() => {\n onClose();\n history.replace(routes.PLAYLISTS);\n }, [history, onClose]);\n\n return (\n <Dialog open={true} maxWidth='sm' fullWidth>\n <DialogHeader icon={<IconShare size='small' />}>{t('playlists:copy-playlist.modal-title')}</DialogHeader>\n <DialogContent>\n <DialogContentText textVariant={DialogTextVariants.Primary}>\n {t('playlists:copy-playlist.modal-text-first', { playlistName, playlistUserName: playlistUserName })}\n </DialogContentText>\n <DialogContentText>{t('playlists:copy-playlist.modal-text-second')}</DialogContentText>\n <DialogContentText textVariant={DialogTextVariants.Primary}>\n {t('playlists:copy-playlist.modal-text-third')}\n </DialogContentText>\n </DialogContent>\n <DialogActions>\n <DialogButtonContainer>\n <Button variant='outlined' color='secondary' onClick={handleCancel}>\n {t('common:actions.cancel')}\n </Button>\n </DialogButtonContainer>\n <DialogButtonContainer>\n <Button variant='contained' onClick={handleSubmit}>\n {t('common:actions.add')}\n </Button>\n </DialogButtonContainer>\n </DialogActions>\n </Dialog>\n );\n};\n","import React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { usePlaylist } from 'api/playlist/usePlaylist';\nimport { useClientId } from 'shared/contexts/app-state';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\nimport { Playlist } from 'shared/types';\n\nimport { CopyPlaylistModal } from '../copy-playlist-modal';\n\ninterface Props {\n playlistId: string;\n}\n\nexport const CopyPlaylist = ({ playlistId }: Props) => {\n const { t } = useTranslation();\n const [isCopyPlaylistModalOpen, setIsCopyPlaylistModalOpen] = useState(true);\n const userClient = useClientId();\n const triggerNotification = useNotifications();\n const handleFetchPlaylistSuccess = useCallback(\n (data: Playlist) => {\n const notAllowed = data.clientId !== userClient.clientId;\n\n if (notAllowed) {\n triggerNotification({\n type: NotificationType.ERROR,\n message: t('playlists:copy-playlist.not-allowed'),\n });\n }\n },\n [t, triggerNotification, userClient.clientId],\n );\n\n const { data: playlist } = usePlaylist({\n playlistId: playlistId,\n onSuccess: handleFetchPlaylistSuccess,\n });\n\n const handleCopyPlaylistModalClose = useCallback(() => setIsCopyPlaylistModalOpen(false), []);\n\n const shouldShowCopyPlaylistModal = playlist && isCopyPlaylistModalOpen && userClient.clientId === playlist.clientId;\n\n if (!shouldShowCopyPlaylistModal) return null;\n\n return (\n <CopyPlaylistModal\n onClose={handleCopyPlaylistModalClose}\n playlistId={playlist.id}\n playlistUserName={`${playlist.user.firstName} ${playlist.user.lastName}`}\n playlistName={playlist.name}\n />\n );\n};\n","import { Grid } from '@mui/material';\nimport classNames from 'classnames';\nimport React from 'react';\n\nimport styles from './List.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n className?: string;\n disablePadding?: boolean;\n}\n\nexport const List = ({ children, className = '', disablePadding = false }: Props) => {\n return (\n <Grid item sx={{ ...(disablePadding && { paddingTop: '0 !important' }) }}>\n <ul className={classNames(styles.list, className)}>{children}</ul>\n </Grid>\n );\n};\n","import { Grid } from '@mui/material';\n\ninterface Props {\n children: React.ReactNode;\n className?: string;\n}\n\nexport const ListContainer = ({ children, className = '' }: Props) => {\n return (\n <Grid className={className} container spacing={1} direction={'column'} wrap={'nowrap'}>\n {children}\n </Grid>\n );\n};\n","import { Grid } from '@mui/material';\nimport classNames from 'classnames';\n\nimport styles from './ListHeader.module.scss';\n\ninterface Props {\n children?: React.ReactNode;\n className?: string;\n}\n\nexport const ListHeader = ({ children, className = '' }: Props) => {\n return (\n <Grid item>\n <div className={classNames(styles.header, className)}>{children}</div>\n </Grid>\n );\n};\n","import { Stack, styled, Typography } from '@mui/material';\nimport { fontSizes, fontWeight } from 'kognia-ui';\nimport React from 'react';\n\nimport IconOrder from '../../icons/icon-order';\n\ninterface Props {\n title: string;\n showOrder?: boolean;\n order?: 'asc' | 'desc';\n onClick?: () => void;\n}\n\nexport const ListHeaderOptionTitle = styled(Typography)(() => ({\n fontSize: fontSizes.default,\n lineHeight: 3,\n fontWeight: fontWeight[500],\n}));\n\nexport const ListHeaderOption = ({ title, showOrder, order, onClick }: Props) => {\n return (\n <Stack direction={'row'} alignItems={'center'} onClick={onClick} sx={{ cursor: onClick ? 'pointer' : 'default' }}>\n <ListHeaderOptionTitle>{title}</ListHeaderOptionTitle>\n {showOrder ? <IconOrder size='small' order={order} /> : null}\n </Stack>\n );\n};\n","import { Grid } from '@mui/material';\n\nimport styles from './ListTitle.module.scss';\n\ninterface Props {\n children?: React.ReactNode;\n className?: string;\n dataTestId?: string;\n}\n\nexport const ListTitle = ({ children, className = '', dataTestId }: Props) => {\n return (\n <Grid item className={className}>\n <h1 className={styles.title} data-testid={dataTestId}>\n {children}\n </h1>\n </Grid>\n );\n};\n","import { Grid } from '@mui/material';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const ListTitleActions = ({ children }: Props) => {\n return (\n <Grid item container justifyContent={'flex-end'} alignItems={'center'} sx={{ marginBottom: 2 }}>\n {children}\n </Grid>\n );\n};\n","import { Grid } from '@mui/material';\nimport { ReactNode } from 'react';\n\ninterface Props {\n children: ReactNode;\n}\n\nexport const ListTitleContainer = ({ children }: Props) => {\n return (\n <Grid item container justifyContent={'space-between'} alignItems={'center'} gap={2}>\n {children}\n </Grid>\n );\n};\n","import { Button, styled } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nexport const PaginationLoadingButton = styled(Button)(({ theme }) => ({\n '&.MuiButton-root': {\n backgroundColor: Colors.night,\n minWidth: 142,\n textTransform: 'uppercase',\n fontSize: fontSizes.xSmall,\n letterSpacing: '1.6px',\n color: Colors.white,\n },\n '&.Mui-disabled': {\n backgroundColor: theme.palette.action.disabledBackground,\n },\n '&.Mui-disabled.MuiLoadingButton-loading': {\n color: 'transparent',\n },\n}));\n","import { Stack } from '@mui/material';\nimport classnames from 'classnames';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport styles from './Pagination.module.scss';\nimport { PaginationLoadingButton } from './Pagination.styled';\n\nexport interface PaginationProps {\n total: number;\n displayed: number;\n resultsPerPage?: number;\n onShowMore: () => void;\n loading?: boolean;\n getStatsText: (displayed: number, total: number) => string;\n}\n\nexport const ELEMENTS_PER_PAGE = 8;\n\nconst Pagination = ({\n total,\n displayed,\n onShowMore,\n getStatsText,\n loading = false,\n resultsPerPage = ELEMENTS_PER_PAGE,\n}: PaginationProps) => {\n const { t } = useTranslation();\n const disabled = total <= resultsPerPage || displayed === total || !displayed;\n const percentageLoaded = Math.floor((displayed / total) * 100);\n const className = classnames(styles.pagination, {\n [styles.paginationLoading]: loading,\n [styles.paginationDisabled]: loading || disabled,\n });\n const loadingBarClassed = classnames([styles.pagination__progressFilled], {\n [styles.pagination__progressFilledLoading]: loading,\n [styles.pagination__progressFilledDisabled]: disabled,\n });\n if (!total) {\n return null;\n }\n return (\n <div className={className}>\n <p className={styles.pagination__stats}>{getStatsText(displayed, total)}</p>\n <div className={styles.pagination__progress} aria-hidden='true'>\n <div className={loadingBarClassed} style={{ width: `${percentageLoaded}%` }} />\n </div>\n <Stack\n justifyContent='center'\n direction='row'\n mt={2}\n sx={{ borderBottom: (theme) => `1px solid ${theme.palette.divider}` }}\n >\n <PaginationLoadingButton\n variant='contained'\n disabled={disabled || loading}\n onClick={onShowMore}\n size='large'\n data-testid='pagination-button'\n >\n {loading ? t('common:pagination.loading') : t('common:pagination.show-more')}\n </PaginationLoadingButton>\n </Stack>\n </div>\n );\n};\n\nexport default Pagination;\n","import { Button, Grid } from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useCreatePlaylist } from 'api/playlist/useCreatePlaylist';\nimport { usePlaylists } from 'api/playlist/useFetchPlaylists';\nimport { Dialog } from 'shared/components/dialog';\nimport { DialogActions } from 'shared/components/dialog/dialog-actions';\nimport { DialogContent } from 'shared/components/dialog/dialog-content';\nimport { DialogHeader } from 'shared/components/dialog/dialog-header';\nimport IconAddFolder from 'shared/components/icons/icon-add-folder';\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport Input from 'shared/components/input';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\n\ninterface Props {\n className?: string;\n}\n\nexport const CreatePlaylist = ({ className = '' }: Props) => {\n const { t } = useTranslation();\n const [isCreatePlaylistOpen, setIsCreatePlaylistOpen] = useState(false);\n const { invalidateQuery } = usePlaylists({});\n const { createPlaylist } = useCreatePlaylist();\n const triggerNotification = useNotifications();\n const [playlistNameValue, setPlaylistNameValue] = useState('');\n\n const id = isCreatePlaylistOpen ? 'create-playlist-dialog' : undefined;\n\n const handleAddClipsClick = useCallback(() => {\n setIsCreatePlaylistOpen((isCreatePlaylistOpen) => !isCreatePlaylistOpen);\n }, [setIsCreatePlaylistOpen]);\n\n const handleSubmit = useCallback(\n (event: React.FormEvent) => {\n event.preventDefault();\n if (!playlistNameValue.trim()) {\n return triggerNotification({\n type: NotificationType.ERROR,\n message: t('playlists:forms.add-a-name-for-the-playlist'),\n });\n }\n\n createPlaylist({\n data: { name: playlistNameValue as string },\n onSuccess: () => invalidateQuery && invalidateQuery(),\n });\n setPlaylistNameValue('');\n setIsCreatePlaylistOpen(false);\n },\n [createPlaylist, playlistNameValue, triggerNotification, t, setPlaylistNameValue, invalidateQuery],\n );\n\n const handleClose = useCallback((event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setIsCreatePlaylistOpen(false);\n }, []);\n\n const handleInputChange = useCallback((event: React.FormEvent<HTMLInputElement>) => {\n setPlaylistNameValue(event.currentTarget.value);\n }, []);\n\n return (\n <Grid item className={className}>\n <Button\n variant='contained'\n aria-describedby={id}\n onClick={handleAddClipsClick}\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n data-testid='playlists-page-create-playlist-button'\n >\n {t('playlists:forms.create-playlist')}\n </Button>\n <Dialog id={id} keepMounted={false} onClose={handleClose} open={isCreatePlaylistOpen} maxWidth='xs' fullWidth>\n <DialogHeader icon={<IconAddFolder size='small' />}>{t('playlists:forms.new-playlist')}</DialogHeader>\n <DialogContent>\n <Grid container spacing={2} direction={'column'}>\n <Grid item xs={12} container alignItems={'center'}>\n <Input\n autoFocus\n fullWidth\n id='playlist-name'\n label={t('playlists:forms.playlist-name')}\n onChange={handleInputChange}\n value={playlistNameValue}\n />\n </Grid>\n </Grid>\n </DialogContent>\n <DialogActions>\n <Button variant='contained' onClick={handleSubmit} data-testid='create-playlist-modal-button'>\n {t('playlists:forms.create-playlist')}\n </Button>\n </DialogActions>\n </Dialog>\n </Grid>\n );\n};\n","import { Box, Button, GlobalStyles, Stack, Typography } from '@mui/material';\nimport de from 'date-fns/locale/de';\nimport en from 'date-fns/locale/en-US';\nimport es from 'date-fns/locale/es';\nimport { Colors, defaultFontFamily, fontSizes, fontWeight, themeZIndexes } from 'kognia-ui';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport DatePicker, { registerLocale } from 'react-datepicker';\nimport { useTranslation } from 'react-i18next';\n\nimport { useUser } from 'shared/contexts/app-state';\nimport { useDates } from 'shared/hooks/use-dates';\nimport { guid } from 'shared/utils/guid';\n\nregisterLocale('es-ES', es);\nregisterLocale('en-US', en);\nregisterLocale('de-DE', de);\n\ninterface Props {\n from: string | null;\n to: string | null;\n isOpen: boolean;\n onClick: () => void;\n hasSelectedOptions: boolean;\n onClose: (start: Date | null, end: Date | null) => void;\n}\n\nexport const DateRange = ({ isOpen, onClick, onClose, hasSelectedOptions, from = null, to = null }: Props) => {\n const { t } = useTranslation();\n const [dateRangeKey, setDateRangeKey] = useState<string>(guid());\n const { locale } = useUser();\n const { parseBackendDateString, dateToString } = useDates();\n const [startDate, setStartDate] = useState<Date | null>(null);\n const [endDate, setEndDate] = useState<Date | null>(null);\n\n useEffect(() => {\n setStartDate(from ? parseBackendDateString(from) : null);\n setEndDate(to ? parseBackendDateString(to) : null);\n }, [from, parseBackendDateString, to]);\n\n const onChange = useCallback((dates: [Date, Date]) => {\n const [start, end] = dates;\n setStartDate(start);\n setEndDate(end);\n }, []);\n\n const handleOnClose = useCallback(() => {\n if (startDate && endDate) {\n onClose(startDate, endDate);\n }\n }, [startDate, endDate, onClose]);\n\n const handleClear = useCallback(() => {\n setDateRangeKey(guid());\n setStartDate(null);\n setEndDate(null);\n onClose(null, null);\n }, [onClose]);\n\n return (\n <div key={dateRangeKey}>\n <DatePicker\n selected={startDate}\n onChange={onChange}\n disabledKeyboardNavigation\n startDate={startDate}\n endDate={endDate}\n locale={locale}\n onCalendarOpen={onClick}\n isClearable={false}\n monthsShown={2}\n onCalendarClose={handleOnClose}\n selectsRange\n enableTabLoop={false}\n customInput={\n <Button\n aria-controls='date-range'\n variant='underlined'\n color={isOpen || hasSelectedOptions ? 'primary' : 'inherit'}\n >\n {t(`filters:date`)}\n </Button>\n }\n >\n {startDate && endDate ? (\n <Stack\n direction={'row'}\n justifyContent={'space-between'}\n alignItems={'center'}\n padding={2}\n sx={{ clear: 'both', borderTop: `1px solid ${Colors.iron}` }}\n >\n <Box>\n <Typography variant={'body2'} component={'span'} sx={{ paddingRight: 2 }}>\n <strong>{t('filters:from')}</strong> {dateToString(startDate)}\n </Typography>\n <Typography variant={'body2'} component={'span'}>\n <strong>{t('filters:to')}</strong> {dateToString(endDate)}\n </Typography>\n </Box>\n <Box>\n <Button variant='outlined' color='secondary' onClick={handleClear}>\n {t('common:actions.reset')}\n </Button>\n </Box>\n </Stack>\n ) : null}\n </DatePicker>\n <GlobalStyles\n styles={{\n 'div.react-datepicker__current-month, div.react-datepicker-time__header, .react-datepicker-year-header': {\n color: Colors.shark,\n fontSize: fontSizes.medium,\n fontWeight: fontWeight['500'],\n },\n 'div.react-datepicker-wrapper': {\n width: 'auto',\n },\n 'div.react-datepicker-popper': {\n zIndex: themeZIndexes.tooltip,\n },\n 'div.react-datepicker': {\n color: Colors.storm,\n fontFamily: defaultFontFamily,\n },\n 'div.react-datepicker__header': {\n background: Colors.melrose,\n borderColor: Colors.iron,\n },\n 'button.react-datepicker__navigation': {\n top: '16px',\n },\n 'div.react-datepicker__day--in-selecting-range:not(.react-datepicker__day--in-range, .react-datepicker__month-text--in-range, .react-datepicker__quarter-text--in-range, .react-datepicker__year-text--in-range)':\n {\n background: Colors.lavender,\n color: Colors.melrose,\n '&:hover': {\n background: Colors.primary,\n color: Colors.melrose,\n },\n },\n '.react-datepicker__day-name, .react-datepicker__time-name': {\n color: Colors.shark,\n },\n 'div.react-datepicker__day': {\n color: Colors.storm,\n },\n 'div.react-datepicker__day--in-range': {\n color: Colors.white,\n background: Colors.lavender,\n '&:hover': {\n background: Colors.primary,\n },\n },\n 'div.react-datepicker__day--selected': {\n background: Colors.lavender,\n color: Colors.melrose,\n\n '&:hover': {\n background: Colors.brandPastel,\n color: Colors.melrose,\n },\n },\n 'span.react-datepicker__navigation-icon:hover::before': {\n borderColor: Colors.brandPastel,\n },\n\n 'span.react-datepicker__navigation-icon::before': {\n borderColor: Colors.lavender,\n },\n }}\n />\n </div>\n );\n};\n","import { styled, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nexport const FilterLabel = styled(Typography)(({ theme }) => ({\n fontSize: fontSizes.small,\n lineHeight: 2.5,\n marginRight: theme.spacing(2),\n}));\n","import { Button, PopoverActions } from '@mui/material';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Fade from '@mui/material/Fade';\nimport Menu from '@mui/material/Menu';\nimport React, { useRef, useState } from 'react';\n\nimport styles from './Filterv2.module.scss';\n\ntype FilterProps = {\n children: JSX.Element;\n displayName: string;\n hasSelectedOptions?: boolean;\n isOpen: boolean;\n onClickOpen: () => void;\n onClose: () => void;\n};\n\nexport type FilterOption = {\n id: string;\n title: string;\n isSelected: boolean;\n};\n\nconst Filter = ({ isOpen, onClickOpen, displayName, onClose, hasSelectedOptions = false, children }: FilterProps) => {\n const actionRef = useRef<PopoverActions | null>(null);\n const [anchorEl, setAnchorEl] = useState<HTMLElement>();\n const filterId = 'filter-menu';\n\n const updateMenuPosition = () => {\n actionRef.current?.updatePosition();\n };\n\n const handleButtonClick = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n onClickOpen();\n };\n\n const handleClose = () => {\n if (!anchorEl) return;\n\n setAnchorEl(undefined);\n onClose();\n };\n\n return (\n <>\n <Button\n aria-controls={filterId}\n color={isOpen || hasSelectedOptions ? 'primary' : 'inherit'}\n onClick={handleButtonClick}\n variant='underlined'\n >\n {displayName}\n </Button>\n {isOpen && anchorEl && (\n <ClickAwayListener onClickAway={handleClose}>\n <Menu\n action={actionRef}\n id={filterId}\n anchorEl={anchorEl}\n open\n onClose={handleClose}\n TransitionComponent={Fade}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n transformOrigin={{ vertical: 'top', horizontal: 'center' }}\n className={styles.menu}\n >\n <div className={styles.contentContainer}>{React.cloneElement(children, { updateMenuPosition })}</div>\n </Menu>\n </ClickAwayListener>\n )}\n </>\n );\n};\n\nexport default Filter;\n","import { Box, FormControlLabel as MuiFormControlLabel, styled } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nexport const CheckboxMenuWrapper = styled(Box)({\n maxHeight: '400px',\n overflow: 'auto',\n});\n\nexport const FormControlLabel = styled(MuiFormControlLabel)(({ theme }) => ({\n display: 'flex',\n flexWrap: 'wrap',\n columnGap: theme.spacing(1),\n margin: 0,\n padding: theme.spacing(1, 0),\n overflow: 'hidden',\n '& .MuiFormControlLabel-label': {\n fontSize: fontSizes.default,\n color: theme.palette.text.primary,\n },\n '&:hover': {\n '& .MuiCheckbox-root': {\n color: theme.palette.primary.main,\n boxShadow: 'none',\n },\n },\n}));\n","import { Button, Stack } from '@mui/material';\nimport { useTranslation } from 'react-i18next';\n\nexport interface FilterDropdownControlsProps {\n isResetDisabled?: boolean;\n onClickReset?: () => void;\n onClickApply: () => void;\n showApplyButton?: boolean;\n showResetButton?: boolean;\n}\n\nconst FilterControls = (props: FilterDropdownControlsProps) => {\n const { t } = useTranslation();\n const { isResetDisabled = false, onClickReset, onClickApply, showApplyButton = true, showResetButton = true } = props;\n\n const handleResetClick = () => {\n onClickReset && onClickReset();\n };\n\n return (\n <Stack direction='row' justifyContent={showApplyButton && showResetButton ? 'space-between' : 'flex-end'}>\n {showResetButton && (\n <Button color='secondary' disabled={isResetDisabled} onClick={handleResetClick}>\n {t('common:actions.reset-filter')}\n </Button>\n )}\n {showApplyButton && <Button onClick={onClickApply}>{t('common:actions.apply')}</Button>}\n </Stack>\n );\n};\n\nexport default FilterControls;\n","import { Checkbox } from '@mui/material';\nimport some from 'lodash/some';\nimport { useEffect, useState } from 'react';\n\nimport { FilterOption } from 'shared/components/filter-v2';\n\nimport { FormControlLabel, CheckboxMenuWrapper } from './CheckboxMenu.styled';\nimport FilterControls from '../../filter-v2/filter-controls';\n\ntype CheckBoxMenuProps = {\n initialOptions: FilterOption[];\n submitOptions: (options: FilterOption[], autoSubmit: boolean) => void;\n autoSubmit?: boolean;\n};\n\nconst CheckBoxMenu = ({ initialOptions, submitOptions, autoSubmit = false }: CheckBoxMenuProps) => {\n const [menuOptions, setMenuOptions] = useState<FilterOption[]>(initialOptions);\n\n useEffect(() => {\n setMenuOptions(initialOptions);\n }, [initialOptions]);\n\n const onSelectOption = (id: string) => {\n const updatedOptions = menuOptions.map((option) => {\n return option.id === id ? { ...option, ...{ isSelected: !option.isSelected } } : option;\n }) as FilterOption[];\n autoSubmit ? submitOptions(updatedOptions, autoSubmit) : setMenuOptions(updatedOptions);\n };\n\n const resetOptions = () => {\n const updatedOptions = menuOptions.map((option) => ({ ...option, ...{ isSelected: false } })) as FilterOption[];\n autoSubmit ? submitOptions(updatedOptions, autoSubmit) : setMenuOptions(updatedOptions);\n };\n\n const handleSubmit = () => {\n submitOptions(menuOptions, autoSubmit);\n };\n\n const isResetDisabled = !some(menuOptions, ['isSelected', true]);\n\n return (\n <>\n <CheckboxMenuWrapper>\n {menuOptions.map((option: FilterOption) => (\n <div key={option.id}>\n <FormControlLabel\n label={option.title}\n control={\n <Checkbox\n id={option.id}\n key={option.id}\n checked={option.isSelected}\n onClick={() => onSelectOption(option.id)}\n />\n }\n />\n </div>\n ))}\n </CheckboxMenuWrapper>\n <FilterControls\n isResetDisabled={isResetDisabled}\n onClickReset={resetOptions}\n onClickApply={handleSubmit}\n showApplyButton={!autoSubmit}\n />\n </>\n );\n};\n\nexport default CheckBoxMenu;\n","import { styled } from '@mui/material';\n\nimport { SearchPlaylistAutocomplete } from 'shared/components/search-playlist-autocomplete';\n\nexport const SearchPlaylistAutocompleteInput = styled(SearchPlaylistAutocomplete)(({ theme }) => ({\n minWidth: theme.spacing(30),\n margin: 0,\n position: 'relative',\n padding: 0,\n top: '2px',\n '& .MuiOutlinedInput-root.MuiInputBase-sizeSmall': {\n padding: 0,\n },\n '& .MuiAutocomplete-inputRoot': {\n background: theme.palette.common.white,\n paddingTop: theme.spacing(0.25),\n paddingBottom: theme.spacing(0.25),\n '& input': {\n padding: `${theme.spacing(0.5)} 0 5px ${theme.spacing()} !important`,\n },\n },\n}));\n","import { AutocompleteChangeReason } from '@mui/base';\nimport { Grid } from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { generatePath, useHistory } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport { UpdateAutocompleteValue } from 'shared/components/autocomplete';\nimport { Playlist } from 'shared/types';\n\nimport { SearchPlaylistAutocompleteInput } from './index.styled';\n\ninterface Props {\n onUpdate: (name: string) => void;\n}\n\nexport const SearchPlaylist = ({ onUpdate }: Props) => {\n const history = useHistory();\n const [isOpen, setIsOpen] = useState(false);\n const handleOnFocus = useCallback(() => {\n setIsOpen(true);\n }, []);\n\n const handleOnUpdate = useCallback(\n (playlist: Playlist | null, name: string, reason: AutocompleteChangeReason) => {\n if (['clear', 'blur'].includes(reason)) {\n onUpdate && onUpdate(name);\n }\n },\n [onUpdate],\n );\n\n const handleBlur = useCallback(\n (name?: string) => {\n onUpdate(name ? name : '');\n setIsOpen(false);\n },\n [onUpdate],\n );\n\n const handleOnKeyUp = useCallback(() => {\n setIsOpen(true);\n }, []);\n\n const handleSearchTermChange = useCallback(\n (name: string) => {\n onUpdate && onUpdate(name && name.length >= 3 ? name : '');\n },\n [onUpdate],\n );\n\n const handleOnClick: UpdateAutocompleteValue<Playlist> = useCallback(\n (value) => {\n history.push(generatePath(routes.RECORDING_PLAYLIST_DETAIL, { playlistId: value.id }));\n },\n [history],\n );\n\n return (\n <Grid item alignSelf={'flex-end'}>\n <SearchPlaylistAutocompleteInput\n playlistId={routes.PLAYLISTS}\n onBlur={handleBlur}\n onClickElement={handleOnClick}\n onFocus={handleOnFocus}\n onKeyDown={handleOnKeyUp}\n onSearchTermChange={handleSearchTermChange}\n onSubmit={handleBlur}\n onUpdateValue={handleOnUpdate}\n open={isOpen}\n showResultsInPopOver\n title={'Playlists'}\n />\n </Grid>\n );\n};\n","import { Stack } from '@mui/material';\nimport isEmpty from 'lodash/isEmpty';\nimport map from 'lodash/map';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { PlaylistsFilterActions } from 'api/playlist/useFetchPlaylists';\nimport { PlaylistsFilters } from 'api/playlist/useFetchPlaylists/types';\nimport { DateRange } from 'shared/components/date-range';\nimport { FilterLabel } from 'shared/components/filter-label';\nimport Filter, { FilterOption } from 'shared/components/filter-v2';\nimport CheckBoxMenu from 'shared/components/filter-v2-menu/checkbox';\nimport IconStrawberry from 'shared/components/icons/icon-strawberry';\nimport { FiltersList } from 'shared/types';\n\nimport { SearchPlaylist } from './search-playlist';\n\ntype FilterDropdownsProps = {\n filtersList: FiltersList;\n filterActions: PlaylistsFilterActions;\n appliedFilters: PlaylistsFilters;\n};\n\nenum DropDownPlaylistsFilters {\n TYPE = 'type',\n DATE = 'date',\n COMPETITION = 'competition',\n}\n\nexport const Filters = ({ appliedFilters, filtersList, filterActions }: FilterDropdownsProps): JSX.Element => {\n const [filters, setFilters] = useState<FiltersList>(filtersList);\n const { t } = useTranslation();\n const [openFilter, setOpenFilter] = useState<string>();\n\n useEffect(() => {\n if (!isEmpty(filtersList)) {\n setFilters(filtersList);\n }\n }, [filtersList]);\n\n const handleOpenFilter = useCallback(\n (filter: DropDownPlaylistsFilters) => {\n filter === openFilter ? setOpenFilter(undefined) : setOpenFilter(filter);\n },\n [openFilter],\n );\n\n return (\n <Stack direction={'row'} gap={2} justifyContent={'flex-end'} alignItems={'center'}>\n <FilterLabel>\n <IconStrawberry size='small' />\n {t('filters:title')}\n </FilterLabel>\n\n <DateRange\n from={appliedFilters.from}\n to={appliedFilters.to}\n hasSelectedOptions={Boolean(appliedFilters.from) && Boolean(appliedFilters.to)}\n isOpen={DropDownPlaylistsFilters.DATE === openFilter}\n onClick={() => handleOpenFilter(DropDownPlaylistsFilters.DATE)}\n onClose={(start, end) => {\n filterActions.setDateRange(start, end);\n setOpenFilter(undefined);\n }}\n />\n\n {filters[DropDownPlaylistsFilters.TYPE]?.options ? (\n <Filter\n isOpen={DropDownPlaylistsFilters.TYPE === openFilter}\n onClickOpen={() => handleOpenFilter(DropDownPlaylistsFilters.TYPE)}\n onClose={() => setOpenFilter(undefined)}\n displayName={t(`filters:type`)}\n hasSelectedOptions={appliedFilters.type.length > 0}\n >\n <CheckBoxMenu\n initialOptions={map(filters['type'].options, (option, id) => ({\n id,\n title: option.title,\n isSelected: appliedFilters.type.includes(id),\n }))}\n submitOptions={(options: FilterOption[]) => {\n setOpenFilter(undefined);\n filterActions.setTypes(options.filter((option) => option.isSelected).map((option) => option.id));\n }}\n />\n </Filter>\n ) : null}\n\n {filters[DropDownPlaylistsFilters.COMPETITION]?.options ? (\n <Filter\n isOpen={DropDownPlaylistsFilters.COMPETITION === openFilter}\n onClickOpen={() => handleOpenFilter(DropDownPlaylistsFilters.COMPETITION)}\n onClose={() => setOpenFilter(undefined)}\n displayName={t(`filters:competition`)}\n hasSelectedOptions={appliedFilters.competition.length > 0}\n >\n <CheckBoxMenu\n initialOptions={map(filters['competition'].options, (option, id) => ({\n id,\n title: option.title,\n isSelected: appliedFilters.competition.includes(id),\n }))}\n submitOptions={(options: FilterOption[]) => {\n setOpenFilter(undefined);\n filterActions.setCompetitions(options.filter((option) => option.isSelected).map((option) => option.id));\n }}\n />\n </Filter>\n ) : null}\n <SearchPlaylist onUpdate={filterActions.setName} />\n </Stack>\n );\n};\n","import reduce from 'lodash/reduce';\nimport queryString from 'query-string';\nimport { useCallback, useState } from 'react';\n\nimport browserHistory from '../../../browserHistory';\n\nexport type QueryStringState = { [key in string]: string | string[] | null | undefined };\n\nconst getQueryString = () => {\n return reduce(\n queryString.parse(browserHistory.location.search),\n (acc, value, key) => {\n return { ...acc, [key]: value };\n },\n {} as QueryStringState,\n );\n};\n\nconst filterAllowedFields = (state: QueryStringState, allowedFields: string[]) => {\n return reduce(\n state,\n (acc, value, key) => {\n if (allowedFields.includes(key)) {\n return { ...acc, [key]: value };\n }\n\n return acc;\n },\n {} as QueryStringState,\n );\n};\n\nconst updateQueryString = (state: QueryStringState) => {\n const currentQueryString = getQueryString();\n\n const search = reduce(\n state,\n (acc, value, key) => {\n (!Array.isArray(value) && value) || (Array.isArray(value) && value.length > 0)\n ? (acc[key] = state[key])\n : delete acc[key];\n\n return acc;\n },\n currentQueryString as QueryStringState,\n );\n\n browserHistory.replace({\n search: queryString.stringify(search),\n });\n};\n\nexport const useQueryStringState = (listOfFieldsToUpdate: string[]) => {\n const [value, setValue] = useState<QueryStringState>(() => {\n return filterAllowedFields(getQueryString(), listOfFieldsToUpdate);\n });\n\n const updateValues = useCallback(\n (state: QueryStringState) => {\n updateQueryString(state);\n setValue(filterAllowedFields(state, listOfFieldsToUpdate));\n },\n [listOfFieldsToUpdate],\n );\n\n return { value, updateValues };\n};\n","import reduce from 'lodash/reduce';\nimport { useEffect } from 'react';\n\nimport { usePlaylists } from 'api/playlist/useFetchPlaylists';\nimport { INITIAL_PLAYLISTS_FILTERS, usePlaylistsFilters } from 'api/playlist/useFetchPlaylists/atoms';\nimport { PlaylistFiltersNames, PlaylistsFilters } from 'api/playlist/useFetchPlaylists/types';\nimport { routes } from 'kognia/router/routes';\nimport { QueryStringState, useQueryStringState } from 'shared/hooks/use-query-string-state';\n\nconst transformQueryStringValuesToFilters = (\n queryStringValues: QueryStringState,\n allowedFields: string[],\n): PlaylistsFilters => {\n return reduce(\n queryStringValues,\n (acc, value, key) => {\n if (allowedFields.includes(key)) {\n if (['competition', 'userId'].includes(key)) {\n return {\n ...acc,\n [key]: Array.isArray(value) ? value : value?.split(','),\n };\n }\n return { ...acc, [key]: value };\n }\n\n return acc;\n },\n INITIAL_PLAYLISTS_FILTERS,\n );\n};\nconst ALLOWED_QUERY_PARAMS = Object.keys(PlaylistFiltersNames);\n\nexport const usePlaylistsWithQueryStringState = () => {\n const filters = usePlaylistsFilters(routes.PLAYLISTS);\n const { value, updateValues } = useQueryStringState(ALLOWED_QUERY_PARAMS);\n\n useEffect(() => {\n updateValues({ ...filters });\n }, [updateValues, filters]);\n\n return usePlaylists({\n playlistId: routes.PLAYLISTS,\n initialFilters: transformQueryStringValuesToFilters(value, ALLOWED_QUERY_PARAMS),\n });\n};\n","import { useTranslation } from 'react-i18next';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { playlistUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\n\nexport const useDeletePlaylist = (playlistId: string) => {\n const { t } = useTranslation();\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n type: HTTPMethod.DELETE,\n errorMessage: t('api:use-delete-playlist.error'),\n successMessage: t('api:use-delete-playlist.success'),\n });\n\n const deletePlaylist = () => {\n mutate({ url: playlistUrl(playlistId) });\n };\n\n return { deletePlaylist, isLoading, isError, isSuccess };\n};\n","export enum Variants {\n IN = 'in',\n OUT = 'out',\n REMOVE = 'remove',\n}\nexport const recordingVariants = {\n [Variants.IN]: { opacity: 1 },\n [Variants.OUT]: { opacity: 0, transition: { delay: 0.2, duration: 0.2, type: 'tween' } },\n [Variants.REMOVE]: { opacity: 0, transition: { delay: 0, duration: 0.1, type: 'tween' } },\n};\n\nexport const getAnimationStatus = (isPresent: boolean, isDeleted: boolean) => {\n if (isDeleted && !isPresent) return Variants.OUT;\n if (!isPresent) return Variants.REMOVE;\n return Variants.IN;\n};\n","import classNames from 'classnames';\nimport React from 'react';\n\nimport styles from './ListItem.module.scss';\n\ninterface Props {\n children?: React.ReactNode;\n onClick?: (...args: any) => any;\n className?: string;\n component?: string;\n}\n\nexport const ListItem = ({ children, onClick, className, component = 'div', ...rest }: Props) => {\n return React.createElement(\n component,\n { onClick: onClick, className: classNames(styles.item, className), ...rest },\n children,\n );\n};\n","import styles from './ListItemTitle.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const ListItemTitle = ({ children }: Props) => {\n return (\n <div data-testid={'list-item-title'} className={styles.title}>\n {children}\n </div>\n );\n};\n","import { useState } from 'react';\n\nimport ConfirmPopoverDialog from 'shared/components/confirm-popover-dialog';\n\nconst useConfirmPopoverDialog = () => {\n const [isOpen, setIsOpen] = useState(false);\n\n return {\n isOpen,\n setIsOpen,\n ConfirmPopoverDialog,\n };\n};\n\nexport default useConfirmPopoverDialog;\n","import { Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material';\nimport trim from 'lodash/trim';\nimport { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useDuplicatePlaylist } from 'api/playlist/useDuplicatePlaylist';\nimport Input from 'shared/components/input';\nimport Spinner from 'shared/components/spinner';\nimport { Playlist } from 'shared/types';\n\nimport styles from './DuplicatePlaylistDialog.module.scss';\n\nexport interface Props {\n onCancel?: () => void;\n isOpen: boolean;\n onClose: () => void;\n onUpdate?: () => void;\n playlist: Playlist;\n}\n\nconst DuplicatePlaylistDialog = ({ onCancel, isOpen, onClose, playlist, onUpdate }: Props) => {\n const { t } = useTranslation();\n const { duplicatePlaylist, isSuccess, isError, isLoading } = useDuplicatePlaylist({ playlistId: playlist.id });\n\n useEffect(() => {\n if (isSuccess) {\n onUpdate && onUpdate();\n onClose();\n }\n\n if (isError) {\n onClose();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isSuccess, isError]);\n\n const nameGenerator = (name: string) => t('recording-playlists:duplicate-form.default-name-template', { name });\n\n const [name, setName] = useState<string>(nameGenerator(playlist.name));\n\n const handleCancel = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n if (onCancel) onCancel();\n onClose();\n };\n\n const handleSubmit = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n duplicatePlaylist({ name });\n\n return false;\n };\n\n const handleNameChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setName(event.target.value);\n };\n\n return (\n <Dialog\n open={isOpen}\n onClose={handleCancel}\n aria-labelledby='form-dialog-title'\n aria-describedby='form-dialog-description'\n >\n <div className={styles.dialog}>\n <DialogTitle id='form-dialog-title'>{t('recording-playlists:duplicate-form.title')}</DialogTitle>\n <DialogContent>\n <Input autoSelect autoFocus defaultValue={name} id='edit-playlist-name' onChange={handleNameChange} />\n </DialogContent>\n <DialogActions className={styles.dialogActions}>\n <Button disabled={isLoading} onClick={handleCancel} variant='outlined' color='secondary'>\n {t('common:actions.cancel')} awd\n </Button>\n <Button\n variant='contained'\n onClick={handleSubmit}\n disabled={trim(name).length === 0}\n data-testid='duplicate-playlist-dialog-confirm-button'\n >\n {isLoading ? <Spinner size='small' sx={{ color: 'common.white' }} /> : t('common:actions.duplicate')}\n </Button>\n </DialogActions>\n </div>\n </Dialog>\n );\n};\n\nexport default DuplicatePlaylistDialog;\n","import { Grid } from '@mui/material';\n\nimport { useDates } from 'shared/hooks/use-dates';\n\nimport styles from '../LiveRecordingCard.module.scss';\n\ntype DateInfoProps = {\n date: Date;\n};\n\nconst DateInfo = ({ date }: DateInfoProps) => {\n const { dateToString } = useDates();\n return (\n <Grid item xs={12} sm={'auto'} className={styles.recordingInfoDate}>\n {dateToString(date)}\n </Grid>\n );\n};\n\nexport default DateInfo;\n","import IconTime from 'shared/components/icons/icon-time';\nimport { secondsAsDuration } from 'shared/utils/seconds-as-duration';\n\nimport styles from './PlaylistsDuration.module.scss';\n\ninterface Props {\n duration: number;\n}\n\nconst PlayListDuration = ({ duration }: Props) => {\n return (\n <div className={styles.duration}>\n <IconTime /> {secondsAsDuration(duration, false)}\n </div>\n );\n};\n\nexport default PlayListDuration;\n","import { useTranslation } from 'react-i18next';\n\nimport IconPlaylist from 'shared/components/icons/icon-playlist';\n\nimport styles from './PlaylistsNumberOfClips.module.scss';\n\ninterface Props {\n number: number;\n}\n\nconst PlaylistNumberOfClips = ({ number }: Props) => {\n const { t } = useTranslation();\n\n return (\n <div className={styles.numberOfClips}>\n <IconPlaylist />\n {t('playlists:card.clips', { count: number })}\n </div>\n );\n};\n\nexport default PlaylistNumberOfClips;\n","import styles from './PlaylistsListItemDetails.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const PlaylistsListItemDetails = ({ children }: Props) => {\n return <div className={styles.details}>{children}</div>;\n};\n","import classNames from 'classnames';\nimport { motion, usePresence } from 'framer-motion';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath, useHistory } from 'react-router-dom';\n\nimport { useDeletePlaylist } from 'api/playlist/useDeletePlaylist';\nimport { invalidatePlaylistsQuery, removePlaylistItemFromList } from 'api/playlist/useFetchPlaylists';\nimport { routes } from 'kognia/router/routes';\nimport { getAnimationStatus, recordingVariants, Variants } from 'pages/recordings-list/components/recording-card/utils';\nimport IconCopy from 'shared/components/icons/icon-copy';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconShare from 'shared/components/icons/icon-share';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport { ListItem } from 'shared/components/list/list-item';\nimport { ListItemTitle } from 'shared/components/list/list-item-title';\nimport SharePlaylistModal from 'shared/components/share-playlist-modal';\nimport Spinner from 'shared/components/spinner';\nimport { useClientId } from 'shared/contexts/app-state';\nimport useConfirmPopoverDialog from 'shared/hooks/use-confirm-popover-dialog';\nimport { Playlist } from 'shared/types';\n\nimport styles from './PlaylistCard.module.scss';\nimport DuplicatePlaylistDialog from '../../../recording-playlists/components/duplicate-playlist-dialog';\nimport DateInfo from '../../../recordings-list/components/live-recording-card/date-info';\nimport PlaylistDuration from '../playlist-duration';\nimport PlaylistNumberOfClips from '../playlist-number-of-clips';\nimport { PlaylistsListItemDetails } from '../playlists-list-item-details';\n\ninterface Props {\n playlist: Playlist;\n}\n\nexport const PlaylistCard = ({ playlist }: Props) => {\n const { clientId } = useClientId();\n const [isDeleted, setIsDeleted] = useState(false);\n const history = useHistory();\n const { t } = useTranslation();\n const [shareModalOpen, setShareModalOpen] = useState(false);\n const { isLoading, deletePlaylist, isSuccess: isDeleteSuccess } = useDeletePlaylist(playlist.id);\n const { isOpen, setIsOpen, ConfirmPopoverDialog } = useConfirmPopoverDialog();\n const kebabRef = useRef<HTMLDivElement | null>(null);\n const [isPresent, safeToRemove] = usePresence();\n const [duplicateModalOpen, setDuplicateModalOpen] = useState(false);\n\n useEffect(() => {\n if (isDeleteSuccess) {\n removePlaylistItemFromList(playlist.id);\n }\n }, [clientId, isDeleteSuccess, playlist.id]);\n\n const handleOnClickPlaylist = useCallback(\n () => history.push(generatePath(routes.RECORDING_PLAYLIST_DETAIL, { playlistId: playlist.id })),\n [history, playlist.id],\n );\n\n const openDuplicateModal = () => {\n setDuplicateModalOpen(true);\n };\n\n const closeModal = () => {\n setShareModalOpen(false);\n };\n\n const onClickShare = () => {\n setShareModalOpen(true);\n };\n\n const options = [\n {\n displayText: t('recording-playlists:share-modal.share-playlist'),\n icon: <IconShare size='small' color='secondary' />,\n onClick: onClickShare,\n },\n {\n displayText: t('common:actions.duplicate'),\n icon: <IconCopy size='small' color='secondary' />,\n onClick: openDuplicateModal,\n },\n {\n displayText: t('common:actions.delete'),\n icon: <IconDelete size='small' color='secondary' />,\n onClick: (event?: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n event && event.stopPropagation();\n setIsOpen(true);\n },\n },\n ] as MenuListOption[];\n\n const handleDelete = () => {\n deletePlaylist();\n setIsOpen(false);\n setIsDeleted(true);\n };\n\n const onDuplicateModal = () => {\n setDuplicateModalOpen(false);\n };\n\n return (\n <>\n <motion.li\n layout\n initial={Variants.IN}\n animate={getAnimationStatus(isPresent, isDeleted)}\n variants={recordingVariants}\n onAnimationComplete={() => !isPresent && safeToRemove && safeToRemove()}\n className={styles.container}\n >\n <ListItem\n className={classNames(styles.card, {\n [styles.deleting]: isDeleted,\n })}\n onClick={handleOnClickPlaylist}\n data-testid='playlist-card'\n >\n <ListItemTitle>\n <h2 data-testid={'playlist-title'}>{playlist.name}</h2>\n </ListItemTitle>\n <PlaylistsListItemDetails>\n <div />\n <PlaylistNumberOfClips number={playlist.playlistItems.length} />\n <PlaylistDuration\n duration={playlist.playlistItems.reduce(\n (duration, item) => duration + (item.endTime - item.startTime),\n 0,\n )}\n />\n <DateInfo date={new Date(playlist.updatedAt)} />\n <div className={styles.recordingActions}>\n {isLoading && <Spinner size='small' />}\n {!isDeleted && !isLoading && <KebabMenu ref={kebabRef} options={options} />}\n </div>\n </PlaylistsListItemDetails>\n </ListItem>\n </motion.li>\n {shareModalOpen && <SharePlaylistModal playlist={playlist} onCloseModal={closeModal} />}\n {duplicateModalOpen && (\n <DuplicatePlaylistDialog\n onUpdate={invalidatePlaylistsQuery}\n isOpen={duplicateModalOpen}\n onClose={onDuplicateModal}\n playlist={playlist}\n />\n )}\n <ConfirmPopoverDialog\n anchorEl={kebabRef.current}\n cancelLabel={t('common:actions.cancel')}\n confirmLabel={t('common:actions.delete')}\n description={t('recordings-list:delete-confirm-modal.confirm-message')}\n isOpen={isOpen}\n onConfirm={handleDelete}\n setIsOpen={setIsOpen}\n buttonColor='warning'\n />\n </>\n );\n};\n","import React from 'react';\n\nimport { List } from 'shared/components/list';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport { ListItem } from 'shared/components/list/list-item';\n\nimport styles from '../PlaylistsDetailSkeleton.module.scss';\n\nconst dataTestId = 'playlist-card-skeleton';\nexport const PlaylistListSkeleton = () => {\n return (\n <>\n <ListHeader className={styles.header} />\n <List>\n <ListItem data-testid={dataTestId} component={'li'} className={styles.item} />\n <ListItem data-testid={dataTestId} component={'li'} className={styles.item} />\n <ListItem data-testid={dataTestId} component={'li'} className={styles.item} />\n <ListItem data-testid={dataTestId} component={'li'} className={styles.item} />\n <ListItem data-testid={dataTestId} component={'li'} className={styles.item} />\n <ListItem data-testid={dataTestId} component={'li'} className={styles.item} />\n <ListItem data-testid={dataTestId} component={'li'} className={styles.item} />\n <ListItem data-testid={dataTestId} component={'li'} className={styles.item} />\n </List>\n </>\n );\n};\n","import { Grid } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { PlaylistSortOptions } from 'api/playlist/useFetchPlaylists/types';\nimport EmptyPage from 'shared/components/empty-page';\nimport { List } from 'shared/components/list';\nimport { ListContainer } from 'shared/components/list/list-container';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport { ListHeaderOption } from 'shared/components/list/list-header-option';\nimport { ListTitle } from 'shared/components/list/list-title';\nimport { ListTitleActions } from 'shared/components/list/list-title-actions';\nimport { ListTitleContainer } from 'shared/components/list/list-title-container';\nimport Pagination from 'shared/components/pagination';\nimport { SortDirection } from 'shared/types/filters/types';\n\nimport { CreatePlaylist } from './components/create-playlist';\nimport { Filters } from './components/filters';\nimport { usePlaylistsWithQueryStringState } from './hooks/usePlaylistsWithQueryStringState';\nimport styles from './PlaylistList.module.scss';\nimport { PlaylistCard } from '../playlist-card';\nimport { PlaylistsListItemDetails } from '../playlists-list-item-details';\nimport { PlaylistListSkeleton } from '../playlists-skeleton/playlist-list-skeleton';\n\nexport const PlaylistsList = () => {\n const { t } = useTranslation();\n const { data, isFetchingNextPage, isFetching, isLoading, appliedFilters, filterActions } =\n usePlaylistsWithQueryStringState();\n\n const handleSortChange = useCallback(\n (sort: PlaylistSortOptions) => {\n if (appliedFilters.sort === sort) {\n return filterActions.setSort(\n sort,\n appliedFilters.sortDirection === SortDirection.ASC ? SortDirection.DESC : SortDirection.ASC,\n );\n }\n\n return filterActions.setSort(sort, SortDirection.DESC);\n },\n [filterActions, appliedFilters.sort, appliedFilters.sortDirection],\n );\n\n return (\n <ListContainer>\n <ListTitleActions>\n <CreatePlaylist />\n </ListTitleActions>\n <ListTitleContainer>\n <ListTitle dataTestId='page-title'>Playlists</ListTitle>\n <Grid container item xs={'auto'} spacing={1} alignItems={'center'}>\n <Filters filtersList={data.filters} filterActions={filterActions} appliedFilters={appliedFilters} />\n </Grid>\n </ListTitleContainer>\n\n {data.playlists.length || isLoading ? (\n <>\n {isLoading ? (\n <PlaylistListSkeleton />\n ) : (\n <>\n <ListHeader className={styles.playlistHeader}>\n <ListHeaderOption\n title={t('playlists:headers.title')}\n showOrder\n order={appliedFilters.sort === 'name' ? appliedFilters.sortDirection : undefined}\n onClick={() => handleSortChange(PlaylistSortOptions.NAME)}\n />\n\n <PlaylistsListItemDetails>\n <div />\n <ListHeaderOption title={t('playlists:headers.n-clips')} />\n <ListHeaderOption title={t('playlists:headers.duration')} />\n <ListHeaderOption\n title={t('playlists:headers.last-modified')}\n showOrder\n order={\n appliedFilters.sort === PlaylistSortOptions.UPDATED_AT ? appliedFilters.sortDirection : undefined\n }\n onClick={() => handleSortChange(PlaylistSortOptions.UPDATED_AT)}\n />\n <div />\n </PlaylistsListItemDetails>\n </ListHeader>\n <List>\n {data.playlists.map((playlist) => (\n <PlaylistCard key={playlist.id} playlist={playlist} />\n ))}\n </List>\n </>\n )}\n <Pagination\n total={data.totalElements}\n displayed={data.playlists.length}\n getStatsText={(displayed, total) => t('playlists:pagination.total', { displayed, total, count: total })}\n onShowMore={data.fetchNextPage}\n loading={isFetchingNextPage || Boolean(data.playlists.length && isFetching)}\n />\n </>\n ) : (\n <EmptyPage header={t('playlists:not-found.header')} description={t('playlists:not-found.description')} />\n )}\n </ListContainer>\n );\n};\n","import React from 'react';\n\nimport { ListContainer } from 'shared/components/list/list-container';\nimport { ListTitle } from 'shared/components/list/list-title';\nimport { ListTitleContainer } from 'shared/components/list/list-title-container';\n\nimport { PlaylistListSkeleton } from './playlist-list-skeleton';\nimport styles from './PlaylistsDetailSkeleton.module.scss';\nimport { CreatePlaylist } from '../playlists-list/components/create-playlist';\n\nconst PlaylistsSkeleton = () => {\n return (\n <ListContainer>\n <ListTitleContainer>\n <ListTitle className={styles.title}>Playlists</ListTitle>\n <CreatePlaylist className={styles.actions} />\n </ListTitleContainer>\n\n <PlaylistListSkeleton />\n </ListContainer>\n );\n};\n\nexport default PlaylistsSkeleton;\n","import React, { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router-dom';\n\nimport { PlaylistsData } from 'api/playlist/useFetchPlaylists';\nimport { queryParams, routes } from 'kognia/router/routes';\nimport Container from 'shared/components/container';\nimport EmptyList from 'shared/components/empty-page';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\nimport usePageStateMachine from 'shared/hooks/use-page-state-machine';\nimport { useQueryParams } from 'shared/hooks/use-query-params';\n\nimport { CopyPlaylist } from './components/copy-playlist';\nimport { PlaylistsList } from './components/playlists-list';\nimport { usePlaylistsWithQueryStringState } from './components/playlists-list/hooks/usePlaylistsWithQueryStringState';\nimport PlaylistsSkeleton from './components/playlists-skeleton';\nimport { INITIAL_PLAYLISTS_FILTERS, useSetPlaylistsFilters } from '../../api/playlist/useFetchPlaylists/atoms';\n\nexport const PlaylistsContainer = () => {\n const { t } = useTranslation();\n const query = useQueryParams();\n const branding = useBranding();\n const setPlaylistsFilters = useSetPlaylistsFilters(routes.PLAYLISTS);\n\n const { listen } = useHistory();\n const copyPlaylistQueryParam: string | null = query.get(queryParams.copyPlaylist);\n\n const { isPageLoading, isPageMissingData, isPageError, isPageReady } = usePageStateMachine<PlaylistsData>(() =>\n usePlaylistsWithQueryStringState(),\n );\n\n useEffect(() => {\n document.title = t('common:metas.title.playlists', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n useEffect(() => {\n return listen((change) => {\n if (change.search === '') setPlaylistsFilters({ ...INITIAL_PLAYLISTS_FILTERS });\n });\n }, [listen, setPlaylistsFilters]);\n\n return (\n <SidebarLayout>\n <Container>\n {isPageLoading && <PlaylistsSkeleton />}\n {(isPageMissingData || isPageError) && (\n <EmptyList header={t('playlists:not-found.header')} description={t('playlists:not-found.description')} />\n )}\n {isPageReady && (\n <>\n <PlaylistsList />\n {copyPlaylistQueryParam ? <CopyPlaylist playlistId={copyPlaylistQueryParam} /> : null}\n </>\n )}\n </Container>\n </SidebarLayout>\n );\n};\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { queryClient } from 'api/config';\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { transformEditRecording } from 'api/recording/transformers';\nimport { specificRecordingUrl } from 'api/routes';\n// eslint-disable-next-line import/no-restricted-paths\nimport { RecordingEditAPI } from 'pages/recordings-list/api/types';\nimport { useClientId } from 'shared/contexts/app-state';\nimport { EditFormRecording } from 'shared/types/recording/types';\n\nconst generateUseGetRecordingQueryRef = (recordingId: string) => {\n return [`fetchRecording-${recordingId}`];\n};\n\ninterface useFetchRecordingInterface {\n (recordingId: string): UseQueryResult<EditFormRecording> & { invalidateQuery: () => Promise<void> };\n}\n\nexport const useFetchRecording: useFetchRecordingInterface = (recordingId: string) => {\n const { clientId } = useClientId();\n const fetchQueryRef = generateUseGetRecordingQueryRef(clientId);\n\n const invalidateQuery = () => queryClient.invalidateQueries(fetchQueryRef);\n\n const fetchRequest = useFetchRequest<EditFormRecording>({\n queryRef: fetchQueryRef,\n url: specificRecordingUrl(recordingId),\n transformer: (response: RecordingEditAPI) => transformEditRecording(response),\n options: { retry: false },\n });\n\n return { ...fetchRequest, invalidateQuery };\n};\n","export const secondsToTimeString = (seconds: number) => {\n const date = new Date(0);\n date.setSeconds(seconds);\n\n // 1970-01-01T00:00:00.000Z\n let str = date.toISOString();\n str = str.substring(11, 11 + 8);\n if (str.indexOf('00:') === 0) {\n str = str.substr(3, str.length);\n }\n\n return str;\n};\n\nconst dateFormatter = new Intl.DateTimeFormat('en', {\n day: 'numeric',\n year: 'numeric',\n month: 'short',\n});\n\nconst timeFormatter = new Intl.DateTimeFormat('en', {\n hour12: false,\n hour: 'numeric',\n minute: 'numeric',\n});\n\nexport const dateToPrintableDateTimeString = (date: Date) => {\n return `${dateFormatter.format(new Date(date))} - ${timeFormatter.format(new Date(date))}`;\n};\n\nexport const dateToPrintableDateString = (date: Date): string => {\n return dateFormatter.format(new Date(date));\n};\n\nexport const toISODateString = (date: Date): string => {\n return date.getFullYear() + '-' + ('0' + (date.getMonth() + 1)).slice(-2) + '-' + ('0' + date.getDate()).slice(-2);\n};\n","import { useMutation } from '@tanstack/react-query';\n\nimport { useBackendApi } from 'api/hooks/useBackendApi';\nimport { specificRecordingUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { RecordingUpdate } from 'pages/recording-edit/types';\nimport { EditFormRecording, Recording } from 'shared/types/recording/types';\nimport { toISODateString } from 'tagging-tool/utility/date';\n\nconst extractRecordingUpdateData = (recording: EditFormRecording): RecordingUpdate => ({\n name: recording.name,\n competitionName: recording.competitionName,\n matchday: recording.matchDay,\n date: toISODateString(recording.date),\n type: recording.type,\n home_team_score: recording.homeTeamScore,\n away_team_score: recording.awayTeamScore,\n});\n\nexport const useUpdateRecording = (\n recordingId: string,\n onSuccess?: () => void,\n onError?: () => void,\n onSettled?: () => void,\n) => {\n const onPatchSuccess = (data: Recording) => data;\n const patchUrl = specificRecordingUrl(recordingId);\n const updateRecording = useMutation(\n (params: EditFormRecording) =>\n useBackendApi(patchUrl, HTTPMethod.PATCH, onPatchSuccess, extractRecordingUpdateData(params)),\n {\n onMutate: async (params: EditFormRecording) => {},\n onError: () => {\n if (onError) onError();\n },\n onSuccess: () => {\n if (onSuccess) onSuccess();\n },\n onSettled: () => {\n if (onSettled) onSettled();\n },\n },\n );\n\n const sendUpdate = (updateParams: EditFormRecording) => {\n updateRecording.mutate(updateParams);\n };\n\n const isUpdating = updateRecording.isLoading;\n\n return { sendUpdate, isUpdating };\n};\n","import { forwardRef } from 'react';\nimport DatePicker from 'react-datepicker';\n\nimport Input from 'shared/components/input';\nimport { useDates } from 'shared/hooks/use-dates';\n\nimport styles from './DateSelector.module.scss';\nimport 'react-datepicker/dist/react-datepicker.css';\n\ntype InputProps = {\n onClick?: () => void;\n displayDate?: Date;\n title?: string;\n};\n\ntype RefType = number;\n\nconst dateFormat = 'yyyy-MM-dd';\n\nconst InputBar = forwardRef<RefType, InputProps>(({ onClick, displayDate, title }, ref) => {\n const { dateToString } = useDates();\n const displayValue = displayDate ? dateToString(displayDate) : 'Input Date';\n return (\n <Input\n data-testid={'date'}\n id='date'\n label={title}\n placeholder={dateFormat}\n value={displayValue}\n onClick={onClick}\n readOnly\n />\n );\n});\n\ntype DateSelectorProps = {\n title?: string;\n onChangeDate: (date: Date) => any;\n date?: Date;\n};\n\nconst DateSelector = ({ onChangeDate, date, title }: DateSelectorProps) => {\n return (\n <DatePicker\n dateFormat={dateFormat}\n selected={date}\n title={title}\n onChange={(date: Date) => onChangeDate(date)}\n customInput={<InputBar displayDate={date} title={title} />}\n wrapperClassName={styles.dateSelector}\n popperPlacement='bottom'\n popperClassName={styles.datePicker}\n />\n );\n};\n\nInputBar.displayName = 'InputBar';\n\nexport default DateSelector;\n","export const RBChecked = (props) => {\n return (\n <svg\n stroke='currentColor'\n fill='currentColor'\n strokeWidth='0'\n viewBox='0 0 24 24'\n height='1em'\n width='1em'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n >\n <path\n fillRule='evenodd'\n d='M12,20 C16.418278,20 20,16.418278 20,12 C20,7.581722 16.418278,4 12,4 C7.581722,4 4,7.581722 4,12 C4,16.418278 7.581722,20 12,20 Z M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z M12,17 C14.7614237,17 17,14.7614237 17,12 C17,9.23857625 14.7614237,7 12,7 C9.23857625,7 7,9.23857625 7,12 C7,14.7614237 9.23857625,17 12,17 Z'\n />\n </svg>\n );\n};\n\nexport const RBUnchecked = (props) => {\n return (\n <svg\n stroke='currentColor'\n fill='currentColor'\n strokeWidth='0'\n viewBox='0 0 24 24'\n height='1em'\n width='1em'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n >\n <path d='M12,20 C16.418278,20 20,16.418278 20,12 C20,7.581722 16.418278,4 12,4 C7.581722,4 4,7.581722 4,12 C4,16.418278 7.581722,20 12,20 Z M12,22 C6.4771525,22 2,17.5228475 2,12 C2,6.4771525 6.4771525,2 12,2 C17.5228475,2 22,6.4771525 22,12 C22,17.5228475 17.5228475,22 12,22 Z' />\n </svg>\n );\n};\n\nexport const RBDisabled = (props) => {\n return (\n <svg\n stroke='currentColor'\n fill='currentColor'\n strokeWidth='0'\n viewBox='0 0 32 32'\n height='1em'\n width='1em'\n xmlns='http://www.w3.org/2000/svg'\n {...props}\n >\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M14 24.667c5.891 0 10.667-4.776 10.667-10.667S19.89 3.333 14 3.333 3.333 8.11 3.333 14 8.11 24.667 14 24.667zm0 2.666C6.636 27.333.667 21.363.667 14 .667 6.636 6.637.667 14 .667c7.364 0 13.333 5.97 13.333 13.333 0 7.364-5.97 13.333-13.333 13.333zm-5.333-12a1.333 1.333 0 1 1 0-2.666h10.666a1.333 1.333 0 1 1 0 2.666H8.667z'\n />\n </svg>\n );\n};\n\nexport const CrossedEye = (props) => {\n return (\n <svg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20' {...props}>\n <g fill='none' fillRule='evenodd'>\n <path d='M0 0h20v20H0z' />\n <path\n fill='currentColor'\n d='M10 6.103a3.638 3.638 0 0 1 3.63 3.63c0 .129 0 .275-.018.404l2.621 2.621a15.522 15.522 0 0 0 2.842-3.025C16.582 6.323 13.428 4.288 10 4.288c-.678 0-1.338.092-1.998.239l1.595 1.595c.128-.019.275-.019.403-.019zM2.098 3.115l2.769 2.768c-1.43.935-2.769 2.237-3.942 3.85 2.493 3.41 5.647 5.445 9.075 5.445 1.192 0 2.347-.256 3.447-.715l3.171 3.172 1.284-1.283-14.52-14.52-1.284 1.283zM6.37 9.733c0-.678.183-1.301.513-1.833l1.375 1.375a1.99 1.99 0 0 0-.073.458c0 1.009.807 1.815 1.815 1.815.165 0 .312-.036.458-.073l.715.715.66.66a3.671 3.671 0 0 1-1.833.513 3.638 3.638 0 0 1-3.63-3.63z'\n />\n </g>\n </svg>\n );\n};\n\nexport const Eye = (props) => {\n return (\n <svg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20' {...props}>\n <g fill='none' fillRule='evenodd'>\n <path d='M0 0h20v20H0z' />\n <path\n fill='currentColor'\n d='M10 3.75C5.833 3.75 2.275 6.342.833 10c1.442 3.658 5 6.25 9.167 6.25s7.725-2.592 9.167-6.25c-1.442-3.658-5-6.25-9.167-6.25zm0 10.417A4.168 4.168 0 0 1 5.833 10C5.833 7.7 7.7 5.833 10 5.833S14.167 7.7 14.167 10 12.3 14.167 10 14.167zM10 7.5A2.497 2.497 0 0 0 7.5 10c0 1.383 1.117 2.5 2.5 2.5s2.5-1.117 2.5-2.5-1.117-2.5-2.5-2.5z'\n />\n </g>\n </svg>\n );\n};\n","import classnames from 'classnames';\n\nimport { RBChecked, RBDisabled, RBUnchecked } from 'shared/components/atomize-icons';\n\nimport styles from './RadioButton.module.scss';\n\ntype RadioProps = {\n displayValue: string;\n id: string;\n checked?: boolean;\n disabled?: boolean;\n onSelect?: (id: string) => void;\n value?: any;\n};\n\nconst getLabelClass = (checked?: boolean, disabled?: boolean) => {\n if (disabled) return classnames(styles.radioLabel, styles.radioLabelDisabled);\n if (checked) return classnames(styles.radioLabel, styles.radioLabelChecked);\n return styles.radioLabel;\n};\n\nexport const RadioButton = ({ displayValue, disabled, id, checked, onSelect }: RadioProps) => {\n const labelClass = getLabelClass(checked, disabled);\n const RadioButtonIcon = () => {\n if (disabled) return <RBDisabled className={classnames(styles.radioIcon, styles.radioIconDisabled)} />;\n if (checked) return <RBChecked className={classnames(styles.radioIcon, styles.radioIconChecked)} />;\n return <RBUnchecked className={styles.radioIcon} />;\n };\n\n const handleSelect = () => {\n if (disabled) return;\n onSelect && onSelect(id);\n };\n\n return (\n <label className={labelClass} htmlFor={id} onClick={handleSelect}>\n <input id={id} type='radio' className={styles.radio} disabled={disabled} />\n <RadioButtonIcon />\n <span className={styles.radioContent}>{displayValue}</span>\n </label>\n );\n};\n\nexport default RadioButton;\n","import { Button } from '@mui/material';\nimport isEqual from 'lodash/isEqual';\nimport pick from 'lodash/pick';\nimport startCase from 'lodash/startCase';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath, useHistory } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport { useFetchRecording } from 'pages/recording-edit/hooks/useGetRecording';\nimport { useUpdateRecording } from 'pages/recording-edit/hooks/useUpdateRecording';\nimport DateSelector from 'shared/components/date-selector';\nimport Input from 'shared/components/input';\nimport RadioButton from 'shared/components/radio-button';\nimport Spinner from 'shared/components/spinner';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\nimport { EditFormRecording, RecordingTypes } from 'shared/types/recording/types';\n\nimport styles from './RecordingEditForm.module.scss';\n\ntype RecordingEditFormProps = {\n initialData: EditFormRecording;\n recordingId: string;\n};\n\nconst RecordingEditForm = ({ initialData, recordingId }: RecordingEditFormProps) => {\n const history = useHistory();\n const { t } = useTranslation();\n const { invalidateQuery } = useFetchRecording(recordingId);\n const [recordingData, setRecordingData] = useState(initialData);\n\n const redirectToRecordingListPage = () => {\n const recordingListPath = generatePath(routes.RECORDING_LIST);\n history.push(recordingListPath);\n };\n\n const onCancel = () => {\n redirectToRecordingListPage();\n };\n\n const triggerNotification = useNotifications();\n const onUpdateSuccess = () => {\n triggerNotification({ type: NotificationType.INFO, message: t('api:use-update-recording.success') });\n redirectToRecordingListPage();\n };\n\n const onUpdateError = () => {\n triggerNotification({ type: NotificationType.ERROR, message: t('api:use-update-recording.error') });\n };\n\n const onUpdateSettled = () => {\n invalidateQuery && invalidateQuery();\n };\n\n const { sendUpdate, isUpdating } = useUpdateRecording(recordingId, onUpdateSuccess, onUpdateError, onUpdateSettled);\n\n const onSubmit = (params: EditFormRecording) => {\n sendUpdate(params);\n };\n\n const sanitiseUpdate = (recordingUpdate: EditFormRecording): EditFormRecording => {\n if (recordingUpdate.type !== RecordingTypes.TRAINING) return recordingUpdate;\n\n return { ...recordingUpdate, ...{ competitionName: '', matchDay: '', homeTeamScore: 0, awayTeamScore: 0 } };\n };\n\n const submitForm = () => {\n const recordingUpdate = pick(recordingData, [\n 'name',\n 'competitionName',\n 'matchDay',\n 'date',\n 'type',\n 'homeTeamScore',\n 'awayTeamScore',\n ]) as EditFormRecording;\n const sanitisedUpdate = sanitiseUpdate(recordingUpdate);\n onSubmit(sanitisedUpdate);\n };\n\n const onChangeType = (type: RecordingTypes) => {\n setRecordingData({ ...recordingData, ...{ type: type } });\n };\n\n const onChangeDate = (date: Date) => {\n setRecordingData({ ...recordingData, ...{ date } });\n };\n\n const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setRecordingData({ ...recordingData, ...{ [event.target.id]: event.target.value } });\n };\n\n const isChecked = (value: RecordingTypes) => recordingData.type === value;\n\n const RadioButtons = () => {\n return (\n <>\n {Object.values(RecordingTypes).map((recordingType) => {\n return (\n <RadioButton\n key={`type-${recordingType}`}\n id={`type-${recordingType}`}\n value={t(`recording-edit:form.recording-types.${recordingType}`)}\n checked={isChecked(recordingType)}\n onSelect={() => onChangeType(recordingType)}\n displayValue={startCase(recordingType)}\n />\n );\n })}\n </>\n );\n };\n\n return (\n <>\n <h3 className={styles.pageHeader}>{t('recording-edit:form.title')}</h3>\n <div className={styles.formContainer}>\n <Input\n id='name'\n label={t('recording-edit:form.labels.recording-name')}\n placeholder='Input Text'\n onChange={onChange}\n value={recordingData.name}\n />\n <div className={styles.formBreaker} />\n <div className={styles.radioButtonContainer}>\n <RadioButtons />\n </div>\n <DateSelector onChangeDate={onChangeDate} date={recordingData.date} />\n {recordingData.type === RecordingTypes.GAME && (\n <>\n <div className={styles.formBreaker} />\n <Input\n id='competitionName'\n label={t('recording-edit:form.labels.competition-name')}\n placeholder='Input Text'\n onChange={onChange}\n value={recordingData.competitionName || ''}\n />\n <Input\n id='matchDay'\n label={t('recording-edit:form.labels.match-day')}\n placeholder='Input Text'\n onChange={onChange}\n value={recordingData.matchDay || ''}\n />\n <Input\n id='homeTeamScore'\n label={t('recording-edit:form.labels.home-team-score')}\n placeholder='Input Score'\n onChange={onChange}\n value={recordingData.homeTeamScore >= 0 ? recordingData.homeTeamScore : ''}\n type='number'\n min='0'\n />\n <Input\n id='awayTeamScore'\n label={t('recording-edit:form.labels.away-team-score')}\n placeholder='Input Score'\n onChange={onChange}\n value={recordingData.awayTeamScore >= 0 ? recordingData.awayTeamScore : ''}\n type='number'\n min='0'\n />\n </>\n )}\n </div>\n <div className={styles.buttonContainer}>\n <Button variant='outlined' color='secondary' id='cancel' onClick={onCancel}>\n {t('common:actions.cancel')}\n </Button>\n {isUpdating ? (\n <Spinner />\n ) : (\n <Button variant='contained' id='submit' disabled={isEqual(initialData, recordingData)} onClick={submitForm}>\n {t('common:actions.update')}\n </Button>\n )}\n </div>\n </>\n );\n};\n\nexport default RecordingEditForm;\n","import React, { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { RouteComponentProps } from 'react-router-dom';\n\nimport Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport Spinner from 'shared/components/spinner';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\nimport usePageStateMachine from 'shared/hooks/use-page-state-machine';\nimport { EditFormRecording } from 'shared/types/recording/types';\n\nimport styles from './RecordingEditPage.module.scss';\nimport { useFetchRecording } from '../../hooks/useGetRecording';\nimport RecordingEditForm from '../recording-edit-form';\n\ntype RouteParams = { id: string };\n\ntype RecordingEditPageProps = {\n recordingId: string;\n};\n\nconst RecordingEditPage = ({ recordingId }: RecordingEditPageProps) => {\n const { current, data, PAGE_STATES } = usePageStateMachine<EditFormRecording>(() => useFetchRecording(recordingId));\n\n const { t } = useTranslation();\n\n return (\n <>\n {current.matches(PAGE_STATES.LOADING) && (\n <SidebarLayout>\n <Container>\n <Spinner isFullPage />\n </Container>\n </SidebarLayout>\n )}\n {current.matches(PAGE_STATES.ERROR) && (\n <SidebarLayout>\n <Container>\n <div className={styles.notFound}>\n <h4 className={styles.error}>{t('recording-edit:error')}</h4>\n </div>\n </Container>\n </SidebarLayout>\n )}\n {current.matches(PAGE_STATES.READY) && data && (\n <SidebarLayout>\n <Container>\n <RecordingEditForm recordingId={recordingId} initialData={data} />\n </Container>\n </SidebarLayout>\n )}\n </>\n );\n};\n\nconst RecordingEditContainer = (props: RouteComponentProps<RouteParams>) => {\n const {\n match: {\n params: { id },\n },\n } = props;\n const { t } = useTranslation();\n const branding = useBranding();\n\n useEffect(() => {\n document.title = t('common:metas.title.recording-edit', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n return <RecordingEditPage recordingId={id} />;\n};\n\nexport default RecordingEditContainer;\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { queryClient } from 'api/config';\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { transformPlaylist } from 'api/playlist/transformers';\nimport { playlistsUrl, recordingPlaylistsUrl } from 'api/routes';\nimport { Playlist } from 'shared/types';\n\nimport { PlaylistApiResponse } from '../types';\n\nconst generateQueryRef = (includeEmpty: boolean, recordingId?: string) => [\n `fetchPlaylists-recordingId:${recordingId || 'all'}:includeEmpty:${includeEmpty ? 'true' : 'false'}`,\n];\n\ninterface useFetchRecordingsPlaylistsInterface {\n (recordingId?: string, includeEmpty?: boolean): UseQueryResult<Playlist[]> & { invalidateQuery: () => Promise<void> };\n}\n\nexport const useFetchRecordingPlaylists: useFetchRecordingsPlaylistsInterface = (recordingId, includeEmpty = true) => {\n const onSuccess = (data: PlaylistApiResponse[]) => data.map((playlist) => transformPlaylist(playlist));\n const fetchQueryRef = generateQueryRef(includeEmpty, recordingId);\n const invalidateQuery = () => queryClient.invalidateQueries(fetchQueryRef);\n const fetchRequest = useFetchRequest<Playlist[]>({\n queryRef: fetchQueryRef,\n url: recordingId ? recordingPlaylistsUrl(recordingId, includeEmpty) : playlistsUrl,\n options: { retry: false, staleTime: 100, refetchOnWindowFocus: true },\n transformer: onSuccess,\n });\n\n return { ...fetchRequest, invalidateQuery };\n};\n","import classNames from 'classnames';\nimport { ReactNode } from 'react';\n\nimport styles from './Card.module.scss';\n\ninterface Props {\n children: ReactNode;\n onClick?: () => void;\n className?: string;\n}\n\nconst Card = ({ children, onClick = undefined, className = '' }: Props) => {\n return (\n <div onClick={onClick} className={classNames(styles.card, className, { [styles.hover]: onClick })}>\n {children}\n </div>\n );\n};\n\nexport default Card;\n","import classNames from 'classnames';\nimport { motion, usePresence } from 'framer-motion';\nimport { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath, Link, useHistory } from 'react-router-dom';\n\nimport { useDeletePlaylist } from 'api/playlist/useDeletePlaylist';\nimport { useFetchRecordingPlaylists } from 'api/playlist/useFetchRecordingPlaylists';\nimport { routes } from 'kognia/router/routes';\nimport Card from 'shared/components/card';\nimport IconCopy from 'shared/components/icons/icon-copy';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconPlaylist from 'shared/components/icons/icon-playlist';\nimport IconShare from 'shared/components/icons/icon-share';\nimport IconTime from 'shared/components/icons/icon-time';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport SharePlaylistModal from 'shared/components/share-playlist-modal';\nimport useConfirmPopoverDialog from 'shared/hooks/use-confirm-popover-dialog';\nimport { Playlist } from 'shared/types';\nimport { secondsAsDuration } from 'shared/utils/seconds-as-duration';\n\nimport styles from './PlaylistCard.module.scss';\nimport DuplicatePlaylistDialog from '../../duplicate-playlist-dialog';\n\ninterface Props {\n playlist: Playlist;\n recordingId: string;\n}\n\nconst PlaylistCard = ({ playlist, recordingId }: Props) => {\n const { t } = useTranslation();\n const { invalidateQuery } = useFetchRecordingPlaylists(recordingId, false);\n const [shareModalOpen, setShareModalOpen] = useState(false);\n const [duplicateModalOpen, setDuplicateModalOpen] = useState(false);\n const [isPresent, safeToRemove] = usePresence();\n const { isOpen, setIsOpen, ConfirmPopoverDialog } = useConfirmPopoverDialog();\n const { deletePlaylist, isError, isSuccess } = useDeletePlaylist(playlist.id);\n\n const [isDeleted, setIsDeleted] = useState(false);\n const history = useHistory();\n const route = generatePath(routes.RECORDING_PLAYLIST_DETAIL, { playlistId: playlist.id });\n\n useEffect(() => {\n if (isSuccess) {\n invalidateQuery && invalidateQuery();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isSuccess]);\n\n const kebabRef = useRef<HTMLDivElement | null>(null);\n const variants = {\n in: { opacity: 1 },\n out: { opacity: 0, transition: { delay: 0.2, duration: 0.2, type: 'tween' } },\n };\n\n const closeModal = () => {\n setShareModalOpen(false);\n };\n\n const onClickShare = () => {\n setShareModalOpen(true);\n };\n\n const handleConfirmDelete = () => {\n deletePlaylist();\n setIsOpen(false);\n setIsDeleted(true);\n };\n\n const openDuplicateModal = () => {\n setDuplicateModalOpen(true);\n };\n\n const menuOptions = [\n {\n displayText: t('recording-playlists:share-modal.share-playlist'),\n icon: <IconShare size='small' color='secondary' />,\n onClick: onClickShare,\n },\n {\n displayText: t('common:actions.delete'),\n icon: <IconDelete size='small' color='secondary' />,\n onClick: (event?: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n event && event.stopPropagation();\n setIsOpen(true);\n },\n },\n {\n displayText: t('common:actions.duplicate'),\n icon: <IconCopy size='small' color='secondary' />,\n onClick: openDuplicateModal,\n },\n ] as MenuListOption[];\n\n useEffect(() => {\n if (isError) setIsDeleted(false);\n }, [isError]);\n\n return (\n <motion.div\n layout\n initial={'in'}\n animate={isPresent ? 'in' : 'out'}\n variants={variants}\n onAnimationComplete={() => !isPresent && safeToRemove && safeToRemove()}\n >\n <div className={styles.cardContainer}>\n <Card\n className={classNames({ [styles.deleting]: isDeleted || !isPresent })}\n onClick={() => history.push(route)}\n >\n <div className={styles.kebabContainer}>\n <KebabMenu ref={kebabRef} options={menuOptions} />\n </div>\n <div className={styles.headerContainer}>\n <header>\n <Link className={styles.name} to={route}>\n {playlist.name}\n </Link>\n <IconTime size='small' /> {secondsAsDuration(playlist.duration, true)}\n </header>\n </div>\n <div className={styles.clipCount}>\n <IconPlaylist size='small' />\n {playlist.playlistItems.length} {t('recording-playlists:clip', { count: playlist.playlistItems.length })}\n </div>\n </Card>\n {shareModalOpen && <SharePlaylistModal playlist={playlist} onCloseModal={closeModal} />}\n {duplicateModalOpen && (\n <DuplicatePlaylistDialog\n onUpdate={invalidateQuery}\n isOpen={duplicateModalOpen}\n onClose={() => {\n setDuplicateModalOpen(false);\n }}\n playlist={playlist}\n />\n )}\n <ConfirmPopoverDialog\n anchorEl={kebabRef.current}\n cancelLabel={t('common:actions.cancel')}\n confirmLabel={t('common:actions.delete')}\n description={t('recording-playlists:delete-confirm-modal.confirm-message')}\n isOpen={isOpen}\n onConfirm={handleConfirmDelete}\n setIsOpen={setIsOpen}\n buttonColor='warning'\n />\n </div>\n </motion.div>\n );\n};\n\nexport default PlaylistCard;\n","import { Grid } from '@mui/material';\nimport { useEffect, useState } from 'react';\n\nimport { Playlist } from 'shared/types';\n\nimport PlaylistCard from './playlist-card';\n\ninterface Props {\n playlists: Playlist[];\n recordingId: string;\n}\nconst PlaylistsGrid = ({ playlists, recordingId }: Props) => {\n const [playlistsList, setPlaylistsList] = useState<Playlist[]>([]);\n\n useEffect(() => {\n setPlaylistsList(playlists);\n }, [playlists]);\n\n return (\n <Grid container spacing={4}>\n {playlistsList.map((playlist) => (\n <Grid key={playlist.id} item xs={4}>\n <PlaylistCard key={playlist.id} recordingId={recordingId} playlist={playlist} />\n </Grid>\n ))}\n </Grid>\n );\n};\n\nexport default PlaylistsGrid;\n","import { useTranslation } from 'react-i18next';\n\nimport NotFound from 'shared/components/not-found';\nimport { Playlist } from 'shared/types';\n\nimport styles from './RercordingPlaylistsPage.module.scss';\nimport PlaylistsGrid from '../playlists-grid';\n\ninterface Props {\n playlists: Playlist[];\n matchId: string;\n}\nconst RecordingPlaylistsPage = ({ playlists, matchId }: Props) => {\n const { t } = useTranslation();\n\n return (\n <>\n <div className={styles.heading}>\n <h1 className={styles.title}>{t('recording-playlists:title')}</h1>\n </div>\n {playlists.length === 0 && (\n <NotFound\n header={t('recording-playlists:not-found.header')}\n description={t('recording-playlists:not-found.description')}\n />\n )}\n {playlists.length > 0 && <PlaylistsGrid recordingId={matchId} playlists={playlists} />}\n </>\n );\n};\n\nexport default RecordingPlaylistsPage;\n","import classNames from 'classnames';\n\nimport styles from './RecordingPlaylistsSkeleton.module.scss';\nimport EmptyCellGrid from '../empty-cell-grid';\nimport pageStyles from '../recording-playlists-page/RercordingPlaylistsPage.module.scss';\n\nconst RecordingPlaylistsSkeleton = () => {\n return (\n <>\n <div className={pageStyles.heading}>\n <h1 className={classNames(pageStyles.title, styles.title)} />\n <div className={styles.button} />\n </div>\n <EmptyCellGrid cells={9} size={4} isLoading />\n </>\n );\n};\n\nexport default RecordingPlaylistsSkeleton;\n","import { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useParams } from 'react-router-dom';\n\nimport { useFetchRecordingPlaylists } from 'api/playlist/useFetchRecordingPlaylists';\nimport Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\nimport usePageStateMachine from 'shared/hooks/use-page-state-machine';\nimport { Playlist } from 'shared/types';\n\nimport RecordingPlaylistsPage from './components/recording-playlists-page';\nimport RecordingPlaylistsSkeleton from './components/recording-playlists-skeleton';\n\ntype RouteParams = {\n id: string;\n};\n\nconst RecordingPlaylistsContainer = () => {\n const { id } = useParams<RouteParams>();\n const { t } = useTranslation();\n const branding = useBranding();\n\n const { data, isPageReady, isPageLoading } = usePageStateMachine<Playlist[]>(() =>\n useFetchRecordingPlaylists(id, false),\n );\n\n useEffect(() => {\n document.title = t('common:metas.title.recording-playlist', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n return (\n <SidebarLayout>\n <Container>\n {isPageLoading && <RecordingPlaylistsSkeleton />}\n {isPageReady && data && <RecordingPlaylistsPage playlists={data} matchId={id} />}\n </Container>\n </SidebarLayout>\n );\n};\n\nexport default RecordingPlaylistsContainer;\n","import pickBy from 'lodash/pickBy';\n\nimport { RecordingAnnotationTypes, RecordingFilters } from 'pages/recordings-list/types';\nimport { FiltersList } from 'shared/types/filters/types';\n\nimport browserHistory from '../../../../../browserHistory';\n\nexport const transformFiltersForRequest = (filters: FiltersList) => {\n const annotationType = filters[RecordingFilters.ANNOTATION_TYPE]\n ? Object.keys(pickBy(filters[RecordingFilters.ANNOTATION_TYPE].options, (option) => option.isApplied))[0]\n : RecordingAnnotationTypes.all;\n\n const competition = filters[RecordingFilters.COMPETITION]\n ? Object.keys(pickBy(filters[RecordingFilters.COMPETITION].options, (option) => option.isApplied))\n : [];\n\n const date = filters[RecordingFilters.DATE]\n ? Object.keys(pickBy(filters[RecordingFilters.DATE].options, (option) => option.isApplied))\n : [];\n\n const matchday = filters[RecordingFilters.MATCHDAY]\n ? Object.keys(pickBy(filters[RecordingFilters.MATCHDAY].options, (option) => option.isApplied))\n : [];\n\n const teamId = filters[RecordingFilters.TEAM]\n ? Object.keys(pickBy(filters[RecordingFilters.TEAM].options, (option) => option.isApplied))\n : [];\n\n const type = filters[RecordingFilters.TYPE]\n ? Object.keys(pickBy(filters[RecordingFilters.TYPE].options, (option) => option.isApplied))\n : [];\n\n let search = `${RecordingFilters.ANNOTATION_TYPE}=${annotationType}`;\n\n if (competition && competition.length > 0) search = search.concat(`&${RecordingFilters.COMPETITION}=${competition}`);\n if (date && date.length > 0) search = search.concat(`&${RecordingFilters.DATE}=${date}`);\n if (matchday && matchday.length > 0) search = search.concat(`&${RecordingFilters.MATCHDAY}=${matchday}`);\n if (teamId && teamId.length > 0) search = search.concat(`&${RecordingFilters.TEAM}=${teamId}`);\n if (type && type.length > 0) search = search.concat(`&${RecordingFilters.TYPE}=${type}`);\n\n browserHistory.replace({\n search: search,\n });\n\n return {\n competition: `${competition}`,\n date: `${date}`,\n matchday: `${matchday}`,\n teamId: `${teamId}`,\n type: `${type}`,\n ...(annotationType == RecordingAnnotationTypes.all ? {} : { annotationType }),\n };\n};\n","import { useInfiniteQuery } from '@tanstack/react-query';\nimport isEmpty from 'lodash/isEmpty';\nimport React, { ReactNode, useMemo, useState } from 'react';\n\nimport { queryClient } from 'api/config';\nimport { useBackendApi } from 'api/hooks/useBackendApi';\nimport { recordingsListUrl } from 'api/routes';\nimport { fetchQueryResponse, HTTPMethod } from 'api/types';\nimport { useClientId } from 'shared/contexts/app-state';\nimport { FiltersList } from 'shared/types/filters/types';\nimport { Recording } from 'shared/types/recording/types';\n\nimport { transformFiltersForRequest } from './util/transform-filters-for-request';\nimport { transformRecordings } from '../transformers';\n\nexport const generateFetchRecordingsQueryRef = (clientId: string) => `fetchRecordings-clientId:${clientId}`;\n\nexport type FetchRecordingsResponse = fetchQueryResponse<Recording[]> & {\n fetchNextPage: () => void;\n totalElements: number;\n isFetchingNextPage: boolean;\n recordingsFilters: FiltersList;\n filters: FiltersList;\n setRecordingsFilters: (options: FiltersList) => void;\n RecordingsStateContext: ({ children }: { children: ReactNode }) => JSX.Element;\n};\n\ninterface UseRecordingsOptions {\n extraKey?: string;\n initialFilters?: FiltersList;\n}\n\nexport interface useFetchRecordingsInterface {\n (options: UseRecordingsOptions): FetchRecordingsResponse;\n}\n\nexport interface RecordingEndpointFilters {\n annotationType?: string;\n competition?: string;\n date?: string;\n matchday?: string;\n page: number;\n size?: number;\n sort?: string;\n teamId?: string;\n type?: string;\n}\n\nconst RecordingsStateContext = React.createContext<{ filters: FiltersList } | undefined>(undefined);\n\nconst PAGE_SIZE = 12;\nconst SORT = 'date,desc';\n\nconst useRecordings: useFetchRecordingsInterface = ({ extraKey = '', initialFilters = {} }) => {\n const [filters, setFilters] = useState(initialFilters);\n\n const { clientId } = useClientId();\n\n const fetchQueryRef = generateFetchRecordingsQueryRef(`${clientId}${extraKey}`);\n\n const value = { filters };\n\n const queryRef = useMemo(() => [fetchQueryRef, filters], [fetchQueryRef, filters]);\n\n const { isError, isSuccess, data, isFetching, isLoading, fetchNextPage, isFetchingNextPage } = useInfiniteQuery(\n queryRef,\n ({ pageParam = 0 }) => {\n return useBackendApi(\n recordingsListUrl({\n ...transformFiltersForRequest(filters),\n size: PAGE_SIZE,\n sort: SORT,\n page: pageParam,\n }),\n HTTPMethod.GET,\n transformRecordings,\n );\n },\n {\n getNextPageParam: (lastPage: { nextCursor: number }) => {\n return lastPage.nextCursor;\n },\n refetchInterval: 60000,\n },\n );\n\n const setQueryData = (data: any) => {\n return queryClient.setQueryData(queryRef, data);\n };\n\n const lastPage = data?.pages?.length ? data.pages[data.pages.length - 1] : { data: { filters: {} } };\n\n const pages = useMemo(() => {\n return data?.pages?.length\n ? data.pages.reduce((acc: Recording[], page: any) => {\n return acc.concat(page.data.recordings);\n }, [])\n : [];\n }, [data?.pages]);\n\n return {\n data: pages,\n isError,\n isFetching,\n isFetchingNextPage,\n isSuccess,\n isLoading,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filters: lastPage.data.filters,\n setQueryData,\n fetchNextPage,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n totalElements: lastPage?.data?.page ? lastPage.data.page.totalElements : 0,\n setRecordingsFilters: setFilters,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n recordingsFilters: isEmpty(filters) ? lastPage.data.filters : filters,\n RecordingsStateContext: ({ children }: { children: ReactNode }) => (\n <RecordingsStateContext.Provider value={value}>{children}</RecordingsStateContext.Provider>\n ),\n };\n};\n\nconst useRecordingsListFilters = () => {\n const context = React.useContext(RecordingsStateContext);\n if (context === undefined) {\n throw new Error('useRecordingsListFilters must be used within a RecordingsStateContext');\n }\n\n return context.filters;\n};\n\nexport { useRecordings, useRecordingsListFilters };\n","import { Grid, Skeleton } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport interface RecordingCardLoading {\n isAnimated?: boolean;\n}\n\nconst RecordingCardLoading = (props: RecordingCardLoading) => {\n const { isAnimated = true } = props;\n return (\n <Grid item xs={12}>\n <Skeleton\n width='100%'\n height={104}\n sx={{ backgroundColor: Colors.ghost, transform: 'none', marginBottom: 1 }}\n animation={isAnimated ? 'pulse' : false}\n />\n </Grid>\n );\n};\n\nexport default RecordingCardLoading;\n","import { Grid } from '@mui/material';\nimport React from 'react';\n\nimport RecordingCardLoading from '../../vod-recording-card/loading';\n\nconst RecordingsListLoading = () => (\n <Grid container marginTop={2}>\n <RecordingCardLoading />\n <RecordingCardLoading />\n <RecordingCardLoading />\n <RecordingCardLoading />\n </Grid>\n);\n\nexport default RecordingsListLoading;\n","import { Box, Skeleton } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nimport Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\n\nimport RecordingsListLoading from '../recordings-list/loading';\n\nexport const RecordingListPageSkeleton = () => {\n return (\n <SidebarLayout>\n <Container>\n <Box>\n <Skeleton variant='rectangular' width='20%' height={36} sx={{ backgroundColor: Colors.ghost }} />\n </Box>\n <Box marginBottom={3} marginTop={3}>\n <Skeleton variant='rectangular' height={48} sx={{ backgroundColor: Colors.ghost }} />\n </Box>\n <Box display='flex' justifyContent='flex-end'>\n <Skeleton variant='rectangular' width='25%' height={32} sx={{ backgroundColor: Colors.ghost }} />\n </Box>\n <Box marginBottom={3} marginTop={3}>\n <Skeleton variant='rectangular' height={40} sx={{ backgroundColor: Colors.ghost }} />\n </Box>\n <RecordingsListLoading />\n </Container>\n </SidebarLayout>\n );\n};\n","import has from 'lodash/has';\nimport queryString from 'query-string';\n\nimport { RecordingAnnotationTypes, RecordingFilters } from 'pages/recordings-list/types';\n\nimport browserHistory from '../../../../../browserHistory';\n\nexport const getFiltersFromUrl = () => {\n const searchParams = queryString.parse(browserHistory.location.search);\n\n const annotationType = has(searchParams, RecordingFilters.ANNOTATION_TYPE)\n ? (searchParams[RecordingFilters.ANNOTATION_TYPE] as string)\n : '';\n const competition = has(searchParams, RecordingFilters.COMPETITION)\n ? (searchParams[RecordingFilters.COMPETITION] as string[])\n : [];\n const date = has(searchParams, RecordingFilters.DATE) ? (searchParams[RecordingFilters.DATE] as string[]) : [];\n const matchday = has(searchParams, RecordingFilters.MATCHDAY)\n ? (searchParams[RecordingFilters.MATCHDAY] as string[])\n : [];\n const teamId = has(searchParams, RecordingFilters.TEAM) ? (searchParams[RecordingFilters.TEAM] as string[]) : [];\n const type = has(searchParams, RecordingFilters.TYPE) ? (searchParams[RecordingFilters.TYPE] as string[]) : [];\n\n return {\n competition: `${competition}`,\n date: `${date}`,\n matchday: `${matchday}`,\n teamId: `${teamId}`,\n type: `${type}`,\n ...(annotationType == RecordingAnnotationTypes.all ? {} : { annotationType }),\n };\n};\n","import { Box, Typography } from '@mui/material';\nimport classNames from 'classnames';\nimport map from 'lodash/map';\nimport reduce from 'lodash/reduce';\nimport React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MdKeyboardArrowDown as Caret } from 'react-icons/md';\n\nimport { getFiltersFromUrl } from 'api/recording/useFetchRecordings/util/get-initial-filters';\nimport { RecordingFilters } from 'pages/recordings-list/types';\nimport { ListTitle } from 'shared/components/list/list-title';\nimport { Filter, FilterOptions } from 'shared/types';\n\nimport styles from './annotation-type-filter.module.scss';\nimport { ApplyFilterPayloadType } from '../hooks/useRecordingsFilters/reducer';\n\ntype AnnotationTypeFilterProps = {\n annotationFilter: Filter;\n applyFilters: (payload: ApplyFilterPayloadType) => void;\n};\n\nconst getSelectedAnnotationType = (annotationFilter: FilterOptions): string => {\n const urlFilters = getFiltersFromUrl();\n\n const firstKey = Object.keys(annotationFilter)[0];\n return reduce(\n annotationFilter,\n (acc, option, type) => {\n return urlFilters.annotationType === type ? type : acc;\n },\n firstKey,\n );\n};\n\nconst AnnotationTypeFilter = ({ annotationFilter, applyFilters }: AnnotationTypeFilterProps): JSX.Element => {\n const { t } = useTranslation();\n const annotationTypeOptionApplied = getSelectedAnnotationType(annotationFilter.options);\n\n const [isDropdownVisible, setDropdownVisible] = useState(false);\n\n return (\n <Box sx={{ display: 'flex', justifyContent: 'flex-start' }}>\n <ListTitle dataTestId='page-title'>{t('filters:recordings')}</ListTitle>\n\n <div\n className={styles.dropdown}\n tabIndex={0}\n onMouseEnter={() => setDropdownVisible(true)}\n onMouseLeave={() => setDropdownVisible(false)}\n onFocus={() => setDropdownVisible(true)}\n onBlur={() => setDropdownVisible(false)}\n >\n <Typography sx={{ fontSize: 24, fontWeight: 300, display: 'inline' }}>\n {t(`filters:annotation-type.${annotationTypeOptionApplied.toLowerCase()}`)}\n </Typography>\n <Caret\n className={classNames(styles.caret, {\n [styles['caret--down']]: isDropdownVisible,\n })}\n />\n <ul\n className={classNames(styles.list, {\n [styles['list--visible']]: isDropdownVisible,\n })}\n >\n {map(annotationFilter.options, (option, index) => (\n <li\n tabIndex={annotationTypeOptionApplied === index ? -1 : 0}\n className={classNames(styles.type, {\n [styles['type--disabled']]: annotationTypeOptionApplied === index,\n })}\n key={index}\n onClick={() => {\n applyFilters({ key: RecordingFilters.ANNOTATION_TYPE, selectedFilters: [index] });\n }}\n >\n {t(`filters:annotation-type.${index.toLowerCase()}`)}\n </li>\n ))}\n </ul>\n </div>\n </Box>\n );\n};\n\nexport default AnnotationTypeFilter;\n","export enum RecordingsFiltersActions {\n APPLY_FILTER = 'APPLY_FILTER',\n REMOVE_FILTER = 'REMOVE_FILTER',\n}\n\nexport type ApplyFilterPayloadType = {\n key: string;\n selectedFilters: string[];\n};\n\nexport type ApplyFilterAction = {\n type: RecordingsFiltersActions.APPLY_FILTER;\n payload: ApplyFilterPayloadType;\n};\n\nexport type RemoveFilterAction = {\n type: RecordingsFiltersActions.REMOVE_FILTER;\n payload: string;\n};\n\nexport type FilterActions = ApplyFilterAction | RemoveFilterAction;\n\nexport const filtersReducer = (\n state: { [key: string]: string[] },\n action: FilterActions,\n): { [key: string]: string[] } => {\n switch (action.type) {\n case RecordingsFiltersActions.APPLY_FILTER:\n state[action.payload.key] = action.payload.selectedFilters;\n return { ...state };\n case RecordingsFiltersActions.REMOVE_FILTER:\n state[action.payload] = [];\n return { ...state };\n default:\n return state;\n }\n};\n","import map from 'lodash/map';\nimport pickBy from 'lodash/pickBy';\nimport { useCallback, useReducer } from 'react';\n\nimport { FiltersList } from 'shared/types';\n\nimport { ApplyFilterPayloadType, filtersReducer, RecordingsFiltersActions } from './reducer';\n\nconst useRecordingsFilters = (filtersList: FiltersList) => {\n const initialFiltersState: { [key: string]: string[] } = {};\n map(filtersList, (filter, index) => {\n initialFiltersState[index] = Object.keys(pickBy(filter.options, (option) => option.isApplied));\n });\n\n const [filtersApplied, dispatch] = useReducer(filtersReducer, initialFiltersState);\n\n const applyFilters = useCallback((payload: ApplyFilterPayloadType) => {\n dispatch({\n type: RecordingsFiltersActions.APPLY_FILTER,\n payload,\n });\n }, []);\n\n const removeFilter = useCallback((payload: string) => {\n dispatch({\n type: RecordingsFiltersActions.REMOVE_FILTER,\n payload,\n });\n }, []);\n\n return {\n filtersApplied,\n applyFilters,\n removeFilter,\n };\n};\n\nexport default useRecordingsFilters;\n","import { useTranslation } from 'react-i18next';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { liveTaggingSessionUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\n\nexport const useDeleteLiveRecording = (recordingId: string, onSuccess?: (recordingId: string) => void) => {\n const { t } = useTranslation();\n\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n type: HTTPMethod.DELETE,\n errorMessage: t('api:use-delete-live-recording.error'),\n successMessage: t('api:use-delete-live-recording.success'),\n onSuccess: async () => {\n onSuccess && onSuccess(recordingId);\n },\n });\n\n const deleteRecording = () => {\n mutate({ url: liveTaggingSessionUrl(recordingId) });\n };\n\n return { deleteRecording, isLoading, isError, isSuccess };\n};\n","import { useRouteMatch } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\n\nconst useIsTaggingTool = (): boolean => {\n const routerMatch = useRouteMatch();\n return routes.TAGGING_TOOL === routerMatch.path;\n};\n\nexport default useIsTaggingTool;\n","import { useTranslation } from 'react-i18next';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { invalidateTacticalAnalysisUrl } from 'api/routes';\nimport { HTTPMethod, TacticalAnalysisApiResponse } from 'api/types';\n\nexport const useInvalidateTacticalAnalysis = (onSuccess?: (response: TacticalAnalysisApiResponse) => void) => {\n const { t } = useTranslation();\n\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n type: HTTPMethod.POST,\n errorMessage: t('api:use-invalidate-tactical-analysis.error'),\n successMessage: t('api:use-invalidate-tactical-analysis.success'),\n onSuccess: async (response: TacticalAnalysisApiResponse) => {\n onSuccess && onSuccess(response);\n },\n });\n\n const invalidateTacticalAnalysis = (tacticalAnalysisId: string) => {\n mutate({ url: invalidateTacticalAnalysisUrl(tacticalAnalysisId) });\n };\n\n return { invalidateTacticalAnalysis, isLoading, isError, isSuccess };\n};\n","import { useTranslation } from 'react-i18next';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { validateTacticalAnalysisUrl } from 'api/routes';\nimport { HTTPMethod, TacticalAnalysisApiResponse } from 'api/types';\n\nexport const useValidateTacticalAnalysis = (onSuccess?: (response: TacticalAnalysisApiResponse) => void) => {\n const { t } = useTranslation();\n\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n type: HTTPMethod.POST,\n errorMessage: t('api:use-validate-tactical-analysis.error'),\n successMessage: t('api:use-validate-tactical-analysis.success'),\n onSuccess: async (response: TacticalAnalysisApiResponse) => {\n onSuccess && onSuccess(response);\n },\n });\n\n const validateTacticalAnalysis = (tacticalAnalysisId: string) => {\n mutate({ url: validateTacticalAnalysisUrl(tacticalAnalysisId) });\n };\n\n return { validateTacticalAnalysis, isLoading, isError, isSuccess };\n};\n","export type MatchSegment = 'first' | 'second' | 'firstextra' | 'secondextra' | 'penalty';\n\nexport interface Episode {\n dashUrl: string;\n endTime: number;\n endTimeInSegment: number;\n endAction: EpisodeAction;\n id: string;\n videoSourceId: string;\n matchSegment: MatchSegment;\n name: string;\n recordingId: string;\n tacticalAnalysisId: string;\n s3Url: string;\n startTime: number;\n startTimeInSegment: number;\n startAction: EpisodeAction;\n tacticalScenarios: TacticalScenario[];\n tacticalFundamentals: TacticalFundamental[];\n}\n\nexport type EpisodeAction = {\n state: string;\n teamId: string;\n zone: number;\n time: number;\n timeInSegment: number;\n name: string;\n};\n\nexport type TacticalScenario = {\n endTime: number;\n endTimeInSegment: number;\n matchSegment: MatchSegment;\n startTime: number;\n startZone: number;\n tacticalScenarioType: TacticalScenarioType;\n teamId: string;\n name: string;\n};\n\nexport type StartPlayTacticalScenarioType =\n | 'in_play|pass|kickoff'\n | 'in_play|pass|goal_kick'\n | 'in_play|pass|throw_in'\n | 'in_play|pass|corner_kick'\n | 'in_play|pass|free_kick'\n | 'in_play|pass|drop_ball'\n | 'in_play|shot|free_kick'\n | 'in_play|shot|penalty_kick'\n | 'in_play|shot|corner_kick';\n\nexport type EndPlayTacticalScenarioType =\n | 'out_of_play|out_of_bounds|touch_line'\n | 'out_of_play|out_of_bounds|attacking_goal_line'\n | 'out_of_play|out_of_bounds|defending_goal_line'\n | 'out_of_play|goal'\n | 'out_of_play|stopped_by_referee|foul|offside'\n | 'out_of_play|stopped_by_referee|foul'\n | 'out_of_play|stopped_by_referee|foul|in_penalty_area'\n | 'out_of_play|stopped_by_referee|other_stop'\n | 'out_of_play|end_of_play';\n\nexport type ListedTacticalScenarioType =\n | 'build-up'\n | 'build-up-ab'\n | 'build-up-cd'\n | 'change-of-possession'\n | 'finishing'\n | 'long-game'\n | 'possession-a'\n | 'possession-bc'\n | 'possession-d'\n | 'recovery-ball'\n | 'change-of-possession-no-possession'\n | 'possession-a-no-possession'\n | 'possession-bc-no-possession'\n | 'possession-d-no-possession';\n\nexport type NotListedTacticalScenarioType =\n | 'corner-kick'\n | 'drop-ball'\n | 'free-kick'\n | 'goal-kick'\n | 'kickoff'\n | 'out-of-play'\n | 'penalty-kick'\n | 'throw-in';\n\nexport type TacticalScenarioType = ListedTacticalScenarioType | NotListedTacticalScenarioType;\n\nexport enum Scenarios {\n BUILD_UP = 'build-up',\n BUILD_UP_AB = 'build-up-ab',\n BUILD_UP_CD = 'build-up-cd',\n POSSESION_A = 'possession-a',\n POSSESION_BC = 'possession-bc',\n POSSESION_D = 'possession-d',\n CHANGE_OF_POSSESSION = 'change-of-possession',\n}\n\nexport enum EventsStarting {\n CORNER_KICK = 'corner-kick',\n DROP_BALL = 'drop-ball',\n FREE_KICK = 'free-kick',\n KICKOFF = 'kickoff',\n THROW_IN = 'throw-in',\n GOAL_KICK = 'goal-kick',\n LONG_GAME = 'long-game',\n PENALTY_KICK = 'penalty-kick',\n}\n\nexport const isEventStarting = (event: string) => {\n return Object.values(EventsStarting).includes(event as EventsStarting);\n};\n\nexport const isValidScenario = (scenario: string) => {\n return Object.values(Scenarios).includes(scenario as Scenarios);\n};\n\nexport type TacticalFundamental = {\n tacticalFundamentalType: string;\n teamId: string;\n players: string[];\n startTime: number;\n endTime: number;\n name: string;\n};\n\nexport type StartingState = 'in_play' | 'pass' | 'kickoff';\nexport type EndingState = 'in_play' | 'uncontrolled';\n","export interface MatchTeams {\n homeTeam: MatchTeam;\n opponentTeam: MatchTeam;\n}\n\nexport interface MatchTeam {\n id: string;\n name: string;\n logo: string;\n players: TeamPlayer[];\n}\n\nexport interface TeamPlayer {\n id: string;\n positionLine?: number;\n positionWing?: number;\n photo?: string;\n substitutedBy?: number;\n name: string;\n number?: number;\n}\n\nexport enum MatchTeamTypes {\n HOME = 'homeTeam',\n OPPONENT = 'opponentTeam',\n}\n","import { useTranslation } from 'react-i18next';\n\nimport { queryClient } from 'api/config';\nimport { generateFetchRecordingsQueryRef, useRecordingsListFilters } from 'api/recording/useFetchRecordings';\nimport { useInvalidateTacticalAnalysis } from 'api/tactical-analysis/useInvalidateTacticalAnalysis';\nimport { useValidateTacticalAnalysis } from 'api/tactical-analysis/useValidateTacticalAnalysis';\nimport { TacticalAnalysisApiResponse } from 'api/types';\nimport IconClose from 'shared/components/icons/icon-close';\nimport IconDone from 'shared/components/icons/icon-done';\nimport { MenuListOption } from 'shared/components/kebab-menu';\nimport { useClientId, useUser } from 'shared/contexts/app-state';\nimport { UserAuthority } from 'shared/types';\n\nimport { TacticalAnalysis, TacticalAnalysisStates } from '../../types/recording/types';\n\nexport const useRecordingValidationOption = (tacticalAnalysis: TacticalAnalysis | null) => {\n const { t } = useTranslation();\n const user = useUser();\n\n const { clientId } = useClientId();\n const filters = useRecordingsListFilters();\n const fetchQueryRef = generateFetchRecordingsQueryRef(clientId);\n const onSuccess = (tacticalAnalysis: TacticalAnalysisApiResponse) =>\n queryClient.setQueryData([fetchQueryRef, filters], (data: any) => ({\n pages: data.pages.map((page: any) => ({\n ...page,\n data: {\n ...page.data,\n recordings: page.data.recordings.map((aRecording: any) => {\n if (aRecording.id !== tacticalAnalysis.recordingId) return aRecording;\n return { ...aRecording, tacticalAnalysis: tacticalAnalysis };\n }),\n },\n })),\n pageParams: data.pageParams,\n }));\n\n const { validateTacticalAnalysis } = useValidateTacticalAnalysis(onSuccess);\n const { invalidateTacticalAnalysis } = useInvalidateTacticalAnalysis(onSuccess);\n\n const validationOption: MenuListOption[] =\n tacticalAnalysis && user.authorities.includes(UserAuthority.ROLE_ADMIN)\n ? [\n tacticalAnalysis.state !== TacticalAnalysisStates.VALIDATED\n ? {\n icon: <IconDone size='small' color='secondary' />,\n displayText: t('recordings-list:recording-card.validate-tactical-analysis'),\n onClick: (event?: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n event && event.stopPropagation();\n validateTacticalAnalysis(tacticalAnalysis.id);\n },\n }\n : {\n icon: <IconClose size='small' color='secondary' />,\n displayText: t('recordings-list:recording-card.invalidate-tactical-analysis'),\n onClick: (event?: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n event && event.stopPropagation();\n invalidateTacticalAnalysis(tacticalAnalysis.id);\n },\n },\n ]\n : [];\n\n return validationOption;\n};\n","import { forwardRef } from 'react';\n\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport { useRecordingValidationOption } from 'shared/hooks/use-recording-validation-option';\nimport { Recording } from 'shared/types/recording/types';\n\ntype Props = {\n options?: MenuListOption[];\n extraOptions?: MenuListOption[];\n recording: Recording;\n};\n\nconst KebabMenuRecordings = forwardRef<HTMLDivElement, Props>(({ options = [], extraOptions = [], recording }, ref) => {\n const validationOption = useRecordingValidationOption(recording.tacticalAnalysis);\n\n return <KebabMenu ref={ref} options={[...options, ...validationOption, ...extraOptions]} id={recording.id} />;\n});\n\nKebabMenuRecordings.displayName = 'KebabMenuRecordings';\n\nexport default KebabMenuRecordings;\n","import styles from './RecordingsListItemDetails.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const RecordingsListItemDetails = ({ children }: Props) => {\n return <div className={styles.details}>{children}</div>;\n};\n","import classNames from 'classnames';\nimport { motion, usePresence } from 'framer-motion';\nimport React, { useMemo, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router-dom';\n\nimport { getAnimationStatus, recordingVariants, Variants } from 'pages/recordings-list/components/recording-card/utils';\nimport styles from 'pages/recordings-list/components/vod-recording-card/RecordingCard.module.scss';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport { IconDownload } from 'shared/components/icons/icon-download';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport { ListItem } from 'shared/components/list/list-item';\nimport Spinner from 'shared/components/spinner';\nimport useIsTaggingTool from 'shared/hooks/is-tagging-tool';\nimport useConfirmPopoverDialog from 'shared/hooks/use-confirm-popover-dialog';\nimport { Recording, RecordingTypes } from 'shared/types/recording/types';\n\nimport KebabMenuRecordings from '../kebab-menu-recordings';\nimport { RecordingsListItemDetails } from '../recordings-list-item-details';\n\ninterface Props {\n children: React.ReactNode;\n hasVideoSource: boolean;\n hideActions?: boolean;\n isDeleted: boolean;\n isLoading: boolean;\n menuOptions: MenuListOption[];\n onClick: () => void;\n onDelete: () => void;\n recording: Recording;\n editPath: string;\n title: React.ReactNode;\n}\n\nconst RecordingCard = ({\n children,\n editPath,\n hasVideoSource,\n hideActions,\n isDeleted,\n isLoading,\n menuOptions,\n onClick,\n onDelete,\n recording,\n title,\n}: Props) => {\n const history = useHistory();\n const { t } = useTranslation();\n const { isOpen, setIsOpen, ConfirmPopoverDialog } = useConfirmPopoverDialog();\n const kebabRef = useRef<HTMLDivElement | null>(null);\n const [isPresent, safeToRemove] = usePresence();\n\n const isTaggingTool = useIsTaggingTool();\n\n const defaultMenuOptions = useMemo(() => {\n const options: MenuListOption[] = [\n {\n icon: <IconEdit size='small' color='secondary' />,\n displayText: t('recordings-list:recording-card.edit-recording'),\n onClick: (event: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n event.stopPropagation();\n history.push(editPath);\n },\n },\n {\n displayText: t('common:actions.delete'),\n icon: <IconDelete size='small' color='secondary' />,\n onClick: (event?: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n event && event.stopPropagation();\n setIsOpen(true);\n },\n },\n ];\n\n if (recording.matchReportDownloadUrl) {\n options.push({\n displayText: (\n <a href={recording.matchReportDownloadUrl} target='_blank' rel='noreferrer' className={styles.downloadOption}>\n <IconDownload size='small' color='secondary' />\n {t('recordings-list:recording-card.download-report')}\n </a>\n ),\n });\n }\n return options;\n }, [editPath, history, setIsOpen, t, recording.matchReportDownloadUrl]);\n\n const handleDelete = () => {\n onDelete();\n setIsOpen(false);\n };\n\n return (\n <motion.div\n layout\n initial={Variants.IN}\n animate={getAnimationStatus(isPresent, isDeleted)}\n variants={recordingVariants}\n onAnimationComplete={() => !isPresent && safeToRemove && safeToRemove()}\n className={styles.container}\n >\n <ListItem\n className={classNames(styles.recordingCard, {\n [styles.deleting]: isDeleted,\n [styles.processing]: !hasVideoSource,\n [styles.recordingCardTraining]: recording.type === RecordingTypes.TRAINING,\n })}\n onClick={onClick}\n >\n {title}\n <RecordingsListItemDetails>\n {children}\n <div className={styles.recordingActions}>\n {isLoading && <Spinner size='small' />}\n {!isDeleted &&\n !isLoading &&\n !hideActions &&\n (isTaggingTool ? (\n <KebabMenu ref={kebabRef} options={[...defaultMenuOptions, ...menuOptions]} id={recording.id} />\n ) : (\n <KebabMenuRecordings\n ref={kebabRef}\n options={defaultMenuOptions}\n extraOptions={menuOptions}\n recording={recording}\n />\n ))}\n </div>\n </RecordingsListItemDetails>\n <ConfirmPopoverDialog\n anchorEl={kebabRef.current}\n cancelLabel={t('common:actions.cancel')}\n confirmLabel={t('common:actions.delete')}\n description={t('recordings-list:delete-confirm-modal.confirm-message')}\n isOpen={isOpen}\n onConfirm={handleDelete}\n setIsOpen={setIsOpen}\n buttonColor='warning'\n />\n </ListItem>\n </motion.div>\n );\n};\n\nexport default RecordingCard;\n","import styles from './ListInfo.module.scss';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const ListInfo = ({ children }: Props) => {\n return <div className={styles.info}>{children}</div>;\n};\n","export const makeRecordingDetailRoute = (params: { recordingId: string; showsKeypad?: boolean; isLive?: boolean }) =>\n `/tagging-tool/${encodeURIComponent(params.recordingId)}${params.isLive === true ? '?isLive=true' : '?isLive=false'}${\n params.showsKeypad === true ? '&showsKeypad=1' : ''\n }`;\n\nexport const makeRecordingAlignmentSourcesRoute = (params: { recordingId: string; isLive?: boolean }) =>\n `/tagging-tool/${encodeURIComponent(params.recordingId)}/align/sources${\n params.isLive === true ? '?isLive=true' : '?isLive=false'\n }`;\n\nexport const makeRecordingAlignmentRoute = (params: {\n recordingId: string;\n sourceRecordingId?: string;\n isLive?: boolean;\n}) =>\n `/tagging-tool/${encodeURIComponent(params.recordingId)}/align${\n params.sourceRecordingId ? `/${params.sourceRecordingId}` : ''\n }${params.isLive === true ? '?isLive=true' : '?isLive=false'}`;\n\nexport const makeTimelineRoute = (params: { recordingId: string }) =>\n `/performance-report/${encodeURIComponent(params.recordingId)}/timeline`;\n\nexport const makePlaylistIndexRoute = (params: { recordingId: string }) =>\n `/recordings/${params.recordingId}/playlists`;\n","import { Grid } from '@mui/material';\nimport { TFunction } from 'react-i18next';\n\nimport { RecordingTypes } from 'shared/types/recording/types';\n\nimport styles from '../LiveRecordingCard.module.scss';\n\ntype CompetitionInfoProps = {\n type?: RecordingTypes;\n competitionName?: string;\n t: TFunction<'translation'>;\n};\n\nconst CompetitionInfo = ({ type, competitionName, t }: CompetitionInfoProps) => {\n if (type === RecordingTypes.GAME && !competitionName) return null;\n\n return (\n <Grid item xs={12} sm={'auto'} className={styles.recordingCardTag}>\n {type === RecordingTypes.GAME && competitionName}\n {type === RecordingTypes.TRAINING && t('recordings-list:recording-card.training')}\n </Grid>\n );\n};\n\nexport default CompetitionInfo;\n","import { CircularProgress, Grid } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport { useTranslation } from 'react-i18next';\n\nimport IconTag from 'shared/components/icons/icon-tag';\n\nimport styles from './LiveRecordingInfo.module.scss';\n\nconst useCircularLoaderStyles = makeStyles(() => ({\n circle: {\n color: '#205CFA',\n strokeLinecap: 'round',\n },\n}));\n\nconst LiveRecordingInfo = () => {\n const { t } = useTranslation();\n const classes = useCircularLoaderStyles();\n\n return (\n <Grid item xs={12} sm={'auto'} className={styles.container}>\n <div className={styles.liveTagIcon}>\n <div className={styles.spinnerContainer}>\n <CircularProgress classes={{ circle: classes.circle }} thickness={4} size={28} className={styles.spinner} />\n </div>\n <div className={styles.tagIcon}>\n <IconTag size='small' />\n </div>\n </div>\n <span className={styles.title}>{t('recordings-list:live-recording-card.live-recording')}</span>\n </Grid>\n );\n};\n\nexport default LiveRecordingInfo;\n","import { Grid } from '@mui/material';\nimport { useTranslation } from 'react-i18next';\n\nimport { useDates } from 'shared/hooks/use-dates';\n\nimport styles from '../LiveRecordingCard.module.scss';\n\ntype MatchDayInfoProps = {\n date: Date;\n};\n\nconst StartTime = ({ date }: MatchDayInfoProps) => {\n const { t } = useTranslation();\n const { dateToTime } = useDates();\n\n return (\n <Grid item xs={12} sm={'auto'} className={styles.recordingCardTag}>\n <span className={styles.recordingInfoTime}>{t('recordings-list:live-recording-card:start-time')}</span>{' '}\n {dateToTime(date)}\n </Grid>\n );\n};\n\nexport default StartTime;\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath, useHistory } from 'react-router-dom';\n\nimport { useDeleteLiveRecording } from 'api/recording/useDeleteLiveRecording';\nimport { routes } from 'kognia/router/routes';\nimport RecordingCard from 'pages/recordings-list/components/recording-card';\nimport IconCamera from 'shared/components/icons/icon-camera';\nimport { MenuListOption } from 'shared/components/kebab-menu';\nimport { ListInfo } from 'shared/components/list/list-info';\nimport { ListItemTitle } from 'shared/components/list/list-item-title';\nimport { Recording } from 'shared/types/recording/types';\nimport { makeRecordingAlignmentSourcesRoute, makeRecordingDetailRoute } from 'tagging-tool/utility/navigation';\n\nimport CompetitionInfo from './competition-info';\nimport DateInfo from './date-info';\nimport LiveRecordingInfo from './live-recording-info';\nimport StartTime from './match-day-info';\nimport stylesCard from '../vod-recording-card/RecordingCard.module.scss';\n\ninterface Props {\n onDeleteSuccess?: (recordingId: string) => void;\n recording: Recording;\n}\n\nconst LiveRecordingCard = React.memo(({ recording, onDeleteSuccess }: Props) => {\n const history = useHistory();\n const { t } = useTranslation();\n const [isDeleted, setIsDeleted] = useState(false);\n const { deleteRecording, isError, isLoading } = useDeleteLiveRecording(recording.id, onDeleteSuccess);\n\n const { id, type, name, date, competitionName } = recording;\n\n useEffect(() => {\n if (isError) {\n setIsDeleted(false);\n }\n }, [isError]);\n\n const handleConfirmDelete = () => {\n deleteRecording();\n setIsDeleted(true);\n };\n\n const menuOptions = [\n {\n displayText: '',\n },\n {\n displayText: t('recording:actions.align-with-video'),\n icon: <IconCamera size='small' color='secondary' />,\n onClick: (event?: React.MouseEvent<HTMLLIElement, MouseEvent>) => {\n event && event.stopPropagation();\n history.push(\n makeRecordingAlignmentSourcesRoute({\n recordingId: recording.id,\n isLive: recording.isLive,\n }),\n );\n },\n },\n ] as MenuListOption[];\n\n const handleClickToTaggingTool = useCallback(() => {\n history.push(makeRecordingDetailRoute({ recordingId: recording.id, isLive: true, showsKeypad: true }));\n }, [history, recording.id]);\n\n return (\n <RecordingCard\n editPath={generatePath(routes.LIVE_TAGGING_SESSION_EDIT, { recordingId: id })}\n hasVideoSource\n isDeleted={isDeleted}\n isLoading={isLoading}\n menuOptions={menuOptions}\n onClick={handleClickToTaggingTool}\n onDelete={handleConfirmDelete}\n recording={recording}\n title={\n <ListInfo>\n <LiveRecordingInfo />\n <ListItemTitle>\n <h2>{name}</h2>\n <CompetitionInfo type={type} competitionName={competitionName} t={t} />\n </ListItemTitle>\n </ListInfo>\n }\n >\n <div />\n <div className={stylesCard.recordingDate}>\n <DateInfo date={date} />\n <StartTime date={date} />\n </div>\n <div />\n </RecordingCard>\n );\n});\n\nLiveRecordingCard.displayName = 'LiveRecordingCard';\n\nexport default LiveRecordingCard;\n","export default \"__VITE_ASSET__D4WkaGxK__\"","import { Button } from '@mui/material';\nimport { useTranslation } from 'react-i18next';\n\nimport TacticsNotFoundImg from './assets/tactics-not-found.svg';\nimport styles from './NotFound.module.scss';\nimport RecordingCardLoading from '../../vod-recording-card/loading';\n\ninterface RecordingsListNotFoundProps {\n onNotFoundClick?: () => void;\n}\n\nconst NotFound = ({ onNotFoundClick }: RecordingsListNotFoundProps): JSX.Element => {\n const { t } = useTranslation();\n\n return (\n <div className={styles['recordings-list--not-found']}>\n <RecordingCardLoading isAnimated={false} />\n <RecordingCardLoading isAnimated={false} />\n <RecordingCardLoading isAnimated={false} />\n <RecordingCardLoading isAnimated={false} />\n <div className={styles['recordings-list__not-found-text']}>\n <img src={TacticsNotFoundImg} alt='' />\n <h5 className={styles['recordings-list__not-found-title']}>{t('recordings-list:not-found.header')}</h5>\n <p>{t('recordings-list:not-found.description')}</p>\n <Button\n variant='contained'\n onClick={() => {\n onNotFoundClick && onNotFoundClick();\n }}\n sx={{ mt: 1 }}\n >\n {t('recordings-list:not-found.try-another-combination')}\n </Button>\n </div>\n </div>\n );\n};\n\nexport default NotFound;\n","import { useTranslation } from 'react-i18next';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { specificRecordingUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\n\nexport const useDeleteRecording = (recordingId: string, onSuccess?: (recordingId: string) => void) => {\n const { t } = useTranslation();\n\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n type: HTTPMethod.DELETE,\n errorMessage: t('api:use-delete-recording.error'),\n successMessage: t('api:use-delete-recording.success'),\n onSuccess: async () => {\n onSuccess && onSuccess(recordingId);\n },\n });\n\n const deleteRecording = () => {\n mutate({ url: specificRecordingUrl(recordingId) });\n };\n\n return { deleteRecording, isLoading, isError, isSuccess };\n};\n","import classNames from 'classnames';\nimport { useTranslation } from 'react-i18next';\n\nimport IconAnalysis from 'shared/components/icons/icon-analysis';\nimport IconTime from 'shared/components/icons/icon-time';\nimport Spinner from 'shared/components/spinner';\nimport { useUser } from 'shared/contexts/app-state';\nimport { TacticalAnalysis, TacticalAnalysisStates } from 'shared/types/recording/types';\nimport { User, UserAuthority } from 'shared/types/user/types';\n\nimport styles from '../RecordingStates.module.scss';\n\ninterface Props {\n tacticalAnalysis: TacticalAnalysis | null;\n hidden: boolean;\n}\n\nconst getTacticalAnalysisStateIcon = (user: User, tacticalAnalysisState?: TacticalAnalysisStates) => {\n if (tacticalAnalysisState === TacticalAnalysisStates.VALIDATED) {\n return <IconAnalysis size='small' color='quaternary' />;\n }\n\n if (\n tacticalAnalysisState === TacticalAnalysisStates.FINISHED &&\n user.authorities.includes(UserAuthority.ROLE_ADMIN)\n ) {\n return <IconTime size='small' color='quaternary' />;\n }\n\n if (\n tacticalAnalysisState === TacticalAnalysisStates.STARTED ||\n (tacticalAnalysisState === TacticalAnalysisStates.FINISHED && !user.authorities.includes(UserAuthority.ROLE_ADMIN))\n ) {\n return <Spinner color='quaternary' size='small' />;\n }\n\n return <IconAnalysis size='small' color='disabled' />;\n};\n\nconst StateAnalysis = ({ tacticalAnalysis, hidden = false }: Props) => {\n const { t } = useTranslation();\n const user = useUser();\n\n return (\n <span className={classNames(tacticalAnalysis ? styles.active : styles.inactive)}>\n <div className={classNames(styles.stateBlock, { [styles.stateInfoHidden]: hidden })}>\n {getTacticalAnalysisStateIcon(user, tacticalAnalysis?.state)}\n <div>{t('recording:states.analysis')}</div>\n </div>\n </span>\n );\n};\n\nexport default StateAnalysis;\n","import classNames from 'classnames';\nimport { useTranslation } from 'react-i18next';\n\nimport IconCamera from 'shared/components/icons/icon-camera';\nimport Spinner from 'shared/components/spinner';\n\nimport styles from '../RecordingStates.module.scss';\n\ninterface Props {\n active: boolean;\n isProcessingVideo: boolean;\n}\n\nconst StateCamera = ({ active, isProcessingVideo }: Props) => {\n const { t } = useTranslation();\n return (\n <span className={classNames(styles.stateBlock, active && !isProcessingVideo ? styles.active : styles.inactive)}>\n {isProcessingVideo ? (\n <Spinner color='tertiary' size='small' />\n ) : (\n <IconCamera size='small' color={active ? 'tertiary' : 'disabled'} />\n )}\n <div>{t('recording:states.video')}</div>\n </span>\n );\n};\n\nexport default StateCamera;\n","import classNames from 'classnames';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconTag from 'shared/components/icons/icon-tag';\n\nimport styles from '../RecordingStates.module.scss';\n\ninterface Props {\n active: boolean;\n}\n\nconst StateTags = ({ active }: Props) => {\n const { t } = useTranslation();\n return (\n <span className={classNames(styles.stateBlock, active ? styles.active : styles.inactive)}>\n <IconTag size='small' color={active ? 'primary' : 'disabled'} />\n <div>{t('recording:states.tags')}</div>\n </span>\n );\n};\n\nexport default StateTags;\n","import { Grid } from '@mui/material';\n\nimport StateAnalysis from 'pages/recordings-list/components/vod-recording-card/recording-states/state-analysis';\nimport StateCamera from 'pages/recordings-list/components/vod-recording-card/recording-states/state-camera';\nimport StateTags from 'pages/recordings-list/components/vod-recording-card/recording-states/state-tags';\nimport styles from 'pages/recordings-list/components/vod-recording-card/RecordingCard.module.scss';\nimport { Recording, RecordingTypes } from 'shared/types/recording/types';\n\ninterface Props {\n hasVideoSource: boolean;\n recording: Recording;\n}\n\nconst gridItemStyles = {\n padding: '6px 12px !important',\n};\n\nconst StateInfo = ({ recording, hasVideoSource }: Props) => {\n return (\n <Grid container spacing={3} className={styles.states} wrap={'nowrap'} sx={{ marginTop: '0 !important' }}>\n <Grid item sx={gridItemStyles}>\n <StateCamera isProcessingVideo={recording.isProcessingVideo} active={hasVideoSource} />\n </Grid>\n <Grid item sx={gridItemStyles}>\n <StateAnalysis\n tacticalAnalysis={recording.tacticalAnalysis}\n hidden={recording.type === RecordingTypes.TRAINING}\n />\n </Grid>\n <Grid item sx={gridItemStyles}>\n <StateTags active={recording.hasTaggingEvents} />\n </Grid>\n </Grid>\n );\n};\n\nexport default StateInfo;\n","import { Grid } from '@mui/material';\nimport { TFunction } from 'react-i18next';\n\nimport { RecordingTypes } from 'shared/types/recording/types';\n\nimport styles from '../RecordingCard.module.scss';\n\ntype CompetitionInfoProps = {\n type?: RecordingTypes;\n competitionName?: string;\n t: TFunction<'translation'>;\n};\n\nconst CompetitionInfo = ({ type, competitionName, t }: CompetitionInfoProps) => {\n if (type === RecordingTypes.GAME && !competitionName) return null;\n\n return (\n <Grid item xs={12} sm={'auto'} className={styles.recordingCardTag}>\n {type === RecordingTypes.GAME && competitionName}\n {type === RecordingTypes.TRAINING && t('recordings-list:recording-card.training')}\n </Grid>\n );\n};\n\nexport default CompetitionInfo;\n","import { Grid } from '@mui/material';\n\nimport { useDates } from 'shared/hooks/use-dates';\n\nimport styles from '../RecordingCard.module.scss';\n\ntype DateInfoProps = {\n date: Date;\n};\n\nconst DateInfo = ({ date }: DateInfoProps) => {\n const { dateToString } = useDates();\n return (\n <Grid item xs={12} sm={'auto'} className={styles.recordingInfoDate}>\n {dateToString(date)}\n </Grid>\n );\n};\n\nexport default DateInfo;\n","import { Grid } from '@mui/material';\n\nimport { RecordingTypes } from 'shared/types/recording/types';\n\nimport styles from '../RecordingCard.module.scss';\n\ntype MatchDayInfoProps = {\n type?: RecordingTypes;\n matchDay?: string;\n};\n\nconst MatchDayInfo = ({ type, matchDay }: MatchDayInfoProps) => {\n if (type !== RecordingTypes.GAME || !matchDay) return null;\n\n return (\n <Grid item xs={12} sm={'auto'} className={styles.recordingCardTag}>\n {matchDay}\n </Grid>\n );\n};\n\nexport default MatchDayInfo;\n","import { Tooltip } from '@mui/material';\nimport classNames from 'classnames';\n\nimport IconShield from 'shared/components/icons/icon-shield';\n\nimport { RecordingTeam } from '../../../types';\nimport styles from '../RecordingCard.module.scss';\n\ntype ScoresInfoProps = {\n teams: RecordingTeam[];\n};\n\nconst ScoresInfo = ({ teams }: ScoresInfoProps) => {\n return (\n <>\n <div className={styles.shield}>\n <Tooltip title={teams[0]?.name ?? ''}>\n {!!teams[0].logo ? (\n <img\n className={classNames(styles['recording-card__score-logo'], styles['recording-card__score-logo--left'])}\n src={teams[0].logo}\n alt={teams[0].name}\n />\n ) : (\n <div className={styles.icon}>\n <IconShield size='small' color='secondary' />\n </div>\n )}\n </Tooltip>\n </div>\n <span className={styles['recording-card__score']}>\n <span\n className={classNames(styles['recording-card__score-number'], styles['recording-card__score-number--left'])}\n >\n {teams[0].score}\n </span>\n <span\n className={classNames(styles['recording-card__score-number'], styles['recording-card__score-number--right'])}\n >\n {teams[1].score}\n </span>\n </span>\n <div className={styles.shield}>\n <Tooltip title={teams[1]?.name ?? ''}>\n {!!teams[1].logo ? (\n <img\n className={classNames(styles['recording-card__score-logo'], styles['recording-card__score-logo--right'])}\n src={teams[1].logo}\n alt={teams[1].name}\n />\n ) : (\n <div className={styles.icon}>\n <IconShield size='small' />\n </div>\n )}\n </Tooltip>\n </div>\n </>\n );\n};\n\nexport default ScoresInfo;\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath, useHistory } from 'react-router-dom';\n\nimport { useDeleteRecording } from 'api/recording/useDeleteRecording';\nimport { routes } from 'kognia/router/routes';\nimport RecordingCard from 'pages/recordings-list/components/recording-card';\nimport StateInfo from 'pages/recordings-list/components/vod-recording-card/state-info';\nimport IconAnalysis from 'shared/components/icons/icon-analysis';\nimport IconBall from 'shared/components/icons/icon-ball';\nimport IconTag from 'shared/components/icons/icon-tag';\nimport { ListInfo } from 'shared/components/list/list-info';\nimport { ListItemTitle } from 'shared/components/list/list-item-title';\nimport useIsTaggingTool from 'shared/hooks/is-tagging-tool';\nimport { Recording, RecordingTypes, VideoSourceStates } from 'shared/types/recording/types';\n\nimport CompetitionInfo from './competition-info';\nimport DateInfo from './date-info';\nimport MatchDayInfo from './match-day-info';\nimport ScoresInfo from './scores-info';\nimport stylesCard from '../vod-recording-card/RecordingCard.module.scss';\n\ninterface Props {\n hideActions?: boolean;\n onDeleteSuccess?: (recordingId: string) => void;\n recording: Recording;\n}\n\nconst VODRecordingCard = React.memo(({ recording, hideActions = false, onDeleteSuccess }: Props) => {\n const history = useHistory();\n const { t } = useTranslation();\n\n const [isDeleted, setIsDeleted] = useState(false);\n const { deleteRecording, isError, isLoading } = useDeleteRecording(recording.id, onDeleteSuccess);\n\n const taggingToolPath = useMemo(\n () => generatePath(routes.TAGGING_TOOL_TAG, { recordingId: recording.id }),\n [recording.id],\n );\n\n const { id, type, name, teams, date, competitionName, matchDay } = recording;\n const isTaggingTool = useIsTaggingTool();\n const cardPath = useMemo(\n () =>\n isTaggingTool\n ? generatePath(routes.TAGGING_TOOL_TAG, { recordingId: id })\n : generatePath(routes.PERFORMANCE_REPORT_TIMELINE, { id }),\n [id, isTaggingTool],\n );\n\n const analysisPath = useMemo(() => generatePath(routes.PERFORMANCE_REPORT_TIMELINE, { id }), [id]);\n\n useEffect(() => {\n if (isError) {\n setIsDeleted(false);\n }\n }, [isError]);\n\n const handleConfirmDelete = () => {\n deleteRecording();\n setIsDeleted(true);\n };\n\n const hasVideoSource =\n recording.videoSourcesStates &&\n recording.videoSourcesStates.some((videoSourceState) => videoSourceState.state === VideoSourceStates.FINISHED);\n\n const handleLinkToTagging = useCallback(\n (event: React.MouseEvent<HTMLLIElement | HTMLDivElement, MouseEvent>) => {\n event && event.stopPropagation();\n history.push(taggingToolPath);\n },\n [history, taggingToolPath],\n );\n\n const handleLinkToAnalysis = useCallback(\n (event?: React.MouseEvent<HTMLLIElement | HTMLDivElement, MouseEvent>) => {\n if (!hasVideoSource) return false;\n event && event.stopPropagation();\n history.push(analysisPath);\n },\n [history, analysisPath, hasVideoSource],\n );\n\n const handleLinkToCardPath = useCallback(\n (event?: React.MouseEvent<HTMLLIElement | HTMLDivElement, MouseEvent>) => {\n if (!hasVideoSource) return false;\n event && event.stopPropagation();\n history.push(cardPath);\n },\n [cardPath, history, hasVideoSource],\n );\n\n const extraMenuOptions = useMemo(() => {\n if (!hasVideoSource) return [];\n\n return [\n {\n displayText: '',\n },\n {\n displayText: t('recording:actions.add-tags'),\n icon: <IconTag size='small' color='secondary' />,\n onClick: handleLinkToTagging,\n },\n {\n displayText: t('recording:actions.view-analysis'),\n icon: <IconAnalysis size='small' color='secondary' />,\n onClick: handleLinkToAnalysis,\n },\n ];\n }, [t, hasVideoSource, handleLinkToAnalysis, handleLinkToTagging]);\n\n return (\n <RecordingCard\n editPath={generatePath(routes.RECORDING_EDIT, { id })}\n hasVideoSource={hasVideoSource}\n hideActions={hideActions}\n isDeleted={isDeleted}\n isLoading={isLoading}\n menuOptions={extraMenuOptions}\n onClick={handleLinkToCardPath}\n onDelete={handleConfirmDelete}\n recording={recording}\n title={\n <ListInfo>\n {type === RecordingTypes.GAME && !!teams.length ? (\n <div className={stylesCard.recordingScore}>\n <ScoresInfo teams={teams} />\n </div>\n ) : (\n <div className={stylesCard.recordingIcon}>\n <IconBall />\n </div>\n )}\n <ListItemTitle>\n <h2>{name}</h2>\n {type !== RecordingTypes.TRAINING ? (\n <CompetitionInfo type={type} competitionName={competitionName} t={t} />\n ) : (\n <div />\n )}\n </ListItemTitle>\n </ListInfo>\n }\n >\n <div />\n <div>\n <DateInfo date={date} />\n <MatchDayInfo type={type} matchDay={matchDay} />\n </div>\n <div className={stylesCard.recordingState}>\n <StateInfo hasVideoSource={hasVideoSource} recording={recording} />\n </div>\n </RecordingCard>\n );\n});\n\nVODRecordingCard.displayName = 'VODRecordingCard';\n\nexport default VODRecordingCard;\n","import { Box, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React, { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport LiveRecordingCard from 'pages/recordings-list/components/live-recording-card';\nimport { List } from 'shared/components/list';\nimport { ListContainer } from 'shared/components/list/list-container';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport { Recording, RecordingsGroup } from 'shared/types/recording/types';\n\nimport LoadingView from './loading';\nimport NotFoundView from './not-found';\nimport styles from './RecordingsList.module.scss';\nimport { RecordingsListItemDetails } from '../recordings-list-item-details';\nimport VODRecordingCard from '../vod-recording-card';\n\nexport interface RecordingsListProps {\n isLoading?: boolean;\n recordings: Recording[];\n onDeleteSuccess?: (recordingId: string) => void;\n}\n\nexport const groupRecordingsByMatchDay = (recordings: Recording[]) => {\n let currentCompetition = '';\n let currentIndex = -1;\n return recordings.reduce((acc, recording) => {\n if (currentCompetition !== recording.matchDay || currentIndex === -1) {\n currentCompetition = recording.matchDay ?? '';\n currentIndex++;\n acc.push({ matchDay: recording.matchDay ?? '', recordings: [] });\n }\n\n acc[currentIndex].recordings.push(recording);\n return acc;\n }, [] as RecordingsGroup[]);\n};\n\nconst RecordingsList = ({ isLoading, recordings, onDeleteSuccess }: RecordingsListProps) => {\n const { t } = useTranslation();\n\n const groupedRecordings = useMemo(() => groupRecordingsByMatchDay(recordings), [recordings]);\n\n if (isLoading) {\n return <LoadingView />;\n }\n\n if (!recordings.length) {\n return <NotFoundView />;\n }\n\n return (\n <ListContainer>\n <ListHeader className={styles.recordingHeader}>\n <div>{t('recording:headers.title')}</div>\n <RecordingsListItemDetails>\n <div />\n <div>{t('recording:headers.event')}</div>\n <div>{t('recording:headers.status')}</div>\n <div />\n </RecordingsListItemDetails>\n </ListHeader>\n <List disablePadding>\n {groupedRecordings.map(({ matchDay, recordings }, idx) => {\n return (\n <Box key={`${matchDay}-${idx}`} component={'li'}>\n <Box sx={{ display: 'flex', marginBottom: 1, marginTop: 2, minHeight: '16px' }}>\n <Box>\n <Typography sx={{ fontSize: '12px', lineHeight: '16px', color: Colors.storm }}>{matchDay}</Typography>\n </Box>\n <Box sx={{ position: 'relative', flexGrow: 1, marginLeft: matchDay ? 2 : 0 }}>\n <Box\n sx={{\n position: 'absolute',\n height: '1px',\n content: '\"\"',\n left: 0,\n right: 0,\n width: '100%',\n background: Colors.iron,\n top: '50%',\n }}\n ></Box>\n </Box>\n </Box>\n <Box>\n {recordings.map((recording) => (\n <Box key={recording.id} sx={{ marginTop: 1, marginBottom: 1 }}>\n {recording.isLive ? (\n <LiveRecordingCard onDeleteSuccess={onDeleteSuccess} recording={recording} />\n ) : (\n <VODRecordingCard onDeleteSuccess={onDeleteSuccess} recording={recording} />\n )}\n </Box>\n ))}\n </Box>\n </Box>\n );\n })}\n </List>\n </ListContainer>\n );\n};\n\nexport default RecordingsList;\n","import React, { useCallback } from 'react';\n\nimport { queryClient } from 'api/config';\nimport { generateFetchRecordingsQueryRef, useRecordingsListFilters } from 'api/recording/useFetchRecordings';\nimport RecordingsList from 'pages/recordings-list/components/recordings-list';\nimport { useClientId } from 'shared/contexts/app-state';\nimport { Recording } from 'shared/types/recording/types';\n\ninterface Props {\n isLoading: boolean;\n recordings?: Array<Recording>;\n}\n\nexport const RecordingListWithFilters = ({ recordings, isLoading }: Props) => {\n const { clientId } = useClientId();\n const filters = useRecordingsListFilters();\n\n const handleOnDeleteSuccess = useCallback(\n async (recordingId: string) => {\n const fetchQueryRef = generateFetchRecordingsQueryRef(clientId);\n queryClient.setQueryData([fetchQueryRef, filters], (data: any) => ({\n pages: data.pages.map((page: any) => ({\n ...page,\n data: {\n ...page.data,\n recordings: page.data.recordings.filter((recording: any) => recording.id !== recordingId),\n },\n })),\n pageParams: data.pageParams,\n }));\n\n await queryClient.invalidateQueries([fetchQueryRef, filters]);\n },\n [filters, clientId],\n );\n\n return (\n <RecordingsList\n onDeleteSuccess={handleOnDeleteSuccess}\n isLoading={isLoading}\n recordings={recordings ? recordings : []}\n />\n );\n};\n","import { VITE_REACT_APP_RELEASE_VERSION } from '../env-variables';\n\nconst PRODUCTION_HOST = 'app.kogniasports.com';\nconst STAGING_HOST = 'dev.app.kogniasports.com';\nconst PREVIEW_HOST = /([a-z0-9][a-z0-9-]+[a-z0-9]\\.app.kogniasports\\.com)/gi;\n\nexport enum Environments {\n Production = 'production',\n Staging = 'staging',\n Preview = 'preview',\n Unknown = 'unknown',\n}\n\nexport const getEnvironment = (hostname = window.location.hostname): Environments => {\n if (hostname === PRODUCTION_HOST) return Environments.Production;\n if (hostname === STAGING_HOST) return Environments.Staging;\n if (hostname.match(PREVIEW_HOST) !== null) return Environments.Preview;\n\n return Environments.Unknown;\n};\n\nexport const getReleaseVersion = (): string => {\n return VITE_REACT_APP_RELEASE_VERSION ?? 'unknown';\n};\n","import { Environments, getEnvironment } from '../../shared/utils/environment';\n\nexport const APP_COLLECT_METRICS = getEnvironment() !== Environments.Unknown;\n","import { PushEventOptions } from '@grafana/faro-core/dist/types/api/events/types';\nimport { EventAttributes, faro } from '@grafana/faro-web-sdk';\nimport { useCallback } from 'react';\n\nimport { MetricsNames } from 'shared/types/metrics';\n\nimport { APP_COLLECT_METRICS } from '../../utils';\n\nexport const useMetrics = () => {\n const pushEvent = useCallback(\n <K extends EventAttributes>(\n name: MetricsNames,\n attributes?: K,\n domain?: string,\n options?: PushEventOptions,\n ): ReturnType<typeof faro.api.pushEvent> => {\n if (!APP_COLLECT_METRICS) return;\n\n return faro.api.pushEvent(name, attributes, domain, options);\n },\n [],\n );\n\n return {\n pushEvent,\n };\n};\n","import { Stack } from '@mui/material';\nimport countBy from 'lodash/countBy';\nimport filter from 'lodash/filter';\nimport map from 'lodash/map';\nimport { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useMetrics } from 'kognia/metrics/hooks/use-metrics';\nimport { RecordingFilters } from 'pages/recordings-list/types';\nimport { FilterLabel } from 'shared/components/filter-label';\nimport Filter, { FilterOption } from 'shared/components/filter-v2';\nimport CheckBoxMenu from 'shared/components/filter-v2-menu/checkbox';\nimport IconStrawberry from 'shared/components/icons/icon-strawberry';\nimport { FilterOptions, FiltersList } from 'shared/types';\nimport { MetricsData, MetricsNames } from 'shared/types/metrics';\n\nimport { ApplyFilterPayloadType } from '../hooks/useRecordingsFilters/reducer';\n\ntype FilterDropdownsProps = {\n applyFilters: (payload: ApplyFilterPayloadType) => void;\n filtersList: FiltersList;\n};\n\nconst Filters = ({ applyFilters, filtersList }: FilterDropdownsProps): JSX.Element => {\n const { t } = useTranslation();\n const [openFilter, setOpenFilter] = useState<string>();\n const { pushEvent } = useMetrics();\n\n const mapFilterOptions = useCallback(\n (filterKey: string, options: FilterOptions): FilterOption[] => {\n const mappedOptions = [];\n for (const [key, value] of Object.entries(options)) {\n if (filterKey === RecordingFilters.TYPE) {\n mappedOptions.push({\n id: key,\n isSelected: value.isApplied,\n title: t(`filters:${key}`),\n } as FilterOption);\n } else {\n mappedOptions.push({ id: key, isSelected: value.isApplied, title: value.title } as FilterOption);\n }\n }\n\n if (filterKey === RecordingFilters.TEAM) {\n mappedOptions.sort((a: FilterOption, b: FilterOption) =>\n a.title.toLowerCase() > b.title.toLowerCase() ? 1 : -1,\n );\n }\n return mappedOptions;\n },\n [t],\n );\n\n const handleOpenFilter = useCallback(\n (key: string) => {\n pushEvent<MetricsData[MetricsNames.RECORDINGS_OPEN_FILTER]>(MetricsNames.RECORDINGS_OPEN_FILTER, {\n filter_name: key,\n });\n return setOpenFilter(key);\n },\n [pushEvent],\n );\n\n const handleSubmit = useCallback(\n (key: string, filterOptions: FilterOption[]) => {\n const selectedOptions = filter(filterOptions, (option) => option.isSelected).map((option) => option.id);\n pushEvent<MetricsData[MetricsNames.RECORDINGS_APPLY_FILTER]>(MetricsNames.RECORDINGS_APPLY_FILTER, {\n filter_name: key,\n });\n setOpenFilter(undefined);\n applyFilters({ key: key, selectedFilters: selectedOptions });\n },\n [applyFilters, pushEvent],\n );\n\n return (\n <Stack direction={'row'} gap={2} justifyContent={'flex-end'}>\n <FilterLabel>\n <IconStrawberry size='small' />\n {t('filters:title')}\n </FilterLabel>\n {map(filtersList, (filter, key) => {\n const mappedOptions = mapFilterOptions(key, filter.options);\n const hasSelectedOptions = countBy(mappedOptions, (option) => option.isSelected).true > 0;\n return (\n <Filter\n key={key}\n isOpen={key === openFilter}\n onClickOpen={() => handleOpenFilter(key)}\n onClose={() => setOpenFilter(undefined)}\n displayName={t(`filters:${key}`)}\n hasSelectedOptions={hasSelectedOptions}\n >\n <CheckBoxMenu\n initialOptions={mappedOptions}\n submitOptions={(options: FilterOption[]) => handleSubmit(key, options)}\n />\n </Filter>\n );\n })}\n </Stack>\n );\n};\n\nexport default Filters;\n","import { Box, Tab, Tabs } from '@mui/material';\nimport pickBy from 'lodash/pickBy';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { getFiltersFromUrl } from 'api/recording/useFetchRecordings/util/get-initial-filters';\nimport { FiltersList } from 'shared/types/filters/types';\n\nimport { TabType } from '../../../RecordingsListPageContainer';\nimport { RecordingFilters } from '../../../types';\nimport Filters from '../filters-bar/filters';\nimport { ApplyFilterPayloadType } from '../filters-bar/hooks/useRecordingsFilters/reducer';\n\ninterface Props {\n appliedFilters: FiltersList;\n applyFilters: (payload: ApplyFilterPayloadType) => void;\n competitionsTabs: TabType[];\n filters: FiltersList;\n removeFilter: (payload: string) => void;\n}\n\nexport const selectInitialCompetitionIndex = (competitionsTabs: TabType[]) => {\n const urlFilters = getFiltersFromUrl();\n if (urlFilters.competition) {\n const competitionTabIndex = competitionsTabs.findIndex(\n (competitionsTab) => competitionsTab.value[0] === urlFilters.competition,\n );\n\n if (competitionTabIndex >= 0) return competitionTabIndex;\n }\n\n if (competitionsTabs.length === 1) {\n return 0;\n }\n\n return 0;\n};\n\nexport const RecordingTypesTabsAndFilters = ({\n appliedFilters,\n applyFilters,\n competitionsTabs,\n filters,\n removeFilter,\n}: Props) => {\n const [tab, setTab] = useState<number>(selectInitialCompetitionIndex(competitionsTabs));\n\n const selectedCompetition = useMemo(() => competitionsTabs[tab], [tab, competitionsTabs]);\n\n const generateFiltersList = useCallback(\n () =>\n pickBy(!appliedFilters ? filters : appliedFilters, (_filter, key) => {\n if (selectedCompetition.type === RecordingFilters.TYPE) {\n return key === RecordingFilters.DATE;\n }\n\n return (\n key !== RecordingFilters.ANNOTATION_TYPE &&\n key !== RecordingFilters.COMPETITION &&\n key !== RecordingFilters.TYPE\n );\n }),\n [filters, selectedCompetition, appliedFilters],\n );\n\n const handleTabChange = useCallback(\n (event: React.SyntheticEvent, newValue: number) => {\n setTab(newValue);\n const selectedTab = competitionsTabs[newValue];\n\n if (selectedTab.type === RecordingFilters.TYPE) {\n removeFilter(RecordingFilters.COMPETITION);\n }\n\n if (selectedTab.type === RecordingFilters.COMPETITION) {\n removeFilter(RecordingFilters.TYPE);\n }\n\n removeFilter(RecordingFilters.DATE);\n removeFilter(RecordingFilters.MATCHDAY);\n removeFilter(RecordingFilters.COMPETITION);\n removeFilter(RecordingFilters.TEAM);\n\n applyFilters({ key: selectedTab.type, selectedFilters: selectedTab.value });\n },\n [competitionsTabs, applyFilters, removeFilter],\n );\n\n return (\n <>\n <Box>\n <Tabs\n value={tab}\n variant='scrollable'\n onChange={handleTabChange}\n sx={{\n marginTop: 4,\n marginBottom: 4,\n borderBottom: '1px solid #CECED9',\n }}\n scrollButtons\n aria-label='scrollable tabs'\n >\n {competitionsTabs.map((type, idx) => (\n <Tab sx={{ textTransform: 'none' }} key={type.label} label={type.label} value={idx} />\n ))}\n </Tabs>\n </Box>\n <Filters applyFilters={applyFilters} filtersList={generateFiltersList()} />\n </>\n );\n};\n","import { Box } from '@mui/material';\nimport isEmpty from 'lodash/isEmpty';\nimport reduce from 'lodash/reduce';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useRecordings } from 'api/recording/useFetchRecordings';\nimport Container from 'shared/components/container';\nimport Pagination from 'shared/components/pagination';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { FiltersList } from 'shared/types/filters/types';\n\nimport AnnotationTypeFilter from './filters-bar/annotation-type-filter';\nimport useRecordingsFilters from './filters-bar/hooks/useRecordingsFilters';\nimport { RecordingListWithFilters } from './recording-list-with-filters';\nimport { RecordingTypesTabsAndFilters, selectInitialCompetitionIndex } from './recording-types-tabs-and-filters';\nimport styles from './RecordingsListPage.module.scss';\nimport { getFiltersFromUrl } from '../../../../api/recording/useFetchRecordings/util/get-initial-filters';\nimport { TabType } from '../../RecordingsListPageContainer';\nimport { RecordingFilters } from '../../types';\n\ninterface Options {\n [RecordingFilters.ANNOTATION_TYPE]: string[];\n [RecordingFilters.COMPETITION]: string[];\n [RecordingFilters.DATE]: string[];\n [RecordingFilters.MATCHDAY]: string[];\n [RecordingFilters.TEAM]: string[];\n [RecordingFilters.TYPE]: string[];\n}\n\nexport const generateAppliedFilters = (options: Options, recordingsFilters: FiltersList): FiltersList => {\n const customRecordingFilters = { ...recordingsFilters };\n Object.keys(options).forEach((recordingFilter) => {\n customRecordingFilters[recordingFilter] = {\n ...customRecordingFilters[recordingFilter],\n options: reduce(\n customRecordingFilters[recordingFilter].options,\n (acc, option, key) => {\n const isApplied =\n Array.isArray(options[recordingFilter as RecordingFilters]) &&\n options[recordingFilter as RecordingFilters].includes(key);\n return {\n ...acc,\n [key]: { ...option, isApplied },\n };\n },\n {},\n ),\n };\n });\n\n return customRecordingFilters;\n};\n\ninterface Props {\n defaultFilters: FiltersList;\n competitionsTabs: TabType[];\n}\n\n// TODO get the rest of the filters for initial call\nconst generateInitialFilters = (competitionsTabs: TabType[]): FiltersList => {\n const initialFilters = getFiltersFromUrl();\n const initialCompetition = selectInitialCompetitionIndex(competitionsTabs);\n\n // Get initial competition\n const competition = initialFilters.competition\n ? initialFilters.competition\n : competitionsTabs[initialCompetition]?.value[0];\n\n return competition\n ? {\n [RecordingFilters.COMPETITION]: {\n title: RecordingFilters.COMPETITION,\n options: {\n [competition]: {\n isApplied: true,\n title: competition,\n },\n },\n },\n }\n : {};\n};\n\nexport const RecordingsListPage = ({ defaultFilters, competitionsTabs }: Props): JSX.Element | null => {\n const { t } = useTranslation();\n const [filters, setFilters] = useState<FiltersList>({});\n\n const {\n data,\n totalElements,\n setRecordingsFilters,\n recordingsFilters,\n fetchNextPage,\n isFetching,\n isFetchingNextPage,\n RecordingsStateContext,\n } = useRecordings({ initialFilters: generateInitialFilters(competitionsTabs) });\n\n const { filtersApplied, applyFilters, removeFilter } = useRecordingsFilters(recordingsFilters);\n\n const handleSetRecordingsFilters = useCallback(\n (options: Options, recordingsFilters: FiltersList) => {\n const customRecordingFilters = generateAppliedFilters(options, recordingsFilters);\n\n setRecordingsFilters(customRecordingFilters);\n },\n [setRecordingsFilters],\n );\n\n useEffect(() => {\n if (isEmpty(filters) && !isEmpty(recordingsFilters)) {\n setFilters(recordingsFilters);\n }\n }, [filters, recordingsFilters]);\n\n useEffect(() => {\n if (!isEmpty(defaultFilters) && !isEmpty(filtersApplied)) {\n handleSetRecordingsFilters(\n {\n [RecordingFilters.ANNOTATION_TYPE]: filtersApplied[RecordingFilters.ANNOTATION_TYPE],\n [RecordingFilters.COMPETITION]: filtersApplied[RecordingFilters.COMPETITION],\n [RecordingFilters.DATE]: filtersApplied[RecordingFilters.DATE],\n [RecordingFilters.MATCHDAY]: filtersApplied[RecordingFilters.MATCHDAY],\n [RecordingFilters.TEAM]: filtersApplied[RecordingFilters.TEAM],\n [RecordingFilters.TYPE]: filtersApplied[RecordingFilters.TYPE],\n },\n defaultFilters,\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filtersApplied]);\n\n return (\n <SidebarLayout>\n <Container>\n <div className={styles['recordings-list-page']}>\n <div className={styles['container recordings-list-page__content']}>\n <Box sx={{ minHeight: 165 }}>\n <Box sx={{ marginBottom: 3 }}>\n <AnnotationTypeFilter\n annotationFilter={\n isEmpty(recordingsFilters[RecordingFilters.ANNOTATION_TYPE])\n ? defaultFilters[RecordingFilters.ANNOTATION_TYPE]\n : recordingsFilters[RecordingFilters.ANNOTATION_TYPE]\n }\n applyFilters={applyFilters}\n />\n\n {competitionsTabs.length > 0 && (\n <RecordingTypesTabsAndFilters\n appliedFilters={recordingsFilters}\n applyFilters={applyFilters}\n competitionsTabs={competitionsTabs}\n filters={defaultFilters}\n removeFilter={removeFilter}\n />\n )}\n </Box>\n </Box>\n <RecordingsStateContext>\n <RecordingListWithFilters isLoading={data.length === 0 && isFetching} recordings={data} />\n </RecordingsStateContext>\n {data.length ? (\n <Pagination\n total={totalElements}\n displayed={data.length}\n getStatsText={(displayed, total) =>\n t('recordings-list:pagination.total', { displayed, total, count: total })\n }\n onShowMore={fetchNextPage}\n loading={isFetchingNextPage || Boolean(data.length && isFetching)}\n />\n ) : null}\n </div>\n </div>\n </Container>\n </SidebarLayout>\n );\n};\n","import isEmpty from 'lodash/isEmpty';\nimport React, { useEffect, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useRecordings } from 'api/recording/useFetchRecordings';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\n\nimport { RecordingListPageSkeleton } from './components/recording-list-page-skeleton';\nimport { RecordingsListPage } from './components/recordings-list-page';\nimport { RecordingFilters } from './types';\n\nexport interface TabType {\n label: string;\n value: string[];\n type: RecordingFilters;\n}\n\nconst COMPETITION_PRIORITY: { [key in string]: number } = {\n 'LaLiga 2023-24': 0,\n 'UEFA Champions League 2023-24': 1,\n 'UEFA Youth League 23-24': 2,\n 'LaLiga 2022-23': 3,\n 'LaLiga 2021-22': 4,\n 'LaLiga 2 2022-23': 5,\n 'LaLiga 2 2021-22': 6,\n 'Serie A 2023-24': 7,\n 'Allsvenskan 2023': 8,\n 'Saudi Pro League 2023-24': 9,\n 'Saudi Arabian Super Cup 2023-24': 10,\n};\n\nconst sortTabsTypesByPriority = (a: TabType, b: TabType) => {\n const first = a.label in COMPETITION_PRIORITY ? COMPETITION_PRIORITY[a.label] : Number.MAX_SAFE_INTEGER;\n const second = b.label in COMPETITION_PRIORITY ? COMPETITION_PRIORITY[b.label] : Number.MAX_SAFE_INTEGER;\n\n let result = 0;\n if (first < second) result = -1;\n else if (first > second) result = 1;\n return result;\n};\n\nconst RecordingsListPageContainer = (): JSX.Element | null => {\n const { t } = useTranslation();\n const { filters, isSuccess, isLoading } = useRecordings({ extraKey: 'only-filters' });\n const branding = useBranding();\n\n useEffect(() => {\n document.title = t('common:metas.title.recordings', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n const competitionsTabs: TabType[] = useMemo(\n () =>\n (filters?.competition?.options &&\n Object.keys(filters?.competition?.options)\n .filter((item) => !isEmpty(item))\n .map((item) => ({\n label: item,\n value: [item],\n type: RecordingFilters.COMPETITION,\n }))\n .sort(sortTabsTypesByPriority)) ||\n ([] as TabType[]),\n [filters],\n );\n\n if (isLoading) {\n return <RecordingListPageSkeleton />;\n }\n\n if (isSuccess) {\n return <RecordingsListPage competitionsTabs={competitionsTabs} defaultFilters={filters} />;\n }\n\n return null;\n};\n\nexport default React.memo(RecordingsListPageContainer);\n","export enum TypeOfPlaySource {\n Individual = 'INDIVIDUAL',\n Collective = 'COLLECTIVE',\n}\n\nexport enum TypeOfPlay {\n Offense = 'OFFENSE',\n Defense = 'DEFENSE',\n Transition = 'TRANSITION',\n GameEvent = 'GAME_EVENT',\n imported = 'imported',\n}\n","import filter from 'lodash/filter';\n\nimport { TaggingEvent } from 'api/tagging-tool/types';\nimport { GroupedTags } from 'shared/types/tagging-events/types';\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nexport const groupTagsByType = (tags: TaggingEvent[]): GroupedTags => {\n const groupedTagData = {} as GroupedTags;\n Object.values(TypeOfPlay).forEach((tagType) => {\n const filteredTags = filter(tags, (t) => t.typeOfPlay === tagType);\n\n if (filteredTags.length > 0) {\n groupedTagData[tagType as TypeOfPlay] = filteredTags;\n }\n });\n return groupedTagData;\n};\n","import { Box, styled } from '@mui/material';\n\nexport const ResizeBarWrapper = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isDragging' && prop !== 'isHorizontal',\n})<{ isDragging: boolean; isHorizontal: boolean }>(({ theme, isDragging, isHorizontal }) => ({\n position: 'relative',\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(0.5),\n height: '12px',\n width: '100%',\n background: theme.palette.common.white,\n borderStyle: 'solid',\n borderWidth: '1px 0',\n borderColor: theme.palette.secondary.light,\n transition: theme.transitions.create('all', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.shorter,\n }),\n userSelect: 'none',\n cursor: 'row-resize',\n\n '&:hover, &:active': {\n borderColor: theme.palette.secondary.main,\n '& > div': {\n background: theme.palette.secondary.main,\n },\n },\n\n '& > div': {\n height: '4px',\n width: '4px',\n minWidth: '4px',\n background: theme.palette.secondary.light,\n borderRadius: '50%',\n },\n\n ...(isHorizontal && {\n height: '100%',\n width: '12px',\n minWidth: '12px',\n borderWidth: '0 1px',\n flexDirection: 'column',\n cursor: 'col-resize',\n }),\n\n ...(isDragging && {\n borderColor: theme.palette.secondary.main,\n '&:hover, &:active': {\n '& > div': {\n background: theme.palette.text.primary,\n },\n },\n }),\n}));\n","export const applyResizeLimits = (\n mainPanelSize: number,\n secondaryPanelSize: number,\n mainPanelMinSize: number,\n secondaryPanelMinSize: number,\n) => {\n const isMainPanelSizeValid = mainPanelSize > mainPanelMinSize;\n const isSecondaryPanelSizeValid = secondaryPanelSize >= secondaryPanelMinSize;\n\n if (!isSecondaryPanelSizeValid && isMainPanelSizeValid) {\n return mainPanelSize - (secondaryPanelMinSize - secondaryPanelSize);\n }\n\n if (isMainPanelSizeValid) {\n return mainPanelSize;\n }\n\n return mainPanelMinSize;\n};\n","import { MouseEvent } from 'react';\n\nimport { applyResizeLimits } from './apply-resize-limits';\nimport { ResizeInterface } from '../types';\n\nconst resizer: ResizeInterface<MouseEvent> = (\n event,\n mainPanelElement,\n secondaryPanelElement,\n mainPanelMinSize,\n secondaryPanelMinSize,\n direction,\n callBack,\n start,\n end,\n) => {\n const directionChangeProperty = direction === 'horizontal' ? 'screenX' : 'pageY';\n const updateProperty = direction === 'horizontal' ? 'width' : 'height';\n\n const previousPosition = event[directionChangeProperty];\n const mainPanel = mainPanelElement.getBoundingClientRect();\n const secondaryPanel = secondaryPanelElement.getBoundingClientRect();\n start();\n\n function mousemove(event: globalThis.MouseEvent) {\n const newPosition = previousPosition - event[directionChangeProperty];\n\n mainPanelElement.style[updateProperty] =\n applyResizeLimits(\n mainPanel[updateProperty] - (direction === 'vertical' ? -newPosition : newPosition),\n secondaryPanel[updateProperty] + (direction === 'vertical' ? -newPosition : newPosition),\n mainPanelMinSize,\n secondaryPanelMinSize,\n ) + 'px';\n }\n\n function mouseup() {\n end();\n const values = mainPanelElement.getBoundingClientRect();\n callBack(values[updateProperty]);\n\n window.removeEventListener('mousemove', mousemove);\n window.removeEventListener('mouseup', mouseup);\n window.removeEventListener('resize', mouseup);\n }\n\n window.addEventListener('mousemove', mousemove);\n window.addEventListener('mouseup', mouseup);\n window.addEventListener('resize', mouseup);\n};\n\nexport default resizer;\n","import React from 'react';\n\nimport { applyResizeLimits } from './apply-resize-limits';\nimport { ResizeInterface } from '../types';\n\nconst resizerTouch: ResizeInterface<React.TouchEvent<HTMLDivElement>> = (\n e,\n mainPanelElement,\n secondaryPanelElement,\n mainPanelMinSize,\n secondaryPanelMinSize,\n direction,\n callBack,\n start,\n end,\n) => {\n const directionChangeValue = direction === 'horizontal' ? 'pageX' : 'pageY';\n const updateProperty = direction === 'horizontal' ? 'width' : 'height';\n\n const previousPosition = e.changedTouches[0][directionChangeValue];\n const mainPanel = mainPanelElement.getBoundingClientRect();\n const secondaryPanel = secondaryPanelElement.getBoundingClientRect();\n start();\n\n function touchmove(e: TouchEvent) {\n const newPosition =\n previousPosition - e.changedTouches[0][directionChangeValue] * (direction === 'horizontal' ? 1 : -1);\n\n mainPanelElement.style[updateProperty] =\n applyResizeLimits(\n mainPanel[updateProperty] - (direction === 'vertical' ? -newPosition : newPosition),\n secondaryPanel[updateProperty] + (direction === 'vertical' ? -newPosition : newPosition),\n mainPanelMinSize,\n secondaryPanelMinSize,\n ) + 'px';\n }\n\n function touchend() {\n end();\n const values = mainPanelElement.getBoundingClientRect();\n callBack(values[updateProperty]);\n\n window.removeEventListener('touchmove', touchmove);\n window.removeEventListener('touchend', touchend);\n window.removeEventListener('resize', touchend);\n }\n\n window.addEventListener('touchmove', touchmove);\n window.addEventListener('touchend', touchend);\n window.addEventListener('resize', touchend);\n};\n\nexport default resizerTouch;\n","import React, { PropsWithChildren, RefObject, useCallback, useEffect, useState } from 'react';\n\nimport { ResizeBarWrapper } from './ResizeBar.styled';\nimport { applyResizeLimits } from './utils/apply-resize-limits';\nimport resizer from './utils/resizer';\nimport resizerTouch from './utils/resizer-touch';\n\nexport type ResizeDirection = 'horizontal' | 'vertical';\n\ninterface Props {\n mainPanelElement: RefObject<HTMLDivElement>;\n secondaryPanelElement: RefObject<HTMLDivElement>;\n mainPanelMinSize: number;\n secondaryPanelMinSize: number;\n direction: ResizeDirection;\n onChange: (value: number) => void;\n}\n\ninterface BarProps extends React.HTMLAttributes<HTMLDivElement> {\n isDragging: boolean;\n direction: 'vertical' | 'horizontal';\n}\n\nconst Bar = ({ children, direction, isDragging, ...props }: PropsWithChildren<BarProps>) => (\n <ResizeBarWrapper isDragging={isDragging} isHorizontal={direction === 'horizontal'} {...props}>\n {children}\n </ResizeBarWrapper>\n);\n\nconst ResizeBar = ({\n mainPanelElement,\n secondaryPanelElement,\n mainPanelMinSize,\n secondaryPanelMinSize,\n direction,\n onChange,\n}: Props) => {\n const [isDragging, setIsDragging] = useState(false);\n\n const handleResize = useCallback(\n (value: number) => {\n onChange(value);\n },\n [onChange],\n );\n\n const handleScreenResize = useCallback(() => {\n if (!mainPanelElement.current || !secondaryPanelElement.current) return;\n\n const updateProperty = direction === 'horizontal' ? 'width' : 'height';\n\n const mainPanel = mainPanelElement.current.getBoundingClientRect();\n const secondaryPanel = secondaryPanelElement.current.getBoundingClientRect();\n const changeValue = applyResizeLimits(\n mainPanel[updateProperty],\n secondaryPanel[updateProperty],\n mainPanelMinSize,\n secondaryPanelMinSize,\n );\n\n handleResize(changeValue);\n\n mainPanelElement.current.style[updateProperty] = changeValue + 'px';\n }, [direction, handleResize, mainPanelElement, mainPanelMinSize, secondaryPanelElement, secondaryPanelMinSize]);\n\n useEffect(() => {\n window.addEventListener('resize', handleScreenResize);\n\n return () => window.removeEventListener('resize', handleScreenResize);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleStartDrag = useCallback(() => {\n setIsDragging(true);\n }, []);\n\n const handleEndDrag = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n return (\n <Bar\n direction={direction}\n isDragging={isDragging}\n onMouseDown={(e) =>\n resizer(\n e,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n mainPanelElement.current,\n secondaryPanelElement.current,\n mainPanelMinSize,\n secondaryPanelMinSize,\n direction,\n handleResize,\n handleStartDrag,\n handleEndDrag,\n )\n }\n onTouchStart={(e) =>\n resizerTouch(\n e,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n mainPanelElement.current,\n secondaryPanelElement.current,\n mainPanelMinSize,\n secondaryPanelMinSize,\n direction,\n handleResize,\n handleStartDrag,\n handleEndDrag,\n )\n }\n >\n <div />\n <div />\n <div />\n <div />\n </Bar>\n );\n};\n\nexport default ResizeBar;\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const TacticalAnalysisContainer = styled(Box)({\n backgroundColor: Colors.background,\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n overflow: 'hidden',\n width: '100%',\n position: 'relative',\n height: '100%',\n});\n\nexport const TacticalAnalysisVideoContainer = styled(Box)({\n alignItems: 'flex-start',\n backgroundColor: Colors.shark,\n display: 'flex',\n flex: 1,\n justifyContent: 'center',\n overflow: 'hidden',\n});\n\ntype TacticalAnalysisTimelineContainerProps = {\n height: number;\n};\n\nexport const TacticalAnalysisTimelineContainer = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'height',\n})<TacticalAnalysisTimelineContainerProps>(({ height }) => ({\n height: `${height}px`,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n position: 'relative',\n}));\n","import { MatchSegmentTypes } from 'shared/types/segment/types';\n\nimport { Clip, ClipType } from '../types/clip';\nimport { TimelineTableBlock } from '../types/timeline';\n\nconst generateNoEffectiveTimeClip = (\n id: string,\n rowId: string,\n startTime: number,\n endTime: number,\n title = '',\n idx = 0,\n): Clip => {\n return {\n id: `${id}-not-effective-time-${idx}`,\n type: 'not-effective-time',\n startTime,\n endTime,\n rowId,\n title,\n elementId: '',\n clips: [],\n };\n};\n\ntype Options = {\n timelineTableBlocks: TimelineTableBlock[];\n clipType: ClipType;\n rowId: string;\n clipIdPrefix?: string;\n};\n\nexport const generateEpisodeClips = ({ timelineTableBlocks, clipType, clipIdPrefix = '', rowId }: Options): Clip[] => {\n return timelineTableBlocks.reduce<Clip[]>((acc, episode, idx) => {\n const nextEpisodeIndex = idx < timelineTableBlocks.length - 1 ? idx + 1 : null;\n\n if (idx === 0) {\n acc.push(generateNoEffectiveTimeClip(episode.id, rowId, 0, episode.startTime));\n }\n\n acc.push({\n id: clipIdPrefix ? `${clipIdPrefix}-${episode.id}` : episode.id,\n type: clipType,\n startTime: episode.startTime,\n endTime: episode.endTime,\n rowId: rowId,\n // TODO add translation or use a translation key\n title: `timeline:episode-name`,\n elementId: episode.id,\n name: episode.name,\n clips: [],\n });\n\n if (nextEpisodeIndex) {\n const nextEpisode = timelineTableBlocks[nextEpisodeIndex];\n\n const isHalfTime =\n episode &&\n nextEpisode &&\n nextEpisode.matchSegment === MatchSegmentTypes.SECOND &&\n episode.matchSegment === MatchSegmentTypes.FIRST;\n\n acc.push(\n generateNoEffectiveTimeClip(\n episode.id,\n episode.id,\n episode.endTime,\n nextEpisode.startTime,\n isHalfTime ? 'HT' : '',\n acc.length,\n ),\n );\n }\n\n return acc;\n }, []);\n};\n","import { generateEpisodeClips } from './generateEpisodeClips';\nimport { Row } from '../types/row';\nimport { TimelineTableBlock } from '../types/timeline';\n\nexport const generateEpisodesRows = (timelineTableBlocks: TimelineTableBlock[], recordingId: string): Row => {\n return {\n id: `${recordingId}-episodes`,\n type: 'episodes',\n title: 'episode',\n isHidden: false,\n clips: generateEpisodeClips({ timelineTableBlocks, clipType: 'episode', rowId: 'episodes' }),\n };\n};\n","import { generateEpisodeClips } from './generateEpisodeClips';\nimport { Row, RowType } from '../types/row';\nimport { TimelineTableBlock } from '../types/timeline';\n\ntype GenerateEpisodeContainerClipOptions = {\n id: string;\n title: string;\n timelineTableBlocks: TimelineTableBlock[];\n rowId: string;\n rowType: RowType;\n clipIdPrefix: string;\n teamId?: string;\n entityId?: string;\n};\nexport const generateBlockContainerClip = ({\n id,\n title,\n timelineTableBlocks,\n rowId,\n rowType,\n clipIdPrefix,\n teamId,\n entityId,\n}: GenerateEpisodeContainerClipOptions): Row => {\n return {\n id: id,\n type: rowType,\n title,\n entityId,\n teamId,\n isHidden: false,\n clips: generateEpisodeClips({\n timelineTableBlocks,\n clipType: 'block-container',\n rowId: rowId,\n clipIdPrefix: clipIdPrefix,\n }),\n };\n};\n","import { Row } from '../types/row';\n\nexport const sortByTitle = (row1: Row, row2: Row) => {\n if (row1.title < row2.title) {\n return -1;\n }\n if (row1.title > row2.title) {\n return 1;\n }\n return 0;\n};\n","import find from 'lodash/find';\nimport reduce from 'lodash/reduce';\n\nimport { Episode, isEventStarting, TacticalScenario } from 'shared/types/index';\n\nimport { generateBlockContainerClip } from './generateBlockContainerClip';\nimport { sortByTitle } from './sortByTitle';\nimport { Row, RowGroup, RowList } from '../types/row';\n\nconst findLastValidScenarioInEpisode = (episode: Episode): TacticalScenario | undefined => {\n let highest = Number.NEGATIVE_INFINITY;\n let lastScenarioIndex = -1;\n let tmp;\n for (let i = episode.tacticalScenarios.length - 1; i >= 0; i--) {\n tmp = episode.tacticalScenarios[i].endTime;\n if (tmp > highest && !isEventStarting(episode.tacticalScenarios[i].tacticalScenarioType)) {\n highest = tmp;\n lastScenarioIndex = i;\n }\n }\n\n return lastScenarioIndex !== -1 ? episode.tacticalScenarios[lastScenarioIndex] : undefined;\n};\n\nexport const generateEventsRows = (episodes: Episode[], recordingId: string): RowGroup => {\n const endingEventsRowList: RowList = {};\n const startingEventsRowList: RowList = {};\n\n episodes.forEach((episode) => {\n const firstValidScenario = episode.tacticalScenarios[0];\n\n if (firstValidScenario) {\n const scenario = firstValidScenario;\n const id = `${recordingId}-${episode.startAction.state}`;\n\n if (!startingEventsRowList[episode.startAction.state]) {\n startingEventsRowList[episode.startAction.state] = generateBlockContainerClip({\n id: id,\n rowType: 'events',\n timelineTableBlocks: episodes,\n title: episode.startAction.name,\n rowId: id,\n clipIdPrefix: id,\n });\n }\n\n const episodeClip = find(\n startingEventsRowList[episode.startAction.state].clips,\n (row) => row.id === `${id}-${episode.id}`,\n );\n\n episodeClip?.clips?.push({\n id: `${episode.id}-${scenario.teamId}-${scenario.startTime}-${scenario.endTime}`,\n startTime: scenario.startTime,\n endTime: scenario.endTime,\n type: 'event',\n elementId: scenario.tacticalScenarioType,\n rowId: id,\n teamId: scenario.teamId,\n title: episode.startAction.name,\n });\n }\n\n const latestValidScenario = findLastValidScenarioInEpisode(episode);\n\n if (latestValidScenario) {\n const scenario = latestValidScenario;\n const id = `${recordingId}-${episode.endAction.state}`;\n\n if (!endingEventsRowList[episode.endAction.state]) {\n endingEventsRowList[episode.endAction.state] = generateBlockContainerClip({\n id: id,\n rowType: 'events',\n timelineTableBlocks: episodes,\n title: episode.endAction.name,\n rowId: id,\n clipIdPrefix: id,\n });\n }\n\n const episodeClip = find(\n endingEventsRowList[episode.endAction.state].clips,\n (row) => row.id === `${id}-${episode.id}`,\n );\n\n episodeClip?.clips?.push({\n id: `${episode.id}-${scenario.teamId}-${scenario.startTime}-${scenario.endTime}`,\n startTime: scenario.startTime,\n endTime: scenario.endTime,\n type: 'event',\n elementId: scenario.tacticalScenarioType,\n rowId: id,\n teamId: scenario.teamId,\n title: episode.endAction.name,\n });\n }\n });\n\n const startingEventsRows: Row[] = reduce(\n startingEventsRowList,\n (acc, row) => {\n acc.push(row);\n return acc;\n },\n [] as Row[],\n );\n\n const startingEventsRowGroup: RowGroup = {\n id: `${recordingId}-starting-events`,\n isOpen: true,\n isSelected: false,\n title: 'timeline:events-starting',\n rows: startingEventsRows.sort(sortByTitle),\n totalClips: reduce(startingEventsRows, (acc, row) => acc + row.clips.length, 0),\n type: 'events',\n };\n\n const endingEventsRows: Row[] = reduce(\n endingEventsRowList,\n (acc, row) => {\n acc.push(row);\n return acc;\n },\n [] as Row[],\n );\n\n const endingEventsRowsGroup: RowGroup = {\n id: `${recordingId}-ending-events`,\n isOpen: true,\n isSelected: false,\n title: 'timeline:events-ending',\n totalClips: reduce(endingEventsRows, (acc, row) => acc + row.clips.length, 0),\n rows: endingEventsRows.sort(sortByTitle),\n type: 'events',\n };\n\n const eventsRowGroups = [];\n startingEventsRowGroup.totalClips > 0 && eventsRowGroups.push(startingEventsRowGroup);\n endingEventsRowsGroup.totalClips > 0 && eventsRowGroups.push(endingEventsRowsGroup);\n\n return {\n id: `${recordingId}-events`,\n isOpen: true,\n isSelected: false,\n title: 'timeline:events',\n rows: [],\n totalClips: startingEventsRowGroup.totalClips + endingEventsRowsGroup.totalClips,\n rowGroups: eventsRowGroups,\n type: 'events',\n };\n};\n","export const generateRandomUUID = () => {\n return self.crypto.randomUUID();\n};\n","import i18next from 'kognia/i18n';\n\nimport { Clip } from '../types/clip';\n\ninterface Params {\n clips: Clip[];\n}\n\ninterface GetOverlappingClipsParams {\n clips: Clip[];\n clip: Clip;\n rowId: string;\n initialUsedClips?: string[];\n}\n\ninterface CreateParentClipParams {\n startTime: number;\n endTime: number;\n rowId: string;\n childClips: Clip[];\n elementId?: string;\n title?: string;\n action?: string;\n teamId?: string;\n}\n\nconst createParentClip = ({\n startTime,\n endTime,\n rowId,\n childClips,\n elementId,\n title,\n action,\n teamId,\n}: CreateParentClipParams) => {\n const parentClipId = `${rowId}-${startTime}-${endTime}-parent-clip`;\n\n const clips = childClips.map((clip) => {\n return {\n ...clip,\n parentClipId,\n };\n });\n\n const defaultTitle = i18next.t('timeline:parent-clip-title', {\n clipsCount: clips.length,\n firstClipTitle: clips[0].title,\n });\n\n return <Clip>{\n id: parentClipId,\n title: title,\n titleForPlaylist: defaultTitle,\n startTime: startTime,\n endTime: endTime,\n clips,\n rowId,\n elementId,\n ...(action && { action }),\n ...(teamId && { teamId }),\n type: 'parent-clip',\n };\n};\n\ntype CheckForOverlappingClipsResult = {\n parentClip: Clip | null;\n usedClips: string[];\n};\n\nconst checkForOverlappingClips = ({\n clips,\n clip,\n rowId,\n initialUsedClips = [],\n}: GetOverlappingClipsParams): CheckForOverlappingClipsResult => {\n const usedClips: string[] = initialUsedClips;\n const overlappingClips = clips.filter(\n (c) =>\n clip.rowId === c.rowId &&\n usedClips.includes(c.id) === false &&\n ((clip.startTime > c.startTime && clip.startTime < c.endTime) ||\n (clip.endTime > c.startTime && clip.endTime <= c.endTime) ||\n (c.startTime > clip.startTime && c.startTime < clip.endTime) ||\n (c.endTime > clip.startTime && c.endTime < clip.endTime)),\n );\n const hasOverlappingClips = overlappingClips.length > 0;\n\n if (hasOverlappingClips) {\n const clipsInScope = clip?.clips?.length ? [...clip.clips, ...overlappingClips] : overlappingClips;\n usedClips.push(...clipsInScope.map((c) => c.id));\n usedClips.push(clip.id);\n\n const elementId = clipsInScope.every((item) => item.elementId === clipsInScope[0].elementId)\n ? clipsInScope[0].elementId\n : '';\n\n const title = clipsInScope.every((item) => item.title === clipsInScope[0].title) ? clipsInScope[0].title : '';\n const action = clipsInScope.every((item) => item.action === clipsInScope[0].action) ? clipsInScope[0].action : '';\n const teamId = clipsInScope.every((item) => item.teamId === clipsInScope[0].teamId) ? clipsInScope[0].teamId : '';\n\n const parentClip = createParentClip({\n startTime: Math.min(...clipsInScope.map((c) => c.startTime)),\n endTime: Math.max(...clipsInScope.map((c) => c.endTime)),\n rowId,\n action,\n teamId,\n elementId,\n title,\n childClips: clip?.clips?.length ? [...clip.clips, ...overlappingClips] : overlappingClips,\n });\n\n const filteredClips = clips.filter((c) => !usedClips.includes(c.id));\n return checkForOverlappingClips({\n clips: filteredClips,\n clip: parentClip,\n rowId,\n initialUsedClips: usedClips,\n });\n }\n\n return {\n parentClip: clip.clips && clip.clips?.length > 1 ? clip : null,\n usedClips: Array.from(new Set(usedClips)),\n };\n};\n\nexport const generateClipsWithOverlappingTime = ({ clips }: Params): Clip[] => {\n const resultClips: Clip[] = [];\n const usedClips: string[] = [];\n\n clips\n .sort((a, b) => a.startTime - b.startTime)\n .forEach((clip) => {\n if (usedClips.includes(clip.id)) {\n return;\n }\n\n const overlappingClips = checkForOverlappingClips({ clips, clip, rowId: clip.rowId });\n\n if (overlappingClips.parentClip) {\n resultClips.push(overlappingClips.parentClip);\n usedClips.push(...overlappingClips.usedClips);\n } else {\n resultClips.push(clip);\n }\n });\n\n return resultClips;\n};\n","import { TacticalFundamental } from 'shared/types/episodes/types';\n\nimport { generateClipsWithOverlappingTime } from './generateClips';\nimport { Clip } from '../types/clip';\n\ninterface Params {\n clips: TacticalFundamental[];\n title: string;\n rowId: string;\n}\n\nexport const getClipsForFilters = ({ clips, title, rowId }: Params) => {\n const filterClips = clips.map(\n (clip) =>\n <Clip>{\n id: `tactic-${clip.startTime}-${clip.endTime}`,\n startTime: clip.startTime,\n endTime: clip.endTime,\n type: 'filter',\n elementId: '',\n rowId: rowId,\n title,\n },\n );\n\n const filterClipsWithOverlappingTime = generateClipsWithOverlappingTime({ clips: filterClips });\n\n return filterClipsWithOverlappingTime.map(\n (clip) =>\n <Clip>{\n id: `tactic-${clip.startTime}-${clip.endTime}`,\n startTime: clip.startTime,\n endTime: clip.endTime,\n type: 'filter',\n elementId: '',\n rowId: rowId,\n title,\n },\n );\n};\n","import find from 'lodash/find';\n\nimport { Episode } from 'shared/types/index';\nimport { RecordingsFilters } from 'shared/types/recording/types';\nimport { generateRandomUUID } from 'shared/utils/generateRandomUUID';\n\nimport { generateBlockContainerClip } from './generateBlockContainerClip';\nimport { getClipsForFilters } from './getClipsForFilters';\nimport { Row } from '../types/row';\n\nexport const generateFiltersRow = (\n episodes: Episode[],\n filterEpisodes: Episode[],\n appliedFilters: RecordingsFilters,\n recordingId: string,\n): Row => {\n const rowId = `${recordingId}-filters`;\n const row: Row = generateBlockContainerClip({\n id: rowId,\n rowType: 'filters',\n timelineTableBlocks: episodes,\n title: 'timeline:filter-results',\n rowId: rowId,\n clipIdPrefix: rowId,\n });\n\n const filterUniqueId = generateRandomUUID();\n const title = `timeline:filter-result`;\n\n const totalOffensiveTactics = appliedFilters.scenariosOrTacticsInside?.tactics.offensive.filter(\n (t) => t.tacticalFundamentalType,\n ).length;\n const totalDefensiveTactics = appliedFilters.scenariosOrTacticsInside?.tactics.defensive.filter(\n (t) => t.tacticalFundamentalType,\n ).length;\n\n const areFundamentalsFiltered = Boolean((totalOffensiveTactics ?? 0) + (totalDefensiveTactics ?? 0));\n\n filterEpisodes.forEach((episode) => {\n const unfilteredEpisode = episodes.find((anEpisode) => anEpisode.id === episode.id);\n\n if (areFundamentalsFiltered) {\n const filterClips = getClipsForFilters({\n clips: episode.tacticalFundamentals,\n title,\n rowId,\n });\n\n const episodeClip =\n unfilteredEpisode &&\n find(\n row.clips,\n (clip) => unfilteredEpisode.startTime < clip.endTime && unfilteredEpisode.endTime > clip.startTime,\n );\n\n episodeClip?.clips?.push(...filterClips);\n }\n\n if (!areFundamentalsFiltered && episode.tacticalScenarios) {\n const startTime = Math.min(...episode.tacticalScenarios.map((scenario) => scenario.startTime));\n const endTime = Math.max(...episode.tacticalScenarios.map((scenario) => scenario.endTime));\n\n const episodeClip = find(row.clips, (clip) => {\n return clip.type !== 'not-effective-time' && startTime >= clip.startTime && startTime <= clip.endTime;\n });\n\n episodeClip?.clips?.push({\n id: `scenario-${startTime}-${endTime}-${filterUniqueId}`,\n startTime,\n endTime,\n type: 'filter',\n elementId: '',\n rowId: rowId,\n title,\n });\n }\n });\n\n return row;\n};\n","import { MatchSegmentTypes } from 'shared/types/segment/types';\n\nimport { TimelineTableBlock } from '../types/timeline';\n\nexport const generateFullMatchTimelineBlockFromDuration = (duration: number): TimelineTableBlock => ({\n id: 'full-match',\n name: 'full-match-block',\n startTime: 0,\n endTime: duration,\n matchSegment: MatchSegmentTypes.FIRST,\n});\n","import { generateClipsWithOverlappingTime } from './generateClips';\nimport { TaggingEvent } from '../../../../../../api/tagging-tool/types';\nimport { Clip } from '../types/clip';\n\nexport const getClipsFromTaggingEvent = (clips: TaggingEvent[], rowId: string): Clip[] => {\n const mappedClips = clips.map<Clip>((clip) => {\n return {\n endTime: clip.time + clip.timeAfter,\n id: clip.id,\n rowId: rowId,\n startTime: clip.time - clip.timeBefore > 0 ? clip.time - clip.timeBefore : 0,\n title: clip.name,\n type: 'manual-tag',\n elementId: clip.id,\n };\n });\n\n return generateClipsWithOverlappingTime({ clips: mappedClips });\n};\n","import find from 'lodash/find';\nimport forEach from 'lodash/forEach';\nimport map from 'lodash/map';\nimport reduce from 'lodash/reduce';\n\nimport { GroupedTags } from 'shared/types/tagging-events/types';\n\nimport { generateBlockContainerClip } from './generateBlockContainerClip';\nimport { getClipsFromTaggingEvent } from './getClipsFromTaggingEvent';\nimport { RowGroup, RowList } from '../types/row';\nimport { TimelineTableBlock } from '../types/timeline';\n\nexport const generateManualTagsRows = (\n timelineTableBlocks: TimelineTableBlock[],\n groupedTags: GroupedTags,\n recordingId: string,\n): RowGroup => {\n const rows: RowList = {};\n\n forEach(groupedTags, (tags, tagGroup) => {\n const rowId = `${recordingId}-${tagGroup}`;\n\n const modifiedTags = getClipsFromTaggingEvent(tags, rowId);\n modifiedTags.forEach((tag) => {\n if (!rows[rowId]) {\n rows[rowId] = generateBlockContainerClip({\n id: rowId,\n rowType: 'manual-tags',\n timelineTableBlocks: timelineTableBlocks,\n title: `timeline:${tagGroup}`,\n rowId: rowId,\n clipIdPrefix: tagGroup,\n });\n }\n\n const episodeClip = find(\n rows[rowId].clips,\n (row) =>\n (tag.startTime >= row.startTime && tag.startTime <= row.endTime) ||\n (tag.endTime >= row.startTime && tag.endTime <= row.endTime),\n );\n\n if (episodeClip) {\n episodeClip?.clips?.push(tag);\n }\n });\n });\n\n return {\n id: 'manual-tags',\n isOpen: true,\n isSelected: false,\n title: 'timeline:manual-tags',\n rows: map(rows, (row) => row),\n totalClips: reduce(rows, (acc, row) => acc + row.clips.length, 0),\n type: 'manual-tags',\n };\n};\n","import { Scenarios } from '../../../../../../shared/types/episodes/types';\nimport { Row } from '../types/row';\n\nconst SCENARIOS_ORDER: { [key in string]: number } = {\n [Scenarios.POSSESION_A]: 0,\n [Scenarios.POSSESION_BC]: 1,\n [Scenarios.POSSESION_D]: 2,\n [Scenarios.CHANGE_OF_POSSESSION]: 3,\n};\nexport const sortScenarios = (prefix: string) => (a: Row, b: Row) => {\n const ida = a.id.replace(prefix, '');\n const idb = b.id.replace(prefix, '');\n\n const first = ida in SCENARIOS_ORDER ? SCENARIOS_ORDER[ida] : Number.MAX_SAFE_INTEGER;\n const second = idb in SCENARIOS_ORDER ? SCENARIOS_ORDER[idb] : Number.MAX_SAFE_INTEGER;\n\n let result = 0;\n if (first < second) result = -1;\n else if (first > second) result = 1;\n return result;\n};\n","import find from 'lodash/find';\nimport map from 'lodash/map';\nimport reduce from 'lodash/reduce';\n\nimport { Episode, isValidScenario } from 'shared/types/index';\n\nimport { generateBlockContainerClip } from './generateBlockContainerClip';\nimport { sortScenarios } from './sortScenarios';\nimport { RowGroup, RowList } from '../types/row';\n\nexport const generateScenariosRows = (\n episodes: Episode[],\n recordingId: string,\n): {\n scenariosRowGroup: RowGroup;\n scenariosIdsList: Set<string>;\n} => {\n const rows: RowList = {};\n const scenariosIdsList: Set<string> = new Set();\n\n episodes.map((episode) => {\n episode.tacticalScenarios\n .filter((scenario) => isValidScenario(scenario.tacticalScenarioType))\n .map((scenario) => {\n const title = `fundamentals:tactical-scenario-types.${scenario.tacticalScenarioType}`;\n if (!rows[scenario.tacticalScenarioType]) {\n rows[scenario.tacticalScenarioType] = generateBlockContainerClip({\n id: `${recordingId}-${scenario.tacticalScenarioType}`,\n rowType: 'scenarios',\n timelineTableBlocks: episodes,\n title,\n rowId: `${recordingId}-${scenario.tacticalScenarioType}`,\n clipIdPrefix: scenario.tacticalScenarioType,\n });\n }\n\n const episodeClip = find(\n rows[scenario.tacticalScenarioType].clips,\n (row) => row.id === `${scenario.tacticalScenarioType}-${episode.id}`,\n );\n\n scenariosIdsList.add(scenario.tacticalScenarioType);\n episodeClip?.clips?.push({\n id: `${recordingId}-${scenario.tacticalScenarioType}-${scenario.teamId}-${scenario.startTime}-${scenario.endTime}`,\n startTime: scenario.startTime,\n endTime: scenario.endTime,\n type: 'scenario',\n elementId: scenario.tacticalScenarioType,\n rowId: `${recordingId}-${scenario.tacticalScenarioType}`,\n teamId: scenario.teamId,\n title,\n });\n });\n });\n\n const extractedRows = map(rows, (row) => row).sort(sortScenarios(`${recordingId}-`));\n const scenariosRowGroup: RowGroup = {\n id: `${recordingId}-scenarios`,\n isOpen: true,\n isSelected: false,\n title: 'timeline:scenarios',\n rows: extractedRows,\n totalClips: reduce(extractedRows, (acc, row) => acc + row.clips.length, 0),\n type: 'scenarios',\n };\n\n return { scenariosRowGroup, scenariosIdsList };\n};\n","import { MatchSegmentTypes } from 'shared/types/segment/types';\n\nexport enum TacticActionType {\n OFFENSIVE = 'offensive',\n DEFENSIVE = 'defensive',\n}\n\ntype MatchTime = {\n frame: number;\n 'time-in-match': number;\n 'time-in-segment': number;\n};\n\nexport interface Video {\n 'video-path': string;\n 'video-download-path': string;\n players: Array<any>;\n segment: MatchSegmentTypes;\n start: MatchTime;\n end: MatchTime;\n type?: string;\n}\n","import { TacticalFundamental } from 'shared/types/episodes/types';\n\nimport { generateClipsWithOverlappingTime } from './generateClips';\nimport { isOffensiveTactic } from '../../../../config';\nimport { TacticActionType } from '../../../../types';\nimport { Clip } from '../types/clip';\n\ninterface Params {\n clips: TacticalFundamental[];\n recordingId: string;\n}\n\nexport const getClipsFromTacticalFundamental = ({ clips, recordingId }: Params): Clip[] => {\n const mappedClipsByTeamIdAndType = clips.reduce<Record<string, Record<string, Clip[]>>>((acc, clip) => {\n if (!acc[clip.teamId]) {\n acc[clip.teamId] = {};\n }\n\n if (!acc[clip.teamId][clip.tacticalFundamentalType]) {\n acc[clip.teamId][clip.tacticalFundamentalType] = [];\n }\n\n const rowId = `${recordingId}-${clip.tacticalFundamentalType}-${clip.teamId}`;\n\n acc[clip.teamId][clip.tacticalFundamentalType].push(<Clip>{\n id: `${rowId}-${clip.startTime}-${clip.endTime}`,\n startTime: clip.startTime,\n endTime: clip.endTime,\n type: 'tactic',\n rowId: rowId,\n teamId: clip.teamId,\n elementId: clip.tacticalFundamentalType,\n action: isOffensiveTactic(clip.tacticalFundamentalType) ? TacticActionType.OFFENSIVE : TacticActionType.DEFENSIVE,\n title: clip.name,\n titleForPlaylist: clip.name,\n });\n\n return acc;\n }, {});\n\n return Object.values(mappedClipsByTeamIdAndType).reduce<Clip[]>((acc, clipsByType) => {\n const clips = Object.values(clipsByType).reduce(\n (acc, clips) => [...acc, generateClipsWithOverlappingTime({ clips })].flat(),\n [],\n );\n return [...acc, ...clips];\n }, []);\n};\n","import find from 'lodash/find';\nimport reduce from 'lodash/reduce';\n\nimport { Episode } from 'shared/types/index';\n\nimport { generateBlockContainerClip } from './generateBlockContainerClip';\nimport { getClipsFromTacticalFundamental } from './getClipsFromTacticalFundamental';\nimport { sortByTitle } from './sortByTitle';\nimport { defensiveTactics, offensiveTactics } from '../../../../config';\nimport { Row, RowGroup, RowList } from '../types/row';\n\nexport const generateTacticsRows = (\n episodes: Episode[],\n recordingId: string,\n): {\n tacticsRowGroup: RowGroup;\n tacticsIdsList: Set<string>;\n} => {\n const tacticsIdsList: Set<string> = new Set();\n\n const rows: RowList = {};\n episodes.forEach((episode) => {\n const tacticsClips = getClipsFromTacticalFundamental({\n clips: episode.tacticalFundamentals,\n recordingId: recordingId,\n });\n\n tacticsClips.forEach((tactic) => {\n const { rowId } = tactic;\n if (!rows[rowId]) {\n rows[rowId] = generateBlockContainerClip({\n id: rowId,\n rowType: 'tactics',\n timelineTableBlocks: episodes,\n title: tactic.title,\n rowId: rowId,\n teamId: tactic.teamId,\n clipIdPrefix: rowId,\n entityId: tactic.elementId,\n });\n }\n\n const episodeClip = find(rows[rowId].clips, (row) => row.id === `${rowId}-${episode.id}`);\n\n tacticsIdsList.add(tactic.elementId);\n episodeClip?.clips?.push(tactic);\n });\n });\n\n const offensiveRows = reduce(\n rows,\n (acc, row) => {\n if (row.entityId && offensiveTactics.includes(row.entityId)) {\n acc.push(row);\n }\n return acc;\n },\n [] as Row[],\n );\n\n const offensiveRowGroup: RowGroup = {\n id: 'offensive-tactics',\n isOpen: true,\n isSelected: false,\n title: 'timeline:offensive',\n rows: offensiveRows.sort(sortByTitle),\n totalClips: reduce(offensiveRows, (acc, row) => acc + row.clips.length, 0),\n type: 'tactics',\n };\n\n const defensiveRows = reduce(\n rows,\n (acc, row) => {\n if (row.entityId && defensiveTactics.includes(row.entityId)) {\n acc.push(row);\n }\n return acc;\n },\n [] as Row[],\n );\n\n const defensiveRowGroup: RowGroup = {\n id: 'defensive-tactics',\n isOpen: true,\n isSelected: false,\n title: 'timeline:defensive',\n totalClips: reduce(defensiveRows, (acc, row) => acc + row.clips.length, 0),\n rows: defensiveRows.sort(sortByTitle),\n type: 'tactics',\n };\n\n const tacticsRowGroup: RowGroup = {\n id: 'tactics',\n isOpen: true,\n isSelected: false,\n title: 'timeline:tactics',\n rows: [],\n totalClips: offensiveRowGroup.totalClips + defensiveRowGroup.totalClips,\n rowGroups: [offensiveRowGroup, defensiveRowGroup],\n type: 'tactics',\n };\n\n return { tacticsRowGroup: tacticsRowGroup, tacticsIdsList };\n};\n","import { Episode } from 'shared/types';\nimport { RecordingsFilters } from 'shared/types/recording/types';\nimport { GroupedTags } from 'shared/types/tagging-events/types';\n\nimport { RowGroup } from './types/row';\nimport { Timeline, TimelineTableBlock } from './types/timeline';\nimport { generateEpisodesRows } from './utils/generateEpisodesRows';\nimport { generateEventsRows } from './utils/generateEventsRows';\nimport { generateFiltersRow } from './utils/generateFiltersRow';\nimport { generateFullMatchTimelineBlockFromDuration } from './utils/generateFullMatchTimelineBlockFromDuration';\nimport { generateManualTagsRows } from './utils/generateManualTagsRows';\nimport { generateScenariosRows } from './utils/generateScenariosRows';\nimport { generateTacticsRows } from './utils/generateTacticsRows';\n\nexport const DEFAULT_TIMELINE_DATA: Timeline = {\n episodesRow: {\n id: 'episodes',\n type: 'episodes',\n isHidden: false,\n title: 'episode',\n clips: [],\n },\n filtersRow: undefined,\n rowGroups: [],\n scenariosRowGroup: undefined,\n scenariosIdsList: new Set(),\n tacticsIdsList: new Set(),\n};\n\nconst transformEpisodeToTimelineTableBlock = (episode: Episode): TimelineTableBlock => ({\n id: episode.id,\n name: episode.name,\n startTime: episode.startTime,\n endTime: episode.endTime,\n matchSegment: episode.matchSegment,\n});\n\nexport const generateTimelineRows = (\n episodes: Episode[],\n groupedTags: GroupedTags,\n duration: number,\n appliedFilters: RecordingsFilters,\n filteredEpisodes: Episode[],\n recordingId: string,\n): Timeline => {\n const timelineBlocks: TimelineTableBlock[] =\n episodes.length > 0\n ? episodes.map(transformEpisodeToTimelineTableBlock)\n : [generateFullMatchTimelineBlockFromDuration(duration)];\n\n const episodesRow = generateEpisodesRows(timelineBlocks, recordingId);\n const { scenariosRowGroup, scenariosIdsList } = generateScenariosRows(episodes, recordingId);\n const eventsRowGroup = generateEventsRows(episodes, recordingId);\n const { tacticsRowGroup, tacticsIdsList } = generateTacticsRows(episodes, recordingId);\n const manualTagsRowGroup = generateManualTagsRows(timelineBlocks, groupedTags, recordingId);\n const filtersRow = generateFiltersRow(episodes, filteredEpisodes, appliedFilters, recordingId);\n const rowGroups: RowGroup[] = [tacticsRowGroup, eventsRowGroup, manualTagsRowGroup];\n\n return {\n filtersRow,\n scenariosRowGroup,\n scenariosIdsList,\n tacticsIdsList,\n rowGroups,\n episodesRow,\n };\n};\n","export enum TacticalAnalysisPlayingMode {\n default = 'default',\n selection = 'selection',\n}\n","import { atom, atomFamily } from 'recoil';\n\nimport { TacticalAnalysesFilters } from 'api/recording/useEpisodesWithFilters/types';\nimport { PlayingMode, VideoSource } from 'shared/components/video-player/types';\nimport { ZOOM_LEVELS } from 'shared/constants/zoom-range/zoomLevelsValues';\nimport { Episode, Match, TacticIdOrAll } from 'shared/types';\nimport { RecordingsFilters } from 'shared/types/recording/types';\nimport { SegmentConfig } from 'shared/types/segment/types';\nimport { MatchTeam } from 'shared/types/teams/types';\nimport { ZoomLevelsType } from 'shared/types/zoom-range/zoomLevels';\n\nimport { DEFAULT_TIMELINE_DATA } from '../api/use-tactical-analysis-data/generate-timeline-rows/generateTimelineRows';\nimport { Timeline } from '../api/use-tactical-analysis-data/generate-timeline-rows/types/timeline';\nimport { TacticalAnalysisPlayingMode } from '../types/tactical-analysis-playing-mode';\n\nconst isTimelineReadyToRender = atomFamily<boolean, string>({\n key: 'timeline-is-ready-to-render',\n default: false,\n});\n\nconst timelineMultiselectActive = atomFamily<boolean, string>({\n key: 'tactical-analysis-multiselect-active',\n default: false,\n});\n\nconst showFilteredClips = atomFamily<boolean, string>({\n key: 'tactical-analysis-show-filtered-clips',\n default: false,\n});\n\nconst shouldResetPlayHead = atomFamily<boolean, string>({\n key: 'tactical-analysis-should-reset-play-head',\n default: true,\n});\n\nconst zoomLevel = atom<ZoomLevelsType>({\n key: 'tactical-analysis-zoom-level',\n default: ZOOM_LEVELS.large,\n});\n\nexport const MINIMUM_TIMELINE_TRACKS_HEIGHT = 380;\nconst height = atom<number>({\n key: 'tactical-analysis-height',\n default: MINIMUM_TIMELINE_TRACKS_HEIGHT,\n});\n\nexport const HEADER_MIN_WIDTH = 264;\nconst headersWidth = atom<number>({\n key: 'tactical-analysis-headers-width',\n default: HEADER_MIN_WIDTH,\n});\n\nconst matchVideoSource = atomFamily<VideoSource, string>({\n key: 'tactical-analysis-match-video-source',\n default: { id: '', src: '' },\n});\n\nconst teamIdFocus = atomFamily<string, string>({\n key: 'tactical-analysis-team-id-focus',\n default: '',\n});\n\nconst teams = atomFamily<\n {\n homeTeam?: MatchTeam;\n opponentTeam?: MatchTeam;\n },\n string\n>({\n key: 'tactical-analysis-teams',\n default: {\n homeTeam: undefined,\n opponentTeam: undefined,\n },\n});\n\nconst match = atomFamily<Match, string>({\n key: 'tactical-analysis-match',\n default: undefined,\n});\n\nconst episodes = atomFamily<Episode[], string>({\n key: 'tactical-analysis-episodes',\n default: [],\n});\n\nconst selectedTactics = atomFamily<TacticIdOrAll[], string>({\n key: 'tactical-analysis-selected-tactics',\n default: ['all'],\n});\n\nconst playingMode = atomFamily<PlayingMode, string>({\n key: 'tactical-analysis-playing-mode',\n default: undefined,\n});\n\nconst timelineTableData = atomFamily<Timeline, string>({\n key: 'tactical-analysis-timeline-table-data',\n default: DEFAULT_TIMELINE_DATA,\n});\n\nconst showBallPossession = atomFamily<boolean, string>({\n key: 'tactical-analysis-show-ball-possession',\n default: true,\n});\n\nconst showNoBallPossession = atomFamily<boolean, string>({\n key: 'tactical-analysis-show-no-ball-possession',\n default: true,\n});\n\nconst hasHomographies = atomFamily<boolean, string>({\n key: 'tactical-analysis-has-homographies',\n default: true,\n});\n\nconst matchSegments = atomFamily<SegmentConfig[], string>({\n key: 'tactical-analysis-match-segments',\n default: [],\n});\n\nconst filters = atomFamily<TacticalAnalysesFilters, string>({\n key: 'tactical-analysis-filters',\n default: undefined,\n});\n\nconst appliedFilters = atomFamily<RecordingsFilters, string>({\n key: 'tactical-analysis-applied-filters',\n default: { recordingIds: [] },\n});\n\nconst tacticalAnalysisId = atomFamily<string, string>({\n key: 'tactical-analysis-current-tactical-analysis-id',\n default: undefined,\n});\n\nconst filteredEpisodes = atomFamily<Episode[], string>({\n key: 'tactical-analysis-filters-results',\n default: [],\n});\n\nconst mode = atomFamily<TacticalAnalysisPlayingMode, string>({\n key: 'tactical-analysis-mode',\n default: TacticalAnalysisPlayingMode.default,\n});\n\nexport const timelineMatchAtoms = {\n appliedFilters,\n episodes,\n filteredEpisodes,\n filters,\n hasHomographies,\n isTimelineReadyToRender,\n match,\n matchSegments,\n matchVideoSource,\n playingMode,\n selectedTactics,\n showBallPossession,\n showNoBallPossession,\n tacticalAnalysisId,\n mode,\n teamIdFocus,\n teams,\n timelineTableData,\n};\n\nexport const timelineAtoms = {\n headersWidth,\n height,\n shouldResetPlayHead,\n showFilteredClips,\n timelineMultiselectActive,\n zoomLevel,\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useTacticalAnalysisEpisodes = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.episodes(recordingId));\n};\n\nexport const useSetTacticalAnalysisEpisodes = (recordingId: string) => {\n return useSetRecoilState(timelineMatchAtoms.episodes(recordingId));\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useTacticalAnalysisMatch = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.match(recordingId));\n};\n\nexport const useSetTacticalAnalysisMatch = (recordingId: string) => {\n return useSetRecoilState(timelineMatchAtoms.match(recordingId));\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useSetTacticalAnalysisMatchSegments = (recordingId: string) => {\n return useSetRecoilState(timelineMatchAtoms.matchSegments(recordingId));\n};\n\nexport const useTacticalAnalysisMatchSegments = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.matchSegments(recordingId));\n};\n","import { Episode } from 'shared/types';\n\nexport const getDurationFromEpisodes = (episodes: Episode[]) => {\n return episodes.reduce((accumulator: number, episode) => {\n return accumulator + (episode.endTime - episode.startTime);\n }, 0);\n};\n","import { EPISODES_PLAYING_MODE } from 'shared/components/video-player/defaultPlayingModes';\nimport {\n PlayingMode,\n PlayingModes,\n PlaylistItemType,\n VideoSource,\n VideoSourceType,\n} from 'shared/components/video-player/types';\nimport { Episode, TacticIdOrAll } from 'shared/types';\nimport { round } from 'shared/utils/round';\n\nimport { getDurationFromEpisodes } from '../get-duration-from-episodes';\n\nconst generateEffectiveTimeSources = (episodes: Episode[]) => {\n return episodes.map((episode) => ({\n startTime: 0,\n endTime: round(episode.endTime - episode.startTime),\n startTimeInMatch: round(episode.startTime),\n endTimeInMatch: round(episode.endTime),\n src: episode.dashUrl,\n srcDownload: episode.s3Url,\n id: episode.videoSourceId,\n }));\n};\n\nconst generateVideoSourceTypeEffectiveTime = (episodes: Episode[]): VideoSourceType => {\n return {\n playingMode: EPISODES_PLAYING_MODE,\n videoSources: generateEffectiveTimeSources(episodes),\n };\n};\n\nconst generateEffectiveTimeFullGameSources = ({\n episodes,\n src,\n srcDownload,\n}: {\n episodes: Episode[];\n src: string;\n srcDownload?: string;\n effectiveTime?: boolean;\n}) => {\n return episodes.map((episode) => ({\n startTime: round(episode.startTime),\n endTime: round(episode.endTime),\n startTimeInMatch: round(episode.startTime),\n endTimeInMatch: round(episode.endTime),\n src: src,\n srcDownload: srcDownload,\n id: episode.videoSourceId,\n }));\n};\n\nconst generateVideoSourceTypeFullGame = ({\n duration,\n episodes,\n hasHomographies,\n showOverlays,\n tacticalCameraVideo,\n useEffectiveTime,\n}: {\n tacticalCameraVideo: VideoSource;\n showOverlays: boolean;\n useEffectiveTime: boolean;\n duration?: number;\n hasHomographies: boolean;\n episodes: Episode[];\n}): VideoSourceType => {\n if (episodes.length > 0 && hasHomographies && useEffectiveTime) {\n return {\n playingMode: { mode: PlayingModes.TACTICAL_CAMERA, useEffectiveTime, showOverlays },\n videoSources: generateEffectiveTimeFullGameSources({\n episodes,\n src: tacticalCameraVideo.src,\n srcDownload: tacticalCameraVideo.srcDownload,\n }),\n };\n }\n\n return {\n playingMode: {\n mode: PlayingModes.TACTICAL_CAMERA,\n useEffectiveTime: false,\n showOverlays: hasHomographies ? showOverlays : false,\n },\n videoSources: [\n {\n type: tacticalCameraVideo.type,\n poster: tacticalCameraVideo.poster,\n src: tacticalCameraVideo.src,\n srcDownload: tacticalCameraVideo.srcDownload,\n startTimeInMatch: 0,\n startTime: 0,\n endTime: duration ?? 0,\n endTimeInMatch: duration ?? 0,\n id: tacticalCameraVideo.id,\n },\n ],\n };\n};\n\ninterface GeneratePlaylistItemFromEpisodes {\n episodes: Episode[];\n fullVideoSourceDuration?: number;\n tacticalCameraVideo: VideoSource;\n playingMode: PlayingMode;\n recordingId: string;\n fundamentalsSelected: TacticIdOrAll[];\n hasHomographies: boolean;\n}\n\nexport const generatePlaylistItemFromEpisodes = ({\n episodes,\n fullVideoSourceDuration,\n tacticalCameraVideo,\n playingMode,\n recordingId,\n fundamentalsSelected,\n hasHomographies,\n}: GeneratePlaylistItemFromEpisodes): PlaylistItemType[] => {\n if (!episodes.length && playingMode.mode === PlayingModes.EPISODES) return [];\n const tacticalAnalysisId = episodes.length > 0 ? episodes[0].tacticalAnalysisId : undefined;\n\n const duration =\n (playingMode.mode === PlayingModes.TACTICAL_CAMERA && playingMode.useEffectiveTime) ||\n playingMode.mode === PlayingModes.EPISODES\n ? getDurationFromEpisodes(episodes)\n : fullVideoSourceDuration ?? 0;\n\n const videoTypes =\n playingMode.mode === PlayingModes.EPISODES\n ? [generateVideoSourceTypeEffectiveTime(episodes)]\n : [\n generateVideoSourceTypeFullGame({\n tacticalCameraVideo,\n duration: duration,\n hasHomographies,\n showOverlays: playingMode.showOverlays,\n useEffectiveTime: playingMode.useEffectiveTime,\n episodes,\n }),\n ];\n\n return [\n {\n id: 'timeline-playlist-item',\n duration,\n\n fundamentalsSelected: {\n tacticalAnalysisId: tacticalAnalysisId,\n fundamentalsSelected: fundamentalsSelected,\n },\n hasHomographies,\n videoTypes,\n recordingId,\n },\n ];\n};\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { matchWithEpisodesUrl } from 'api/routes';\nimport { MatchWithEpisodes } from 'shared/types/match/types';\n\nimport { transformMatchWithEpisodes } from '../transformers/match/matchWithEpisodes';\n\nexport const generateMatchWithPlaylistRef = (matchId: string, prefix: string) => {\n return [`fetch-match-with-episodes-playlistId:${matchId}`, prefix];\n};\n\ntype UseMatchWithEpisodesReturn = UseQueryResult<MatchWithEpisodes>;\n\ntype Options = {\n recordingId: string;\n onSuccess?: (matchWithEpisodes: MatchWithEpisodes) => void;\n enabled?: boolean;\n prefix?: string;\n};\n\nexport const useMatchWithEpisodes = ({\n recordingId,\n onSuccess = () => {},\n enabled = true,\n prefix = '',\n}: Options): UseMatchWithEpisodesReturn => {\n const fetchQueryRef = generateMatchWithPlaylistRef(recordingId, prefix);\n\n return useFetchRequest<MatchWithEpisodes>({\n queryRef: fetchQueryRef,\n url: matchWithEpisodesUrl(recordingId),\n transformer: transformMatchWithEpisodes,\n onSuccess,\n options: { staleTime: 900000, enabled },\n });\n};\n","import { TFunction } from 'react-i18next';\n\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nimport { TaggingEvent, TaggingEventsFilters, TaggingEventUserInfo } from '../../types';\n\nexport type TaggingEventFilter = { title: string; value: string };\n\nexport interface TaggingEventsFilterOptions {\n offensive: TaggingEventFilter[];\n defensive: TaggingEventFilter[];\n transitions: TaggingEventFilter[];\n imported: TaggingEventFilter[];\n user: TaggingEventFilter[];\n}\n\nexport const getUserNameFromUserId = (userId: string, usersInfo: TaggingEventUserInfo[]): string => {\n const user = usersInfo.find((userInfo) => userInfo.userId === userId);\n return user ? `${user.firstName} ${user.lastName}` : '';\n};\n\nexport const generateTaggingEventsFilters = (\n taggingEvents: TaggingEvent[],\n usersInfo: TaggingEventUserInfo[],\n t: TFunction<'translation'>,\n): TaggingEventsFilterOptions => {\n return {\n offensive: Array.from(\n new Set(taggingEvents.filter((tag) => tag.typeOfPlay === TypeOfPlay.Offense).map((tag) => tag.name)),\n ).map((name) => ({\n title: name,\n value: name,\n })),\n defensive: Array.from(\n new Set(taggingEvents.filter((tag) => tag.typeOfPlay === TypeOfPlay.Defense).map((tag) => tag.name)),\n ).map((name) => ({\n title: name,\n value: name,\n })),\n transitions: Array.from(\n new Set(taggingEvents.filter((tag) => tag.typeOfPlay === TypeOfPlay.Transition).map((tag) => tag.name)),\n ).map((name) => ({\n title: name,\n value: name,\n })),\n imported: taggingEvents.some((tag) => tag.typeOfPlay === TypeOfPlay.imported)\n ? [\n {\n title: t('tagging-tool:tagging-recording.filter-imported'),\n value: 'imported',\n },\n ]\n : [],\n user: Array.from(new Set(taggingEvents.filter((tag) => tag.userId).map((tag) => tag.userId))).map((userId) => ({\n title: getUserNameFromUserId(userId, usersInfo),\n value: userId,\n })),\n };\n};\n\nexport const applyTypeOfPlayFilter = (filters: TaggingEventsFilters, typeOfPlay: keyof TaggingEventsFilters) => {\n return (taggingEvent: TaggingEvent): boolean => {\n const isCurrentTypeOfPlay = taggingEvent.typeOfPlay === typeOfPlay;\n const areAllSelected = filters[typeOfPlay].all;\n const areFilterOptionsEmpty = filters[typeOfPlay].options.length === 0;\n const isNameInFilterOptions = !areFilterOptionsEmpty && filters[typeOfPlay].options.includes(taggingEvent.name);\n\n return (\n !isCurrentTypeOfPlay ||\n (areFilterOptionsEmpty && areAllSelected) ||\n (isCurrentTypeOfPlay && (typeOfPlay === TypeOfPlay.imported || isNameInFilterOptions))\n );\n };\n};\n\nexport const applyUserFilter = (filters: TaggingEventsFilters) => {\n return (taggingEvent: TaggingEvent): boolean => {\n return filters['user'].options.length === 0 || filters['user'].options.includes(taggingEvent.userId);\n };\n};\n","import { TaggingEvents } from 'shared/types';\nimport { getDefaultVideoSource } from 'shared/utils/get-video-sources';\n\nimport { transformRecordingVideoSources } from '../../../match/transformers/match/matchWithEpisodes';\nimport { TaggingEventsResponse } from '../../types';\n\nexport const transformTaggingEvents = (response: TaggingEventsResponse): TaggingEvents => {\n const videoSources = transformRecordingVideoSources(response.videoSources);\n\n return {\n tags: response.data.map((tag) => ({\n description: tag.description,\n id: tag.id,\n name: tag.name,\n recordingId: tag.recordingId,\n time: tag.time,\n timeAfter: tag.timeAfter,\n timeBefore: tag.timeBefore,\n typeOfPlay: tag.typeOfPlay,\n typeOfPlaySource: tag.typeOfPlaySource,\n userId: tag.userId,\n })),\n clientIds: response.clientIds,\n videoSources: videoSources,\n matchVideoSource: getDefaultVideoSource(videoSources),\n name: response.name,\n date: response.date,\n startRecordingTime: response.startRecordingTime,\n usersInfo: response.usersInfo.map((userInfo) => ({\n userId: userInfo.userId,\n firstName: userInfo.firstName,\n lastName: userInfo.lastName,\n })),\n };\n};\n","import { UseQueryResult } from '@tanstack/react-query';\nimport orderBy from 'lodash/orderBy';\nimport some from 'lodash/some';\nimport { useCallback, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { matchOrLiveTaggingEventsUrl } from 'api/routes';\nimport { useUser } from 'shared/contexts/app-state';\nimport { SortDirection, TaggingEvents } from 'shared/types';\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nimport {\n applyTypeOfPlayFilter,\n applyUserFilter,\n generateTaggingEventsFilters,\n TaggingEventsFilterOptions,\n} from './utils';\nimport { queryClient } from '../../config';\nimport { transformTaggingEvents } from '../transformers/tagging-events';\nimport { TaggingEvent, TaggingEventsFilters, TaggingEventsOptions } from '../types';\n\ninterface useFetchTaggingToolEventsInterface {\n (\n recordingId: string,\n options?: TaggingEventsOptions,\n ): UseQueryResult<TaggingEvents> & {\n addTaggingEvent: (data: TaggingEvent) => void;\n addMultipleTaggingEvents: (data: TaggingEvent[]) => void;\n appliedFilters: TaggingEventsFilters;\n filterOptions: TaggingEventsFilterOptions;\n hasFiltersApplied: boolean;\n removeTaggingEvent: (id: string) => void;\n resetFilters: () => TaggingEventsFilters;\n setFilters: (value: TaggingEventsFilters) => void;\n setQueryData: (data: TaggingEvents) => void;\n taggingEvents: TaggingEvent[];\n updateTaggingEvent: (taggingEvent: TaggingEvent) => void;\n };\n}\n\nexport const DEFAULT_TAGGING_EVENTS_FILTERS: TaggingEventsFilters = {\n [TypeOfPlay.Offense]: { options: [], all: true },\n [TypeOfPlay.Defense]: { options: [], all: true },\n [TypeOfPlay.Transition]: { options: [], all: true },\n [TypeOfPlay.imported]: { options: [], all: true },\n user: { options: [], all: false },\n};\n\nexport const useFetchTaggingEvents: useFetchTaggingToolEventsInterface = (\n recordingId,\n options = {\n isLive: false,\n sortOrder: SortDirection.DESC,\n filters: DEFAULT_TAGGING_EVENTS_FILTERS,\n },\n) => {\n const user = useUser();\n const { t } = useTranslation();\n const initialFilters = useMemo(\n () => ({\n ...DEFAULT_TAGGING_EVENTS_FILTERS,\n user: { options: [user.id], all: false },\n }),\n [user.id],\n );\n const queryRef = useMemo(() => [`tagging-events-${recordingId}`, 'tagging-events'], [recordingId]);\n const [appliedFilters, setAppliedFilters] = useState<TaggingEventsFilters>(options.filters ?? initialFilters);\n const request = useFetchRequest<TaggingEvents>({\n queryRef,\n url: matchOrLiveTaggingEventsUrl(recordingId, options.isLive),\n transformer: transformTaggingEvents,\n options: { staleTime: 100 },\n });\n\n const taggingEvents: TaggingEvent[] = useMemo(() => {\n if (!request?.data) return [];\n\n const filteredTags = request.data.tags\n .filter(applyTypeOfPlayFilter(appliedFilters, TypeOfPlay.Offense))\n .filter(applyTypeOfPlayFilter(appliedFilters, TypeOfPlay.Defense))\n .filter(applyTypeOfPlayFilter(appliedFilters, TypeOfPlay.Transition))\n .filter(applyTypeOfPlayFilter(appliedFilters, TypeOfPlay.imported))\n .filter(applyUserFilter(appliedFilters));\n\n return orderBy(filteredTags, ['time'], [options.sortOrder ?? SortDirection.ASC]);\n }, [appliedFilters, request.data, options]);\n\n const setQueryData = useCallback(\n (data: TaggingEvents) => {\n queryClient.setQueryData(queryRef, data);\n },\n [queryRef],\n );\n\n const addTaggingEvent = useCallback(\n (event: TaggingEvent) => {\n if (request.data) {\n setQueryData({ ...request.data, tags: [...(request.data?.tags ?? []), event] });\n }\n },\n [setQueryData, request.data],\n );\n\n const addMultipleTaggingEvents = useCallback(\n (events: TaggingEvent[]) => {\n if (request.data) {\n setQueryData({ ...request.data, tags: [...(request.data?.tags ?? []), ...events] });\n }\n },\n [setQueryData, request.data],\n );\n\n const removeTaggingEvent = useCallback(\n (id: string) => {\n if (request.data) {\n setQueryData({ ...request.data, tags: (request.data?.tags ?? []).filter((tag) => tag.id !== id) });\n }\n },\n [setQueryData, request.data],\n );\n\n const updateTaggingEvent = useCallback(\n (updatedTaggingEvent: TaggingEvent) => {\n if (request.data?.tags) {\n setQueryData({\n ...request.data,\n tags: (request.data.tags ?? []).map((taggingEvent) =>\n taggingEvent.id === updatedTaggingEvent.id ? updatedTaggingEvent : taggingEvent,\n ),\n });\n }\n },\n [setQueryData, request.data],\n );\n\n const filterOptions = useMemo(() => {\n return generateTaggingEventsFilters(request?.data?.tags ?? [], request.data?.usersInfo ?? [], t);\n }, [t, request?.data]);\n\n const setFilters = useCallback(\n (value: TaggingEventsFilters) => {\n setAppliedFilters(value);\n },\n [setAppliedFilters],\n );\n\n const resetFilters = useCallback(() => {\n setAppliedFilters(initialFilters);\n return initialFilters;\n }, [initialFilters]);\n\n const hasFiltersApplied = useMemo(() => {\n return some(appliedFilters, (filterType) => filterType.options.length > 0);\n }, [appliedFilters]);\n\n return {\n ...request,\n addMultipleTaggingEvents,\n addTaggingEvent,\n appliedFilters,\n filterOptions,\n hasFiltersApplied,\n removeTaggingEvent,\n resetFilters,\n setFilters,\n setQueryData,\n taggingEvents,\n updateTaggingEvent,\n };\n};\n","import { useQuery } from '@tanstack/react-query';\n\nimport {\n DEFAULT_TACTICAL_CAMERA_PLAYING_MODE,\n EPISODES_PLAYING_MODE,\n TACTICAL_CAMERA_WITH_OVERLAYS_PLAYING_MODE,\n TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE,\n} from 'shared/components/video-player/defaultPlayingModes';\nimport { PlayingMode, PlayingModes, PlaylistItemType } from 'shared/components/video-player/types';\nimport { MatchWithEpisodes } from 'shared/types/match/types';\nimport { TacticIdOrAll } from 'shared/types/playlist/types';\n\nimport { generatePlaylistItemFromEpisodes } from '../../components/tactical-analysis/utils/generate-timeline-playlist';\n\ninterface Params {\n recordingId: string;\n matchWithEpisodes: MatchWithEpisodes | undefined;\n selectedTactics: TacticIdOrAll[];\n selectedPlayingMode: PlayingMode | undefined;\n areTimelineOverlaysEnabled: boolean;\n}\n\nconst getValidPlayingMode = (playingMode: PlayingMode | undefined, hasHomographies: boolean) => {\n // Validate playing mode preset. EPISODE mode is not valid for match with hasHomographies\n if (!playingMode) return;\n if (playingMode.mode === PlayingModes.EPISODES && hasHomographies) {\n return TACTICAL_CAMERA_WITH_OVERLAYS_PLAYING_MODE;\n }\n\n if (playingMode.mode === PlayingModes.EPISODES && !hasHomographies) {\n return playingMode;\n }\n\n return playingMode;\n};\n\nexport const generateTacticalAnalysisPlaylistItems = ({\n recordingId,\n matchWithEpisodes,\n selectedTactics,\n selectedPlayingMode,\n areTimelineOverlaysEnabled,\n}: Params) => {\n return new Promise<PlaylistItemType[]>((resolve) => {\n const recordingEpisodes = matchWithEpisodes?.episodes;\n const recordingMatch = matchWithEpisodes?.match;\n const defaultVideoSource = matchWithEpisodes?.match.defaultVideoSource;\n const duration = matchWithEpisodes?.match.defaultVideoSource.duration;\n\n const shouldUseEpisodesMode =\n recordingEpisodes && recordingEpisodes.length > 0 && recordingMatch && !recordingMatch.hasHomographies;\n const shouldUseTacticalCameraMode =\n recordingMatch && !recordingMatch.hasHomographies && recordingEpisodes && recordingEpisodes.length === 0;\n const shouldUseTacticalCameraModeWithEpisodes =\n recordingMatch && recordingMatch.hasHomographies && recordingEpisodes && recordingEpisodes.length > 0;\n\n const playingMode: PlayingMode = areTimelineOverlaysEnabled\n ? {\n ...DEFAULT_TACTICAL_CAMERA_PLAYING_MODE,\n ...(shouldUseEpisodesMode && EPISODES_PLAYING_MODE),\n ...(shouldUseTacticalCameraMode && TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE),\n ...(shouldUseTacticalCameraModeWithEpisodes && TACTICAL_CAMERA_WITH_OVERLAYS_PLAYING_MODE),\n }\n : {\n ...DEFAULT_TACTICAL_CAMERA_PLAYING_MODE,\n ...(recordingEpisodes && recordingEpisodes?.length > 0 && EPISODES_PLAYING_MODE),\n };\n\n const hasHomographies =\n areTimelineOverlaysEnabled && recordingMatch?.hasHomographies !== undefined\n ? recordingMatch?.hasHomographies\n : false;\n\n const validateSelectedPlayingMode = getValidPlayingMode(selectedPlayingMode, hasHomographies);\n\n if (!recordingMatch || !recordingEpisodes || !defaultVideoSource) {\n return;\n }\n\n resolve(\n generatePlaylistItemFromEpisodes({\n episodes: recordingEpisodes,\n fullVideoSourceDuration: duration,\n tacticalCameraVideo: defaultVideoSource,\n playingMode: validateSelectedPlayingMode || playingMode,\n recordingId: recordingId,\n fundamentalsSelected: selectedTactics,\n hasHomographies,\n }),\n );\n });\n};\n\nexport const useGenerateTacticalAnalysisPlaylistItems = (params: Params) => {\n return useQuery<PlaylistItemType[]>(\n [`generate-playlist-tactical-analysis-${params.recordingId}`],\n () => generateTacticalAnalysisPlaylistItems(params),\n {\n enabled: params.matchWithEpisodes !== undefined,\n },\n );\n};\n","import { atomFamily, useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { Row } from '../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\n\nexport const rowAtomFamily = atomFamily<Row, string>({\n key: 'table-row',\n default: {\n id: '',\n type: 'episodes',\n isHidden: false,\n teamId: '',\n clips: [],\n title: '',\n isSelected: false,\n scenarioSubRowDisabled: undefined,\n },\n});\n\nexport const rowGroupIsCollapsedFamily = atomFamily<boolean, string>({\n key: 'table-row-group-collapsed',\n default: false,\n});\n\nexport const rowGroupHighlighted = atomFamily<boolean, string>({\n key: 'table-row-group-highlighted',\n default: false,\n});\n\nexport const useRow = (rowId: string) => {\n return useRecoilValue(rowAtomFamily(rowId));\n};\n\nexport const useSetRowGroupIsCollapsed = (rowId: string) => {\n return useSetRecoilState(rowGroupIsCollapsedFamily(rowId));\n};\n\nexport const useRowGroupIsCollapsed = (rowId: string) => {\n return useRecoilValue(rowGroupIsCollapsedFamily(rowId));\n};\n\nexport const useSetRowIsHighlighted = (rowId: string) => {\n return useSetRecoilState(rowGroupHighlighted(rowId));\n};\n\nexport const useRowIsHighlighted = (rowId: string) => {\n return useRecoilValue(rowGroupHighlighted(rowId));\n};\n","import { last } from 'lodash';\nimport { atom, atomFamily, CallbackInterface, useRecoilCallback, useRecoilValue } from 'recoil';\n\nimport { Clip } from './types/clip';\nimport { Row } from './types/row';\nimport { rowAtomFamily } from '../../../components/timeline/timeline-table/store/atoms';\n\nexport interface ClipWithSelection extends Clip {\n isSelected: boolean;\n isSelectedForPlaying: boolean;\n}\n\nexport const clipAtomFamily = atomFamily<ClipWithSelection, string>({\n key: 'clip-with-selection',\n default: {\n id: '',\n startTime: 0,\n endTime: 0,\n type: 'episode',\n rowId: '',\n elementId: '',\n isSelected: false,\n isSelectedForPlaying: false,\n title: '',\n },\n});\n\nconst clipIdsAtom = atom<string[]>({\n key: 'clip-ids-list',\n default: [],\n});\n\nconst rowIdsAtom = atom<string[]>({\n key: 'tracks-ids-list',\n default: [],\n});\n\nconst lastSelectedClipIdAtom = atom<string>({\n key: 'last-selected-clip',\n default: '',\n});\n\nconst selectedClipIdsAtom = atom<string[]>({\n key: 'clip-ids-selected-list',\n default: [],\n});\n\nexport const useClipsIdsSelection = () => {\n return useRecoilValue(selectedClipIdsAtom);\n};\n\nfunction notEmpty<TValue>(value: TValue | null | undefined): value is TValue {\n return value !== null && value !== undefined;\n}\n\nconst getClipsFromClip = (clip: Clip): Clip[] => {\n if (clip.clips) {\n return clip.clips.reduce<Clip[]>((clips, clip) => {\n const clipsFromClip = getClipsFromClip(clip);\n\n return [...clips, ...clipsFromClip];\n }, []);\n }\n\n return [clip];\n};\n\nexport const selectionActionsCreator = (set: CallbackInterface['set'], snapshot: CallbackInterface['snapshot']) => {\n const setLastSelectedClip = (clipId: string) => set(lastSelectedClipIdAtom, clipId);\n const getSelectedClipIds = () => snapshot.getLoadable(selectedClipIdsAtom).valueMaybe() ?? [];\n const replaceSelectedClipIds = (updatedClipsSelected: string[]) =>\n set(selectedClipIdsAtom, () => updatedClipsSelected);\n const getListOfClipIds = () => snapshot.getLoadable(clipIdsAtom).valueMaybe() ?? [];\n const getListOfRowIds = () => snapshot.getLoadable(rowIdsAtom).valueMaybe() ?? [];\n const getLastSelectedClipId = () => snapshot.getLoadable(lastSelectedClipIdAtom).valueMaybe() ?? '';\n const getClip = (clipId: string) => snapshot.getLoadable(clipAtomFamily(clipId)).valueMaybe();\n const getClipList = (clipIds: string[]): Clip[] => clipIds.map((clipId) => getClip(clipId)).filter(notEmpty);\n const getRow = (rowId: string) => snapshot.getLoadable(rowAtomFamily(rowId)).valueMaybe();\n const getRowList = (rowIds: string[]): Row[] => rowIds.map((rowId) => getRow(rowId)).filter(notEmpty);\n const getFiltersClips = (): Clip[] => {\n const clipIds = getListOfClipIds();\n const clips = getClipList(clipIds);\n\n return clips.filter((clip) => clip.type === 'filter');\n };\n const getRowClips = (rowId: string): Clip[] => {\n const row = getRow(rowId);\n if (!row) return [];\n\n if (row.type === 'filters') {\n return getFiltersClips();\n }\n\n return row.clips.reduce<Clip[]>((clips, clip) => {\n const clipsFromClip = getClipsFromClip(clip);\n\n return [...clips, ...clipsFromClip];\n }, []);\n };\n\n const initClip = (clip: Clip) =>\n set(clipAtomFamily(clip.id), {\n ...clip,\n isSelected: false,\n isSelectedForPlaying: false,\n });\n\n const changeClipSelection = (clipId: string, value: boolean) => {\n set(clipAtomFamily(clipId), (clip) => ({\n ...clip,\n isSelected: value,\n }));\n };\n\n const selectClip = (clipId: string) => {\n set(clipAtomFamily(clipId), (clip) => ({ ...clip, isSelected: true }));\n };\n\n const unSelectClip = (clipId: string) => {\n set(clipAtomFamily(clipId), (clip) => ({ ...clip, isSelected: false }));\n };\n\n const toggleClip = (clipId: string) => {\n set(clipAtomFamily(clipId), (clip) => ({\n ...clip,\n isSelected: !clip.isSelected,\n }));\n setLastSelectedClip(clipId);\n };\n\n const resetSelection = () => {\n const clipIds = getListOfClipIds();\n const rowIds = getListOfRowIds();\n\n set(lastSelectedClipIdAtom, () => '');\n set(selectedClipIdsAtom, () => []);\n clipIds.forEach((clipId) =>\n set(clipAtomFamily(clipId), (clip) => ({ ...clip, isSelected: false, isDisabled: false })),\n );\n rowIds.forEach((rowId) => set(rowAtomFamily(rowId), (row) => ({ ...row, isDisabled: false })));\n };\n\n const clearSelectedClips = () => {\n setLastSelectedClip('');\n getSelectedClipIds().forEach((clipId) => unSelectClip(clipId));\n set(selectedClipIdsAtom, () => []);\n };\n\n const updateMultipleClips = (clipIds: string[], clearSelection = false) => {\n if (clearSelection) clearSelectedClips();\n\n const selectedClips = clearSelection ? [] : getSelectedClipIds();\n\n replaceSelectedClipIds(selectedClips.concat(clipIds.filter((id) => !selectedClips.includes(id))));\n clipIds.forEach(selectClip);\n };\n\n const removeMultipleClipIds = (clipIds: string[]) => {\n set(selectedClipIdsAtom, (selectedClips) => selectedClips.filter((id) => !clipIds.includes(id)));\n clipIds.forEach(unSelectClip);\n };\n\n const addClipIdToSelection = (clipId: string) => {\n set(selectedClipIdsAtom, (selectedClips) => [...new Set([...selectedClips, clipId])]);\n selectClip(clipId);\n };\n\n const selectSingleClip = (clipId: string) => {\n clearSelectedClips();\n selectClip(clipId);\n set(selectedClipIdsAtom, () => [clipId]);\n setLastSelectedClip(clipId);\n };\n\n const replaceMultipleClips = (clipIds: string[]) => {\n clearSelectedClips();\n clipIds.forEach(selectClip);\n set(selectedClipIdsAtom, () => clipIds);\n setLastSelectedClip(last(clipIds) ?? '');\n };\n\n const removeClipIdFromSelection = (clipId: string) => {\n unSelectClip(clipId);\n set(selectedClipIdsAtom, (selectedClips) => selectedClips.filter((id) => id !== clipId));\n setLastSelectedClip(clipId);\n };\n\n const addClipsToSelection = (clips: Clip[]) => {\n set(clipIdsAtom, (currVal) => [...currVal, ...clips.map((clip) => clip.id)]);\n clips.forEach((clip) => initClip(clip));\n };\n\n const selectPlaylistSelectionClips = (clipsIds: string[]) => {\n clipsIds.forEach((clipId) => {\n set(clipAtomFamily(clipId), (clip) => ({ ...clip, isSelectedForPlaying: true }));\n });\n };\n\n const unselectPlayingSelectionClips = (skipClipsIds?: string[]) => {\n getListOfClipIds().forEach((clipId) => {\n const clip = getClip(clipId);\n if (!clip || !clip.isSelectedForPlaying || (skipClipsIds && skipClipsIds.includes(clipId))) return;\n\n set(clipAtomFamily(clipId), (clip) => ({ ...clip, isSelectedForPlaying: false }));\n });\n };\n\n const selectPlayingSelectionRow = (rowId?: string, team?: 'home' | 'opponent') => {\n if (rowId) {\n set(rowAtomFamily(rowId), (row) => ({ ...row, isSelected: true, scenarioSubRowDisabled: team }));\n }\n };\n\n const resetSelectedRow = () => {\n getListOfRowIds().forEach((rowId) => {\n const row = getRow(rowId);\n\n if (row && row.isSelected) {\n set(rowAtomFamily(rowId), (row) => ({\n ...row,\n isSelected: false,\n scenarioSubRowDisabled: undefined,\n }));\n }\n });\n };\n\n return {\n addClipIdToSelection,\n addClipsToSelection,\n changeClipSelection,\n clearSelectedClips,\n selectPlaylistSelectionClips,\n unselectPlayingSelectionClips,\n selectRow: selectPlayingSelectionRow,\n getClip,\n getClipList,\n getFiltersClips,\n getLastSelectedClipId,\n getListOfClipIds,\n getListOfRowIds,\n getRow,\n getRowList,\n getRowClips,\n getSelectedClips: getSelectedClipIds,\n removeClipIdFromSelection,\n removeMultipleClipIds,\n replaceMultipleClips,\n replaceSelectedClipIds,\n resetSelectedRow,\n resetSelection,\n selectClip,\n selectSingleClip,\n setLastSelectedClip,\n toggleClip,\n unSelectClip,\n updateMultipleClips,\n };\n};\n\nexport const useResetTimelineSelectionAtoms = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n () => {\n const actions = selectionActionsCreator(set, snapshot);\n\n return actions.resetSelection();\n },\n [],\n );\n};\n\nexport const useValidateSelection = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipIds: string[]) => {\n const actions = selectionActionsCreator(set, snapshot);\n\n const selectedClips = actions.getSelectedClips();\n\n actions.replaceSelectedClipIds(selectedClips.filter((id) => clipIds.includes(id)));\n },\n [],\n );\n};\n\nexport const useRowClips = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (rowId: string) => {\n const actions = selectionActionsCreator(set, snapshot);\n\n return actions.getRowClips(rowId);\n },\n [],\n );\n};\n\nexport const useSelectPlayingSelectionClipsIds = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipsIds: string[]) => {\n const actions = selectionActionsCreator(set, snapshot);\n\n actions.selectPlaylistSelectionClips(clipsIds);\n },\n [],\n );\n};\n\nexport const useUnselectPlayingSelectionClips = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (skipClipsIds?: string[]) => {\n const actions = selectionActionsCreator(set, snapshot);\n\n actions.unselectPlayingSelectionClips(skipClipsIds);\n },\n [],\n );\n};\n\nexport const useSelectRow = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (rowId?: string, team?: 'home' | 'opponent') => {\n const actions = selectionActionsCreator(set, snapshot);\n\n actions.selectRow(rowId, team);\n },\n [],\n );\n};\n\nexport const useUnselectRows = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n () => {\n const actions = selectionActionsCreator(set, snapshot);\n\n actions.resetSelectedRow();\n },\n [],\n );\n};\n\nexport const useGetRowsList = () => {\n return useRecoilCallback(\n ({ snapshot }) =>\n (rowIds: string[]) => {\n const actions = selectionActionsCreator(() => {}, snapshot);\n\n return actions.getRowList(rowIds);\n },\n [],\n );\n};\n\nexport const useGetClipsList = () => {\n return useRecoilCallback(\n ({ snapshot }) =>\n (clipIds: string[]) => {\n const actions = selectionActionsCreator(() => {}, snapshot);\n\n return actions.getClipList(clipIds);\n },\n [],\n );\n};\n\nexport const useGetClip = () => {\n return useRecoilCallback(\n ({ snapshot }) =>\n (clipId: string) => {\n const actions = selectionActionsCreator(() => {}, snapshot);\n\n return actions.getClip(clipId);\n },\n [],\n );\n};\n\nexport const useAddClipsToSelectionList = () => {\n const validateSelection = useValidateSelection();\n\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clips: Clip[]) => {\n const actions = selectionActionsCreator(set, snapshot);\n\n const filteredClips = clips.filter(\n (clip) => clip.type !== 'not-effective-time' && clip.type !== 'block-container',\n );\n\n set(clipIdsAtom, () => filteredClips.map((clip) => clip.id));\n\n filteredClips.forEach((clip) => {\n if (!actions.getClip(clip.id)?.id) {\n set(clipAtomFamily(clip.id), { ...clip, isSelected: false, isSelectedForPlaying: false });\n }\n });\n\n validateSelection(filteredClips.map((clip) => clip.id));\n },\n [],\n );\n};\n\nexport const useAddRowsToSelectionList = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (rows: Row[], teamId: string) => {\n const actions = selectionActionsCreator(set, snapshot);\n\n set(rowIdsAtom, () => rows.map((row) => row.id));\n rows.forEach((row) => {\n if (!actions.getRow(row.id)?.id) {\n set(rowAtomFamily(row.id), { ...row, isHidden: Boolean(row.teamId && row.teamId !== teamId) });\n }\n });\n },\n [],\n );\n};\n\nexport const useAddRowToSelectionList = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (row: Row) => {\n const actions = selectionActionsCreator(set, snapshot);\n\n set(rowIdsAtom, (prev) => [...prev, row.id]);\n if (!actions.getRow(row.id)?.id) {\n set(rowAtomFamily(row.id), { ...row, isHidden: false });\n }\n },\n [],\n );\n};\n\nexport const useAddClipShiftSelection = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipId: string, isSelectionMode?: boolean) => {\n const actions = selectionActionsCreator(set, snapshot);\n\n const clipIds = isSelectionMode\n ? actions.getListOfClipIds().reduce<string[]>((acc, clipId) => {\n const clipWithSelection = actions.getClip(clipId);\n if (clipWithSelection?.isSelectedForPlaying) {\n acc = [...acc, clipId];\n }\n return acc;\n }, [])\n : actions.getListOfClipIds();\n\n const lastSelectedClipId = actions.getLastSelectedClipId();\n const lastClickedClipValue = actions.getClip(lastSelectedClipId ?? '')?.isSelected ?? false;\n\n if (!lastSelectedClipId) {\n actions.toggleClip(clipId);\n actions.setLastSelectedClip(clipId);\n } else {\n const firstClipIndex = clipIds.findIndex((id) => id === lastSelectedClipId);\n const lastClipIndex = clipIds.findIndex((id) => id === clipId);\n\n const clipsRangeToSelect = clipIds\n .slice(Math.min(firstClipIndex, lastClipIndex), Math.max(firstClipIndex, lastClipIndex) + 1)\n .filter((id) => id !== lastSelectedClipId);\n\n lastClickedClipValue\n ? actions.updateMultipleClips(clipsRangeToSelect)\n : actions.removeMultipleClipIds(clipsRangeToSelect);\n }\n },\n [],\n );\n};\n\nexport const useAddClipsShiftSelection = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipsId: string[]) => {\n const actions = selectionActionsCreator(set, snapshot);\n const listOfClipIds = actions.getListOfClipIds();\n\n const lastSelectedClipId = actions.getLastSelectedClipId();\n const lastClickedClipValue = actions.getClip(lastSelectedClipId ?? '')?.isSelected ?? false;\n\n if (!lastSelectedClipId) {\n clipsId.forEach((clipId) => {\n actions.toggleClip(clipId);\n actions.setLastSelectedClip(clipId);\n });\n } else {\n const firstClipIndex = listOfClipIds.findIndex((id) => id === lastSelectedClipId);\n const lastClipIndex = listOfClipIds.findIndex((id) => id === clipsId[clipsId.length - 1]);\n\n const clipsRangeToSelect = listOfClipIds\n .slice(Math.min(firstClipIndex, lastClipIndex), Math.max(firstClipIndex, lastClipIndex) + 1)\n .filter((id) => id !== lastSelectedClipId);\n\n lastClickedClipValue\n ? actions.updateMultipleClips(clipsRangeToSelect)\n : actions.removeMultipleClipIds(clipsRangeToSelect);\n }\n },\n [],\n );\n};\n\nexport const useAddRowClips = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (rowId: string, clearSelection = false) => {\n const actions = selectionActionsCreator(set, snapshot);\n const rowClips = actions.getRowClips(rowId);\n\n if (!rowClips) return;\n\n actions.updateMultipleClips(\n rowClips.map((clip) => clip.id),\n Boolean(clearSelection),\n );\n },\n [],\n );\n};\n\nexport const useAddClipsAction = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipIds: string[]) => {\n const actions = selectionActionsCreator(set, snapshot);\n actions.updateMultipleClips(clipIds);\n },\n [],\n );\n};\n\nexport const useReplaceMultipleClipsAction = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipIds: string[]) => {\n const actions = selectionActionsCreator(set, snapshot);\n actions.replaceMultipleClips(clipIds);\n },\n [],\n );\n};\n\nexport const useToggleClipSelection = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipId: string) => {\n const actions = selectionActionsCreator(set, snapshot);\n const clip = actions.getClip(clipId);\n const selectedClipIds = actions.getSelectedClips();\n\n if (!clip) return;\n\n if (clip.isSelected && selectedClipIds.length <= 1) {\n actions.removeClipIdFromSelection(clipId);\n } else {\n actions.selectSingleClip(clipId);\n }\n },\n [],\n );\n};\n\nexport const useToggleCtrlClipSelection = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipId: string) => {\n const actions = selectionActionsCreator(set, snapshot);\n const clip = actions.getClip(clipId);\n\n if (!clip) return;\n\n if (clip.isSelected) {\n actions.removeClipIdFromSelection(clipId);\n } else {\n actions.addClipIdToSelection(clipId);\n }\n },\n [],\n );\n};\n\nexport const useToggleClipsSelection = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipIds: string[]) => {\n const actions = selectionActionsCreator(set, snapshot);\n const selectedClips = actions.getSelectedClips();\n const clipsToSelect = clipIds.filter((id) => !selectedClips.includes(id));\n\n actions.updateMultipleClips(clipsToSelect, true);\n },\n [],\n );\n};\n\nexport const useToggleCtrlClipsSelection = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipsIds: string[]) => {\n const actions = selectionActionsCreator(set, snapshot);\n const clips = actions.getClipList(clipsIds);\n\n if (!clips.length) return;\n\n clips.forEach((clip) => {\n if (clip.isSelected) {\n actions.removeClipIdFromSelection(clip.id);\n } else {\n actions.addClipIdToSelection(clip.id);\n }\n });\n },\n [],\n );\n};\n\nexport const useRemoveClipFromSelection = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipId: string) => {\n const actions = selectionActionsCreator(set, snapshot);\n const clip = actions.getClip(clipId);\n\n if (!clip) return;\n\n set(lastSelectedClipIdAtom, clipId);\n set(selectedClipIdsAtom, (currVal) => currVal.filter((id) => clipId !== id));\n set(clipAtomFamily(clipId), (clip) => ({ ...clip, isSelected: false }));\n },\n [],\n );\n};\n\nexport const useCleanSelection = () => {\n return useRecoilCallback(\n ({ set, snapshot }) =>\n () => {\n const actions = selectionActionsCreator(set, snapshot);\n actions.resetSelectedRow();\n actions.clearSelectedClips();\n },\n [],\n );\n};\n","import { useCallback } from 'react';\nimport { atom, useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { TimelinePinScenariosPreset } from 'shared/constants/user-presets/userPresetsClasses';\n\nimport { useSaveUserPreset } from '../../../../api/user-presets/use-save-user-preset';\n\nconst pinScenariosAtom = atom<boolean>({\n key: 'pin-scenarios',\n default: false,\n});\n\nexport const usePinScenarios = () => {\n return useRecoilValue(pinScenariosAtom);\n};\n\nexport const useSetPinScenarios = () => {\n const { savePreset } = useSaveUserPreset();\n const setPinScenario = useSetRecoilState(pinScenariosAtom);\n\n return useCallback(\n (value: boolean, updatePreset = true) => {\n const pinScenariosPreset = new TimelinePinScenariosPreset(value);\n updatePreset && savePreset({ data: pinScenariosPreset });\n setPinScenario(value);\n },\n [savePreset, setPinScenario],\n );\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useSetPresetPlayingMode = (recordingId: string) => {\n return useSetRecoilState(timelineMatchAtoms.playingMode(recordingId));\n};\n\nexport const usePresetPlayingMode = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.playingMode(recordingId));\n};\n","import { useCallback, useMemo } from 'react';\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { TimelineAppliedFiltersPreset } from 'shared/constants/user-presets/userPresetsClasses';\nimport { RecordingsFilters } from 'shared/types/recording/types';\n\nimport { useSaveUserPreset } from '../../../../api/user-presets/use-save-user-preset';\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useTacticalAnalysisAppliedFilters = (recordingId: string) => {\n const appliedFilters = useRecoilValue(timelineMatchAtoms.appliedFilters(recordingId));\n\n return useMemo(\n () => ({\n appliedFilters,\n areFiltersApplied:\n appliedFilters.eventsEnding || appliedFilters.eventsStarting || appliedFilters.scenariosOrTacticsInside,\n }),\n [appliedFilters],\n );\n};\n\nexport const useSetTacticalAnalysisAppliedFilters = (recordingId: string) => {\n const { savePreset } = useSaveUserPreset();\n const setAppliedFilters = useSetRecoilState(timelineMatchAtoms.appliedFilters(recordingId));\n\n return useCallback(\n (appliedFilters: RecordingsFilters, updatePreset = true) => {\n updatePreset && savePreset({ data: new TimelineAppliedFiltersPreset(appliedFilters, recordingId) });\n setAppliedFilters(appliedFilters);\n },\n [recordingId, savePreset, setAppliedFilters],\n );\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useSetTacticalAnalysisSelectedTactics = (recordingId: string) => {\n return useSetRecoilState(timelineMatchAtoms.selectedTactics(recordingId));\n};\n\nexport const useTacticalAnalysisSelectedTactics = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.selectedTactics(recordingId));\n};\n","import { useCallback } from 'react';\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { useSaveUserPreset } from 'api/user-presets/use-save-user-preset';\nimport {\n TimelineShowBallPossession,\n TimelineShowNoBallPossession,\n} from 'shared/constants/user-presets/userPresetsClasses';\n\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useSetTimelineShowBallPossession = (recordingId: string) => {\n const setShowBallPossession = useSetRecoilState(timelineMatchAtoms.showBallPossession(recordingId));\n const { savePreset } = useSaveUserPreset();\n\n return useCallback(\n (show: boolean, updatePreset = true) => {\n updatePreset && savePreset({ data: new TimelineShowBallPossession(show, recordingId) });\n setShowBallPossession(show);\n },\n [savePreset, setShowBallPossession, recordingId],\n );\n};\n\nexport const useTimelineShowBallPossession = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.showBallPossession(recordingId));\n};\n\nexport const useSetTimelineNoShowBallPossession = (recordingId: string) => {\n const setShowNoBallPossession = useSetRecoilState(timelineMatchAtoms.showNoBallPossession(recordingId));\n const { savePreset } = useSaveUserPreset();\n\n return useCallback(\n (show: boolean, updatePreset = true) => {\n updatePreset && savePreset({ data: new TimelineShowNoBallPossession(show, recordingId) });\n setShowNoBallPossession(show);\n },\n [savePreset, setShowNoBallPossession, recordingId],\n );\n};\n\nexport const useTimelineShowNoBallPossession = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.showNoBallPossession(recordingId));\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineAtoms } from '../../atoms';\n\nexport const useSetTimelineHeadersWidth = () => {\n return useSetRecoilState(timelineAtoms.headersWidth);\n};\n\nexport const useTimelineHeadersWidth = () => {\n return useRecoilValue(timelineAtoms.headersWidth);\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineAtoms } from '../../atoms';\n\nexport const useSetTimelineHeight = () => {\n return useSetRecoilState(timelineAtoms.height);\n};\n\nexport const useTimelineHeight = () => {\n return useRecoilValue(timelineAtoms.height);\n};\n","import { atomFamily, useRecoilValue, useSetRecoilState } from 'recoil';\n\nconst timelineInitialTimeAtom = atomFamily<number, string>({\n key: 'tactical-analysis-initial-time',\n default: undefined,\n});\n\nexport const useSetTimelineInitialTime = (id: string) => {\n return useSetRecoilState(timelineInitialTimeAtom(id));\n};\n\nexport const useTimelineInitialTime = (id: string) => {\n return useRecoilValue(timelineInitialTimeAtom(id));\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useSetTacticalAnalysisTeams = (recordingId: string) => {\n return useSetRecoilState(timelineMatchAtoms.teams(recordingId));\n};\n\nexport const useTacticalAnalysisTeams = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.teams(recordingId));\n};\n","import { useCallback, useMemo } from 'react';\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { useSaveUserPreset } from 'api/user-presets/use-save-user-preset';\nimport { TimelineTeamIdFocusPreset } from 'shared/constants/user-presets/userPresetsClasses';\n\nimport { timelineMatchAtoms } from '../../atoms';\nimport { useTacticalAnalysisTeams } from '../use-tactical-analysis-teams';\n\ntype Response = (recordingId: string, updatePreset?: boolean) => void;\n\nexport const useSetTimelineTeamIdFocus = (recordingId: string): Response => {\n const setTimelineTeamIdFocus = useSetRecoilState(timelineMatchAtoms.teamIdFocus(recordingId));\n const { savePreset } = useSaveUserPreset();\n\n return useCallback(\n (teamId: string, updatePreset = true) => {\n updatePreset && savePreset({ data: new TimelineTeamIdFocusPreset(teamId, recordingId) });\n setTimelineTeamIdFocus(teamId);\n },\n [savePreset, recordingId, setTimelineTeamIdFocus],\n );\n};\n\nexport const useTeamUtils = (recordingId: string) => {\n const teams = useTacticalAnalysisTeams(recordingId);\n return useMemo(\n () => ({\n isHomeTeam: (teamId: string) => Boolean(teams?.homeTeam?.id && teamId && teams.homeTeam.id === teamId),\n isOpponentTeam: (teamId: string) =>\n Boolean(teams?.opponentTeam?.id && teamId && teams.opponentTeam.id === teamId),\n }),\n [teams],\n );\n};\n\nexport const useTimelineTeamIdFocus = (recordingId: string) => {\n const teams = useTacticalAnalysisTeams(recordingId);\n const teamIdFocus = useRecoilValue(timelineMatchAtoms.teamIdFocus(recordingId));\n\n return useMemo(\n () => ({\n isHomeTeamSelected: Boolean(teams?.homeTeam?.id && teamIdFocus && teams.homeTeam.id === teamIdFocus),\n isOpponentTeamSelected: Boolean(teams?.opponentTeam?.id && teamIdFocus && teams.opponentTeam.id === teamIdFocus),\n teamIdFocus,\n }),\n [teams, teamIdFocus],\n );\n};\n","import React, { memo, useEffect, useState } from 'react';\n\nimport { ZoomLevelsType } from 'shared/types/zoom-range/zoomLevels';\n\ninterface Props {\n max: ZoomLevelsType;\n min: ZoomLevelsType;\n onChange: (value: ZoomLevelsType) => void;\n step: 1;\n value?: ZoomLevelsType;\n}\n\nconst RangeSlider = ({ min, max, step, value, onChange }: Props) => {\n const [sliderValue, setSliderValue] = useState<ZoomLevelsType>(value ?? min);\n\n const changeCallback = (event: React.FormEvent<HTMLInputElement>) => {\n const target = event.target as HTMLTextAreaElement;\n const targetValue = parseInt(target.value) as ZoomLevelsType;\n\n onChange(targetValue);\n setSliderValue(targetValue);\n };\n\n useEffect(() => {\n if (value !== undefined && value >= 0) {\n setSliderValue(value);\n }\n }, [value]);\n\n return (\n <input\n max={max}\n min={min}\n onChange={changeCallback}\n step={step}\n type='range'\n value={sliderValue}\n style={{ height: '16px' }}\n />\n );\n};\n\nexport default memo(RangeSlider);\n","import { Box, styled } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nexport const ZoomContainer = styled(Box)(({ theme }) => {\n const trackColor = theme.palette.secondary.light;\n const thumbHeight = '12px';\n const thumbColor = theme.palette.text.primary;\n const thumbWidth = '12px';\n const trackWidth = '100%';\n const trackHeight = '4px';\n const trackRadius = '4px';\n\n const track = {\n cursor: 'default',\n height: trackHeight,\n };\n\n const thumb = {\n backgroundColor: thumbColor,\n border: '0',\n borderRadius: '50%',\n cursor: 'default',\n height: thumbHeight,\n width: thumbWidth,\n };\n\n return {\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n height: '40px',\n marginLeft: theme.spacing(2),\n paddingLeft: theme.spacing(2),\n // TODO add color to theme\n borderLeft: `1px solid ${Colors.athens}`,\n\n '& label': {\n fontSize: fontSizes.small,\n lineHeight: 'initial',\n fontWeight: theme.typography.fontWeightRegular,\n marginBottom: 0,\n marginRight: theme.spacing(1),\n textTransform: 'uppercase',\n },\n\n '& input[type=\"range\"]': {\n WebkitAppearance: 'none',\n background: 'transparent',\n width: trackWidth,\n\n '&::-moz-focus-outer': {\n border: 0,\n },\n\n '&:focus': {\n outline: 0,\n '&::-webkit-slider-runnable-track': {\n background: trackColor,\n },\n '&::-ms-fill-lower': {\n background: thumbColor,\n },\n },\n\n '&::-webkit-slider-runnable-track': {\n ...track,\n background: trackColor,\n borderRadius: trackRadius,\n },\n\n '&::-webkit-slider-thumb': {\n ...thumb,\n WebkitAppearance: 'none',\n marginTop: `calc(${trackHeight} * 0.5 - ${thumbHeight} * 0.5)`,\n },\n\n '&::-moz-range-track': {\n ...track,\n background: trackColor,\n borderRadius: trackRadius,\n height: `calc(${trackHeight} * 0.5)`,\n },\n\n '&::-moz-range-thumb': {\n ...thumb,\n },\n\n '&::-ms-track': {\n ...track,\n background: 'transparent',\n borderColor: 'transparent',\n borderWidth: `calc(${thumbHeight} * 0.5) 0`,\n color: 'transparent',\n },\n\n '&::-ms-fill-lower': {\n background: trackColor,\n borderRadius: `calc(${trackRadius} * 2)`,\n },\n\n '&::-ms-fill-upper': {\n background: trackColor,\n borderRadius: `calc(${trackRadius} * 2)`,\n },\n\n '&::-ms-thumb': {\n ...thumb,\n marginTop: `calc(${trackHeight} * 0.25)`,\n },\n\n '&:disabled': {\n '&::-webkit-slider-thumb, &::-moz-range-thumb, &::-ms-thumb, &::-webkit-slider-runnable-track, &::-ms-fill-lower, &::-ms-fill-upper':\n {\n cursor: 'not-allowed',\n },\n },\n },\n };\n});\n\nexport const Separator = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: '3px',\n zIndex: -1,\n width: '2px',\n height: '10px',\n background: theme.palette.secondary.light,\n pointerEvents: 'none',\n}));\n","import { Box } from '@mui/material';\nimport React, { useCallback, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useMetrics } from 'kognia/metrics/hooks/use-metrics';\nimport IconMinus from 'shared/components/icons/icon-minus';\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport RangeSlider from 'shared/components/range-slider';\nimport { ZOOM_LEVELS, ZOOM_LEVELS_VALUES } from 'shared/constants/zoom-range/zoomLevelsValues';\nimport { MetricsData, MetricsNames } from 'shared/types/metrics';\nimport { ZoomLevelsType } from 'shared/types/zoom-range/zoomLevels';\nimport { getIsFormTag } from 'shared/utils/is-form-tag';\n\nimport { Separator, ZoomContainer } from './ZoomRage.styled';\nimport { useTimelineZoomLevel } from '../../../hooks/use-timeline-zoom-level';\n\nconst isZoomLevel = (value: number): value is ZoomLevelsType => {\n return ZOOM_LEVELS_VALUES.includes(value as ZoomLevelsType);\n};\n\nexport const isNextStepEnabled = (value: number): value is ZoomLevelsType => {\n return isZoomLevel(value) && value <= ZOOM_LEVELS.extraSmall;\n};\n\nexport const isPreviousStepEnabled = (value: number): value is ZoomLevelsType => {\n return isZoomLevel(value) && value >= ZOOM_LEVELS.extraLarge;\n};\n\nexport const STEP_ZOOM = 1;\nconst MIN_ZOOM = ZOOM_LEVELS_VALUES[ZOOM_LEVELS.extraLarge];\nconst MAX_ZOOM = ZOOM_LEVELS_VALUES[ZOOM_LEVELS.extraSmall];\n\nconst SeparatorsList = () => {\n return (\n <>\n {Array(MAX_ZOOM - STEP_ZOOM)\n .fill('')\n .map((_, idx) => (\n <Separator key={idx} style={{ left: `${(idx + 1) * (100 / ZOOM_LEVELS_VALUES.length + 2)}%` }} />\n ))}\n </>\n );\n};\n\nconst ZoomRange = (): JSX.Element => {\n const { t } = useTranslation();\n const { zoomLevel, setZoomLevel } = useTimelineZoomLevel();\n const { pushEvent } = useMetrics();\n\n const handleOnChange = useCallback(\n (value: ZoomLevelsType) => {\n pushEvent<MetricsData[MetricsNames.TACTICAL_ANALYSIS_CHANGE_ZOOM]>(MetricsNames.TACTICAL_ANALYSIS_CHANGE_ZOOM, {\n zoom_level: value.toString(),\n });\n setZoomLevel(value);\n },\n [pushEvent, setZoomLevel],\n );\n\n const getPreviousStep = useCallback(() => {\n const newValue = zoomLevel - STEP_ZOOM;\n if (isPreviousStepEnabled(newValue)) {\n handleOnChange(newValue);\n }\n }, [zoomLevel, handleOnChange]);\n\n const getNextStep = useCallback(() => {\n const newValue = zoomLevel + STEP_ZOOM;\n if (isNextStepEnabled(newValue)) {\n handleOnChange(newValue);\n }\n }, [zoomLevel, handleOnChange]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n const isFormTag = getIsFormTag((event.target as HTMLElement).tagName);\n if (isFormTag || event.ctrlKey || event.metaKey) return;\n if (event.key === '+') {\n getNextStep();\n } else if (event.key === '-') {\n getPreviousStep();\n }\n },\n [getNextStep, getPreviousStep],\n );\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown]);\n\n return (\n <ZoomContainer>\n <label>{t('timeline:zoom-range.title')}</label>\n <div role='button' onClick={getPreviousStep}>\n <IconMinus color={zoomLevel <= ZOOM_LEVELS.extraLarge ? 'disabled' : 'inherit'} isButton size='small' />\n </div>\n <Box sx={{ position: 'relative', alignItems: 'center', display: 'flex', width: '142px' }}>\n <SeparatorsList />\n <RangeSlider max={MAX_ZOOM} min={MIN_ZOOM} onChange={handleOnChange} step={STEP_ZOOM} value={zoomLevel} />\n </Box>\n <div role='button' onClick={getNextStep}>\n <IconPlus color={zoomLevel >= ZOOM_LEVELS.extraSmall ? 'disabled' : 'inherit'} isButton size='small' />\n </div>\n </ZoomContainer>\n );\n};\n\nexport default ZoomRange;\n","import { useCallback } from 'react';\nimport { useRecoilState, useSetRecoilState } from 'recoil';\n\nimport { useSaveUserPreset } from 'api/user-presets/use-save-user-preset';\nimport { TimelineZoomPreset } from 'shared/constants/user-presets/userPresetsClasses';\nimport { ZoomLevelsType } from 'shared/types/zoom-range/zoomLevels';\n\nimport { timelineAtoms } from '../../atoms';\nimport { STEP_ZOOM, isNextStepEnabled, isPreviousStepEnabled } from '../../components/tactical-analysis/zoom-range';\n\nexport const useSetTimelineZoomLevel = () => {\n return useSetRecoilState(timelineAtoms.zoomLevel);\n};\n\nexport const useTimelineZoomLevel = () => {\n const { savePreset } = useSaveUserPreset();\n const [zoomLevel, setZoomLevel] = useRecoilState<ZoomLevelsType>(timelineAtoms.zoomLevel);\n\n const handleSaveZoomLevelPreset = useCallback(\n (value: ZoomLevelsType) => {\n const zoomPreset = new TimelineZoomPreset(value);\n savePreset({ data: zoomPreset });\n },\n [savePreset],\n );\n\n const setZoomLevelAndCenterPlayHead = useCallback(\n (value: ZoomLevelsType) => {\n setZoomLevel(value);\n handleSaveZoomLevelPreset(value);\n },\n [handleSaveZoomLevelPreset, setZoomLevel],\n );\n\n const handleLessZoomLevel = useCallback(() => {\n setZoomLevel((value) => {\n const previous = value - STEP_ZOOM;\n if (isPreviousStepEnabled(previous)) {\n handleSaveZoomLevelPreset(previous);\n return previous;\n }\n\n return value;\n });\n }, [handleSaveZoomLevelPreset, setZoomLevel]);\n\n const handleMoreZoomLevel = useCallback(() => {\n setZoomLevel((value) => {\n const next = value + STEP_ZOOM;\n if (isNextStepEnabled(next)) {\n handleSaveZoomLevelPreset(next);\n return next;\n }\n\n return value;\n });\n }, [handleSaveZoomLevelPreset, setZoomLevel]);\n\n return {\n zoomLevel,\n setZoomLevel: setZoomLevelAndCenterPlayHead,\n lessZoomLevel: handleLessZoomLevel,\n moreZoomLevel: handleMoreZoomLevel,\n };\n};\n","import { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { useUserPresets } from 'api/user-presets/use-user-presets';\nimport { PlayingMode, PlayingModes } from 'shared/components/video-player/types';\nimport {\n timelineAppliedFiltersPreset,\n timelineHeadersWidthPreset,\n timelineHeightPreset,\n timelinePinScenariosPreset,\n timelinePlayingModePreset,\n timelineSelectedTacticsPreset,\n timelineShowBallPossession,\n timelineShowNoBallPossession,\n timelineTeamIdFocus,\n timelineTimePreset,\n timelineZoomPreset,\n} from 'shared/constants/user-presets/userPresetsTimeline';\nimport { useFeatureFlag } from 'shared/contexts/app-state';\nimport { UserPresetScope } from 'shared/types/user-preset/types';\nimport { getPreset } from 'shared/utils/user-presets/getPreset';\n\nimport { useSetPinScenarios } from '../../../hooks/use-pin-scenarios';\nimport { useSetPresetPlayingMode } from '../../../hooks/use-preset-playing-mode';\nimport { useSetTacticalAnalysisAppliedFilters } from '../../../hooks/use-tactical-analysis-applied-filters';\nimport { useSetTacticalAnalysisSelectedTactics } from '../../../hooks/use-tactical-analysis-selected-tactics';\nimport {\n useSetTimelineNoShowBallPossession,\n useSetTimelineShowBallPossession,\n} from '../../../hooks/use-timeline-ball-possession';\nimport { useSetTimelineHeadersWidth } from '../../../hooks/use-timeline-headers-width';\nimport { useSetTimelineHeight } from '../../../hooks/use-timeline-height';\nimport { useSetTimelineInitialTime } from '../../../hooks/use-timeline-initial-time';\nimport { useSetTimelineTeamIdFocus } from '../../../hooks/use-timeline-team-id-focus';\nimport { useSetTimelineZoomLevel } from '../../../hooks/use-timeline-zoom-level';\nimport { TimelinePresets } from '../types';\n\nconst fixPlayingMode = (playingMode: PlayingMode, useOverlays: boolean) => {\n if (playingMode.mode === PlayingModes.EPISODES && useOverlays) return PlayingModes.TACTICAL_CAMERA;\n if (!useOverlays && playingMode.mode === PlayingModes.TACTICAL_CAMERA && playingMode.useEffectiveTime)\n return PlayingModes.EPISODES;\n\n return playingMode.mode;\n};\n\nexport const useTacticalAnalysisPresets = (recordingId: string) => {\n const setPinScenarios = useSetPinScenarios();\n const setTimelineZoomLevel = useSetTimelineZoomLevel();\n const setTimelineHeight = useSetTimelineHeight();\n const setTimelineInitialTime = useSetTimelineInitialTime(recordingId);\n const setTimelineTeamIdFocus = useSetTimelineTeamIdFocus(recordingId);\n const setSelectedTactics = useSetTacticalAnalysisSelectedTactics(recordingId);\n const setPlayingMode = useSetPresetPlayingMode(recordingId);\n const setShowBallPossession = useSetTimelineShowBallPossession(recordingId);\n const setNoShowBallPossession = useSetTimelineNoShowBallPossession(recordingId);\n const setTacticalAnalysisAppliedFilters = useSetTacticalAnalysisAppliedFilters(recordingId);\n const customOverlaysFeatureFlag = useFeatureFlag(FEATURE_FLAG.CUSTOM_OVERLAYS);\n\n const setTimelineHeadersWidth = useSetTimelineHeadersWidth();\n\n const fetchTimelineRecordingPresets = useUserPresets<TimelinePresets>({\n prefix: 'team-centered-timeline',\n scope: UserPresetScope.timeline,\n ref: recordingId,\n onSuccess: (data) => {\n const initialTimePreset = getPreset(data, timelineTimePreset.key);\n const teamIdFocus = getPreset(data, timelineTeamIdFocus.key);\n const selectedTactics = getPreset(data, timelineSelectedTacticsPreset.key) ?? [];\n const selectedPlayingMode = getPreset(data, timelinePlayingModePreset.key);\n const showBallPossession = getPreset(data, timelineShowBallPossession.key);\n const showBallNoPossession = getPreset(data, timelineShowNoBallPossession.key);\n const appliedFilters = getPreset(data, timelineAppliedFiltersPreset.key);\n\n if (selectedPlayingMode) {\n setPlayingMode({\n ...selectedPlayingMode,\n mode: fixPlayingMode(selectedPlayingMode, customOverlaysFeatureFlag),\n showOverlays: selectedPlayingMode?.useEffectiveTime ?? true,\n useEffectiveTime: selectedPlayingMode?.useEffectiveTime ?? true,\n });\n }\n\n setSelectedTactics(selectedTactics);\n\n if (appliedFilters !== undefined) setTacticalAnalysisAppliedFilters(appliedFilters, false);\n if (showBallPossession !== undefined) setShowBallPossession(showBallPossession, false);\n if (showBallNoPossession !== undefined) setNoShowBallPossession(showBallNoPossession, false);\n if (teamIdFocus !== undefined) setTimelineTeamIdFocus(teamIdFocus, false);\n if (initialTimePreset !== undefined) setTimelineInitialTime(initialTimePreset);\n },\n });\n\n const fetchTimelineGlobalPresets = useUserPresets({\n scope: UserPresetScope.timeline,\n onSuccess: (data) => {\n const zoomPreset = getPreset(data, timelineZoomPreset.key);\n const heightPreset = getPreset(data, timelineHeightPreset.key);\n const headersWidth = getPreset(data, timelineHeadersWidthPreset.key);\n const pinScenarios = getPreset(data, timelinePinScenariosPreset.key);\n\n if (pinScenarios !== undefined) setPinScenarios(pinScenarios, false);\n if (headersWidth !== undefined) setTimelineHeadersWidth(headersWidth);\n if (zoomPreset !== undefined) setTimelineZoomLevel(zoomPreset);\n if (heightPreset !== undefined) setTimelineHeight(heightPreset);\n },\n });\n\n return {\n isSuccess: fetchTimelineGlobalPresets.isSuccess && fetchTimelineRecordingPresets.isSuccess,\n isLoading: fetchTimelineGlobalPresets.isLoading || fetchTimelineRecordingPresets.isLoading,\n isFetching: fetchTimelineGlobalPresets.isFetching || fetchTimelineRecordingPresets.isFetching,\n };\n};\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Episode } from 'shared/types';\nimport { RecordingsFilters } from 'shared/types/recording/types';\n\nimport { TacticalAnalysisWithFiltersResponse } from './types';\nimport { useMutationRequest } from '../../hooks/useMutationRequest';\nimport { tacticalAnalysisWithFilters } from '../../routes';\nimport { HTTPMethod } from '../../types';\nimport { transformFiltersForRequest } from '../utils';\n\nconst placeHolderData = [] as Episode[];\n\nexport const useTacticalAnalysisFilteredItems = (): TacticalAnalysisWithFiltersResponse => {\n const { t } = useTranslation();\n const { mutate, isLoading, isError, isSuccess, data } = useMutationRequest<Episode[], Episode[]>({\n type: HTTPMethod.POST,\n errorMessage: t('api:use-tactical-analysis-filter.error'),\n transformer: (data: Episode[]): Episode[] => data,\n });\n\n const getFilters = useCallback(\n (\n tacticalAnalysisId: string,\n appliedFilters: RecordingsFilters,\n onSuccess?: (episodes: Episode[], appliedFilters: RecordingsFilters) => void,\n ) => {\n mutate(\n {\n url: tacticalAnalysisWithFilters(tacticalAnalysisId),\n data: transformFiltersForRequest(appliedFilters),\n },\n { onSuccess: (data: Episode[]) => onSuccess && onSuccess(data, appliedFilters) },\n );\n },\n [mutate],\n );\n\n return { getFilters, isLoading, isError, isSuccess, data: !data ? placeHolderData : data };\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useTacticalAnalysisAvailableFilters = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.filters(recordingId));\n};\n\nexport const useSetTacticalAnalysisAvailableFilters = (recordingId: string) => {\n return useSetRecoilState(timelineMatchAtoms.filters(recordingId));\n};\n","import { useCallback } from 'react';\nimport { useRecoilValue } from 'recoil';\n\nimport { Episode } from 'shared/types';\nimport { RecordingsFilters } from 'shared/types/recording/types';\n\nimport { Timeline } from '../../api/use-tactical-analysis-data/generate-timeline-rows/types/timeline';\nimport { generateFiltersRow } from '../../api/use-tactical-analysis-data/generate-timeline-rows/utils/generateFiltersRow';\nimport { timelineMatchAtoms } from '../../atoms';\nimport { useSetTacticalAnalysisAppliedFilters } from '../use-tactical-analysis-applied-filters';\nimport { useTacticalAnalysisEpisodes } from '../use-tactical-analysis-episodes';\nimport { useSetTimelineTableData, useTimelineTableData } from '../use-timeline-table-data';\n\nexport const useTacticalAnalysisFilteredEpisodes = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.filteredEpisodes(recordingId));\n};\n\nexport const useTacticalAnalysisClearFilters = (recordingId: string) => {\n const setTimelineData = useSetTimelineTableData(recordingId);\n const timelineTableData = useTimelineTableData(recordingId);\n const setAppliedFilters = useSetTacticalAnalysisAppliedFilters(recordingId);\n\n return useCallback(() => {\n const timelineData = { ...timelineTableData, filtersRow: undefined };\n setAppliedFilters({ recordingIds: [] });\n\n setTimelineData(timelineData);\n }, [setAppliedFilters, setTimelineData, timelineTableData]);\n};\n\nexport const useSetTacticalAnalysisFiltersResults = (recordingId: string) => {\n const episodes = useTacticalAnalysisEpisodes(recordingId);\n const setTimelineTableData = useSetTimelineTableData(recordingId);\n const timelineTableData = useTimelineTableData(recordingId);\n\n return useCallback(\n (filteredEpisodes: Episode[], appliedFilters: RecordingsFilters, updateTimelineData?: Timeline) => {\n const currentData = updateTimelineData || timelineTableData;\n const timelineData = {\n ...currentData,\n filtersRow: generateFiltersRow(episodes, filteredEpisodes, appliedFilters, recordingId),\n };\n\n setTimelineTableData(timelineData);\n },\n [episodes, recordingId, setTimelineTableData, timelineTableData],\n );\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useTacticalAnalysisId = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.tacticalAnalysisId(recordingId));\n};\n\nexport const useSetTacticalAnalysisId = (recordingId: string) => {\n return useSetRecoilState(timelineMatchAtoms.tacticalAnalysisId(recordingId));\n};\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useTacticalAnalysisMode = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.mode(recordingId));\n};\n\nexport const useSetTacticalAnalysisMode = (recordingId: string) => {\n return useSetRecoilState(timelineMatchAtoms.mode(recordingId));\n};\n","import { useQuery } from '@tanstack/react-query';\nimport { useMemo } from 'react';\nimport { useSetRecoilState } from 'recoil';\n\nimport { useMatchWithEpisodes } from 'api/match/useMatchWithEpisodes';\nimport { TIMELINE_DEFAULT_FILTERS } from 'api/recording/useEpisodesWithFilters/useTacticalAnalysesPlaylistItems';\nimport { useFetchTaggingEvents } from 'api/tagging-tool/use-fetch-tagging-events';\nimport { useGenerateTacticalAnalysisPlaylistItems } from 'pages/tactical-analysis/utils/generate-tactical-analysis-playlist-items';\nimport {\n EPISODES_PLAYING_MODE,\n TACTICAL_CAMERA_WITH_OVERLAYS_PLAYING_MODE,\n} from 'shared/components/video-player/defaultPlayingModes';\nimport { Episode, MatchWithEpisodes, TaggingEvents } from 'shared/types';\nimport { RecordingsFilters } from 'shared/types/recording/types';\nimport { groupTagsByType } from 'shared/utils/group-tags-by-type';\n\nimport { useResetTimelineSelectionAtoms } from './generate-timeline-rows/atoms';\nimport { generateTimelineRows } from './generate-timeline-rows/generateTimelineRows';\nimport { Clip } from './generate-timeline-rows/types/clip';\nimport { Row } from './generate-timeline-rows/types/row';\nimport { Timeline } from './generate-timeline-rows/types/timeline';\nimport { UseTacticalAnalysisData } from './types';\nimport { useTacticalAnalysisPresets } from './use-tactical-analysis-presets';\nimport { useTacticalAnalysisFilteredItems } from '../../../../api/recording/use-tactical-analysis-filtered-items';\nimport { timelineMatchAtoms } from '../../atoms';\nimport { usePresetPlayingMode } from '../../hooks/use-preset-playing-mode';\nimport { useTacticalAnalysisAppliedFilters } from '../../hooks/use-tactical-analysis-applied-filters';\nimport { useSetTacticalAnalysisAvailableFilters } from '../../hooks/use-tactical-analysis-available-filters';\nimport { useSetTacticalAnalysisEpisodes } from '../../hooks/use-tactical-analysis-episodes';\nimport {\n useSetTacticalAnalysisFiltersResults,\n useTacticalAnalysisFilteredEpisodes,\n} from '../../hooks/use-tactical-analysis-filters-results';\nimport { useSetTacticalAnalysisId, useTacticalAnalysisId } from '../../hooks/use-tactical-analysis-id';\nimport { useSetTacticalAnalysisMatch } from '../../hooks/use-tactical-analysis-match';\nimport { useSetTacticalAnalysisMatchSegments } from '../../hooks/use-tactical-analysis-match-segments';\nimport { useSetTacticalAnalysisMode } from '../../hooks/use-tactical-analysis-mode';\nimport { useTacticalAnalysisSelectedTactics } from '../../hooks/use-tactical-analysis-selected-tactics';\nimport { useSetTacticalAnalysisTeams } from '../../hooks/use-tactical-analysis-teams';\nimport { useSetTimelineTableData } from '../../hooks/use-timeline-table-data';\nimport { TacticalAnalysisPlayingMode } from '../../types/tactical-analysis-playing-mode';\n\nconst extractClipsFromParentClip = (clips: Clip[]): Clip[] => {\n return clips\n .map((clip) => {\n if (clip.type !== 'parent-clip') return [];\n if (!clip?.clips || clip.clips.length === 0) return [];\n\n return clip.clips;\n })\n .flat();\n};\n\nexport const extractClipsFromTimelineTableData = (rows: Row[]): Clip[] => {\n return rows\n .map((row) =>\n row.clips\n .map((rowClip) => {\n const clips: Clip[] = [];\n\n if (rowClip.clips && rowClip.clips.length > 0) {\n const parentClips = extractClipsFromParentClip(rowClip.clips);\n\n if (parentClips.length > 0) {\n clips.push(...parentClips);\n }\n\n clips.push(...rowClip.clips);\n }\n\n return clips;\n })\n .flat(),\n )\n .flat();\n};\n\nfunction generateTimelineRowsQuery(\n matchWithEpisodes: MatchWithEpisodes | undefined,\n taggingEvents: TaggingEvents | undefined,\n filteredEpisodes: Episode[],\n appliedFilters: RecordingsFilters,\n) {\n return new Promise((resolve) => {\n if (!matchWithEpisodes || !taggingEvents) {\n return;\n }\n\n resolve(\n generateTimelineRows(\n matchWithEpisodes.episodes,\n groupTagsByType(taggingEvents.tags),\n matchWithEpisodes.match.defaultVideoSource.duration,\n appliedFilters,\n filteredEpisodes,\n matchWithEpisodes.match.id,\n ),\n );\n });\n}\n\nexport const useTacticalAnalysisData = (recordingId: string): UseTacticalAnalysisData => {\n const { isSuccess, isLoading, isFetching } = useTacticalAnalysisPresets(recordingId);\n const { appliedFilters, areFiltersApplied } = useTacticalAnalysisAppliedFilters(recordingId);\n const filteredEpisodes = useTacticalAnalysisFilteredEpisodes(recordingId);\n const setTimelineTableData = useSetTimelineTableData(recordingId);\n const selectedTactics = useTacticalAnalysisSelectedTactics(recordingId);\n const presetPlayingMode = usePresetPlayingMode(recordingId);\n const setTacticalAnalysisTeams = useSetTacticalAnalysisTeams(recordingId);\n const setCurrentTacticalAnalysisId = useSetTacticalAnalysisId(recordingId);\n const setTacticalAnalysisAvailableFilters = useSetTacticalAnalysisAvailableFilters(recordingId);\n const setTacticalAnalysisMatch = useSetTacticalAnalysisMatch(recordingId);\n const setTacticalAnalysisEpisodes = useSetTacticalAnalysisEpisodes(recordingId);\n const setMatchSegments = useSetTacticalAnalysisMatchSegments(recordingId);\n const setTimelineTeamIdFocus = useSetRecoilState(timelineMatchAtoms.teamIdFocus(recordingId));\n const setTimelineVideoSource = useSetRecoilState(timelineMatchAtoms.matchVideoSource(recordingId));\n const resetTimelineSelectionAtoms = useResetTimelineSelectionAtoms();\n const setTimelineMode = useSetTacticalAnalysisMode(recordingId);\n const tacticalAnalysisId = useTacticalAnalysisId(recordingId);\n const { getFilters } = useTacticalAnalysisFilteredItems();\n const setTacticalAnalysisFiltersResults = useSetTacticalAnalysisFiltersResults(recordingId);\n\n const fetchMatchWithEpisodes = useMatchWithEpisodes({\n recordingId,\n onSuccess: (matchWithEpisodes: MatchWithEpisodes) => {\n setTacticalAnalysisMatch(matchWithEpisodes.match);\n setTacticalAnalysisAvailableFilters(matchWithEpisodes.filters ?? TIMELINE_DEFAULT_FILTERS);\n setTacticalAnalysisEpisodes(matchWithEpisodes.episodes);\n setCurrentTacticalAnalysisId(matchWithEpisodes?.episodes[0]?.tacticalAnalysisId ?? '');\n setTacticalAnalysisTeams(matchWithEpisodes.match.teams);\n setTimelineVideoSource(matchWithEpisodes.match.defaultVideoSource);\n setMatchSegments(matchWithEpisodes.matchSegments);\n setTimelineTeamIdFocus((focusTeamId) => (focusTeamId ? focusTeamId : matchWithEpisodes.match.teams.homeTeam?.id));\n },\n enabled: isSuccess,\n prefix: 'team-centered-timeline',\n });\n const fetchTaggingEvents = useFetchTaggingEvents(recordingId);\n const hasSource = Boolean(fetchMatchWithEpisodes.data?.match?.defaultVideoSource?.src);\n\n const timelineRowsQuery = useQuery(\n ['timeline-rows', recordingId],\n () =>\n generateTimelineRowsQuery(fetchMatchWithEpisodes.data, fetchTaggingEvents.data, filteredEpisodes, appliedFilters),\n {\n cacheTime: 0,\n enabled: fetchMatchWithEpisodes.isSuccess && fetchTaggingEvents.isSuccess,\n onSuccess: (data: Timeline) => {\n resetTimelineSelectionAtoms();\n setTimelineMode(TacticalAnalysisPlayingMode.default);\n setTimelineTableData(data);\n\n appliedFilters &&\n areFiltersApplied &&\n tacticalAnalysisId &&\n getFilters(tacticalAnalysisId, appliedFilters, (episodes: Episode[]) =>\n setTacticalAnalysisFiltersResults(episodes, appliedFilters, data),\n );\n },\n },\n );\n\n const playlistItems = useGenerateTacticalAnalysisPlaylistItems({\n recordingId,\n matchWithEpisodes: fetchMatchWithEpisodes.data,\n selectedTactics,\n selectedPlayingMode: presetPlayingMode,\n areTimelineOverlaysEnabled: true,\n });\n\n const initialPlayingMode = useMemo(() => {\n if (presetPlayingMode) return presetPlayingMode;\n\n return fetchMatchWithEpisodes.data &&\n fetchMatchWithEpisodes.data.episodes.length > 0 &&\n !fetchMatchWithEpisodes.data.match.hasHomographies\n ? EPISODES_PLAYING_MODE\n : TACTICAL_CAMERA_WITH_OVERLAYS_PLAYING_MODE;\n }, [presetPlayingMode, fetchMatchWithEpisodes.data]);\n\n return {\n data: {\n matchWithEpisodes: fetchMatchWithEpisodes.data,\n taggingEvents: fetchTaggingEvents.data,\n playlistItems: playlistItems.data ?? [],\n initialPlayingMode,\n },\n isError:\n (fetchTaggingEvents.isSuccess && fetchMatchWithEpisodes.isSuccess && !hasSource) ||\n fetchMatchWithEpisodes.isError ||\n fetchTaggingEvents.isError ||\n timelineRowsQuery.isError,\n isSuccess:\n fetchMatchWithEpisodes.isSuccess &&\n fetchTaggingEvents.isSuccess &&\n Boolean(playlistItems) &&\n timelineRowsQuery.isSuccess &&\n isSuccess &&\n hasSource,\n isFetching:\n fetchMatchWithEpisodes.isFetching || fetchTaggingEvents.isFetching || isFetching || timelineRowsQuery.isFetching,\n isLoading:\n fetchMatchWithEpisodes.isLoading || fetchTaggingEvents.isLoading || isLoading || timelineRowsQuery.isLoading,\n isMissingData: !fetchMatchWithEpisodes?.data?.match?.defaultVideoSource,\n };\n};\n","import { useCallback } from 'react';\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { extractClipsFromTimelineTableData } from '../../api/use-tactical-analysis-data';\nimport {\n useAddClipsToSelectionList,\n useAddRowsToSelectionList,\n useAddRowToSelectionList,\n} from '../../api/use-tactical-analysis-data/generate-timeline-rows/atoms';\nimport { Row, RowGroup } from '../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { Timeline } from '../../api/use-tactical-analysis-data/generate-timeline-rows/types/timeline';\nimport { timelineMatchAtoms } from '../../atoms';\nimport { useTimelineTeamIdFocus } from '../use-timeline-team-id-focus';\n\nfunction extractRowsFromGroup(rowGroup: RowGroup): Row[] {\n let rows: Row[] = [...rowGroup.rows];\n\n if (rowGroup.rowGroups) {\n for (const rg of rowGroup.rowGroups) {\n rows = rows.concat(extractRowsFromGroup(rg));\n }\n }\n\n return rows;\n}\n\nfunction extractAllRows(rowGroups: RowGroup[]): Row[] {\n let allRows: Row[] = [];\n\n for (const rg of rowGroups) {\n allRows = allRows.concat(extractRowsFromGroup(rg));\n }\n\n return allRows;\n}\n\nexport const useSetTimelineTableData = (recordingId: string) => {\n const addRowsForSelection = useAddRowsToSelectionList();\n const addRowForSelection = useAddRowToSelectionList();\n const { teamIdFocus } = useTimelineTeamIdFocus(recordingId);\n const addClipsForSelection = useAddClipsToSelectionList();\n const setTimelineData = useSetRecoilState(timelineMatchAtoms.timelineTableData(recordingId));\n\n return useCallback(\n (data: Timeline) => {\n const rows = [...(data.scenariosRowGroup ? [data.scenariosRowGroup] : []), ...data.rowGroups];\n\n addRowsForSelection(extractAllRows(rows), teamIdFocus);\n if (data.filtersRow) {\n addRowForSelection(data.filtersRow);\n }\n\n const filterClips = data.filtersRow ? extractClipsFromTimelineTableData([data.filtersRow]) : [];\n const rowCLips = extractClipsFromTimelineTableData(extractAllRows(rows));\n\n addClipsForSelection([\n ...data.episodesRow.clips.filter((clip) => clip.type !== 'not-effective-time'),\n ...filterClips,\n ...rowCLips,\n ]);\n\n setTimelineData(data);\n },\n [addRowsForSelection, teamIdFocus, addClipsForSelection, setTimelineData, addRowForSelection],\n );\n};\n\nexport const useTimelineTableData = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.timelineTableData(recordingId));\n};\n","import { TacticId } from 'overlay-generator';\nimport { useCallback, useMemo } from 'react';\n\nimport { useSaveUserPreset } from 'api/user-presets/use-save-user-preset';\nimport { invalidateUserPresetsQuery } from 'api/user-presets/use-user-presets';\nimport { useCurrentPlaylistItem } from 'shared/components/video-player';\nimport { TimelineSelectedTacticsPreset } from 'shared/constants/user-presets/userPresetsClasses';\nimport { TacticIdOrAll } from 'shared/types/playlist/types';\n\nimport { Timeline } from '../../api/use-tactical-analysis-data/generate-timeline-rows/types/timeline';\nimport { defensiveTactics, offensiveTactics } from '../../config';\nimport { useTimelineTableData } from '../use-timeline-table-data';\n\nconst extractTacticsFromTimelineData = (\n timelineData: Timeline,\n): {\n offensive: Set<any>;\n defensive: Set<any>;\n} => {\n return Array.from(timelineData.tacticsIdsList).reduce(\n (acc, tacticId) => {\n if (offensiveTactics.includes(tacticId)) {\n acc.offensive.add(tacticId);\n }\n if (defensiveTactics.includes(tacticId)) {\n acc.defensive.add(tacticId);\n }\n\n return acc;\n },\n {\n offensive: new Set(),\n defensive: new Set(),\n },\n );\n};\n\nexport const useTimelineTactics = (recordingId: string) => {\n const timelineData = useTimelineTableData(recordingId);\n const { savePreset } = useSaveUserPreset();\n const currentPlaylistItem = useCurrentPlaylistItem();\n const extractedTacticsFromTimelineData = useMemo(() => extractTacticsFromTimelineData(timelineData), [timelineData]);\n const availableTactics: TacticId[] = useMemo(\n () => [...extractedTacticsFromTimelineData.offensive, ...extractedTacticsFromTimelineData.defensive],\n [extractedTacticsFromTimelineData.defensive, extractedTacticsFromTimelineData.offensive],\n );\n\n const selectedTactics: TacticId[] = useMemo(() => {\n if (currentPlaylistItem?.fundamentalsSelected.fundamentalsSelected[0] === 'all') {\n return availableTactics;\n }\n\n return currentPlaylistItem.fundamentalsSelected.fundamentalsSelected as TacticId[];\n }, [availableTactics, currentPlaylistItem.fundamentalsSelected.fundamentalsSelected]);\n\n const handleTacticSelection = useCallback(\n async (tacticsIds: TacticId[]) => {\n const tacticsIdsToSave: TacticIdOrAll[] = tacticsIds.length === availableTactics.length ? ['all'] : tacticsIds;\n const preset = new TimelineSelectedTacticsPreset(tacticsIdsToSave, recordingId);\n savePreset({ data: preset, onSuccess: invalidateUserPresetsQuery });\n },\n [availableTactics.length, recordingId, savePreset],\n );\n\n return {\n selectedTactics,\n setSelectedTactics: handleTacticSelection,\n tactics: availableTactics,\n };\n};\n","import { useCallback } from 'react';\nimport { useRecoilValue } from 'recoil';\n\nimport { useCurrentPlaylistItem } from 'shared/components/video-player';\nimport { PlayingMode } from 'shared/components/video-player/types';\n\nimport { timelineMatchAtoms } from '../../atoms';\nimport { generatePlaylistItemFromEpisodes } from '../../components/tactical-analysis/utils/generate-timeline-playlist';\nimport { useTacticalAnalysisEpisodes } from '../use-tactical-analysis-episodes';\nimport { useTacticalAnalysisMatch } from '../use-tactical-analysis-match';\nimport { useTimelineTactics } from '../use-timeline-tactics';\n\nexport const useGenerateTimelinePlaylist = (recordingId: string) => {\n const episodes = useTacticalAnalysisEpisodes(recordingId);\n const match = useTacticalAnalysisMatch(recordingId);\n const timelineVideoSource = useRecoilValue(timelineMatchAtoms.matchVideoSource(recordingId));\n const { selectedTactics: fundamentalsSelected } = useTimelineTactics(recordingId);\n const currentPlaylistItem = useCurrentPlaylistItem();\n\n return useCallback(\n (playingMode: PlayingMode) =>\n generatePlaylistItemFromEpisodes({\n episodes,\n fullVideoSourceDuration: match.defaultVideoSource.duration,\n tacticalCameraVideo: timelineVideoSource,\n playingMode,\n recordingId,\n fundamentalsSelected,\n hasHomographies: currentPlaylistItem.hasHomographies,\n }),\n [timelineVideoSource, currentPlaylistItem.hasHomographies, match, episodes, recordingId, fundamentalsSelected],\n );\n};\n","import { useCallback } from 'react';\n\nimport { useSaveUserPreset } from 'api/user-presets/use-save-user-preset';\nimport { useVideoPlayerActions, useVideoPlayerPlayingMode, useVideoPlayerState } from 'shared/components/video-player';\nimport { PlayingMode } from 'shared/components/video-player/types';\nimport { TimelinePlayingModePreset } from 'shared/constants/user-presets/userPresetsClasses';\n\nimport { useGenerateTimelinePlaylist } from '../use-generate-timeline-playlist';\nimport { useSetPresetPlayingMode } from '../use-preset-playing-mode';\n\nexport const useTimelinePlayingMode = (recordingId: string) => {\n const actions = useVideoPlayerActions();\n const videoPlayerState = useVideoPlayerState();\n const setPresetPlayingMode = useSetPresetPlayingMode(recordingId);\n const videoPlayerPlayingMode = useVideoPlayerPlayingMode();\n const generateTimelinePlaylist = useGenerateTimelinePlaylist(recordingId);\n\n const { savePreset } = useSaveUserPreset();\n\n const handleSetPlayingMode = useCallback(\n (playingMode: PlayingMode) => {\n if (!videoPlayerState.readyState) return;\n\n const playingModePreset = new TimelinePlayingModePreset(playingMode, recordingId);\n savePreset({ data: playingModePreset });\n\n const playlistItems = generateTimelinePlaylist(playingMode);\n\n setPresetPlayingMode(playingMode);\n actions.setPlaylist(playlistItems, playingMode, true, true);\n },\n [setPresetPlayingMode, generateTimelinePlaylist, videoPlayerState.readyState, actions, recordingId, savePreset],\n );\n\n return {\n playingMode: videoPlayerPlayingMode,\n setPlayingMode: handleSetPlayingMode,\n };\n};\n","import { TacticId } from 'overlay-generator';\nimport { useCallback } from 'react';\n\nimport { OverlaySelectorPanel } from 'shared/components/overlay-selector-panel';\nimport { useCurrentPlaylistItem, useVideoPlayerActions, useVideoPlayerId } from 'shared/components/video-player/hooks';\nimport { useOverlaysFrameInfo } from 'shared/components/video-player/hooks/use-overlays-controller';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\n\nimport { useTimelineTactics } from '../../../hooks/use-timeline-tactics';\n\ninterface Props {\n recordingId: string;\n}\n\nexport const TimelineOverlaysSelectorPanel = ({ recordingId }: Props) => {\n const { selectedTactics, setSelectedTactics, tactics } = useTimelineTactics(recordingId);\n const videoPlayerId = useVideoPlayerId();\n const currentPlaylistItem = useCurrentPlaylistItem();\n const actions = useVideoPlayerActions();\n const frameInfo = useOverlaysFrameInfo();\n const availableTactics = currentPlaylistItem.hasHomographies ? tactics : [];\n\n const handleChange = useCallback(\n (tactics: TacticId[]) => {\n const updatedPlaylistItem: PlaylistItemType[] = [\n {\n ...currentPlaylistItem,\n fundamentalsSelected: {\n tacticalAnalysisId: currentPlaylistItem.fundamentalsSelected.tacticalAnalysisId,\n fundamentalsSelected: tactics,\n },\n },\n ];\n\n setSelectedTactics(tactics);\n actions.updatePlaylistItems(updatedPlaylistItem);\n },\n [actions, currentPlaylistItem, setSelectedTactics],\n );\n\n return (\n <OverlaySelectorPanel\n id={videoPlayerId}\n availableTactics={availableTactics}\n frameTactics={frameInfo.frameTactics}\n initialSelectedTactics={selectedTactics}\n onTacticsChange={handleChange}\n isLoading={selectedTactics === undefined}\n />\n );\n};\n","import { useCallback } from 'react';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { useCurrentPlaylistItem, useVideoPlayerPlayingMode } from 'shared/components/video-player';\nimport {\n EPISODES_PLAYING_MODE,\n getPlayingMode,\n TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE,\n} from 'shared/components/video-player/defaultPlayingModes';\nimport { PlayingModes } from 'shared/components/video-player/types';\nimport VideoPlayerComponent from 'shared/components/video-player/video-player-component';\nimport { useFeatureFlag } from 'shared/contexts/app-state';\n\nimport { useTacticalAnalysisEpisodes } from '../../../hooks/use-tactical-analysis-episodes';\nimport { useTacticalAnalysisMatch } from '../../../hooks/use-tactical-analysis-match';\nimport { useTacticalAnalysisMatchSegments } from '../../../hooks/use-tactical-analysis-match-segments';\nimport { useTimelinePlayingMode } from '../../../hooks/use-timeline-playing-mode';\nimport { TimelineOverlaysSelectorPanel } from '../timeline-overlays-selector-panel';\n\ntype Props = {\n recordingId: string;\n};\n\nexport const TacticalAnalysisVideoPlayer = ({ recordingId }: Props) => {\n const episodes = useTacticalAnalysisEpisodes(recordingId);\n const matchSegments = useTacticalAnalysisMatchSegments(recordingId);\n const match = useTacticalAnalysisMatch(recordingId);\n const playingMode = useVideoPlayerPlayingMode();\n const playlistItem = useCurrentPlaylistItem();\n const { setPlayingMode } = useTimelinePlayingMode(recordingId);\n const customOverlaysFeatureFlag = useFeatureFlag(FEATURE_FLAG.CUSTOM_OVERLAYS);\n\n const handleToggle = useCallback(() => {\n if (!match.showOverlays) {\n return setPlayingMode(TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE);\n }\n if (playlistItem.hasHomographies) {\n return setPlayingMode(\n getPlayingMode({\n playingMode,\n showOverlays: !playingMode.showOverlays,\n }),\n );\n }\n\n return setPlayingMode(\n playingMode.mode === PlayingModes.EPISODES\n ? TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE\n : EPISODES_PLAYING_MODE,\n );\n }, [playlistItem.hasHomographies, setPlayingMode, playingMode, match.showOverlays]);\n\n const showTacticDrawings = episodes.length > 0;\n const showOverlays = customOverlaysFeatureFlag && match.hasHomographies && match.showOverlays;\n return (\n <>\n <VideoPlayerComponent\n matchSegments={matchSegments}\n onPlayingModeChange={handleToggle}\n showTacticDrawings={showTacticDrawings}\n showTacticDrawingsOnly\n showVideoPlayerBar\n showVideoSourceControls\n disabledTacticDrawings={!showOverlays}\n />\n {showOverlays ? <TimelineOverlaysSelectorPanel key={match.id} recordingId={recordingId} /> : null}\n </>\n );\n};\n","import { styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nconst SectionContainer = styled('section')(({ theme }) => ({\n padding: theme.spacing(2),\n borderRadius: theme.spacing(2),\n background: Colors.shark,\n color: Colors.white,\n}));\n\nconst FiltersSummary = ({ children }: Props) => {\n return <SectionContainer>{children}</SectionContainer>;\n};\n\nexport default FiltersSummary;\n","import { Typography } from '@mui/material';\nimport React from 'react';\n\nimport styles from './FiltersSummaryItem.module.scss';\n\ninterface Props {\n title?: string;\n children: React.ReactNode;\n}\n\nconst FiltersSummaryItem = ({ title, children }: Props) => {\n return (\n <section className={styles.container}>\n {title && (\n <Typography className={styles.title} variant={'subtitle1'}>\n {title}\n </Typography>\n )}\n {children}\n </section>\n );\n};\n\nexport default FiltersSummaryItem;\n","import {\n RecordingFiltersScenariosOrTacticsInside,\n RecordingsFilters,\n RecordingsFiltersEvents,\n} from 'shared/types/recording/types';\nimport { TacticsVariants } from 'shared/types/tactics/types';\n\nexport const emptyZones = [];\n\nexport const defaultEventsStartingAnEpisode: RecordingsFiltersEvents = {\n teams: [],\n event: '',\n zones: emptyZones,\n players: [],\n};\n\nexport const defaultEventsEndingAnEpisode: RecordingsFiltersEvents = {\n teams: [],\n event: '',\n zones: emptyZones,\n players: [],\n};\n\nexport const defaultFundamentalWithPlayers = {\n id: '',\n players: [''],\n};\n\nexport const defaultFundamentalsFilters = (category: 'offensive' | 'defensive') => [\n {\n teamIds: [],\n tacticalFundamentalType: '',\n playerIds: [],\n category: category === 'offensive' ? TacticsVariants.OFFENSIVE : TacticsVariants.DEFENSIVE,\n },\n];\n\nexport const defaultScenarioInsideAnEpisode: RecordingFiltersScenariosOrTacticsInside = {\n teams: [],\n scenario: '',\n zones: emptyZones,\n tactics: {\n offensive: defaultFundamentalsFilters('offensive'),\n defensive: defaultFundamentalsFilters('defensive'),\n },\n};\n\nexport const defaultFilters: RecordingsFilters = {\n recordingIds: [],\n eventsStarting: defaultEventsStartingAnEpisode,\n eventsEnding: defaultEventsEndingAnEpisode,\n scenariosOrTacticsInside: defaultScenarioInsideAnEpisode,\n};\n","import find from 'lodash/find';\n\nimport { MatchTeam, MatchTeams } from 'shared/types/teams/types';\n\nexport const findTeamById = (teams: MatchTeams, teamId: string): MatchTeam | undefined => {\n return find(teams, (team) => {\n return team.id === teamId;\n }) as MatchTeam;\n};\n","import React from 'react';\n\nimport ActiveFilter, { ActiveFilterTypes } from 'shared/components/active-filter';\nimport IconShield from 'shared/components/icons/icon-shield';\nimport { MatchTeam } from 'shared/types/teams/types';\n\nimport styles from './ActiveFilter.module.scss';\n\ninterface Props {\n team?: MatchTeam;\n teamType: ActiveFilterTypes;\n action?: string;\n contained?: boolean;\n showCloseButton?: boolean;\n onClose?: () => void;\n hasTeamFocus?: boolean;\n}\n\nconst ActiveFilterTeam = ({\n contained = false,\n team,\n teamType,\n action = '',\n showCloseButton,\n onClose,\n hasTeamFocus,\n}: Props) => {\n if (!team) return null;\n\n return (\n <ActiveFilter\n hasTeamFocus={hasTeamFocus}\n onClose={onClose}\n closeButton={showCloseButton}\n contained={contained}\n logo={\n team.logo ? (\n <img alt={'logo'} className={styles.logo} src={team.logo} />\n ) : (\n <IconShield size='small' color='secondary' className={styles.icon} />\n )\n }\n variant={teamType}\n title={team.name}\n action={action}\n />\n );\n};\n\nexport default ActiveFilterTeam;\n","import map from 'lodash/map';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport FiltersSummaryItem from 'pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary-item';\nimport {\n defaultEventsEndingAnEpisode,\n defaultEventsStartingAnEpisode,\n} from 'pages/tactical-analysis/components/tactical-analysis/filters/default';\nimport { Zones } from 'pages/tactical-analysis/components/tactical-analysis/filters/types';\nimport { findTeamById } from 'pages/tactical-analysis/components/tactical-analysis/utils/find-team-by-id';\nimport { getTeamType } from 'pages/tactical-analysis/components/tactical-analysis/utils/get-team-type';\nimport ActiveFilter, { DefaultVariant } from 'shared/components/active-filter';\nimport ActiveFilterTeam from 'shared/components/active-filter-team';\nimport ActiveFilters from 'shared/components/active-filters';\nimport { RecordingsFiltersEvents } from 'shared/types/recording/types';\nimport { MatchTeams } from 'shared/types/teams/types';\n\ninterface Props {\n contained?: boolean;\n filters: RecordingsFiltersEvents;\n showCloseButton?: boolean;\n teams: MatchTeams;\n onUpdate?: (filters: RecordingsFiltersEvents) => void;\n hasTeamFocus?: boolean;\n}\n\nconst EventsEndingEpisodeSummary = ({ teams, filters, contained, showCloseButton, onUpdate, hasTeamFocus }: Props) => {\n const { t } = useTranslation();\n\n if (JSON.stringify(filters) === JSON.stringify(defaultEventsEndingAnEpisode)) return null;\n\n const clearTeamFilter = () => {\n onUpdate && onUpdate({ ...filters, teams: [] });\n };\n\n const clearTacticalFilter = () => {\n onUpdate && onUpdate({ ...filters, event: '' });\n };\n\n const updateZoneFilter = (zone: Zones) => {\n onUpdate && onUpdate({ ...filters, zones: [...filters.zones, zone] });\n };\n\n const clearAllFilters = () => {\n onUpdate && onUpdate(defaultEventsStartingAnEpisode);\n };\n\n return (\n <FiltersSummaryItem title={t('recordings:filters.tabs.events-ending-episode')}>\n <ActiveFilters>\n {filters.teams &&\n filters.teams.map((teamId) => (\n <ActiveFilterTeam\n hasTeamFocus={hasTeamFocus}\n key={teamId}\n onClose={clearTeamFilter}\n showCloseButton={showCloseButton}\n contained={contained}\n team={findTeamById(teams, teamId)}\n teamType={getTeamType(teamId, teams)}\n />\n ))}\n {filters.event && (\n <ActiveFilter\n onClose={clearTacticalFilter}\n closeButton={showCloseButton}\n contained={contained}\n variant={DefaultVariant.DEFAULT}\n title={t(`fundamentals:ending-event-fundamentals.${filters.event}`)}\n />\n )}\n {map(filters.zones, (value, idx) =>\n value ? (\n <ActiveFilter\n onClose={() => {\n const zone = Number(idx) as Zones;\n updateZoneFilter(zone);\n }}\n closeButton={showCloseButton}\n contained={contained}\n key={idx}\n variant={DefaultVariant.DEFAULT}\n title={`${t('recordings:filters.zone')} ${idx}`}\n />\n ) : null,\n )}\n {showCloseButton && <ActiveFilter onClose={clearAllFilters} closeButton variant={DefaultVariant.DEFAULT} />}\n </ActiveFilters>\n </FiltersSummaryItem>\n );\n};\n\nexport default EventsEndingEpisodeSummary;\n","import map from 'lodash/map';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport FiltersSummaryItem from 'pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary-item';\nimport { defaultEventsStartingAnEpisode } from 'pages/tactical-analysis/components/tactical-analysis/filters/default';\nimport { Zones } from 'pages/tactical-analysis/components/tactical-analysis/filters/types';\nimport { findTeamById } from 'pages/tactical-analysis/components/tactical-analysis/utils/find-team-by-id';\nimport { getTeamType } from 'pages/tactical-analysis/components/tactical-analysis/utils/get-team-type';\nimport ActiveFilter, { DefaultVariant } from 'shared/components/active-filter';\nimport ActiveFilterTeam from 'shared/components/active-filter-team';\nimport ActiveFilters from 'shared/components/active-filters';\nimport { RecordingsFiltersEvents } from 'shared/types/recording/types';\nimport { MatchTeams } from 'shared/types/teams/types';\n\ninterface Props {\n contained?: boolean;\n filters: RecordingsFiltersEvents;\n onUpdate?: (filters: RecordingsFiltersEvents) => void;\n showCloseButton?: boolean;\n teams: MatchTeams;\n hasTeamFocus?: boolean;\n}\n\nconst EventsStartingEpisodeSummary = ({\n teams,\n filters,\n contained = false,\n showCloseButton,\n onUpdate,\n hasTeamFocus,\n}: Props) => {\n const { t } = useTranslation();\n\n if (JSON.stringify(filters) === JSON.stringify(defaultEventsStartingAnEpisode)) return null;\n\n const clearTeamFilter = () => {\n onUpdate && onUpdate({ ...filters, teams: defaultEventsStartingAnEpisode.teams });\n };\n\n const clearTacticalFilter = () => {\n onUpdate && onUpdate({ ...filters, event: '' });\n };\n\n const updateZoneFilter = (zone: Zones) => {\n onUpdate && onUpdate({ ...filters, zones: [...filters.zones, zone] });\n };\n\n const clearAllFilters = () => {\n onUpdate && onUpdate(defaultEventsStartingAnEpisode);\n };\n\n return (\n <FiltersSummaryItem title={t('recordings:filters.tabs.events-starting-episode')}>\n <ActiveFilters>\n {filters.teams &&\n filters.teams.map((teamId) => (\n <ActiveFilterTeam\n hasTeamFocus={hasTeamFocus}\n key={teamId}\n onClose={clearTeamFilter}\n showCloseButton={showCloseButton}\n contained={contained}\n team={findTeamById(teams, teamId)}\n teamType={getTeamType(teamId, teams)}\n />\n ))}\n {filters.event && (\n <ActiveFilter\n closeButton={showCloseButton}\n contained={contained}\n onClose={clearTacticalFilter}\n title={t(`fundamentals:starting-event-fundamentals.${filters.event}`)}\n variant={DefaultVariant.DEFAULT}\n />\n )}\n {map(filters.zones, (value, idx) =>\n value ? (\n <ActiveFilter\n onClose={() => {\n const zone = Number(idx) as Zones;\n updateZoneFilter(zone);\n }}\n closeButton={showCloseButton}\n contained={contained}\n key={idx}\n title={`${t('recordings:filters.zone')} ${idx}`}\n variant={DefaultVariant.DEFAULT}\n />\n ) : null,\n )}\n {showCloseButton && <ActiveFilter onClose={clearAllFilters} closeButton variant={DefaultVariant.DEFAULT} />}\n </ActiveFilters>\n </FiltersSummaryItem>\n );\n};\n\nexport default EventsStartingEpisodeSummary;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { getPlayerName, getTeamType } from 'pages/tactical-analysis/components/tactical-analysis/utils/get-team-type';\nimport ActiveFilter, { DefaultVariant } from 'shared/components/active-filter';\nimport { RecordingFiltersTactic } from 'shared/types/recording/types';\nimport { MatchTeams } from 'shared/types/teams/types';\n\ninterface Props {\n contained?: boolean;\n teamId?: string;\n fundamentals: RecordingFiltersTactic[];\n showCloseButton?: boolean;\n teams: MatchTeams;\n onClose: (fundamental: string) => void;\n onClosePlayer: (player: string, fundamental: string) => void;\n}\n\nconst FundamentalsSummary = ({\n teamId = '',\n teams,\n contained,\n showCloseButton,\n fundamentals,\n onClose,\n onClosePlayer,\n}: Props) => {\n const { t } = useTranslation();\n\n if (\n fundamentals.every(\n (fundamental) =>\n fundamental.tacticalFundamentalType === '' && fundamental.playerIds.every((player) => player === ''),\n )\n )\n return null;\n\n const fundamentalTeamType = teamId ? getTeamType(teamId, teams) : DefaultVariant.DEFAULT;\n\n return (\n <>\n {fundamentals.map((fundamental) => (\n <React.Fragment key={fundamental.tacticalFundamentalType}>\n {fundamental.tacticalFundamentalType && (\n <ActiveFilter\n onClose={() => onClose(fundamental.tacticalFundamentalType)}\n closeButton={showCloseButton}\n contained={contained}\n key={fundamental.tacticalFundamentalType}\n variant={fundamentalTeamType}\n title={t(`fundamentals:fundamentals.${fundamental.tacticalFundamentalType}`)}\n />\n )}\n {fundamental.playerIds.map(\n (player) =>\n player && (\n <ActiveFilter\n onClose={() => onClosePlayer(player, fundamental.tacticalFundamentalType)}\n closeButton={showCloseButton}\n contained={contained}\n key={`${fundamental.tacticalFundamentalType}-${player}`}\n variant={fundamentalTeamType}\n title={getPlayerName(player, [teams.homeTeam, teams.opponentTeam]) || ''}\n />\n ),\n )}\n </React.Fragment>\n ))}\n </>\n );\n};\n\nexport default FundamentalsSummary;\n","import map from 'lodash/map';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport FundamentalsSummary from 'pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary/scenarios-inside-episode-summary/fundamentals-summary';\nimport FiltersSummaryItem from 'pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary-item';\nimport {\n defaultFundamentalsFilters,\n defaultFundamentalWithPlayers,\n defaultScenarioInsideAnEpisode,\n} from 'pages/tactical-analysis/components/tactical-analysis/filters/default';\nimport { FundamentalWithPlayers, Zones } from 'pages/tactical-analysis/components/tactical-analysis/filters/types';\nimport { findTeamById } from 'pages/tactical-analysis/components/tactical-analysis/utils/find-team-by-id';\nimport { getTeamType } from 'pages/tactical-analysis/components/tactical-analysis/utils/get-team-type';\nimport ActiveFilter, { DefaultVariant } from 'shared/components/active-filter';\nimport ActiveFilterTeam from 'shared/components/active-filter-team';\nimport ActiveFilters from 'shared/components/active-filters';\nimport { RecordingFiltersScenariosOrTacticsInside } from 'shared/types/recording/types';\nimport { MatchTeams } from 'shared/types/teams/types';\n\nimport { useTacticalAnalysisTeams } from '../../../../../../hooks/use-tactical-analysis-teams';\n\ninterface Props {\n contained?: boolean;\n filters: RecordingFiltersScenariosOrTacticsInside;\n showCloseButton?: boolean;\n teams: MatchTeams;\n recordingId: string;\n onUpdate?: (filters: RecordingFiltersScenariosOrTacticsInside) => void;\n hasTeamFocus?: boolean;\n}\n\nexport const ScenariosInsideEpisodeSummary = ({\n teams,\n filters,\n contained,\n showCloseButton,\n onUpdate,\n recordingId,\n hasTeamFocus,\n}: Props) => {\n const { homeTeam, opponentTeam } = useTacticalAnalysisTeams(recordingId);\n const { t } = useTranslation();\n\n if (JSON.stringify(filters) === JSON.stringify(defaultScenarioInsideAnEpisode)) return null;\n\n const offensiveTeamId = filters.teams.includes(homeTeam?.id ?? '') ? homeTeam?.id : '';\n const defensiveTeamId = filters.teams.includes(opponentTeam?.id ?? '') ? opponentTeam?.id : '';\n\n const offensiveTeamType = offensiveTeamId ? getTeamType(offensiveTeamId, teams) : DefaultVariant.DEFAULT;\n const defensiveTeamType = defensiveTeamId ? getTeamType(defensiveTeamId, teams) : DefaultVariant.DEFAULT;\n\n const clearFundamentalTeamFilter = (variant: 'offensive' | 'defensive') => {\n onUpdate &&\n onUpdate({\n ...filters,\n tactics: {\n ...filters.tactics,\n [variant]: {\n ...filters.tactics[variant],\n teams: [],\n },\n },\n });\n };\n\n const clearTeamFilter = () => {\n filters.teams ? onUpdate && onUpdate({ ...filters, teams: [] }) : clearFundamentalTeamFilter('offensive');\n };\n\n const clearTacticalFilter = () => {\n onUpdate && onUpdate({ ...filters, tactics: { offensive: [], defensive: [] } });\n };\n\n const updateZoneFilter = (zone: Zones) => {\n onUpdate && onUpdate({ ...filters, zones: [...filters.zones, zone] });\n };\n\n const clearAllFilters = () => {\n onUpdate && onUpdate(defaultScenarioInsideAnEpisode);\n };\n\n const clearFundamental = (variant: 'offensive' | 'defensive', fundamentalId: string) => {\n const filteredFundamentals = filters.tactics[variant].map((fundamental) => {\n if (fundamental.tacticalFundamentalType !== fundamentalId) return fundamental;\n\n if (\n fundamental.tacticalFundamentalType === fundamentalId &&\n fundamental.playerIds.some((player) => Boolean(player))\n )\n return {\n id: '',\n players: fundamental.playerIds,\n } as FundamentalWithPlayers;\n\n if (\n fundamental.tacticalFundamentalType === fundamentalId &&\n !fundamental.playerIds.some((player) => Boolean(player))\n )\n return defaultFundamentalWithPlayers;\n });\n\n onUpdate &&\n onUpdate({\n ...filters,\n tactics: {\n ...filters.tactics,\n [variant]: {\n ...filters.tactics[variant],\n fundamentals: filteredFundamentals.length > 0 ? filteredFundamentals : [defaultFundamentalWithPlayers],\n },\n },\n });\n };\n\n const clearFundamentalPlayer = (variant: 'offensive' | 'defensive', playerId: string, fundamentalId: string) => {\n const filteredFundamentalPlayers = filters.tactics[variant].map((fundamental) => {\n return fundamental.tacticalFundamentalType === fundamentalId\n ? ({\n id: fundamental.tacticalFundamentalType,\n players: fundamental.playerIds.filter((player) => player !== playerId),\n } as FundamentalWithPlayers)\n : fundamental;\n });\n\n onUpdate &&\n onUpdate({\n ...filters,\n tactics: {\n ...filters.tactics,\n [variant]: {\n ...filters.tactics[variant],\n fundamentals:\n filteredFundamentalPlayers.length > 0 ? filteredFundamentalPlayers : [defaultFundamentalWithPlayers],\n },\n },\n });\n };\n\n const offensiveTeams = [\n ...new Set(\n filters.tactics.offensive\n .map((o) => o.teamIds)\n .flat()\n .concat(filters.teams),\n ),\n ];\n const defensiveTeams = [...new Set(filters.tactics.defensive.map((o) => o.teamIds).flat())];\n\n return (\n <FiltersSummaryItem title={t('recordings:filters.tabs.scenarios-inside-episode')}>\n <ActiveFilters>\n {filters.scenario && (\n <ActiveFilter\n onClose={clearTacticalFilter}\n closeButton={showCloseButton}\n contained={contained}\n title={t(`fundamentals:tactical-scenario-types.${filters.scenario}`)}\n variant={offensiveTeamType}\n />\n )}\n {JSON.stringify(filters.tactics.offensive) !== JSON.stringify(defaultFundamentalsFilters) && (\n <>\n {offensiveTeams.map((teamId) => (\n <ActiveFilterTeam\n key={teamId}\n hasTeamFocus={hasTeamFocus}\n onClose={clearTeamFilter}\n action={'OFFENSIVE'}\n contained={contained}\n showCloseButton={showCloseButton}\n team={findTeamById(teams, teamId)}\n teamType={getTeamType(teamId, teams)}\n />\n ))}\n\n <FundamentalsSummary\n contained={contained}\n fundamentals={filters.tactics.offensive}\n onClose={(fundamental: string) => clearFundamental('offensive', fundamental)}\n onClosePlayer={(player: string, fundamental: string) =>\n clearFundamentalPlayer('offensive', player, fundamental)\n }\n showCloseButton={showCloseButton}\n teamId={offensiveTeamId}\n teams={teams}\n />\n </>\n )}\n {map(filters.zones, (value, idx) =>\n value ? (\n <ActiveFilter\n onClose={() => {\n const zone = Number(idx) as Zones;\n updateZoneFilter(zone);\n }}\n closeButton={showCloseButton}\n contained={contained}\n key={idx}\n title={`${t('recordings:filters.zone')} ${idx}`}\n variant={offensiveTeamType}\n />\n ) : null,\n )}\n {showCloseButton && <ActiveFilter onClose={clearAllFilters} closeButton variant={offensiveTeamType} />}\n </ActiveFilters>\n {JSON.stringify(filters.tactics.defensive) !== JSON.stringify(defaultFundamentalsFilters) && (\n <ActiveFilters>\n {defensiveTeams.map((teamId) => (\n <ActiveFilterTeam\n key={teamId}\n hasTeamFocus={hasTeamFocus}\n onClose={() => clearFundamentalTeamFilter('defensive')}\n action={'DEFENSIVE'}\n contained={contained}\n showCloseButton={showCloseButton}\n team={findTeamById(teams, teamId)}\n teamType={getTeamType(teamId, teams)}\n />\n ))}\n\n <FundamentalsSummary\n contained={contained}\n fundamentals={filters.tactics.defensive}\n onClose={(fundamental) => clearFundamental('defensive', fundamental)}\n onClosePlayer={(player: string, fundamental: string) =>\n clearFundamentalPlayer('defensive', player, fundamental)\n }\n showCloseButton={showCloseButton}\n teamId={defensiveTeamId}\n teams={teams}\n />\n {showCloseButton && <ActiveFilter onClose={clearAllFilters} closeButton variant={defensiveTeamType} />}\n </ActiveFilters>\n )}\n </FiltersSummaryItem>\n );\n};\n","import { Popper } from '@mui/material';\n\nimport FiltersSummary from 'pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary';\nimport EventsEndingEpisodeSummary from 'pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary/events-ending-episode-summary';\nimport EventsStartingEpisodeSummary from 'pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary/events-starting-episode-summary';\nimport { ScenariosInsideEpisodeSummary } from 'pages/tactical-analysis/components/tactical-analysis/filters/components/filters-summary/scenarios-inside-episode-summary';\nimport { MatchTeams } from 'shared/types';\nimport { RecordingsFilters } from 'shared/types/recording/types';\n\ninterface Props {\n filters: RecordingsFilters;\n teams: MatchTeams;\n recordingId: string;\n hasTeamFocus?: boolean;\n summaryAnchor: HTMLElement | null;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n}\n\nconst FiltersBarSummary = ({\n filters,\n teams,\n recordingId,\n hasTeamFocus,\n summaryAnchor,\n onMouseEnter,\n onMouseLeave,\n}: Props) => {\n return (\n <Popper\n placement='top-start'\n anchorEl={summaryAnchor}\n open={Boolean(summaryAnchor)}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n sx={{ zIndex: (theme) => theme.zIndex.drawer }}\n >\n <FiltersSummary>\n {filters.eventsStarting ? (\n <EventsStartingEpisodeSummary\n hasTeamFocus={hasTeamFocus}\n contained\n teams={teams}\n filters={filters.eventsStarting}\n />\n ) : null}\n {filters.scenariosOrTacticsInside ? (\n <ScenariosInsideEpisodeSummary\n contained\n filters={filters.scenariosOrTacticsInside}\n hasTeamFocus={hasTeamFocus}\n recordingId={recordingId}\n teams={teams}\n />\n ) : null}\n {filters.eventsEnding ? (\n <EventsEndingEpisodeSummary\n hasTeamFocus={hasTeamFocus}\n contained\n teams={teams}\n filters={filters.eventsEnding}\n />\n ) : null}\n </FiltersSummary>\n </Popper>\n );\n};\n\nexport default FiltersBarSummary;\n","import { styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const FiltersModalContent = styled('div')(() => ({\n alignItems: 'center',\n backgroundColor: Colors.white,\n borderRadius: '8px',\n justifyContent: 'center',\n maxHeight: 'calc(100vh - 6rem)',\n maxWidth: '80rem',\n overflowY: 'auto',\n padding: '24px 36px 34px 36px',\n position: 'absolute',\n top: '3rem',\n width: '90%',\n}));\n","import { Box, IconButton, Modal } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useTacticalAnalysisFilteredItems } from 'api/recording/use-tactical-analysis-filtered-items';\nimport { MultiAnalysisFilters } from 'features/multi-analysis-filters/MultiAnalysisFilters';\nimport { useMetrics } from 'kognia/metrics/hooks/use-metrics';\nimport IconClose from 'shared/components/icons/icon-close';\nimport { Episode } from 'shared/types';\nimport { MetricsData, MetricsNames } from 'shared/types/metrics';\nimport { RecordingsFilters } from 'shared/types/recording/types';\nimport { MatchTeams } from 'shared/types/teams/types';\n\nimport { FiltersModalContent } from './styled';\nimport { useTacticalAnalysisAvailableFilters } from '../../../../../hooks/use-tactical-analysis-available-filters';\nimport { useTacticalAnalysisId } from '../../../../../hooks/use-tactical-analysis-id';\n\ninterface Props {\n episodeCount: number;\n episodes: Episode[];\n isOpen: boolean;\n onClose: () => void;\n onApply: (appliedFilters: RecordingsFilters, episodes: Episode[]) => void;\n recordingId: string;\n teams: MatchTeams;\n appliedFilters: RecordingsFilters;\n clearFilters: () => void;\n}\n\nconst FiltersModal = ({ isOpen, onClose, recordingId, onApply, appliedFilters, clearFilters }: Props) => {\n const { t } = useTranslation();\n const tacticalAnalysisId = useTacticalAnalysisId(recordingId);\n const { getFilters, isLoading, data } = useTacticalAnalysisFilteredItems();\n const availableFilters = useTacticalAnalysisAvailableFilters(recordingId);\n const { pushEvent } = useMetrics();\n\n const handleOnApply = useCallback(\n (filters: RecordingsFilters) => {\n pushEvent<MetricsData[MetricsNames.TACTICAL_ANALYSIS_APPLY_FILTER]>(MetricsNames.TACTICAL_ANALYSIS_APPLY_FILTER, {\n filter: JSON.stringify(filters),\n });\n onApply(filters, data);\n },\n [data, pushEvent, onApply],\n );\n\n const handleOnUpdate = useCallback(\n (filters: RecordingsFilters) => {\n getFilters(tacticalAnalysisId, filters);\n },\n [tacticalAnalysisId, getFilters],\n );\n\n const handleGetFiltersWithTacticalAnalysisId = useCallback(() => {\n return (params: RecordingsFilters) => {\n getFilters(tacticalAnalysisId, params);\n };\n }, [tacticalAnalysisId, getFilters]);\n\n const handleClearFilters = useCallback(() => {\n clearFilters();\n onClose();\n }, [clearFilters, onClose]);\n\n return (\n <Modal\n open={isOpen}\n onClose={onClose}\n aria-labelledby='filters-title'\n aria-describedby='filters-description'\n sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n <FiltersModalContent>\n <Box position='absolute' top={({ spacing }) => spacing(1)} right={({ spacing }) => spacing(1)}>\n <IconButton size='small' onClick={onClose}>\n <IconClose isButton color='secondary' size='small' />\n </IconButton>\n </Box>\n <MultiAnalysisFilters\n applyButtonLabel={t('timeline:filters-apply-count', { count: data.length ?? 0 })}\n applyButtonDefaultLabel={t('timeline:filters-apply')}\n resetButtonLabel={t('recordings:filters.reset-all')}\n filtersData={availableFilters}\n appliedFilters={appliedFilters}\n isDisabled={false}\n isLoading={isLoading}\n isLoadingFilters={false}\n recordingIds={[recordingId]}\n onApply={handleOnApply}\n onUpdate={handleOnUpdate}\n clearFilters={handleClearFilters}\n getFilteredItems={handleGetFiltersWithTacticalAnalysisId}\n />\n </FiltersModalContent>\n </Modal>\n );\n};\n\nexport default FiltersModal;\n","import { round } from 'lodash';\n\nimport { VideoSourceWithTimes } from 'shared/components/video-player/types';\n\nimport { Clip } from '../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\n\nconst roundVideoSourceTimes = (videoSource: VideoSourceWithTimes) => {\n return {\n ...videoSource,\n startTime: round(videoSource.startTime, 2),\n endTime: round(videoSource.endTime, 2),\n ...(videoSource.startTimeInMatch && { startTimeInMatch: round(videoSource.startTimeInMatch, 2) }),\n ...(videoSource.endTimeInMatch && { endTimeInMatch: round(videoSource.endTimeInMatch, 2) }),\n };\n};\n\nconst roundClipTimes = (clip: Clip) => {\n return {\n ...clip,\n startTime: round(clip.startTime, 2),\n endTime: round(clip.endTime, 2),\n };\n};\n\nconst getFirstClipInRange = (clip: Clip, clips: Clip[]) => {\n const clipWithRoundedTimes = roundClipTimes(clip);\n return clips\n .filter((item) => item.id !== clip.id)\n .map((item) => roundClipTimes(item))\n .find((otherClip) => {\n return (\n (clipWithRoundedTimes.startTime <= otherClip.startTime &&\n !(\n clipWithRoundedTimes.startTime === otherClip.startTime && clipWithRoundedTimes.endTime === otherClip.endTime\n ) &&\n clipWithRoundedTimes.startTime > otherClip.startTime &&\n clipWithRoundedTimes.startTime < otherClip.endTime) ||\n (clipWithRoundedTimes.endTime < otherClip.endTime && clipWithRoundedTimes.endTime > otherClip.startTime) ||\n (otherClip.startTime >= clipWithRoundedTimes.startTime && otherClip.endTime <= clipWithRoundedTimes.endTime)\n );\n });\n};\n\nconst getClipsWithoutDuplicatedTime = (clips: Clip[]) => {\n return clips.reduce(\n (acc, item, index, array) => {\n const clipWithRoundedTime = roundClipTimes(item);\n const isClipWithSameTime = array.find((item) => {\n const itemWithRoundedTime = roundClipTimes(item);\n return (\n itemWithRoundedTime.startTime === clipWithRoundedTime.startTime &&\n itemWithRoundedTime.endTime === clipWithRoundedTime.endTime &&\n itemWithRoundedTime.id !== clipWithRoundedTime.id\n );\n });\n const isClipWithSameTimeInAcc = acc.find((item) => {\n const itemWithRoundedTime = roundClipTimes(item);\n return (\n itemWithRoundedTime.startTime === clipWithRoundedTime.startTime &&\n itemWithRoundedTime.endTime === clipWithRoundedTime.endTime &&\n itemWithRoundedTime.id !== clipWithRoundedTime.id\n );\n });\n\n if (isClipWithSameTime && isClipWithSameTimeInAcc) return acc;\n\n const clipsWithSameStartTime = array.filter((item) => round(item.startTime, 2) === clipWithRoundedTime.startTime);\n const longestClipWithSameStartTime = clipsWithSameStartTime.reduce((acc, item) => {\n const itemClipWithRoundedTime = roundClipTimes(item);\n return acc.endTime - acc.startTime > itemClipWithRoundedTime.endTime - itemClipWithRoundedTime.startTime\n ? acc\n : itemClipWithRoundedTime;\n }, clipsWithSameStartTime[0]);\n const isClipWithSameStartTimeInAcc = acc.find((item) => item.startTime === clipWithRoundedTime.startTime);\n\n if (longestClipWithSameStartTime && !isClipWithSameStartTimeInAcc) return [...acc, longestClipWithSameStartTime];\n if (isClipWithSameStartTimeInAcc) return acc;\n\n return [...acc, clipWithRoundedTime];\n },\n <Clip[]>[],\n );\n};\n\nconst getClipLength = (clip: Clip | VideoSourceWithTimes) => {\n return clip.endTime - clip.startTime;\n};\n\nconst findVideoSourceForClip = (clip: Clip, videoSources: VideoSourceWithTimes[], isEpisodeMode: boolean) => {\n const videoSourceWithRoundedTimes = videoSources.map(roundVideoSourceTimes);\n return videoSourceWithRoundedTimes.find((videoSource) =>\n isEpisodeMode && videoSource.startTimeInMatch && videoSource.endTimeInMatch\n ? clip.startTime >= videoSource.startTimeInMatch && clip.endTime <= videoSource.endTimeInMatch\n : clip.startTime >= videoSource.startTime && clip.endTime <= videoSource.endTime,\n );\n};\n\nexport {\n findVideoSourceForClip,\n roundVideoSourceTimes,\n roundClipTimes,\n getFirstClipInRange,\n getClipsWithoutDuplicatedTime,\n getClipLength,\n};\n","import { round } from 'lodash';\n\nimport { PlayingMode, PlayingModes, VideoSourceWithTimes } from 'shared/components/video-player/types';\n\nimport {\n findVideoSourceForClip,\n getClipLength,\n getClipsWithoutDuplicatedTime,\n getFirstClipInRange,\n roundClipTimes,\n} from './utils';\nimport { Clip } from '../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\n\nexport interface CreateVideoSourcesFromClips {\n videoSources: VideoSourceWithTimes[];\n duration: number;\n cutClip?: Clip;\n}\n\nexport const createVideoSourcesFromClips = (\n clips: Clip[],\n videoSources: VideoSourceWithTimes[],\n playingMode: PlayingMode,\n): CreateVideoSourcesFromClips => {\n return getClipsWithoutDuplicatedTime(clips)\n .sort((a, b) => (a.startTime >= b.startTime ? 1 : -1))\n .reduce(\n (acc, clipItem, currentIndex, allClips) => {\n const clipLength = getClipLength(clipItem);\n const cutClipLength = acc.cutClip && getClipLength(acc.cutClip);\n const isFulltimeNotEffectiveTime =\n playingMode.mode === PlayingModes.TACTICAL_CAMERA && !playingMode.useEffectiveTime;\n const isEpisodeMode = playingMode.mode === PlayingModes.EPISODES;\n const clip =\n acc.cutClip && cutClipLength !== undefined && cutClipLength >= clipLength\n ? roundClipTimes(acc.cutClip)\n : roundClipTimes(clipItem);\n const currentVideoSource = findVideoSourceForClip(clip, videoSources, isEpisodeMode);\n let videoSourceFromCut = <VideoSourceWithTimes | undefined>undefined;\n let clipLeftFromCut = <Clip | undefined>undefined;\n\n if (\n !currentVideoSource ||\n !currentVideoSource?.src ||\n (currentVideoSource?.startTimeInMatch === undefined && currentVideoSource?.endTimeInMatch === undefined)\n ) {\n return acc;\n }\n\n const firstClipInRange = getFirstClipInRange(clip, allClips);\n\n if (firstClipInRange) {\n const videoSourceFromCutEndTime = firstClipInRange.startTime - clip.startTime + clip.startTime;\n\n videoSourceFromCut =\n isEpisodeMode && currentVideoSource.startTimeInMatch && currentVideoSource.endTimeInMatch\n ? {\n id: `${clip.id}-cut-${currentIndex}`,\n startTime: round(clip.startTime - currentVideoSource.startTimeInMatch, 2),\n startTimeInMatch: clip.startTime - (clip.startTime - currentVideoSource.startTimeInMatch),\n endTimeInMatch: clip.endTime - (clip.endTime - currentVideoSource.endTimeInMatch),\n endTime: round(videoSourceFromCutEndTime - currentVideoSource.startTimeInMatch, 2),\n src: currentVideoSource.src,\n srcDownload: currentVideoSource?.srcDownload,\n }\n : {\n id: `${clip.id}-cut-${currentIndex}`,\n startTime: clip.startTime,\n startTimeInMatch: clip.startTime,\n endTimeInMatch: videoSourceFromCutEndTime,\n endTime: videoSourceFromCutEndTime,\n src: currentVideoSource.src,\n srcDownload: currentVideoSource?.srcDownload,\n };\n\n clipLeftFromCut = {\n ...clip,\n id: firstClipInRange.id,\n startTime: videoSourceFromCutEndTime,\n endTime: videoSourceFromCutEndTime > clip.endTime ? videoSourceFromCutEndTime : clip.endTime,\n };\n }\n\n const videoSource: VideoSourceWithTimes =\n isEpisodeMode && currentVideoSource.startTimeInMatch && currentVideoSource.endTimeInMatch\n ? {\n startTime: round(clip.startTime - currentVideoSource.startTimeInMatch, 2),\n endTime: round(\n clip.startTime - currentVideoSource.startTimeInMatch + (clip.endTime - clip.startTime),\n 2,\n ),\n startTimeInMatch: clip.startTime - (clip.startTime - currentVideoSource.startTimeInMatch),\n endTimeInMatch: clip.endTime - (clip.endTime - currentVideoSource.endTimeInMatch),\n src: currentVideoSource.src,\n srcDownload: currentVideoSource?.srcDownload,\n id: clip.id,\n }\n : {\n startTime: clip.startTime,\n endTime: clip.endTime,\n startTimeInMatch: clip.startTime,\n endTimeInMatch: clip.endTime,\n src: currentVideoSource.src,\n srcDownload: currentVideoSource?.srcDownload,\n id: clip.id,\n };\n\n return {\n cutClip: clipLeftFromCut ? clipLeftFromCut : undefined,\n duration:\n isFulltimeNotEffectiveTime && videoSources[0]?.endTimeInMatch\n ? videoSources[0].endTimeInMatch\n : acc.duration + (videoSource.endTime - videoSource.startTime),\n videoSources: [...acc.videoSources, ...(videoSourceFromCut ? [videoSourceFromCut] : [videoSource])].flat(),\n };\n },\n <CreateVideoSourcesFromClips>{ videoSources: [], duration: 0, cutClip: undefined },\n );\n};\n","import { useCallback } from 'react';\nimport { atomFamily, useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { usePlaylistItems, useVideoPlayerActions, useVideoPlayerPlayingMode } from 'shared/components/video-player';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\n\nimport {\n useCleanSelection,\n useClipsIdsSelection,\n useGetClipsList,\n useRowClips,\n useSelectPlayingSelectionClipsIds,\n useSelectRow,\n useUnselectPlayingSelectionClips,\n useUnselectRows,\n} from '../../api/use-tactical-analysis-data/generate-timeline-rows/atoms';\nimport { Clip } from '../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { TacticalAnalysisPlayingMode } from '../../types/tactical-analysis-playing-mode';\nimport { createVideoSourcesFromClips } from '../../utils/create-video-sources-from-clips';\nimport { useGenerateTimelinePlaylist } from '../use-generate-timeline-playlist';\nimport { useSetTacticalAnalysisMode, useTacticalAnalysisMode } from '../use-tactical-analysis-mode';\nimport { useTeamUtils } from '../use-timeline-team-id-focus';\n\ninterface PlaySelection {\n rowId?: string;\n team?: 'home' | 'opponent';\n}\n\nconst selectedPlayingRow = atomFamily<{ rowId: string; team?: 'home' | 'opponent' } | undefined, string>({\n key: 'selected-playing-row',\n default: undefined,\n});\n\nexport const useSelectedPlayingRow = (recordingId: string) => {\n return useRecoilValue(selectedPlayingRow(recordingId));\n};\n\nexport const useSetSelectedPlayingRow = (recordingId: string) => {\n return useSetRecoilState(selectedPlayingRow(recordingId));\n};\n\nexport const useSelectionPlaying = (recordingId: string) => {\n const getRowClips = useRowClips();\n const getClipsList = useGetClipsList();\n const actions = useVideoPlayerActions();\n const playlistItems = usePlaylistItems();\n const cleanSelection = useCleanSelection();\n const selectRow = useSelectRow();\n const clipIdsSelection = useClipsIdsSelection();\n const playingMode = useVideoPlayerPlayingMode();\n const { isHomeTeam } = useTeamUtils(recordingId);\n const selectClipsForPlaying = useSelectPlayingSelectionClipsIds();\n const unselectRows = useUnselectRows();\n const unselectPlayingSelectionClips = useUnselectPlayingSelectionClips();\n const tacticalAnalysisMode = useTacticalAnalysisMode(recordingId);\n const setTacticalAnalysisMode = useSetTacticalAnalysisMode(recordingId);\n const generateTimelinePlaylist = useGenerateTimelinePlaylist(recordingId);\n const setSelectedPlayingRow = useSetSelectedPlayingRow(recordingId);\n\n const createPlaylistItemsFromClips = useCallback(\n (clipsList: Clip[]): PlaylistItemType[] => {\n const { videoSources, duration } = createVideoSourcesFromClips(\n clipsList,\n generateTimelinePlaylist(playingMode)[0].videoTypes[0].videoSources,\n playingMode,\n );\n\n return [\n {\n ...playlistItems[0],\n id: 'timeline-playlist-item-selection',\n duration,\n videoTypes: [\n {\n ...playlistItems[0].videoTypes[0],\n videoSources,\n },\n ],\n },\n ];\n },\n [generateTimelinePlaylist, playingMode, playlistItems],\n );\n\n const playAll = useCallback(() => {\n unselectPlayingSelectionClips();\n unselectRows();\n setTacticalAnalysisMode(TacticalAnalysisPlayingMode.default);\n actions.setPlaylist(generateTimelinePlaylist(playingMode), playingMode, true, true);\n }, [\n unselectPlayingSelectionClips,\n actions,\n playingMode,\n unselectRows,\n setTacticalAnalysisMode,\n generateTimelinePlaylist,\n ]);\n\n const playSelection = useCallback(\n ({ rowId, team }: PlaySelection = {}) => {\n const getClips = ({ rowId, team }: PlaySelection) => {\n if (!rowId) return [];\n\n setSelectedPlayingRow({ rowId, team });\n\n if (team === 'home') {\n return getRowClips(rowId).filter((clip) => clip.teamId && isHomeTeam(clip.teamId));\n }\n\n if (team === 'opponent') {\n return getRowClips(rowId).filter((clip) => clip.teamId && !isHomeTeam(clip.teamId));\n }\n\n return getRowClips(rowId);\n };\n\n const clipsList = rowId ? getClips({ rowId, team }) : getClipsList(clipIdsSelection);\n\n const newPlaylistItems: PlaylistItemType[] = createPlaylistItemsFromClips(clipsList);\n\n if (tacticalAnalysisMode === TacticalAnalysisPlayingMode.selection) {\n unselectPlayingSelectionClips(newPlaylistItems[0].videoTypes[0].videoSources.map(({ id }) => id));\n }\n\n const clipsToSelect = clipsList\n .map((clip) => {\n if (clip?.parentClipId) {\n return [clip.id, clip.parentClipId];\n }\n\n return clip.id;\n })\n .flat();\n const clipsToSelectUnique = Array.from(new Set(clipsToSelect));\n selectClipsForPlaying(clipsToSelectUnique);\n\n if (rowId) {\n cleanSelection();\n selectRow(rowId, team);\n } else {\n unselectRows();\n selectRow();\n }\n\n setTacticalAnalysisMode(TacticalAnalysisPlayingMode.selection);\n actions.setPlaylist(newPlaylistItems, playingMode, true);\n actions.play();\n },\n [\n getClipsList,\n clipIdsSelection,\n createPlaylistItemsFromClips,\n tacticalAnalysisMode,\n selectClipsForPlaying,\n setTacticalAnalysisMode,\n actions,\n playingMode,\n setSelectedPlayingRow,\n getRowClips,\n isHomeTeam,\n unselectPlayingSelectionClips,\n cleanSelection,\n selectRow,\n unselectRows,\n ],\n );\n\n return {\n playSelection,\n playAll,\n };\n};\n","import { Box, Chip, Button, styled } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport { useCallback, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport FiltersBarSummary from 'pages/tactical-analysis/components/tactical-analysis/filters/components/filters-bar-summary';\nimport FiltersModal from 'pages/tactical-analysis/components/tactical-analysis/filters/components/filters-modal';\nimport IconFilter from 'shared/components/icons/icon-filter';\nimport { useVideoPlayerActions } from 'shared/components/video-player/hooks';\nimport { ActionTypes } from 'shared/streams/actionTypes';\nimport { publishEvent } from 'shared/streams/eventEmitter';\nimport { Episode } from 'shared/types';\nimport { MetricsNames } from 'shared/types/metrics';\nimport { RecordingsFilters } from 'shared/types/recording/types';\nimport { MatchTeams } from 'shared/types/teams/types';\n\nimport { useSelectionPlaying } from '../../../hooks/use-selection-playing';\nimport {\n useSetTacticalAnalysisAppliedFilters,\n useTacticalAnalysisAppliedFilters,\n} from '../../../hooks/use-tactical-analysis-applied-filters';\nimport {\n useSetTacticalAnalysisFiltersResults,\n useTacticalAnalysisClearFilters,\n} from '../../../hooks/use-tactical-analysis-filters-results';\nimport { useTacticalAnalysisMode } from '../../../hooks/use-tactical-analysis-mode';\nimport { TacticalAnalysisPlayingMode } from '../../../types/tactical-analysis-playing-mode';\n\nexport const defaultFilters = {\n recordingIds: [],\n};\n\ninterface Props {\n episodeCount: number;\n episodes: Episode[];\n recordingId: string;\n teams: MatchTeams;\n hasTeamFocus?: boolean;\n}\n\nconst FiltersContainer = styled(Box)(() => ({\n fontSize: fontSizes.small,\n marginRight: '16px',\n paddingRight: '16px',\n position: 'relative',\n display: 'flex',\n flexWrap: 'nowrap',\n alignItems: 'center',\n}));\n\nconst Filters = ({ episodes, teams, recordingId, episodeCount }: Props) => {\n const { t } = useTranslation();\n const actions = useVideoPlayerActions();\n const [summaryAnchor, setFiltersSummaryAnchor] = useState<HTMLElement | null>(null);\n const timeoutIdRef = useRef<number>();\n const [areFiltersOpen, setAreFiltersOpen] = useState(false);\n const { appliedFilters } = useTacticalAnalysisAppliedFilters(recordingId);\n const setAppliedFilters = useSetTacticalAnalysisAppliedFilters(recordingId);\n const clearFilters = useTacticalAnalysisClearFilters(recordingId);\n const setTacticalAnalysisFiltersResults = useSetTacticalAnalysisFiltersResults(recordingId);\n\n const tacticalAnalysisMode = useTacticalAnalysisMode(recordingId);\n const { playAll } = useSelectionPlaying(recordingId);\n\n const toggleOpenFilters = useCallback(() => {\n if (!areFiltersOpen) {\n publishEvent({\n type: ActionTypes.OPEN_TACTICAL_ANALYSIS_FILTER,\n payload: { name: MetricsNames.TACTICAL_ANALYSIS_OPEN_FILTER },\n });\n actions.handleStandBy();\n } else {\n actions.resumeStandBy();\n }\n setAreFiltersOpen(!areFiltersOpen);\n }, [areFiltersOpen, actions]);\n\n const handleCloseFilters = useCallback(() => {\n actions.resumeStandBy();\n setAreFiltersOpen(false);\n }, [actions, setAreFiltersOpen]);\n\n const handleClearFilters = useCallback(() => {\n if (tacticalAnalysisMode === TacticalAnalysisPlayingMode.selection) playAll();\n actions.resumeStandBy();\n actions.pause();\n clearFilters();\n }, [actions, clearFilters, playAll, tacticalAnalysisMode]);\n\n const handleApplyFilters = useCallback(\n (appliedFilters: RecordingsFilters, episodes: Episode[]) => {\n // Order is important as applied filters need to be set before the results\n const filtersWithRecordingId = { ...appliedFilters, recordingIds: [recordingId] };\n\n setAppliedFilters(filtersWithRecordingId);\n setTacticalAnalysisFiltersResults(episodes, filtersWithRecordingId);\n handleCloseFilters();\n },\n [recordingId, handleCloseFilters, setAppliedFilters, setTacticalAnalysisFiltersResults],\n );\n\n const showFiltersApplied = Boolean(\n appliedFilters.eventsEnding || appliedFilters.eventsStarting || appliedFilters.scenariosOrTacticsInside,\n );\n\n const handleOpenSummary = useCallback((event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n clearTimeout(timeoutIdRef.current);\n setFiltersSummaryAnchor(event.currentTarget);\n }, []);\n\n const handlePopupMouseEnter = useCallback(() => {\n clearTimeout(timeoutIdRef.current);\n }, []);\n\n const handleCloseSummary = useCallback(() => {\n timeoutIdRef.current = setTimeout(() => {\n setFiltersSummaryAnchor(null);\n }, 50) as unknown as number;\n }, []);\n\n return (\n <FiltersContainer>\n <Button startIcon={<IconFilter size='small' />} onClick={toggleOpenFilters} color='inherit'>\n {t('timeline:filter-by')}\n </Button>\n\n {showFiltersApplied && (\n <>\n <Chip\n label={t('recordings:filters.applied')}\n color='primary'\n variant='outlined'\n onDelete={handleClearFilters}\n onMouseEnter={handleOpenSummary}\n onMouseLeave={handleCloseSummary}\n sx={{ marginLeft: ({ spacing }) => spacing(1) }}\n />\n <FiltersBarSummary\n hasTeamFocus={true}\n recordingId={recordingId}\n filters={appliedFilters}\n teams={teams}\n onMouseEnter={handlePopupMouseEnter}\n onMouseLeave={handleCloseSummary}\n summaryAnchor={summaryAnchor}\n />\n </>\n )}\n {areFiltersOpen ? (\n <FiltersModal\n appliedFilters={appliedFilters}\n episodeCount={episodeCount}\n episodes={episodes}\n isOpen={areFiltersOpen}\n onApply={handleApplyFilters}\n onClose={handleCloseFilters}\n clearFilters={handleClearFilters}\n recordingId={recordingId}\n teams={teams}\n />\n ) : null}\n </FiltersContainer>\n );\n};\n\nexport default Filters;\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const ExportModalContent = styled(Box)(({ theme }) => ({\n position: 'absolute',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(6, 10),\n width: '60%',\n maxWidth: '500px',\n padding: theme.spacing(3, 4.5, 4.25, 4.5),\n backgroundColor: theme.palette.common.white,\n borderRadius: '8px',\n}));\n\nexport const ExportModalIconContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '48px',\n height: '48px',\n padding: theme.spacing(2),\n borderRadius: '50%',\n // TODO add color to palette\n backgroundColor: Colors.background,\n}));\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useMutationRequest } from '../../hooks/useMutationRequest';\nimport { downloadEffectiveTimeVideosUrl } from '../../routes';\nimport { HTTPMethod } from '../../types';\n\nexport const useDownloadEffectiveTimeVideos = () => {\n const { t } = useTranslation();\n const { mutate } = useMutationRequest({\n successMessage: t('api:use-download-effective-time-videos.success'),\n errorMessage: t('api:use-download-effective-time-videos.error'),\n type: HTTPMethod.POST,\n });\n\n return useCallback(\n (tacticalAnalysisId: string) => {\n mutate({\n url: downloadEffectiveTimeVideosUrl(),\n data: { tacticalAnalysisId },\n });\n },\n [mutate],\n );\n};\n","import { Button, Link, Modal } from '@mui/material';\nimport { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconExport from 'shared/components/icons/icon-export';\nimport RadioButton from 'shared/components/radio-button';\nimport { ActionTypes } from 'shared/streams/actionTypes';\nimport { publishEvent } from 'shared/streams/eventEmitter';\nimport { MetricsNames } from 'shared/types/metrics';\n\nimport styles from './ExportModal.module.scss';\nimport { ExportModalIconContainer, ExportModalContent } from './ExportModal.styled';\nimport { useDownloadEffectiveTimeVideos } from '../../../../../../../api/video-sources/use-download-effective-time-videos/useDownloadEffectiveTimeVideos';\nimport { ExportModals } from '../index';\n\ntype ExportModalProps = {\n tacticalAnalysisId: string | undefined;\n onClose: () => void;\n modalTitle: string;\n options: ExportModalOption[];\n type: ExportModals;\n};\n\ntype ExportModalOption = {\n type: ExportVideoTypes;\n displayValue: string;\n downloadUrl?: string;\n enabled: boolean;\n};\n\nexport enum ExportVideoTypes {\n FULL_MATCH = 'full-match',\n EFFECTIVE_TIME = 'effective-time',\n}\n\nconst ExportModal = ({ tacticalAnalysisId, onClose, modalTitle, options, type }: ExportModalProps) => {\n const { t } = useTranslation();\n\n const findFirstEnabled = (options: ExportModalOption[]): ExportModalOption | undefined => {\n return options.find((option) => option.enabled);\n };\n\n const [selectedOption, setSelectedOption] = useState<ExportModalOption | undefined>(findFirstEnabled(options));\n const downloadEffectiveTimeVideos = useDownloadEffectiveTimeVideos();\n\n const handleSelectOption = (id: string) => {\n const newOption = options.find((o) => o.type === id);\n setSelectedOption(newOption);\n };\n\n const handleExportClick = useCallback(() => {\n if (type === ExportModals.VIDEO) {\n publishEvent({\n type: ActionTypes.EXPORT_TACTICAL_ANALYSIS_VIDEO,\n payload: { name: MetricsNames.TACTICAL_ANALYSIS_EXPORT_VIDEO },\n });\n\n if (selectedOption?.type === ExportVideoTypes.EFFECTIVE_TIME && tacticalAnalysisId !== undefined) {\n downloadEffectiveTimeVideos(tacticalAnalysisId);\n }\n }\n if (type === ExportModals.XML)\n publishEvent({\n type: ActionTypes.EXPORT_TACTICAL_ANALYSIS_XML,\n payload: { name: MetricsNames.TACTICAL_ANALYSIS_EXPORT_XML },\n });\n }, [type, selectedOption?.type, downloadEffectiveTimeVideos, tacticalAnalysisId]);\n\n const exportUrl = selectedOption?.downloadUrl;\n const fullMatchSelectedOption = selectedOption?.type === ExportVideoTypes.FULL_MATCH && exportUrl !== undefined;\n const exportButtonProps = fullMatchSelectedOption\n ? {\n href: exportUrl as string,\n component: Link,\n download: true,\n }\n : {};\n\n return (\n <Modal\n open\n onClose={onClose}\n aria-labelledby='export-modal-title'\n aria-describedby='export-modal-description'\n className={styles.modalStyle}\n >\n <ExportModalContent>\n <div className={styles.modalHeader}>\n <ExportModalIconContainer>\n <IconExport size='small' />\n </ExportModalIconContainer>\n {modalTitle.toUpperCase()}\n </div>\n <div className={styles.radioButtonsContainer}>\n {options.map((option) => (\n <RadioButton\n key={option.type}\n id={option.type}\n checked={selectedOption?.type === option.type}\n onSelect={handleSelectOption}\n displayValue={option.displayValue}\n disabled={!option.enabled}\n />\n ))}\n </div>\n <div className={styles.actionButtonsContainer}>\n <Button variant='outlined' color='secondary' onClick={onClose}>\n {t('common:actions.cancel')}\n </Button>\n <Button\n variant='contained'\n disabled={selectedOption === undefined}\n onClick={handleExportClick}\n {...exportButtonProps}\n >\n {t('timeline:actions.export.title')}\n </Button>\n </div>\n </ExportModalContent>\n </Modal>\n );\n};\n\nexport default ExportModal;\n","import { useTranslation } from 'react-i18next';\n\nimport ExportModal, { ExportVideoTypes } from '../export-modal';\nimport { ExportModals } from '../index';\n\ntype ExportVideoModalProps = {\n tacticalAnalysisId: string | undefined;\n onClose: () => void;\n fullMatchDownloadUrl?: string;\n};\n\nconst ExportVideoModal = ({ tacticalAnalysisId, onClose, fullMatchDownloadUrl }: ExportVideoModalProps) => {\n const { t } = useTranslation();\n\n const options = [\n {\n type: ExportVideoTypes.FULL_MATCH,\n displayValue: t('timeline:actions.export.video.export-full-match-video'),\n downloadUrl: fullMatchDownloadUrl,\n enabled: !!fullMatchDownloadUrl,\n },\n {\n type: ExportVideoTypes.EFFECTIVE_TIME,\n displayValue: t('timeline:actions.export.video.export-effective-time-video'),\n enabled: tacticalAnalysisId !== undefined,\n },\n ];\n\n return (\n <ExportModal\n tacticalAnalysisId={tacticalAnalysisId}\n onClose={onClose}\n modalTitle={t('timeline:actions.export.video.export-video')}\n options={options}\n type={ExportModals.VIDEO}\n />\n );\n};\n\nexport default ExportVideoModal;\n","import { useTranslation } from 'react-i18next';\n\nimport { XMLDownloadUrl } from 'api/routes';\n\nimport ExportModal, { ExportVideoTypes } from '../export-modal';\nimport { ExportModals } from '../index';\n\ntype ExportXMLModalProps = {\n recordingId: string;\n tacticalAnalysisId?: string;\n onClose: () => void;\n enableFullMatch: boolean;\n enableEffectiveTime: boolean;\n};\n\nconst ExportXMLModal = ({\n recordingId,\n tacticalAnalysisId,\n onClose,\n enableFullMatch,\n enableEffectiveTime,\n}: ExportXMLModalProps) => {\n const { t } = useTranslation();\n\n const options = [\n {\n type: ExportVideoTypes.FULL_MATCH,\n displayValue: t('timeline:actions.export.xml.export-full-match-xml'),\n downloadUrl: XMLDownloadUrl(recordingId, tacticalAnalysisId),\n enabled: enableFullMatch,\n },\n {\n type: ExportVideoTypes.EFFECTIVE_TIME,\n displayValue: t('timeline:actions.export.xml.export-effective-time-xml'),\n downloadUrl: XMLDownloadUrl(recordingId, tacticalAnalysisId, true),\n enabled: enableEffectiveTime,\n },\n ];\n\n return (\n <ExportModal\n tacticalAnalysisId={tacticalAnalysisId}\n onClose={onClose}\n modalTitle={t('timeline:actions.export.xml.export-xml')}\n options={options}\n type={ExportModals.XML}\n />\n );\n};\n\nexport default ExportXMLModal;\n","import { Button, Typography } from '@mui/material';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport { fontSizes } from 'kognia-ui';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconExport from 'shared/components/icons/icon-export';\nimport { ActionTypes } from 'shared/streams/actionTypes';\nimport { publishEvent } from 'shared/streams/eventEmitter';\nimport { MetricsNames } from 'shared/types/metrics';\nimport { VideoSource } from 'shared/types/recording/types';\nimport { getVODTacticalCameraVideo } from 'shared/utils/get-video-sources';\n\nimport ExportVideoModal from './export-video-modal';\nimport ExportXMLModal from './export-xml-modal';\n\ntype ExportButtonProps = {\n recordingId: string;\n tacticalAnalysisId?: string;\n videoSources: VideoSource[];\n};\n\nexport enum ExportModals {\n XML,\n VIDEO,\n}\n\nconst ExportButton = ({ recordingId, tacticalAnalysisId, videoSources }: ExportButtonProps) => {\n const { t } = useTranslation();\n const fullMatchTacticalCamera = getVODTacticalCameraVideo(videoSources);\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const [currentModal, setCurrentModal] = useState<ExportModals | null>(null);\n const open = Boolean(anchorEl);\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n };\n\n const handleCloseModal = () => {\n setCurrentModal(null);\n };\n\n const handleCloseMenu = () => {\n setAnchorEl(null);\n };\n const handleOpenModal = (modal: ExportModals) => {\n handleCloseMenu();\n if (modal === ExportModals.XML)\n publishEvent({\n type: ActionTypes.OPEN_TACTICAL_ANALYSIS_EXPORT_XML,\n payload: { name: MetricsNames.TACTICAL_ANALYSIS_OPEN_EXPORT_XML },\n });\n if (modal === ExportModals.VIDEO)\n publishEvent({\n type: ActionTypes.OPEN_TACTICAL_ANALYSIS_EXPORT_VIDEO,\n payload: { name: MetricsNames.TACTICAL_ANALYSIS_OPEN_EXPORT_VIDEO },\n });\n setCurrentModal(modal);\n };\n\n const fullMatchDownload = fullMatchTacticalCamera?.srcDownload;\n\n return (\n <>\n <Button\n color='inherit'\n id='export-button'\n aria-controls='export-menu'\n aria-haspopup='true'\n aria-expanded={open ? 'true' : undefined}\n onClick={handleClick}\n startIcon={<IconExport size='small' />}\n sx={{ fontWeight: 'fontWeightRegular' }}\n >\n {t('timeline:actions.export.title')}\n </Button>\n <Menu\n id='export-menu'\n anchorEl={anchorEl}\n open={open}\n onClose={handleCloseMenu}\n MenuListProps={{ 'aria-labelledby': 'export-button' }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n transformOrigin={{ vertical: 'top', horizontal: 'center' }}\n >\n <MenuItem onClick={() => handleOpenModal(ExportModals.XML)}>\n <Typography fontSize={fontSizes.default}>{t('timeline:actions.export.xml.export-xml')}</Typography>\n </MenuItem>\n <MenuItem onClick={() => handleOpenModal(ExportModals.VIDEO)}>\n <Typography fontSize={fontSizes.default}>{t('timeline:actions.export.video.export-video')}</Typography>\n </MenuItem>\n </Menu>\n {currentModal === ExportModals.XML && (\n <ExportXMLModal\n recordingId={recordingId}\n tacticalAnalysisId={tacticalAnalysisId}\n onClose={handleCloseModal}\n enableFullMatch={!!fullMatchDownload}\n enableEffectiveTime={!!tacticalAnalysisId}\n />\n )}\n {currentModal === ExportModals.VIDEO && (\n <ExportVideoModal\n tacticalAnalysisId={tacticalAnalysisId}\n onClose={handleCloseModal}\n fullMatchDownloadUrl={fullMatchDownload}\n />\n )}\n </>\n );\n};\n\nexport default ExportButton;\n","import { Box, styled } from '@mui/material';\n\nexport const FiltersBarContainer = styled(Box)(({ theme }) => ({\n zIndex: 13,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n minHeight: '4.5rem',\n padding: theme.spacing(0, 1),\n background: theme.palette.common.white,\n // TODO add to theme\n boxShadow: '0 3px 3px -1px rgba(10, 22, 70, 0.1), 0 0 1px 0 rgba(10, 22, 70, 0.06)',\n overflowX: 'auto',\n}));\n","import { useRecoilState } from 'recoil';\n\nimport { timelineAtoms } from '../../atoms';\n\nexport const useTimelineIsMultiselectModeActive = (recordingId: string) => {\n const [isMultiselectModeActive, setIsMultiselectModeActive] = useRecoilState(\n timelineAtoms.timelineMultiselectActive(recordingId),\n );\n\n return {\n isMultiselectModeActive,\n setIsMultiselectModeActive,\n };\n};\n","import { Box, Button } from '@mui/material';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath, useHistory } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport Filters from 'pages/tactical-analysis/components/tactical-analysis/filters';\nimport IconFolder from 'shared/components/icons/icon-folder';\nimport IconPlaylist from 'shared/components/icons/icon-playlist';\nimport IconTag from 'shared/components/icons/icon-tag';\nimport { Episode, MatchTeams } from 'shared/types';\nimport { VideoSource } from 'shared/types/recording/types';\n\nimport ExportButton from './export-button';\nimport { FiltersBarContainer } from './FiltersBar.styled';\nimport { useTimelineIsMultiselectModeActive } from '../../../hooks/use-timeline-is-multiselect-mode-active';\nimport { useTimelineTableData } from '../../../hooks/use-timeline-table-data';\nimport ZoomRange from '../zoom-range';\n\ninterface Props {\n episodes: Episode[];\n isLoading?: boolean;\n recordingId: string;\n teams: MatchTeams;\n videoSources: VideoSource[];\n}\n\nexport const FiltersBar = ({ episodes, isLoading = false, recordingId, teams, videoSources }: Props): JSX.Element => {\n const { t } = useTranslation();\n const history = useHistory();\n\n const timelineTableData = useTimelineTableData(recordingId);\n const { isMultiselectModeActive, setIsMultiselectModeActive } = useTimelineIsMultiselectModeActive(recordingId);\n\n if (timelineTableData.rowGroups.length === 0) return <></>;\n\n return (\n <>\n <FiltersBarContainer>\n <Box display='flex' alignItems='center' bgcolor='common.white'>\n {episodes.length > 0 && !isLoading && (\n <Filters episodeCount={episodes.length} episodes={episodes} recordingId={recordingId} teams={teams} />\n )}\n </Box>\n <Box display='flex' alignItems='center' gap={1} height='100%'>\n <Button\n color={isMultiselectModeActive ? 'primary' : 'inherit'}\n sx={{ whiteSpace: 'nowrap', fontWeight: 'fontWeightRegular' }}\n id='add-to-playlist-button'\n startIcon={<IconFolder size='small' color={isMultiselectModeActive ? 'primary' : undefined} />}\n onClick={() => setIsMultiselectModeActive(!isMultiselectModeActive)}\n >\n {t('timeline:actions.add-to-playlist')}\n </Button>\n <ExportButton\n recordingId={recordingId}\n tacticalAnalysisId={episodes.length > 0 ? episodes[0].tacticalAnalysisId : undefined}\n videoSources={videoSources}\n />\n\n <Button\n color='secondary'\n variant='outlined'\n startIcon={<IconPlaylist size='small' color='secondary' />}\n onClick={() => history.push(generatePath(routes.RECORDING_PLAYLISTS, { id: recordingId }))}\n sx={{ fontWeight: 'fontWeightRegular', borderRadius: 5, whiteSpace: 'nowrap' }}\n >\n {t('timeline:actions.playlists')}\n </Button>\n <Button\n color='secondary'\n variant='outlined'\n startIcon={<IconTag size='small' color='secondary' />}\n onClick={() => history.push(generatePath(routes.TAGGING_TOOL_TAG, { recordingId }))}\n sx={{ fontWeight: 'fontWeightRegular', borderRadius: 5, whiteSpace: 'nowrap' }}\n >\n {t('timeline:actions.add-tags')}\n </Button>\n <ZoomRange />\n </Box>\n </FiltersBarContainer>\n </>\n );\n};\n","import React from 'react';\n\ntype AddToPlaylistMenuStateProviderProps = { children: React.ReactNode; id: string };\n\nexport interface AddToPlaylistMenuState {\n id: string;\n}\n\nconst AddToPlaylistMenuStateContext = React.createContext<{ state: AddToPlaylistMenuState } | undefined>(undefined);\n\nexport function AddToPlaylistMenuStateProvider({ children, id }: AddToPlaylistMenuStateProviderProps) {\n return (\n <AddToPlaylistMenuStateContext.Provider value={{ state: { id } }}>\n {children}\n </AddToPlaylistMenuStateContext.Provider>\n );\n}\n\nexport function usePlaylistMenuId(): string {\n const context = React.useContext(AddToPlaylistMenuStateContext);\n\n if (context === undefined) {\n throw new Error('usePlaylistMenuId must be used within a AddToPlaylistMenuStateProvider');\n }\n\n return context.state.id;\n}\n","import { useCallback } from 'react';\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { usePlaylistMenuId } from '../';\nimport {\n useCleanSelection,\n useRemoveClipFromSelection,\n} from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/atoms';\nimport { playlistMenuAtoms, PlaylistMenuItem } from '../atoms';\n\nexport const generatePlaylistMenuItemId = (playlistMenuId: string, clipId: string) => {\n return `${playlistMenuId}-${clipId}`;\n};\n\nexport const useRemovePlaylistMenuItem = (clipId: string) => {\n const removeClipFromSelection = useRemoveClipFromSelection();\n\n return useCallback(() => {\n removeClipFromSelection(clipId);\n }, [clipId, removeClipFromSelection]);\n};\n\nexport const useRemoveMultiplePlaylistMenuItem = () => {\n const playlistMenuId = usePlaylistMenuId();\n const resetSelection = useCleanSelection();\n const setPlaylistMenuItemIds = useSetRecoilState(playlistMenuAtoms.playlistItemsSelectorIds(playlistMenuId));\n\n return useCallback(\n (clipsIdsToRemove: string[]) => {\n resetSelection();\n setPlaylistMenuItemIds(clipsIdsToRemove);\n },\n [resetSelection, setPlaylistMenuItemIds],\n );\n};\n\nexport const useAddMultiplePlaylistItems = () => {\n const playlistMenuId = usePlaylistMenuId();\n const setPlaylistMenuItemIds = useSetRecoilState(playlistMenuAtoms.playlistItemsSelector(playlistMenuId));\n\n return useCallback(\n (clips: PlaylistMenuItem[]) => {\n setPlaylistMenuItemIds(clips);\n },\n [setPlaylistMenuItemIds],\n );\n};\n\nexport const usePlaylistMenuItems = (): PlaylistMenuItem[] => {\n const playlistMenuId = usePlaylistMenuId();\n\n return useRecoilValue(playlistMenuAtoms.playlistItemsSelector(playlistMenuId));\n};\n","import { atomFamily, selectorFamily } from 'recoil';\n\nimport { generatePlaylistMenuItemId } from '../hooks';\n\nexport type PlaylistMenuItem = {\n id: string;\n endTime: number;\n startTime: number;\n playlistId: string;\n name: string;\n};\n\nconst playlistMenuState = atomFamily<string[], string>({\n key: 'tactical-analysis-menu-state',\n default: [],\n});\n\nconst playlistMenuItem = atomFamily<PlaylistMenuItem, string>({\n key: 'tactical-analysis-playlist-menu-item',\n default: {\n id: '',\n endTime: 0,\n startTime: 0,\n playlistId: '',\n name: '',\n },\n});\n\nconst playlistItemsSelector = selectorFamily<PlaylistMenuItem[], string>({\n key: 'tactical-analysis-playlist-menu-items',\n get:\n (playlistMenuId: string) =>\n ({ get }) => {\n const items = get(playlistMenuState(playlistMenuId));\n\n return items.map((playlistItemId) =>\n get(playlistMenuItem(generatePlaylistMenuItemId(playlistMenuId, playlistItemId))),\n );\n },\n set:\n (playlistMenuId) =>\n ({ get, set }, newValues) => {\n const items = get(playlistMenuState(playlistMenuId));\n if (!Array.isArray(newValues)) return;\n\n const finalItems = newValues.reduce(\n (acc, clip) => {\n if (!items.includes(clip.id)) {\n set(playlistMenuItem(generatePlaylistMenuItemId(playlistMenuId, clip.id)), clip);\n acc.push(clip.id);\n }\n return acc;\n },\n [...items],\n );\n\n set(playlistMenuState(playlistMenuId), finalItems);\n },\n});\n\nconst playlistItemsSelectorIds = selectorFamily<string[], string>({\n key: 'tactical-analysis-playlist-menu-ids-items',\n get:\n (playlistMenuId: string) =>\n ({ get }) => {\n return get(playlistMenuState(playlistMenuId));\n },\n set:\n (playlistMenuId) =>\n ({ get, set, reset }, idsToRemove) => {\n const items = get(playlistMenuState(playlistMenuId));\n if (!Array.isArray(idsToRemove)) return;\n\n const finalItems = items.reduce((acc, playlistItemId) => {\n if (idsToRemove.includes(playlistItemId)) {\n reset(playlistMenuItem(generatePlaylistMenuItemId(playlistMenuId, playlistItemId)));\n } else {\n acc.push(playlistItemId);\n }\n\n return acc;\n }, [] as string[]);\n\n set(playlistMenuState(playlistMenuId), finalItems);\n },\n});\n\nexport const playlistMenuAtoms = {\n playlistItemsSelectorIds,\n playlistItemsSelector,\n playlistMenuItem,\n playlistMenuState,\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nconst MENU_WIDTH = '400px';\n\nexport const AddToPlaylistMenuContainer = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isClosed',\n})<{ isClosed: boolean }>(({ theme, isClosed }) => ({\n // TODO add to theme\n background: Colors.shark,\n width: MENU_WIDTH,\n height: '100%',\n transition: theme.transitions.create('width', {\n duration: '0.5s',\n }),\n overflowX: 'hidden',\n\n ...(isClosed && {\n minWidth: 0,\n width: 0,\n }),\n}));\n\nexport const AddToPlaylistMenuContent = styled(Box)({\n display: 'flex',\n flexFlow: 'column',\n width: MENU_WIDTH,\n height: '100%',\n});\n","import { Box, styled } from '@mui/material';\n\nexport const PlaylistItemsList = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n padding: theme.spacing(2, 1, 2, 3),\n color: theme.palette.common.white,\n}));\n","import { Box, IconButton, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport { useTranslation } from 'react-i18next';\n\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport { Playlist } from 'shared/types';\n\nimport { PlaylistItemsList } from './styled';\n\ninterface Props {\n selectedPlaylist: Playlist;\n onDeletePlaylistItem: (playlistItemId: string) => void;\n}\n\nexport const CurrentPlaylistMenu = ({ selectedPlaylist, onDeletePlaylistItem }: Props) => {\n const { t } = useTranslation();\n\n const playlistItems = selectedPlaylist.playlistItems;\n\n return (\n <Box sx={{ flex: '1 1 50%' }}>\n <Box display='flex' alignItems='center' bgcolor='secondary.main'>\n <Typography\n py={0.5}\n px={1}\n color='common.white'\n fontSize={fontSizes.small}\n fontWeight='fontWeightMedium'\n overflow='hidden'\n whiteSpace='nowrap'\n >\n {`${t('timeline:current-playlist-menu.title')} (${playlistItems.length})`}\n </Typography>\n </Box>\n <PlaylistItemsList>\n {playlistItems.length > 0 ? (\n <>\n {playlistItems.map((item) => (\n <Box\n display='flex'\n alignItems='center'\n justifyContent='space-between'\n key={`current-playlist-${selectedPlaylist.id}-${item.id}`}\n >\n <Typography fontSize={fontSizes.small} fontWeight='fontWeightRegular'>\n {item.name}\n </Typography>\n <IconButton sx={{ padding: 0 }} onClick={() => onDeletePlaylistItem(item.id)}>\n <IconDelete\n size='small'\n color='secondary'\n sx={{\n '&:hover': {\n color: 'common.white',\n },\n }}\n />\n </IconButton>\n </Box>\n ))}\n </>\n ) : (\n <Typography fontSize={fontSizes.xxSmall} fontWeight='fontWeightMedium'>\n {t('timeline:current-playlist-menu.no-clips')}\n </Typography>\n )}\n </PlaylistItemsList>\n </Box>\n );\n};\n","import { Typography, styled } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nexport const PlaylistItemsSelectorMenuTitle = styled(Typography)(({ theme }) => ({\n color: theme.palette.text.primary,\n fontSize: fontSizes.small,\n // TODO pass variant prop on component after creating typography in theme\n lineHeight: 1.67,\n fontWeight: theme.typography.fontWeightMedium,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n})) as typeof Typography;\n\nexport const PlaylistItemsSelectorMenuNoItemsText = styled(Typography)(({ theme }) => ({\n padding: theme.spacing(0.5, 2),\n color: theme.palette.common.white,\n fontSize: fontSizes.xxSmall,\n // TODO get from typography after creating typography in theme\n lineHeight: 1.67,\n fontWeight: theme.typography.fontWeightMedium,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n}));\n","import { Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nimport { CheckboxWithCustomColor } from 'shared/components/CheckboxWithCustomColor/CheckboxWithCustomColor';\n\nimport { PlaylistMenuItem } from '../../add-to-playlist-menu-state/atoms';\nimport { useRemovePlaylistMenuItem } from '../../add-to-playlist-menu-state/hooks';\n\ninterface Props {\n item: PlaylistMenuItem;\n}\n\nconst SelectedPlaylistItem = ({ item }: Props) => {\n const removePlaylistMenuItem = useRemovePlaylistMenuItem(item.id);\n\n return (\n <Typography\n key={item.id}\n py={0}\n px={2}\n color='common.white'\n fontSize={fontSizes.small}\n fontWeight='fontWeightRegular'\n >\n <CheckboxWithCustomColor customColor='white' checked={true} onChange={removePlaylistMenuItem} />\n {item.name}\n </Typography>\n );\n};\n\nexport default SelectedPlaylistItem;\n","import { Box, Button } from '@mui/material';\nimport { useTranslation } from 'react-i18next';\n\nimport {\n PlaylistItemsSelectorMenuNoItemsText,\n PlaylistItemsSelectorMenuTitle,\n} from './PlaylistItemsSelectorMenu.styled';\nimport SelectedPlaylistItem from './selected-playslist-item';\nimport { usePlaylistMenuItems } from '../add-to-playlist-menu-state/hooks';\n\ninterface Props {\n onSave: () => void;\n playlistId?: string;\n}\n\nexport const PlaylistItemsSelectorMenu = ({ onSave, playlistId }: Props) => {\n const { t } = useTranslation();\n const selectedPlaylistItems = usePlaylistMenuItems();\n\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', flex: '1 1 50%', gap: ({ spacing }) => spacing(0.5) }}>\n {selectedPlaylistItems.length > 0 && (\n <>\n <Box flex={0} py={0.5} px={2} bgcolor='common.white'>\n <PlaylistItemsSelectorMenuTitle component='span'>{`${t('timeline:playlist-items-selector.title')} (${\n selectedPlaylistItems.length\n })`}</PlaylistItemsSelectorMenuTitle>\n </Box>\n <Box display='flex' flexDirection='column' gap={0.5} pt={1}>\n {selectedPlaylistItems.map((item) => (\n <SelectedPlaylistItem key={item.id} item={item} />\n ))}\n </Box>\n <Box display='flex' justifyContent='center' textAlign='center' mb={2} pt={1}>\n <Button variant='outlined' color='secondary' onClick={onSave} disabled={!playlistId}>\n {t('timeline:playlist-items-selector.button')}\n </Button>\n </Box>\n </>\n )}\n {selectedPlaylistItems.length === 0 && playlistId && (\n <PlaylistItemsSelectorMenuNoItemsText>\n {t('timeline:playlist-items-selector.no-items')}\n </PlaylistItemsSelectorMenuNoItemsText>\n )}\n {selectedPlaylistItems.length === 0 && !playlistId && (\n <PlaylistItemsSelectorMenuNoItemsText>\n {t('timeline:playlist-items-selector.select-playlist')}\n </PlaylistItemsSelectorMenuNoItemsText>\n )}\n </Box>\n );\n};\n","import { Typography, styled } from '@mui/material';\nimport { Link as RouterLink } from 'react-router-dom';\n\nexport const PlaylistSelectorMenuTitle = styled(Typography)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n color: theme.palette.common.white,\n fontSize: theme.typography.fontSize,\n // TODO add in theme\n lineHeight: 1.77,\n fontWeight: theme.typography.fontWeightMedium,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n}));\n\nexport const PlaylistSelectorMenuLink = styled(RouterLink)({\n marginLeft: 'auto',\n textDecoration: 'none',\n cursor: 'pointer',\n\n '&:after': {\n display: 'none',\n },\n});\n","import { Grid } from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport { UpdateAutocompleteValue } from 'shared/components/autocomplete';\nimport IconChevronDown from 'shared/components/icons/icon-chevron-down';\nimport IconFolder from 'shared/components/icons/icon-folder';\nimport IconOpenIn from 'shared/components/icons/icon-open-in';\nimport {\n PlaylistMenuVerticalPosition,\n SelectPlaylistDialog,\n} from 'shared/components/select-playlist-dialog/SelectPlaylistDialog';\nimport { Playlist } from 'shared/types';\n\nimport { PlaylistSelectorMenuLink, PlaylistSelectorMenuTitle } from './PlaylistSelectorMenu.styled';\n\ninterface Props {\n selectedPlaylist?: Playlist;\n onSelect: (playlist: Playlist) => void;\n verticalPosition?: PlaylistMenuVerticalPosition;\n}\n\nexport const PlaylistSelectorMenu = ({\n selectedPlaylist,\n onSelect,\n verticalPosition = PlaylistMenuVerticalPosition.Center,\n}: Props) => {\n const { t } = useTranslation();\n const [anchorSubmenu, setAnchorSubmenu] = useState<HTMLElement | null>(null);\n\n const title = selectedPlaylist\n ? `${selectedPlaylist.name} (${selectedPlaylist.playlistItems.length})`\n : t('timeline:playlist-selector-menu.title');\n\n const handleOpenSubmenu = useCallback((event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setAnchorSubmenu(event.currentTarget);\n }, []);\n\n const handleCloseSubmenu = useCallback(() => {\n setAnchorSubmenu(null);\n }, []);\n\n const handleSelectPlaylist: UpdateAutocompleteValue<Playlist | Playlist[] | null> = useCallback(\n (playlist) => {\n if (playlist === null || Array.isArray(playlist)) return;\n\n onSelect(playlist);\n handleCloseSubmenu();\n },\n [handleCloseSubmenu, onSelect],\n );\n\n return (\n <>\n <Grid\n container\n display='flex'\n alignItems='center'\n justifyContent='space-between'\n py={0.5}\n px={1}\n bgcolor='secondary.main'\n >\n <Grid item>\n <PlaylistSelectorMenuTitle onClick={handleOpenSubmenu}>\n <IconFolder size='small' sx={{ color: 'common.white' }} />\n {title}\n <IconChevronDown size='small' sx={{ color: 'common.white' }} />\n </PlaylistSelectorMenuTitle>\n </Grid>\n {selectedPlaylist && (\n <Grid xs={1} container item justifyContent={'flex-end'}>\n <PlaylistSelectorMenuLink\n onClick={(event: React.MouseEvent<HTMLElement>) => {\n if (!selectedPlaylist) event.preventDefault();\n }}\n to={generatePath(routes.RECORDING_PLAYLIST_DETAIL, { playlistId: selectedPlaylist.id })}\n target='_blank'\n >\n <IconOpenIn size='small' sx={{ color: 'common.white' }} />\n </PlaylistSelectorMenuLink>\n </Grid>\n )}\n </Grid>\n <SelectPlaylistDialog\n verticalPosition={verticalPosition}\n anchorEl={anchorSubmenu}\n onClose={handleCloseSubmenu}\n onClickItem={handleSelectPlaylist}\n />\n </>\n );\n};\n","import { Box, styled } from '@mui/material';\n\nexport const UnsavedChangesDialogIconContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 24,\n width: 24,\n border: `1px solid ${theme.palette.error.main}`,\n backgroundColor: theme.palette.error.light,\n borderRadius: '50%',\n}));\n","import { Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton } from '@mui/material';\nimport { useTranslation } from 'react-i18next';\n\nimport IconClose from 'shared/components/icons/icon-close';\n\nimport styles from './UnsavedChangesDialog.module.scss';\nimport { UnsavedChangesDialogIconContainer } from './UnsavedChangesDialog.styled';\n\ninterface Props {\n isOpen: boolean;\n onCancel: () => void;\n onSave: () => void;\n onClose: () => void;\n}\n\nexport const UnsavedChangesDialog = ({ isOpen, onCancel, onSave, onClose }: Props) => {\n const { t } = useTranslation();\n\n const handleCancel = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n onCancel();\n };\n\n const handleSave = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n onSave();\n onCancel();\n };\n\n return (\n <Dialog\n keepMounted={false}\n className={styles.dialog}\n open={isOpen}\n onClick={(event) => event.stopPropagation()}\n aria-labelledby='unsaved-changes-dialog-title'\n aria-describedby='unsaved-changes-description'\n onClose={onClose}\n >\n <div className={styles.dialog}>\n <IconButton size='small' onClick={onClose} className={styles.closeButton}>\n <IconClose isButton color='secondary' size='small' />\n </IconButton>\n <DialogTitle className={styles.title}>\n <UnsavedChangesDialogIconContainer>\n <IconClose color='error' size='small' />\n </UnsavedChangesDialogIconContainer>\n {t('timeline:unsaved-changes-dialog.title')}\n </DialogTitle>\n <DialogContent className={styles.content}>\n <div className={styles.text}>{t('timeline:unsaved-changes-dialog.text-line-1')}</div>\n <div className={styles.text}>{t('timeline:unsaved-changes-dialog.text-line-2')}</div>\n </DialogContent>\n <DialogActions className={styles.actions}>\n <Button variant='outlined' color='secondary' onClick={handleCancel}>\n {t('timeline:unsaved-changes-dialog.actions.cancel')}\n </Button>\n <Button variant='contained' onClick={handleSave}>\n {t('timeline:unsaved-changes-dialog.actions.save')}\n </Button>\n </DialogActions>\n </div>\n </Dialog>\n );\n};\n","import { useCallback } from 'react';\n\nimport {\n useClipsIdsSelection,\n useGetClipsList,\n} from '../../api/use-tactical-analysis-data/generate-timeline-rows/atoms';\nimport { Clip } from '../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\n\nexport const useGetSelectedClips = () => {\n const getClips = useGetClipsList();\n const selectedClipsIds = useClipsIdsSelection();\n\n const getMergedClips = useCallback(() => {\n const clips = getClips(selectedClipsIds);\n\n const clipIdsWithParentClips = clips.reduce<string[]>((acc, clip) => {\n if (clip.parentClipId) {\n acc.push(clip.parentClipId);\n }\n\n if (!clip.parentClipId) {\n acc.push(clip.id);\n }\n\n return acc;\n }, []);\n\n return getClips(Array.from(new Set(clipIdsWithParentClips)));\n }, [getClips, selectedClipsIds]);\n\n const getUnMergedClips = useCallback(() => {\n return getClips(selectedClipsIds);\n }, [getClips, selectedClipsIds]);\n\n return useCallback(\n (merge?: boolean): Clip[] => {\n return merge ? getMergedClips() : getUnMergedClips();\n },\n [getMergedClips, getUnMergedClips],\n );\n};\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Episode } from 'shared/types';\n\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { useTacticalAnalysisEpisodes } from '../../../../../hooks/use-tactical-analysis-episodes';\nimport { useTeamUtils, useTimelineTeamIdFocus } from '../../../../../hooks/use-timeline-team-id-focus';\n\nexport const useGeneratePlaylistItemName = (recordingId: string) => {\n const { isHomeTeam } = useTeamUtils(recordingId);\n const { isHomeTeamSelected } = useTimelineTeamIdFocus(recordingId);\n const episodes = useTacticalAnalysisEpisodes(recordingId);\n const { t } = useTranslation();\n\n return useCallback(\n (clip: Clip) => {\n if (clip.type === 'scenario') {\n return `EP.${\n episodes.findIndex((ep: Episode) => clip.startTime >= ep.startTime && clip.startTime <= ep.endTime) + 1\n } ${t(\n `${clip.title}${\n (isHomeTeamSelected && isHomeTeam(clip.teamId ?? '')) ||\n (!isHomeTeamSelected && !isHomeTeam(clip.teamId ?? ''))\n ? ''\n : '-no-possession'\n }`,\n )}`;\n }\n\n if (clip.type === 'episode') {\n return t(clip.title, { name: clip.name });\n }\n\n return `EP.${\n episodes.findIndex((ep: Episode) => clip.startTime >= ep.startTime && clip.startTime <= ep.endTime) + 1\n } ${t(clip.titleForPlaylist ?? clip.title)}`;\n },\n [t, episodes, isHomeTeamSelected, isHomeTeam],\n );\n};\n","import { Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport { isEqual } from 'lodash';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation } from 'react-router-dom';\nimport { useRecoilCallback } from 'recoil';\n\nimport { useDeletePlaylistItem } from 'api/playlist/useDeletePlaylistItem';\nimport { usePlaylists } from 'api/playlist/useFetchPlaylists';\nimport IconClose from 'shared/components/icons/icon-close';\nimport { PlaylistMenuVerticalPosition } from 'shared/components/select-playlist-dialog/SelectPlaylistDialog';\nimport { useCurrentPlaylistItem } from 'shared/components/video-player';\nimport { FundamentalsSelection, Playlist } from 'shared/types';\n\nimport { usePlaylistMenuId } from './add-to-playlist-menu-state';\nimport { playlistMenuAtoms } from './add-to-playlist-menu-state/atoms';\nimport {\n generatePlaylistMenuItemId,\n usePlaylistMenuItems,\n useRemoveMultiplePlaylistMenuItem,\n} from './add-to-playlist-menu-state/hooks';\nimport styles from './AddToPlaylistMenu.module.scss';\nimport { AddToPlaylistMenuContainer, AddToPlaylistMenuContent } from './AddToPlaylistMenu.styled';\nimport { CurrentPlaylistMenu } from './current-playlist-menu';\nimport { PlaylistItemsSelectorMenu } from './playlist-items-selector-menu';\nimport { PlaylistSelectorMenu } from './playlist-selector-menu';\nimport { UnsavedChangesDialog } from './unsaved-changes-dialog';\nimport {\n selectionActionsCreator,\n useGetClipsList,\n} from '../../../api/use-tactical-analysis-data/generate-timeline-rows/atoms';\nimport { Clip } from '../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { useGetSelectedClips } from '../../../hooks/use-get-selected-clips/useGetSelectedClips';\nimport { useGeneratePlaylistItemName } from '../../timeline/timeline-table/hooks/use-generate-playlist-item-name';\n\ninterface Props {\n isOpen: boolean;\n onClose?: () => void;\n onOpen?: () => void;\n recordingId: string;\n verticalPosition?: PlaylistMenuVerticalPosition;\n onSave: ({\n items,\n playlistId,\n fundamentalsSelected,\n }: {\n items: Clip[];\n playlistId: string;\n fundamentalsSelected: FundamentalsSelection;\n }) => void;\n}\n\nexport const useUpdatePlaylistMenuClips = (recordingId: string) => {\n const generatePlaylistItemName = useGeneratePlaylistItemName(recordingId);\n const playlistMenuId = usePlaylistMenuId();\n return useRecoilCallback(\n ({ set, snapshot }) =>\n (clipIds: string[]) => {\n const actions = selectionActionsCreator(set, snapshot);\n\n clipIds.forEach((clipId) => {\n const clip = actions.getClip(clipId);\n if (!clip) return;\n\n set(playlistMenuAtoms.playlistMenuItem(generatePlaylistMenuItemId(playlistMenuId, clipId)), {\n id: clip.id,\n startTime: clip.startTime,\n endTime: clip.endTime,\n playlistId: '',\n name: generatePlaylistItemName(clip),\n });\n });\n set(playlistMenuAtoms.playlistMenuState(playlistMenuId), clipIds);\n },\n [generatePlaylistItemName],\n );\n};\n\nconst useSynchronizeTimelineSelectionWithPlaylistMenu = (recordingId: string) => {\n const updatePlaylistMenuClips = useUpdatePlaylistMenuClips(recordingId);\n\n const getSelectedClips = useGetSelectedClips();\n\n useEffect(() => {\n const clips = getSelectedClips();\n\n updatePlaylistMenuClips(clips.map((c) => c.id));\n }, [getSelectedClips, updatePlaylistMenuClips]);\n};\n\nconst AddToPlaylistMenu = ({\n isOpen,\n onClose = () => {},\n recordingId,\n verticalPosition = PlaylistMenuVerticalPosition.Center,\n onSave,\n}: Props) => {\n const [isMenuOpen, setMenuOpen] = useState(isOpen);\n\n const { t } = useTranslation();\n const {\n state,\n }: {\n state:\n | {\n playlist: Playlist;\n }\n | undefined;\n } = useLocation();\n const [isUnsavedDialogOpen, setIsUnsavedDialogOpen] = useState(false);\n const [selectedPlaylist, setSelectedPlaylist] = useState<Playlist | undefined>(\n state?.playlist ? state.playlist : undefined,\n );\n const reset = useRemoveMultiplePlaylistMenuItem();\n const { data } = usePlaylists({ enabled: isMenuOpen, refetchInterval: false, isAutocomplete: true });\n const selectedPlaylistItems = usePlaylistMenuItems();\n const { deletePlaylistItem } = useDeletePlaylistItem(selectedPlaylist?.id || '');\n const currentPlaylistItem = useCurrentPlaylistItem();\n const getClips = useGetClipsList();\n\n useSynchronizeTimelineSelectionWithPlaylistMenu(recordingId);\n\n useEffect(() => {\n if (\n data?.playlists &&\n selectedPlaylist &&\n data.playlists.find((item) => item.id === selectedPlaylist?.id) &&\n !isEqual(\n selectedPlaylist,\n data.playlists.find((item) => item.id === selectedPlaylist?.id),\n )\n ) {\n setSelectedPlaylist(data.playlists.find((item) => item.id === selectedPlaylist?.id));\n }\n }, [data.playlists, selectedPlaylist]);\n\n const handleSave = useCallback(() => {\n if (!selectedPlaylist) return;\n const fundamentalsSelected: FundamentalsSelection = currentPlaylistItem.hasHomographies\n ? currentPlaylistItem.fundamentalsSelected\n : {\n tacticalAnalysisId: currentPlaylistItem.fundamentalsSelected.tacticalAnalysisId,\n fundamentalsSelected: ['all'],\n };\n\n const playlistItemsIds = selectedPlaylistItems.map<string>((clip) => clip.id);\n const clips = getClips(playlistItemsIds);\n\n onSave({ items: clips, playlistId: selectedPlaylist.id, fundamentalsSelected });\n }, [\n selectedPlaylist,\n currentPlaylistItem.hasHomographies,\n currentPlaylistItem.fundamentalsSelected,\n selectedPlaylistItems,\n getClips,\n onSave,\n ]);\n\n useEffect(() => {\n setMenuOpen(isOpen);\n }, [isOpen]);\n\n const handleMenuClose = useCallback(() => {\n setMenuOpen(false);\n setSelectedPlaylist(undefined);\n onClose();\n reset(selectedPlaylistItems.map((clip) => clip.id));\n }, [onClose, reset, selectedPlaylistItems]);\n\n const handleClose = useCallback(() => {\n if (selectedPlaylistItems.length > 0) {\n setIsUnsavedDialogOpen(true);\n } else {\n handleMenuClose();\n }\n }, [handleMenuClose, selectedPlaylistItems.length]);\n\n const handleSelectedPlaylistChange = useCallback((playlist: Playlist) => setSelectedPlaylist(playlist), []);\n const handleDeletePlaylistItem = useCallback(\n (playlistItemId: string) => {\n deletePlaylistItem(playlistItemId);\n },\n [deletePlaylistItem],\n );\n\n if (!data) return null;\n\n return (\n <>\n <AddToPlaylistMenuContainer isClosed={!isMenuOpen}>\n <AddToPlaylistMenuContent>\n <div className={styles.titleBar}>\n <Typography\n component='span'\n py={0.5}\n px={1}\n color='common.white'\n fontSize={fontSizes.default}\n overflow='hidden'\n whiteSpace='nowrap'\n >\n {t('timeline:add-to-playlist-menu.title')}\n </Typography>\n <span className={styles.closeButton} onClick={handleClose}>\n <IconClose size='small' sx={{ color: 'common.white' }} />\n </span>\n </div>\n <PlaylistSelectorMenu\n verticalPosition={verticalPosition}\n selectedPlaylist={selectedPlaylist}\n onSelect={handleSelectedPlaylistChange}\n />\n <div className={styles.container}>\n <PlaylistItemsSelectorMenu onSave={handleSave} playlistId={selectedPlaylist?.id} />\n {selectedPlaylist ? (\n <CurrentPlaylistMenu\n selectedPlaylist={selectedPlaylist}\n onDeletePlaylistItem={handleDeletePlaylistItem}\n />\n ) : null}\n </div>\n </AddToPlaylistMenuContent>\n </AddToPlaylistMenuContainer>\n <UnsavedChangesDialog\n isOpen={isUnsavedDialogOpen}\n onCancel={() => {\n setIsUnsavedDialogOpen(false);\n handleMenuClose();\n }}\n onSave={handleSave}\n onClose={() => setIsUnsavedDialogOpen(false)}\n />\n </>\n );\n};\n\nexport default AddToPlaylistMenu;\n","import { useCallback } from 'react';\n\nimport { PostNewPlaylistItem } from '../../../api/playlist/types';\nimport { Clip } from '../../../pages/tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { useGeneratePlaylistItemName } from '../../../pages/tactical-analysis/components/timeline/timeline-table/hooks/use-generate-playlist-item-name';\nimport { FundamentalsSelection } from '../../types/playlist/types';\n\ninterface Params {\n recordingId: string;\n}\n\nexport const useMapClipsToPlaylistItems = ({ recordingId }: Params) => {\n const generatePlaylistItemName = useGeneratePlaylistItemName(recordingId);\n\n return useCallback(\n ({\n items,\n playlistId,\n fundamentalsSelected,\n }: {\n items: Clip[];\n playlistId: string;\n fundamentalsSelected: FundamentalsSelection;\n }): PostNewPlaylistItem[] =>\n items.map(\n (item) =>\n <PostNewPlaylistItem>{\n endTime: item.endTime,\n startTime: item.startTime,\n recordingId: recordingId,\n playlistId: playlistId,\n fundamentalsSelected: fundamentalsSelected,\n name: generatePlaylistItemName(item),\n },\n ),\n [generatePlaylistItemName, recordingId],\n );\n};\n","import { useCallback, useState } from 'react';\n\nimport { FundamentalsSelection } from '../../../../shared/types/playlist/types';\nimport { Clip } from '../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { generateClipsWithOverlappingTime } from '../../api/use-tactical-analysis-data/generate-timeline-rows/utils/generateClips';\n\nexport const useAddToPlaylistValidator = () => {\n const [isValidationModalOpen, setIsValidationModalOpen] = useState(false);\n const [clipsToSave, setClipsToSave] = useState<Clip[]>([]);\n const [playlistId, setPlaylistId] = useState<string>('');\n const [fundamentalsSelected, setFundamentalsSelected] = useState<FundamentalsSelection>();\n\n const onModalOpen = useCallback(() => setIsValidationModalOpen(true), []);\n const onModalClose = useCallback(() => setIsValidationModalOpen(false), []);\n\n const checkForParentClips = useCallback(\n ({ playlistItems, callback }: { playlistItems: Clip[]; callback?: (callbackClips: Clip[]) => void }) => {\n const generatedClipsWithOverlappingTime = generateClipsWithOverlappingTime({ clips: playlistItems });\n\n const isAnyClipOverlapping = generatedClipsWithOverlappingTime.some((clip) => clip.type === 'parent-clip');\n\n if (isAnyClipOverlapping) {\n return onModalOpen();\n }\n\n return callback && callback(playlistItems);\n },\n [onModalOpen],\n );\n\n const setData = useCallback(\n ({\n clips,\n playlistId,\n fundamentalsSelected,\n }: {\n clips: Clip[];\n playlistId: string;\n fundamentalsSelected: FundamentalsSelection;\n }) => {\n setClipsToSave(clips);\n setPlaylistId(playlistId);\n setFundamentalsSelected(fundamentalsSelected);\n },\n [],\n );\n\n const resetData = useCallback(() => {\n setClipsToSave([]);\n setPlaylistId('');\n setFundamentalsSelected(undefined);\n }, []);\n\n return {\n onModalClose,\n onModalOpen,\n isValidationModalOpen,\n checkForParentClips,\n resetData,\n setData,\n data: {\n clipsToSave,\n playlistId,\n fundamentalsSelected,\n },\n };\n};\n","import { FormControl, FormControlLabel, Radio, RadioGroup, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport { ChangeEvent, useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { DialogNew } from 'shared/components/dialog-new';\n\ninterface Params {\n isOpen: boolean;\n onSubmit: (merge: boolean) => void;\n onClose: () => void;\n onOpen: () => void;\n}\n\nexport const OverlappingClipsModal = ({ isOpen, onSubmit, onClose }: Params) => {\n const { t } = useTranslation();\n const [mergeClips, setMergeClips] = useState<'merge' | 'individual'>('merge');\n\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setMergeClips(value as 'merge' | 'individual');\n }, []);\n\n const handleSubmit = useCallback(() => {\n onSubmit(mergeClips === 'merge');\n onClose();\n }, [mergeClips, onClose, onSubmit]);\n\n return (\n <DialogNew\n open={isOpen}\n onClose={onClose}\n title={t('timeline:overlapping-clips-modal.title')}\n onSubmit={handleSubmit}\n onCancel={onClose}\n maxWidth='xs'\n >\n <Typography variant='body1' fontSize={fontSizes.default}>\n {t('timeline:overlapping-clips-modal.text')}\n </Typography>\n <FormControl sx={{ mt: 2 }}>\n <RadioGroup\n aria-labelledby='demo-controlled-radio-buttons-group'\n name='controlled-radio-buttons-group'\n value={mergeClips}\n onChange={handleChange}\n >\n <FormControlLabel\n value={'merge'}\n control={<Radio />}\n label={t('timeline:overlapping-clips-modal.options.merge')}\n componentsProps={{ typography: { fontSize: fontSizes.default } }}\n />\n <FormControlLabel\n value={'individual'}\n control={<Radio />}\n label={t('timeline:overlapping-clips-modal.options.separate')}\n componentsProps={{ typography: { fontSize: fontSizes.default } }}\n />\n </RadioGroup>\n </FormControl>\n </DialogNew>\n );\n};\n","import React, { useCallback } from 'react';\n\nimport AddToPlaylistMenu from 'pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu';\n\nimport { PostNewPlaylistItem } from '../../../../../api/playlist/types';\nimport { useAddManyToPlaylist } from '../../../../../api/playlist/useAddManyToPlaylist';\nimport { invalidatePlaylistsQuery } from '../../../../../api/playlist/useFetchPlaylists';\nimport { useMapClipsToPlaylistItems } from '../../../../../shared/hooks/use-map-clips-to-post-playlist-items/useMapClipsToPlaylistItems';\nimport { FundamentalsSelection } from '../../../../../shared/types/playlist/types';\nimport { Clip } from '../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { generateClipsWithOverlappingTime } from '../../../api/use-tactical-analysis-data/generate-timeline-rows/utils/generateClips';\nimport { useAddToPlaylistValidator } from '../../../hooks/use-add-to-playlist-validator/useAddToPlaylistValidator';\nimport { useTimelineIsMultiselectModeActive } from '../../../hooks/use-timeline-is-multiselect-mode-active';\nimport {\n usePlaylistMenuItems,\n useRemoveMultiplePlaylistMenuItem,\n} from '../../tactical-analysis/add-to-playlist-menu/add-to-playlist-menu-state/hooks';\nimport { OverlappingClipsModal } from '../overlapping-clips-modal/OverlappingClipsModal';\n\ninterface Props {\n recordingId: string;\n}\n\nconst AddToPlaylistMenuTimeline = ({ recordingId }: Props) => {\n const { isMultiselectModeActive, setIsMultiselectModeActive } = useTimelineIsMultiselectModeActive(recordingId);\n const reset = useRemoveMultiplePlaylistMenuItem();\n const { addManyToPlaylist } = useAddManyToPlaylist();\n const selectedPlaylistItems = usePlaylistMenuItems();\n const mapClipsToPlaylistItems = useMapClipsToPlaylistItems({ recordingId });\n const {\n isValidationModalOpen,\n onModalOpen,\n onModalClose,\n checkForParentClips,\n resetData,\n setData,\n data: { clipsToSave, playlistId, fundamentalsSelected },\n } = useAddToPlaylistValidator();\n\n const handleSubmitRequest = useCallback(\n ({ items }: { items: PostNewPlaylistItem[] }) => {\n addManyToPlaylist({\n items,\n options: {\n onSuccess: async () => {\n await invalidatePlaylistsQuery();\n reset(selectedPlaylistItems.map((clip) => clip.id));\n resetData();\n },\n },\n });\n },\n [addManyToPlaylist, reset, resetData, selectedPlaylistItems],\n );\n\n const handleSubmit = useCallback(\n ({\n items,\n merge,\n callbackData,\n }: {\n items: Clip[];\n merge: boolean;\n callbackData?: { playlistId: string; fundamentalsSelected: FundamentalsSelection };\n }) => {\n if (!callbackData && !fundamentalsSelected) return;\n const fundamentals: FundamentalsSelection | undefined =\n callbackData?.fundamentalsSelected ?? fundamentalsSelected;\n if (!fundamentals) return;\n const playlistItems: Clip[] = merge ? generateClipsWithOverlappingTime({ clips: items }) : items;\n const playlistItemsToSave: PostNewPlaylistItem[] = mapClipsToPlaylistItems({\n items: playlistItems,\n playlistId: callbackData?.playlistId ?? playlistId,\n fundamentalsSelected: fundamentals,\n });\n\n handleSubmitRequest({\n items: playlistItemsToSave,\n });\n },\n [fundamentalsSelected, handleSubmitRequest, mapClipsToPlaylistItems, playlistId],\n );\n\n const handleSave = useCallback(\n ({\n items,\n playlistId,\n fundamentalsSelected,\n }: {\n items: Clip[];\n playlistId: string;\n fundamentalsSelected: FundamentalsSelection;\n }) => {\n setData({ clips: items, playlistId, fundamentalsSelected });\n checkForParentClips({\n playlistItems: items,\n callback: (items) => handleSubmit({ items, merge: false, callbackData: { playlistId, fundamentalsSelected } }),\n });\n },\n [checkForParentClips, handleSubmit, setData],\n );\n\n return (\n <>\n <AddToPlaylistMenu\n isOpen={isMultiselectModeActive}\n onClose={() => setIsMultiselectModeActive(false)}\n recordingId={recordingId}\n onSave={handleSave}\n />\n <OverlappingClipsModal\n isOpen={isValidationModalOpen}\n onClose={onModalClose}\n onOpen={onModalOpen}\n onSubmit={(merge) => handleSubmit({ items: clipsToSave, merge })}\n />\n </>\n );\n};\n\nexport default React.memo(AddToPlaylistMenuTimeline);\n","import { ZOOM_LEVELS } from 'shared/constants/zoom-range/zoomLevelsValues';\nimport { ZoomLevelsType } from 'shared/types/zoom-range/zoomLevels';\n\nexport const getTimeZoomLevelAdjustment = (zoomLevel: ZoomLevelsType) => {\n const zoomLevelRatio = {\n [ZOOM_LEVELS.extraLarge]: 0.2,\n [ZOOM_LEVELS.large]: 0.6,\n [ZOOM_LEVELS.mediumLarge]: 1,\n [ZOOM_LEVELS.medium]: 4,\n [ZOOM_LEVELS.mediumSmall]: 8,\n [ZOOM_LEVELS.small]: 12,\n [ZOOM_LEVELS.extraSmall]: 16,\n };\n\n return zoomLevelRatio[zoomLevel];\n};\n\nexport const getBlockSizeByZoomLevel = (zoomLevel: ZoomLevelsType) => {\n const zoomLevelRatio = {\n [ZOOM_LEVELS.extraLarge]: 40,\n [ZOOM_LEVELS.large]: 60,\n [ZOOM_LEVELS.mediumLarge]: 80,\n [ZOOM_LEVELS.medium]: 100,\n [ZOOM_LEVELS.mediumSmall]: 120,\n [ZOOM_LEVELS.small]: 140,\n [ZOOM_LEVELS.extraSmall]: 180,\n };\n\n return zoomLevelRatio[zoomLevel];\n};\n\nexport const adjustTimeSpaceByZoomLevel = (time: number, zoomLevel: ZoomLevelsType) =>\n time * getTimeZoomLevelAdjustment(zoomLevel);\n","export const TIMELINE_CONFIG = {\n LIMIT_SPACING: 24,\n ROW_HEIGHT: 24,\n STICKY_HEADER_HEIGHT: 80,\n EPISODE_ROW_HEIGHT: 40,\n};\n","import { useCallback, useEffect } from 'react';\nimport { atomFamily, useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { useDuration, useVideoPlayerPlayingMode } from 'shared/components/video-player';\nimport { useCurrentPlaylistItemId } from 'shared/components/video-player/hooks';\nimport { ZoomLevelsType } from 'shared/types/zoom-range/zoomLevels';\n\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { useTacticalAnalysisEpisodes } from '../../../../../hooks/use-tactical-analysis-episodes';\nimport { useTimelineTableData } from '../../../../../hooks/use-timeline-table-data';\nimport { useTimelineZoomLevel } from '../../../../../hooks/use-timeline-zoom-level';\nimport { adjustTimeSpaceByZoomLevel } from '../../../../tactical-analysis/utils/adjust-time-by-zoom-level';\nimport { TIMELINE_CONFIG } from '../../../config';\nimport { SEPARATOR_DOUBLE_WIDTH, SEPARATOR_WIDTH } from '../../components/timeline-css-variables';\n\nconst calculateWidthFromEpisodeClips = (clips: Clip[], isEffectiveTime: boolean, zoomLevel: ZoomLevelsType) => {\n if (!isEffectiveTime) {\n return clips.reduce((width, clip) => {\n return width + adjustTimeSpaceByZoomLevel(clip.endTime - clip.startTime, zoomLevel);\n }, 0);\n }\n\n if (clips.length === 0) return 0;\n\n return clips.reduce((width, clip) => {\n if (clip.type === 'not-effective-time') {\n const isHalfTime = clip.title;\n width += isHalfTime ? SEPARATOR_DOUBLE_WIDTH : SEPARATOR_WIDTH;\n } else {\n width += adjustTimeSpaceByZoomLevel(clip.endTime - clip.startTime, zoomLevel);\n }\n\n return width;\n }, SEPARATOR_WIDTH);\n};\n\nconst timelineInnerWidth = atomFamily<number, string>({\n key: 'timeline-inner-width',\n default: 0,\n});\n\nexport const useTimelineInnerWidth = (recordingId: string) => useRecoilValue(timelineInnerWidth(recordingId));\nexport const useSetTimelineInnerWidth = (recordingId: string) => {\n const setTimelineInnerWidth = useSetRecoilState(timelineInnerWidth(recordingId));\n\n return useCallback(\n (width: number) => {\n setTimelineInnerWidth(width ? width + TIMELINE_CONFIG.LIMIT_SPACING * 2 : 0);\n },\n [setTimelineInnerWidth],\n );\n};\n\nexport const useGenerateTimelineWidth = (recordingId: string) => {\n const episodes = useTacticalAnalysisEpisodes(recordingId);\n const innerWidth = useTimelineInnerWidth(recordingId);\n const playlistItemId = useCurrentPlaylistItemId();\n const { useEffectiveTime: effectiveTime } = useVideoPlayerPlayingMode();\n const { zoomLevel } = useTimelineZoomLevel();\n const setTimelineInnerWidth = useSetTimelineInnerWidth(recordingId);\n const timelineData = useTimelineTableData(recordingId);\n const duration = useDuration();\n\n useEffect(() => {\n if (episodes.length === 0 && duration > 0) {\n return setTimelineInnerWidth(adjustTimeSpaceByZoomLevel(duration, zoomLevel));\n }\n\n const newInnerWidth = calculateWidthFromEpisodeClips(timelineData.episodesRow.clips, effectiveTime, zoomLevel);\n\n if ((newInnerWidth !== innerWidth || innerWidth === 0) && duration > 0 && playlistItemId !== '') {\n return setTimelineInnerWidth(\n effectiveTime\n ? calculateWidthFromEpisodeClips(timelineData.episodesRow.clips, effectiveTime, zoomLevel)\n : adjustTimeSpaceByZoomLevel(duration, zoomLevel),\n );\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [duration, episodes, timelineData.episodesRow.clips, effectiveTime, zoomLevel, playlistItemId]);\n};\n","import { GlobalStyles } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React, { useMemo } from 'react';\n\nimport { useVideoPlayerPlayingMode } from 'shared/components/video-player';\n\nimport { useTimelineTeamIdFocus } from '../../../../../hooks/use-timeline-team-id-focus';\nimport { useTimelineZoomLevel } from '../../../../../hooks/use-timeline-zoom-level';\nimport { getTimeZoomLevelAdjustment } from '../../../../tactical-analysis/utils/adjust-time-by-zoom-level';\nimport { useTimelineInnerWidth } from '../../hooks/use-generate-timeline-width';\n\nexport const SEPARATOR_WIDTH = 12;\nexport const SEPARATOR_DOUBLE_WIDTH = SEPARATOR_WIDTH * 5;\n\nexport const CSS_HOME_TEAM_COLOR = '--home-team-color';\nexport const CSS_HOME_TEAM_COLOR_HOVER = '--home-team-color-hover';\nexport const CSS_OPPONENT_TEAM_COLOR = '--opponent-team-color';\nexport const CSS_OPPONENT_TEAM_COLOR_HOVER = '--opponent-team-color-hover';\nexport const CSS_FILTER_COLOR = '--filter-color';\nexport const CSS_FILTER_COLOR_HOVER = '--filter-color-hover';\nexport const CSS_EPISODE_CLIP_COLOR = '--episode-clip-color';\nexport const CSS_EPISODE_CLIP_COLOR_HOVER = '--episode-clip-color-hover';\nexport const CSS_TAGS_OFFENSE_COLOR = '--tags-offense-color';\nexport const CSS_TAGS_OFFENSE_COLOR_HOVER = '--tags-offense-color-hover';\nexport const CSS_TAGS_DEFENSIVE_COLOR = '--tags-defensive-color';\nexport const CSS_TAGS_DEFENSIVE_COLOR_HOVER = '--tags-defensive-color-hover';\nexport const CSS_TAGS_TRANSITION_COLOR = '--tags-transition-color';\nexport const CSS_TAGS_TRANSITION_COLOR_HOVER = '--tags-transition-color-hover';\nexport const CSS_TAGS_IMPORTED_COLOR = '--tags-imported-color';\nexport const CSS_TAGS_IMPORTED_COLOR_HOVER = '--tags-imported-color-hover';\nexport const CSS_CLIP_BORDER_COLOR = '--clip-border-color';\nexport const CSS_CLIP_ZOOM_WIDTH = '--clip-width';\nexport const CSS_TIMELINE_INNER_WIDTH = '--timeline-inner-width';\nexport const CSS_EFFECTIVE_TIME_SEPARATOR = '--effective-time-separator';\nexport const CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME = '--effective-time-separator-half-time';\nexport const CSS_EFFECTIVE_TIME_VISIBILITY = '--effective-time-visibility';\nexport const CSS_IS_HOME_TEAM_SELECTED_VISIBILITY = '--is-home-team-selected-visibility';\nexport const CSS_IS_OPPONENT_TEAM_SELECTED_VISIBILITY = '--is-opponent-team-selected-visibility';\n\ntype Props = {\n recordingId: string;\n};\n\nconst timelineColors = {\n homeSelected: {\n homeTeam: Colors.bluePastel,\n homeTeamHover: '#2853A8',\n opponentTeam: Colors.cloud,\n opponentTeamHover: '#7F97C6',\n },\n opponentSelected: {\n homeTeam: Colors.fresco,\n homeTeamHover: '#96AEB1',\n opponentTeam: Colors.fountain,\n opponentTeamHover: '#399490',\n },\n anySelected: {\n filter: Colors.orange,\n filterHover: '#D18F12',\n episode: '#7A7E98',\n episodeHover: '#55586A',\n border: '#131332',\n tagsOffense: Colors.lavender,\n tagsOffenseHover: '#8E87C3',\n tagsDefensive: Colors.aqua,\n tagsDefensiveHover: '#48B7B3',\n tagsTransition: '#FACD74',\n tagsTransitionHover: '#CBA65E',\n tagsImported: '#C9CED6',\n tagsImportedHover: '#6F738C',\n },\n};\n\nexport const TimelineCssVariables = ({ recordingId }: Props) => {\n const { zoomLevel } = useTimelineZoomLevel();\n const { isHomeTeamSelected, isOpponentTeamSelected } = useTimelineTeamIdFocus(recordingId);\n const { useEffectiveTime: effectiveTime } = useVideoPlayerPlayingMode();\n const timelineInnerWidth = useTimelineInnerWidth(recordingId);\n\n const stylesEffectiveTime = useMemo(() => {\n return {\n ['html']: {\n [CSS_EFFECTIVE_TIME_VISIBILITY]: effectiveTime ? 'none' : 'block',\n [CSS_EFFECTIVE_TIME_SEPARATOR]: effectiveTime ? `${SEPARATOR_WIDTH}px` : 'auto',\n [CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME]: effectiveTime ? `${SEPARATOR_DOUBLE_WIDTH}px` : 'auto',\n },\n };\n }, [effectiveTime]);\n\n const stylesTeamColor = useMemo(() => {\n return {\n ['html']: {\n [CSS_IS_HOME_TEAM_SELECTED_VISIBILITY]: isHomeTeamSelected ? 'flex' : 'none',\n [CSS_IS_OPPONENT_TEAM_SELECTED_VISIBILITY]: isOpponentTeamSelected ? 'flex' : 'none',\n [CSS_HOME_TEAM_COLOR]: isHomeTeamSelected\n ? timelineColors.homeSelected.homeTeam\n : timelineColors.opponentSelected.homeTeam,\n [CSS_OPPONENT_TEAM_COLOR]: !isHomeTeamSelected\n ? timelineColors.opponentSelected.opponentTeam\n : timelineColors.homeSelected.opponentTeam,\n [CSS_HOME_TEAM_COLOR_HOVER]: isHomeTeamSelected\n ? timelineColors.homeSelected.homeTeamHover\n : timelineColors.opponentSelected.homeTeamHover,\n [CSS_OPPONENT_TEAM_COLOR_HOVER]: !isHomeTeamSelected\n ? timelineColors.opponentSelected.opponentTeamHover\n : timelineColors.homeSelected.opponentTeamHover,\n [CSS_FILTER_COLOR]: timelineColors.anySelected.filter,\n [CSS_FILTER_COLOR_HOVER]: timelineColors.anySelected.filterHover,\n [CSS_EPISODE_CLIP_COLOR]: timelineColors.anySelected.episode,\n [CSS_EPISODE_CLIP_COLOR_HOVER]: timelineColors.anySelected.episodeHover,\n [CSS_CLIP_BORDER_COLOR]: timelineColors.anySelected.border,\n [CSS_TAGS_OFFENSE_COLOR]: timelineColors.anySelected.tagsOffense,\n [CSS_TAGS_OFFENSE_COLOR_HOVER]: timelineColors.anySelected.tagsOffenseHover,\n [CSS_TAGS_DEFENSIVE_COLOR]: timelineColors.anySelected.tagsDefensive,\n [CSS_TAGS_DEFENSIVE_COLOR_HOVER]: timelineColors.anySelected.tagsDefensiveHover,\n [CSS_TAGS_TRANSITION_COLOR]: timelineColors.anySelected.tagsTransition,\n [CSS_TAGS_TRANSITION_COLOR_HOVER]: timelineColors.anySelected.tagsTransitionHover,\n [CSS_TAGS_IMPORTED_COLOR]: timelineColors.anySelected.tagsImported,\n [CSS_TAGS_IMPORTED_COLOR_HOVER]: timelineColors.anySelected.tagsImportedHover,\n },\n };\n }, [isHomeTeamSelected, isOpponentTeamSelected]);\n\n const stylesWidth = useMemo(() => {\n return {\n ['html']: {\n [CSS_TIMELINE_INNER_WIDTH]: `${timelineInnerWidth}px`,\n [CSS_CLIP_ZOOM_WIDTH]: `${getTimeZoomLevelAdjustment(zoomLevel)}px`,\n },\n };\n }, [timelineInnerWidth, zoomLevel]);\n\n return (\n <>\n <GlobalStyles styles={stylesTeamColor} />\n <GlobalStyles styles={stylesWidth} />\n <GlobalStyles styles={stylesEffectiveTime} />\n </>\n );\n};\n","import classNames from 'classnames';\nimport { CSSProperties, useMemo } from 'react';\nimport { useRecoilValue } from 'recoil';\n\nimport styles from 'pages/tactical-analysis/components/timeline/timeline-table/TimelineTable.module.scss';\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nimport { clipAtomFamily } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/atoms';\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { useTeamUtils } from '../../../../../hooks/use-timeline-team-id-focus';\nimport { TacticActionType } from '../../../../../types';\nimport { CSS_CLIP_ZOOM_WIDTH } from '../timeline-css-variables';\n\ntype DefaultClipProps = {\n clip: Clip;\n recordingId: string;\n parentClip: Clip;\n isSelected?: boolean;\n borderStyle?: 'dotted' | 'solid';\n};\n\nexport const SelectableClip = ({\n clip,\n recordingId,\n parentClip,\n borderStyle = 'solid',\n isSelected,\n}: DefaultClipProps) => {\n const clipWithSelection = useRecoilValue(clipAtomFamily(clip.id));\n const { isHomeTeam, isOpponentTeam } = useTeamUtils(recordingId);\n\n const clipStyle: CSSProperties = useMemo(\n () => ({\n left: `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.startTime - parentClip.startTime})`,\n width: `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.endTime - clip.startTime})`,\n }),\n [clip, parentClip],\n );\n\n const className = useMemo(() => {\n const isHome = isHomeTeam(clip.teamId ?? '');\n const isOpponent = isOpponentTeam(clip.teamId ?? '');\n const shouldReverseHomeTeam =\n isOpponent &&\n (clip.type === 'tactic' || clip.type === 'parent-clip') &&\n clip.action === TacticActionType.DEFENSIVE;\n const shouldReverseOpponentTeam =\n isHome && (clip.type === 'tactic' || clip.type === 'parent-clip') && clip.action === TacticActionType.DEFENSIVE;\n\n return classNames(styles.clip, {\n [styles.isSelected]: isSelected !== undefined ? isSelected : clipWithSelection.isSelected,\n [styles.isSelectedForPlaying]: clipWithSelection.isSelectedForPlaying,\n [styles.isHomeTeam]: shouldReverseHomeTeam || (isHome && !shouldReverseOpponentTeam),\n [styles.isOpponentTeam]: shouldReverseOpponentTeam || (isOpponent && !shouldReverseHomeTeam),\n [styles.isFilter]: clip.rowId.includes('filters'),\n [styles.isOffensive]: clip.rowId.includes(TypeOfPlay.Offense),\n [styles.isDefensive]: clip.rowId.includes(TypeOfPlay.Defense),\n [styles.isTransition]: clip.rowId.includes(TypeOfPlay.Transition),\n [styles.isImported]: clip.rowId.includes(TypeOfPlay.imported),\n [styles.borderSolid]: borderStyle === 'solid',\n [styles.borderDotted]: borderStyle === 'dotted',\n });\n }, [\n borderStyle,\n clip.action,\n clip.rowId,\n clip.teamId,\n clip.type,\n clipWithSelection.isSelected,\n clipWithSelection.isSelectedForPlaying,\n isHomeTeam,\n isOpponentTeam,\n isSelected,\n ]);\n\n return (\n <div\n id={clip.id}\n data-clip-id={clip.id}\n data-clip-start-time={clip.startTime}\n data-is-selected={clipWithSelection.isSelectedForPlaying}\n className={className}\n style={clipStyle}\n />\n );\n};\n","import { useMemo } from 'react';\n\nimport { useTeamUtils } from '../../../../../hooks/use-timeline-team-id-focus';\n\nexport const useRowTeam = (recordingId: string, teamId?: string) => {\n const { isHomeTeam } = useTeamUtils(recordingId);\n return useMemo(() => {\n if (!teamId) return 'none';\n\n return isHomeTeam(teamId) ? 'home' : 'opponent';\n }, [teamId, isHomeTeam]);\n};\n","import { Box, Fade, Popper, Stack, styled } from '@mui/material';\nimport { css } from '@mui/system';\nimport { Colors, fontSizes } from 'kognia-ui';\nimport { MouseEvent, useCallback, useEffect, useState } from 'react';\nimport { useRecoilValue } from 'recoil';\n\nimport {\n clipAtomFamily,\n useClipsIdsSelection,\n} from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/atoms';\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { useTacticalAnalysisMode } from '../../../../../hooks/use-tactical-analysis-mode';\nimport { TacticActionType } from '../../../../../types';\nimport { useRowTeam } from '../../hooks/use-row-team';\nimport { SelectableClip } from '../clip';\nimport { CSS_CLIP_ZOOM_WIDTH } from '../timeline-css-variables';\n\nconst ParentSelectableClipCounter = styled(Box, {\n shouldForwardProp: (propName) => propName !== 'isDisabled',\n})<{ isDisabled: boolean }>(\n ({ theme, isDisabled }) => css`\n position: absolute;\n bottom: 0;\n right: 0;\n padding: ${theme.spacing(0.25)};\n height: 100%;\n border-radius: ${theme.spacing(0, 0.25, 0.25, 0)};\n z-index: 1;\n background: ${Colors.navy};\n color: ${Colors.white};\n pointer-events: none;\n line-height: 1;\n font-size: ${fontSizes.xxxSmall};\n display: flex;\n align-items: center;\n justify-content: center;\n\n ${isDisabled && `opacity: 0.2`}\n `,\n);\n\nconst ParentSelectableClipContainer = styled(Box)(\n ({ theme }) => css`\n position: relative;\n height: 100%;\n z-index: 0;\n container-type: inline-size;\n\n @container (max-width: 20px) {\n & .parent-clip-counter {\n top: 0;\n width: 100%;\n height: 4px;\n border-radius: ${theme.spacing(0.25, 0.25, 0, 0)};\n\n span {\n display: none;\n }\n }\n }\n `,\n);\n\nenum SelectionState {\n All = 'all',\n Some = 'some',\n None = 'none',\n}\n\ninterface ParentClipProps {\n recordingId: string;\n clip: Clip;\n clips: Clip[];\n parentClip: Clip;\n}\n\nexport const ParentClip = ({ recordingId, clip, clips, parentClip }: ParentClipProps) => {\n const [anchorEl, setAnchorEl] = useState<null | HTMLDivElement>(null);\n const [hasScroll, setHasScroll] = useState(false);\n const selectedClipsIds = useClipsIdsSelection();\n const clipWithSelection = useRecoilValue(clipAtomFamily(clip.id));\n const tacticalAnalysisMode = useTacticalAnalysisMode(recordingId);\n const open = Boolean(anchorEl);\n const childClipsCount = clips.length;\n const selectedChildClips = selectedClipsIds.filter((id) => clips.some((clip) => clip.id === id));\n const team = useRowTeam(recordingId, clip.teamId);\n\n const selectionState: SelectionState =\n selectedChildClips.length === childClipsCount\n ? SelectionState.All\n : selectedChildClips.length > 0\n ? SelectionState.Some\n : SelectionState.None;\n\n const isSelected = selectionState === SelectionState.All || selectionState === SelectionState.Some;\n const borderStyle =\n selectionState === SelectionState.All ? 'solid' : selectionState !== SelectionState.Some ? undefined : 'dotted';\n\n const handleMouseEnter = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (!event.currentTarget) return;\n if (tacticalAnalysisMode === 'selection' && !clipWithSelection?.isSelectedForPlaying) return;\n setAnchorEl(event.currentTarget);\n },\n [clipWithSelection?.isSelectedForPlaying, tacticalAnalysisMode],\n );\n\n useEffect(() => {\n if (!anchorEl) return;\n const modalContent = anchorEl.querySelector(`[data-clip-id=\"modal-content-${clip.id}\"]`);\n if (modalContent) {\n setHasScroll(modalContent.scrollHeight > modalContent.clientHeight);\n }\n }, [anchorEl, clip.id]);\n\n const handleMouseLeave = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n const relatedTarget = event.relatedTarget as HTMLDivElement;\n if (tacticalAnalysisMode === 'selection' && !clipWithSelection?.isSelectedForPlaying) return;\n if (relatedTarget && relatedTarget?.parentElement?.dataset.elementType === 'clip-actions-menu') return;\n return setAnchorEl(null);\n },\n [clipWithSelection?.isSelectedForPlaying, tacticalAnalysisMode],\n );\n\n const isHome = team === 'home';\n const isOpponent = team === 'opponent';\n const shouldReverseHomeTeam =\n isOpponent && (clip.type === 'tactic' || clip.type === 'parent-clip') && clip.action === TacticActionType.DEFENSIVE;\n const shouldReverseOpponentTeam =\n isHome && (clip.type === 'tactic' || clip.type === 'parent-clip') && clip.action === TacticActionType.DEFENSIVE;\n\n const clipWidth = `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.endTime - clip.startTime})`;\n const clipLeft = `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.startTime - parentClip.startTime})`;\n const isHomeTeam = shouldReverseHomeTeam || (isHome && !shouldReverseOpponentTeam);\n const isOpponentTeam = shouldReverseOpponentTeam || (isOpponent && !shouldReverseHomeTeam);\n\n return (\n <Box\n sx={{ height: '100%', position: 'absolute', width: clipWidth, left: clipLeft, top: 0 }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-clip-team={isHomeTeam ? 'home' : isOpponentTeam ? 'opponent' : 'none'}\n >\n <ParentSelectableClipContainer>\n {childClipsCount > 1 ? (\n <ParentSelectableClipCounter\n className={'parent-clip-counter'}\n isDisabled={tacticalAnalysisMode === 'selection' && !clipWithSelection?.isSelectedForPlaying}\n >\n <span>{childClipsCount}</span>\n </ParentSelectableClipCounter>\n ) : null}\n <SelectableClip\n recordingId={recordingId}\n clip={clip}\n parentClip={clip}\n key={clip.id}\n isSelected={isSelected}\n borderStyle={borderStyle}\n />\n </ParentSelectableClipContainer>\n\n <Popper\n keepMounted\n disablePortal\n id={clip.id}\n open={open}\n anchorEl={anchorEl}\n sx={{ zIndex: 1 }}\n transition\n placement={'bottom-start'}\n >\n {({ TransitionProps }) => (\n <Fade {...TransitionProps} appear={true} timeout={200}>\n <Stack\n data-clip-id={`modal-content-${clip.id}`}\n spacing={0.25}\n sx={{\n zIndex: 100,\n position: 'relative',\n py: 0.25,\n pr: 1,\n backgroundColor: Colors.background,\n width: `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.endTime - clip.startTime} + ${\n hasScroll ? '10px' : '0px'\n })`,\n height: '100%',\n maxHeight: '145px',\n overflowY: 'auto',\n overflowX: 'hidden',\n display: 'block',\n }}\n boxShadow={5}\n borderRadius={0.5}\n >\n {clips.map((item) => (\n <Box key={item.id} sx={{ height: 20, position: 'relative' }}>\n <SelectableClip recordingId={recordingId} clip={item} parentClip={clip} key={item.id} />\n </Box>\n ))}\n </Stack>\n </Fade>\n )}\n </Popper>\n </Box>\n );\n};\n","import { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { SelectableClip } from '../clip';\nimport { ParentClip } from '../parent-clip/ParentClip';\n\nexport const BlockClipsList = ({\n parentClip,\n clips,\n recordingId,\n}: {\n parentClip: Clip;\n clips?: Clip[];\n recordingId: string;\n}) => {\n return (\n <>\n {clips?.map((innerClip) => {\n if (innerClip.type === 'parent-clip' && innerClip.clips) {\n return (\n <ParentClip\n key={innerClip.id}\n clip={innerClip}\n clips={innerClip.clips}\n parentClip={parentClip}\n recordingId={recordingId}\n />\n );\n }\n return <SelectableClip recordingId={recordingId} clip={innerClip} parentClip={parentClip} key={innerClip.id} />;\n })}\n </>\n );\n};\n","import { useMemo } from 'react';\n\nimport styles from './ClipBlockContainer.module.scss';\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { BlockClipsList } from '../block-clips-list';\nimport { CSS_CLIP_ZOOM_WIDTH } from '../timeline-css-variables';\n\ntype Props = {\n clip: Clip;\n recordingId: string;\n};\n\nexport const ClipBlockContainer = ({ clip, recordingId }: Props) => {\n const size = useMemo(() => {\n return { width: `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.endTime - clip.startTime})` };\n }, [clip]);\n\n return (\n <div className={styles.wrapper} style={size}>\n <div className={styles.content}>\n <BlockClipsList parentClip={clip} clips={clip.clips} recordingId={recordingId} />\n </div>\n </div>\n );\n};\n","import { useMemo } from 'react';\n\nimport { useTacticalAnalysisMode } from '../use-tactical-analysis-mode';\nimport { useTimelineShowBallPossession, useTimelineShowNoBallPossession } from '../use-timeline-ball-possession';\nimport { useTimelineTeamIdFocus } from '../use-timeline-team-id-focus';\n\nexport const useTimelineConfigs = (recordingId: string) => {\n const showNoBallPossession = useTimelineShowNoBallPossession(recordingId);\n const showBallPossession = useTimelineShowBallPossession(recordingId);\n const { isHomeTeamSelected, isOpponentTeamSelected } = useTimelineTeamIdFocus(recordingId);\n const tacticalAnalysisMode = useTacticalAnalysisMode(recordingId);\n\n return useMemo(\n () => ({\n showNoBallPossession,\n showBallPossession,\n isHomeTeamSelected,\n isOpponentTeamSelected,\n tacticalAnalysisMode,\n }),\n [showNoBallPossession, showBallPossession, isHomeTeamSelected, isOpponentTeamSelected, tacticalAnalysisMode],\n );\n};\n","import { Box, styled } from '@mui/material';\n\nimport { CSS_CLIP_BORDER_COLOR, CSS_EPISODE_CLIP_COLOR, CSS_EPISODE_CLIP_COLOR_HOVER } from '../timeline-css-variables';\n\nexport const EpisodeClip = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isSelected' && prop !== 'isSelectedForPlaying' && prop !== 'isSelectionMode',\n})<{ isSelected: boolean; isSelectionMode: boolean; isSelectedForPlaying: boolean }>(\n ({ theme, isSelected, isSelectionMode, isSelectedForPlaying }) => ({\n position: 'relative',\n top: 0,\n zIndex: 0,\n width: '100%',\n height: '100%',\n padding: theme.spacing(0.25, 0),\n color: theme.palette.common.white,\n background: `var(${CSS_EPISODE_CLIP_COLOR})`,\n borderRadius: '2px',\n border: `2px solid var(${CSS_EPISODE_CLIP_COLOR})`,\n transition: theme.transitions.create(['opacity', 'background-color', 'border-color'], {\n easing: theme.transitions.easing.easeOut,\n duration: '0.1s',\n }),\n cursor: 'pointer',\n\n '&:hover': {\n borderColor: `var(${CSS_EPISODE_CLIP_COLOR_HOVER})`,\n background: `var(${CSS_EPISODE_CLIP_COLOR_HOVER})`,\n\n ...(isSelected && {\n borderColor: `var(${CSS_CLIP_BORDER_COLOR})`,\n }),\n },\n\n ...(isSelected && {\n zIndex: 1,\n borderColor: `var(${CSS_CLIP_BORDER_COLOR})`,\n background: `var(${CSS_EPISODE_CLIP_COLOR_HOVER})`,\n }),\n\n ...(isSelectionMode && {\n opacity: 0.2,\n pointerEvents: 'none',\n cursor: 'default',\n }),\n\n ...(isSelectedForPlaying && {\n opacity: 1,\n pointerEvents: 'auto',\n cursor: 'pointer',\n }),\n }),\n);\n","import classNames from 'classnames';\nimport { forwardRef, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useRecoilValue } from 'recoil';\n\nimport { useTimelineConfigs } from 'pages/tactical-analysis/hooks/useTimelineConfigs';\n\nimport styles from './ClipEpisode.module.scss';\nimport { EpisodeClip } from './ClipEpisode.styled';\nimport { clipAtomFamily } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/atoms';\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { TIMELINE_CONFIG } from '../../../config';\nimport { CSS_CLIP_ZOOM_WIDTH } from '../timeline-css-variables';\n\ntype Props = {\n clip: Clip;\n recordingId: string;\n};\n\nconst EpisodeName = forwardRef(({ children, isVisible }: { children: ReactNode; isVisible: boolean }, ref: any) => (\n <div ref={ref} className={classNames(styles.episodeName, { [styles.isVisible]: isVisible })}>\n {children}\n </div>\n));\n\nEpisodeName.displayName = 'EpisodeName';\n\nexport const ClipEpisode = ({ clip, recordingId }: Props) => {\n const { t } = useTranslation();\n const [showShortName, setShowShortName] = useState(false);\n const [showName, setShowName] = useState(true);\n const nameRef = useRef<HTMLDivElement>(null);\n const boxRef = useRef<HTMLDivElement>(null);\n const config = useTimelineConfigs(recordingId);\n const clipWithSelection = useRecoilValue(clipAtomFamily(clip.id));\n\n const handleContainerResize = useCallback((entries: ResizeObserverEntry[]) => {\n if (!nameRef.current || !boxRef.current) return;\n const entry = entries[0].target as HTMLDivElement;\n const hasTextOverflow = entry.offsetWidth < nameRef.current.scrollWidth;\n setShowShortName(hasTextOverflow);\n setShowName(entry.clientWidth > 20);\n }, []);\n\n useEffect(() => {\n if (boxRef?.current !== null) {\n const observer = new ResizeObserver(handleContainerResize);\n\n const containerElement: HTMLElement = boxRef.current;\n observer.observe(containerElement);\n\n return () => {\n observer.unobserve(containerElement);\n };\n }\n }, [handleContainerResize]);\n\n const clipStyle = useMemo(\n () => ({\n height: `${TIMELINE_CONFIG.EPISODE_ROW_HEIGHT}px`,\n width: `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.endTime - clip.startTime})`,\n }),\n [clip],\n );\n\n return (\n <div\n ref={boxRef}\n title={t(clip.title, { name: clip.name })}\n className={styles.episodeClipContainer}\n style={clipStyle}\n >\n <EpisodeClip\n isSelected={clipWithSelection.isSelected}\n data-clip-id={clip.id}\n data-clip-start-time={clip.startTime}\n data-is-selected={clipWithSelection.isSelected}\n isSelectionMode={config.tacticalAnalysisMode === 'selection'}\n isSelectedForPlaying={clipWithSelection.isSelectedForPlaying}\n >\n <EpisodeName isVisible={showName && showShortName}>{clip.name}</EpisodeName>\n <EpisodeName ref={nameRef} isVisible={showName && !showShortName}>\n {t(clip.title, { name: clip.name })}\n </EpisodeName>\n </EpisodeClip>\n </div>\n );\n};\n","import styles from './NotEffectiveTimeClipsList.module.scss';\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { SelectableClip } from '../clip';\n\ntype Props = {\n clip: Clip;\n recordingId: string;\n};\nexport const NotEffectiveTimeClipsList = ({ clip, recordingId }: Props) => {\n return (\n <div className={styles.content}>\n {clip.clips?.map((innerClip) => (\n <SelectableClip recordingId={recordingId} clip={innerClip} parentClip={clip} key={innerClip.id} />\n ))}\n </div>\n );\n};\n","import classNames from 'classnames';\n\nimport styles from './ClipNotEffectiveTime.module.scss';\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { NotEffectiveTimeClipsList } from '../no-effective-time-clips-list';\nimport {\n CSS_CLIP_ZOOM_WIDTH,\n CSS_EFFECTIVE_TIME_SEPARATOR,\n CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME,\n} from '../timeline-css-variables';\n\ntype Props = {\n clip: Clip;\n recordingId: string;\n};\n\nexport const ClipNotEffectiveTime = ({ clip, recordingId }: Props) => {\n return (\n <div\n id={`${clip.id} ${clip.type}`}\n className={classNames(styles.container, { [styles.isHalfTime]: clip.title })}\n style={{\n width: `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.endTime - clip.startTime})`,\n minWidth: `var(${clip.title ? CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME : CSS_EFFECTIVE_TIME_SEPARATOR})`,\n maxWidth: `var(${clip.title ? CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME : CSS_EFFECTIVE_TIME_SEPARATOR})`,\n }}\n >\n {clip.clips && clip.clips.length > 0 ? <NotEffectiveTimeClipsList recordingId={recordingId} clip={clip} /> : null}\n </div>\n );\n};\n","import React from 'react';\n\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { ClipBlockContainer } from '../clip-block-container';\nimport { ClipEpisode } from '../clip-episode';\nimport { ClipNotEffectiveTime } from '../clip-not-effective-time';\n\ntype Props = {\n clip: Clip;\n recordingId: string;\n};\n\nexport const ClipTimeline = React.memo(({ clip, recordingId }: Props) => {\n if (clip.type === 'episode') {\n return <ClipEpisode clip={clip} recordingId={recordingId} />;\n }\n\n if (clip.type === 'block-container') {\n return <ClipBlockContainer recordingId={recordingId} clip={clip} />;\n }\n\n if (clip.type === 'not-effective-time') {\n return <ClipNotEffectiveTime clip={clip} recordingId={recordingId} />;\n }\n\n return null;\n});\n\nClipTimeline.displayName = 'ClipTimeline';\n","import React from 'react';\n\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { ClipTimeline } from '../clip-timeline';\n\ntype Props = { recordingId: string; clips: Clip[] };\n\nexport const EpisodesClips = ({ recordingId, clips }: Props) => {\n return (\n <>\n {clips.map((clip) => (\n <ClipTimeline key={clip.id} recordingId={recordingId} clip={clip} />\n ))}\n </>\n );\n};\n","import { Box } from '@mui/material';\nimport { forwardRef, PropsWithChildren } from 'react';\n\nimport { useTacticalAnalysisEpisodes } from '../../../../../hooks/use-tactical-analysis-episodes';\nimport { useTimelineInnerWidth } from '../../hooks/use-generate-timeline-width';\n\nexport const EpisodesRow = forwardRef(\n (\n {\n children,\n recordingId,\n }: PropsWithChildren<{\n recordingId: string;\n }>,\n ref: any,\n ) => {\n const episodes = useTacticalAnalysisEpisodes(recordingId);\n const width = useTimelineInnerWidth(recordingId);\n\n if (episodes.length === 0) return null;\n\n return (\n <Box\n ref={ref}\n display='inline-flex'\n height='34px'\n py={0}\n px={3}\n bgcolor='common.white'\n style={{ width: `${width}px` }}\n >\n {children}\n </Box>\n );\n },\n);\n\nEpisodesRow.displayName = 'EpisodesRow';\n","import { Row } from '../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\n\nexport const getRowTotalClips = (row: Row) => {\n return row.clips.reduce((total, clip) => total + (clip.clips?.length ?? 0), 0);\n};\n","import { Row } from '../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { getRowTotalClips } from '../get-row-total-clips';\n\nexport const hasFiltersResults = (filtersRow?: Row) => {\n if (!filtersRow) return false;\n\n return Boolean(getRowTotalClips(filtersRow));\n};\n","import { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { ClipTimeline } from '../clip-timeline';\n\nexport const ClipsList = ({ recordingId, clips }: { recordingId: string; clips: Clip[] }) => {\n return (\n <>\n {clips.map((clip) => (\n <ClipTimeline recordingId={recordingId} key={clip.id} clip={clip} />\n ))}\n </>\n );\n};\n","import { Box, styled } from '@mui/material';\n\nexport const BASIC_ROW_HEIGHT = '24px';\n\nexport const RowGroupHeaderContainer = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'level' && prop !== 'isClickable',\n})<{ level: number; isClickable?: boolean }>(({ theme, level, isClickable }) => ({\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n height: BASIC_ROW_HEIGHT,\n paddingLeft: 0,\n background: theme.palette.secondary.light,\n borderBottom: `1px solid ${theme.palette.secondary.main}`,\n userSelect: 'none',\n\n ...(level === 1 && {\n paddingLeft: theme.spacing(1),\n background: theme.palette.grey[200],\n }),\n\n ...(isClickable && {\n cursor: 'pointer',\n }),\n}));\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nimport { BASIC_ROW_HEIGHT } from '../TimelineTable.styled';\n\nexport const RowContentContainerWrapper = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isHighlighted' && prop !== 'isBorderTop',\n})<{ isHighlighted?: boolean; isBorderTop: boolean }>(({ theme, isHighlighted, isBorderTop }) => ({\n display: 'flex',\n width: '100%',\n height: BASIC_ROW_HEIGHT,\n padding: theme.spacing(0, 3),\n background: theme.palette.common.white,\n borderBottom: `1px solid ${theme.palette.secondary.main}`,\n transition: theme.transitions.create('all', {\n easing: theme.transitions.easing.easeOut,\n duration: '0.1s',\n }),\n userSelect: 'none',\n\n ...(isHighlighted && {\n // TODO use from theme\n background: Colors.background,\n }),\n\n ...(isBorderTop && {\n borderBottom: 0,\n borderTop: `1px solid ${theme.palette.secondary.main}`,\n }),\n}));\n","import classNames from 'classnames';\nimport { ReactNode } from 'react';\n\nimport { RowContentContainerWrapper } from './RowContentContainer.styled';\nimport { Team } from '../../../types';\nimport timelineStyles from '../../TimelineTable.module.scss';\n\ninterface Props extends React.HTMLAttributes<HTMLDivElement> {\n isHighlighted?: boolean;\n children: ReactNode;\n team: Team;\n borderTop: boolean;\n isSelected?: boolean;\n}\n\nexport const RowContentContainer = ({\n children,\n borderTop = false,\n team,\n isHighlighted,\n isSelected,\n ...rest\n}: Props) => (\n <RowContentContainerWrapper\n {...rest}\n isHighlighted={isHighlighted}\n isBorderTop={borderTop}\n className={classNames(timelineStyles.rowContent, {\n [timelineStyles.isSelectedForPlaying]: isSelected,\n [timelineStyles.isHomeTeamRow]: team === 'home',\n [timelineStyles.isOpponentTeamRow]: team === 'opponent',\n })}\n >\n {children}\n </RowContentContainerWrapper>\n);\n","import { useCallback } from 'react';\n\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { useRowTeam } from '../../hooks/use-row-team';\nimport { useRow, useRowIsHighlighted, useSetRowIsHighlighted } from '../../store/atoms';\nimport { ClipsList } from '../clips-list';\nimport { RowContentContainer } from '../row-content-container';\n\ntype Props = {\n clips: Clip[];\n recordingId: string;\n rowId: string;\n};\n\nexport const RowContent = ({ clips, recordingId, rowId }: Props) => {\n const row = useRow(rowId);\n const team = useRowTeam(recordingId, row.teamId);\n const isRowHighlighted = useRowIsHighlighted(rowId);\n const setRowHighlighted = useSetRowIsHighlighted(rowId);\n\n const handleMouseEnter = useCallback(() => {\n setRowHighlighted(true);\n }, [setRowHighlighted]);\n\n const handleMouseLeave = useCallback(() => {\n setRowHighlighted(false);\n }, [setRowHighlighted]);\n\n return (\n <RowContentContainer\n team={team}\n borderTop={rowId === `${recordingId}-filters`}\n isHighlighted={isRowHighlighted}\n isSelected={row.isSelected}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <ClipsList recordingId={recordingId} clips={clips} />\n </RowContentContainer>\n );\n};\n","import React from 'react';\n\nimport { useTimelineTableData } from '../../../../../hooks/use-timeline-table-data';\nimport { hasFiltersResults } from '../../../../../utils/has-filters-results';\nimport { RowContent } from '../row-content';\n\nexport const FiltersContentRow = ({ recordingId }: { recordingId: string }) => {\n const timelineTableData = useTimelineTableData(recordingId);\n\n if (!timelineTableData.filtersRow || !hasFiltersResults(timelineTableData.filtersRow)) return null;\n\n return (\n <RowContent\n rowId={timelineTableData.filtersRow.id}\n clips={timelineTableData.filtersRow.clips}\n recordingId={recordingId}\n />\n );\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\ntype SeparatorProps = {\n height: string;\n};\n\nconst Separator = styled(Box, {\n label: 'Separator',\n shouldForwardProp: (prop) => prop !== 'height',\n})<SeparatorProps>(({ height }) => ({\n height,\n width: '1px',\n minWidth: '1px',\n background: Colors.iron,\n}));\n\ntype Props = {\n height?: string;\n};\n\nexport const VerticalSeparator = ({ height = '100%' }: Props) => {\n return <Separator height={height} />;\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nimport { BASIC_ROW_HEIGHT } from '../TimelineTable.styled';\n\nexport const RowHeaderContainerWrapper = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isHighlighted' && prop !== 'isBorderTop',\n})<{ isHighlighted?: boolean; isBorderTop: boolean }>(({ theme, isHighlighted, isBorderTop }) => ({\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n height: BASIC_ROW_HEIGHT,\n paddingRight: theme.spacing(1),\n background: theme.palette.common.white,\n borderBottom: `1px solid ${theme.palette.secondary.main}`,\n userSelect: 'none',\n transition: theme.transitions.create('all', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.shorter,\n }),\n\n ...(isHighlighted && {\n // TODO use from theme\n background: Colors.background,\n }),\n\n ...(isBorderTop && {\n borderBottom: 0,\n borderTop: `1px solid ${theme.palette.secondary.main}`,\n }),\n}));\n","import classNames from 'classnames';\nimport { PropsWithChildren, ReactNode } from 'react';\n\nimport { RowHeaderContainerWrapper } from './RowHeaderContainer.styled';\nimport { Team } from '../../../types';\nimport timelineStyles from '../../TimelineTable.module.scss';\n\ntype Props = {\n isHighlighted?: boolean;\n children: ReactNode;\n team: Team;\n borderTop?: boolean;\n isSelected?: boolean;\n};\n\nexport const RowHeaderContainer = ({\n children,\n isHighlighted,\n borderTop = false,\n isSelected = false,\n team,\n ...rest\n}: PropsWithChildren<React.HTMLAttributes<HTMLDivElement> & Props>) => (\n <RowHeaderContainerWrapper\n isHighlighted={isHighlighted}\n isBorderTop={borderTop}\n className={classNames(timelineStyles.row, {\n [timelineStyles.isSelectedForPlaying]: isSelected,\n [timelineStyles.isHomeTeamRow]: team === 'home',\n [timelineStyles.isOpponentTeamRow]: team === 'opponent',\n })}\n {...rest}\n >\n {children}\n </RowHeaderContainerWrapper>\n);\n","import { PropsWithChildren } from 'react';\n\nimport styles from '../Rows.module.scss';\n\nexport const RowHeaderContent = ({\n children,\n title,\n ...rest\n}: PropsWithChildren<React.HTMLAttributes<HTMLDivElement>> & { title: string }) => (\n <div {...rest} title={title} className={styles.rowHeaderContent}>\n {children}\n </div>\n);\n","import { Box } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport { PropsWithChildren } from 'react';\n\nimport { BASIC_ROW_HEIGHT } from '../TimelineTable.styled';\n\nexport const RowHeaderTotal = ({ children }: PropsWithChildren) => (\n <Box\n sx={({ palette, spacing }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 22,\n minWidth: 22,\n marginLeft: spacing(1),\n color: palette.secondary.main,\n fontSize: fontSizes.small,\n lineHeight: BASIC_ROW_HEIGHT,\n userSelect: 'none',\n })}\n >\n {children}\n </Box>\n);\n","import { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\n\nexport const getScenarioClips = (clips: Clip[], compareFunction: (value: string) => boolean): Clip[] => {\n return clips.filter((clip) => {\n return compareFunction(clip.teamId ?? '');\n });\n};\n","import { PropsWithChildren } from 'react';\n\nimport styles from '../Rows.module.scss';\n\nexport const RowScenariosContent = ({ children, ...rest }: PropsWithChildren<React.HTMLAttributes<HTMLDivElement>>) => (\n <div className={styles.rowScenariosContent} {...rest}>\n {children}\n </div>\n);\n","import classNames from 'classnames';\n\nimport styles from './TeamRowHighlight.module.scss';\nimport { Team } from '../../../types';\n\nexport const TeamRowHighlight = ({ team }: { team: Team }) => {\n return (\n <div\n className={classNames(styles.teamHomeHighlight, {\n [styles.isHomeTeam]: team === 'home',\n [styles.isOpponentTeam]: team === 'opponent',\n })}\n />\n );\n};\n","import classNames from 'classnames';\nimport { useCallback, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { VerticalSeparator } from 'shared/components/vertical-separator';\n\nimport { Row } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { useSelectedPlayingRow } from '../../../../../hooks/use-selection-playing';\nimport { useTeamUtils, useTimelineTeamIdFocus } from '../../../../../hooks/use-timeline-team-id-focus';\nimport { TIMELINE_CONFIG } from '../../../config';\nimport { useRowTeam } from '../../hooks/use-row-team';\nimport { useRowIsHighlighted, useSetRowIsHighlighted } from '../../store/atoms';\nimport timelineStyles from '../../TimelineTable.module.scss';\nimport { RowHeaderContainer } from '../row-header-container';\nimport { RowHeaderContent } from '../row-header-content';\nimport { RowHeaderTotal } from '../row-header-total';\nimport { getScenarioClips } from '../row-headers-group/util';\nimport { RowScenariosContent } from '../row-scenarios-content';\nimport styles from '../Rows.module.scss';\nimport { TeamRowHighlight } from '../team-row-highlight';\n\ntype Props = {\n recordingId: string;\n row: Row;\n};\n\nexport const RowHeaderScenario = ({ recordingId, row }: Props) => {\n const { t } = useTranslation();\n const { isHomeTeam } = useTeamUtils(recordingId);\n const { isHomeTeamSelected } = useTimelineTeamIdFocus(recordingId);\n const team = useRowTeam(recordingId, row.teamId);\n const isRowHighlighted = useRowIsHighlighted(row.id);\n const setRowHighlighted = useSetRowIsHighlighted(row.id);\n const playingRow = useSelectedPlayingRow(recordingId);\n\n const homeTeamClips = useMemo(\n () => getScenarioClips(row.clips.map((clip) => (clip.clips ? clip.clips : [])).flat(), isHomeTeam),\n [isHomeTeam, row.clips],\n );\n const opponentTeamClips = useMemo(\n () =>\n getScenarioClips(row.clips.map((clip) => (clip.clips ? clip.clips : [])).flat(), (teamId) => !isHomeTeam(teamId)),\n [isHomeTeam, row.clips],\n );\n\n const handleMouseEnter = useCallback(() => {\n setRowHighlighted(true);\n }, [setRowHighlighted]);\n\n const handleMouseLeave = useCallback(() => {\n setRowHighlighted(false);\n }, [setRowHighlighted]);\n\n if (row.isHidden) return null;\n\n const getIsEnabled = (team: 'home' | 'opponent') => {\n return playingRow?.rowId === row.id && playingRow?.team === team;\n };\n\n const homeRowIsSelected = getIsEnabled('home');\n const opponentRowIsSelected = getIsEnabled('opponent');\n\n return (\n <RowHeaderContainer\n team={team}\n borderTop={row.id === 'filters'}\n isHighlighted={isRowHighlighted}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n isSelected={homeRowIsSelected || opponentRowIsSelected}\n >\n <RowScenariosContent style={{ flexDirection: isHomeTeamSelected ? 'row' : 'row-reverse' }}>\n <div\n className={classNames(styles.rowScenariosColumn, {\n [timelineStyles.isNotSelectedForPlaying]: opponentRowIsSelected,\n })}\n data-row-id={row.id}\n data-is-selected={homeRowIsSelected}\n data-row-type='home-team'\n >\n <TeamRowHighlight team={'home'} />\n <RowHeaderTotal>{homeTeamClips.length}</RowHeaderTotal>\n <RowHeaderContent title={t(row.title)}>\n {t(`${row.title}${isHomeTeamSelected ? '' : '-no-possession'}`)}\n </RowHeaderContent>\n </div>\n <VerticalSeparator height={`${TIMELINE_CONFIG.ROW_HEIGHT - 8}px`} />\n <div\n className={classNames(styles.rowScenariosColumn, {\n [timelineStyles.isNotSelectedForPlaying]: homeRowIsSelected,\n })}\n data-row-id={row.id}\n data-is-disabled={opponentRowIsSelected}\n data-row-type='opponent-team'\n >\n <TeamRowHighlight team={'opponent'} />\n <RowHeaderTotal>{opponentTeamClips.length}</RowHeaderTotal>\n <RowHeaderContent title={t(`${row.title}-no-possession`)}>\n {t(`${row.title}${!isHomeTeamSelected ? '' : '-no-possession'}`)}\n </RowHeaderContent>\n </div>\n </RowScenariosContent>\n </RowHeaderContainer>\n );\n};\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useRowTeam } from '../../hooks/use-row-team';\nimport { useRow, useRowIsHighlighted, useSetRowIsHighlighted } from '../../store/atoms';\nimport { RowHeaderContainer } from '../row-header-container';\nimport { RowHeaderContent } from '../row-header-content';\nimport { RowHeaderTotal } from '../row-header-total';\nimport { TeamRowHighlight } from '../team-row-highlight';\n\ntype Props = {\n totalNumberOfClips: number;\n recordingId: string;\n title: string;\n rowId: string;\n};\n\nexport const RowHeaderTactic = ({ totalNumberOfClips, title, rowId, recordingId }: Props) => {\n const row = useRow(rowId);\n const team = useRowTeam(recordingId, row.teamId);\n const { t } = useTranslation();\n const isRowHighlighted = useRowIsHighlighted(rowId);\n const setRowHighlighted = useSetRowIsHighlighted(rowId);\n\n const handleMouseEnter = useCallback(() => {\n setRowHighlighted(true);\n }, [setRowHighlighted]);\n\n const handleMouseLeave = useCallback(() => {\n setRowHighlighted(false);\n }, [setRowHighlighted]);\n\n return (\n <RowHeaderContainer\n team={team}\n borderTop={rowId === `${recordingId}-filters`}\n isHighlighted={isRowHighlighted}\n isSelected={row.isSelected}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-row-id={rowId}\n data-timeline-element='row-header'\n data-is-selected={row.isSelected}\n data-row-type={row.type}\n >\n <TeamRowHighlight team={team} />\n <RowHeaderTotal>{totalNumberOfClips}</RowHeaderTotal>\n <RowHeaderContent title={t(title)}>{t(title)}</RowHeaderContent>\n </RowHeaderContainer>\n );\n};\n","import React, { useMemo } from 'react';\n\nimport { Row } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { getRowTotalClips } from '../../../../../utils/get-row-total-clips';\nimport { RowHeaderScenario } from '../row-header-scenario';\nimport { RowHeaderTactic } from '../row-header-tactic';\n\ntype Props = { row: Row; recordingId: string };\n\nexport const RowHeader = ({ row, recordingId }: Props) => {\n if (row.type === 'scenarios') {\n return <RowHeaderScenario recordingId={recordingId} row={row} />;\n }\n\n const total = useMemo(() => getRowTotalClips(row), [row]);\n\n if (row.type === 'tactics' || row.type === 'events' || row.type === 'manual-tags' || row.type === 'filters') {\n return <RowHeaderTactic recordingId={recordingId} rowId={row.id} title={row.title} totalNumberOfClips={total} />;\n }\n\n return null;\n};\n","import React from 'react';\n\nimport { useTimelineTableData } from '../../../../../hooks/use-timeline-table-data';\nimport { hasFiltersResults } from '../../../../../utils/has-filters-results';\nimport { RowHeader } from '../row-header';\n\nexport const FiltersHeaderRow = ({ recordingId }: { recordingId: string }) => {\n const timelineTableData = useTimelineTableData(recordingId);\n\n if (!timelineTableData.filtersRow || !hasFiltersResults(timelineTableData.filtersRow)) return null;\n\n return <RowHeader recordingId={recordingId} row={timelineTableData.filtersRow} />;\n};\n","import { Box, styled } from '@mui/material';\nimport React from 'react';\n\nimport IconChevronDown from '../icons/icon-chevron-down';\n\ninterface Props {\n isOpen: boolean;\n color?: 'text.primary';\n}\n\ninterface ChevronProps {\n isOpen: boolean;\n}\n\nconst ChevronContainer = styled(Box, { shouldForwardProp: (prop) => prop !== 'isOpen' })<ChevronProps>(\n ({ theme, isOpen }) => ({\n borderRadius: theme.spacing(0.25),\n [theme.breakpoints.down('xs')]: {\n ['& svg']: {\n marginLeft: theme.spacing(0.5),\n },\n },\n [theme.breakpoints.down('xl')]: {\n marginLeft: theme.spacing(),\n },\n ['& svg']: {\n transition: theme.transitions.create(['transform'], {\n duration: theme.transitions.duration.short,\n easing: theme.transitions.easing.easeOut,\n }),\n transform: isOpen ? 'rotate(-180deg)' : 'rotate(0)',\n },\n }),\n);\n\nexport const Chevron = ({ isOpen, color }: Props) => {\n return (\n <ChevronContainer isOpen={isOpen}>\n <IconChevronDown sx={{ color: color ? color : 'secondary.light' }} size='small' />\n </ChevronContainer>\n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconPin = (props: Omit<SvgIconProps, 'children'>): JSX.Element => {\n return (\n <SvgIcon {...props}>\n <path d='M17.634 6.041l-2.493 4.318c-.558.967-.773 2.041-.673 3.066l-4.935-2.849c.963-.434 1.77-1.166 2.318-2.116l2.493-4.318 3.29 1.899zm3.465-.303L12.874.99c-.452-.261-1.047-.086-1.321.389s-.129 1.077.324 1.338l.822.475-2.493 4.318c-.828 1.434-2.598 1.955-3.963 1.166l-.997 1.727 4.91 2.835-3.49 6.045.324 1.338 1.321-.389 3.49-6.045 4.96 2.863.997-1.727c-1.365-.788-1.799-2.582-.972-4.015l2.493-4.318.822.475c.452.261 1.047.086 1.321-.389s.128-1.077-.324-1.338z' />\n </SvgIcon>\n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconPinSolid = (props: Omit<SvgIconProps, 'children'>): JSX.Element => {\n return (\n <SvgIcon {...props}>\n <path d='M21.1 5.737L12.874.987c-.452-.261-1.047-.086-1.321.389s-.129 1.078.324 1.339l.823.475-2.494 4.319c-.828 1.434-2.598 1.955-3.964 1.166l-.997 1.728 4.911 2.836-3.491 6.047.324 1.339 1.321-.389 3.491-6.046 4.961 2.864.997-1.728c-1.366-.788-1.8-2.582-.972-4.016l2.494-4.319.823.475c.452.261 1.047.086 1.321-.389s.129-1.078-.324-1.339z' />\n </SvgIcon>\n );\n};\n","import map from 'lodash/map';\n\nimport { RowGroup } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { RowHeader } from '../row-header';\nimport { RowsHeadersGroup } from '../row-headers-group';\n\ntype Props = { recordingId: string; rowsGroup: RowGroup };\n\nexport const RowGroupList = ({ recordingId, rowsGroup }: Props) => {\n return (\n <>\n {rowsGroup.rowGroups\n ? rowsGroup.rowGroups.map((rowGroup) => (\n <RowsHeadersGroup level={1} key={rowGroup.id} rowsGroup={rowGroup} recordingId={recordingId} />\n ))\n : map(rowsGroup.rows, (row, idx) => <RowHeader key={idx} row={row} recordingId={recordingId} />)}\n </>\n );\n};\n","import { Stack, Tooltip } from '@mui/material';\nimport classNames from 'classnames';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Chevron } from 'shared/components/chevron';\nimport { IconPin } from 'shared/components/icons/icon-pin';\nimport { IconPinSolid } from 'shared/components/icons/icon-pin-solid';\n\nimport { RowGroup } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { useRowGroupIsCollapsed, useSetRowGroupIsCollapsed } from '../../store/atoms';\nimport { RowGroupList } from '../row-group-list';\nimport { RowHeaderContent } from '../row-header-content';\nimport styles from '../Rows.module.scss';\nimport { RowGroupHeaderContainer } from '../TimelineTable.styled';\n\ntype Props = {\n rowsGroup: RowGroup;\n level: number;\n recordingId: string;\n onPin?: () => void;\n isPinned?: boolean;\n};\n\nexport const RowsHeadersGroup = ({ rowsGroup, level, recordingId, onPin, isPinned }: Props) => {\n const { t } = useTranslation();\n const isCollapsed = useRowGroupIsCollapsed(rowsGroup.id);\n const setRowIsCollapsed = useSetRowGroupIsCollapsed(rowsGroup.id);\n\n const handleCollapse = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setRowIsCollapsed(!isCollapsed);\n },\n [isCollapsed, setRowIsCollapsed],\n );\n\n const handleOnPin = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n onPin && onPin();\n },\n [onPin],\n );\n\n return (\n <div\n className={classNames({\n [styles.shadow]: isPinned,\n })}\n >\n <RowGroupHeaderContainer level={level} isClickable onClick={handleCollapse}>\n <RowHeaderContent title={onPin ? '' : t(rowsGroup.title)}>\n <Stack direction={'row'} alignItems={'center'} gap={0.5}>\n <span>{t(rowsGroup.title)}</span>\n {onPin ? (\n <Tooltip\n enterDelay={500}\n placement='right'\n title={\n isPinned\n ? t('timeline:tooltips.unpin-possession-scenarios')\n : t('timeline:tooltips.pin-possession-scenarios')\n }\n >\n <span onClick={handleOnPin}>\n {isPinned ? (\n <IconPinSolid isButton size='xsmall' />\n ) : (\n <IconPin color='secondary' isButton size='xsmall' />\n )}\n </span>\n </Tooltip>\n ) : null}\n </Stack>\n </RowHeaderContent>\n <Chevron isOpen={!isCollapsed} color='text.primary' />\n </RowGroupHeaderContainer>\n\n <div style={{ display: isCollapsed ? 'none' : 'block' }}>\n <RowGroupList recordingId={recordingId} rowsGroup={rowsGroup} />\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nimport { RowGroup } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { RowsHeadersGroup } from '../row-headers-group';\n\nexport const RowGroupsList = ({ rowGroups, recordingId }: { recordingId: string; rowGroups: RowGroup[] }) => {\n return (\n <div>\n {rowGroups\n .filter((rowGroup) => rowGroup.totalClips > 0)\n .map((rowGroup) => (\n <RowsHeadersGroup key={rowGroup.type} recordingId={recordingId} level={0} rowsGroup={rowGroup} />\n ))}\n </div>\n );\n};\n","import { Box } from '@mui/material';\nimport { forwardRef, PropsWithChildren } from 'react';\n\nexport const RowHeadersContent = forwardRef(\n ({ children, ...rest }: PropsWithChildren<React.HTMLAttributes<HTMLDivElement>>, ref: any) => (\n <Box {...rest} ref={ref} sx={{ background: ({ palette }) => palette.common.white }}>\n {children}\n </Box>\n ),\n);\n\nRowHeadersContent.displayName = 'RowHeadersContent';\n","import React, { RefObject, useCallback } from 'react';\n\nimport { useSaveUserPreset } from 'api/user-presets/use-save-user-preset';\nimport { TimelineHeadersWidthPreset } from 'shared/constants/user-presets/userPresetsClasses';\n\nimport styles from './RowHeadersResizeBar.module.scss';\nimport { HEADER_MIN_WIDTH } from '../../../../../atoms';\nimport { useSetTimelineHeadersWidth, useTimelineHeadersWidth } from '../../../../../hooks/use-timeline-headers-width';\nimport ResizeBar from '../../../../tactical-analysis/resize-bar';\n\ntype Props = {\n headerContentDiv: RefObject<HTMLDivElement>;\n contentDiv: RefObject<HTMLDivElement>;\n};\n\nconst TIMELINE_TABLE_MIN_WIDTH = 224;\n\nexport const RowHeadersResizeBar = ({ headerContentDiv, contentDiv }: Props) => {\n const { savePreset } = useSaveUserPreset();\n const headersWidth = useTimelineHeadersWidth();\n const setTimelineHeadersWidth = useSetTimelineHeadersWidth();\n\n const handleSaveHeaderWidth = useCallback(\n (width: number) => {\n if (headersWidth === width) {\n return;\n }\n const headerWidthPreset = new TimelineHeadersWidthPreset(width);\n setTimelineHeadersWidth(width);\n savePreset({ data: headerWidthPreset });\n },\n [savePreset, setTimelineHeadersWidth, headersWidth],\n );\n\n return (\n <div className={styles.container}>\n <ResizeBar\n direction={'horizontal'}\n mainPanelElement={headerContentDiv}\n secondaryPanelElement={contentDiv}\n mainPanelMinSize={HEADER_MIN_WIDTH}\n secondaryPanelMinSize={TIMELINE_TABLE_MIN_WIDTH}\n onChange={handleSaveHeaderWidth}\n />\n </div>\n );\n};\n","import { Box } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React, { forwardRef, PropsWithChildren } from 'react';\n\nexport const RowsContent = forwardRef(\n ({ children, ...rest }: PropsWithChildren<React.HTMLAttributes<HTMLDivElement>>, ref: any) => (\n <Box\n {...rest}\n ref={ref}\n position='relative'\n flex={1}\n pb={3}\n // TODO change on color from theme\n bgcolor={Colors.background}\n overflow='auto'\n >\n {children}\n </Box>\n ),\n);\n\nRowsContent.displayName = 'RowsContent';\n","import { Box, styled } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nimport { CSS_TIMELINE_INNER_WIDTH } from '../timeline-css-variables';\n\nexport const RowsContentHeader = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isShadow',\n})<{ isShadow: boolean }>(({ theme, isShadow }) => ({\n position: 'sticky',\n top: 0,\n zIndex: 2,\n minWidth: `var(${CSS_TIMELINE_INNER_WIDTH})`,\n width: '100%',\n background: theme.palette.common.white,\n fontSize: fontSizes.small,\n // TODO use from theme\n lineHeight: 1.67,\n overflow: 'visible',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n\n ...(isShadow && {\n zIndex: 1,\n // TODO use from theme\n boxShadow: `0 3px 3px -1px rgba(10, 22, 70, 0.1), 0 0 1px 0 rgba(10, 22, 70, 0.06)`,\n }),\n}));\n","import map from 'lodash/map';\nimport React from 'react';\n\nimport { RowGroup } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { RowContent } from '../row-content';\n\ntype Props = {\n rowsGroup: RowGroup;\n recordingId: string;\n};\n\nexport const RowGroupRows = React.memo(({ rowsGroup, recordingId }: Props) => {\n return (\n <>\n {map(rowsGroup.rows, (row, idx) => (\n <RowContent rowId={row.id} clips={row.clips} key={idx} recordingId={recordingId} />\n ))}\n </>\n );\n});\n\nRowGroupRows.displayName = 'RowGroupRows';\n","import { RowGroup } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { useRowGroupIsCollapsed } from '../../store/atoms';\nimport { RowGroupRows } from '../row-group-rows';\nimport { RowGroupHeaderContainer } from '../TimelineTable.styled';\n\ntype Props = {\n rowGroup: RowGroup;\n recordingId: string;\n level: number;\n};\n\nexport const RowsContentGroup = ({ rowGroup, recordingId, level = 0 }: Props) => {\n const isCollapsed = useRowGroupIsCollapsed(rowGroup.id);\n\n return (\n <>\n <RowGroupHeaderContainer level={level} />\n <div style={{ display: isCollapsed ? 'none' : 'block' }}>\n {rowGroup.rowGroups ? (\n rowGroup.rowGroups.map((rowGroup) => (\n <RowsContentGroup level={1} key={rowGroup.id} rowGroup={rowGroup} recordingId={recordingId} />\n ))\n ) : (\n <RowGroupRows rowsGroup={rowGroup} recordingId={recordingId} />\n )}\n </div>\n </>\n );\n};\n","import React from 'react';\n\nimport { RowGroup } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { RowsContentGroup } from '../row-content-group';\n\ntype Props = {\n rowGroups: RowGroup[];\n recordingId: string;\n};\n\nexport const RowGroups = React.memo(({ rowGroups, recordingId }: Props) => {\n return (\n <>\n {rowGroups\n .filter((rowGroup) => rowGroup.totalClips > 0)\n .map((rowGroup) => (\n <RowsContentGroup key={rowGroup.type} level={0} rowGroup={rowGroup} recordingId={recordingId} />\n ))}\n </>\n );\n});\n\nRowGroups.displayName = 'RowGroups';\n","import React, { forwardRef, PropsWithChildren, ReactNode } from 'react';\n\nimport { RowsContentHeader } from './RowsContentContainer.styled';\nimport { RowGroup } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { usePinScenarios } from '../../../../../hooks/use-pin-scenarios';\nimport { RowGroups } from '../row-groups';\n\nexport const RowsContentContainer = forwardRef(\n (\n {\n scenariosRow,\n stickComponents,\n contentRowGroups,\n recordingId,\n }: PropsWithChildren<{\n scenariosRow: React.ReactNode;\n recordingId: string;\n contentRowGroups: RowGroup[];\n stickComponents: ReactNode;\n }>,\n ref: any,\n ) => {\n const pinScenarios = usePinScenarios();\n\n return (\n <div>\n <RowsContentHeader isShadow={pinScenarios} ref={ref}>\n {stickComponents}\n {pinScenarios ? scenariosRow : null}\n </RowsContentHeader>\n <div>\n {!pinScenarios ? scenariosRow : null}\n <RowGroups rowGroups={contentRowGroups} recordingId={recordingId} />\n </div>\n </div>\n );\n },\n);\n\nRowsContentContainer.displayName = 'RowsContentHeader';\n","import { Box } from '@mui/material';\nimport React, { forwardRef, PropsWithChildren } from 'react';\n\nimport { CSS_TIMELINE_INNER_WIDTH } from '../timeline-css-variables';\n\nexport const RowsContentInner = forwardRef(\n ({ children, ...rest }: PropsWithChildren<React.HTMLAttributes<HTMLDivElement>>, ref: any) => (\n <Box\n ref={ref}\n sx={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n minWidth: `var(${CSS_TIMELINE_INNER_WIDTH})`,\n\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n right: '-1px',\n width: '1px',\n height: '100%',\n background: ({ palette }) => palette.secondary.main,\n },\n }}\n style={{ width: `${CSS_TIMELINE_INNER_WIDTH}` }}\n {...rest}\n >\n {children}\n </Box>\n ),\n);\n\nRowsContentInner.displayName = 'RowsContentInner';\n","import { Box } from '@mui/material';\nimport { forwardRef, PropsWithChildren } from 'react';\n\nimport { useTacticalAnalysisAppliedFilters } from '../../../../../hooks/use-tactical-analysis-applied-filters';\nimport { useTimelineTableData } from '../../../../../hooks/use-timeline-table-data';\n\nexport const RowsHeaders = forwardRef(\n (\n {\n children,\n recordingId,\n ...rest\n }: PropsWithChildren<\n React.HTMLAttributes<HTMLDivElement> & {\n recordingId: string;\n }\n >,\n ref: any,\n ) => {\n const timelineTableData = useTimelineTableData(recordingId);\n const { areFiltersApplied } = useTacticalAnalysisAppliedFilters(recordingId);\n\n const showHeaders =\n timelineTableData.rowGroups.filter((r) => r.totalClips > 0).length > 0 ||\n (areFiltersApplied && timelineTableData?.filtersRow && timelineTableData.filtersRow.clips.length > 0);\n\n if (!showHeaders) return null;\n\n return (\n <Box ref={ref} position='relative' zIndex={1} pb={4} bgcolor='common.white' overflow='hidden' {...rest}>\n {children}\n </Box>\n );\n },\n);\n\nRowsHeaders.displayName = 'RowsHeaders';\n","import { RowGroup } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { RowsContentGroup } from '../row-content-group';\n\ntype Props = {\n rowGroup?: RowGroup;\n recordingId: string;\n};\nexport const ScenariosRowGroupContent = ({ rowGroup, recordingId }: Props) => {\n if (!rowGroup) return null;\n\n return <RowsContentGroup key={rowGroup.type} level={0} rowGroup={rowGroup} recordingId={recordingId} />;\n};\n","import { useCallback } from 'react';\n\nimport { RowGroup } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/row';\nimport { usePinScenarios, useSetPinScenarios } from '../../../../../hooks/use-pin-scenarios';\nimport { RowsHeadersGroup } from '../row-headers-group';\n\ntype Props = {\n rowGroup?: RowGroup;\n recordingId: string;\n};\nexport const ScenariosRowGroupHeader = ({ rowGroup, recordingId }: Props) => {\n const pinScenarios = usePinScenarios();\n const setPinScenarios = useSetPinScenarios();\n\n if (!rowGroup) return null;\n\n const handleOnPin = useCallback(() => {\n setPinScenarios(!pinScenarios);\n }, [setPinScenarios, pinScenarios]);\n\n return (\n <RowsHeadersGroup\n key={rowGroup.type}\n recordingId={recordingId}\n level={0}\n onPin={handleOnPin}\n isPinned={pinScenarios}\n rowsGroup={rowGroup}\n />\n );\n};\n","import React, { forwardRef, PropsWithChildren } from 'react';\n\nimport styles from './TimelineContentHeaderContainer.module.scss';\n\nexport const TimelineContentHeaderContainer = forwardRef(({ children }: PropsWithChildren, ref: any) => (\n <div ref={ref} className={styles.timelineContentHeaderContainer}>\n {children}\n </div>\n));\n\nTimelineContentHeaderContainer.displayName = 'TimelineContentHeaderContainer';\n","import { useCallback } from 'react';\n\nimport { useSaveUserPreset } from 'api/user-presets/use-save-user-preset';\nimport { useVideoPlayerActions } from 'shared/components/video-player';\nimport { TimelineTimePreset } from 'shared/constants/user-presets/userPresetsClasses';\n\nimport { useSetTimelineInitialTime } from '../../../../../hooks/use-timeline-initial-time';\n\nexport const useJumpToTimeInMatch = (recordingId: string) => {\n const actions = useVideoPlayerActions();\n const { savePreset } = useSaveUserPreset();\n const setTimelineInitialTime = useSetTimelineInitialTime(recordingId);\n\n return useCallback(\n (time: number) => {\n const timePreset = new TimelineTimePreset(time, recordingId);\n savePreset({ data: timePreset });\n\n setTimelineInitialTime(time);\n actions.jumpToTimeInMatch(time);\n },\n [actions, recordingId, savePreset, setTimelineInitialTime],\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { useVideoPlayerActions } from 'shared/components/video-player';\nimport { ActionTypes } from 'shared/streams/actionTypes';\nimport { publishEvent } from 'shared/streams/eventEmitter';\nimport { MetricsNames } from 'shared/types/metrics';\n\nimport { UseTimelineEventsHandlers } from './types';\nimport {\n useAddClipsAction,\n useAddClipShiftSelection,\n useAddClipsShiftSelection,\n useAddRowClips,\n useCleanSelection,\n useClipsIdsSelection,\n useGetClip,\n useRemoveClipFromSelection,\n useReplaceMultipleClipsAction,\n useRowClips,\n useToggleClipSelection,\n useToggleCtrlClipSelection,\n useToggleClipsSelection,\n useToggleCtrlClipsSelection,\n} from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/atoms';\nimport { useSelectionPlaying, useSetSelectedPlayingRow } from '../../../../../hooks/use-selection-playing';\nimport { useTacticalAnalysisMode } from '../../../../../hooks/use-tactical-analysis-mode';\nimport { useTeamUtils } from '../../../../../hooks/use-timeline-team-id-focus';\nimport { TacticalAnalysisPlayingMode } from '../../../../../types/tactical-analysis-playing-mode';\nimport { getScenarioClips } from '../../components/row-headers-group/util';\nimport { useJumpToTimeInMatch } from '../use-jump-to-time-in-match';\n\nexport const useTimelineEventsHandlers = (recordingId: string): UseTimelineEventsHandlers => {\n const actions = useVideoPlayerActions();\n const jumpToTimeInMatch = useJumpToTimeInMatch(recordingId);\n const toggleClipSelection = useToggleClipSelection();\n const toggleCtrlClipsSelection = useToggleCtrlClipsSelection();\n const toggleCtrlClipSelection = useToggleCtrlClipSelection();\n const toggleClipsSelection = useToggleClipsSelection();\n const addClipShift = useAddClipShiftSelection();\n const addClipsShift = useAddClipsShiftSelection();\n const removeClipFromSelection = useRemoveClipFromSelection();\n const addRowClips = useAddRowClips();\n const { playSelection } = useSelectionPlaying(recordingId);\n const clipIdsSelection = useClipsIdsSelection();\n const addMultipleClips = useAddClipsAction();\n const replaceMultipleClips = useReplaceMultipleClipsAction();\n const getRowClips = useRowClips();\n const tacticalAnalysisMode = useTacticalAnalysisMode(recordingId);\n const { playAll } = useSelectionPlaying(recordingId);\n const cleanSelection = useCleanSelection();\n const setSelectedPlayingRow = useSetSelectedPlayingRow(recordingId);\n const getClip = useGetClip();\n\n const { isHomeTeam } = useTeamUtils(recordingId);\n\n const handlePlayClip = useCallback(\n (startTime: number) => {\n return jumpToTimeInMatch(startTime);\n },\n [jumpToTimeInMatch],\n );\n\n const handlePlaySelectedClips = useCallback(() => {\n if (clipIdsSelection.length <= 1 && tacticalAnalysisMode !== 'default') return;\n publishEvent({\n type: ActionTypes.PLAY_TACTICAL_ANALYSIS_SELECTED_CLIPS,\n payload: { name: MetricsNames.TACTICAL_ANALYSIS_PLAY_SELECTED_CLIPS },\n });\n\n return playSelection();\n }, [clipIdsSelection, playSelection, tacticalAnalysisMode]);\n\n const handlePlayRowCommon = useCallback(\n () =>\n publishEvent({\n type: ActionTypes.PLAY_TACTICAL_ANALYSIS_ROW,\n payload: { name: MetricsNames.TACTICAL_ANALYSIS_PLAY_ROW },\n }),\n [],\n );\n\n const handlePlayRow = useCallback(\n (rowId: string) => {\n handlePlayRowCommon();\n return playSelection({ rowId });\n },\n [handlePlayRowCommon, playSelection],\n );\n\n const handlePlayHomeTeamRow = useCallback(\n (rowId: string) => {\n handlePlayRowCommon();\n return playSelection({ rowId, team: 'home' });\n },\n [handlePlayRowCommon, playSelection],\n );\n\n const handlePlayOpponentTeamRow = useCallback(\n (rowId: string) => {\n handlePlayRowCommon();\n return playSelection({ rowId, team: 'opponent' });\n },\n [handlePlayRowCommon, playSelection],\n );\n\n const handleOpponentTeamClick = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n const rowElement: HTMLDivElement | null =\n event.target instanceof HTMLDivElement\n ? event.target.dataset.rowId\n ? event.target\n : event.target.closest('[data-row-id]')\n : null;\n\n if (event.target instanceof HTMLElement && rowElement?.dataset.rowId) {\n const opponentTeamClips = getScenarioClips(\n getRowClips(rowElement.dataset.rowId),\n (teamId) => !isHomeTeam(teamId),\n );\n\n if (event.ctrlKey || event.metaKey) {\n return addMultipleClips(opponentTeamClips.map((clip) => clip.id));\n }\n return replaceMultipleClips(opponentTeamClips.map((clip) => clip.id));\n }\n },\n [addMultipleClips, getRowClips, isHomeTeam, replaceMultipleClips],\n );\n\n const handleHomeTeamClick = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n const rowElement: HTMLDivElement | null =\n event.target instanceof HTMLDivElement\n ? event.target.dataset.rowId\n ? event.target\n : event.target.closest('[data-row-id]')\n : null;\n\n if (event.target instanceof HTMLElement && rowElement?.dataset.rowId) {\n const homeTeamClips = getScenarioClips(getRowClips(rowElement.dataset.rowId), isHomeTeam);\n\n if (event.ctrlKey || event.metaKey) {\n return addMultipleClips(homeTeamClips.map((clip) => clip.id));\n }\n replaceMultipleClips(homeTeamClips.map((clip) => clip.id));\n }\n },\n [addMultipleClips, getRowClips, isHomeTeam, replaceMultipleClips],\n );\n\n const handleSelectClip = useCallback(\n ({\n clipId,\n ctrlKey,\n shiftKey,\n metaKey,\n }: {\n clipId: string;\n ctrlKey?: boolean;\n shiftKey?: boolean;\n metaKey?: boolean;\n }) => {\n const clipWithSelection = getClip(clipId);\n\n if (clipWithSelection?.type === 'parent-clip' && clipWithSelection?.clips?.length) {\n const clipsIds = clipWithSelection.clips.map((clip) => clip.id);\n if (shiftKey) return addClipsShift(clipsIds);\n if (ctrlKey || metaKey) return toggleCtrlClipsSelection(clipsIds);\n return toggleClipsSelection(clipsIds);\n }\n\n if (shiftKey) {\n return addClipShift(clipId, tacticalAnalysisMode === TacticalAnalysisPlayingMode.selection);\n }\n\n if (ctrlKey || metaKey) {\n return toggleCtrlClipSelection(clipId);\n }\n\n return toggleClipSelection(clipId);\n },\n [\n getClip,\n toggleClipSelection,\n addClipsShift,\n toggleCtrlClipsSelection,\n toggleClipsSelection,\n addClipShift,\n tacticalAnalysisMode,\n toggleCtrlClipSelection,\n ],\n );\n\n const handleDeselectClip = useCallback(\n (clipId: string) => {\n removeClipFromSelection(clipId);\n },\n [removeClipFromSelection],\n );\n\n const handleSelect = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n const element = event.target instanceof HTMLDivElement ? (event.target as HTMLElement) : undefined;\n if (!element?.dataset.clipId) return;\n\n handleSelectClip({\n clipId: element.dataset.clipId,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n metaKey: event.metaKey,\n });\n },\n [handleSelectClip],\n );\n\n const handleDoubleClick = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n const rowElement: HTMLDivElement | null =\n event.target instanceof HTMLDivElement\n ? event.target.dataset.rowId\n ? event.target\n : event.target.closest('[data-row-id]')\n : null;\n\n if (event.target instanceof HTMLDivElement && event.target.dataset.clipId) {\n return handlePlayClip(Number(event.target.dataset.clipStartTime));\n }\n\n if (tacticalAnalysisMode === 'selection') return actions.restart();\n\n if (rowElement && rowElement.dataset.rowId) {\n if (rowElement.dataset.rowType === 'home-team') {\n return handlePlayHomeTeamRow(rowElement.dataset.rowId);\n }\n\n if (rowElement.dataset.rowType === 'opponent-team') {\n return handlePlayOpponentTeamRow(rowElement.dataset.rowId);\n }\n\n return handlePlayRow(rowElement.dataset.rowId);\n }\n },\n [actions, handlePlayClip, handlePlayHomeTeamRow, handlePlayOpponentTeamRow, handlePlayRow, tacticalAnalysisMode],\n );\n\n const handleSelectRowClips = useCallback(\n ({ rowId, ctrlKey }: { rowId: string; ctrlKey?: boolean }) => {\n addRowClips(rowId, !ctrlKey);\n },\n [addRowClips],\n );\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n const rowElement: HTMLDivElement | null =\n event.target instanceof HTMLDivElement\n ? event.target.dataset.rowId\n ? event.target\n : event.target.closest('[data-row-id]')\n : null;\n\n if (\n event.target instanceof HTMLDivElement &&\n (event.target.dataset.isSelected === 'true' || rowElement?.dataset.isSelected === 'true')\n ) {\n if (tacticalAnalysisMode === TacticalAnalysisPlayingMode.selection && event.target.dataset.clipId) {\n const clipId = event.target.dataset.clipId;\n const clipWithSelection = getClip(clipId);\n if (clipWithSelection?.isSelectedForPlaying) {\n handleSelectClip({ clipId, ctrlKey: event.ctrlKey, metaKey: event.metaKey, shiftKey: event.shiftKey });\n }\n }\n return;\n }\n\n if (rowElement && rowElement.dataset.rowType === 'home-team') {\n return handleHomeTeamClick(event);\n }\n\n if (rowElement && rowElement.dataset.rowType === 'opponent-team') {\n return handleOpponentTeamClick(event);\n }\n\n if (rowElement && rowElement.dataset.rowId) {\n if (event.ctrlKey || event.metaKey) {\n return addRowClips(rowElement.dataset.rowId);\n }\n\n return addRowClips(rowElement.dataset.rowId, true);\n }\n\n if (event.target instanceof HTMLDivElement && event.target.dataset.clipId) {\n return handleSelect(event);\n }\n\n if (event.target instanceof HTMLDivElement && event.target.closest('[data-timeline-element=\"ruler\"]') !== null) {\n return;\n }\n\n setSelectedPlayingRow({ rowId: '', team: undefined });\n cleanSelection();\n if (tacticalAnalysisMode === TacticalAnalysisPlayingMode.selection) {\n return playAll();\n }\n },\n [\n setSelectedPlayingRow,\n cleanSelection,\n tacticalAnalysisMode,\n getClip,\n handleSelectClip,\n handleHomeTeamClick,\n handleOpponentTeamClick,\n addRowClips,\n handleSelect,\n playAll,\n ],\n );\n\n return {\n handleClick,\n handleDoubleClick,\n handlePlayClip,\n handlePlaySelectedClips,\n handlePlayRow,\n handlePlayHomeTeamRow,\n handlePlayOpponentTeamRow,\n handleSelectClip,\n handleDeselectClip,\n handleSelectRowClips,\n handleOpponentTeamClick,\n handleHomeTeamClick,\n };\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconSelect = (props: Omit<SvgIconProps, 'children'>): JSX.Element => {\n return (\n <SvgIcon {...props}>\n <path d='M8.988 15.67l-3.953-3.953-1.318 1.318 5.271 5.271L20.282 7.011l-1.318-1.318-9.977 9.977z' />\n </SvgIcon>\n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconSelectAll = (props: Omit<SvgIconProps, 'children'>): JSX.Element => {\n return (\n <SvgIcon {...props}>\n <path\n fillRule='evenodd'\n d='M4.75 4.05h12a.7.7 0 0 1 .7.7v1h1.3v-1a2 2 0 0 0-2-2h-12a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h1v-1.3h-1a.7.7 0 0 1-.7-.7v-12a.7.7 0 0 1 .7-.7z'\n />\n <g stroke='#6f738c'>\n <rect x='5.9' y='5.9' width='14.7' height='14.7' rx='1.35' strokeWidth='1.3' fill='#fff' />\n <path d='M8.25 13.101l3.332 3.149 6.669-7' strokeWidth='1.5' fill={'transparent'} />\n </g>\n </SvgIcon>\n );\n};\n","import { MenuItem, styled } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nexport const ClipActionsMenuTitle = styled(MenuItem)(({ theme }) => ({\n color: theme.palette.secondary.main,\n fontSize: fontSizes.xSmall,\n fontWeight: theme.typography.fontWeightMedium,\n textTransform: 'uppercase',\n letterSpacing: '1.6px',\n opacity: '1 !important',\n}));\n","import { MenuItem } from '@mui/material';\nimport Menu from '@mui/material/Menu';\nimport classNames from 'classnames';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useAddManyToPlaylist } from 'api/playlist/useAddManyToPlaylist';\nimport { invalidatePlaylistsQuery } from 'api/playlist/useFetchPlaylists';\nimport IconClose from 'shared/components/icons/icon-close';\nimport IconFolder from 'shared/components/icons/icon-folder';\nimport IconPlay from 'shared/components/icons/icon-play';\nimport { IconSelect } from 'shared/components/icons/icon-select';\nimport { IconSelectAll } from 'shared/components/icons/icon-select-all';\nimport { SelectPlaylistDialog } from 'shared/components/select-playlist-dialog/SelectPlaylistDialog';\nimport { useCurrentPlaylistItem } from 'shared/components/video-player';\nimport { useMapClipsToPlaylistItems } from 'shared/hooks/use-map-clips-to-post-playlist-items/useMapClipsToPlaylistItems';\nimport { FundamentalsSelection, Playlist } from 'shared/types/index';\n\nimport styles from './ClipActions.module.scss';\nimport { ClipActionsMenuTitle } from './ClipActions.styled';\nimport {\n useCleanSelection,\n useClipsIdsSelection,\n useGetClipsList,\n} from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/atoms';\nimport { Clip } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { generateClipsWithOverlappingTime } from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/utils/generateClips';\nimport { useAddToPlaylistValidator } from '../../../../../hooks/use-add-to-playlist-validator/useAddToPlaylistValidator';\nimport { OverlappingClipsModal } from '../../../overlapping-clips-modal/OverlappingClipsModal';\nimport { UseTimelineEventsHandlers } from '../../hooks/use-timeline-events-handlers/types';\n\ntype Props = {\n clip: Clip;\n menuAnchorEl: HTMLDivElement | null;\n onClose: () => void;\n isSelected: boolean;\n recordingId: string;\n playClip: UseTimelineEventsHandlers['handlePlayClip'];\n playSelectedClips: UseTimelineEventsHandlers['handlePlaySelectedClips'];\n selectClip: UseTimelineEventsHandlers['handleSelectClip'];\n deselectClip: UseTimelineEventsHandlers['handleDeselectClip'];\n selectRow: UseTimelineEventsHandlers['handleSelectRowClips'];\n};\n\ninterface HandleSelectPlaylist {\n (playlist: Playlist | null, isMultipleClipsMode?: boolean): void;\n}\n\nexport const ClipActions = ({\n menuAnchorEl,\n clip,\n onClose,\n recordingId,\n selectClip,\n deselectClip,\n selectRow,\n playClip,\n playSelectedClips,\n isSelected,\n}: Props) => {\n const { t } = useTranslation();\n const { addManyToPlaylist } = useAddManyToPlaylist();\n const currentPlaylistItem = useCurrentPlaylistItem();\n const getClips = useGetClipsList();\n const clipIdsSelection = useClipsIdsSelection();\n const [anchorSingleClipSubmenu, setAnchorSingleClipSubmenu] = useState<HTMLElement | null>(null);\n const [anchorMultipleClipsSubmenu, setAnchorMultipleClipsSubmenu] = useState<HTMLElement | null>(null);\n const mapClipsToPlaylistItems = useMapClipsToPlaylistItems({ recordingId });\n const clearSelection = useCleanSelection();\n const {\n isValidationModalOpen,\n onModalOpen,\n onModalClose,\n checkForParentClips,\n setData,\n resetData,\n data: { clipsToSave, fundamentalsSelected, playlistId },\n } = useAddToPlaylistValidator();\n\n const areMultipleClipsSelectedWithCurrentClip = clipIdsSelection.length > 1 && clipIdsSelection.includes(clip.id);\n const selectedClipsCount = clipIdsSelection.length;\n const showPlaySelectedOption = areMultipleClipsSelectedWithCurrentClip;\n\n const handleOpenSingleClipSubmenu = useCallback((event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setAnchorSingleClipSubmenu(event.currentTarget);\n }, []);\n\n const handleOpenMultipleClipSubmenu = useCallback((event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setAnchorMultipleClipsSubmenu(event.currentTarget);\n }, []);\n\n const closeAllMenus = useCallback(() => {\n onClose();\n setAnchorMultipleClipsSubmenu(null);\n setAnchorSingleClipSubmenu(null);\n }, [onClose]);\n\n const handleClickAway = useCallback(\n (event: MouseEvent | TouchEvent) => {\n event.stopPropagation();\n closeAllMenus();\n },\n [closeAllMenus],\n );\n\n const handleClose = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n closeAllMenus();\n },\n [closeAllMenus],\n );\n\n const handleSubmit = useCallback(\n ({\n items,\n merge,\n callbackData,\n }: {\n items: Clip[];\n merge: boolean;\n callbackData?: { playlistId: string; fundamentalsSelected: FundamentalsSelection };\n }) => {\n if (!callbackData && !fundamentalsSelected) return;\n const fundamentals: FundamentalsSelection | undefined =\n callbackData?.fundamentalsSelected ?? fundamentalsSelected;\n if (!fundamentals) return;\n const playlistItems: Clip[] = merge ? generateClipsWithOverlappingTime({ clips: items }) : items;\n\n addManyToPlaylist({\n items: mapClipsToPlaylistItems({\n playlistId: callbackData?.playlistId ?? playlistId,\n items: playlistItems,\n fundamentalsSelected: fundamentals,\n }),\n options: {\n onSuccess: async () => {\n await invalidatePlaylistsQuery();\n resetData();\n },\n },\n });\n },\n [addManyToPlaylist, fundamentalsSelected, mapClipsToPlaylistItems, playlistId, resetData],\n );\n\n const handleSelectPlaylist: HandleSelectPlaylist = useCallback(\n (playlist, isMultipleClipsMode) => {\n if (playlist === null || Array.isArray(playlist)) return;\n const fundamentalsSelected: FundamentalsSelection = currentPlaylistItem.hasHomographies\n ? currentPlaylistItem.fundamentalsSelected\n : {\n tacticalAnalysisId: currentPlaylistItem.fundamentalsSelected.tacticalAnalysisId,\n fundamentalsSelected: ['all'],\n };\n const clips = clipIdsSelection.includes(clip.id) && isMultipleClipsMode ? getClips(clipIdsSelection) : [clip];\n\n setData({ clips, playlistId: playlist.id, fundamentalsSelected });\n\n return checkForParentClips({\n playlistItems: clips,\n callback: (items) => {\n handleSubmit({ items, merge: false, callbackData: { playlistId: playlist.id, fundamentalsSelected } });\n closeAllMenus();\n },\n });\n },\n [\n currentPlaylistItem.hasHomographies,\n currentPlaylistItem.fundamentalsSelected,\n clipIdsSelection,\n clip,\n getClips,\n setData,\n checkForParentClips,\n handleSubmit,\n closeAllMenus,\n ],\n );\n\n const handlePlayClip = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n playClip(clip.startTime);\n handleClose(event);\n },\n [playClip, clip.startTime, handleClose],\n );\n\n const handlePlaySelectedClips = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n playSelectedClips();\n handleClose(event);\n },\n [playSelectedClips, handleClose],\n );\n\n const handleSelectClip = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n selectClip({ clipId: clip.id, ctrlKey: event.ctrlKey, shiftKey: event.shiftKey, metaKey: event.metaKey });\n handleClose(event);\n },\n [clip.id, handleClose, selectClip],\n );\n\n const handleDeselectClip = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n deselectClip(clip.id);\n handleClose(event);\n },\n [deselectClip, clip.id, handleClose],\n );\n\n const handleClearSelection = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n clearSelection();\n handleClose(event);\n },\n [clearSelection, handleClose],\n );\n\n const handleSelectRow = useCallback(\n (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n selectRow({ rowId: clip.rowId, ctrlKey: event.ctrlKey });\n handleClose(event);\n },\n [selectRow, clip.rowId, handleClose],\n );\n\n const handleOverlappingModalSubmit = useCallback(\n (merge: boolean) => {\n handleSubmit({ items: clipsToSave, merge });\n closeAllMenus();\n },\n [closeAllMenus, handleSubmit, clipsToSave],\n );\n\n const multipleClipsMenuItems = [\n <ClipActionsMenuTitle\n key={`${clip.id}-selected-clips`}\n sx={{\n paddingTop: ({ spacing }) => spacing(2),\n borderTop: ({ palette }) => `1px solid ${palette.secondary.light}`,\n }}\n disabled\n >\n {t('timeline:clip-actions.selected-clips')}\n </ClipActionsMenuTitle>,\n <MenuItem\n key={`${clip.id}-add-all-selected-to-playlist`}\n className={styles.menuItem}\n onClick={handleOpenMultipleClipSubmenu}\n >\n <IconFolder color='secondary' size='small' />\n {t('timeline:actions.add-all-selected-to-playlist', { selectedClipsCount })}\n </MenuItem>,\n showPlaySelectedOption ? (\n <MenuItem key={`${clip.id}-play-all-selected`} className={styles.menuItem} onClick={handlePlaySelectedClips}>\n <IconPlay color='secondary' size='small' />\n {t('timeline:actions.play-all-selected', { selectedClipsCount })}\n </MenuItem>\n ) : null,\n <MenuItem key={`${clip.id}-deselect-all-clips`} className={styles.menuItem} onClick={handleClearSelection}>\n <IconClose color='secondary' size='small' /> {t('timeline:actions.deselect-all-clips', { selectedClipsCount })}\n </MenuItem>,\n ];\n\n const multipleClipsMenuItemsList = multipleClipsMenuItems.map((item) => item);\n\n return (\n <>\n <Menu\n open\n anchorEl={menuAnchorEl}\n onClose={handleClickAway}\n anchorOrigin={{\n vertical: 'center',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'center',\n horizontal: 'left',\n }}\n onClick={(event) => event.stopPropagation()}\n data-element-type='clip-actions-menu'\n >\n <ClipActionsMenuTitle disabled>{t('timeline:clip-actions.single-clip')}</ClipActionsMenuTitle>\n <MenuItem className={styles.menuItem} onClick={handleOpenSingleClipSubmenu}>\n <IconFolder color='secondary' size='small' /> {t('timeline:actions.add-to-playlist')}\n </MenuItem>\n <MenuItem className={styles.menuItem} onClick={handlePlayClip}>\n <IconPlay color='secondary' size='small' /> {t('timeline:actions.play-clip')}\n </MenuItem>\n {!isSelected ? (\n <MenuItem className={styles.menuItem} onClick={handleSelectClip}>\n <IconSelect color='secondary' size='small' /> {t('timeline:actions.select-clip')}\n </MenuItem>\n ) : null}\n {isSelected ? (\n <MenuItem className={styles.menuItem} onClick={handleDeselectClip}>\n <IconClose color='secondary' size='small' /> {t('timeline:actions.deselect-clip')}\n </MenuItem>\n ) : null}\n {areMultipleClipsSelectedWithCurrentClip ? multipleClipsMenuItemsList : null}\n {clip.type !== 'episode' ? (\n <MenuItem\n className={classNames(styles.menuItem)}\n sx={{\n borderTop: ({ palette }) => `1px solid ${palette.secondary.light}`,\n }}\n onClick={handleSelectRow}\n >\n <IconSelectAll color='secondary' size='small' />\n {t('timeline:actions.select-clips-in-row')}\n </MenuItem>\n ) : null}\n </Menu>\n {anchorSingleClipSubmenu ? (\n <SelectPlaylistDialog\n anchorEl={anchorSingleClipSubmenu}\n onClose={handleClose}\n onClickItem={(playlist) => handleSelectPlaylist(playlist)}\n />\n ) : null}\n {anchorMultipleClipsSubmenu ? (\n <SelectPlaylistDialog\n anchorEl={anchorMultipleClipsSubmenu}\n onClose={handleClose}\n onClickItem={(playlist) => handleSelectPlaylist(playlist, true)}\n />\n ) : null}\n <OverlappingClipsModal\n isOpen={isValidationModalOpen}\n onClose={onModalClose}\n onOpen={onModalOpen}\n onSubmit={handleOverlappingModalSubmit}\n />\n </>\n );\n};\n","import { IconButton, MenuItem, Popover } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconClose from 'shared/components/icons/icon-close';\nimport IconPlay from 'shared/components/icons/icon-play';\n\nimport styles from './RowActions.module.scss';\n\ntype Props = {\n rowId: string;\n menuAnchorEl: HTMLDivElement | null;\n onClose: () => void;\n playRow: (rowId: string) => void;\n playHomeTeamRow: (rowId: string) => void;\n playOpponentTeamRow: (rowId: string) => void;\n};\n\nexport const RowActions = ({ menuAnchorEl, rowId, onClose, playRow, playOpponentTeamRow, playHomeTeamRow }: Props) => {\n const { t } = useTranslation();\n\n const closeAllMenus = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const handleClickAway = useCallback(\n (event: MouseEvent | TouchEvent) => {\n event.stopPropagation();\n closeAllMenus();\n },\n [closeAllMenus],\n );\n\n const handleClose = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n closeAllMenus();\n },\n [closeAllMenus],\n );\n\n const handlePlay = useCallback(() => {\n if (menuAnchorEl?.dataset.rowType === 'home-team') {\n playHomeTeamRow(rowId);\n } else if (menuAnchorEl?.dataset.rowType === 'opponent-team') {\n playOpponentTeamRow(rowId);\n } else {\n playRow(rowId);\n }\n closeAllMenus();\n }, [closeAllMenus, menuAnchorEl?.dataset.rowType, playHomeTeamRow, playOpponentTeamRow, playRow, rowId]);\n\n return (\n <>\n <Popover\n open\n className={styles.popOver}\n anchorEl={menuAnchorEl}\n onClose={handleClickAway}\n anchorOrigin={{\n vertical: 'center',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'center',\n horizontal: 'left',\n }}\n >\n <div className={styles.modalMenu} onClick={(event) => event.stopPropagation()}>\n <IconButton\n size='small'\n sx={{\n position: 'absolute',\n top: ({ spacing }) => spacing(1),\n right: ({ spacing }) => spacing(1),\n padding: 0,\n }}\n onClick={handleClose}\n >\n <IconClose size='small' color='secondary' />\n </IconButton>\n <MenuItem className={styles.menuItem} onClick={() => handlePlay()}>\n <IconPlay color='secondary' size='small' /> {t('timeline:actions.play-clip')}\n </MenuItem>\n </div>\n </Popover>\n </>\n );\n};\n","import classNames from 'classnames';\nimport React, { forwardRef, PropsWithChildren, useCallback, useMemo, useState } from 'react';\n\nimport {\n ClipWithSelection,\n useGetClip,\n} from '../../../../../api/use-tactical-analysis-data/generate-timeline-rows/atoms';\nimport { useTacticalAnalysisMode } from '../../../../../hooks/use-tactical-analysis-mode';\nimport { useTimelineConfigs } from '../../../../../hooks/useTimelineConfigs';\nimport { TacticalAnalysisPlayingMode } from '../../../../../types/tactical-analysis-playing-mode';\nimport { useTimelineEventsHandlers } from '../../hooks/use-timeline-events-handlers';\nimport styles from '../../TimelineTable.module.scss';\nimport { ClipActions } from '../clip-actions';\nimport { RowActions } from '../row-actions';\n\nexport const TimelineTableWrapper = forwardRef(\n (\n {\n children,\n recordingId,\n ...rest\n }: PropsWithChildren<\n React.HTMLAttributes<HTMLDivElement> & {\n recordingId: string;\n }\n >,\n ref: any,\n ) => {\n const config = useTimelineConfigs(recordingId);\n const getClip = useGetClip();\n const tacticalAnalysisMode = useTacticalAnalysisMode(recordingId);\n\n const [clipAnchorEl, setClipAnchorEl] = useState<null | HTMLDivElement>(null);\n const [contextMenuClip, setContextMenuClip] = useState<ClipWithSelection | undefined>(undefined);\n\n const [rowAnchorEl, setRowAnchorEl] = useState<null | HTMLDivElement>(null);\n const [contextMenuRow, setContextMenuRow] = useState<string | undefined>(undefined);\n\n const [clickTimeout, setClickTimeout] = useState<NodeJS.Timeout | null>(null);\n\n const {\n handleClick,\n handleDoubleClick,\n handlePlayClip,\n handlePlayRow,\n handleSelectClip,\n handlePlaySelectedClips,\n handleDeselectClip,\n handleSelectRowClips,\n handlePlayHomeTeamRow,\n handlePlayOpponentTeamRow,\n } = useTimelineEventsHandlers(recordingId);\n\n const handleTimelineClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const element = event.target instanceof HTMLDivElement ? (event.target as HTMLElement) : undefined;\n\n if (clickTimeout !== null && !event.shiftKey && !event.ctrlKey && !event.metaKey) {\n // A single click has happened recently, let's handle double click\n clearTimeout(clickTimeout);\n setClickTimeout(null);\n } else {\n const timeoutTime = element && (element.dataset.clipId || element.parentElement?.dataset.rowId) ? 300 : 0;\n // This might be the first click of a double click, or a single click. Let's wait a bit to see.\n const timeoutId = setTimeout(() => {\n handleClick(event);\n setClickTimeout(null);\n }, timeoutTime);\n setClickTimeout(timeoutId);\n }\n },\n [clickTimeout, handleClick],\n );\n\n const handleContextMenu = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n event.preventDefault();\n event.stopPropagation();\n if (event.target instanceof HTMLDivElement && event.target.dataset.isDisabled === 'true') return;\n\n if (event.target instanceof HTMLDivElement && event.target.dataset.clipId) {\n setClipAnchorEl(event.target);\n setContextMenuClip(getClip(event.target.dataset.clipId));\n }\n\n const rowElement: HTMLDivElement | null =\n event.target instanceof HTMLDivElement\n ? event.target.dataset.rowId\n ? event.target\n : event.target.closest('[data-row-id]')\n : null;\n\n if (tacticalAnalysisMode === TacticalAnalysisPlayingMode.selection) return;\n if (rowElement && rowElement?.dataset.rowId) {\n setRowAnchorEl(rowElement);\n setContextMenuRow(rowElement.dataset.rowId);\n }\n },\n [getClip, tacticalAnalysisMode],\n );\n\n const handleClose = useCallback(() => {\n setClipAnchorEl(null);\n }, []);\n\n const handleRowClose = useCallback(() => {\n setRowAnchorEl(null);\n }, []);\n\n const className = useMemo(() => {\n const showHomeTeamBallPossession =\n (config.isHomeTeamSelected && config.showBallPossession) ||\n (config.isOpponentTeamSelected && config.showNoBallPossession);\n const showOpponentTeamBallPossession =\n (config.isHomeTeamSelected && config.showNoBallPossession) ||\n (config.isOpponentTeamSelected && config.showBallPossession);\n\n return classNames(styles.timelineTableContentWrapper, {\n [styles.isPlayingSelection]: config.tacticalAnalysisMode === 'selection',\n [styles.hideHomeTeamBallPossession]: !showHomeTeamBallPossession,\n [styles.hideOpponentTeamBallPossession]: !showOpponentTeamBallPossession,\n [styles.hideHomeTeamTacticRows]: config.isOpponentTeamSelected,\n [styles.hideOpponentTeamTacticRows]: config.isHomeTeamSelected,\n [styles.showHomeTeamTactics]: config.isHomeTeamSelected,\n [styles.opponentHomeTeamTactics]: config.isOpponentTeamSelected,\n });\n }, [config]);\n\n return (\n <>\n <div\n {...rest}\n onClick={handleTimelineClick}\n onDoubleClick={handleDoubleClick}\n onContextMenu={handleContextMenu}\n ref={ref}\n className={className}\n >\n {children}\n </div>\n {Boolean(clipAnchorEl) && contextMenuClip ? (\n <ClipActions\n clip={contextMenuClip}\n deselectClip={handleDeselectClip}\n isSelected={contextMenuClip.isSelected}\n menuAnchorEl={clipAnchorEl}\n onClose={handleClose}\n playSelectedClips={handlePlaySelectedClips}\n playClip={handlePlayClip}\n recordingId={recordingId}\n selectClip={handleSelectClip}\n selectRow={handleSelectRowClips}\n />\n ) : null}\n {Boolean(rowAnchorEl) && contextMenuRow ? (\n <RowActions\n rowId={contextMenuRow}\n menuAnchorEl={rowAnchorEl}\n onClose={handleRowClose}\n playRow={handlePlayRow}\n playHomeTeamRow={handlePlayHomeTeamRow}\n playOpponentTeamRow={handlePlayOpponentTeamRow}\n />\n ) : null}\n </>\n );\n },\n);\n\nTimelineTableWrapper.displayName = 'TimelineTableWrapper';\n","import { useRecoilValue, useSetRecoilState } from 'recoil';\n\nimport { timelineMatchAtoms } from '../../atoms';\n\nexport const useSetIsTimelineReadyToRender = (recordingId: string) => {\n return useSetRecoilState(timelineMatchAtoms.isTimelineReadyToRender(recordingId));\n};\n\nexport const useIsTimelineReadyToRender = (recordingId: string) => {\n return useRecoilValue(timelineMatchAtoms.isTimelineReadyToRender(recordingId));\n};\n","import { Episode } from 'shared/types';\nimport { MatchSegmentTypes } from 'shared/types/segment/types';\nimport { ZoomLevelsType } from 'shared/types/zoom-range/zoomLevels';\n\nimport { adjustTimeSpaceByZoomLevel } from '../../components/tactical-analysis/utils/adjust-time-by-zoom-level';\nimport { TIMELINE_CONFIG } from '../../components/timeline/config';\nimport {\n SEPARATOR_DOUBLE_WIDTH,\n SEPARATOR_WIDTH,\n} from '../../components/timeline/timeline-table/components/timeline-css-variables';\n\nconst findPlayHeadPositionWithEpisodes = (time: number, episodes: Episode[], zoomLevel: ZoomLevelsType) => {\n let episodeLeftTime = 0;\n\n for (let episodeNumber = 0; episodeNumber < episodes.length; episodeNumber++) {\n const currentEpisode = episodes[episodeNumber];\n\n if (time >= currentEpisode.startTime && time <= currentEpisode.endTime) {\n episodeLeftTime += adjustTimeSpaceByZoomLevel(time - currentEpisode.startTime, zoomLevel);\n break;\n }\n\n const nextEpisode = episodes[episodeNumber + 1];\n\n const isHalfTime =\n nextEpisode &&\n nextEpisode.matchSegment === MatchSegmentTypes.SECOND &&\n currentEpisode.matchSegment === MatchSegmentTypes.FIRST;\n\n const separatorWidth = isHalfTime ? SEPARATOR_DOUBLE_WIDTH : SEPARATOR_WIDTH;\n\n episodeLeftTime +=\n adjustTimeSpaceByZoomLevel(currentEpisode.endTime - currentEpisode.startTime, zoomLevel) +\n (nextEpisode ? separatorWidth : 0);\n }\n\n return episodeLeftTime;\n};\n\nexport const getPlayHeadPositionByTime = (\n time: number,\n isPositionByEpisode: boolean,\n episodes: Episode[],\n zoomLevel: ZoomLevelsType,\n) => {\n if (isPositionByEpisode) {\n return (\n findPlayHeadPositionWithEpisodes(time, episodes, zoomLevel) + TIMELINE_CONFIG.LIMIT_SPACING + SEPARATOR_WIDTH\n );\n }\n\n return adjustTimeSpaceByZoomLevel(time, zoomLevel) + TIMELINE_CONFIG.LIMIT_SPACING;\n};\n","import { RefObject, useCallback, useEffect } from 'react';\n\ninterface Props {\n recordingId: string;\n visibleContentRef: RefObject<HTMLDivElement>;\n headerRef: RefObject<HTMLDivElement>;\n}\n\nexport const getCenterToPlayHeadLeftPosition = (playHeadPosition: number, clientWidth: number) => {\n const centeredPosition = playHeadPosition - clientWidth / 2;\n if (centeredPosition < 0) return 0;\n\n return centeredPosition;\n};\n\nexport const useSyncRowContent = ({ visibleContentRef, headerRef }: Props) => {\n // Synchronize scroll position of timeline with scroll controller\n const handleSyncScroll = useCallback(() => {\n if (!visibleContentRef.current || !headerRef.current) return;\n\n headerRef.current.scrollTop = visibleContentRef.current.scrollTop;\n }, [headerRef, visibleContentRef]);\n\n const handleWheelScroll = useCallback(\n (event: WheelEvent) => {\n if (!visibleContentRef.current || !headerRef.current) return;\n const visibleContent = visibleContentRef.current;\n const header = headerRef.current;\n\n const maxVisibleContentScroll = visibleContent.scrollHeight - visibleContent.offsetHeight;\n\n visibleContent.scrollTop =\n maxVisibleContentScroll < visibleContent.scrollTop + event.deltaY && event.deltaY < 0\n ? maxVisibleContentScroll\n : visibleContent.scrollTop + event.deltaY;\n\n header.scrollTop = visibleContent.scrollTop;\n },\n [visibleContentRef, headerRef],\n );\n\n useEffect(() => {\n if (!visibleContentRef.current || !headerRef.current) return;\n const visibleContent = visibleContentRef.current;\n const header = headerRef.current;\n\n visibleContent.addEventListener('scroll', handleSyncScroll);\n header.addEventListener('wheel', handleWheelScroll);\n return () => {\n visibleContent.removeEventListener('scroll', handleSyncScroll);\n header.removeEventListener('wheel', handleWheelScroll);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [headerRef.current, visibleContentRef.current, handleSyncScroll]);\n\n // Add event listeners for resizing and scrolling\n useEffect(() => {\n if (!visibleContentRef.current || !visibleContentRef.current) return;\n\n const container = visibleContentRef.current;\n\n container.addEventListener('scroll', handleSyncScroll);\n\n // Clean up function\n return () => {\n container.removeEventListener('scroll', handleSyncScroll);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [handleSyncScroll, visibleContentRef.current]);\n\n return null;\n};\n","import { RefObject, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport {\n useDuration,\n useNonReactiveCurrentTime,\n useVideoPlayerPlayingMode,\n} from 'shared/components/video-player/hooks';\n\nimport { useSetIsTimelineReadyToRender } from '../../../../../hooks/use-is-timeline-ready-to-render';\nimport { useTacticalAnalysisEpisodes } from '../../../../../hooks/use-tactical-analysis-episodes';\nimport { useTimelineInitialTime } from '../../../../../hooks/use-timeline-initial-time';\nimport { useTimelineZoomLevel } from '../../../../../hooks/use-timeline-zoom-level';\nimport { getPlayHeadPositionByTime } from '../../../../../utils/get-play-head-position-by-time';\nimport { useTimelineInnerWidth } from '../use-generate-timeline-width';\nimport { getCenterToPlayHeadLeftPosition } from '../use-sync-row-content';\n\ntype Options = {\n recordingId: string;\n visibleContentRef: RefObject<HTMLDivElement>;\n headerContentRef: RefObject<HTMLDivElement>;\n};\n\nexport type PlayHeadPositioningActions = {\n center: () => void;\n};\n\nexport const usePlayHeadPositionInTimeline = ({\n recordingId,\n visibleContentRef,\n headerContentRef,\n}: Options): PlayHeadPositioningActions => {\n const duration = useDuration();\n const [isFirstLoad, setIsFirstLoad] = useState(true);\n const timelineInnerWidth = useTimelineInnerWidth(recordingId);\n const setIsTimelineReadyToRender = useSetIsTimelineReadyToRender(recordingId);\n const timelineInitialTime = useTimelineInitialTime(recordingId);\n const { zoomLevel } = useTimelineZoomLevel();\n const episodes = useTacticalAnalysisEpisodes(recordingId);\n const nonReactiveCurrentTime = useNonReactiveCurrentTime();\n const { useEffectiveTime: effectiveTime } = useVideoPlayerPlayingMode();\n\n const handleCenterPlayHead = useCallback(() => {\n if (!visibleContentRef.current || !headerContentRef.current || timelineInnerWidth === 0) {\n return;\n }\n\n const time = isFirstLoad && timelineInitialTime >= 0 ? timelineInitialTime : nonReactiveCurrentTime.time;\n if (time === 0) return (visibleContentRef.current.scrollLeft = 0);\n\n const scrollLeft = getCenterToPlayHeadLeftPosition(\n getPlayHeadPositionByTime(time, effectiveTime, episodes, zoomLevel),\n visibleContentRef.current.offsetWidth,\n );\n\n const maxScroll = visibleContentRef.current.scrollWidth - visibleContentRef.current.offsetWidth;\n\n visibleContentRef.current.scrollLeft = scrollLeft > maxScroll ? maxScroll : scrollLeft;\n }, [\n timelineInnerWidth,\n headerContentRef,\n timelineInitialTime,\n nonReactiveCurrentTime,\n visibleContentRef,\n effectiveTime,\n episodes,\n zoomLevel,\n isFirstLoad,\n ]);\n\n useEffect(() => {\n if (duration === 0) return;\n if (timelineInnerWidth === 0) return;\n if (isFirstLoad) setIsFirstLoad(false);\n\n handleCenterPlayHead();\n setIsTimelineReadyToRender(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [duration, timelineInnerWidth]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.altKey && (event.code === 'KeyC' || event.code === 'keyc')) {\n event.preventDefault();\n event.stopPropagation();\n handleCenterPlayHead();\n }\n },\n [handleCenterPlayHead],\n );\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown]);\n\n return useMemo(\n () => ({\n center: handleCenterPlayHead,\n }),\n [handleCenterPlayHead],\n );\n};\n","import { RefObject, useCallback, useEffect } from 'react';\n\ninterface Props {\n masterDiv: RefObject<HTMLDivElement>;\n syncDiv: RefObject<HTMLDivElement>;\n}\n\nexport const useSyncHeight = ({ masterDiv, syncDiv }: Props) => {\n const handleUpdateSize = useCallback(\n (element: HTMLDivElement) => {\n const { height } = element.getBoundingClientRect();\n syncDiv.current!.style.minHeight = `${height}px`;\n },\n [syncDiv],\n );\n\n const handleContainerResize = useCallback(() => {\n masterDiv.current && handleUpdateSize(masterDiv.current);\n }, [handleUpdateSize, masterDiv]);\n\n useEffect(() => {\n if (masterDiv?.current !== null) {\n window.addEventListener('resize', handleContainerResize);\n\n const observer = new ResizeObserver(() => {\n handleContainerResize();\n });\n\n const containerElement: HTMLElement = masterDiv.current;\n observer.observe(containerElement);\n\n return () => {\n window.removeEventListener('resize', handleContainerResize);\n observer.unobserve(containerElement);\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [masterDiv]);\n\n return null;\n};\n","import { RefObject, useEffect } from 'react';\n\nimport { useTimelineZoomLevel } from '../use-timeline-zoom-level';\n\nexport const useTimelineWheelZoom = (scrollableContentRef: RefObject<HTMLDivElement>) => {\n const { lessZoomLevel, moreZoomLevel } = useTimelineZoomLevel();\n\n useEffect(() => {\n if (!scrollableContentRef.current) return;\n const content = scrollableContentRef.current;\n\n const handleWheel = (e: WheelEvent) => {\n if (!e.ctrlKey) return;\n\n e.deltaY > 0 ? lessZoomLevel() : moreZoomLevel();\n e.preventDefault();\n e.stopPropagation();\n };\n\n content.addEventListener('wheel', handleWheel);\n return () => {\n content.removeEventListener('wheel', handleWheel);\n };\n }, [scrollableContentRef, lessZoomLevel, moreZoomLevel]);\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nimport { CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME } from '../timeline-table/components/timeline-css-variables';\n\nexport const SeparatorContainer = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isHalfTime' && prop !== 'isHidden',\n})<{ isHalfTime: boolean; isHidden: boolean }>(({ theme, isHalfTime, isHidden }) => ({\n height: '100%',\n padding: theme.spacing(0, 0.25),\n background: theme.palette.common.white,\n overflow: 'hidden',\n\n ...(isHalfTime && {\n minWidth: `var(${CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME})`,\n maxWidth: `var(${CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME})`,\n }),\n\n ...(isHidden && {\n visibility: 'hidden',\n }),\n}));\n\nexport const SeparatorContent = styled(Box)(({ theme }) => ({\n height: '100%',\n paddingTop: theme.spacing(1),\n paddingLeft: theme.spacing(1),\n color: theme.palette.text.secondary,\n textShadow: `1px 1px 1px ${theme.palette.common.white}`,\n // TODO add color to theme\n backgroundImage: `linear-gradient(135deg, ${theme.palette.common.white} 5.56%, ${Colors.athens} 5.56%, ${Colors.athens} 50%, ${theme.palette.common.white} 50%, ${theme.palette.common.white} 55.56%, ${Colors.athens} 55.56%, ${Colors.athens} 100%)`,\n backgroundSize: '12.73px 12.73px',\n // TODO add to theme\n fontSize: fontSizes.small,\n lineHeight: 1.67,\n fontWeight: theme.typography.fontWeightMedium,\n}));\n\nexport const EffectiveTimeSeparatorsWrapper = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: 0,\n left: 0,\n display: 'flex',\n width: '100%',\n height: '100%',\n padding: theme.spacing(0, 3),\n userSelect: 'none',\n}));\n","import { Box } from '@mui/material';\nimport React, { useMemo } from 'react';\n\nimport { useVideoPlayerPlayingMode } from 'shared/components/video-player';\n\nimport { EffectiveTimeSeparatorsWrapper, SeparatorContainer, SeparatorContent } from './EffectiveTimeSeparator.styled';\nimport { Clip } from '../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { CSS_CLIP_ZOOM_WIDTH } from '../timeline-table/components/timeline-css-variables';\n\ntype Props = {\n episodesClips: Clip[];\n};\n\nconst Separator = ({ clip, isHidden }: { clip: Clip; isHidden: boolean }) => {\n return (\n <SeparatorContainer key={clip.id} isHalfTime={Boolean(clip.title)} isHidden={isHidden}>\n <SeparatorContent key={clip.id}>{clip.title}</SeparatorContent>\n </SeparatorContainer>\n );\n};\n\nconst EmptySeparator = ({ clip }: { clip: Clip }) => {\n const emptyStyle = useMemo(\n () => ({ width: `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.endTime - clip.startTime})` }),\n [clip],\n );\n\n return <Box key={clip.id} sx={{ height: 0, background: 'transparent' }} style={emptyStyle} />;\n};\n\nexport const EffectiveTimeSeparators = React.memo(({ episodesClips }: Props) => {\n const { useEffectiveTime: effectiveTime } = useVideoPlayerPlayingMode();\n\n return effectiveTime ? (\n <EffectiveTimeSeparatorsWrapper>\n {episodesClips.map((clip, idx) =>\n clip.type === 'not-effective-time' ? (\n <Separator key={clip.id} clip={clip} isHidden={idx === 0} />\n ) : (\n <EmptySeparator key={clip.id} clip={clip} />\n ),\n )}\n </EffectiveTimeSeparatorsWrapper>\n ) : null;\n});\n\nEffectiveTimeSeparators.displayName = 'EffectiveTimeSeparators';\n","import { styled, Box } from '@mui/material';\n\nimport {\n CSS_EFFECTIVE_TIME_SEPARATOR,\n CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME,\n} from '../timeline-table/components/timeline-css-variables';\n\nexport const ColumnEmptyContainer = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isHalfTime',\n})<{ isHalfTime: boolean }>(({ isHalfTime }) => ({\n overflow: 'hidden',\n padding: 0,\n height: '100%',\n minWidth: `var(${CSS_EFFECTIVE_TIME_SEPARATOR})`,\n maxWidth: `var(${CSS_EFFECTIVE_TIME_SEPARATOR})`,\n background: 'transparent',\n\n ...(isHalfTime && {\n minWidth: `var(${CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME})`,\n maxWidth: `var(${CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME})`,\n }),\n}));\n\nexport const FilterHighlightsWrapper = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: 0,\n left: 0,\n display: 'flex',\n width: '100%',\n height: '100%',\n padding: theme.spacing(0, 3),\n userSelect: 'none',\n}));\n","import { Box } from '@mui/material';\nimport { CSSProperties, useMemo } from 'react';\n\nimport { useVideoPlayerPlayingMode } from 'shared/components/video-player';\n\nimport { ColumnEmptyContainer, FilterHighlightsWrapper } from './FilterHighlights.styled';\nimport { Clip } from '../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { useTimelineTableData } from '../../../hooks/use-timeline-table-data';\nimport { hasFiltersResults } from '../../../utils/has-filters-results';\nimport { CSS_CLIP_ZOOM_WIDTH } from '../timeline-table/components/timeline-css-variables';\n\ntype Props = {\n recordingId: string;\n};\n\n// TODO calculation of top (104px) should be dynamic\nconst ColumnHighlightContent = ({ clip, parentClip }: { clip: Clip; parentClip: Clip }) => {\n const contentStyle: CSSProperties = useMemo(\n () => ({\n top: '104px',\n height: 'calc(100% - 104px)',\n left: `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.startTime - parentClip.startTime})`,\n width: `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.endTime - clip.startTime})`,\n }),\n [clip, parentClip],\n );\n\n return <Box position='absolute' bgcolor='secondary.light' sx={{ opacity: '0.3' }} style={contentStyle} />;\n};\n\nconst ColumnHighlight = ({ clip }: { clip: Clip }) => {\n const clipStyle: CSSProperties = useMemo(\n () => ({\n width: `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.endTime - clip.startTime})`,\n }),\n [clip],\n );\n\n return (\n <Box\n id={'filter-highlight-' + clip.id}\n key={clip.id}\n sx={{ position: 'relative', height: '100%' }}\n style={clipStyle}\n >\n {clip.clips?.map((filterClip) => (\n <ColumnHighlightContent clip={filterClip} parentClip={clip} key={filterClip.id} />\n ))}\n </Box>\n );\n};\n\nconst ColumnEmpty = ({ clip, isEffectiveTime }: { clip: Clip; isEffectiveTime: boolean }) => {\n const clipStyle: CSSProperties = useMemo(\n () => ({\n width: !isEffectiveTime ? `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.endTime - clip.startTime})` : 'auto',\n background: 'transparent',\n }),\n [clip, isEffectiveTime],\n );\n\n return <ColumnEmptyContainer key={clip.id} style={clipStyle} isHalfTime={Boolean(clip.title)} />;\n};\n\nexport const FilterHighlights = ({ recordingId }: Props) => {\n const { useEffectiveTime } = useVideoPlayerPlayingMode();\n const timelineTableData = useTimelineTableData(recordingId);\n\n if (!timelineTableData.filtersRow || !hasFiltersResults(timelineTableData.filtersRow)) return null;\n\n return (\n <FilterHighlightsWrapper>\n {timelineTableData.filtersRow.clips.map((clip) =>\n clip.type === 'not-effective-time' ? (\n <ColumnEmpty key={clip.id} clip={clip} isEffectiveTime={useEffectiveTime} />\n ) : (\n <ColumnHighlight key={clip.id} clip={clip} />\n ),\n )}\n </FilterHighlightsWrapper>\n );\n};\n","import { atomFamily, useRecoilValue, useSetRecoilState } from 'recoil';\n\nexport const playHeadShadowTime = atomFamily<number, string>({\n key: 'play-head-shadow-time',\n default: 0,\n});\n\nexport const playHeadShadowVisibility = atomFamily<boolean, string>({\n key: 'play-head-shadow-visibility',\n default: false,\n});\n\nexport const usePlayHeadShadowTime = (recordingId: string) => {\n return useRecoilValue(playHeadShadowTime(recordingId));\n};\n\nexport const useSetPlayHeadShadowTime = (recordingId: string) => {\n return useSetRecoilState(playHeadShadowTime(recordingId));\n};\n\nexport const usePlayHeadShadowVisibility = (recordingId: string) => {\n return useRecoilValue(playHeadShadowVisibility(recordingId));\n};\n\nexport const useSetPlayHeadShadowVisibility = (recordingId: string) => {\n return useSetRecoilState(playHeadShadowVisibility(recordingId));\n};\n","import { styled, Box, alpha } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nconst ARROW_SIZE = '10px';\nconst TIMER_WIDTH = '50px';\n\nexport const PlayHeadContent = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isShadow',\n})<{ isShadow?: boolean }>(({ theme, isShadow }) => ({\n position: 'absolute',\n top: 0,\n left: 0,\n height: '100%',\n opacity: 0,\n transition: 'opacity 0.1s ease-out',\n userSelect: 'none',\n\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: '50%',\n width: '1px',\n height: '100%',\n background: theme.palette.warning.main,\n\n ...(isShadow && {\n background: alpha(theme.palette.secondary.light, 0.9),\n }),\n },\n}));\n\nexport const PlayHeadArrowDown = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isShadow',\n})<{ isShadow?: boolean }>(({ theme, isShadow }) => ({\n position: 'absolute',\n top: 0,\n left: `-${ARROW_SIZE}`,\n zIndex: 1,\n width: 0,\n height: 0,\n borderLeft: `${ARROW_SIZE} solid transparent`,\n borderRight: `${ARROW_SIZE} solid transparent`,\n borderTop: `${ARROW_SIZE} solid ${theme.palette.warning.main}`,\n\n ...(isShadow && {\n borderTopColor: alpha(theme.palette.secondary.light, 0.9),\n }),\n}));\n\nexport const PlayHeadTime = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'isShadow',\n})<{ isShadow?: boolean }>(({ theme, isShadow }) => ({\n position: 'absolute',\n top: ARROW_SIZE,\n left: `calc(-${TIMER_WIDTH} / 2)`,\n zIndex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: TIMER_WIDTH,\n height: '16px',\n paddingLeft: theme.spacing(0.5),\n paddingRight: theme.spacing(0.5),\n fontSize: fontSizes.xxSmall,\n lineHeight: 1,\n background: theme.palette.warning.main,\n borderRadius: '4px',\n\n ...(isShadow && {\n background: alpha(theme.palette.secondary.light, 0.9),\n }),\n}));\n\nexport const PlayHeadHeader = styled(Box)({\n position: 'relative',\n userSelect: 'none',\n});\n","import { useEffect, useRef } from 'react';\n\nimport { useVideoPlayerPlayingMode } from 'shared/components/video-player';\n\nimport { usePlayHeadShadowTime, usePlayHeadShadowVisibility } from './atoms';\nimport { useTacticalAnalysisEpisodes } from '../../../../hooks/use-tactical-analysis-episodes';\nimport { useTacticalAnalysisMatchSegments } from '../../../../hooks/use-tactical-analysis-match-segments';\nimport { useTimelineZoomLevel } from '../../../../hooks/use-timeline-zoom-level';\nimport { formattedTime } from '../../../../utils/formatted-time';\nimport { getPlayHeadPositionByTime } from '../../../../utils/get-play-head-position-by-time';\nimport { PlayHeadArrowDown, PlayHeadContent, PlayHeadTime, PlayHeadHeader } from '../PlayHead.styled';\n\ntype Props = {\n recordingId: string;\n};\n\nexport const PlayHeadShadow = ({ recordingId }: Props) => {\n const matchSegments = useTacticalAnalysisMatchSegments(recordingId);\n const playHeadShadowContentDiv = useRef<HTMLDivElement>(null);\n const playHeadShadowVisibility = usePlayHeadShadowVisibility(recordingId);\n const shadowTime = usePlayHeadShadowTime(recordingId);\n const episodes = useTacticalAnalysisEpisodes(recordingId);\n const { zoomLevel } = useTimelineZoomLevel();\n const { useEffectiveTime: effectiveTime } = useVideoPlayerPlayingMode();\n\n useEffect(() => {\n const leftPosition = getPlayHeadPositionByTime(shadowTime, effectiveTime, episodes, zoomLevel);\n\n requestAnimationFrame(() => {\n if (!playHeadShadowContentDiv.current) return;\n\n playHeadShadowContentDiv.current.style.transform = `translateX(${leftPosition}px)`;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shadowTime]);\n\n return (\n <PlayHeadContent style={{ opacity: playHeadShadowVisibility ? 1 : 0 }} isShadow ref={playHeadShadowContentDiv}>\n <PlayHeadHeader>\n <PlayHeadArrowDown isShadow />\n <PlayHeadTime isShadow>{formattedTime(shadowTime, matchSegments)}</PlayHeadTime>\n </PlayHeadHeader>\n </PlayHeadContent>\n );\n};\n","import { useEffect, useMemo, useState } from 'react';\n\nimport { useSaveUserPreset } from 'api/user-presets/use-save-user-preset';\nimport {\n useCurrentMatchTime,\n useCurrentVideoSourceTime,\n usePlayerCurrentSource,\n useVideoPlayerPlayingMode,\n} from 'shared/components/video-player/hooks';\nimport { PlayingModes } from 'shared/components/video-player/types';\nimport { TimelineTimePreset } from 'shared/constants/user-presets/userPresetsClasses';\n\nimport { useSetTimelineInitialTime, useTimelineInitialTime } from '../use-timeline-initial-time';\n\nexport const useTimelineCurrentVideoSourceTime = (recordingId: string) => {\n const playingMode = useVideoPlayerPlayingMode();\n const currentTimeMatch = useCurrentMatchTime();\n const currentSource = usePlayerCurrentSource();\n const currentTime = useCurrentVideoSourceTime();\n const [initialTime] = useState(currentTimeMatch);\n const { savePreset } = useSaveUserPreset();\n const setTimelineInitialTime = useSetTimelineInitialTime(recordingId);\n const timelineInitialTime = useTimelineInitialTime(recordingId);\n\n const shouldSaveTimePreset = useMemo(\n () =>\n Math.round(currentTimeMatch) % 10 === 0 &&\n Math.round(timelineInitialTime) !== Math.round(currentTimeMatch) &&\n Math.round(initialTime) !== Math.round(currentTimeMatch),\n [currentTimeMatch, initialTime, timelineInitialTime],\n );\n\n const time = useMemo(() => {\n if (playingMode.mode === PlayingModes.EPISODES) {\n return currentTime + (currentSource?.startTimeInMatch ?? 0);\n }\n\n return currentTime;\n }, [currentSource?.startTimeInMatch, currentTime, playingMode]);\n\n const visibleTime = useMemo(() => {\n if (playingMode.mode === PlayingModes.EPISODES) {\n return currentTime + (currentSource?.startTimeInMatch ?? 0);\n }\n\n return currentTime;\n }, [currentSource?.startTimeInMatch, currentTime, playingMode.mode]);\n\n useEffect(() => {\n if (shouldSaveTimePreset) {\n const timePreset = new TimelineTimePreset(time, recordingId);\n setTimelineInitialTime(time);\n savePreset({ data: timePreset });\n }\n }, [time, recordingId, savePreset, setTimelineInitialTime, shouldSaveTimePreset]);\n\n return { currentTime: time, visibleTime };\n};\n","import React, { useEffect, useRef } from 'react';\n\nimport { useCurrentPlaylistItem, usePlayerCurrentSource, useVideoPlayerRef } from 'shared/components/video-player';\nimport { useVideoPlayerPlayingMode } from 'shared/components/video-player/hooks';\nimport { PlayingModes } from 'shared/components/video-player/types';\nimport { Episode } from 'shared/types';\n\nimport { PlayHeadShadow } from './play-head-shadow';\nimport { PlayHeadArrowDown, PlayHeadContent, PlayHeadTime, PlayHeadHeader } from './PlayHead.styled';\nimport { useTacticalAnalysisMatchSegments } from '../../../hooks/use-tactical-analysis-match-segments';\nimport { useTimelineCurrentVideoSourceTime } from '../../../hooks/use-tactical-analysis-timeline-time';\nimport { useTimelineZoomLevel } from '../../../hooks/use-timeline-zoom-level';\nimport { formattedTime } from '../../../utils/formatted-time';\nimport { getPlayHeadPositionByTime } from '../../../utils/get-play-head-position-by-time';\nimport { PlayHeadPositioningActions } from '../timeline-table/hooks/use-play-head-position-in-timeline';\n\ninterface Props {\n recordingId: string;\n episodes: Episode[];\n visibleContentRef: React.RefObject<HTMLDivElement>;\n playHeadPositioningActions: PlayHeadPositioningActions;\n}\n\nconst isPlayHeadVisible = (scrollLeft: number, clientWidth: number, playHeadPosition: number) => {\n const playHeadPositionByWithScroll = playHeadPosition - scrollLeft;\n\n return playHeadPositionByWithScroll > 0 && playHeadPositionByWithScroll < clientWidth;\n};\n\nconst getPlayHeadThreshold = (scrollLeft: number, clientWidth: number, playHeadPosition: number) => {\n if (!isPlayHeadVisible(scrollLeft, clientWidth, playHeadPosition)) return 0;\n return clientWidth - (playHeadPosition - scrollLeft);\n};\n\nexport const PlayHead = ({ recordingId, episodes, visibleContentRef, playHeadPositioningActions }: Props) => {\n const { mode, useEffectiveTime } = useVideoPlayerPlayingMode();\n const lastPlayHeadPosition = useRef(0);\n const { zoomLevel } = useTimelineZoomLevel();\n const currentSource = usePlayerCurrentSource();\n const videoPlayerRef = useVideoPlayerRef();\n const { currentTime, visibleTime } = useTimelineCurrentVideoSourceTime(recordingId);\n const matchSegments = useTacticalAnalysisMatchSegments(recordingId);\n const playHeadContentDiv = React.useRef<HTMLDivElement>(null);\n const playlistItem = useCurrentPlaylistItem();\n\n useEffect(() => {\n if (!visibleContentRef.current || !playHeadContentDiv.current || !videoPlayerRef?.current?.ready) return;\n\n const isPositionByEpisode =\n mode === PlayingModes.EPISODES || (mode === PlayingModes.TACTICAL_CAMERA && useEffectiveTime);\n\n const leftPosition = getPlayHeadPositionByTime(currentTime, isPositionByEpisode, episodes, zoomLevel);\n\n const playHeadThreshold = getPlayHeadThreshold(\n visibleContentRef.current.scrollLeft,\n visibleContentRef.current.clientWidth,\n leftPosition,\n );\n\n if (playHeadThreshold === 0 && Math.abs(lastPlayHeadPosition.current - leftPosition) > 10) {\n playHeadPositioningActions.center();\n }\n\n lastPlayHeadPosition.current = leftPosition;\n\n requestAnimationFrame(() => {\n if (!playHeadContentDiv.current || !visibleContentRef.current) return;\n\n if (playHeadThreshold <= 120 && playHeadThreshold > 16) {\n visibleContentRef.current.scrollLeft = visibleContentRef.current.scrollLeft + 1;\n }\n\n playHeadContentDiv.current.style.opacity = '1';\n playHeadContentDiv.current.style.transform = `translateX(${leftPosition}px)`;\n });\n }, [\n videoPlayerRef,\n playlistItem.hasHomographies,\n visibleContentRef,\n matchSegments,\n lastPlayHeadPosition,\n playHeadPositioningActions,\n currentTime,\n zoomLevel,\n currentSource,\n episodes,\n mode,\n useEffectiveTime,\n ]);\n\n return (\n <>\n <PlayHeadShadow recordingId={recordingId} />\n <PlayHeadContent ref={playHeadContentDiv}>\n <PlayHeadHeader>\n <PlayHeadArrowDown />\n <PlayHeadTime>{formattedTime(visibleTime, matchSegments)}</PlayHeadTime>\n </PlayHeadHeader>\n </PlayHeadContent>\n </>\n );\n};\n","import { styled, Box } from '@mui/material';\nimport { Colors, animations, fontSizes } from 'kognia-ui';\n\nexport const Block = styled(Box)(({ theme }) => ({\n position: 'relative',\n width: 'auto',\n height: '100%',\n paddingTop: theme.spacing(1.25),\n background: Colors.athens,\n fontSize: fontSizes.xxSmall,\n animation: `${animations.fadeIn} ${theme.transitions.duration.shorter} ${theme.transitions.easing.easeOut}`,\n userSelect: 'none',\n\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n width: '1px',\n height: '10px',\n background: theme.palette.secondary.main,\n },\n\n '&:before': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: '50%',\n width: '1px',\n height: '6px',\n background: theme.palette.secondary.main,\n },\n}));\n","import { useCallback } from 'react';\n\nimport { useTacticalAnalysisEpisodes } from 'pages/tactical-analysis/hooks/use-tactical-analysis-episodes';\nimport { SegmentConfig } from 'shared/types/segment/types';\n\nimport { Block } from './TimeRulerBlockContainer.styled';\nimport { useTimelineZoomLevel } from '../../../../hooks/use-timeline-zoom-level';\nimport { formattedTime } from '../../../../utils/formatted-time';\nimport {\n adjustTimeSpaceByZoomLevel,\n getBlockSizeByZoomLevel,\n getTimeZoomLevelAdjustment,\n} from '../../../tactical-analysis/utils/adjust-time-by-zoom-level';\nimport { useSetPlayHeadShadowTime, useSetPlayHeadShadowVisibility } from '../../play-head/play-head-shadow/atoms';\nimport { CSS_CLIP_ZOOM_WIDTH } from '../../timeline-table/components/timeline-css-variables';\nimport { useJumpToTimeInMatch } from '../../timeline-table/hooks/use-jump-to-time-in-match';\n\nconst shouldRenderTime = (blockNumber: number, zoomLevel: number) => {\n return blockNumber % 2 === 0 || zoomLevel > 1;\n};\n\nconst MAX_TEXT_WIDTH = 40;\n\nexport const TimeRulerBlockContainer = ({\n startTime,\n endTime,\n recordingId,\n matchSegments,\n fullWidth,\n}: {\n startTime: number;\n endTime: number;\n recordingId: string;\n matchSegments: SegmentConfig[];\n fullWidth?: boolean;\n}) => {\n const episodes = useTacticalAnalysisEpisodes(recordingId);\n const jumpToTimeInMatch = useJumpToTimeInMatch(recordingId);\n const { zoomLevel } = useTimelineZoomLevel();\n const setPlayHeadShadowVisibility = useSetPlayHeadShadowVisibility(recordingId);\n const zoomScaleAdjustment = getTimeZoomLevelAdjustment(zoomLevel);\n const blockSizeByZoomLevel = getBlockSizeByZoomLevel(zoomLevel);\n const setPlayHeadShadowTime = useSetPlayHeadShadowTime(recordingId);\n\n const showPlayHeadShadow = useCallback(() => {\n setPlayHeadShadowVisibility(true);\n }, [setPlayHeadShadowVisibility]);\n\n const hidePlayHeadShadow = useCallback(() => {\n setPlayHeadShadowVisibility(false);\n }, [setPlayHeadShadowVisibility]);\n\n const handleMouseMove = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const { left } = event.currentTarget.getBoundingClientRect();\n const x = event.clientX - left;\n const playHeadShadowTime = x / zoomScaleAdjustment + startTime;\n const isValidTime = playHeadShadowTime >= startTime && playHeadShadowTime <= endTime;\n\n setPlayHeadShadowVisibility(isValidTime);\n isValidTime && setPlayHeadShadowTime(playHeadShadowTime);\n },\n [endTime, setPlayHeadShadowTime, setPlayHeadShadowVisibility, startTime, zoomScaleAdjustment],\n );\n\n const handleOnClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const { left } = event.currentTarget.getBoundingClientRect();\n const x = event.clientX - left;\n\n jumpToTimeInMatch(x / zoomScaleAdjustment + startTime);\n },\n [startTime, jumpToTimeInMatch, zoomScaleAdjustment],\n );\n\n const time = endTime - startTime;\n const numberOfBlocks = fullWidth\n ? Math.ceil(adjustTimeSpaceByZoomLevel(time, zoomLevel) / blockSizeByZoomLevel)\n : Math.ceil((zoomScaleAdjustment * time) / blockSizeByZoomLevel);\n const timePerBlock = blockSizeByZoomLevel / zoomScaleAdjustment;\n const containerWidth = zoomScaleAdjustment * time;\n const blockWidth = blockSizeByZoomLevel;\n\n return (\n <div\n onClick={handleOnClick}\n onMouseOver={showPlayHeadShadow}\n onMouseMove={handleMouseMove}\n onMouseOut={hidePlayHeadShadow}\n style={{\n display: 'flex',\n width: fullWidth ? '100%' : `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${time})`,\n }}\n >\n {Array(numberOfBlocks)\n .fill('')\n .map((_, index) => {\n return (\n <Block\n key={index}\n style={{\n width: `${blockWidth}px`,\n minWidth: `${blockWidth}px`,\n }}\n >\n {shouldRenderTime(index, zoomLevel) &&\n blockWidth * index + MAX_TEXT_WIDTH <\n (fullWidth ? adjustTimeSpaceByZoomLevel(time, zoomLevel) : containerWidth)\n ? formattedTime(startTime + Math.ceil(index * timePerBlock), episodes.length === 0 ? [] : matchSegments)\n : null}\n </Block>\n );\n })}\n </div>\n );\n};\n","import { Colors } from 'kognia-ui';\n\nimport { Clip } from '../../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\nimport { useTacticalAnalysisMatchSegments } from '../../../../hooks/use-tactical-analysis-match-segments';\nimport {\n CSS_CLIP_ZOOM_WIDTH,\n CSS_EFFECTIVE_TIME_SEPARATOR,\n CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME,\n} from '../../timeline-table/components/timeline-css-variables';\nimport { TimeRulerBlockContainer } from '../time-ruler-block-container';\n\ntype Props = {\n recordingId: string;\n episodesClips: Clip[];\n};\n\nexport const TimeRulerEffectiveTime = ({ episodesClips, recordingId }: Props) => {\n const matchSegments = useTacticalAnalysisMatchSegments(recordingId);\n return (\n <>\n {episodesClips.map((clip) =>\n clip.type === 'not-effective-time' ? (\n <div\n key={clip.id}\n style={{\n width: `calc(var(${CSS_CLIP_ZOOM_WIDTH}) * ${clip.endTime - clip.startTime})`,\n minWidth: `var(${clip.title ? CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME : CSS_EFFECTIVE_TIME_SEPARATOR})`,\n maxWidth: `var(${clip.title ? CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME : CSS_EFFECTIVE_TIME_SEPARATOR})`,\n background: Colors.athens,\n height: '100%',\n }}\n />\n ) : (\n <TimeRulerBlockContainer\n key={clip.id}\n recordingId={recordingId}\n matchSegments={matchSegments}\n startTime={clip.startTime}\n endTime={clip.endTime}\n />\n ),\n )}\n </>\n );\n};\n","import { useTacticalAnalysisMatchSegments } from '../../../../hooks/use-tactical-analysis-match-segments';\nimport { TimeRulerBlockContainer } from '../time-ruler-block-container';\n\ntype Props = {\n recordingId: string;\n endTime: number;\n};\n\nexport const TimeRulerFullTime = ({ endTime, recordingId }: Props) => {\n const matchSegments = useTacticalAnalysisMatchSegments(recordingId);\n return (\n <TimeRulerBlockContainer\n recordingId={recordingId}\n matchSegments={matchSegments}\n fullWidth\n startTime={0}\n endTime={endTime}\n />\n );\n};\n","import { Box } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport { forwardRef, memo, useCallback, useEffect, useState } from 'react';\n\nimport { useDuration, useVideoPlayerPlayingMode } from 'shared/components/video-player';\n\nimport { TimeRulerEffectiveTime } from './time-ruler-effective-time';\nimport { TimeRulerFullTime } from './time-ruler-full-time';\nimport { Clip } from '../../../api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\n\ntype Props = {\n episodesClips: Clip[];\n recordingId: string;\n};\n\nexport const TimeRuler = memo(\n forwardRef(({ episodesClips, recordingId }: Props, ref: any) => {\n const [endTime, setEndTime] = useState(0);\n const duration = useDuration();\n const { useEffectiveTime: effectiveTime } = useVideoPlayerPlayingMode();\n\n const handleContainerResize = useCallback(() => {\n if (!ref.current || !ref.current) return;\n setEndTime(duration);\n }, [ref, duration]);\n\n useEffect(() => {\n if (ref?.current !== null) {\n const observer = new ResizeObserver(handleContainerResize);\n\n const containerElement: HTMLElement = ref.current;\n observer.observe(containerElement);\n\n return () => {\n observer.unobserve(containerElement);\n };\n }\n }, [ref, handleContainerResize]);\n\n return (\n <Box\n ref={ref}\n data-timeline-element='ruler'\n display='flex'\n minWidth='100%'\n height='40px'\n py={0}\n px={3}\n bgcolor={Colors.athens}\n overflow='hidden'\n >\n {effectiveTime ? (\n <TimeRulerEffectiveTime episodesClips={episodesClips} recordingId={recordingId} />\n ) : (\n <TimeRulerFullTime endTime={endTime} recordingId={recordingId} />\n )}\n </Box>\n );\n }),\n);\n\nTimeRuler.displayName = 'TimeRuler';\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconNoBall = (props: Omit<SvgIconProps, 'children'>): JSX.Element => {\n return (\n <SvgIcon {...props}>\n <path d='M12 3.81a8.34 8.34 0 0 0-8.333 8.333c0 2.897 1.48 5.45 3.725 6.943L17.4 5.797A8.3 8.3 0 0 0 12 3.81zm.833 2.75l1.125-.792a6.64 6.64 0 0 1 2.435 1.366L14.87 9.151l-2.037-1.424V6.56zm-2.792-.792l1.125.792v1.167l-3.325 2.325-1.125-.383-.325-1.117c.842-1.308 2.133-2.308 3.65-2.783zM7.9 16.401l-.95.083c-1.008-1.167-1.617-2.683-1.617-4.342 0-.1.008-.192.017-.292l.833-.608 1.15.4L8.55 15.26l-.65 1.142zm2.837-1.758h-.629l-1.125-3.35L12 9.176l1.865 1.305-3.128 4.162zm-1.032 5.513c.729.209 1.499.32 2.295.32a8.34 8.34 0 0 0 8.333-8.333 8.29 8.29 0 0 0-1.27-4.423L9.705 20.156zm4.378-1.688c-.658.217-1.358.342-2.083.342-.408 0-.807-.04-1.196-.113l1.798-2.387h1.531l.533.925-.583 1.233zm2.967-1.983l-.95-.083-.658-1.142 1.217-3.617 1.158-.392.833.608.017.283c0 1.658-.608 3.175-1.617 4.342z' />\n <path d='M17.539 2.847L18.87 3.85 5.831 21.153 4.5 20.15 17.539 2.847z' />\n </SvgIcon>\n );\n};\n","import { styled, Tooltip } from '@mui/material';\nimport React from 'react';\n\nimport styles from './TeamLogo.module.scss';\nimport IconShield from '../icons/icon-shield';\n\ntype Props = {\n src: string | null | undefined;\n name?: string;\n};\n\nconst LogoImg = styled('img')(({ theme }) => ({\n height: theme.spacing(3),\n}));\n\nconst LogoContainer = styled('div')(({ theme }) => ({\n height: theme.spacing(3),\n width: theme.spacing(3),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n}));\n\nconst NoLogoImg = styled(IconShield)(({ theme }) => ({\n marginRight: theme.spacing(1),\n}));\n\nexport const TeamLogo = ({ src, name }: Props) => {\n return (\n <Tooltip title={name ?? ''}>\n <LogoContainer>\n {src ? <LogoImg alt={name} src={src} /> : <NoLogoImg size='small' color='secondary' className={styles.icon} />}\n </LogoContainer>\n </Tooltip>\n );\n};\n","import { Box, Stack } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport Toggle from 'shared/components/toggle';\nimport { useCurrentPlaylistItem, useVideoPlayerPlayingMode } from 'shared/components/video-player';\nimport {\n EPISODES_PLAYING_MODE,\n getPlayingMode,\n TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE,\n} from 'shared/components/video-player/defaultPlayingModes';\nimport { PlayingModes } from 'shared/components/video-player/types';\n\nimport { useTimelinePlayingMode } from '../../../../hooks/use-timeline-playing-mode';\nimport { TIMELINE_CONFIG } from '../../config';\n\nexport const PlayingModeToggle = (): JSX.Element => {\n const { t } = useTranslation();\n const currentPlaylistItem = useCurrentPlaylistItem();\n const playingMode = useVideoPlayerPlayingMode();\n const { setPlayingMode } = useTimelinePlayingMode(currentPlaylistItem.recordingId);\n const handleToggle = useCallback(() => {\n if (currentPlaylistItem.hasHomographies) {\n return setPlayingMode(\n getPlayingMode({\n playingMode,\n useEffectiveTime: !playingMode.useEffectiveTime,\n }),\n );\n }\n\n return setPlayingMode(\n playingMode.mode === PlayingModes.EPISODES\n ? TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE\n : EPISODES_PLAYING_MODE,\n );\n }, [currentPlaylistItem.hasHomographies, setPlayingMode, playingMode]);\n\n return (\n <Box\n sx={({ palette, spacing }) => ({\n position: 'absolute',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n height: `${TIMELINE_CONFIG.STICKY_HEADER_HEIGHT / 2}px`,\n padding: spacing(0, 1),\n color: 'text.primary',\n borderBottom: `1px solid ${palette.secondary.main}`,\n fontSize: fontSizes.small,\n // TODO get from theme\n lineHeight: 1.67,\n })}\n >\n <Stack direction={'row'} spacing={1} alignItems={'center'}>\n <span>{t('timeline:playing-mode-toggle.title')}</span>\n <Toggle checked={playingMode.useEffectiveTime} onClick={handleToggle} />\n </Stack>\n </Box>\n );\n};\n","export const getCssVariable = (propertyValue: string): string => {\n return getComputedStyle(document.documentElement).getPropertyValue(propertyValue);\n};\n","import { getCssVariable } from 'shared/utils/get-css-variables';\n\nimport {\n CSS_HOME_TEAM_COLOR,\n CSS_OPPONENT_TEAM_COLOR,\n} from '../../components/timeline/timeline-table/components/timeline-css-variables';\n\nconst teamColors: { home: string | undefined; opponent: string | undefined } = {\n home: undefined,\n opponent: undefined,\n};\n\nexport const useTeamColors = () => {\n if (teamColors.home && teamColors.opponent) {\n return teamColors;\n }\n\n const homeTeamColor = getCssVariable(CSS_HOME_TEAM_COLOR);\n const opponentTeamColor = getCssVariable(CSS_OPPONENT_TEAM_COLOR);\n\n if (homeTeamColor && opponentTeamColor) {\n teamColors.home = homeTeamColor;\n teamColors.opponent = opponentTeamColor;\n }\n\n return {\n home: getCssVariable(CSS_HOME_TEAM_COLOR),\n opponent: getCssVariable(CSS_OPPONENT_TEAM_COLOR),\n };\n};\n","import { Checkbox, Box, Stack, Tooltip } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport { PropsWithChildren, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { CheckboxWithCustomColor } from 'shared/components/CheckboxWithCustomColor/CheckboxWithCustomColor';\nimport IconBall from 'shared/components/icons/icon-ball';\nimport { IconNoBall } from 'shared/components/icons/icon-no-ball';\nimport { TeamLogo } from 'shared/components/team-logo';\nimport Toggle from 'shared/components/toggle';\nimport { VerticalSeparator } from 'shared/components/vertical-separator';\n\nimport { PlayingModeToggle } from './playing-mode-toggle';\nimport { usePinScenarios } from '../../../hooks/use-pin-scenarios';\nimport { useTacticalAnalysisEpisodes } from '../../../hooks/use-tactical-analysis-episodes';\nimport { useTacticalAnalysisTeams } from '../../../hooks/use-tactical-analysis-teams';\nimport { useTeamColors } from '../../../hooks/use-team-color';\nimport {\n useSetTimelineNoShowBallPossession,\n useSetTimelineShowBallPossession,\n useTimelineShowBallPossession,\n useTimelineShowNoBallPossession,\n} from '../../../hooks/use-timeline-ball-possession';\nimport { useSetTimelineTeamIdFocus, useTimelineTeamIdFocus } from '../../../hooks/use-timeline-team-id-focus';\nimport { TIMELINE_CONFIG } from '../config';\n\nconst TIMELINE_TEAM_CONTROLS_HEIGHT = '80px';\nconst TIMELINE_TEAM_CONTROLS_NO_EPISODES_HEIGHT = '40px';\n\nexport const TimelineControlsWrapper = ({\n children,\n scenarios,\n recordingId,\n}: PropsWithChildren<{\n recordingId: string;\n scenarios: React.ReactNode;\n}>) => {\n const episodes = useTacticalAnalysisEpisodes(recordingId);\n const pinScenarios = usePinScenarios();\n\n const hasEpisodes = episodes.length > 0;\n return (\n <>\n <Box\n sx={{\n position: 'sticky',\n top: 0,\n zIndex: 1,\n width: '100%',\n minHeight: TIMELINE_TEAM_CONTROLS_HEIGHT,\n background: ({ palette }) => palette.common.white,\n transform: `translate3d(0, 0, 0)`,\n\n ...(!hasEpisodes && {\n minHeight: TIMELINE_TEAM_CONTROLS_NO_EPISODES_HEIGHT,\n height: TIMELINE_TEAM_CONTROLS_NO_EPISODES_HEIGHT,\n }),\n }}\n >\n {hasEpisodes ? children : null}\n {pinScenarios ? scenarios : null}\n </Box>\n {!pinScenarios ? scenarios : null}\n </>\n );\n};\n\nconst TimelineControlsContent = ({\n children,\n recordingId,\n}: PropsWithChildren<{\n recordingId: string;\n}>) => {\n const episodes = useTacticalAnalysisEpisodes(recordingId);\n\n const hasEpisodes = episodes.length > 0;\n\n return (\n <Box\n sx={{\n minHeight: TIMELINE_TEAM_CONTROLS_HEIGHT,\n // TODO get from theme\n background: Colors.background,\n ...(!hasEpisodes && { minHeight: TIMELINE_TEAM_CONTROLS_NO_EPISODES_HEIGHT }),\n }}\n >\n {children}\n </Box>\n );\n};\n\ntype Props = {\n recordingId: string;\n};\n\nexport const TimelineControls = ({ recordingId }: Props) => {\n const teams = useTacticalAnalysisTeams(recordingId);\n const { isHomeTeamSelected, teamIdFocus } = useTimelineTeamIdFocus(recordingId);\n const { t } = useTranslation();\n const setTimelineTeamIdFocus = useSetTimelineTeamIdFocus(recordingId);\n const showBallPossession = useTimelineShowBallPossession(recordingId);\n const showNoBallPossession = useTimelineShowNoBallPossession(recordingId);\n const setShowBallPossession = useSetTimelineShowBallPossession(recordingId);\n const setShowNoBallPossession = useSetTimelineNoShowBallPossession(recordingId);\n const teamColor = useTeamColors();\n\n const handleToggle = useCallback(() => {\n if (!teams.opponentTeam?.id || !teams.homeTeam?.id) return;\n\n setTimelineTeamIdFocus(isHomeTeamSelected ? teams.opponentTeam.id : teams.homeTeam.id);\n }, [teams, isHomeTeamSelected, setTimelineTeamIdFocus]);\n\n const handleToggleShowBallPossession = useCallback(() => {\n setShowBallPossession(!showBallPossession);\n }, [setShowBallPossession, showBallPossession]);\n\n const handleToggleShowNoBallPossession = useCallback(() => {\n setShowNoBallPossession(!showNoBallPossession);\n }, [setShowNoBallPossession, showNoBallPossession]);\n\n if (!teams.homeTeam?.id || !teams.opponentTeam?.id) return null;\n\n return (\n <TimelineControlsContent recordingId={recordingId}>\n <Stack\n direction={'row'}\n alignItems={'center'}\n gap={1}\n style={{ height: `${TIMELINE_CONFIG.STICKY_HEADER_HEIGHT / 2}px` }}\n >\n <PlayingModeToggle />\n </Stack>\n <Stack\n direction={'row'}\n alignItems={'center'}\n gap={1}\n style={{ height: `${TIMELINE_CONFIG.STICKY_HEADER_HEIGHT / 2}px` }}\n >\n <Stack direction={'row'} gap={1} px={1}>\n <TeamLogo src={teams.homeTeam?.logo} name={teams.homeTeam?.name} />\n <Tooltip enterDelay={500} placement='bottom' title={t('timeline:tooltips.change-team-focus')}>\n <Toggle\n checked={teamIdFocus === teams.opponentTeam.id}\n onClick={handleToggle}\n onColor={teamColor.opponent}\n offColor={teamColor.home}\n />\n </Tooltip>\n <TeamLogo src={teams.opponentTeam?.logo} name={teams.opponentTeam?.name} />\n </Stack>\n <VerticalSeparator height={'18px'} />\n <div style={{ flex: 1 }}>\n <Stack direction={'row'} alignItems={'center'} justifyContent={'left'}>\n <Tooltip\n enterDelay={500}\n placement='bottom'\n title={\n showBallPossession\n ? t('timeline:tooltips.hide-ball-possession')\n : t('timeline:tooltips.show-ball-possession')\n }\n >\n <Stack direction={'row'} alignItems={'center'}>\n <Checkbox\n color={isHomeTeamSelected ? 'tertiary' : 'quaternary'}\n checked={showBallPossession}\n onChange={handleToggleShowBallPossession}\n sx={{\n color: isHomeTeamSelected ? 'tertiary.main' : 'quaternary.main',\n paddingLeft: ({ spacing }) => spacing(0.5),\n paddingRight: 0,\n }}\n />\n <IconBall onClick={handleToggleShowBallPossession} sx={{ cursor: 'pointer' }} />\n </Stack>\n </Tooltip>\n\n <Tooltip\n enterDelay={500}\n placement='bottom'\n title={\n showNoBallPossession\n ? t('timeline:tooltips.hide-no-ball-possession')\n : t('timeline:tooltips.show-no-ball-possession')\n }\n >\n <Stack direction={'row'} alignItems={'center'}>\n <CheckboxWithCustomColor\n checked={showNoBallPossession}\n onChange={handleToggleShowNoBallPossession}\n customColor={isHomeTeamSelected ? 'tertiaryLight' : 'quaternaryLight'}\n sx={{ paddingLeft: ({ spacing }) => spacing(0.5), paddingRight: 0 }}\n />\n <IconNoBall onClick={handleToggleShowNoBallPossession} sx={{ cursor: 'pointer' }} />\n </Stack>\n </Tooltip>\n </Stack>\n </div>\n </Stack>\n </TimelineControlsContent>\n );\n};\n","import React, { useRef } from 'react';\n\nimport { Episode } from 'shared/types';\nimport { GroupedTags } from 'shared/types/tagging-events/types';\n\nimport { EpisodesClips } from './components/episodes-clips';\nimport { EpisodesRow } from './components/episodes-row';\nimport { FiltersContentRow } from './components/filters-content-row';\nimport { FiltersHeaderRow } from './components/filters-headers-row';\nimport { RowGroupsList } from './components/row-groups-list';\nimport { RowHeadersContent } from './components/row-headers-content';\nimport { RowHeadersResizeBar } from './components/row-headers-resize-bar';\nimport { RowsContent } from './components/rows-content';\nimport { RowsContentContainer } from './components/rows-content-container';\nimport { RowsContentInner } from './components/rows-content-inner';\nimport { RowsHeaders } from './components/rows-headers';\nimport { ScenariosRowGroupContent } from './components/scenarios-row-group-content';\nimport { ScenariosRowGroupHeader } from './components/scenarios-row-group-header';\nimport { TimelineContentHeaderContainer } from './components/timeline-content-header-container';\nimport { TimelineCssVariables } from './components/timeline-css-variables';\nimport { TimelineTableWrapper } from './components/timeline-table-wrapper';\nimport { usePlayHeadPositionInTimeline } from './hooks/use-play-head-position-in-timeline';\nimport { useSyncHeight } from './hooks/use-sync-height';\nimport { useSyncRowContent } from './hooks/use-sync-row-content';\nimport styles from './TimelineTable.module.scss';\nimport { useIsTimelineReadyToRender } from '../../../hooks/use-is-timeline-ready-to-render';\nimport { useTimelineHeadersWidth } from '../../../hooks/use-timeline-headers-width';\nimport { useTimelineTableData } from '../../../hooks/use-timeline-table-data';\nimport { useTimelineWheelZoom } from '../../../hooks/use-timeline-wheel-zoom';\nimport { EffectiveTimeSeparators } from '../effective-time-separators';\nimport { FilterHighlights } from '../filter-highlights';\nimport { PlayHead } from '../play-head';\nimport { TimeRuler } from '../time-ruler';\nimport { TimelineControls, TimelineControlsWrapper } from '../timeline-controls';\n\ninterface Props {\n recordingId: string;\n episodes: Episode[];\n tags: GroupedTags;\n}\n\nexport const TimelineTable = ({ episodes, recordingId }: Props) => {\n const containerDiv = useRef<HTMLDivElement>(null);\n const episodesRowRef = useRef<HTMLDivElement>(null);\n const headerContentRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLDivElement>(null);\n const playHeadContainerRef = useRef<HTMLDivElement>(null);\n const rulerContainerRef = useRef<HTMLDivElement>(null);\n const visibleContentRef = useRef<HTMLDivElement>(null);\n\n useTimelineWheelZoom(visibleContentRef);\n useSyncHeight({ masterDiv: visibleContentRef, syncDiv: playHeadContainerRef });\n useSyncRowContent({\n recordingId,\n visibleContentRef,\n headerRef,\n });\n\n const playHeadPositioningActions = usePlayHeadPositionInTimeline({\n recordingId,\n visibleContentRef,\n headerContentRef,\n });\n\n const isTimelineReadyToRender = useIsTimelineReadyToRender(recordingId);\n const initialHeadersWidth = useTimelineHeadersWidth();\n const timelineTableData = useTimelineTableData(recordingId);\n\n return (\n <div className={styles.timelineTableWrapper} style={{ opacity: isTimelineReadyToRender ? 1 : 0 }}>\n <TimelineTableWrapper ref={containerDiv} recordingId={recordingId}>\n <TimelineCssVariables recordingId={recordingId} />\n\n <RowsHeaders recordingId={recordingId} ref={headerRef} style={{ width: `${initialHeadersWidth}px` }}>\n <RowHeadersContent ref={headerContentRef}>\n <TimelineControlsWrapper\n scenarios={\n <ScenariosRowGroupHeader\n key={'scenarios-row-group'}\n recordingId={recordingId}\n rowGroup={timelineTableData.scenariosRowGroup}\n />\n }\n recordingId={recordingId}\n >\n <TimelineControls recordingId={recordingId} />\n <FiltersHeaderRow recordingId={recordingId} />\n </TimelineControlsWrapper>\n <RowGroupsList recordingId={recordingId} rowGroups={timelineTableData.rowGroups} />\n </RowHeadersContent>\n </RowsHeaders>\n\n <RowHeadersResizeBar headerContentDiv={headerRef} contentDiv={visibleContentRef} />\n\n <RowsContent ref={visibleContentRef}>\n <RowsContentInner>\n <RowsContentContainer\n recordingId={recordingId}\n stickComponents={\n <>\n <TimeRuler\n ref={rulerContainerRef}\n recordingId={recordingId}\n episodesClips={timelineTableData.episodesRow.clips}\n />\n\n <EpisodesRow ref={episodesRowRef} recordingId={recordingId}>\n <EpisodesClips recordingId={recordingId} clips={timelineTableData.episodesRow.clips} />\n </EpisodesRow>\n\n <TimelineContentHeaderContainer ref={playHeadContainerRef}>\n <FilterHighlights recordingId={recordingId} />\n <EffectiveTimeSeparators episodesClips={timelineTableData.episodesRow.clips} />\n <PlayHead\n playHeadPositioningActions={playHeadPositioningActions}\n episodes={episodes}\n recordingId={recordingId}\n visibleContentRef={visibleContentRef}\n />\n </TimelineContentHeaderContainer>\n <FiltersContentRow recordingId={recordingId} />\n </>\n }\n scenariosRow={\n <ScenariosRowGroupContent\n key={'scenarios-content'}\n recordingId={recordingId}\n rowGroup={timelineTableData.scenariosRowGroup}\n />\n }\n contentRowGroups={timelineTableData.rowGroups}\n />\n </RowsContentInner>\n </RowsContent>\n </TimelineTableWrapper>\n </div>\n );\n};\n","import React, { PropsWithChildren } from 'react';\n\nimport { FiltersBar } from 'pages/tactical-analysis/components/tactical-analysis/filters-bar';\nimport AddToPlaylistMenuTimeline from 'pages/tactical-analysis/components/timeline/add-to-playlist-menu-timeline';\nimport { Episode, Match } from 'shared/types';\nimport { GroupedTags } from 'shared/types/tagging-events/types';\n\nimport { TimelineTable } from './timeline-table';\nimport styles from './timeline-table/TimelineTable.module.scss';\nimport { useTimelineTableData } from '../../hooks/use-timeline-table-data';\n\ntype Props = {\n episodes: Episode[];\n match?: Match;\n onTableReady?: () => void;\n recordingId: string;\n tags: GroupedTags;\n};\n\nconst TimelineContainer = ({ children }: PropsWithChildren) => (\n <div className={styles.timelineContainer}>{children}</div>\n);\n\nconst TimelineContent = ({ children }: PropsWithChildren) => <div className={styles.timelineContent}>{children}</div>;\n\nexport const Timeline = React.memo(({ episodes, match, recordingId, tags }: Props) => {\n const timelineTableData = useTimelineTableData(recordingId);\n\n if (timelineTableData.rowGroups.length === 0 || !match) return null;\n\n return (\n <TimelineContainer>\n <TimelineContent>\n <FiltersBar\n episodes={episodes}\n recordingId={recordingId}\n teams={match.teams}\n videoSources={match.videoSources}\n />\n <TimelineTable recordingId={recordingId} episodes={episodes} tags={tags} />\n </TimelineContent>\n <AddToPlaylistMenuTimeline recordingId={recordingId} />\n </TimelineContainer>\n );\n});\n\nTimeline.displayName = 'Timeline';\n","import React, { useCallback, useEffect, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useSaveUserPreset } from 'api/user-presets/use-save-user-preset';\nimport { useDuration } from 'shared/components/video-player';\nimport { TimelineHeightPreset } from 'shared/constants/user-presets/userPresetsClasses';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\nimport { Episode, Match } from 'shared/types';\nimport { GroupedTags } from 'shared/types/tagging-events/types';\n\nimport ResizeBar from './resize-bar';\nimport { TacticalAnalysisContainer, TacticalAnalysisTimelineContainer, TacticalAnalysisVideoContainer } from './styled';\nimport { TacticalAnalysisVideoPlayer } from './tactical-analysis-video-player';\nimport { MINIMUM_TIMELINE_TRACKS_HEIGHT } from '../../atoms';\nimport { useSetTimelineHeight, useTimelineHeight } from '../../hooks/use-timeline-height';\nimport { Timeline } from '../timeline';\nimport { useGenerateTimelineWidth } from '../timeline/timeline-table/hooks/use-generate-timeline-width';\n\nconst MINIMUM_VIDEO_PLAYER_HEIGHT = 150;\n\nexport interface Props {\n episodes: Episode[];\n recordingId: string;\n match: Match;\n groupedTags: GroupedTags;\n}\n\nexport const TacticalAnalysis = ({ episodes, match, groupedTags, recordingId }: Props) => {\n const { t } = useTranslation();\n const duration = useDuration();\n useGenerateTimelineWidth(recordingId);\n const { savePreset } = useSaveUserPreset();\n const containerRef = useRef<HTMLDivElement>(null);\n const trackContainerRef = useRef<HTMLDivElement>(null);\n const timelineHeight = useTimelineHeight();\n const setTimelineHeight = useSetTimelineHeight();\n const branding = useBranding();\n\n const handleSaveHeight = useCallback(\n (height: number) => {\n if (timelineHeight === height) {\n return;\n }\n const heightPreset = new TimelineHeightPreset(height);\n setTimelineHeight(height);\n savePreset({ data: heightPreset });\n },\n [savePreset, setTimelineHeight, timelineHeight],\n );\n\n useEffect(() => {\n document.title = t('common:metas.title.tactical-analysis', { clientDisplayName: branding.displayName });\n }, [t, branding.displayName]);\n\n return (\n <TacticalAnalysisContainer>\n <TacticalAnalysisVideoContainer ref={containerRef}>\n <TacticalAnalysisVideoPlayer recordingId={recordingId} />\n </TacticalAnalysisVideoContainer>\n <TacticalAnalysisTimelineContainer height={timelineHeight} ref={trackContainerRef}>\n <ResizeBar\n direction={'vertical'}\n mainPanelElement={trackContainerRef}\n mainPanelMinSize={MINIMUM_TIMELINE_TRACKS_HEIGHT}\n onChange={handleSaveHeight}\n secondaryPanelElement={containerRef}\n secondaryPanelMinSize={MINIMUM_VIDEO_PLAYER_HEIGHT}\n />\n {duration !== 0 ? (\n <Timeline episodes={episodes} match={match} recordingId={recordingId} tags={groupedTags} />\n ) : null}\n </TacticalAnalysisTimelineContainer>\n </TacticalAnalysisContainer>\n );\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nimport { MINIMUM_TIMELINE_TRACKS_HEIGHT } from '../../../atoms';\n\nexport const FILTERS_BAR_HEIGHT = '4.5rem';\n\nexport const TacticalAnalysisSkeletonContainer = styled(Box)(() => ({\n backgroundColor: Colors.background,\n display: 'flex',\n flexDirection: 'column',\n flex: '1',\n overflow: 'hidden',\n width: '100%',\n position: 'relative',\n height: '100%',\n}));\n\nexport const TacticalAnalysisSkeletonVideoContainer = styled(Box)(() => ({\n alignItems: 'flex-start',\n backgroundColor: Colors.shark,\n display: 'flex',\n flex: '1',\n justifyContent: 'center',\n overflow: 'hidden',\n}));\n\nexport const TacticalAnalysisSkeletonVideoSkeleton = styled(Box)(() => ({\n paddingBottom: '56.25%',\n background: Colors.night,\n}));\n\nexport const TacticalAnalysisSkeletonContent = styled(Box)(() => ({\n height: `${MINIMUM_TIMELINE_TRACKS_HEIGHT}px`,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n position: 'relative',\n}));\n\nexport const TacticalAnalysisSkeletonContentFilters = styled(Box)(({ theme }) => ({\n background: Colors.white,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n minHeight: FILTERS_BAR_HEIGHT,\n padding: theme.spacing(0, 1),\n zIndex: '6',\n boxShadow: '0 3px 3px -1px rgba(10, 22, 70, 0.1), 0 0 1px 0 rgba(10, 22, 70, 0.06)', // TODO: replace with shadows from theme\n}));\n\nexport const TacticalAnalysisSkeletonContentTimeline = styled(Box)(() => ({\n display: 'flex',\n flexDirection: 'column',\n flex: '1',\n overflow: 'hidden',\n justifyContent: 'center',\n}));\n\nexport const TacticalAnalysisSkeletonFiltersLoading = styled(Box)(() => ({\n alignItems: 'center',\n display: 'flex',\n flex: '1',\n height: '100%',\n justifyContent: 'center',\n}));\n","import React from 'react';\n\nimport Spinner from 'shared/components/spinner';\n\nimport {\n TacticalAnalysisSkeletonContainer,\n TacticalAnalysisSkeletonContent,\n TacticalAnalysisSkeletonContentFilters,\n TacticalAnalysisSkeletonContentTimeline,\n TacticalAnalysisSkeletonFiltersLoading,\n TacticalAnalysisSkeletonVideoContainer,\n TacticalAnalysisSkeletonVideoSkeleton,\n} from './styled';\n\nexport const TacticalAnalysisPageSkeleton = () => {\n return (\n <TacticalAnalysisSkeletonContainer>\n <TacticalAnalysisSkeletonVideoContainer>\n <TacticalAnalysisSkeletonVideoSkeleton />\n </TacticalAnalysisSkeletonVideoContainer>\n <TacticalAnalysisSkeletonContent>\n <TacticalAnalysisSkeletonContentFilters />\n <TacticalAnalysisSkeletonContentTimeline>\n <TacticalAnalysisSkeletonFiltersLoading>\n <Spinner />\n </TacticalAnalysisSkeletonFiltersLoading>\n </TacticalAnalysisSkeletonContentTimeline>\n </TacticalAnalysisSkeletonContent>\n </TacticalAnalysisSkeletonContainer>\n );\n};\n","import { useClientId } from 'shared/contexts/app-state';\nimport { DataFetching } from 'shared/hooks/use-page-state-machine';\n\nimport { useTacticalAnalysisData } from '../../api/use-tactical-analysis-data';\nimport { UseTimelineMatchTaggingData } from '../../api/use-tactical-analysis-data/types';\n\nexport const useTacticalAnalysisPage = (tacticalAnalysisId: string): DataFetching<UseTimelineMatchTaggingData> => {\n const { clientId } = useClientId();\n const tacticalAnalysisData = useTacticalAnalysisData(tacticalAnalysisId);\n\n const isInvalidClient = !tacticalAnalysisData?.data?.matchWithEpisodes?.match?.clientIds.includes(clientId);\n\n return {\n ...tacticalAnalysisData,\n isInvalidClient,\n };\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport { useEffect, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { RouteComponentProps } from 'react-router-dom';\n\nimport Container from 'shared/components/container';\nimport NotFound from 'shared/components/not-found';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { SwitchEnvironment } from 'shared/components/switch-environment';\nimport { VideoPlayerStateProvider } from 'shared/components/video-player';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\nimport usePageStateMachine from 'shared/hooks/use-page-state-machine';\nimport { groupTagsByType } from 'shared/utils/group-tags-by-type';\n\nimport { UseTimelineMatchTaggingData } from './api/use-tactical-analysis-data/types';\nimport { TacticalAnalysis } from './components/tactical-analysis';\nimport { AddToPlaylistMenuStateProvider } from './components/tactical-analysis/add-to-playlist-menu/add-to-playlist-menu-state';\nimport { TacticalAnalysisPageSkeleton } from './components/tactical-analysis/tactical-analysis-page-skeleton';\nimport { useTacticalAnalysisPage } from './hooks/use-tactical-analysis-page';\nimport { useTimelineInitialTime } from './hooks/use-timeline-initial-time';\n\ninterface StaticContext {\n statusCode?: number | undefined;\n}\n\ninterface State {\n initialStartTimeFromClip?: number;\n}\n\ninterface RouteParams {\n id: string;\n}\n\nconst NotFoundContainer = styled(Box)(() => ({\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: Colors.background,\n}));\n\nexport const TacticalAnalysisContainer = (props: RouteComponentProps<RouteParams, StaticContext, State>) => {\n const {\n match: {\n params: { id },\n },\n location: { state },\n } = props;\n const { t } = useTranslation();\n const initialTimePreset = useTimelineInitialTime(id);\n const branding = useBranding();\n\n useEffect(() => {\n document.title = t('common:metas.title.tactical-analysis', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n const { current, data, PAGE_STATES, isInvalidClient } = usePageStateMachine<UseTimelineMatchTaggingData>(() =>\n useTacticalAnalysisPage(id),\n );\n\n const initialStartTimeFromClip = useMemo(\n () => state?.initialStartTimeFromClip || initialTimePreset,\n [initialTimePreset, state?.initialStartTimeFromClip],\n );\n\n if (isInvalidClient && data?.matchWithEpisodes?.match.clientIds) {\n return <SwitchEnvironment resourceClientsIds={data.matchWithEpisodes.match.clientIds} />;\n }\n\n return (\n <SidebarLayout>\n <Container fullScreen>\n {current.matches(PAGE_STATES.LOADING) && <TacticalAnalysisPageSkeleton />}\n {current.matches(PAGE_STATES.MISSING_DATA) ||\n (current.matches(PAGE_STATES.ERROR) && (\n <NotFoundContainer>\n <NotFound header={t('timeline:not-found')} showContactLink />\n </NotFoundContainer>\n ))}\n {current.matches(PAGE_STATES.READY) &&\n data?.matchWithEpisodes &&\n data?.taggingEvents &&\n data?.playlistItems && (\n <VideoPlayerStateProvider\n playerId={`timeline-${data.matchWithEpisodes.match.id}`}\n playlistItems={data.playlistItems}\n playingMode={data.initialPlayingMode}\n initialStartTime={initialStartTimeFromClip}\n >\n <AddToPlaylistMenuStateProvider id={'timeline-playlist-menu'}>\n <TacticalAnalysis\n episodes={data.matchWithEpisodes.episodes}\n match={data.matchWithEpisodes.match}\n recordingId={id}\n groupedTags={groupTagsByType(data.taggingEvents.tags)}\n />\n </AddToPlaylistMenuStateProvider>\n </VideoPlayerStateProvider>\n )}\n </Container>\n </SidebarLayout>\n );\n};\n","import { Box, styled, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport enum KeypadEditKeypadActionsVariant {\n TOP = 'top',\n BOTTOM = 'bottom',\n}\n\ninterface KeypadEditKeypadActionsProps {\n variant: KeypadEditKeypadActionsVariant;\n}\n\nexport const KeypadEditSubTitle = styled(Typography)(({ theme }) => ({\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(3),\n textAlign: 'center',\n}));\n\nexport const KeypadEditKeypadContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n marginTop: theme.spacing(4),\n gap: theme.spacing(2),\n}));\n\nexport const KeypadEditKeypadFault = styled(Box)(({ theme }) => ({\n flex: '1',\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n}));\n\nexport const KeypadEditOffenseBottom = styled(Box)(({ theme }) => ({\n display: 'flex',\n marginTop: theme.spacing(4),\n gap: theme.spacing(2),\n}));\n\nexport const KeypadEditKeypadActions = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'variant',\n})<KeypadEditKeypadActionsProps>(({ theme, variant }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n ...(variant === KeypadEditKeypadActionsVariant.TOP && {\n marginTop: theme.spacing(2),\n }),\n ...(variant === KeypadEditKeypadActionsVariant.BOTTOM && {\n marginBottom: theme.spacing(2),\n }),\n}));\n\nexport const KeypadEditKeypadMiddle = styled(Box)(({ theme }) => ({\n flex: '1',\n background: Colors.iron,\n border: `1px solid ${Colors.storm}`,\n position: 'relative',\n padding: theme.spacing(1, 0),\n}));\n\nexport const KeypadEditKeypadHContent = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(1),\n}));\n\nexport const KeypadEditKeypadVContent = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n}));\n","// https://gist.github.com/jed/982883\n\nexport const makeUUID = (a = ''): string =>\n a\n ? /* eslint-disable no-bitwise */\n ((Number(a) ^ (Math.random() * 16)) >> (Number(a) / 4)).toString(16)\n : `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, makeUUID);\n","import { KeypadTag } from 'api/tagging-tool/types';\n\nimport { makeUUID } from '../utility/uuid';\n\nexport enum KeypadGenericTagKey {\n // offense\n OFFENSE_L_CORNER,\n OFFENSE_DIRECT_FAULT,\n OFFENSE_INDIRECT_FAULT,\n OFFENSE_PENALTY,\n OFFENSE_R_CORNER,\n\n OFFENSE_L_CROSS,\n OFFENSE_GOAL_FAVOR,\n OFFENSE_GOAL_CHANCE,\n OFFENSE_R_CROSS,\n OFFENSE_FINALIZATION,\n OFFENSE_OFFENSE,\n OFFENSE_GK_SHORT,\n OFFENSE_GK_LONG,\n\n OFFENSE_THROW_IN_L,\n OFFENSE_THROW_IN_R,\n\n // transition\n TRANSITION_LOST_BALL,\n TRANSITION_BALL_RECOVERY,\n\n // defense\n\n DEFENSE_GK_LONG,\n DEFENSE_HIGH_PRESS,\n DEFENSE_DEFENSE,\n DEFENSE_FINALIZATION,\n DEFENSE_L_CROSS,\n DEFENSE_GOAL_CHANCE,\n DEFENSE_GOAL_AGAINST,\n DEFENSE_R_CROSS,\n\n DEFENSE_L_CORNER,\n DEFENSE_DIRECT_FAULT,\n DEFENSE_INDIRECT_FAULT,\n DEFENSE_PENALTY,\n DEFENSE_R_CORNER,\n\n DEFENSE_THROW_IN_L,\n DEFENSE_THROW_IN_R,\n\n // events\n\n EVENT_KICK_OFF,\n EVENT_SECOND_HALF,\n}\n\nexport type KeypadGenericTagId = keyof typeof KeypadGenericTagKey;\n\nexport type KeypadIndex = {\n [key in KeypadGenericTagId]: KeypadTag;\n} & {\n [key in string]: KeypadTag;\n};\n\nexport const makeCustomKeypadTag = (params: {\n keypadId: string;\n}): Pick<KeypadTag, 'keypadId' | 'keypadTagId' | 'isEnabled' | 'isCustom' | 'timeAfter' | 'timeBefore'> => {\n const { keypadId } = params;\n const keypadTagId = makeUUID();\n return {\n keypadId,\n keypadTagId,\n isEnabled: true,\n isCustom: true,\n timeAfter: 5,\n timeBefore: 5,\n };\n};\n","const PROXY_HEADER_BASEURL = 'x-ktt-baseurl';\nconst PROXY_HEADER_COOKIE = 'x-ktt-cookie';\n\nconst KEY_BASEURL = '_KTT_BASEURL';\nconst KEY_PROXY_COOKIE = 'ktt::proxy_cookie';\n\ntype Headers = { [header: string]: string };\n\nexport const getStorageExtraRequestHeaders = (): Headers => {\n const ret: Headers = {};\n\n const baseURL = localStorage.getItem(KEY_BASEURL);\n if (baseURL !== null) {\n ret[PROXY_HEADER_BASEURL] = baseURL;\n }\n\n const cookie = localStorage.getItem(KEY_PROXY_COOKIE);\n if (cookie !== null) {\n ret[PROXY_HEADER_COOKIE] = cookie;\n }\n\n return ret;\n};\n","import { useEffect, useRef, useState } from 'react';\n\nenum ActionType {\n SUBSCRIBE,\n UNSUBSCRIBE,\n CURRENT,\n NEXT,\n STOP,\n}\n\ntype Observer<T> = (value: T) => void;\ntype Setter<T> = (oldValue: T) => T;\n\ntype Action<T> =\n | { type: ActionType.SUBSCRIBE; observer: Observer<T> }\n | { type: ActionType.UNSUBSCRIBE; observer: Observer<T> }\n | { type: ActionType.CURRENT }\n | { type: ActionType.NEXT; setter: Setter<T> }\n | { type: ActionType.STOP };\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction* gen<T extends object>(initialValue: T): Generator<T, T, Action<T>> {\n let run = true;\n\n let observers: Array<Observer<T>> = [];\n let value: T = initialValue;\n\n while (run) {\n const res = yield value;\n\n if (res.type === ActionType.SUBSCRIBE) {\n observers.push(res.observer);\n } else if (res.type === ActionType.UNSUBSCRIBE) {\n observers = observers.filter((o) => o !== res.observer);\n } else if (res.type === ActionType.NEXT) {\n value = { ...res.setter(value) };\n setTimeout(() => {\n observers.forEach((o) => {\n o(value);\n });\n }, 0);\n } else if (res.type === ActionType.CURRENT) {\n // no-op\n } else if (res.type === ActionType.STOP) {\n run = false;\n }\n }\n\n return value;\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function makeContainer<T extends object>(initialValue: T) {\n const gen$ = gen<T>(initialValue);\n\n const getValue = (): T => {\n return gen$.next({ type: ActionType.CURRENT }).value;\n };\n\n const nextValue = (setter: Setter<T>) => {\n gen$.next({ type: ActionType.NEXT, setter });\n };\n\n const useContainer = (): [T, (setter: Setter<T>) => void] => {\n const mountedRef = useRef<boolean>(false);\n const [state, setState] = useState<T>(getValue);\n\n useEffect(() => {\n mountedRef.current = true;\n\n const observer: Observer<T> = (next: T) => {\n if (!mountedRef.current) {\n return;\n }\n setState(next);\n };\n\n gen$.next({\n type: ActionType.SUBSCRIBE,\n observer,\n });\n\n return () => {\n mountedRef.current = false;\n\n gen$.next({\n type: ActionType.UNSUBSCRIBE,\n observer,\n });\n };\n }, []);\n\n return [state, nextValue];\n };\n\n return { getValue, nextValue, useContainer };\n}\n","import { makeContainer } from './base';\nimport { ServiceError } from '../service/base';\n\nexport type ServiceErrorState = {\n lastServiceError?: ServiceError | undefined;\n};\n\n// state\n\nconst { nextValue } = makeContainer<ServiceErrorState>({});\n\nexport const nextServiceError = (lastServiceError?: ServiceError) => {\n nextValue((state) => {\n return {\n ...state,\n lastServiceError,\n };\n });\n};\n","import axios, { AxiosError } from 'axios';\n\nimport { getStorageExtraRequestHeaders } from './storage';\nimport { nextServiceError } from '../container/serviceError';\n\nexport type ServiceResponse<Response> =\n | { error: false; data: Response; headers: { [header: string]: string } }\n | ({ error: true } & ServiceError);\n\n/**\n * The SDK *sanitizes* all possible network related errors adopting `ServiceError` object spec.\n */\nexport type ServiceError = {\n /** HTTP response status or `0` if no network error trigger the error. */\n status: number;\n /** Message from the endpoint response. */\n message?: string;\n /** Message with error from the endpoint response. */\n errors: { [key: string]: Array<string> };\n};\n\nexport type FetchRequestOptions = {\n url: string;\n method?:\n | 'get'\n | 'GET'\n | 'post'\n | 'POST'\n | 'put'\n | 'PUT'\n | 'patch'\n | 'PATCH'\n | 'delete'\n | 'DELETE'\n | 'head'\n | 'HEAD'\n | 'options'\n | 'OPTIONS'\n | 'purge'\n | 'PURGE'\n | 'link'\n | 'LINK'\n | 'unlink'\n | 'UNLINK';\n body?: unknown;\n headers?: { [key: string]: string };\n emitServiceError?: boolean;\n};\n\n// fetch\n\nexport const fetchRequest = <Response>(\n options: FetchRequestOptions & { mock?: Response },\n): Promise<ServiceResponse<Response>> => {\n const extraHeaders = getStorageExtraRequestHeaders();\n\n const url = `${options.url}`;\n const method = options.method ?? (options.body !== undefined ? 'post' : 'get');\n return new Promise((resolve) => {\n if (options.mock) {\n const data = options.mock;\n return setTimeout(() => {\n resolve({ error: false, data, headers: {} });\n }, 126);\n }\n axios(url, {\n withCredentials: true,\n method,\n headers: {\n ...extraHeaders,\n ...options.headers,\n },\n data: options.body,\n })\n .then(({ data, headers }) => {\n resolve({ error: false, data, headers });\n })\n .catch((err: AxiosError<any>) => {\n // Axios changed the typing of AxiosError from AxiosError<T = any, D = any> in version 0.26.0\n // to AxiosError<T = unknown, D = any> in 0.27.0\n let message = '';\n const _message: { [k: string]: any } | string | undefined = err.response?.data?.message ?? err.response?.data;\n\n if (typeof _message === 'string' && _message.indexOf('<html') > -1) {\n message = 'IGNORED_HTML_MESSAGE';\n } else if (typeof _message === 'string') {\n message = _message;\n } else if (typeof _message === 'object') {\n message = JSON.stringify(_message);\n }\n\n const serviceError = {\n status: err.response?.status ?? 0,\n message,\n errors: err.response?.data?.errors ?? {},\n };\n\n if (options.emitServiceError !== false) {\n nextServiceError(serviceError);\n }\n\n resolve({\n error: true,\n ...serviceError,\n });\n });\n });\n};\n","import { deleteKeypadTagsUrl, keypadCopyUrl, keypadsUrl, keypadTagsUrl, keypadUrl } from 'api/routes';\nimport { KeypadApiResponse } from 'api/tagging-tool/types';\n\nimport { fetchRequest } from './base';\nimport {\n FetchCopyKeypadParams,\n FetchCreateKeypadBody,\n FetchCreateKeypadTagBody,\n FetchCreateKeypadTagResponse,\n FetchDeleteKeypadParams,\n FetchDeleteKeypadResponse,\n FetchDeleteKeypadTagParams,\n FetchDeleteKeypadTagResponse,\n FetchKeypadParams,\n FetchKeypadResponse,\n FetchKeypadsResponse,\n FetchUpdateKeypadBody,\n FetchUpdateKeypadResponse,\n FetchUpdateKeypadTagBody,\n FetchUpdateKeypadTagResponse,\n} from './keypad';\n\n// GET /keypad\n\nexport const fetchKeypads = () => {\n return fetchRequest<FetchKeypadsResponse>({\n url: keypadsUrl(),\n });\n};\n\n// POST /keypad\n\nexport const fetchCreateKeypad = (body: FetchCreateKeypadBody) => {\n return fetchRequest<FetchKeypadResponse>({\n url: keypadsUrl(),\n body: { name: body.name },\n });\n};\n\nexport const fetchDuplicateKeypad = (params: FetchCopyKeypadParams) => {\n return fetchRequest<FetchKeypadResponse>({\n url: keypadCopyUrl(params.id),\n body: { name: params.name },\n });\n};\n\n// PUT /keypad/${keypadId}\n\nexport const fetchUpdateKeypad = (body: FetchUpdateKeypadBody) => {\n return fetchRequest<FetchUpdateKeypadResponse>({\n url: keypadUrl(body.id),\n body: {\n id: body.id,\n isDefault: body.isDefault,\n name: body.name,\n },\n method: 'put',\n });\n};\n\n// DELETE /keypad/${keypadId}\n\nexport const fetchDeleteKeypad = (params: FetchDeleteKeypadParams) => {\n return fetchRequest<FetchDeleteKeypadResponse>({\n url: keypadUrl(params.id),\n method: 'delete',\n });\n};\n\n// GET /keypad/${keypadId}\n\nexport const fetchKeypad = (params: FetchKeypadParams) => {\n return fetchRequest<KeypadApiResponse>({\n url: keypadUrl(params.id),\n });\n};\n\n// POST /keypad/${keypadId}/tag\n\nexport const fetchCreateKeypadTag = (body: FetchCreateKeypadTagBody) => {\n return fetchRequest<FetchCreateKeypadTagResponse>({\n url: keypadTagsUrl(body.keypadId!),\n body: {\n keypadTagId: body.keypadTagId,\n name: body.name,\n typeOfPlay: body.typeOfPlay,\n timeBefore: body.timeBefore,\n timeAfter: body.timeAfter,\n hotKey: body.hotKey,\n description: body.description,\n typeOfPlaySource: body.typeOfPlaySource,\n isEnabled: body.isEnabled,\n isCustom: body.isCustom,\n },\n });\n};\n\n// PUT /keypad/${keypadId}/tag/${tagId}\n\nexport const fetchUpdateKeypadTag = (body: FetchUpdateKeypadTagBody) => {\n return fetchRequest<FetchUpdateKeypadTagResponse>({\n url: keypadTagsUrl(body.keypadId!),\n body: {\n keypadTagId: body.keypadTagId,\n name: body.name,\n typeOfPlay: body.typeOfPlay,\n timeBefore: body.timeBefore,\n timeAfter: body.timeAfter,\n hotKey: body.hotKey,\n description: body.description,\n typeOfPlaySource: body.typeOfPlaySource,\n isEnabled: body.isEnabled,\n isCustom: body.isCustom,\n },\n method: 'put',\n });\n};\n\n// DELETE /keypad/${keypadId}/tag/${tagId}\n\nexport const fetchDeleteKeypadTag = (params: FetchDeleteKeypadTagParams) => {\n return fetchRequest<FetchDeleteKeypadTagResponse>({\n url: deleteKeypadTagsUrl(params.keypadId!, params.keypadTagId),\n method: 'delete',\n });\n};\n","import { sort } from 'fast-sort';\n\nimport { KeypadTag } from 'api/tagging-tool/types';\n\nimport { KeypadIndex } from '../model/Keypad';\n\nexport const HOTKEY_SPLIT_KEY_PRINTABLE = '+';\nexport const HOTKEY_SPLIT_KEY = '$';\n\nexport type HotKey = Array<string>;\n\nexport const hotKeyToString = (hotKey: HotKey): string => {\n return hotKey.join(HOTKEY_SPLIT_KEY);\n};\n\nexport const hotKeyToPrintableString = (value: string): string => {\n return value\n .split(HOTKEY_SPLIT_KEY)\n .map((value) => {\n return `${value.charAt(0).toUpperCase()}${value.substring(1, value.length)}`;\n })\n .join(` ${HOTKEY_SPLIT_KEY_PRINTABLE} `);\n};\n\nexport const keyboardEventToKey = (ev: KeyboardEvent): string | undefined => {\n const { code } = ev;\n let key: string | undefined;\n if (code.indexOf('Key') === 0) {\n // letters\n key = code.substring(3, code.length).toUpperCase();\n } else if (code.indexOf('Digit') === 0) {\n // numbers\n key = code.substring(5, code.length).toLowerCase();\n } else if (code.indexOf('Arrow') === 0) {\n // arrow keys\n key = code.substring(5, code.length).toLowerCase();\n } else if (code.indexOf('Shift') === 0) {\n // shift\n key = 'shift';\n } else if (code.indexOf('Meta') === 0) {\n // command\n key = 'cmd';\n } else if (code.indexOf('Control') === 0) {\n // control\n key = 'ctrl';\n } else if (code.indexOf('F') === 0 && code.length === 2) {\n // function keys\n key = code.toUpperCase();\n } else if (code.indexOf('Esc') === 0) {\n // esc\n key = 'esc';\n } else if (code.indexOf('Alt') === 0) {\n // alt\n key = 'alt';\n }\n\n return key;\n};\n\nexport type KeypadTagHotKeyResolver = {\n resolve: (hotKey: string | null | undefined) => KeypadTag | undefined;\n};\n\nexport const makeHotKeyResolver = (keypadData: KeypadIndex): KeypadTagHotKeyResolver => {\n type Index = { [indexKey: string]: KeypadTag };\n\n // we need to somehow normalize hotkeys, eg: shift+a = a+shift\n // we're going to do that sorting strings\n const hotKeyToIndexKey = (hotkey: string) => {\n return sort(hotkey.split(HOTKEY_SPLIT_KEY)).asc().join();\n };\n\n const index: Index = Object.values(keypadData)\n .filter((tag: KeypadTag) => {\n // remove tags w/out hotkey\n return tag.hotKey !== undefined && tag.hotKey !== null;\n })\n .reduce((acc: Index, tag: KeypadTag) => {\n const { hotKey } = tag;\n const indexKey = hotKeyToIndexKey(hotKey!);\n return { ...acc, [indexKey]: tag };\n }, {} as Index);\n\n return {\n resolve: (hotKey) => {\n if (hotKey === null || hotKey === undefined) {\n return undefined;\n }\n return index[hotKeyToIndexKey(hotKey)];\n },\n };\n};\n","import { Dispatch as ReactDispatch, useCallback, useEffect, useReducer } from 'react';\n\nimport { KeypadApiResponse, KeypadTag } from 'api/tagging-tool/types';\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nimport { KeypadIndex, makeCustomKeypadTag } from '../../../../tagging-tool/model/Keypad';\nimport {\n fetchKeypad,\n fetchUpdateKeypadTag,\n fetchCreateKeypadTag,\n fetchDeleteKeypadTag,\n} from '../../../../tagging-tool/service/keypad.service';\nimport { KeypadTagHotKeyResolver, makeHotKeyResolver } from '../../../../tagging-tool/utility/hotkeys';\n\nexport type CustomButtonsData = {\n offense: Array<KeypadTag>;\n transition: Array<KeypadTag>;\n defense: Array<KeypadTag>;\n};\n\nexport type State = {\n keypadId?: string;\n fetching?: boolean;\n editModalShown?: boolean;\n removeModalShown?: boolean;\n creating?: boolean;\n data?: KeypadIndex;\n targetTagData?: Partial<KeypadTag>;\n customButtonsData?: CustomButtonsData;\n hotKeyResolver?: KeypadTagHotKeyResolver;\n};\n\nexport enum ActionType {\n SET_KEYPAD,\n SET_ENABLED,\n EDIT_MODAL_SHOW,\n ON_ADD_NEW,\n EDIT_MODAL_CANCEL,\n EDIT_MODAL_CLOSED,\n SET_FETCHING,\n ON_UPSERT_FETCH_END,\n REMOVE_MODAL_SHOW,\n REMOVE_MODAL_CANCEL,\n REMOVE_MODAL_CLOSED,\n ON_REMOVE_FETCH_END,\n}\n\nexport type Action =\n | { type: ActionType.SET_KEYPAD; payload: KeypadApiResponse }\n | { type: ActionType.SET_ENABLED; payload: KeypadTag }\n | { type: ActionType.EDIT_MODAL_SHOW; payload: KeypadTag }\n | { type: ActionType.EDIT_MODAL_CANCEL }\n | { type: ActionType.EDIT_MODAL_CLOSED }\n | { type: ActionType.SET_FETCHING }\n | { type: ActionType.ON_UPSERT_FETCH_END; payload?: KeypadTag }\n | { type: ActionType.ON_ADD_NEW }\n | { type: ActionType.REMOVE_MODAL_SHOW; payload: KeypadTag }\n | { type: ActionType.REMOVE_MODAL_CANCEL }\n | { type: ActionType.REMOVE_MODAL_CLOSED }\n | { type: ActionType.ON_REMOVE_FETCH_END; payload: boolean };\n\nexport type Dispatch = { dispatch: ReactDispatch<Action> } & {\n handleEnabledChange: (tag: KeypadTag, isEnabled: boolean) => void;\n handleUpdateKeypadTag: (item: KeypadTag) => void;\n handleCreateKeypadTag: (item: KeypadTag) => void;\n handleRemoveKeypadTag: (item: KeypadTag) => void;\n};\n\nconst updateData = (data: KeypadIndex): Pick<State, 'data' | 'customButtonsData' | 'hotKeyResolver'> => {\n const customButtonsData = Object.values(data).reduce(\n (acc, item) => {\n if (!item.isCustom) {\n return acc;\n } else if (item.typeOfPlay === TypeOfPlay.Offense) {\n return { ...acc, offense: [...acc.offense, item] };\n } else if (item.typeOfPlay === TypeOfPlay.Transition) {\n return { ...acc, transition: [...acc.transition, item] };\n } else if (item.typeOfPlay === TypeOfPlay.Defense) {\n return { ...acc, defense: [...acc.defense, item] };\n }\n return acc;\n },\n { offense: [], transition: [], defense: [] } as CustomButtonsData,\n );\n\n return {\n data,\n customButtonsData,\n hotKeyResolver: makeHotKeyResolver(data),\n };\n};\n\nconst reducer = (state: State, action: Action): State => {\n if (action.type === ActionType.SET_KEYPAD) {\n const data = action.payload.tags.reduce((acc, keypad) => {\n return {\n ...acc,\n [keypad.keypadTagId]: {\n keypadId: keypad.keypadId,\n keypadTagId: keypad.keypadTagId,\n name: keypad.name,\n typeOfPlay: keypad.typeOfPlay,\n timeBefore: keypad.timeBefore,\n timeAfter: keypad.timeAfter,\n hotKey: keypad.hotKey,\n description: keypad.description,\n typeOfPlaySource: keypad.typeOfPlaySource,\n isEnabled: keypad.isEnabled,\n isCustom: keypad.isCustom,\n },\n };\n }, {} as KeypadIndex);\n\n return {\n ...state,\n keypadId: action.payload.id,\n ...updateData(data),\n };\n } else if (action.type === ActionType.SET_ENABLED) {\n const data: KeypadIndex = {\n ...state.data!,\n [action.payload.keypadTagId]: action.payload,\n };\n return {\n ...state,\n ...updateData(data),\n };\n } else if (action.type === ActionType.EDIT_MODAL_SHOW) {\n return {\n ...state,\n targetTagData: action.payload,\n creating: false,\n editModalShown: true,\n };\n } else if (action.type === ActionType.EDIT_MODAL_CANCEL) {\n return {\n ...state,\n editModalShown: false,\n };\n } else if (action.type === ActionType.EDIT_MODAL_CLOSED) {\n return {\n ...state,\n editModalShown: false,\n targetTagData: undefined,\n };\n } else if (action.type === ActionType.SET_FETCHING) {\n return {\n ...state,\n fetching: true,\n };\n } else if (action.type === ActionType.ON_UPSERT_FETCH_END) {\n if (!action.payload) {\n return { ...state, editModalShown: false, fetching: false };\n }\n\n const data: KeypadIndex = {\n ...state.data!,\n [action.payload.keypadTagId]: action.payload,\n };\n\n return {\n ...state,\n ...updateData(data),\n editModalShown: false,\n fetching: false,\n };\n } else if (action.type === ActionType.ON_ADD_NEW) {\n return {\n ...state,\n targetTagData: makeCustomKeypadTag({ keypadId: state.keypadId! }),\n creating: true,\n editModalShown: true,\n };\n } else if (action.type === ActionType.REMOVE_MODAL_SHOW) {\n return {\n ...state,\n targetTagData: action.payload,\n removeModalShown: true,\n };\n } else if (action.type === ActionType.REMOVE_MODAL_CANCEL) {\n return {\n ...state,\n removeModalShown: false,\n };\n } else if (action.type === ActionType.REMOVE_MODAL_CLOSED) {\n return {\n ...state,\n targetTagData: undefined,\n };\n } else if (action.type === ActionType.ON_REMOVE_FETCH_END) {\n if (!action.payload) {\n const data: KeypadIndex = {\n ...state.data!,\n };\n delete data[state.targetTagData!.keypadTagId!];\n return {\n ...state,\n ...updateData(data),\n fetching: false,\n removeModalShown: false,\n };\n }\n\n return {\n ...state,\n fetching: false,\n removeModalShown: false,\n };\n }\n return state;\n};\n\nexport const useKeypadEditScreenState = (params: { id: string }): [State, Dispatch] => {\n const [state, dispatch] = useReducer(reducer, {});\n\n // effects\n\n useEffect(() => {\n fetchKeypad({ id: params.id }).then((res) => {\n if (res.error) {\n return;\n }\n\n dispatch({ type: ActionType.SET_KEYPAD, payload: res.data });\n });\n }, [params.id]);\n\n // handlers\n\n const handleEnabledChange = useCallback((tag: KeypadTag, isEnabled: boolean) => {\n const prevItem = { ...tag };\n const nextItem: KeypadTag = { ...tag, isEnabled };\n\n fetchUpdateKeypadTag(nextItem).then((res) => {\n if (res.error) {\n dispatch({ type: ActionType.SET_ENABLED, payload: prevItem });\n }\n });\n\n dispatch({ type: ActionType.SET_ENABLED, payload: nextItem });\n }, []);\n\n const handleUpdateKeypadTag = useCallback((item: KeypadTag) => {\n dispatch({ type: ActionType.SET_FETCHING });\n\n fetchUpdateKeypadTag(item).then((res) => {\n dispatch({\n type: ActionType.ON_UPSERT_FETCH_END,\n payload: res.error ? undefined : item,\n });\n });\n }, []);\n\n const handleCreateKeypadTag = useCallback((item: KeypadTag) => {\n dispatch({ type: ActionType.SET_FETCHING });\n\n fetchCreateKeypadTag(item).then((res) => {\n dispatch({\n type: ActionType.ON_UPSERT_FETCH_END,\n payload: res.error ? undefined : item,\n });\n });\n }, []);\n\n const handleRemoveKeypadTag = useCallback((item: KeypadTag) => {\n dispatch({ type: ActionType.SET_FETCHING });\n\n fetchDeleteKeypadTag(item).then((res) => {\n dispatch({\n type: ActionType.ON_REMOVE_FETCH_END,\n payload: res.error,\n });\n });\n }, []);\n\n return [\n state,\n {\n dispatch,\n handleEnabledChange,\n handleUpdateKeypadTag,\n handleCreateKeypadTag,\n handleRemoveKeypadTag,\n },\n ];\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const CustomButtonsBoxContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n flex: '1',\n flexDirection: 'column',\n background: Colors.white,\n padding: theme.spacing(1),\n minHeight: '100%',\n}));\n\nexport const CustomButtonsBoxHeader = styled(Box)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n gap: theme.spacing(1),\n marginBottom: theme.spacing(2),\n}));\n\nexport const CustomButtonsBoxList = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n}));\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const CustomButtonsSkeletonContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n position: 'relative',\n}));\nexport const CustomButtonsSkeletonItem = styled(Box)(({ theme }) => ({\n background: Colors.athens,\n height: theme.spacing(8),\n}));\nexport const CustomButtonsSkeletonGradient = styled(Box)({\n position: 'absolute',\n top: '0',\n left: '0',\n right: '0',\n bottom: '0',\n background: `linear-gradient(to bottom, transparent 0%, ${Colors.white} 100%)`,\n});\n","import {\n CustomButtonsSkeletonContainer,\n CustomButtonsSkeletonGradient,\n CustomButtonsSkeletonItem,\n} from './index.styled';\n\nexport const CustomButtonsSkeleton = () => {\n return (\n <CustomButtonsSkeletonContainer>\n <CustomButtonsSkeletonItem />\n <CustomButtonsSkeletonItem />\n <CustomButtonsSkeletonItem />\n <CustomButtonsSkeletonGradient />\n </CustomButtonsSkeletonContainer>\n );\n};\n","import React from 'react';\n\ninterface Props {\n color: string;\n}\n\nexport const Dot = ({ color }: Props) => {\n return <span style={{ borderRadius: 4, width: '8px', height: '8px', backgroundColor: color }} />;\n};\n","import { Dispatch, useReducer } from 'react';\n\nexport type State = {\n enabled: boolean;\n more: boolean;\n};\n\nexport type InitialState = Pick<State, 'enabled'>;\n\nexport enum ActionType {\n ENABLED,\n MORE,\n}\n\nexport type Action = { type: ActionType.ENABLED; payload: boolean } | { type: ActionType.MORE; payload: boolean };\n\nconst reducer = (state: State, action: Action): State => {\n if (action.type === ActionType.ENABLED) {\n return {\n ...state,\n enabled: action.payload,\n };\n } else if (action.type === ActionType.MORE) {\n return {\n ...state,\n more: action.payload,\n };\n }\n return state;\n};\n\nexport const useEventButtonState = (initialState: InitialState): [State, Dispatch<Action>] => {\n const [state, dispatch] = useReducer(reducer, {\n more: false,\n enabled: initialState.enabled,\n });\n\n return [state, dispatch];\n};\n","import { Box, Button, Grid, Typography } from '@mui/material';\nimport classNames from 'classnames';\nimport { Colors } from 'kognia-ui';\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { KeypadTag } from 'api/tagging-tool/types';\nimport { Dot } from 'shared/components/dot';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport Toggle from 'shared/components/toggle';\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nimport styles from './EventButton.module.scss';\nimport { ActionType, useEventButtonState } from './state';\n\nexport type EventButtonProps = {\n data?: KeypadTag;\n className?: string;\n // color\n green?: boolean;\n purple?: boolean;\n orange?: boolean;\n // size\n mLong?: boolean;\n xlLong?: boolean;\n fullLong?: boolean;\n fullWidth?: boolean;\n flexLong?: boolean;\n flip?: boolean;\n // handlers\n onEdit?: (tag: KeypadTag) => void;\n onRemove?: (tag: KeypadTag) => void;\n onEnabledChange?: (tag: KeypadTag, enabled: boolean) => void;\n};\n\nexport const EventButton = (props: EventButtonProps) => {\n const kebabRef = useRef<HTMLDivElement | null>(null);\n const { t } = useTranslation();\n const [state, dispatch] = useEventButtonState({\n enabled: props.data?.isEnabled ?? false,\n });\n\n // effects\n\n useEffect(() => {\n dispatch({\n type: ActionType.ENABLED,\n payload: props.data?.isEnabled ?? false,\n });\n }, [dispatch, props.data?.isEnabled]);\n\n // forward handlers\n const handleEnabledChange = useCallback(() => {\n if (!props.data) {\n return;\n }\n const isEnabled = !props.data?.isEnabled;\n props.onEnabledChange?.(props.data, isEnabled);\n }, [props]);\n\n const handleEdit = useCallback(() => {\n if (!props.data) {\n return;\n }\n dispatch({ type: ActionType.MORE, payload: false });\n props.onEdit?.(props.data);\n }, [props, dispatch]);\n\n const handleRemove = useCallback(() => {\n if (!props.data) {\n return;\n }\n dispatch({ type: ActionType.MORE, payload: false });\n props.onRemove?.(props.data);\n }, [props, dispatch]);\n\n const isGrey = !state.enabled;\n const isPurple =\n !isGrey &&\n props.green !== true &&\n props.orange !== true &&\n (props.purple === true || props.data?.typeOfPlay === TypeOfPlay.Offense);\n const isOrange =\n !isGrey &&\n props.green !== true &&\n props.purple !== true &&\n (props.orange === true || props.data?.typeOfPlay === TypeOfPlay.Transition);\n const isGreen =\n !isGrey &&\n props.purple !== true &&\n props.orange !== true &&\n (props.green === true || props.data?.typeOfPlay === TypeOfPlay.Defense);\n\n const menuOptions: MenuListOption[] = useMemo(\n () => [\n {\n displayText: t('tagging-tool:keypad.edit'),\n icon: <IconEdit size='small' color='secondary' />,\n onClick: handleEdit,\n },\n {\n avoidCloseOnClick: true,\n displayText: (\n <Box className={styles.toggleContainer}>\n {t('tagging-tool:keypad.enabled-in-real-time')}{' '}\n <Toggle checked={props.data?.isEnabled === true} onClick={() => {}} />\n </Box>\n ),\n onClick: handleEnabledChange,\n },\n {\n isHidden: !props.data?.isCustom,\n displayText: t('common:actions.remove'),\n icon: <IconDelete size='small' color='secondary' />,\n onClick: handleRemove,\n },\n ],\n [handleEdit, handleEnabledChange, handleRemove, props.data?.isCustom, props.data?.isEnabled, t],\n );\n\n return (\n <Grid item sx={{ position: 'relative' }} className={props.className}>\n <div className={styles.buttonContainer}>\n <Button\n disableRipple\n onClick={handleEdit}\n className={classNames(props.className, styles.eventButton, {\n [styles.default]:\n props.mLong !== true && props.xlLong !== true && props.flip !== true && props.flexLong !== true,\n [styles.mLong]: props.mLong,\n [styles.xlLong]: props.xlLong,\n [styles.fullLong]: props.fullLong,\n [styles.fullWidth]: props.fullWidth,\n [styles.flip]: props.flip,\n [styles.flexLong]: props.flexLong,\n [styles.purple]: isPurple,\n [styles.green]: isGreen,\n [styles.orange]: isOrange,\n [styles.grey]: isGrey,\n })}\n >\n <>\n {props.flip !== true && (\n <Box alignItems={'center'} sx={{ display: 'flex', gap: '8px', justifyContent: 'center' }}>\n <Dot color={state.enabled ? Colors.green : Colors.night} />\n <Typography\n sx={{\n fontSize: '14px',\n color: Colors.night,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {props.data?.name ?? ''}\n </Typography>\n </Box>\n )}\n {props.flip === true && (\n <div className={styles.eventTextContainer}>\n <Typography\n sx={{\n fontSize: '14px',\n color: Colors.night,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n className={styles.eventText}\n >\n {props.data?.name ?? ''}\n </Typography>\n <Dot color={state.enabled ? Colors.green : Colors.night} />\n </div>\n )}\n </>\n </Button>\n <Box className={styles.verticalMenu}>\n <KebabMenu ref={kebabRef} options={menuOptions} id={'tagging-tool-clip'} />\n </Box>\n </div>\n </Grid>\n );\n};\n","import { Typography } from '@mui/material';\nimport { fontSizes, fontWeight } from 'kognia-ui';\nimport React, { ReactNode } from 'react';\n\nimport { KeypadTag } from 'api/tagging-tool/types';\n\nimport { CustomButtonsBoxContainer, CustomButtonsBoxHeader, CustomButtonsBoxList } from './styled';\nimport { CustomButtonsSkeleton } from '../../../custom-buttons-skeleton';\nimport { EventButton } from '../../../EventButton/EventButton';\n\ninterface Props {\n data: any;\n icon: ReactNode;\n onEdit: (payload: KeypadTag) => void;\n onRemove: (payload: KeypadTag) => void;\n onEnabledChange: (tag: KeypadTag, is_enabled: boolean) => void;\n title: string;\n}\n\nexport const CustomButtonsBox = ({ data, icon, onEdit, onEnabledChange, onRemove, title }: Props) => {\n return (\n <CustomButtonsBoxContainer>\n <CustomButtonsBoxHeader>\n {icon}\n <Typography fontSize={fontSizes.small} fontWeight={fontWeight['500']} textTransform='uppercase'>\n {title}\n </Typography>\n </CustomButtonsBoxHeader>\n {(data === undefined || data.length === 0) && <CustomButtonsSkeleton />}\n {data !== undefined && data.length > 0 && (\n <CustomButtonsBoxList>\n {data.map((custom: any) => {\n return (\n <EventButton\n key={custom.keypadTagId}\n data={custom}\n onEdit={onEdit}\n onEnabledChange={onEnabledChange}\n onRemove={onRemove}\n />\n );\n })}\n </CustomButtonsBoxList>\n )}\n </CustomButtonsBoxContainer>\n );\n};\n","import { Button, Grid, Typography } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { KeypadTag } from 'api/tagging-tool/types';\nimport IconDefense from 'shared/components/icons/icon-defense';\nimport IconOffense from 'shared/components/icons/icon-offense';\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport IconTransition from 'shared/components/icons/icon-transition';\n\nimport { CustomButtonsBox } from './components/custom-buttons-box';\nimport { CustomButtonsData } from '../keypad-edit/state';\n\ntype Props = {\n children?: React.ReactNode;\n data?: CustomButtonsData;\n handleAddNew: () => void;\n handleEdit: (payload: KeypadTag) => void;\n handleRemove: (payload: KeypadTag) => void;\n handleEnabledChange: (tag: KeypadTag, is_enabled: boolean) => void;\n};\n\nexport const CustomButtonPanel = ({ data, handleEdit, handleAddNew, handleEnabledChange, handleRemove }: Props) => {\n const { t } = useTranslation();\n\n return (\n <Grid container direction={'column'} spacing={2}>\n <Grid item display='flex' justifyContent='space-between' marginTop={8} alignItems='center'>\n <Typography variant={'h6'}>{t('tagging-tool:keypad.custom-buttons-title')}</Typography>\n <Button\n variant='outlined'\n color='secondary'\n startIcon={<IconPlus size='small' color='secondary' />}\n onClick={handleAddNew}\n >\n {t('tagging-tool:keypad.add-custom-button')}\n </Button>\n </Grid>\n <Grid item>\n <Typography color={Colors.storm} fontSize={fontSizes.default}>\n {t('tagging-tool:keypad.custom-buttons')}\n </Typography>\n </Grid>\n <Grid item display='flex' gap={1} paddingTop={2}>\n <CustomButtonsBox\n data={data?.offense}\n icon={<IconOffense size='small' color='secondary' />}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n onRemove={handleRemove}\n title={t('tagging-tool:keypad-tag.type-of-play-offense')}\n />\n <CustomButtonsBox\n data={data?.transition}\n icon={<IconTransition size='small' color='secondary' />}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n onRemove={handleRemove}\n title={t('tagging-tool:keypad-tag.type-of-play-transition')}\n />\n <CustomButtonsBox\n data={data?.defense}\n icon={<IconDefense size='small' color='secondary' />}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n onRemove={handleRemove}\n title={t('tagging-tool:keypad-tag.type-of-play-defense')}\n />\n </Grid>\n </Grid>\n );\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React from 'react';\n\nexport enum GoalVariant {\n NORTH = 'north',\n SOUTH = 'south',\n}\n\ninterface Props {\n variant: GoalVariant;\n}\n\nconst goalHeight = '16px';\nconst goalWidth = '96px';\n\nconst KeypadGoalWrapper = styled(Box, { shouldForwardProp: (prop) => prop !== 'variant' })<Props>(({ variant }) => ({\n width: goalWidth,\n height: goalHeight,\n background: Colors.iron,\n border: `1px solid ${Colors.storm}`,\n position: 'absolute',\n left: `calc(50% - (${goalWidth} / 2))`,\n ...(variant === GoalVariant.NORTH && {\n top: `-${goalHeight}`,\n borderBottom: 0,\n }),\n ...(variant === GoalVariant.SOUTH && {\n bottom: `-${goalHeight}`,\n borderTop: 0,\n }),\n}));\n\nexport const KeypadGoal = ({ variant }: Props) => {\n return <KeypadGoalWrapper variant={variant} aria-hidden={true} />;\n};\n","import { InputLabel, styled } from '@mui/material';\nimport { fontSizes, fontWeight } from 'kognia-ui';\n\nexport const FormInputLabel = styled(InputLabel)(({ theme }) => ({\n marginBottom: theme.spacing(0.5),\n fontWeight: fontWeight['500'],\n fontSize: fontSizes.default,\n}));\n","import { Box, styled, TextField } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\n\nexport const KeypadCustomButtonForm = styled('form')(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n}));\n\nexport const KeypadCustomButtonCutBox = styled(Box)(({ theme }) => ({\n background: Colors.shark,\n flex: '1 1 0',\n height: '40px',\n color: Colors.white,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: theme.shape.borderRadius,\n}));\n\nexport const KeypadSelectContainer = styled(Box)({\n flex: '1 1 0',\n});\n\nexport const KeypadFormItem = styled(Box)({\n display: 'flex',\n flexDirection: 'column',\n flex: '1 1 0',\n position: 'relative',\n});\n\nexport const KeypadFormRow = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'flex-end',\n justifyContent: 'space-between',\n gap: theme.spacing(2),\n}));\n\nexport const KeypadOptionalText = styled(Box)({\n position: 'absolute',\n right: 0,\n fontWeight: fontWeight['500'],\n fontSize: fontSizes.keypadOptionalText,\n color: Colors.storm,\n top: '3px',\n});\n\nexport const TextFieldExtended = styled(TextField)({\n '&:hover, &:focus': {\n '.MuiBox-root': {\n display: 'none',\n },\n },\n});\n\nexport const TimeframeEndAdornment = styled(Box)(({ theme }) => ({\n position: 'absolute',\n right: theme.spacing(1),\n background: Colors.athens,\n color: Colors.storm,\n fontSize: fontSizes.keypadOptionalText,\n fontWeight: fontWeight['500'],\n padding: theme.spacing(0.25, 0.5),\n display: 'flex',\n alignItems: 'center',\n borderRadius: theme.shape.borderRadius,\n height: '20px',\n}));\n","import { TypeOfPlay, TypeOfPlaySource } from 'shared/types/type-of-play/types';\n\nexport enum KeypadCustomButtonFieldsNames {\n NAME = 'name',\n TYPE_OF_PLAY = 'type_of_play',\n TYPE_OF_PLAY_SOURCE = 'type_of_play_source',\n TIMEFRAME_BEFORE = 'timeframe_before',\n TIMEFRAME_AFTER = 'timeframe_after',\n KEYBOARD_SHORTCUT = 'keyboard_shortcut',\n DESCRIPTION = 'description',\n}\n\nexport interface KeypadCustomButtonFormInputs {\n [KeypadCustomButtonFieldsNames.NAME]: string;\n [KeypadCustomButtonFieldsNames.TYPE_OF_PLAY]: TypeOfPlay;\n [KeypadCustomButtonFieldsNames.TYPE_OF_PLAY_SOURCE]: TypeOfPlaySource | null;\n [KeypadCustomButtonFieldsNames.TIMEFRAME_BEFORE]: number;\n [KeypadCustomButtonFieldsNames.TIMEFRAME_AFTER]: number;\n [KeypadCustomButtonFieldsNames.KEYBOARD_SHORTCUT]: string | null;\n [KeypadCustomButtonFieldsNames.DESCRIPTION]: string | null;\n}\n","import { ButtonBase } from '@mui/material';\nimport classNames from 'classnames';\nimport hotkeys, { KeyHandler } from 'hotkeys-js';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconKeyboard from 'shared/components/icons/icon-keyboard';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\n\nimport styles from './HotKeyInput.module.scss';\nimport {\n keyboardEventToKey,\n hotKeyToString,\n HotKey,\n hotKeyToPrintableString,\n} from '../../../../tagging-tool/utility/hotkeys';\n\nconst SCOPE = 'ktt::keypad_tag_form';\n\ntype FormControlProps<V> = {\n id?: string;\n name?: string;\n error?: boolean;\n disabled?: boolean;\n placeholder?: string;\n value?: V | null;\n onChange?: (value: V) => void;\n};\n\nexport type HotkeyInputProps = FormControlProps<string | null> & {\n initialValue?: string;\n className?: string;\n onRecordingChange?: (recording: boolean) => void;\n};\n\nexport const HotkeyInput = (props: HotkeyInputProps) => {\n const kebabRef = useRef<HTMLDivElement | null>(null);\n const [recording, setRecording] = useState<boolean>(false);\n const { t } = useTranslation();\n\n useEffect(() => {\n if (!recording) {\n return;\n }\n\n let fingers = 0;\n const keys: HotKey = [];\n props.onChange?.(null);\n\n const handler: KeyHandler = (ev) => {\n ev.preventDefault();\n\n if (ev.type === 'keyup') {\n fingers -= 1;\n } else if (!ev.repeat) {\n if (!hotkeys.command || fingers === 0) {\n fingers += 1;\n }\n\n const key = keyboardEventToKey(ev);\n if (key !== undefined && keys.indexOf(key) < 0) {\n keys.push(key);\n props.onChange?.(hotKeyToString([...keys]));\n }\n }\n\n if (fingers === 0) {\n setRecording(false);\n }\n\n return false;\n };\n\n hotkeys('*', { scope: SCOPE, keydown: true, keyup: true }, handler);\n hotkeys.setScope(SCOPE);\n\n return () => {\n hotkeys.unbind('*', SCOPE, handler);\n hotkeys.deleteScope(SCOPE);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recording]);\n\n useEffect(() => {\n props.onRecordingChange?.(recording);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recording]);\n\n const handleRecord = useCallback(() => {\n if (recording) {\n return;\n }\n setRecording(true);\n }, [recording]);\n\n const handleRestore = useCallback(() => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n props.onChange?.(props.initialValue!);\n }, [props]);\n\n const handleRemove = useCallback(() => {\n props.onChange?.(null);\n }, [props]);\n\n const showsRecordButton = recording || props.value === undefined || props.value === null;\n\n const menuOptions: MenuListOption[] = useMemo(\n () => [\n {\n displayText: t('tagging-tool:keypad-tag.record-new-shortcut'),\n onClick: handleRecord,\n },\n {\n isHidden: Boolean(!props.initialValue || props.initialValue === props.value),\n displayText: t('tagging-tool:keypad-tag.restore-previous-shortcut'),\n onClick: handleRestore,\n },\n {\n isHidden: Boolean(props.value === undefined || props.value === null),\n displayText: t('common:actions.remove'),\n onClick: handleRemove,\n },\n ],\n [handleRecord, handleRestore, handleRemove, props.initialValue, props.value, t],\n );\n\n return (\n <div\n className={classNames(\n styles.container,\n { [styles.errorText]: props.error, [styles.selected]: props.value },\n props.className,\n )}\n >\n <span className={styles.value}>\n {props.value ? hotKeyToPrintableString(props.value) : recording ? '' : props.placeholder ?? ''}\n </span>\n {showsRecordButton ? (\n <ButtonBase\n onClick={handleRecord}\n sx={{\n backgroundColor: (theme) => (recording ? theme.palette.error.main : theme.palette.grey[200]),\n p: 0.5,\n borderRadius: 1,\n }}\n >\n <IconKeyboard size='small' sx={{ color: recording ? 'common.white' : 'secondary.main' }} />\n </ButtonBase>\n ) : (\n <KebabMenu\n triggerComponent={<IconKeyboard size='small' color='secondary' />}\n ref={kebabRef}\n options={menuOptions}\n id={'hot-key-input'}\n />\n )}\n </div>\n );\n};\n","import { Box, MenuItem, Select, TextField, Typography } from '@mui/material';\nimport React, { useCallback, useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\n\nimport { KeypadTag } from 'api/tagging-tool/types';\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { FormInputLabel } from 'shared/components/form/form-input-label';\nimport IconTag from 'shared/components/icons/icon-tag';\nimport { TypeOfPlay, TypeOfPlaySource } from 'shared/types/type-of-play/types';\nimport { KeypadTagHotKeyResolver } from 'tagging-tool/utility/hotkeys';\n\nimport {\n KeypadCustomButtonCutBox,\n KeypadCustomButtonForm,\n KeypadFormItem,\n KeypadFormRow,\n KeypadOptionalText,\n KeypadSelectContainer,\n TextFieldExtended,\n TimeframeEndAdornment,\n} from './index.styled';\nimport { KeypadCustomButtonFieldsNames, KeypadCustomButtonFormInputs } from './types';\nimport { HotkeyInput } from '../hot-key-input/HotkeyInput';\n\nexport type KeypadItemFormModalProps = {\n data?: Partial<KeypadTag>;\n open: boolean;\n hotKeyResolver?: KeypadTagHotKeyResolver;\n onSave: (data: KeypadTag) => void;\n onClosed?: () => void;\n onCancel: () => void;\n};\n\ntype SelectOption<V> = {\n value: V;\n title: string;\n};\n\nconst initialValues: Partial<KeypadCustomButtonFormInputs> = {\n [KeypadCustomButtonFieldsNames.NAME]: '',\n [KeypadCustomButtonFieldsNames.KEYBOARD_SHORTCUT]: null,\n [KeypadCustomButtonFieldsNames.TIMEFRAME_BEFORE]: 5,\n [KeypadCustomButtonFieldsNames.TIMEFRAME_AFTER]: 5,\n [KeypadCustomButtonFieldsNames.DESCRIPTION]: null,\n [KeypadCustomButtonFieldsNames.TYPE_OF_PLAY_SOURCE]: null,\n};\n\nexport const KeypadTagFormModal = ({ open, data, onSave, onCancel }: KeypadItemFormModalProps) => {\n const { t } = useTranslation();\n\n const defaultValues = {\n [KeypadCustomButtonFieldsNames.NAME]: data?.name ? data.name : initialValues[KeypadCustomButtonFieldsNames.NAME],\n ...(data?.typeOfPlay && { [KeypadCustomButtonFieldsNames.TYPE_OF_PLAY]: data.typeOfPlay }),\n ...(data?.typeOfPlaySource && { [KeypadCustomButtonFieldsNames.TYPE_OF_PLAY_SOURCE]: data.typeOfPlaySource }),\n [KeypadCustomButtonFieldsNames.TIMEFRAME_BEFORE]:\n data?.timeBefore ?? initialValues[KeypadCustomButtonFieldsNames.TIMEFRAME_BEFORE],\n [KeypadCustomButtonFieldsNames.TIMEFRAME_AFTER]: data?.timeAfter\n ? data?.timeAfter\n : initialValues[KeypadCustomButtonFieldsNames.TIMEFRAME_AFTER],\n [KeypadCustomButtonFieldsNames.KEYBOARD_SHORTCUT]: data?.hotKey\n ? data?.hotKey\n : initialValues[KeypadCustomButtonFieldsNames.KEYBOARD_SHORTCUT],\n [KeypadCustomButtonFieldsNames.DESCRIPTION]: data?.description\n ? data?.description\n : initialValues[KeypadCustomButtonFieldsNames.DESCRIPTION],\n };\n\n const {\n register,\n formState,\n watch,\n setValue,\n getValues,\n handleSubmit: handleFormSubmit,\n } = useForm<KeypadCustomButtonFormInputs>({ defaultValues });\n\n const top1Options = useMemo<Array<SelectOption<TypeOfPlay>>>(() => {\n return [\n {\n title: t('tagging-tool:keypad-tag.type-of-play-offense'),\n value: TypeOfPlay.Offense,\n },\n {\n title: t('tagging-tool:keypad-tag.type-of-play-defense'),\n value: TypeOfPlay.Defense,\n },\n {\n title: t('tagging-tool:keypad-tag.type-of-play-transition'),\n value: TypeOfPlay.Transition,\n },\n ];\n }, [t]);\n\n const top2Options = useMemo<Array<SelectOption<TypeOfPlaySource>>>(() => {\n return [\n {\n title: t('tagging-tool:keypad-tag.type-of-play-individual'),\n value: TypeOfPlaySource.Individual,\n },\n {\n title: t('tagging-tool:keypad-tag.type-of-play-collective'),\n value: TypeOfPlaySource.Collective,\n },\n ];\n }, [t]);\n\n const handleSubmit = useCallback(() => {\n const keypadData: KeypadTag = {\n isEnabled: data!.isEnabled ?? false,\n isCustom: data!.isCustom ?? false,\n keypadId: data!.keypadId ?? '',\n keypadTagId: data!.keypadTagId ?? '',\n name: getValues(KeypadCustomButtonFieldsNames.NAME),\n typeOfPlay: getValues(KeypadCustomButtonFieldsNames.TYPE_OF_PLAY),\n typeOfPlaySource: getValues(KeypadCustomButtonFieldsNames.TYPE_OF_PLAY_SOURCE)\n ? getValues(KeypadCustomButtonFieldsNames.TYPE_OF_PLAY_SOURCE)\n : null,\n timeBefore: getValues(KeypadCustomButtonFieldsNames.TIMEFRAME_BEFORE),\n timeAfter: getValues(KeypadCustomButtonFieldsNames.TIMEFRAME_AFTER),\n hotKey: getValues(KeypadCustomButtonFieldsNames.KEYBOARD_SHORTCUT) ?? undefined,\n description: getValues(KeypadCustomButtonFieldsNames.DESCRIPTION),\n };\n onSave?.(keypadData);\n }, [data, getValues, onSave]);\n\n const typeOfPlayOptions = top1Options.map((item) => {\n return (\n <MenuItem key={item.value} value={item.value}>\n {item.title}\n </MenuItem>\n );\n });\n\n const typeOfPlaySourceOptions = top2Options.map((item) => {\n return (\n <MenuItem key={item.value} value={item.value}>\n {item.title}\n </MenuItem>\n );\n });\n\n const formIsDisabled =\n !watch(KeypadCustomButtonFieldsNames.NAME) ||\n !watch(KeypadCustomButtonFieldsNames.TYPE_OF_PLAY) ||\n (data?.isCustom === true && !watch(KeypadCustomButtonFieldsNames.TYPE_OF_PLAY_SOURCE)) ||\n !formState.isDirty;\n return (\n <DialogNew\n title={\n data?.name\n ? t('tagging-tool:keypad-tag.editing-button-details', { name: data.name })\n : t('tagging-tool:keypad-tag.creating-new')\n }\n icon={<IconTag size='small' />}\n onCancel={onCancel}\n onSubmit={handleSubmit}\n buttonSubmitText={t('common:actions.save')}\n open={open}\n fullWidth\n maxWidth='sm'\n submitDisabled={formIsDisabled}\n >\n <KeypadCustomButtonForm onSubmit={handleFormSubmit(handleSubmit)}>\n <Box>\n <FormInputLabel>Name</FormInputLabel>\n <TextField required fullWidth size='small' {...register(KeypadCustomButtonFieldsNames.NAME)} />\n </Box>\n <KeypadFormRow>\n <KeypadSelectContainer>\n <FormInputLabel id={`${KeypadCustomButtonFieldsNames.TYPE_OF_PLAY}-label`}>\n {t('tagging-tool:keypad-tag.type-of-play')}\n </FormInputLabel>\n <Select\n labelId={`${KeypadCustomButtonFieldsNames.TYPE_OF_PLAY}-label`}\n id={KeypadCustomButtonFieldsNames.TYPE_OF_PLAY}\n size='small'\n fullWidth\n value={watch(KeypadCustomButtonFieldsNames.TYPE_OF_PLAY)}\n {...register(KeypadCustomButtonFieldsNames.TYPE_OF_PLAY)}\n >\n {typeOfPlayOptions}\n </Select>\n </KeypadSelectContainer>\n <KeypadSelectContainer>\n <Select\n labelId={`${KeypadCustomButtonFieldsNames.TYPE_OF_PLAY_SOURCE}-label`}\n id={KeypadCustomButtonFieldsNames.TYPE_OF_PLAY_SOURCE}\n size='small'\n fullWidth\n value={watch(KeypadCustomButtonFieldsNames.TYPE_OF_PLAY_SOURCE)}\n {...register(KeypadCustomButtonFieldsNames.TYPE_OF_PLAY_SOURCE)}\n >\n {typeOfPlaySourceOptions}\n </Select>\n </KeypadSelectContainer>\n </KeypadFormRow>\n <KeypadFormRow>\n <KeypadSelectContainer>\n <FormInputLabel id={`${KeypadCustomButtonFieldsNames.TIMEFRAME_BEFORE}-label`}>\n {t('tagging-tool:keypad-tag.cut-time-frame')}\n </FormInputLabel>\n <TextFieldExtended\n id={KeypadCustomButtonFieldsNames.TIMEFRAME_BEFORE}\n size='small'\n fullWidth\n type={'number'}\n InputProps={{\n endAdornment: (\n <TimeframeEndAdornment>{t('tagging-tool:keypad-tag.seconds-after')}</TimeframeEndAdornment>\n ),\n }}\n {...register(KeypadCustomButtonFieldsNames.TIMEFRAME_BEFORE)}\n />\n </KeypadSelectContainer>\n <KeypadCustomButtonCutBox>\n <Typography>{t('tagging-tool:keypad-tag.cut')}</Typography>\n </KeypadCustomButtonCutBox>\n <KeypadSelectContainer>\n <TextFieldExtended\n id={KeypadCustomButtonFieldsNames.TIMEFRAME_AFTER}\n size='small'\n fullWidth\n type={'number'}\n InputProps={{\n endAdornment: (\n <TimeframeEndAdornment>{t('tagging-tool:keypad-tag.seconds-before')}</TimeframeEndAdornment>\n ),\n }}\n {...register(KeypadCustomButtonFieldsNames.TIMEFRAME_AFTER)}\n />\n </KeypadSelectContainer>\n </KeypadFormRow>\n <KeypadFormRow>\n <KeypadFormItem>\n <KeypadOptionalText>{t('common:actions.optional')}</KeypadOptionalText>\n <FormInputLabel>{t('tagging-tool:keypad-tag.shortcut')}</FormInputLabel>\n <HotkeyInput\n placeholder={t('tagging-tool:keypad-tag.shortcut-placeholder')}\n value={data?.hotKey ? data.hotKey : watch(KeypadCustomButtonFieldsNames.KEYBOARD_SHORTCUT)}\n onChange={(value) => setValue(KeypadCustomButtonFieldsNames.KEYBOARD_SHORTCUT, value)}\n />\n </KeypadFormItem>\n </KeypadFormRow>\n <KeypadFormRow>\n <KeypadFormItem>\n <KeypadOptionalText>{t('common:actions.optional')}</KeypadOptionalText>\n <FormInputLabel>{t('tagging-tool:keypad-tag.shortcut')}</FormInputLabel>\n <TextField\n fullWidth\n size='small'\n id={KeypadCustomButtonFieldsNames.DESCRIPTION}\n multiline\n rows={3}\n placeholder={t('tagging-tool:keypad-tag.description-placeholder')}\n {...register(KeypadCustomButtonFieldsNames.DESCRIPTION)}\n />\n </KeypadFormItem>\n </KeypadFormRow>\n </KeypadCustomButtonForm>\n </DialogNew>\n );\n};\n","import { DialogContentTextProps, styled } from '@mui/material';\nimport MuiDialogContentText from '@mui/material/DialogContentText';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nexport enum DialogTextVariants {\n Primary = 'primary',\n Secondary = 'secondary',\n}\n\ninterface DialogContentTextWrapperProps {\n textVariant: DialogTextVariants.Primary | DialogTextVariants.Secondary;\n}\n\nconst DialogContentTextWrapper = styled(MuiDialogContentText, {\n shouldForwardProp: (prop) => prop !== 'textVariant',\n})<DialogContentTextWrapperProps>(({ theme, textVariant }) => ({\n fontSize: fontSizes.default,\n color: textVariant === DialogTextVariants.Secondary ? Colors.storm : Colors.night,\n marginBottom: theme.spacing(1),\n}));\n\ninterface Props extends DialogContentTextProps {\n textVariant?: DialogTextVariants.Primary | DialogTextVariants.Secondary;\n}\n\nexport const DialogContentText = ({\n children,\n textVariant = DialogTextVariants.Secondary,\n textAlign = 'center',\n ...rest\n}: Props) => {\n return (\n <DialogContentTextWrapper textVariant={textVariant} textAlign={textAlign} {...rest}>\n {children}\n </DialogContentTextWrapper>\n );\n};\n","import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { KeypadTag } from 'api/tagging-tool/types';\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { DialogContentText, DialogTextVariants } from 'shared/components/dialog-new/dialog-content-text';\nimport IconKeypad from 'shared/components/icons/icon-keypad';\n\nexport type RemoveConfirmModalProps = {\n open: boolean;\n data?: Partial<KeypadTag>;\n onDelete: (tag: KeypadTag) => void;\n onCancel: () => void;\n onClosed: () => void;\n};\n\nexport const RemoveButtonModal = ({ open, data, onDelete, onCancel }: RemoveConfirmModalProps) => {\n const { t } = useTranslation();\n\n const handleSubmit = useCallback(() => {\n if (!data) {\n return;\n }\n onDelete(data as KeypadTag);\n }, [onDelete, data]);\n\n return (\n <DialogNew\n title={t('tagging-tool:keypad-tag.delete-modal-title')}\n icon={<IconKeypad size='small' color='error' />}\n onCancel={onCancel}\n open={open}\n fullWidth\n maxWidth='sm'\n onSubmit={handleSubmit}\n onClose={onCancel}\n buttonCancelText={t('common:actions.cancel')}\n buttonSubmitText={t('common:actions.remove')}\n error\n >\n <DialogContentText textVariant={DialogTextVariants.Primary}>\n {t('tagging-tool:keypad-tag.delete-modal-main-text', { name: data?.name ?? '' })}\n </DialogContentText>\n <DialogContentText>{t('tagging-tool:keypad-tag.delete-modal-text1')}</DialogContentText>\n <DialogContentText>{t('tagging-tool:keypad-tag.delete-modal-text2')}</DialogContentText>\n </DialogNew>\n );\n};\n","import Grid from '@mui/material/Grid';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { KeypadTag } from 'api/tagging-tool/types';\nimport Spinner from 'shared/components/spinner';\n\nimport {\n KeypadEditKeypadActions,\n KeypadEditKeypadActionsVariant,\n KeypadEditKeypadContainer,\n KeypadEditKeypadFault,\n KeypadEditKeypadHContent,\n KeypadEditKeypadMiddle,\n KeypadEditKeypadVContent,\n KeypadEditOffenseBottom,\n KeypadEditSubTitle,\n} from './index.styled';\nimport styles from './KeypadEditScreen.module.scss';\nimport { ActionType, useKeypadEditScreenState } from './state';\nimport { CustomButtonPanel } from '../custom-buttons';\nimport { EventButton } from '../EventButton/EventButton';\nimport { GoalVariant, KeypadGoal } from '../keypad-goal';\nimport { KeypadTagFormModal } from '../keypad-tag-form-modal';\nimport { RemoveButtonModal } from '../remove-button-modal';\n\ninterface Props {\n id: string;\n}\n\nexport const KeypadEdit = ({ id }: Props) => {\n const { t } = useTranslation();\n const [\n state,\n { dispatch, handleEnabledChange, handleUpdateKeypadTag, handleCreateKeypadTag, handleRemoveKeypadTag },\n ] = useKeypadEditScreenState({ id });\n\n const { data, customButtonsData } = state;\n\n const removeModalOpen = state.removeModalShown === true;\n const createButtonModalOpen = state.editModalShown === true;\n\n const handleEdit = useCallback(\n (payload: KeypadTag) => dispatch({ type: ActionType.EDIT_MODAL_SHOW, payload }),\n [dispatch],\n );\n const handleAddNew = useCallback(() => dispatch({ type: ActionType.ON_ADD_NEW }), [dispatch]);\n const handleModalCancel = useCallback(() => dispatch({ type: ActionType.EDIT_MODAL_CANCEL }), [dispatch]);\n const handleModalClosed = useCallback(() => dispatch({ type: ActionType.EDIT_MODAL_CLOSED }), [dispatch]);\n const handleRemoveModalShow = useCallback(\n (payload: KeypadTag) => dispatch({ type: ActionType.REMOVE_MODAL_SHOW, payload }),\n [dispatch],\n );\n const handleRemoveModalCancel = useCallback(() => dispatch({ type: ActionType.REMOVE_MODAL_CANCEL }), [dispatch]);\n const handleRemoveModalClosed = useCallback(() => dispatch({ type: ActionType.REMOVE_MODAL_CLOSED }), [dispatch]);\n\n return (\n <>\n <div>\n {data === undefined && <Spinner isFullPage />}\n {data !== undefined && (\n <Grid container direction={'column'} spacing={3}>\n <Grid item>\n <h4>{t('tagging-tool:keypad.generic-buttons-title')}</h4>\n <p>{t('tagging-tool:keypad.generic-buttons')}</p>\n </Grid>\n {/* main container */}\n <Grid item container spacing={3}>\n {/* left column: offense */}\n <Grid item xs={5}>\n <KeypadEditSubTitle variant={'h6'}>{t('tagging-tool:keypad.offense')}</KeypadEditSubTitle>\n {/* left top */}\n <Grid container item flexWrap={'wrap'} spacing={2}>\n <EventButton\n data={data['OFFENSE_L_CORNER']}\n className={styles.flex}\n fullLong\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <Grid item container direction={'column'} spacing={1} sx={{ flex: 1 }}>\n <EventButton\n data={data['OFFENSE_DIRECT_FAULT']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n data={data['OFFENSE_INDIRECT_FAULT']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n data={data['OFFENSE_PENALTY']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </Grid>\n <EventButton\n data={data['OFFENSE_R_CORNER']}\n className={styles.flex}\n fullLong\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </Grid>\n {/* left bottom */}\n <KeypadEditOffenseBottom>\n {/* left bottom left */}\n <EventButton\n data={data['OFFENSE_THROW_IN_L']}\n flip\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n {/* left bottom center */}\n <KeypadEditKeypadMiddle>\n <KeypadGoal variant={GoalVariant.NORTH} />\n <KeypadGoal variant={GoalVariant.SOUTH} />\n <KeypadEditKeypadHContent>\n <EventButton\n fullLong\n data={data['OFFENSE_L_CROSS']}\n className={styles.flex}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <KeypadEditKeypadVContent>\n <EventButton\n data={data['OFFENSE_GOAL_FAVOR']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n data={data['OFFENSE_GOAL_CHANCE']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </KeypadEditKeypadVContent>\n <EventButton\n data={data['OFFENSE_R_CROSS']}\n fullLong\n className={styles.flex}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </KeypadEditKeypadHContent>\n <KeypadEditKeypadActions variant={KeypadEditKeypadActionsVariant.TOP}>\n <EventButton\n mLong\n data={data['OFFENSE_FINALIZATION']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n xlLong\n data={data['OFFENSE_OFFENSE']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n mLong\n data={data['OFFENSE_GK_SHORT']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n data={data['OFFENSE_GK_LONG']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </KeypadEditKeypadActions>\n </KeypadEditKeypadMiddle>\n {/* left bottom right */}\n <EventButton\n data={data['OFFENSE_THROW_IN_R']}\n flip\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </KeypadEditOffenseBottom>\n </Grid>\n {/* middle column: transitions */}\n <Grid direction={'column'} justifyContent={'center'} item container sx={{ flex: 1 }} xs={2}>\n <Grid item>\n <KeypadEditSubTitle variant={'h6'}>{t('tagging-tool:keypad.transitions')}</KeypadEditSubTitle>\n </Grid>\n <Grid\n item\n container\n sx={{ flex: 1, gap: '8px', justifyContent: 'center', display: 'flex', flexDirection: 'column' }}\n >\n <EventButton\n data={data['TRANSITION_LOST_BALL']}\n fullLong\n fullWidth\n className={styles.eventButton}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n data={data['TRANSITION_BALL_RECOVERY']}\n fullLong\n fullWidth\n className={styles.eventButton}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </Grid>\n </Grid>\n {/* right column: */}\n <Grid direction={'column'} item sx={{ flex: 1 }} xs={5}>\n <Grid item>\n <KeypadEditSubTitle variant={'h6'}>{t('tagging-tool:keypad.defense')}</KeypadEditSubTitle>\n </Grid>\n <Grid item>\n {/* right top */}\n <KeypadEditKeypadContainer>\n {/* right top left */}\n <EventButton\n data={data['DEFENSE_THROW_IN_L']}\n flip\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n {/* right top middle */}\n <KeypadEditKeypadMiddle>\n <KeypadGoal variant={GoalVariant.NORTH} />\n <KeypadGoal variant={GoalVariant.SOUTH} />\n <KeypadEditKeypadActions variant={KeypadEditKeypadActionsVariant.BOTTOM}>\n <EventButton\n data={data['DEFENSE_GK_LONG']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n mLong\n data={data['DEFENSE_HIGH_PRESS']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n xlLong\n data={data['DEFENSE_DEFENSE']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n mLong\n data={data['DEFENSE_FINALIZATION']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </KeypadEditKeypadActions>\n <KeypadEditKeypadHContent>\n <EventButton\n data={data['DEFENSE_L_CROSS']}\n fullLong\n className={styles.flex}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <KeypadEditKeypadVContent>\n <EventButton\n data={data['DEFENSE_GOAL_CHANCE']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n data={data['DEFENSE_GOAL_AGAINST']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </KeypadEditKeypadVContent>\n <EventButton\n data={data['DEFENSE_R_CROSS']}\n fullLong\n className={styles.flex}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </KeypadEditKeypadHContent>\n </KeypadEditKeypadMiddle>\n {/* right top right */}\n <EventButton\n data={data['DEFENSE_THROW_IN_R']}\n flip\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </KeypadEditKeypadContainer>\n {/* right bottom */}\n <KeypadEditKeypadContainer>\n <EventButton\n fullLong\n data={data['DEFENSE_L_CORNER']}\n className={styles.flex}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <KeypadEditKeypadFault>\n <EventButton\n data={data['DEFENSE_DIRECT_FAULT']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n data={data['DEFENSE_INDIRECT_FAULT']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n <EventButton\n data={data['DEFENSE_PENALTY']}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </KeypadEditKeypadFault>\n <EventButton\n fullLong\n data={data['DEFENSE_R_CORNER']}\n className={styles.flex}\n onEdit={handleEdit}\n onEnabledChange={handleEnabledChange}\n />\n </KeypadEditKeypadContainer>\n </Grid>\n </Grid>\n </Grid>\n {/* custom buttons */}\n <CustomButtonPanel\n data={customButtonsData}\n handleAddNew={handleAddNew}\n handleEdit={handleEdit}\n handleEnabledChange={handleEnabledChange}\n handleRemove={handleRemoveModalShow}\n />\n </Grid>\n )}\n </div>\n {createButtonModalOpen ? (\n <KeypadTagFormModal\n open={createButtonModalOpen}\n data={state.targetTagData}\n hotKeyResolver={state.hotKeyResolver}\n onSave={state.creating === true ? handleCreateKeypadTag : handleUpdateKeypadTag}\n onClosed={handleModalClosed}\n onCancel={handleModalCancel}\n />\n ) : null}\n {removeModalOpen ? (\n <RemoveButtonModal\n open={removeModalOpen}\n data={state.targetTagData}\n onDelete={handleRemoveKeypadTag}\n onCancel={handleRemoveModalCancel}\n onClosed={handleRemoveModalClosed}\n />\n ) : null}\n </>\n );\n};\n","import { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useParams } from 'react-router-dom';\n\nimport Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\n\nimport { KeypadEdit } from './components/keypad-edit';\n\n// TODO: [refactor]: implement page state machine\n\nexport const KeypadEditPage = () => {\n const { id } = useParams<{ id: string }>();\n const { t } = useTranslation();\n const branding = useBranding();\n\n useEffect(() => {\n document.title = t('common:metas.title.keypads', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n return (\n <SidebarLayout>\n <Container>\n <KeypadEdit id={id} key={id} />\n </Container>\n </SidebarLayout>\n );\n};\n","import { Typography } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nexport const PageSubTitle = ({ children }: { children: React.ReactNode }) => {\n return (\n <Typography fontSize={fontSizes.default} color={Colors.storm}>\n {children}\n </Typography>\n );\n};\n","import { Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nexport const PageTitle = ({ children }: { children: React.ReactNode }) => {\n return (\n <Typography fontSize={fontSizes.xLarge} data-testid='page-title'>\n {children}\n </Typography>\n );\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\n\nexport const KeypadListItemContainer = styled(Box)(({ theme }) => ({\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n gap: '8px',\n background: Colors.white,\n width: '100%',\n padding: '0 8px',\n borderRadius: '4px',\n height: '96px',\n cursor: 'pointer',\n transition: theme.transitions.create('background'),\n '&:hover, &:focus, &:active': {\n background: Colors.athens,\n },\n}));\n\nexport const KeypadNameContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nexport const KeypadIconContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nexport const KeypadMenuWrapper = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: theme.spacing(2),\n right: theme.spacing(2),\n}));\n\nexport const KeypadDefaultBadge = styled(Box)(({ theme }) => ({\n background: Colors.athens,\n display: 'flex',\n alignItems: 'center',\n height: '20px',\n padding: theme.spacing(0.25, 0.5),\n borderRadius: theme.shape.borderRadius,\n fontSize: fontSizes.keypadBadge,\n fontWeight: fontWeight['500'],\n color: Colors.storm,\n}));\n","import { Typography } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconCopy from 'shared/components/icons/icon-copy';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport IconStar from 'shared/components/icons/icon-star';\nimport IconTag from 'shared/components/icons/icon-tag';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport Spinner from 'shared/components/spinner';\nimport { FetchKeypadsItem } from 'tagging-tool/service/keypad';\nimport { fetchUpdateKeypad } from 'tagging-tool/service/keypad.service';\n\nimport {\n KeypadDefaultBadge,\n KeypadIconContainer,\n KeypadListItemContainer,\n KeypadMenuWrapper,\n KeypadNameContainer,\n} from './index.styled';\n\nexport type KeypadListItemRowProps = {\n data: FetchKeypadsItem;\n onEdit: (data: FetchKeypadsItem) => void;\n onChangeName: (data: FetchKeypadsItem) => void;\n onDuplicate: (data: FetchKeypadsItem) => void;\n onSetDefault: (data: FetchKeypadsItem) => void;\n onRemove: (data: FetchKeypadsItem) => void;\n};\n\nexport const KeypadListItem = ({\n data,\n onEdit,\n onChangeName,\n onDuplicate,\n onSetDefault,\n onRemove,\n}: KeypadListItemRowProps) => {\n const kebabRef = useRef<HTMLDivElement | null>(null);\n const { t } = useTranslation();\n const [isDefaultLoading, setIsDefaultLoading] = useState<boolean>(false);\n\n const handleEdit = useCallback(() => onEdit(data), [data, onEdit]);\n const handleChangeName = useCallback(() => onChangeName(data), [data, onChangeName]);\n const handleDuplicate = useCallback(() => onDuplicate(data), [data, onDuplicate]);\n const handleRemove = useCallback(() => onRemove(data), [data, onRemove]);\n const handleSetDefault = useCallback(() => {\n const keypad: FetchKeypadsItem = { ...data, isDefault: true };\n setIsDefaultLoading(true);\n\n fetchUpdateKeypad(keypad).then((res) => {\n setIsDefaultLoading(false);\n\n if (!res.error) {\n onSetDefault(keypad);\n }\n });\n }, [data, onSetDefault]);\n\n const menuOptions: MenuListOption[] = useMemo(\n () => [\n {\n displayText: t('tagging-tool:keypad.menu-change-name'),\n icon: <IconEdit size='small' color='secondary' />,\n onClick: handleChangeName,\n },\n\n {\n displayText: t('tagging-tool:keypad.menu-duplicate'),\n icon: <IconCopy size='small' color='secondary' />,\n onClick: handleDuplicate,\n },\n {\n isHidden: data.isDefault,\n displayText: (\n <>\n {t('tagging-tool:keypad.menu-set-default')}\n {isDefaultLoading && <Spinner />}\n </>\n ),\n icon: <IconStar size='small' color='secondary' />,\n onClick: handleSetDefault,\n },\n {\n displayText: t('tagging-tool:keypad.menu-remove'),\n icon: <IconDelete size='small' color='secondary' />,\n onClick: handleRemove,\n isHidden: data.isDefault,\n },\n ],\n [handleChangeName, handleDuplicate, handleRemove, handleSetDefault, isDefaultLoading, data.isDefault, t],\n );\n\n return (\n <KeypadListItemContainer onClick={handleEdit}>\n <KeypadNameContainer>\n <Typography fontWeight={fontWeight['500']} fontSize={fontSizes.default}>\n {data.name}\n </Typography>\n {data.isDefault && <KeypadDefaultBadge>{t('tagging-tool:keypad.default-keypad')}</KeypadDefaultBadge>}\n </KeypadNameContainer>\n <KeypadIconContainer>\n <IconTag size='small' color='secondary' />\n <Typography fontSize={fontSizes.small} color={Colors.storm} fontWeight={fontWeight['500']}>\n {t('tagging-tool:keypad.button-counter', { count: data.nTags })}\n </Typography>\n </KeypadIconContainer>\n <KeypadMenuWrapper>\n <KebabMenu ref={kebabRef} options={menuOptions} id={data.id} />\n </KeypadMenuWrapper>\n </KeypadListItemContainer>\n );\n};\n","import { Button, TextField } from '@mui/material';\nimport React, { ChangeEvent, useCallback, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Dialog } from 'shared/components/dialog';\nimport { DialogActions } from 'shared/components/dialog/dialog-actions';\nimport { DialogButtonContainer } from 'shared/components/dialog/dialog-button-container';\nimport { DialogContent } from 'shared/components/dialog/dialog-content';\nimport { DialogHeader } from 'shared/components/dialog/dialog-header';\nimport IconKeypad from 'shared/components/icons/icon-keypad';\n\ninterface Props {\n open: boolean;\n name?: string;\n onSave: (name: string) => void;\n onCancel: () => void;\n}\n\nexport const KeypadNameModal = ({ open, name = '', onSave, onCancel }: Props) => {\n const [nameValue, setNameValue] = useState(name);\n const { t } = useTranslation();\n\n const isSubmitDisabled = useMemo(() => !nameValue, [nameValue]);\n\n const handleSubmit = useCallback(() => {\n if (isSubmitDisabled) return false;\n return onSave(nameValue);\n }, [isSubmitDisabled, nameValue, onSave]);\n\n const handleChangeName = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setNameValue(e.target.value);\n }, []);\n\n return (\n <Dialog open={open} maxWidth='sm' fullWidth onClose={onCancel}>\n <DialogHeader icon={<IconKeypad size='small' />}>{t('tagging-tool:keypad.change-name-modal-title')}</DialogHeader>\n <DialogContent>\n <TextField fullWidth size='small' value={nameValue} onChange={handleChangeName} />\n </DialogContent>\n <DialogActions>\n <DialogButtonContainer>\n <Button variant='contained' color='secondary' onClick={onCancel}>\n {t('common:actions.cancel')}\n </Button>\n </DialogButtonContainer>\n <DialogButtonContainer>\n <Button variant='contained' color='primary' onClick={handleSubmit} disabled={isSubmitDisabled}>\n {t('common:actions.save')}\n </Button>\n </DialogButtonContainer>\n </DialogActions>\n </Dialog>\n );\n};\n","import { Button } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Dialog } from 'shared/components/dialog';\nimport { DialogActions } from 'shared/components/dialog/dialog-actions';\nimport { DialogButtonContainer } from 'shared/components/dialog/dialog-button-container';\nimport { DialogContent } from 'shared/components/dialog/dialog-content';\nimport { DialogContentText, DialogTextVariants } from 'shared/components/dialog/dialog-content-text';\nimport { DialogHeader } from 'shared/components/dialog/dialog-header';\nimport IconKeypad from 'shared/components/icons/icon-keypad';\n\nexport type KeypadConfirmModalProps = {\n open: boolean;\n name?: string;\n onDelete: () => void;\n onCancel: () => void;\n};\n\nexport const KeypadRemoveModal = ({ open, name, onDelete, onCancel }: KeypadConfirmModalProps) => {\n const { t } = useTranslation();\n\n const handleSubmit = useCallback(() => {\n onDelete();\n }, [onDelete]);\n\n return (\n <Dialog open={open} onClose={onCancel} fullWidth maxWidth='sm'>\n <DialogHeader icon={<IconKeypad size='small' color='error' />}>\n {t('tagging-tool:keypad.delete-modal-title')}\n </DialogHeader>\n <DialogContent>\n <DialogContentText textVariant={DialogTextVariants.Primary}>\n {t('tagging-tool:keypad.delete-modal-main-text', { name })}\n </DialogContentText>\n <DialogContentText>{t('tagging-tool:keypad.delete-modal-text1')}</DialogContentText>\n <DialogContentText>{t('tagging-tool:keypad.delete-modal-text2')}</DialogContentText>\n </DialogContent>\n <DialogActions>\n <DialogButtonContainer>\n <Button onClick={onCancel} variant='outlined' color='secondary'>\n {t('common:actions.cancel')}\n </Button>\n </DialogButtonContainer>\n <DialogButtonContainer>\n <Button onClick={handleSubmit} variant='contained' color='error'>\n {t('common:actions.remove')}\n </Button>\n </DialogButtonContainer>\n </DialogActions>\n </Dialog>\n );\n};\n","import { Box, styled } from '@mui/material';\n\nexport const KeypadListContent = styled(Box)(({ theme }) => ({\n marginTop: theme.spacing(2),\n paddingTop: theme.spacing(2),\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n}));\n","import { sort } from 'fast-sort';\n\nconst comparer = new Intl.Collator(undefined, {\n numeric: true,\n sensitivity: 'base',\n}).compare;\n\nexport function sortArray<T>(params: { data: Array<T>; key: keyof T; asc?: boolean }): Array<T> {\n const { data, key, asc } = params;\n\n const f = (item: T) => item[key];\n const sortBy =\n asc === false\n ? {\n desc: f,\n }\n : {\n asc: f,\n };\n return sort(data).by({ ...sortBy, comparer });\n}\n\nexport function sortStringArray(data: Array<string>, asc = false): Array<string> {\n const f = (item: string) => item;\n const sortBy = !asc\n ? {\n desc: f,\n }\n : {\n asc: f,\n };\n return sort(data).by({ ...sortBy, comparer });\n}\n","import { Dispatch, useEffect, useReducer } from 'react';\n\nimport {\n FetchKeypadResponse,\n FetchKeypadsItem,\n FetchKeypadsResponse,\n FetchUpdateKeypadBody,\n} from '../../../../tagging-tool/service/keypad';\nimport {\n fetchCreateKeypad,\n fetchDuplicateKeypad,\n fetchDeleteKeypad,\n fetchKeypads,\n fetchUpdateKeypad,\n} from '../../../../tagging-tool/service/keypad.service';\nimport { sortArray } from '../../../../tagging-tool/utility/arrays';\n\nexport type State = {\n loading: boolean;\n fetching?: boolean;\n creating?: boolean;\n showNameModal?: boolean;\n showDeleteModal?: boolean;\n data?: FetchKeypadsResponse;\n targetKeypadData?: FetchKeypadsItem;\n cloningData?: { id?: string; name: string };\n updatingData?: FetchUpdateKeypadBody;\n deletingData?: { id: string };\n};\n\nexport enum ActionType {\n SET_DATA,\n UPDATE_NAME,\n SET_DEFAULT,\n NEW_KEYPAD,\n CLONE_KEYPAD,\n SUBMIT,\n SUBMIT_UPDATE_SUCCESS,\n SUBMIT_CREATE_SUCCESS,\n CANCEL_NAME_MODAL,\n CLOSED_NAME_MODAL,\n DELETE,\n CANCEL_DELETE_MODAL,\n CLOSED_DELETE_MODAL,\n SUBMIT_DELETE,\n SUBMIT_DELETE_SUCCESS,\n ERROR,\n}\n\nexport type Actions =\n | { type: ActionType.SET_DATA; payload: FetchKeypadsResponse }\n | { type: ActionType.UPDATE_NAME; payload: FetchKeypadsItem }\n | { type: ActionType.SET_DEFAULT; payload: FetchKeypadsItem }\n | { type: ActionType.NEW_KEYPAD }\n | { type: ActionType.CLONE_KEYPAD; payload: FetchKeypadsItem }\n | { type: ActionType.SUBMIT; payload: string }\n | { type: ActionType.SUBMIT_UPDATE_SUCCESS }\n | { type: ActionType.SUBMIT_CREATE_SUCCESS; payload: FetchKeypadResponse }\n | { type: ActionType.CANCEL_NAME_MODAL }\n | { type: ActionType.CLOSED_NAME_MODAL }\n | { type: ActionType.DELETE; payload: FetchKeypadsItem }\n | { type: ActionType.CANCEL_DELETE_MODAL }\n | { type: ActionType.CLOSED_DELETE_MODAL }\n | { type: ActionType.SUBMIT_DELETE }\n | { type: ActionType.SUBMIT_DELETE_SUCCESS; payload: string }\n | { type: ActionType.ERROR };\n\nconst reducer = (state: State, action: Actions): State => {\n if (action.type === ActionType.SET_DATA) {\n return {\n ...state,\n loading: false,\n data: sortArray({ data: action.payload, key: 'name' }),\n };\n } else if (action.type === ActionType.UPDATE_NAME) {\n return {\n ...state,\n showNameModal: true,\n creating: false,\n targetKeypadData: action.payload,\n };\n } else if (action.type === ActionType.SET_DEFAULT) {\n const current = action.payload;\n const data: FetchKeypadsResponse = state.data!.map((keypad) => {\n const isDefault = !current.isDefault ? keypad.isDefault : keypad.id === current.id;\n return {\n ...keypad,\n isDefault,\n };\n });\n return { ...state, data: sortArray({ data, key: 'name' }) };\n } else if (action.type === ActionType.NEW_KEYPAD) {\n return {\n ...state,\n showNameModal: true,\n creating: true,\n targetKeypadData: undefined,\n };\n } else if (action.type === ActionType.CLONE_KEYPAD) {\n return {\n ...state,\n showNameModal: true,\n creating: true,\n targetKeypadData: action.payload,\n };\n } else if (action.type === ActionType.SUBMIT) {\n if (state.fetching === true) {\n return state;\n } else if (state.creating !== true) {\n // just updating name\n const bodyUpdate: FetchKeypadsItem = {\n ...state.targetKeypadData!,\n name: action.payload,\n };\n return { ...state, fetching: true, updatingData: bodyUpdate };\n } else if (state.creating) {\n // creating\n return {\n ...state,\n fetching: true,\n cloningData: {\n id: state.targetKeypadData?.id,\n name: action.payload,\n },\n };\n }\n } else if (action.type === ActionType.SUBMIT_UPDATE_SUCCESS) {\n const current = state.updatingData!;\n const data: FetchKeypadsResponse = state.data!.map((keypad) => {\n const name = current.id === keypad.id ? current.name : keypad.name;\n return {\n ...keypad,\n name,\n };\n });\n return {\n ...state,\n data: sortArray({ data, key: 'name' }),\n fetching: false,\n showNameModal: false,\n };\n } else if (action.type === ActionType.SUBMIT_CREATE_SUCCESS) {\n const { id, name, isDefault, tags } = action.payload;\n const data: FetchKeypadsResponse = [...state.data!, { id, name, isDefault, nTags: tags.length }];\n return {\n ...state,\n data: sortArray({ data, key: 'name' }),\n fetching: false,\n showNameModal: false,\n };\n } else if (action.type === ActionType.CANCEL_NAME_MODAL) {\n return { ...state, showNameModal: false };\n } else if (action.type === ActionType.CLOSED_NAME_MODAL) {\n return { ...state, targetKeypadData: undefined };\n } else if (action.type === ActionType.DELETE) {\n return { ...state, showDeleteModal: true, targetKeypadData: action.payload };\n } else if (action.type === ActionType.CANCEL_DELETE_MODAL) {\n return { ...state, showDeleteModal: false };\n } else if (action.type === ActionType.CLOSED_DELETE_MODAL) {\n return { ...state, targetKeypadData: undefined };\n } else if (action.type === ActionType.SUBMIT_DELETE) {\n return {\n ...state,\n fetching: true,\n deletingData: { id: state.targetKeypadData!.id },\n };\n } else if (action.type === ActionType.SUBMIT_DELETE_SUCCESS) {\n const data = state.data!.filter((keypad) => keypad.id !== action.payload).map((keypad) => ({ ...keypad }));\n\n return {\n ...state,\n data: sortArray({ data, key: 'name' }),\n fetching: false,\n showDeleteModal: false,\n targetKeypadData: undefined,\n deletingData: undefined,\n };\n } else if (action.type === ActionType.ERROR) {\n return {\n ...state,\n loading: false,\n fetching: false,\n creating: false,\n showNameModal: false,\n showDeleteModal: false,\n };\n }\n return state;\n};\n\nexport const useKeypadListScreenState = (): [State, Dispatch<Actions>] => {\n const [state, dispatch] = useReducer(reducer, { loading: true });\n\n // on mount => fetch keypads\n\n useEffect(() => {\n fetchKeypads().then((res) => {\n if (res.error) {\n return dispatch({ type: ActionType.ERROR });\n }\n return dispatch({ type: ActionType.SET_DATA, payload: res.data });\n });\n }, []);\n\n // effect submit update\n\n useEffect(() => {\n if (!state.updatingData) {\n return;\n }\n\n fetchUpdateKeypad(state.updatingData).then((res) => {\n if (res.error) {\n return dispatch({ type: ActionType.ERROR });\n }\n\n dispatch({ type: ActionType.SUBMIT_UPDATE_SUCCESS });\n });\n }, [state.updatingData]);\n\n // effect submit cloning\n\n useEffect(() => {\n if (!state.cloningData) {\n return;\n }\n\n const { id, name } = state.cloningData;\n if (!id) {\n // new keypad based on generic\n fetchCreateKeypad({ name: name }).then((res) => {\n if (res.error) {\n return dispatch({ type: ActionType.ERROR });\n }\n\n dispatch({\n type: ActionType.SUBMIT_CREATE_SUCCESS,\n payload: { ...res.data },\n });\n });\n return;\n }\n\n fetchDuplicateKeypad({ id: id, name: name }).then((res) => {\n if (res.error) {\n return dispatch({ type: ActionType.ERROR });\n }\n\n dispatch({\n type: ActionType.SUBMIT_CREATE_SUCCESS,\n payload: { ...res.data },\n });\n });\n }, [state.cloningData]);\n\n // effect submit delete\n\n useEffect(() => {\n if (!state.deletingData) {\n return;\n }\n\n const { id } = state.deletingData!;\n\n fetchDeleteKeypad({ id }).then((res) => {\n if (res.error) {\n return dispatch({ type: ActionType.ERROR });\n }\n dispatch({\n type: ActionType.SUBMIT_DELETE_SUCCESS,\n payload: id,\n });\n });\n }, [state.deletingData]);\n\n return [state, dispatch];\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const AddKeypadButton = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'column',\n marginTop: theme.spacing(2),\n padding: theme.spacing(0, 1),\n width: '100%',\n height: '96px',\n background: Colors.athens,\n gap: theme.spacing(1),\n border: `1px dotted ${Colors.night}`,\n borderRadius: theme.shape.borderRadius,\n cursor: 'pointer',\n}));\n\nexport const AddKeypadButtonActionText = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n","import { Box, Typography } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\nimport React, { useCallback, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath, useHistory } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { PageSubTitle } from 'shared/components/page-sub-title';\nimport { PageTitle } from 'shared/components/page-title';\nimport Spinner from 'shared/components/spinner';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\n\nimport { KeypadListItem } from './components/keypad-list-item';\nimport { KeypadNameModal } from './components/keypad-name-modal';\nimport { KeypadRemoveModal } from './components/keypad-remove-modal';\nimport { KeypadListContent } from './index.styled';\nimport { ActionType, useKeypadListScreenState } from './state';\nimport { AddKeypadButton, AddKeypadButtonActionText } from './styled';\nimport { FetchKeypadsItem } from '../../../../tagging-tool/service/keypad';\n\nexport const KeypadListScreen = () => {\n const { t } = useTranslation();\n const history = useHistory();\n const [state, dispatch] = useKeypadListScreenState();\n const branding = useBranding();\n\n useEffect(() => {\n document.title = t('common:metas.title.keypads', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n const nameModalOpen = state.showNameModal === true;\n const removeKeypadModalOpen = state.showDeleteModal === true;\n\n const handleEdit = useCallback(\n (data: FetchKeypadsItem) => {\n history.push(\n generatePath(routes.KEYPADS_EDIT, {\n id: data.id,\n }),\n );\n },\n [history],\n );\n\n const handleAddNew = useCallback(() => {\n dispatch({ type: ActionType.NEW_KEYPAD });\n }, [dispatch]);\n\n const handleChangeName = useCallback(\n (payload: FetchKeypadsItem) => {\n dispatch({ type: ActionType.UPDATE_NAME, payload });\n },\n [dispatch],\n );\n\n const handleDuplicate = useCallback(\n (item: FetchKeypadsItem) => {\n const payload: FetchKeypadsItem = {\n ...item,\n name: t('tagging-tool:keypad.clone-name', { name: item.name }),\n };\n dispatch({ type: ActionType.CLONE_KEYPAD, payload });\n },\n [dispatch, t],\n );\n\n const handleSetDefault = useCallback(\n (payload: FetchKeypadsItem) => {\n dispatch({ type: ActionType.SET_DEFAULT, payload });\n },\n [dispatch],\n );\n\n const handleNameModalCancel = useCallback(() => {\n dispatch({ type: ActionType.CANCEL_NAME_MODAL });\n }, [dispatch]);\n\n const handleNameModalSave = useCallback(\n (payload: string) => {\n dispatch({ type: ActionType.SUBMIT, payload });\n },\n [dispatch],\n );\n\n const handleDelete = useCallback(\n (payload: FetchKeypadsItem) => {\n dispatch({ type: ActionType.DELETE, payload });\n },\n [dispatch],\n );\n\n const handleDeleteModalCancel = useCallback(() => {\n dispatch({ type: ActionType.CANCEL_DELETE_MODAL });\n }, [dispatch]);\n\n const handleDeleteModalSave = useCallback(() => {\n dispatch({ type: ActionType.SUBMIT_DELETE });\n }, [dispatch]);\n\n return (\n <>\n <div>\n {state.loading && <Spinner isFullPage />}\n {state.data !== undefined && (\n <Box>\n <PageTitle>{t('tagging-tool:keypad.keypad-list-title')}</PageTitle>\n <PageSubTitle>{t('tagging-tool:keypad.keypad-list')}</PageSubTitle>\n\n <KeypadListContent>\n <AddKeypadButton onClick={handleAddNew}>\n <AddKeypadButtonActionText>\n <IconPlus size='small' />\n <Typography fontWeight={fontWeight['500']} fontSize={fontSizes.default}>\n {t('tagging-tool:keypad.add-new')}\n </Typography>\n </AddKeypadButtonActionText>\n <Typography fontSize={fontSizes.small} color={Colors.storm}>\n {t('tagging-tool:keypad.based-on-generic-keypad')}\n </Typography>\n </AddKeypadButton>\n {state.data.map((data, idx) => {\n return (\n <KeypadListItem\n key={`keypad$${idx}`}\n data={data}\n onEdit={handleEdit}\n onChangeName={handleChangeName}\n onDuplicate={handleDuplicate}\n onSetDefault={handleSetDefault}\n onRemove={handleDelete}\n />\n );\n })}\n </KeypadListContent>\n </Box>\n )}\n </div>\n {nameModalOpen ? (\n <KeypadNameModal\n open={nameModalOpen}\n name={state.targetKeypadData?.name}\n onSave={handleNameModalSave}\n onCancel={handleNameModalCancel}\n />\n ) : null}\n {removeKeypadModalOpen ? (\n <KeypadRemoveModal\n open={state.showDeleteModal === true}\n name={state.targetKeypadData?.name}\n onDelete={handleDeleteModalSave}\n onCancel={handleDeleteModalCancel}\n />\n ) : null}\n </>\n );\n};\n","import Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\n\nimport { KeypadListScreen } from './components/keypad-list/KeypadListScreen';\n\nexport const KeypadListPage = () => {\n return (\n <SidebarLayout>\n <Container>\n <KeypadListScreen />\n </Container>\n </SidebarLayout>\n );\n};\n","import { useTranslation } from 'react-i18next';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { taggingEventBaseUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { TypeOfPlay, TypeOfPlaySource } from 'shared/types/type-of-play/types';\n\nimport { FetchCreateTaggingEventResponse } from '../../../tagging-tool/service/taggingEvent';\n\ninterface CreateNewTaggingEventBody {\n description?: string | null;\n id: string;\n name: string;\n recordingId: string;\n time: number;\n timeAfter: number;\n timeBefore: number;\n typeOfPlay: TypeOfPlay;\n typeOfPlaySource?: TypeOfPlaySource | null;\n isLive: boolean;\n}\n\nexport const useCreateTaggingEvent = () => {\n const { t } = useTranslation();\n\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest<\n FetchCreateTaggingEventResponse,\n FetchCreateTaggingEventResponse\n >({\n type: HTTPMethod.POST,\n errorMessage: t('api:create-tagging-event.error'),\n });\n\n const createTaggingEvent = ({\n data,\n onSuccess,\n }: {\n data: CreateNewTaggingEventBody;\n onSuccess: (res: FetchCreateTaggingEventResponse) => void;\n }) => {\n mutate({ url: taggingEventBaseUrl, data }, { onSuccess });\n };\n\n return { createTaggingEvent, isLoading, isError, isSuccess };\n};\n","import { useCallback, useRef } from 'react';\n\nimport { KeypadTag, TaggingEvent } from 'api/tagging-tool/types';\nimport { useCreateTaggingEvent } from 'api/tagging-tool/use-create-tagging-event';\nimport { useUser } from 'shared/contexts/app-state';\n\ninterface Options {\n onSuccess: (event: TaggingEvent) => void;\n recordingId: string;\n isLive: boolean;\n}\n\nexport const useCreateTaggingEventFromCurrentVideo = ({ onSuccess, recordingId, isLive }: Options) => {\n const { id } = useUser();\n const { createTaggingEvent } = useCreateTaggingEvent();\n const recordingIdRef = useRef<string>(recordingId);\n const recordingIsLiveRef = useRef<boolean>(isLive);\n\n const createTaggingEventFromCurrentVideo = useCallback(\n (time: number) => (keypadTag: KeypadTag) => {\n if (!id) return;\n\n const userId = id;\n const recordingId = recordingIdRef.current;\n const isLive = recordingIsLiveRef.current;\n\n const { name, description, timeBefore, timeAfter, typeOfPlay, typeOfPlaySource } = keypadTag;\n\n const taggingEvent: TaggingEvent = {\n id: '',\n recordingId,\n time,\n name,\n description,\n timeBefore,\n timeAfter,\n typeOfPlay,\n typeOfPlaySource,\n userId,\n };\n\n createTaggingEvent({\n data: {\n ...taggingEvent,\n isLive,\n },\n onSuccess,\n });\n },\n [onSuccess, createTaggingEvent, id],\n );\n\n return { createTaggingEventFromCurrentVideo };\n};\n","import { Grid, styled, Theme } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nconst scrollbarStyles = (theme: Theme) => ({\n bordeRadius: theme.shape.borderRadius,\n '&::-webkit-scrollbar': {\n WebkitAppearance: 'none',\n\n '&:vertical': {\n width: theme.spacing(1),\n },\n '&:horizontal': {\n height: theme.spacing(1),\n },\n },\n\n '&::-webkit-scrollbar-corner': {\n background: Colors.background,\n },\n\n '&::-webkit-scrollbar-track': {\n '&:horizontal': {\n background: Colors.athens,\n\n '&:hover': {\n background: Colors.ghost,\n },\n },\n },\n\n '&::-webkit-scrollbar-thumb': {\n borderRadius: '8px',\n backgroundColor: Colors.iron,\n\n '&:hover': {\n borderRadius: '8px',\n backgroundColor: Colors.storm,\n },\n },\n});\n\nexport const TagFilterBar = styled(Grid)(({ theme }) => ({\n ...scrollbarStyles(theme),\n padding: theme.spacing(2, 0),\n}));\n\nexport const TagsList = styled(Grid)(({ theme }) => ({\n ...scrollbarStyles(theme),\n overflowY: 'auto',\n maxHeight: '732px',\n marginTop: theme.spacing(1),\n}));\n","import { Keypad, KeypadApiResponse, KeypadsApiResponse, KeypadSimple } from '../../types';\n\nexport const transformKeypads = (keypads: KeypadsApiResponse): KeypadSimple[] => {\n return keypads.map((keypad) => ({\n id: keypad.id,\n name: keypad.name,\n isDefault: keypad.isDefault,\n numberOfTags: keypad.nTags,\n }));\n};\n\nexport const transformKeypad = (keypad: KeypadApiResponse): Keypad => {\n return {\n id: keypad.id,\n name: keypad.name,\n tags: keypad.tags.map((tag) => ({\n keypadId: tag.keypadId,\n keypadTagId: tag.keypadTagId,\n name: tag.name,\n typeOfPlay: tag.typeOfPlay,\n timeBefore: tag.timeBefore,\n timeAfter: tag.timeAfter,\n hotKey: tag.hotKey,\n description: tag.description,\n typeOfPlaySource: tag.typeOfPlaySource,\n isEnabled: tag.isEnabled,\n isCustom: tag.isCustom,\n })),\n };\n};\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { keypadUrl } from 'api/routes';\n\nimport { transformKeypad } from '../transformers/keypads';\nimport { Keypad } from '../types';\n\nexport const generateFetchKeypadQueryRef = (keypadId: [string]) => [`fetchKeypad-${keypadId[0]}`];\n\ninterface useFetchTaggingToolEventsInterface {\n (keypadId: [string]): UseQueryResult<Keypad>;\n}\n\nexport const useFetchKeypad: useFetchTaggingToolEventsInterface = (keypadId) => {\n const fetchQueryRef = generateFetchKeypadQueryRef(keypadId);\n return useFetchRequest<Keypad>({\n queryRef: fetchQueryRef,\n url: keypadUrl(keypadId[0] ? keypadId[0] : '-'),\n transformer: transformKeypad,\n options: {\n enabled: false,\n },\n });\n};\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { keypadsUrl } from 'api/routes';\n\nimport { transformKeypads } from '../transformers/keypads';\nimport { KeypadSimple } from '../types';\n\nexport const generateFetchKeypadsQueryRef = (recordingId: string) => [`fetchKeypads-${recordingId}`];\n\ninterface useFetchTaggingToolEventsInterface {\n (recordingId: string): UseQueryResult<KeypadSimple[]>;\n}\n\nexport const useFetchKeypads: useFetchTaggingToolEventsInterface = (recordingId) => {\n const fetchQueryRef = generateFetchKeypadsQueryRef(recordingId);\n const fetchRequest = useFetchRequest<KeypadSimple[]>({\n queryRef: fetchQueryRef,\n url: keypadsUrl(),\n transformer: transformKeypads,\n });\n\n return { ...fetchRequest };\n};\n","import { useCallback, useEffect, useReducer, useState } from 'react';\n\nimport { Keypad, KeypadSimple } from 'api/tagging-tool/types';\nimport { useFetchKeypad } from 'api/tagging-tool/use-fetch-keypad';\nimport { useFetchKeypads } from 'api/tagging-tool/use-fetch-keypads';\n\nexport type Index = {\n keypadsData?: KeypadSimple[];\n loadingKeypad?: boolean;\n keypadData?: Keypad;\n};\n\nexport enum ActionType {\n SET_KEYPADS_DATA,\n SET_KEYPAD,\n SET_LOADING_KEYPAD,\n}\n\nexport type Action =\n | {\n type: ActionType.SET_KEYPADS_DATA;\n keypads: KeypadSimple[];\n keypad: Keypad;\n }\n | {\n type: ActionType.SET_KEYPAD;\n keypad: Keypad;\n }\n | {\n type: ActionType.SET_LOADING_KEYPAD;\n loading: boolean;\n };\n\nexport type Dispatch = {\n handleChangeKeypad: (keypad: KeypadSimple) => void;\n};\n\nconst reducer = (state: Index, action: Action): Index => {\n switch (action.type) {\n case ActionType.SET_KEYPADS_DATA:\n const { keypads, keypad } = action;\n return {\n ...state,\n keypadsData: keypads,\n keypadData: keypad,\n loadingKeypad: false,\n };\n\n case ActionType.SET_KEYPAD:\n return {\n ...state,\n keypadData: action.keypad,\n loadingKeypad: false,\n };\n\n case ActionType.SET_LOADING_KEYPAD:\n const { loading: loadingKeypad } = action;\n return {\n ...state,\n loadingKeypad,\n };\n\n default:\n return state;\n }\n};\n\ninterface Params {\n recordingId: string;\n isLive: boolean;\n}\n\nexport const useKeypads = ({ recordingId }: Params): [Index, Dispatch] => {\n const [keypadId, setKeypadId] = useState('');\n const { data: keypads } = useFetchKeypads(recordingId);\n const { data: keypad, isError: isKeypadFetchError, refetch } = useFetchKeypad([keypadId]);\n const [state, dispatch] = useReducer(reducer, {});\n\n useEffect(() => {\n // CREATE KEYPAD IF IT DOES NOT EXIST\n if (!keypads?.length) {\n console.error('Did not find default keypad');\n return;\n }\n\n const defaultKeypad = keypads.filter((kp) => kp.isDefault);\n\n const { id } = defaultKeypad[0];\n setKeypadId(id);\n }, [keypads]);\n\n useEffect(() => {\n if (keypadId && refetch) {\n refetch();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [keypadId]);\n\n useEffect(() => {\n if (isKeypadFetchError) {\n dispatch({ type: ActionType.SET_LOADING_KEYPAD, loading: false });\n return;\n }\n\n if (keypad && keypads) {\n dispatch({ type: ActionType.SET_KEYPADS_DATA, keypads, keypad });\n }\n }, [keypad, isKeypadFetchError, keypads]);\n\n const handleChangeKeypad = useCallback((keypad: KeypadSimple) => {\n dispatch({ type: ActionType.SET_LOADING_KEYPAD, loading: true });\n\n const { id } = keypad;\n setKeypadId(id);\n }, []);\n\n return [\n state,\n {\n handleChangeKeypad,\n },\n ];\n};\n","import { IconButton, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const ClipPlayerDialogIconButton = styled(IconButton)(({ theme }) => ({\n position: 'absolute',\n top: theme.spacing(2),\n right: theme.spacing(2),\n color: Colors.white,\n zIndex: 100,\n}));\n","import { Dialog } from '@mui/material';\nimport { useEffect, useMemo, useRef } from 'react';\n\nimport IconClose from 'shared/components/icons/icon-close';\nimport { VideoPlayerStateProvider } from 'shared/components/video-player';\nimport { TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE } from 'shared/components/video-player/defaultPlayingModes';\nimport { PlaylistItemType, VideoSourceType } from 'shared/components/video-player/types';\nimport VideoPlayerComponent from 'shared/components/video-player/video-player-component';\nimport { defaultVideoAspectRatio } from 'shared/components/video-player/video-player-component/hooks/use-video-aspect-ratio';\n\nimport { ClipPlayerDialogIconButton } from './styled';\nimport { ClipPlayerData, TaggingToolVideoElement } from '../../types';\n\nexport type ClipPlayerModalProps = {\n data: ClipPlayerData;\n onCancel?: () => void;\n videoTypes: VideoSourceType[];\n};\n\nconst transformTaggingEventJobToPlaylistItem = (\n data: ClipPlayerData,\n videoTypes: VideoSourceType[],\n): PlaylistItemType => {\n const calcStartTime = data.event.time - data.event.timeBefore;\n const startTime = calcStartTime < 0 ? 0 : calcStartTime;\n const endTime = data.event.time + data.event.timeAfter;\n const duration = endTime - startTime;\n\n const videoTypesPreferred: VideoSourceType[] = videoTypes.map((videoType) => {\n return {\n ...videoType,\n videoSources: videoType.videoSources.map((videoSource) => {\n return {\n ...videoSource,\n startTime,\n endTime,\n };\n }),\n playingMode: videoType.playingMode,\n };\n });\n\n return {\n id: 'playing-tagging-tool-event',\n duration,\n videoTypes: videoTypesPreferred,\n fundamentalsSelected: {\n tacticalAnalysisId: undefined,\n fundamentalsSelected: [],\n },\n hasHomographies: false,\n recordingId: data.event.recordingId,\n };\n};\n\nexport const ClipPlayerDialog = (props: ClipPlayerModalProps) => {\n const playerElementRef = useRef<TaggingToolVideoElement>();\n\n const meta = useMemo<{ src: string; min: number; max: number } | undefined>(() => {\n const { event } = props.data;\n const { timeBefore, time, timeAfter } = event;\n\n const min = Math.max(0, Math.round(time - timeBefore));\n const max = Math.round(time + timeAfter);\n\n return { src: `${props.data.src}#t=${min},${max}`, min, max };\n }, [props.data]);\n\n useEffect(() => {\n if (!meta) {\n return;\n }\n\n const interval = setInterval(() => {\n if (!playerElementRef.current) {\n return;\n }\n\n const { currentTime } = playerElementRef.current;\n const { min, max } = meta;\n if (currentTime < min || currentTime > max) {\n playerElementRef.current.currentTime = min;\n }\n }, 911);\n return () => {\n clearInterval(interval);\n };\n }, [meta]);\n\n return (\n <Dialog open={true} onClose={props.onCancel} fullWidth maxWidth='lg'>\n <VideoPlayerStateProvider\n playerId={`clip-player-${props.data.id}`}\n playlistItems={[transformTaggingEventJobToPlaylistItem(props.data, props.videoTypes)]}\n playingMode={TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE}\n >\n <div style={{ aspectRatio: defaultVideoAspectRatio }}>\n <VideoPlayerComponent />\n </div>\n </VideoPlayerStateProvider>\n\n <ClipPlayerDialogIconButton onClick={props.onCancel}>\n <IconClose size='small' sx={{ color: 'common.white' }} />\n </ClipPlayerDialogIconButton>\n </Dialog>\n );\n};\n","import { Box, styled } from '@mui/material';\n\nexport const ClipTrimmerActions = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(2),\n}));\n","export const sanitizeString = (s: any): string | undefined => {\n if (typeof s !== 'string') {\n return undefined;\n }\n return s.trim().length === 0 ? undefined : s;\n};\n\nexport const sanitizeNumber = (n: any): number | undefined => {\n if (typeof n !== 'number') {\n return undefined;\n }\n return n;\n};\n","import { transformRecordingVideoSources } from 'api/match/transformers/match/matchWithEpisodes';\nimport {\n cropTaggingEventUrl,\n exportTaggingEventUrl,\n importTaggingEventUrl,\n matchOrLiveTaggingEventsUrl,\n matchTaggingEventUrl,\n taggingEventBaseUrl,\n} from 'api/routes';\nimport { getDefaultVideoSource } from 'shared/utils/get-video-sources';\n\nimport { fetchRequest, FetchRequestOptions } from './base';\nimport {\n FetchCreateTaggingEventResponse,\n FetchDeleteTaggingEventsParams,\n FetchExportTaggingEventsParams,\n FetchRenameTaggingEventParams,\n FetchTaggingEventsParams,\n FetchTaggingEventsResponse,\n FetchTrimTaggingEventParams,\n FetchUploadImportedTaggingEventsParams,\n FetchUploadImportedTaggingEventsResponse,\n} from './taggingEvent';\nimport { sanitizeNumber, sanitizeString } from '../utility/sanitizer';\n\nexport const fetchTaggingEvents = (params: FetchTaggingEventsParams, options?: Partial<FetchRequestOptions>) => {\n return fetchRequest<FetchTaggingEventsResponse>({\n ...options,\n url: matchOrLiveTaggingEventsUrl(params.recordingId, params.isLive ?? false),\n }).then((res) => {\n if (res.error) {\n return res;\n }\n\n const { videoSources, name, date, startRecordingTime, data } = res.data;\n\n const mutatedVideoSources = transformRecordingVideoSources(videoSources) || [];\n\n const taggingEvents = data.map((event) => ({\n description: event.description,\n id: event.id,\n name: event.name,\n recordingId: event.recordingId,\n time: event.time,\n timeAfter: event.timeAfter,\n timeBefore: event.timeBefore,\n typeOfPlay: event.typeOfPlay,\n typeOfPlaySource: event.typeOfPlaySource,\n userId: event.userId,\n }));\n\n return {\n ...res,\n data: {\n ...res.data,\n data: taggingEvents.sort((r1, r2) => {\n if (r1.time === r2.time) {\n return 0;\n } else if (r1.time < r2.time) {\n return params.asc === true ? -1 : 1;\n }\n return params.asc === true ? 1 : -1;\n }),\n startRecordingTime: sanitizeNumber(startRecordingTime),\n name: sanitizeString(name) || 'No name',\n date: sanitizeString(date) || '',\n videoSources: mutatedVideoSources,\n matchVideoSource: getDefaultVideoSource(mutatedVideoSources),\n },\n };\n });\n};\n\nexport const fetchDeleteTaggingEvent = (params: FetchDeleteTaggingEventsParams) => {\n return fetchRequest<FetchCreateTaggingEventResponse>({\n method: 'delete',\n url: taggingEventBaseUrl,\n body: params.taggingEventsIds,\n });\n};\n\nexport const fetchRenameTaggingEvent = (params: FetchRenameTaggingEventParams) => {\n const { name, taggingEventId } = params;\n return fetchRequest<FetchCreateTaggingEventResponse>({\n method: 'put',\n url: matchTaggingEventUrl(taggingEventId),\n body: { name },\n });\n};\n\nexport const fetchUploadImportedTaggingEvents = (params: FetchUploadImportedTaggingEventsParams) => {\n const { recordingId, data: body } = params;\n return fetchRequest<FetchUploadImportedTaggingEventsResponse>({\n method: 'post',\n url: importTaggingEventUrl(recordingId),\n body,\n });\n};\n\nexport const fetchExportTaggingEvents = (params: FetchExportTaggingEventsParams) => {\n const { recordingId, isLive } = params;\n return fetchRequest<string>({\n url: exportTaggingEventUrl(recordingId, isLive),\n });\n};\n\nexport const fetchTrimTaggingEvent = (params: FetchTrimTaggingEventParams) => {\n const { taggingEventId, ...body } = params;\n return fetchRequest<FetchCreateTaggingEventResponse>({\n method: 'put',\n url: cropTaggingEventUrl(taggingEventId),\n body,\n });\n};\n","import { Box, Button, Slider, Tooltip } from '@mui/material';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TaggingEvent } from 'api/tagging-tool/types';\nimport { useDuration, useVideoPlayerActions } from 'shared/components/video-player';\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nimport { ClipTrimmerActions } from './styled';\nimport { fetchTrimTaggingEvent } from '../../../../tagging-tool/service/taggingEvent.service';\nimport { secondsToTimeString } from '../../../../tagging-tool/utility/date';\n\nconst MIN_RANGE_TIME = 60;\nconst RESCALE_FACTOR = 3;\n\nconst ValueLabelComponent = (props: { children: React.ReactElement; value: number }) => {\n const { children, value } = props;\n\n return (\n <Tooltip open={true} placement='top' title={value}>\n {children}\n </Tooltip>\n );\n};\n\ntype State = {\n min: number;\n max: number;\n value: [number, number];\n};\n\nconst updateState = (event: TaggingEvent, duration: number): State => {\n const { timeBefore, time, timeAfter } = event;\n\n const range = Math.max((timeBefore + timeAfter) * RESCALE_FACTOR, MIN_RANGE_TIME);\n const max = Math.round(range / 2);\n const min = -max;\n\n let valueLeft = -timeBefore;\n let valueRight = timeAfter;\n if (time - -valueLeft <= 0) {\n valueLeft = -time;\n }\n if (time + valueRight > duration) {\n valueRight = duration - time;\n }\n\n return {\n min,\n max,\n value: [valueLeft, valueRight],\n };\n};\n\ntype ClipTrimmerProps = {\n className?: string;\n event: TaggingEvent;\n onSave: (event: TaggingEvent) => void;\n onCancel: () => void;\n};\n\nexport const ClipTrimmer = (props: ClipTrimmerProps) => {\n const duration = useDuration();\n const actions = useVideoPlayerActions();\n const { t } = useTranslation();\n\n const [state, setState] = useState<State>(() => updateState(props.event, duration ?? Number.MAX_SAFE_INTEGER));\n const [loading, setLoading] = useState<boolean>(false);\n\n const style = useMemo(() => {\n const { typeOfPlay } = props.event;\n const color =\n typeOfPlay === TypeOfPlay.Offense ? '#5440f7' : typeOfPlay === TypeOfPlay.Defense ? '#0bb07b' : '#facd75';\n return { color };\n }, [props.event]);\n\n useEffect(() => {\n setState(updateState(props.event, duration ?? Number.MAX_SAFE_INTEGER));\n\n actions.jumpToTimePercent((props.event.time * 100) / duration);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.event]);\n\n const handleSave = useCallback(async () => {\n setLoading(true);\n\n const times = {\n timeBefore: -state.value[0],\n timeAfter: state.value[1],\n };\n\n await fetchTrimTaggingEvent({\n recordingId: props.event.recordingId,\n taggingEventId: props.event.id,\n time: props.event.time,\n ...times,\n });\n\n setLoading(false);\n\n props.onSave({\n ...props.event,\n ...times,\n });\n\n actions.resumeStandBy();\n }, [actions, props, state.value]);\n\n const handleCancel = useCallback(() => {\n actions.resumeStandBy();\n props.onCancel();\n }, [actions, props]);\n\n return (\n <Box marginTop={5}>\n <Slider\n {...state}\n style={style}\n marks={[\n {\n value: 0,\n label: secondsToTimeString(state.value[1] + -state.value[0]),\n },\n ]}\n valueLabelFormat={(v) => {\n return secondsToTimeString(props.event.time + v);\n }}\n components={{\n ValueLabel: ValueLabelComponent,\n }}\n valueLabelDisplay='on'\n aria-labelledby='range-slider'\n onChange={(_ev, newValue) => {\n let [left, right] = newValue as [number, number];\n const { time } = props.event;\n\n if (left !== state.value[0]) {\n if (left >= 0) {\n left = -1;\n }\n if (time + left <= 0) {\n left = -time;\n }\n\n actions.jumpToTimePercent(((time + left) * 100) / duration);\n }\n if (right !== state.value[1]) {\n if (right <= 0) {\n right = 1;\n }\n if (time + right > duration) {\n right = duration - time;\n }\n\n actions.jumpToTimePercent(((time + right) * 100) / duration);\n }\n\n setState({ ...state, value: [left, right] });\n }}\n onChangeCommitted={(_ev, newValue) => {\n const value = newValue as [number, number];\n const [left, right] = value;\n\n const { time } = props.event;\n const factor =\n (left === state.min && time + left >= 0) || (right === state.max && time + right < duration)\n ? RESCALE_FACTOR\n : 1;\n\n setState({\n ...state,\n min: state.min * factor,\n max: state.max * factor,\n });\n }}\n />\n <ClipTrimmerActions>\n <Button variant='contained' size='large' color='secondary' onClick={handleCancel} disabled={loading}>\n {t('common:actions.cancel')}\n </Button>\n <Button variant='contained' size='large' onClick={handleSave} disabled={loading}>\n {t('common:actions.save')}\n </Button>\n </ClipTrimmerActions>\n </Box>\n );\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const SectionContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n}));\n\nexport const SectionContent = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(2),\n}));\n\nexport const SectionGroup = styled(Box)(({ theme }) => ({\n display: 'flex',\n flex: '1',\n gap: theme.spacing(1),\n}));\n\nexport const SectionChild = styled(Box)(() => ({\n flex: 1,\n border: `1px solid ${Colors.white}`,\n}));\n","/* eslint-disable react/display-name */\nimport { Typography } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\nimport React from 'react';\n\nimport { SectionChild, SectionContainer, SectionContent, SectionGroup } from './styled';\nimport { TagButtonProps } from '../../../tag-button/TagButtonBase';\n\ntype SectionChildren<T> = React.ReactElement<T> | Array<React.ReactElement<T>>;\n\ntype SectionColProps = {\n children: React.ReactElement<TagButtonProps>;\n};\n\ntype SectionRowProps = {\n children?: SectionChildren<SectionColProps>;\n};\n\ntype SectionProps = {\n children?: SectionChildren<SectionRowProps>;\n title: string;\n};\n\nexport const Section = (props: SectionProps) => {\n const rowChildrenCounterMap: Array<number> = [];\n const colMap: Array<Array<number>> = [];\n let childrenCounter = 0;\n React.Children.forEach(props.children, (row, rowIdx) => {\n let currentRowCounter = 0;\n colMap[rowIdx] = [];\n\n React.Children.forEach(row?.props.children, (col) => {\n React.Children.forEach(col?.props.children, (tag) => {\n const inc = tag !== undefined && tag.props.data.isEnabled ? 1 : 0;\n childrenCounter += inc;\n currentRowCounter += inc;\n colMap[rowIdx].push(inc);\n });\n });\n rowChildrenCounterMap.push(currentRowCounter);\n });\n\n if (childrenCounter === 0) {\n return null;\n }\n\n return (\n <>\n <Section.Title title={props.title} />\n <SectionContainer>\n {React.Children.map(props.children, (row, rowIdx) => {\n if (rowChildrenCounterMap[rowIdx] === 0) {\n return null;\n }\n\n const cols = React.Children.count(row?.props.children);\n let col_a: React.ReactNode;\n let col_b: React.ReactNode;\n let col_c: React.ReactNode;\n let col_d: React.ReactNode;\n React.Children.forEach(row?.props.children, (col, colIdx) => {\n const nextCol: React.ReactNode = colMap[rowIdx][colIdx] === 1 ? col?.props.children : <SectionChild />;\n\n if (colIdx === 0) {\n col_a = nextCol;\n } else if (colIdx === 1) {\n if (cols === 4) {\n col_b = nextCol;\n } else if (cols === 2) {\n col_c = nextCol;\n }\n } else if (colIdx === 2) {\n col_c = nextCol;\n } else if (colIdx === 3) {\n col_d = nextCol;\n }\n });\n\n return (\n <SectionContent>\n <SectionGroup>\n {col_a}\n {col_b}\n </SectionGroup>\n <SectionGroup>\n {col_c}\n {col_d}\n </SectionGroup>\n </SectionContent>\n );\n })}\n </SectionContainer>\n </>\n );\n};\n\nSection.Row = (_props: SectionRowProps) => {\n return null;\n};\n\nSection.Col = (_props: SectionColProps) => {\n return null;\n};\n\nSection.Title = (props: { title: string }) => {\n return (\n <Typography\n fontSize={fontSizes.small}\n color={Colors.storm}\n marginTop={2}\n textTransform='uppercase'\n fontWeight={fontWeight['500']}\n >\n {props.title}\n </Typography>\n );\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\ninterface KeypadPanelContainerProps {\n disabled?: boolean;\n}\n\nexport const KeypadPanelContainer = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'disabled',\n})<KeypadPanelContainerProps>(({ disabled }) => ({\n background: Colors.white,\n ...(disabled && {\n opacity: 0.3,\n pointerEvents: 'none',\n filter: 'grayscale(100%)',\n }),\n}));\n\nexport const KeypadsPanelTopBar = styled(Box)(({ theme }) => ({\n background: Colors.iron,\n padding: theme.spacing(1),\n position: 'relative',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n}));\n\nexport const KeypadsPanelKickOffTags = styled(Box)(({ theme }) => ({\n display: 'flex',\n padding: theme.spacing(2, 1, 0, 1),\n gap: theme.spacing(1),\n}));\n\nexport const KeypadsPanelTitlesContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: theme.spacing(3, 0.5, 0, 0.5),\n gap: theme.spacing(1),\n}));\n\nexport const KeypadsPanelTitleContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(2),\n justifyContent: 'center',\n alignItems: 'center',\n flex: '1',\n margin: '0',\n}));\n\nexport const KeypadPanelSections = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.5),\n padding: theme.spacing(0, 2, 2),\n}));\n\nexport const KeypadPanelCustomButtons = styled(Box)(({ theme }) => ({\n padding: theme.spacing(2),\n}));\n\nexport const KeypadPanelCustomButtonsContent = styled(Box)(({ theme }) => ({\n display: 'flex',\n marginTop: theme.spacing(0.5),\n gap: theme.spacing(1),\n alignItems: 'flex-start',\n}));\n\nexport const KeypadPanelCustomButtonsColumn = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n gap: theme.spacing(0.5),\n}));\n","import React, { CSSProperties, useMemo, useRef } from 'react';\nimport { useLongPress } from 'use-long-press';\n\nexport type ButtonProps = {\n submit?: boolean;\n disabled?: boolean;\n className?: string;\n style?: CSSProperties;\n children?: React.ReactNode;\n onPress?: () => void;\n onPressStart?: () => void;\n onPressEnd?: () => void;\n onLongPress?: () => void;\n onAnimationEnd?: () => void;\n onClick?: () => void;\n};\n\nexport const Button = (props: ButtonProps) => {\n const { onPress, onPressStart, onPressEnd, onLongPress, onAnimationEnd, submit, ...buttonProps } = props;\n\n const pressTriggeredRef = useRef<boolean>(false);\n const longPressTriggeredRef = useRef<boolean>(false);\n\n const opts = useMemo(() => {\n return {\n onStart: () => {\n longPressTriggeredRef.current = false;\n pressTriggeredRef.current = false;\n onPressStart?.();\n },\n onCancel: () => {\n pressTriggeredRef.current = true;\n onPressEnd?.();\n if (!longPressTriggeredRef.current) {\n onPress?.();\n }\n },\n onFinish: () => {\n pressTriggeredRef.current = true;\n onPressEnd?.();\n if (!longPressTriggeredRef.current) {\n onPress?.();\n }\n },\n onLongPress: () => {\n longPressTriggeredRef.current = true;\n onLongPress?.();\n },\n onClick: (ev: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n ev.preventDefault();\n if (pressTriggeredRef.current || longPressTriggeredRef.current) {\n return;\n }\n onPress?.();\n },\n };\n }, [onLongPress, onPress, onPressStart, onPressEnd]);\n\n const bind = useLongPress(opts.onLongPress, opts);\n\n return (\n <button\n {...buttonProps}\n onAnimationEnd={onAnimationEnd}\n type={submit === true ? 'submit' : 'button'}\n onClick={props.onClick ?? opts.onClick}\n {...bind}\n />\n );\n};\n","import { Tooltip, Typography } from '@mui/material';\nimport classNames from 'classnames';\nimport hotkeys, { KeyHandler } from 'hotkeys-js';\nimport { fontSizes } from 'kognia-ui';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { KeypadTag } from 'api/tagging-tool/types';\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nimport { Button } from './Button';\nimport styles from './TagButtonBase.module.scss';\nimport { HOTKEY_SPLIT_KEY, hotKeyToPrintableString } from '../../../../tagging-tool/utility/hotkeys';\n\nexport type TagButtonProps = {\n data: KeypadTag;\n className?: string;\n width?: 'full' | 'flex';\n // color\n green?: boolean;\n purple?: boolean;\n orange?: boolean;\n};\n\nexport const TagButtonBase = (props: TagButtonProps & { onPress?: (tag: KeypadTag) => void }) => {\n const { data } = props;\n const { t } = useTranslation();\n\n const [pressing, setPressing] = useState<boolean>(false);\n const [animate, setAnimate] = useState<boolean>(false);\n const [showTooltip, setShowTooltip] = useState<boolean>(false);\n\n // effects\n\n useEffect(() => {\n const key = props.data?.hotKey ?? null;\n if (key === null) {\n return;\n }\n\n const handler: KeyHandler = (ev) => {\n ev.preventDefault();\n\n props.onPress?.(props.data);\n setAnimate(true);\n return false;\n };\n hotkeys(key, { splitKey: HOTKEY_SPLIT_KEY }, handler);\n\n return () => {\n // any since this unbind call it's neither documented nor in their typings\n hotkeys.unbind({ key, splitKey: HOTKEY_SPLIT_KEY } as any, handler);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.data, props.onPress]);\n\n // handlers\n\n const handleLongPress = useCallback(() => {\n setShowTooltip(true);\n }, []);\n\n const handlePressStart = useCallback(() => {\n setPressing(true);\n }, []);\n\n const handlePressEnd = useCallback(() => {\n setPressing(false);\n if (showTooltip) {\n setTimeout(() => {\n setShowTooltip(false);\n }, 1000);\n }\n }, [showTooltip]);\n\n const handlePress = useCallback(() => {\n if (!props.data) {\n return;\n }\n\n props.onPress?.(props.data);\n }, [props]);\n\n const handleAnimationEnd = useCallback(() => {\n setAnimate(false);\n }, []);\n\n const isPurple =\n props.green !== true &&\n props.orange !== true &&\n (props.purple === true || props.data?.typeOfPlay === TypeOfPlay.Offense);\n const isOrange =\n props.green !== true &&\n props.purple !== true &&\n (props.orange === true || props.data?.typeOfPlay === TypeOfPlay.Transition);\n const isGreen =\n props.purple !== true &&\n props.orange !== true &&\n (props.green === true || props.data?.typeOfPlay === TypeOfPlay.Defense);\n const isWhite = !isPurple && !isOrange && !isGreen;\n\n if (!data || !data.isEnabled) {\n return null;\n }\n\n const tooltipText = data.hotKey ? (\n <>{hotKeyToPrintableString(data.hotKey)}</>\n ) : (\n <>{t('tagging-tool:keypad-tag.no-shortcut')}</>\n );\n\n return (\n <Tooltip title={tooltipText} open={showTooltip}>\n <Button\n onPress={handlePress}\n onPressStart={handlePressStart}\n onPressEnd={handlePressEnd}\n onLongPress={handleLongPress}\n onAnimationEnd={handleAnimationEnd}\n className={classNames(\n styles.tagButton,\n // width\n {\n [styles.full]: props.width === 'full',\n [styles.purple]: isPurple,\n [styles.green]: isGreen,\n [styles.orange]: isOrange,\n [styles.white]: isWhite,\n [styles.pressing]: pressing,\n ['animate-ktt-pulse']: animate,\n },\n props.className,\n )}\n >\n <span className={styles.name}>\n <Typography fontSize={fontSizes.default}>{data.name}</Typography>\n </span>\n </Button>\n </Tooltip>\n );\n};\n","import React from 'react';\n\nimport { KeypadTag } from 'api/tagging-tool/types';\n\nimport { TagButtonBase, TagButtonProps } from './TagButtonBase';\n\nconst LiveStreamTagButton = ({\n videoStartRecordingTime,\n ...rest\n}: TagButtonProps & { videoStartRecordingTime?: number; onPress?: (time: number) => (tag: KeypadTag) => void }) => {\n const onPress = !rest.onPress ? undefined : rest.onPress((new Date().getTime() - videoStartRecordingTime!) / 1000);\n\n const buttonProps = {\n ...rest,\n onPress,\n };\n\n return <TagButtonBase {...buttonProps} />;\n};\n\nexport default LiveStreamTagButton;\n","import React from 'react';\n\nimport { KeypadTag } from 'api/tagging-tool/types';\nimport { useCurrentTime } from 'shared/components/video-player';\n\nimport { TagButtonBase, TagButtonProps } from './TagButtonBase';\n\nconst RecordingTagButton = (props: TagButtonProps & { onPress?: (time: number) => (tag: KeypadTag) => void }) => {\n const currentTime = useCurrentTime();\n\n const onPress = !props.onPress ? undefined : props.onPress(currentTime);\n\n const buttonProps = {\n ...props,\n onPress,\n };\n\n return <TagButtonBase {...buttonProps} />;\n};\n\nexport default RecordingTagButton;\n","import React from 'react';\n\nimport { KeypadTag } from 'api/tagging-tool/types';\n\nimport LiveStreamTagButton from './LiveStreamTagButton';\nimport RecordingTagButton from './RecordingTagButton';\nimport { TagButtonProps } from './TagButtonBase';\n\nexport const TagButton = (\n props: TagButtonProps & { videoStartRecordingTime?: number; onPress: (time: number) => (tag: KeypadTag) => void },\n) => {\n if (props.videoStartRecordingTime) return <LiveStreamTagButton {...props} />;\n\n return <RecordingTagButton {...props} />;\n};\n","import { IconButton, Typography } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\nimport React, { useMemo, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Keypad, KeypadSimple, KeypadTag } from 'api/tagging-tool/types';\nimport { Dot } from 'shared/components/dot';\nimport IconChevronDown from 'shared/components/icons/icon-chevron-down';\nimport IconClose from 'shared/components/icons/icon-close';\nimport KebabMenu from 'shared/components/kebab-menu';\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nimport { Section } from './components/keypad-section';\nimport {\n KeypadPanelContainer,\n KeypadPanelCustomButtons,\n KeypadPanelCustomButtonsColumn,\n KeypadPanelCustomButtonsContent,\n KeypadPanelSections,\n KeypadsPanelKickOffTags,\n KeypadsPanelTitleContainer,\n KeypadsPanelTitlesContainer,\n KeypadsPanelTopBar,\n} from './styled';\nimport { KeypadIndex } from '../../../../tagging-tool/model/Keypad';\nimport { TagButton } from '../tag-button/TagButton';\n\nenum KeypadTagType {\n OFFENSE = 'offense',\n DEFENSE = 'defense',\n TRANSITION = 'transition',\n}\n\ntype Data = {\n index: KeypadIndex;\n [KeypadTagType.OFFENSE]: KeypadTag[];\n [KeypadTagType.TRANSITION]: KeypadTag[];\n [KeypadTagType.DEFENSE]: KeypadTag[];\n};\n\ntype Props = {\n children?: React.ReactNode;\n keypads: KeypadSimple[];\n keypad: Keypad;\n onKeypadTag: (time: number) => (tag: KeypadTag) => void;\n onClose: () => void;\n onChangeKeypad: (keypad: KeypadSimple) => void;\n loadingKeypad?: boolean;\n videoStartRecordingTime?: number;\n disabled?: boolean;\n};\n\nexport const KeypadsPanel = (props: Props) => {\n const kebabRef = useRef<HTMLDivElement | null>(null);\n const { keypad, videoStartRecordingTime } = props;\n\n const { t } = useTranslation();\n\n const data = useMemo<Data>(() => {\n const { offense, transition, defense } = keypad.tags.reduce(\n (acc, item) => {\n if (item.isCustom !== true) {\n return acc;\n } else if (item.typeOfPlay === TypeOfPlay.Offense) {\n return { ...acc, offense: [...acc.offense, item] };\n } else if (item.typeOfPlay === TypeOfPlay.Transition) {\n return { ...acc, transition: [...acc.transition, item] };\n } else if (item.typeOfPlay === TypeOfPlay.Defense) {\n return { ...acc, defense: [...acc.defense, item] };\n }\n return acc;\n },\n { offense: [], transition: [], defense: [] } as Omit<Data, 'index'>,\n );\n\n const index = keypad.tags.reduce((acc, keypad) => {\n return { ...acc, [keypad.keypadTagId]: keypad };\n }, {} as KeypadIndex);\n\n return { index, offense, transition, defense };\n }, [keypad]);\n const hasCustomButtons = data.offense.length > 0 || data.transition.length > 0 || data.defense.length > 0;\n\n if (!keypad) return null;\n\n const menuOptions = useMemo(() => {\n return props.keypads.map((kp) => {\n const isCurrent = props.keypad.id === kp.id;\n return {\n selected: isCurrent,\n displayText: (\n <Typography fontWeight={isCurrent ? 'fontWeightMedium' : 'fontWeightRegular'}>{kp.name}</Typography>\n ),\n onClick: isCurrent\n ? undefined\n : () => {\n props.onChangeKeypad(kp);\n },\n };\n });\n }, [props]);\n\n const getCustomButtons = useMemo(\n () => (type: KeypadTagType) =>\n data[type].map((tag) => {\n return (\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n width='full'\n key={tag.keypadTagId}\n data={tag}\n />\n );\n }),\n [data, props.onKeypadTag, videoStartRecordingTime],\n );\n\n return (\n <KeypadPanelContainer disabled={props.disabled}>\n <KeypadsPanelTopBar>\n <KebabMenu\n anchorOrigin={{ horizontal: 'left', vertical: 'bottom' }}\n triggerComponent={\n <>\n <Typography\n color='text.primary'\n textTransform='uppercase'\n fontWeight='fontWeightMedium'\n fontSize={fontSizes.small}\n marginRight={1}\n >\n {keypad.name}\n </Typography>\n <IconChevronDown size='xsmall' />\n </>\n }\n ref={kebabRef}\n options={menuOptions}\n id={'keypads-list'}\n />\n <IconButton onClick={props.onClose}>\n <IconClose size='small' />\n </IconButton>\n </KeypadsPanelTopBar>\n {/* kick off buttons */}\n <KeypadsPanelKickOffTags>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['EVENT_KICK_OFF']}\n />\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['EVENT_SECOND_HALF']}\n />\n </KeypadsPanelKickOffTags>\n {/* offense / defense */}\n <KeypadsPanelTitlesContainer>\n <KeypadsPanelTitleContainer>\n <Dot color={Colors.brandPastel} />\n <Typography fontWeight='fontWeightMedium'>{t('tagging-tool:keypad.offense')}</Typography>\n </KeypadsPanelTitleContainer>\n <KeypadsPanelTitleContainer>\n <Dot color={Colors.fountain} />\n <Typography fontWeight='fontWeightMedium'>{t('tagging-tool:keypad.defense')}</Typography>\n </KeypadsPanelTitleContainer>\n </KeypadsPanelTitlesContainer>\n {/* sections */}\n <KeypadPanelSections>\n <Section title={t('tagging-tool:recording-keypad.corners')}>\n <Section.Row>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_L_CORNER']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_R_CORNER']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_L_CORNER']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_R_CORNER']}\n />\n </Section.Col>\n </Section.Row>\n </Section>\n <Section title={t('tagging-tool:recording-keypad.faults-and-penalties')}>\n <Section.Row>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_DIRECT_FAULT']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_INDIRECT_FAULT']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_DIRECT_FAULT']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_INDIRECT_FAULT']}\n />\n </Section.Col>\n </Section.Row>\n <Section.Row>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_PENALTY']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_PENALTY']}\n />\n </Section.Col>\n </Section.Row>\n </Section>\n <Section title={t('tagging-tool:recording-keypad.crosses')}>\n <Section.Row>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_L_CROSS']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_R_CROSS']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_L_CROSS']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_R_CROSS']}\n />\n </Section.Col>\n </Section.Row>\n </Section>\n <Section title={t('tagging-tool:recording-keypad.plays')}>\n <Section.Row>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_GOAL_FAVOR']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_GOAL_CHANCE']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_GOAL_AGAINST']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_GOAL_CHANCE']}\n />\n </Section.Col>\n </Section.Row>\n <Section.Row>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_FINALIZATION']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_FINALIZATION']}\n />\n </Section.Col>\n </Section.Row>\n <Section.Row>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_OFFENSE']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_DEFENSE']}\n />\n </Section.Col>\n </Section.Row>\n <Section.Row>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_GK_SHORT']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_GK_LONG']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_HIGH_PRESS']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_GK_LONG']}\n />\n </Section.Col>\n </Section.Row>\n </Section>\n <Section title={t('tagging-tool:recording-keypad.transitions')}>\n <Section.Row>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['TRANSITION_BALL_RECOVERY']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['TRANSITION_LOST_BALL']}\n />\n </Section.Col>\n </Section.Row>\n </Section>\n <Section title={t('tagging-tool:recording-keypad.throwIn')}>\n <Section.Row>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_THROW_IN_L']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['OFFENSE_THROW_IN_R']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_THROW_IN_L']}\n />\n </Section.Col>\n <Section.Col>\n <TagButton\n videoStartRecordingTime={videoStartRecordingTime}\n onPress={props.onKeypadTag}\n data={data.index['DEFENSE_THROW_IN_R']}\n />\n </Section.Col>\n </Section.Row>\n </Section>\n </KeypadPanelSections>\n {/* custom buttons */}\n {hasCustomButtons && (\n <KeypadPanelCustomButtons>\n <Section.Title title={t('tagging-tool:recording-keypad.custom-buttons')} />\n <KeypadPanelCustomButtonsContent>\n <KeypadPanelCustomButtonsColumn>{getCustomButtons(KeypadTagType.OFFENSE)}</KeypadPanelCustomButtonsColumn>\n <KeypadPanelCustomButtonsColumn>\n {getCustomButtons(KeypadTagType.TRANSITION)}\n </KeypadPanelCustomButtonsColumn>\n <KeypadPanelCustomButtonsColumn>{getCustomButtons(KeypadTagType.DEFENSE)}</KeypadPanelCustomButtonsColumn>\n </KeypadPanelCustomButtonsContent>\n </KeypadPanelCustomButtons>\n )}\n </KeypadPanelContainer>\n );\n};\n","import { Box, styled } from '@mui/material';\n\nexport const TagFiltersContent = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(1),\n}));\n\nexport const TagFiltersColumn = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n gap: theme.spacing(2),\n}));\n\nexport const TagFiltersItem = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(2),\n}));\n","import { Checkbox, Typography } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\nimport { useCallback } from 'react';\n\nimport { TaggingEventsFilters, TaggingEventsFilterType } from 'api/tagging-tool/types';\nimport { TaggingEventFilter } from 'api/tagging-tool/use-fetch-tagging-events/utils';\nimport { sortArray } from 'tagging-tool/utility/arrays';\n\nimport { TagFiltersColumn, TagFiltersItem } from '../styled';\n\ninterface Props {\n filterOptions: TaggingEventFilter[];\n filterType: keyof TaggingEventsFilters;\n onChange: (filterType: keyof TaggingEventsFilters, value: TaggingEventsFilterType) => void;\n selectedOptions: TaggingEventsFilterType;\n title: string;\n}\n\nexport const TagFilterType = ({ title, filterOptions, selectedOptions, onChange, filterType }: Props) => {\n const handleToggleAll = useCallback(() => {\n onChange(filterType, { options: [], all: !selectedOptions.all });\n }, [selectedOptions.all, filterType, onChange]);\n\n const handleCheckFilterOption = useCallback(\n (value: string) => {\n const isChecked = selectedOptions.options.includes(value);\n\n const options = isChecked\n ? selectedOptions.options.filter((option) => option !== value)\n : [...selectedOptions.options, value];\n\n onChange(filterType, {\n options: options ?? [],\n all: Boolean(options && options.length === 0),\n });\n },\n [filterType, selectedOptions.options, onChange],\n );\n\n const isDisabled = filterOptions.length === 0;\n\n return (\n <TagFiltersColumn>\n <Typography fontWeight={fontWeight['500']} fontSize={fontSizes.default}>\n {title}\n </Typography>\n <TagFiltersItem>\n <Checkbox\n checked={selectedOptions.all && !isDisabled}\n disabled={isDisabled}\n id={`cb-${filterType}$all`}\n onChange={handleToggleAll}\n />\n\n <label htmlFor={`cb-${filterType}$all`}>\n <Typography\n fontSize={fontSizes.default}\n color={isDisabled ? Colors.ghost : !selectedOptions.all ? Colors.storm : Colors.night}\n >\n All\n </Typography>\n </label>\n </TagFiltersItem>\n {sortArray({\n data: filterOptions.map((filterOption) => ({\n title: filterOption.title,\n value: filterOption.value,\n })),\n key: 'title',\n asc: true,\n }).map((m, idx) => {\n const key = `cb-${filterType}$${idx}}`;\n const checked = selectedOptions.options.includes(m.value);\n return (\n <TagFiltersItem key={key}>\n <Checkbox id={key} checked={Boolean(checked)} onChange={() => handleCheckFilterOption(m.value)} />\n\n <label htmlFor={key}>\n <Typography fontSize={fontSizes.default} color={!checked ? Colors.storm : Colors.night}>\n {m.title}\n </Typography>\n </label>\n </TagFiltersItem>\n );\n })}\n </TagFiltersColumn>\n );\n};\n","import { Button, DialogActions, DialogContent, DialogContentText, DialogTitle, Typography } from '@mui/material';\nimport { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TaggingEventsFilters, TaggingEventsFilterType } from 'api/tagging-tool/types';\nimport { TaggingEventsFilterOptions } from 'api/tagging-tool/use-fetch-tagging-events/utils';\nimport { Dialog } from 'shared/components/dialog';\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nimport { TagFiltersContent } from './styled';\nimport { TagFilterType } from './tag-filter-type';\n\nexport type TagFiltersModalProps = {\n show: boolean;\n resetFilters: () => TaggingEventsFilters;\n onClose: (reset?: boolean) => void;\n filterOptions: TaggingEventsFilterOptions;\n appliedFilters: TaggingEventsFilters;\n applyFilters: (value: TaggingEventsFilters) => void;\n};\n\nexport const TagFiltersModal = ({\n show,\n onClose,\n filterOptions,\n appliedFilters,\n resetFilters,\n applyFilters,\n}: TagFiltersModalProps) => {\n const [filters, setFilters] = useState<TaggingEventsFilters>(appliedFilters);\n const { t } = useTranslation();\n\n const handelApplyFilters = useCallback(() => {\n applyFilters(filters);\n onClose();\n }, [applyFilters, onClose, filters]);\n\n const handleResetFilters = useCallback(() => {\n const initialFilters = resetFilters();\n setFilters(initialFilters);\n onClose();\n }, [onClose, resetFilters]);\n\n const updateFilterType = useCallback((filterType: keyof TaggingEventsFilters, value: TaggingEventsFilterType) => {\n setFilters((filters) => ({ ...filters, [filterType]: value }));\n }, []);\n\n return (\n <Dialog keepMounted={false} open={show} maxWidth='lg' fullWidth onClose={() => onClose()}>\n <DialogTitle>\n <DialogContentText>\n <Typography textTransform='uppercase' component='span'>{`${t(\n 'tagging-tool:tagging-recording.filter-by',\n )}: `}</Typography>\n <Typography component='span'>{t('tagging-tool:tagging-recording.filter-tags-type')}</Typography>\n </DialogContentText>\n </DialogTitle>\n <DialogContent>\n <TagFiltersContent>\n <TagFilterType\n filterOptions={filterOptions.offensive}\n filterType={TypeOfPlay.Offense}\n onChange={updateFilterType}\n selectedOptions={filters[TypeOfPlay.Offense]}\n title={t('tagging-tool:tagging-recording.filters-offensive')}\n />\n <TagFilterType\n filterOptions={filterOptions.defensive}\n filterType={TypeOfPlay.Defense}\n onChange={updateFilterType}\n selectedOptions={filters[TypeOfPlay.Defense]}\n title={t('tagging-tool:tagging-recording.filters-defensive')}\n />\n <TagFilterType\n filterOptions={filterOptions.transitions}\n filterType={TypeOfPlay.Transition}\n onChange={updateFilterType}\n selectedOptions={filters[TypeOfPlay.Transition]}\n title={t('tagging-tool:tagging-recording.filter-transitions')}\n />\n <TagFilterType\n filterOptions={filterOptions.imported}\n filterType={TypeOfPlay.imported}\n onChange={updateFilterType}\n selectedOptions={filters[TypeOfPlay.imported]}\n title={t('tagging-tool:tagging-recording.filter-imported')}\n />\n <TagFilterType\n filterOptions={filterOptions.user}\n filterType={'user'}\n onChange={updateFilterType}\n selectedOptions={filters.user}\n title={t('tagging-tool:tagging-recording.filter-user')}\n />\n </TagFiltersContent>\n </DialogContent>\n <DialogActions>\n <Button variant='contained' color='secondary' size='large' onClick={handleResetFilters}>\n {t('common:actions.reset')}\n </Button>\n <Button variant='contained' size='large' onClick={handelApplyFilters}>\n {t('common:actions.apply')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","import classNames from 'classnames';\nimport React from 'react';\n\nimport styles from './ActionIcon.module.scss';\n\nconst ActionIcon = (props: { children: React.ReactElement; text: string; onClick?: () => void; active?: boolean }) => {\n const { children, text, onClick } = props;\n\n return (\n <div className={styles.container} onClick={onClick}>\n {children}\n <div className={classNames(styles.text, { [styles.active]: props.active })}>{text}</div>\n </div>\n );\n};\n\nexport default ActionIcon;\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const ImportUploaderContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n height: '40px',\n}));\n\nexport const ImportUploaderContent = styled(Box)(() => ({\n border: `1px solid ${Colors.storm}`,\n color: Colors.storm,\n}));\n\nexport const ImportUploaderLabel = styled('label')(({ theme }) => ({\n display: 'flex',\n cursor: 'pointer',\n justifyContent: 'center',\n alignItems: 'center',\n gap: theme.spacing(2),\n padding: theme.spacing(0, 2),\n borderRadius: '8px',\n height: '32px',\n}));\n","import { Box, Button, styled } from '@mui/material';\n\nexport const TagEventClipActionsContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(1),\n paddingLeft: theme.spacing(0.5),\n paddingRight: theme.spacing(1),\n}));\n\nexport const TagEventActionButton = styled(Button)(({ theme }) => ({\n minWidth: 'auto',\n padding: theme.spacing(0.5),\n}));\n","import React from 'react';\n\nimport IconClose from 'shared/components/icons/icon-close';\nimport IconDone from 'shared/components/icons/icon-done';\nimport Spinner from 'shared/components/spinner';\n\nimport { TagEventActionButton, TagEventClipActionsContainer } from './styled';\n\ntype Props = {\n onConfirm: () => void;\n onCancel: () => void;\n loading?: boolean;\n disabled?: boolean;\n};\n\nexport const TagEventClipActions = (props: Props) => {\n return (\n <TagEventClipActionsContainer>\n {props.loading ? (\n <Spinner />\n ) : (\n <TagEventActionButton\n disabled={props.disabled === true}\n onClick={props.onConfirm}\n variant='contained'\n size='small'\n >\n <IconDone size='small' sx={{ color: 'common.white' }} />\n </TagEventActionButton>\n )}\n <TagEventActionButton\n disabled={props.loading === true}\n onClick={props.onCancel}\n variant='contained'\n size='small'\n color='secondary'\n >\n <IconClose size='small' sx={{ color: 'common.white' }} />\n </TagEventActionButton>\n </TagEventClipActionsContainer>\n );\n};\n","import { Typography } from '@mui/material';\nimport { fontSizes, fontWeight } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TaggingEvent } from 'api/tagging-tool/types';\nimport IconExport from 'shared/components/icons/icon-export';\n\nimport { ImportUploaderContainer, ImportUploaderContent, ImportUploaderLabel } from './index.styled';\nimport { fetchUploadImportedTaggingEvents } from '../../../../tagging-tool/service/taggingEvent.service';\nimport { TagEventClipActions } from '../tag-event-clip-actions';\n\nexport type ImportUploaderProps = {\n recordingId: string;\n onCancel: () => void;\n onImport: (events: TaggingEvent[]) => void;\n};\n\nexport const ImportUploader = (props: ImportUploaderProps) => {\n const { t } = useTranslation();\n const { recordingId } = props;\n\n const [loading, setLoading] = useState<boolean>(false);\n const [fileList, setFileList] = useState<FileList>();\n\n // handlers\n\n const handleChange = useCallback((ev: React.ChangeEvent<HTMLInputElement>) => {\n if (ev.target.files === null) {\n return;\n }\n\n setFileList(ev.target.files);\n }, []);\n\n const handleConfirm = useCallback(() => {\n if (!fileList) {\n return;\n }\n\n setLoading(true);\n\n const data = new FormData();\n data.append('file', fileList[0]);\n\n fetchUploadImportedTaggingEvents({ recordingId, data }).then((res) => {\n setLoading(false);\n setFileList(undefined);\n\n if (res.error) {\n return;\n }\n\n props.onImport(res.data);\n });\n }, [fileList, props, recordingId]);\n\n const handleCancel = useCallback(() => {\n if (fileList !== undefined) {\n setFileList(undefined);\n } else {\n props.onCancel();\n }\n }, [fileList, props]);\n\n return (\n <ImportUploaderContainer>\n {fileList === undefined && (\n <ImportUploaderContent>\n <ImportUploaderLabel>\n <IconExport size='small' color='secondary' />\n <Typography fontSize={fontSizes.small} fontWeight={fontWeight['500']} textTransform='uppercase'>\n {t('tagging-tool:tagging-recording.select-XML-file')}\n </Typography>\n <input type='file' style={{ display: 'none' }} onChange={handleChange} accept='text/xml' />\n </ImportUploaderLabel>\n </ImportUploaderContent>\n )}\n {fileList !== undefined && <Typography fontSize={fontSizes.default}>{fileList[0].name}</Typography>}\n <TagEventClipActions\n loading={loading}\n disabled={!Boolean(fileList)}\n onConfirm={handleConfirm}\n onCancel={handleCancel}\n />\n </ImportUploaderContainer>\n );\n};\n","import { Grid } from '@mui/material';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router';\n\nimport { TaggingEvent } from 'api/tagging-tool/types';\nimport ActionIcon from 'shared/components/action-icon';\nimport IconExport from 'shared/components/icons/icon-export';\nimport IconFolder from 'shared/components/icons/icon-folder';\nimport IconSync from 'shared/components/icons/icon-sync';\nimport IconTag from 'shared/components/icons/icon-tag';\nimport { MenuList } from 'shared/components/menu-list';\n\nimport { fetchExportTaggingEvents } from '../../../../tagging-tool/service/taggingEvent.service';\nimport { makeRecordingAlignmentRoute } from '../../../../tagging-tool/utility/navigation';\nimport { ImportUploader } from '../import-uploader';\n\ninterface Props {\n handleImportEvents: (events: Array<TaggingEvent>) => void;\n importing: boolean;\n isLive: boolean;\n isMultiselectModeActive: boolean;\n orderedTaggingEvents: TaggingEvent[];\n recordingId: string;\n setImporting: (value: boolean) => void;\n setIsMultiselectModeActive: (value: boolean) => void;\n setShowsKeypad: (value: boolean) => void;\n showsKeypad: boolean;\n videoSrc?: string;\n}\n\nexport const TagRecordingActions = ({\n handleImportEvents,\n importing,\n isLive,\n isMultiselectModeActive,\n recordingId,\n setImporting,\n setIsMultiselectModeActive,\n setShowsKeypad,\n showsKeypad,\n videoSrc,\n}: Props) => {\n const history = useHistory();\n const { t } = useTranslation();\n const [showsIEMenu, setShowsIEMenu] = useState<boolean>(false);\n const actionIconRef = useRef<HTMLDivElement | null>(null);\n\n const handleShowIEMenu = useCallback(() => setShowsIEMenu(true), []);\n const handleHideIEMenu = useCallback(() => setShowsIEMenu(false), []);\n const handleCancelImport = useCallback(() => setImporting(false), [setImporting]);\n const handleShowImportForm = useCallback(() => setImporting(true), [setImporting]);\n const handleImportMenuOption = useCallback(\n (events: Array<TaggingEvent>) => {\n setImporting(false);\n handleImportEvents(events);\n },\n [setImporting, handleImportEvents],\n );\n\n const handleExportMenuOption = useCallback(() => {\n fetchExportTaggingEvents({\n recordingId,\n isLive,\n }).then((res) => {\n if (res.error) {\n return;\n }\n\n const blob = new Blob([res.data], {\n type: 'text/xml',\n });\n const blobURL = window.URL.createObjectURL(blob);\n\n const downloadLink = document.createElement('a');\n downloadLink.target = '_blank';\n downloadLink.href = blobURL;\n downloadLink.download = `session-${recordingId}-tags.xml`;\n downloadLink.dispatchEvent(\n new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window,\n }),\n );\n setTimeout(function () {\n window.URL.revokeObjectURL(blobURL);\n }, 200);\n });\n }, [isLive, recordingId]);\n\n const menuOptions = useMemo(() => {\n return [\n {\n displayText: t('tagging-tool:tagging-recording.import'),\n onClick: handleShowImportForm,\n },\n {\n displayText: t('tagging-tool:tagging-recording.export'),\n onClick: handleExportMenuOption,\n },\n ];\n }, [handleShowImportForm, handleExportMenuOption, t]);\n\n return (\n <Grid container spacing={1} justifyContent={'flex-end'} alignItems={'center'}>\n {!importing && (\n <>\n {videoSrc && (\n <>\n <Grid item>\n <ActionIcon\n active={isMultiselectModeActive}\n text={t('tagging-tool:tagging-recording.action-add-to-playlist')}\n onClick={() => {\n setIsMultiselectModeActive(!isMultiselectModeActive);\n }}\n >\n <IconFolder color={isMultiselectModeActive ? 'primary' : undefined} />\n </ActionIcon>\n </Grid>\n <Grid item>\n <ActionIcon\n text={t('tagging-tool:tagging-recording.action-edit-alignment')}\n onClick={() => {\n history.push(\n makeRecordingAlignmentRoute({\n recordingId,\n }),\n );\n }}\n >\n <IconSync />\n </ActionIcon>\n </Grid>\n </>\n )}\n <Grid item ref={actionIconRef}>\n <ActionIcon onClick={handleShowIEMenu} text={t('tagging-tool:tagging-recording.action-export-import')}>\n <IconExport />\n </ActionIcon>\n <MenuList\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n transformOrigin={{ vertical: 'top', horizontal: 'center' }}\n anchorEl={actionIconRef.current}\n isOpen={showsIEMenu}\n onClose={handleHideIEMenu}\n options={menuOptions}\n />\n </Grid>\n <Grid item>\n <ActionIcon\n active={showsKeypad}\n text={t('tagging-tool:tagging-recording.action-add-tags')}\n onClick={() => {\n setShowsKeypad(!showsKeypad);\n }}\n >\n <IconTag sx={{ color: showsKeypad ? 'primary.main' : 'text.primary' }} />\n </ActionIcon>\n </Grid>\n </>\n )}\n {importing && (\n <Grid item>\n <ImportUploader recordingId={recordingId} onCancel={handleCancelImport} onImport={handleImportMenuOption} />\n </Grid>\n )}\n </Grid>\n );\n};\n","import { Button } from '@mui/material';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport styles from './SortBy.module.scss';\nimport { SortDirection } from '../../types/filters/types';\nimport IconSort from '../icons/icon-sort';\n\ntype SortByProps = {\n onSort: (order: SortDirection) => void;\n};\n\nconst SortBy = ({ onSort }: SortByProps) => {\n const { t } = useTranslation();\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const open = Boolean(anchorEl);\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n };\n\n const handleCloseMenu = () => {\n setAnchorEl(null);\n };\n\n const handleSort = (order: SortDirection) => {\n handleCloseMenu();\n onSort(order);\n };\n\n return (\n <>\n <Button\n id='sort-by-button'\n aria-controls='sort-by-menu'\n aria-haspopup='true'\n aria-expanded={open ? 'true' : undefined}\n onClick={handleClick}\n color='inherit'\n size='small'\n startIcon={<IconSort size='small' />}\n >\n {t('common:actions.sort-by.sort-by').toUpperCase()}\n </Button>\n <Menu\n id='sort-by-menu'\n anchorEl={anchorEl}\n open={open}\n onClose={handleCloseMenu}\n MenuListProps={{ 'aria-labelledby': 'sort-by-button' }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n transformOrigin={{ vertical: 'top', horizontal: 'center' }}\n >\n <MenuItem onClick={() => handleSort(SortDirection.ASC)}>\n <div className={styles.menuItem}>{t('common:actions.sort-by.asc')}</div>\n </MenuItem>\n <MenuItem onClick={() => handleSort(SortDirection.DESC)}>\n <div className={styles.menuItem}>{t('common:actions.sort-by.desc')}</div>\n </MenuItem>\n </Menu>\n </>\n );\n};\n\nexport default SortBy;\n","import { Button, Grid } from '@mui/material';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport IconFilter from 'shared/components/icons/icon-filter';\nimport SortBy from 'shared/components/sort-by';\nimport { SortDirection } from 'shared/types/filters/types';\n\ninterface Props {\n handleShowFiltersModal: () => void;\n filtering: boolean;\n handleSortChange: (newOrder: SortDirection) => void;\n}\n\nexport const TagRecordingFilters = ({ handleShowFiltersModal, filtering, handleSortChange }: Props) => {\n const { t } = useTranslation();\n\n return (\n <Grid container spacing={1}>\n <Grid item>\n <Button\n startIcon={<IconFilter color={filtering ? 'primary' : 'secondary'} size='small' />}\n onClick={handleShowFiltersModal}\n size='small'\n color={filtering ? 'primary' : 'secondary'}\n >\n {t('tagging-tool:tagging-recording.filter').toUpperCase()}\n </Button>\n </Grid>\n <Grid item>\n <SortBy onSort={handleSortChange} />\n </Grid>\n </Grid>\n );\n};\n","import { styled, Typography } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\n\nexport type TypeCounterBackgroundColorType = Colors | 'none';\nexport type TypeCounterColorType = Colors | 'initial';\n\nexport interface TypeCounterContainerProps {\n color: TypeCounterColorType;\n backgroundColor: TypeCounterBackgroundColorType;\n disabled: boolean;\n}\n\nexport const TypeCounterContainer = styled(Typography, {\n shouldForwardProp: (prop) => prop !== 'color' && prop !== 'backgroundColor' && prop !== 'disabled',\n})<TypeCounterContainerProps>(({ theme, color, backgroundColor, disabled }) => ({\n minWidth: '40px',\n textAlign: 'center',\n padding: theme.spacing(0, 1),\n background: backgroundColor,\n color: color,\n fontWeight: fontWeight['500'],\n fontSize: fontSizes.small,\n lineHeight: 2,\n ...(disabled && {\n color: Colors.storm,\n background: Colors.background,\n }),\n}));\n","import { ReactNode } from 'react';\n\nimport { TypeCounterContainer, TypeCounterContainerProps } from './styled';\n\ninterface Props extends TypeCounterContainerProps {\n children: ReactNode;\n}\n\nexport const TypeCounter = ({ children, color, backgroundColor, disabled }: Props) => {\n return (\n <TypeCounterContainer color={color} backgroundColor={backgroundColor} disabled={disabled}>\n {children}\n </TypeCounterContainer>\n );\n};\n","import { Colors } from 'kognia-ui';\n\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nexport const getIconPlayColor = ({ disabled, typeOfPlay }: { disabled: boolean; typeOfPlay: TypeOfPlay }): string => {\n if (disabled) {\n return Colors.iron;\n }\n\n switch (typeOfPlay) {\n case TypeOfPlay.Offense:\n return Colors.primary;\n case TypeOfPlay.Defense:\n return Colors.green;\n case TypeOfPlay.Transition:\n return Colors.peach;\n case TypeOfPlay.GameEvent:\n return Colors.shark;\n default:\n return Colors.night;\n }\n};\n","import { Colors } from 'kognia-ui';\n\nimport { TypeCounterBackgroundColorType, TypeCounterColorType } from 'shared/components/type-counter/styled';\nimport { TypeOfPlay } from 'shared/types/type-of-play/types';\n\nexport type TaggingEventClipNameBackgroundColorType = {\n [value in TypeOfPlay]: TypeCounterBackgroundColorType;\n};\n\nexport type TaggingEventClipNameColorType = {\n [value in TypeOfPlay]: TypeCounterColorType;\n};\n\nexport const TaggingEventClipTypeBackgroundColor: TaggingEventClipNameBackgroundColorType = {\n [TypeOfPlay.Offense]: Colors.melrose,\n [TypeOfPlay.Defense]: Colors.river,\n [TypeOfPlay.Transition]: Colors.dawn,\n [TypeOfPlay.GameEvent]: 'none',\n [TypeOfPlay.imported]: 'none',\n};\n\nexport const TaggingEventClipTypeColor: TaggingEventClipNameColorType = {\n [TypeOfPlay.Offense]: Colors.brandPastel,\n [TypeOfPlay.Defense]: Colors.green,\n [TypeOfPlay.Transition]: Colors.peach,\n [TypeOfPlay.GameEvent]: 'initial',\n [TypeOfPlay.imported]: 'initial',\n};\n","import { Box, outlinedInputClasses, styled, TextField } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nimport Spinner from 'shared/components/spinner';\n\ninterface TaggingEventClipContainerProps {\n multiselect: boolean;\n}\n\nexport const TaggingEventClipContainer = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'multiselect',\n})<TaggingEventClipContainerProps>(({ theme, multiselect }) => ({\n background: Colors.white,\n borderRadius: theme.shape.borderRadius,\n position: 'relative',\n padding: theme.spacing(1, 0, 1, 2),\n display: 'flex',\n gap: theme.spacing(1),\n justifyContent: 'flex-start',\n alignItems: 'center',\n ...(multiselect && {\n paddingRight: theme.spacing(2),\n }),\n}));\n\nexport const TaggingEventClipEnd = styled(Box)(() => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n}));\n\nexport const TaggingEventEditableTextContainer = styled(Box)({\n flex: 1,\n});\n\nexport const TaggingEventEditableText = styled(TextField)(({ theme }) => ({\n [`& .${outlinedInputClasses.input}`]: {\n padding: theme.spacing(0.5, 1),\n },\n}));\n\nexport const TaggingEventSpinner = styled(Spinner)(({ theme }) => ({\n position: 'absolute',\n top: theme.spacing(1),\n right: theme.spacing(2),\n}));\n","import { Box } from '@mui/material';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation } from 'react-router-dom';\n\nimport { useAddManyToPlaylist } from 'api/playlist/useAddManyToPlaylist';\nimport { usePlaylists } from 'api/playlist/useFetchPlaylists';\nimport { TaggingEvent } from 'api/tagging-tool/types';\nimport ConfirmPopoverDialog from 'shared/components/confirm-popover-dialog';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport IconPlaylist from 'shared/components/icons/icon-playlist';\nimport IconTrim from 'shared/components/icons/icon-trim';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport {\n PlaylistMenuHorizontalPosition,\n PlaylistMenuVerticalPosition,\n SelectPlaylistDialog,\n} from 'shared/components/select-playlist-dialog/SelectPlaylistDialog';\nimport { useCurrentPlaylistItem } from 'shared/components/video-player';\nimport { Playlist } from 'shared/types';\nimport { fetchDeleteTaggingEvent } from 'tagging-tool/service/taggingEvent.service';\n\nexport type ClipContextualMenuProps = {\n initialShow: boolean;\n hasVideo: boolean;\n onClose: () => void;\n event: TaggingEvent;\n onDelete: (event: TaggingEvent) => void;\n onTrim: (event: TaggingEvent) => void;\n onRename: (event: TaggingEvent) => void;\n};\n\nexport const TagEventClipMenu = ({\n initialShow,\n hasVideo,\n onClose,\n event,\n onDelete,\n onTrim,\n onRename,\n}: ClipContextualMenuProps) => {\n const kebabRef = useRef<HTMLDivElement | null>(null);\n const { search } = useLocation();\n const { t } = useTranslation();\n const { addManyToPlaylist } = useAddManyToPlaylist();\n const { invalidateQuery } = usePlaylists({ refetchInterval: false });\n const [show, setShow] = useState<boolean>(initialShow);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState<boolean>(false);\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const currentPlaylistItem = useCurrentPlaylistItem();\n useEffect(() => {\n if (show) {\n // reset UI state\n setShowDeleteConfirm(false);\n }\n setShow(show);\n }, [show]);\n\n const handleShowDeleteConfirm = useCallback(() => {\n setShowDeleteConfirm(true);\n }, []);\n\n const handleDelete = useCallback(() => {\n const { recordingId, id: taggingEventId } = event;\n\n fetchDeleteTaggingEvent({\n recordingId: recordingId,\n taggingEventsIds: [taggingEventId],\n }).then((res) => {\n if (res.error) {\n return;\n }\n\n onDelete(event);\n });\n }, [onDelete, event]);\n\n const handleRename = useCallback(() => {\n if (!onRename) return;\n onRename(event);\n }, [event, onRename]);\n\n const handleShowPlaylistModal = useCallback((event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setAnchorEl(event.currentTarget);\n }, []);\n\n const handleClosePlaylistModal = useCallback(() => {\n setAnchorEl(null);\n onClose();\n }, [onClose]);\n\n const handleShowTrimModal = useCallback(() => {\n onClose();\n onTrim(event);\n }, [onTrim, onClose, event]);\n\n const handleAddClipToPlaylist = useCallback(\n (playlist: Playlist | null, name: string) => {\n if (!playlist) return;\n\n const { name: eventName, timeBefore, time, timeAfter, recordingId } = event;\n\n const data = {\n startTime: Math.max(0, time - timeBefore),\n endTime: time + timeAfter,\n playlistId: playlist.id,\n name: name ? name : eventName,\n recordingId: recordingId,\n fundamentalsSelected: currentPlaylistItem.fundamentalsSelected,\n };\n\n addManyToPlaylist({\n items: [data],\n options: {\n onSettled: handleClosePlaylistModal,\n onSuccess: () => {\n invalidateQuery && invalidateQuery();\n },\n },\n });\n },\n [invalidateQuery, addManyToPlaylist, handleClosePlaylistModal, event, currentPlaylistItem.fundamentalsSelected],\n );\n\n const menuOptions: MenuListOption[] = useMemo(\n () => [\n {\n displayText: t('common:actions.rename'),\n icon: <IconEdit size='small' color='secondary' />,\n onClick: handleRename,\n },\n {\n isHidden: !hasVideo,\n displayText: t('tagging-tool:tagging-recording.trim'),\n icon: <IconTrim size='small' color='secondary' />,\n onClick: handleShowTrimModal,\n },\n {\n displayText: t('tagging-tool:tagging-recording.send-to-playlist'),\n icon: <IconPlaylist size='small' color='secondary' />,\n onClick: handleShowPlaylistModal,\n avoidCloseOnClick: true,\n isHidden: search.includes('isLive'),\n },\n {\n displayText: t('common:actions.delete'),\n icon: <IconDelete size='small' color='secondary' />,\n onClick: handleShowDeleteConfirm,\n },\n ],\n [handleRename, handleShowDeleteConfirm, handleShowPlaylistModal, handleShowTrimModal, hasVideo, search, t],\n );\n\n return (\n <Box paddingX={1}>\n <KebabMenu ref={kebabRef} options={menuOptions} id={'tagging-tool-clip'} />\n <ConfirmPopoverDialog\n anchorEl={kebabRef.current}\n cancelLabel={t('common:actions.cancel')}\n confirmLabel={t('common:actions.delete')}\n description={t('tagging-tool:tagging-recording.delete-tag-confirm')}\n isOpen={showDeleteConfirm}\n onConfirm={handleDelete}\n setIsOpen={setShowDeleteConfirm}\n />\n <SelectPlaylistDialog\n anchorEl={anchorEl}\n onClose={handleClosePlaylistModal}\n verticalPosition={PlaylistMenuVerticalPosition.Top}\n horizontalPosition={PlaylistMenuHorizontalPosition.Center}\n onClickItem={handleAddClipToPlaylist}\n />\n </Box>\n );\n};\n","import { IconButton, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport React, { ChangeEventHandler, useCallback, useState } from 'react';\nimport { useResetRecoilState, useSetRecoilState } from 'recoil';\n\nimport { TaggingEvent } from 'api/tagging-tool/types';\n// eslint-disable-next-line import/no-restricted-paths\nimport { usePlaylistMenuId } from 'pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/add-to-playlist-menu-state';\nimport {\n playlistMenuAtoms,\n PlaylistMenuItem,\n // eslint-disable-next-line import/no-restricted-paths\n} from 'pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/add-to-playlist-menu-state/atoms';\n// eslint-disable-next-line import/no-restricted-paths\nimport { generatePlaylistMenuItemId } from 'pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/add-to-playlist-menu-state/hooks';\nimport { CheckboxWithCustomColor } from 'shared/components/CheckboxWithCustomColor/CheckboxWithCustomColor';\nimport IconPlay from 'shared/components/icons/icon-play';\nimport { TypeCounter } from 'shared/components/type-counter';\nimport { getIconPlayColor } from 'shared/utils/get-icon-play-color';\nimport { TaggingEventClipTypeBackgroundColor, TaggingEventClipTypeColor } from 'shared/utils/tagging-event-clip-type';\nimport { fetchRenameTaggingEvent } from 'tagging-tool/service/taggingEvent.service';\nimport { secondsToTimeString } from 'tagging-tool/utility/date';\n\nimport {\n TaggingEventClipContainer,\n TaggingEventClipEnd,\n TaggingEventEditableText,\n TaggingEventEditableTextContainer,\n} from './styled';\nimport { TagEventClipActions } from '../tag-event-clip-actions';\nimport { TagEventClipMenu } from '../tag-event-clip-menu';\n\nconst usePlaylistMenuItemId = (clipId: string) => {\n const playlistMenuId = usePlaylistMenuId();\n\n return generatePlaylistMenuItemId(playlistMenuId, clipId);\n};\n\nexport const useAddPlaylistMenuItem = (clipId: string) => {\n const playlistMenuId = usePlaylistMenuId();\n const playlistItemId = usePlaylistMenuItemId(clipId);\n const setPlaylistMenuItems = useSetRecoilState(playlistMenuAtoms.playlistMenuState(playlistMenuId));\n const setPlaylistItemValue = useSetRecoilState(playlistMenuAtoms.playlistMenuItem(playlistItemId));\n\n return useCallback(\n (clip: PlaylistMenuItem) => {\n setPlaylistItemValue(clip);\n setPlaylistMenuItems((items: string[]) => {\n return [...items, clipId];\n });\n },\n [clipId, setPlaylistItemValue, setPlaylistMenuItems],\n );\n};\n\nexport const useRemovePlaylistMenuItem = (clipId: string) => {\n const playlistMenuId = usePlaylistMenuId();\n const playlistItemId = usePlaylistMenuItemId(clipId);\n const setPlaylistMenuItems = useSetRecoilState(playlistMenuAtoms.playlistMenuState(playlistMenuId));\n const reset = useResetRecoilState(playlistMenuAtoms.playlistMenuItem(playlistItemId));\n\n return useCallback(() => {\n reset();\n setPlaylistMenuItems((items: string[]) => {\n const index = items.indexOf(clipId);\n\n if (index === -1) return items;\n return [...items.slice(0, index), ...items.slice(index + 1)];\n });\n }, [clipId, reset, setPlaylistMenuItems]);\n};\n\ntype ClipProps = {\n taggingEvent: TaggingEvent;\n counter: number;\n hasVideo: boolean;\n disabled: boolean;\n selected: boolean;\n isMultiselectModeActive?: boolean;\n onPlay: (taggingEvent: TaggingEvent) => void;\n onDelete: (id: string) => void;\n onRename: (taggingEvent: TaggingEvent) => void;\n onTrim: (taggingEvent: TaggingEvent) => void;\n};\n\nexport const TaggingEventClip = ({\n taggingEvent,\n counter,\n hasVideo,\n disabled,\n selected,\n isMultiselectModeActive = false,\n onPlay,\n onDelete,\n onRename,\n onTrim,\n}: ClipProps) => {\n const { id, time, timeAfter, timeBefore, typeOfPlay } = taggingEvent;\n\n const [name, setName] = useState<string>(taggingEvent.name);\n const [menuOpen, setMenuOpen] = useState<boolean>(false);\n const [renaming, setRenaming] = useState<boolean>(false);\n const [renamingLoading, setRenamingLoading] = useState<boolean>(false);\n const addPlaylistItem = useAddPlaylistMenuItem(id);\n const removePlaylistItem = useRemovePlaylistMenuItem(id);\n\n const resetUI = useCallback(() => {\n setMenuOpen(false);\n setRenamingLoading(false);\n setRenaming(false);\n }, []);\n\n const handleMenuClose = useCallback(() => {\n setMenuOpen(false);\n resetUI();\n }, [resetUI]);\n\n const handleRename = useCallback((_event: TaggingEvent) => {\n setMenuOpen(false);\n setRenaming(true);\n }, []);\n\n const handleRenameCancel = useCallback(() => {\n resetUI();\n }, [resetUI]);\n\n const handlePlay = () => {\n onPlay(taggingEvent);\n };\n\n const handleRenameConfirm = useCallback(() => {\n setRenamingLoading(true);\n\n const { recordingId, id: taggingEventId } = taggingEvent;\n fetchRenameTaggingEvent({ recordingId, taggingEventId, name }).then((res) => {\n resetUI();\n if (!res.error) {\n onRename({ ...taggingEvent, name });\n }\n });\n }, [resetUI, taggingEvent, name, onRename]);\n\n const startTime = time - timeBefore > 0 ? time - timeBefore : 0;\n const endTime = time + timeAfter;\n\n const handleOnChange = (_event: React.ChangeEvent<HTMLInputElement>, checked: boolean) => {\n checked\n ? addPlaylistItem({\n id: id,\n endTime: time + timeAfter,\n startTime: time - timeBefore > 0 ? time - timeBefore : 0,\n playlistId: '',\n name: name,\n })\n : removePlaylistItem();\n };\n\n const handleEditNameInputChange = useCallback<ChangeEventHandler<HTMLInputElement>>((event) => {\n event.preventDefault();\n setName(event.target.value);\n }, []);\n\n return (\n <TaggingEventClipContainer multiselect={isMultiselectModeActive} key={id}>\n {isMultiselectModeActive && (\n <CheckboxWithCustomColor\n customColor='typography'\n checked={selected}\n onClick={(event?: React.MouseEvent<HTMLButtonElement>) => {\n event && event.stopPropagation();\n }}\n onChange={handleOnChange}\n />\n )}\n\n <TypeCounter\n color={TaggingEventClipTypeColor[typeOfPlay]}\n backgroundColor={TaggingEventClipTypeBackgroundColor[typeOfPlay]}\n disabled={disabled}\n >\n {`${counter}`.padStart(3, '0')}\n </TypeCounter>\n\n {hasVideo && (\n <IconButton size='small' disabled={disabled} onClick={handlePlay}>\n <IconPlay size='small' sx={{ color: getIconPlayColor({ disabled, typeOfPlay }) }} />\n </IconButton>\n )}\n\n <TaggingEventEditableTextContainer>\n {renaming ? (\n <TaggingEventEditableText value={name} onChange={handleEditNameInputChange} size='small' fullWidth />\n ) : (\n name\n )}\n </TaggingEventEditableTextContainer>\n <TaggingEventClipEnd>\n {renaming && (\n <TagEventClipActions\n loading={renamingLoading}\n onConfirm={handleRenameConfirm}\n onCancel={handleRenameCancel}\n />\n )}\n {!disabled && !renaming && (\n <Typography fontWeight='fontWeightMedium' fontSize={fontSizes.default}>\n {secondsToTimeString(startTime)} - {secondsToTimeString(endTime)}\n </Typography>\n )}\n {!renaming && !isMultiselectModeActive && (\n <TagEventClipMenu\n hasVideo={hasVideo}\n initialShow={menuOpen}\n onClose={handleMenuClose}\n event={taggingEvent}\n onDelete={() => {\n setMenuOpen(false);\n onDelete(taggingEvent.id);\n }}\n onRename={handleRename}\n onTrim={onTrim}\n />\n )}\n </TaggingEventClipEnd>\n </TaggingEventClipContainer>\n );\n};\n","import { Box, styled } from '@mui/material';\n\nexport const TaggingEventsListContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n marginTop: theme.spacing(1),\n padding: theme.spacing(0, 0, 1),\n}));\n\nexport const TaggingEventsListNotFoundImg = styled('img')(({ theme }) => ({\n marginTop: theme.spacing(3),\n width: '160px',\n}));\n","import { Box, styled } from '@mui/material';\n\nexport const TagEventsSkeletonContainer = styled(Box)(() => ({\n position: 'relative',\n}));\n\nexport const TagEventsSkeletonContent = styled(Box)(() => ({\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n zIndex: 10,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n}));\n","import { Colors } from 'kognia-ui';\nimport { ReactNode, SVGProps } from 'react';\n\nimport { TagEventsSkeletonContainer, TagEventsSkeletonContent } from './styled';\n\ninterface Props {\n children: ReactNode;\n}\n\nconst Stripes = (props: SVGProps<SVGSVGElement>) => {\n return (\n <svg width='100%' height={'504px'} fill='none' xmlns='http://www.w3.org/2000/svg' {...props}>\n <rect width='100%' height={'114px'} rx={4} fill={Colors.athens} />\n <rect y={130} width='100%' height={'114px'} rx={4} fill={Colors.athens} />\n <rect y={260} width='100%' height={'114px'} rx={4} fill={Colors.athens} />\n <rect y={390} width='100%' height={'114px'} rx={4} fill={Colors.athens} />\n </svg>\n );\n};\n\nexport const TagEventsListSkeleton = ({ children }: Props) => {\n return (\n <TagEventsSkeletonContainer>\n <Stripes />\n <TagEventsSkeletonContent>{children}</TagEventsSkeletonContent>\n </TagEventsSkeletonContainer>\n );\n};\n","import { Typography } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TaggingEvent } from 'api/tagging-tool/types';\n// eslint-disable-next-line import/no-restricted-paths\nimport { usePlaylistMenuItems } from 'pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/add-to-playlist-menu-state/hooks';\nimport { TaggingEventClip } from 'pages/tagging-tool-tag-recording/components/tag-event-clip';\nimport NotFoundImg from 'shared/assets/cameras.svg';\nimport { useDuration } from 'shared/components/video-player';\n\nimport { TaggingEventsListContainer, TaggingEventsListNotFoundImg } from './styled';\nimport { TagEventsListSkeleton } from '../tag-events-list-skeleton';\n\nexport type TaggingEventsPanelProps = {\n children?: React.ReactNode;\n hasVideo: boolean;\n data: Array<TaggingEvent>;\n isMultiselectModeActive?: boolean;\n onPlayClip: (event: TaggingEvent) => void;\n onDelete: (id: string) => void;\n onRename: (event: TaggingEvent) => void;\n onTrim: (event: TaggingEvent) => void;\n};\n\nexport const TaggingEventsList = (props: TaggingEventsPanelProps) => {\n const duration = useDuration();\n const { t } = useTranslation();\n const { data } = props;\n const selectedPlaylistItems = usePlaylistMenuItems();\n\n const handlePlay = useCallback(\n (event: TaggingEvent) => {\n props.onPlayClip(event);\n },\n [props],\n );\n\n return (\n <TaggingEventsListContainer>\n {data.length === 0 && (\n <TagEventsListSkeleton>\n <TaggingEventsListNotFoundImg src={NotFoundImg} alt='' />\n <Typography fontSize={fontSizes.default} fontWeight={fontWeight['500']} marginTop={2}>\n {t('tagging-tool:no-video-available')}\n </Typography>\n <Typography fontSize={fontSizes.default} color={Colors.storm} marginTop={1}>\n {t('tagging-tool:recording-clips.nothing-to-show')}\n </Typography>\n </TagEventsListSkeleton>\n )}\n {data.map((event, idx) => {\n return (\n <TaggingEventClip\n key={event.id}\n taggingEvent={event}\n counter={idx}\n hasVideo={props.hasVideo}\n disabled={event.time < 0 || event.time > (duration || Number.MAX_SAFE_INTEGER)}\n selected={selectedPlaylistItems.findIndex((item) => event.id === item.id) !== -1}\n isMultiselectModeActive={props.isMultiselectModeActive}\n onPlay={handlePlay}\n onDelete={props.onDelete}\n onRename={props.onRename}\n onTrim={props.onTrim}\n />\n );\n })}\n </TaggingEventsListContainer>\n );\n};\n","import { Button, Grid, Stack, Typography } from '@mui/material';\nimport { fontSizes, fontWeight } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory, useLocation } from 'react-router';\n\nimport { TaggingEvent } from 'api/tagging-tool/types';\nimport { useFetchTaggingEvents } from 'api/tagging-tool/use-fetch-tagging-events';\nimport { CheckboxWithCustomColor } from 'shared/components/CheckboxWithCustomColor/CheckboxWithCustomColor';\nimport { IconTimeline } from 'shared/components/icons';\nimport IconPlaylist from 'shared/components/icons/icon-playlist';\nimport { PlaylistMenuVerticalPosition } from 'shared/components/select-playlist-dialog/SelectPlaylistDialog';\nimport { useCurrentPlaylistItem, useVideoPlayerActions } from 'shared/components/video-player';\nimport VideoPlayerComponent from 'shared/components/video-player/video-player-component';\nimport { defaultVideoAspectRatio } from 'shared/components/video-player/video-player-component/hooks/use-video-aspect-ratio';\nimport { SortDirection } from 'shared/types/filters/types';\nimport { FundamentalsSelection, NewPlaylistItemWithId } from 'shared/types/playlist/types';\nimport { makePlaylistIndexRoute, makeTimelineRoute } from 'tagging-tool/utility/navigation';\n\nimport { useCreateTaggingEventFromCurrentVideo } from './hooks/use-create-tagging-event-from-current-video';\nimport { TagFilterBar, TagsList } from './styled';\nimport { useAddManyToPlaylist } from '../../../../api/playlist/useAddManyToPlaylist';\nimport { invalidatePlaylistsQuery } from '../../../../api/playlist/useFetchPlaylists';\nimport { useMapClipsToPlaylistItems } from '../../../../shared/hooks/use-map-clips-to-post-playlist-items/useMapClipsToPlaylistItems';\n// eslint-disable-next-line import/no-restricted-paths\nimport { Clip } from '../../../tactical-analysis/api/use-tactical-analysis-data/generate-timeline-rows/types/clip';\n// eslint-disable-next-line import/no-restricted-paths\nimport AddToPlaylistMenu from '../../../tactical-analysis/components/tactical-analysis/add-to-playlist-menu';\nimport {\n useAddMultiplePlaylistItems,\n usePlaylistMenuItems,\n useRemoveMultiplePlaylistMenuItem,\n // eslint-disable-next-line import/no-restricted-paths\n} from '../../../tactical-analysis/components/tactical-analysis/add-to-playlist-menu/add-to-playlist-menu-state/hooks';\nimport { useKeypads } from '../../hooks/use-keypads';\nimport { ClipPlayerDialog } from '../clip-player-dialog';\nimport { ClipTrimmer } from '../clip-trimmer';\nimport { KeypadsPanel } from '../keypads-panel';\nimport { TagFiltersModal } from '../tag-filters-dialog';\nimport { TagRecordingActions } from '../tag-recording-actions';\nimport { TagRecordingFilters } from '../tag-recording-filters';\nimport { TaggingEventsList } from '../tagging-events-list';\n\ntype TagRecordingScreenProps = {\n recordingId: string;\n isLive: boolean;\n};\n\nexport const TagRecordingScreen = ({ recordingId, isLive }: TagRecordingScreenProps) => {\n const [sortOrder, setSortOrder] = useState<SortDirection>(SortDirection.ASC);\n\n const {\n addTaggingEvent,\n appliedFilters,\n data,\n filterOptions,\n hasFiltersApplied,\n removeTaggingEvent,\n updateTaggingEvent,\n addMultipleTaggingEvents,\n resetFilters,\n setFilters,\n taggingEvents,\n } = useFetchTaggingEvents(recordingId, {\n isLive,\n sortOrder: sortOrder === SortDirection.ASC ? SortDirection.ASC : SortDirection.DESC,\n });\n const reset = useRemoveMultiplePlaylistMenuItem();\n const { addManyToPlaylist } = useAddManyToPlaylist();\n const mapClipsToPlaylistItems = useMapClipsToPlaylistItems({ recordingId });\n\n const history = useHistory();\n const { t } = useTranslation();\n const { search } = useLocation();\n const actions = useVideoPlayerActions();\n const [playingTaggingEvent, setPlayingTaggingEvent] = useState<TaggingEvent | null>(null);\n const selectedPlaylistItems = usePlaylistMenuItems();\n const removeMultiplePlaylistItems = useRemoveMultiplePlaylistMenuItem();\n const addMultiplePlaylistItems = useAddMultiplePlaylistItems();\n const playlistItem = useCurrentPlaylistItem();\n const { createTaggingEventFromCurrentVideo } = useCreateTaggingEventFromCurrentVideo({\n onSuccess: (event: TaggingEvent) => addTaggingEvent(event),\n isLive,\n recordingId,\n });\n\n const [{ keypadsData, loadingKeypad, keypadData }, { handleChangeKeypad }] = useKeypads({\n recordingId,\n isLive,\n });\n\n const handlePlayClip = useCallback(\n (taggingEvent: TaggingEvent) => {\n actions.handleStandBy();\n setPlayingTaggingEvent(taggingEvent);\n },\n [actions],\n );\n\n const handleCancelClipPlayer = useCallback(() => {\n actions.resumeStandBy();\n setPlayingTaggingEvent(null);\n }, [actions]);\n\n const [showsKeypad, setShowsKeypad] = useState<boolean>(() => {\n if (search) {\n const qs = new URLSearchParams(search);\n return qs.has('showsKeypad');\n }\n\n return true;\n });\n\n const [showsFiltersModal, setShowsFiltersModal] = useState<boolean>(false);\n const [trimEvent, setTrimEvent] = useState<TaggingEvent>();\n const [importing, setImporting] = useState<boolean>(false);\n const [isMultiselectModeActive, setIsMultiselectModeActive] = useState<boolean>(false);\n\n // handlers\n const handleCloseKeypads = useCallback(() => setShowsKeypad(false), []);\n const handleShowFiltersModal = useCallback(() => setShowsFiltersModal(true), []);\n const handleStartTrim = useCallback((event: TaggingEvent) => setTrimEvent(event), []);\n const handleEndTrim = useCallback(() => setTrimEvent(undefined), []);\n const handleHideFiltersModal = useCallback(\n (reset?: boolean) => {\n if (reset === true) {\n resetFilters();\n }\n setShowsFiltersModal(false);\n },\n [resetFilters],\n );\n\n const handleSaveTrim = useCallback(\n (event: TaggingEvent) => {\n updateTaggingEvent(event);\n setTrimEvent(undefined);\n },\n [updateTaggingEvent],\n );\n\n const handleSortChange = (newOrder: SortDirection) => {\n setSortOrder(newOrder);\n };\n\n const handlePlaylist = useCallback(() => {\n history.push(makePlaylistIndexRoute({ recordingId: recordingId }));\n }, [history, recordingId]);\n\n const handleTimeline = useCallback(() => {\n history.push(makeTimelineRoute({ recordingId: recordingId }));\n }, [history, recordingId]);\n\n const countSelectedClips = () =>\n taggingEvents.filter((clip) => selectedPlaylistItems.map((item) => item.id).includes(clip.id)).length;\n\n const handleOnMultiselectChange = (event: React.ChangeEvent<HTMLInputElement>, checked: boolean) => {\n checked\n ? addMultiplePlaylistItems(\n taggingEvents\n .filter((clip) => !selectedPlaylistItems.map((item) => item.id).includes(clip.id))\n .map((selectedClip) => {\n return {\n id: selectedClip.id,\n endTime: selectedClip.time + selectedClip.timeAfter,\n startTime:\n selectedClip.time - selectedClip.timeBefore > 0 ? selectedClip.time - selectedClip.timeBefore : 0,\n playlistId: '',\n name: selectedClip.name,\n } as NewPlaylistItemWithId;\n }),\n )\n : removeMultiplePlaylistItems(\n taggingEvents\n .filter((clip) => selectedPlaylistItems.map((item) => item.id).includes(clip.id))\n .map((clip) => clip.id),\n );\n };\n\n const handleShowKeypad = useCallback(() => {\n setIsMultiselectModeActive(false);\n setShowsKeypad(!showsKeypad);\n }, [showsKeypad]);\n\n const handleShowMultiselectMode = useCallback(() => {\n setShowsKeypad(false);\n setIsMultiselectModeActive(!isMultiselectModeActive);\n }, [isMultiselectModeActive]);\n\n const handleSave = useCallback(\n ({\n items,\n playlistId,\n fundamentalsSelected,\n }: {\n items: Clip[];\n playlistId: string;\n fundamentalsSelected: FundamentalsSelection;\n }) => {\n addManyToPlaylist({\n items: mapClipsToPlaylistItems({ items, playlistId, fundamentalsSelected }),\n options: {\n onSuccess: async () => {\n await invalidatePlaylistsQuery();\n reset(selectedPlaylistItems.map((clip) => clip.id));\n },\n },\n });\n },\n [addManyToPlaylist, mapClipsToPlaylistItems, reset, selectedPlaylistItems],\n );\n const showSidePanel = showsKeypad || isMultiselectModeActive;\n\n if (!taggingEvents) return null;\n\n return (\n <>\n <Grid container spacing={2}>\n {/* left */}\n <Grid item xs={12} sm={12} md={showSidePanel ? 6 : 12} lg={showSidePanel ? 7 : 12} xl={showSidePanel ? 7 : 12}>\n {!importing && data?.matchVideoSource?.src && (\n <Grid container direction={'row'} justifyContent={'flex-start'}>\n <Grid item xs={12}>\n <Stack direction='row' spacing={1} justifyContent='flex-end' mb={2}>\n <Button\n variant='outlined'\n color='secondary'\n startIcon={<IconPlaylist size='small' color='secondary' />}\n onClick={handlePlaylist}\n >\n {t('tagging-tool:tagging-recording.action-playlist')}\n </Button>\n\n <Button\n variant='outlined'\n color='secondary'\n onClick={handleTimeline}\n startIcon={<IconTimeline size='small' color='secondary' />}\n >\n {t('tagging-tool:tagging-recording.action-timeline')}\n </Button>\n </Stack>\n </Grid>\n </Grid>\n )}\n <Grid container direction={'row'} justifyContent={'flex-start'}>\n {/* player */}\n {data?.matchVideoSource?.src && (\n <Grid item xs={12} p={0}>\n <div style={{ aspectRatio: defaultVideoAspectRatio }}>\n <VideoPlayerComponent showVideoPlayerBar={true} showTacticDrawings={false} />\n </div>\n </Grid>\n )}\n {trimEvent !== undefined && (\n <Grid item xs={12}>\n <ClipTrimmer event={trimEvent} onSave={handleSaveTrim} onCancel={handleEndTrim} />\n </Grid>\n )}\n </Grid>\n <TagFilterBar container direction={'row'} justifyContent={'flex-start'} hidden={trimEvent !== undefined}>\n <Grid item container xs={12} justifyContent={'space-between'} alignItems={'center'}>\n <Grid item>\n <TagRecordingFilters\n handleSortChange={handleSortChange}\n filtering={hasFiltersApplied}\n handleShowFiltersModal={handleShowFiltersModal}\n />\n </Grid>\n <Grid item>\n <TagRecordingActions\n handleImportEvents={addMultipleTaggingEvents}\n importing={importing}\n isMultiselectModeActive={isMultiselectModeActive}\n orderedTaggingEvents={taggingEvents}\n recordingId={recordingId}\n isLive={isLive}\n setImporting={setImporting}\n setIsMultiselectModeActive={handleShowMultiselectMode}\n setShowsKeypad={handleShowKeypad}\n showsKeypad={showsKeypad}\n videoSrc={data?.matchVideoSource?.src}\n />\n </Grid>\n {isMultiselectModeActive && (\n <Grid item xs={12} container direction={'row'} justifyContent={'flex-start'} paddingLeft={2}>\n <Grid item xs={12} display='flex' alignItems='center' gap={1}>\n <CheckboxWithCustomColor\n customColor='typography'\n checked={countSelectedClips() === taggingEvents.length}\n indeterminate={countSelectedClips() < (taggingEvents.length || 0) && countSelectedClips() > 0}\n onChange={handleOnMultiselectChange}\n onClick={(event: React.MouseEvent<HTMLButtonElement>) => event.stopPropagation()}\n />\n <Typography fontWeight={fontWeight['500']} fontSize={fontSizes.small}>\n {`${t('tagging-tool:tagging-recording.all-clips')} (${countSelectedClips()})`}\n </Typography>\n </Grid>\n </Grid>\n )}\n </Grid>\n <TagsList container direction={'row'} justifyContent={'flex-start'} hidden={trimEvent !== undefined}>\n {/** events */}\n <Grid item xs={12}>\n <TaggingEventsList\n hasVideo={Boolean(data?.matchVideoSource?.src)}\n onPlayClip={handlePlayClip}\n data={taggingEvents}\n onDelete={removeTaggingEvent}\n onRename={updateTaggingEvent}\n onTrim={handleStartTrim}\n isMultiselectModeActive={isMultiselectModeActive}\n />\n </Grid>\n </TagsList>\n </TagFilterBar>\n </Grid>\n {/* right: keypad */}\n <Grid item xs={12} sm={12} md={6} lg={5} xl={5}>\n {keypadData && showsKeypad && (\n <KeypadsPanel\n disabled={trimEvent !== undefined}\n keypad={keypadData}\n keypads={keypadsData ?? []}\n loadingKeypad={loadingKeypad}\n onChangeKeypad={handleChangeKeypad}\n onClose={handleCloseKeypads}\n onKeypadTag={createTaggingEventFromCurrentVideo}\n videoStartRecordingTime={data?.startRecordingTime}\n />\n )}\n {isMultiselectModeActive && (\n <AddToPlaylistMenu\n isOpen={isMultiselectModeActive}\n onClose={() => setIsMultiselectModeActive(false)}\n recordingId={recordingId}\n verticalPosition={PlaylistMenuVerticalPosition.Top}\n onSave={handleSave}\n />\n )}\n </Grid>\n </Grid>\n {playingTaggingEvent && data?.matchVideoSource?.src ? (\n <ClipPlayerDialog\n videoTypes={playlistItem.videoTypes}\n data={{ src: data?.matchVideoSource?.src, id: playingTaggingEvent.id, event: playingTaggingEvent }}\n onCancel={handleCancelClipPlayer}\n />\n ) : null}\n\n <TagFiltersModal\n appliedFilters={appliedFilters}\n applyFilters={setFilters}\n filterOptions={filterOptions}\n onClose={handleHideFiltersModal}\n resetFilters={resetFilters}\n show={showsFiltersModal}\n />\n </>\n );\n};\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { transformMatchWithEpisodes } from 'api/match/transformers/match/matchWithEpisodes';\nimport { liveTaggingSessionAsMatchUrl } from 'api/routes';\nimport { MatchWithEpisodes } from 'shared/types/match/types';\n\nexport const generateLiveSessionAsMatchRef = (liveTaggingSessionId: string) => {\n return [`fetch-live-tagging-session-as-match:${liveTaggingSessionId}`];\n};\n\ninterface useFetchLiveTaggingSessionAsMatch {\n (matchId: string): UseQueryResult<MatchWithEpisodes>;\n}\n\nexport const useLiveTaggingSessionAsMatch: useFetchLiveTaggingSessionAsMatch = (liveTaggingSessionId) => {\n const fetchQueryRef = generateLiveSessionAsMatchRef(liveTaggingSessionId);\n const fetchRequest = useFetchRequest<MatchWithEpisodes>({\n queryRef: fetchQueryRef,\n url: liveTaggingSessionAsMatchUrl(liveTaggingSessionId),\n transformer: transformMatchWithEpisodes,\n });\n\n return { ...fetchRequest };\n};\n","import { useMatchWithEpisodes } from 'api/match/useMatchWithEpisodes';\nimport { KeypadSimple } from 'api/tagging-tool/types';\nimport { useFetchKeypads } from 'api/tagging-tool/use-fetch-keypads';\nimport { useLiveTaggingSessionAsMatch } from 'api/tagging-tool/use-fetch-live-session-as-match';\nimport { useFetchTaggingEvents } from 'api/tagging-tool/use-fetch-tagging-events';\nimport { fetchQueryResponse } from 'api/types';\nimport { TaggingEvents } from 'shared/types';\nimport { MatchWithEpisodes } from 'shared/types/match/types';\n\nexport type UseTaggingToolTagRecordingDataType = {\n keyPads: KeypadSimple[] | undefined;\n matchWithEpisodes: MatchWithEpisodes | undefined;\n taggingEvents: TaggingEvents | undefined;\n};\n\ninterface UseTaggingToolTagRecordingDataInterface {\n (recordingId: string, isLive?: boolean): fetchQueryResponse<UseTaggingToolTagRecordingDataType>;\n}\n\nexport const useTaggingToolTagRecordingData: UseTaggingToolTagRecordingDataInterface = (\n recordingId,\n isLive = false,\n) => {\n const {\n data: matchWithEpisodes,\n isError: isErrorMatch,\n isFetching: isFetchingMatch,\n isSuccess: isSuccessMatch,\n isLoading: isLoadingMatch,\n } = isLive ? useLiveTaggingSessionAsMatch(recordingId) : useMatchWithEpisodes({ recordingId });\n\n const {\n data: taggingEvents,\n isError: isErrorTaggingEvents,\n isFetching: isFetchingTaggingEvents,\n isSuccess: isSuccessTaggingEvents,\n isLoading: isLoadingTaggingEvents,\n } = useFetchTaggingEvents(recordingId, { isLive });\n\n const {\n data: keyPads,\n isError: isErrorKeypads,\n isFetching: isFetchingKeypads,\n isSuccess: isSuccessKeypads,\n isLoading: isLoadingKeypads,\n } = useFetchKeypads(recordingId);\n\n return {\n data: {\n keyPads,\n matchWithEpisodes,\n taggingEvents,\n },\n isError: isErrorKeypads || isErrorMatch || isErrorTaggingEvents,\n isSuccess: isSuccessKeypads && isSuccessMatch && isSuccessTaggingEvents,\n isFetching: isFetchingKeypads || isFetchingMatch || isFetchingTaggingEvents,\n isLoading: isLoadingKeypads || isLoadingMatch || isLoadingTaggingEvents,\n };\n};\n","import { useClientId } from 'shared/contexts/app-state';\nimport { DataFetching } from 'shared/hooks/use-page-state-machine';\n\nimport {\n useTaggingToolTagRecordingData,\n UseTaggingToolTagRecordingDataType,\n} from '../use-tagging-tool-tag-recording-data';\n\nexport const useTaggingToolTagRecordingPage = (\n recordingId: string,\n isLive: boolean,\n): DataFetching<UseTaggingToolTagRecordingDataType> => {\n const { clientId } = useClientId();\n const taggingToolTagRecordingData = useTaggingToolTagRecordingData(recordingId, isLive);\n\n const isInvalidClient = !taggingToolTagRecordingData?.data?.matchWithEpisodes?.match?.clientIds.includes(clientId);\n\n return {\n ...taggingToolTagRecordingData,\n isInvalidClient,\n };\n};\n","import {\n PANORAMIC_PLAYING_MODE,\n TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE,\n} from 'shared/components/video-player/defaultPlayingModes';\nimport { VideoSourceType } from 'shared/components/video-player/types';\nimport { VideoSource } from 'shared/types/recording/types';\nimport { getVideoSources } from 'shared/utils/get-video-sources';\n\ninterface Options {\n videoSources: VideoSource[];\n startTime?: number;\n endTime?: number;\n}\n\nexport const generateTaggingVideoTypes = ({ videoSources, startTime = 0, endTime = 0 }: Options): VideoSourceType[] => {\n const sources = getVideoSources(videoSources);\n\n const hasTacticalCameraVideo = Boolean(sources?.tacticalCameraVideo?.src);\n const hasUploadedVideo = Boolean(sources?.uploadedVideo?.src);\n const hasPanoramaVideo = Boolean(sources?.panoramicVideo?.src);\n\n return [\n ...(hasUploadedVideo\n ? [\n {\n playingMode: TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE,\n videoSources: [\n {\n startTime,\n endTime,\n src: sources.uploadedVideo.src,\n id: sources.uploadedVideo.id,\n },\n ],\n },\n ]\n : []),\n ...(hasTacticalCameraVideo\n ? [\n {\n playingMode: TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE,\n videoSources: [\n {\n startTime,\n endTime,\n src: sources.tacticalCameraVideo.src,\n id: sources.tacticalCameraVideo.id,\n },\n ],\n },\n ]\n : []),\n ...(hasPanoramaVideo\n ? [\n {\n playingMode: PANORAMIC_PLAYING_MODE,\n videoSources: [\n {\n startTime,\n endTime,\n src: sources.panoramicVideo.src,\n id: sources.panoramicVideo.id,\n },\n ],\n },\n ]\n : []),\n ];\n};\n","import queryString from 'query-string';\nimport React, { useEffect, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation, useParams } from 'react-router-dom';\n\n// eslint-disable-next-line import/no-restricted-paths\nimport { AddToPlaylistMenuStateProvider } from 'pages/tactical-analysis/components/tactical-analysis/add-to-playlist-menu/add-to-playlist-menu-state';\nimport Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport Spinner from 'shared/components/spinner';\nimport { SwitchEnvironment } from 'shared/components/switch-environment';\nimport { VideoPlayerStateProvider } from 'shared/components/video-player';\nimport { PANORAMIC_PLAYING_MODE } from 'shared/components/video-player/defaultPlayingModes';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\nimport usePageStateMachine from 'shared/hooks/use-page-state-machine';\n\nimport { TagRecordingScreen } from './components/tag-recording-screen';\nimport { UseTaggingToolTagRecordingDataType } from './hooks/use-tagging-tool-tag-recording-data';\nimport { useTaggingToolTagRecordingPage } from './hooks/use-tagging-tool-tag-recording-page';\nimport { generateTaggingVideoTypes } from './utils';\n\nexport const TaggingToolTagContainer = () => {\n const { recordingId } = useParams<{ recordingId: string }>();\n const { t } = useTranslation();\n const { search } = useLocation();\n const { isLive } = queryString.parse(search);\n const { data, isPageLoading, isPageReady, refetch, isInvalidClient } =\n usePageStateMachine<UseTaggingToolTagRecordingDataType>(() =>\n useTaggingToolTagRecordingPage(recordingId, isLive === 'true'),\n );\n const branding = useBranding();\n\n useEffect(() => {\n document.title = t('common:metas.title.tagging', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n const videoTypes = useMemo(\n () =>\n !data?.matchWithEpisodes?.match?.videoSources\n ? []\n : generateTaggingVideoTypes({\n videoSources: data.matchWithEpisodes.match.videoSources,\n }),\n [data],\n );\n\n const playlistItems: PlaylistItemType[] = useMemo(\n () =>\n !data?.matchWithEpisodes?.match?.id\n ? []\n : [\n {\n id: 'tagging-tool-item',\n duration: 0,\n videoTypes,\n name: '',\n index: 0,\n fundamentalsSelected:\n data?.matchWithEpisodes.episodes.length > 0\n ? {\n tacticalAnalysisId: data?.matchWithEpisodes.episodes[0].tacticalAnalysisId,\n fundamentalsSelected: ['all'],\n }\n : { tacticalAnalysisId: undefined, fundamentalsSelected: [] },\n hasHomographies: false,\n recordingId: data?.matchWithEpisodes.match.id,\n },\n ],\n [videoTypes, data],\n );\n\n if (isInvalidClient && data?.matchWithEpisodes?.match.clientIds) {\n return <SwitchEnvironment resourceClientsIds={data.matchWithEpisodes.match.clientIds} />;\n }\n\n return (\n <SidebarLayout>\n <Container>\n {isPageLoading && <Spinner isFullPage />}\n {isPageReady && data?.taggingEvents && (\n <AddToPlaylistMenuStateProvider id={'tagging-tool-playlist-menu'}>\n <VideoPlayerStateProvider\n refreshData={refetch}\n playerId={`tagging-tool-${data.matchWithEpisodes?.match.id || data.taggingEvents.name}`}\n playlistItems={playlistItems}\n playingMode={videoTypes[0]?.playingMode || PANORAMIC_PLAYING_MODE}\n >\n <TagRecordingScreen isLive={isLive === 'true'} key={recordingId} recordingId={recordingId} />\n </VideoPlayerStateProvider>\n </AddToPlaylistMenuStateProvider>\n )}\n </Container>\n </SidebarLayout>\n );\n};\n","import { faro } from '@grafana/faro-web-sdk';\nimport { useCallback } from 'react';\n\nimport { User } from 'shared/types/user/types';\n\nexport const useSetUserAndClientIdForMetrics = () => {\n return useCallback((clientId: string, user: User) => {\n faro.api.setUser({\n id: user.id,\n email: user.email,\n attributes: {\n client_id: clientId,\n },\n });\n }, []);\n};\n","import { getOauth2LoginUrl } from 'api/routes';\n\nconst redirectToExternalLogin = (path = '/') => {\n window.location.href = getOauth2LoginUrl(path);\n};\n\nexport default redirectToExternalLogin;\n","import { isArray } from 'lodash';\nimport { useEffect } from 'react';\nimport { Route, RouteProps, useHistory } from 'react-router-dom';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { useSetUserAndClientIdForMetrics } from 'kognia/metrics/hooks/use-set-user-and-client-id-for-metrics';\nimport { APP_COLLECT_METRICS } from 'kognia/metrics/utils';\n\nimport { isUserAdmin, useClientIdValue, useFeatureFlag, useIsUserAuthorized, useUser } from '../../contexts/app-state';\nimport { ActionTypes } from '../../streams/actionTypes';\nimport { publishEvent } from '../../streams/eventEmitter';\nimport { MetricsNames } from '../../types/metrics';\nimport redirectToExternalLogin from '../../utils/redirect-to-external-login';\n\ntype ProtectedRouteProps = RouteProps & {\n component: any;\n onlyAdminAccess?: boolean;\n featureFlag?: FEATURE_FLAG;\n};\n\nexport const ProtectedRoute = ({\n component: Component,\n featureFlag: featureFlag,\n onlyAdminAccess = false,\n ...rest\n}: ProtectedRouteProps) => {\n const history = useHistory();\n const isAdmin = isUserAdmin();\n const hasFeatureEnabled = useFeatureFlag(featureFlag);\n const isUserAuthorized = useIsUserAuthorized();\n const historyLocation = useHistory().location;\n const user = useUser();\n const clientId = useClientIdValue();\n const setUserAndClientIdForMetrics = useSetUserAndClientIdForMetrics();\n\n useEffect(() => {\n APP_COLLECT_METRICS && setUserAndClientIdForMetrics(clientId, user);\n }, [setUserAndClientIdForMetrics, user, clientId]);\n\n useEffect(() => {\n if (rest.path) {\n publishEvent({\n type: ActionTypes.VIEW_PAGE,\n payload: {\n name: MetricsNames.PAGE_VIEW,\n data: { generic_url: isArray(rest.path) ? rest.path[0] : rest.path, url: history.location.pathname },\n },\n });\n }\n }, [clientId, history.location, history.location.pathname, rest.path, user.id]);\n\n useEffect(() => {\n if (!isAdmin && onlyAdminAccess) {\n return history.push('/');\n }\n }, [history, isAdmin, onlyAdminAccess]);\n\n useEffect(() => {\n if (!isUserAuthorized) {\n return redirectToExternalLogin(`${historyLocation.pathname}${historyLocation.search}`);\n }\n }, [historyLocation.pathname, historyLocation.search, isUserAuthorized]);\n\n useEffect(() => {\n if (featureFlag && !hasFeatureEnabled) {\n history.push('/');\n }\n }, [featureFlag, hasFeatureEnabled, history]);\n\n if (!isUserAuthorized) return null;\n if (featureFlag && !hasFeatureEnabled) return null;\n if (!isAdmin && onlyAdminAccess) return null;\n\n return (\n <Route\n {...rest}\n render={(props) => (\n <>\n <Component {...props} />\n </>\n )}\n />\n );\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useUser } from 'shared/contexts/app-state';\n\nconst useIsLanguageDetectionReady = (): boolean => {\n const user = useUser();\n const { i18n } = useTranslation();\n const [isLanguageReady, setIsLanguageReady] = useState(false);\n\n const changeLanguage = useCallback(\n async (locale: string) => {\n await i18n.changeLanguage(locale);\n setIsLanguageReady(true);\n },\n [i18n],\n );\n\n useEffect(() => {\n if (!user.id) {\n setIsLanguageReady(true);\n } else if (i18n.language !== user.locale || !isLanguageReady) {\n changeLanguage(user.locale);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user]);\n\n return isLanguageReady;\n};\n\nexport default useIsLanguageDetectionReady;\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const BackofficeUnauthorizedContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n padding: theme.spacing(3, 2),\n background: Colors.white,\n borderRadius: theme.shape.borderRadius,\n}));\n\nexport const BackofficeLoadingContainer = styled(Box)(() => ({\n display: 'flex',\n justifyContent: 'center',\n}));\n","import { omit } from 'lodash';\nimport queryString from 'query-string';\n\nimport { SharedQueryOptions } from 'api/hooks/useInfinityQuery/types';\nimport { generateQueryParamsFromOptionsAndFilters } from 'api/utils';\n\nimport { CompetitionsFilters } from './competitions/use-competitions/types';\nimport { SeasonsApiFilters } from './seasons/use-seasons/types';\nimport { StagesApiFilters } from './stages/use-stages/types';\nimport { VenuesFilters } from './venues/use-venues/types';\nimport { MetadataPlayersApiFilters } from '../types/players';\nimport { MetadataTeamsFilters } from '../types/teams';\n\nexport const ALLOWED_BACKOFFICE_ORIGINS = [\n 'https://dev.app.kogniasports.com',\n 'https://app.st.kogniasports.com',\n 'https://app.kogniasports.com',\n 'http://localhost:3000',\n];\nexport const backofficeDomainUrl = window.location.origin;\nconst backofficeApiPrefix = '/backoffice/api';\nconst backofficeApiVersionPrefix = '/v1';\nconst backofficeApiWithVersionPrefix = `${backofficeApiPrefix}${backofficeApiVersionPrefix}`;\nconst cvatPrefix = '/cvat-client';\nconst fbvarsPrefix = '/fbvars';\nconst watcherPrefix = '/watcher';\nconst jobManagerPrefix = '/job-manager';\n\nexport const backofficeApiUrl = `${backofficeDomainUrl}${backofficeApiPrefix}`;\n\nexport const validateBackofficeOrigin = (url: string) =>\n ALLOWED_BACKOFFICE_ORIGINS.some((allowedOrigin) => url.startsWith(allowedOrigin));\n\nexport const annotationApiUrls = {\n CREATE_TASK: `${backofficeApiUrl}${cvatPrefix}/create-tasks`,\n DELETE_TASK: `${backofficeApiUrl}${cvatPrefix}/delete-tasks`,\n VALIDATE_TASK: `${backofficeApiUrl}${cvatPrefix}/validate-tasks`,\n ANNOTATIONS_TASK: `${backofficeApiUrl}${cvatPrefix}/load-annotations`,\n LABELS_TASK: `${backofficeApiUrl}${cvatPrefix}/update-labels`,\n PROCESS_EPISODE: `${backofficeApiUrl}${fbvarsPrefix}/process-episodes`,\n PROCESS_GAME: `${backofficeApiUrl}${watcherPrefix}/intake`,\n DELETE_EPISODE_OVERLAYS: `${backofficeApiUrl}${fbvarsPrefix}/delete-overlays`,\n THIRD_PARTY_SYNC: `${backofficeApiUrl}${jobManagerPrefix}/third-party-tracking`,\n THIRD_PARTY_EVENTS: `${backofficeApiUrl}${jobManagerPrefix}/third-party-events`,\n PLAYERS: `${backofficeApiWithVersionPrefix}/players`,\n TEAMS: `${backofficeApiWithVersionPrefix}/teams`,\n COMPETITIONS: `${backofficeApiWithVersionPrefix}/competitions`,\n SEASON_CLIENTS: `${backofficeApiWithVersionPrefix}/season-clients`,\n COACHES: `${backofficeApiWithVersionPrefix}/coaches`,\n VENUES: `${backofficeApiWithVersionPrefix}/venues`,\n SEASONS: `${backofficeApiWithVersionPrefix}/season-competitions`,\n MAPPINGS: `${backofficeApiWithVersionPrefix}/mappings`,\n GAMES: `${backofficeApiWithVersionPrefix}/fixtures`,\n GAME_PLAYERS: (gameId: string) => `${backofficeApiWithVersionPrefix}/fixtures/${gameId}/players`,\n RECORDINGS: `${backofficeApiWithVersionPrefix}/recordings`,\n STAGES: `${backofficeApiWithVersionPrefix}/stages`,\n SEASON_COMPETITIONS_STAGES: (seasonId: string) =>\n `${backofficeApiWithVersionPrefix}/season-competitions/${seasonId}/stages`,\n};\n\nexport const addUpdatePlayersToGamesUrl = (gameId: string) => `${annotationApiUrls.GAMES}/${gameId}/players`;\n\nconst omitSortOptions = (options: SharedQueryOptions) => {\n // Omitting filters that are not defined in the API to avoid sending them to the API.\n // Remove when params are available.\n return omit(options, 'sort', 'sortDirection');\n};\n\nexport const playersWithFiltersUrl = (options: SharedQueryOptions, filters: MetadataPlayersApiFilters) => {\n return queryString.stringifyUrl({\n url: annotationApiUrls.PLAYERS,\n query: generateQueryParamsFromOptionsAndFilters(omitSortOptions(options), filters),\n });\n};\n\nexport const getCompetitionsUrl = (options: SharedQueryOptions, filters: CompetitionsFilters) => {\n return queryString.stringifyUrl({\n url: annotationApiUrls.COMPETITIONS,\n query: generateQueryParamsFromOptionsAndFilters(omitSortOptions(options), filters),\n });\n};\n\nexport const getSeasonClientsUrl = (options: SharedQueryOptions) => {\n return queryString.stringifyUrl({\n url: annotationApiUrls.SEASON_CLIENTS,\n query: generateQueryParamsFromOptionsAndFilters(omitSortOptions(options), {}),\n });\n};\n\nexport const getCoachesUrl = (options: SharedQueryOptions, filters: CompetitionsFilters) => {\n return queryString.stringifyUrl({\n url: annotationApiUrls.COACHES,\n query: generateQueryParamsFromOptionsAndFilters(omitSortOptions(options), filters),\n });\n};\n\nexport const getVenuesUrl = (options: SharedQueryOptions, filters: VenuesFilters) => {\n return queryString.stringifyUrl({\n url: annotationApiUrls.VENUES,\n query: generateQueryParamsFromOptionsAndFilters(omitSortOptions(options), filters),\n });\n};\n\nexport const getSeasonsUrl = (options: SharedQueryOptions, filters: SeasonsApiFilters) => {\n return queryString.stringifyUrl({\n url: annotationApiUrls.SEASONS,\n query: generateQueryParamsFromOptionsAndFilters(omitSortOptions(options), filters),\n });\n};\n\nexport const getStagesUrl = (options: SharedQueryOptions, filters: StagesApiFilters) => {\n return queryString.stringifyUrl({\n url: annotationApiUrls.STAGES,\n query: generateQueryParamsFromOptionsAndFilters(omitSortOptions(options), filters),\n });\n};\n\nexport const teamsWithFiltersUrl = (options: SharedQueryOptions, filters: MetadataTeamsFilters) => {\n return queryString.stringifyUrl({\n url: annotationApiUrls.TEAMS,\n query: generateQueryParamsFromOptionsAndFilters(omitSortOptions(options), filters),\n });\n};\n\nexport const getGamesUrl = (options: SharedQueryOptions, filters: StagesApiFilters) => {\n return queryString.stringifyUrl({\n url: annotationApiUrls.GAMES,\n query: generateQueryParamsFromOptionsAndFilters(omitSortOptions(options), filters),\n });\n};\n\nexport const getRecordingsUrl = (options: SharedQueryOptions, filters: StagesApiFilters) => {\n return queryString.stringifyUrl({\n url: annotationApiUrls.RECORDINGS,\n query: generateQueryParamsFromOptionsAndFilters(omitSortOptions(options), filters),\n });\n};\n\n// Google Auth\nexport const googleAuthUrl = `${backofficeDomainUrl}/oauth2/auth`;\n\nexport const getGoogleOauth2LoginUrl = ({\n callbackUrl,\n}: {\n callbackUrl?: string;\n} = {}) => {\n return `${backofficeDomainUrl}/oauth2/start?rd=${callbackUrl}`;\n};\n","import { useFetchRequest } from 'api/hooks/useFetchRequest';\n\nimport { googleAuthUrl } from '../routes';\n\ninterface Params {\n enabled?: boolean;\n}\n\nexport const useIsGoogleAuthorized = ({ enabled }: Params = {}) => {\n const fetchRequest = useFetchRequest({\n queryRef: ['googleAuth'],\n url: googleAuthUrl,\n options: { enabled, retry: 0 },\n });\n\n const { isLoading, isError } = fetchRequest;\n\n const isBackofficeAuthorized = !(isError && !isLoading);\n\n return { isBackofficeAuthorized, isLoading };\n};\n","import { getGoogleOauth2LoginUrl } from '../../api/routes';\n\nexport const redirectToGoogleLogin = ({ callbackUrl }: { callbackUrl: string }) => {\n window.location.href = getGoogleOauth2LoginUrl({ callbackUrl });\n};\n","import { Button, Typography } from '@mui/material';\nimport { useEffect } from 'react';\nimport { Route, RouteProps, useHistory } from 'react-router-dom';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport Spinner from 'shared/components/spinner';\nimport { useFeatureFlag } from 'shared/contexts/app-state';\nimport { ENVIRONMENT } from 'shared/utils/env-variables';\n\nimport { BackofficeLoadingContainer, BackofficeUnauthorizedContainer } from './index.styled';\nimport { useIsGoogleAuthorized } from '../../api/use-is-google-authorized';\nimport { redirectToGoogleLogin } from '../../utils/redirect-to-google-login';\n\ntype ProtectedRouteProps = RouteProps & {\n component: any;\n featureFlag?: FEATURE_FLAG;\n};\n\nconst isLocalhost = ENVIRONMENT !== 'production';\n\nexport const BackofficeProtectedRoute = ({\n component: Component,\n featureFlag: featureFlag,\n ...rest\n}: ProtectedRouteProps) => {\n const history = useHistory();\n const hasFeatureEnabled = useFeatureFlag(featureFlag);\n const { isBackofficeAuthorized, isLoading } = useIsGoogleAuthorized({ enabled: !isLocalhost });\n\n useEffect(() => {\n if (featureFlag && !hasFeatureEnabled) {\n history.push('/');\n }\n }, [featureFlag, hasFeatureEnabled, history]);\n\n if (featureFlag && !hasFeatureEnabled) return null;\n\n if (isLocalhost ? false : isLoading)\n return (\n <BackofficeLoadingContainer>\n <Spinner />\n </BackofficeLoadingContainer>\n );\n\n if (!isBackofficeAuthorized && !isLocalhost)\n return (\n <BackofficeUnauthorizedContainer>\n <Typography variant='h6'>Unauthorized</Typography>\n <Typography variant='body1' textAlign='center' marginBottom={2}>\n You can authorize with Google by clicking button below\n </Typography>\n <div>\n <Button variant='contained' onClick={() => redirectToGoogleLogin({ callbackUrl: history.location.pathname })}>\n Authorize with Google\n </Button>\n </div>\n </BackofficeUnauthorizedContainer>\n );\n\n return (\n <Route\n {...rest}\n render={(props) => (\n <>\n <Component {...props} />\n </>\n )}\n />\n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconSystemAdmin = (props: Omit<SvgIconProps, 'children'>): JSX.Element => {\n return (\n <SvgIcon {...props}>\n <path d='M9.963,2c-2.227,0 -4.04,1.706 -4.04,3.8c0,1.451 0.871,2.715 2.146,3.355c-2.928,0.775 -5.069,3.301 -5.069,6.306l-0,2.523c0,0.091 0.039,0.179 0.108,0.243c0.068,0.065 0.162,0.101 0.259,0.101l6.194,0c0.098,0 0.191,-0.036 0.26,-0.101c0.069,-0.064 0.107,-0.152 0.107,-0.243c0,-0.092 -0.038,-0.18 -0.107,-0.244c-0.069,-0.065 -0.162,-0.101 -0.26,-0.101l-5.827,-0l0,-2.178c0,-3.253 2.773,-5.861 6.229,-5.861c1.865,0 3.528,0.761 4.668,1.971c0.064,0.069 0.155,0.11 0.252,0.116c0.097,0.006 0.193,-0.025 0.266,-0.086c0.036,-0.03 0.066,-0.066 0.087,-0.107c0.021,-0.04 0.033,-0.085 0.036,-0.13c0.003,-0.045 -0.003,-0.09 -0.019,-0.133c-0.016,-0.043 -0.04,-0.083 -0.072,-0.116c-0.871,-0.926 -2.019,-1.616 -3.322,-1.96c1.274,-0.64 2.144,-1.904 2.144,-3.355c0,-2.094 -1.813,-3.8 -4.04,-3.8Zm0,0.69c1.83,-0 3.306,1.388 3.306,3.11c-0,1.722 -1.476,3.111 -3.306,3.111c-1.829,-0 -3.305,-1.389 -3.305,-3.111c-0,-1.722 1.476,-3.11 3.305,-3.11Zm4.967,9.45c-0.097,0 -0.191,0.037 -0.26,0.101c-0.068,0.065 -0.107,0.153 -0.107,0.244l-0,0.568c-0.342,0.09 -0.671,0.218 -0.981,0.381l-0.426,-0.4c-0.034,-0.032 -0.074,-0.058 -0.119,-0.075c-0.044,-0.017 -0.092,-0.026 -0.14,-0.026c-0.049,-0 -0.096,0.009 -0.141,0.026c-0.045,0.017 -0.085,0.043 -0.119,0.075l-1.171,1.101c-0.069,0.065 -0.108,0.152 -0.108,0.244c0,0.091 0.039,0.179 0.108,0.244l0.426,0.401c-0.174,0.291 -0.31,0.6 -0.406,0.922l-0.603,0c-0.097,0 -0.19,0.037 -0.259,0.101c-0.069,0.065 -0.108,0.153 -0.108,0.244l0,1.558c0,0.092 0.039,0.179 0.108,0.244c0.069,0.065 0.162,0.101 0.259,0.101l0.603,-0c0.096,0.322 0.232,0.631 0.406,0.923l-0.426,0.401c-0.069,0.065 -0.108,0.152 -0.108,0.244c0,0.091 0.039,0.179 0.108,0.243l1.171,1.102c0.034,0.032 0.074,0.057 0.119,0.075c0.045,0.017 0.092,0.026 0.141,0.026c0.048,-0 0.096,-0.009 0.14,-0.026c0.045,-0.018 0.085,-0.043 0.119,-0.075l0.426,-0.401c0.31,0.164 0.639,0.292 0.981,0.382l-0,0.567c-0,0.092 0.038,0.179 0.107,0.244c0.069,0.065 0.163,0.101 0.26,0.101l1.656,0c0.097,0 0.191,-0.036 0.26,-0.101c0.068,-0.065 0.107,-0.152 0.107,-0.244l0,-0.567c0.342,-0.09 0.671,-0.218 0.981,-0.382l0.426,0.401c0.034,0.032 0.074,0.057 0.119,0.075c0.044,0.017 0.092,0.026 0.14,0.026c0.049,-0 0.097,-0.009 0.141,-0.026c0.045,-0.018 0.085,-0.043 0.119,-0.075l1.171,-1.102c0.069,-0.064 0.108,-0.152 0.108,-0.243c-0,-0.092 -0.039,-0.179 -0.108,-0.244l-0.426,-0.401c0.174,-0.292 0.31,-0.601 0.406,-0.923l0.603,-0c0.097,-0 0.191,-0.036 0.259,-0.101c0.069,-0.065 0.108,-0.152 0.108,-0.244l-0,-1.558c-0,-0.091 -0.039,-0.179 -0.108,-0.243c-0.068,-0.065 -0.162,-0.101 -0.259,-0.101l-0.601,-0c-0.096,-0.323 -0.232,-0.633 -0.407,-0.924l0.425,-0.4c0.069,-0.065 0.108,-0.153 0.108,-0.244c-0,-0.091 -0.039,-0.179 -0.108,-0.244l-1.171,-1.101c-0.034,-0.032 -0.074,-0.058 -0.119,-0.075c-0.044,-0.017 -0.092,-0.026 -0.141,-0.026c-0.048,-0 -0.096,0.009 -0.14,0.026c-0.045,0.017 -0.085,0.043 -0.119,0.075l-0.425,0.399c-0.31,-0.164 -0.639,-0.292 -0.982,-0.382l0,-0.566c0,-0.091 -0.039,-0.179 -0.107,-0.243c-0.069,-0.065 -0.163,-0.101 -0.26,-0.101l-1.656,-0Zm0.367,0.689l0.922,0l-0,0.488c-0,0.079 0.029,0.156 0.082,0.217c0.053,0.062 0.128,0.104 0.21,0.12c0.457,0.089 0.891,0.259 1.281,0.499c0.071,0.044 0.155,0.063 0.239,0.055c0.084,-0.008 0.163,-0.043 0.222,-0.099l0.366,-0.344l0.653,0.613l-0.367,0.345c-0.06,0.056 -0.097,0.13 -0.106,0.208c-0.008,0.079 0.012,0.158 0.059,0.225c0.255,0.366 0.436,0.775 0.53,1.204c0.018,0.078 0.063,0.148 0.128,0.198c0.066,0.05 0.147,0.077 0.232,0.077l0.518,0l-0,0.868l-0.52,0c-0.085,0 -0.166,0.028 -0.232,0.078c-0.065,0.05 -0.111,0.12 -0.128,0.197c-0.094,0.429 -0.274,0.837 -0.53,1.204c-0.046,0.066 -0.066,0.145 -0.058,0.224c0.009,0.079 0.046,0.152 0.106,0.208l0.368,0.347l-0.653,0.613l-0.367,-0.345c-0.06,-0.057 -0.138,-0.092 -0.222,-0.1c-0.084,-0.008 -0.169,0.011 -0.239,0.055c-0.39,0.24 -0.824,0.409 -1.28,0.498c-0.082,0.017 -0.157,0.059 -0.21,0.12c-0.053,0.062 -0.082,0.139 -0.082,0.218l-0,0.489l-0.922,0l0,-0.489c0,-0.079 -0.029,-0.156 -0.082,-0.218c-0.053,-0.061 -0.128,-0.103 -0.21,-0.12c-0.456,-0.089 -0.89,-0.258 -1.28,-0.498c-0.07,-0.044 -0.155,-0.063 -0.239,-0.055c-0.084,0.008 -0.162,0.043 -0.222,0.1l-0.367,0.345l-0.653,-0.613l0.369,-0.347c0.059,-0.056 0.096,-0.129 0.105,-0.208c0.009,-0.079 -0.012,-0.158 -0.058,-0.224c-0.256,-0.367 -0.435,-0.775 -0.53,-1.204c-0.017,-0.077 -0.062,-0.147 -0.128,-0.197c-0.065,-0.05 -0.147,-0.078 -0.232,-0.078l-0.519,0l-0,-0.868l0.519,0c0.085,0 0.167,-0.027 0.232,-0.077c0.066,-0.05 0.111,-0.12 0.128,-0.198c0.095,-0.429 0.274,-0.837 0.53,-1.203c0.046,-0.067 0.067,-0.146 0.058,-0.224c-0.009,-0.079 -0.046,-0.153 -0.105,-0.209l-0.369,-0.346l0.653,-0.614l0.367,0.346c0.06,0.056 0.138,0.091 0.222,0.099c0.084,0.009 0.169,-0.011 0.239,-0.054c0.39,-0.241 0.824,-0.41 1.28,-0.499c0.082,-0.016 0.157,-0.058 0.21,-0.12c0.053,-0.061 0.082,-0.138 0.082,-0.217l0,-0.49Zm0.461,1.745c-1.461,0 -2.653,1.122 -2.653,2.495c0,1.374 1.192,2.495 2.653,2.495c1.461,0 2.653,-1.121 2.653,-2.495c0,-1.373 -1.192,-2.495 -2.653,-2.495Zm0,0.69c1.064,0 1.919,0.804 1.919,1.805c-0,1.002 -0.855,1.806 -1.919,1.806c-1.064,-0 -1.919,-0.804 -1.919,-1.806c0,-1.001 0.855,-1.805 1.919,-1.805Z' />\n </SvgIcon>\n );\n};\n","import { Avatar, styled } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nimport {\n collapsedSidebarWidth,\n openSidebarWidth,\n SidebarLayoutSidebar,\n} from 'shared/components/sidebar-layout/SideBarLayout.styled';\n\ninterface BackofficeSidebarLayoutSidebarProps {\n sidebarOpen: boolean;\n}\n\nexport const BackofficeSidebarLayoutSidebar = styled(SidebarLayoutSidebar, {\n shouldForwardProp: (prop) => prop !== 'sidebarOpen',\n})<BackofficeSidebarLayoutSidebarProps>(({ theme, sidebarOpen }) => ({\n '& .MuiDrawer-paper': {\n left: sidebarOpen ? openSidebarWidth : collapsedSidebarWidth,\n transitionDuration: `${theme.transitions.duration.enteringScreen}ms`,\n transitionTimingFunction: theme.transitions.easing.easeInOut,\n transitionProperty: 'left, width',\n zIndex: theme.zIndex.drawer - 1,\n },\n}));\n\nexport const BackofficeSidebarLetterIcon = styled(Avatar)(() => ({\n backgroundColor: Colors.athens,\n color: Colors.night,\n fontSize: fontSizes.xSmall,\n height: 24,\n width: 24,\n}));\n","import { useCallback } from 'react';\nimport { atom, useRecoilState } from 'recoil';\n\nconst sidebarOpenState = atom({\n key: 'isBackofficeSidebarOpen',\n default: true,\n});\n\nexport const useBackofficeSidebar = () => {\n const [isBackofficeSidebarOpen, setIsBackofficeSidebarOpen] = useRecoilState(sidebarOpenState);\n\n const toggleBackofficeSidebar = useCallback(\n () => setIsBackofficeSidebarOpen(!isBackofficeSidebarOpen),\n [setIsBackofficeSidebarOpen, isBackofficeSidebarOpen],\n );\n\n return {\n isBackofficeSidebarOpen,\n toggleBackofficeSidebar,\n };\n};\n","import { Box, IconButton } from '@mui/material';\nimport React from 'react';\n\nimport { routes } from 'kognia/router/routes';\nimport IconBall from 'shared/components/icons/icon-ball';\nimport IconCamera from 'shared/components/icons/icon-camera';\nimport { IconDoubleArrowLeft } from 'shared/components/icons/icon-double-arrow-left';\nimport { IconDoubleArrowRight } from 'shared/components/icons/icon-double-arrow-right';\nimport { IconSystemAdmin } from 'shared/components/icons/icon-system-admin';\nimport { MenuItem, MenuItemType, SidebarMenu } from 'shared/components/sidebar-layout/sidebar-menu';\nimport { SidebarLayoutContent, SidebarLayoutWrapper } from 'shared/components/sidebar-layout/SideBarLayout.styled';\nimport { useSidebar } from 'shared/hooks/use-sidebar';\n\nimport { BackofficeSidebarLayoutSidebar, BackofficeSidebarLetterIcon } from './index.styled';\nimport { useBackofficeSidebar } from '../../hooks/use-backoffice-sidebar';\n\ninterface Props {\n children: React.ReactNode;\n}\n\nexport const BackofficeSidebarLayout = ({ children }: Props) => {\n const { isBackofficeSidebarOpen, toggleBackofficeSidebar } = useBackofficeSidebar();\n const { isSidebarOpen } = useSidebar();\n\n const primaryMenuItems: MenuItem[] = [\n {\n label: 'Sports metadata',\n icon: <IconBall size='small' />,\n type: MenuItemType.TITLE,\n },\n {\n label: 'Games',\n link: routes.BACKOFFICE_GAMES,\n icon: <BackofficeSidebarLetterIcon>G</BackofficeSidebarLetterIcon>,\n type: MenuItemType.LINK,\n },\n\n {\n label: 'Players',\n link: routes.BACKOFFICE_PLAYERS,\n icon: <BackofficeSidebarLetterIcon>P</BackofficeSidebarLetterIcon>,\n type: MenuItemType.LINK,\n },\n {\n label: 'Coaches',\n link: routes.BACKOFFICE_COACHES,\n icon: <BackofficeSidebarLetterIcon>C</BackofficeSidebarLetterIcon>,\n type: MenuItemType.LINK,\n },\n {\n label: 'Teams',\n link: routes.BACKOFFICE_TEAMS,\n icon: <BackofficeSidebarLetterIcon>T</BackofficeSidebarLetterIcon>,\n type: MenuItemType.LINK,\n },\n {\n label: 'Competitions',\n link: routes.BACKOFFICE_COMPETITIONS,\n icon: <BackofficeSidebarLetterIcon>CP</BackofficeSidebarLetterIcon>,\n type: MenuItemType.LINK,\n },\n {\n label: 'Stages',\n link: routes.BACKOFFICE_STAGES,\n icon: <BackofficeSidebarLetterIcon>S</BackofficeSidebarLetterIcon>,\n type: MenuItemType.LINK,\n },\n {\n label: 'Season competitions',\n link: routes.BACKOFFICE_SEASON_COMPETITIONS,\n icon: <BackofficeSidebarLetterIcon>SC</BackofficeSidebarLetterIcon>,\n type: MenuItemType.LINK,\n },\n {\n label: 'Venues',\n link: routes.BACKOFFICE_VENUES,\n icon: <BackofficeSidebarLetterIcon>V</BackofficeSidebarLetterIcon>,\n type: MenuItemType.LINK,\n },\n {\n label: 'Operations',\n icon: <IconCamera size='small' />,\n type: MenuItemType.TITLE,\n },\n {\n label: 'Annotation',\n link: routes.BACKOFFICE_ANNOTATION,\n icon: <BackofficeSidebarLetterIcon>A</BackofficeSidebarLetterIcon>,\n type: MenuItemType.LINK,\n },\n {\n label: 'Process game',\n link: routes.PROCESS_GAME,\n icon: <BackofficeSidebarLetterIcon>PG</BackofficeSidebarLetterIcon>,\n type: MenuItemType.LINK,\n },\n {\n label: 'Administration',\n icon: <IconSystemAdmin size='small' />,\n type: MenuItemType.TITLE,\n },\n {\n label: 'Environments',\n link: routes.BACKOFFICE_ENVIRONMENTS,\n type: MenuItemType.LINK,\n icon: <BackofficeSidebarLetterIcon>E</BackofficeSidebarLetterIcon>,\n },\n {\n label: 'Associations season clients',\n link: routes.BACKOFFICE_ASSOCIATE_COMPETITION_WITH_CLIENTS,\n icon: <BackofficeSidebarLetterIcon>A</BackofficeSidebarLetterIcon>,\n type: MenuItemType.LINK,\n },\n {\n label: 'Users',\n type: MenuItemType.PARENT,\n icon: <BackofficeSidebarLetterIcon>U</BackofficeSidebarLetterIcon>,\n items: [\n {\n label: 'Create user',\n link: routes.BACKOFFICE_CREATE_USER,\n type: MenuItemType.LINK,\n },\n {\n label: 'Add user(s) to client(s)',\n link: routes.BACKOFFICE_ADD_USER_TO_ENVIRONMENT,\n type: MenuItemType.LINK,\n },\n ],\n },\n ];\n\n return (\n <SidebarLayoutWrapper>\n <BackofficeSidebarLayoutSidebar variant='permanent' open={isBackofficeSidebarOpen} sidebarOpen={isSidebarOpen}>\n <Box sx={{ display: 'flex', justifyContent: 'flex-end' }}>\n <IconButton onClick={toggleBackofficeSidebar}>\n {isBackofficeSidebarOpen ? <IconDoubleArrowLeft size='small' /> : <IconDoubleArrowRight size='small' />}\n </IconButton>\n </Box>\n <SidebarMenu menuItems={primaryMenuItems} isSidebarOpen={isBackofficeSidebarOpen} />\n </BackofficeSidebarLayoutSidebar>\n <SidebarLayoutContent component='main' open={isBackofficeSidebarOpen}>\n {children}\n </SidebarLayoutContent>\n </SidebarLayoutWrapper>\n );\n};\n","import { HTTPMethod } from 'api/types';\n\nimport { useMutationRequest } from '../../../hooks/useMutationRequest';\nimport { userBatchClientIdsUrl } from '../../../routes';\nimport { KogniaUser } from '../use-kognia-users/types';\n\ninterface Options {\n onSuccess?: (KogniaUser: KogniaUser[]) => void;\n}\n\nexport const useAddUsersToClients = ({ onSuccess }: Options) => {\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest({\n type: HTTPMethod.PATCH,\n errorMessage: 'Error adding client(s) to user(s)',\n successMessage: 'Client(s) added to user(s)',\n onSuccess,\n });\n\n const addUsersToClients = (kogniaUsers: KogniaUser[], clientIds: string[]) => {\n mutate({\n url: userBatchClientIdsUrl,\n data: { clientIds, userIds: kogniaUsers.map((user) => user.id) },\n });\n };\n\n return { addUsersToClients, isLoading, isError, isSuccess };\n};\n","import { array, boolean, object, string, TypeOf, z } from 'zod';\n\nimport { Pagination } from 'shared/types/pagination/types';\n\nimport { LinkApiResponse } from '../../../types';\n\nexport type KogniaUsersFilters = {\n firstName?: string;\n email?: string;\n};\n\nexport const kogniaUserLocales = ['en_US', 'es_ES', 'de_DE'];\nexport const localeSchema = z.enum(['en_US', 'es_ES', 'de_DE']);\n\nexport const kogniaUserSchema = object({\n id: string(),\n clientIds: array(string()),\n firstName: string(),\n lastName: string(),\n email: string(),\n phoneAreaCode: string().nullable(),\n phoneNumber: string().nullable(),\n avatarUrl: string().nullable(),\n role: string().nullable(),\n locale: localeSchema,\n createdAt: string(),\n updatedAt: string(),\n isMigratedToAuth0: boolean(),\n links: array(\n object({\n rel: string(),\n href: string(),\n hreflang: string().nullable(),\n media: string().nullable(),\n title: string().nullable(),\n type: string().nullable(),\n deprecation: string().nullable(),\n profile: string().nullable(),\n name: string().nullable(),\n }),\n ),\n});\n\nexport type KogniaUser = TypeOf<typeof kogniaUserSchema>;\nexport type KogniaUseLocale = TypeOf<typeof localeSchema>;\n\nexport interface UsersApiResponse {\n links: LinkApiResponse[];\n content: KogniaUser[];\n page: Pagination;\n}\n\nexport const createKogniaUserSchema = object({\n clientIds: array(string()).min(1),\n firstName: string().min(2),\n lastName: string().min(2),\n email: string().email(),\n locale: localeSchema,\n});\n\nexport type CreateKogniaUser = TypeOf<typeof createKogniaUserSchema>;\n","import { array, object, string, TypeOf } from 'zod';\n\nimport { KogniaUser, kogniaUserSchema } from 'api/backoffice/user/use-kognia-users/types';\n\nexport enum AddUsersToClientsFormFieldsNames {\n CLIENT_IDS = 'clientIds',\n KOGNIA_USERS = 'kogniaUsers',\n}\n\nexport interface AddUsersToClientsFormFields {\n [AddUsersToClientsFormFieldsNames.CLIENT_IDS]: string[];\n [AddUsersToClientsFormFieldsNames.KOGNIA_USERS]: KogniaUser[];\n}\n\nexport interface AddUsersToClientsForm {\n // eslint-disable-next-line max-len\n [AddUsersToClientsFormFieldsNames.CLIENT_IDS]: AddUsersToClientsFormFields[AddUsersToClientsFormFieldsNames.CLIENT_IDS];\n // eslint-disable-next-line max-len\n [AddUsersToClientsFormFieldsNames.KOGNIA_USERS]: AddUsersToClientsFormFields[AddUsersToClientsFormFieldsNames.KOGNIA_USERS];\n}\n\nexport const addUsersToClientsFormSchema = object({\n [AddUsersToClientsFormFieldsNames.CLIENT_IDS]: array(string()).min(1),\n [AddUsersToClientsFormFieldsNames.KOGNIA_USERS]: array(kogniaUserSchema).min(1),\n});\n\nexport type AddUsersToClientsFormSchema = TypeOf<typeof addUsersToClientsFormSchema>;\n","import { Box } from '@mui/material';\nimport { PropsWithChildren } from 'react';\n\nexport const BackofficeContentContainer = ({ children }: PropsWithChildren) => {\n return <Box sx={{ padding: 4 }}>{children}</Box>;\n};\n","import { Pagination } from 'shared/types/pagination/types';\n\nexport const getItems = <T>(pages: T[][] | undefined): T[] => {\n return pages\n ? pages.reduce((acc: T[], page: any) => {\n return acc.concat(page.data.items);\n }, [])\n : [];\n};\n\nexport const getPage = (pages: any): Pagination | undefined => {\n return pages ? pages[0].data.page : undefined;\n};\n","import { useInfiniteQuery } from '@tanstack/react-query';\nimport { useMemo, useState } from 'react';\n\nimport { SortDirection } from 'shared/types';\n\nimport { InfinityQueryResult, Options } from './types';\nimport { getItems, getPage } from './utils';\nimport { HTTPMethod } from '../../types';\nimport { useBackendApi } from '../useBackendApi';\n\nconst PAGE_SIZE = 10;\n\nexport const useInfinityQuery = <TData, TFilters, TApiResponse>({\n generateUrl,\n options = {\n sortDirection: SortDirection.DESC,\n sort: '',\n size: PAGE_SIZE,\n },\n enabled = true,\n initialFilters = {} as TFilters,\n transformer,\n key,\n queryOptions,\n}: Options<TData, TFilters, TApiResponse>): InfinityQueryResult<TData, TFilters> => {\n const [filters, setFilters] = useState<TFilters>(initialFilters);\n const queryRef = useMemo(() => [key, options, filters], [key, options, filters]);\n const fetchRequest = useInfiniteQuery<TData[]>(\n queryRef,\n (infinityQueryOptions) => {\n return useBackendApi(\n generateUrl(\n {\n sortDirection: options.sortDirection,\n sort: options.sort,\n size: options.size,\n page: infinityQueryOptions.pageParam,\n },\n filters,\n ),\n HTTPMethod.GET,\n transformer,\n );\n },\n {\n getNextPageParam: (lastPage: any) => {\n return lastPage.nextCursor;\n },\n enabled,\n staleTime: 200,\n ...queryOptions,\n },\n );\n\n const items = useMemo(() => getItems<TData>(fetchRequest.data?.pages), [fetchRequest.data]);\n const page = useMemo(() => getPage(fetchRequest.data?.pages), [fetchRequest.data]);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { data, ...result } = fetchRequest;\n\n return { ...result, items, setFilters, page };\n};\n","export const chooseNextCursorValue = (totalPages: number, currentPage: number) => {\n return totalPages > currentPage ? currentPage + 1 : undefined;\n};\n","import { Client } from 'shared/types';\nimport { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { ClientApiResponse, ClientsApiResponse } from './types';\nimport { InfinityQueryDataResult } from '../../hooks/useInfinityQuery/types';\n\nexport const transformClientWithLinks = (client: ClientApiResponse): Client => ({\n id: client.id,\n name: client.name,\n city: client.city,\n country: client.country,\n branding: client.branding,\n});\n\nexport const transformClients = (response: ClientsApiResponse): InfinityQueryDataResult<Client> => {\n return {\n data: {\n items: response.content.map(transformClientWithLinks),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n","import { Client, SortDirection } from 'shared/types';\n\nimport { ClientsFilters } from './types';\nimport { queryClient } from '../../../../config';\nimport { useInfinityQuery } from '../../../../hooks/useInfinityQuery';\nimport { InfinityQueryResult } from '../../../../hooks/useInfinityQuery/types';\nimport { clientsWithFiltersUrl } from '../../../../routes';\nimport { transformClients } from '../../transformer';\nimport { ClientsApiResponse } from '../../types';\n\nconst PAGE_SIZE = 10;\n\ninterface Options {\n initialFilters?: ClientsFilters;\n enabled?: boolean;\n pageSize?: number;\n}\n\nexport const INITIAL_CLIENTS_FILTERS: ClientsFilters = {\n name: '',\n clientIds: [],\n};\n\nexport const clientsQueryKey = 'clients';\n\nexport const useClients = (\n data: Options = {\n initialFilters: INITIAL_CLIENTS_FILTERS,\n enabled: true,\n pageSize: PAGE_SIZE,\n },\n): InfinityQueryResult<Client, ClientsFilters> => {\n return useInfinityQuery<Client, ClientsFilters, ClientsApiResponse>({\n generateUrl: clientsWithFiltersUrl,\n initialFilters: data.initialFilters,\n key: clientsQueryKey,\n options: {\n size: data.pageSize || PAGE_SIZE,\n sort: 'name',\n sortDirection: SortDirection.DESC,\n },\n enabled: data.enabled,\n transformer: transformClients,\n });\n};\n\nexport const invalidateClients = async () => {\n await queryClient.invalidateQueries([clientsQueryKey]);\n};\n","import React, { useCallback } from 'react';\n\nimport ActiveFilter from 'shared/components/active-filter';\nimport { IconSizes } from 'shared/components/icons/svg-icon/SvgIcon';\n\ninterface Props {\n id: string;\n name: string;\n onRemove: (id: string) => void;\n size?: IconSizes;\n}\n\nexport const AutocompleteActiveFilter = ({ id, name, onRemove, size = 'medium' }: Props) => {\n const handleOnRemove = useCallback(() => {\n onRemove(id);\n }, [onRemove, id]);\n\n return <ActiveFilter size={size} onClose={handleOnRemove} closeButton key={id} title={<>{name}</>} />;\n};\n","import React from 'react';\n\nimport { ButtonDropdown } from '../../../button-dropdown';\n\ninterface Props {\n isOpen: boolean;\n isSelected: boolean;\n label: string;\n fullWidth?: boolean;\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n disabled?: boolean;\n}\n\nexport const AutocompleteDropdownButton = ({\n isSelected,\n label,\n onClick,\n isOpen,\n disabled = false,\n fullWidth = false,\n}: Props) => {\n return (\n <ButtonDropdown\n isOpen={isOpen}\n size='large'\n isSelected={isSelected}\n fullWidth={fullWidth}\n minWidth={250}\n onClick={onClick}\n disabled={disabled}\n title={label}\n />\n );\n};\n","import { Paper, Popper, styled } from '@mui/material';\nimport { themeZIndexes } from 'kognia-ui';\n\nexport const AutocompletePopper = styled(Popper)(() => ({\n zIndex: themeZIndexes.popper,\n}));\n\nexport const AutocompletePopperContent = styled(Paper)(({ theme }) => ({\n padding: theme.spacing(2),\n position: 'relative',\n}));\n","import { PopperProps } from '@mui/material/Popper';\nimport React from 'react';\n\nexport const AutocompletePopperWrapper: React.JSXElementConstructor<PopperProps> = (props) => {\n return <div>{props.children as React.ReactNode}</div>;\n};\n","import { Box, Checkbox, Grid, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\ninterface Props {\n name: string;\n isChecked: boolean;\n autocompleteWidth: number;\n}\n\nconst Details = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(),\n lineHeight: 1,\n}));\n\ninterface NameProps {\n maxWidth: number;\n}\n\nconst Name = styled(Box, { shouldForwardProp: (prop) => prop !== 'maxWidth' })<NameProps>(({ maxWidth }) => ({\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: `${maxWidth - 56}px`,\n}));\n\nconst Result = styled(Grid)(({ theme }) => ({\n borderBottom: `1px solid ${theme.palette.divider}`,\n padding: theme.spacing(0.5),\n justifyContent: 'space-between',\n alignItems: 'center',\n '&:hover': {\n background: Colors.background,\n },\n}));\n\nexport const AutocompleteResult = ({ name, isChecked, autocompleteWidth }: Props) => {\n return (\n <Result container>\n <Grid item>\n <Grid container spacing={1} alignItems='center'>\n <Grid item>\n <Checkbox checked={isChecked} />\n </Grid>\n <Grid item>\n <Details>\n <Name title={name} maxWidth={autocompleteWidth}>\n {name}\n </Name>\n </Details>\n </Grid>\n </Grid>\n </Grid>\n </Result>\n );\n};\n","import { Button, Grid } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\ninterface Props {\n children: React.ReactNode;\n onApply: () => void;\n onReset: () => void;\n resetText?: string;\n}\n\nexport const AutocompleteResultsWrapper = ({ children, onApply, onReset, resetText = '' }: Props) => {\n const { t } = useTranslation();\n\n const handleOnSubmit = useCallback(\n (event: React.FormEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onApply();\n },\n [onApply],\n );\n\n return (\n <form onSubmit={handleOnSubmit}>\n <Grid container direction={'column'} spacing={1}>\n <Grid item container justifyContent={'flex-end'}>\n <Grid item>\n <Button variant={'text'} color={'secondary'} onClick={onReset}>\n {(resetText ? resetText : t('common:actions.reset-filter')).toUpperCase()}\n </Button>\n </Grid>\n </Grid>\n <Grid item>{children}</Grid>\n <Grid item container justifyContent={'flex-end'} spacing={1}>\n <Grid item>\n <Button type={'submit'} variant={'contained'} color={'primary'}>\n {t('common:actions.apply')}\n </Button>\n </Grid>\n </Grid>\n </Grid>\n </form>\n );\n};\n","import { Box, styled } from '@mui/material';\n\nexport const AutocompleteTag = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(0.5),\n maxWidth: '100%',\n flexWrap: 'wrap',\n}));\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { useClients } from 'api/backoffice/client/hooks/use-clients/useClients';\nimport { Client } from 'shared/types/user/types';\n\ntype Options = {\n setClients: (recordings: Client[]) => void;\n};\n\nexport const useSyncClientsSelection = ({ setClients }: Options) => {\n const [pageSize, setPageSize] = useState(0);\n const [isEnabled, setIsEnabled] = useState(false);\n const { items: clientsResults, setFilters } = useClients({ enabled: isEnabled, pageSize });\n\n useEffect(() => {\n if (isEnabled && clientsResults) {\n setClients(clientsResults);\n }\n }, [clientsResults, isEnabled, setClients]);\n\n const handleSearchClients = useCallback(\n (clientIds: string[]) => {\n setPageSize(clientIds.length);\n setFilters({ clientIds });\n setIsEnabled(clientIds.length > 0);\n },\n [setPageSize, setIsEnabled, setFilters],\n );\n\n return useCallback(\n (clients: Client[], clientIds: string[]) => {\n if (clientIds.length === 0) return;\n\n clients.length === 0 ? handleSearchClients(clientIds) : setIsEnabled(false);\n },\n [handleSearchClients, setIsEnabled],\n );\n};\n","import { Box, ClickAwayListener, ListItem, Stack, Typography } from '@mui/material';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { INITIAL_CLIENTS_FILTERS, useClients } from 'api/backoffice/client/hooks/use-clients/useClients';\nimport ActiveFilters from 'shared/components/active-filters';\nimport { Autocomplete } from 'shared/components/autocomplete';\nimport { AutocompleteActiveFilter } from 'shared/components/autocomplete-multi-select/components/autocomplete-active-filter';\nimport { AutocompleteDropdownButton } from 'shared/components/autocomplete-multi-select/components/autocomplete-dropdown-button';\nimport {\n AutocompletePopper,\n AutocompletePopperContent,\n} from 'shared/components/autocomplete-multi-select/components/autocomplete-popper';\nimport { AutocompletePopperWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-popper-wrapper';\nimport { AutocompleteResult } from 'shared/components/autocomplete-multi-select/components/autocomplete-result';\nimport { AutocompleteResultsWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-results-wrapper';\nimport { AutocompleteTag } from 'shared/components/autocomplete-multi-select/components/autocomplete-tag';\nimport { Client } from 'shared/types';\n\nimport { useSyncClientsSelection } from './use-sync-clients-selection';\n\ninterface Props {\n onChange: (clientIds: string[]) => void;\n clientIds: string[];\n}\n\nconst AUTOCOMPLETE_WIDTH = 400;\n\nexport const SelectClients = ({ clientIds, onChange }: Props) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [autocompleteValues, setAutocompleteValues] = useState<Client[]>([]);\n const { items: clientsResults, isLoading, setFilters, fetchNextPage } = useClients();\n const syncClients = useSyncClientsSelection({ setClients: setAutocompleteValues });\n\n useEffect(() => {\n syncClients(autocompleteValues, clientIds);\n }, [autocompleteValues, syncClients, clientIds]);\n\n const isOpen = Boolean(anchorEl);\n\n const close = useCallback(() => {\n setFilters(INITIAL_CLIENTS_FILTERS);\n setAnchorEl(null);\n }, [setAnchorEl, setFilters]);\n\n const open = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setAutocompleteValues(autocompleteValues);\n setAnchorEl(event.currentTarget);\n },\n [autocompleteValues, setAutocompleteValues],\n );\n\n const handleAddClipsClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n isOpen ? close() : open(event);\n },\n [isOpen, close, open],\n );\n\n const handleUpdateValue = useCallback(\n (newValues: Client[] | null) => {\n if (newValues === null) return;\n\n setAutocompleteValues(newValues);\n },\n [setAutocompleteValues],\n );\n\n const handleApply = useCallback(() => {\n setAutocompleteValues((autocompleteValues) => {\n onChange(autocompleteValues.map((value) => value.id));\n return autocompleteValues;\n });\n close();\n }, [setAutocompleteValues, onChange, close]);\n\n const handleReset = useCallback(() => {\n setAutocompleteValues([]);\n }, [setAutocompleteValues]);\n\n const handleRemoveClient = useCallback(\n (clientId: string) => {\n const updatedValues = autocompleteValues.filter((value) => value.id !== clientId);\n setAutocompleteValues(updatedValues);\n onChange(updatedValues.map((value) => value.id));\n },\n [autocompleteValues, onChange],\n );\n\n const handleRemoveAutocompleteClient = useCallback(\n (recordingId: string) => {\n setAutocompleteValues(autocompleteValues.filter((value) => value.id !== recordingId));\n },\n [setAutocompleteValues, autocompleteValues],\n );\n\n const handleRenderItem = useCallback(\n (props: React.ComponentProps<typeof ListItem>, option: Client, { selected }: { selected: boolean }) => {\n return (\n <ListItem {...props} key={option.id} disablePadding>\n <AutocompleteResult autocompleteWidth={AUTOCOMPLETE_WIDTH} isChecked={selected} name={option.name} />\n </ListItem>\n );\n },\n [],\n );\n\n const handleSetName = useCallback(\n (name: string) => {\n setFilters({ name: name });\n },\n [setFilters],\n );\n\n const renderTags = useCallback(\n (clients: Client[]): React.ReactNode => {\n return (\n <AutocompleteTag>\n {clients.map((client) => {\n return (\n <AutocompleteActiveFilter\n id={client.id}\n key={client.id}\n name={client.name}\n onRemove={handleRemoveAutocompleteClient}\n size='small'\n />\n );\n })}\n </AutocompleteTag>\n );\n },\n [handleRemoveAutocompleteClient],\n );\n\n const paperComponent: React.JSXElementConstructor<React.HTMLAttributes<HTMLElement>> = useCallback(\n (props) => (\n <AutocompleteResultsWrapper {...props} onReset={handleReset} onApply={handleApply}>\n {props.children}\n </AutocompleteResultsWrapper>\n ),\n [handleReset, handleApply],\n );\n\n const isOptionEqual = useCallback((option: Client, value: Client) => option.id === value.id, []);\n const getOptionName = useCallback((option: Client) => option.name, []);\n\n return (\n <Stack direction={'column'} spacing={1}>\n <Typography variant={'body1'}>Select environments</Typography>\n <Box>\n <ActiveFilters>\n <AutocompleteDropdownButton\n isOpen={isOpen}\n onClick={handleAddClipsClick}\n isSelected={clientIds.length > 0}\n label={clientIds.length > 0 ? `${clientIds.length} Environment(s)` : 'Environments'}\n />\n {isOpen && (\n <ClickAwayListener onClickAway={handleApply}>\n <AutocompletePopper anchorEl={anchorEl} open={isOpen} placement='bottom-start'>\n <AutocompletePopperContent elevation={8}>\n <Autocomplete\n autoFocus\n PaperComponent={paperComponent}\n PopperComponent={AutocompletePopperWrapper}\n fetchNextPage={fetchNextPage}\n getItemLabel={getOptionName}\n inputWidth={AUTOCOMPLETE_WIDTH}\n isLoading={isLoading}\n isOptionEqualToValue={isOptionEqual}\n listWidth={AUTOCOMPLETE_WIDTH}\n multiple={true}\n onChange={handleSetName}\n open\n options={clientsResults}\n renderOption={handleRenderItem}\n renderTags={renderTags}\n resultsHeight={310}\n resultsNoMatches={'No environments found'}\n updateValue={handleUpdateValue}\n value={autocompleteValues}\n />\n </AutocompletePopperContent>\n </AutocompletePopper>\n </ClickAwayListener>\n )}\n {autocompleteValues &&\n autocompleteValues.map((client) => (\n <AutocompleteActiveFilter\n id={client.id}\n key={client.id}\n name={client.name}\n onRemove={handleRemoveClient}\n />\n ))}\n </ActiveFilters>\n </Box>\n </Stack>\n );\n};\n","import { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { KogniaUser, UsersApiResponse } from './use-kognia-users/types';\nimport { InfinityQueryDataResult } from '../../hooks/useInfinityQuery/types';\n\nexport const transformUsers = (response: UsersApiResponse): InfinityQueryDataResult<KogniaUser> => {\n return {\n data: {\n items: response.content,\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n","import { SortDirection } from 'shared/types/filters/types';\n\nimport { KogniaUser, KogniaUsersFilters, UsersApiResponse } from './types';\nimport { useInfinityQuery } from '../../../hooks/useInfinityQuery';\nimport { InfinityQueryResult } from '../../../hooks/useInfinityQuery/types';\nimport { usersWithFiltersUrl } from '../../../routes';\nimport { transformUsers } from '../transformer';\n\nconst PAGE_SIZE = 10;\n\ninterface Options {\n initialFilters?: KogniaUsersFilters;\n}\n\nexport const INITIAL_USERS_FILTERS: KogniaUsersFilters = {\n firstName: '',\n email: '',\n};\n\nexport const useKogniaUsers = (\n options: Options = {\n initialFilters: INITIAL_USERS_FILTERS,\n },\n): InfinityQueryResult<KogniaUser, KogniaUsersFilters> => {\n return useInfinityQuery<KogniaUser, KogniaUsersFilters, UsersApiResponse>({\n generateUrl: usersWithFiltersUrl,\n initialFilters: options.initialFilters,\n key: 'users',\n options: {\n size: PAGE_SIZE,\n sort: 'name',\n sortDirection: SortDirection.DESC,\n },\n transformer: transformUsers,\n });\n};\n","import { Box, ClickAwayListener, ListItem, Stack, Typography } from '@mui/material';\nimport React, { useCallback, useState } from 'react';\n\nimport { INITIAL_USERS_FILTERS, useKogniaUsers } from 'api/backoffice/user/use-kognia-users';\nimport { KogniaUser } from 'api/backoffice/user/use-kognia-users/types';\nimport ActiveFilters from 'shared/components/active-filters';\nimport { Autocomplete } from 'shared/components/autocomplete';\nimport { AutocompleteActiveFilter } from 'shared/components/autocomplete-multi-select/components/autocomplete-active-filter';\nimport { AutocompleteDropdownButton } from 'shared/components/autocomplete-multi-select/components/autocomplete-dropdown-button';\nimport {\n AutocompletePopper,\n AutocompletePopperContent,\n} from 'shared/components/autocomplete-multi-select/components/autocomplete-popper';\nimport { AutocompletePopperWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-popper-wrapper';\nimport { AutocompleteResult } from 'shared/components/autocomplete-multi-select/components/autocomplete-result';\nimport { AutocompleteResultsWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-results-wrapper';\nimport { AutocompleteTag } from 'shared/components/autocomplete-multi-select/components/autocomplete-tag';\n\ninterface Props {\n setKogniaUsersOnChange: (recordings: KogniaUser[]) => void;\n kogniaUsers: KogniaUser[];\n}\n\nconst AUTOCOMPLETE_WIDTH = 400;\n\nexport const SelectUsers = ({ kogniaUsers, setKogniaUsersOnChange }: Props) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [autocompleteValues, setAutocompleteValues] = useState<KogniaUser[]>([]);\n const { items: kogniaUsersResults, isLoading, setFilters, fetchNextPage } = useKogniaUsers();\n\n const isOpen = Boolean(anchorEl);\n\n const close = useCallback(() => {\n setFilters(INITIAL_USERS_FILTERS);\n setAnchorEl(null);\n }, [setAnchorEl, setFilters]);\n\n const open = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setAutocompleteValues(kogniaUsers);\n setAnchorEl(event.currentTarget);\n },\n [setAutocompleteValues, kogniaUsers],\n );\n\n const handleAddClipsClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n isOpen ? close() : open(event);\n },\n [isOpen, close, open],\n );\n\n const handleUpdateValue = useCallback(\n (newValues: KogniaUser[] | null) => {\n if (newValues === null) return;\n\n setAutocompleteValues(newValues);\n },\n [setAutocompleteValues],\n );\n\n const handleApply = useCallback(() => {\n setAutocompleteValues((autocompleteValues) => {\n setKogniaUsersOnChange(autocompleteValues);\n return autocompleteValues;\n });\n close();\n }, [setAutocompleteValues, setKogniaUsersOnChange, close]);\n\n const handleReset = useCallback(() => {\n setAutocompleteValues([]);\n }, [setAutocompleteValues]);\n\n const handleRemoveRecording = useCallback(\n (recordingId: string) => {\n setKogniaUsersOnChange(kogniaUsers.filter((value) => value.id !== recordingId));\n },\n [setKogniaUsersOnChange, kogniaUsers],\n );\n\n const handleRemoveAutocompleteRecording = useCallback(\n (recordingId: string) => {\n setAutocompleteValues(autocompleteValues.filter((value) => value.id !== recordingId));\n },\n [setAutocompleteValues, autocompleteValues],\n );\n\n const handleRenderItem = useCallback(\n (props: React.ComponentProps<typeof ListItem>, option: KogniaUser, { selected }: { selected: boolean }) => {\n return (\n <ListItem {...props} disablePadding>\n <AutocompleteResult\n autocompleteWidth={AUTOCOMPLETE_WIDTH}\n isChecked={selected}\n key={option.id}\n name={`${option.firstName} ${option.lastName} (${option.email})`}\n />\n </ListItem>\n );\n },\n [],\n );\n\n const handleSetFirstName = useCallback(\n (name: string) => {\n setFilters({ firstName: name });\n },\n [setFilters],\n );\n\n const renderTags = useCallback(\n (kogniaUsers: KogniaUser[]): React.ReactNode => {\n return (\n <AutocompleteTag>\n {kogniaUsers.map((kogniaUser) => {\n return (\n <AutocompleteActiveFilter\n id={kogniaUser.id}\n key={kogniaUser.id}\n name={`${kogniaUser.firstName} ${kogniaUser.lastName} (${kogniaUser.email})`}\n onRemove={handleRemoveAutocompleteRecording}\n size='small'\n />\n );\n })}\n </AutocompleteTag>\n );\n },\n [handleRemoveAutocompleteRecording],\n );\n\n const paperComponent: React.JSXElementConstructor<React.HTMLAttributes<HTMLElement>> = useCallback(\n (props) => (\n <AutocompleteResultsWrapper {...props} onReset={handleReset} onApply={handleApply}>\n {props.children}\n </AutocompleteResultsWrapper>\n ),\n [handleReset, handleApply],\n );\n\n return (\n <Stack direction={'column'} spacing={1}>\n <Typography variant={'body1'}>Select users</Typography>\n <Box>\n <ActiveFilters>\n <AutocompleteDropdownButton\n isOpen={isOpen}\n isSelected={kogniaUsers.length > 0}\n label={kogniaUsers.length > 0 ? `${kogniaUsers.length} User(s)` : 'Users'}\n onClick={handleAddClipsClick}\n />\n {anchorEl && (\n <ClickAwayListener onClickAway={handleApply}>\n <AutocompletePopper anchorEl={anchorEl} open={isOpen} placement='bottom-start'>\n <AutocompletePopperContent elevation={8}>\n <Autocomplete\n autoFocus\n PaperComponent={paperComponent}\n PopperComponent={AutocompletePopperWrapper}\n fetchNextPage={fetchNextPage}\n getItemLabel={(kogniaUser) =>\n `${kogniaUser.firstName} ${kogniaUser.lastName} (${kogniaUser.email})`\n }\n inputWidth={AUTOCOMPLETE_WIDTH}\n isLoading={isLoading}\n isOptionEqualToValue={(option, value) => option.id === value.id}\n listWidth={AUTOCOMPLETE_WIDTH}\n multiple={true}\n onChange={handleSetFirstName}\n open\n options={kogniaUsersResults}\n renderOption={handleRenderItem}\n renderTags={renderTags}\n resultsHeight={310}\n resultsNoMatches={'No users found'}\n updateValue={handleUpdateValue}\n value={autocompleteValues}\n />\n </AutocompletePopperContent>\n </AutocompletePopper>\n </ClickAwayListener>\n )}\n {kogniaUsers &&\n kogniaUsers.map((kogniaUser) => (\n <AutocompleteActiveFilter\n id={kogniaUser.id}\n key={kogniaUser.id}\n name={`${kogniaUser.firstName} ${kogniaUser.lastName} (${kogniaUser.email})`}\n onRemove={handleRemoveRecording}\n />\n ))}\n </ActiveFilters>\n </Box>\n </Stack>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { LoadingButton } from '@mui/lab';\nimport { Box, Button, Card, CardActions, CardContent, Stack, Typography } from '@mui/material';\nimport { Colors, fontWeight } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { useAddUsersToClients } from 'api/backoffice/user/use-add-clients-to-users';\nimport { KogniaUser } from 'api/backoffice/user/use-kognia-users/types';\nimport { IconChevronRight } from 'shared/components/icons/icon-chevron-right';\n\nimport {\n AddUsersToClientsForm,\n AddUsersToClientsFormFieldsNames,\n addUsersToClientsFormSchema,\n AddUsersToClientsFormSchema,\n} from './utils/add-users-to-clients-form';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { SelectClients } from '../../components/select-clients';\nimport { SelectUsers } from '../../components/select-users';\n\nexport const AddUserToEnvironmentContainer = () => {\n const {\n reset,\n setValue,\n handleSubmit: handleFormSubmit,\n watch,\n } = useForm<AddUsersToClientsFormSchema>({\n defaultValues: {\n [AddUsersToClientsFormFieldsNames.CLIENT_IDS]: [],\n [AddUsersToClientsFormFieldsNames.KOGNIA_USERS]: [],\n },\n resolver: zodResolver(addUsersToClientsFormSchema),\n });\n const [updatedKogniaUsers, setUpdateKogniaUsers] = useState<KogniaUser[]>([]);\n\n const { clientIds: selectedClients, kogniaUsers: selectedKogniaUsers } = watch();\n\n const handleAddOnSuccess = useCallback(\n (kogniaUsers: KogniaUser[]) => {\n setValue(AddUsersToClientsFormFieldsNames.CLIENT_IDS, []);\n setValue(AddUsersToClientsFormFieldsNames.KOGNIA_USERS, []);\n setUpdateKogniaUsers(kogniaUsers);\n },\n [setValue],\n );\n const { addUsersToClients, isLoading } = useAddUsersToClients({ onSuccess: handleAddOnSuccess });\n\n const isValidSelection = selectedKogniaUsers.length > 0 && selectedClients.length > 0;\n\n const setSelectedKogniaUsers = useCallback(\n (clients: KogniaUser[]) => {\n setValue(AddUsersToClientsFormFieldsNames.KOGNIA_USERS, clients);\n },\n [setValue],\n );\n\n const setSelectedClients = useCallback(\n (clientIds: string[]) => {\n setValue(AddUsersToClientsFormFieldsNames.CLIENT_IDS, clientIds);\n },\n [setValue],\n );\n\n const handleAddUsersToClients = useCallback(\n (data: AddUsersToClientsForm) => {\n addUsersToClients(\n data[AddUsersToClientsFormFieldsNames.KOGNIA_USERS],\n data[AddUsersToClientsFormFieldsNames.CLIENT_IDS],\n );\n },\n [addUsersToClients],\n );\n\n return (\n <BackofficeContentContainer>\n <Stack direction={'column'} spacing={2}>\n <Typography variant={'h6'} sx={{ fontWeight: fontWeight['400'] }} display='flex' gap={0.5} alignItems='center'>\n <span>Users</span>\n <IconChevronRight size='small' color='secondary' />\n <span>Add user(s) to environment(s)</span>\n </Typography>\n <Card>\n <CardContent>\n <form onSubmit={handleFormSubmit(handleAddUsersToClients)}>\n <Stack direction='column' spacing={2}>\n <SelectUsers kogniaUsers={selectedKogniaUsers} setKogniaUsersOnChange={setSelectedKogniaUsers} />\n <SelectClients clientIds={selectedClients} onChange={setSelectedClients} />\n <CardActions sx={{ justifyContent: 'flex-end' }}>\n <Button onClick={() => reset()}>Reset</Button>\n <LoadingButton\n color={'primary'}\n disabled={!isValidSelection}\n loading={isLoading}\n size={'large'}\n type={'submit'}\n variant={'contained'}\n >\n Send\n </LoadingButton>\n </CardActions>\n </Stack>\n </form>\n </CardContent>\n </Card>\n {updatedKogniaUsers.map((kogniaUser) => (\n <Card key={kogniaUser.id} sx={{ background: Colors.twilight }}>\n <CardContent>\n <Typography variant={'h5'} marginBottom={2}>\n {kogniaUser.firstName} {kogniaUser.lastName}\n <Typography component={'span'} variant={'body1'} color={Colors.green} marginBottom={2}>\n (id: {kogniaUser.id})\n </Typography>\n </Typography>\n <Stack direction={'column'} spacing={1}>\n <Typography variant={'body1'} sx={{ fontWeight: fontWeight['500'] }}>\n Client ids\n </Typography>\n {kogniaUser.clientIds.map((clientId) => (\n <Box key={clientId} sx={{ color: Colors.storm }}>\n {clientId}\n </Box>\n ))}\n </Stack>\n </CardContent>\n </Card>\n ))}\n </Stack>\n </BackofficeContentContainer>\n );\n};\n","import { Dictionary, isUndefined } from 'lodash';\nimport omitBy from 'lodash/omitBy';\n\nexport const getQueryParams = <T extends Dictionary<any>>(queryParams: T) => {\n return new URLSearchParams({ ...omitBy(queryParams, (value) => isUndefined(value) || value === '') }).toString();\n};\n","import { NotificationType, useNotifications } from 'shared/hooks/notifications';\n\nimport { validateBackofficeOrigin } from '../routes';\n\nexport const useAllowedBackofficeOrigin = () => {\n const triggerNotification = useNotifications();\n const origin = window.location.origin;\n\n const validateOrigin = () => {\n if (!validateBackofficeOrigin(origin)) {\n triggerNotification({\n type: NotificationType.ERROR,\n message: 'This origin is not allowed to perform backoffice requests',\n });\n return false;\n }\n return true;\n };\n\n return {\n getIsAllowedBackofficeOrigin: validateOrigin,\n isAllowedBackofficeOrigin: validateBackofficeOrigin(origin),\n };\n};\n","export type MetadataApiErrorResponse =\n | {\n detail: string;\n }\n | string;\n\nexport const metadataApiErrorParser = (data: MetadataApiErrorResponse | undefined, fallbackErrorMessage: string) => {\n if (typeof data === 'string') {\n return data;\n }\n\n return data ? data.detail : fallbackErrorMessage;\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { getQueryParams } from '../../../utils/get-query-params';\nimport { annotationApiUrls } from '../../routes';\nimport { AnnotationsApiParams } from '../../types';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\n\ninterface AnnotationTaskParams {\n data: AnnotationsApiParams;\n}\n\nexport const useAnnotationTask = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Annotations task success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Annotations task error'),\n });\n\n const annotateTask = ({ data }: AnnotationTaskParams) => {\n const queryParams = getQueryParams<AnnotationsApiParams>(data);\n if (!queryParams) return;\n if (!getIsAllowedBackofficeOrigin()) return;\n mutationRequest.mutate({ url: `${annotationApiUrls.ANNOTATIONS_TASK}?${queryParams}` });\n };\n\n return { ...mutationRequest, annotateTask };\n};\n","import { TypeOf } from 'zod';\n\nimport {\n annotationsTaskFormSchema,\n createTaskFormSchema,\n deleteTaskFormSchema,\n labelsTaskFormSchema,\n validationTaskFormSchema,\n reprocessSyncFormSchema,\n reprocessThirdPartyEventsFormSchema,\n} from './index';\nimport { BackofficeAnnotationToolType, BackofficePipelineType, BackofficeTaskType } from '../../../../api/types';\n\nexport enum AnnotationFormFieldsNames {\n RECORDING_ID = 'recordingId',\n TASK_TYPE = 'taskType',\n START_IX = 'startIx',\n END_IX = 'endIx',\n LOAD_ALL = 'load',\n PIPELINE_TYPE = 'pipelineType',\n DRY_RUN = 'dryRun',\n EPISODE_INDEX = 'episodeIx',\n ANNOTATION_TOOL = 'annotationTool',\n}\n\nexport interface AnnotationFormFields {\n [AnnotationFormFieldsNames.RECORDING_ID]: string;\n [AnnotationFormFieldsNames.TASK_TYPE]: BackofficeTaskType;\n [AnnotationFormFieldsNames.START_IX]: string;\n [AnnotationFormFieldsNames.END_IX]: string;\n [AnnotationFormFieldsNames.LOAD_ALL]: boolean;\n [AnnotationFormFieldsNames.PIPELINE_TYPE]: BackofficePipelineType;\n [AnnotationFormFieldsNames.DRY_RUN]: boolean;\n [AnnotationFormFieldsNames.EPISODE_INDEX]: string;\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: BackofficeAnnotationToolType;\n}\n\nexport interface CreateTaskForm {\n [AnnotationFormFieldsNames.RECORDING_ID]: AnnotationFormFields[AnnotationFormFieldsNames.RECORDING_ID];\n [AnnotationFormFieldsNames.TASK_TYPE]: AnnotationFormFields[AnnotationFormFieldsNames.TASK_TYPE];\n [AnnotationFormFieldsNames.START_IX]?: AnnotationFormFields[AnnotationFormFieldsNames.START_IX];\n [AnnotationFormFieldsNames.END_IX]?: AnnotationFormFields[AnnotationFormFieldsNames.END_IX];\n [AnnotationFormFieldsNames.LOAD_ALL]: AnnotationFormFields[AnnotationFormFieldsNames.LOAD_ALL];\n [AnnotationFormFieldsNames.PIPELINE_TYPE]?: AnnotationFormFields[AnnotationFormFieldsNames.PIPELINE_TYPE];\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: AnnotationFormFields[AnnotationFormFieldsNames.ANNOTATION_TOOL];\n}\n\nexport interface DeleteTaskForm {\n [AnnotationFormFieldsNames.RECORDING_ID]: AnnotationFormFields[AnnotationFormFieldsNames.RECORDING_ID];\n [AnnotationFormFieldsNames.TASK_TYPE]: AnnotationFormFields[AnnotationFormFieldsNames.TASK_TYPE];\n [AnnotationFormFieldsNames.START_IX]?: AnnotationFormFields[AnnotationFormFieldsNames.START_IX];\n [AnnotationFormFieldsNames.END_IX]?: AnnotationFormFields[AnnotationFormFieldsNames.END_IX];\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: AnnotationFormFields[AnnotationFormFieldsNames.ANNOTATION_TOOL];\n}\n\nexport interface ValidateTaskForm {\n [AnnotationFormFieldsNames.RECORDING_ID]: AnnotationFormFields[AnnotationFormFieldsNames.RECORDING_ID];\n [AnnotationFormFieldsNames.PIPELINE_TYPE]?: AnnotationFormFields[AnnotationFormFieldsNames.PIPELINE_TYPE];\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: AnnotationFormFields[AnnotationFormFieldsNames.ANNOTATION_TOOL];\n [AnnotationFormFieldsNames.DRY_RUN]: AnnotationFormFields[AnnotationFormFieldsNames.DRY_RUN];\n}\n\nexport interface AnnotationsForm {\n [AnnotationFormFieldsNames.RECORDING_ID]: AnnotationFormFields[AnnotationFormFieldsNames.RECORDING_ID];\n [AnnotationFormFieldsNames.TASK_TYPE]: AnnotationFormFields[AnnotationFormFieldsNames.TASK_TYPE];\n [AnnotationFormFieldsNames.START_IX]?: AnnotationFormFields[AnnotationFormFieldsNames.START_IX];\n [AnnotationFormFieldsNames.END_IX]?: AnnotationFormFields[AnnotationFormFieldsNames.END_IX];\n [AnnotationFormFieldsNames.PIPELINE_TYPE]?: AnnotationFormFields[AnnotationFormFieldsNames.PIPELINE_TYPE];\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: AnnotationFormFields[AnnotationFormFieldsNames.ANNOTATION_TOOL];\n}\n\nexport interface LabelsForm {\n [AnnotationFormFieldsNames.RECORDING_ID]: AnnotationFormFields[AnnotationFormFieldsNames.RECORDING_ID];\n [AnnotationFormFieldsNames.TASK_TYPE]: AnnotationFormFields[AnnotationFormFieldsNames.TASK_TYPE];\n [AnnotationFormFieldsNames.START_IX]?: AnnotationFormFields[AnnotationFormFieldsNames.START_IX];\n [AnnotationFormFieldsNames.END_IX]?: AnnotationFormFields[AnnotationFormFieldsNames.END_IX];\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: AnnotationFormFields[AnnotationFormFieldsNames.ANNOTATION_TOOL];\n}\n\nexport interface ReprocessSyncForm {\n [AnnotationFormFieldsNames.RECORDING_ID]: AnnotationFormFields[AnnotationFormFieldsNames.RECORDING_ID];\n}\n\nexport interface ReprocessThirdPartyEventsForm {\n [AnnotationFormFieldsNames.RECORDING_ID]: AnnotationFormFields[AnnotationFormFieldsNames.RECORDING_ID];\n}\n\nexport type CreateTaskFormSchema = TypeOf<typeof createTaskFormSchema>;\nexport type DeleteTaskFormSchema = TypeOf<typeof deleteTaskFormSchema>;\nexport type AnnotationsTaskFormSchema = TypeOf<typeof annotationsTaskFormSchema>;\nexport type LabelsTaskFormSchema = TypeOf<typeof labelsTaskFormSchema>;\nexport type ValidationTaskFormSchema = TypeOf<typeof validationTaskFormSchema>;\nexport type ReprocessSyncFormSchema = TypeOf<typeof reprocessSyncFormSchema>;\nexport type ReprocessThirdPartyEventsFormSchema = TypeOf<typeof reprocessThirdPartyEventsFormSchema>;\n","export enum BackofficeTaskType {\n TRAJECTORIES = 'trajectories',\n EVENTS = 'events',\n}\n\nexport enum BackofficePipelineType {\n THIRD_PARTY_TACTICAL = 'third-party-tactical',\n THIRD_PARTY_TRACKING = 'third-party-tactical-tracking',\n KOGNIA = 'kognia',\n KOGNIA_REAL_TIME = 'kognia-real-time',\n KOGNIA_4K = 'kognia-4k',\n}\n\nexport enum BackofficeAnnotationToolType {\n CVAT = 'cvat',\n SUPER_ANNOTATE = 'super-annotate',\n}\n\nenum TaskApiFields {\n RECORDING_ID = 'recordingId',\n TASK_TYPE = 'taskType',\n START_IX = 'startIx',\n END_IX = 'endIx',\n LOAD_ALL = 'load',\n PIPELINE_TYPE = 'pipelineType',\n ANNOTATION_TOOL = 'annotationTool',\n DRY_RUN = 'dryRun',\n EPISODE_INDEX = 'episodeIx',\n TACTICAL_ANALYSIS_ID = 'tacticalAnalysisId',\n GIT_COMMIT = 'gitCommit',\n}\n\nexport interface TaskApiFieldsTypes {\n [TaskApiFields.RECORDING_ID]: string;\n [TaskApiFields.TASK_TYPE]: BackofficeTaskType;\n [TaskApiFields.START_IX]: string;\n [TaskApiFields.END_IX]: string;\n [TaskApiFields.LOAD_ALL]: boolean;\n [TaskApiFields.PIPELINE_TYPE]: BackofficePipelineType;\n [TaskApiFields.ANNOTATION_TOOL]: BackofficeAnnotationToolType;\n [TaskApiFields.DRY_RUN]: boolean;\n [TaskApiFields.EPISODE_INDEX]: string;\n [TaskApiFields.TACTICAL_ANALYSIS_ID]: string;\n [TaskApiFields.GIT_COMMIT]: string;\n}\n\nexport interface CreateTaskApiParams {\n [TaskApiFields.RECORDING_ID]: TaskApiFieldsTypes[TaskApiFields.RECORDING_ID];\n [TaskApiFields.TASK_TYPE]: TaskApiFieldsTypes[TaskApiFields.TASK_TYPE];\n [TaskApiFields.LOAD_ALL]: TaskApiFieldsTypes[TaskApiFields.LOAD_ALL];\n [TaskApiFields.START_IX]?: TaskApiFieldsTypes[TaskApiFields.START_IX];\n [TaskApiFields.END_IX]?: TaskApiFieldsTypes[TaskApiFields.END_IX];\n [TaskApiFields.PIPELINE_TYPE]?: TaskApiFieldsTypes[TaskApiFields.PIPELINE_TYPE];\n [TaskApiFields.ANNOTATION_TOOL]: TaskApiFieldsTypes[TaskApiFields.ANNOTATION_TOOL];\n}\n\nexport interface DeleteTaskApiParams {\n [TaskApiFields.RECORDING_ID]: TaskApiFieldsTypes[TaskApiFields.RECORDING_ID];\n [TaskApiFields.TASK_TYPE]: TaskApiFieldsTypes[TaskApiFields.TASK_TYPE];\n [TaskApiFields.START_IX]?: TaskApiFieldsTypes[TaskApiFields.START_IX];\n [TaskApiFields.END_IX]?: TaskApiFieldsTypes[TaskApiFields.END_IX];\n [TaskApiFields.ANNOTATION_TOOL]: TaskApiFieldsTypes[TaskApiFields.ANNOTATION_TOOL];\n}\n\nexport interface ValidateTaskApiParams {\n [TaskApiFields.RECORDING_ID]: TaskApiFieldsTypes[TaskApiFields.RECORDING_ID];\n [TaskApiFields.DRY_RUN]: boolean;\n [TaskApiFields.PIPELINE_TYPE]?: TaskApiFieldsTypes[TaskApiFields.PIPELINE_TYPE];\n [TaskApiFields.ANNOTATION_TOOL]: TaskApiFieldsTypes[TaskApiFields.ANNOTATION_TOOL];\n}\n\nexport interface AnnotationsApiParams {\n [TaskApiFields.RECORDING_ID]: TaskApiFieldsTypes[TaskApiFields.RECORDING_ID];\n [TaskApiFields.TASK_TYPE]: TaskApiFieldsTypes[TaskApiFields.TASK_TYPE];\n [TaskApiFields.START_IX]?: TaskApiFieldsTypes[TaskApiFields.START_IX];\n [TaskApiFields.END_IX]?: TaskApiFieldsTypes[TaskApiFields.END_IX];\n [TaskApiFields.PIPELINE_TYPE]?: TaskApiFieldsTypes[TaskApiFields.PIPELINE_TYPE];\n [TaskApiFields.ANNOTATION_TOOL]: TaskApiFieldsTypes[TaskApiFields.ANNOTATION_TOOL];\n}\n\nexport interface LabelsApiParams {\n [TaskApiFields.RECORDING_ID]: TaskApiFieldsTypes[TaskApiFields.RECORDING_ID];\n [TaskApiFields.TASK_TYPE]: TaskApiFieldsTypes[TaskApiFields.TASK_TYPE];\n [TaskApiFields.START_IX]?: TaskApiFieldsTypes[TaskApiFields.START_IX];\n [TaskApiFields.END_IX]?: TaskApiFieldsTypes[TaskApiFields.END_IX];\n [TaskApiFields.ANNOTATION_TOOL]: TaskApiFieldsTypes[TaskApiFields.ANNOTATION_TOOL];\n}\n\nexport interface ProcessEpisodeApiParams {\n [TaskApiFields.RECORDING_ID]: TaskApiFieldsTypes[TaskApiFields.RECORDING_ID];\n [TaskApiFields.EPISODE_INDEX]?: TaskApiFieldsTypes[TaskApiFields.EPISODE_INDEX];\n [TaskApiFields.TACTICAL_ANALYSIS_ID]?: TaskApiFieldsTypes[TaskApiFields.TACTICAL_ANALYSIS_ID];\n [TaskApiFields.GIT_COMMIT]?: TaskApiFieldsTypes[TaskApiFields.GIT_COMMIT];\n}\n\nexport interface DeleteEpisodeOverlaysApiParams {\n [TaskApiFields.RECORDING_ID]: TaskApiFieldsTypes[TaskApiFields.RECORDING_ID];\n [TaskApiFields.EPISODE_INDEX]: TaskApiFieldsTypes[TaskApiFields.EPISODE_INDEX];\n}\n\nexport interface ReprocessSyncApiParams {\n [TaskApiFields.RECORDING_ID]: TaskApiFieldsTypes[TaskApiFields.RECORDING_ID];\n}\n\nexport interface ReprocessThirdPartyEventsApiParams {\n [TaskApiFields.RECORDING_ID]: TaskApiFieldsTypes[TaskApiFields.RECORDING_ID];\n}\n","import { boolean, literal, nativeEnum, object, string } from 'zod';\n\nimport { AnnotationFormFieldsNames } from './types';\nimport { BackofficeAnnotationToolType, BackofficePipelineType, BackofficeTaskType } from '../../../../api/types';\n\nconst optionalEmptyStringTransform = literal('').transform(() => undefined);\n\nexport const recordingIdSchema = string().trim().min(2, 'RecordingID is required');\nconst taskTypeSchema = nativeEnum(BackofficeTaskType);\nconst startIxSchema = string().trim().optional();\nconst endIxSchema = string().trim().optional();\nexport const episodeIndex = string().optional();\nexport const tacticalAnalysisIdSchema = string().optional();\nexport const gitCommitSchema = string().optional();\nconst loadAllSchema = boolean();\nconst dryRunSchema = boolean();\nconst pipelineTypeSchema = nativeEnum(BackofficePipelineType).optional().or(optionalEmptyStringTransform);\nconst annotationToolSchema = nativeEnum(BackofficeAnnotationToolType);\n\nconst refineIndex = (input: any) => !(input[AnnotationFormFieldsNames.START_IX] === '');\nconst customIndexError = {\n message: 'Start index is required',\n path: [AnnotationFormFieldsNames.START_IX],\n};\nexport const createTaskFormSchema = object({\n [AnnotationFormFieldsNames.RECORDING_ID]: recordingIdSchema,\n [AnnotationFormFieldsNames.TASK_TYPE]: taskTypeSchema,\n [AnnotationFormFieldsNames.START_IX]: startIxSchema,\n [AnnotationFormFieldsNames.END_IX]: endIxSchema,\n [AnnotationFormFieldsNames.LOAD_ALL]: loadAllSchema,\n [AnnotationFormFieldsNames.PIPELINE_TYPE]: pipelineTypeSchema,\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: annotationToolSchema,\n}).refine(refineIndex, customIndexError);\n\nexport const deleteTaskFormSchema = object({\n [AnnotationFormFieldsNames.RECORDING_ID]: recordingIdSchema,\n [AnnotationFormFieldsNames.TASK_TYPE]: taskTypeSchema,\n [AnnotationFormFieldsNames.START_IX]: startIxSchema,\n [AnnotationFormFieldsNames.END_IX]: endIxSchema,\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: annotationToolSchema,\n}).refine(refineIndex, customIndexError);\n\nexport const annotationsTaskFormSchema = object({\n [AnnotationFormFieldsNames.RECORDING_ID]: recordingIdSchema,\n [AnnotationFormFieldsNames.TASK_TYPE]: taskTypeSchema,\n [AnnotationFormFieldsNames.START_IX]: startIxSchema,\n [AnnotationFormFieldsNames.END_IX]: endIxSchema,\n [AnnotationFormFieldsNames.PIPELINE_TYPE]: pipelineTypeSchema,\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: annotationToolSchema,\n}).refine(refineIndex, customIndexError);\n\nexport const labelsTaskFormSchema = object({\n [AnnotationFormFieldsNames.RECORDING_ID]: recordingIdSchema,\n [AnnotationFormFieldsNames.TASK_TYPE]: taskTypeSchema,\n [AnnotationFormFieldsNames.START_IX]: startIxSchema,\n [AnnotationFormFieldsNames.END_IX]: endIxSchema,\n [AnnotationFormFieldsNames.PIPELINE_TYPE]: pipelineTypeSchema,\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: annotationToolSchema,\n}).refine(refineIndex, customIndexError);\n\nexport const validationTaskFormSchema = object({\n [AnnotationFormFieldsNames.RECORDING_ID]: recordingIdSchema,\n [AnnotationFormFieldsNames.DRY_RUN]: dryRunSchema,\n [AnnotationFormFieldsNames.PIPELINE_TYPE]: pipelineTypeSchema,\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: annotationToolSchema,\n});\n\nexport const reprocessSyncFormSchema = object({\n [AnnotationFormFieldsNames.RECORDING_ID]: recordingIdSchema,\n});\n\nexport const reprocessThirdPartyEventsFormSchema = object({\n [AnnotationFormFieldsNames.RECORDING_ID]: recordingIdSchema,\n});\n\nexport const AnnotationFormLabels = {\n [AnnotationFormFieldsNames.RECORDING_ID]: 'Recording ID',\n [AnnotationFormFieldsNames.TASK_TYPE]: 'Task type',\n [AnnotationFormFieldsNames.START_IX]: 'Start index',\n [AnnotationFormFieldsNames.END_IX]: 'End index',\n [AnnotationFormFieldsNames.LOAD_ALL]: 'Load annotations',\n [AnnotationFormFieldsNames.PIPELINE_TYPE]: 'Pipeline type',\n [AnnotationFormFieldsNames.DRY_RUN]: 'Dry run',\n [AnnotationFormFieldsNames.EPISODE_INDEX]: 'Episode index',\n [AnnotationFormFieldsNames.ANNOTATION_TOOL]: 'Annotation tool',\n};\n","import { Button } from '@mui/material';\nimport React from 'react';\n\ninterface Props {\n reset: () => void;\n}\n\nexport const AnnotationFormActions = ({ reset }: Props) => {\n return (\n <>\n <Button onClick={reset}>Reset</Button>\n <Button variant='contained' type='submit'>\n Submit\n </Button>\n </>\n );\n};\n","import { Box, InputLabel, styled } from '@mui/material';\n\nexport const FormItem = styled(Box)(({ theme }) => ({\n marginBottom: theme.spacing(3),\n}));\n\nexport const FormInputLabel = styled(InputLabel)(({ theme }) => ({\n marginBottom: theme.spacing(0.5),\n}));\n","import React, { PropsWithChildren, ReactNode } from 'react';\n\nimport { FormInputLabel, FormItem } from 'shared/components/form/styled';\n\ninterface Props {\n label: ReactNode;\n id: string;\n required?: boolean;\n}\n\nexport const FormField = ({ children, label, required, id }: PropsWithChildren<Props>) => {\n return (\n <FormItem>\n <FormInputLabel id={id}>\n {label}\n {required ? '*' : null}\n </FormInputLabel>\n {children}\n </FormItem>\n );\n};\n","import { FormControl, FormHelperText, MenuItem, Select, SelectProps } from '@mui/material';\nimport React from 'react';\n\nimport { FormField } from '../form-field';\n\ntype Props = SelectProps & {\n id: string;\n options: any;\n showNoneOption?: boolean;\n helperText?: React.ReactNode;\n fullWidth?: boolean;\n};\n\nexport const FormSelectField = React.forwardRef(\n (\n { id, label, helperText, options, required, showNoneOption = false, fullWidth = true, ...rest }: Props,\n ref: any,\n ) => {\n const labelId = `${id}-label`;\n\n return (\n <FormField id={id} label={label} required={required}>\n <FormControl fullWidth={fullWidth} size='small' required={required}>\n <Select ref={ref} labelId={labelId} id={id} name={id} {...rest}>\n {rest?.defaultValue === '' || showNoneOption ? (\n <MenuItem value=''>\n <em>None</em>\n </MenuItem>\n ) : null}\n {options}\n </Select>\n {helperText ? <FormHelperText error>{helperText}</FormHelperText> : null}\n </FormControl>\n </FormField>\n );\n },\n);\n\nFormSelectField.displayName = 'AnnotationSelectField';\n","import { MenuItem } from '@mui/material';\nimport React from 'react';\n\ninterface SelectTypeOptionsProps {\n options: { value: string | number | any; label?: string }[];\n}\n\nexport const getTypeOptions = ({ options }: SelectTypeOptionsProps) => {\n return options.map((option) => {\n return (\n <MenuItem key={option.value} value={option.value}>\n {option.label ? option.label : option.value}\n </MenuItem>\n );\n });\n};\n","import { FormSelectField } from 'shared/components/form/form-select-field';\nimport { getTypeOptions } from 'shared/components/form/get-type-options';\n\nimport { BackofficeAnnotationToolType } from '../../../../../api/types';\nimport { AnnotationFormLabels } from '../../../utils/form-fields-validation';\nimport { AnnotationFormFieldsNames } from '../../../utils/form-fields-validation/types';\nimport { FormFieldProps } from '../types';\n\nexport const AnnotationToolField = ({ errors = {}, register }: FormFieldProps) => {\n return (\n <FormSelectField\n id={AnnotationFormFieldsNames.ANNOTATION_TOOL}\n label={AnnotationFormLabels[AnnotationFormFieldsNames.ANNOTATION_TOOL]}\n options={getTypeOptions({\n options: Object.values(BackofficeAnnotationToolType).map((option) => ({ value: option })),\n })}\n defaultValue={BackofficeAnnotationToolType.CVAT}\n error={!!errors[AnnotationFormFieldsNames.ANNOTATION_TOOL]}\n helperText={\n errors[AnnotationFormFieldsNames.ANNOTATION_TOOL] && (\n <>{errors[AnnotationFormFieldsNames.ANNOTATION_TOOL]?.message}</>\n )\n }\n {...register(AnnotationFormFieldsNames.ANNOTATION_TOOL)}\n />\n );\n};\n","import { TextField } from '@mui/material';\nimport { StandardTextFieldProps } from '@mui/material/TextField/TextField';\nimport React from 'react';\n\nimport { FormField } from '../form-field';\n\nexport interface Props extends StandardTextFieldProps {\n id: string;\n label: string;\n}\n\nexport const FormInputField = React.forwardRef(({ value, id, label, required, ...rest }: Props, ref: any) => {\n return (\n <FormField id={id} label={label} required={required}>\n <TextField id={id} size='small' value={value} required={required} {...rest} ref={ref} />\n </FormField>\n );\n});\n\nFormInputField.displayName = 'FormInputField';\n","import React from 'react';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\n\nimport { AnnotationFormLabels } from '../../../utils/form-fields-validation';\nimport { AnnotationFormFieldsNames } from '../../../utils/form-fields-validation/types';\nimport { FormFieldProps } from '../types';\n\nexport const EndIxField = ({ errors = {}, register }: FormFieldProps) => {\n return (\n <FormInputField\n id={AnnotationFormFieldsNames.END_IX}\n label={AnnotationFormLabels[AnnotationFormFieldsNames.END_IX]}\n error={!!errors[AnnotationFormFieldsNames.END_IX]}\n fullWidth\n helperText={errors[AnnotationFormFieldsNames.END_IX] && <>{errors[AnnotationFormFieldsNames.END_IX]?.message}</>}\n {...register(AnnotationFormFieldsNames.END_IX)}\n />\n );\n};\n","import React from 'react';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\n\nimport { AnnotationFormLabels } from '../../../utils/form-fields-validation';\nimport { AnnotationFormFieldsNames } from '../../../utils/form-fields-validation/types';\nimport { FormFieldProps } from '../types';\n\nexport const StartIxField = ({ errors = {}, register }: FormFieldProps) => {\n return (\n <FormInputField\n id={AnnotationFormFieldsNames.START_IX}\n label={AnnotationFormLabels[AnnotationFormFieldsNames.START_IX]}\n error={!!errors[AnnotationFormFieldsNames.START_IX]}\n fullWidth\n helperText={\n errors[AnnotationFormFieldsNames.START_IX] && <>{errors[AnnotationFormFieldsNames.START_IX]?.message}</>\n }\n {...register(AnnotationFormFieldsNames.START_IX)}\n />\n );\n};\n","import { FormControl, FormControlLabel, FormHelperText, Radio, RadioGroup } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { UseFormResetField } from 'react-hook-form';\n\nimport { AnnotationFormFieldsNames, CreateTaskFormSchema } from '../../../utils/form-fields-validation/types';\nimport { EndIxField } from '../end-ix-field';\nimport { StartIxField } from '../start-ix-field';\nimport { FormFieldProps } from '../types';\n\nenum IndexTypeValues {\n FULL_RECORDING = 'fullRecording',\n PARTIAL_RECORDING = 'partialRecording',\n}\n\ninterface Props extends FormFieldProps {\n resetField: UseFormResetField<CreateTaskFormSchema>;\n}\n\nexport const IndexTypeGroup = ({ errors, register, resetField }: Props) => {\n const [indexType, setIndexType] = React.useState(IndexTypeValues.FULL_RECORDING);\n\n const handleRadioChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = event.target;\n setIndexType(value as IndexTypeValues);\n if (value === IndexTypeValues.FULL_RECORDING) {\n resetField(AnnotationFormFieldsNames.START_IX);\n resetField(AnnotationFormFieldsNames.END_IX);\n }\n },\n [resetField],\n );\n\n return (\n <>\n <FormControl sx={{ mb: 2 }}>\n <RadioGroup onChange={handleRadioChange} name='index-buttons-group' value={indexType}>\n <FormControlLabel value={IndexTypeValues.FULL_RECORDING} control={<Radio />} label='Full recording' />\n <FormControlLabel\n value={IndexTypeValues.PARTIAL_RECORDING}\n control={<Radio />}\n label='From start index to end index'\n />\n </RadioGroup>\n </FormControl>\n\n {indexType === IndexTypeValues.PARTIAL_RECORDING ? (\n <>\n <FormHelperText>Start index required. If End index is omitted, it runs to the end</FormHelperText>\n <StartIxField errors={errors} register={register} />\n <EndIxField errors={errors} register={register} />\n </>\n ) : null}\n </>\n );\n};\n","import React from 'react';\n\nimport { FormSelectField } from 'shared/components/form/form-select-field';\nimport { getTypeOptions } from 'shared/components/form/get-type-options';\n\nimport { BackofficePipelineType } from '../../../../../api/types';\nimport { AnnotationFormLabels } from '../../../utils/form-fields-validation';\nimport { AnnotationFormFieldsNames } from '../../../utils/form-fields-validation/types';\nimport { FormFieldProps } from '../types';\n\nexport const PipelineTypeField = ({ errors = {}, register }: FormFieldProps) => {\n return (\n <FormSelectField\n id={AnnotationFormFieldsNames.PIPELINE_TYPE}\n label={AnnotationFormLabels[AnnotationFormFieldsNames.PIPELINE_TYPE]}\n options={getTypeOptions({ options: Object.values(BackofficePipelineType).map((option) => ({ value: option })) })}\n error={!!errors[AnnotationFormFieldsNames.PIPELINE_TYPE]}\n helperText={\n errors[AnnotationFormFieldsNames.PIPELINE_TYPE] && (\n <>{errors[AnnotationFormFieldsNames.PIPELINE_TYPE]?.message}</>\n )\n }\n defaultValue={''}\n {...register(AnnotationFormFieldsNames.PIPELINE_TYPE)}\n />\n );\n};\n","import React from 'react';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\n\nimport { AnnotationFormLabels } from '../../../utils/form-fields-validation';\nimport { AnnotationFormFieldsNames } from '../../../utils/form-fields-validation/types';\nimport { FormFieldProps } from '../types';\n\nexport const RecordingIdField = ({ errors = {}, register }: FormFieldProps) => {\n return (\n <FormInputField\n id={AnnotationFormFieldsNames.RECORDING_ID}\n label={AnnotationFormLabels[AnnotationFormFieldsNames.RECORDING_ID]}\n error={!!errors[AnnotationFormFieldsNames.RECORDING_ID]}\n fullWidth\n helperText={\n errors[AnnotationFormFieldsNames.RECORDING_ID] && <>{errors[AnnotationFormFieldsNames.RECORDING_ID]?.message}</>\n }\n {...register(AnnotationFormFieldsNames.RECORDING_ID)}\n />\n );\n};\n","import React from 'react';\n\nimport { FormSelectField } from 'shared/components/form/form-select-field';\nimport { getTypeOptions } from 'shared/components/form/get-type-options';\n\nimport { BackofficeTaskType } from '../../../../../api/types';\nimport { AnnotationFormLabels } from '../../../utils/form-fields-validation';\nimport { AnnotationFormFieldsNames } from '../../../utils/form-fields-validation/types';\nimport { FormFieldProps } from '../types';\n\nexport const TaskTypeField = ({ errors = {}, register }: FormFieldProps) => {\n return (\n <FormSelectField\n id={AnnotationFormFieldsNames.TASK_TYPE}\n label={AnnotationFormLabels[AnnotationFormFieldsNames.TASK_TYPE]}\n options={getTypeOptions({ options: Object.values(BackofficeTaskType).map((option) => ({ value: option })) })}\n defaultValue={BackofficeTaskType.TRAJECTORIES}\n error={!!errors[AnnotationFormFieldsNames.TASK_TYPE]}\n helperText={\n errors[AnnotationFormFieldsNames.TASK_TYPE] && <>{errors[AnnotationFormFieldsNames.TASK_TYPE]?.message}</>\n }\n {...register(AnnotationFormFieldsNames.TASK_TYPE)}\n />\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { AccordionActions, AccordionDetails } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { useAnnotationTask } from '../../../../api/operations/use-annotation-task';\nimport { annotationsTaskFormSchema } from '../../utils/form-fields-validation';\nimport { AnnotationsForm, AnnotationsTaskFormSchema } from '../../utils/form-fields-validation/types';\nimport { AnnotationFormActions } from '../annotation-form-actions';\nimport { AnnotationToolField } from '../form-fields/annotation-tool-field';\nimport { IndexTypeGroup } from '../form-fields/index-type-group';\nimport { PipelineTypeField } from '../form-fields/pipeline-type-field';\nimport { RecordingIdField } from '../form-fields/recording-id-field';\nimport { TaskTypeField } from '../form-fields/task-type-field';\n\nexport const AnnotationsTask = () => {\n const { annotateTask } = useAnnotationTask();\n\n const {\n register,\n formState: { errors },\n reset,\n resetField,\n handleSubmit: handleFormSubmit,\n } = useForm<AnnotationsTaskFormSchema>({\n resolver: zodResolver(annotationsTaskFormSchema),\n });\n\n const handleSubmit = useCallback(\n (data: AnnotationsForm) => {\n annotateTask({ data });\n },\n [annotateTask],\n );\n\n return (\n <form onSubmit={handleFormSubmit(handleSubmit)}>\n <AccordionDetails>\n <RecordingIdField errors={errors} register={register} />\n <TaskTypeField errors={errors} register={register} />\n <IndexTypeGroup errors={errors} register={register} resetField={resetField} />\n <PipelineTypeField errors={errors} register={register} />\n <AnnotationToolField errors={errors} register={register} />\n </AccordionDetails>\n <AccordionActions>\n <AnnotationFormActions reset={() => reset()} />\n </AccordionActions>\n </form>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { getQueryParams } from '../../../utils/get-query-params';\nimport { annotationApiUrls } from '../../routes';\nimport { CreateTaskApiParams } from '../../types';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\n\ninterface CreateTaskParams {\n data: CreateTaskApiParams;\n}\n\nexport const useCreateTask = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Create task success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Create task error'),\n });\n\n const createTask = ({ data }: CreateTaskParams) => {\n const queryParams = getQueryParams<CreateTaskApiParams>(data);\n if (!queryParams) return;\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate({\n url: `${annotationApiUrls.CREATE_TASK}?${queryParams}`,\n });\n };\n\n return { ...mutationRequest, createTask };\n};\n","import { Switch, SwitchProps } from '@mui/material';\nimport React from 'react';\n\nimport { FormField } from '../form-field';\n\nexport interface Props extends SwitchProps {\n id: string;\n label: string;\n required?: boolean;\n}\n\nexport const FormSwitchField = React.forwardRef(({ id, label, required, defaultChecked, ...rest }: Props, ref: any) => {\n return (\n <FormField id={id} label={label} required={required}>\n <Switch id={id} defaultChecked={defaultChecked} {...rest} ref={ref} />\n </FormField>\n );\n});\n\nFormSwitchField.displayName = 'FormSwitchField';\n","import { FormSwitchField } from 'shared/components/form/form-switch-field';\n\nimport { AnnotationFormLabels } from '../../../utils/form-fields-validation';\nimport { AnnotationFormFieldsNames } from '../../../utils/form-fields-validation/types';\nimport { FormFieldProps } from '../types';\n\nexport const LoadAnnotationsField = ({ register }: FormFieldProps) => {\n return (\n <FormSwitchField\n id={AnnotationFormFieldsNames.LOAD_ALL}\n defaultChecked\n label={AnnotationFormLabels[AnnotationFormFieldsNames.LOAD_ALL]}\n {...register(AnnotationFormFieldsNames.LOAD_ALL)}\n />\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { AccordionActions, AccordionDetails } from '@mui/material';\nimport { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { useCreateTask } from '../../../../api/operations/use-create-task';\nimport { createTaskFormSchema } from '../../utils/form-fields-validation';\nimport { CreateTaskForm, CreateTaskFormSchema } from '../../utils/form-fields-validation/types';\nimport { AnnotationFormActions } from '../annotation-form-actions';\nimport { AnnotationToolField } from '../form-fields/annotation-tool-field';\nimport { IndexTypeGroup } from '../form-fields/index-type-group';\nimport { LoadAnnotationsField } from '../form-fields/load-annotations-field';\nimport { PipelineTypeField } from '../form-fields/pipeline-type-field';\nimport { RecordingIdField } from '../form-fields/recording-id-field';\nimport { TaskTypeField } from '../form-fields/task-type-field';\n\nexport const CreateTask = () => {\n const { createTask } = useCreateTask();\n\n const {\n register,\n formState: { errors },\n reset,\n resetField,\n handleSubmit: handleFormSubmit,\n } = useForm<CreateTaskFormSchema>({\n resolver: zodResolver(createTaskFormSchema),\n });\n\n const handleCreateTask = useCallback(\n (data: CreateTaskForm) => {\n createTask({ data });\n },\n [createTask],\n );\n\n return (\n <form onSubmit={handleFormSubmit(handleCreateTask)}>\n <AccordionDetails>\n <RecordingIdField errors={errors} register={register} />\n <IndexTypeGroup errors={errors} register={register} resetField={resetField} />\n <TaskTypeField errors={errors} register={register} />\n <LoadAnnotationsField register={register} />\n <PipelineTypeField errors={errors} register={register} />\n <AnnotationToolField errors={errors} register={register} />\n </AccordionDetails>\n <AccordionActions>\n <AnnotationFormActions reset={() => reset()} />\n </AccordionActions>\n </form>\n );\n};\n","import { object, string } from 'zod';\n\nimport { recordingIdSchema } from '../../utils/form-fields-validation';\nimport { AnnotationFormFieldsNames } from '../../utils/form-fields-validation/types';\n\nexport const deleteEpisodeOverlaysFormSchema = object({\n [AnnotationFormFieldsNames.RECORDING_ID]: recordingIdSchema,\n [AnnotationFormFieldsNames.EPISODE_INDEX]: string().min(1, 'Episode index is required'),\n});\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { getQueryParams } from '../../../utils/get-query-params';\nimport { annotationApiUrls } from '../../routes';\nimport { DeleteEpisodeOverlaysApiParams } from '../../types';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\n\ninterface DeleteEpisodeOverlaysParams {\n data: DeleteEpisodeOverlaysApiParams;\n}\n\nexport const useDeleteEpisodeOverlays = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Delete episode overlays success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Delete episode overlays error'),\n });\n\n const deleteEpisodeOverlays = ({ data }: DeleteEpisodeOverlaysParams) => {\n const queryParams = getQueryParams<DeleteEpisodeOverlaysApiParams>(data);\n if (!queryParams) return;\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate({ url: `${annotationApiUrls.DELETE_EPISODE_OVERLAYS}?${queryParams}` });\n };\n\n return { ...mutationRequest, deleteEpisodeOverlays };\n};\n","import React from 'react';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\n\nimport { AnnotationFormLabels } from '../../../utils/form-fields-validation';\nimport { AnnotationFormFieldsNames } from '../../../utils/form-fields-validation/types';\nimport { FormFieldProps } from '../types';\n\nexport const EpisodeIndexField = ({ errors = {}, register }: FormFieldProps) => {\n return (\n <FormInputField\n id={AnnotationFormFieldsNames.EPISODE_INDEX}\n label={AnnotationFormLabels[AnnotationFormFieldsNames.EPISODE_INDEX]}\n error={!!errors[AnnotationFormFieldsNames.EPISODE_INDEX]}\n fullWidth\n helperText={\n errors[AnnotationFormFieldsNames.EPISODE_INDEX] && (\n <>{errors[AnnotationFormFieldsNames.EPISODE_INDEX]?.message}</>\n )\n }\n {...register(AnnotationFormFieldsNames.EPISODE_INDEX)}\n />\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { AccordionActions, AccordionDetails } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport IconDelete from 'shared/components/icons/icon-delete';\n\nimport { deleteEpisodeOverlaysFormSchema } from './form';\nimport { DeleteEpisodeOverlaysForm, DeleteEpisodeOverlaysFormSchema } from './types';\nimport { useDeleteEpisodeOverlays } from '../../../../api/operations/use-delete-episode-overlays';\nimport { AnnotationFormActions } from '../annotation-form-actions';\nimport { EpisodeIndexField } from '../form-fields/episode-index-field';\nimport { RecordingIdField } from '../form-fields/recording-id-field';\n\nexport const DeleteEpisodeOverlays = () => {\n const [confirmationDialogOpen, setConfirmationDialogOpen] = React.useState(false);\n const {\n register,\n formState: { errors },\n reset,\n getValues,\n handleSubmit: handleFormSubmit,\n } = useForm<DeleteEpisodeOverlaysFormSchema>({\n resolver: zodResolver(deleteEpisodeOverlaysFormSchema),\n });\n\n const values: DeleteEpisodeOverlaysForm = getValues();\n\n const handleConfirmDialogOpen = useCallback(() => setConfirmationDialogOpen(true), []);\n const handleConfirmDialogClose = useCallback(() => setConfirmationDialogOpen(false), []);\n\n const { deleteEpisodeOverlays } = useDeleteEpisodeOverlays();\n\n const handleSubmit = useCallback(() => {\n handleConfirmDialogOpen();\n }, [handleConfirmDialogOpen]);\n\n const handleConfirmSubmit = useCallback(() => {\n deleteEpisodeOverlays({ data: values });\n handleConfirmDialogClose();\n }, [deleteEpisodeOverlays, handleConfirmDialogClose, values]);\n\n return (\n <form onSubmit={handleFormSubmit(handleSubmit)}>\n <AccordionDetails>\n <RecordingIdField errors={errors} register={register} />\n <EpisodeIndexField errors={errors} register={register} />\n </AccordionDetails>\n <AccordionActions>\n <AnnotationFormActions reset={() => reset()} />\n </AccordionActions>\n <DialogNew\n title='Confirmation'\n icon={<IconDelete />}\n onCancel={handleConfirmDialogClose}\n onClose={handleConfirmDialogClose}\n onSubmit={handleConfirmSubmit}\n buttonSubmitText='Delete'\n open={confirmationDialogOpen}\n error\n >\n This will delete episode <strong>{values.episodeIx}</strong> for recording <strong>{values.recordingId}</strong>\n . Continue?\n </DialogNew>\n </form>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { getQueryParams } from '../../../utils/get-query-params';\nimport { annotationApiUrls } from '../../routes';\nimport { DeleteTaskApiParams } from '../../types';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\n\ninterface DeleteTaskParams {\n data: DeleteTaskApiParams;\n}\n\nexport const useDeleteTask = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.DELETE,\n successMessage: 'Delete task success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Delete task error'),\n });\n\n const deleteTask = ({ data }: DeleteTaskParams) => {\n const queryParams = getQueryParams<DeleteTaskApiParams>(data);\n if (!queryParams) return;\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate({ url: `${annotationApiUrls.DELETE_TASK}?${queryParams}` });\n };\n\n return { ...mutationRequest, deleteTask };\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { AccordionActions, AccordionDetails } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport IconDelete from 'shared/components/icons/icon-delete';\n\nimport { useDeleteTask } from '../../../../api/operations/use-delete-task';\nimport { deleteTaskFormSchema } from '../../utils/form-fields-validation';\nimport { DeleteTaskFormSchema } from '../../utils/form-fields-validation/types';\nimport { AnnotationFormActions } from '../annotation-form-actions';\nimport { AnnotationToolField } from '../form-fields/annotation-tool-field';\nimport { IndexTypeGroup } from '../form-fields/index-type-group';\nimport { RecordingIdField } from '../form-fields/recording-id-field';\nimport { TaskTypeField } from '../form-fields/task-type-field';\n\nexport const DeleteTask = () => {\n const [confirmationDialogOpen, setConfirmationDialogOpen] = React.useState(false);\n const {\n register,\n formState: { errors },\n reset,\n resetField,\n getValues,\n handleSubmit: handleFormSubmit,\n } = useForm<DeleteTaskFormSchema>({\n resolver: zodResolver(deleteTaskFormSchema),\n });\n\n const values = getValues();\n\n const hasStartIndexValue = values?.startIx ? values?.startIx.length > 0 : false;\n const hasEndIndexValue = values?.endIx ? values?.endIx.length > 0 : false;\n\n const handleConfirmDialogOpen = useCallback(() => setConfirmationDialogOpen(true), []);\n const handleConfirmDialogClose = useCallback(() => setConfirmationDialogOpen(false), []);\n\n const { deleteTask } = useDeleteTask();\n\n const handleSubmit = useCallback(() => {\n handleConfirmDialogOpen();\n }, [handleConfirmDialogOpen]);\n\n const handleConfirmSubmit = useCallback(() => {\n deleteTask({ data: values });\n handleConfirmDialogClose();\n }, [deleteTask, handleConfirmDialogClose, values]);\n\n return (\n <form onSubmit={handleFormSubmit(handleSubmit)}>\n <AccordionDetails>\n <RecordingIdField errors={errors} register={register} />\n <IndexTypeGroup register={register} errors={errors} resetField={resetField} />\n <TaskTypeField errors={errors} register={register} />\n <AnnotationToolField errors={errors} register={register} />\n </AccordionDetails>\n <AccordionActions>\n <AnnotationFormActions reset={() => reset()} />\n </AccordionActions>\n <DialogNew\n title='Confirmation'\n icon={<IconDelete />}\n onCancel={handleConfirmDialogClose}\n onClose={handleConfirmDialogClose}\n onSubmit={handleConfirmSubmit}\n buttonSubmitText='Delete'\n open={confirmationDialogOpen}\n error\n >\n {hasStartIndexValue && !hasEndIndexValue ? (\n <>\n This will delete tasks from <strong>{values.startIx}</strong> to the end for{' '}\n <strong>{values.recordingId}</strong>.\n </>\n ) : null}\n {hasStartIndexValue && hasEndIndexValue ? (\n <>\n This will delete tasks from <strong>{values.startIx}</strong> to <strong>{values.endIx}</strong> for{' '}\n <strong>{values.recordingId}</strong>.\n </>\n ) : null}\n {!hasStartIndexValue ? (\n <>\n This will delete all tasks for recording <strong>{values.recordingId}</strong>.\n </>\n ) : null}\n </DialogNew>\n </form>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { getQueryParams } from '../../../utils/get-query-params';\nimport { annotationApiUrls } from '../../routes';\nimport { LabelsApiParams } from '../../types';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\n\ninterface LabelsTaskParams {\n data: LabelsApiParams;\n}\n\nexport const useLabelsTask = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Labels task success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Labels task error'),\n });\n\n const labelsTask = ({ data }: LabelsTaskParams) => {\n const queryParams = getQueryParams<LabelsApiParams>(data);\n if (!queryParams) return;\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate({ url: `${annotationApiUrls.LABELS_TASK}?${queryParams}` });\n };\n\n return { ...mutationRequest, labelsTask };\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { AccordionActions, AccordionDetails } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { useLabelsTask } from '../../../../api/operations/use-labels-task';\nimport { labelsTaskFormSchema } from '../../utils/form-fields-validation';\nimport { LabelsForm, LabelsTaskFormSchema } from '../../utils/form-fields-validation/types';\nimport { AnnotationFormActions } from '../annotation-form-actions';\nimport { AnnotationToolField } from '../form-fields/annotation-tool-field';\nimport { IndexTypeGroup } from '../form-fields/index-type-group';\nimport { RecordingIdField } from '../form-fields/recording-id-field';\nimport { TaskTypeField } from '../form-fields/task-type-field';\n\nexport const LabelsTask = () => {\n const { labelsTask } = useLabelsTask();\n const {\n register,\n formState: { errors },\n reset,\n resetField,\n handleSubmit: handleFormSubmit,\n } = useForm<LabelsTaskFormSchema>({\n resolver: zodResolver(labelsTaskFormSchema),\n });\n\n const handleSubmit = useCallback(\n (data: LabelsForm) => {\n labelsTask({ data });\n },\n [labelsTask],\n );\n\n return (\n <form onSubmit={handleFormSubmit(handleSubmit)}>\n <AccordionDetails>\n <RecordingIdField errors={errors} register={register} />\n <TaskTypeField errors={errors} register={register} />\n <AnnotationToolField errors={errors} register={register} />\n <IndexTypeGroup register={register} errors={errors} resetField={resetField} />\n </AccordionDetails>\n <AccordionActions>\n <AnnotationFormActions reset={() => reset()} />\n </AccordionActions>\n </form>\n );\n};\n","import { object } from 'zod';\n\nimport { recordingIdSchema } from '../../utils/form-fields-validation';\nimport { AnnotationFormFieldsNames } from '../../utils/form-fields-validation/types';\n\nexport const processEpisodeFormSchema = object({\n [AnnotationFormFieldsNames.RECORDING_ID]: recordingIdSchema,\n});\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { getQueryParams } from '../../../utils/get-query-params';\nimport { annotationApiUrls } from '../../routes';\nimport { ProcessEpisodeApiParams } from '../../types';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\n\ninterface ProcessEpisodeParams {\n data: ProcessEpisodeApiParams;\n}\n\nexport const useProcessEpisode = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Process episode success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Process episode error'),\n });\n\n const processEpisode = ({ data }: ProcessEpisodeParams) => {\n const queryParams = getQueryParams<ProcessEpisodeApiParams>(data);\n if (!queryParams) return;\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate({ url: `${annotationApiUrls.PROCESS_EPISODE}?${queryParams}` });\n };\n\n return { ...mutationRequest, processEpisode };\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { AccordionActions, AccordionDetails } from '@mui/material';\nimport { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { processEpisodeFormSchema } from './form';\nimport { ProcessEpisodeForm, ProcessEpisodeFormSchema } from './types';\nimport { useProcessEpisode } from '../../../../api/operations/use-process-episode';\nimport { AnnotationFormActions } from '../annotation-form-actions';\nimport { RecordingIdField } from '../form-fields/recording-id-field';\n\nexport const ProcessEpisode = () => {\n const { processEpisode } = useProcessEpisode();\n const {\n register,\n formState: { errors },\n reset,\n handleSubmit: handleFormSubmit,\n } = useForm<ProcessEpisodeFormSchema>({\n resolver: zodResolver(processEpisodeFormSchema),\n });\n\n const handleSubmit = useCallback(\n (data: ProcessEpisodeForm) => {\n processEpisode({ data });\n },\n [processEpisode],\n );\n\n return (\n <form onSubmit={handleFormSubmit(handleSubmit)}>\n <AccordionDetails>\n <RecordingIdField errors={errors} register={register} />\n </AccordionDetails>\n <AccordionActions>\n <AnnotationFormActions reset={() => reset()} />\n </AccordionActions>\n </form>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { ReprocessSyncApiParams } from '../../types';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\n\ninterface ReprocessSyncParams {\n data: ReprocessSyncApiParams;\n}\n\nexport const useReprocessSync = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Reprocess sync success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Reprocess sync error'),\n });\n\n const reprocessSync = ({ data }: ReprocessSyncParams) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate({ url: `${annotationApiUrls.THIRD_PARTY_SYNC}`, data });\n };\n\n return { ...mutationRequest, reprocessSync };\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { AccordionActions, AccordionDetails } from '@mui/material';\nimport { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { useReprocessSync } from '../../../../api/operations/use-reprocess-sync';\nimport { reprocessSyncFormSchema } from '../../utils/form-fields-validation';\nimport { ReprocessSyncForm, ReprocessSyncFormSchema } from '../../utils/form-fields-validation/types';\nimport { AnnotationFormActions } from '../annotation-form-actions';\nimport { RecordingIdField } from '../form-fields/recording-id-field';\n\nexport const ReprocessSync = () => {\n const { reprocessSync } = useReprocessSync();\n\n const {\n register,\n formState: { errors },\n reset,\n handleSubmit: handleFormSubmit,\n } = useForm<ReprocessSyncFormSchema>({\n resolver: zodResolver(reprocessSyncFormSchema),\n });\n\n const handleSubmit = useCallback(\n (data: ReprocessSyncForm) => {\n reprocessSync({ data });\n },\n [reprocessSync],\n );\n\n return (\n <form onSubmit={handleFormSubmit(handleSubmit)}>\n <AccordionDetails>\n <RecordingIdField errors={errors} register={register} />\n </AccordionDetails>\n <AccordionActions>\n <AnnotationFormActions reset={() => reset()} />\n </AccordionActions>\n </form>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { ReprocessThirdPartyEventsApiParams } from '../../types';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\n\ninterface ReprocessThirdPartyEventsParams {\n data: ReprocessThirdPartyEventsApiParams;\n}\n\nexport const useReprocessThirdPartyEvents = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Reprocess third party events success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Reprocess third party events error'),\n });\n\n const reprocessThirdPartyEvents = ({ data }: ReprocessThirdPartyEventsParams) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate({ url: `${annotationApiUrls.THIRD_PARTY_EVENTS}`, data });\n };\n\n return { ...mutationRequest, reprocessThirdPartyEvents };\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { AccordionActions, AccordionDetails } from '@mui/material';\nimport { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { useReprocessThirdPartyEvents } from '../../../../api/operations/use-reprocess-third-party-events';\nimport { reprocessThirdPartyEventsFormSchema } from '../../utils/form-fields-validation';\nimport {\n ReprocessThirdPartyEventsForm,\n ReprocessThirdPartyEventsFormSchema,\n} from '../../utils/form-fields-validation/types';\nimport { AnnotationFormActions } from '../annotation-form-actions';\nimport { RecordingIdField } from '../form-fields/recording-id-field';\n\nexport const ReprocessThirdPartyEvents = () => {\n const { reprocessThirdPartyEvents } = useReprocessThirdPartyEvents();\n\n const {\n register,\n formState: { errors },\n reset,\n handleSubmit: handleFormSubmit,\n } = useForm<ReprocessThirdPartyEventsFormSchema>({\n resolver: zodResolver(reprocessThirdPartyEventsFormSchema),\n });\n\n const handleSubmit = useCallback(\n (data: ReprocessThirdPartyEventsForm) => {\n reprocessThirdPartyEvents({ data });\n },\n [reprocessThirdPartyEvents],\n );\n\n return (\n <form onSubmit={handleFormSubmit(handleSubmit)}>\n <AccordionDetails>\n <RecordingIdField errors={errors} register={register} />\n </AccordionDetails>\n <AccordionActions>\n <AnnotationFormActions reset={() => reset()} />\n </AccordionActions>\n </form>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { getQueryParams } from '../../../utils/get-query-params';\nimport { annotationApiUrls } from '../../routes';\nimport { ValidateTaskApiParams } from '../../types';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\n\ninterface ValidateTaskParams {\n data: ValidateTaskApiParams;\n}\n\nexport const useValidateTask = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Validation task success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Validation task error'),\n });\n\n const validateTask = ({ data }: ValidateTaskParams) => {\n const queryParams = getQueryParams<ValidateTaskApiParams>(data);\n if (!queryParams) return;\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate({ url: `${annotationApiUrls.VALIDATE_TASK}?${queryParams}` });\n };\n\n return { ...mutationRequest, validateTask };\n};\n","import { FormSwitchField } from 'shared/components/form/form-switch-field';\n\nimport { AnnotationFormLabels } from '../../../utils/form-fields-validation';\nimport { AnnotationFormFieldsNames } from '../../../utils/form-fields-validation/types';\nimport { FormFieldProps } from '../types';\n\nexport const DryRunField = ({ register }: FormFieldProps) => {\n return (\n <FormSwitchField\n id={AnnotationFormFieldsNames.DRY_RUN}\n label={AnnotationFormLabels[AnnotationFormFieldsNames.DRY_RUN]}\n {...register(AnnotationFormFieldsNames.DRY_RUN)}\n />\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { AccordionActions, AccordionDetails } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { useValidateTask } from '../../../../api/operations/use-validate-task';\nimport { validationTaskFormSchema } from '../../utils/form-fields-validation';\nimport { ValidateTaskForm, ValidationTaskFormSchema } from '../../utils/form-fields-validation/types';\nimport { AnnotationFormActions } from '../annotation-form-actions';\nimport { AnnotationToolField } from '../form-fields/annotation-tool-field';\nimport { DryRunField } from '../form-fields/dry-run-field';\nimport { PipelineTypeField } from '../form-fields/pipeline-type-field';\nimport { RecordingIdField } from '../form-fields/recording-id-field';\n\nexport const ValidateTask = () => {\n const { validateTask } = useValidateTask();\n\n const {\n register,\n formState: { errors },\n reset,\n handleSubmit: handleFormSubmit,\n } = useForm<ValidationTaskFormSchema>({\n resolver: zodResolver(validationTaskFormSchema),\n });\n\n const handleSubmit = useCallback(\n (data: ValidateTaskForm) => {\n validateTask({ data });\n },\n [validateTask],\n );\n\n return (\n <form onSubmit={handleFormSubmit(handleSubmit)}>\n <AccordionDetails>\n <RecordingIdField errors={errors} register={register} />\n <PipelineTypeField errors={errors} register={register} />\n <AnnotationToolField errors={errors} register={register} />\n <DryRunField register={register} />\n </AccordionDetails>\n <AccordionActions>\n <AnnotationFormActions reset={() => reset()} />\n </AccordionActions>\n </form>\n );\n};\n","import { Accordion, AccordionSummary } from '@mui/material';\n\nimport IconChevronDown from 'shared/components/icons/icon-chevron-down';\n\nimport { AnnotationsTask } from './components/annotations-task';\nimport { CreateTask } from './components/create-task';\nimport { DeleteEpisodeOverlays } from './components/delete-episode-overlays';\nimport { DeleteTask } from './components/delete-task';\nimport { LabelsTask } from './components/labels-task';\nimport { ProcessEpisode } from './components/process-episode';\nimport { ReprocessSync } from './components/reprocess-sync';\nimport { ReprocessThirdPartyEvents } from './components/reprocess-third-party-events';\nimport { ValidateTask } from './components/validate-task';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\n\nexport const Annotation = () => {\n return (\n <BackofficeContentContainer>\n <Accordion>\n <AccordionSummary expandIcon={<IconChevronDown size='small' />}>Create task</AccordionSummary>\n <CreateTask />\n </Accordion>\n <Accordion>\n <AccordionSummary expandIcon={<IconChevronDown size='small' />}>Delete task</AccordionSummary>\n <DeleteTask />\n </Accordion>\n <Accordion>\n <AccordionSummary expandIcon={<IconChevronDown size='small' />}>Validate Recording</AccordionSummary>\n <ValidateTask />\n </Accordion>\n <Accordion>\n <AccordionSummary expandIcon={<IconChevronDown size='small' />}>Load annotations</AccordionSummary>\n <AnnotationsTask />\n </Accordion>\n <Accordion>\n <AccordionSummary expandIcon={<IconChevronDown size='small' />}>Update Labels</AccordionSummary>\n <LabelsTask />\n </Accordion>\n <Accordion>\n <AccordionSummary expandIcon={<IconChevronDown size='small' />}>Process Episode</AccordionSummary>\n <ProcessEpisode />\n </Accordion>\n <Accordion>\n <AccordionSummary expandIcon={<IconChevronDown size='small' />}>Delete Episode Overlays</AccordionSummary>\n <DeleteEpisodeOverlays />\n </Accordion>\n <Accordion>\n <AccordionSummary expandIcon={<IconChevronDown size='small' />}>\n Reprocess Third Party Tracking Sync\n </AccordionSummary>\n <ReprocessSync />\n </Accordion>\n <Accordion>\n <AccordionSummary expandIcon={<IconChevronDown size='small' />}>Reprocess Third Party Events</AccordionSummary>\n <ReprocessThirdPartyEvents />\n </Accordion>\n </BackofficeContentContainer>\n );\n};\n","import { SeasonClients } from 'shared/types/user/types';\nimport { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { RecordingCompetitionsApiResponse, SeasonClient, SeasonClientsApiResponse } from './types';\nimport { InfinityQueryDataResult } from '../../../../api/hooks/useInfinityQuery/types';\n\nexport const transformSeasonClients = (seasonClient: SeasonClient): SeasonClients => ({\n id: seasonClient.uuid,\n originalClient: seasonClient.original_client,\n seasonName: seasonClient.season_name,\n clients: seasonClient.clients,\n updatedAt: new Date(seasonClient.updated_at),\n});\n\nexport const transformSeasonClientsList = (\n response: SeasonClientsApiResponse,\n): InfinityQueryDataResult<SeasonClients> => {\n return {\n data: {\n items: response.data.map(transformSeasonClients),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n\nexport const transformRecordingCompetitions = (\n response: RecordingCompetitionsApiResponse,\n): InfinityQueryDataResult<string> => {\n return {\n data: {\n items: response.content.map((recordingCompetition) => recordingCompetition.name),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n","import { useQueryClient } from '@tanstack/react-query';\n\nimport { SortDirection } from 'shared/types/filters/types';\nimport { SeasonClients } from 'shared/types/user/types';\n\nimport { useInfinityQuery } from '../../../../../api/hooks/useInfinityQuery';\nimport { InfinityQueryResult } from '../../../../../api/hooks/useInfinityQuery/types';\nimport { getSeasonClientsUrl } from '../../routes';\nimport { transformSeasonClientsList } from '../transformer';\nimport { SeasonClientsApiResponse } from '../types';\n\nconst PAGE_SIZE = 10;\nconst QUERY_KEY = 'competition-clients';\n\nexport const useSeasonClients = (): InfinityQueryResult<SeasonClients, never> => {\n return useInfinityQuery<SeasonClients, never, SeasonClientsApiResponse>({\n generateUrl: getSeasonClientsUrl,\n key: QUERY_KEY,\n options: {\n size: PAGE_SIZE,\n sort: '',\n sortDirection: SortDirection.ASC,\n },\n transformer: transformSeasonClientsList,\n });\n};\n\nexport const useInvalidateSeasonClients = () => {\n const queryClient = useQueryClient();\n\n return () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });\n};\n","import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';\nimport React from 'react';\n\nimport styles from './ConfirmDialog.module.scss';\n\nexport type ConfirmDialogTypes = 'warning' | 'primary' | 'error';\n\ninterface Props {\n title?: string;\n cancelLabel: string;\n confirmLabel: string;\n description?: string;\n onCancel?: () => void;\n onConfirm: () => void;\n isOpen: boolean;\n type?: ConfirmDialogTypes;\n setIsOpen: (isOpen: boolean) => void;\n}\n\nconst getButtonTypeFromConfirmDialogType = (type: ConfirmDialogTypes) => {\n const buttonTypesMapping = {\n warning: 'warning',\n error: 'error',\n primary: 'primary',\n } as const;\n\n return buttonTypesMapping[type];\n};\n\nconst ConfirmDialog = ({\n title,\n cancelLabel = 'Cancel',\n confirmLabel = 'Confirm',\n description,\n onCancel,\n onConfirm,\n isOpen,\n type = 'primary',\n setIsOpen,\n}: Props) => {\n const handleCancel = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n if (onCancel) onCancel();\n setIsOpen(false);\n };\n\n const handleConfirm = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n onConfirm();\n setIsOpen(false);\n };\n\n return (\n <Dialog\n open={isOpen}\n onClose={handleCancel}\n aria-labelledby='confirm-dialog-title'\n aria-describedby='confirm-dialog-description'\n >\n <div className={styles.dialog}>\n {title && <DialogTitle id='confirm-dialog-title'>{title}</DialogTitle>}\n {description && (\n <DialogContent>\n <DialogContentText className={styles.description} id='confirm-dialog-description'>\n {description}\n </DialogContentText>\n </DialogContent>\n )}\n <DialogActions className={styles.dialogActions}>\n <Button variant='outlined' color='secondary' onClick={handleCancel}>\n {cancelLabel}\n </Button>\n <Button variant='contained' onClick={handleConfirm} color={getButtonTypeFromConfirmDialogType(type)}>\n {confirmLabel}\n </Button>\n </DialogActions>\n </div>\n </Dialog>\n );\n};\n\nexport default ConfirmDialog;\n","import { ListItem, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const SeasonClientsListItem = styled(ListItem)(({ theme }) => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '1fr 1fr 1fr auto',\n borderBottom: `1px solid ${Colors.iron}`,\n padding: `${theme.spacing(1, 2, 1, 3)} !important`,\n}));\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useInvalidateSeasonClients } from '../use-season-clients';\n\ninterface DeleteSeasonClientsApiParams {\n id: string;\n onSuccess?: () => void;\n}\n\nexport const useDeleteSeasonClients = () => {\n const invalidateSeasonClients = useInvalidateSeasonClients();\n const mutationRequest = useMutationRequest({\n type: HTTPMethod.DELETE,\n successMessage: 'Association season clients deleted',\n errorMessage: 'Association season clients delete error',\n onSuccess: invalidateSeasonClients,\n });\n\n const deleteSeasonClients = ({ id, onSuccess }: DeleteSeasonClientsApiParams) => {\n mutationRequest.mutate({ url: `${annotationApiUrls.SEASON_CLIENTS}/${id}` }, { onSuccess });\n };\n\n return { ...mutationRequest, deleteSeasonClients };\n};\n","import { TypeOf } from 'zod';\n\nimport { Client } from 'shared/types/user/types';\n\nimport { seasonClientsFormSchema } from './form';\nimport { Season } from '../../../../types/seasons';\n\nexport enum SeasonClientsFormFieldsNames {\n id = 'id',\n originalClient = 'originalClient',\n season = 'season',\n clientIds = 'clientIds',\n seasonName = 'seasonName',\n}\n\nexport interface SeasonClientsForm {\n [SeasonClientsFormFieldsNames.id]?: string;\n [SeasonClientsFormFieldsNames.originalClient]: Client;\n [SeasonClientsFormFieldsNames.seasonName]?: string;\n [SeasonClientsFormFieldsNames.season]?: Season;\n [SeasonClientsFormFieldsNames.clientIds]: string[];\n}\n\nexport type SeasonClientsFormSchema = TypeOf<typeof seasonClientsFormSchema>;\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { CreateSeasonClientsApiParams } from './types';\nimport { annotationApiUrls } from '../../routes';\nimport { useInvalidateSeasonClients } from '../use-season-clients';\n\ninterface RequestData {\n data: CreateSeasonClientsApiParams;\n onSuccess?: () => void;\n}\n\nexport const useCreateSeasonClients = () => {\n const invalidateSeasonClients = useInvalidateSeasonClients();\n const mutationRequest = useMutationRequest({\n type: HTTPMethod.POST,\n successMessage: 'Association season clients created',\n errorMessage: 'Association season clients create error',\n onSuccess: invalidateSeasonClients,\n });\n\n const create = ({ data, onSuccess }: RequestData) => {\n mutationRequest.mutate(\n {\n url: annotationApiUrls.SEASON_CLIENTS,\n data: {\n original_client_id: data.originalClientId,\n season_uuid: data.seasonId,\n client_ids: data.clientIds,\n },\n },\n { onSuccess },\n );\n };\n\n return { ...mutationRequest, create };\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useInvalidateSeasonClients } from '../use-season-clients';\n\ninterface RequestData {\n data: { client_ids: string[] };\n id: string;\n onSuccess?: () => void;\n}\n\nexport const useUpdateSeasonClients = () => {\n const invalidateSeasonClients = useInvalidateSeasonClients();\n const mutationRequest = useMutationRequest({\n type: HTTPMethod.PATCH,\n successMessage: 'Association competition clients updated',\n errorMessage: 'Association competition clients update error',\n onSuccess: invalidateSeasonClients,\n });\n\n const update = ({ data, id, onSuccess }: RequestData) => {\n mutationRequest.mutate({ url: `${annotationApiUrls.SEASON_CLIENTS}/${id}`, data }, { onSuccess });\n };\n\n return { ...mutationRequest, update };\n};\n","import { useCallback } from 'react';\n\nimport { Season } from '../../../../../types/seasons';\n\nexport const useOnChangeSeasonSelection = (\n onChange: (season: Season) => void,\n setAutocompleteValue: (season: Season) => void,\n) => {\n return useCallback(\n (results: Season[], selectedSeason?: Season) => {\n const updatedSelectedSeason = results.find((s) => s.id === selectedSeason?.id);\n if (updatedSelectedSeason) {\n onChange(updatedSelectedSeason);\n setAutocompleteValue(updatedSelectedSeason);\n }\n },\n [onChange, setAutocompleteValue],\n );\n};\n","import { InfinityQueryDataResult } from 'api/hooks/useInfinityQuery/types';\nimport { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { StagesApiResponse } from './types';\nimport { Stage, StageSummary } from '../../../types/stages';\nimport { StageApi, StageSummaryApi } from '../types';\n\nexport const transformStageSummaries = (items: StageSummaryApi[]): StageSummary[] => {\n return items.map((item) => ({\n id: item.uuid,\n name: item.name,\n orderIndex: item.order_index,\n ...(item.parent_stage\n ? {\n parentStage: {\n name: item.parent_stage.name,\n orderIndex: item.parent_stage.order_index,\n id: item.parent_stage.uuid,\n },\n }\n : {}),\n childStages: item.child_stages.map((childStage) => ({\n name: childStage.name,\n orderIndex: childStage.order_index,\n id: childStage.uuid,\n })),\n }));\n};\n\nexport const transformStages = (items: StageApi[]): Stage[] => {\n return items.map((item) => ({\n id: item.uuid,\n name: item.name,\n orderIndex: item.order_index,\n season: {\n year: item.season.year,\n crossesYear: item.season.crosses_year,\n id: item.season.uuid,\n },\n childStages: item.child_stages.map((childStage) => ({\n name: childStage.name,\n orderIndex: childStage.order_index,\n id: childStage.uuid,\n })),\n parentStage: item.parent_stage\n ? {\n name: item.parent_stage.name,\n orderIndex: item.parent_stage.order_index,\n id: item.parent_stage.uuid,\n }\n : undefined,\n }));\n};\n\nexport const transformStagesResponse = (response: StagesApiResponse): InfinityQueryDataResult<Stage> => {\n return {\n data: {\n items: transformStages(response.data),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n","import { InfinityQueryDataResult } from 'api/hooks/useInfinityQuery/types';\nimport { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { SeasonApi } from './types';\nimport { SeasonsApiResponse } from './use-seasons/types';\nimport { Season } from '../../types/seasons';\nimport { transformStageSummaries } from '../stages/use-stages/transformer';\n\nexport const transformSeason = (item: SeasonApi): Season => ({\n id: item.uuid,\n year: item.year,\n crossesYear: item.crosses_year,\n competition: {\n id: item.competition.uuid,\n name: item.competition.name,\n country: item.competition.country,\n },\n stages: transformStageSummaries(item.stages),\n});\n\nexport const transformSeasons = (response: SeasonsApiResponse): InfinityQueryDataResult<Season> => {\n return {\n data: {\n items: response.data.map(transformSeason),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n","import { useQueryClient } from '@tanstack/react-query';\n\nimport { useInfinityQuery } from 'api/hooks/useInfinityQuery';\nimport { InfinityQueryResult } from 'api/hooks/useInfinityQuery/types';\nimport { SortDirection } from 'shared/types/filters/types';\n\nimport { SeasonsApiFilters, SeasonsApiResponse } from './types';\nimport { Season } from '../../../types/seasons';\nimport { getSeasonsUrl } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { transformSeasons } from '../transformers';\n\nconst QUERY_KEY = 'seasons';\n\nexport const useSeasons = (): InfinityQueryResult<Season, SeasonsApiFilters> => {\n const { isAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n\n return useInfinityQuery<Season, SeasonsApiFilters, SeasonsApiResponse>({\n generateUrl: getSeasonsUrl,\n key: QUERY_KEY,\n options: {\n size: 10,\n sort: 'name',\n sortDirection: SortDirection.DESC,\n },\n transformer: transformSeasons,\n queryOptions: {\n enabled: isAllowedBackofficeOrigin,\n },\n });\n};\n\nexport const useInvalidateSeasons = () => {\n const queryClient = useQueryClient();\n\n return () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });\n};\n","import { Box, ListItem } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React from 'react';\n\nexport const RenderSelectOption = (props: React.ComponentProps<typeof ListItem> & { name: string }) => {\n return (\n <ListItem {...props} sx={{ '&:hover': { background: Colors.background } }}>\n <Box px={1} py={0.5}>\n {props.name}\n </Box>\n </ListItem>\n );\n};\n","import { Season, SeasonSummary } from '../../types/seasons';\n\nexport const printSeasonName = (season: Season) => {\n if (season.competition) {\n return `${season.competition.name} ${season.year.toString()}${\n season.crossesYear ? `-${(season.year + 1).toString().slice(2)}` : ''\n } (${season.competition.country})`;\n }\n\n return ` ${season.year.toString()}${season.crossesYear ? `-${(season.year + 1).toString().slice(2)}` : ''}`;\n};\n\nexport const printSummarySeasonName = (season: SeasonSummary) => {\n return ` ${season.year.toString()}${season.crossesYear ? `-${(season.year + 1).toString().slice(2)}` : ''}`;\n};\n","import { Box, ClickAwayListener, ListItem, Stack } from '@mui/material';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { RecordingCompetitionsFilters } from 'pages/backoffice/api/season-clients/use-recording-competitions/types';\nimport { Autocomplete } from 'shared/components/autocomplete';\nimport { AutocompleteDropdownButton } from 'shared/components/autocomplete-multi-select/components/autocomplete-dropdown-button';\nimport {\n AutocompletePopper,\n AutocompletePopperContent,\n} from 'shared/components/autocomplete-multi-select/components/autocomplete-popper';\nimport { AutocompletePopperWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-popper-wrapper';\nimport { AutocompleteResultsWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-results-wrapper';\n\nimport { useOnChangeSeasonSelection } from './use-on-change-season-selection';\nimport { useSeasons } from '../../../../api/seasons/use-seasons';\nimport { RenderSelectOption } from '../../../../components/select-components/render-option';\nimport { Season } from '../../../../types/seasons';\nimport { printSeasonName } from '../../../../utils/print-season-name';\n\nconst INITIAL_RECORDING_SEASONS_FILTERS: RecordingCompetitionsFilters = {\n name: '',\n};\n\ninterface Props {\n setSeasonOnChange: (season: Season | undefined) => void;\n season?: Season;\n}\n\nconst AUTOCOMPLETE_WIDTH = 400;\n\nexport const SelectSeason = ({ setSeasonOnChange, season }: Props) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [autocompleteValue, setAutocompleteValue] = useState<Season | undefined>(season);\n const { items: results, isLoading, setFilters, fetchNextPage } = useSeasons();\n const handleOnChangeSelection = useOnChangeSeasonSelection(setSeasonOnChange, setAutocompleteValue);\n const { t } = useTranslation();\n\n useEffect(() => {\n handleOnChangeSelection(results, autocompleteValue);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results, autocompleteValue]);\n\n const isOpen = Boolean(anchorEl);\n\n const handleOpen = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setAutocompleteValue(season || undefined);\n setAnchorEl(event.currentTarget);\n },\n [season],\n );\n\n const handleClose = useCallback(() => {\n setFilters(INITIAL_RECORDING_SEASONS_FILTERS);\n setAnchorEl(null);\n }, [setFilters]);\n\n const handleDropdownClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n isOpen ? handleClose() : handleOpen(event);\n },\n [isOpen, handleClose, handleOpen],\n );\n\n const handleSelectSeason = useCallback(() => {\n setAutocompleteValue((autocompleteValue) => {\n return autocompleteValue;\n });\n handleClose();\n }, [setAutocompleteValue, handleClose]);\n\n const handleSetName = useCallback(\n (name: string) => {\n setFilters({ name: name });\n },\n [setFilters],\n );\n\n const renderOption = useCallback((props: React.ComponentProps<typeof ListItem>, option: Season) => {\n return <RenderSelectOption {...props} key={option.id} name={printSeasonName(option)} />;\n }, []);\n\n const handleApply = useCallback(() => {\n setAutocompleteValue((autocompleteValue) => {\n return autocompleteValue;\n });\n handleClose();\n }, [setAutocompleteValue, handleClose]);\n\n const handleReset = useCallback(() => {\n setAutocompleteValue(undefined);\n }, [setAutocompleteValue]);\n\n const paperComponent: React.JSXElementConstructor<React.HTMLAttributes<HTMLElement>> = useCallback(\n (props) => (\n <AutocompleteResultsWrapper {...props} onReset={handleReset} onApply={handleApply}>\n {props.children}\n </AutocompleteResultsWrapper>\n ),\n [handleReset, handleApply],\n );\n\n const handleUpdateValue = useCallback(\n (item: Season | null) => {\n if (item === null) return;\n setAutocompleteValue(item);\n setSeasonOnChange(item);\n handleClose();\n },\n [setAutocompleteValue, setSeasonOnChange, handleClose],\n );\n\n return (\n <Stack direction={'column'} spacing={1}>\n <AutocompleteDropdownButton\n fullWidth\n isOpen={isOpen}\n onClick={handleDropdownClick}\n isSelected={Boolean(season)}\n label={season ? printSeasonName(season) : 'Select season'}\n />\n <Box>\n {anchorEl && (\n <ClickAwayListener onClickAway={handleSelectSeason}>\n <AutocompletePopper anchorEl={anchorEl} open={isOpen} placement='bottom-start'>\n <AutocompletePopperContent elevation={8}>\n <Autocomplete\n autoFocus\n PaperComponent={paperComponent}\n PopperComponent={AutocompletePopperWrapper}\n fetchNextPage={fetchNextPage}\n getItemLabel={(item) => printSeasonName(item)}\n inputWidth={AUTOCOMPLETE_WIDTH}\n isLoading={isLoading}\n isOptionEqualToValue={(option: Season, value: Season) => option.id === value?.id}\n listWidth={AUTOCOMPLETE_WIDTH}\n multiple={false}\n onChange={handleSetName}\n open\n options={results}\n renderOption={renderOption}\n placeholder={t('common:actions.search')}\n resultsHeight={260}\n updateValue={handleUpdateValue}\n value={autocompleteValue}\n />\n </AutocompletePopperContent>\n </AutocompletePopper>\n </ClickAwayListener>\n )}\n </Box>\n </Stack>\n );\n};\n","import { Box } from '@mui/material';\nimport React from 'react';\n\ninterface Props {\n open: boolean;\n children: React.ReactNode;\n}\n\nexport const SearchResults = ({ open, children }: Props) => {\n if (!open) return null;\n\n return <Box>{children}</Box>;\n};\n","import { Box, ClickAwayListener, ListItem, Stack, Typography } from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { INITIAL_CLIENTS_FILTERS, useClients } from 'api/backoffice/client/hooks/use-clients/useClients';\nimport { Autocomplete } from 'shared/components/autocomplete';\nimport { AutocompleteDropdownButton } from 'shared/components/autocomplete-multi-select/components/autocomplete-dropdown-button';\nimport {\n AutocompletePopper,\n AutocompletePopperContent,\n} from 'shared/components/autocomplete-multi-select/components/autocomplete-popper';\nimport { AutocompletePopperWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-popper-wrapper';\nimport { Client } from 'shared/types/user/types';\n\nimport { SearchResults } from '../search-results';\n\ninterface Props {\n setClientOnChange: (client: Client | undefined) => void;\n client: Client;\n disabled?: boolean;\n}\n\nconst AUTOCOMPLETE_WIDTH = 400;\n\nexport const SelectClient = ({ client, setClientOnChange, disabled = false }: Props) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [autocompleteValue, setAutocompleteValue] = useState<Client | undefined>();\n const { items: clientsResults, isLoading, setFilters, fetchNextPage } = useClients();\n const { t } = useTranslation();\n\n const isOpen = Boolean(anchorEl);\n\n const open = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setAutocompleteValue(client);\n setAnchorEl(event.currentTarget);\n },\n [client],\n );\n\n const close = useCallback(() => {\n setFilters(INITIAL_CLIENTS_FILTERS);\n setAnchorEl(null);\n }, [setFilters]);\n\n const handleDropdownClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n isOpen ? close() : open(event);\n },\n [isOpen, close, open],\n );\n\n const handleSelectClient = useCallback(() => {\n setAutocompleteValue((autocompleteValue) => {\n setClientOnChange(autocompleteValue);\n return autocompleteValue;\n });\n close();\n }, [close, setClientOnChange]);\n\n const handleSetName = useCallback(\n (name: string) => {\n setFilters({ name: name });\n },\n [setFilters],\n );\n\n const renderOption = useCallback((props: React.ComponentProps<typeof ListItem>, option: Client) => {\n return (\n <ListItem {...props} key={option.id}>\n <Box px={1} py={0.5}>\n {option.name}\n </Box>\n </ListItem>\n );\n }, []);\n\n const paperComponent = useCallback(\n (props: any) => (\n <SearchResults {...props} open={isOpen}>\n {props.children}\n </SearchResults>\n ),\n [isOpen],\n );\n\n const handleUpdateValue = useCallback(\n (item: Client | null) => {\n if (item === null) return;\n setAutocompleteValue(item);\n setClientOnChange(item);\n close();\n },\n [setAutocompleteValue, setClientOnChange, close],\n );\n\n const isOptionEqual = useCallback((option: Client, value: Client) => option.id === value.id, []);\n const getOptionName = useCallback((option: Client) => option.name, []);\n\n return (\n <Stack direction={'column'} spacing={1}>\n <Typography variant={'body1'}>Select original client</Typography>\n <Box>\n <AutocompleteDropdownButton\n isOpen={isOpen}\n onClick={handleDropdownClick}\n isSelected={Boolean(client)}\n label={client ? client.name : 'Select client'}\n disabled={disabled}\n />\n {anchorEl && (\n <ClickAwayListener onClickAway={handleSelectClient}>\n <AutocompletePopper anchorEl={anchorEl} open={isOpen} placement='bottom-start'>\n <AutocompletePopperContent elevation={8}>\n <Autocomplete\n autoFocus\n PaperComponent={paperComponent}\n PopperComponent={AutocompletePopperWrapper}\n fetchNextPage={fetchNextPage}\n getItemLabel={getOptionName}\n inputWidth={AUTOCOMPLETE_WIDTH}\n isLoading={isLoading}\n isOptionEqualToValue={isOptionEqual}\n listWidth={AUTOCOMPLETE_WIDTH}\n multiple={false}\n onChange={handleSetName}\n open\n options={clientsResults}\n renderOption={renderOption}\n placeholder={t('common:actions.search')}\n resultsHeight={260}\n updateValue={handleUpdateValue}\n value={autocompleteValue}\n />\n </AutocompletePopperContent>\n </AutocompletePopper>\n </ClickAwayListener>\n )}\n </Box>\n </Stack>\n );\n};\n","import { Stack, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React from 'react';\nimport { Control, Controller, Path } from 'react-hook-form';\n\nimport { AutocompleteDropdownButton } from 'shared/components/autocomplete-multi-select/components/autocomplete-dropdown-button';\n\nimport { SeasonClientsFormFieldsNames } from './types';\nimport { SelectClients } from '../../../../components/select-clients';\nimport { SelectSeason } from '../../../stages/components/select-season';\nimport { SelectClient } from '../select-client';\n\ninterface Props<TFormValues extends Record<string, any>> {\n control: Control<TFormValues>;\n isEdit?: boolean;\n seasonName?: string;\n}\n\nexport function SeasonClientsFormComponent<TFormValues extends Record<string, any>>({\n control,\n seasonName,\n isEdit = false,\n}: Props<TFormValues>) {\n return (\n <Stack direction='column' spacing={2}>\n <Controller\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <SelectClient setClientOnChange={onChange} client={value} disabled={isEdit} />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </>\n )}\n name={SeasonClientsFormFieldsNames.originalClient as Path<TFormValues>}\n control={control}\n />\n {!isEdit ? (\n <Controller\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <SelectSeason setSeasonOnChange={onChange} season={value} />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </>\n )}\n name={SeasonClientsFormFieldsNames.season as Path<TFormValues>}\n control={control}\n />\n ) : (\n <AutocompleteDropdownButton\n fullWidth\n isOpen={false}\n isSelected={Boolean(seasonName)}\n disabled\n label={seasonName ? seasonName : 'Select season'}\n />\n )}\n <Controller\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <SelectClients onChange={onChange} clientIds={value || []} />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </>\n )}\n name={SeasonClientsFormFieldsNames.clientIds as Path<TFormValues>}\n control={control}\n />\n </Stack>\n );\n}\n","import { array, boolean, number, object, string, TypeOf } from 'zod';\n\nexport const SeasonSummarySchema = object({\n id: string(),\n year: number(),\n crossesYear: boolean(),\n});\nconst CompetitionSchema = object({\n id: string(),\n name: string(),\n country: string(),\n});\nexport const StageMiniSummarySchema = object({\n name: string(),\n orderIndex: number(),\n id: string(),\n});\nexport const StageSummarySchema = object({\n name: string(),\n orderIndex: number(),\n id: string(),\n parentStage: StageMiniSummarySchema.optional(),\n childStages: array(StageMiniSummarySchema).optional(),\n});\nexport const SeasonSchema = object({\n id: string(),\n year: number(),\n crossesYear: boolean(),\n competition: CompetitionSchema.optional(),\n stages: array(StageSummarySchema).optional(),\n});\nexport type Season = TypeOf<typeof SeasonSchema>;\nexport type SeasonSummary = TypeOf<typeof SeasonSummarySchema>;\n","import { z } from 'zod';\n\nimport { clientSchema } from 'shared/types/user/types';\n\nimport { SeasonClientsFormFieldsNames } from './types';\nimport { SeasonSchema } from '../../../../types/seasons';\n\nexport const seasonClientsFormSchema = z.object({\n [SeasonClientsFormFieldsNames.id]: z.string().optional(),\n [SeasonClientsFormFieldsNames.seasonName]: z.string().optional(),\n [SeasonClientsFormFieldsNames.originalClient]: clientSchema,\n [SeasonClientsFormFieldsNames.season]: SeasonSchema,\n [SeasonClientsFormFieldsNames.clientIds]: z.array(z.string()).min(1),\n});\n\nexport const seasonClientsUpdateFormSchema = seasonClientsFormSchema.extend({\n [SeasonClientsFormFieldsNames.season]: SeasonSchema.optional(),\n});\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { IconUser } from 'shared/components/icons/icon-user';\n\nimport { useCreateSeasonClients } from '../../../../api/season-clients/use-create-season-clients';\nimport { useUpdateSeasonClients } from '../../../../api/season-clients/use-update-season-clients';\nimport { SeasonClientsFormComponent } from '../season-clients-form';\nimport { seasonClientsFormSchema, seasonClientsUpdateFormSchema } from '../season-clients-form/form';\nimport { SeasonClientsForm, SeasonClientsFormFieldsNames, SeasonClientsFormSchema } from '../season-clients-form/types';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n defaultValues?: SeasonClientsForm;\n}\n\nconst seasonClientsFormId = 'competition-clients-form';\nconst EMPTY_VALUES = {\n [SeasonClientsFormFieldsNames.id]: '',\n [SeasonClientsFormFieldsNames.originalClient]: undefined,\n [SeasonClientsFormFieldsNames.season]: undefined,\n [SeasonClientsFormFieldsNames.clientIds]: [],\n};\n\nexport const SeasonClientsModal = ({ open, onClose, defaultValues }: Props) => {\n const formRef = useRef<HTMLFormElement>(null);\n const { handleSubmit, reset, control } = useForm<SeasonClientsFormSchema>({\n resolver: zodResolver(defaultValues ? seasonClientsUpdateFormSchema : seasonClientsFormSchema),\n defaultValues: defaultValues || EMPTY_VALUES,\n });\n\n const { create } = useCreateSeasonClients();\n const { update } = useUpdateSeasonClients();\n\n const handleClose = useCallback(() => {\n onClose();\n reset();\n }, [onClose, reset]);\n\n const handleCreate = useCallback(\n (data: SeasonClientsForm) => {\n const { originalClient, season, clientIds } = data;\n if (!season) return;\n\n create({\n data: {\n originalClientId: originalClient.id,\n seasonId: season.id,\n clientIds,\n },\n onSuccess: () => {\n handleClose();\n },\n });\n },\n [create, handleClose],\n );\n\n const handleUpdate = useCallback(\n (data: SeasonClientsForm) => {\n if (!data?.id) return;\n const { id, clientIds } = data;\n update({\n data: { client_ids: clientIds },\n id,\n onSuccess: () => {\n handleClose();\n },\n });\n },\n [handleClose, update],\n );\n\n const handleCreateOrUpdate = useCallback(\n (data: SeasonClientsForm) => {\n if (defaultValues) {\n handleUpdate(data);\n } else {\n handleCreate(data);\n }\n },\n [defaultValues, handleCreate, handleUpdate],\n );\n\n return (\n <DialogNew\n maxWidth='sm'\n fullWidth\n title={defaultValues ? 'Edit association' : 'New association'}\n icon={<IconUser size='small' />}\n onCancel={handleClose}\n onClose={handleClose}\n buttonSubmitText={defaultValues ? 'Save' : 'Create'}\n open={open}\n buttonFormId={seasonClientsFormId}\n >\n <form id={seasonClientsFormId} ref={formRef} onSubmit={handleSubmit(handleCreateOrUpdate)}>\n <SeasonClientsFormComponent<SeasonClientsFormSchema>\n control={control}\n isEdit={!!defaultValues}\n seasonName={defaultValues?.seasonName}\n />\n </form>\n </DialogNew>\n );\n};\n","import { Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\n\nimport ConfirmDialog from 'shared/components/confirm-dialog';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport { SeasonClients } from 'shared/types/user/types';\n\nimport { SeasonClientsListItem } from './styled';\nimport { useDeleteSeasonClients } from '../../../../api/season-clients/use-delete-season-clients';\nimport { SeasonClientsFormFieldsNames } from '../season-clients-form/types';\nimport { SeasonClientsModal } from '../season-clients-modal';\n\ninterface Props {\n seasonClients: SeasonClients;\n}\n\nexport const SeasonClientsItem = ({ seasonClients }: Props) => {\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [isConfirmDeleteDialogOpen, setIsConfirmDeleteDialogOpen] = useState(false);\n const { deleteSeasonClients } = useDeleteSeasonClients();\n\n const handleEditModalOpen = () => setIsEditModalOpen(true);\n const handleEditModalClose = () => setIsEditModalOpen(false);\n\n const handleDeleteSeasonClients = useCallback(() => {\n deleteSeasonClients({ id: seasonClients.id });\n }, [seasonClients.id, deleteSeasonClients]);\n\n const options: MenuListOption[] = [\n {\n displayText: 'Edit',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: handleEditModalOpen,\n },\n {\n displayText: 'Delete',\n icon: <IconDelete size='small' color='secondary' />,\n onClick: () => setIsConfirmDeleteDialogOpen(true),\n },\n ];\n\n const defaultValues = {\n [SeasonClientsFormFieldsNames.id]: seasonClients.id,\n [SeasonClientsFormFieldsNames.originalClient]: seasonClients.originalClient,\n [SeasonClientsFormFieldsNames.season]: undefined,\n [SeasonClientsFormFieldsNames.clientIds]: seasonClients.clients.map((client) => client.id),\n [SeasonClientsFormFieldsNames.seasonName]: seasonClients.seasonName,\n };\n\n return (\n <>\n <SeasonClientsListItem key={seasonClients.id}>\n <Typography fontWeight={fontWeight['500']}>{seasonClients.originalClient.name}</Typography>\n <Typography>{seasonClients.seasonName}</Typography>\n <Typography>{seasonClients.clients.map((client) => client.name).join(', ')}</Typography>\n <KebabMenu options={options} />\n </SeasonClientsListItem>\n\n {isEditModalOpen ? (\n <SeasonClientsModal open={isEditModalOpen} onClose={handleEditModalClose} defaultValues={defaultValues} />\n ) : null}\n\n <ConfirmDialog\n type={'warning'}\n title={`You sure you want delete association from season \"${seasonClients.seasonName}\" and client \"${seasonClients.originalClient.name}\"?`}\n cancelLabel={'Cancel'}\n confirmLabel={'Delete'}\n onConfirm={handleDeleteSeasonClients}\n isOpen={isConfirmDeleteDialogOpen}\n setIsOpen={setIsConfirmDeleteDialogOpen}\n />\n </>\n );\n};\n","import { List } from '@mui/material';\n\nimport { SeasonClients } from 'shared/types/user/types';\n\nimport { SeasonClientsItem } from '../season-clients-item';\n\ninterface Props {\n seasonClientsList: SeasonClients[];\n}\n\nexport const SeasonClientsList = ({ seasonClientsList }: Props) => {\n const seasonClientsItems = seasonClientsList.map((seasonClients) => {\n return <SeasonClientsItem key={seasonClients.id} seasonClients={seasonClients} />;\n });\n\n return <List>{seasonClientsItems}</List>;\n};\n","import { Box, styled } from '@mui/material';\n\nexport const SeasonClientsListHeaderGrid = styled(Box)(() => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '1fr 1fr 1fr 32px',\n alignItems: 'center',\n}));\n","import { Skeleton, Stack } from '@mui/material';\n\nexport const ListSkeleton = () => {\n return (\n <Stack spacing={1} marginTop={2} marginBottom={2}>\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n </Stack>\n );\n};\n","import { Box, Button, Stack, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport { useCallback, useState } from 'react';\n\nimport { useSeasonClients } from 'pages/backoffice/api/season-clients/use-season-clients';\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport NotFound from 'shared/components/not-found';\nimport Pagination from 'shared/components/pagination';\n\nimport { SeasonClientsList } from './components/season-clients-list';\nimport { SeasonClientsModal } from './components/season-clients-modal';\nimport { SeasonClientsListHeaderGrid } from './styled';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { ListSkeleton } from '../../components/list-skeleton';\n\nexport const SeasonClients = () => {\n const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);\n const { items, page, fetchNextPage, isFetching } = useSeasonClients();\n\n const handleCreateModalOpen = useCallback(() => setIsCreateModalOpen(true), []);\n const handleCreateModalClose = useCallback(() => setIsCreateModalOpen(false), []);\n\n return (\n <BackofficeContentContainer>\n <Stack direction='row' alignItems='center' justifyContent='space-between' marginBottom={2}>\n <Typography variant='h4'>Associations season clients</Typography>\n <Button\n variant='contained'\n size='large'\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n onClick={handleCreateModalOpen}\n >\n New association season clients\n </Button>\n </Stack>\n <ListHeader>\n <SeasonClientsListHeaderGrid>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Original client\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Competition\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Clients\n </Typography>\n <div>&nbsp;</div>\n </SeasonClientsListHeaderGrid>\n </ListHeader>\n {!isFetching && items.length === 0 ? (\n <Box marginTop={4}>\n <NotFound header={'No results'} />\n </Box>\n ) : null}\n {isFetching ? <ListSkeleton /> : <SeasonClientsList seasonClientsList={items} />}\n {page ? (\n <Pagination\n total={page.totalElements}\n displayed={items.length}\n onShowMore={fetchNextPage}\n getStatsText={(displayed, total) => `${displayed} of ${total} venues`}\n />\n ) : null}\n <SeasonClientsModal open={isCreateModalOpen} onClose={handleCreateModalClose} />\n </BackofficeContentContainer>\n );\n};\n","import { InfinityQueryDataResult } from 'api/hooks/useInfinityQuery/types';\nimport { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { CoachesApiResponse } from './types';\nimport { Coach } from '../../../types/coaches';\nimport { CoachApi } from '../types';\n\nconst transformData = (items: CoachApi[]): Coach[] => {\n return items.map((item) => ({\n id: item.uuid,\n name: item.name,\n photoUrl: item.photo_url,\n }));\n};\n\nexport const transformCoaches = (response: CoachesApiResponse): InfinityQueryDataResult<Coach> => {\n return {\n data: {\n items: transformData(response.data),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n","import { useQueryClient } from '@tanstack/react-query';\n\nimport { useInfinityQuery } from 'api/hooks/useInfinityQuery';\nimport { InfinityQueryResult } from 'api/hooks/useInfinityQuery/types';\nimport { SortDirection } from 'shared/types/filters/types';\n\nimport { transformCoaches } from './transformer';\nimport { CoachesApiResponse, CoachesFilters } from './types';\nimport { Coach } from '../../../types/coaches';\nimport { getCoachesUrl } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\n\nconst QUERY_KEY = 'coaches';\n\nexport const useCoaches = (): InfinityQueryResult<Coach, CoachesFilters> => {\n const { isAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n\n return useInfinityQuery<Coach, CoachesFilters, CoachesApiResponse>({\n generateUrl: getCoachesUrl,\n key: QUERY_KEY,\n options: {\n size: 10,\n sort: 'name',\n sortDirection: SortDirection.DESC,\n },\n transformer: transformCoaches,\n queryOptions: {\n enabled: isAllowedBackofficeOrigin,\n },\n });\n};\n\nexport const useInvalidateCoaches = () => {\n const queryClient = useQueryClient();\n\n return () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { CoachApi } from '../types';\n\ntype CreateCoachParams = Pick<CoachApi, 'name'> & { image?: File };\n\ninterface CreateCoachData {\n data: CreateCoachParams;\n onSuccess?: () => void;\n}\n\nexport const useCreateCoach = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Coach created',\n errorMessage: (data) => metadataApiErrorParser(data, 'Coach creation error'),\n });\n\n const create = ({ data, onSuccess }: CreateCoachData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n const formData = new FormData();\n formData.append('coach', JSON.stringify({ name: data.name }));\n data.image && formData.append('coach_image', data.image);\n\n mutationRequest.mutate(\n {\n url: annotationApiUrls.COACHES,\n data: formData,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, create };\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { CoachApi } from '../types';\n\ntype UpdateCoachParams = Pick<CoachApi, 'name'> & { image?: File };\n\ninterface RequestData {\n data: UpdateCoachParams;\n id: string;\n onSuccess?: () => void;\n}\n\nexport const useUpdateCoach = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.PATCH,\n successMessage: 'Coach updated',\n errorMessage: (data) => metadataApiErrorParser(data, 'Coach update error'),\n });\n\n const update = ({ data, id, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n const formData = new FormData();\n formData.append('coach', JSON.stringify({ name: data.name }));\n data.image && formData.append('coach_image', data.image);\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.COACHES}/${id}`,\n data: formData,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, update };\n};\n","import { Box, FormLabel, Stack, styled } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\nimport { PropsWithChildren } from 'react';\n\nexport const Label = styled(FormLabel)(({ theme }) => ({\n marginBottom: theme.spacing(0.5),\n fontWeight: fontWeight['500'],\n fontSize: fontSizes.medium,\n lineHeight: fontSizes.medium,\n}));\n\nconst LabelOptional = styled(Box)(() => ({\n fontSize: fontSizes.xSmall,\n color: Colors.storm,\n lineHeight: fontSizes.medium,\n}));\ntype Props = {\n optional?: boolean;\n};\n\nexport const FormFormLabel = ({ children, optional = false }: PropsWithChildren<Props>) => {\n return (\n <Stack direction={'row'} gap={1} alignItems={'center'} sx={{ marginTop: 1, marginBottom: 0.5 }}>\n <Label>{children}</Label> {optional ? <LabelOptional>Optional</LabelOptional> : null}\n </Stack>\n );\n};\n","import { TypeOf } from 'zod';\n\nimport { coachFormSchema } from './form';\n\nexport enum CoachFormFieldsNames {\n id = 'id',\n name = 'name',\n coachImage = 'coach_image',\n}\n\nexport interface CoachForm {\n [CoachFormFieldsNames.id]?: string;\n [CoachFormFieldsNames.name]: string;\n [CoachFormFieldsNames.coachImage]?: FileList;\n}\n\nexport type CoachFormSchema = TypeOf<typeof coachFormSchema>;\n","import { FormControl, Input, TextField, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React from 'react';\nimport { Path, UseFormRegister, UseFormTrigger, UseFormWatch, FieldErrors } from 'react-hook-form';\n\nimport { FormFormLabel } from 'shared/components/form/form-form-label';\n\nimport { CoachFormFieldsNames } from './types';\n\ninterface Props<TFormValues extends Record<string, any>> {\n register: UseFormRegister<TFormValues>;\n errors: FieldErrors<TFormValues>;\n watch: UseFormWatch<TFormValues>;\n trigger: UseFormTrigger<TFormValues>;\n}\n\nexport function CoachesForm<TFormValues extends Record<string, any>>({\n register,\n errors,\n trigger,\n}: Props<TFormValues>) {\n return (\n <>\n <FormControl fullWidth margin='normal'>\n <FormFormLabel>Coach Name</FormFormLabel>\n <TextField\n size='small'\n {...register(CoachFormFieldsNames.name as Path<TFormValues>)}\n error={!!errors[CoachFormFieldsNames.name]}\n helperText={errors[CoachFormFieldsNames.name] && <>{errors[CoachFormFieldsNames.name].message}</>}\n />\n </FormControl>\n <FormControl\n fullWidth\n margin='normal'\n onChange={() => trigger(CoachFormFieldsNames.coachImage as Path<TFormValues>)}\n >\n <FormFormLabel>Image URL</FormFormLabel>\n <Input\n type='file'\n size='small'\n {...register(CoachFormFieldsNames.coachImage as Path<TFormValues>)}\n error={!!errors[CoachFormFieldsNames.coachImage]}\n />\n {errors[CoachFormFieldsNames.coachImage] && (\n <Typography color={Colors.red}>\n <>{errors[CoachFormFieldsNames.coachImage].message ?? ''}</>\n </Typography>\n )}\n </FormControl>\n </>\n );\n}\n","import { z } from 'zod';\n\nimport { CoachFormFieldsNames } from './types';\n\nexport const coachFormSchema = z.object({\n [CoachFormFieldsNames.id]: z.string().optional(),\n [CoachFormFieldsNames.name]: z.string().trim().min(2),\n [CoachFormFieldsNames.coachImage]: z.instanceof(FileList).optional(),\n});\n","import { Box, styled } from '@mui/material';\n\nexport const CoachPhotoPreviewContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'column',\n marginTop: theme.spacing(2),\n}));\n\nexport const CoachPhotoContainer = styled(Box)(() => ({\n width: '120px',\n height: '120px',\n}));\n","import { Box, styled } from '@mui/material';\n\ninterface CoachImageProps {\n fullSize?: boolean;\n}\n\nexport const CoachImageContainer = styled(Box)(() => ({\n borderRadius: '50%',\n overflow: 'hidden',\n height: '100%',\n width: '100%',\n}));\n\nexport const CoachImageElement = styled('img', { shouldForwardProp: (prop) => prop !== 'fullSize' })<CoachImageProps>(\n ({ fullSize }) => ({\n maxHeight: fullSize ? '100%' : '36px',\n maxWidth: fullSize ? '100%' : '36px',\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n }),\n);\n","import { CoachImageContainer, CoachImageElement } from './styled';\n\ninterface Props {\n src: string;\n fullSize?: boolean;\n}\n\nexport const CoachPhoto = ({ src, fullSize = false }: Props) => {\n return (\n <CoachImageContainer>\n <CoachImageElement src={src} alt='' fullSize={fullSize} />\n </CoachImageContainer>\n );\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\ninterface CoachPhotoSkeletonProps {\n small?: boolean;\n}\n\nexport const CoachPhotoSkeletonContainer = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'small',\n})<CoachPhotoSkeletonProps>(({ small }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: Colors.iron,\n width: small ? '32px' : '120px',\n height: small ? '32px' : '120px',\n borderRadius: '50%',\n border: `4px solid ${Colors.athens}`,\n}));\n","import { IconUser } from 'shared/components/icons/icon-user';\n\nimport { CoachPhotoSkeletonContainer } from './styled';\n\ninterface Props {\n small?: boolean;\n}\n\nexport const CoachPhotoSkeleton = ({ small }: Props) => {\n return (\n <CoachPhotoSkeletonContainer small={small}>\n <IconUser color='secondary' size={small ? 'xsmall' : 'medium'} />\n </CoachPhotoSkeletonContainer>\n );\n};\n","import { Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nimport { CoachPhotoContainer, CoachPhotoPreviewContainer } from './styled';\nimport { CoachPhoto } from '../coach-photo';\nimport { CoachPhotoSkeleton } from '../coach-photo-skeleton';\n\ninterface Props {\n photoUrl?: string | null;\n}\n\nexport const CoachPhotoPreview = ({ photoUrl }: Props) => {\n return (\n <CoachPhotoPreviewContainer>\n <CoachPhotoContainer>\n {photoUrl ? <CoachPhoto fullSize src={photoUrl} /> : <CoachPhotoSkeleton />}\n </CoachPhotoContainer>\n <Typography fontSize={fontSizes.small} marginTop={1}>\n Image preview\n </Typography>\n </CoachPhotoPreviewContainer>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport React, { useCallback, useMemo, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { IconUser } from 'shared/components/icons/icon-user';\n\nimport { useInvalidateCoaches } from '../../../../api/coaches/use-coaches';\nimport { useCreateCoach } from '../../../../api/coaches/use-create-coach';\nimport { useUpdateCoach } from '../../../../api/coaches/use-update-coach';\nimport { Coach } from '../../../../types/coaches';\nimport { CoachesForm } from '../coach-form';\nimport { coachFormSchema } from '../coach-form/form';\nimport { CoachForm, CoachFormFieldsNames, CoachFormSchema } from '../coach-form/types';\nimport { CoachPhotoPreview } from '../coach-photo-preview';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n coach?: Coach;\n}\n\nconst coachesFormId = 'coaches-form';\n\nexport const CoachModal = ({ open, onClose, coach }: Props) => {\n const formRef = useRef<HTMLFormElement>(null);\n const invalidateCoaches = useInvalidateCoaches();\n\n const defaultValues = useMemo(\n () =>\n coach\n ? {\n [CoachFormFieldsNames.id]: coach.id,\n [CoachFormFieldsNames.name]: coach.name,\n }\n : undefined,\n [coach],\n );\n\n const {\n register,\n formState: { errors },\n handleSubmit,\n reset,\n watch,\n trigger,\n } = useForm<CoachFormSchema>({\n resolver: zodResolver(coachFormSchema),\n defaultValues,\n });\n\n const { create } = useCreateCoach();\n const { update } = useUpdateCoach();\n\n const coachImage = watch(CoachFormFieldsNames.coachImage);\n const photoUrlValue =\n coachImage && coachImage.length > 0 ? URL.createObjectURL(coachImage[0]) : coach ? coach.photoUrl : undefined;\n\n const handleCreate = useCallback(\n (data: CoachForm) => {\n create({\n data: {\n ...data,\n image: data[CoachFormFieldsNames.coachImage] ? data[CoachFormFieldsNames.coachImage][0] : undefined,\n },\n onSuccess: () => {\n invalidateCoaches();\n onClose();\n reset();\n },\n });\n },\n [create, invalidateCoaches, onClose, reset],\n );\n\n const handleUpdate = useCallback(\n (data: CoachForm) => {\n if (!data?.id) return;\n const { id, ...rest } = data;\n update({\n data: {\n ...rest,\n image: rest[CoachFormFieldsNames.coachImage] ? rest[CoachFormFieldsNames.coachImage][0] : undefined,\n },\n id,\n onSuccess: () => {\n invalidateCoaches();\n onClose();\n },\n });\n },\n [invalidateCoaches, onClose, update],\n );\n\n const handleCreateOrUpdate = useCallback(\n (data: CoachForm) => {\n if (defaultValues) {\n handleUpdate(data);\n } else {\n handleCreate(data);\n }\n },\n [defaultValues, handleCreate, handleUpdate],\n );\n\n return (\n <DialogNew\n maxWidth='sm'\n fullWidth\n title={defaultValues ? 'Edit coach' : 'New coach'}\n icon={<IconUser size='small' />}\n onCancel={onClose}\n onClose={onClose}\n buttonSubmitText={defaultValues ? 'Save' : 'Create'}\n open={open}\n buttonFormId={coachesFormId}\n >\n <form id={coachesFormId} ref={formRef} onSubmit={handleSubmit(handleCreateOrUpdate)}>\n <CoachesForm<CoachFormSchema> errors={errors} register={register} watch={watch} trigger={trigger} />\n <CoachPhotoPreview photoUrl={photoUrlValue} />\n </form>\n </DialogNew>\n );\n};\n","import { ListItem, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const CoachListItem = styled(ListItem)(({ theme }) => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: 'auto 1fr 32px',\n gap: theme.spacing(2),\n borderBottom: `1px solid ${Colors.iron}`,\n padding: `${theme.spacing(1, 2, 1, 3)} !important`,\n}));\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateCoaches } from '../use-coaches';\n\ninterface DeleteCoachParams {\n coachId: string;\n onSuccess?: () => void;\n}\n\nexport const useDeleteCoach = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateCoaches = useInvalidateCoaches();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.DELETE,\n successMessage: 'Delete coach success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Delete coach error'),\n onSuccess: invalidateCoaches,\n });\n\n const deleteCoach = ({ coachId, onSuccess }: DeleteCoachParams) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.COACHES}/${coachId}`,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, deleteCoach };\n};\n","import { Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\n\nimport ConfirmDialog from 'shared/components/confirm-dialog';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\n\nimport { CoachListItem } from './styled';\nimport { useDeleteCoach } from '../../../../api/coaches/use-delete-coach';\nimport { Coach } from '../../../../types/coaches';\nimport { CoachModal } from '../coach-modal';\nimport { CoachPhoto } from '../coach-photo';\nimport { CoachPhotoSkeleton } from '../coach-photo-skeleton';\n\ninterface Props {\n coach: Coach;\n}\n\nexport const CoachItem = ({ coach }: Props) => {\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [isConfirmDeleteDialogOpen, setIsConfirmDeleteDialogOpen] = useState(false);\n const { deleteCoach } = useDeleteCoach();\n const handleEditModalOpen = () => setIsEditModalOpen(true);\n const handleEditModalClose = () => setIsEditModalOpen(false);\n\n const handleDeleteCoach = useCallback(() => {\n deleteCoach({\n coachId: coach.id,\n });\n }, [coach.id, deleteCoach]);\n\n const options: MenuListOption[] = [\n {\n displayText: 'Edit',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: handleEditModalOpen,\n },\n {\n displayText: 'Delete',\n icon: <IconDelete size='small' color='secondary' />,\n onClick: () => setIsConfirmDeleteDialogOpen(true),\n },\n ];\n\n return (\n <>\n <CoachListItem key={coach.id}>\n {coach.photoUrl ? <CoachPhoto src={coach.photoUrl} /> : <CoachPhotoSkeleton small />}\n <Typography fontWeight={fontWeight['500']}>{coach.name}</Typography>\n <KebabMenu options={options} />\n </CoachListItem>\n {isEditModalOpen ? <CoachModal open={isEditModalOpen} onClose={handleEditModalClose} coach={coach} /> : null}\n\n <ConfirmDialog\n type={'warning'}\n title={`You sure you want delete \"${coach.name}\" coach?`}\n cancelLabel={'Cancel'}\n confirmLabel={'Delete'}\n onConfirm={handleDeleteCoach}\n isOpen={isConfirmDeleteDialogOpen}\n setIsOpen={setIsConfirmDeleteDialogOpen}\n />\n </>\n );\n};\n","import { List } from '@mui/material';\n\nimport { Coach } from '../../../../types/coaches';\nimport { CoachItem } from '../coach-item';\n\ninterface Props {\n coaches: Coach[];\n}\n\nexport const CoachesList = ({ coaches }: Props) => {\n const coachesItems = coaches.map((coache) => {\n return <CoachItem key={coache.id} coach={coache} />;\n });\n\n return <List>{coachesItems}</List>;\n};\n","import { Box, Button, Stack, TextField, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport debounce from 'lodash/debounce';\nimport { ChangeEvent, useCallback, useState } from 'react';\n\nimport { BackofficeContentContainer } from 'pages/backoffice/components/backoffice-content-container';\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport NotFound from 'shared/components/not-found';\nimport Pagination from 'shared/components/pagination';\n\nimport { CoachModal } from './components/coach-modal';\nimport { CoachesList } from './components/coaches-list';\nimport { useCoaches } from '../../api/coaches/use-coaches';\nimport { ListSkeleton } from '../../components/list-skeleton';\n\nconst DEBOUNCE_TIME = 300;\n\nexport const Coaches = () => {\n const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);\n const { items, page, fetchNextPage, isFetching, setFilters } = useCoaches();\n\n const handleCreateModalOpen = useCallback(() => setIsCreateModalOpen(true), []);\n const handleCreateModalClose = useCallback(() => setIsCreateModalOpen(false), []);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleSearchChange = useCallback(\n debounce((event: ChangeEvent<HTMLInputElement>) => {\n setFilters({ name: event.target.value });\n }, DEBOUNCE_TIME),\n [setFilters],\n );\n\n return (\n <BackofficeContentContainer>\n <Stack direction='row' alignItems='center' justifyContent='space-between' marginBottom={2}>\n <Typography variant='h4'>Coaches</Typography>\n <Button\n variant='contained'\n size='large'\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n onClick={handleCreateModalOpen}\n >\n New coach\n </Button>\n </Stack>\n\n <Stack marginBottom={2} justifyContent='flex-end' direction='row'>\n <TextField size='small' placeholder='Search coaches' onChange={handleSearchChange} />\n </Stack>\n\n <ListHeader>\n <Box display='grid' gridTemplateColumns='1fr 1fr 32px' alignItems={'center'}>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Coach\n </Typography>\n </Box>\n </ListHeader>\n {!isFetching && items.length === 0 ? (\n <Box marginTop={4}>\n <NotFound header={'No results'} />\n </Box>\n ) : null}\n {isFetching ? <ListSkeleton /> : <CoachesList coaches={items} />}\n {page ? (\n <Pagination\n total={page.totalElements}\n displayed={items.length}\n onShowMore={fetchNextPage}\n getStatsText={(displayed, total) => `${displayed} of ${total} coaches`}\n />\n ) : null}\n <CoachModal open={isCreateModalOpen} onClose={handleCreateModalClose} />\n </BackofficeContentContainer>\n );\n};\n","import { InfinityQueryDataResult } from 'api/hooks/useInfinityQuery/types';\nimport { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { CompetitionsApiResponse } from './types';\nimport { Competition } from '../../../types/competitions';\nimport { CompetitionApi } from '../types';\n\nconst transformData = (items: CompetitionApi[]): Competition[] => {\n return items.map((item) => ({\n id: item.uuid,\n name: item.name,\n country: item.country,\n }));\n};\n\nexport const transformCompetitions = (response: CompetitionsApiResponse): InfinityQueryDataResult<Competition> => {\n return {\n data: {\n items: transformData(response.data),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n","import { useQueryClient } from '@tanstack/react-query';\n\nimport { useInfinityQuery } from 'api/hooks/useInfinityQuery';\nimport { InfinityQueryResult } from 'api/hooks/useInfinityQuery/types';\nimport { SortDirection } from 'shared/types/filters/types';\n\nimport { transformCompetitions } from './transformer';\nimport { CompetitionsApiResponse, CompetitionsFilters } from './types';\nimport { Competition } from '../../../types/competitions';\nimport { getCompetitionsUrl } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\n\nconst QUERY_KEY = 'competitions';\n\nexport const useCompetitions = (): InfinityQueryResult<Competition, CompetitionsFilters> => {\n const { isAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n\n return useInfinityQuery<Competition, CompetitionsFilters, CompetitionsApiResponse>({\n generateUrl: getCompetitionsUrl,\n key: QUERY_KEY,\n options: {\n size: 10,\n sort: 'name',\n sortDirection: SortDirection.DESC,\n },\n transformer: transformCompetitions,\n queryOptions: {\n enabled: isAllowedBackofficeOrigin,\n },\n });\n};\n\nexport const useInvalidateCompetitions = () => {\n const queryClient = useQueryClient();\n\n return () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { CreateCompetitionApiParams } from './types';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateCompetitions } from '../use-competitions';\n\ninterface RequestData {\n data: CreateCompetitionApiParams;\n onSuccess?: () => void;\n}\n\nexport const useCreateCompetition = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateCompetitions = useInvalidateCompetitions();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Competition created',\n errorMessage: (data) => metadataApiErrorParser(data, 'Competition creation error'),\n onSuccess: invalidateCompetitions,\n });\n\n const create = ({ data, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: annotationApiUrls.COMPETITIONS,\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, create };\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { UpdateCompetitionApiData } from './types';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateCompetitions } from '../use-competitions';\n\ninterface RequestData {\n data: UpdateCompetitionApiData;\n id: string;\n onSuccess?: () => void;\n}\n\nexport const useUpdateCompetition = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateCompetitions = useInvalidateCompetitions();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.PATCH,\n successMessage: 'Competition updated',\n errorMessage: (data) => metadataApiErrorParser(data, 'Competition update error'),\n onSuccess: invalidateCompetitions,\n });\n\n const update = ({ data, id, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.COMPETITIONS}/${id}`,\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, update };\n};\n","import { TypeOf } from 'zod';\n\nimport { competitionFormSchema } from './form';\n\nexport enum CompetitionFormFieldsNames {\n id = 'id',\n name = 'name',\n country = 'country',\n}\n\nexport interface CompetitionForm {\n [CompetitionFormFieldsNames.id]?: string;\n [CompetitionFormFieldsNames.name]: string;\n [CompetitionFormFieldsNames.country]: string;\n}\n\nexport type CompetitionFormSchema = TypeOf<typeof competitionFormSchema>;\n","import { FormControl, TextField } from '@mui/material';\nimport { Path, UseFormRegister, FieldErrors } from 'react-hook-form';\n\nimport { FormFormLabel } from 'shared/components/form/form-form-label';\n\nimport { CompetitionFormFieldsNames } from './types';\n\ninterface Props<TFormValues extends Record<string, any>> {\n register: UseFormRegister<TFormValues>;\n errors: FieldErrors<TFormValues>;\n}\n\nexport function CompetitionsForm<TFormValues extends Record<string, any>>({ register, errors }: Props<TFormValues>) {\n return (\n <>\n <FormControl fullWidth margin='normal'>\n <FormFormLabel>Competition Name</FormFormLabel>\n <TextField\n size='small'\n {...register(CompetitionFormFieldsNames.name as Path<TFormValues>)}\n error={!!errors[CompetitionFormFieldsNames.name]}\n helperText={errors[CompetitionFormFieldsNames.name] && <>{errors[CompetitionFormFieldsNames.name].message}</>}\n />\n </FormControl>\n <FormControl fullWidth margin='normal'>\n <FormFormLabel>Country</FormFormLabel>\n <TextField\n size='small'\n {...register(CompetitionFormFieldsNames.country as Path<TFormValues>)}\n error={!!errors[CompetitionFormFieldsNames.country]}\n helperText={\n errors[CompetitionFormFieldsNames.country] && <>{errors[CompetitionFormFieldsNames.country].message}</>\n }\n />\n </FormControl>\n </>\n );\n}\n","import { z } from 'zod';\n\nimport { CompetitionFormFieldsNames } from './types';\n\nexport const competitionFormSchema = z.object({\n [CompetitionFormFieldsNames.id]: z.string().optional(),\n [CompetitionFormFieldsNames.name]: z.string().trim().min(2),\n [CompetitionFormFieldsNames.country]: z.string(),\n});\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { IconUser } from 'shared/components/icons/icon-user';\n\nimport { useCreateCompetition } from '../../../../api/competitions/use-create-competition';\nimport { useUpdateCompetition } from '../../../../api/competitions/use-update-competition';\nimport { CompetitionsForm } from '../competition-form';\nimport { competitionFormSchema } from '../competition-form/form';\nimport { CompetitionForm, CompetitionFormSchema } from '../competition-form/types';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n defaultValues?: CompetitionForm;\n}\n\nconst competitionsFormId = 'competitions-form';\n\nexport const CompetitionModal = ({ open, onClose, defaultValues }: Props) => {\n const formRef = useRef<HTMLFormElement>(null);\n const {\n register,\n formState: { errors },\n handleSubmit,\n reset,\n } = useForm<CompetitionFormSchema>({\n resolver: zodResolver(competitionFormSchema),\n defaultValues,\n });\n\n const { create } = useCreateCompetition();\n const { update } = useUpdateCompetition();\n\n const handleCreate = useCallback(\n (data: CompetitionForm) => {\n create({\n data,\n onSuccess: () => {\n onClose();\n reset();\n },\n });\n },\n [create, onClose, reset],\n );\n\n const handleUpdate = useCallback(\n (data: CompetitionForm) => {\n if (!data?.id) return;\n const { id, ...rest } = data;\n update({\n data: rest,\n id,\n onSuccess: onClose,\n });\n },\n [onClose, update],\n );\n\n const handleCreateOrUpdate = useCallback(\n (data: CompetitionForm) => {\n if (defaultValues) {\n handleUpdate(data);\n } else {\n handleCreate(data);\n }\n },\n [defaultValues, handleCreate, handleUpdate],\n );\n\n return (\n <DialogNew\n maxWidth='sm'\n fullWidth\n title={defaultValues ? 'Edit competition' : 'New competition'}\n icon={<IconUser size='small' />}\n onCancel={onClose}\n onClose={onClose}\n buttonSubmitText={defaultValues ? 'Save' : 'Create'}\n open={open}\n buttonFormId={competitionsFormId}\n >\n <form id={competitionsFormId} ref={formRef} onSubmit={handleSubmit(handleCreateOrUpdate)}>\n <CompetitionsForm<CompetitionFormSchema> errors={errors} register={register} />\n </form>\n </DialogNew>\n );\n};\n","import { ListItem, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const CompetitionsListItem = styled(ListItem)(({ theme }) => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '1fr 1fr 32px',\n borderBottom: `1px solid ${Colors.iron}`,\n padding: `${theme.spacing(1, 2, 1, 3)} !important`,\n}));\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateCompetitions } from '../use-competitions';\n\ninterface DeleteCompetitionParams {\n competitionId: string;\n onSuccess?: () => void;\n}\n\nexport const useDeleteCompetition = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateCompetitions = useInvalidateCompetitions();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.DELETE,\n successMessage: 'Delete competition success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Delete competition error'),\n onSuccess: invalidateCompetitions,\n });\n\n const deleteCompetition = ({ competitionId, onSuccess }: DeleteCompetitionParams) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.COMPETITIONS}/${competitionId}`,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, deleteCompetition };\n};\n","import { Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\n\nimport ConfirmDialog from 'shared/components/confirm-dialog';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\n\nimport { CompetitionsListItem } from './styled';\nimport { useDeleteCompetition } from '../../../../api/competitions/use-delete-competition';\nimport { Competition } from '../../../../types/competitions';\nimport { CompetitionFormFieldsNames } from '../competition-form/types';\nimport { CompetitionModal } from '../competition-modal';\n\ninterface Props {\n competition: Competition;\n}\n\nexport const CompetitionItem = ({ competition }: Props) => {\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [isConfirmDeleteDialogOpen, setIsConfirmDeleteDialogOpen] = useState(false);\n const { deleteCompetition } = useDeleteCompetition();\n const handleEditModalOpen = () => setIsEditModalOpen(true);\n const handleEditModalClose = () => setIsEditModalOpen(false);\n\n const handleDeleteCompetition = useCallback(() => {\n deleteCompetition({\n competitionId: competition.id,\n });\n }, [competition.id, deleteCompetition]);\n\n const options: MenuListOption[] = [\n {\n displayText: 'Edit',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: handleEditModalOpen,\n },\n {\n displayText: 'Delete',\n icon: <IconDelete size='small' color='secondary' />,\n onClick: () => setIsConfirmDeleteDialogOpen(true),\n },\n ];\n\n const defaultValues = {\n [CompetitionFormFieldsNames.id]: competition.id,\n [CompetitionFormFieldsNames.name]: competition.name,\n [CompetitionFormFieldsNames.country]: competition.country ? competition.country : '',\n };\n\n return (\n <>\n <CompetitionsListItem key={competition.id}>\n <Typography fontWeight={fontWeight['500']}>{competition.name}</Typography>\n <Typography>{competition.country}</Typography>\n <KebabMenu options={options} />\n </CompetitionsListItem>\n {isEditModalOpen ? (\n <CompetitionModal open={isEditModalOpen} onClose={handleEditModalClose} defaultValues={defaultValues} />\n ) : null}\n\n <ConfirmDialog\n type={'warning'}\n title={`You sure you want delete \"${competition.name}\" competition?`}\n cancelLabel={'Cancel'}\n confirmLabel={'Delete'}\n onConfirm={handleDeleteCompetition}\n isOpen={isConfirmDeleteDialogOpen}\n setIsOpen={setIsConfirmDeleteDialogOpen}\n />\n </>\n );\n};\n","import { List } from '@mui/material';\n\nimport { Competition } from '../../../../types/competitions';\nimport { CompetitionItem } from '../competition-item';\n\ninterface Props {\n competitions: Competition[];\n}\n\nexport const CompetitionsList = ({ competitions }: Props) => {\n const competitionsItems = competitions.map((competition) => {\n return <CompetitionItem key={competition.id} competition={competition} />;\n });\n\n return <List>{competitionsItems}</List>;\n};\n","import { Box, Button, Stack, TextField, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport debounce from 'lodash/debounce';\nimport { ChangeEvent, useCallback, useState } from 'react';\n\nimport { BackofficeContentContainer } from 'pages/backoffice/components/backoffice-content-container';\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport NotFound from 'shared/components/not-found';\nimport Pagination from 'shared/components/pagination';\n\nimport { CompetitionModal } from './components/competition-modal';\nimport { CompetitionsList } from './components/competitions-list';\nimport { useCompetitions } from '../../api/competitions/use-competitions';\nimport { ListSkeleton } from '../../components/list-skeleton';\n\nconst DEBOUNCE_TIME = 300;\n\nexport const Competitions = () => {\n const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);\n const { items, page, fetchNextPage, isFetching, setFilters } = useCompetitions();\n\n const handleCreateModalOpen = useCallback(() => setIsCreateModalOpen(true), []);\n const handleCreateModalClose = useCallback(() => setIsCreateModalOpen(false), []);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleSearchChange = useCallback(\n debounce((event: ChangeEvent<HTMLInputElement>) => {\n setFilters({ name: event.target.value });\n }, DEBOUNCE_TIME),\n [setFilters],\n );\n\n return (\n <BackofficeContentContainer>\n <Stack direction='row' alignItems='center' justifyContent='space-between' marginBottom={2}>\n <Typography variant='h4'>Competitions</Typography>\n <Button\n variant='contained'\n size='large'\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n onClick={handleCreateModalOpen}\n >\n New competition\n </Button>\n </Stack>\n\n <Stack marginBottom={2} justifyContent='flex-end' direction='row'>\n <TextField size='small' placeholder='Search competitions' onChange={handleSearchChange} />\n </Stack>\n\n <ListHeader>\n <Box display='grid' gridTemplateColumns='1fr 1fr 32px' alignItems={'center'}>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Name\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Country\n </Typography>\n <div>&nbsp;</div>\n </Box>\n </ListHeader>\n {!isFetching && items.length === 0 ? (\n <Box marginTop={4}>\n <NotFound header={'No results'} />\n </Box>\n ) : null}\n {isFetching ? <ListSkeleton /> : <CompetitionsList competitions={items} />}\n {page ? (\n <Pagination\n total={page.totalElements}\n displayed={items.length}\n onShowMore={fetchNextPage}\n getStatsText={(displayed, total) => `${displayed} of ${total} competitions`}\n />\n ) : null}\n <CompetitionModal open={isCreateModalOpen} onClose={handleCreateModalClose} />\n </BackofficeContentContainer>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { clientBaseUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { Client } from 'shared/types';\n\nimport { transformClientWithLinks } from '../../transformer';\nimport { ClientApiResponse } from '../../types';\nimport { ClientRequestData } from '../../types/clientRequestData';\nimport { invalidateClients } from '../use-clients/useClients';\n\nexport const useCreateClient = () => {\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest<ClientApiResponse, Client>({\n type: HTTPMethod.POST,\n errorMessage: 'Error creating a new client',\n successMessage: 'New client created',\n transformer: transformClientWithLinks,\n });\n\n const createClient = ({ data, onSuccess }: { data: ClientRequestData; onSuccess?: (res: Client) => void }) => {\n mutate(\n { url: clientBaseUrl, data },\n {\n onSuccess: async (res) => {\n await invalidateClients();\n onSuccess && onSuccess(res);\n },\n },\n );\n };\n\n return { createClient, isLoading, isError, isSuccess };\n};\n","import get from 'lodash/get';\nimport { FieldErrors } from 'react-hook-form';\n\nexport const getErrorByFieldName = (errors: FieldErrors, fieldName: string) => {\n if (!errors) {\n return null;\n }\n\n return get(errors, fieldName);\n};\n","export enum EnvironmentFormFieldsNames {\n ID = 'id',\n NAME = 'name',\n CITY = 'city',\n COUNTRY = 'country',\n}\n","import { EnvironmentFormFieldsNames } from './environmentFormFieldsNames';\n\nexport const EnvironmentFormLabels = {\n [EnvironmentFormFieldsNames.ID]: 'Environment ID',\n [EnvironmentFormFieldsNames.CITY]: 'City',\n [EnvironmentFormFieldsNames.COUNTRY]: 'Country',\n [EnvironmentFormFieldsNames.NAME]: 'Environment Name',\n};\n","import z from 'zod';\n\nconst isValidId = (id: string): boolean => {\n const regex = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n return regex.test(id);\n};\n\nexport const environmentFormSchema = z.object({\n id: z\n .string()\n .trim()\n .min(3)\n .transform((val) => val.toLowerCase())\n .refine((val) => isValidId(val), {\n message: \"Invalid ID format (e.g. 'my-client-id')\",\n }),\n name: z.string().trim().min(3),\n city: z.string().trim().min(3),\n country: z.string().min(2),\n});\n","/*\n Description: List of countries in Alpha-2 code format\n Source: https://www.iso.org/iso-3166-country-codes.html\n */\n\nexport const Countries = [\n { code: 'AD', name: 'Andorra' },\n { code: 'AE', name: 'United Arab Emirates' },\n { code: 'AF', name: 'Afghanistan' },\n { code: 'AG', name: 'Antigua and Barbuda' },\n { code: 'AI', name: 'Anguilla' },\n { code: 'AL', name: 'Albania' },\n { code: 'AM', name: 'Armenia' },\n { code: 'AO', name: 'Angola' },\n { code: 'AQ', name: 'Antarctica' },\n { code: 'AR', name: 'Argentina' },\n { code: 'AS', name: 'American Samoa' },\n { code: 'AT', name: 'Austria' },\n { code: 'AU', name: 'Australia' },\n { code: 'AW', name: 'Aruba' },\n { code: 'AX', name: 'Åland Islands' },\n { code: 'AZ', name: 'Azerbaijan' },\n { code: 'BA', name: 'Bosnia and Herzegovina' },\n { code: 'BB', name: 'Barbados' },\n { code: 'BD', name: 'Bangladesh' },\n { code: 'BE', name: 'Belgium' },\n { code: 'BF', name: 'Burkina Faso' },\n { code: 'BG', name: 'Bulgaria' },\n { code: 'BH', name: 'Bahrain' },\n { code: 'BI', name: 'Burundi' },\n { code: 'BJ', name: 'Benin' },\n { code: 'BL', name: 'Saint Barthélemy' },\n { code: 'BM', name: 'Bermuda' },\n { code: 'BN', name: 'Brunei Darussalam' },\n { code: 'BO', name: 'Bolivia, Plurinational State of' },\n { code: 'BQ', name: 'Bonaire, Sint Eustatius and Saba' },\n { code: 'BR', name: 'Brazil' },\n { code: 'BS', name: 'Bahamas' },\n { code: 'BT', name: 'Bhutan' },\n { code: 'BV', name: 'Bouvet Island' },\n { code: 'BW', name: 'Botswana' },\n { code: 'BY', name: 'Belarus' },\n { code: 'BZ', name: 'Belize' },\n { code: 'CA', name: 'Canada' },\n { code: 'CC', name: 'Cocos (Keeling) Islands' },\n { code: 'CD', name: 'Congo, Democratic Republic of the' },\n { code: 'CF', name: 'Central African Republic' },\n { code: 'CG', name: 'Congo' },\n { code: 'CH', name: 'Switzerland' },\n { code: 'CI', name: \"Côte d'Ivoire\" },\n { code: 'CK', name: 'Cook Islands' },\n { code: 'CL', name: 'Chile' },\n { code: 'CM', name: 'Cameroon' },\n { code: 'CN', name: 'China' },\n { code: 'CO', name: 'Colombia' },\n { code: 'CR', name: 'Costa Rica' },\n { code: 'CU', name: 'Cuba' },\n { code: 'CV', name: 'Cabo Verde' },\n { code: 'CW', name: 'Curaçao' },\n { code: 'CX', name: 'Christmas Island' },\n { code: 'CY', name: 'Cyprus' },\n { code: 'CZ', name: 'Czechia' },\n { code: 'DE', name: 'Germany' },\n { code: 'DJ', name: 'Djibouti' },\n { code: 'DK', name: 'Denmark' },\n { code: 'DM', name: 'Dominica' },\n { code: 'DO', name: 'Dominican Republic' },\n { code: 'DZ', name: 'Algeria' },\n { code: 'EC', name: 'Ecuador' },\n { code: 'EE', name: 'Estonia' },\n { code: 'EG', name: 'Egypt' },\n { code: 'EH', name: 'Western Sahara' },\n { code: 'ER', name: 'Eritrea' },\n { code: 'ES', name: 'Spain' },\n { code: 'ET', name: 'Ethiopia' },\n { code: 'FI', name: 'Finland' },\n { code: 'FJ', name: 'Fiji' },\n { code: 'FK', name: 'Falkland Islands (Malvinas)' },\n { code: 'FM', name: 'Micronesia, Federated States of' },\n { code: 'FO', name: 'Faroe Islands' },\n { code: 'FR', name: 'France' },\n { code: 'GA', name: 'Gabon' },\n { code: 'GB', name: 'United Kingdom of Great Britain and Northern Ireland' },\n { code: 'GD', name: 'Grenada' },\n { code: 'GE', name: 'Georgia' },\n { code: 'GF', name: 'French Guiana' },\n { code: 'GG', name: 'Guernsey' },\n { code: 'GH', name: 'Ghana' },\n { code: 'GI', name: 'Gibraltar' },\n { code: 'GL', name: 'Greenland' },\n { code: 'GM', name: 'Gambia' },\n { code: 'GN', name: 'Guinea' },\n { code: 'GP', name: 'Guadeloupe' },\n { code: 'GQ', name: 'Equatorial Guinea' },\n { code: 'GR', name: 'Greece' },\n { code: 'GS', name: 'South Georgia and the South Sandwich Islands' },\n { code: 'GT', name: 'Guatemala' },\n { code: 'GU', name: 'Guam' },\n { code: 'GW', name: 'Guinea-Bissau' },\n { code: 'GY', name: 'Guyana' },\n { code: 'HK', name: 'Hong Kong' },\n { code: 'HM', name: 'Heard Island and McDonald Islands' },\n { code: 'HN', name: 'Honduras' },\n { code: 'HR', name: 'Croatia' },\n { code: 'HT', name: 'Haiti' },\n { code: 'HU', name: 'Hungary' },\n { code: 'ID', name: 'Indonesia' },\n { code: 'IE', name: 'Ireland' },\n { code: 'IL', name: 'Israel' },\n { code: 'IM', name: 'Isle of Man' },\n { code: 'IN', name: 'India' },\n { code: 'IO', name: 'British Indian Ocean Territory' },\n { code: 'IQ', name: 'Iraq' },\n { code: 'IR', name: 'Iran, Islamic Republic of' },\n { code: 'IS', name: 'Iceland' },\n { code: 'IT', name: 'Italy' },\n { code: 'JE', name: 'Jersey' },\n { code: 'JM', name: 'Jamaica' },\n { code: 'JO', name: 'Jordan' },\n { code: 'JP', name: 'Japan' },\n { code: 'KE', name: 'Kenya' },\n { code: 'KG', name: 'Kyrgyzstan' },\n { code: 'KH', name: 'Cambodia' },\n { code: 'KI', name: 'Kiribati' },\n { code: 'KM', name: 'Comoros' },\n { code: 'KN', name: 'Saint Kitts and Nevis' },\n { code: 'KP', name: \"Korea, Democratic People's Republic of\" },\n { code: 'KR', name: 'Korea, Republic of' },\n { code: 'KW', name: 'Kuwait' },\n { code: 'KY', name: 'Cayman Islands' },\n { code: 'KZ', name: 'Kazakhstan' },\n { code: 'LA', name: \"Lao People's Democratic Republic\" },\n { code: 'LB', name: 'Lebanon' },\n { code: 'LC', name: 'Saint Lucia' },\n { code: 'LI', name: 'Liechtenstein' },\n { code: 'LK', name: 'Sri Lanka' },\n { code: 'LR', name: 'Liberia' },\n { code: 'LS', name: 'Lesotho' },\n { code: 'LT', name: 'Lithuania' },\n { code: 'LU', name: 'Luxembourg' },\n { code: 'LV', name: 'Latvia' },\n { code: 'LY', name: 'Libya' },\n { code: 'MA', name: 'Morocco' },\n { code: 'MC', name: 'Monaco' },\n { code: 'MD', name: 'Moldova, Republic of' },\n { code: 'ME', name: 'Montenegro' },\n { code: 'MF', name: 'Saint Martin, (French part)' },\n { code: 'MG', name: 'Madagascar' },\n { code: 'MH', name: 'Marshall Islands' },\n { code: 'MK', name: 'North Macedonia' },\n { code: 'ML', name: 'Mali' },\n { code: 'MM', name: 'Myanmar' },\n { code: 'MN', name: 'Mongolia' },\n { code: 'MO', name: 'Macao' },\n { code: 'MP', name: 'Northern Mariana Islands' },\n { code: 'MQ', name: 'Martinique' },\n { code: 'MR', name: 'Mauritania' },\n { code: 'MS', name: 'Montserrat' },\n { code: 'MT', name: 'Malta' },\n { code: 'MU', name: 'Mauritius' },\n { code: 'MV', name: 'Maldives' },\n { code: 'MW', name: 'Malawi' },\n { code: 'MX', name: 'Mexico' },\n { code: 'MY', name: 'Malaysia' },\n { code: 'MZ', name: 'Mozambique' },\n { code: 'NA', name: 'Namibia' },\n { code: 'NC', name: 'New Caledonia' },\n { code: 'NE', name: 'Niger' },\n { code: 'NF', name: 'Norfolk Island' },\n { code: 'NG', name: 'Nigeria' },\n { code: 'NI', name: 'Nicaragua' },\n { code: 'NL', name: 'Netherlands' },\n { code: 'NO', name: 'Norway' },\n { code: 'NP', name: 'Nepal' },\n { code: 'NR', name: 'Nauru' },\n { code: 'NU', name: 'Niue' },\n { code: 'NZ', name: 'New Zealand' },\n { code: 'OM', name: 'Oman' },\n { code: 'PA', name: 'Panama' },\n { code: 'PE', name: 'Peru' },\n { code: 'PF', name: 'French Polynesia' },\n { code: 'PG', name: 'Papua New Guinea' },\n { code: 'PH', name: 'Philippines' },\n { code: 'PK', name: 'Pakistan' },\n { code: 'PL', name: 'Poland' },\n { code: 'PM', name: 'Saint Pierre and Miquelon' },\n { code: 'PN', name: 'Pitcairn' },\n { code: 'PR', name: 'Puerto Rico' },\n { code: 'PS', name: 'Palestine, State of' },\n { code: 'PT', name: 'Portugal' },\n { code: 'PW', name: 'Palau' },\n { code: 'PY', name: 'Paraguay' },\n { code: 'QA', name: 'Qatar' },\n { code: 'RE', name: 'Réunion' },\n { code: 'RO', name: 'Romania' },\n { code: 'RS', name: 'Serbia' },\n { code: 'RU', name: 'Russian Federation' },\n { code: 'RW', name: 'Rwanda' },\n { code: 'SA', name: 'Saudi Arabia' },\n { code: 'SB', name: 'Solomon Islands' },\n { code: 'SC', name: 'Seychelles' },\n { code: 'SD', name: 'Sudan' },\n { code: 'SE', name: 'Sweden' },\n { code: 'SG', name: 'Singapore' },\n { code: 'SH', name: 'Saint Helena, Ascension and Tristan da Cunha' },\n { code: 'SI', name: 'Slovenia' },\n { code: 'SJ', name: 'Svalbard and Jan Mayen' },\n { code: 'SK', name: 'Slovakia' },\n { code: 'SL', name: 'Sierra Leone' },\n { code: 'SM', name: 'San Marino' },\n { code: 'SN', name: 'Senegal' },\n { code: 'SO', name: 'Somalia' },\n { code: 'SR', name: 'Suriname' },\n { code: 'SS', name: 'South Sudan' },\n { code: 'ST', name: 'Sao Tome and Principe' },\n { code: 'SV', name: 'El Salvador' },\n { code: 'SX', name: 'Sint Maarten, (Dutch part)' },\n { code: 'SY', name: 'Syrian Arab Republic' },\n { code: 'SZ', name: 'Eswatini' },\n { code: 'TC', name: 'Turks and Caicos Islands' },\n { code: 'TD', name: 'Chad' },\n { code: 'TF', name: 'French Southern Territories' },\n { code: 'TG', name: 'Togo' },\n { code: 'TH', name: 'Thailand' },\n { code: 'TJ', name: 'Tajikistan' },\n { code: 'TK', name: 'Tokelau' },\n { code: 'TL', name: 'Timor-Leste' },\n { code: 'TM', name: 'Turkmenistan' },\n { code: 'TN', name: 'Tunisia' },\n { code: 'TO', name: 'Tonga' },\n { code: 'TR', name: 'Türkiye' },\n { code: 'TT', name: 'Trinidad and Tobago' },\n { code: 'TV', name: 'Tuvalu' },\n { code: 'TW', name: 'Taiwan, Province of China' },\n { code: 'TZ', name: 'Tanzania, United Republic of' },\n { code: 'UA', name: 'Ukraine' },\n { code: 'UG', name: 'Uganda' },\n { code: 'UM', name: 'United States Minor Outlying Islands' },\n { code: 'US', name: 'United States of America' },\n { code: 'UY', name: 'Uruguay' },\n { code: 'UZ', name: 'Uzbekistan' },\n { code: 'VA', name: 'Holy See' },\n { code: 'VC', name: 'Saint Vincent and the Grenadines' },\n { code: 'VE', name: 'Venezuela, Bolivarian Republic of' },\n { code: 'VG', name: 'Virgin Islands, British' },\n { code: 'VI', name: 'Virgin Islands, U.S.' },\n { code: 'VN', name: 'Viet Nam' },\n { code: 'VU', name: 'Vanuatu' },\n { code: 'WF', name: 'Wallis and Futuna' },\n { code: 'WS', name: 'Samoa' },\n { code: 'YE', name: 'Yemen' },\n { code: 'YT', name: 'Mayotte' },\n { code: 'ZA', name: 'South Africa' },\n { code: 'ZM', name: 'Zambia' },\n { code: 'ZW', name: 'Zimbabwe' },\n];\n","import { getTypeOptions } from 'shared/components/form/get-type-options';\n\nimport { EnvironmentFormFieldsNames } from './environmentFormFieldsNames';\nimport { Countries } from '../../../utils/countries';\nimport { EnvironmentFormField } from '../types/environmentFormField';\n\nexport const generateEnvironmentFormFields = (): EnvironmentFormField[] => [\n {\n id: EnvironmentFormFieldsNames.ID,\n component: 'input',\n fullWidth: true,\n },\n {\n id: EnvironmentFormFieldsNames.NAME,\n component: 'input',\n fullWidth: true,\n },\n {\n id: EnvironmentFormFieldsNames.CITY,\n component: 'input',\n fullWidth: true,\n },\n {\n id: EnvironmentFormFieldsNames.COUNTRY,\n component: 'select',\n options: getTypeOptions({\n options: Countries.map((country) => ({\n value: country.code,\n label: country.name,\n })),\n }),\n },\n];\n","import { ErrorMessage } from '@hookform/error-message';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { LoadingButton } from '@mui/lab';\nimport { Box, Button, CardActions, Stack } from '@mui/material';\nimport React, { forwardRef, Ref, useCallback, useImperativeHandle } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\nimport { FormSelectField } from 'shared/components/form/form-select-field';\nimport { ClientBranding } from 'shared/types/user/types';\nimport { getErrorByFieldName } from 'shared/utils/get-error-by-field-name/getErrorByFieldName';\n\nimport { EnvironmentFormDefaultValues } from './types/environmentFormDefaultValues';\nimport { EnvironmentFormField } from './types/environmentFormField';\nimport { EnvironmentFormRef } from './types/environmentFormRef';\nimport { EnvironmentFormValues } from './types/environmentFormValues';\nimport { EnvironmentOnSubmit } from './types/environmentOnSubmit';\nimport { EnvironmentFormLabels } from './utils/environmentFormLabels';\nimport { environmentFormSchema } from './utils/environmentFormSchema';\nimport { generateEnvironmentFormFields } from './utils/generateEnvironmentFormFields';\n\ninterface EnvironmentFormProps {\n isLoading: boolean;\n onSubmit: (params: EnvironmentOnSubmit) => void;\n defaultValues?: EnvironmentFormDefaultValues;\n brandingAssetsUrls?: Partial<ClientBranding> | null;\n}\n\nexport const EnvironmentForm = forwardRef(\n ({ isLoading, onSubmit, defaultValues }: EnvironmentFormProps, ref?: Ref<EnvironmentFormRef>) => {\n const {\n reset,\n register,\n handleSubmit: handleFormSubmit,\n getValues,\n formState: { errors, isDirty },\n } = useForm<EnvironmentFormValues>({\n resolver: zodResolver(environmentFormSchema),\n defaultValues,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n reset,\n }),\n [reset],\n );\n\n const handleOnFormSubmit = useCallback(\n (data: EnvironmentFormValues) => {\n onSubmit({\n data,\n });\n },\n [onSubmit],\n );\n\n const formFieldRender = (field: EnvironmentFormField) => {\n switch (field.component) {\n case 'select':\n return (\n <FormSelectField\n id={field.id}\n label={EnvironmentFormLabels[field.id]}\n error={!!getErrorByFieldName(errors, field.id)}\n fullWidth={field.fullWidth}\n options={field.options}\n helperText={<ErrorMessage errors={errors} name={field.id} />}\n defaultValue={getValues(field.id) || ''}\n {...register(field.id)}\n />\n );\n case 'input':\n default:\n return (\n <FormInputField\n id={field.id}\n label={EnvironmentFormLabels[field.id]}\n error={!!getErrorByFieldName(errors, field.id)}\n fullWidth={field.fullWidth}\n type={field.type}\n helperText={<ErrorMessage errors={errors} name={field.id} />}\n {...register(field.id)}\n />\n );\n }\n };\n\n const formFieldsRender = generateEnvironmentFormFields().map((field) => {\n return (\n <Stack key={field.id} direction='row' alignItems='center' spacing={1} justifyContent='space-between'>\n <Box sx={{ flexGrow: 1 }}>{formFieldRender(field)}</Box>\n </Stack>\n );\n });\n\n return (\n <form onSubmit={handleFormSubmit(handleOnFormSubmit)}>\n <Stack direction='column'>\n {formFieldsRender}\n\n <CardActions sx={{ justifyContent: 'flex-end' }}>\n <Button onClick={() => reset()}>Reset</Button>\n <LoadingButton\n color={'primary'}\n loading={isLoading}\n size={'large'}\n type={'submit'}\n variant={'contained'}\n disabled={!isDirty}\n >\n Send\n </LoadingButton>\n </CardActions>\n </Stack>\n </form>\n );\n },\n);\n\nEnvironmentForm.displayName = 'EnvironmentForm';\n","import { Card, CardContent, Container, Stack, Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport React, { useCallback, useRef } from 'react';\nimport { generatePath } from 'react-router-dom';\n\nimport { IconChevronRight } from 'shared/components/icons/icon-chevron-right';\nimport { useRedirectTo } from 'shared/components/sidebar-layout/sidebar-menu/hooks/use-redirect-to';\n\nimport { useCreateClient } from '../../../../api/backoffice/client/hooks/use-create-client/useCreateClient';\nimport { routes } from '../../../../kognia/router/routes';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { EnvironmentForm } from '../../features/environment-form/EnvironmentForm.feature';\nimport { EnvironmentFormRef } from '../../features/environment-form/types/environmentFormRef';\nimport { EnvironmentOnSubmit } from '../../features/environment-form/types/environmentOnSubmit';\n\nexport const CreateEnvironmentPage = () => {\n const { createClient, isLoading } = useCreateClient();\n const redirectTo = useRedirectTo();\n const environmentFormRef = useRef<EnvironmentFormRef>(null);\n\n const handleAddOnSuccess = useCallback(() => {\n if (environmentFormRef.current) {\n environmentFormRef.current.reset();\n }\n redirectTo(generatePath(routes.BACKOFFICE_ENVIRONMENTS));\n }, [redirectTo]);\n\n const handleCreateClient = useCallback(\n ({ data }: EnvironmentOnSubmit) => {\n createClient({\n data,\n onSuccess: handleAddOnSuccess,\n });\n },\n [createClient, handleAddOnSuccess],\n );\n\n return (\n <BackofficeContentContainer>\n <Container fixed maxWidth='sm'>\n <Stack direction={'column'} spacing={2}>\n <Typography\n variant={'h6'}\n sx={{ fontWeight: fontWeight['400'] }}\n display='flex'\n alignItems='center'\n gap={0.5}\n >\n <span>Environments</span>\n <IconChevronRight size='small' color='secondary' />\n <span>Add environment</span>\n </Typography>\n <Card>\n <CardContent>\n <EnvironmentForm isLoading={isLoading} onSubmit={handleCreateClient} ref={environmentFormRef} />\n </CardContent>\n </Card>\n </Stack>\n </Container>\n </BackofficeContentContainer>\n );\n};\n","import { Client } from '../../../../shared/types/user/types';\n\nexport const transformClient = (client: Client): Client => ({\n id: client.id,\n name: client.name,\n city: client.city,\n country: client.country,\n branding: client.branding,\n});\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { clientBrandingUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { Client } from 'shared/types';\n\nimport { BrandingApiResponse, BrandingRequestData } from '../../types/brandingRequestData';\nimport { transformClient } from '../../utils/transformClient';\n\nexport const useCreateBranding = () => {\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest<BrandingApiResponse, Client>({\n type: HTTPMethod.POST,\n errorMessage: 'Error creating a branding',\n successMessage: 'Branding created successfully',\n transformer: transformClient,\n });\n\n const create = ({\n data,\n onSuccess,\n clientId,\n }: {\n data: BrandingRequestData;\n onSuccess?: (res: Client) => void;\n clientId: string;\n }) => {\n const formData = new FormData();\n formData.append('displayName', new Blob([data.displayName], { type: 'application/json' }));\n formData.append('favicon', data.favicon[0]);\n formData.append('emailLogo', data.emailLogo[0]);\n formData.append('navbarLogo', data.navbarLogo[0]);\n formData.append('navbarCollapsedLogo', data.navbarCollapsedLogo[0]);\n\n mutate({ url: clientBrandingUrl(clientId), data: formData }, { onSuccess: (res) => onSuccess && onSuccess(res) });\n };\n\n return { create, isLoading, isError, isSuccess };\n};\n","import { styled } from '@mui/material';\n\nexport const BrandingPreviewImg = styled('img')(() => ({\n minWidth: '50px',\n}));\n","export enum BrandingFormFieldsNames {\n FAVICON = 'favicon',\n EMAIL_LOGO = 'emailLogo',\n NAVBAR_LOGO = 'navbarLogo',\n NAVBAR_COLLAPSED_LOGO = 'navbarCollapsedLogo',\n DISPLAY_NAME = 'displayName',\n}\n","import { BrandingFormFieldsNames } from './brandingFormFieldsNames';\n\nexport const BrandingFormLabels = {\n [BrandingFormFieldsNames.FAVICON]: 'Favicon',\n [BrandingFormFieldsNames.EMAIL_LOGO]: 'Email Logo',\n [BrandingFormFieldsNames.NAVBAR_LOGO]: 'Navbar Logo',\n [BrandingFormFieldsNames.NAVBAR_COLLAPSED_LOGO]: 'Navbar Collapsed Logo',\n [BrandingFormFieldsNames.DISPLAY_NAME]: 'Display Name',\n};\n","import z, { ZodIssue } from 'zod';\n\nexport const brandingFormRequiredSchema = z\n .object({\n displayName: z.string(),\n favicon: z.instanceof(FileList),\n emailLogo: z.instanceof(FileList),\n navbarLogo: z.instanceof(FileList),\n navbarCollapsedLogo: z.instanceof(FileList),\n })\n .refine((data) => {\n const fields = Object.entries(data);\n const anyFieldFilled = fields.some(([, value]) => value !== undefined && value !== null && value.length > 0);\n\n if (!anyFieldFilled) return true;\n\n const errors = fields.reduce<ZodIssue[]>((acc, [key, value]) => {\n if (value === undefined || value === null || value.length === 0) {\n acc.push({\n code: 'custom',\n path: [key],\n message: `${key} is required.`,\n });\n }\n return acc;\n }, []);\n\n if (errors.length > 0) {\n throw new z.ZodError(errors);\n }\n\n return true;\n });\n\nexport const brandingFormOptionalSchema = z.object({\n favicon: z.instanceof(FileList).optional(),\n emailLogo: z.instanceof(FileList).optional(),\n navbarLogo: z.instanceof(FileList).optional(),\n navbarCollapsedLogo: z.instanceof(FileList).optional(),\n displayName: z.string().optional(),\n});\n","import { ClientBranding } from 'shared/types/user/types';\n\nimport { BrandingFormFieldsNames } from './brandingFormFieldsNames';\nimport { BrandingFormField } from '../types/brandingFormField';\n\ninterface BrandingFormFieldsParams {\n previewUrls?: Partial<ClientBranding> | null;\n}\n\nexport const generateBrandingFormFields = ({ previewUrls }: BrandingFormFieldsParams): BrandingFormField[] => [\n {\n id: BrandingFormFieldsNames.FAVICON,\n component: 'input',\n type: 'file',\n fullWidth: true,\n showClearButton: true,\n previewUrl: previewUrls?.faviconUrl,\n },\n {\n id: BrandingFormFieldsNames.EMAIL_LOGO,\n component: 'input',\n type: 'file',\n fullWidth: true,\n showClearButton: true,\n previewUrl: previewUrls?.emailLogoUrl,\n },\n {\n id: BrandingFormFieldsNames.NAVBAR_LOGO,\n component: 'input',\n type: 'file',\n fullWidth: true,\n showClearButton: true,\n previewUrl: previewUrls?.navbarLogoUrl,\n },\n {\n id: BrandingFormFieldsNames.NAVBAR_COLLAPSED_LOGO,\n component: 'input',\n type: 'file',\n fullWidth: true,\n showClearButton: true,\n previewUrl: previewUrls?.navbarCollapsedLogoUrl,\n },\n {\n id: BrandingFormFieldsNames.DISPLAY_NAME,\n placeholder: previewUrls?.displayName,\n component: 'input',\n fullWidth: true,\n },\n];\n","import { ErrorMessage } from '@hookform/error-message';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { LoadingButton } from '@mui/lab';\nimport { Box, Button, CardActions, IconButton, Stack, Tooltip } from '@mui/material';\nimport isEmpty from 'lodash/isEmpty';\nimport React, { forwardRef, Ref, useCallback, useImperativeHandle } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport { IconInfo } from 'shared/components/icons/icon-info';\nimport { ClientBranding } from 'shared/types/user/types';\nimport { getErrorByFieldName } from 'shared/utils/get-error-by-field-name/getErrorByFieldName';\n\nimport { BrandingPreviewImg } from './BrandingForm.styled';\nimport { BrandingFormDefaultValues } from './types/brandingFormDefaultValues';\nimport { BrandingFormField } from './types/brandingFormField';\nimport { BrandingFormRef } from './types/brandingFormRef';\nimport { BrandingFormValues } from './types/brandingFormValues';\nimport { BrandingOnSubmit } from './types/brandingOnSubmit';\nimport { BrandingFormLabels } from './utils/brandingFormLabels';\nimport { brandingFormRequiredSchema, brandingFormOptionalSchema } from './utils/brandingFormOptionalSchema';\nimport { generateBrandingFormFields } from './utils/generateBrandingFormFields';\n\ninterface BrandingFormProps {\n isLoading: boolean;\n onSubmit: (params: BrandingOnSubmit) => void;\n defaultValues?: BrandingFormDefaultValues;\n brandingAssetsUrls?: Partial<ClientBranding> | null;\n}\n\nexport const BrandingForm = forwardRef(\n ({ isLoading, onSubmit, defaultValues, brandingAssetsUrls }: BrandingFormProps, ref?: Ref<BrandingFormRef>) => {\n const {\n reset,\n resetField,\n register,\n handleSubmit: handleFormSubmit,\n formState: { errors, isDirty },\n } = useForm<BrandingFormValues>({\n resolver: zodResolver(defaultValues ? brandingFormOptionalSchema : brandingFormRequiredSchema),\n defaultValues,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n reset,\n }),\n [reset],\n );\n\n const handleOnFormSubmit = useCallback(\n (data: BrandingFormValues) => {\n onSubmit({\n data,\n formState: {\n isBrandingDirty: isDirty,\n isBrandingEmpty: isEmpty(Object.values(data).filter((item) => !isEmpty(item))),\n },\n });\n },\n [isDirty, onSubmit],\n );\n\n const formFieldRender = (field: BrandingFormField) => (\n <FormInputField\n id={field.id}\n label={BrandingFormLabels[field.id]}\n error={!!getErrorByFieldName(errors, field.id)}\n fullWidth={field.fullWidth}\n placeholder={field.placeholder}\n type={field.type}\n helperText={<ErrorMessage errors={errors} name={field.id} />}\n {...register(field.id)}\n />\n );\n\n const formFieldsRender = generateBrandingFormFields({ previewUrls: brandingAssetsUrls }).map((field) => {\n return (\n <Stack key={field.id} direction='row' alignItems='center' spacing={1} justifyContent='space-between'>\n <Box sx={{ flexGrow: 1 }}>{formFieldRender(field)}</Box>\n {field.showClearButton ? (\n <IconButton onClick={() => resetField(field.id)}>\n <IconDelete size='small' />\n </IconButton>\n ) : null}\n\n {field.previewUrl ? (\n <Tooltip placement={'left'} title={<BrandingPreviewImg src={field.previewUrl} />}>\n <Box>\n <IconInfo size='small' />\n </Box>\n </Tooltip>\n ) : null}\n </Stack>\n );\n });\n\n return (\n <form onSubmit={handleFormSubmit(handleOnFormSubmit)}>\n <Stack direction='column'>\n {formFieldsRender}\n\n <CardActions sx={{ justifyContent: 'flex-end' }}>\n <Button onClick={() => reset()}>Reset</Button>\n <LoadingButton\n color={'primary'}\n loading={isLoading}\n size={'large'}\n type={'submit'}\n variant={'contained'}\n disabled={!isDirty}\n >\n Send\n </LoadingButton>\n </CardActions>\n </Stack>\n </form>\n );\n },\n);\n\nBrandingForm.displayName = 'BrandingForm';\n","import { Card, CardContent, Container, Stack, Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport React, { useCallback, useRef } from 'react';\nimport { generatePath, useParams } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport { IconChevronRight } from 'shared/components/icons/icon-chevron-right';\nimport { useRedirectTo } from 'shared/components/sidebar-layout/sidebar-menu/hooks/use-redirect-to';\nimport { Client } from 'shared/types/user/types';\n\nimport { useClients } from '../../../../api/backoffice/client/hooks/use-clients/useClients';\nimport { useCreateBranding } from '../../../../api/backoffice/client/hooks/use-create-branding/useCreateBranding';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { BrandingForm } from '../../features/branding-form/BrandingForm.feature';\nimport { BrandingFormRef } from '../../features/branding-form/types/brandingFormRef';\nimport { BrandingOnSubmit } from '../../features/branding-form/types/brandingOnSubmit';\n\nexport const CreateEnvironmentBranding = () => {\n const { id } = useParams<{ id: string }>();\n const { create, isLoading } = useCreateBranding();\n const redirectTo = useRedirectTo();\n const createBrandingFormRef = useRef<BrandingFormRef>(null);\n const { items } = useClients({ initialFilters: { clientIds: [id] } });\n const environment = items?.[0];\n\n const handleAddOnSuccess = useCallback(\n (data: Client) => {\n if (createBrandingFormRef.current) {\n createBrandingFormRef.current.reset();\n }\n redirectTo(generatePath(routes.BACKOFFICE_ENVIRONMENT_DETAIL, { id: data.id }));\n },\n [redirectTo],\n );\n\n const handleCreateBranding = useCallback(\n ({ data }: BrandingOnSubmit) => {\n create({\n data,\n onSuccess: handleAddOnSuccess,\n clientId: id,\n });\n },\n [create, handleAddOnSuccess, id],\n );\n\n return (\n <BackofficeContentContainer>\n <Container fixed maxWidth='sm'>\n <Stack direction={'column'} spacing={2}>\n <Typography\n variant={'h6'}\n sx={{ fontWeight: fontWeight['400'] }}\n display='flex'\n alignItems='center'\n gap={0.5}\n >\n <span>{environment?.name}</span>\n <IconChevronRight size='small' color='secondary' />\n <span>Create branding</span>\n </Typography>\n <Card>\n <CardContent>\n <BrandingForm isLoading={isLoading} onSubmit={handleCreateBranding} ref={createBrandingFormRef} />\n </CardContent>\n </Card>\n </Stack>\n </Container>\n </BackofficeContentContainer>\n );\n};\n","export type BackendApiError = {\n detail: string;\n instance: string;\n status: number;\n title: string;\n type: string;\n};\n\nexport const backendApiErrorParser = (data: BackendApiError | undefined, fallbackErrorMessage: string) =>\n data && data.detail ? data.detail : fallbackErrorMessage;\n","import { HTTPMethod } from 'api/types';\nimport { BackendApiError, backendApiErrorParser } from 'api/utils/backend-api-error-parser';\n\nimport { useMutationRequest } from '../../../hooks/useMutationRequest';\nimport { userAuth0Url } from '../../../routes';\nimport { CreateKogniaUser, KogniaUser } from '../use-kognia-users/types';\n\nexport const useCreateUser = () => {\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest<KogniaUser, KogniaUser, BackendApiError>({\n type: HTTPMethod.POST,\n errorMessage: (response) => backendApiErrorParser(response, 'Error creating user(s)'),\n successMessage: 'User created successfully',\n });\n\n const createUser = ({\n data,\n onSuccess = () => {},\n }: {\n data: CreateKogniaUser;\n onSuccess?: (res: KogniaUser) => void;\n }) => {\n mutate(\n {\n url: userAuth0Url,\n data,\n },\n { onSuccess: (res: KogniaUser) => onSuccess && onSuccess(res) },\n );\n };\n\n return { createUser, isLoading, isError, isSuccess };\n};\n","import { array, object, string } from 'zod';\n\nimport { kogniaUserLocales } from 'api/backoffice/user/use-kognia-users/types';\n\nexport enum CreateUserFormFieldsNames {\n CLIENT_IDS = 'clientIds',\n EMAIL = 'email',\n FIRST_NAME = 'firstName',\n LAST_NAME = 'lastName',\n LOCALE = 'locale',\n}\n\nexport const createUserFormSchema = object({\n [CreateUserFormFieldsNames.FIRST_NAME]: string().trim().min(2),\n [CreateUserFormFieldsNames.LAST_NAME]: string().trim().min(2),\n [CreateUserFormFieldsNames.CLIENT_IDS]: array(string()).min(1),\n [CreateUserFormFieldsNames.EMAIL]: string().email(),\n [CreateUserFormFieldsNames.LOCALE]: string().refine((val) => kogniaUserLocales.includes(val)),\n});\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { LoadingButton } from '@mui/lab';\nimport { Box, Button, Card, CardActions, CardContent, Stack, Typography } from '@mui/material';\nimport { Colors, fontWeight } from 'kognia-ui';\nimport React, { useCallback, useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { useCreateUser } from 'api/backoffice/user/use-create-user';\nimport {\n CreateKogniaUser,\n KogniaUseLocale,\n KogniaUser,\n kogniaUserLocales,\n} from 'api/backoffice/user/use-kognia-users/types';\nimport { FormInputField } from 'shared/components/form/form-input-field';\nimport { FormSelectField } from 'shared/components/form/form-select-field';\nimport { getTypeOptions } from 'shared/components/form/get-type-options';\nimport { IconChevronRight } from 'shared/components/icons/icon-chevron-right';\n\nimport { CreateUserFormFieldsNames, createUserFormSchema } from './utils/create-user-form';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { SelectClients } from '../../components/select-clients';\n\nexport const CreateClientFormLabels = {\n [CreateUserFormFieldsNames.FIRST_NAME]: 'First name',\n [CreateUserFormFieldsNames.LAST_NAME]: 'Last name',\n [CreateUserFormFieldsNames.EMAIL]: 'Email',\n [CreateUserFormFieldsNames.LOCALE]: 'Locale',\n [CreateUserFormFieldsNames.CLIENT_IDS]: 'Environments',\n};\n\nexport const CreateUserContainer = () => {\n const [createdUser, setCreatedUser] = React.useState<KogniaUser | null>(null);\n const { createUser, isLoading } = useCreateUser();\n const {\n reset,\n register,\n watch,\n setValue,\n handleSubmit: handleFormSubmit,\n formState: { errors },\n } = useForm<CreateKogniaUser>({\n defaultValues: {\n [CreateUserFormFieldsNames.CLIENT_IDS]: [],\n [CreateUserFormFieldsNames.LOCALE]: kogniaUserLocales[0] as KogniaUseLocale,\n [CreateUserFormFieldsNames.EMAIL]: '',\n [CreateUserFormFieldsNames.FIRST_NAME]: '',\n [CreateUserFormFieldsNames.LAST_NAME]: '',\n },\n resolver: zodResolver(createUserFormSchema),\n });\n\n const handleAddOnSuccess = useCallback(\n (data: KogniaUser) => {\n setCreatedUser(data);\n reset();\n },\n [reset],\n );\n\n const handleCreateUser = useCallback(\n (data: CreateKogniaUser) => {\n createUser({ data, onSuccess: handleAddOnSuccess });\n },\n [createUser, handleAddOnSuccess],\n );\n\n const inputFormFields = useMemo(\n () => [CreateUserFormFieldsNames.FIRST_NAME, CreateUserFormFieldsNames.LAST_NAME, CreateUserFormFieldsNames.EMAIL],\n [],\n );\n\n const setSelectedClients = useCallback(\n (clientIds: string[]) => {\n setValue(CreateUserFormFieldsNames.CLIENT_IDS, clientIds);\n },\n [setValue],\n );\n\n const { clientIds: selectedClients } = watch();\n\n return (\n <BackofficeContentContainer>\n <Stack direction={'column'} spacing={2}>\n <Typography variant={'h6'} fontWeight={fontWeight['400']} display='flex' alignItems='center' gap={0.5}>\n <span>Environments</span>\n <IconChevronRight size='small' color='secondary' />\n <span>Create user</span>\n </Typography>\n <Card>\n <CardContent>\n <form onSubmit={handleFormSubmit(handleCreateUser)}>\n <Stack direction='column' spacing={2}>\n {inputFormFields.map((field) => (\n <FormInputField\n key={field}\n id={field}\n label={CreateClientFormLabels[field]}\n error={!!errors[field]}\n fullWidth\n helperText={errors[field] && <>{errors[field]?.message}</>}\n {...register(field)}\n />\n ))}\n\n <FormSelectField\n id={CreateUserFormFieldsNames.LOCALE}\n label={CreateClientFormLabels[CreateUserFormFieldsNames.LOCALE]}\n options={getTypeOptions({\n options: kogniaUserLocales.map((locale) => ({\n value: locale,\n label: locale,\n })),\n })}\n error={!!errors[CreateUserFormFieldsNames.LOCALE]}\n helperText={\n errors[CreateUserFormFieldsNames.LOCALE] && <>{errors[CreateUserFormFieldsNames.LOCALE]?.message}</>\n }\n defaultValue={''}\n {...register(CreateUserFormFieldsNames.LOCALE)}\n />\n\n <SelectClients clientIds={selectedClients} onChange={setSelectedClients} />\n\n <CardActions sx={{ justifyContent: 'flex-end' }}>\n <Button onClick={() => reset()}>Reset</Button>\n <LoadingButton\n color={'primary'}\n loading={isLoading}\n size={'large'}\n type={'submit'}\n variant={'contained'}\n >\n Create\n </LoadingButton>\n </CardActions>\n </Stack>\n </form>\n </CardContent>\n </Card>\n {createdUser ? (\n <Card key={createdUser.id} sx={{ background: Colors.twilight }}>\n <CardContent>\n <Typography variant={'h5'} marginBottom={2}>\n <strong>First name:</strong> {createdUser.firstName}\n <Typography variant={'body1'} color={Colors.green} marginBottom={2}>\n (id: {createdUser.id})\n </Typography>\n </Typography>\n <Typography variant={'h5'} marginBottom={2}>\n <strong>Last name:</strong> {createdUser.lastName}\n </Typography>\n <Typography variant={'h5'} marginBottom={2}>\n <strong>Email:</strong> {createdUser.email}\n </Typography>\n <Typography variant={'h5'} marginBottom={2}>\n <strong>Locale:</strong> {createdUser.locale}\n </Typography>\n <Stack direction={'column'} spacing={1}>\n <Typography variant={'body1'} sx={{ fontWeight: fontWeight['500'] }}>\n Client ids\n </Typography>\n <Typography>\n {createdUser.clientIds.map((clientId) => (\n <Box key={clientId} sx={{ color: Colors.storm }}>\n {clientId}\n </Box>\n ))}\n </Typography>\n </Stack>\n </CardContent>\n </Card>\n ) : null}\n </Stack>\n </BackofficeContentContainer>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { clientEditUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { Client } from 'shared/types';\n\nimport { transformClientWithLinks } from '../../transformer';\nimport { ClientApiResponse } from '../../types';\nimport { EditClientRequestData } from '../../types/editClientRequestData';\nimport { invalidateClients } from '../use-clients/useClients';\n\nexport const useEditClient = () => {\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest<ClientApiResponse, Client>({\n type: HTTPMethod.PATCH,\n errorMessage: 'Error editing a client',\n successMessage: 'New client edited',\n transformer: transformClientWithLinks,\n });\n\n const editClient = ({\n id,\n data,\n onSuccess,\n }: {\n id: string;\n data: EditClientRequestData;\n onSuccess?: (res: Client) => void;\n }) => {\n mutate(\n { url: clientEditUrl(id), data },\n {\n onSuccess: async (res) => {\n await invalidateClients();\n onSuccess && onSuccess(res);\n },\n },\n );\n };\n\n return { editClient, isLoading, isError, isSuccess };\n};\n","import { Card, CardContent, Container, Stack, Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport React, { useCallback } from 'react';\nimport { generatePath, useParams } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport { IconChevronRight } from 'shared/components/icons/icon-chevron-right';\nimport { useRedirectTo } from 'shared/components/sidebar-layout/sidebar-menu/hooks/use-redirect-to';\nimport Spinner from 'shared/components/spinner';\n\nimport { useClients } from '../../../../api/backoffice/client/hooks/use-clients/useClients';\nimport { useEditClient } from '../../../../api/backoffice/client/hooks/use-edit-client/useEditClient';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { EnvironmentForm } from '../../features/environment-form/EnvironmentForm.feature';\nimport { EnvironmentFormDefaultValues } from '../../features/environment-form/types/environmentFormDefaultValues';\nimport { EnvironmentOnSubmit } from '../../features/environment-form/types/environmentOnSubmit';\n\nexport const EditEnvironment = () => {\n const { id } = useParams<{ id: string }>();\n const { editClient, isLoading } = useEditClient();\n const redirectTo = useRedirectTo();\n const { items, isLoading: isLoadingClient } = useClients({ initialFilters: { clientIds: [id] } });\n\n const defaultValues: EnvironmentFormDefaultValues | undefined = items?.[0]\n ? {\n id: items[0].id,\n name: items[0].name,\n city: items[0].city,\n country: items[0].country,\n }\n : undefined;\n\n const handleCreateClient = useCallback(\n ({ data }: EnvironmentOnSubmit) => {\n editClient({\n data,\n id,\n onSuccess: () => redirectTo(generatePath(routes.BACKOFFICE_ENVIRONMENT_DETAIL, { id })),\n });\n },\n [editClient, id, redirectTo],\n );\n\n return (\n <BackofficeContentContainer>\n <Container fixed maxWidth='sm'>\n <Stack direction={'column'} spacing={2}>\n <Typography\n variant={'h6'}\n sx={{ fontWeight: fontWeight['400'] }}\n display='flex'\n alignItems='center'\n gap={0.5}\n >\n <span>{items?.[0]?.name}</span>\n <IconChevronRight size='small' color='secondary' />\n <span>Edit environment</span>\n </Typography>\n <Card>\n <CardContent>\n {isLoadingClient ? (\n <Spinner isFullPage />\n ) : (\n <EnvironmentForm isLoading={isLoading} onSubmit={handleCreateClient} defaultValues={defaultValues} />\n )}\n </CardContent>\n </Card>\n </Stack>\n </Container>\n </BackofficeContentContainer>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { clientBrandingUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { Client } from 'shared/types';\n\nimport { BrandingApiResponse, BrandingRequestData } from '../../types/brandingRequestData';\nimport { transformClient } from '../../utils/transformClient';\n\nexport const useEditBranding = () => {\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest<BrandingApiResponse, Client>({\n type: HTTPMethod.PATCH,\n errorMessage: 'Error editing a branding',\n successMessage: 'Branding edited successfully',\n transformer: transformClient,\n });\n\n const edit = ({\n data,\n onSuccess,\n clientId,\n }: {\n data: Partial<BrandingRequestData>;\n onSuccess?: (res: Client) => void;\n clientId: string;\n }) => {\n const formData = new FormData();\n if (data.displayName) formData.append('displayName', new Blob([data.displayName], { type: 'application/json' }));\n if (data.favicon?.[0]) formData.append('favicon', data.favicon[0]);\n if (data.emailLogo?.[0]) formData.append('emailLogo', data.emailLogo[0]);\n if (data.navbarLogo?.[0]) formData.append('navbarLogo', data.navbarLogo[0]);\n if (data.navbarCollapsedLogo?.[0]) formData.append('navbarCollapsedLogo', data.navbarCollapsedLogo[0]);\n\n mutate({ url: clientBrandingUrl(clientId), data: formData }, { onSuccess: (res) => onSuccess && onSuccess(res) });\n };\n\n return { edit, isLoading, isError, isSuccess };\n};\n","import { Card, CardContent, Container, Stack, Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport React, { useCallback, useRef } from 'react';\nimport { generatePath, useParams } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport { IconChevronRight } from 'shared/components/icons/icon-chevron-right';\nimport { useRedirectTo } from 'shared/components/sidebar-layout/sidebar-menu/hooks/use-redirect-to';\nimport { Client } from 'shared/types/user/types';\n\nimport { useClients } from '../../../../api/backoffice/client/hooks/use-clients/useClients';\nimport { useEditBranding } from '../../../../api/backoffice/client/hooks/use-edit-branding/useEditBranding';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { BrandingForm } from '../../features/branding-form/BrandingForm.feature';\nimport { BrandingFormRef } from '../../features/branding-form/types/brandingFormRef';\nimport { BrandingOnSubmit } from '../../features/branding-form/types/brandingOnSubmit';\n\nexport const EditEnvironmentBranding = () => {\n const { id } = useParams<{ id: string }>();\n const { edit, isLoading } = useEditBranding();\n const redirectTo = useRedirectTo();\n const editBrandingFormRef = useRef<BrandingFormRef>(null);\n const { items } = useClients({ initialFilters: { clientIds: [id] } });\n const environment = items?.[0];\n const defaultValues = environment?.branding;\n\n const handleAddOnSuccess = useCallback(\n (data: Client) => {\n if (editBrandingFormRef.current) {\n editBrandingFormRef.current.reset();\n }\n redirectTo(generatePath(routes.BACKOFFICE_ENVIRONMENT_DETAIL, { id: data.id }));\n },\n [redirectTo],\n );\n\n const handleCreateBranding = useCallback(\n ({ data }: BrandingOnSubmit) => {\n edit({\n data,\n onSuccess: handleAddOnSuccess,\n clientId: id,\n });\n },\n [edit, handleAddOnSuccess, id],\n );\n\n return (\n <BackofficeContentContainer>\n <Container fixed maxWidth='sm'>\n <Stack direction={'column'} spacing={2}>\n <Typography\n variant={'h6'}\n sx={{ fontWeight: fontWeight['400'] }}\n display='flex'\n alignItems='center'\n gap={0.5}\n >\n <span>{environment?.name}</span>\n <IconChevronRight size='small' color='secondary' />\n <span>Edit branding</span>\n </Typography>\n <Card>\n <CardContent>\n {environment && defaultValues ? (\n <BrandingForm\n isLoading={isLoading}\n onSubmit={handleCreateBranding}\n ref={editBrandingFormRef}\n defaultValues={defaultValues}\n />\n ) : null}\n </CardContent>\n </Card>\n </Stack>\n </Container>\n </BackofficeContentContainer>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { clientBrandingUrl } from 'api/routes';\nimport { HTTPMethod } from 'api/types';\nimport { Client } from 'shared/types';\n\nimport { BrandingApiResponse } from '../../types/brandingRequestData';\nimport { transformClient } from '../../utils/transformClient';\nimport { invalidateClients } from '../use-clients/useClients';\n\nexport const useRemoveBranding = () => {\n const { mutate, isLoading, isError, isSuccess } = useMutationRequest<BrandingApiResponse, Client>({\n type: HTTPMethod.DELETE,\n errorMessage: 'Error deleting a branding',\n successMessage: 'Branding deleted successfully',\n transformer: transformClient,\n });\n\n const remove = ({ onSuccess, clientId }: { onSuccess?: (res: Client) => void; clientId: string }) => {\n mutate(\n { url: clientBrandingUrl(clientId) },\n {\n onSuccess: async (res) => {\n await invalidateClients();\n onSuccess && onSuccess(res);\n },\n },\n );\n };\n\n return { remove, isLoading, isError, isSuccess };\n};\n","import { Box, Button, Container, Paper, Stack, Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport React, { useCallback } from 'react';\nimport { generatePath, useParams } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport { IconChevronRight } from 'shared/components/icons/icon-chevron-right';\nimport { useRedirectTo } from 'shared/components/sidebar-layout/sidebar-menu/hooks/use-redirect-to';\n\nimport { useClients } from '../../../../api/backoffice/client/hooks/use-clients/useClients';\nimport { useRemoveBranding } from '../../../../api/backoffice/client/hooks/use-remove-branding/useRemoveBranding';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\n\nexport const EnvironmentDetail = () => {\n const { id } = useParams<{ id: string }>();\n const redirectTo = useRedirectTo();\n const { remove } = useRemoveBranding();\n const { items, isLoading: isLoadingClient } = useClients({ initialFilters: { clientIds: [id] } });\n const environment = items?.[0];\n\n const handleRemoveBranding = useCallback(() => {\n remove({ clientId: id });\n }, [id, remove]);\n\n if (!environment) {\n return <div>No data</div>;\n }\n\n return (\n <BackofficeContentContainer>\n <Container fixed maxWidth='sm'>\n <Typography variant={'h6'} sx={{ fontWeight: fontWeight['400'] }} display='flex' alignItems='center' gap={0.5}>\n <span>Environments</span>\n <IconChevronRight size='small' color='secondary' />\n <span>{environment.name}</span>\n </Typography>\n <Stack direction='row' mt={2} spacing={2} justifyContent='flex-end'>\n <Button\n variant='outlined'\n color='error'\n onClick={handleRemoveBranding}\n disabled={Boolean(!environment.branding)}\n >\n Remove branding\n </Button>\n <Button\n variant='outlined'\n onClick={() =>\n redirectTo(\n generatePath(\n environment.branding\n ? routes.BACKOFFICE_EDIT_ENVIRONMENT_BRANDING\n : routes.BACKOFFICE_CREATE_ENVIRONMENT_BRANDING,\n { id: environment.id },\n ),\n )\n }\n >\n {environment.branding ? 'Edit branding' : 'Add branding'}\n </Button>\n <Button\n variant='outlined'\n onClick={() => redirectTo(generatePath(routes.BACKOFFICE_EDIT_ENVIRONMENT, { id: environment.id }))}\n >\n Edit client\n </Button>\n </Stack>\n <Stack p={2} mt={2} component={Paper}>\n {isLoadingClient ? (\n <div>Loading...</div>\n ) : (\n <Stack spacing={2}>\n <Stack>\n <Typography variant='h5'>Client</Typography>\n <Stack spacing={1}>\n <Typography>\n <strong>ID: </strong>\n {environment.id}\n </Typography>\n <Typography>\n <strong>Name: </strong>\n {environment.name}\n </Typography>\n <Typography>\n <strong>City: </strong>\n {environment.city}\n </Typography>\n <Typography>\n <strong>Country: </strong>\n {environment.country}\n </Typography>\n </Stack>\n </Stack>\n <Stack>\n <Typography variant='h5'>Branding</Typography>\n {environment.branding ? (\n <Stack spacing={1}>\n <Typography>\n <strong>Display name: </strong>\n {environment.branding.displayName}\n </Typography>\n <Stack>\n <Typography>\n <strong>Favicon: </strong>\n </Typography>\n <Box component='img' src={environment.branding.faviconUrl} />\n </Stack>\n <Stack>\n <Typography>\n <strong>Navbar logo: </strong>\n </Typography>\n <Box component='img' src={environment.branding.navbarLogoUrl} />\n </Stack>\n <Stack>\n <Typography>\n <strong>Navbar logo collapsed: </strong>\n </Typography>\n <Box component='img' src={environment.branding.navbarCollapsedLogoUrl} />\n </Stack>\n <Stack>\n <Typography>\n <strong>Email logo: </strong>\n </Typography>\n <Box component='img' src={environment.branding.emailLogoUrl} />\n </Stack>\n </Stack>\n ) : (\n <div>No branding</div>\n )}\n </Stack>\n </Stack>\n )}\n </Stack>\n </Container>\n </BackofficeContentContainer>\n );\n};\n","import { Grid, GridProps, styled } from '@mui/material';\nimport { ReactNode } from 'react';\n\nconst EnvironmentItemContainer = styled(Grid)(() => ({\n display: 'flex',\n alignItems: 'center',\n}));\n\ninterface Props extends GridProps {\n children: ReactNode;\n}\n\nexport const EnvironmentItemColumn = ({ children, ...rest }: Props) => {\n return (\n <EnvironmentItemContainer item xs={3} {...rest}>\n {children}\n </EnvironmentItemContainer>\n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconEye = (props: Omit<SvgIconProps, 'children'>): JSX.Element => {\n return (\n <SvgIcon {...props}>\n <path d='M20.228 11.652a10.38 10.38 0 0 1-.721 1.112l-.089.119c-.052.071.114-.144.037-.048l-.041.053-.219.267-.431.475a10.3 10.3 0 0 1-.97.886l-.116.091c-.069.055.146-.112.048-.037l-.052.039-.281.203-.539.351a10.02 10.02 0 0 1-1.324.676l.164-.069a10.05 10.05 0 0 1-2.527.689l.183-.025c-.895.119-1.803.119-2.7 0l.183.025c-.87-.119-1.719-.352-2.527-.689l.164.069a10.39 10.39 0 0 1-1.182-.591l-.543-.342-.256-.178-.132-.098-.053-.039-.053-.039.087.066c-.352-.258-.678-.562-.984-.87l-.438-.468-.203-.237-.105-.128-.041-.053-.041-.053.066.087c-.315-.379-.58-.815-.819-1.242v.692c.217-.386.457-.755.721-1.112l.089-.119c.052-.071-.114.144-.037.048l.041-.053.219-.267.431-.475a10.19 10.19 0 0 1 .97-.886l.116-.091a.4.4 0 0 0-.048.037l.053-.039.281-.203.539-.352a10.06 10.06 0 0 1 1.324-.676l-.164.068a10.09 10.09 0 0 1 2.527-.689l-.183.025c.895-.119 1.803-.119 2.7 0l-.183-.025a10.09 10.09 0 0 1 2.527.689l-.164-.068c.406.171.801.37 1.182.591l.543.342.256.178.132.098.052.039.053.039-.087-.066c.351.256.678.562.984.87l.438.468.203.237.105.128.041.053.041.053-.066-.087c.315.379.58.815.819 1.244.176.313.63.443.936.247.315-.203.434-.603.247-.936a11.13 11.13 0 0 0-2.942-3.369 10.55 10.55 0 0 0-3.917-1.874 10.92 10.92 0 0 0-4.654-.098c-1.436.281-2.826.877-4.02 1.719a11.03 11.03 0 0 0-3.063 3.232c-.155.249-.349.518-.308.822.032.237.201.466.326.669a11.21 11.21 0 0 0 .648.925 10.59 10.59 0 0 0 1.479 1.571c1.146.986 2.477 1.735 3.922 2.18 1.47.452 3.036.564 4.559.361a10.62 10.62 0 0 0 4.189-1.497 11.15 11.15 0 0 0 3.235-3.079l.546-.87c.176-.313.084-.762-.247-.936-.32-.176-.746-.091-.934.242zm-6.234.344a2.85 2.85 0 0 1-.023.347l.025-.183a2.76 2.76 0 0 1-.183.68l.069-.164a2.74 2.74 0 0 1-.24.45l-.069.098c-.053.075.053-.066.053-.066-.002.014-.037.046-.048.057l-.171.187-.176.162-.057.048a.31.31 0 0 0 .069-.053l-.098.069a2.79 2.79 0 0 1-.463.249l.164-.069a2.83 2.83 0 0 1-.68.183l.183-.025a2.73 2.73 0 0 1-.696 0l.183.025c-.235-.032-.461-.094-.68-.183l.164.069c-.158-.066-.308-.146-.45-.24l-.098-.069c-.075-.052.066.053.066.053-.014-.002-.046-.037-.057-.048l-.187-.171-.162-.176-.048-.057a.32.32 0 0 0 .053.069l-.069-.098a2.79 2.79 0 0 1-.249-.463l.069.164a2.83 2.83 0 0 1-.183-.68l.025.183a2.73 2.73 0 0 1 0-.696l-.025.183a2.76 2.76 0 0 1 .183-.68l-.069.164a2.74 2.74 0 0 1 .24-.45l.068-.098c.053-.075-.052.066-.052.066.002-.014.037-.046.048-.057l.171-.187.176-.162.057-.048a.31.31 0 0 0-.069.052l.098-.068a2.74 2.74 0 0 1 .463-.249l-.164.069a2.83 2.83 0 0 1 .68-.183l-.183.025a2.7 2.7 0 0 1 .696 0L12.165 10c.235.032.461.094.68.183l-.164-.069c.158.066.308.146.45.24l.098.068c.075.053-.066-.052-.066-.052.014.002.046.036.057.048a2.69 2.69 0 0 1 .187.171l.162.176.048.057a.32.32 0 0 0-.053-.069l.069.098a2.79 2.79 0 0 1 .249.463l-.069-.164a2.83 2.83 0 0 1 .183.68l-.025-.183a3.59 3.59 0 0 1 .023.349c.002.358.313.701.685.685s.687-.301.685-.685c-.005-.667-.201-1.354-.589-1.899-.422-.591-.982-1.023-1.662-1.274a3.37 3.37 0 0 0-3.67.993 3.49 3.49 0 0 0-.797 1.956 3.33 3.33 0 0 0 .466 1.947c.336.559.849 1.043 1.445 1.313.683.308 1.406.397 2.143.253 1.301-.253 2.408-1.383 2.609-2.698.03-.196.055-.393.055-.591.002-.358-.317-.701-.685-.685-.374.016-.683.301-.685.685z' />\n </SvgIcon>\n );\n};\n","import { Grid, Typography } from '@mui/material';\nimport { generatePath } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport { IconEye } from 'shared/components/icons/icon-eye';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport { ListItem } from 'shared/components/list/list-item';\nimport { useRedirectTo } from 'shared/components/sidebar-layout/sidebar-menu/hooks/use-redirect-to';\nimport { Client } from 'shared/types/user/types';\n\nimport { EnvironmentItemColumn } from '../environment-item-column/EnvironmentItemColumn';\n\ninterface EnvironmentItemProps {\n environment: Client;\n}\n\nexport const EnvironmentItem = ({ environment }: EnvironmentItemProps) => {\n const redirectTo = useRedirectTo();\n const route = generatePath(routes.BACKOFFICE_EDIT_ENVIRONMENT, { id: environment.id });\n const hasBranding = environment.branding !== null;\n\n const options: MenuListOption[] = [\n {\n displayText: 'Show details',\n icon: <IconEye size='small' color='secondary' />,\n onClick: () => redirectTo(generatePath(routes.BACKOFFICE_ENVIRONMENT_DETAIL, { id: environment.id })),\n },\n {\n displayText: 'Edit client',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: () => redirectTo(route),\n },\n {\n displayText: hasBranding ? 'Edit branding' : 'Add branding',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: () =>\n redirectTo(\n generatePath(\n hasBranding ? routes.BACKOFFICE_EDIT_ENVIRONMENT_BRANDING : routes.BACKOFFICE_CREATE_ENVIRONMENT_BRANDING,\n { id: environment.id },\n ),\n ),\n },\n ];\n\n return (\n <ListItem\n key={environment.id}\n onClick={() => redirectTo(generatePath(routes.BACKOFFICE_ENVIRONMENT_DETAIL, { id: environment.id }))}\n >\n <Grid container>\n <EnvironmentItemColumn item xs={3}>\n <Typography variant='body2'>{environment.name}</Typography>\n </EnvironmentItemColumn>\n <EnvironmentItemColumn item xs={3}>\n <Typography variant='body2'>{environment.id}</Typography>\n </EnvironmentItemColumn>\n <EnvironmentItemColumn item xs={3}>\n <Typography variant='body2'>{environment.city}</Typography>\n </EnvironmentItemColumn>\n <EnvironmentItemColumn item xs={2}>\n <Typography variant='body2'>{environment.country}</Typography>\n </EnvironmentItemColumn>\n <EnvironmentItemColumn item xs={1}>\n <KebabMenu options={options} />\n </EnvironmentItemColumn>\n </Grid>\n </ListItem>\n );\n};\n","import { List } from 'shared/components/list';\nimport { Client } from 'shared/types/user/types';\n\nimport { EnvironmentItem } from '../environment-item/EnvironmentItem';\n\ninterface EnvironmentsListProps {\n environments: Client[];\n}\n\nexport const EnvironmentsList = ({ environments }: EnvironmentsListProps) => {\n const environmentItems = environments.map((environment) => (\n <EnvironmentItem key={environment.id} environment={environment} />\n ));\n\n return <List>{environmentItems}</List>;\n};\n","import { Box, Button, Grid, Stack, TextField, Typography } from '@mui/material';\nimport debounce from 'lodash/debounce';\nimport { ChangeEvent, useCallback } from 'react';\n\nimport { routes } from 'kognia/router/routes';\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport NotFound from 'shared/components/not-found';\nimport Pagination from 'shared/components/pagination';\nimport { useRedirectTo } from 'shared/components/sidebar-layout/sidebar-menu/hooks/use-redirect-to';\nimport Spinner from 'shared/components/spinner';\n\nimport { EnvironmentItemColumn } from './components/environment-item-column/EnvironmentItemColumn';\nimport { EnvironmentsList } from './components/environments-list/EnvironmentsList';\nimport { useClients } from '../../../../api/backoffice/client/hooks/use-clients/useClients';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\n\nconst DEBOUNCE_TIME = 300;\n\nexport const Environments = () => {\n const { items, page, fetchNextPage, isFetching, setFilters } = useClients();\n const redirectTo = useRedirectTo();\n\n const handleCreateEnvironment = useCallback(() => redirectTo(routes.BACKOFFICE_CREATE_ENVIRONMENT), [redirectTo]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleSearchChange = useCallback(\n debounce((event: ChangeEvent<HTMLInputElement>) => {\n if (event.target.value.length === 1) return;\n setFilters({ name: event.target.value });\n }, DEBOUNCE_TIME),\n [setFilters],\n );\n\n return (\n <BackofficeContentContainer>\n <Stack direction='row' alignItems='center' justifyContent='space-between' marginBottom={2}>\n <Typography variant='h4'>Environments</Typography>\n <Button\n variant='contained'\n size='large'\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n onClick={handleCreateEnvironment}\n >\n New environment\n </Button>\n </Stack>\n\n <Stack marginBottom={2} justifyContent='flex-end' direction='row'>\n <TextField size='small' placeholder='Search environments' onChange={handleSearchChange} />\n </Stack>\n\n <ListHeader>\n <Grid container>\n <EnvironmentItemColumn item xs={3}>\n <Typography variant='body2'>Name</Typography>\n </EnvironmentItemColumn>\n <EnvironmentItemColumn item xs={3}>\n <Typography variant='body2'>ID</Typography>\n </EnvironmentItemColumn>\n <EnvironmentItemColumn item xs={3}>\n <Typography variant='body2'>City</Typography>\n </EnvironmentItemColumn>\n <EnvironmentItemColumn item xs={2}>\n <Typography variant='body2'>Country</Typography>\n </EnvironmentItemColumn>\n <EnvironmentItemColumn item xs={1}>\n <Typography variant='body2'>Action</Typography>\n </EnvironmentItemColumn>\n </Grid>\n </ListHeader>\n {!isFetching && items.length === 0 ? (\n <Box marginTop={4}>\n <NotFound header={'No results'} />\n </Box>\n ) : null}\n {isFetching ? <Spinner isFullPage /> : null}\n {items.length > 0 ? (\n <Box sx={{ py: 1 }}>\n <EnvironmentsList environments={items} />\n </Box>\n ) : null}\n {page ? (\n <Pagination\n total={page.totalElements}\n displayed={items.length}\n onShowMore={fetchNextPage}\n getStatsText={(displayed, total) => `${displayed} of ${total} environments`}\n />\n ) : null}\n </BackofficeContentContainer>\n );\n};\n","import { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { GameApi, MetaDataPlayerApi } from './types';\nimport { MetadataGamesApiResponse } from './use-metadata-games/types';\nimport { Coach } from '../../types/coaches';\nimport { MetadataGame, MetadataGamePlayer, MetadataTeam } from '../../types/games';\nimport { CoachApi } from '../coaches/types';\nimport { transformSeason } from '../seasons/transformers';\nimport { TeamApi } from '../teams/types';\n\nexport const transformMetadataTeam = (team: TeamApi): MetadataTeam => ({\n id: team.uuid,\n name: team.name,\n abbreviation: team.abbreviation,\n logoUrl: team.logo_url,\n teamType: team.team_type,\n countryCode: team.country_code,\n});\n\nexport const transformMetadataCoach = (coach: CoachApi | null): Coach | undefined => {\n if (!coach) return undefined;\n\n return {\n id: coach.uuid,\n name: coach.name,\n photoUrl: coach.photo_url,\n };\n};\n\nconst transformMetadataPlayer = (player: MetaDataPlayerApi): MetadataGamePlayer => {\n return {\n id: player.player_uuid,\n name: player.player_name,\n jerseyNumber: player.jersey_number,\n photoUrl: player.player_photo_url,\n side: player.side,\n position: player.position,\n teamId: player.team_uuid,\n };\n};\n\nexport const transformMetadataGame = (item: GameApi): MetadataGame => ({\n id: item.uuid,\n name: item.name,\n duration: item.duration,\n homeTeamScore: item.home_team_score,\n awayTeamScore: item.away_team_score,\n date: item.date ?? undefined,\n pitchLength: item.pitch_length,\n pitchWidth: item.pitch_width,\n homePenaltyScore: item.home_penalty_score,\n awayPenaltyScore: item.away_penalty_score,\n matchEndType: item.match_end_type,\n homeTeam: transformMetadataTeam(item.home_team),\n awayTeam: transformMetadataTeam(item.away_team),\n homeCoach: transformMetadataCoach(item.home_coach),\n awayCoach: transformMetadataCoach(item.away_coach),\n venue: item.venue\n ? {\n id: item.venue.uuid,\n name: item.venue.name,\n city: item.venue.city,\n countryCode: item.venue.country_code,\n }\n : undefined,\n stage: {\n id: item.stage.uuid,\n name: item.stage.name,\n orderIndex: item.stage.order_index,\n },\n season: transformSeason(item.season),\n players: item.players.map(transformMetadataPlayer),\n recordings: item.recordings.map((recording) => ({\n clientIds: recording.client_ids,\n createdAt: recording.created_at,\n id: recording.uuid,\n recordingType: recording.recording_type,\n })),\n});\n\nconst transformMetadataGames = (items: GameApi[]): MetadataGame[] => items.map(transformMetadataGame);\n\nexport const transformMetadataGamesFromApiResponse = (response: MetadataGamesApiResponse) => ({\n data: {\n items: transformMetadataGames(response.data),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n});\n","import { useQueryClient, UseQueryResult } from '@tanstack/react-query';\n\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\n\nimport { MetadataGame } from '../../../types/games';\nimport { annotationApiUrls } from '../../routes';\nimport { transformMetadataGame } from '../transformers';\n\ntype Params = {\n gameId?: string;\n onSuccess?: (data: MetadataGame) => void;\n};\n\nexport const getMetadataGameQueryKey = (gameId?: string) => ['metadata-game', gameId ?? ''];\n\nexport const useMetadataGame = ({ gameId }: Params): UseQueryResult<MetadataGame> => {\n return useFetchRequest<MetadataGame>({\n queryRef: getMetadataGameQueryKey(gameId),\n url: `${annotationApiUrls.GAMES}/${gameId ?? ''}`,\n transformer: transformMetadataGame,\n options: {\n enabled: gameId !== undefined,\n keepPreviousData: true,\n },\n });\n};\n\nexport const useInvalidateMetadataGame = () => {\n const queryClient = useQueryClient();\n\n return (gameId: string) => queryClient.invalidateQueries({ queryKey: getMetadataGameQueryKey(gameId) });\n};\n","import { useQueryClient } from '@tanstack/react-query';\n\nimport { useInfinityQuery } from 'api/hooks/useInfinityQuery';\nimport { InfinityQueryResult } from 'api/hooks/useInfinityQuery/types';\nimport { SortDirection } from 'shared/types/filters/types';\n\nimport { MetadataGamesApiResponse } from './types';\nimport { MetadataGame } from '../../../types/games';\nimport { getGamesUrl } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { transformMetadataGamesFromApiResponse } from '../transformers';\nimport { GamesFilters } from '../types';\n\nconst QUERY_KEY = 'metadata-games';\n\nexport const useMetadataGames = (): InfinityQueryResult<MetadataGame, GamesFilters> => {\n const { isAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n\n return useInfinityQuery<MetadataGame, GamesFilters, MetadataGamesApiResponse>({\n generateUrl: getGamesUrl,\n key: QUERY_KEY,\n options: {\n size: 10,\n sort: 'name',\n sortDirection: SortDirection.DESC,\n keepPreviousData: true,\n },\n transformer: transformMetadataGamesFromApiResponse,\n queryOptions: {\n enabled: isAllowedBackofficeOrigin,\n },\n });\n};\n\nexport const useInvalidateMetadataGames = () => {\n const queryClient = useQueryClient();\n\n return () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });\n};\n","import { useQueryClient } from '@tanstack/react-query';\n\nimport { useInfinityQuery } from 'api/hooks/useInfinityQuery';\nimport { InfinityQueryResult } from 'api/hooks/useInfinityQuery/types';\nimport { SortDirection } from 'shared/types/filters/types';\n\nimport { transformMetadataRecordingsFromApiResponse } from './transformer';\nimport { MetadataRecordingsApiFilters, MetadataRecordingsApiResponse } from './types';\nimport { MetadataRecording } from '../../../types/recordings';\nimport { getRecordingsUrl } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\n\nconst QUERY_KEY = 'metadata-recordings';\n\nexport const useMetadataRecordings = (): InfinityQueryResult<MetadataRecording, MetadataRecordingsApiFilters> => {\n const { isAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n\n return useInfinityQuery<MetadataRecording, MetadataRecordingsApiFilters, MetadataRecordingsApiResponse>({\n generateUrl: getRecordingsUrl,\n key: QUERY_KEY,\n options: {\n size: 10,\n sort: 'name',\n sortDirection: SortDirection.DESC,\n },\n transformer: transformMetadataRecordingsFromApiResponse,\n queryOptions: {\n enabled: isAllowedBackofficeOrigin,\n },\n });\n};\n\nexport const useInvalidateMetadataRecordings = () => {\n const queryClient = useQueryClient();\n\n return () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { CreateRecordingApiParams } from './types';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateMetadataRecordings } from '../use-metadata-recordings';\n\ninterface RequestData {\n data: CreateRecordingApiParams;\n onSuccess?: () => void;\n}\n\nexport const useCreateMetadataRecording = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateRecordings = useInvalidateMetadataRecordings();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Recording created',\n errorMessage: (data) => metadataApiErrorParser(data, 'Recording creation error'),\n onSuccess: invalidateRecordings,\n });\n\n const create = ({ data, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: annotationApiUrls.RECORDINGS,\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, create };\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { UpdateRecording } from './types';\nimport { MetadataGame } from '../../../types/games';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { GameApi } from '../types';\nimport { useInvalidateMetadataGames } from '../use-metadata-games';\n\ninterface RequestData {\n data: UpdateRecording;\n id: string;\n onSuccess?: () => void;\n}\n\nexport const useUpdateRecording = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateMetadataGames = useInvalidateMetadataGames();\n const mutationRequest = useMutationRequest<GameApi, MetadataGame, MetadataApiErrorResponse>({\n type: HTTPMethod.PATCH,\n successMessage: 'Recording updated',\n errorMessage: (data) => metadataApiErrorParser(data, 'Recording update error'),\n onSuccess: invalidateMetadataGames,\n });\n\n const update = ({ data, id, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.RECORDINGS}/${id}`,\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, update };\n};\n","import { Box, ListItem, styled } from '@mui/material';\nimport { Colors, fontWeight } from 'kognia-ui';\n\nexport const GameListHeaderGrid = styled(Box)(({ theme }) => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '.5fr 1fr 1fr 32px',\n alignItems: 'center',\n gridGap: theme.spacing(),\n}));\n\nexport const GridListItem = styled(ListItem)(({ theme }) => ({\n display: 'grid',\n flexDirection: 'row',\n borderBottom: `1px solid ${Colors.iron}`,\n '& *': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n paddingRight: theme.spacing(0.5),\n },\n '& label': {\n fontWeight: fontWeight['500'],\n },\n '&:last-child': {\n borderBottom: 0,\n },\n}));\n","import { styled } from '@mui/material';\n\nimport { GridListItem } from '../../styled';\n\nexport const GridListItemRecording = styled(GridListItem)(() => ({\n gridTemplateColumns: '1fr 1fr 24px',\n}));\n","import { Box, Button, Fade, Stack } from '@mui/material';\nimport { useState } from 'react';\n\nimport IconEdit from 'shared/components/icons/icon-edit';\n\nimport { useInvalidateMetadataGame } from '../../../../api/games/use-metadata-game';\nimport { useUpdateRecording } from '../../../../api/games/use-update-recording';\nimport { SelectClients } from '../../../../components/select-clients';\nimport { MetadataRecordingSummary } from '../../../../types/recordings';\nimport { GridListItemRecording } from '../grid-list-item-recording';\n\nexport const GamerRecording = ({ recording, gameId }: { gameId: string; recording: MetadataRecordingSummary }) => {\n const invalidateMetadataGame = useInvalidateMetadataGame();\n\n const { update: updateRecording } = useUpdateRecording();\n const [clientIds, setClientIds] = useState<string[]>(recording.clientIds);\n const [isEditing, setIsEditing] = useState(false);\n\n const handleCancel = () => {\n setIsEditing(false);\n setClientIds(recording.clientIds);\n };\n\n const handleSave = () => {\n updateRecording({\n data: { client_ids: clientIds, uuid: recording.id },\n id: recording.id,\n onSuccess: () => {\n setIsEditing(false);\n invalidateMetadataGame(gameId);\n },\n });\n };\n\n if (isEditing) {\n return (\n <Fade in>\n <Stack gap={2} sx={{ padding: 2 }}>\n <Box>{recording.id}</Box>\n <SelectClients clientIds={clientIds} onChange={setClientIds} />\n <Stack direction={'row'} gap={1} justifyContent={'flex-end'}>\n <Button variant='outlined' color='secondary' onClick={handleCancel}>\n Cancel\n </Button>\n <Button variant='contained' onClick={handleSave}>\n Save\n </Button>\n </Stack>\n </Stack>\n </Fade>\n );\n }\n\n return (\n <GridListItemRecording key={recording.id}>\n <Box>{recording.id}</Box>\n <Stack>\n {recording.clientIds.map((clientId) => (\n <Box key={clientId}>{clientId}</Box>\n ))}\n </Stack>\n <Box>\n <IconEdit isButton onClick={() => setIsEditing(true)} />\n </Box>\n </GridListItemRecording>\n );\n};\n","import { Box, Card, CardContent, List, Stack, Typography } from '@mui/material';\nimport { Colors, fontWeight } from 'kognia-ui';\n\nimport { MetadataRecordingSummary } from '../../../../types/recordings';\nimport { GamerRecording } from '../game-recording';\nimport { GridListItemRecording } from '../grid-list-item-recording';\n\ntype Props = {\n recordings: MetadataRecordingSummary[];\n gameId: string;\n};\n\nexport const GameRecordingsList = ({ recordings, gameId }: Props) => {\n return (\n <Card>\n <CardContent>\n <Stack gap={1}>\n <Typography variant='h6'>Recordings</Typography>\n <List>\n <GridListItemRecording sx={{ fontWeight: fontWeight['500'], background: Colors.background }}>\n <Box>Id</Box>\n <Box>client Id</Box>\n </GridListItemRecording>\n {recordings.map((recording) => (\n <GamerRecording gameId={gameId} key={recording.id} recording={recording} />\n ))}\n </List>\n </Stack>\n </CardContent>\n </Card>\n );\n};\n","const isValidDate = (data: Date) => {\n return data instanceof Date && !isNaN(data.getTime());\n};\n\nexport function generateRecordingId(dateStr: string, homeAbb: string, awayAbb: string) {\n const date = new Date(dateStr);\n\n if (!isValidDate(date)) return '';\n\n const year = date.getFullYear();\n let month = (date.getMonth() + 1).toString();\n let day = date.getDate().toString();\n\n month = month.padStart(2, '0');\n day = day.padStart(2, '0');\n\n return `${year}-${month}-${day}-${homeAbb}-${awayAbb}`;\n}\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { Button, DialogActions, DialogContent, FormControl, Stack, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport { useCallback } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\n\nimport { DialogButtonContainer } from 'shared/components/dialog/dialog-button-container';\nimport { DialogHeader } from 'shared/components/dialog/dialog-header';\nimport { FormInputField } from 'shared/components/form/form-input-field';\nimport IconKeypad from 'shared/components/icons/icon-keypad';\n\nimport { useInvalidateMetadataGame } from '../../../../../../api/games/use-metadata-game';\nimport { useInvalidateMetadataGames } from '../../../../../../api/games/use-metadata-games';\nimport { useCreateMetadataRecording } from '../../../../../../api/recordings/use-create-metadata-recording';\nimport { SelectClients } from '../../../../../../components/select-clients';\nimport { MetadataGame } from '../../../../../../types/games';\nimport { GameRecordingsList } from '../../../game-recordings-list';\nimport { NewRecordingForm, NewRecordingFormFieldsNames, newRecordingSchema } from '../index';\nimport { generateRecordingId } from '../utils';\n\ntype Props = {\n game: MetadataGame;\n onSuccess: () => void;\n onCancel: (event: React.MouseEvent<HTMLElement>) => void;\n};\n\nconst DEFAULT_RECORDING_TYPE = 'game';\n\nexport const AddRecordingIdDialogForm = ({ game, onSuccess, onCancel }: Props) => {\n const { create } = useCreateMetadataRecording();\n const invalidateMetadataGames = useInvalidateMetadataGames();\n const invalidateMetadataGame = useInvalidateMetadataGame();\n const {\n register,\n formState: { isValid },\n handleSubmit: handleFormSubmit,\n control,\n } = useForm<NewRecordingForm>({\n resolver: zodResolver(newRecordingSchema),\n defaultValues: {},\n });\n\n const handleSubmit = useCallback(\n (data: NewRecordingForm) => {\n create({\n data: {\n recording_type: DEFAULT_RECORDING_TYPE,\n client_ids: data.clientIds,\n uuid: data.id,\n fixture_uuid: game.id,\n },\n onSuccess: () => {\n invalidateMetadataGame(game.id);\n invalidateMetadataGames();\n onSuccess();\n },\n });\n },\n [onSuccess, invalidateMetadataGame, game, create, invalidateMetadataGames],\n );\n\n const hasRecordingIds = game && game?.recordings?.length > 0;\n const defaultRecordingId = game\n ? generateRecordingId(game.date ?? '', game.homeTeam.abbreviation, game.awayTeam.abbreviation)\n : '';\n\n return (\n <form onSubmit={handleFormSubmit(handleSubmit)}>\n <DialogHeader icon={<IconKeypad size='small' />}>Add Recording Id</DialogHeader>\n <DialogContent>\n <Stack gap={2}>\n <FormInputField\n label='Recording ID'\n id={NewRecordingFormFieldsNames.id}\n defaultChecked\n {...register(NewRecordingFormFieldsNames.id)}\n fullWidth\n placeholder={`yyyy-mm-dd-${game.homeTeam.abbreviation}-${game.awayTeam.abbreviation}`}\n defaultValue={hasRecordingIds ? '' : defaultRecordingId}\n size='small'\n />\n\n <FormControl fullWidth>\n <Controller\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <SelectClients clientIds={value ?? []} onChange={onChange} />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </>\n )}\n name={NewRecordingFormFieldsNames.clientIds}\n control={control}\n />\n </FormControl>\n {game && game.recordings.length > 0 ? (\n <GameRecordingsList gameId={game.id} recordings={game.recordings} />\n ) : null}\n </Stack>\n </DialogContent>\n <DialogActions>\n <DialogButtonContainer>\n <Button variant='outlined' color='secondary' onClick={onCancel}>\n <span>Cancel</span>\n </Button>\n </DialogButtonContainer>\n <DialogButtonContainer>\n <Button type={'submit'} variant='contained' color='primary' disabled={!isValid}>\n <span>Add</span>\n </Button>\n </DialogButtonContainer>\n </DialogActions>\n </form>\n );\n};\n","import { Alert } from '@mui/material';\nimport React from 'react';\nimport { TypeOf, z } from 'zod';\n\nimport { Dialog } from 'shared/components/dialog';\n\nimport { AddRecordingIdDialogForm } from './add-recording-id-dialog-form';\nimport { useMetadataGame } from '../../../../../api/games/use-metadata-game';\n\ntype Props = {\n setIsOpen: (isOpen: boolean) => void;\n isOpen: boolean;\n gameId: string;\n};\n\nexport enum NewRecordingFormFieldsNames {\n clientIds = 'clientIds',\n id = 'id',\n}\n\nexport const newRecordingSchema = z.object({\n [NewRecordingFormFieldsNames.clientIds]: z.array(z.string()),\n [NewRecordingFormFieldsNames.id]: z.string().trim().min(2),\n});\n\nexport type NewRecordingForm = TypeOf<typeof newRecordingSchema>;\n\nexport const AddRecordingIdDialog = ({ setIsOpen, gameId, isOpen }: Props) => {\n const { data: game, isLoading } = useMetadataGame({ gameId });\n const handleCancel = (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setIsOpen(false);\n };\n\n return (\n <Dialog open={isOpen} maxWidth='sm' fullWidth onClose={handleCancel}>\n {!game && !isLoading ? <Alert severity='error'>Game not found</Alert> : null}\n {game ? (\n <AddRecordingIdDialogForm game={game} onSuccess={() => setIsOpen(false)} onCancel={handleCancel} />\n ) : null}\n </Dialog>\n );\n};\n","import { ListItem, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const GamesListItem = styled(ListItem)(({ theme }) => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '.5fr 1fr 1fr 32px',\n borderBottom: `1px solid ${Colors.iron}`,\n padding: `${theme.spacing(1, 2, 1, 3)} !important`,\n gridGap: theme.spacing(),\n}));\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateMetadataGames } from '../use-metadata-games';\n\ninterface DeleteMetadataGameOptions {\n id: string;\n onSuccess?: () => void;\n}\n\ntype Options = {\n successMessage?: string;\n};\n\nexport const useDeleteMetadataGame = ({ successMessage }: Options = { successMessage: 'Game deleted' }) => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateMetadataGames = useInvalidateMetadataGames();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.DELETE,\n successMessage: successMessage,\n errorMessage: (data) => metadataApiErrorParser(data, 'Game delete error'),\n onSuccess: invalidateMetadataGames,\n });\n\n const deleteMetadataGame = ({ id, onSuccess }: DeleteMetadataGameOptions) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.GAMES}/${id}`,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, deleteMetadataGame };\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\ninterface PlayerPhotoSkeletonProps {\n small?: boolean;\n}\n\nexport const PlayerPhotoSkeletonContainer = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'small',\n})<PlayerPhotoSkeletonProps>(({ small }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: Colors.iron,\n width: small ? '36px' : '120px',\n height: small ? '36px' : '120px',\n borderRadius: '50%',\n border: `4px solid ${Colors.athens}`,\n}));\n","import { IconUser } from 'shared/components/icons/icon-user';\n\nimport { PlayerPhotoSkeletonContainer } from './styled';\n\ninterface Props {\n small?: boolean;\n}\n\nexport const PlayerPhotoSkeleton = ({ small }: Props) => {\n return (\n <PlayerPhotoSkeletonContainer small={small}>\n <IconUser color='secondary' size={small ? 'xsmall' : 'medium'} />\n </PlayerPhotoSkeletonContainer>\n );\n};\n","import { Avatar, Stack, Typography } from '@mui/material';\nimport { Colors, fontWeight } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\nimport { generatePath, useHistory } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport ConfirmDialog from 'shared/components/confirm-dialog';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport { IconEye } from 'shared/components/icons/icon-eye';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport { useDates } from 'shared/hooks/use-dates';\n\nimport { AddRecordingIdDialog } from './add-recording-id-dialog';\nimport { GamesListItem } from './styled';\nimport { useDeleteMetadataGame } from '../../../../api/games/use-delete-metadata-game';\nimport { MetadataGame } from '../../../../types/games';\nimport { PlayerPhotoSkeleton } from '../../../players/components/player-photo-skeleton';\n\ninterface Props {\n game: MetadataGame;\n}\n\nexport const GameItem = ({ game }: Props) => {\n const { dateToString } = useDates();\n const history = useHistory();\n const [isRecordingDialogOpen, setIsRecordingDialogOpen] = useState(false);\n const [isConfirmDeleteDialogOpen, setIsConfirmDeleteDialogOpen] = useState(false);\n const { deleteMetadataGame } = useDeleteMetadataGame();\n\n const handleDeleteGame = useCallback(() => {\n deleteMetadataGame({ id: game.id });\n }, [game.id, deleteMetadataGame]);\n\n const options: MenuListOption[] = [\n {\n displayText: 'View game details',\n icon: <IconEye size='small' color='secondary' />,\n onClick: () => history.push(generatePath(routes.BACKOFFICE_GAME_SUMMARY, { id: game.id })),\n },\n {\n displayText: 'Edit game',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: () => history.push(generatePath(routes.BACKOFFICE_EDIT_GAME_FORM, { id: game.id })),\n },\n {\n displayText: 'Add Recording ID',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: () => setIsRecordingDialogOpen(true),\n },\n {\n displayText: 'Delete',\n icon: <IconDelete size='small' color='secondary' />,\n onClick: () => setIsConfirmDeleteDialogOpen(true),\n isHidden: game.recordings.length > 0,\n },\n ];\n\n const hasRecordings = game.recordings.length > 0;\n\n return (\n <>\n <GamesListItem key={game.id} sx={{ background: hasRecordings ? 'transparent' : Colors.athens }}>\n <Stack gap={1}>\n <Stack direction={'row'} gap={2} alignItems={'center'}>\n {game.homeTeam.logoUrl ? <Avatar src={game.homeTeam.logoUrl} /> : <PlayerPhotoSkeleton small />}\n <Typography fontWeight={fontWeight['500']}>{game.homeTeamScore}</Typography>\n <Typography fontWeight={fontWeight['500']}>-</Typography>\n <Typography fontWeight={fontWeight['500']}>{game.awayTeamScore}</Typography>\n {game.awayTeam.logoUrl ? <Avatar src={game.awayTeam.logoUrl} /> : <PlayerPhotoSkeleton small />}\n </Stack>\n {!hasRecordings ? (\n <Stack alignItems={'center'} direction={'row'} gap={1} sx={{ color: Colors.storm }}>\n No recording id\n </Stack>\n ) : null}\n </Stack>\n <Stack>\n <Typography fontWeight={fontWeight['500']} textTransform={'uppercase'}>\n {game.homeTeam.abbreviation} - {game.awayTeam.abbreviation}\n </Typography>\n <Typography color={Colors.storm}>{game.season?.competition?.name}</Typography>\n </Stack>\n <Stack>\n <Typography fontWeight={fontWeight['500']} textTransform={'uppercase'}>\n {game.date ? dateToString(game.date) : '-'}\n </Typography>\n <Typography color={Colors.storm}>{game.stage?.name}</Typography>\n </Stack>\n <KebabMenu options={options} />\n </GamesListItem>\n {isRecordingDialogOpen ? (\n <AddRecordingIdDialog isOpen={isRecordingDialogOpen} setIsOpen={setIsRecordingDialogOpen} gameId={game.id} />\n ) : null}\n <ConfirmDialog\n type={'warning'}\n title={`You sure you want delete \"${game.name}\" game?`}\n cancelLabel={'Cancel'}\n confirmLabel={'Delete'}\n onConfirm={handleDeleteGame}\n isOpen={isConfirmDeleteDialogOpen}\n setIsOpen={setIsConfirmDeleteDialogOpen}\n />\n </>\n );\n};\n","import { List } from '@mui/material';\n\nimport { MetadataGame } from '../../../../types/games';\nimport { GameItem } from '../metadata-game-item';\n\ninterface Props {\n games: MetadataGame[];\n}\n\nexport const GamesList = ({ games }: Props) => {\n const gamesItems = games.map((game) => {\n return <GameItem key={game.id} game={game} />;\n });\n\n return <List>{gamesItems}</List>;\n};\n","import { atom } from 'recoil';\n\nimport { NewGameData } from './types';\n\nexport const newGameData = atom<NewGameData | undefined>({\n key: 'game-form',\n default: undefined,\n});\n","import { useCallback, useEffect } from 'react';\nimport { generatePath, matchPath, useHistory, useParams } from 'react-router-dom';\nimport { useRecoilState, useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil';\n\nimport { routes } from 'kognia/router/routes';\nimport { MatchTeamTypes } from 'shared/types/teams/types';\n\nimport { newGameData } from './atoms';\nimport { GameInfoSchema } from './forms';\nimport { GameFormRouteParams, NewGameTeam } from './types';\n\nexport const NEW_GAMES_STEPS = ['home-team', 'away-team', 'game-info'] as const;\n\nexport const NEW_GAME_FORM_STEPS = [\n routes.BACKOFFICE_GAME_FORM_STEP_1,\n routes.BACKOFFICE_GAME_FORM_STEP_2,\n routes.BACKOFFICE_GAME_FORM_STEP_3,\n routes.BACKOFFICE_NEW_GAME_SUMMARY,\n];\n\nexport const FORM_IDS = ['home-team-form', 'opponent-team-form', 'game-info-form'];\n\nexport const getCurrentStepFromPathName = (pathname: string) => {\n if (matchPath(pathname, NEW_GAME_FORM_STEPS[0])) return 0;\n if (matchPath(pathname, NEW_GAME_FORM_STEPS[1])) return 1;\n if (matchPath(pathname, NEW_GAME_FORM_STEPS[2])) return 2;\n if (matchPath(pathname, NEW_GAME_FORM_STEPS[3])) return 3;\n\n return 0;\n};\nexport const useIsCreateGameStepValid = () => {\n const gameData = useRecoilValue(newGameData);\n\n return useCallback(\n (step: number) => {\n if (step === 0) return true;\n if (gameData && gameData[MatchTeamTypes.HOME] && step === 1) return true;\n if (gameData && gameData[MatchTeamTypes.HOME] && gameData[MatchTeamTypes.OPPONENT] && step === 2) return true;\n\n return false;\n },\n [gameData],\n );\n};\n\nexport const useIsUpdateCreateGameStepValid = () => {\n const gameData = useRecoilValue(newGameData);\n\n return useCallback(() => {\n return Boolean(gameData && gameData[MatchTeamTypes.HOME] && gameData[MatchTeamTypes.OPPONENT] && gameData.gameInfo);\n }, [gameData]);\n};\n\nexport const useCheckValidateStep = (step: number) => {\n const { id } = useParams<GameFormRouteParams>();\n const history = useHistory();\n const checkIsCreateGameStepValid = useIsCreateGameStepValid();\n const checkIsUpdateGameStepValid = useIsUpdateCreateGameStepValid();\n\n useEffect(() => {\n !id &&\n !checkIsCreateGameStepValid(step) &&\n history.replace(generatePath(routes.BACKOFFICE_GAME_FORM_STEP_1, { id }));\n id && !checkIsUpdateGameStepValid() && history.replace(generatePath(routes.BACKOFFICE_EDIT_GAME_FORM, { id }));\n }, [id, checkIsUpdateGameStepValid, checkIsCreateGameStepValid, step, history]);\n};\n\nexport function useTeamData(teamType: MatchTeamTypes): NewGameTeam | undefined {\n const gameData = useRecoilValue(newGameData);\n\n return gameData ? gameData[teamType] : undefined;\n}\n\nexport function useGameInfo(): GameInfoSchema | undefined {\n const gameData = useRecoilValue(newGameData);\n\n return gameData ? gameData.gameInfo : undefined;\n}\n\nexport function useSetTeamData(teamType: MatchTeamTypes) {\n const setNewGameData = useSetRecoilState(newGameData);\n\n return useCallback(\n (teamData: NewGameTeam) => {\n setNewGameData((gameData) => {\n return { ...gameData, [teamType]: teamData };\n });\n },\n [teamType, setNewGameData],\n );\n}\n\nexport function useResetGameFormData() {\n return useResetRecoilState(newGameData);\n}\n\nexport function useSetGameInfo() {\n useResetRecoilState(newGameData);\n const [gameData, setNewGameData] = useRecoilState(newGameData);\n\n return useCallback(\n (gameInfo: GameInfoSchema) => setNewGameData({ ...gameData, gameInfo }),\n [gameData, setNewGameData],\n );\n}\n\nexport function useSetGameData() {\n return useSetRecoilState(newGameData);\n}\n","import { Box, Button, CardContent, Stack, TextField, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport debounce from 'lodash/debounce';\nimport { ChangeEvent, useCallback } from 'react';\nimport { generatePath, useHistory } from 'react-router-dom';\n\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport NotFound from 'shared/components/not-found';\nimport Pagination from 'shared/components/pagination';\n\nimport { GamesList } from './components/metadata-game-list';\nimport { useResetGameFormData } from './game-form/config';\nimport { GameListHeaderGrid } from './styled';\nimport { routes } from '../../../../kognia/router/routes';\nimport { useMetadataGames } from '../../api/games/use-metadata-games';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { ListSkeleton } from '../../components/list-skeleton';\n\nconst DEBOUNCE_TIME = 300;\n\nexport const Games = () => {\n const history = useHistory();\n const resetFormData = useResetGameFormData();\n const { items, page, fetchNextPage, isFetching, setFilters } = useMetadataGames();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleSearchChange = useCallback(\n debounce((event: ChangeEvent<HTMLInputElement>) => {\n setFilters({ name: event.target.value });\n }, DEBOUNCE_TIME),\n [setFilters],\n );\n\n return (\n <BackofficeContentContainer>\n <Stack direction='row' alignItems='center' justifyContent='space-between' marginBottom={2}>\n <Typography variant='h4'>Games</Typography>\n <Button\n variant='contained'\n size='large'\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n onClick={() => {\n resetFormData();\n history.push(generatePath(routes.BACKOFFICE_GAME_FORM_STEP_1, { id: undefined }));\n }}\n >\n New game\n </Button>\n </Stack>\n\n <CardContent>\n <>\n <Stack marginBottom={2} justifyContent='flex-end' direction='row'>\n <TextField size='small' placeholder='Search games' onChange={handleSearchChange} />\n </Stack>\n\n <ListHeader>\n <GameListHeaderGrid>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Score\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Teams\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Event\n </Typography>\n <div>&nbsp;</div>\n </GameListHeaderGrid>\n </ListHeader>\n {!isFetching && items.length === 0 ? (\n <Box marginTop={4}>\n <NotFound header={'No results'} />\n </Box>\n ) : null}\n\n {isFetching && !Boolean(items.length > 0) ? <ListSkeleton /> : <GamesList games={items} />}\n\n {page ? (\n <Pagination\n total={page.totalElements}\n displayed={items.length}\n onShowMore={fetchNextPage}\n getStatsText={(displayed, total) => `${displayed} of ${total} games`}\n />\n ) : null}\n </>\n </CardContent>\n </BackofficeContentContainer>\n );\n};\n","import { useEffect } from 'react';\nimport { generatePath, useHistory, useParams } from 'react-router-dom';\n\nimport { MatchTeamTypes } from 'shared/types/teams/types';\n\nimport { routes } from '../../../../../kognia/router/routes';\nimport { useMetadataGame } from '../../../api/games/use-metadata-game';\nimport { useSetGameData } from '../game-form/config';\nimport { GameFormRouteParams } from '../game-form/types';\n\nexport const EditGame = () => {\n const history = useHistory();\n const { id } = useParams<GameFormRouteParams>();\n\n const {\n data: game,\n isLoading,\n isSuccess,\n } = useMetadataGame({\n gameId: id,\n });\n\n const setHomeTeamMetaData = useSetGameData();\n\n useEffect(() => {\n if (game && isSuccess) {\n const homeTeam = {\n team: game.homeTeam,\n players: game.players.filter((p) => p.teamId === game.homeTeam.id),\n };\n const awayTeam = {\n team: game.awayTeam,\n players: game.players.filter((p) => p.teamId === game.awayTeam.id),\n };\n\n const gameInfo = {\n name: game.name,\n date: game.date,\n scoreHomeTeam: game.homeTeamScore,\n scoreOpponentTeam: game.awayTeamScore,\n duration: game.duration,\n season: game.season,\n venue: game.venue,\n stageId: game.stage.id,\n pitchLength: game.pitchLength,\n pitchWidth: game.pitchWidth,\n homeCoach: game.homeCoach,\n awayCoach: game.awayCoach,\n };\n\n setHomeTeamMetaData({\n [MatchTeamTypes.HOME]: homeTeam,\n [MatchTeamTypes.OPPONENT]: awayTeam,\n gameInfo,\n });\n\n history.replace(generatePath(routes.BACKOFFICE_GAME_FORM_STEP_1, { id: game.id }));\n }\n }, [isSuccess, history, game, isLoading, setHomeTeamMetaData]);\n\n if (isSuccess && !game) return <div>Game not found</div>;\n return null;\n};\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\n\nimport { PlayerPositions, PlayerSides } from '../../types/players';\nimport { annotationApiUrls } from '../routes';\n\nexport type PlayersMappings = {\n positions: PlayerPositions;\n sides: PlayerSides;\n};\n\nexport interface PlayerPositionOrSideApi {\n name: string;\n value: number;\n}\n\ntype PlayersMappingsApi = {\n positions: PlayerPositionOrSideApi[];\n sides: PlayerPositionOrSideApi[];\n};\n\nconst transformMappings = (response: PlayersMappingsApi): PlayersMappings => {\n return {\n positions: response.positions.reduce<PlayerPositions>(\n (acc, position) => ({\n ...acc,\n [position.value]: position.name,\n }),\n {},\n ),\n sides: response.sides.reduce<PlayerSides>((acc, side) => ({ ...acc, [side.value]: side.name }), {}),\n };\n};\n\nexport const usePlayersMappings = (): UseQueryResult<PlayersMappings> => {\n return useFetchRequest<PlayersMappings>({\n queryRef: ['metadata-players-mappings'],\n url: annotationApiUrls.MAPPINGS,\n transformer: transformMappings,\n options: {\n staleTime: Infinity,\n },\n });\n};\n","import { Card, CardContent, CardHeader, Divider, List, Stack, styled, Typography } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\nimport { useEffect } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { BackofficeContentContainer } from 'pages/backoffice/components/backoffice-content-container';\nimport Spinner from 'shared/components/spinner';\nimport { TeamLogo } from 'shared/components/team-logo';\nimport { useDates } from 'shared/hooks/use-dates';\n\nimport { useMetadataGame } from '../../../../../api/games/use-metadata-game';\nimport { usePlayersMappings } from '../../../../../api/use-players-mappings';\nimport { MetadataGamePlayer, MetadataTeam } from '../../../../../types/games';\nimport { printSeasonName } from '../../../../../utils/print-season-name';\nimport { GameRecordingsList } from '../../../components/game-recordings-list';\nimport { GridListItem } from '../../../styled';\nimport { useResetGameFormData } from '../../config';\nimport { GameFormRouteParams } from '../../types';\n\ntype Props = {\n team: MetadataTeam;\n players: MetadataGamePlayer[];\n};\n\nconst GridListItemTeamPlayer = styled(GridListItem)(() => ({\n gridTemplateColumns: '1fr 1fr 1fr 1fr',\n}));\n\nconst TeamCard = ({ team, players }: Props) => {\n const { data: mappings } = usePlayersMappings();\n\n return (\n <Card sx={{ flex: 1 }}>\n <CardContent>\n <Stack gap={2}>\n <Stack spacing={2}>\n <Stack direction={'row'} spacing={1} alignItems={'center'}>\n <TeamLogo src={team.logoUrl} name={team.name} />\n <Typography sx={{ color: Colors.night, fontSize: fontSizes.large }}>{team.name}</Typography>\n <Typography sx={{ color: Colors.storm, fontSize: fontSizes.small }}>({team.abbreviation})</Typography>\n <Divider />\n </Stack>\n <Stack gap={1}>\n <List>\n <GridListItemTeamPlayer sx={{ fontWeight: fontWeight['500'], background: Colors.background }}>\n <Typography sx={{ fontWeight: fontWeight['500'] }}>Number</Typography>\n <Typography sx={{ fontWeight: fontWeight['500'] }}>Player name</Typography>\n <Typography sx={{ fontWeight: fontWeight['500'] }}>Position</Typography>\n <Typography sx={{ fontWeight: fontWeight['500'] }}>Side</Typography>\n </GridListItemTeamPlayer>\n {players.map((player) => (\n <GridListItemTeamPlayer key={player.id}>\n <Typography>{player.jerseyNumber}</Typography>\n <Typography>{player.name}</Typography>\n <Typography>\n {mappings && player.position !== undefined && player.position >= 0\n ? `${mappings.positions[player.position]} (${player.position})`\n : ''}\n </Typography>\n <Typography>\n {mappings && player.side !== undefined && player.side >= 0\n ? `${mappings.sides[player.side]} (${player.side})`\n : ''}\n </Typography>\n </GridListItemTeamPlayer>\n ))}\n </List>\n </Stack>\n </Stack>\n </Stack>\n </CardContent>\n </Card>\n );\n};\n\nconst GridListItemPlayer = styled(GridListItem)(() => ({\n gridTemplateColumns: '1fr 1fr 1fr auto',\n}));\n\nexport const GameSummary = () => {\n const { dateAndTimeToString } = useDates();\n const { id } = useParams<GameFormRouteParams>();\n const { data, isLoading } = useMetadataGame({ gameId: id });\n const resetGameFormData = useResetGameFormData();\n\n useEffect(() => {\n resetGameFormData();\n }, [resetGameFormData]);\n\n if (isLoading || !data) {\n return (\n <Stack justifyContent={'center'} alignItems={'center'} sx={{ padding: 4 }}>\n <Spinner />\n </Stack>\n );\n }\n return (\n <BackofficeContentContainer>\n <Stack gap={2}>\n <Typography variant={'h5'}>{data.name}</Typography>\n <Stack direction={'row'} gap={2}>\n <TeamCard team={data.homeTeam} players={data.players.filter((p) => p.teamId === data.homeTeam.id)} />\n <TeamCard team={data.awayTeam} players={data.players.filter((p) => p.teamId === data.awayTeam.id)} />\n </Stack>\n <Card>\n <CardHeader title={'Game details'} />\n <CardContent>\n <List>\n <GridListItemPlayer>\n <label>Name</label>\n <Typography>{data.name}</Typography>\n </GridListItemPlayer>\n <GridListItemPlayer>\n <label>Date</label>\n <Typography>{data.date ? dateAndTimeToString(data.date) : '-'}</Typography>\n </GridListItemPlayer>\n <GridListItemPlayer>\n <label>Season</label>\n <Typography>{printSeasonName(data.season)}</Typography>\n </GridListItemPlayer>\n <GridListItemPlayer>\n <label>Stage</label>\n <Typography>{data.stage.name}</Typography>\n </GridListItemPlayer>\n <GridListItemPlayer>\n <label>Score</label>\n <Typography>\n {data.homeTeamScore} : {data.awayTeamScore}\n </Typography>\n </GridListItemPlayer>\n <GridListItemPlayer>\n <label>Penalty score</label>\n <Typography>\n {data.homePenaltyScore} : {data.awayPenaltyScore}\n </Typography>\n </GridListItemPlayer>\n <GridListItemPlayer>\n <label>Duration</label>\n <Typography>{data.duration}</Typography>\n </GridListItemPlayer>\n <GridListItemPlayer>\n <label>Home team coach</label>\n <Typography>{data.homeCoach ? data.homeCoach.name : '-'}</Typography>\n </GridListItemPlayer>\n <GridListItemPlayer>\n <label>Away team coach</label>\n <Typography>{data.awayCoach ? data.awayCoach.name : '-'}</Typography>\n </GridListItemPlayer>\n <GridListItemPlayer>\n <label>Pitch Size</label>\n <Typography>\n {data.pitchLength} x {data.pitchWidth}\n </Typography>\n </GridListItemPlayer>\n <GridListItemPlayer>\n <label>Match end type</label>\n <Typography>{data.matchEndType}</Typography>\n </GridListItemPlayer>\n {data.venue ? (\n <GridListItemPlayer>\n <label>Venue</label>\n <Typography>{data.venue.name}</Typography>\n </GridListItemPlayer>\n ) : null}\n </List>\n </CardContent>\n </Card>\n {data && data.recordings.length > 0 ? (\n <GameRecordingsList gameId={data.id} recordings={data.recordings} />\n ) : null}\n </Stack>\n </BackofficeContentContainer>\n );\n};\n","import { Button, Stack, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport { generatePath, useHistory, useParams } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\n\nimport { FORM_IDS, NEW_GAME_FORM_STEPS, NEW_GAMES_STEPS } from '../../config';\nimport { GameFormRouteParams } from '../../types';\n\ntype Props = {\n step: number;\n};\n\nconst BackButton = styled(Button)({\n background: Colors.white,\n});\n\nexport const GameFormNavigation = ({ step }: Props) => {\n const { id } = useParams<GameFormRouteParams>();\n\n const history = useHistory();\n const handleSubmitCurrentForm = () => {\n const form = document.getElementById(FORM_IDS[step]) as HTMLFormElement;\n form?.requestSubmit();\n };\n\n const handleBackButton = () => {\n if (step > 0) history.push(generatePath(NEW_GAME_FORM_STEPS[step - 1], { id: id ?? undefined }));\n };\n\n const finishAction = id ? 'Save' : 'Create';\n\n return (\n <Stack\n direction={'row'}\n alignItems={'center'}\n justifyContent={'center'}\n gap={2}\n sx={{\n padding: 2,\n height: '80px',\n background: Colors.athens,\n bottom: 0,\n left: 0,\n maxWidth: '100%',\n }}\n >\n {step === 3 ? (\n <>\n <Button\n size={'large'}\n variant='contained'\n color='info'\n onClick={() => history.push(generatePath(routes.BACKOFFICE_GAME_FORM_STEP_1, { id: id ?? undefined }))}\n sx={{ padding: 2, width: '200px' }}\n >\n Edit\n </Button>\n <Button\n size={'large'}\n variant='contained'\n color='info'\n onClick={() => history.push(routes.BACKOFFICE_GAMES)}\n sx={{ padding: 2, width: '200px' }}\n >\n Go to games list\n </Button>\n </>\n ) : (\n <>\n {step !== 0 ? (\n <BackButton\n size={'large'}\n variant='outlined'\n color='secondary'\n disabled={step === 0}\n onClick={handleBackButton}\n sx={{ padding: 2, width: '200px' }}\n >\n Back\n </BackButton>\n ) : null}\n\n <Button\n onClick={handleSubmitCurrentForm}\n type={'submit'}\n size={'large'}\n variant={'contained'}\n color={'primary'}\n sx={{ padding: 2, width: '200px' }}\n >\n {step === Object.keys(NEW_GAMES_STEPS).length - 1 ? finishAction : 'Next'}\n </Button>\n </>\n )}\n </Stack>\n );\n};\n","import { Grid, Step, StepLabel, Stepper } from '@mui/material';\n\nimport { NEW_GAMES_STEPS } from '../../config';\n\ntype Props = {\n step: number;\n};\n\nconst LABELS = {\n ['home-team']: 'Home Team',\n ['away-team']: 'Away Team',\n ['game-info']: 'Game Info',\n};\n\nexport default function GameFormStepper({ step }: Props) {\n return (\n <Grid container justifyContent={'center'}>\n <Grid item lg={10} xl={8}>\n <Stepper activeStep={step} alternativeLabel>\n {NEW_GAMES_STEPS.map((label, idx) => {\n return (\n <Step key={label} completed={idx < step}>\n <StepLabel>{LABELS[label]}</StepLabel>\n </Step>\n );\n })}\n </Stepper>\n </Grid>\n </Grid>\n );\n}\n","import { Box } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\nimport { PropsWithChildren } from 'react';\n\ntype Props = {\n label: string;\n};\n\nexport const TextsWithFieldHoverLabel = ({ children, label }: PropsWithChildren<Props>) => {\n return (\n <Box sx={{ position: 'relative' }}>\n {children}\n <Box\n sx={{\n position: 'absolute',\n width: '30%',\n height: '40px ',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'right',\n top: 0,\n right: 0,\n paddingRight: 1,\n color: Colors.storm,\n textTransform: 'capitalize',\n fontSize: fontSizes.medium,\n }}\n >\n {label}\n </Box>\n </Box>\n );\n};\n","import { Stack } from '@mui/material';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { MetadataGame } from '../../../types/games';\nimport { addUpdatePlayersToGamesUrl } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { transformMetadataGame } from '../transformers';\nimport { GameApi } from '../types';\n\ntype PlayerParam = {\n jersey_number: number;\n side: number | undefined;\n position: number | undefined;\n player_uuid: string;\n team_uuid: string;\n};\n\ninterface RequestData {\n players: PlayerParam[];\n gameId: string;\n onSuccess?: (data: MetadataGame) => void;\n onError?: () => void;\n}\n\ntype MetadataAddPlayerToGamesApiError = {\n loc: [string, string, number, string];\n msg: string;\n type: string;\n};\n\nexport type MetadataAddPlayerToGamesApiErrorResponse = {\n detail: MetadataAddPlayerToGamesApiError[] | string;\n};\n\nexport const addPlayersToGameErrorParser = (\n data: MetadataAddPlayerToGamesApiErrorResponse | undefined,\n fallbackErrorMessage: string,\n) => {\n if (!data) return fallbackErrorMessage;\n\n if (typeof data.detail === 'string') {\n return data.detail;\n }\n\n return data ? (\n <Stack>\n {data.detail.map((error, idx) => (\n <div key={idx}>{`${error.msg}: Player ${error.loc[2]} ${error.loc[3]}`}</div>\n ))}\n </Stack>\n ) : (\n fallbackErrorMessage\n );\n};\n\ntype Options = {\n successMessage?: string;\n};\n\nexport const useAddPlayersToGame = ({ successMessage }: Options = { successMessage: 'Players added to game' }) => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<GameApi, MetadataGame, MetadataAddPlayerToGamesApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: successMessage,\n errorMessage: (data) => addPlayersToGameErrorParser(data, 'Adding players to game error'),\n transformer: transformMetadataGame,\n });\n\n const create = ({ gameId, players, onSuccess, onError }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: addUpdatePlayersToGamesUrl(gameId),\n data: { players },\n },\n {\n onSuccess,\n onError,\n },\n );\n };\n\n return { ...mutationRequest, create };\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { CreateGameApiParams } from './types';\nimport { MetadataGame } from '../../../types/games';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { transformMetadataGame } from '../transformers';\nimport { GameApi } from '../types';\nimport { useInvalidateMetadataGames } from '../use-metadata-games';\n\ninterface RequestData {\n data: CreateGameApiParams;\n onSuccess?: (game: MetadataGame) => void;\n}\n\nexport const useCreateMetadataGame = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateGames = useInvalidateMetadataGames();\n const mutationRequest = useMutationRequest<GameApi, MetadataGame, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n errorMessage: (data) => metadataApiErrorParser(data, 'Game creation error'),\n onSuccess: invalidateGames,\n transformer: transformMetadataGame,\n });\n\n const create = ({ data, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: annotationApiUrls.GAMES,\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, create };\n};\n","export enum MatchEndType {\n NORMAL_TIME = 'Normal Time',\n EXTENDED_TIME = 'Extended Time',\n GOLDEN_GOAL_RULE = 'Golden Goal Rule',\n PENALTY_SHOOT_OUT = 'Penalty Shoot-Out',\n}\n","import { useCallback } from 'react';\n\nimport { useAddPlayersToGame } from '../../../../../../api/games/use-add-players-to-game';\nimport { useCreateMetadataGame } from '../../../../../../api/games/use-create-metadata-game';\nimport { useDeleteMetadataGame } from '../../../../../../api/games/use-delete-metadata-game';\nimport { MetadataGame } from '../../../../../../types/games';\nimport { MatchEndType } from '../../../../../../types/shared';\nimport { GameInfoSchema } from '../../../forms';\nimport { NewGameTeam } from '../../../types';\n\nexport const useCreateNewGameWithPlayers = (onSuccess: (game: MetadataGame) => void) => {\n const { create } = useCreateMetadataGame();\n const { deleteMetadataGame } = useDeleteMetadataGame({ successMessage: undefined });\n const { create: addPlayersToGame } = useAddPlayersToGame({ successMessage: 'Game created' });\n\n return useCallback(\n (gameInfo: GameInfoSchema, homeTeam: NewGameTeam, awayTeam: NewGameTeam) => {\n create({\n data: {\n name: gameInfo.name,\n duration: gameInfo.duration,\n home_team_score: gameInfo.scoreHomeTeam,\n away_team_score: gameInfo.scoreOpponentTeam,\n pitch_length: gameInfo.pitchLength,\n pitch_width: gameInfo.pitchWidth,\n home_penalty_score: 0,\n away_penalty_score: 0,\n match_end_type: MatchEndType.NORMAL_TIME,\n home_team_uuid: homeTeam?.team.id ?? '',\n away_team_uuid: awayTeam?.team.id ?? '',\n stage_uuid: gameInfo.stageId,\n ...(gameInfo?.homeCoach?.id ? { home_coach_uuid: gameInfo.homeCoach.id } : {}),\n ...(gameInfo?.awayCoach?.id ? { away_coach_uuid: gameInfo.awayCoach.id } : {}),\n ...(gameInfo.venue ? { venue_uuid: gameInfo.venue.id } : {}),\n ...(gameInfo.date ? { date: gameInfo.date } : {}),\n },\n onSuccess: (game: MetadataGame) => {\n addPlayersToGame({\n onSuccess: () => {\n onSuccess(game);\n },\n onError: () => {\n deleteMetadataGame({ id: game.id });\n },\n gameId: game.id,\n players: [\n ...homeTeam.players.map((p) => ({\n jersey_number: p.jerseyNumber ?? 0,\n side: p.side,\n position: p.position,\n player_uuid: p.id,\n team_uuid: homeTeam.team.id,\n })),\n ...awayTeam.players.map((p) => ({\n jersey_number: p.jerseyNumber ?? 0,\n side: p.side,\n position: p.position,\n player_uuid: p.id,\n team_uuid: awayTeam.team.id,\n })),\n ],\n });\n },\n });\n },\n [deleteMetadataGame, addPlayersToGame, create, onSuccess],\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\n\ninterface DeleteMetadataGameOptions {\n data: { gameId: string };\n onSuccess?: () => void;\n}\n\nexport const useDeleteMetadataGamePlayers = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.DELETE,\n errorMessage: (data) => metadataApiErrorParser(data, 'Delete game players error'),\n });\n\n const deleteMetadataGamePlayers = ({ data, onSuccess }: DeleteMetadataGameOptions) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.GAME_PLAYERS(data.gameId)}`,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, deleteMetadataGamePlayers };\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { UpdateMetadataGameApiParams } from './types';\nimport { MetadataGame } from '../../../types/games';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { transformMetadataGame } from '../transformers';\nimport { GameApi } from '../types';\nimport { useInvalidateMetadataGames } from '../use-metadata-games';\n\ninterface RequestData {\n data: UpdateMetadataGameApiParams;\n id: string;\n onSuccess?: () => void;\n}\n\nexport const useUpdateMetadataGame = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateMetadataGames = useInvalidateMetadataGames();\n const mutationRequest = useMutationRequest<GameApi, MetadataGame, MetadataApiErrorResponse>({\n type: HTTPMethod.PATCH,\n successMessage: 'Game updated',\n errorMessage: (data) => metadataApiErrorParser(data, 'Game update error'),\n onSuccess: invalidateMetadataGames,\n transformer: transformMetadataGame,\n });\n\n const update = ({ data, id, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.GAMES}/${id}`,\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, update };\n};\n","import { useCallback } from 'react';\n\nimport { useAddPlayersToGame } from '../../../../../../api/games/use-add-players-to-game';\nimport { useDeleteMetadataGamePlayers } from '../../../../../../api/games/use-delete-metadata-game-players';\nimport { useInvalidateMetadataGame } from '../../../../../../api/games/use-metadata-game';\nimport { useUpdateMetadataGame } from '../../../../../../api/games/use-update-metadata-game';\nimport { MetadataGame } from '../../../../../../types/games';\nimport { MatchEndType } from '../../../../../../types/shared';\nimport { GameInfoSchema } from '../../../forms';\nimport { NewGameTeam } from '../../../types';\n\nexport const useUpdateNewGameWithPlayers = (onSuccess: (game: MetadataGame) => void) => {\n const { update } = useUpdateMetadataGame();\n const { create: addPlayersToGame } = useAddPlayersToGame();\n const { deleteMetadataGamePlayers } = useDeleteMetadataGamePlayers();\n const invalidateMetadataGame = useInvalidateMetadataGame();\n\n const handleAddNewPlayerToGame = useCallback(\n (gameId: string, homeTeam: NewGameTeam, awayTeam: NewGameTeam, onSuccess: (data: any) => void) =>\n addPlayersToGame({\n gameId,\n players: [\n ...homeTeam.players.map((p) => ({\n jersey_number: p.jerseyNumber ?? 0,\n side: p.side,\n position: p.position,\n player_uuid: p.id,\n team_uuid: homeTeam.team.id,\n })),\n ...awayTeam.players.map((p) => ({\n jersey_number: p.jerseyNumber ?? 0,\n side: p.side,\n position: p.position,\n player_uuid: p.id,\n team_uuid: awayTeam.team.id,\n })),\n ],\n onSuccess: (data: MetadataGame) => {\n onSuccess(data);\n },\n }),\n [addPlayersToGame],\n );\n\n return useCallback(\n (gameId: string, gameInfo: GameInfoSchema, homeTeam: NewGameTeam, awayTeam: NewGameTeam) => {\n update({\n id: gameId,\n data: {\n name: gameInfo.name,\n duration: gameInfo.duration,\n home_team_score: gameInfo.scoreHomeTeam,\n away_team_score: gameInfo.scoreOpponentTeam,\n pitch_length: gameInfo.pitchLength,\n pitch_width: gameInfo.pitchWidth,\n home_penalty_score: 0,\n away_penalty_score: 0,\n match_end_type: MatchEndType.NORMAL_TIME,\n home_team_uuid: homeTeam?.team.id ?? '',\n away_team_uuid: awayTeam?.team.id ?? '',\n stage_uuid: gameInfo.stageId,\n ...(gameInfo?.homeCoach?.id ? { home_coach_uuid: gameInfo.homeCoach.id } : {}),\n ...(gameInfo?.awayCoach?.id ? { away_coach_uuid: gameInfo.awayCoach.id } : {}),\n ...(gameInfo.date ? { date: gameInfo.date } : {}),\n ...(gameInfo.venue ? { venue_uuid: gameInfo.venue.id } : {}),\n },\n onSuccess: () => {\n invalidateMetadataGame(gameId);\n },\n });\n\n deleteMetadataGamePlayers({\n data: { gameId: gameId },\n onSuccess: () => handleAddNewPlayerToGame(gameId, homeTeam, awayTeam, onSuccess),\n });\n },\n [invalidateMetadataGame, handleAddNewPlayerToGame, deleteMetadataGamePlayers, update, onSuccess],\n );\n};\n","import { Box, ClickAwayListener, ListItem, Stack } from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { RecordingCompetitionsFilters } from 'pages/backoffice/api/season-clients/use-recording-competitions/types';\nimport { Autocomplete } from 'shared/components/autocomplete';\nimport { AutocompleteDropdownButton } from 'shared/components/autocomplete-multi-select/components/autocomplete-dropdown-button';\nimport {\n AutocompletePopper,\n AutocompletePopperContent,\n} from 'shared/components/autocomplete-multi-select/components/autocomplete-popper';\nimport { AutocompletePopperWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-popper-wrapper';\nimport { AutocompleteResultsWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-results-wrapper';\n\nimport { useCoaches } from '../../api/coaches/use-coaches';\nimport { Coach } from '../../types/coaches';\nimport { RenderSelectOption } from '../select-components/render-option';\n\nconst INITIAL_RECORDING_COACHES_FILTERS: RecordingCompetitionsFilters = {\n name: '',\n};\n\ninterface Props {\n setCoachOnChange: (coach: Coach | undefined) => void;\n coach?: Coach;\n disabled?: boolean;\n}\n\nconst AUTOCOMPLETE_WIDTH = 400;\n\nexport const SelectCoach = ({ setCoachOnChange, coach }: Props) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [autocompleteValue, setAutocompleteValue] = useState<Coach | undefined>(coach);\n const { items: results, isLoading, setFilters, fetchNextPage } = useCoaches();\n const { t } = useTranslation();\n\n const isOpen = Boolean(anchorEl);\n\n const handleOpen = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setAutocompleteValue(coach || undefined);\n setAnchorEl(event.currentTarget);\n },\n [coach],\n );\n\n const handleClose = useCallback(() => {\n setFilters(INITIAL_RECORDING_COACHES_FILTERS);\n setAnchorEl(null);\n }, [setFilters]);\n\n const handleDropdownClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n isOpen ? handleClose() : handleOpen(event);\n },\n [isOpen, handleClose, handleOpen],\n );\n\n const handleSelectCoach = useCallback(() => {\n setAutocompleteValue((autocompleteValue) => {\n setCoachOnChange(autocompleteValue);\n return autocompleteValue;\n });\n handleClose();\n }, [setAutocompleteValue, setCoachOnChange, handleClose]);\n\n const handleSetName = useCallback(\n (name: string) => {\n setFilters({ name: name });\n },\n [setFilters],\n );\n\n const renderOption = useCallback((props: React.ComponentProps<typeof ListItem>, option: Coach) => {\n return <RenderSelectOption {...props} key={option.id} name={option.name} />;\n }, []);\n\n const handleApply = useCallback(() => {\n setAutocompleteValue((autocompleteValue) => {\n return autocompleteValue;\n });\n handleClose();\n }, [setAutocompleteValue, handleClose]);\n\n const handleReset = useCallback(() => {\n setAutocompleteValue(undefined);\n }, [setAutocompleteValue]);\n\n const paperComponent: React.JSXElementConstructor<React.HTMLAttributes<HTMLElement>> = useCallback(\n (props) => (\n <AutocompleteResultsWrapper {...props} onReset={handleReset} onApply={handleApply}>\n {props.children}\n </AutocompleteResultsWrapper>\n ),\n [handleReset, handleApply],\n );\n\n const handleUpdateValue = useCallback(\n (item: Coach | null) => {\n if (item === null) return;\n setAutocompleteValue(item);\n setCoachOnChange(item);\n handleClose();\n },\n [setAutocompleteValue, setCoachOnChange, handleClose],\n );\n\n const selectedValue = results.find((c) => autocompleteValue?.id === c.id) ?? autocompleteValue;\n\n return (\n <Stack direction={'column'} spacing={1}>\n <AutocompleteDropdownButton\n fullWidth\n isOpen={isOpen}\n onClick={handleDropdownClick}\n isSelected={Boolean(coach)}\n label={coach ? coach.name : 'Select coach'}\n />\n <Box>\n {anchorEl && (\n <ClickAwayListener onClickAway={handleSelectCoach}>\n <AutocompletePopper anchorEl={anchorEl} open={isOpen} placement='bottom-start'>\n <AutocompletePopperContent elevation={8}>\n <Autocomplete\n autoFocus\n PaperComponent={paperComponent}\n PopperComponent={AutocompletePopperWrapper}\n fetchNextPage={fetchNextPage}\n getItemLabel={(item) => item.name}\n inputWidth={AUTOCOMPLETE_WIDTH}\n isLoading={isLoading}\n listWidth={AUTOCOMPLETE_WIDTH}\n multiple={false}\n onChange={handleSetName}\n open\n options={results}\n renderOption={renderOption}\n placeholder={t('common:actions.search')}\n resultsHeight={260}\n updateValue={handleUpdateValue}\n value={selectedValue}\n />\n </AutocompletePopperContent>\n </AutocompletePopper>\n </ClickAwayListener>\n )}\n </Box>\n </Stack>\n );\n};\n","import { InfinityQueryDataResult } from 'api/hooks/useInfinityQuery/types';\nimport { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { Venue, VenueApi, VenuesApiResponse } from './types';\n\nconst transformData = (items: VenueApi[]): Venue[] => {\n return items.map((item) => ({\n id: item.uuid,\n name: item.name,\n city: item.city,\n countryCode: item.country_code,\n }));\n};\n\nexport const transformVenues = (response: VenuesApiResponse): InfinityQueryDataResult<Venue> => {\n return {\n data: {\n items: transformData(response.data),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n","import { useQueryClient } from '@tanstack/react-query';\n\nimport { useInfinityQuery } from 'api/hooks/useInfinityQuery';\nimport { InfinityQueryResult } from 'api/hooks/useInfinityQuery/types';\nimport { SortDirection } from 'shared/types/filters/types';\n\nimport { transformVenues } from './transformer';\nimport { Venue, VenuesApiResponse, VenuesFilters } from './types';\nimport { getVenuesUrl } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\n\nconst QUERY_KEY = 'venues';\n\nexport const useVenues = (): InfinityQueryResult<Venue, VenuesFilters> => {\n const { isAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n\n return useInfinityQuery<Venue, VenuesFilters, VenuesApiResponse>({\n generateUrl: getVenuesUrl,\n key: QUERY_KEY,\n options: {\n size: 10,\n sort: 'name',\n sortDirection: SortDirection.DESC,\n },\n transformer: transformVenues,\n queryOptions: {\n enabled: isAllowedBackofficeOrigin,\n },\n });\n};\n\nexport const useInvalidateVenues = () => {\n const queryClient = useQueryClient();\n\n return () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });\n};\n","import { Box, ClickAwayListener, ListItem, Stack } from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { RecordingCompetitionsFilters } from 'pages/backoffice/api/season-clients/use-recording-competitions/types';\nimport { Autocomplete } from 'shared/components/autocomplete';\nimport { AutocompleteDropdownButton } from 'shared/components/autocomplete-multi-select/components/autocomplete-dropdown-button';\nimport {\n AutocompletePopper,\n AutocompletePopperContent,\n} from 'shared/components/autocomplete-multi-select/components/autocomplete-popper';\nimport { AutocompletePopperWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-popper-wrapper';\nimport { AutocompleteResultsWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-results-wrapper';\n\nimport { useVenues } from '../../api/venues/use-venues';\nimport { Venue } from '../../api/venues/use-venues/types';\nimport { RenderSelectOption } from '../select-components/render-option';\n\nconst INITIAL_RECORDING_VENUES_FILTERS: RecordingCompetitionsFilters = {\n name: '',\n};\n\ninterface Props {\n setVenueOnChange: (venue: Venue | undefined) => void;\n venue?: Venue;\n disabled?: boolean;\n}\n\nconst AUTOCOMPLETE_WIDTH = 400;\n\nexport const SelectVenue = ({ setVenueOnChange, venue }: Props) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [autocompleteValue, setAutocompleteValue] = useState<Venue | undefined>(undefined);\n const { items: results, isLoading, setFilters, fetchNextPage } = useVenues();\n const { t } = useTranslation();\n\n const isOpen = Boolean(anchorEl);\n\n const open = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setAutocompleteValue(venue || undefined);\n setAnchorEl(event.currentTarget);\n },\n [venue],\n );\n\n const close = useCallback(() => {\n setFilters(INITIAL_RECORDING_VENUES_FILTERS);\n setAnchorEl(null);\n }, [setFilters]);\n\n const handleDropdownClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n isOpen ? close() : open(event);\n },\n [isOpen, close, open],\n );\n\n const handleSelectVenue = useCallback(() => {\n setAutocompleteValue((autocompleteValue) => {\n setVenueOnChange(autocompleteValue);\n return autocompleteValue;\n });\n close();\n }, [setAutocompleteValue, setVenueOnChange, close]);\n\n const handleSetName = useCallback(\n (name: string) => {\n setFilters({ name: name });\n },\n [setFilters],\n );\n\n const renderOption = useCallback((props: React.ComponentProps<typeof ListItem>, option: Venue) => {\n return <RenderSelectOption {...props} key={option.id} name={option.name} />;\n }, []);\n\n const handleApply = useCallback(() => {\n setAutocompleteValue((autocompleteValue) => {\n return autocompleteValue;\n });\n close();\n }, [setAutocompleteValue, close]);\n\n const handleReset = useCallback(() => {\n setAutocompleteValue(undefined);\n }, [setAutocompleteValue]);\n\n const paperComponent: React.JSXElementConstructor<React.HTMLAttributes<HTMLElement>> = useCallback(\n (props) => (\n <AutocompleteResultsWrapper {...props} onReset={handleReset} onApply={handleApply}>\n {props.children}\n </AutocompleteResultsWrapper>\n ),\n [handleReset, handleApply],\n );\n\n const handleUpdateValue = useCallback(\n (item: Venue | null) => {\n if (item === null) return;\n setAutocompleteValue(item.id ? item : undefined);\n setVenueOnChange(item.id ? item : undefined);\n close();\n },\n [setAutocompleteValue, setVenueOnChange, close],\n );\n\n return (\n <Stack direction={'column'} spacing={1}>\n <AutocompleteDropdownButton\n fullWidth\n isOpen={isOpen}\n onClick={handleDropdownClick}\n isSelected={Boolean(venue)}\n label={venue ? venue.name : 'Select venue'}\n />\n <Box>\n {anchorEl && (\n <ClickAwayListener onClickAway={handleSelectVenue}>\n <AutocompletePopper anchorEl={anchorEl} open={isOpen} placement='bottom-start'>\n <AutocompletePopperContent elevation={8}>\n <Autocomplete\n autoFocus\n PaperComponent={paperComponent}\n PopperComponent={AutocompletePopperWrapper}\n fetchNextPage={fetchNextPage}\n getItemLabel={(item) => item.name}\n inputWidth={AUTOCOMPLETE_WIDTH}\n isLoading={isLoading}\n isOptionEqualToValue={(option: Venue, value: Venue) => option.id === value?.id}\n listWidth={AUTOCOMPLETE_WIDTH}\n multiple={false}\n onChange={handleSetName}\n open\n options={[\n {\n id: '',\n name: 'No venue',\n city: '',\n countryCode: '',\n },\n ...results,\n ]}\n renderOption={renderOption}\n placeholder={t('common:actions.search')}\n resultsHeight={260}\n updateValue={handleUpdateValue}\n value={autocompleteValue}\n />\n </AutocompletePopperContent>\n </AutocompletePopper>\n </ClickAwayListener>\n )}\n </Box>\n </Stack>\n );\n};\n","import { useQueryClient } from '@tanstack/react-query';\n\nimport { useInfinityQuery } from 'api/hooks/useInfinityQuery';\nimport { InfinityQueryResult } from 'api/hooks/useInfinityQuery/types';\nimport { SortDirection } from 'shared/types/filters/types';\n\nimport { transformStagesResponse } from './transformer';\nimport { StagesApiFilters, StagesApiResponse } from './types';\nimport { Stage } from '../../../types/stages';\nimport { getStagesUrl } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\n\nconst QUERY_KEY = 'stages';\n\nexport const useStages = (): InfinityQueryResult<Stage, StagesApiFilters> => {\n const { isAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n\n return useInfinityQuery<Stage, StagesApiFilters, StagesApiResponse>({\n generateUrl: getStagesUrl,\n key: QUERY_KEY,\n options: {\n size: 10,\n sort: 'name',\n sortDirection: SortDirection.DESC,\n },\n transformer: transformStagesResponse,\n queryOptions: {\n enabled: isAllowedBackofficeOrigin,\n },\n });\n};\n\nexport const useInvalidateStages = () => {\n const queryClient = useQueryClient();\n\n return () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY] });\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { CreateStageApiParams } from './types';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateStages } from '../use-stages';\n\ninterface RequestData {\n data: CreateStageApiParams;\n seasonId: string;\n onSuccess?: () => void;\n}\n\nexport const useCreateStage = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateStages = useInvalidateStages();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Stage created',\n errorMessage: (data) => metadataApiErrorParser(data, 'Stage creation error'),\n onSuccess: invalidateStages,\n });\n\n const create = ({ data, onSuccess, seasonId }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: annotationApiUrls.SEASON_COMPETITIONS_STAGES(seasonId),\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, create };\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { UpdateStageApiParams } from './types';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateStages } from '../use-stages';\n\ninterface RequestData {\n data: UpdateStageApiParams;\n stageId: string;\n onSuccess?: () => void;\n}\n\nexport const useUpdateStage = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateStages = useInvalidateStages();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.PATCH,\n successMessage: 'Stage updated',\n errorMessage: (data) => metadataApiErrorParser(data, 'Stage update error'),\n onSuccess: invalidateStages,\n });\n\n const update = ({ data, stageId, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.STAGES}/${stageId}`,\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, update };\n};\n","import { TypeOf } from 'zod';\n\nimport { stageFormSchema } from './form';\nimport { Season } from '../../../../types/seasons';\n\nexport enum StageFormFieldsNames {\n id = 'id',\n name = 'name',\n orderIndex = 'orderIndex',\n season = 'season',\n parentStageId = 'parentStageId',\n}\n\nexport interface StageForm {\n [StageFormFieldsNames.id]?: string;\n [StageFormFieldsNames.name]: string;\n [StageFormFieldsNames.orderIndex]: number;\n [StageFormFieldsNames.season]?: Season;\n [StageFormFieldsNames.parentStageId]?: string;\n}\n\nexport type StageFormSchema = TypeOf<typeof stageFormSchema>;\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\n\nimport { Season } from '../../../types/seasons';\nimport { annotationApiUrls } from '../../routes';\nimport { transformSeason } from '../transformers';\n\ntype Params = {\n seasonId?: string;\n onSuccess?: (season: Season) => void;\n};\n\nexport const useSeason = ({ seasonId, onSuccess }: Params): UseQueryResult<Season> => {\n return useFetchRequest<Season>({\n queryRef: ['metadata-season', seasonId ?? ''],\n url: `${annotationApiUrls.SEASONS}/${seasonId ?? ''}`,\n transformer: transformSeason,\n options: {\n enabled: seasonId !== undefined,\n },\n onSuccess,\n });\n};\n","export const adjustOrderIndexForDisplay = (orderIndex: number) => {\n return orderIndex + 1;\n};\n","import { FormControl, Grid, TextField, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport { range } from 'lodash';\nimport React from 'react';\nimport { Control, Controller, Path, UseFormRegister, UseFormWatch, FieldErrors } from 'react-hook-form';\n\nimport { FormFormLabel } from 'shared/components/form/form-form-label';\nimport { FormSelectField } from 'shared/components/form/form-select-field';\nimport { getTypeOptions } from 'shared/components/form/get-type-options';\n\nimport { StageFormFieldsNames } from './types';\nimport { useSeason } from '../../../../api/seasons/use-season';\nimport { adjustOrderIndexForDisplay } from '../../utils';\nimport { SelectSeason } from '../select-season';\n\ninterface Props<TFormValues extends Record<string, any>> {\n register: UseFormRegister<TFormValues>;\n errors: FieldErrors<TFormValues>;\n watch: UseFormWatch<TFormValues>;\n control: Control<TFormValues>;\n}\n\nconst DEFAULT_ORDER_INDEX = 0;\n\nexport function StagesForm<StageFormSchema extends Record<string, any>>({\n control,\n register,\n errors,\n watch,\n}: Props<StageFormSchema>) {\n const { season: formSeason, parentStageId, id } = watch();\n const { data: season } = useSeason({ seasonId: formSeason?.id ?? undefined });\n\n return (\n <>\n <Grid container spacing={2}>\n <Grid item xs={12} sm={9}>\n <FormControl fullWidth margin='normal'>\n <FormFormLabel>Name</FormFormLabel>\n <TextField\n size='small'\n {...register(StageFormFieldsNames.name as Path<StageFormSchema>)}\n error={!!errors[StageFormFieldsNames.name]}\n helperText={errors[StageFormFieldsNames.name] && <>{errors[StageFormFieldsNames.name].message}</>}\n />\n </FormControl>\n <Controller\n name={StageFormFieldsNames.season as Path<StageFormSchema>}\n control={control}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <FormControl fullWidth>\n <FormFormLabel>Season</FormFormLabel>\n <SelectSeason setSeasonOnChange={onChange} season={value} />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </FormControl>\n )}\n />\n {season?.stages && season.stages.filter((stage) => stage.id !== id).length > 0 ? (\n <Grid item container spacing={2}>\n <Grid item>\n <FormFormLabel>Order</FormFormLabel>\n <Controller\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <FormSelectField\n id={StageFormFieldsNames.orderIndex}\n options={getTypeOptions({\n options: range(0, 50, 1).map((val) => ({\n value: val,\n label: adjustOrderIndexForDisplay(val).toString(),\n })),\n })}\n onChange={onChange}\n defaultValue={value ?? DEFAULT_ORDER_INDEX}\n fullWidth={true}\n />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </>\n )}\n name={StageFormFieldsNames.orderIndex as Path<StageFormSchema>}\n control={control}\n />\n </Grid>\n <Grid item>\n <FormFormLabel optional>Parent Stage</FormFormLabel>\n <FormSelectField\n id={StageFormFieldsNames.parentStageId}\n key={season.id}\n showNoneOption\n options={getTypeOptions({\n options: season.stages\n .filter((stage) => stage.id !== id)\n .map((stage) => ({\n value: stage.id,\n label: stage.name,\n })),\n })}\n error={!!errors[StageFormFieldsNames.parentStageId]}\n helperText={\n errors[StageFormFieldsNames.parentStageId] && (\n <>{errors[StageFormFieldsNames.parentStageId]?.message}</>\n )\n }\n defaultValue={season.stages.find((stage) => stage.id === parentStageId) ? parentStageId : ''}\n fullWidth={true}\n {...register(StageFormFieldsNames.parentStageId as Path<StageFormSchema>)}\n />\n </Grid>\n </Grid>\n ) : (\n <input\n type={'hidden'}\n value={DEFAULT_ORDER_INDEX}\n {...register(StageFormFieldsNames.orderIndex as Path<StageFormSchema>)}\n />\n )}{' '}\n </Grid>\n </Grid>\n </>\n );\n}\n","import { z } from 'zod';\n\nexport const numberTextField = z.preprocess((n) => {\n return n !== undefined && n !== '' && Number(n) >= 0 ? Number(n) : undefined;\n}, z.number());\n","import { z } from 'zod';\n\nimport { numberTextField } from 'shared/utils/zod/number-text-field';\n\nimport { StageFormFieldsNames } from './types';\nimport { SeasonSchema } from '../../../../types/seasons';\n\nexport const stageFormSchema = z.object({\n [StageFormFieldsNames.id]: z.string().optional(),\n [StageFormFieldsNames.name]: z.string().trim().min(2),\n [StageFormFieldsNames.orderIndex]: numberTextField,\n [StageFormFieldsNames.season]: SeasonSchema.optional(),\n [StageFormFieldsNames.parentStageId]: z.string().optional(),\n});\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { IconUser } from 'shared/components/icons/icon-user';\n\nimport { useCreateStage } from '../../api/stages/use-create-stage';\nimport { useUpdateStage } from '../../api/stages/use-update-stage';\nimport { StagesForm } from '../../pages/stages/components/stage-form';\nimport { stageFormSchema } from '../../pages/stages/components/stage-form/form';\nimport { StageForm, StageFormSchema } from '../../pages/stages/components/stage-form/types';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n defaultValues?: StageForm;\n onSuccess?: () => void;\n}\n\nconst stagesFormId = 'stages-form';\n\nexport const StageModal = ({ open, onClose, defaultValues, onSuccess }: Props) => {\n const formRef = useRef<HTMLFormElement>(null);\n const {\n register,\n control,\n formState: { errors },\n handleSubmit,\n watch,\n reset,\n } = useForm<StageFormSchema>({\n resolver: zodResolver(stageFormSchema),\n defaultValues,\n });\n\n const { create } = useCreateStage();\n const { update } = useUpdateStage();\n\n const handleCreate = useCallback(\n (data: StageForm, onSuccess?: () => void) => {\n if (!data.season) return;\n\n create({\n seasonId: data.season.id,\n data: {\n name: data.name,\n order_index: data.orderIndex,\n ...(data?.parentStageId ? { parent_stage_uuid: data.parentStageId } : {}),\n },\n onSuccess: () => {\n reset();\n onSuccess && onSuccess();\n onClose();\n },\n });\n },\n [create, onClose, reset],\n );\n\n const handleUpdate = useCallback(\n (data: StageForm, onSuccess?: () => void) => {\n if (!data?.id) return;\n if (!data.season) return;\n\n const { id, ...rest } = data;\n update({\n data: {\n name: rest.name,\n season_uuid: data.season.id,\n order_index: data.orderIndex,\n ...(rest?.parentStageId ? { parent_stage_uuid: rest.parentStageId } : {}),\n },\n stageId: id,\n onSuccess: () => {\n onSuccess && onSuccess();\n onClose();\n },\n });\n },\n [onClose, update],\n );\n\n const handleCreateOrUpdate = useCallback(\n (data: StageForm) => {\n if (defaultValues) {\n handleUpdate(data, onSuccess);\n } else {\n handleCreate(data, onSuccess);\n }\n },\n [defaultValues, handleCreate, handleUpdate, onSuccess],\n );\n\n return (\n <DialogNew\n maxWidth='sm'\n fullWidth\n title={defaultValues ? 'Edit stage' : 'New stage'}\n icon={<IconUser size='small' />}\n onCancel={onClose}\n onClose={onClose}\n buttonSubmitText={defaultValues ? 'Save' : 'Create'}\n open={open}\n buttonFormId={stagesFormId}\n >\n <form id={stagesFormId} ref={formRef} onSubmit={handleSubmit(handleCreateOrUpdate)}>\n <StagesForm<StageFormSchema> watch={watch} register={register} errors={errors} control={control} />\n </form>\n </DialogNew>\n );\n};\n","import { z } from 'zod';\n\nimport { Pagination } from 'shared/types/pagination/types';\n\nexport interface VenueApi {\n uuid: string;\n name: string;\n city: string;\n country_code: string;\n}\n\nexport type VenuesFilters = {\n name?: string;\n sort?: string;\n sortDirection?: string;\n};\n\nexport interface VenuesApiResponse {\n data: VenueApi[];\n page: Pagination;\n}\n\nexport const VenueSchema = z.object({\n id: z.string(),\n name: z.string(),\n city: z.string(),\n countryCode: z.string(),\n});\n\nexport type Venue = z.TypeOf<typeof VenueSchema>;\n","import { z } from 'zod';\n\nimport { Coach } from './coaches';\nimport { MetadataRecordingSummary } from './recordings';\nimport { Season } from './seasons';\nimport { MatchEndType } from './shared';\nimport { Venue } from '../api/venues/use-venues/types';\n\nexport const metadataTeamSchema = z.object({\n name: z.string(),\n abbreviation: z.string(),\n logoUrl: z.string().optional().nullable(),\n teamType: z.string(),\n countryCode: z.string().optional(),\n id: z.string(),\n});\n\nexport type MetadataTeam = z.TypeOf<typeof metadataTeamSchema>;\n\nexport const metadataGamePlayerSchema = z.object({\n jerseyNumber: z.number(),\n side: z.number().optional(),\n position: z.number().optional(),\n name: z.string(),\n id: z.string(),\n teamId: z.string(),\n photoUrl: z.string().optional().nullable(),\n});\n\nexport type MetadataGamePlayer = z.TypeOf<typeof metadataGamePlayerSchema>;\n\nexport type MetadataGame = {\n name: string;\n duration: number;\n homeTeamScore: number;\n awayTeamScore: number;\n date?: string;\n pitchLength: number;\n pitchWidth: number;\n homePenaltyScore: number;\n awayPenaltyScore: number;\n matchEndType: MatchEndType;\n id: string;\n homeTeam: MetadataTeam;\n awayTeam: MetadataTeam;\n homeCoach?: Coach;\n awayCoach?: Coach;\n venue?: Venue;\n stage: {\n name: string;\n orderIndex: number;\n id: string;\n };\n season: Season;\n players: MetadataGamePlayer[];\n recordings: MetadataRecordingSummary[];\n};\n","import { z } from 'zod';\n\nexport const playerFixtureTeamSchema = z.object({\n name: z.string(),\n abbreviation: z.string(),\n logoUrl: z.string().optional().nullable(),\n teamType: z.string(),\n country: z.string().optional().nullable(),\n id: z.string(),\n});\n\nexport const playerFixtureSchema = z.object({\n jerseyNumber: z.number(),\n side: z.number().optional(),\n name: z.string(),\n date: z.string(),\n position: z.number().optional(),\n id: z.string(),\n homeTeamScore: z.number(),\n awayTeamScore: z.number(),\n team: playerFixtureTeamSchema,\n});\n\nexport type PlayerFixture = z.TypeOf<typeof playerFixtureSchema>;\n\nexport const playerSummarySchema = z.object({\n id: z.string(),\n name: z.string(),\n photoUrl: z.string().optional().nullable(),\n fixtures: z.array(playerFixtureSchema).optional(),\n position: z.number().optional(),\n side: z.number().optional(),\n jerseyNumber: z.number().optional(),\n});\n\nexport type MetadataPlayerSummary = z.TypeOf<typeof playerSummarySchema>;\n\nexport type MetadataPlayersApiFilters = {\n name?: string;\n sort?: string;\n sortDirection?: string;\n};\n\nexport type PlayerPositions = { [key in number]: string };\nexport type PlayerSides = { [key in number]: string };\n","import { TypeOf, z } from 'zod';\n\nimport { numberTextField } from 'shared/utils/zod/number-text-field';\n\nimport { VenueSchema } from '../../../api/venues/use-venues/types';\nimport { metadataTeamSchema } from '../../../types/games';\nimport { playerSummarySchema } from '../../../types/players';\nimport { SeasonSchema } from '../../../types/seasons';\n\nexport enum TeamFormFieldsNames {\n team = 'team',\n players = 'players',\n}\n\nexport const gameTeamFormSchema = z.object({\n [TeamFormFieldsNames.team]: metadataTeamSchema,\n [TeamFormFieldsNames.players]: z\n .array(playerSummarySchema)\n .min(1, { message: 'Players selection is required' })\n .refine(\n (players) => {\n const jerseyNumbers = players.map((player) => player.jerseyNumber);\n return jerseyNumbers.length === new Set(jerseyNumbers).size;\n },\n { message: 'Duplicated jersey numbers are not allowed' },\n )\n .refine(\n (players) => {\n return players.every((player) => player.jerseyNumber !== 0);\n },\n (val) => {\n const playerNames = val.filter((player) => player.jerseyNumber === 0).map((player) => player.name);\n return { message: `Incorrect jersey number (0) for players (${playerNames})` };\n },\n ),\n});\n\nexport type TeamFormFormSchema = TypeOf<typeof gameTeamFormSchema>;\n\nexport enum GameInfoFormFieldsNames {\n name = 'name',\n date = 'date',\n startTime = 'startTime',\n scoreHomeTeam = 'scoreHomeTeam',\n scoreOpponentTeam = 'scoreOpponentTeam',\n duration = 'duration',\n venue = 'venue',\n season = 'season',\n stageId = 'stageId',\n pitchLength = 'pitchLength',\n pitchWidth = 'pitchWidth',\n homeCoach = 'homeCoach',\n awayCoach = 'awayCoach',\n}\n\nexport enum CoachFieldsNames {\n id = 'id',\n name = 'name',\n photoUrl = 'photoUrl',\n}\n\nconst coachSchema = z.object({\n [CoachFieldsNames.id]: z.string(),\n [CoachFieldsNames.name]: z.string().trim().min(2),\n [CoachFieldsNames.photoUrl]: z.string().url().or(z.literal('')).nullable().optional(),\n});\n\nexport const gameInfoFormSchema = z.object({\n [GameInfoFormFieldsNames.name]: z.string().min(3),\n [GameInfoFormFieldsNames.date]: z.string().optional(),\n [GameInfoFormFieldsNames.scoreHomeTeam]: numberTextField,\n [GameInfoFormFieldsNames.scoreOpponentTeam]: numberTextField,\n [GameInfoFormFieldsNames.duration]: numberTextField,\n [GameInfoFormFieldsNames.season]: SeasonSchema,\n [GameInfoFormFieldsNames.venue]: VenueSchema.optional(),\n [GameInfoFormFieldsNames.stageId]: z.string().min(1, 'Required'),\n [GameInfoFormFieldsNames.pitchLength]: numberTextField,\n [GameInfoFormFieldsNames.pitchWidth]: numberTextField,\n [GameInfoFormFieldsNames.homeCoach]: coachSchema.optional(),\n [GameInfoFormFieldsNames.awayCoach]: coachSchema.optional(),\n});\n\nexport type GameInfoSchema = TypeOf<typeof gameInfoFormSchema>;\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { Box, Button, FormControl, Grid, Stack, TextField, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport { useCallback, useRef, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { generatePath, useHistory, useParams } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport { FormFormLabel } from 'shared/components/form/form-form-label';\nimport { FormSelectField } from 'shared/components/form/form-select-field';\nimport { getTypeOptions } from 'shared/components/form/get-type-options';\nimport { MatchTeamTypes } from 'shared/types/teams/types';\n\nimport { TextsWithFieldHoverLabel } from './texts-with-field-hover-label';\nimport { useCreateNewGameWithPlayers } from './use-create-new-game-with-players';\nimport { useUpdateNewGameWithPlayers } from './use-update-new-game-with-players';\nimport { useInvalidateSeasons } from '../../../../../api/seasons/use-seasons';\nimport { SelectCoach } from '../../../../../components/select-coach';\nimport { SelectVenue } from '../../../../../components/select-venue';\nimport { StageModal } from '../../../../../components/stage-modal';\nimport { Coach } from '../../../../../types/coaches';\nimport { MetadataGame, MetadataTeam } from '../../../../../types/games';\nimport { SelectSeason } from '../../../../stages/components/select-season';\nimport { FORM_IDS, useGameInfo, useSetGameInfo, useTeamData } from '../../config';\nimport { GameInfoFormFieldsNames, gameInfoFormSchema, GameInfoSchema } from '../../forms';\nimport { GameFormRouteParams } from '../../types';\n\ntype Props = {\n step: number;\n game?: MetadataGame;\n};\n\nconst generateDefaultTitle = (homeTeam: MetadataTeam | undefined, awayTeam: MetadataTeam | undefined) => {\n if (!homeTeam || !awayTeam) return '';\n\n return `${homeTeam.abbreviation.toUpperCase()} - ${awayTeam.abbreviation.toUpperCase()}`;\n};\n\nexport const GameInfoForm = ({ step, game }: Props) => {\n const history = useHistory();\n const gameInfo = useGameInfo();\n const setGameInfo = useSetGameInfo();\n const { id } = useParams<GameFormRouteParams>();\n const invalidateSeasons = useInvalidateSeasons();\n const [isCreateStageModalOpen, setIsCreateStageModalOpen] = useState(false);\n\n const {\n register,\n formState: { errors },\n watch,\n handleSubmit,\n setValue,\n control,\n } = useForm<GameInfoSchema>({\n resolver: zodResolver(gameInfoFormSchema),\n defaultValues: gameInfo ? { ...gameInfo, season: game?.season } : undefined,\n });\n\n const season = watch(GameInfoFormFieldsNames.season);\n const stageId = watch(GameInfoFormFieldsNames.stageId);\n const homeTeam = useTeamData(MatchTeamTypes.HOME);\n const awayTeam = useTeamData(MatchTeamTypes.OPPONENT);\n const gameInfoFormRef = useRef<HTMLFormElement>(null);\n const createGame = useCreateNewGameWithPlayers((game: MetadataGame) => {\n history.push(generatePath(routes.BACKOFFICE_NEW_GAME_SUMMARY, { id: game.id }));\n });\n const updateGame = useUpdateNewGameWithPlayers((game: MetadataGame) => {\n history.push(generatePath(routes.BACKOFFICE_NEW_GAME_SUMMARY, { id: game.id }));\n });\n\n const handleSetTeamData = useCallback(\n (gameInfo: GameInfoSchema) => {\n if (!homeTeam || !awayTeam) return;\n\n setGameInfo(gameInfo);\n id ? updateGame(id, gameInfo, homeTeam, awayTeam) : createGame(gameInfo, homeTeam, awayTeam);\n },\n [id, updateGame, setGameInfo, awayTeam, homeTeam, createGame],\n );\n\n const handleOnSubmit = async (event: React.FormEvent) => {\n event.preventDefault();\n return handleSubmit(handleSetTeamData)(event);\n };\n\n return (\n <>\n <form id={FORM_IDS[step]} ref={gameInfoFormRef} onSubmit={handleOnSubmit}>\n <Grid container justifyContent={'center'} sx={{ paddingBottom: 4 }}>\n <Grid item xs={12} md={6}>\n <Stack gap={2}>\n <FormControl fullWidth>\n <FormFormLabel>Name</FormFormLabel>\n <TextField\n defaultValue={generateDefaultTitle(homeTeam?.team, awayTeam?.team)}\n size='small'\n {...register(GameInfoFormFieldsNames.name)}\n error={!!errors[GameInfoFormFieldsNames.name]}\n helperText={\n errors[GameInfoFormFieldsNames.name] && <>{errors[GameInfoFormFieldsNames.name].message}</>\n }\n />\n </FormControl>\n <FormControl fullWidth>\n <FormFormLabel optional>Date</FormFormLabel>\n <TextField\n size='small'\n fullWidth\n type='datetime-local'\n {...register(GameInfoFormFieldsNames.date)}\n error={!!errors[GameInfoFormFieldsNames.date]}\n helperText={\n errors[GameInfoFormFieldsNames.date] && <>{errors[GameInfoFormFieldsNames.date].message}</>\n }\n />\n </FormControl>\n <Grid container spacing={2}>\n <Grid item xs={6}>\n <FormControl fullWidth>\n <FormFormLabel>Score</FormFormLabel>\n <Stack direction={'row'} gap={1}>\n <TextField\n type={'number'}\n InputProps={{ inputProps: { min: 0 } }}\n size='small'\n {...register(GameInfoFormFieldsNames.scoreHomeTeam)}\n error={!!errors[GameInfoFormFieldsNames.scoreHomeTeam]}\n helperText={\n errors[GameInfoFormFieldsNames.scoreHomeTeam] && (\n <>{errors[GameInfoFormFieldsNames.scoreHomeTeam].message}</>\n )\n }\n />\n <TextField\n type={'number'}\n InputProps={{ inputProps: { min: 0 } }}\n size='small'\n {...register(GameInfoFormFieldsNames.scoreOpponentTeam)}\n error={!!errors[GameInfoFormFieldsNames.scoreOpponentTeam]}\n helperText={\n errors[GameInfoFormFieldsNames.scoreOpponentTeam] && (\n <>{errors[GameInfoFormFieldsNames.scoreOpponentTeam].message}</>\n )\n }\n />\n </Stack>\n </FormControl>\n </Grid>\n\n <Grid item xs={6}>\n <FormControl fullWidth>\n <FormFormLabel>Duration</FormFormLabel>\n <TextField\n type='number'\n InputProps={{ inputProps: { min: 0 } }}\n size='small'\n {...register(GameInfoFormFieldsNames.duration)}\n error={!!errors[GameInfoFormFieldsNames.duration]}\n helperText={\n errors[GameInfoFormFieldsNames.duration] && (\n <>{errors[GameInfoFormFieldsNames.duration].message}</>\n )\n }\n />\n </FormControl>\n </Grid>\n </Grid>\n\n <FormControl fullWidth>\n <FormFormLabel optional>Home coach</FormFormLabel>\n <Controller\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <SelectCoach setCoachOnChange={onChange} coach={value} />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </>\n )}\n name={GameInfoFormFieldsNames.homeCoach}\n control={control}\n />\n </FormControl>\n\n <FormControl fullWidth>\n <FormFormLabel optional>Away coach</FormFormLabel>\n <Controller\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <SelectCoach\n setCoachOnChange={(coach: Coach | undefined) => {\n onChange(coach);\n }}\n coach={value || undefined}\n />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </>\n )}\n name={GameInfoFormFieldsNames.awayCoach}\n control={control}\n />\n </FormControl>\n\n <Controller\n name={GameInfoFormFieldsNames.season}\n control={control}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <FormControl fullWidth>\n <FormFormLabel>Season</FormFormLabel>\n <SelectSeason\n setSeasonOnChange={(seasonValue) => {\n onChange(seasonValue);\n if (!(game?.season.id === seasonValue?.id && gameInfo?.stageId === stageId)) {\n setValue(GameInfoFormFieldsNames.stageId, '');\n }\n }}\n season={value}\n />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </FormControl>\n )}\n />\n\n {Boolean(season) && (\n <FormControl fullWidth>\n <Stack direction={'row'} justifyContent={'space-between'} alignItems={'center'}>\n <FormFormLabel>Stages</FormFormLabel>\n <Box>\n <Button onClick={() => setIsCreateStageModalOpen(true)}>+ new stage</Button>\n </Box>\n </Stack>\n <Controller\n name={GameInfoFormFieldsNames.stageId}\n control={control}\n render={({ field: { value, ...restFieldProps }, fieldState: { error } }) => (\n <>\n {season && season.stages && season.stages.length > 0 ? (\n <FormSelectField\n id={GameInfoFormFieldsNames.stageId}\n options={getTypeOptions({\n options: season.stages.map((stage) => ({\n value: stage.id,\n label: stage.name,\n })),\n })}\n error={!!error}\n helperText={error && error?.message}\n value={value}\n fullWidth={true}\n {...restFieldProps}\n />\n ) : (\n <>{error && <Typography color={Colors.red}>{error.message}</Typography>}</>\n )}\n </>\n )}\n />\n </FormControl>\n )}\n\n <FormControl fullWidth>\n <FormFormLabel optional>Venue</FormFormLabel>\n <Controller\n render={({ field: { value, onChange }, fieldState: { error } }) => (\n <>\n <SelectVenue setVenueOnChange={onChange} venue={value} />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </>\n )}\n name={GameInfoFormFieldsNames.venue}\n control={control}\n />\n </FormControl>\n\n <FormControl fullWidth>\n <FormFormLabel>Pitch Size</FormFormLabel>\n <Stack direction={'row'} gap={2}>\n <TextsWithFieldHoverLabel label={'length'}>\n <TextField\n size='small'\n type='number'\n InputProps={{ inputProps: { min: 0 } }}\n {...register(GameInfoFormFieldsNames.pitchLength)}\n error={!!errors[GameInfoFormFieldsNames.pitchLength]}\n helperText={\n errors[GameInfoFormFieldsNames.pitchLength] && (\n <>{errors[GameInfoFormFieldsNames.pitchLength].message}</>\n )\n }\n />\n </TextsWithFieldHoverLabel>\n <TextsWithFieldHoverLabel label={'Width'}>\n <TextField\n size='small'\n type='number'\n InputProps={{ inputProps: { min: 0 } }}\n {...register(GameInfoFormFieldsNames.pitchWidth)}\n error={!!errors[GameInfoFormFieldsNames.pitchWidth]}\n helperText={\n errors[GameInfoFormFieldsNames.pitchWidth] && (\n <>{errors[GameInfoFormFieldsNames.pitchWidth].message}</>\n )\n }\n />\n </TextsWithFieldHoverLabel>\n </Stack>\n </FormControl>\n </Stack>\n </Grid>\n </Grid>\n </form>\n {isCreateStageModalOpen ? (\n <StageModal\n open={isCreateStageModalOpen}\n onClose={() => setIsCreateStageModalOpen(false)}\n onSuccess={invalidateSeasons}\n />\n ) : null}\n </>\n );\n};\n","import { useLocation, useParams } from 'react-router-dom';\n\nimport { useMetadataGame } from '../../../../../api/games/use-metadata-game';\nimport { GameInfoForm } from '../../components/game-info-form';\nimport { getCurrentStepFromPathName, useCheckValidateStep } from '../../config';\nimport { GameFormRouteParams } from '../../types';\n\nexport const GameFormInfo = () => {\n const location = useLocation();\n const { id } = useParams<GameFormRouteParams>();\n const { data: game, isLoading } = useMetadataGame({ gameId: id });\n const step = getCurrentStepFromPathName(location.pathname);\n\n useCheckValidateStep(step);\n\n return <>{isLoading && id ? null : <GameInfoForm game={game} step={step} />}</>;\n};\n","import { MetadataGame, MetadataGamePlayer } from '../../../types/games';\nimport { MetadataPlayerSummary } from '../../../types/players';\nimport { TeamWithPlayers } from '../../../types/teams';\n\nexport const transformGamePlayer = (\n player: MetadataGamePlayer,\n team: TeamWithPlayers,\n game: MetadataGame,\n): MetadataPlayerSummary => {\n return {\n id: player.id,\n name: player.name,\n photoUrl: player.photoUrl,\n fixtures: [\n {\n jerseyNumber: player.jerseyNumber,\n side: player.side,\n name: player.name,\n date: game.date ?? '',\n position: player.position,\n id: player.id,\n homeTeamScore: game.homeTeamScore,\n awayTeamScore: game.awayTeamScore,\n team,\n },\n ],\n };\n};\n","import { Box, Typography } from '@mui/material';\nimport { Colors, fontWeight } from 'kognia-ui';\n\nexport const PlayerListHeader = () => {\n return (\n <Box\n sx={{\n padding: 1,\n display: 'grid',\n alignItems: 'center',\n backgroundColor: Colors.background,\n gridTemplateColumns: '32px 1.5fr 170px 170px 100px 2fr',\n }}\n >\n <span />\n <Typography sx={{ fontWeight: fontWeight['500'] }}>Player name</Typography>\n <Typography sx={{ fontWeight: fontWeight['500'] }}>Field position</Typography>\n <Typography sx={{ fontWeight: fontWeight['500'] }}>Side</Typography>\n <Typography sx={{ fontWeight: fontWeight['500'] }}>Number</Typography>\n <Typography sx={{ fontWeight: fontWeight['500'] }}>Game / Date</Typography>\n </Box>\n );\n};\n","import { SvgIcon, type SvgIconProps } from '../svg-icon/SvgIcon';\n\nexport const IconRemove = (props: Omit<SvgIconProps, 'children'>): JSX.Element => {\n return (\n <SvgIcon {...props}>\n <path d='M7.5 11.1v1.8h9v-1.8h-9zM12 3c-4.968 0-9 4.032-9 9s4.032 9 9 9 9-4.032 9-9-4.032-9-9-9zm0 16.2A7.21 7.21 0 0 1 4.8 12 7.21 7.21 0 0 1 12 4.8a7.21 7.21 0 0 1 7.2 7.2 7.21 7.21 0 0 1-7.2 7.2z' />\n </SvgIcon>\n );\n};\n","import { Box, styled } from '@mui/material';\n\ninterface PlayerImageProps {\n fullSize?: boolean;\n}\n\nexport const PlayerImageContainer = styled(Box)(() => ({\n borderRadius: '50%',\n overflow: 'hidden',\n}));\n\nexport const PlayerImageElement = styled('img', { shouldForwardProp: (prop) => prop !== 'fullSize' })<PlayerImageProps>(\n ({ fullSize }) => ({\n width: fullSize ? '100%' : '36px',\n height: fullSize ? '100%' : '36px',\n objectFit: 'contain',\n }),\n);\n","import { PlayerImageContainer, PlayerImageElement } from './styled';\n\ninterface Props {\n src: string;\n fullSize?: boolean;\n}\n\nexport const PlayerPhoto = ({ src, fullSize = false }: Props) => {\n return (\n <PlayerImageContainer>\n <PlayerImageElement src={src} alt='' fullSize={fullSize} />\n </PlayerImageContainer>\n );\n};\n","import { MetadataPlayerSummary } from '../../../../../types/players';\n\nexport const getJerseyNumber = (player: MetadataPlayerSummary): number => {\n if (player.jerseyNumber) return player.jerseyNumber;\n\n return player.fixtures && player.fixtures.length > 0 ? player.fixtures[0].jerseyNumber : 0;\n};\nexport const getTeamName = (player: MetadataPlayerSummary): string => {\n return player.fixtures && player.fixtures.length > 0 ? player.fixtures[0].team.name : '';\n};\nexport const getTeamLastGameDate = (player: MetadataPlayerSummary): string | undefined => {\n return player.fixtures && player.fixtures.length > 0 ? player.fixtures[0].date : undefined;\n};\n","import { Box, MenuItem, Select, SelectChangeEvent, Stack, TextField, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport map from 'lodash/map';\nimport throttle from 'lodash/throttle';\nimport { FocusEvent, useCallback, useMemo } from 'react';\n\nimport { IconRemove } from 'shared/components/icons/icon-remove';\nimport { useDates } from 'shared/hooks/use-dates';\n\nimport { PlayersMappings, usePlayersMappings } from '../../../../../../api/use-players-mappings';\nimport { MetadataPlayerSummary } from '../../../../../../types/players';\nimport { PlayerPhoto } from '../../../../../players/components/player-photo/player-photo';\nimport { PlayerPhotoSkeleton } from '../../../../../players/components/player-photo-skeleton';\nimport { getJerseyNumber, getTeamLastGameDate, getTeamName } from '../utils';\n\ntype Props = {\n player: MetadataPlayerSummary;\n hasJerseyNumberError: boolean;\n removePlayers: (player: MetadataPlayerSummary[]) => void;\n onUpdatePlayer: (player: MetadataPlayerSummary) => void;\n};\n\nconst isIndexSpecificPosition = (mappings: PlayersMappings | undefined, position: number | undefined, name: string) => {\n if (!mappings) return false;\n const index = map(mappings.positions, (m) => m).findIndex((p) => p === name);\n\n return index === position;\n};\n\nconst getSideValue = (mappings: PlayersMappings, name: string) => {\n const found = map(mappings.sides, (m, idx) => ({ name: m, value: Number(idx) })).find((p) => p.name === name);\n\n return found?.value;\n};\n\nconst getPlayerSide = (mappings: PlayersMappings | undefined, position: number, player: MetadataPlayerSummary) => {\n if (!mappings) return player.side;\n if (isIndexSpecificPosition(mappings, position, 'Goalkeeper')) return getSideValue(mappings, 'Center') ?? player.side;\n if (isIndexSpecificPosition(mappings, position, 'Unknown')) return getSideValue(mappings, 'Unknown') ?? player.side;\n\n return player.side;\n};\n\nexport const SelectedPlayerItem = ({ player, removePlayers, onUpdatePlayer, hasJerseyNumberError }: Props) => {\n const { data: mappings } = usePlayersMappings();\n const { dateToString } = useDates();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleSelectPosition = useCallback(\n throttle((event: SelectChangeEvent<number>) => {\n const position = Number(event.target.value);\n onUpdatePlayer({ ...player, position, side: getPlayerSide(mappings, position, player) });\n }, 200),\n [player, onUpdatePlayer],\n );\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleSelectSide = useCallback(\n throttle((event: SelectChangeEvent<number>) => {\n const side = Number(event.target.value);\n onUpdatePlayer({ ...player, side });\n }, 200),\n [player, onUpdatePlayer],\n );\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleOnBlurJerseyNumber = useCallback(\n throttle((event: FocusEvent<HTMLInputElement>) => {\n const jerseyNumber = parseInt(event.target.value);\n onUpdatePlayer({ ...player, jerseyNumber });\n }, 200),\n [player, onUpdatePlayer],\n );\n\n const playersPositions = useMemo(\n () =>\n map(mappings?.positions ?? [], (position, value) => {\n return (\n <MenuItem key={position} value={value}>\n {position} ({value})\n </MenuItem>\n );\n }),\n [mappings],\n );\n\n const playersSides = useMemo(\n () =>\n map(mappings?.sides ?? [], (side, value) => {\n return (\n <MenuItem key={side} value={value}>\n {side} ({value})\n </MenuItem>\n );\n }),\n [mappings],\n );\n\n const jerseyNumber = getJerseyNumber(player);\n const teamName = getTeamName(player);\n const lastGameDate = getTeamLastGameDate(player);\n const formattedLastGameDate = lastGameDate ? dateToString(lastGameDate) : undefined;\n const position = player.position ?? undefined;\n const side = player.side ?? undefined;\n const isGoalkeeperPosition = isIndexSpecificPosition(mappings, position, 'Goalkeeper');\n const isUnknownPosition = isIndexSpecificPosition(mappings, position, 'Unknown');\n\n return (\n <Box\n sx={{\n borderBottom: `1px solid ${Colors.athens}`,\n padding: 1,\n display: 'grid',\n alignItems: 'center',\n gridTemplateColumns: '32px 1.5fr 170px 170px 100px 2fr',\n }}\n >\n <IconRemove color='secondary' size='small' isButton onClick={() => removePlayers([player])} />\n <Stack direction={'row'} alignItems={'center'} gap={1}>\n {player.photoUrl ? <PlayerPhoto src={player.photoUrl} /> : <PlayerPhotoSkeleton small />}\n <Typography>{player.name}</Typography>\n </Stack>\n <Select\n name={`${player.id}-position`}\n id={`${player.id}-position`}\n size={'small'}\n sx={{ width: '150px' }}\n value={position}\n onChange={handleSelectPosition}\n >\n {playersPositions}\n </Select>\n {!isGoalkeeperPosition && !isUnknownPosition ? (\n <Select\n name={`${player.id}-side`}\n key={player.id}\n id={`${player.id}-side`}\n size={'small'}\n sx={{ width: '150px' }}\n value={side}\n onChange={handleSelectSide}\n >\n {playersSides}\n </Select>\n ) : (\n <span />\n )}\n <TextField\n size='small'\n fullWidth\n type='number'\n error={hasJerseyNumberError}\n value={jerseyNumber}\n placeholder={`#${jerseyNumber}`}\n onChange={handleOnBlurJerseyNumber}\n sx={{ width: '80px' }}\n />\n {teamName && formattedLastGameDate ? (\n <Typography sx={{ wrap: 'no-wrap' }}>\n {teamName} / {formattedLastGameDate}\n </Typography>\n ) : null}\n </Box>\n );\n};\n","import { Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport { useMemo } from 'react';\n\nimport { MetadataPlayerSummary } from '../../../../../../types/players';\nimport { PlayerListHeader } from '../../player-list/player-list-header';\nimport { SelectedPlayerItem } from '../selected-player-item';\n\ntype Props = {\n selectedPlayers: MetadataPlayerSummary[];\n removePlayers: (player: MetadataPlayerSummary[]) => void;\n onUpdatePlayer: (player: MetadataPlayerSummary) => void;\n};\n\nexport const SelectedPlayersList = ({ selectedPlayers, removePlayers, onUpdatePlayer }: Props) => {\n if (selectedPlayers.length === 0) return <Typography sx={{ color: Colors.storm }}>No players selected</Typography>;\n\n const jerseyNumbersCount = useMemo(\n () =>\n selectedPlayers.reduce<{ [key in number]: number }>((acc, player) => {\n const jerseyNumber = player.jerseyNumber;\n if (!jerseyNumber) return acc;\n\n if (!acc[jerseyNumber]) {\n acc[jerseyNumber] = 1;\n } else {\n acc[jerseyNumber] += 1;\n }\n return acc;\n }, {}),\n [selectedPlayers],\n );\n\n return (\n <>\n <PlayerListHeader />\n {selectedPlayers.map((player) => (\n <SelectedPlayerItem\n key={player.id}\n player={player}\n removePlayers={removePlayers}\n onUpdatePlayer={onUpdatePlayer}\n hasJerseyNumberError={Boolean(player.jerseyNumber && jerseyNumbersCount[player.jerseyNumber] > 1)}\n />\n ))}\n </>\n );\n};\n","import { Card, CardContent, Divider, Stack, Typography } from '@mui/material';\nimport { Colors, fontWeight } from 'kognia-ui';\n\nimport { IconUser } from 'shared/components/icons/icon-user';\n\nimport { SelectedPlayersList } from './selected-players-list';\nimport { MetadataPlayerSummary } from '../../../../../types/players';\n\ntype Props = {\n selectedPlayers: MetadataPlayerSummary[];\n removePlayers: (player: MetadataPlayerSummary[]) => void;\n onUpdatePlayer: (player: MetadataPlayerSummary) => void;\n error: string;\n};\n\nexport const SelectedPlayers = ({ selectedPlayers = [], removePlayers, onUpdatePlayer, error }: Props) => {\n return (\n <Stack gap={1}>\n <Card>\n <CardContent>\n <Stack gap={2}>\n <Stack gap={2} direction={'row'} alignItems={'center'}>\n <Typography\n sx={{\n fontWeight: fontWeight['500'],\n color: Colors.shark,\n display: 'flex',\n gap: 2,\n alignItems: 'center',\n }}\n >\n <IconUser /> <span>{`Players selection (${(selectedPlayers ?? []).length})`}</span>\n </Typography>\n {error && <Typography color={Colors.red}>{error}</Typography>}\n </Stack>\n <Divider />\n <Stack gap={2}>\n <SelectedPlayersList\n selectedPlayers={selectedPlayers}\n removePlayers={removePlayers}\n onUpdatePlayer={onUpdatePlayer}\n />\n </Stack>\n </Stack>\n </CardContent>\n </Card>\n </Stack>\n );\n};\nexport { getTeamLastGameDate } from './utils';\nexport { getTeamName } from './utils';\nexport { getJerseyNumber } from './utils';\n","import { UseQueryResult } from '@tanstack/react-query';\nimport forEach from 'lodash/forEach';\n\nimport { MetadataGame, MetadataGamePlayer } from '../../../../../../../types/games';\nimport { MetadataPlayerSummary } from '../../../../../../../types/players';\nimport { TeamWithPlayers } from '../../../../../../../types/teams';\nimport { transformGamePlayer } from '../../../../utils';\nimport { getJerseyNumber } from '../../../selected-players';\n\ninterface GetLatestPlayersFromGames {\n team?: TeamWithPlayers;\n games?: UseQueryResult<MetadataGame>[];\n}\n\nexport const getLatestPlayersFromGames = ({\n team,\n games,\n}: GetLatestPlayersFromGames): MetadataPlayerSummary[] | undefined => {\n if (!team || !games) return;\n\n const latestUniquePlayersFromGames: Record<string, MetadataPlayerSummary> = games.reduce<\n Record<string, MetadataPlayerSummary>\n >((acc, game) => {\n if (!game.data) return acc;\n\n const gamePlayers: MetadataPlayerSummary[] = game.data.players\n .filter((p: MetadataGamePlayer) => p.teamId === team.id)\n .map((p: MetadataGamePlayer) => transformGamePlayer(p, team, game.data));\n\n forEach(gamePlayers, (player) => {\n const playerFixturesDateInAcc = acc[player.id]?.fixtures?.find((item) => item.date);\n const playerFixturesDateInPlayer = player.fixtures?.find((item) => item.date);\n if (\n !acc[player.id] ||\n (acc[player.id] &&\n playerFixturesDateInAcc &&\n playerFixturesDateInPlayer &&\n Date.parse(playerFixturesDateInAcc.date) < Date.parse(playerFixturesDateInPlayer.date))\n ) {\n acc[player.id] = player;\n }\n });\n\n return acc;\n }, {});\n\n const sortByJerseyNumber = (a: MetadataPlayerSummary, b: MetadataPlayerSummary) =>\n getJerseyNumber(a) - getJerseyNumber(b);\n return Object.values(latestUniquePlayersFromGames).sort(sortByJerseyNumber);\n};\n","import { InfinityQueryDataResult } from 'api/hooks/useInfinityQuery/types';\nimport { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { MetadataTeamApiResponseWithPlayers, MetadataTeamsApiResponse } from './use-teams/types';\nimport { MetadataTeamWithFixtures, TeamWithPlayers } from '../../types/teams';\n\nexport const transformTeam = (team: MetadataTeamApiResponseWithPlayers): TeamWithPlayers => {\n return {\n id: team.uuid,\n name: team.name,\n abbreviation: team.abbreviation,\n logoUrl: team.logo_url,\n teamType: team.team_type,\n countryCode: team.country_code,\n fixtures: team.fixtures.map((fixture) => ({\n id: fixture.uuid,\n date: fixture.date,\n homeTeamScore: fixture.home_team_score,\n awayTeamScore: fixture.away_team_score,\n pitchLength: fixture.pitch_length,\n pitchWidth: fixture.pitch_width,\n name: fixture.name,\n duration: fixture.duration,\n })),\n players: team.players.map((player) => ({\n jerseyNumber: player.jersey_number,\n side: player.side,\n position: player.position,\n name: player.player_name,\n id: player.player_uuid,\n photoUrl: player.player_photo_url,\n teamId: player.team_uuid,\n })),\n };\n};\n\nexport const transformTeams = (\n response: MetadataTeamsApiResponse,\n): InfinityQueryDataResult<MetadataTeamWithFixtures> => {\n return {\n data: {\n items: response.data.map((team) => ({\n id: team.uuid,\n name: team.name,\n abbreviation: team.abbreviation,\n logoUrl: team.logo_url,\n teamType: team.team_type,\n countryCode: team.country_code,\n fixtures: team.fixtures.map((fixture) => ({\n id: fixture.uuid,\n date: fixture.date,\n homeTeamScore: fixture.home_team_score,\n awayTeamScore: fixture.away_team_score,\n pitchLength: fixture.pitch_length,\n pitchWidth: fixture.pitch_width,\n name: fixture.name,\n duration: fixture.duration,\n })),\n })),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\n\nimport { TeamWithPlayers } from '../../../types/teams';\nimport { annotationApiUrls } from '../../routes';\nimport { transformTeam } from '../transformers';\n\ntype Params = {\n teamId?: string;\n onSuccess?: (team: TeamWithPlayers) => void;\n};\n\nexport const useTeam = ({ teamId, onSuccess }: Params): UseQueryResult<TeamWithPlayers> => {\n return useFetchRequest<TeamWithPlayers>({\n queryRef: ['metadata-team', teamId ?? ''],\n url: `${annotationApiUrls.TEAMS}/${teamId ?? ''}`,\n transformer: transformTeam,\n options: {\n enabled: teamId !== undefined,\n },\n onSuccess,\n });\n};\n","import { InfinityQueryDataResult } from 'api/hooks/useInfinityQuery/types';\nimport { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { MetadataPlayerApiResponse, PlayerApiResponse } from './types';\nimport { MetadataPlayerSummary } from '../../../types/players';\n\nexport const transformPlayer = (player: MetadataPlayerApiResponse): MetadataPlayerSummary => {\n return {\n id: player.uuid,\n name: player.name,\n photoUrl: player.photo_url,\n fixtures: player.fixtures.map((fixture) => ({\n jerseyNumber: fixture.jersey_number,\n side: fixture.side,\n name: fixture.name,\n date: fixture.date,\n position: fixture.position,\n id: fixture.uuid,\n homeTeamScore: fixture.home_team_score,\n awayTeamScore: fixture.away_team_score,\n team: {\n name: fixture.team.name,\n abbreviation: fixture.team.abbreviation,\n logoUrl: fixture.team.logo_url,\n teamType: fixture.team.team_type,\n country: fixture.team.country_code,\n id: fixture.team.uuid,\n },\n })),\n };\n};\n\nexport const transformPlayers = (players: MetadataPlayerApiResponse[]): MetadataPlayerSummary[] => {\n return players.map(transformPlayer);\n};\n\nexport const transformPlayersResponse = (\n response: PlayerApiResponse,\n): InfinityQueryDataResult<MetadataPlayerSummary> => {\n return {\n data: {\n items: transformPlayers(response.data),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { MetadataPlayerSummary } from '../../../types/players';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { transformPlayer } from '../use-players/transformer';\nimport { MetadataPlayerApiResponse } from '../use-players/types';\n\ntype CreatePlayerParams = Pick<MetadataPlayerApiResponse, 'name'> & { image?: File };\n\ninterface CreatePlayerData {\n data: CreatePlayerParams;\n onSuccess?: (player: MetadataPlayerSummary) => void;\n}\n\nexport const useCreatePlayer = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<\n MetadataPlayerApiResponse,\n MetadataPlayerSummary,\n MetadataApiErrorResponse\n >({\n type: HTTPMethod.POST,\n successMessage: 'Player created',\n transformer: transformPlayer,\n errorMessage: (data) => metadataApiErrorParser(data, 'Player creation error'),\n });\n\n const createPlayer = ({ data, onSuccess }: CreatePlayerData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n const formData = new FormData();\n formData.append('player', JSON.stringify({ name: data.name }));\n data.image && formData.append('player_image', data.image);\n\n mutationRequest.mutate(\n {\n url: annotationApiUrls.PLAYERS,\n data: formData,\n },\n { onSuccess },\n );\n };\n\n return { ...mutationRequest, createPlayer };\n};\n","import { useQueryClient } from '@tanstack/react-query';\nimport { useCallback } from 'react';\n\nimport { useInfinityQuery } from 'api/hooks/useInfinityQuery';\nimport { InfinityQueryResult } from 'api/hooks/useInfinityQuery/types';\nimport { SortDirection } from 'shared/types/filters/types';\n\nimport { transformPlayersResponse } from './transformer';\nimport { PlayerApiResponse } from './types';\nimport { MetadataPlayersApiFilters, MetadataPlayerSummary } from '../../../types/players';\nimport { playersWithFiltersUrl } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\n\nconst PLAYERS_QUERY_KEY = 'players';\n\nexport const usePlayers = (): InfinityQueryResult<MetadataPlayerSummary, MetadataPlayersApiFilters> => {\n const { isAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n\n return useInfinityQuery<MetadataPlayerSummary, MetadataPlayersApiFilters, PlayerApiResponse>({\n generateUrl: playersWithFiltersUrl,\n key: PLAYERS_QUERY_KEY,\n options: {\n size: 10,\n sort: 'name',\n sortDirection: SortDirection.DESC,\n },\n transformer: transformPlayersResponse,\n queryOptions: {\n enabled: isAllowedBackofficeOrigin,\n },\n });\n};\n\nexport const useInvalidatePlayers = () => {\n const queryClient = useQueryClient();\n\n return useCallback(() => queryClient.invalidateQueries({ queryKey: [PLAYERS_QUERY_KEY] }), [queryClient]);\n};\n","import { TypeOf } from 'zod';\n\nimport { createPlayerFormSchema, editPlayerFormSchema } from './form';\n\nexport enum PlayerFormFieldsNames {\n name = 'name',\n playerImage = 'player_image',\n}\n\nexport interface CreatePlayerForm {\n [PlayerFormFieldsNames.name]: string;\n [PlayerFormFieldsNames.playerImage]?: FileList;\n}\n\nexport type CreatePlayerFormSchema = TypeOf<typeof createPlayerFormSchema>;\n\nexport interface EditPlayerForm {\n [PlayerFormFieldsNames.name]: string;\n [PlayerFormFieldsNames.playerImage]?: FileList;\n}\n\nexport type EditPlayerFormSchema = TypeOf<typeof editPlayerFormSchema>;\n","import { FormControl, Input, TextField, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport React from 'react';\nimport { Path, UseFormRegister, UseFormTrigger, FieldErrors } from 'react-hook-form';\n\nimport { FormFormLabel } from 'shared/components/form/form-form-label';\n\nimport { PlayerFormFieldsNames } from './types';\n\ninterface Props<TFormValues extends Record<string, any>> {\n register: UseFormRegister<TFormValues>;\n errors: FieldErrors<TFormValues>;\n trigger: UseFormTrigger<TFormValues>;\n}\n\nexport function PlayerForm<TFormValues extends Record<string, any>>({ register, errors, trigger }: Props<TFormValues>) {\n return (\n <>\n <FormControl fullWidth margin='normal'>\n <FormFormLabel>Player Name</FormFormLabel>\n <TextField\n size='small'\n {...register(PlayerFormFieldsNames.name as Path<TFormValues>)}\n error={!!errors[PlayerFormFieldsNames.name]}\n helperText={errors[PlayerFormFieldsNames.name] && <>{errors[PlayerFormFieldsNames.name].message}</>}\n />\n </FormControl>\n <FormControl\n fullWidth\n margin='normal'\n onChange={() => trigger(PlayerFormFieldsNames.playerImage as Path<TFormValues>)}\n >\n <FormFormLabel>Image URL</FormFormLabel>\n <Input\n type='file'\n size='small'\n {...register(PlayerFormFieldsNames.playerImage as Path<TFormValues>)}\n error={!!errors[PlayerFormFieldsNames.playerImage]}\n />\n {errors[PlayerFormFieldsNames.playerImage] && (\n <Typography color={Colors.red}>\n <>{errors[PlayerFormFieldsNames.playerImage].message ?? ''}</>\n </Typography>\n )}\n </FormControl>\n </>\n );\n}\n","import { z } from 'zod';\n\nimport { PlayerFormFieldsNames } from './types';\n\nexport const createPlayerFormSchema = z.object({\n [PlayerFormFieldsNames.name]: z.string().trim().min(2),\n [PlayerFormFieldsNames.playerImage]: z.instanceof(FileList).optional(),\n});\n\nexport const editPlayerFormSchema = z.object({\n [PlayerFormFieldsNames.name]: z.string().trim().min(2),\n [PlayerFormFieldsNames.playerImage]: z.instanceof(FileList).optional(),\n});\n","import { Box, styled } from '@mui/material';\n\nexport const PlayerPhotoPreviewContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'column',\n marginTop: theme.spacing(2),\n}));\n\nexport const PlayerPhotoContainer = styled(Box)({\n width: '120px',\n height: '120px',\n});\n","import { Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\n\nimport { PlayerPhotoContainer, PlayerPhotoPreviewContainer } from './styled';\nimport { PlayerPhoto } from '../player-photo/player-photo';\nimport { PlayerPhotoSkeleton } from '../player-photo-skeleton';\n\ninterface Props {\n photoUrl?: string | null;\n}\n\nexport const PlayerPhotoPreview = ({ photoUrl }: Props) => {\n return (\n <PlayerPhotoPreviewContainer>\n <PlayerPhotoContainer>\n {photoUrl ? <PlayerPhoto fullSize src={photoUrl} /> : <PlayerPhotoSkeleton />}\n </PlayerPhotoContainer>\n <Typography fontSize={fontSizes.small} marginTop={1}>\n Image preview\n </Typography>\n </PlayerPhotoPreviewContainer>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport React, { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { IconUser } from 'shared/components/icons/icon-user';\n\nimport { useCreatePlayer } from '../../api/players/use-create-player';\nimport { useInvalidatePlayers } from '../../api/players/use-players';\nimport { PlayerForm } from '../../pages/players/components/player-form';\nimport { createPlayerFormSchema } from '../../pages/players/components/player-form/form';\nimport {\n CreatePlayerForm,\n CreatePlayerFormSchema,\n PlayerFormFieldsNames,\n} from '../../pages/players/components/player-form/types';\nimport { PlayerPhotoPreview } from '../../pages/players/components/player-photo-preview';\nimport { MetadataPlayerSummary } from '../../types/players';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n onSuccess?: (player: MetadataPlayerSummary) => void;\n}\n\nexport const CreatePlayerModal = ({ open, onClose, onSuccess }: Props) => {\n const formRef = useRef<HTMLFormElement>(null);\n const invalidatePlayers = useInvalidatePlayers();\n const {\n register,\n formState: { errors },\n handleSubmit,\n watch,\n trigger,\n } = useForm<CreatePlayerFormSchema>({\n resolver: zodResolver(createPlayerFormSchema),\n });\n\n const playerImage = watch(PlayerFormFieldsNames.playerImage);\n const photoUrlValue = playerImage && playerImage.length > 0 ? URL.createObjectURL(playerImage[0]) : undefined;\n\n const { createPlayer } = useCreatePlayer();\n\n const handleCreatePlayer = useCallback(\n (player: CreatePlayerForm) => {\n createPlayer({\n data: {\n name: player[PlayerFormFieldsNames.name],\n image: player[PlayerFormFieldsNames.playerImage] ? player[PlayerFormFieldsNames.playerImage][0] : undefined,\n },\n onSuccess: (player: MetadataPlayerSummary) => {\n onSuccess && onSuccess(player);\n invalidatePlayers().then(() => onClose());\n },\n });\n },\n [invalidatePlayers, onSuccess, onClose, createPlayer],\n );\n\n const handleModalSubmit = useCallback(() => {\n formRef.current?.requestSubmit();\n }, []);\n\n return (\n <DialogNew\n maxWidth='sm'\n fullWidth\n title='New player'\n icon={<IconUser size='small' />}\n onCancel={onClose}\n onClose={onClose}\n onSubmit={handleModalSubmit}\n buttonSubmitText={'Create player'}\n open={open}\n >\n <form ref={formRef} onSubmit={handleSubmit(handleCreatePlayer)}>\n <PlayerForm<CreatePlayerFormSchema> errors={errors} register={register} trigger={trigger} />\n <PlayerPhotoPreview photoUrl={photoUrlValue} />\n </form>\n </DialogNew>\n );\n};\n","import { useQueryClient } from '@tanstack/react-query';\n\nimport { useInfinityQuery } from 'api/hooks/useInfinityQuery';\nimport { InfinityQueryResult } from 'api/hooks/useInfinityQuery/types';\nimport { SortDirection } from 'shared/types/filters/types';\n\nimport { MetadataTeamsApiResponse } from './types';\nimport { MetadataTeamsFilters, MetadataTeamWithFixtures } from '../../../types/teams';\nimport { teamsWithFiltersUrl } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { transformTeams } from '../transformers';\n\nconst TEAMS_QUERY_KEY = 'teams';\n\nexport const useTeams = (): InfinityQueryResult<MetadataTeamWithFixtures, MetadataTeamsFilters> => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n\n return useInfinityQuery<MetadataTeamWithFixtures, MetadataTeamsFilters, MetadataTeamsApiResponse>({\n generateUrl: teamsWithFiltersUrl,\n key: TEAMS_QUERY_KEY,\n options: {\n size: 10,\n sort: 'name',\n sortDirection: SortDirection.DESC,\n },\n transformer: transformTeams,\n queryOptions: {\n enabled: getIsAllowedBackofficeOrigin(),\n },\n });\n};\n\nexport const useInvalidateTeams = () => {\n const queryClient = useQueryClient();\n\n return () => queryClient.invalidateQueries([TEAMS_QUERY_KEY]);\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { MetadataTeam } from '../../types/games';\nimport { transformMetadataTeam } from '../games/transformers';\nimport { annotationApiUrls } from '../routes';\nimport { TeamApi } from '../teams/types';\nimport { useAllowedBackofficeOrigin } from '../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../utils';\n\ntype CreateTeamParams = Pick<TeamApi, 'name' | 'abbreviation' | 'country_code' | 'team_type'> & { image?: File };\n\ninterface CreateTeamData {\n data: CreateTeamParams;\n onSuccess?: (team: MetadataTeam) => void;\n}\n\nexport const useCreateBackofficeTeam = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<TeamApi, MetadataTeam, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Team created',\n transformer: transformMetadataTeam,\n errorMessage: (data) => metadataApiErrorParser(data, 'Team creation error'),\n });\n\n const createTeam = ({ data, onSuccess }: CreateTeamData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n const formData = new FormData();\n formData.append(\n 'team',\n JSON.stringify({\n name: data.name,\n abbreviation: data.abbreviation,\n country_code: data.country_code,\n team_type: data.team_type,\n }),\n );\n data.image && formData.append('team_image', data.image);\n\n mutationRequest.mutate(\n {\n url: annotationApiUrls.TEAMS,\n data: formData,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, createTeam };\n};\n","import { TypeOf } from 'zod';\n\nimport { createTeamFormSchema, editTeamFormSchema, TeamTypes } from './form';\n\nexport enum TeamFormFieldsNames {\n name = 'name',\n teamImage = 'team_image',\n teamType = 'team_type',\n abbreviation = 'abbreviation',\n countryCode = 'country_code',\n}\n\nexport interface CreateTeamForm {\n [TeamFormFieldsNames.name]: string;\n [TeamFormFieldsNames.teamImage]?: FileList;\n [TeamFormFieldsNames.teamType]: TeamTypes;\n [TeamFormFieldsNames.abbreviation]: string;\n [TeamFormFieldsNames.countryCode]?: string;\n}\n\nexport type CreateTeamFormSchema = TypeOf<typeof createTeamFormSchema>;\n\nexport interface EditTeamForm {\n [TeamFormFieldsNames.name]: string;\n [TeamFormFieldsNames.teamImage]?: FileList;\n [TeamFormFieldsNames.teamType]: TeamTypes;\n [TeamFormFieldsNames.abbreviation]: string;\n [TeamFormFieldsNames.countryCode]?: string;\n}\n\nexport type EditTeamFormSchema = TypeOf<typeof editTeamFormSchema>;\n","import { z } from 'zod';\n\nimport { TeamFormFieldsNames } from './types';\n\nexport enum TeamTypes {\n club = 'club',\n nationalTeam = 'national_team',\n}\n\nexport const teamFormSchema = z.object({\n [TeamFormFieldsNames.name]: z.string().trim().min(2),\n [TeamFormFieldsNames.teamImage]: z.instanceof(FileList).optional(),\n [TeamFormFieldsNames.teamType]: z.nativeEnum(TeamTypes),\n [TeamFormFieldsNames.abbreviation]: z.string().min(2).or(z.literal('')),\n [TeamFormFieldsNames.countryCode]: z.string().min(2, { message: 'Country is required' }),\n});\n\nexport const createTeamFormSchema = z.object(teamFormSchema.shape);\nexport const editTeamFormSchema = z.object(teamFormSchema.shape);\n","import {\n Avatar,\n FormControl,\n FormHelperText,\n Input,\n MenuItem,\n Select,\n Stack,\n TextField,\n Typography,\n} from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\nimport React from 'react';\nimport { Control, Controller, Path, UseFormRegister, UseFormTrigger, UseFormWatch, FieldErrors } from 'react-hook-form';\n\nimport { FormFormLabel } from 'shared/components/form/form-form-label';\n\nimport { TeamTypes } from './form';\nimport { TeamFormFieldsNames } from './types';\nimport { Countries } from '../../../../utils/countries';\n\ninterface Props<TFormValues extends Record<string, any>> {\n register: UseFormRegister<TFormValues>;\n errors: FieldErrors<TFormValues>;\n watch: UseFormWatch<TFormValues>;\n trigger: UseFormTrigger<TFormValues>;\n control: Control<TFormValues>;\n}\n\nexport function TeamForm<TFormValues extends Record<string, any>>({\n register,\n errors,\n watch,\n trigger,\n control,\n}: Props<TFormValues>) {\n const teamLogo = watch<Path<TFormValues>>(TeamFormFieldsNames.teamImage as Path<TFormValues>);\n const logoUrlValue = teamLogo && teamLogo.length > 0 ? URL.createObjectURL(teamLogo[0]) : '';\n\n const teamTypes = Object.values(TeamTypes).map((teamType) => (\n <MenuItem key={teamType} value={teamType}>\n {teamType}\n </MenuItem>\n ));\n\n const countryCodes = Countries.map((country) => (\n <MenuItem key={country.code.toLowerCase()} value={country.code.toLowerCase()}>\n {country.name}\n </MenuItem>\n ));\n\n return (\n <>\n <FormControl fullWidth margin='normal'>\n <FormFormLabel>Team Name</FormFormLabel>\n <TextField\n size='small'\n {...register(TeamFormFieldsNames.name as Path<TFormValues>)}\n error={!!errors[TeamFormFieldsNames.name]}\n helperText={errors[TeamFormFieldsNames.name] && <>{errors[TeamFormFieldsNames.name].message}</>}\n />\n </FormControl>\n <FormControl\n fullWidth\n margin='normal'\n onChange={() => trigger(TeamFormFieldsNames.teamImage as Path<TFormValues>)}\n >\n <FormFormLabel>Logo URL</FormFormLabel>\n <Input\n type='file'\n size='small'\n {...register(TeamFormFieldsNames.teamImage as Path<TFormValues>)}\n error={!!errors[TeamFormFieldsNames.teamImage]}\n />\n {errors[TeamFormFieldsNames.teamImage] && (\n <Typography color={Colors.red}>\n <>{errors[TeamFormFieldsNames.teamImage].message ?? ''}</>\n </Typography>\n )}\n <Stack justifyContent={'center'} spacing={1} marginTop={1} alignItems={'center'}>\n <Typography fontSize={fontSizes.small}>Logo preview</Typography>\n <Avatar src={logoUrlValue} />\n </Stack>\n </FormControl>\n\n <Controller\n control={control}\n name={TeamFormFieldsNames.teamType as Path<TFormValues>}\n render={({ field: { onChange, value, name } }) => (\n <FormControl fullWidth>\n <FormFormLabel>Team type</FormFormLabel>\n <Select size={'small'} labelId={`${name}-label`} id={name} value={value} onChange={onChange}>\n {teamTypes}\n </Select>\n </FormControl>\n )}\n />\n <FormControl fullWidth margin='normal'>\n <FormFormLabel>Abbreviation</FormFormLabel>\n <TextField\n size='small'\n {...register(TeamFormFieldsNames.abbreviation as Path<TFormValues>)}\n error={!!errors[TeamFormFieldsNames.abbreviation]}\n helperText={\n errors[TeamFormFieldsNames.abbreviation] && <>{errors[TeamFormFieldsNames.abbreviation].message}</>\n }\n />\n </FormControl>\n <Controller\n control={control}\n name={TeamFormFieldsNames.countryCode as Path<TFormValues>}\n render={({ field: { onChange, value, name }, fieldState: { error } }) => (\n <FormControl error={!!error} fullWidth>\n <FormFormLabel>Country</FormFormLabel>\n <Select size={'small'} labelId={`${name}-label`} id={name} value={value} onChange={onChange}>\n {countryCodes}\n </Select>\n {error && <FormHelperText error>{error.message}</FormHelperText>}\n </FormControl>\n )}\n />\n </>\n );\n}\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { IconUser } from 'shared/components/icons/icon-user';\n\nimport { useInvalidateTeams } from '../../api/teams/use-teams';\nimport { useCreateBackofficeTeam } from '../../api/use-create-backoffice-team';\nimport { TeamForm } from '../../pages/teams/components/team-form';\nimport { createTeamFormSchema, TeamTypes } from '../../pages/teams/components/team-form/form';\nimport {\n CreateTeamForm,\n CreateTeamFormSchema,\n TeamFormFieldsNames,\n} from '../../pages/teams/components/team-form/types';\nimport { MetadataTeam } from '../../types/games';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n onSuccess?: (team: MetadataTeam) => void;\n}\n\nexport const CreateTeamModal = ({ open, onClose, onSuccess }: Props) => {\n const formRef = useRef<HTMLFormElement>(null);\n const invalidateQuery = useInvalidateTeams();\n const {\n register,\n formState: { errors },\n handleSubmit,\n watch,\n trigger,\n control,\n } = useForm<CreateTeamFormSchema>({\n resolver: zodResolver(createTeamFormSchema),\n defaultValues: {\n [TeamFormFieldsNames.teamType]: TeamTypes.club,\n [TeamFormFieldsNames.countryCode]: '',\n },\n });\n\n const { createTeam } = useCreateBackofficeTeam();\n\n const handleCreateTeam = useCallback(\n (team: CreateTeamForm) => {\n createTeam({\n data: {\n name: team[TeamFormFieldsNames.name],\n country_code: team[TeamFormFieldsNames.countryCode],\n team_type: team[TeamFormFieldsNames.teamType],\n abbreviation: team[TeamFormFieldsNames.abbreviation],\n image: team[TeamFormFieldsNames.teamImage] ? team[TeamFormFieldsNames.teamImage][0] : undefined,\n },\n onSuccess: (team: MetadataTeam) => {\n onSuccess && onSuccess(team);\n invalidateQuery().then(() => onClose());\n },\n });\n },\n [onSuccess, createTeam, invalidateQuery, onClose],\n );\n\n const handleModalSubmit = useCallback(() => {\n formRef.current?.requestSubmit();\n }, []);\n\n return (\n <DialogNew\n maxWidth='sm'\n fullWidth\n title='New team'\n icon={<IconUser size='small' />}\n onCancel={onClose}\n onClose={onClose}\n onSubmit={handleModalSubmit}\n buttonSubmitText={'Create team'}\n open={open}\n >\n <form ref={formRef} onSubmit={handleSubmit(handleCreateTeam)}>\n <TeamForm<CreateTeamFormSchema>\n errors={errors}\n register={register}\n watch={watch}\n trigger={trigger}\n control={control}\n />\n </form>\n </DialogNew>\n );\n};\n","import { useQueries, UseQueryResult } from '@tanstack/react-query';\n\nimport { useBackendApi } from 'api/hooks/useBackendApi';\nimport { HTTPMethod } from 'api/types';\n\nimport { transformMetadataGame } from '../../api/games/transformers';\nimport { getMetadataGameQueryKey } from '../../api/games/use-metadata-game';\nimport { annotationApiUrls } from '../../api/routes';\nimport { MetadataGame } from '../../types/games';\n\nexport const useMetadataGameQueries = (gameIds: string[] = []) => {\n const gameQueries = gameIds.map((gameId) => {\n return {\n queryKey: getMetadataGameQueryKey(gameId),\n queryFn: () => useBackendApi(`${annotationApiUrls.GAMES}/${gameId}`, HTTPMethod.GET, transformMetadataGame),\n };\n });\n\n return useQueries<MetadataGame[]>({\n queries: gameQueries,\n }) as UseQueryResult<MetadataGame>[];\n};\n","import { Box, Checkbox, Stack, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport { useCallback, useMemo } from 'react';\n\nimport Spinner from 'shared/components/spinner';\nimport { useDates } from 'shared/hooks/use-dates';\n\nimport { usePlayersMappings } from '../../../../../api/use-players-mappings';\nimport { MetadataPlayerSummary } from '../../../../../types/players';\nimport { PlayerPhoto } from '../../../../players/components/player-photo/player-photo';\nimport { PlayerPhotoSkeleton } from '../../../../players/components/player-photo-skeleton';\nimport { PlayerListHeader } from '../player-list/player-list-header';\nimport { getJerseyNumber, getTeamLastGameDate, getTeamName } from '../selected-players';\n\ntype Props = {\n latestPlayers: MetadataPlayerSummary[];\n selectedPlayers: MetadataPlayerSummary[];\n addPlayers: (player: MetadataPlayerSummary[]) => void;\n removePlayers: (player: MetadataPlayerSummary[]) => void;\n displayOption?: 'remove' | 'checkbox';\n isLoading: boolean;\n};\n\nexport const SelectableListOfPlayers = ({\n latestPlayers,\n selectedPlayers = [],\n addPlayers,\n removePlayers,\n displayOption,\n isLoading,\n}: Props) => {\n const { data: mappings, isLoading: isMappingsLoading } = usePlayersMappings();\n\n const { dateToString } = useDates();\n const handleCheckboxChange = useCallback(\n (player: MetadataPlayerSummary) => (event: React.ChangeEvent<HTMLInputElement>) => {\n event.target.checked ? addPlayers([player]) : removePlayers([player]);\n },\n\n [addPlayers, removePlayers],\n );\n\n const toggleAllPlayers = useCallback(() => {\n selectedPlayers.length === 0 ? addPlayers(latestPlayers) : removePlayers(latestPlayers);\n }, [selectedPlayers, latestPlayers, addPlayers, removePlayers]);\n\n const playerIds = useMemo(() => selectedPlayers.map((player) => player.id), [selectedPlayers]);\n\n const isChecked = selectedPlayers.length === latestPlayers.length && selectedPlayers.length > 0;\n const isIndeterminate = selectedPlayers.length > 0 && selectedPlayers.length < latestPlayers.length;\n\n if ((isLoading || isMappingsLoading) && selectedPlayers.length === 0)\n return (\n <Stack justifyContent={'center'} alignItems={'center'} sx={{ color: Colors.storm, padding: 2 }}>\n <Spinner />\n </Stack>\n );\n\n if (latestPlayers.length === 0)\n return <Box sx={{ color: Colors.storm, padding: 2 }}>No players available for this game</Box>;\n\n return (\n <Stack gap={1}>\n <PlayerListHeader />\n {displayOption === 'checkbox' ? (\n <Stack direction={'row'} alignItems={'center'} gap={1}>\n <Checkbox checked={isChecked} indeterminate={isIndeterminate} onChange={toggleAllPlayers} />\n\n <label style={{ lineHeight: 1 }}>{isChecked || isIndeterminate ? 'Unselect all' : 'Select all'}</label>\n </Stack>\n ) : null}\n <Stack>\n {latestPlayers.map((player) => {\n const teamName = getTeamName(player);\n const lastGameDate = getTeamLastGameDate(player);\n const formattedLastGameDate = lastGameDate ? dateToString(lastGameDate) : undefined;\n const position = player.position ?? undefined;\n const side = player.side ?? undefined;\n const jerseyNumber = getJerseyNumber(player);\n\n return (\n <Box\n key={`last-games-${player.id}`}\n sx={{\n borderBottom: `1px solid ${Colors.athens}`,\n padding: 1,\n display: 'grid',\n alignItems: 'center',\n gridTemplateColumns: '32px 1.5fr 170px 170px 100px 2fr',\n }}\n >\n <Checkbox\n checked={playerIds.includes(player.id)}\n color='secondary'\n onChange={handleCheckboxChange(player)}\n />\n <Stack direction={'row'} alignItems={'center'} gap={1}>\n {player.photoUrl ? <PlayerPhoto src={player.photoUrl} /> : <PlayerPhotoSkeleton small />}\n <Typography sx={{ minWidth: '100px' }}>{player.name}</Typography>\n </Stack>\n <Typography sx={{ minWidth: '100px' }}>\n {mappings && position ? `${mappings.positions[position]} (${position})` : ''}\n </Typography>\n <Typography sx={{ minWidth: '100px' }}>\n {mappings && side ? `${mappings.sides[side]} (${side}}` : ''}\n </Typography>\n <Typography sx={{ minWidth: '100px' }}>{jerseyNumber}</Typography>\n {teamName && formattedLastGameDate ? (\n <Typography sx={{ wrap: 'no-wrap' }}>\n {teamName} / {formattedLastGameDate}\n </Typography>\n ) : null}\n </Box>\n );\n })}\n </Stack>\n </Stack>\n );\n};\n","import { Box, Checkbox, Grid, styled } from '@mui/material';\nimport { Colors, fontSizes } from 'kognia-ui';\n\nimport { getTeamLastGameDate, getTeamName } from 'pages/backoffice/pages/games/game-form/components/selected-players';\nimport { PlayerPhoto } from 'pages/backoffice/pages/players/components/player-photo/player-photo';\nimport { PlayerPhotoSkeleton } from 'pages/backoffice/pages/players/components/player-photo-skeleton';\nimport { MetadataPlayerSummary } from 'pages/backoffice/types/players';\n\nimport { useDates } from '../../../../hooks/use-dates';\n\ninterface Props {\n player: MetadataPlayerSummary;\n isChecked: boolean;\n autocompleteWidth: number;\n}\n\nconst Details = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(),\n justifyContent: 'space-between',\n lineHeight: 1,\n flex: 1,\n width: '100%',\n}));\n\ninterface NameProps {\n maxWidth: number;\n}\n\nconst Name = styled(Box, { shouldForwardProp: (prop) => prop !== 'maxWidth' })<NameProps>(({ maxWidth }) => ({\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: `${maxWidth - 56}px`,\n}));\n\nconst Team = styled(Box)(({ theme }) => ({\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n textAlign: 'right',\n flex: 1,\n paddingRight: theme.spacing(1),\n}));\n\nconst Date = styled(Box)(() => ({\n fontSize: fontSizes.small,\n color: Colors.storm,\n}));\n\nconst Result = styled(Grid)(({ theme }) => ({\n borderBottom: `1px solid ${theme.palette.divider}`,\n padding: theme.spacing(0.5),\n justifyContent: 'space-between',\n alignItems: 'center',\n '&:hover': {\n background: Colors.background,\n },\n}));\n\nexport const AutocompletePlayerResult = ({ player, isChecked, autocompleteWidth }: Props) => {\n const { dateToString } = useDates();\n const teamName = getTeamName(player);\n const lastGameDate = getTeamLastGameDate(player);\n const formattedLastGameDate = lastGameDate ? dateToString(lastGameDate) : undefined;\n\n return (\n <Result container sx={{ width: `${autocompleteWidth}px` }}>\n <Grid container spacing={1} alignItems='center'>\n <Grid item>\n <Checkbox checked={isChecked} />\n </Grid>\n <Grid item sx={{ flex: 1 }}>\n <Details>\n {player.photoUrl ? <PlayerPhoto src={player.photoUrl} /> : <PlayerPhotoSkeleton small />}\n <Name title={player.name} maxWidth={176}>\n {player.name}\n </Name>\n {teamName && formattedLastGameDate ? (\n <Team title={teamName}>\n <div>{teamName}</div>\n <Date>{formattedLastGameDate}</Date>\n </Team>\n ) : null}\n </Details>\n </Grid>\n </Grid>\n </Result>\n );\n};\n","import { Box, ClickAwayListener, ListItem } from '@mui/material';\nimport React, { useCallback, useState } from 'react';\n\nimport ActiveFilters from 'shared/components/active-filters';\nimport { Autocomplete } from 'shared/components/autocomplete';\nimport { AutocompleteActiveFilter } from 'shared/components/autocomplete-multi-select/components/autocomplete-active-filter';\nimport { AutocompleteDropdownButton } from 'shared/components/autocomplete-multi-select/components/autocomplete-dropdown-button';\nimport { AutocompletePlayerResult } from 'shared/components/autocomplete-multi-select/components/autocomplete-player-result';\nimport {\n AutocompletePopper,\n AutocompletePopperContent,\n} from 'shared/components/autocomplete-multi-select/components/autocomplete-popper';\nimport { AutocompletePopperWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-popper-wrapper';\nimport { AutocompleteResultsWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-results-wrapper';\nimport { AutocompleteTag } from 'shared/components/autocomplete-multi-select/components/autocomplete-tag';\n\nimport { usePlayers } from '../../../../../api/players/use-players';\nimport { MetadataPlayerSummary } from '../../../../../types/players';\nimport { getJerseyNumber } from '../selected-players';\n\ninterface Props {\n setPlayersOnChange: (players: MetadataPlayerSummary[]) => void;\n players: MetadataPlayerSummary[];\n showPlayersSelectionList?: boolean;\n}\n\ntype PlayerFilters = {\n name: string;\n};\n\nconst INITIAL_PLAYERS_FILTERS: PlayerFilters = {\n name: '',\n};\n\nconst AUTOCOMPLETE_WIDTH = 400;\n\nexport const SelectPlayers = ({ players, setPlayersOnChange, showPlayersSelectionList = true }: Props) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [autocompleteValues, setAutocompleteValues] = useState<MetadataPlayerSummary[]>([]);\n const { items: playersResults, isLoading, setFilters, fetchNextPage } = usePlayers();\n\n const handleSetPlayersOnChange = useCallback(\n (players: MetadataPlayerSummary[]) => {\n setPlayersOnChange(players.map((player) => ({ ...player, jerseyNumber: getJerseyNumber(player) })));\n },\n [setPlayersOnChange],\n );\n\n const isOpen = Boolean(anchorEl);\n\n const close = useCallback(() => {\n setFilters(INITIAL_PLAYERS_FILTERS);\n setAnchorEl(null);\n }, [setAnchorEl, setFilters]);\n\n const open = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setAutocompleteValues(players);\n setAnchorEl(event.currentTarget);\n },\n [setAutocompleteValues, players],\n );\n\n const handleAddClipsClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n isOpen ? close() : open(event);\n },\n [isOpen, close, open],\n );\n\n const handleUpdateValue = useCallback(\n (newValues: MetadataPlayerSummary[] | null) => {\n if (newValues === null) return;\n\n setAutocompleteValues(newValues);\n },\n [setAutocompleteValues],\n );\n\n const handleApply = useCallback(() => {\n setAutocompleteValues((autocompleteValues) => {\n handleSetPlayersOnChange(autocompleteValues);\n return autocompleteValues;\n });\n close();\n }, [setAutocompleteValues, handleSetPlayersOnChange, close]);\n\n const handleReset = useCallback(() => {\n setAutocompleteValues([]);\n }, [setAutocompleteValues]);\n\n const handleRemoveRecording = useCallback(\n (recordingId: string) => {\n handleSetPlayersOnChange(players.filter((value) => value.id !== recordingId));\n },\n [handleSetPlayersOnChange, players],\n );\n\n const handleRemoveAutocompletePlayer = useCallback(\n (recordingId: string) => {\n setAutocompleteValues(autocompleteValues.filter((value) => value.id !== recordingId));\n },\n [setAutocompleteValues, autocompleteValues],\n );\n\n const handleRenderItem = useCallback(\n (\n props: React.ComponentProps<typeof ListItem>,\n option: MetadataPlayerSummary,\n {\n selected,\n }: {\n selected: boolean;\n },\n ) => {\n return (\n <ListItem {...props} key={option.id} disablePadding>\n <AutocompletePlayerResult autocompleteWidth={AUTOCOMPLETE_WIDTH} isChecked={selected} player={option} />\n </ListItem>\n );\n },\n [],\n );\n\n const handleSetName = useCallback(\n (name: string) => {\n setFilters({ name: name });\n },\n [setFilters],\n );\n\n const renderTags = useCallback(\n (players: MetadataPlayerSummary[]): React.ReactNode => {\n return (\n <AutocompleteTag>\n {players.map((player) => {\n return (\n <AutocompleteActiveFilter\n id={player.id}\n key={player.id}\n name={player.name}\n onRemove={handleRemoveAutocompletePlayer}\n size='small'\n />\n );\n })}\n </AutocompleteTag>\n );\n },\n [handleRemoveAutocompletePlayer],\n );\n\n const paperComponent: React.JSXElementConstructor<React.HTMLAttributes<HTMLElement>> = useCallback(\n (props) => (\n <AutocompleteResultsWrapper {...props} resetText={'clear selection'} onReset={handleReset} onApply={handleApply}>\n {props.children}\n </AutocompleteResultsWrapper>\n ),\n [handleReset, handleApply],\n );\n\n const isOptionEqual = useCallback(\n (option: MetadataPlayerSummary, value: MetadataPlayerSummary) => option.id === value.id,\n [],\n );\n const getOptionName = useCallback((option: MetadataPlayerSummary) => option.name, []);\n\n return (\n <Box>\n <AutocompleteDropdownButton\n isOpen={isOpen}\n onClick={handleAddClipsClick}\n isSelected={players.length > 0}\n fullWidth\n label={players.length > 0 ? `${players.length} Player(s)` : 'Search...'}\n />\n {isOpen && (\n <ClickAwayListener onClickAway={handleApply}>\n <AutocompletePopper anchorEl={anchorEl} open={isOpen} placement='bottom-start'>\n <AutocompletePopperContent elevation={8}>\n <Autocomplete\n autoFocus\n PaperComponent={paperComponent}\n PopperComponent={AutocompletePopperWrapper}\n fetchNextPage={fetchNextPage}\n getItemLabel={getOptionName}\n inputWidth={AUTOCOMPLETE_WIDTH}\n isLoading={isLoading}\n isOptionEqualToValue={isOptionEqual}\n listWidth={AUTOCOMPLETE_WIDTH}\n multiple={true}\n onChange={handleSetName}\n open\n options={playersResults}\n renderOption={handleRenderItem}\n renderTags={renderTags}\n resultsHeight={310}\n resultsNoMatches={'No players found'}\n updateValue={handleUpdateValue}\n value={autocompleteValues}\n />\n </AutocompletePopperContent>\n </AutocompletePopper>\n </ClickAwayListener>\n )}\n {showPlayersSelectionList && players && (\n <ActiveFilters>\n {players.map((player) => (\n <AutocompleteActiveFilter\n id={player.id}\n key={player.id}\n name={player.name}\n onRemove={handleRemoveRecording}\n />\n ))}\n </ActiveFilters>\n )}\n </Box>\n );\n};\n","import { Box, ClickAwayListener, ListItem } from '@mui/material';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Autocomplete } from 'shared/components/autocomplete';\nimport { AutocompleteDropdownButton } from 'shared/components/autocomplete-multi-select/components/autocomplete-dropdown-button';\nimport {\n AutocompletePopper,\n AutocompletePopperContent,\n} from 'shared/components/autocomplete-multi-select/components/autocomplete-popper';\nimport { AutocompletePopperWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-popper-wrapper';\n\nimport { useTeams } from '../../../../../api/teams/use-teams';\nimport { RenderSelectOption } from '../../../../../components/select-components/render-option';\nimport { MetadataTeam } from '../../../../../types/games';\n\nexport type TeamsFilters = {\n name: string;\n};\n\nconst INITIAL_TEAMS_FILTERS: TeamsFilters = {\n name: '',\n};\n\ninterface SearchResultsProps {\n open: boolean;\n children: React.ReactNode;\n}\n\nexport const SearchResults = ({ open, children }: SearchResultsProps) => {\n if (!open) return null;\n\n return <Box>{children}</Box>;\n};\n\ninterface Props {\n setTeamOnChange: (team: MetadataTeam | undefined) => void;\n team: MetadataTeam;\n disabled?: boolean;\n}\n\nconst AUTOCOMPLETE_WIDTH = 400;\n\nexport const SelectMetadataTeam = ({ team, setTeamOnChange, disabled = false }: Props) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [autocompleteValue, setAutocompleteValue] = useState<MetadataTeam | undefined>();\n const { items: teamsResults, isLoading, setFilters, fetchNextPage } = useTeams();\n const { t } = useTranslation();\n\n const isOpen = Boolean(anchorEl);\n\n const open = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setAutocompleteValue(team);\n setAnchorEl(event.currentTarget);\n },\n [team],\n );\n\n const close = useCallback(() => {\n setFilters(INITIAL_TEAMS_FILTERS);\n setAnchorEl(null);\n }, [setFilters]);\n\n const handleDropdownClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n isOpen ? close() : open(event);\n },\n [isOpen, close, open],\n );\n\n const handleSelectTeam = useCallback(() => {\n setAutocompleteValue((autocompleteValue) => {\n setTeamOnChange(autocompleteValue);\n return autocompleteValue;\n });\n close();\n }, [close, setTeamOnChange]);\n\n const handleSetName = useCallback(\n (name: string) => {\n setFilters({ name: name });\n },\n [setFilters],\n );\n\n const renderOption = useCallback((props: React.ComponentProps<typeof ListItem>, option: MetadataTeam) => {\n return <RenderSelectOption {...props} key={option.id} name={option.name} />;\n }, []);\n\n const paperComponent = useCallback(\n (props: any) => (\n <SearchResults {...props} open={isOpen}>\n {props.children}\n </SearchResults>\n ),\n [isOpen],\n );\n\n const handleUpdateValue = useCallback(\n (item: MetadataTeam | null) => {\n if (item === null) return;\n setAutocompleteValue(item);\n setTeamOnChange(item);\n close();\n },\n [setAutocompleteValue, setTeamOnChange, close],\n );\n\n const isOptionEqual = useCallback((option: MetadataTeam, value: MetadataTeam) => option.id === value.id, []);\n const getOptionName = useCallback((option: MetadataTeam) => option.name, []);\n\n return (\n <Box>\n <AutocompleteDropdownButton\n isOpen={isOpen}\n fullWidth\n onClick={handleDropdownClick}\n isSelected={Boolean(team)}\n label={team ? team.name : 'Select team'}\n disabled={disabled}\n />\n {anchorEl && (\n <ClickAwayListener onClickAway={handleSelectTeam}>\n <AutocompletePopper anchorEl={anchorEl} open={isOpen} placement='bottom-start'>\n <AutocompletePopperContent elevation={8}>\n <Autocomplete\n autoFocus\n PaperComponent={paperComponent}\n PopperComponent={AutocompletePopperWrapper}\n fetchNextPage={fetchNextPage}\n getItemLabel={getOptionName}\n inputWidth={AUTOCOMPLETE_WIDTH}\n isLoading={isLoading}\n isOptionEqualToValue={isOptionEqual}\n listWidth={AUTOCOMPLETE_WIDTH}\n multiple={false}\n onChange={handleSetName}\n open\n options={teamsResults}\n renderOption={renderOption}\n placeholder={t('common:actions.search')}\n resultsHeight={260}\n updateValue={handleUpdateValue}\n value={autocompleteValue}\n />\n </AutocompletePopperContent>\n </AutocompletePopper>\n </ClickAwayListener>\n )}\n </Box>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Box,\n Button,\n Card,\n CardContent,\n Checkbox,\n Divider,\n FormControl,\n Grid,\n ListItemText,\n MenuItem,\n Select,\n Stack,\n Typography,\n} from '@mui/material';\nimport { animationDurations, animations, Colors, fontWeight } from 'kognia-ui';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { generatePath, useHistory, useParams } from 'react-router-dom';\n\nimport { FormFormLabel } from 'shared/components/form/form-form-label';\nimport { IconUser } from 'shared/components/icons/icon-user';\nimport { useDates } from 'shared/hooks/use-dates';\nimport { MatchTeamTypes } from 'shared/types/teams/types';\n\nimport { getLatestPlayersFromGames } from './utils/get-latest-players-from-games';\nimport { useTeam } from '../../../../../api/teams/use-team';\nimport { CreatePlayerModal } from '../../../../../components/create-player-modal';\nimport { CreateTeamModal } from '../../../../../components/create-team-modal';\nimport { useMetadataGameQueries } from '../../../../../hooks/use-metadata-game-queries';\nimport { MetadataTeam } from '../../../../../types/games';\nimport { MetadataPlayerSummary } from '../../../../../types/players';\nimport { FORM_IDS, NEW_GAME_FORM_STEPS, useSetTeamData, useTeamData } from '../../config';\nimport { gameTeamFormSchema, TeamFormFieldsNames, TeamFormFormSchema } from '../../forms';\nimport { GameFormRouteParams } from '../../types';\nimport { SelectableListOfPlayers } from '../last-games-players-selector';\nimport { SelectPlayers } from '../select-metadata-players';\nimport { SelectMetadataTeam } from '../select-metadata-team';\nimport { getJerseyNumber, SelectedPlayers } from '../selected-players';\n\ntype Props = {\n teamType: MatchTeamTypes;\n step: number;\n};\n\nexport const TeamForm = ({ teamType, step }: Props) => {\n const { id } = useParams<GameFormRouteParams>();\n const { dateToString } = useDates();\n const [selectedFixtureIds, setSelectedFixtureIds] = useState<string[] | undefined>(undefined);\n const [isCreateTeamModalOpen, setIsCreateTeamModalOpen] = useState(false);\n const [isCreatePlayerModalOpen, setIsCreatePlayerModalOpen] = useState(false);\n const history = useHistory();\n const teamData = useTeamData(teamType);\n const setTeamData = useSetTeamData(teamType);\n const teamFormRef = useRef<HTMLFormElement>(null);\n const {\n handleSubmit,\n watch,\n control,\n setValue,\n formState: { errors },\n } = useForm<TeamFormFormSchema>({\n resolver: zodResolver(gameTeamFormSchema),\n defaultValues: teamData ? teamData : undefined,\n });\n\n const selectedPlayers = watch(TeamFormFieldsNames.players);\n const selectedTeam = watch(TeamFormFieldsNames.team);\n const team = useTeam({\n teamId: selectedTeam?.id,\n onSuccess: (team) => {\n setSelectedFixtureIds(team.fixtures.length > 0 ? team.fixtures.map((item) => item.id) : undefined);\n },\n });\n const games = useMetadataGameQueries(selectedFixtureIds);\n const isLoadingGames = games.reduce((acc, game) => acc || game.isLoading, false);\n\n useEffect(() => {\n if (selectedTeam) setTeamData({ team: selectedTeam, players: selectedPlayers ?? [] });\n }, [setTeamData, selectedPlayers, selectedTeam]);\n\n const handleAddPlayers = useCallback(\n (players: MetadataPlayerSummary[]) => {\n const selectedPlayersIds = (selectedPlayers ?? []).map((p) => p.id);\n const playersToAdd = players\n .filter((p) => !selectedPlayersIds.includes(p.id))\n .map((p) => ({\n ...p,\n jerseyNumber: getJerseyNumber(p),\n }));\n setValue(TeamFormFieldsNames.players, [...(selectedPlayers ?? []), ...playersToAdd]);\n },\n [setValue, selectedPlayers],\n );\n\n const handleAddPlayer = useCallback(\n (player: MetadataPlayerSummary) => {\n handleAddPlayers([player]);\n },\n [handleAddPlayers],\n );\n\n const handleUpdatePlayer = useCallback(\n (player: MetadataPlayerSummary) => {\n setValue(\n TeamFormFieldsNames.players,\n selectedPlayers.map((p) => {\n return p.id === player.id ? player : p;\n }),\n );\n },\n [setValue, selectedPlayers],\n );\n\n const handleRemovePlayers = useCallback(\n (players: MetadataPlayerSummary[]) => {\n const removePlayerIds = players.map((p) => p.id);\n setValue(\n TeamFormFieldsNames.players,\n (selectedPlayers ?? []).filter((p) => !removePlayerIds.includes(p.id)),\n );\n },\n [setValue, selectedPlayers],\n );\n\n const handleSelectTeam = useCallback(\n (team: MetadataTeam) => {\n setValue(TeamFormFieldsNames.team, team);\n },\n [setValue],\n );\n\n const handleSetTeamData = useCallback(\n (teamData: TeamFormFormSchema) => {\n setTeamData({\n team: teamData.team,\n players: teamData.players,\n });\n history.push(generatePath(NEW_GAME_FORM_STEPS[step + 1], { id }));\n },\n [id, step, history, setTeamData],\n );\n\n const handleOnSubmit = async (event: React.FormEvent) => {\n event.preventDefault();\n return handleSubmit(handleSetTeamData)(event);\n };\n\n const latestPlayersFromGames = getLatestPlayersFromGames({\n team: team.data,\n games,\n });\n\n return (\n <>\n <form id={FORM_IDS[step]} ref={teamFormRef} onSubmit={handleOnSubmit}>\n <Grid container justifyContent={'center'} sx={{ paddingBottom: 4 }}>\n <Grid item xs={12} md={12} xl={12}>\n <Stack gap={4}>\n <Stack gap={4}>\n <FormControl fullWidth>\n <Stack direction={'row'} justifyContent={'space-between'} alignItems={'center'}>\n <FormFormLabel>\n {teamType === 'homeTeam' ? 'Select home team' : 'Select opponent team'}\n </FormFormLabel>\n <Box>\n <Button onClick={() => setIsCreateTeamModalOpen(true)}>+ new team</Button>\n </Box>\n </Stack>\n <Controller\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <SelectMetadataTeam\n setTeamOnChange={(team: MetadataTeam | undefined) => {\n if (!selectedTeam || !team || selectedTeam.id !== team.id) {\n setValue(TeamFormFieldsNames.players, []);\n }\n onChange(team);\n }}\n team={value || undefined}\n />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </>\n )}\n name={TeamFormFieldsNames.team}\n control={control}\n />\n </FormControl>\n\n <FormControl fullWidth>\n <Stack direction={'row'} justifyContent={'space-between'} alignItems={'center'}>\n <FormFormLabel>Select players</FormFormLabel>\n <Box>\n <Button onClick={() => setIsCreatePlayerModalOpen(true)}>+ new player</Button>\n </Box>\n </Stack>\n <Controller\n render={({ field: { onChange, value } }) => (\n <>\n <SelectPlayers\n showPlayersSelectionList={false}\n setPlayersOnChange={onChange}\n players={value || []}\n />\n </>\n )}\n name={TeamFormFieldsNames.players}\n control={control}\n />\n </FormControl>\n {team.data && selectedTeam && selectedFixtureIds ? (\n <FormControl fullWidth sx={{ animation: `${animations.fadeIn} ${animationDurations.fast} ease-out` }}>\n <Stack gap={1}>\n <Card>\n <CardContent>\n <Stack gap={2}>\n <Stack direction={'row'} gap={2} alignItems={'center'}>\n <Typography\n sx={{\n fontWeight: fontWeight['500'],\n color: Colors.shark,\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n }}\n >\n <IconUser /> <span>Latest games</span>\n </Typography>\n {team.data ? (\n <FormControl sx={{ width: 300 }}>\n <Select\n value={selectedFixtureIds}\n renderValue={(selected) => {\n return selected\n .map((s) => {\n return team.data.fixtures.find((f) => f.id === s)?.name;\n })\n .join(', ');\n }}\n multiple\n onChange={(event) => {\n setSelectedFixtureIds(event.target.value as string[]);\n }}\n sx={{ animation: `${animations.fadeIn} ${animationDurations.fast} ease-out` }}\n >\n {team.data.fixtures.map((fixture) => (\n <MenuItem value={fixture.id} key={`team-fixture-${fixture.id}`}>\n <Checkbox checked={selectedFixtureIds.indexOf(fixture.id) > -1} />\n <ListItemText>\n {fixture.name} - {dateToString(fixture.date)}\n </ListItemText>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n ) : null}\n </Stack>\n <Divider />\n <Stack gap={2} sx={{ maxHeight: '376px', overflowY: 'scroll' }}>\n <SelectableListOfPlayers\n isLoading={isLoadingGames}\n displayOption={'checkbox'}\n latestPlayers={latestPlayersFromGames ?? []}\n selectedPlayers={(selectedPlayers ?? []).filter(\n (p) => latestPlayersFromGames?.map((p) => p.id).includes(p.id),\n )}\n addPlayers={handleAddPlayers}\n removePlayers={handleRemovePlayers}\n />\n </Stack>\n </Stack>\n </CardContent>\n </Card>\n </Stack>\n </FormControl>\n ) : null}\n </Stack>\n\n <SelectedPlayers\n selectedPlayers={selectedPlayers ?? []}\n removePlayers={handleRemovePlayers}\n onUpdatePlayer={handleUpdatePlayer}\n error={errors[TeamFormFieldsNames.players]?.message ? errors[TeamFormFieldsNames.players].message : ''}\n />\n </Stack>\n </Grid>\n </Grid>\n </form>\n {isCreateTeamModalOpen ? (\n <CreateTeamModal\n onSuccess={handleSelectTeam}\n open={isCreateTeamModalOpen}\n onClose={() => setIsCreateTeamModalOpen(false)}\n />\n ) : null}\n {isCreatePlayerModalOpen ? (\n <CreatePlayerModal\n onSuccess={handleAddPlayer}\n open={isCreatePlayerModalOpen}\n onClose={() => setIsCreatePlayerModalOpen(false)}\n />\n ) : null}\n </>\n );\n};\n","import { useLocation } from 'react-router-dom';\n\nimport { MatchTeamTypes } from 'shared/types/teams/types';\n\nimport { TeamForm } from '../../components/team-form';\nimport { getCurrentStepFromPathName, useCheckValidateStep } from '../../config';\n\nexport const HomeTeamForm = () => {\n const location = useLocation();\n const step = getCurrentStepFromPathName(location.pathname);\n\n useCheckValidateStep(step);\n\n return <TeamForm teamType={MatchTeamTypes.HOME} step={step} />;\n};\n","import { MatchTeamTypes } from 'shared/types/teams/types';\n\nimport { TeamForm } from '../../components/team-form';\nimport { useCheckValidateStep } from '../../config';\n\nexport const OpponentTeamForm = () => {\n useCheckValidateStep(1);\n\n return <TeamForm teamType={MatchTeamTypes.OPPONENT} step={1} />;\n};\n","import { Box, styled } from '@mui/material';\nimport MuiDialogTitle from '@mui/material/DialogTitle';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\nimport React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n icon?: React.ReactNode;\n}\n\nconst BackofficeSectionWrapper = styled(Box)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n textTransform: 'uppercase',\n flexDirection: 'column',\n padding: theme.spacing(3),\n}));\n\nconst BackofficeSectionTitle = styled(MuiDialogTitle)({\n fontSize: fontSizes.default,\n padding: 0,\n letterSpacing: 2,\n fontWeight: fontWeight['500'],\n color: Colors.night,\n});\n\nconst BackofficeSectionIcon = styled(Box)(({ theme }) => ({\n padding: theme.spacing(2.5),\n backgroundColor: Colors.background,\n borderRadius: '50%',\n marginBottom: theme.spacing(2),\n}));\n\nexport const BackofficeSection = ({ children, icon }: Props) => {\n return (\n <BackofficeSectionWrapper>\n {icon && <BackofficeSectionIcon>{icon}</BackofficeSectionIcon>}\n <BackofficeSectionTitle>{children}</BackofficeSectionTitle>\n </BackofficeSectionWrapper>\n );\n};\n","import { Box, Stack } from '@mui/material';\nimport React from 'react';\nimport { Switch, useParams } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport IconBall from 'shared/components/icons/icon-ball';\nimport { ProtectedRoute } from 'shared/components/protected-route';\n\nimport { GameFormNavigation } from './components/game-form-navigation';\nimport GameFormStepper from './components/game-form-stepper';\nimport { getCurrentStepFromPathName } from './config';\nimport { GameFormInfo } from './steps/game-info-form';\nimport { GameSummary } from './steps/game-summary';\nimport { HomeTeamForm } from './steps/home-team-form';\nimport { OpponentTeamForm } from './steps/opponent-team-form';\nimport { GameFormRouteParams } from './types';\nimport { BackofficeSection } from '../../../components/backoffice-section-header';\n\nconst getPageTitle = (id: string, step: number) => {\n if (step === 3) return 'GAME SUMMARY';\n\n return id ? 'EDIT GAME' : 'NEW GAME';\n};\n\nexport const GameForm = () => {\n const { id } = useParams<GameFormRouteParams>();\n const currentStep = getCurrentStepFromPathName(location.pathname);\n\n return (\n <Box sx={{ display: 'flex', height: '100vh', flexDirection: 'column', background: '#fff' }}>\n <Stack sx={{ flexGrow: 1, overflowY: 'scroll', padding: '0 32px 0px' }} gap={4}>\n <BackofficeSection icon={<IconBall size='small' />}>{getPageTitle(id, currentStep)}</BackofficeSection>\n <GameFormStepper step={currentStep} />\n <Switch>\n <ProtectedRoute path={routes.BACKOFFICE_GAME_FORM_STEP_1} component={HomeTeamForm} exact />\n <ProtectedRoute path={routes.BACKOFFICE_GAME_FORM_STEP_2} component={OpponentTeamForm} exact />\n <ProtectedRoute path={routes.BACKOFFICE_GAME_FORM_STEP_3} component={GameFormInfo} exact />\n <ProtectedRoute path={routes.BACKOFFICE_NEW_GAME_SUMMARY} component={GameSummary} exact />\n </Switch>\n </Stack>\n <GameFormNavigation step={currentStep} />\n </Box>\n );\n};\n","import { useEffect } from 'react';\nimport { useHistory, useParams } from 'react-router-dom';\n\nimport { GameForm } from '../game-form';\nimport { useResetGameFormData } from '../game-form/config';\nimport { GameFormRouteParams } from '../game-form/types';\n\nexport const NewGame = () => {\n const history = useHistory();\n const { id } = useParams<GameFormRouteParams>();\n const resetNewGameData = useResetGameFormData();\n\n useEffect(() => {\n if (!id) resetNewGameData();\n }, [id, history, resetNewGameData]);\n\n return <GameForm />;\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { MetadataPlayerApiResponse } from '../use-players/types';\n\ntype UpdatePlayerParams = Pick<MetadataPlayerApiResponse, 'name' | 'uuid'> & { image?: File };\n\ninterface RequestData {\n data: UpdatePlayerParams;\n onSuccess?: () => void;\n}\n\nexport const useEditPlayer = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.PATCH,\n successMessage: 'Player updated',\n errorMessage: (data) => metadataApiErrorParser(data, 'Error updating player'),\n });\n\n const editPlayer = ({ data, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n const formData = new FormData();\n formData.append('player', JSON.stringify({ name: data.name }));\n data.image && formData.append('player_image', data.image);\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.PLAYERS}/${data.uuid}`,\n data: formData,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, editPlayer };\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport React, { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport IconEdit from 'shared/components/icons/icon-edit';\n\nimport { useEditPlayer } from '../../../../api/players/use-edit-player';\nimport { useInvalidatePlayers } from '../../../../api/players/use-players';\nimport { MetadataPlayerSummary } from '../../../../types/players';\nimport { PlayerForm } from '../player-form';\nimport { editPlayerFormSchema } from '../player-form/form';\nimport { EditPlayerForm, EditPlayerFormSchema, PlayerFormFieldsNames } from '../player-form/types';\nimport { PlayerPhotoPreview } from '../player-photo-preview';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n player: MetadataPlayerSummary;\n playerId: string;\n}\n\nexport const EditPlayerModal = ({ open, onClose, player, playerId }: Props) => {\n const formRef = useRef<HTMLFormElement>(null);\n const invalidatePlayers = useInvalidatePlayers();\n const { editPlayer } = useEditPlayer();\n\n const initialValues = {\n [PlayerFormFieldsNames.name]: player.name,\n };\n\n const {\n register,\n formState: { errors, isDirty },\n handleSubmit,\n watch,\n trigger,\n } = useForm<EditPlayerFormSchema>({\n resolver: zodResolver(editPlayerFormSchema),\n defaultValues: initialValues,\n });\n\n const playerImage = watch(PlayerFormFieldsNames.playerImage);\n const photoUrlValue =\n playerImage && playerImage.length > 0 ? URL.createObjectURL(playerImage[0]) : player ? player.photoUrl : undefined;\n\n const handleEditPlayer = useCallback(\n (player: EditPlayerForm) => {\n editPlayer({\n data: {\n name: player[PlayerFormFieldsNames.name],\n image: player[PlayerFormFieldsNames.playerImage] ? player[PlayerFormFieldsNames.playerImage][0] : undefined,\n uuid: playerId,\n },\n onSuccess: () => {\n invalidatePlayers();\n onClose();\n },\n });\n },\n [editPlayer, invalidatePlayers, onClose, playerId],\n );\n\n const handleModalSubmit = useCallback(() => {\n formRef.current?.requestSubmit();\n }, []);\n\n return (\n <DialogNew\n maxWidth='sm'\n fullWidth\n title='Edit player'\n icon={<IconEdit size='small' />}\n onCancel={onClose}\n onClose={onClose}\n onSubmit={handleModalSubmit}\n buttonSubmitText={'Done'}\n open={open}\n submitDisabled={!isDirty}\n >\n <form ref={formRef} onSubmit={handleSubmit(handleEditPlayer)}>\n <PlayerForm<EditPlayerFormSchema> register={register} errors={errors} trigger={trigger} />\n <PlayerPhotoPreview photoUrl={photoUrlValue} />\n </form>\n </DialogNew>\n );\n};\n","import { Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { IconUser } from 'shared/components/icons/icon-user';\nimport { useDates } from 'shared/hooks/use-dates';\n\nimport { PlayerFixture } from '../../../../types/players';\n\ninterface Props {\n onClose: () => void;\n playerDetails: PlayerFixture[];\n}\n\nfunction createData(name: string, value: string) {\n return { name, value };\n}\n\nconst TableData = ({ playerFixture }: { playerFixture: PlayerFixture }) => {\n const { dateToString } = useDates();\n const rows = [\n createData('jersey_number', playerFixture.jerseyNumber.toString()),\n createData('date', dateToString(playerFixture.date)),\n createData('side', `${playerFixture.side ?? ''}`),\n createData('position', `${playerFixture.position ?? ''}`),\n createData('score (home - away)', `${playerFixture.homeTeamScore} - ${playerFixture.awayTeamScore}`),\n createData('team.name', playerFixture.team.name),\n createData('team.abbreviation', playerFixture.team.abbreviation),\n createData('team.country', playerFixture.team.country ?? ''),\n ];\n\n return (\n <TableContainer component={Paper} sx={{ marginBottom: 2 }}>\n <Table sx={{ minWidth: 650 }} aria-label='player details table'>\n <TableHead>\n <TableRow>\n <TableCell>Name</TableCell>\n <TableCell align='right'>Value</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map((row) => (\n <TableRow key={row.name} sx={{ '&:last-child td, &:last-child th': { border: 0 } }}>\n <TableCell component='th' scope='row'>\n {row.name}\n </TableCell>\n <TableCell align='right'>{row.value}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n );\n};\n\nexport const PlayerDetailsModal = ({ onClose, playerDetails }: Props) => {\n return (\n <DialogNew\n fullWidth\n maxWidth='md'\n title={'Player details'}\n icon={<IconUser />}\n onCancel={onClose}\n onClose={onClose}\n open={true}\n >\n {playerDetails.length === 0 ? (\n <Typography variant='h6' sx={{ textAlign: 'center' }}>\n No data\n </Typography>\n ) : (\n playerDetails.map((fixture) => <TableData key={fixture.id} playerFixture={fixture} />)\n )}\n </DialogNew>\n );\n};\n","import { ListItem, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const PlayersListItem = styled(ListItem)(({ theme }) => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: 'auto 1fr auto',\n borderBottom: `1px solid ${Colors.iron}`,\n padding: `${theme.spacing(1)} ${theme.spacing(2)} ${theme.spacing(1)} ${theme.spacing(2)} !important`,\n}));\n","import { Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport { useState } from 'react';\n\nimport { IconTimeline } from 'shared/components/icons';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\n\nimport { MetadataPlayerSummary } from '../../../../types/players';\nimport { EditPlayerModal } from '../edit-player-modal';\nimport { PlayerDetailsModal } from '../player-details-modal';\nimport { PlayerPhoto } from '../player-photo/player-photo';\nimport { PlayerPhotoSkeleton } from '../player-photo-skeleton';\nimport { PlayersListItem } from '../players-list/styled';\n\ninterface Props {\n player: MetadataPlayerSummary;\n}\n\nexport const PlayerItem = ({ player }: Props) => {\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [isDetailsModalOpen, setIsDetailsModalOpen] = useState(false);\n const handleEditModalOpen = () => setIsEditModalOpen(true);\n const handleEditModalClose = () => setIsEditModalOpen(false);\n const handleDetailsModalOpen = () => setIsDetailsModalOpen(true);\n const handleDetailsModalClose = () => setIsDetailsModalOpen(false);\n\n const options: MenuListOption[] = [\n {\n displayText: 'Edit',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: handleEditModalOpen,\n },\n {\n displayText: 'Details',\n icon: <IconTimeline size='small' color='secondary' />,\n onClick: handleDetailsModalOpen,\n },\n ];\n\n return (\n <>\n <PlayersListItem key={player.id}>\n {player.photoUrl ? <PlayerPhoto src={player.photoUrl} /> : <PlayerPhotoSkeleton small />}\n <Typography marginLeft={2} fontWeight={fontWeight['500']}>\n {player.name}\n </Typography>\n <KebabMenu options={options} />\n </PlayersListItem>\n {isEditModalOpen ? (\n <EditPlayerModal open={isEditModalOpen} onClose={handleEditModalClose} player={player} playerId={player.id} />\n ) : null}\n {isDetailsModalOpen && player?.fixtures ? (\n <PlayerDetailsModal playerDetails={player.fixtures} onClose={handleDetailsModalClose} />\n ) : null}\n </>\n );\n};\n","import { List } from '@mui/material';\n\nimport { MetadataPlayerSummary } from '../../../../types/players';\nimport { PlayerItem } from '../player-item';\n\ninterface Props {\n players: MetadataPlayerSummary[];\n}\n\nexport const PlayersList = ({ players }: Props) => {\n const playersItems = players.map((player) => {\n return <PlayerItem key={player.id} player={player} />;\n });\n\n return <List>{playersItems}</List>;\n};\n","import { Skeleton, Stack } from '@mui/material';\n\nexport const PlayersListSkeleton = () => {\n return (\n <Stack spacing={1} marginTop={2} marginBottom={2}>\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n </Stack>\n );\n};\n","import { Box, Button, Stack, TextField, Typography } from '@mui/material';\nimport debounce from 'lodash/debounce';\nimport { ChangeEvent, useCallback, useState } from 'react';\n\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport NotFound from 'shared/components/not-found';\nimport Pagination from 'shared/components/pagination';\n\nimport { PlayersList } from './components/players-list';\nimport { PlayersListSkeleton } from './components/players-list-skeleton';\nimport { usePlayers } from '../../api/players/use-players';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { CreatePlayerModal } from '../../components/create-player-modal';\n\nconst DEBOUNCE_TIME = 300;\n\nexport const Players = () => {\n const [isCreatePlayerModalOpen, setIsCreatePlayerModalOpen] = useState(false);\n const { items, page, fetchNextPage, isFetching, setFilters } = usePlayers();\n\n const handleCreatePlayerModalOpen = () => setIsCreatePlayerModalOpen(true);\n const handleCreatePlayerModalClose = () => setIsCreatePlayerModalOpen(false);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleSearchChange = useCallback(\n debounce((event: ChangeEvent<HTMLInputElement>) => {\n setFilters({ name: event.target.value });\n }, DEBOUNCE_TIME),\n [setFilters],\n );\n\n return (\n <BackofficeContentContainer>\n <Stack direction='row' alignItems='center' justifyContent='space-between' marginBottom={2}>\n <Typography variant='h4'>Players</Typography>\n <Button\n variant='contained'\n size='large'\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n onClick={handleCreatePlayerModalOpen}\n >\n New player\n </Button>\n </Stack>\n\n <Stack marginBottom={2} justifyContent='flex-end' direction='row'>\n <TextField size='small' placeholder='Search players' onChange={handleSearchChange} />\n </Stack>\n\n <ListHeader>Player name</ListHeader>\n {!isFetching && items.length === 0 ? (\n <Box marginTop={4}>\n <NotFound header={'No results'} />\n </Box>\n ) : null}\n {isFetching ? <PlayersListSkeleton /> : <PlayersList players={items} />}\n {page ? (\n <Pagination\n total={page.totalElements}\n displayed={items.length}\n onShowMore={fetchNextPage}\n getStatsText={(displayed, total) => `${displayed} of ${total} players`}\n />\n ) : null}\n {isCreatePlayerModalOpen ? (\n <CreatePlayerModal open={isCreatePlayerModalOpen} onClose={handleCreatePlayerModalClose} />\n ) : null}\n </BackofficeContentContainer>\n );\n};\n","export enum ProcessGamePreset {\n SCOUTING = 'scouting',\n PERFORMANCE = 'performance',\n ADVANCED = 'advanced',\n}\n","import { Button, ButtonGroup, Stack } from '@mui/material';\n\nimport { FormField } from 'shared/components/form/form-field';\n\nimport { ProcessGamePreset } from '../../entities/process-game/types/processGame.types';\n\ntype Props = {\n onChange: (preset: ProcessGamePreset) => void;\n selectedPreset: ProcessGamePreset | undefined;\n};\n\nexport const PresetSelector = ({ onChange, selectedPreset }: Props) => {\n const handleSelectPreset = (preset: ProcessGamePreset) => {\n onChange(preset);\n };\n\n return (\n <Stack direction={'row'} gap={2} alignItems={'center'} justifyContent={'left'}>\n <FormField id={'preset'} label={'Preset'}>\n <ButtonGroup color='primary' aria-label='outlined primary button group'>\n {Object.values(ProcessGamePreset).map((preset) => (\n <Button\n size={'large'}\n variant={selectedPreset === preset ? 'contained' : 'outlined'}\n color={'primary'}\n key={preset}\n onClick={() => handleSelectPreset(preset)}\n sx={{ textTransform: 'capitalize' }}\n >\n {preset}\n </Button>\n ))}\n </ButtonGroup>\n </FormField>\n </Stack>\n );\n};\n","import { z } from 'zod';\n\nexport enum FilesChyronHegoSetOneFieldsNames {\n srmlXml = 'srml_xml',\n metadataXml = 'metadata_xml',\n trackingDat = 'tracking_dat',\n}\n\nexport enum FilesChyronHegoSetTwoFieldsNames {\n matchInfoXml = 'match_info_xml',\n positionsXml = 'positions_xml',\n}\n\nexport enum FilesHawkeyeFieldsNames {\n centroidsFolder = 'centroids_folder',\n ballFolder = 'ball_folder',\n}\n\nexport enum FilesSecondSpectrumFieldsNames {\n dataXml = 'data_xml',\n metadataXml = 'metadata_xml',\n physicalSummaryCsv = 'physical_summary_csv',\n dataJsonl = 'data_jsonl',\n metadataJson = 'metadata_json',\n}\n\nexport enum FilesSignalityFieldsNames {\n tracking1stJson = 'tracking_1st_json',\n tracking2ndJson = 'tracking_2nd_json',\n metadataJson = 'metadata_json',\n}\n\nexport enum FilesOptaFieldsNames {\n f7Xml = 'f7_xml',\n f24Xml = 'f24_xml',\n}\n\nexport enum FilesBundesligaFieldsNames {\n eventsXml = 'events_xml',\n}\n\nexport enum SportlogiqTrackingType {\n GAME_TRACKING_DATA = 'gameTrackingData',\n RAW_GAME_TRACKING_DATA = 'rawGameTrackingData',\n}\n\nexport interface FilesHawkeyeForm {\n [FilesHawkeyeFieldsNames.centroidsFolder]?: string;\n [FilesHawkeyeFieldsNames.ballFolder]?: string;\n}\n\nexport const filesHawkeyeSchema = z.object({\n [FilesHawkeyeFieldsNames.centroidsFolder]: z.string().optional(),\n [FilesHawkeyeFieldsNames.ballFolder]: z.string().optional(),\n});\n\nexport interface FilesChyronhegoSetOneForm {\n [FilesChyronHegoSetOneFieldsNames.srmlXml]?: string;\n [FilesChyronHegoSetOneFieldsNames.metadataXml]?: string;\n [FilesChyronHegoSetOneFieldsNames.trackingDat]?: string;\n}\n\nexport const filesChyronHegoSetOneSchema = z.object({\n [FilesChyronHegoSetOneFieldsNames.srmlXml]: z.string().optional(),\n [FilesChyronHegoSetOneFieldsNames.metadataXml]: z.string().optional(),\n [FilesChyronHegoSetOneFieldsNames.trackingDat]: z.string().optional(),\n});\n\nexport interface FilesChyronHegoSetTwoForm {\n [FilesChyronHegoSetTwoFieldsNames.matchInfoXml]?: string;\n [FilesChyronHegoSetTwoFieldsNames.positionsXml]?: string;\n}\n\nexport const filesChyronHegoSetTwoSchema = z.object({\n [FilesChyronHegoSetTwoFieldsNames.matchInfoXml]: z.string().optional(),\n [FilesChyronHegoSetTwoFieldsNames.positionsXml]: z.string().optional(),\n});\n\nexport interface FilesSecondSpectrumSetOneForm {\n [FilesSecondSpectrumFieldsNames.dataXml]?: string;\n [FilesSecondSpectrumFieldsNames.metadataXml]?: string;\n [FilesSecondSpectrumFieldsNames.physicalSummaryCsv]?: string;\n}\n\nexport const filesSecondSpectrumSetOneSchema = z.object({\n [FilesSecondSpectrumFieldsNames.dataXml]: z.string().optional(),\n [FilesSecondSpectrumFieldsNames.metadataXml]: z.string().optional(),\n [FilesSecondSpectrumFieldsNames.physicalSummaryCsv]: z.string().optional(),\n});\n\nexport interface FilesSecondSpectrumSetTwoForm {\n [FilesSecondSpectrumFieldsNames.dataXml]?: string;\n [FilesSecondSpectrumFieldsNames.metadataXml]?: string;\n [FilesSecondSpectrumFieldsNames.physicalSummaryCsv]?: string;\n}\n\nexport const filesSecondSpectrumSetTwoSchema = z.object({\n [FilesSecondSpectrumFieldsNames.dataJsonl]: z.string().optional(),\n [FilesSecondSpectrumFieldsNames.metadataJson]: z.string().optional(),\n});\n\nexport interface FilesSignalityForm {\n [FilesSignalityFieldsNames.tracking1stJson]?: string;\n [FilesSignalityFieldsNames.tracking2ndJson]?: string;\n [FilesSignalityFieldsNames.metadataJson]?: string;\n}\n\nexport const filesSignalitySchema = z.object({\n [FilesSignalityFieldsNames.tracking1stJson]: z.string().optional(),\n [FilesSignalityFieldsNames.tracking2ndJson]: z.string().optional(),\n [FilesSignalityFieldsNames.metadataJson]: z.string().optional(),\n});\n\nexport interface FilesOptaForm {\n [FilesOptaFieldsNames.f7Xml]?: string;\n [FilesOptaFieldsNames.f24Xml]?: string;\n}\n\nexport const filesOptaSchema = z.object({\n [FilesOptaFieldsNames.f7Xml]: z.string().optional(),\n [FilesOptaFieldsNames.f24Xml]: z.string().optional(),\n});\n\nexport interface FilesBundesligaForm {\n [FilesBundesligaFieldsNames.eventsXml]?: string;\n}\n\nexport const filesBundesligaSchema = z.object({\n [FilesBundesligaFieldsNames.eventsXml]: z.string().optional(),\n});\n","import { literal, TypeOf, z } from 'zod';\n\nimport {\n FilesBundesligaFieldsNames,\n FilesBundesligaForm,\n filesBundesligaSchema,\n FilesChyronHegoSetOneFieldsNames,\n FilesChyronhegoSetOneForm,\n filesChyronHegoSetOneSchema,\n FilesChyronHegoSetTwoFieldsNames,\n FilesChyronHegoSetTwoForm,\n filesChyronHegoSetTwoSchema,\n FilesHawkeyeFieldsNames,\n FilesHawkeyeForm,\n filesHawkeyeSchema,\n FilesOptaFieldsNames,\n FilesOptaForm,\n filesOptaSchema,\n FilesSecondSpectrumFieldsNames,\n FilesSecondSpectrumSetOneForm,\n filesSecondSpectrumSetOneSchema,\n FilesSecondSpectrumSetTwoForm,\n filesSecondSpectrumSetTwoSchema,\n FilesSignalityFieldsNames,\n FilesSignalityForm,\n filesSignalitySchema,\n SportlogiqTrackingType,\n} from './processGameFormSubforms.types';\n\nexport enum ProcessGameEventsProvider {\n KOGNIA = 'kognia',\n OPTA = 'opta',\n BUNDESLIGA = 'bundesliga',\n}\n\nexport enum ProcessGamePipelineType {\n THIRD_PARTY_TACTICAL = 'third-party-tactical',\n THIRD_PARTY_TACTICAL_TRACKING = 'third-party-tactical-tracking',\n}\n\nexport enum ProcessGameFieldsNames {\n recordingId = 'recording_id',\n videoPath = 'video_path',\n bucket = 'bucket',\n pipelineType = 'pipeline_type',\n trackingProvider = 'tracking_provider',\n eventsProvider = 'events_provider',\n runProcessing = 'run_processing',\n restartProcessing = 'restart_processing',\n showOverlays = 'show_overlays',\n autoRunTacticalAnalysis = 'auto_run_tactical_analysis',\n sportlogiqTrackingType = 'sportlogiq_tracking_type',\n}\n\nexport enum ProcessGameTrackingProvider {\n HAWKEYE = 'hawkeye',\n CHYRONHEGO = 'chyronhego',\n SIGNALITY = 'signality',\n SECOND_SPECTRUM = 'second-spectrum',\n SPORTLOGIQ = 'sportlogiq',\n}\n\nexport interface ProcessGameForm\n extends FilesHawkeyeForm,\n FilesChyronhegoSetOneForm,\n FilesChyronHegoSetTwoForm,\n FilesSecondSpectrumSetOneForm,\n FilesSecondSpectrumSetTwoForm,\n FilesSignalityForm,\n FilesOptaForm,\n FilesBundesligaForm {\n [ProcessGameFieldsNames.recordingId]: string;\n [ProcessGameFieldsNames.videoPath]: string;\n [ProcessGameFieldsNames.bucket]: string;\n [ProcessGameFieldsNames.pipelineType]: ProcessGamePipelineType;\n [ProcessGameFieldsNames.trackingProvider]?: ProcessGameTrackingProvider;\n [ProcessGameFieldsNames.eventsProvider]?: ProcessGameEventsProvider;\n [ProcessGameFieldsNames.runProcessing]: boolean;\n [ProcessGameFieldsNames.restartProcessing]: boolean;\n [ProcessGameFieldsNames.showOverlays]: boolean;\n [ProcessGameFieldsNames.autoRunTacticalAnalysis]: boolean;\n [ProcessGameFieldsNames.sportlogiqTrackingType]: SportlogiqTrackingType;\n}\n\nconst filesSchema = z.object({\n ...filesHawkeyeSchema.shape,\n ...filesChyronHegoSetOneSchema.shape,\n ...filesChyronHegoSetTwoSchema.shape,\n ...filesSecondSpectrumSetOneSchema.shape,\n ...filesSecondSpectrumSetTwoSchema.shape,\n ...filesSignalitySchema.shape,\n ...filesOptaSchema.shape,\n ...filesBundesligaSchema.shape,\n});\n\nexport const processGameFormSchema = z.object({\n [ProcessGameFieldsNames.recordingId]: z.string().min(2),\n [ProcessGameFieldsNames.videoPath]: z.string().min(2),\n [ProcessGameFieldsNames.bucket]: z.string(),\n [ProcessGameFieldsNames.pipelineType]: z.nativeEnum(ProcessGamePipelineType),\n [ProcessGameFieldsNames.trackingProvider]: z\n .nativeEnum(ProcessGameTrackingProvider)\n .optional()\n .or(literal('').transform(() => undefined)),\n [ProcessGameFieldsNames.eventsProvider]: z\n .nativeEnum(ProcessGameEventsProvider)\n .optional()\n .or(literal('').transform(() => undefined)),\n [ProcessGameFieldsNames.runProcessing]: z.boolean(),\n [ProcessGameFieldsNames.restartProcessing]: z.boolean(),\n [ProcessGameFieldsNames.showOverlays]: z.boolean(),\n [ProcessGameFieldsNames.autoRunTacticalAnalysis]: z.boolean(),\n [ProcessGameFieldsNames.sportlogiqTrackingType]: z.nativeEnum(SportlogiqTrackingType),\n ...filesSchema.shape,\n});\n\nexport type ProcessGameFormSchema = TypeOf<typeof processGameFormSchema>;\n\nexport const eventsFilesFieldsNames = {\n ...FilesOptaFieldsNames,\n ...FilesBundesligaFieldsNames,\n};\n\nexport const trackingFilesFieldsNames = {\n ...FilesChyronHegoSetTwoFieldsNames,\n ...FilesChyronHegoSetOneFieldsNames,\n ...FilesHawkeyeFieldsNames,\n ...FilesSecondSpectrumFieldsNames,\n ...FilesSignalityFieldsNames,\n};\n","import { ProcessGamePreset } from 'pages/backoffice/entities/process-game/types/processGame.types';\n\nimport {\n ProcessGameEventsProvider,\n ProcessGameFieldsNames,\n ProcessGamePipelineType,\n ProcessGameTrackingProvider,\n} from '../types/processGameForm.types';\nimport { SportlogiqTrackingType } from '../types/processGameFormSubforms.types';\n\nconst processGameDefaultValues = {\n [ProcessGameFieldsNames.bucket]: 'kognia-client-uploads',\n [ProcessGameFieldsNames.runProcessing]: true,\n [ProcessGameFieldsNames.restartProcessing]: false,\n};\n\nexport const PRESETS_FORMS_DEFAULTS = {\n [ProcessGamePreset.ADVANCED]: processGameDefaultValues,\n [ProcessGamePreset.PERFORMANCE]: {\n ...processGameDefaultValues,\n [ProcessGameFieldsNames.showOverlays]: true,\n [ProcessGameFieldsNames.autoRunTacticalAnalysis]: false,\n [ProcessGameFieldsNames.sportlogiqTrackingType]: SportlogiqTrackingType.RAW_GAME_TRACKING_DATA,\n },\n [ProcessGamePreset.SCOUTING]: {\n ...processGameDefaultValues,\n [ProcessGameFieldsNames.pipelineType]: ProcessGamePipelineType.THIRD_PARTY_TACTICAL_TRACKING,\n [ProcessGameFieldsNames.trackingProvider]: ProcessGameTrackingProvider.SPORTLOGIQ,\n [ProcessGameFieldsNames.eventsProvider]: ProcessGameEventsProvider.OPTA,\n [ProcessGameFieldsNames.showOverlays]: false,\n [ProcessGameFieldsNames.autoRunTacticalAnalysis]: true,\n [ProcessGameFieldsNames.sportlogiqTrackingType]: SportlogiqTrackingType.GAME_TRACKING_DATA,\n },\n};\n","import { FieldErrors, UseFormRegister } from 'react-hook-form';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\n\nimport { ProcessGameFormSchema } from '../types/processGameForm.types';\nimport { FilesBundesligaFieldsNames } from '../types/processGameFormSubforms.types';\n\ninterface Props {\n register: UseFormRegister<ProcessGameFormSchema>;\n errors: FieldErrors<ProcessGameFormSchema>;\n}\n\nexport function BundesligaForm({ errors, register }: Props) {\n const textFieldsList = [\n {\n id: FilesBundesligaFieldsNames.eventsXml,\n label: 'Events data (.xml)',\n },\n ];\n\n return (\n <div>\n {textFieldsList.map((textField) => (\n <FormInputField\n key={textField.id}\n id={textField.id}\n label={textField.label}\n error={!!errors[textField.id]}\n fullWidth\n helperText={errors[textField.id] && <>{errors[textField.id]?.message}</>}\n {...register(textField.id)}\n />\n ))}\n </div>\n );\n}\n","import { FormControl, FormControlLabel, FormLabel, Radio, RadioGroup } from '@mui/material';\nimport { useState } from 'react';\nimport { FieldErrors, UseFormRegister } from 'react-hook-form';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\n\nimport { ProcessGameFormSchema } from '../types/processGameForm.types';\nimport {\n FilesChyronHegoSetOneFieldsNames,\n FilesChyronHegoSetTwoFieldsNames,\n} from '../types/processGameFormSubforms.types';\n\ninterface Props {\n register: UseFormRegister<ProcessGameFormSchema>;\n errors: FieldErrors<ProcessGameFormSchema>;\n}\n\nexport function ChyronHegoForm({ errors, register }: Props) {\n const [set, setSet] = useState(1);\n\n const textFieldsListSetOne = [\n {\n id: FilesChyronHegoSetOneFieldsNames.metadataXml,\n label: 'Metadata (.xml)',\n },\n {\n id: FilesChyronHegoSetOneFieldsNames.srmlXml,\n label: 'SRML (.xml)',\n },\n {\n id: FilesChyronHegoSetOneFieldsNames.trackingDat,\n label: 'Tracking data (.dat)',\n },\n ];\n\n const textFieldsListSetTwo = [\n {\n id: FilesChyronHegoSetTwoFieldsNames.positionsXml,\n label: 'Positions (.xml)',\n },\n {\n id: FilesChyronHegoSetTwoFieldsNames.matchInfoXml,\n label: 'Match information (.xml)',\n },\n ];\n\n const textFieldsSetOne = textFieldsListSetOne.map((textField) => {\n return (\n <FormInputField\n key={textField.id}\n id={textField.id}\n label={textField.label}\n error={!!errors[textField.id]}\n fullWidth\n helperText={errors[textField.id] && <>{errors[textField.id]?.message}</>}\n {...register(textField.id)}\n />\n );\n });\n\n const textFieldsSetTwo = textFieldsListSetTwo.map((textField) => {\n return (\n <FormInputField\n key={textField.id}\n id={textField.id}\n label={textField.label}\n error={!!errors[textField.id]}\n fullWidth\n helperText={errors[textField.id] && <>{errors[textField.id]?.message}</>}\n {...register(textField.id)}\n />\n );\n });\n\n return (\n <div>\n <FormControl>\n <FormLabel id='chyronhego-set'>Files set</FormLabel>\n <RadioGroup\n aria-labelledby='chyronhego-set'\n name='chyronhego-set-radio-group'\n value={set}\n onChange={(event) => setSet(Number(event.target.value))}\n >\n <FormControlLabel value={1} control={<Radio />} label='Set one' />\n <FormControlLabel value={2} control={<Radio />} label='Set two' />\n </RadioGroup>\n </FormControl>\n\n {set === 1 && textFieldsSetOne}\n {set === 2 && textFieldsSetTwo}\n </div>\n );\n}\n","import { FieldErrors, UseFormRegister } from 'react-hook-form';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\n\nimport { ProcessGameFormSchema } from '../types/processGameForm.types';\nimport { FilesHawkeyeFieldsNames } from '../types/processGameFormSubforms.types';\n\ninterface Props {\n register: UseFormRegister<ProcessGameFormSchema>;\n errors: FieldErrors<ProcessGameFormSchema>;\n}\n\nexport function HawkeyeForm({ errors, register }: Props) {\n const textFieldsList = [\n {\n id: FilesHawkeyeFieldsNames.ballFolder,\n label: 'Ball (folder)',\n },\n {\n id: FilesHawkeyeFieldsNames.centroidsFolder,\n label: 'Centroids (folder)',\n },\n ];\n\n return (\n <div>\n {textFieldsList.map((textField) => (\n <FormInputField\n key={textField.id}\n id={textField.id}\n label={textField.label}\n error={!!errors[textField.id]}\n fullWidth\n helperText={errors[textField.id] && <>{errors[textField.id]?.message}</>}\n {...register(textField.id)}\n />\n ))}\n </div>\n );\n}\n","import { Accordion, AccordionDetails, AccordionSummary, Stack, Typography } from '@mui/material';\nimport { FieldErrors, UseFormRegister } from 'react-hook-form';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\nimport IconChevronDown from 'shared/components/icons/icon-chevron-down';\n\nimport { ProcessGameFormSchema } from '../types/processGameForm.types';\nimport { FilesOptaFieldsNames } from '../types/processGameFormSubforms.types';\n\nconst textFieldsList = [\n {\n id: FilesOptaFieldsNames.f7Xml,\n label: 'f7 data (.xml)',\n },\n {\n id: FilesOptaFieldsNames.f24Xml,\n label: 'f24 data (.xml)',\n },\n];\n\ninterface Props {\n register: UseFormRegister<ProcessGameFormSchema>;\n errors: FieldErrors<ProcessGameFormSchema>;\n}\n\nexport function OptaForm({ errors, register }: Props) {\n return (\n <Accordion sx={{ marginBottom: 2 }}>\n <AccordionSummary expandIcon={<IconChevronDown size='small' />}>\n <Stack direction={'row'} alignItems={'center'} gap={1}>\n XML Files <Typography variant={'caption'}>(if available)</Typography>\n </Stack>\n </AccordionSummary>\n <AccordionDetails>\n {textFieldsList.map((textField) => (\n <FormInputField\n key={textField.id}\n id={textField.id}\n label={textField.label}\n error={!!errors[textField.id]}\n fullWidth\n helperText={errors[textField.id] && <>{errors[textField.id]?.message}</>}\n {...register(textField.id)}\n />\n ))}\n </AccordionDetails>\n </Accordion>\n );\n}\n","import { FormControl, FormControlLabel, FormLabel, Radio, RadioGroup } from '@mui/material';\nimport { useState } from 'react';\nimport { FieldErrors, UseFormRegister } from 'react-hook-form';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\n\nimport { ProcessGameFormSchema } from '../types/processGameForm.types';\nimport { FilesSecondSpectrumFieldsNames } from '../types/processGameFormSubforms.types';\n\ninterface Props {\n register: UseFormRegister<ProcessGameFormSchema>;\n errors: FieldErrors<ProcessGameFormSchema>;\n}\n\nexport function SecondSpectrumForm({ errors, register }: Props) {\n const [set, setSet] = useState(1);\n\n const textFieldsListSetOne = [\n {\n id: FilesSecondSpectrumFieldsNames.metadataXml,\n label: 'Metadata (.xml)',\n },\n {\n id: FilesSecondSpectrumFieldsNames.dataXml,\n label: 'Data (.xml)',\n },\n {\n id: FilesSecondSpectrumFieldsNames.physicalSummaryCsv,\n label: 'Physical Summary (.csv)',\n },\n ];\n\n const textFieldsListSetTwo = [\n {\n id: FilesSecondSpectrumFieldsNames.dataJsonl,\n label: 'Data (.jsonl)',\n },\n {\n id: FilesSecondSpectrumFieldsNames.metadataJson,\n label: 'Metadata (.json)',\n },\n ];\n\n const textFieldsSetOne = textFieldsListSetOne.map((textField) => {\n return (\n <FormInputField\n key={textField.id}\n id={textField.id}\n label={textField.label}\n error={!!errors[textField.id]}\n fullWidth\n helperText={errors[textField.id] && <>{errors[textField.id]?.message}</>}\n {...register(textField.id)}\n />\n );\n });\n\n const textFieldsSetTwo = textFieldsListSetTwo.map((textField) => {\n return (\n <FormInputField\n key={textField.id}\n id={textField.id}\n label={textField.label}\n error={!!errors[textField.id]}\n fullWidth\n helperText={errors[textField.id] && <>{errors[textField.id]?.message}</>}\n {...register(textField.id)}\n />\n );\n });\n\n return (\n <div>\n <FormControl>\n <FormLabel id='second-spectrum-set'>Files set</FormLabel>\n <RadioGroup\n aria-labelledby='second-spectrum-set'\n name='second-spectrum-set-radio-group'\n value={set}\n onChange={(event) => setSet(Number(event.target.value))}\n >\n <FormControlLabel value={1} control={<Radio />} label='Set one' />\n <FormControlLabel value={2} control={<Radio />} label='Set two' />\n </RadioGroup>\n </FormControl>\n\n {set === 1 && textFieldsSetOne}\n {set === 2 && textFieldsSetTwo}\n </div>\n );\n}\n","import { FieldErrors, UseFormRegister } from 'react-hook-form';\n\nimport { FormInputField } from 'shared/components/form/form-input-field';\n\nimport { ProcessGameFormSchema } from '../types/processGameForm.types';\nimport { FilesSignalityFieldsNames } from '../types/processGameFormSubforms.types';\n\ninterface Props {\n register: UseFormRegister<ProcessGameFormSchema>;\n errors: FieldErrors<ProcessGameFormSchema>;\n}\n\nexport function SignalityForm({ errors, register }: Props) {\n const textFieldsList = [\n {\n id: FilesSignalityFieldsNames.metadataJson,\n label: 'Metadata (.json)',\n },\n {\n id: FilesSignalityFieldsNames.tracking1stJson,\n label: 'Tracking 1st (.json)',\n },\n {\n id: FilesSignalityFieldsNames.tracking2ndJson,\n label: 'Tracking 2nd (.json)',\n },\n ];\n\n return (\n <div>\n {textFieldsList.map((textField) => (\n <FormInputField\n key={textField.id}\n id={textField.id}\n label={textField.label}\n error={!!errors[textField.id]}\n fullWidth\n helperText={errors[textField.id] && <>{errors[textField.id]?.message}</>}\n {...register(textField.id)}\n />\n ))}\n </div>\n );\n}\n","import { FieldErrors, UseFormRegister } from 'react-hook-form';\n\nimport { FormSelectField } from 'shared/components/form/form-select-field';\nimport { getTypeOptions } from 'shared/components/form/get-type-options';\n\nimport { ProcessGameFieldsNames, ProcessGameFormSchema } from '../types/processGameForm.types';\nimport { SportlogiqTrackingType } from '../types/processGameFormSubforms.types';\n\ninterface Props {\n register: UseFormRegister<ProcessGameFormSchema>;\n errors: FieldErrors<ProcessGameFormSchema>;\n defaultValue?: SportlogiqTrackingType;\n}\n\nexport function SportlogiqForm({ errors, register, defaultValue }: Props) {\n return (\n <FormSelectField\n id={ProcessGameFieldsNames.sportlogiqTrackingType}\n label='Sportlogiq tracking type'\n error={!!errors[ProcessGameFieldsNames.sportlogiqTrackingType]}\n disabled={Boolean(defaultValue)}\n defaultValue={defaultValue}\n fullWidth\n options={getTypeOptions({\n options: Object.values(SportlogiqTrackingType).map((value) => ({\n value,\n })),\n })}\n helperText={\n errors[ProcessGameFieldsNames.sportlogiqTrackingType] && (\n <>{errors[ProcessGameFieldsNames.sportlogiqTrackingType]?.message}</>\n )\n }\n {...register(ProcessGameFieldsNames.sportlogiqTrackingType)}\n />\n );\n}\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport {\n ProcessGameEventsProvider,\n ProcessGamePipelineType,\n ProcessGameTrackingProvider,\n} from '../../../widgets/process-game/ProcessGameForm/types/processGameForm.types';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\n\nexport type ProcessGameParamsDataSettings = {\n providers: {\n video: 'third-party-tactical';\n tracking?: ProcessGameTrackingProvider;\n events?: ProcessGameEventsProvider;\n options?: {\n sportlogiq_tracking_type?: string;\n };\n };\n run_processing: boolean;\n postprocess: {\n show_overlays: boolean;\n auto_run_tactical_analysis: boolean;\n };\n};\n\nexport interface ProcessGameParamsData {\n recording_id: string;\n video_path: string;\n bucket: string;\n pipeline_type: ProcessGamePipelineType;\n settings: ProcessGameParamsDataSettings;\n restart_processing: boolean;\n files?: unknown;\n}\n\ninterface ProcessGameParams {\n data: ProcessGameParamsData;\n}\n\nexport const useProcessGame = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Process game success',\n errorMessage: (data) => metadataApiErrorParser(data, 'Process game error'),\n });\n\n const processGame = ({ data }: ProcessGameParams) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate({ url: `${annotationApiUrls.PROCESS_GAME}`, data });\n };\n\n return { ...mutationRequest, processGame };\n};\n","import { eventsFilesFieldsNames } from '../types/processGameForm.types';\n\nconst eventsFileNames: string[] = Object.values(eventsFilesFieldsNames);\n\nexport const isEventsFile = (value: string) => {\n return eventsFileNames.includes(value);\n};\n","import { trackingFilesFieldsNames } from '../types/processGameForm.types';\n\nconst trackingFileNames: string[] = Object.values(trackingFilesFieldsNames);\n\nexport const isTrackingFile = (value: string) => {\n return trackingFileNames.includes(value);\n};\n","import isEmpty from 'lodash/isEmpty';\nimport { useCallback } from 'react';\n\nimport { ProcessGameParamsData, useProcessGame } from '../../../../api/operations/use-process-game';\nimport { ProcessGameFieldsNames, ProcessGameForm } from '../types/processGameForm.types';\nimport { isEventsFile } from '../utils/is-event-file';\nimport { isTrackingFile } from '../utils/is-tracking-file';\n\ntype Options = {\n onSubmit: () => void;\n};\nexport const useHandleProcessGameSubmit = ({ onSubmit }: Options) => {\n const { processGame } = useProcessGame();\n\n return useCallback(\n (formData: ProcessGameForm) => {\n const {\n [ProcessGameFieldsNames.recordingId]: recordingId,\n [ProcessGameFieldsNames.videoPath]: videoPath,\n [ProcessGameFieldsNames.bucket]: bucket,\n [ProcessGameFieldsNames.pipelineType]: pipelineType,\n [ProcessGameFieldsNames.trackingProvider]: trackingProvider,\n [ProcessGameFieldsNames.eventsProvider]: eventsProvider,\n [ProcessGameFieldsNames.runProcessing]: runProcessing,\n [ProcessGameFieldsNames.restartProcessing]: restartProcessing,\n [ProcessGameFieldsNames.showOverlays]: showOverlays,\n [ProcessGameFieldsNames.autoRunTacticalAnalysis]: autoRunTacticalAnalysis,\n [ProcessGameFieldsNames.sportlogiqTrackingType]: sportlogiqTrackingType,\n ...restData\n } = formData;\n\n onSubmit();\n const filesNonEmptyData = Object.entries(restData).reduce(\n (acc, [key, value]) => {\n if (!isEmpty(value)) {\n if (isTrackingFile(key)) {\n return { ...acc, tracking: { ...acc.tracking, [key]: value } };\n } else if (isEventsFile(key)) {\n return { ...acc, events: { ...acc.events, [key]: value } };\n }\n }\n\n return acc;\n },\n { tracking: {}, events: {} },\n );\n\n const data: ProcessGameParamsData = {\n recording_id: recordingId,\n video_path: videoPath,\n bucket,\n pipeline_type: pipelineType,\n settings: {\n providers: {\n video: 'third-party-tactical',\n tracking: trackingProvider,\n events: eventsProvider,\n ...(sportlogiqTrackingType && {\n options: {\n sportlogiq_tracking_type: sportlogiqTrackingType,\n },\n }),\n },\n run_processing: runProcessing,\n postprocess: {\n show_overlays: showOverlays,\n auto_run_tactical_analysis: autoRunTacticalAnalysis,\n },\n },\n restart_processing: restartProcessing,\n ...(!isEmpty(filesNonEmptyData.tracking) && {\n tracking_files: filesNonEmptyData.tracking,\n }),\n ...(!isEmpty(filesNonEmptyData.events) && {\n events_files: filesNonEmptyData.events,\n }),\n };\n\n processGame({ data });\n },\n [processGame, onSubmit],\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { Accordion, AccordionDetails, AccordionSummary, Button, Stack } from '@mui/material';\nimport { useCallback, useState } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { FormInputField } from 'shared/components/form/form-input-field';\nimport { FormSelectField } from 'shared/components/form/form-select-field';\nimport { FormSwitchField } from 'shared/components/form/form-switch-field';\nimport { getTypeOptions } from 'shared/components/form/get-type-options';\nimport IconChevronDown from 'shared/components/icons/icon-chevron-down';\nimport IconDelete from 'shared/components/icons/icon-delete';\n\nimport { BundesligaForm } from './components/BundesligaForm';\nimport { ChyronHegoForm } from './components/ChyronHegoForm';\nimport { HawkeyeForm } from './components/HawkeyeForm';\nimport { OptaForm } from './components/OptaForm';\nimport { SecondSpectrumForm } from './components/SecondSpectrumForm';\nimport { SignalityForm } from './components/SignalityForm';\nimport { SportlogiqForm } from './components/SportlogiqForm';\nimport { useHandleProcessGameSubmit } from './hooks/useHandleProcessGameSubmit';\nimport {\n eventsFilesFieldsNames,\n ProcessGameEventsProvider,\n ProcessGameFieldsNames,\n ProcessGameForm,\n processGameFormSchema,\n ProcessGameFormSchema,\n ProcessGamePipelineType,\n ProcessGameTrackingProvider,\n trackingFilesFieldsNames,\n} from './types/processGameForm.types';\nimport { ProcessGamePreset } from '../../../entities/process-game/types/processGame.types';\n\ninterface Props {\n selectedPreset: ProcessGamePreset;\n defaultValues: Partial<ProcessGameForm>;\n}\n\nexport const ProcessGameFormWidget = ({ defaultValues, selectedPreset }: Props) => {\n const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false);\n const handleProcessGameSubmit = useHandleProcessGameSubmit({ onSubmit: () => setConfirmationDialogOpen(false) });\n const handleConfirmDialogOpen = useCallback(() => setConfirmationDialogOpen(true), []);\n const handleConfirmDialogClose = useCallback(() => setConfirmationDialogOpen(false), []);\n\n const {\n register,\n formState: { errors },\n unregister,\n getValues,\n handleSubmit,\n watch,\n } = useForm<ProcessGameFormSchema>({\n resolver: zodResolver(processGameFormSchema),\n defaultValues: defaultValues,\n });\n\n const showProviderField =\n watch(ProcessGameFieldsNames.pipelineType) === ProcessGamePipelineType.THIRD_PARTY_TACTICAL_TRACKING;\n const showTrackingProviderFields = (trackingProvider: ProcessGameTrackingProvider) =>\n showProviderField && watch(ProcessGameFieldsNames.trackingProvider) === trackingProvider;\n const showEventsProviderFields = (eventsProvider: ProcessGameEventsProvider) =>\n selectedPreset !== ProcessGamePreset.SCOUTING &&\n showProviderField &&\n watch(ProcessGameFieldsNames.eventsProvider) === eventsProvider;\n\n const handleConfirmSubmit = useCallback(() => {\n handleProcessGameSubmit(getValues());\n }, [handleProcessGameSubmit, getValues]);\n\n const handleFormSubmit = useCallback(\n (values: ProcessGameForm) => {\n if (values[ProcessGameFieldsNames.restartProcessing]) {\n handleConfirmDialogOpen();\n } else {\n handleProcessGameSubmit(values);\n }\n },\n [handleConfirmDialogOpen, handleProcessGameSubmit],\n );\n\n return (\n <form onSubmit={handleSubmit(handleFormSubmit)}>\n <FormInputField\n id={ProcessGameFieldsNames.recordingId}\n label='Recording ID'\n error={!!errors[ProcessGameFieldsNames.recordingId]}\n fullWidth\n helperText={\n errors[ProcessGameFieldsNames.recordingId] && <>{errors[ProcessGameFieldsNames.recordingId]?.message}</>\n }\n {...register(ProcessGameFieldsNames.recordingId)}\n />\n\n <FormInputField\n id={ProcessGameFieldsNames.videoPath}\n label='Video path'\n error={!!errors[ProcessGameFieldsNames.videoPath]}\n fullWidth\n helperText={\n errors[ProcessGameFieldsNames.videoPath] && <>{errors[ProcessGameFieldsNames.videoPath]?.message}</>\n }\n {...register(ProcessGameFieldsNames.videoPath)}\n />\n\n <FormInputField\n id={ProcessGameFieldsNames.bucket}\n label='Bucket'\n error={!!errors[ProcessGameFieldsNames.bucket]}\n fullWidth\n helperText={errors[ProcessGameFieldsNames.bucket] && <>{errors[ProcessGameFieldsNames.bucket]?.message}</>}\n {...register(ProcessGameFieldsNames.bucket)}\n />\n\n <FormSelectField\n id={ProcessGameFieldsNames.pipelineType}\n label='Pipeline type'\n error={!!errors[ProcessGameFieldsNames.pipelineType]}\n defaultValue={defaultValues[ProcessGameFieldsNames.pipelineType]}\n disabled={Boolean(defaultValues[ProcessGameFieldsNames.pipelineType])}\n fullWidth\n options={getTypeOptions({\n options: Object.values(ProcessGamePipelineType).map((value) => ({\n value,\n })),\n })}\n helperText={\n errors[ProcessGameFieldsNames.pipelineType] && <>{errors[ProcessGameFieldsNames.pipelineType]?.message}</>\n }\n {...register(ProcessGameFieldsNames.pipelineType)}\n onChange={(event) => {\n Object.values(trackingFilesFieldsNames).forEach((name) => unregister(name));\n Object.values(eventsFilesFieldsNames).forEach((name) => unregister(name));\n return register(ProcessGameFieldsNames.pipelineType).onChange(event);\n }}\n />\n\n {showProviderField ? (\n <FormSelectField\n id={ProcessGameFieldsNames.trackingProvider}\n label='Tracking provider'\n error={!!errors[ProcessGameFieldsNames.trackingProvider]}\n defaultValue={defaultValues[ProcessGameFieldsNames.trackingProvider]}\n disabled={Boolean(defaultValues[ProcessGameFieldsNames.trackingProvider])}\n fullWidth\n options={getTypeOptions({\n options: Object.values(ProcessGameTrackingProvider).map((value) => ({\n value,\n })),\n })}\n helperText={\n errors[ProcessGameFieldsNames.trackingProvider] && (\n <>{errors[ProcessGameFieldsNames.trackingProvider]?.message}</>\n )\n }\n {...register(ProcessGameFieldsNames.trackingProvider)}\n onChange={(event) => {\n Object.values(trackingFilesFieldsNames).forEach((name) => unregister(name));\n return register(ProcessGameFieldsNames.trackingProvider).onChange(event);\n }}\n />\n ) : null}\n\n {showTrackingProviderFields(ProcessGameTrackingProvider.SPORTLOGIQ) && (\n <SportlogiqForm\n register={register}\n errors={errors}\n defaultValue={defaultValues[ProcessGameFieldsNames.sportlogiqTrackingType]}\n />\n )}\n\n {showTrackingProviderFields(ProcessGameTrackingProvider.HAWKEYE) && (\n <HawkeyeForm register={register} errors={errors} />\n )}\n\n {showTrackingProviderFields(ProcessGameTrackingProvider.CHYRONHEGO) && (\n <ChyronHegoForm register={register} errors={errors} />\n )}\n\n {showTrackingProviderFields(ProcessGameTrackingProvider.SIGNALITY) && (\n <SignalityForm register={register} errors={errors} />\n )}\n\n {showTrackingProviderFields(ProcessGameTrackingProvider.SECOND_SPECTRUM) && (\n <SecondSpectrumForm register={register} errors={errors} />\n )}\n\n {showProviderField ? (\n <FormSelectField\n id={ProcessGameFieldsNames.eventsProvider}\n label='Events provider'\n error={!!errors[ProcessGameFieldsNames.eventsProvider]}\n defaultValue={defaultValues[ProcessGameFieldsNames.eventsProvider]}\n disabled={Boolean(defaultValues[ProcessGameFieldsNames.eventsProvider])}\n fullWidth\n options={getTypeOptions({\n options: Object.values(ProcessGameEventsProvider).map((value) => ({\n value,\n })),\n })}\n helperText={\n errors[ProcessGameFieldsNames.eventsProvider] && (\n <>{errors[ProcessGameFieldsNames.eventsProvider]?.message}</>\n )\n }\n {...register(ProcessGameFieldsNames.eventsProvider)}\n onChange={(event) => {\n Object.values(eventsFilesFieldsNames).forEach((name) => unregister(name));\n return register(ProcessGameFieldsNames.eventsProvider).onChange(event);\n }}\n />\n ) : null}\n\n {showEventsProviderFields(ProcessGameEventsProvider.OPTA) && <OptaForm register={register} errors={errors} />}\n\n {showEventsProviderFields(ProcessGameEventsProvider.BUNDESLIGA) && (\n <BundesligaForm register={register} errors={errors} />\n )}\n\n <Accordion sx={{ marginBottom: 2 }}>\n <AccordionSummary expandIcon={<IconChevronDown size='small' />}>Optional</AccordionSummary>\n <AccordionDetails>\n <FormSwitchField\n id={ProcessGameFieldsNames.runProcessing}\n label='Run processing'\n defaultChecked={defaultValues[ProcessGameFieldsNames.runProcessing]}\n {...register(ProcessGameFieldsNames.runProcessing)}\n />\n <FormSwitchField\n id={ProcessGameFieldsNames.restartProcessing}\n label='Restart processing'\n defaultChecked={defaultValues[ProcessGameFieldsNames.restartProcessing]}\n {...register(ProcessGameFieldsNames.restartProcessing)}\n />\n <FormSwitchField\n id={ProcessGameFieldsNames.showOverlays}\n label='Show overlays'\n defaultChecked={defaultValues[ProcessGameFieldsNames.showOverlays]}\n {...register(ProcessGameFieldsNames.showOverlays)}\n />\n <FormSwitchField\n id={ProcessGameFieldsNames.autoRunTacticalAnalysis}\n label='Auto run tactical analysis'\n defaultChecked={defaultValues[ProcessGameFieldsNames.autoRunTacticalAnalysis]}\n {...register(ProcessGameFieldsNames.autoRunTacticalAnalysis)}\n />\n </AccordionDetails>\n </Accordion>\n\n <DialogNew\n title='Confirmation'\n icon={<IconDelete />}\n onCancel={handleConfirmDialogClose}\n onClose={handleConfirmDialogClose}\n onSubmit={handleConfirmSubmit}\n buttonSubmitText='Delete'\n open={confirmationDialogOpen}\n error\n >\n This will delete the current data for <strong>{getValues(ProcessGameFieldsNames.recordingId)}</strong> and\n restart the process.\n </DialogNew>\n\n <Stack direction='row' justifyContent='flex-end' spacing={1}>\n <Button variant='contained' type='submit'>\n Submit\n </Button>\n </Stack>\n </form>\n );\n};\n","import { Container, Paper, Stack, Typography } from '@mui/material';\nimport { useState } from 'react';\n\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { ProcessGamePreset } from '../../entities/process-game/types/processGame.types';\nimport { PresetSelector } from '../../features/process-game/PresetSelector';\nimport { PRESETS_FORMS_DEFAULTS } from '../../widgets/process-game/ProcessGameForm/config/ProcessGameForm.config';\nimport { ProcessGameFormWidget } from '../../widgets/process-game/ProcessGameForm/ProcessGameForm.widget';\n\nexport const ProcessGamePage = () => {\n const [selectedPreset, setSelectedPreset] = useState<ProcessGamePreset | undefined>();\n const [renderCounter, setRenderCounter] = useState(0);\n\n const handlePresetChange = (preset: ProcessGamePreset) => {\n setSelectedPreset(preset);\n setRenderCounter((prevCounter) => prevCounter + 1);\n };\n\n return (\n <BackofficeContentContainer>\n <Stack gap={2}>\n <Typography variant='h4'>Process game</Typography>\n\n <Container maxWidth='md'>\n <Paper sx={{ padding: 4 }}>\n <Stack gap={2}>\n <PresetSelector onChange={handlePresetChange} selectedPreset={selectedPreset} />\n {selectedPreset && (\n <ProcessGameFormWidget\n key={`${selectedPreset}-${renderCounter}`}\n selectedPreset={selectedPreset}\n defaultValues={PRESETS_FORMS_DEFAULTS[selectedPreset]}\n />\n )}\n </Stack>\n </Paper>\n </Container>\n </Stack>\n </BackofficeContentContainer>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { CreateSeasonApiParams } from './types';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateSeasons } from '../use-seasons';\n\ninterface RequestData {\n data: CreateSeasonApiParams;\n onSuccess?: () => void;\n}\n\nexport const useCreateSeason = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateSeasons = useInvalidateSeasons();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Season created',\n errorMessage: (data) => metadataApiErrorParser(data, 'Season creation error'),\n onSuccess: invalidateSeasons,\n });\n\n const create = ({ data, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: annotationApiUrls.SEASONS,\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, create };\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { UpdateSeasonApiParams } from './types';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateSeasons } from '../use-seasons';\n\ninterface RequestData {\n data: UpdateSeasonApiParams;\n id: string;\n onSuccess?: () => void;\n}\n\nexport const useUpdateSeason = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateSeasons = useInvalidateSeasons();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.PATCH,\n successMessage: 'Season updated',\n errorMessage: (data) => metadataApiErrorParser(data, 'Season update error'),\n onSuccess: invalidateSeasons,\n });\n\n const update = ({ data, id, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.SEASONS}/${id}`,\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, update };\n};\n","import { TypeOf } from 'zod';\n\nimport { seasonCompetitionFormSchema } from './form';\nimport { Competition } from '../../../../types/competitions';\n\nexport enum SeasonCompetitionFormFieldsNames {\n id = 'id',\n year = 'year',\n crossesYear = 'crossesYear',\n competition = 'competition',\n}\n\nexport interface SeasonCompetitionForm {\n [SeasonCompetitionFormFieldsNames.id]?: string;\n [SeasonCompetitionFormFieldsNames.year]: number;\n [SeasonCompetitionFormFieldsNames.crossesYear]: boolean;\n [SeasonCompetitionFormFieldsNames.competition]?: Competition;\n}\n\nexport type SeasonFormSchema = TypeOf<typeof seasonCompetitionFormSchema>;\n","import { range } from 'lodash';\n\nconst FIRST_YEAR = 1970;\n\nexport const getYears = (addYears: number) => range(FIRST_YEAR, new Date().getFullYear() + addYears + 1, 1);\n","import { Box } from '@mui/material';\n\ninterface Props {\n open: boolean;\n children: React.ReactNode;\n}\n\nexport const SearchResults = ({ open, children }: Props) => {\n if (!open) return null;\n\n return <Box>{children}</Box>;\n};\n","import { Box, ListItem, Stack, Typography } from '@mui/material';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Autocomplete } from 'shared/components/autocomplete';\nimport { AutocompleteDropdownButton } from 'shared/components/autocomplete-multi-select/components/autocomplete-dropdown-button';\nimport {\n AutocompletePopper,\n AutocompletePopperContent,\n} from 'shared/components/autocomplete-multi-select/components/autocomplete-popper';\nimport { AutocompletePopperWrapper } from 'shared/components/autocomplete-multi-select/components/autocomplete-popper-wrapper';\n\nimport { useCompetitions } from '../../../../api/competitions/use-competitions';\nimport { Competition } from '../../../../types/competitions';\nimport { SearchResults } from '../search-results';\n\ninterface Props {\n setCompetitionOnChange: (competition: Competition | undefined) => void;\n competition?: Competition;\n}\n\nconst AUTOCOMPLETE_WIDTH = 400;\n\nexport const SelectCompetition = ({ setCompetitionOnChange, competition }: Props) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const [autocompleteValue, setAutocompleteValue] = useState<Competition | undefined>();\n const { items: competitionResults, isLoading, setFilters, fetchNextPage } = useCompetitions();\n const { t } = useTranslation();\n\n const isOpen = Boolean(anchorEl);\n\n const open = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setAutocompleteValue(competition);\n setAnchorEl(event.currentTarget);\n },\n [competition],\n );\n\n const close = useCallback(() => {\n setFilters({});\n setAnchorEl(null);\n }, [setFilters]);\n\n const handleDropdownClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n isOpen ? close() : open(event);\n },\n [isOpen, close, open],\n );\n\n const handleSelectCompetition = useCallback(() => {\n setAutocompleteValue((autocompleteValue) => {\n setCompetitionOnChange(autocompleteValue);\n return autocompleteValue;\n });\n close();\n }, [close, setCompetitionOnChange]);\n\n const handleSetName = useCallback(\n (name: string) => {\n setFilters({ name: name });\n },\n [setFilters],\n );\n\n const renderOption = useCallback((props: React.ComponentProps<typeof ListItem>, option: Competition) => {\n return (\n <ListItem {...props} key={option.id}>\n <Box px={1} py={0.5}>\n {option.name}\n </Box>\n </ListItem>\n );\n }, []);\n\n const paperComponent = useCallback(\n (props: any) => (\n <SearchResults {...props} open={isOpen}>\n {props.children}\n </SearchResults>\n ),\n [isOpen],\n );\n\n const handleUpdateValue = useCallback(\n (item: Competition | null) => {\n if (item === null) return;\n setAutocompleteValue(item);\n setCompetitionOnChange(item);\n close();\n },\n [setAutocompleteValue, setCompetitionOnChange, close],\n );\n\n const isOptionEqual = useCallback((option: Competition, value: Competition) => option.id === value.id, []);\n const getOptionName = useCallback((option: Competition) => option.name, []);\n\n return (\n <Stack direction={'column'} spacing={1}>\n <Typography variant={'body1'}>Select competition</Typography>\n <Box>\n <AutocompleteDropdownButton\n isOpen={isOpen}\n onClick={handleDropdownClick}\n isSelected={Boolean(competition)}\n label={competition ? competition.name : 'Select competition'}\n />\n {anchorEl && (\n <ClickAwayListener onClickAway={handleSelectCompetition}>\n <AutocompletePopper anchorEl={anchorEl} open={isOpen} placement='bottom-start'>\n <AutocompletePopperContent elevation={8}>\n <Autocomplete\n autoFocus\n PaperComponent={paperComponent}\n PopperComponent={AutocompletePopperWrapper}\n fetchNextPage={fetchNextPage}\n getItemLabel={getOptionName}\n inputWidth={AUTOCOMPLETE_WIDTH}\n isLoading={isLoading}\n isOptionEqualToValue={isOptionEqual}\n listWidth={AUTOCOMPLETE_WIDTH}\n multiple={false}\n onChange={handleSetName}\n open\n options={competitionResults}\n renderOption={renderOption}\n placeholder={t('common:actions.search')}\n resultsHeight={260}\n updateValue={handleUpdateValue}\n value={autocompleteValue}\n />\n </AutocompletePopperContent>\n </AutocompletePopper>\n </ClickAwayListener>\n )}\n </Box>\n </Stack>\n );\n};\n","import { Checkbox, FormControl, Stack, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\nimport { Control, Controller, Path, UseFormRegister, FieldErrors } from 'react-hook-form';\n\nimport { FormSelectField } from 'shared/components/form/form-select-field';\nimport { getTypeOptions } from 'shared/components/form/get-type-options';\n\nimport { SeasonCompetitionFormFieldsNames } from './types';\nimport { getYears } from '../../../../utils/years';\nimport { SelectCompetition } from '../select-competition';\n\ninterface Props<TFormValues extends Record<string, any>> {\n register: UseFormRegister<TFormValues>;\n errors: FieldErrors<TFormValues>;\n control: Control<TFormValues>;\n}\n\nexport function SeasonCompetitionsForm<TFormValues extends Record<string, any>>({\n register,\n errors,\n control,\n}: Props<TFormValues>) {\n return (\n <>\n <FormControl fullWidth margin='normal'>\n <Stack direction='row' spacing={1} alignItems='center'>\n <Typography variant={'body1'}>Year</Typography>\n <FormSelectField\n id={SeasonCompetitionFormFieldsNames.year}\n options={getTypeOptions({ options: getYears(10).map((year) => ({ value: year })) })}\n error={!!errors[SeasonCompetitionFormFieldsNames.year]}\n helperText={\n errors[SeasonCompetitionFormFieldsNames.year] && (\n <>{errors[SeasonCompetitionFormFieldsNames.year]?.message}</>\n )\n }\n defaultValue={new Date().getFullYear()}\n fullWidth={false}\n {...register(SeasonCompetitionFormFieldsNames.year as Path<TFormValues>)}\n />\n </Stack>\n </FormControl>\n <Controller\n render={({ field: { onChange, value } }) => (\n <Stack direction='row' spacing={1} alignItems='center'>\n <Typography variant={'body1'}>Crosses year</Typography>\n <Checkbox id={SeasonCompetitionFormFieldsNames.crossesYear} checked={value} onChange={onChange} />\n </Stack>\n )}\n name={SeasonCompetitionFormFieldsNames.crossesYear as Path<TFormValues>}\n control={control}\n />\n <Controller\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <SelectCompetition setCompetitionOnChange={onChange} competition={value} />\n {error && <Typography color={Colors.red}>{error.message}</Typography>}\n </>\n )}\n name={SeasonCompetitionFormFieldsNames.competition as Path<TFormValues>}\n control={control}\n />\n </>\n );\n}\n","import { z } from 'zod';\n\nimport { SeasonCompetitionFormFieldsNames } from './types';\nimport { CompetitionFormFieldsNames } from '../../../competitions/components/competition-form/types';\n\nexport const seasonCompetitionFormSchema = z.object({\n [SeasonCompetitionFormFieldsNames.id]: z.string().optional(),\n [SeasonCompetitionFormFieldsNames.year]: z.number().min(1970),\n [SeasonCompetitionFormFieldsNames.crossesYear]: z.boolean(),\n [SeasonCompetitionFormFieldsNames.competition]: z.object({\n [CompetitionFormFieldsNames.id]: z.string(),\n [CompetitionFormFieldsNames.name]: z.string().trim().min(2),\n [CompetitionFormFieldsNames.country]: z.string(),\n }),\n});\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { IconUser } from 'shared/components/icons/icon-user';\n\nimport { useCreateSeason } from '../../../../api/seasons/use-create-season';\nimport { useUpdateSeason } from '../../../../api/seasons/use-update-season';\nimport { SeasonCompetitionsForm } from '../season-competition-form';\nimport { seasonCompetitionFormSchema } from '../season-competition-form/form';\nimport {\n SeasonCompetitionForm,\n SeasonCompetitionFormFieldsNames,\n SeasonFormSchema,\n} from '../season-competition-form/types';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n defaultValues?: SeasonCompetitionForm;\n}\n\nconst seasonsFormId = 'seasons-form';\nconst EMPTY_VALUES = {\n [SeasonCompetitionFormFieldsNames.id]: '',\n [SeasonCompetitionFormFieldsNames.year]: new Date().getFullYear(),\n [SeasonCompetitionFormFieldsNames.crossesYear]: true,\n [SeasonCompetitionFormFieldsNames.competition]: undefined,\n};\n\nexport const SeasonCompetitionModal = ({ open, onClose, defaultValues }: Props) => {\n const formRef = useRef<HTMLFormElement>(null);\n const {\n register,\n formState: { errors },\n handleSubmit,\n reset,\n control,\n } = useForm<SeasonFormSchema>({\n resolver: zodResolver(seasonCompetitionFormSchema),\n defaultValues: defaultValues || EMPTY_VALUES,\n });\n\n const { create } = useCreateSeason();\n const { update } = useUpdateSeason();\n\n const handleCreate = useCallback(\n (data: SeasonCompetitionForm) => {\n const { year, crossesYear, competition } = data;\n create({\n data: {\n year,\n crosses_year: crossesYear,\n competition_uuid: competition?.id ?? '',\n },\n onSuccess: () => {\n onClose();\n reset();\n },\n });\n },\n [create, onClose, reset],\n );\n\n const handleUpdate = useCallback(\n (data: SeasonCompetitionForm) => {\n if (!data?.id) return;\n const { id, year, crossesYear, competition } = data;\n update({\n data: {\n year,\n crosses_year: crossesYear,\n competition_uuid: competition?.id ?? '',\n },\n id,\n onSuccess: () => {\n onClose();\n reset();\n },\n });\n },\n [onClose, reset, update],\n );\n\n const handleCreateOrUpdate = useCallback(\n (data: SeasonCompetitionForm) => {\n if (defaultValues) {\n handleUpdate(data);\n } else {\n handleCreate(data);\n }\n },\n [defaultValues, handleCreate, handleUpdate],\n );\n\n return (\n <DialogNew\n maxWidth='sm'\n fullWidth\n title={defaultValues ? 'Edit season' : 'New season'}\n icon={<IconUser size='small' />}\n onCancel={onClose}\n onClose={onClose}\n buttonSubmitText={defaultValues ? 'Save' : 'Create'}\n open={open}\n buttonFormId={seasonsFormId}\n >\n <form id={seasonsFormId} ref={formRef} onSubmit={handleSubmit(handleCreateOrUpdate)}>\n <SeasonCompetitionsForm register={register} errors={errors} control={control} />\n </form>\n </DialogNew>\n );\n};\n","import { Button, Grid } from '@mui/material';\nimport { useState } from 'react';\n\nimport { StageMiniSummary, StageSummary } from '../../../../../types/stages';\n\ntype Props = {\n stages: StageSummary[];\n};\n\ntype StageProps = {\n name: string;\n childStages?: StageMiniSummary[];\n nested?: boolean;\n};\n\nconst orderIndex = (a: StageMiniSummary, b: StageMiniSummary) => a.orderIndex - b.orderIndex;\n\nconst StageItem = ({ name, childStages, nested = false }: StageProps) => {\n return (\n <Grid item sx={{ paddingLeft: nested ? '4px' : 0 }}>\n {nested ? '↳ ' : ''}\n {name}\n {childStages\n ? childStages\n .sort(orderIndex)\n .map((childStage) => <StageItem key={childStage.id} name={childStage.name} nested />)\n : null}\n </Grid>\n );\n};\n\nexport const SeasonCompetitionStages = ({ stages }: Props) => {\n const [collapsed, setCollapsed] = useState(true);\n const filteredStages = stages.filter((stage) => !stage.parentStage).sort(orderIndex);\n const stagesChunk1 = filteredStages.slice(0, 5);\n const stagesChunk2 = filteredStages.slice(5, filteredStages.length);\n\n return (\n <Grid container direction={'column'} spacing={1}>\n {stagesChunk1.map((stage) => (\n <StageItem key={stage.id} name={stage.name} childStages={stage.childStages} />\n ))}\n {stagesChunk2.length > 0 && !collapsed\n ? stagesChunk2.map((stage) => <StageItem key={stage.id} name={stage.name} childStages={stage.childStages} />)\n : null}\n {stagesChunk2.length > 0 && collapsed ? (\n <Button size='small' onClick={() => setCollapsed(false)}>\n ...\n </Button>\n ) : null}\n {stagesChunk2.length > 0 && !collapsed ? (\n <Button size='small' onClick={() => setCollapsed(true)}>\n hide\n </Button>\n ) : null}\n </Grid>\n );\n};\n","import { ListItem, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const SeasonCompetitionsListItem = styled(ListItem)(({ theme }) => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '1fr 1fr 1fr 32px',\n borderBottom: `1px solid ${Colors.iron}`,\n padding: `${theme.spacing(1, 2, 1, 3)} !important`,\n}));\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateSeasons } from '../use-seasons';\n\ninterface DeleteSeasonApiParams {\n id: string;\n onSuccess?: () => void;\n}\n\nexport const useDeleteSeason = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateSeasons = useInvalidateSeasons();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.DELETE,\n successMessage: 'Season deleted',\n errorMessage: (data) => metadataApiErrorParser(data, 'Season delete error'),\n onSuccess: invalidateSeasons,\n });\n\n const deleteSeason = ({ id, onSuccess }: DeleteSeasonApiParams) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.SEASONS}/${id}`,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, deleteSeason };\n};\n","import { Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport ConfirmDialog from 'shared/components/confirm-dialog';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\n\nimport { SeasonCompetitionStages } from './season-competition-stages';\nimport { SeasonCompetitionsListItem } from './styled';\nimport { useDeleteSeason } from '../../../../api/seasons/use-delete-season';\nimport { Season } from '../../../../types/seasons';\nimport { SeasonCompetitionFormFieldsNames } from '../season-competition-form/types';\nimport { SeasonCompetitionModal } from '../season-competition-modal';\n\ninterface Props {\n season: Season;\n}\n\nexport const SeasonCompetitionItem = ({ season }: Props) => {\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [isConfirmDeleteDialogOpen, setIsConfirmDeleteDialogOpen] = useState(false);\n const { deleteSeason } = useDeleteSeason();\n\n const handleEditModalOpen = () => setIsEditModalOpen(true);\n const handleEditModalClose = () => setIsEditModalOpen(false);\n\n const handleDeleteSeason = useCallback(() => {\n deleteSeason({ id: season.id });\n }, [season.id, deleteSeason]);\n\n const options: MenuListOption[] = [\n {\n displayText: 'Edit',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: handleEditModalOpen,\n },\n {\n displayText: 'Delete',\n icon: <IconDelete size='small' color='secondary' />,\n onClick: () => setIsConfirmDeleteDialogOpen(true),\n },\n ];\n\n const defaultValues = {\n [SeasonCompetitionFormFieldsNames.id]: season.id,\n [SeasonCompetitionFormFieldsNames.year]: season.year,\n [SeasonCompetitionFormFieldsNames.crossesYear]: season.crossesYear,\n [SeasonCompetitionFormFieldsNames.competition]: season.competition,\n };\n\n const seasonYearName = useMemo(() => {\n return season.crossesYear ? `${season.year}-${(season.year + 1).toString().slice(2)}` : season.year.toString();\n }, [season.year, season.crossesYear]);\n\n return (\n <>\n <SeasonCompetitionsListItem key={season.id}>\n <Typography fontWeight={fontWeight['500']}>{seasonYearName}</Typography>\n <Typography>{season?.competition?.name ?? ''}</Typography>\n <Typography>{season.stages ? <SeasonCompetitionStages stages={season.stages} /> : null}</Typography>\n <KebabMenu options={options} />\n </SeasonCompetitionsListItem>\n\n {isEditModalOpen ? (\n <SeasonCompetitionModal open={isEditModalOpen} onClose={handleEditModalClose} defaultValues={defaultValues} />\n ) : null}\n\n <ConfirmDialog\n type={'warning'}\n title={`You sure you want delete \"${seasonYearName}\" season?`}\n cancelLabel={'Cancel'}\n confirmLabel={'Delete'}\n onConfirm={handleDeleteSeason}\n isOpen={isConfirmDeleteDialogOpen}\n setIsOpen={setIsConfirmDeleteDialogOpen}\n />\n </>\n );\n};\n","import { List } from '@mui/material';\n\nimport { Season } from '../../../../types/seasons';\nimport { SeasonCompetitionItem } from '../season-competition-item';\n\ninterface Props {\n seasons: Season[];\n}\n\nexport const SeasonCompetitionsList = ({ seasons }: Props) => {\n const seasonsItems = seasons.map((season) => {\n return <SeasonCompetitionItem key={season.id} season={season} />;\n });\n\n return <List>{seasonsItems}</List>;\n};\n","import { Box, styled } from '@mui/material';\n\nexport const SeasonCompetitionsListHeaderGrid = styled(Box)(() => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '1fr 1fr 1fr 32px',\n alignItems: 'center',\n}));\n","import { Box, Button, Stack, TextField, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport debounce from 'lodash/debounce';\nimport { ChangeEvent, useCallback, useState } from 'react';\n\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport NotFound from 'shared/components/not-found';\nimport Pagination from 'shared/components/pagination';\n\nimport { SeasonCompetitionModal } from './components/season-competition-modal';\nimport { SeasonCompetitionsList } from './components/season-competitions-list';\nimport { SeasonCompetitionsListHeaderGrid } from './styled';\nimport { useSeasons } from '../../api/seasons/use-seasons';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { ListSkeleton } from '../../components/list-skeleton';\n\nconst DEBOUNCE_TIME = 300;\n\nexport const SeasonCompetitions = () => {\n const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);\n const { items, page, fetchNextPage, isFetching, setFilters } = useSeasons();\n\n const handleCreateModalOpen = useCallback(() => setIsCreateModalOpen(true), []);\n const handleCreateModalClose = useCallback(() => setIsCreateModalOpen(false), []);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleSearchChange = useCallback(\n debounce((event: ChangeEvent<HTMLInputElement>) => {\n setFilters({ name: event.target.value });\n }, DEBOUNCE_TIME),\n [setFilters],\n );\n\n return (\n <BackofficeContentContainer>\n <Stack direction='row' alignItems='center' justifyContent='space-between' marginBottom={2}>\n <Typography variant='h4'>Season competitions</Typography>\n <Button\n variant='contained'\n size='large'\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n onClick={handleCreateModalOpen}\n >\n New season\n </Button>\n </Stack>\n\n <Stack marginBottom={2} justifyContent='flex-end' direction='row'>\n <TextField size='small' placeholder='Search seasons' onChange={handleSearchChange} />\n </Stack>\n\n <ListHeader>\n <SeasonCompetitionsListHeaderGrid>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Year\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Competition\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Stages\n </Typography>\n <div>&nbsp;</div>\n </SeasonCompetitionsListHeaderGrid>\n </ListHeader>\n {!isFetching && items.length === 0 ? (\n <Box marginTop={4}>\n <NotFound header={'No results'} />\n </Box>\n ) : null}\n {isFetching ? <ListSkeleton /> : <SeasonCompetitionsList seasons={items} />}\n {page ? (\n <Pagination\n total={page.totalElements}\n displayed={items.length}\n onShowMore={fetchNextPage}\n getStatsText={(displayed, total) => `${displayed} of ${total} seasons`}\n />\n ) : null}\n <SeasonCompetitionModal open={isCreateModalOpen} onClose={handleCreateModalClose} />\n </BackofficeContentContainer>\n );\n};\n","import { ListItem, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const StagesListItem = styled(ListItem)(({ theme }) => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '1fr 1fr 1fr 1fr auto',\n borderBottom: `1px solid ${Colors.iron}`,\n padding: `${theme.spacing(1, 2, 1, 3)} !important`,\n}));\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateStages } from '../use-stages';\n\ninterface DeleteParams {\n stageId: string;\n seasonId: string;\n onSuccess?: () => void;\n}\n\nexport const useDeleteStage = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateStages = useInvalidateStages();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.DELETE,\n successMessage: 'Stage deleted',\n errorMessage: (data) => metadataApiErrorParser(data, 'Stage delete error'),\n onSuccess: invalidateStages,\n });\n\n const deleteStage = ({ stageId, onSuccess }: DeleteParams) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.STAGES}/${stageId}`,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, deleteStage };\n};\n","import { Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\n\nimport ConfirmDialog from 'shared/components/confirm-dialog';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\n\nimport { StagesListItem } from './styled';\nimport { useDeleteStage } from '../../../../api/stages/use-delete-stage';\nimport { StageModal } from '../../../../components/stage-modal';\nimport { Stage } from '../../../../types/stages';\nimport { printSummarySeasonName } from '../../../../utils/print-season-name';\nimport { adjustOrderIndexForDisplay } from '../../utils';\nimport { StageFormFieldsNames } from '../stage-form/types';\n\ninterface Props {\n stage: Stage;\n}\n\nexport const StageItem = ({ stage }: Props) => {\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [isConfirmDeleteDialogOpen, setIsConfirmDeleteDialogOpen] = useState(false);\n const { deleteStage } = useDeleteStage();\n\n const handleEditModalOpen = () => setIsEditModalOpen(true);\n const handleEditModalClose = () => setIsEditModalOpen(false);\n\n const handleDeleteStage = useCallback(() => {\n if (!stage.season.id) return;\n\n deleteStage({ stageId: stage.id, seasonId: stage.season.id });\n }, [stage.id, stage.season.id, deleteStage]);\n\n const options: MenuListOption[] = [\n {\n displayText: 'Edit',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: handleEditModalOpen,\n },\n {\n displayText: 'Delete',\n icon: <IconDelete size='small' color='secondary' />,\n onClick: () => setIsConfirmDeleteDialogOpen(true),\n },\n ];\n\n const stageValues = {\n [StageFormFieldsNames.id]: stage.id,\n [StageFormFieldsNames.name]: stage.name,\n [StageFormFieldsNames.orderIndex]: stage.orderIndex ? stage.orderIndex : 0,\n [StageFormFieldsNames.season]: stage.season ? stage.season : undefined,\n [StageFormFieldsNames.parentStageId]: stage.parentStage?.id ? stage.parentStage.id : undefined,\n };\n\n return (\n <>\n <StagesListItem key={stage.id}>\n <Typography fontWeight={fontWeight['500']}>{stage.name}</Typography>\n <Typography>{adjustOrderIndexForDisplay(stage.orderIndex)}</Typography>\n <Typography>{printSummarySeasonName(stage.season)}</Typography>\n <Typography>{stage.parentStage?.name}</Typography>\n\n <KebabMenu options={options} />\n </StagesListItem>\n\n {isEditModalOpen ? (\n <StageModal open={isEditModalOpen} onClose={handleEditModalClose} defaultValues={stageValues} />\n ) : null}\n\n <ConfirmDialog\n type={'warning'}\n title={`You sure you want delete \"${stage.name}\" stage?`}\n cancelLabel={'Cancel'}\n confirmLabel={'Delete'}\n onConfirm={handleDeleteStage}\n isOpen={isConfirmDeleteDialogOpen}\n setIsOpen={setIsConfirmDeleteDialogOpen}\n />\n </>\n );\n};\n","import { List } from '@mui/material';\n\nimport { Stage } from '../../../../types/stages';\nimport { StageItem } from '../stage-item';\n\ninterface Props {\n stages: Stage[];\n}\n\nexport const StagesList = ({ stages }: Props) => {\n const stagesItems = stages.map((stage) => {\n return <StageItem key={stage.id} stage={stage} />;\n });\n\n return <List>{stagesItems}</List>;\n};\n","import { Box, styled } from '@mui/material';\n\nexport const StageListHeaderGrid = styled(Box)(() => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '1fr 1fr 1fr 1fr 32px',\n alignItems: 'center',\n}));\n","import { Box, Button, Stack, TextField, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport debounce from 'lodash/debounce';\nimport { ChangeEvent, useCallback, useState } from 'react';\n\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport NotFound from 'shared/components/not-found';\nimport Pagination from 'shared/components/pagination';\n\nimport { StagesList } from './components/stage-list';\nimport { StageListHeaderGrid } from './styled';\nimport { useStages } from '../../api/stages/use-stages';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { ListSkeleton } from '../../components/list-skeleton';\nimport { StageModal } from '../../components/stage-modal';\n\nconst DEBOUNCE_TIME = 300;\n\nexport const Stages = () => {\n const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);\n const { items, page, fetchNextPage, isFetching, setFilters } = useStages();\n\n const handleCreateModalOpen = useCallback(() => setIsCreateModalOpen(true), []);\n const handleCreateModalClose = useCallback(() => setIsCreateModalOpen(false), []);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleSearchChange = useCallback(\n debounce((event: ChangeEvent<HTMLInputElement>) => {\n setFilters({ name: event.target.value });\n }, DEBOUNCE_TIME),\n [setFilters],\n );\n\n return (\n <BackofficeContentContainer>\n <Stack direction='row' alignItems='center' justifyContent='space-between' marginBottom={2}>\n <Typography variant='h4'>Stages</Typography>\n <Button\n variant='contained'\n size='large'\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n onClick={handleCreateModalOpen}\n >\n New stage\n </Button>\n </Stack>\n\n <Stack marginBottom={2} justifyContent='flex-end' direction='row'>\n <TextField size='small' placeholder='Search stages' onChange={handleSearchChange} />\n </Stack>\n\n <ListHeader>\n <StageListHeaderGrid>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Name\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Order\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Season\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Parent Stage\n </Typography>\n <div>&nbsp;</div>\n </StageListHeaderGrid>\n </ListHeader>\n {!isFetching && items.length === 0 ? (\n <Box marginTop={4}>\n <NotFound header={'No results'} />\n </Box>\n ) : null}\n\n {isFetching ? <ListSkeleton /> : <StagesList stages={items} />}\n\n {page ? (\n <Pagination\n total={page.totalElements}\n displayed={items.length}\n onShowMore={fetchNextPage}\n getStatsText={(displayed, total) => `${displayed} of ${total} stages`}\n />\n ) : null}\n <StageModal open={isCreateModalOpen} onClose={handleCreateModalClose} />\n </BackofficeContentContainer>\n );\n};\n","import { ListItem, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const TeamListItem = styled(ListItem)(({ theme }) => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '1fr 1fr 1fr auto',\n borderBottom: `1px solid ${Colors.iron}`,\n padding: `${theme.spacing(1)} ${theme.spacing(2)} ${theme.spacing(1)} ${theme.spacing(2)} !important`,\n}));\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { TeamApi } from '../types';\n\ntype UpdateTeamParams = Pick<TeamApi, 'name' | 'abbreviation' | 'country_code' | 'team_type'> & { image?: File };\n\nexport const useUpdateTeam = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.PATCH,\n successMessage: 'Team updated',\n errorMessage: (data) => metadataApiErrorParser(data, 'Team update error'),\n });\n\n const editTeam = ({ data, id, onSuccess }: { data: UpdateTeamParams; id: string; onSuccess?: () => void }) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n const formData = new FormData();\n formData.append(\n 'team',\n JSON.stringify({\n name: data.name,\n abbreviation: data.abbreviation,\n country_code: data.country_code,\n team_type: data.team_type,\n }),\n );\n data.image && formData.append('team_image', data.image);\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.TEAMS}/${id}`,\n data: formData,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, editTeam };\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport IconEdit from 'shared/components/icons/icon-edit';\n\nimport { useInvalidateTeams } from '../../../../api/teams/use-teams';\nimport { useUpdateTeam } from '../../../../api/teams/use-update-team';\nimport { MetadataTeamWithFixtures } from '../../../../types/teams';\nimport { TeamForm } from '../team-form';\nimport { editTeamFormSchema } from '../team-form/form';\nimport { EditTeamForm, EditTeamFormSchema, TeamFormFieldsNames } from '../team-form/types';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n teamId: string;\n team?: MetadataTeamWithFixtures;\n}\n\nexport const EditTeamModal = ({ open, onClose, team, teamId }: Props) => {\n const formRef = useRef<HTMLFormElement>(null);\n const invalidateQuery = useInvalidateTeams();\n const { editTeam } = useUpdateTeam();\n\n const initialValues = team\n ? {\n [TeamFormFieldsNames.name]: team.name,\n [TeamFormFieldsNames.abbreviation]: team.abbreviation,\n [TeamFormFieldsNames.countryCode]: team.countryCode,\n [TeamFormFieldsNames.teamType]: team.teamType,\n }\n : undefined;\n\n const {\n register,\n formState: { errors, isDirty },\n handleSubmit,\n watch,\n trigger,\n control,\n } = useForm<EditTeamFormSchema>({\n resolver: zodResolver(editTeamFormSchema),\n defaultValues: initialValues,\n });\n\n const handleEditTeam = useCallback(\n (team: EditTeamForm) => {\n editTeam({\n data: {\n name: team[TeamFormFieldsNames.name],\n country_code: team[TeamFormFieldsNames.countryCode],\n team_type: team[TeamFormFieldsNames.teamType],\n abbreviation: team[TeamFormFieldsNames.abbreviation],\n image: team[TeamFormFieldsNames.teamImage] ? team[TeamFormFieldsNames.teamImage][0] : undefined,\n },\n id: teamId,\n onSuccess: () => {\n invalidateQuery();\n onClose();\n },\n });\n },\n [editTeam, invalidateQuery, onClose, teamId],\n );\n\n const handleModalSubmit = useCallback(() => {\n formRef.current?.requestSubmit();\n }, []);\n\n return (\n <DialogNew\n maxWidth='sm'\n fullWidth\n title='Edit player'\n icon={<IconEdit size='small' />}\n onCancel={onClose}\n onClose={onClose}\n onSubmit={handleModalSubmit}\n buttonSubmitText={'Done'}\n open={open}\n submitDisabled={!isDirty}\n >\n <form ref={formRef} onSubmit={handleSubmit(handleEditTeam)}>\n <TeamForm<EditTeamFormSchema>\n watch={watch}\n register={register}\n errors={errors}\n trigger={trigger}\n control={control}\n />\n </form>\n </DialogNew>\n );\n};\n","import { Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { IconUser } from 'shared/components/icons/icon-user';\nimport { useDates } from 'shared/hooks/use-dates';\n\nimport { TeamFixture } from '../../../../types/teams';\n\ninterface Props {\n onClose: () => void;\n teamDetails: TeamFixture[];\n}\n\nfunction createData(name: string, value: string) {\n return { name, value };\n}\n\nconst TableData = ({ teamFixture }: { teamFixture: TeamFixture }) => {\n const { dateToString } = useDates();\n const rows = [\n createData('name', teamFixture.name.toString()),\n createData('duration', teamFixture.duration.toString()),\n createData('date', dateToString(teamFixture.date)),\n createData('team_away_score', teamFixture.homeTeamScore.toString()),\n createData('away_team_score', teamFixture.awayTeamScore.toString()),\n createData('pitch_length', teamFixture.pitchLength.toString()),\n createData('pitch_width', teamFixture.pitchWidth.toString()),\n ];\n\n return (\n <TableContainer component={Paper} sx={{ marginBottom: 2 }}>\n <Table sx={{ minWidth: 650 }} aria-label='team details table'>\n <TableHead>\n <TableRow>\n <TableCell>Name</TableCell>\n <TableCell align='right'>Value</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map((row) => (\n <TableRow key={row.name} sx={{ '&:last-child td, &:last-child th': { border: 0 } }}>\n <TableCell component='th' scope='row'>\n {row.name}\n </TableCell>\n <TableCell align='right'>{row.value}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n );\n};\n\nexport const TeamDetailsModal = ({ onClose, teamDetails }: Props) => {\n return (\n <DialogNew\n fullWidth\n maxWidth='md'\n title={'Team details'}\n icon={<IconUser />}\n onCancel={onClose}\n onClose={onClose}\n open={true}\n >\n {teamDetails.map((fixture) => (\n <TableData key={fixture.id} teamFixture={fixture} />\n ))}\n </DialogNew>\n );\n};\n","import { Stack, Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport { useState } from 'react';\n\nimport { IconTimeline } from 'shared/components/icons';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\nimport { TeamLogo } from 'shared/components/team-logo';\n\nimport { TeamListItem } from './styled';\nimport { MetadataTeamWithFixtures } from '../../../../types/teams';\nimport { Countries } from '../../../../utils/countries';\nimport { EditTeamModal } from '../edit-team-modal';\nimport { TeamDetailsModal } from '../team-details-modal';\n\ninterface Props {\n team: MetadataTeamWithFixtures;\n}\n\nexport const TeamItem = ({ team }: Props) => {\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [isDetailsModalOpen, setIsDetailsModalOpen] = useState(false);\n const handleEditModalOpen = () => setIsEditModalOpen(true);\n const handleEditModalClose = () => setIsEditModalOpen(false);\n const handleDetailsModalOpen = () => setIsDetailsModalOpen(true);\n const handleDetailsModalClose = () => setIsDetailsModalOpen(false);\n\n const options: MenuListOption[] = [\n {\n displayText: 'Edit',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: handleEditModalOpen,\n },\n {\n displayText: 'Details',\n icon: <IconTimeline size='small' color='secondary' />,\n onClick: handleDetailsModalOpen,\n },\n ];\n\n return (\n <>\n <TeamListItem key={team.id}>\n <Stack direction={'row'} spacing={2} alignItems={'center'}>\n <TeamLogo src={team.logoUrl ?? undefined} name={team.name} />\n <Typography fontWeight={fontWeight['500']}>{team.name}</Typography>\n </Stack>\n <Typography>{team.abbreviation}</Typography>\n <Typography>\n {Countries.find((item) => item.code.toUpperCase() === team.countryCode?.toUpperCase())?.name || ''}\n </Typography>\n <KebabMenu options={options} />\n </TeamListItem>\n {isEditModalOpen ? (\n <EditTeamModal open={isEditModalOpen} onClose={handleEditModalClose} team={team} teamId={team.id} />\n ) : null}\n {isDetailsModalOpen && team?.fixtures ? (\n <TeamDetailsModal teamDetails={team.fixtures} onClose={handleDetailsModalClose} />\n ) : null}\n </>\n );\n};\n","import { List } from '@mui/material';\n\nimport { MetadataTeamWithFixtures } from '../../../../types/teams';\nimport { TeamItem } from '../team-item';\n\ninterface Props {\n teams: MetadataTeamWithFixtures[];\n}\n\nexport const TeamsList = ({ teams }: Props) => {\n const teamsItems = teams.map((team) => {\n return <TeamItem key={team.id} team={team} />;\n });\n\n return <List>{teamsItems}</List>;\n};\n","import { Skeleton, Stack } from '@mui/material';\n\nexport const TeamsListSkeleton = () => {\n return (\n <Stack spacing={1} marginTop={2} marginBottom={2}>\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n <Skeleton variant='rectangular' width='100%' height={50} />\n </Stack>\n );\n};\n","import { Box, styled } from '@mui/material';\n\nexport const TeamListHeaderGrid = styled(Box)({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '1fr 1fr 1fr auto',\n marginLeft: '-8px',\n});\n","import { Box, Button, Stack, TextField, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport debounce from 'lodash/debounce';\nimport { ChangeEvent, useCallback, useState } from 'react';\n\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport NotFound from 'shared/components/not-found';\nimport Pagination from 'shared/components/pagination';\n\nimport { TeamsList } from './components/teams-list';\nimport { TeamsListSkeleton } from './components/teams-list-skeleton';\nimport { TeamListHeaderGrid } from './styled';\nimport { useTeams } from '../../api/teams/use-teams';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { CreateTeamModal } from '../../components/create-team-modal';\n\nconst DEBOUNCE_TIME = 300;\n\nexport const Teams = () => {\n const [isCreateTeamModalOpen, setIsCreateTeamModalOpen] = useState(false);\n const { items, page, fetchNextPage, isFetching, setFilters } = useTeams();\n\n const handleCreateTeamModalOpen = () => setIsCreateTeamModalOpen(true);\n const handleCreateTeamModalClose = () => setIsCreateTeamModalOpen(false);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleSearchChange = useCallback(\n debounce((event: ChangeEvent<HTMLInputElement>) => {\n setFilters({ name: event.target.value });\n }, DEBOUNCE_TIME),\n [setFilters],\n );\n\n return (\n <BackofficeContentContainer>\n <Stack direction='row' alignItems='center' justifyContent='space-between' marginBottom={2}>\n <Typography variant='h4'>Teams</Typography>\n <Button\n variant='contained'\n size='large'\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n onClick={handleCreateTeamModalOpen}\n >\n New team\n </Button>\n </Stack>\n\n <Stack marginBottom={2} justifyContent='flex-end' direction='row'>\n <TextField size='small' placeholder='Search teams' onChange={handleSearchChange} />\n </Stack>\n\n <ListHeader>\n <TeamListHeaderGrid>\n <Typography fontWeight={'500'} fontSize={fontSizes.default}>\n Name\n </Typography>\n <Typography fontWeight={'500'} fontSize={fontSizes.default}>\n Abbreviation\n </Typography>\n <Typography fontWeight={'500'} fontSize={fontSizes.default}>\n Country\n </Typography>\n <div style={{ width: '32px' }}>&nbsp;</div>\n </TeamListHeaderGrid>\n </ListHeader>\n {!isFetching && items.length === 0 ? (\n <Box marginTop={4}>\n <NotFound header={'No results'} />\n </Box>\n ) : null}\n {isFetching ? <TeamsListSkeleton /> : <TeamsList teams={items} />}\n {page ? (\n <Pagination\n total={page.totalElements}\n displayed={items.length}\n onShowMore={fetchNextPage}\n getStatsText={(displayed, total) => `${displayed} of ${total} teams`}\n />\n ) : null}\n {isCreateTeamModalOpen ? (\n <CreateTeamModal open={isCreateTeamModalOpen} onClose={handleCreateTeamModalClose} />\n ) : null}\n </BackofficeContentContainer>\n );\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { CreateVenueApiParams } from './types';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateVenues } from '../use-venues';\n\ninterface RequestData {\n data: CreateVenueApiParams;\n onSuccess?: () => void;\n}\n\nexport const useCreateVenue = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateVenues = useInvalidateVenues();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.POST,\n successMessage: 'Venue created',\n errorMessage: (data) => metadataApiErrorParser(data, 'Venue creation error'),\n onSuccess: invalidateVenues,\n });\n\n const create = ({ data, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: annotationApiUrls.VENUES,\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, create };\n};\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { UpdateVenueApiParams } from './types';\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateVenues } from '../use-venues';\n\ninterface RequestData {\n data: UpdateVenueApiParams;\n id: string;\n onSuccess?: () => void;\n}\n\nexport const useUpdateVenue = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateVenues = useInvalidateVenues();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.PATCH,\n successMessage: 'Venue updated',\n errorMessage: (data) => metadataApiErrorParser(data, 'Venue update error'),\n onSuccess: invalidateVenues,\n });\n\n const update = ({ data, id, onSuccess }: RequestData) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.VENUES}/${id}`,\n data,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, update };\n};\n","import { TypeOf } from 'zod';\n\nimport { venueFormSchema } from './form';\n\nexport enum VenueFormFieldsNames {\n id = 'id',\n name = 'name',\n city = 'city',\n countryCode = 'country_code',\n}\n\nexport interface VenueForm {\n [VenueFormFieldsNames.id]?: string;\n [VenueFormFieldsNames.name]: string;\n [VenueFormFieldsNames.city]: string;\n [VenueFormFieldsNames.countryCode]: string;\n}\n\nexport type VenueFormSchema = TypeOf<typeof venueFormSchema>;\n","import { FormControl, FormHelperText, Select, TextField } from '@mui/material';\nimport { Control, Controller, Path, UseFormRegister, FieldErrors } from 'react-hook-form';\n\nimport { FormFormLabel } from 'shared/components/form/form-form-label';\nimport { getTypeOptions } from 'shared/components/form/get-type-options';\n\nimport { VenueFormFieldsNames } from './types';\nimport { Countries } from '../../../../utils/countries';\n\ninterface Props<TFormValues extends Record<string, any>> {\n register: UseFormRegister<TFormValues>;\n errors: FieldErrors<TFormValues>;\n control: Control<TFormValues>;\n}\n\nexport function VenuesForm<TFormValues extends Record<string, any>>({ register, errors, control }: Props<TFormValues>) {\n return (\n <>\n <FormControl fullWidth margin='normal'>\n <FormFormLabel>Name</FormFormLabel>\n <TextField\n size='small'\n {...register(VenueFormFieldsNames.name as Path<TFormValues>)}\n error={!!errors[VenueFormFieldsNames.name]}\n helperText={errors[VenueFormFieldsNames.name] && <>{errors[VenueFormFieldsNames.name].message}</>}\n />\n </FormControl>\n <FormControl fullWidth margin='normal'>\n <FormFormLabel>City</FormFormLabel>\n <TextField\n size='small'\n {...register(VenueFormFieldsNames.city as Path<TFormValues>)}\n error={!!errors[VenueFormFieldsNames.city]}\n helperText={errors[VenueFormFieldsNames.city] && <>{errors[VenueFormFieldsNames.city].message}</>}\n />\n </FormControl>\n <Controller\n control={control}\n name={VenueFormFieldsNames.countryCode as Path<TFormValues>}\n render={({ field: { onChange, value, name }, fieldState: { error } }) => (\n <FormControl error={!!error} fullWidth>\n <FormFormLabel>Country</FormFormLabel>\n <Select size={'small'} labelId={`${name}-label`} id={name} value={value || ''} onChange={onChange}>\n {getTypeOptions({\n options: Countries.map((country) => ({\n value: country.code,\n label: country.name,\n })),\n })}\n </Select>\n {error && <FormHelperText error>{error.message}</FormHelperText>}\n </FormControl>\n )}\n />\n </>\n );\n}\n","import { z } from 'zod';\n\nimport { VenueFormFieldsNames } from './types';\n\nexport const venueFormSchema = z.object({\n [VenueFormFieldsNames.id]: z.string().optional(),\n [VenueFormFieldsNames.name]: z.string().trim().min(2),\n [VenueFormFieldsNames.city]: z.string().trim().min(2),\n [VenueFormFieldsNames.countryCode]: z.string().min(2),\n});\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { DialogNew } from 'shared/components/dialog-new';\nimport { IconUser } from 'shared/components/icons/icon-user';\n\nimport { useCreateVenue } from '../../../../api/venues/use-create-venue';\nimport { useUpdateVenue } from '../../../../api/venues/use-update-venue';\nimport { VenuesForm } from '../venue-form';\nimport { venueFormSchema } from '../venue-form/form';\nimport { VenueForm, VenueFormSchema } from '../venue-form/types';\n\ninterface Props {\n open: boolean;\n onClose: () => void;\n defaultValues?: VenueForm;\n}\n\nconst venuesFormId = 'venues-form';\n\nexport const VenueModal = ({ open, onClose, defaultValues }: Props) => {\n const formRef = useRef<HTMLFormElement>(null);\n const {\n register,\n formState: { errors },\n handleSubmit,\n reset,\n control,\n } = useForm<VenueFormSchema>({\n resolver: zodResolver(venueFormSchema),\n defaultValues,\n });\n\n const { create } = useCreateVenue();\n const { update } = useUpdateVenue();\n\n const handleCreate = useCallback(\n (data: VenueForm) => {\n create({\n data,\n onSuccess: () => {\n onClose();\n reset();\n },\n });\n },\n [create, onClose, reset],\n );\n const handleUpdate = useCallback(\n (data: VenueForm) => {\n if (!data?.id) return;\n const { id, ...rest } = data;\n update({\n data: rest,\n id,\n onSuccess: onClose,\n });\n },\n [onClose, update],\n );\n\n const handleCreateOrUpdate = useCallback(\n (data: VenueForm) => {\n if (defaultValues) {\n handleUpdate(data);\n } else {\n handleCreate(data);\n }\n },\n [defaultValues, handleCreate, handleUpdate],\n );\n\n return (\n <DialogNew\n maxWidth='sm'\n fullWidth\n title={defaultValues ? 'Edit venue' : 'New venue'}\n icon={<IconUser size='small' />}\n onCancel={onClose}\n onClose={onClose}\n buttonSubmitText={defaultValues ? 'Save' : 'Create'}\n open={open}\n buttonFormId={venuesFormId}\n >\n <form id={venuesFormId} ref={formRef} onSubmit={handleSubmit(handleCreateOrUpdate)}>\n <VenuesForm<VenueFormSchema> register={register} errors={errors} control={control} />\n </form>\n </DialogNew>\n );\n};\n","import { ListItem, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const VenuesListItem = styled(ListItem)(({ theme }) => ({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '1fr 1fr 1fr auto',\n borderBottom: `1px solid ${Colors.iron}`,\n padding: `${theme.spacing(1, 2, 1, 3)} !important`,\n}));\n","import { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { HTTPMethod } from 'api/types';\n\nimport { annotationApiUrls } from '../../routes';\nimport { useAllowedBackofficeOrigin } from '../../use-allowed-backoffice-origin';\nimport { metadataApiErrorParser, MetadataApiErrorResponse } from '../../utils';\nimport { useInvalidateVenues } from '../use-venues';\n\ninterface DeleteVenueApiParams {\n id: string;\n onSuccess?: () => void;\n}\n\nexport const useDeleteVenue = () => {\n const { getIsAllowedBackofficeOrigin } = useAllowedBackofficeOrigin();\n const invalidateVenues = useInvalidateVenues();\n const mutationRequest = useMutationRequest<unknown, unknown, MetadataApiErrorResponse>({\n type: HTTPMethod.DELETE,\n successMessage: 'Venue deleted',\n errorMessage: (data) => metadataApiErrorParser(data, 'Venue delete error'),\n onSuccess: invalidateVenues,\n });\n\n const deleteVenue = ({ id, onSuccess }: DeleteVenueApiParams) => {\n if (!getIsAllowedBackofficeOrigin()) return;\n\n mutationRequest.mutate(\n {\n url: `${annotationApiUrls.VENUES}/${id}`,\n },\n {\n onSuccess,\n },\n );\n };\n\n return { ...mutationRequest, deleteVenue };\n};\n","import { Typography } from '@mui/material';\nimport { fontWeight } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\n\nimport ConfirmDialog from 'shared/components/confirm-dialog';\nimport IconDelete from 'shared/components/icons/icon-delete';\nimport IconEdit from 'shared/components/icons/icon-edit';\nimport KebabMenu, { MenuListOption } from 'shared/components/kebab-menu';\n\nimport { VenuesListItem } from './styled';\nimport { useDeleteVenue } from '../../../../api/venues/use-delete-venue';\nimport { Venue } from '../../../../api/venues/use-venues/types';\nimport { Countries } from '../../../../utils/countries';\nimport { VenueFormFieldsNames } from '../venue-form/types';\nimport { VenueModal } from '../venue-modal';\n\ninterface Props {\n venue: Venue;\n}\n\nexport const VenueItem = ({ venue }: Props) => {\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [isConfirmDeleteDialogOpen, setIsConfirmDeleteDialogOpen] = useState(false);\n const { deleteVenue } = useDeleteVenue();\n\n const handleEditModalOpen = () => setIsEditModalOpen(true);\n const handleEditModalClose = () => setIsEditModalOpen(false);\n\n const handleDeleteVenue = useCallback(() => {\n deleteVenue({ id: venue.id });\n }, [venue.id, deleteVenue]);\n\n const options: MenuListOption[] = [\n {\n displayText: 'Edit',\n icon: <IconEdit size='small' color='secondary' />,\n onClick: handleEditModalOpen,\n },\n {\n displayText: 'Delete',\n icon: <IconDelete size='small' color='secondary' />,\n onClick: () => setIsConfirmDeleteDialogOpen(true),\n },\n ];\n\n const defaultValues = {\n [VenueFormFieldsNames.id]: venue.id,\n [VenueFormFieldsNames.name]: venue.name,\n [VenueFormFieldsNames.city]: venue.city ? venue.city : '',\n [VenueFormFieldsNames.countryCode]: Countries.map((country) => country.code).some(\n (countryCode) => countryCode === venue.countryCode,\n )\n ? venue.countryCode\n : '',\n };\n\n return (\n <>\n <VenuesListItem key={venue.id}>\n <Typography fontWeight={fontWeight['500']}>{venue.name}</Typography>\n <Typography>{venue.city}</Typography>\n <Typography>\n {Countries.find((item) => item.code.toUpperCase() === venue.countryCode?.toUpperCase())?.name || ''}\n </Typography>\n <KebabMenu options={options} />\n </VenuesListItem>\n\n {isEditModalOpen ? (\n <VenueModal open={isEditModalOpen} onClose={handleEditModalClose} defaultValues={defaultValues} />\n ) : null}\n\n <ConfirmDialog\n type={'warning'}\n title={`You sure you want delete \"${venue.name}\" venue?`}\n cancelLabel={'Cancel'}\n confirmLabel={'Delete'}\n onConfirm={handleDeleteVenue}\n isOpen={isConfirmDeleteDialogOpen}\n setIsOpen={setIsConfirmDeleteDialogOpen}\n />\n </>\n );\n};\n","import { List } from '@mui/material';\n\nimport { Venue } from '../../../../api/venues/use-venues/types';\nimport { VenueItem } from '../venue-item';\n\ninterface Props {\n venues: Venue[];\n}\n\nexport const VenuesList = ({ venues }: Props) => {\n const venuesItems = venues.map((venue) => {\n return <VenueItem key={venue.id} venue={venue} />;\n });\n\n return <List>{venuesItems}</List>;\n};\n","import { Box, styled } from '@mui/material';\n\nexport const VenueListHeaderGrid = styled(Box)({\n display: 'grid',\n flexDirection: 'row',\n gridTemplateColumns: '1fr 1fr 1fr 32px',\n alignItems: 'center',\n});\n","import { Box, Button, Stack, TextField, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport debounce from 'lodash/debounce';\nimport { ChangeEvent, useCallback, useState } from 'react';\n\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport { ListHeader } from 'shared/components/list/list-header';\nimport NotFound from 'shared/components/not-found';\nimport Pagination from 'shared/components/pagination';\n\nimport { VenueModal } from './components/venue-modal';\nimport { VenuesList } from './components/venues-list';\nimport { VenueListHeaderGrid } from './styled';\nimport { useVenues } from '../../api/venues/use-venues';\nimport { BackofficeContentContainer } from '../../components/backoffice-content-container';\nimport { ListSkeleton } from '../../components/list-skeleton';\n\nconst DEBOUNCE_TIME = 300;\n\nexport const Venues = () => {\n const [isCreateModalOpen, setIsCreateModalOpen] = useState(false);\n const { items, page, fetchNextPage, isFetching, setFilters } = useVenues();\n\n const handleCreateModalOpen = useCallback(() => setIsCreateModalOpen(true), []);\n const handleCreateModalClose = useCallback(() => setIsCreateModalOpen(false), []);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handleSearchChange = useCallback(\n debounce((event: ChangeEvent<HTMLInputElement>) => {\n setFilters({ name: event.target.value });\n }, DEBOUNCE_TIME),\n [setFilters],\n );\n\n return (\n <BackofficeContentContainer>\n <Stack direction='row' alignItems='center' justifyContent='space-between' marginBottom={2}>\n <Typography variant='h4'>Venues</Typography>\n <Button\n variant='contained'\n size='large'\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n onClick={handleCreateModalOpen}\n >\n New venue\n </Button>\n </Stack>\n\n <Stack marginBottom={2} justifyContent='flex-end' direction='row'>\n <TextField size='small' placeholder='Search venues' onChange={handleSearchChange} />\n </Stack>\n\n <ListHeader>\n <VenueListHeaderGrid>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Name\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n City\n </Typography>\n <Typography variant='body1' fontSize={fontSizes.default} fontWeight={'fontWeightMedium'}>\n Country\n </Typography>\n <div>&nbsp;</div>\n </VenueListHeaderGrid>\n </ListHeader>\n {!isFetching && items.length === 0 ? (\n <Box marginTop={4}>\n <NotFound header={'No results'} />\n </Box>\n ) : null}\n {isFetching ? <ListSkeleton /> : <VenuesList venues={items} />}\n {page ? (\n <Pagination\n total={page.totalElements}\n displayed={items.length}\n onShowMore={fetchNextPage}\n getStatsText={(displayed, total) => `${displayed} of ${total} venues`}\n />\n ) : null}\n <VenueModal open={isCreateModalOpen} onClose={handleCreateModalClose} />\n </BackofficeContentContainer>\n );\n};\n","import { Box, styled } from '@mui/material';\nimport { useEffect } from 'react';\nimport { Switch } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport { ProtectedRoute } from 'shared/components/protected-route';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\n\nimport { BackofficeProtectedRoute } from './components/backoffice-protected-route';\nimport { BackofficeSidebarLayout } from './components/backoffice-sidebar-layout';\nimport { AddUserToEnvironmentContainer } from './pages/add-user-to-environment/AddUserToEnvironmentContainer';\nimport { Annotation } from './pages/annotation/Annotation';\nimport { SeasonClients } from './pages/associate-season-with-clients';\nimport { Coaches } from './pages/coaches';\nimport { Competitions } from './pages/competitions';\nimport { CreateEnvironmentPage } from './pages/create-environment/CreateEnvironment.page';\nimport { CreateEnvironmentBranding } from './pages/create-environment-branding/CreateEnvironmentBranding.page';\nimport { CreateUserContainer } from './pages/create-user/CreateUserContainer';\nimport { EditEnvironment } from './pages/edit-environment/EditEnvironment.page';\nimport { EditEnvironmentBranding } from './pages/edit-environment-branding/EditEnvironmentBranding.page';\nimport { EnvironmentDetail } from './pages/environment-detail/EnvironmentDetail.page';\nimport { Environments } from './pages/environments/Environments.page';\nimport { Games } from './pages/games';\nimport { EditGame } from './pages/games/edit-game';\nimport { GameSummary } from './pages/games/game-form/steps/game-summary';\nimport { NewGame } from './pages/games/new-game';\nimport { Players } from './pages/players';\nimport { ProcessGamePage } from './pages/process-game/ProcessGame.page';\nimport { SeasonCompetitions } from './pages/season-competitions';\nimport { Stages } from './pages/stages';\nimport { Teams } from './pages/teams';\nimport { Venues } from './pages/venues';\n\nconst BackofficeContent = styled(Box)(() => ({\n flex: 1,\n}));\n\nexport const BackofficeContainer = () => {\n const branding = useBranding();\n\n useEffect(() => {\n document.title = `Backoffice | ${branding.displayName}`;\n }, [branding.displayName]);\n\n return (\n <SidebarLayout>\n <BackofficeSidebarLayout>\n <BackofficeContent>\n <Switch>\n <ProtectedRoute\n component={CreateUserContainer}\n onlyAdminAccess\n exact\n path={routes.BACKOFFICE_CREATE_USER}\n />\n <ProtectedRoute\n component={AddUserToEnvironmentContainer}\n onlyAdminAccess\n exact\n path={routes.BACKOFFICE_ADD_USER_TO_ENVIRONMENT}\n />\n <ProtectedRoute component={Environments} onlyAdminAccess exact path={routes.BACKOFFICE_ENVIRONMENTS} />\n <ProtectedRoute\n component={EnvironmentDetail}\n onlyAdminAccess\n exact\n path={routes.BACKOFFICE_ENVIRONMENT_DETAIL}\n />\n <ProtectedRoute\n component={CreateEnvironmentPage}\n onlyAdminAccess\n exact\n path={routes.BACKOFFICE_CREATE_ENVIRONMENT}\n />\n <ProtectedRoute\n component={EditEnvironment}\n onlyAdminAccess\n exact\n path={routes.BACKOFFICE_EDIT_ENVIRONMENT}\n />\n <ProtectedRoute\n component={CreateEnvironmentBranding}\n onlyAdminAccess\n exact\n path={routes.BACKOFFICE_CREATE_ENVIRONMENT_BRANDING}\n />\n <ProtectedRoute\n component={EditEnvironmentBranding}\n onlyAdminAccess\n exact\n path={routes.BACKOFFICE_EDIT_ENVIRONMENT_BRANDING}\n />\n <ProtectedRoute\n component={SeasonClients}\n onlyAdminAccess\n exact\n path={routes.BACKOFFICE_ASSOCIATE_COMPETITION_WITH_CLIENTS}\n />\n <BackofficeProtectedRoute component={Competitions} path={routes.BACKOFFICE_COMPETITIONS} />\n <BackofficeProtectedRoute component={Coaches} path={routes.BACKOFFICE_COACHES} />\n <BackofficeProtectedRoute component={EditGame} path={routes.BACKOFFICE_EDIT_GAME_FORM} />\n <BackofficeProtectedRoute component={NewGame} path={routes.BACKOFFICE_GAME_FORM} />\n <BackofficeProtectedRoute component={GameSummary} path={routes.BACKOFFICE_GAME_SUMMARY} />\n <BackofficeProtectedRoute component={SeasonCompetitions} path={routes.BACKOFFICE_SEASON_COMPETITIONS} />\n <BackofficeProtectedRoute component={Venues} path={routes.BACKOFFICE_VENUES} />\n <BackofficeProtectedRoute component={Stages} path={routes.BACKOFFICE_STAGES} />\n <BackofficeProtectedRoute component={Players} path={routes.BACKOFFICE_PLAYERS} />\n <BackofficeProtectedRoute component={Teams} path={routes.BACKOFFICE_TEAMS} />\n <BackofficeProtectedRoute component={ProcessGamePage} path={routes.PROCESS_GAME} />\n <BackofficeProtectedRoute component={Annotation} path={routes.BACKOFFICE_ANNOTATION} />\n <BackofficeProtectedRoute component={Games} path={[routes.BACKOFFICE_GAMES, routes.BACKOFFICE]} />\n </Switch>\n </BackofficeContent>\n </BackofficeSidebarLayout>\n </SidebarLayout>\n );\n};\n","import { useCallback } from 'react';\n\nimport { useMutationRequest } from 'api/hooks/useMutationRequest';\nimport { transformPlaylist } from 'api/playlist/transformers';\nimport { PlaylistApiResponse } from 'api/playlist/types';\nimport { playlistPreview } from 'api/routes';\nimport { BackendApiError, backendApiErrorParser } from 'api/utils/backend-api-error-parser';\nimport { Playlist } from 'shared/types';\n\nimport { DashboardPlaylistGenericPayload } from '../types/embeddedDashboard.types';\n\nexport const useGenerateTemporaryPlaylist = ({ onSuccess }: { onSuccess: (response: Playlist) => void }) => {\n const mutationRequest = useMutationRequest<PlaylistApiResponse, Playlist, BackendApiError>({\n transformer: transformPlaylist,\n onSuccess,\n errorMessage: (response) => backendApiErrorParser(response, 'Error generating playlist'),\n });\n\n return useCallback(\n (payload: DashboardPlaylistGenericPayload) => {\n return mutationRequest.mutate({\n url: playlistPreview,\n data: {\n name: payload.name,\n items: payload.items.map((item) => ({\n startFrame: item.start_frame,\n endFrame: item.end_frame,\n recordingId: item.recording_id,\n name: item.name,\n })),\n },\n });\n },\n [mutationRequest],\n );\n};\n","import { VITE_SUPERSET_URL, VITE_SUPERSET_PLAYER_PROFILE_DASHBOARD_ID } from './shared/utils/env-variables';\n\nconst SENTRY_DSN_URL: string = window.SENTRY_DSN_URL || '';\nconst GRAFANA_FARO_COLECTOR_URL: string = window.GRAFANA_FARO_COLECTOR_URL || '';\nconst SUPERSET_URL: string = window.SUPERSET_URL || (VITE_SUPERSET_URL ?? 'http://localhost:8088');\nconst SUPERSET_PLAYER_PROFILE_DASHBOARD_ID: string =\n window.SUPERSET_PLAYER_PROFILE_DASHBOARD_ID || (VITE_SUPERSET_PLAYER_PROFILE_DASHBOARD_ID ?? '');\n\nexport { SENTRY_DSN_URL, GRAFANA_FARO_COLECTOR_URL, SUPERSET_URL, SUPERSET_PLAYER_PROFILE_DASHBOARD_ID };\n","import { embedDashboard, UiConfigType } from '@superset-ui/embedded-sdk';\nimport { useQuery } from '@tanstack/react-query';\nimport { RefObject } from 'react';\n\nimport { dashboardGuestToken } from 'api/routes';\nimport { SUPERSET_URL } from 'config';\n\nasync function fetchGuestToken(dashboardId: string) {\n const response = await fetch(dashboardGuestToken(dashboardId), {\n method: 'GET',\n });\n const data = await response.json();\n return data.token;\n}\n\nconst embedSupersetDashboard = async (\n dashboardId: string,\n container: HTMLElement,\n dashboardUrlParams?: UiConfigType['urlParams'],\n) => {\n return embedDashboard({\n id: dashboardId,\n supersetDomain: SUPERSET_URL,\n mountPoint: container,\n fetchGuestToken: async () => fetchGuestToken(dashboardId),\n dashboardUiConfig: {\n hideTitle: true,\n hideTab: true,\n filters: {\n expanded: true,\n },\n urlParams: dashboardUrlParams,\n },\n });\n};\n\nconst fetchDashboard = async (\n dashboardId: string,\n containerRef: RefObject<HTMLDivElement>,\n dashboardUrlParams?: UiConfigType['urlParams'],\n) => {\n try {\n return await embedSupersetDashboard(dashboardId, containerRef.current!, dashboardUrlParams);\n } catch (error) {\n throw new Error('Error loading dashboard');\n }\n};\n\nexport const useEmbeddedDashboard = (\n dashboardId: string,\n containerRef: RefObject<HTMLDivElement>,\n dashboardUrlParams?: UiConfigType['urlParams'],\n) => {\n return useQuery(['dashboard', dashboardId], () => fetchDashboard(dashboardId, containerRef, dashboardUrlParams), {\n retry: false,\n });\n};\n","import { Alert, Box, Stack } from '@mui/material';\nimport { useRef } from 'react';\n\nimport { useQueryParams } from 'shared/hooks/use-query-params';\n\nimport { useEmbeddedDashboard } from './hooks/useEmbeddedDashboard';\n\ntype Props = {\n dashboardId: string;\n};\n\nexport const EmbeddedDashboardFeature = ({ dashboardId }: Props) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const params = useQueryParams();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { dashboardId: dontPassThisParam, ...paramsObject } = Object.fromEntries(params.entries());\n\n const { isError, isSuccess } = useEmbeddedDashboard(dashboardId, containerRef, paramsObject);\n\n if (isError) {\n return (\n <Box\n sx={{\n height: '100%',\n padding: 2,\n }}\n >\n <Alert severity={'error'}>Error loading dashboard</Alert>\n </Box>\n );\n }\n\n return (\n <Stack\n sx={{\n visibility: isSuccess ? 'visible' : 'hidden',\n height: '100%',\n }}\n >\n <Box\n ref={containerRef}\n sx={{\n flex: 1,\n overflow: 'hidden',\n iframe: { border: 0, width: '100%', height: '100%' },\n }}\n />\n </Stack>\n );\n};\n","import { z } from 'zod';\n\nconst DashboardPlaylistItemSchema = z.object({\n start_frame: z.number(),\n end_frame: z.number(),\n recording_id: z.string(),\n name: z.string(),\n});\n\nexport const DashboardPlaylistGenericPayloadSchema = z.object({\n name: z.string(),\n items: z.array(DashboardPlaylistItemSchema),\n});\n\nexport type DashboardPlaylistGenericPayload = z.infer<typeof DashboardPlaylistGenericPayloadSchema>;\n","import { useEffect } from 'react';\n\nimport {\n DashboardPlaylistGenericPayload,\n DashboardPlaylistGenericPayloadSchema,\n} from '../types/embeddedDashboard.types';\n\nenum DASHBOARD_EVENTS {\n SENTRY_ERROR = 'dashboard-sentry-error',\n PLAYLIST_ITEM_CLICKED = 'dashboard-playlist-item-clicked',\n}\n\ntype Options = {\n onEvent: (payload: DashboardPlaylistGenericPayload) => void;\n};\n\nexport const useDashboardEvents = ({ onEvent }: Options) => {\n useEffect(() => {\n const messageHandler = (event: MessageEvent) => {\n switch (event.data.event) {\n case DASHBOARD_EVENTS.SENTRY_ERROR:\n throw new Error(`Dashboard: ${JSON.stringify(event.data.payload)}`);\n case DASHBOARD_EVENTS.PLAYLIST_ITEM_CLICKED: {\n const result = DashboardPlaylistGenericPayloadSchema.safeParse(event.data.payload);\n if (result.success) {\n onEvent(result.data);\n }\n break;\n }\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n return () => {\n window.removeEventListener('message', messageHandler);\n };\n }, [onEvent]);\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { LoadingButton } from '@mui/lab';\nimport { Stack } from '@mui/material';\nimport { useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\n\nimport { useCreatePlaylist } from 'api/playlist/useCreatePlaylist';\nimport { Dialog } from 'shared/components/dialog';\nimport { DialogActions } from 'shared/components/dialog-new/dialog-actions';\nimport { DialogContent } from 'shared/components/dialog-new/dialog-content';\nimport { DialogHeader } from 'shared/components/dialog-new/dialog-header';\nimport { FormInputField } from 'shared/components/form/form-input-field';\nimport { IconSave } from 'shared/components/icons/icon-save';\nimport { VerticalIconButton } from 'shared/components/vertical-icon-button';\nimport { Playlist } from 'shared/types';\n\nconst INPUT_WIDTH = 450;\n\nenum saveTemporaryPlaylistName {\n NAME = 'name',\n}\n\nexport const saveTemporaryPlaylistSchema = z.object({\n [saveTemporaryPlaylistName.NAME]: z.string().min(3, 'playlist-detail:save-playlist.name-min-length-error'),\n});\n\ntype SaveTemporaryPlaylistSchema = z.infer<typeof saveTemporaryPlaylistSchema>;\n\ntype Props = {\n playlist: Playlist;\n};\n\nexport const SaveTemporaryPlaylistFeature = ({ playlist }: Props) => {\n const { t } = useTranslation();\n const [showModal, setShowModal] = useState(false);\n const { createPlaylist, isLoading } = useCreatePlaylist();\n\n const {\n register,\n formState: { errors },\n handleSubmit: handleFormSubmit,\n } = useForm<SaveTemporaryPlaylistSchema>({\n resolver: zodResolver(saveTemporaryPlaylistSchema),\n });\n\n const handleOnFormSubmit = (data: SaveTemporaryPlaylistSchema) => {\n createPlaylist({\n data: {\n name: data.name,\n items: playlist.playlistItems.map((item) => ({\n startTime: item.startTime ? item.startTime : 0,\n endTime: item.endTime ? item.endTime : 0,\n name: item.name ?? '',\n recordingId: item.recordingId,\n })),\n },\n onSuccess: () => {\n setShowModal(false);\n },\n });\n };\n\n return (\n <>\n <VerticalIconButton Icon={IconSave} onClick={() => setShowModal(true)}>\n {t('common:actions.save')}\n </VerticalIconButton>\n\n <Dialog open={showModal} onClose={() => setShowModal(false)}>\n <form onSubmit={handleFormSubmit(handleOnFormSubmit)}>\n <DialogHeader icon={<IconSave size='small' />}>Save as playlist</DialogHeader>\n <DialogContent>\n <Stack gap={2}>\n <FormInputField\n style={{ width: `${INPUT_WIDTH}px` }}\n label={t('playlists:forms.playlist-name')}\n id={saveTemporaryPlaylistName.NAME}\n defaultChecked\n {...register(saveTemporaryPlaylistName.NAME)}\n helperText={\n errors[saveTemporaryPlaylistName.NAME] && (\n <>{t(errors[saveTemporaryPlaylistName.NAME]?.message ?? '')}</>\n )\n }\n fullWidth\n size='small'\n />\n </Stack>\n </DialogContent>\n <DialogActions>\n <LoadingButton loading={isLoading} type={'submit'} variant='contained' color='primary'>\n Save playlist\n </LoadingButton>\n </DialogActions>\n </form>\n </Dialog>\n </>\n );\n};\n","import React, { PropsWithChildren } from 'react';\n\nimport { PLAYLIST_ITEM_FULL_WIDTH, PLAYLIST_ITEM_GAP } from '../config/Playlist.config';\n\ntype Props = PropsWithChildren<{\n index: number;\n}>;\n\nexport const PlaylistItemPositionWrapper = ({ children, index }: Props) => {\n return (\n <div\n style={{\n position: 'absolute',\n paddingLeft: PLAYLIST_ITEM_GAP,\n paddingRight: PLAYLIST_ITEM_GAP,\n left: index * PLAYLIST_ITEM_FULL_WIDTH,\n width: PLAYLIST_ITEM_FULL_WIDTH,\n }}\n >\n {children}\n </div>\n );\n};\n","import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { useHandleSetPlaylistItem } from 'entities/playlist/hooks/useHandleSetPlaylistItem';\nimport { IconCopyTo } from 'shared/components/icons/icon-copy-to';\nimport { IconOverlays } from 'shared/components/icons/icon-overlays';\nimport { MenuListOption } from 'shared/components/kebab-menu';\nimport { useVideoPlayerActions } from 'shared/components/video-player';\nimport { useVideoPlayerId } from 'shared/components/video-player/hooks';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\nimport { useSetIsOverlayPanelOpen } from 'shared/components/video-player/video-player-component/hooks/overlay-panel';\nimport { useFeatureFlag } from 'shared/contexts/app-state';\n\nexport const useTemporaryPlaylistItemOptions = (\n playlistItem: PlaylistItemType,\n setCopyToAnchor: (value: HTMLElement | null) => void,\n): ((hasHomographies: boolean) => MenuListOption[]) => {\n const { t } = useTranslation();\n const playerId = useVideoPlayerId();\n const handleSetPlaylistItem = useHandleSetPlaylistItem(playlistItem);\n const actions = useVideoPlayerActions();\n const setIsOverlayPanelOpenState = useSetIsOverlayPanelOpen(playerId);\n const customOverlaysFeatureFlag = useFeatureFlag(FEATURE_FLAG.CUSTOM_OVERLAYS);\n\n const handleOpenCopyToDialog = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n setCopyToAnchor(event.currentTarget);\n },\n [setCopyToAnchor],\n );\n\n return useCallback(\n (hasHomographies: boolean) => {\n const overlayOption = {\n displayText: t('video-player:overlays.edit-overlays'),\n icon: <IconOverlays size={'small'} />,\n onClick: () => {\n handleSetPlaylistItem(false);\n setIsOverlayPanelOpenState(true);\n },\n };\n const options = [\n {\n displayText: t('playlist-detail:send-to-playlist'),\n icon: <IconCopyTo size={'small'} />,\n onClick: (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n handleOpenCopyToDialog(event);\n actions.handleStandBy();\n },\n avoidCloseOnClick: true,\n },\n ];\n return hasHomographies && customOverlaysFeatureFlag ? [overlayOption, ...options] : options;\n },\n [t, customOverlaysFeatureFlag, actions, handleOpenCopyToDialog, handleSetPlaylistItem, setIsOverlayPanelOpenState],\n );\n};\n","import React, { memo, useCallback, useRef, useState } from 'react';\n\nimport { useHandlePlaylistItemClick } from 'entities/playlist/hooks/useHandlePlaylistItemClick';\nimport { useHandleSetPlaylistItem } from 'entities/playlist/hooks/useHandleSetPlaylistItem';\nimport { PlaylistItemWrapper } from 'entities/playlist/ui/PlaylistItemWrapper';\nimport { generateCopyToPlaylistItem } from 'entities/playlist/util/generateCopyToPlaylistItem';\nimport { CopyToDialog } from 'features/playlist/CopyToDialog';\nimport { DownloadPlaylistItemsModal } from 'features/playlist/download-playlist-items-modal/DownloadPlaylistItemsModal';\nimport { PlaylistItemContent } from 'features/playlist/playlist-item-content/PlaylistItemContent';\nimport { useIsCurrentPlaylistItem, useVideoPlayerActions } from 'shared/components/video-player';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\nimport { Playlist } from 'shared/types/index';\n\nimport { useTemporaryPlaylistItemOptions } from './hooks/useTemporaryPlaylistItemOptions';\n\ninterface Props {\n isDisabled?: boolean;\n isEditing?: boolean;\n playlist: Playlist;\n playlistItem: PlaylistItemType;\n videoIndex: number;\n isChecked?: boolean;\n}\n\nexport const TemporaryPlaylistItem = memo(\n ({ isDisabled = false, isEditing = false, playlist, playlistItem, videoIndex, isChecked = false }: Props) => {\n const actions = useVideoPlayerActions();\n const kebabRef = useRef<HTMLDivElement | null>(null);\n const handleSetPlaylistItem = useHandleSetPlaylistItem(playlistItem);\n const handleItemClick = useHandlePlaylistItemClick(playlistItem, playlist.id);\n const [isDownloadModalOpen, setIsDownloadModalOpen] = useState(false);\n const isCurrentPlaylistItem = useIsCurrentPlaylistItem(playlistItem.id);\n const [copyToAnchor, setCopyToAnchor] = useState<HTMLElement | null>(null);\n const getMenuOptions = useTemporaryPlaylistItemOptions(playlistItem, setCopyToAnchor);\n\n const handleCloseDownloadModal = useCallback(() => {\n setIsDownloadModalOpen(false);\n actions.resumeStandBy();\n }, [actions]);\n\n const handleCloseCopyToDialog = useCallback(() => {\n actions.resumeStandBy();\n setCopyToAnchor(null);\n }, [actions]);\n\n const showProgressBar = isCurrentPlaylistItem && !isDisabled;\n\n return (\n <>\n <PlaylistItemWrapper\n isDraggable={false}\n isCurrent={isCurrentPlaylistItem}\n isEditing={isEditing}\n isDisabled={isDisabled}\n onClick={handleItemClick}\n direction='row'\n justifyContent='space-between'\n title={`${playlistItem.name} | ${playlistItem.recordingName} (${playlistItem.recordingMatchday})`}\n >\n <PlaylistItemContent\n isChecked={isChecked}\n isEditingMode={isEditing}\n getMenuOptions={getMenuOptions}\n onClick={handleSetPlaylistItem}\n playlistId={playlist.id}\n playlistItem={playlistItem}\n showProgressBar={showProgressBar}\n videoIndex={videoIndex}\n kebabRef={kebabRef}\n />\n </PlaylistItemWrapper>\n\n {isDownloadModalOpen ? (\n <DownloadPlaylistItemsModal\n playlistId={playlist.id}\n isPlaylistDownload={false}\n itemsToDownload={[playlistItem.id]}\n onClose={handleCloseDownloadModal}\n />\n ) : null}\n\n <CopyToDialog\n playlistItems={[generateCopyToPlaylistItem(playlistItem)]}\n onClose={handleCloseCopyToDialog}\n anchorEl={copyToAnchor}\n />\n </>\n );\n },\n);\n\nTemporaryPlaylistItem.displayName = 'ReadOnlyPlaylistItemElement';\n","import { Stack } from '@mui/material';\nimport isEmpty from 'lodash/isEmpty';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { useBulkSelectedItems, useSetBulkSelectedItems } from 'entities/playlist/hooks/useBulkSelectedItems';\nimport { ItemsListBulk } from 'entities/playlist/ui/ItemsListBulk';\nimport { ItemsListContainer } from 'entities/playlist/ui/ItemsListContainer';\nimport { PlaylistItemPositionWrapper } from 'entities/playlist/ui/PlaylistItemPositionWrapper';\nimport { PlaylistItemsEmpty } from 'entities/playlist/ui/PlaylistItemsEmpty';\nimport { DownloadPlaylistItemsModal } from 'features/playlist/download-playlist-items-modal/DownloadPlaylistItemsModal';\nimport { PlaylistBulkButton } from 'features/playlist/PlaylistBulkButton';\nimport { PlaylistItemsList, RowProps } from 'features/playlist/PlaylistItemsList';\nimport { SelectedItemsCopyToDialog } from 'features/playlist/SelectedItemsCopyToDialog';\nimport { CheckboxWithCustomColor } from 'shared/components/CheckboxWithCustomColor/CheckboxWithCustomColor';\nimport IconClose from 'shared/components/icons/icon-close';\nimport { IconCopyTo } from 'shared/components/icons/icon-copy-to';\nimport { IconDownload } from 'shared/components/icons/icon-download';\nimport { usePlaylistItems } from 'shared/components/video-player';\nimport { PlaylistItemType } from 'shared/components/video-player/types';\nimport { useFeatureFlag } from 'shared/contexts/app-state';\nimport { Playlist } from 'shared/types/index';\n\nimport { TemporaryPlaylistItem } from './ui/temporary-playlist-item/TemporaryPlaylistItem';\nimport { useIsBulkModeActive, useSetIsBulkModeActive } from '../../../entities/playlist/hooks/useIsBulkModeActive';\n\ninterface Props {\n onPlaylistOrderChange?: (currentVideoIndex: number, newVideoIndex: number) => void;\n playlist: Playlist;\n}\n\nexport const TemporaryPlaylistItemsList = ({ playlist }: Props) => {\n const { t } = useTranslation();\n const enabledBulkMode = useIsBulkModeActive(playlist.id);\n const setEnabledBulkMode = useSetIsBulkModeActive(playlist.id);\n\n const [isDownloadModalOpen, setIsDownloadModalOpen] = useState(false);\n const selectedItems = useBulkSelectedItems(playlist.id);\n const setSelectedItems = useSetBulkSelectedItems(playlist.id);\n const [copyToModalOpen, setCopyToModalOpen] = useState(false);\n\n const playlistItems = usePlaylistItems();\n const downloadPlaylistFeatureFlag = useFeatureFlag(FEATURE_FLAG.DOWNLOAD_PLAYLIST);\n const downloadRef = useRef<HTMLDivElement | null>(null);\n const copyToRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (selectedItems.length > 0 && !enabledBulkMode) {\n setSelectedItems([]);\n }\n }, [enabledBulkMode, setSelectedItems, selectedItems.length]);\n\n const playlistItemsIds = playlistItems.map((item) => item.id);\n\n const allItemsSelected = selectedItems.length === playlistItems.length;\n const selectAllIndeterminate = selectedItems.length > 0 && !allItemsSelected;\n\n const handleSelectAll = useCallback(() => {\n if (selectAllIndeterminate || allItemsSelected) {\n return setSelectedItems([]);\n }\n\n return setSelectedItems(playlistItemsIds);\n }, [allItemsSelected, playlistItemsIds, selectAllIndeterminate, setSelectedItems]);\n\n const PlaylistItemElement = useCallback(\n (currentPlaylistItem: PlaylistItemType, index: number) => (\n <PlaylistItemPositionWrapper index={index}>\n <TemporaryPlaylistItem\n isChecked={selectedItems.includes(currentPlaylistItem.id)}\n key={`playlist-video-${currentPlaylistItem.id}`}\n playlist={playlist}\n playlistItem={currentPlaylistItem}\n videoIndex={index}\n />\n </PlaylistItemPositionWrapper>\n ),\n [playlist, selectedItems],\n );\n\n const Row = useCallback(\n ({ data, index }: RowProps) => {\n const currentPlaylistItem = data[index];\n return <>{PlaylistItemElement(currentPlaylistItem, index)}</>;\n },\n [PlaylistItemElement],\n );\n\n const handleSetDisabledBulkMode = useCallback(() => {\n setEnabledBulkMode(false);\n }, [setEnabledBulkMode]);\n\n const handleSetDownloadModalOpen = useCallback(() => {\n setIsDownloadModalOpen(true);\n }, [setIsDownloadModalOpen]);\n\n const handleCloseCopyToModal = useCallback(() => {\n setCopyToModalOpen(true);\n }, [setCopyToModalOpen]);\n\n const handleOpenCopyToModal = useCallback(() => {\n setCopyToModalOpen(false);\n setEnabledBulkMode(false);\n setSelectedItems([]);\n }, [setCopyToModalOpen, setSelectedItems, setEnabledBulkMode]);\n\n const handleCloseDownloadModal = useCallback(() => {\n setIsDownloadModalOpen(false);\n }, [setIsDownloadModalOpen]);\n\n return (\n <>\n {enabledBulkMode ? (\n <div>\n <ItemsListBulk>\n <Stack direction='row' alignItems='center'>\n <PlaylistBulkButton onClick={handleSetDisabledBulkMode} IconComponent={IconClose} />\n <Stack direction='row' alignItems='center'>\n <CheckboxWithCustomColor\n customColor='white'\n onClick={handleSelectAll}\n checked={allItemsSelected}\n indeterminate={selectAllIndeterminate}\n />\n {t('playlist-detail:all-clips')} ({selectedItems.length}/{playlistItems.length})\n </Stack>\n </Stack>\n\n <Stack direction='row' spacing={1}>\n {downloadPlaylistFeatureFlag ? (\n <div ref={downloadRef}>\n <PlaylistBulkButton\n onClick={handleSetDownloadModalOpen}\n IconComponent={IconDownload}\n label={t('common:actions.download')}\n disabled={isEmpty(selectedItems)}\n />\n </div>\n ) : null}\n\n <div ref={copyToRef}>\n <PlaylistBulkButton\n onClick={handleCloseCopyToModal}\n IconComponent={IconCopyTo}\n label={t('playlist-detail:send-to-playlist')}\n disabled={isEmpty(selectedItems)}\n />\n </div>\n\n {isDownloadModalOpen ? (\n <DownloadPlaylistItemsModal\n isPlaylistDownload={false}\n itemsToDownload={selectedItems}\n onClose={handleCloseDownloadModal}\n playlistId={playlist.id}\n />\n ) : null}\n </Stack>\n </ItemsListBulk>\n\n {copyToModalOpen && (\n <SelectedItemsCopyToDialog\n selectedItems={selectedItems}\n playlist={playlist}\n onClose={handleOpenCopyToModal}\n anchor={copyToRef.current}\n />\n )}\n </div>\n ) : null}\n <ItemsListContainer>\n {isEmpty(playlistItems) ? (\n <PlaylistItemsEmpty />\n ) : (\n <PlaylistItemsList Row={Row} playlistItems={playlistItems} />\n )}\n </ItemsListContainer>\n </>\n );\n};\n","import { Stack, Tooltip, Typography } from '@mui/material';\nimport { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { PlaylistActions } from 'entities/playlist/ui/PlaylistActions';\nimport { PlaylistContainerGrid } from 'entities/playlist/ui/PlaylistContainerGrid';\nimport { PlaylistDetails } from 'entities/playlist/ui/PlaylistDetails';\nimport { PlaylistHeaderGrid } from 'entities/playlist/ui/PlaylistHeaderGrid';\nimport { PlaylistTimelineContainer } from 'entities/playlist/ui/PlaylistTimelineContainer';\nimport { PlaylistTimelineHeader } from 'entities/playlist/ui/PlaylistTimelineHeader';\nimport { PlaylistVideoPlayerContainer } from 'entities/playlist/ui/PlaylistVideoPlayerContainer';\nimport { DownloadPlaylistItemsModal } from 'features/playlist/download-playlist-items-modal/DownloadPlaylistItemsModal';\nimport { DownloadCurrentPlaylistItemModal } from 'features/playlist/DownloadCurrentPlaylistItemModal';\nimport { EnableBulkModeButton } from 'features/playlist/EnableBulkModeButton';\nimport { PlaylistOverlaysSelectorPanelFeature } from 'features/playlist/playlist-overlay-selector-panel/PlaylistOverlaySelectorPanel.feature';\nimport { SaveTemporaryPlaylistFeature } from 'features/playlist/save-temporary-playlist/SaveTemporaryPlaylist.feature';\nimport { TemporaryPlaylistItemsList } from 'features/playlist/temporary-playlist-items-list/TemporaryPlaylistItemsList';\nimport { IconEye } from 'shared/components/icons/icon-eye';\nimport { IconInfo } from 'shared/components/icons/icon-info';\nimport { PlaylistTitle } from 'shared/components/PlaylistTitle';\nimport { useCurrentPlaylistItem, useVideoPlayerActions } from 'shared/components/video-player';\nimport VideoPlayerComponent from 'shared/components/video-player/video-player-component';\nimport { useFeatureFlag } from 'shared/contexts/app-state';\nimport { Playlist } from 'shared/types';\n\ntype Props = {\n playlist: Playlist;\n};\n\nexport const TemporaryPlaylist = ({ playlist }: Props) => {\n const { t } = useTranslation();\n const actions = useVideoPlayerActions();\n const playlistItem = useCurrentPlaylistItem();\n const customOverlaysFeatureFlag = useFeatureFlag(FEATURE_FLAG.CUSTOM_OVERLAYS);\n\n const [isDownloadModalOpen, setIsDownloadModalOpen] = useState(false);\n const [isCurrentItemDownloadModalOpen, setIsCurrentItemDownloadModalOpen] = useState(false);\n\n const handleDownloadModalClose = useCallback(() => setIsDownloadModalOpen(false), []);\n\n const handleOpenDownloadCurrentItemModal = useCallback(() => {\n actions.handleStandBy();\n setIsCurrentItemDownloadModalOpen(true);\n }, [actions]);\n\n const handleCloseDownloadCurrentItemModal = useCallback(() => {\n actions.resumeStandBy();\n setIsCurrentItemDownloadModalOpen(false);\n }, [actions]);\n\n return (\n <PlaylistContainerGrid container>\n <PlaylistHeaderGrid xs={12} item>\n <Stack direction={'row'} alignItems={'center'} justifyContent={'space-between'} flex={1}>\n <Stack direction={'row'} alignItems={'center'} gap={1}>\n <IconEye size={'small'} />\n <PlaylistTitle title={playlist.name} />\n <Tooltip\n placement={'right'}\n title={\n <Stack gap={1}>\n {t('playlist-detail:read-only-playlist.read-only-info-title')}\n <Typography variant={'body2'}>\n {t('playlist-detail:read-only-playlist.read-only-info-description')}\n </Typography>\n </Stack>\n }\n >\n <span>\n <IconInfo size={'small'} />\n </span>\n </Tooltip>\n </Stack>\n <SaveTemporaryPlaylistFeature playlist={playlist} />\n </Stack>\n </PlaylistHeaderGrid>\n <PlaylistVideoPlayerContainer display='flex' item xs={12}>\n <VideoPlayerComponent onDownloadSource={handleOpenDownloadCurrentItemModal} showVideoPlayerBar />\n {customOverlaysFeatureFlag && playlistItem.hasHomographies ? (\n <PlaylistOverlaysSelectorPanelFeature key={playlistItem.id} playlistId={playlist.id} readOnly />\n ) : null}\n </PlaylistVideoPlayerContainer>\n <PlaylistTimelineContainer item xs={12}>\n <PlaylistTimelineHeader>\n <PlaylistDetails playlist={playlist} />\n <PlaylistActions>\n <EnableBulkModeButton playlistId={playlist.id} />\n </PlaylistActions>\n </PlaylistTimelineHeader>\n\n <TemporaryPlaylistItemsList playlist={playlist} />\n </PlaylistTimelineContainer>\n\n {isDownloadModalOpen ? (\n <DownloadPlaylistItemsModal onClose={handleDownloadModalClose} playlistId={playlist.id} />\n ) : null}\n <DownloadCurrentPlaylistItemModal\n playlistId={playlist.id}\n isOpen={isCurrentItemDownloadModalOpen}\n onClose={handleCloseDownloadCurrentItemModal}\n />\n </PlaylistContainerGrid>\n );\n};\n","import { useMemo } from 'react';\n\nimport { useMapVideos } from 'entities/playlist/hooks/use-map-videos/useMapVideos';\nimport { VideoPlayerStateProvider } from 'shared/components/video-player';\nimport { PLAYLIST_WITH_OVERLAYS_PLAYING_MODE } from 'shared/components/video-player/defaultPlayingModes';\nimport { Playlist } from 'shared/types';\n\nimport { TemporaryPlaylist } from './ui/TemporaryPlaylist';\n\ntype Props = {\n playlist: Playlist;\n};\n\nexport const TemporaryPlaylistWidget = ({ playlist }: Props) => {\n const mapVideos = useMapVideos();\n const playlistItems = useMemo(() => (playlist ? mapVideos(playlist) : []), [mapVideos, playlist]);\n\n return (\n <VideoPlayerStateProvider\n playerId={`playlist-${playlist.id}`}\n playlistItems={playlistItems}\n playingMode={PLAYLIST_WITH_OVERLAYS_PLAYING_MODE}\n >\n <TemporaryPlaylist playlist={playlist} />\n </VideoPlayerStateProvider>\n );\n};\n","import { Box, Button, Stack, TextField } from '@mui/material';\nimport { FormEvent, useState } from 'react';\n\nimport { useGenerateTemporaryPlaylist } from 'features/dashboard/embedded-dashboard/api/useGenerateTemporaryPlaylist';\nimport { EmbeddedDashboardFeature } from 'features/dashboard/embedded-dashboard/EmbeddedDashboard.feature';\nimport { useDashboardEvents } from 'features/dashboard/embedded-dashboard/hooks/useDashboardEvents';\nimport Container from 'shared/components/container';\nimport { Dialog } from 'shared/components/dialog';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { Playlist } from 'shared/types';\nimport { TemporaryPlaylistWidget } from 'widgets/playlist/temporary-playlist/TemporaryPlaylist.widget';\n\nimport { useQueryParams } from '../../shared/hooks/use-query-params';\n\nexport const DashboardPreviewPage = () => {\n const query = useQueryParams();\n const dashboardIdQueryParam = query.get('dashboardId');\n const [dashboardId, setDashboardId] = useState<string>(dashboardIdQueryParam || '');\n const [temporalPlaylist, setTemporalPlaylist] = useState<Playlist | null>(null);\n const generateTemporaryPlaylist = useGenerateTemporaryPlaylist({ onSuccess: setTemporalPlaylist });\n\n useDashboardEvents({ onEvent: generateTemporaryPlaylist });\n\n const handleFormSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setDashboardId(event.currentTarget.dashboardId.value);\n };\n\n return (\n <SidebarLayout>\n <Container fullScreen>\n <form onSubmit={handleFormSubmit} style={{ height: '100%' }}>\n {!dashboardIdQueryParam && (\n <Stack direction={'row'} alignItems={'center'} gap={2} padding={2} height={'100px'}>\n <TextField id={'dashboardId'} size={'small'} sx={{ width: '380px' }} />\n <Button color={'primary'} variant={'contained'} size={'large'} type={'submit'}>\n Select Dashboard\n </Button>\n </Stack>\n )}\n {dashboardId && <EmbeddedDashboardFeature key={dashboardId} dashboardId={dashboardId} />}\n <Dialog onClose={() => setTemporalPlaylist(null)} open={!!temporalPlaylist} fullWidth maxWidth={false}>\n <Box\n height={(theme) => `calc(100vh - ${theme.spacing(8)})`}\n width={(theme) => `calc(100vw - ${theme.spacing(8)})`}\n >\n {temporalPlaylist && <TemporaryPlaylistWidget playlist={temporalPlaylist} />}\n </Box>\n </Dialog>\n </form>\n </Container>\n </SidebarLayout>\n );\n};\n","import { Box } from '@mui/material';\nimport { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { SUPERSET_PLAYER_PROFILE_DASHBOARD_ID } from 'config';\nimport { useGenerateTemporaryPlaylist } from 'features/dashboard/embedded-dashboard/api/useGenerateTemporaryPlaylist';\nimport { EmbeddedDashboardFeature } from 'features/dashboard/embedded-dashboard/EmbeddedDashboard.feature';\nimport { useDashboardEvents } from 'features/dashboard/embedded-dashboard/hooks/useDashboardEvents';\nimport Container from 'shared/components/container';\nimport { Dialog } from 'shared/components/dialog';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\nimport { Playlist } from 'shared/types';\nimport { TemporaryPlaylistWidget } from 'widgets/playlist/temporary-playlist/TemporaryPlaylist.widget';\n\nexport const PlayerProfileDashboardPage = () => {\n const triggerNotification = useNotifications();\n const { t } = useTranslation();\n const [temporalPlaylist, setTemporalPlaylist] = useState<Playlist | null>(null);\n const generateTemporaryPlaylist = useGenerateTemporaryPlaylist({ onSuccess: setTemporalPlaylist });\n\n useDashboardEvents({ onEvent: generateTemporaryPlaylist });\n\n useEffect(() => {\n if (!SUPERSET_PLAYER_PROFILE_DASHBOARD_ID) {\n triggerNotification({\n type: NotificationType.ERROR,\n message: t('common:error.player-profile'),\n });\n\n throw new Error('Player profile not found due to local configuration issue');\n }\n }, [t, triggerNotification]);\n\n return (\n <SidebarLayout>\n <Container fullScreen>\n {SUPERSET_PLAYER_PROFILE_DASHBOARD_ID ? (\n <>\n <EmbeddedDashboardFeature\n key={SUPERSET_PLAYER_PROFILE_DASHBOARD_ID}\n dashboardId={SUPERSET_PLAYER_PROFILE_DASHBOARD_ID}\n />\n <Dialog onClose={() => setTemporalPlaylist(null)} open={!!temporalPlaylist} fullWidth maxWidth={false}>\n <Box\n height={(theme) => `calc(100vh - ${theme.spacing(8)})`}\n width={(theme) => `calc(100vw - ${theme.spacing(8)})`}\n >\n {temporalPlaylist && <TemporaryPlaylistWidget playlist={temporalPlaylist} />}\n </Box>\n </Dialog>\n </>\n ) : null}\n </Container>\n </SidebarLayout>\n );\n};\n","import { Box, styled } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\n\nimport { MessageVariant } from './index';\n\ninterface MessageContainerProps {\n variant: MessageVariant;\n}\n\nexport const MessageContainer = styled(Box, { shouldForwardProp: (prop) => prop != 'variant' })<MessageContainerProps>(\n ({ theme }) => ({\n padding: theme.spacing(1, 2),\n background: Colors.dawn,\n fontWeight: fontWeight['500'],\n fontSize: fontSizes.small,\n color: Colors.storm,\n }),\n);\n","import { ReactNode } from 'react';\n\nimport { MessageContainer } from './index.styled';\n\nexport enum MessageVariant {\n INFO = 'info',\n}\n\ninterface Props {\n children: ReactNode;\n variant?: MessageVariant;\n}\n\nexport const Message = ({ children, variant = MessageVariant.INFO }: Props) => {\n return <MessageContainer variant={variant}>{children}</MessageContainer>;\n};\n","import axios, { AxiosError } from 'axios';\n\nimport {\n editAllAlignmentsUrl,\n alignAllWithRecordingUrl,\n recordingsBaseUrl,\n specificRecordingUrl,\n initiateMultipartUploadUrl,\n getMultipartUploadUrl,\n completeMultipartUploadUrl,\n abortMultipartUploadUrl,\n liveTaggingSessionsBaseUrl,\n recordingPlaylistsUrl,\n} from 'api/routes';\n\nimport { fetchRequest, ServiceResponse } from './base';\nimport {\n FetchAbortMultipartUpload,\n FetchCompleteMultipartUpload,\n FetchCreateLiveRecordingResponse,\n FetchCreateLiveTaggingRecordingBody,\n FetchCreateUploadRecordingBody,\n FetchCreateUploadRecordingResponse,\n FetchInitiateMultipartUpload,\n FetchMultipartUploadUrl,\n FetchPlaylistsParams,\n FetchPlaylistsResponse,\n FetchUpdateTaggingRecordingAlignmentBody,\n FetchUpdateTaggingRecordingAlignmentResponse,\n FetchUpdateTaggingRecordingAlignmentWithMergeMergeBody,\n FetchUploadMultipartRecordingVideoParams,\n FetchUploadRecordingVideoParams,\n PartETag,\n} from './taggingRecording';\n\nexport const fetchCreateLiveTaggingRecording = (body: FetchCreateLiveTaggingRecordingBody) => {\n return fetchRequest<FetchCreateLiveRecordingResponse>({\n url: liveTaggingSessionsBaseUrl,\n body: {\n name: body.name,\n date: body.date,\n startTime: body.startTime,\n },\n });\n};\n\nexport const fetchUpdateTaggingRecordingAlignment = (body: FetchUpdateTaggingRecordingAlignmentBody) => {\n return fetchRequest<FetchUpdateTaggingRecordingAlignmentResponse>({\n url: editAllAlignmentsUrl(body.recordingId),\n body,\n });\n};\n\nexport const fetchUpdateTaggingRecordingAlignmentWithMerge = (\n body: FetchUpdateTaggingRecordingAlignmentWithMergeMergeBody,\n) => {\n return fetchRequest<FetchUpdateTaggingRecordingAlignmentResponse>({\n url: alignAllWithRecordingUrl,\n body,\n });\n};\n\nexport const fetchTaggingRecording = (params: { id: string }) => {\n return fetchRequest<void>({\n url: specificRecordingUrl(params.id),\n });\n};\n\nexport const fetchCreateUploadRecording = (body: FetchCreateUploadRecordingBody) => {\n return fetchRequest<FetchCreateUploadRecordingResponse>({\n url: recordingsBaseUrl,\n body: { ...body, origin: 'upload' },\n });\n};\n\n// playlists\nexport const fetchPlaylists = (params: FetchPlaylistsParams) => {\n return fetchRequest<FetchPlaylistsResponse>({\n url: recordingPlaylistsUrl(params.recordingId),\n });\n};\n\nexport const fetchUploadVideo = (params: FetchUploadRecordingVideoParams) => {\n const { url, blob, onProgress, calculateProgress, abortController } = params;\n\n return new Promise<ServiceResponse<void>>((resolve) => {\n axios\n .put(url, blob, {\n onUploadProgress: (ev: { total: number; loaded: number }) => {\n const { total, loaded } = ev;\n onProgress(calculateProgress ? calculateProgress(total, loaded) : loaded / total);\n },\n signal: abortController.signal,\n withCredentials: false,\n })\n .then(({ data, headers }) => {\n resolve({ error: false, data, headers });\n })\n .catch((err: AxiosError) => {\n resolve({\n error: true,\n status: err.response?.status ?? 0,\n errors: {},\n });\n });\n });\n};\n\nconst fetchInitiateMultipartUpload = (params: FetchInitiateMultipartUpload) => {\n return fetchRequest<string>({\n url: initiateMultipartUploadUrl(params.recordingId),\n });\n};\n\nconst fetchMultipartUploadUrl = (params: FetchMultipartUploadUrl) => {\n const { recordingId, uploadId, partNumber, partLength } = params;\n return fetchRequest<string>({\n url: getMultipartUploadUrl(recordingId, uploadId, partNumber, partLength),\n });\n};\n\nconst fetchCompleteMultipartUpload = (params: FetchCompleteMultipartUpload) => {\n const { recordingId, ...body } = params;\n return fetchRequest<void>({\n url: completeMultipartUploadUrl(recordingId),\n body,\n });\n};\n\nexport const fetchAbortMultipartUpload = (params: FetchAbortMultipartUpload) => {\n const { recordingId, uploadId } = params;\n return fetchRequest<void>({\n url: abortMultipartUploadUrl(recordingId, uploadId),\n body: {},\n });\n};\n\nexport const fetchUploadMultipartVideo = async (params: FetchUploadMultipartRecordingVideoParams) => {\n const { recordingId, file, onInit, onProgress, abortController } = params;\n\n const initResponse = await fetchInitiateMultipartUpload({ recordingId });\n\n if (initResponse.error) {\n return initResponse;\n }\n\n const uploadId = initResponse.data;\n onInit(uploadId);\n\n const FILE_CHUNK_SIZE = 100 * 1024 * 1024; // 100MB\n const NUM_CHUNKS = Math.floor(file.size / FILE_CHUNK_SIZE) + 1;\n\n let start: number, end: number, blob: Blob;\n const partETags: PartETag[] = [];\n\n for (let partNumber = 1; partNumber < NUM_CHUNKS + 1; partNumber++) {\n start = (partNumber - 1) * FILE_CHUNK_SIZE;\n end = partNumber * FILE_CHUNK_SIZE;\n blob = partNumber < NUM_CHUNKS ? file.slice(start, end) : file.slice(start);\n\n const presignedUrlResponse = await fetchMultipartUploadUrl({\n recordingId,\n uploadId,\n partNumber,\n partLength: blob.size,\n });\n\n if (presignedUrlResponse.error) {\n return presignedUrlResponse;\n }\n\n const uploadPartResponse = await fetchUploadVideo({\n url: presignedUrlResponse.data,\n blob,\n onProgress,\n calculateProgress: (_, loaded: number) => {\n return ((partNumber - 1) * FILE_CHUNK_SIZE + loaded) / file.size;\n },\n abortController,\n });\n\n if (uploadPartResponse.error) {\n return uploadPartResponse;\n }\n\n partETags.push({\n eTag: uploadPartResponse.headers['etag'],\n partNumber,\n });\n }\n\n return fetchCompleteMultipartUpload({ recordingId, uploadId, partETags });\n};\n","import { alpha, Box, styled, Typography } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nimport { defaultVideoAspectRatio } from 'shared/components/video-player/video-player-component/hooks/use-video-aspect-ratio';\n\nexport const AlignRecordingContainer = styled(Box)({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n});\n\nexport const AlignRecordingContent = styled(Box)({\n width: '66.666667%',\n});\n\nexport const AlignRecordingVideoPlayerContainer = styled(Box)({\n position: 'relative',\n aspectRatio: defaultVideoAspectRatio,\n});\n\nexport const AlignRecordingActionsContainer = styled(Box)(({ theme }) => ({\n margin: theme.spacing(2, 0),\n}));\n\nexport const AlignRecordingClipListContainer = styled(Box)({\n position: 'relative',\n});\n\nexport const AlignRecordingClipContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n}));\n\nexport const AlignRecordingName = styled(Typography)(({ theme }) => ({\n position: 'absolute',\n top: 0,\n left: 0,\n padding: theme.spacing(1, 2),\n background: alpha(Colors.storm, 0.8),\n}));\n\nexport const AlignRecordingBottomActions = styled(Box)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'center',\n gap: theme.spacing(2),\n marginTop: theme.spacing(3),\n}));\n","import { Box, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const AlignRecordingClipContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n}));\n\nexport const AlignRecordingClipCard = styled(Box)(({ theme }) => ({\n display: 'flex',\n flex: 1,\n gap: theme.spacing(1),\n padding: theme.spacing(1, 2),\n justifyContent: 'flex-start',\n alignItems: 'center',\n background: Colors.white,\n borderRadius: theme.shape.borderRadius,\n boxShadow: theme.shadows[1],\n}));\n","import { IconButton, Radio, Typography } from '@mui/material';\nimport { fontSizes, fontWeight } from 'kognia-ui';\nimport { ChangeEvent, useCallback } from 'react';\n\nimport { TaggingEvent } from 'api/tagging-tool/types';\nimport IconPlay from 'shared/components/icons/icon-play';\nimport { TypeCounter } from 'shared/components/type-counter';\nimport { getIconPlayColor } from 'shared/utils/get-icon-play-color';\nimport { TaggingEventClipTypeBackgroundColor, TaggingEventClipTypeColor } from 'shared/utils/tagging-event-clip-type';\n\nimport { AlignRecordingClipCard, AlignRecordingClipContainer } from './styled';\nimport { secondsToTimeString } from '../../../../tagging-tool/utility/date';\n\nexport type RecordingAlignmentClipProps = {\n event: TaggingEvent;\n aligning: boolean;\n alignmentDiff: number;\n videoDuration: number;\n idx: number;\n checked: boolean;\n onCheckedChange: (value: boolean) => void;\n onPlay: (diffTime: number) => void;\n};\n\nexport const RecordingAlignmentClip = ({\n event,\n aligning,\n alignmentDiff,\n videoDuration,\n idx,\n checked,\n onCheckedChange,\n onPlay,\n}: RecordingAlignmentClipProps) => {\n const { name, time, typeOfPlay, timeAfter, timeBefore } = event;\n\n const startTime = (time - timeBefore > 0 ? time - timeBefore : 0) + alignmentDiff;\n const disabled = startTime < 0 || startTime > videoDuration;\n const endTime = time + timeAfter + alignmentDiff;\n\n const handleRadioChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n onCheckedChange(event.target.checked);\n },\n [onCheckedChange],\n );\n\n return (\n <AlignRecordingClipContainer>\n {aligning && <Radio checked={checked} onChange={handleRadioChange} />}\n <AlignRecordingClipCard>\n <TypeCounter\n color={TaggingEventClipTypeColor[typeOfPlay]}\n backgroundColor={TaggingEventClipTypeBackgroundColor[typeOfPlay]}\n disabled={disabled}\n >\n {`${idx + 1}`.padStart(3, '0')}\n </TypeCounter>\n\n <IconButton size={'small'} disabled={disabled} onClick={() => onPlay(startTime)}>\n <IconPlay size='small' sx={{ color: getIconPlayColor({ disabled, typeOfPlay }) }} />\n </IconButton>\n {!disabled && (\n <Typography fontWeight={fontWeight['500']} fontSize={fontSizes.default}>\n {secondsToTimeString(startTime)} - {secondsToTimeString(endTime)}\n </Typography>\n )}\n <Typography fontSize={fontSizes.default}>{name}</Typography>\n </AlignRecordingClipCard>\n </AlignRecordingClipContainer>\n );\n};\n","import { LoadingButton } from '@mui/lab';\nimport { Button, Grid } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { generatePath, useHistory } from 'react-router-dom';\n\nimport { TaggingEvent } from 'api/tagging-tool/types';\nimport { routes } from 'kognia/router/routes';\nimport { Message } from 'shared/components/message';\nimport Spinner from 'shared/components/spinner';\nimport { useCurrentTime, useDuration, useVideoPlayerActions } from 'shared/components/video-player';\nimport VideoPlayerComponent from 'shared/components/video-player/video-player-component';\nimport {\n fetchUpdateTaggingRecordingAlignment,\n fetchUpdateTaggingRecordingAlignmentWithMerge,\n} from 'tagging-tool/service/taggingRecording.service';\nimport { dateToPrintableDateString } from 'tagging-tool/utility/date';\nimport { makeRecordingDetailRoute } from 'tagging-tool/utility/navigation';\n\nimport {\n AlignRecordingActionsContainer,\n AlignRecordingBottomActions,\n AlignRecordingClipContainer,\n AlignRecordingClipListContainer,\n AlignRecordingContainer,\n AlignRecordingContent,\n AlignRecordingName,\n AlignRecordingVideoPlayerContainer,\n} from './styled';\nimport { Meta } from '../../types';\nimport { RecordingAlignmentClip } from '../align-recording-clip';\n\ninterface Props {\n aligning: boolean;\n alignmentDiff: number;\n canAlign: boolean;\n canFinish: boolean;\n meta: Meta | undefined;\n recordingId: string;\n events: TaggingEvent[] | undefined;\n selectedAlignmentEvent: undefined | TaggingEvent;\n setAligning: (value: boolean) => void;\n setAlignmentDiff: (value: number) => void;\n setCanAlign: (value: boolean) => void;\n setCanFinish: (value: boolean) => void;\n setEvents: (events: TaggingEvent[] | undefined) => void;\n setMeta: (meta: Meta | undefined) => void;\n setSelectedAlignmentEvent: (event: undefined | TaggingEvent) => void;\n sourceRecordingId: undefined | string;\n}\n\nexport const AlignRecording = ({\n meta,\n aligning,\n events,\n recordingId,\n setAligning,\n canAlign,\n setMeta,\n setEvents,\n sourceRecordingId,\n setCanAlign,\n canFinish,\n setCanFinish,\n alignmentDiff,\n setAlignmentDiff,\n selectedAlignmentEvent,\n setSelectedAlignmentEvent,\n}: Props) => {\n const actions = useVideoPlayerActions();\n const currentTime = useCurrentTime();\n const duration = useDuration();\n const { t } = useTranslation();\n const history = useHistory();\n const [fetching, setFetching] = useState<boolean>(false);\n\n const handleAlign = useCallback(() => {\n if (!selectedAlignmentEvent) return;\n\n const startTime =\n selectedAlignmentEvent.time - selectedAlignmentEvent.timeBefore > 0\n ? selectedAlignmentEvent.time - selectedAlignmentEvent.timeBefore\n : 0;\n\n setAlignmentDiff(Math.round(Math.floor(currentTime) - startTime));\n\n setAligning(false);\n setCanFinish(true);\n }, [selectedAlignmentEvent, setAlignmentDiff, currentTime, setAligning, setCanFinish]);\n\n const handleEditAlignment = useCallback(() => {\n setAlignmentDiff(0);\n setSelectedAlignmentEvent(undefined);\n setAligning(true);\n setCanAlign(false);\n setCanFinish(false);\n }, [setAligning, setAlignmentDiff, setCanAlign, setCanFinish, setSelectedAlignmentEvent]);\n\n const handleFinish = useCallback(() => {\n if (!meta) return;\n\n setFetching(true);\n\n const finalize = () => {\n setSelectedAlignmentEvent(undefined);\n setFetching(false);\n setCanAlign(false);\n setCanFinish(false);\n };\n\n if (sourceRecordingId !== undefined) {\n // merging\n fetchUpdateTaggingRecordingAlignmentWithMerge({\n recordingId: meta.recordingId,\n liveTaggingSessionId: recordingId,\n diff: alignmentDiff,\n }).then((res) => {\n finalize();\n\n if (res.error) {\n return;\n }\n\n setMeta(undefined);\n setEvents(undefined);\n\n history.replace(makeRecordingDetailRoute({ recordingId: meta.recordingId }));\n });\n } else {\n fetchUpdateTaggingRecordingAlignment({\n recordingId: meta.recordingId,\n diff: alignmentDiff,\n }).then(() => {\n finalize();\n });\n }\n }, [\n meta,\n sourceRecordingId,\n setSelectedAlignmentEvent,\n setCanAlign,\n setCanFinish,\n recordingId,\n alignmentDiff,\n setMeta,\n setEvents,\n history,\n ]);\n\n const handleCancel = useCallback(() => {\n if (selectedAlignmentEvent) {\n setAlignmentDiff(0);\n setAligning(true);\n setSelectedAlignmentEvent(undefined);\n setCanAlign(true);\n setCanFinish(false);\n } else {\n history.goBack();\n }\n }, [\n history,\n selectedAlignmentEvent,\n setAligning,\n setAlignmentDiff,\n setCanAlign,\n setCanFinish,\n setSelectedAlignmentEvent,\n ]);\n\n const handleBack = useCallback(() => {\n history.push(generatePath(routes.TAGGING_TOOL_TAG, { recordingId }));\n }, [history, recordingId]);\n\n const showFinish = canFinish || (events !== undefined && events.length === 0);\n return (\n <>\n <div>\n {(meta === undefined || events === undefined) && <Spinner isFullPage />}\n {meta !== undefined && events !== undefined && (\n <AlignRecordingContainer>\n <AlignRecordingContent>\n <AlignRecordingVideoPlayerContainer>\n <VideoPlayerComponent />\n <AlignRecordingName color={Colors.white} fontWeight={fontWeight['500']} fontSize={fontSizes.default}>\n {`${meta.name} / ${dateToPrintableDateString(new Date(meta.date))}`}\n </AlignRecordingName>\n </AlignRecordingVideoPlayerContainer>\n <AlignRecordingActionsContainer>\n <Grid container spacing={1}>\n <Grid item xs={aligning ? 12 : 8}>\n <Message>\n {aligning\n ? t('tagging-tool:tagging-recording.seek-to-align')\n : t('tagging-tool:tagging-recording.review-alignment')}\n </Message>\n </Grid>\n {!aligning && (\n <Grid item xs={4}>\n <Button fullWidth variant='contained' color='secondary' onClick={handleEditAlignment}>\n {t('tagging-tool:tagging-recording.reset-alignment')}\n </Button>\n </Grid>\n )}\n </Grid>\n </AlignRecordingActionsContainer>\n <AlignRecordingClipListContainer>\n <AlignRecordingClipContainer>\n {events.map((event, idx) => {\n return (\n <RecordingAlignmentClip\n key={event.id}\n event={event}\n aligning={aligning}\n alignmentDiff={alignmentDiff}\n videoDuration={duration}\n idx={idx}\n checked={selectedAlignmentEvent?.id === event.id}\n onCheckedChange={(value) => {\n if (value) {\n setSelectedAlignmentEvent(event);\n setCanAlign(true);\n }\n }}\n onPlay={(diffTime) => {\n actions.jumpToTimePercent((diffTime * 100) / duration);\n actions.play();\n }}\n />\n );\n })}\n </AlignRecordingClipContainer>\n </AlignRecordingClipListContainer>\n </AlignRecordingContent>\n </AlignRecordingContainer>\n )}\n </div>\n <AlignRecordingBottomActions>\n {(aligning || showFinish) && (\n <>\n <Button size='large' variant='contained' color='secondary' onClick={handleCancel}>\n {t('common:actions.cancel')}\n </Button>\n <LoadingButton\n size='large'\n onClick={showFinish ? handleFinish : handleAlign}\n disabled={(!canAlign && !canFinish) || fetching}\n loading={fetching}\n variant='contained'\n >\n {showFinish ? t('common:finish') : t('tagging-tool:tagging-recording.align-button')}\n </LoadingButton>\n </>\n )}\n {!aligning && !showFinish && (\n <Button size='large' variant='contained' color='secondary' onClick={handleBack}>\n {t('common:back')}\n </Button>\n )}\n </AlignRecordingBottomActions>\n </>\n );\n};\n","import queryString from 'query-string';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { useLocation } from 'react-router-dom';\n\nimport { TaggingEvent } from 'api/tagging-tool/types';\nimport Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { VideoPlayerStateProvider } from 'shared/components/video-player';\nimport {\n DEFAULT_TACTICAL_CAMERA_PLAYING_MODE,\n PLAYLIST_WITHOUT_OVERLAYS_PLAYING_MODE,\n} from 'shared/components/video-player/defaultPlayingModes';\nimport { VideoSourceType } from 'shared/components/video-player/types';\n\nimport { AlignRecording } from './components/align-recording';\nimport { Meta } from './types';\nimport { fetchTaggingEvents } from '../../tagging-tool/service/taggingEvent.service';\n\nconst ALIGNMENT_PLAYER_ID = 'alignment-player';\n\nexport const RecordingAlignment = () => {\n const { recordingId, sourceRecordingId } = useParams<{\n recordingId: string;\n sourceRecordingId?: string;\n }>();\n\n // state\n const { search } = useLocation();\n const { isLive } = queryString.parse(search);\n\n const [events, setEvents] = useState<undefined | Array<TaggingEvent>>();\n\n const [aligning, setAligning] = useState<boolean>(true);\n const [canAlign, setCanAlign] = useState<boolean>(false);\n const [canFinish, setCanFinish] = useState<boolean>(false);\n const [alignmentDiff, setAlignmentDiff] = useState<number>(0);\n const [selectedAlignmentEvent, setSelectedAlignmentEvent] = useState<undefined | TaggingEvent>();\n\n const [meta, setMeta] = useState<Meta | undefined>();\n\n useEffect(() => {\n // reset state if we change recordingId and the component (screen) is reused\n setAligning(true);\n setCanFinish(false);\n setCanAlign(false);\n setAlignmentDiff(0);\n setMeta(undefined);\n setEvents(undefined);\n setSelectedAlignmentEvent(undefined);\n\n fetchTaggingEvents({ recordingId, asc: true, isLive: isLive === 'true' }).then((res) => {\n if (res.error) {\n return;\n }\n\n if (sourceRecordingId === undefined) {\n // we're not merging, so fill meta\n setMeta({\n recordingId: recordingId,\n name: res.data.name,\n date: res.data.date,\n videoSources: res.data.videoSources,\n matchVideoSource: res.data.matchVideoSource,\n });\n }\n setEvents(res.data.data);\n });\n\n if (!sourceRecordingId) {\n return;\n }\n\n // we're merging\n\n fetchTaggingEvents({ recordingId: sourceRecordingId, asc: true }).then((res) => {\n if (res.error) {\n return;\n } else if (!res.data.matchVideoSource?.src) {\n console.warn(`${sourceRecordingId} has no video source`);\n return;\n }\n\n setMeta({\n recordingId: sourceRecordingId,\n name: res.data.name,\n date: res.data.date,\n videoSources: res.data.videoSources,\n matchVideoSource: res.data.matchVideoSource,\n });\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recordingId, sourceRecordingId]);\n\n // handlers\n const generateVideoTypes = useCallback(\n (startTime: number, endTime: number): VideoSourceType[] => [\n {\n playingMode: DEFAULT_TACTICAL_CAMERA_PLAYING_MODE,\n videoSources: [\n {\n id: meta?.matchVideoSource?.id ?? '',\n endTime: endTime,\n startTime: startTime,\n src: meta?.matchVideoSource?.src ?? '',\n },\n ],\n },\n ],\n [meta],\n );\n\n if (!meta?.matchVideoSource?.src) return null;\n\n return (\n <SidebarLayout>\n <Container>\n <VideoPlayerStateProvider\n playerId={`${ALIGNMENT_PLAYER_ID}-${recordingId}`}\n playlistItems={[\n {\n id: 'tagging-tool-item',\n duration: 0,\n videoTypes: generateVideoTypes(0, 0),\n name: '',\n index: 0,\n recordingId,\n hasHomographies: false,\n fundamentalsSelected: {\n tacticalAnalysisId: undefined,\n fundamentalsSelected: [],\n },\n },\n ]}\n playingMode={PLAYLIST_WITHOUT_OVERLAYS_PLAYING_MODE}\n >\n <AlignRecording\n aligning={aligning}\n alignmentDiff={alignmentDiff}\n canAlign={canAlign}\n canFinish={canFinish}\n events={events}\n meta={meta}\n recordingId={recordingId}\n selectedAlignmentEvent={selectedAlignmentEvent}\n setAligning={setAligning}\n setAlignmentDiff={setAlignmentDiff}\n setCanAlign={setCanAlign}\n setCanFinish={setCanFinish}\n setEvents={setEvents}\n setMeta={setMeta}\n setSelectedAlignmentEvent={setSelectedAlignmentEvent}\n sourceRecordingId={sourceRecordingId}\n />\n </VideoPlayerStateProvider>\n </Container>\n </SidebarLayout>\n );\n};\n","import { UseQueryResult } from '@tanstack/react-query';\n\nimport { queryClient } from 'api/config';\nimport { useFetchRequest } from 'api/hooks/useFetchRequest';\nimport { transformRecording } from 'api/recording/transformers';\nimport { taggingRecordingsBaseUrl } from 'api/routes';\nimport { APIRecording } from 'pages/recordings-list/api/types';\nimport { Recording } from 'shared/types/recording/types';\n\nconst generateQueryRef = () => ['fetchTaggingRecording'];\n\ninterface useFetchTaggingRecordingsInterface {\n (): UseQueryResult<Recording[]>;\n}\n\nexport const useFetchTaggingRecordings: useFetchTaggingRecordingsInterface = () => {\n const onSuccess = (data: APIRecording[]) => data.map((recording) => transformRecording(recording));\n const fetchQueryRef = generateQueryRef();\n const invalidateQuery = () => queryClient.invalidateQueries(fetchQueryRef);\n const fetchRequest = useFetchRequest<Recording[]>({\n queryRef: fetchQueryRef,\n url: taggingRecordingsBaseUrl,\n options: { retry: false, refetchOnWindowFocus: true },\n transformer: onSuccess,\n });\n\n return { ...fetchRequest, invalidateQuery };\n};\n","import { Box, styled } from '@mui/material';\n\nexport const AlignmentSourceRecordingList = styled('ul')(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n listStyle: 'none',\n gap: theme.spacing(1),\n '& > li': {\n flex: 1,\n },\n}));\n\nexport const AlignmentSourceRecordingListItem = styled('li')(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(2),\n}));\n\nexport const AlignmentSourceRecordingCard = styled(Box)({\n flex: '1',\n});\n\nexport const AlignmentSourceActions = styled(Box)(({ theme }) => ({\n display: 'flex',\n justifyContent: 'center',\n gap: theme.spacing(2),\n}));\n","import { Button, Grid, Radio } from '@mui/material';\nimport queryString from 'query-string';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory, useLocation, useParams } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport VODRecordingCard from 'pages/recordings-list/components/vod-recording-card';\nimport { PageSubTitle } from 'shared/components/page-sub-title';\nimport { PageTitle } from 'shared/components/page-title';\nimport { Recording } from 'shared/types/recording/types';\nimport { makeRecordingAlignmentRoute } from 'tagging-tool/utility/navigation';\n\nimport {\n AlignmentSourceActions,\n AlignmentSourceRecordingCard,\n AlignmentSourceRecordingList,\n AlignmentSourceRecordingListItem,\n} from './styled';\n\nexport type AlignmentSourceListProps = {\n recordings: Recording[];\n};\n\nexport const AlignmentSourceList = ({ recordings }: AlignmentSourceListProps) => {\n const history = useHistory();\n const { recordingId } = useParams<{ recordingId: string }>();\n const { t } = useTranslation();\n const { search } = useLocation();\n const { isLive } = queryString.parse(search);\n\n const [selected, setSelected] = useState<Recording | undefined>();\n\n const handlePress = useCallback(() => {\n history.replace(\n makeRecordingAlignmentRoute({\n recordingId,\n sourceRecordingId: selected!.id,\n isLive: isLive === 'true',\n }),\n );\n }, [history, recordingId, selected, isLive]);\n\n const handleCancel = useCallback(() => history.push(routes.TAGGING_TOOL), [history]);\n\n return (\n <>\n {recordings !== undefined && (\n <Grid container direction={'column'} spacing={2} wrap={'nowrap'}>\n <Grid item>\n <PageTitle>{t('tagging-tool:tagging-recording.videos')}</PageTitle>\n <PageSubTitle>{t('tagging-tool:tagging-recording.select-alignment-video-source')}</PageSubTitle>\n </Grid>\n <Grid item marginTop={1}>\n <AlignmentSourceRecordingList>\n {recordings.map((recording) => (\n <AlignmentSourceRecordingListItem key={recording.id}>\n <Radio\n id={recording.id}\n checked={selected?.id === recording.id}\n onChange={(value) => {\n if (value) {\n setSelected(recording);\n }\n }}\n />\n <AlignmentSourceRecordingCard>\n <VODRecordingCard hideActions recording={recording} key={recording.id} />\n </AlignmentSourceRecordingCard>\n </AlignmentSourceRecordingListItem>\n ))}\n </AlignmentSourceRecordingList>\n </Grid>\n </Grid>\n )}\n <AlignmentSourceActions>\n <Button variant='contained' color='secondary' size='large' onClick={handleCancel}>\n {t('common:actions.cancel')}\n </Button>\n <Button onClick={handlePress} variant='contained' size='large'>\n {t('common:actions.next')}\n </Button>\n </AlignmentSourceActions>\n </>\n );\n};\n","import { useTranslation } from 'react-i18next';\n\nimport { useFetchTaggingRecordings } from 'api/recording/useFetchTaggingRecordings';\nimport { AlignmentSourceList } from 'pages/tagging-tool-aling-sources/components/alignment-source-list';\nimport Container from 'shared/components/container';\nimport NotFound from 'shared/components/not-found';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport Spinner from 'shared/components/spinner';\nimport usePageStateMachine from 'shared/hooks/use-page-state-machine';\nimport { Recording } from 'shared/types/recording/types';\n\nexport const AlignmentSourceListContainer = () => {\n const { t } = useTranslation();\n const { data, isPageLoading, isPageReady, isPageMissingData } = usePageStateMachine<Recording[]>(() =>\n useFetchTaggingRecordings(),\n );\n\n return (\n <SidebarLayout>\n <Container>\n {isPageLoading && <Spinner isFullPage />}\n {isPageMissingData && <NotFound header={t('tagging-tool:not-found')} />}\n {isPageReady && data && <AlignmentSourceList recordings={data} />}\n </Container>\n </SidebarLayout>\n );\n};\n","import { useQueryStringState } from 'shared/hooks/use-query-string-state';\n\nexport enum LiveSessionsFilterNames {\n from = 'from',\n to = 'to',\n}\n\nexport interface LiveSessionsFilters {\n [LiveSessionsFilterNames.from]: string | null;\n [LiveSessionsFilterNames.to]: string | null;\n}\n\nconst ALLOWED_LIVE_SESSIONS_QUERY_PARAMS = Object.keys(LiveSessionsFilterNames);\n\nexport const useLiveSessionsFilters = () => {\n const { value, updateValues } = useQueryStringState(ALLOWED_LIVE_SESSIONS_QUERY_PARAMS);\n\n const filters: LiveSessionsFilters = {\n [LiveSessionsFilterNames.from]: (value[LiveSessionsFilterNames.from] as string) || null,\n [LiveSessionsFilterNames.to]: (value[LiveSessionsFilterNames.to] as string) || null,\n };\n\n return { filters, updateFilters: updateValues };\n};\n","import { PlayBackTypes, Recording, RecordingTypes, VideoSourceStates, ViewTypes } from 'shared/types/recording/types';\nimport { chooseNextCursorValue } from 'shared/utils/choose-next-cursor-value';\n\nimport { FetchTaggingRecordingsResponse, TaggingRecordingsRecording } from './types';\n\nexport const transformLiveSessionsRecordings = (recording: TaggingRecordingsRecording): Recording => {\n return {\n competitionName: recording.competitionName,\n duration: recording.duration,\n id: recording.id,\n matchDay: recording.matchday ?? '',\n name: recording.name,\n type: recording.type as RecordingTypes,\n isLive: recording.isLive,\n isProcessingVideo: false,\n date: new Date(recording.date),\n extraTime: recording.extraTime,\n teams: recording.teams,\n hasTaggingEvents: recording.hasTaggingEvents,\n tacticalAnalysis: recording.tacticalAnalysis,\n videoSourcesStates: recording?.videoSourcesStates\n ? recording.videoSourcesStates.map((videoSourceState) => ({\n playBackType: videoSourceState.playBackType as PlayBackTypes,\n viewType: videoSourceState.viewType as ViewTypes,\n state: videoSourceState.state as VideoSourceStates,\n }))\n : [],\n matchReportDownloadUrl: null,\n };\n};\n\nexport type LiveSessionsResponse = {\n data: {\n liveSessions: Recording[];\n };\n};\n\nexport const transformLiveSessions = (response: FetchTaggingRecordingsResponse) => {\n return {\n data: {\n liveSessions: response.content.map(transformLiveSessionsRecordings),\n page: response.page,\n },\n nextCursor: chooseNextCursorValue(response.page.totalPages, response.page.number),\n };\n};\n","import { QueryFunctionContext, useInfiniteQuery } from '@tanstack/react-query';\nimport { useMemo } from 'react';\n\nimport { queryClient } from 'api/config';\nimport { useBackendApi } from 'api/hooks/useBackendApi';\nimport { liveSessionsWithFiltersUrl } from 'api/routes';\nimport {\n LiveSessionsFilters,\n useLiveSessionsFilters,\n} from 'api/tagging-tool/use-live-sessions-with-filters/hooks/use-live-sessions-filters';\nimport { HTTPMethod } from 'api/types';\nimport { Recording } from 'shared/types/recording/types';\n\nimport { transformLiveSessions } from './transformer';\nimport { LiveSessionsWithFiltersPage } from './types';\n\nconst liveSessionsWithFiltersQueryKey = 'liveSessionsWithFilters';\n\nconst getLiveSessionsItems = (pages: LiveSessionsWithFiltersPage[] | undefined): Recording[] => {\n return pages\n ? pages.reduce((acc: Recording[], page: any) => {\n return acc.concat(page.data.liveSessions);\n }, [])\n : [];\n};\n\nconst getTotalElementsFromPage = (pages: LiveSessionsWithFiltersPage[] | undefined): number => {\n if (!pages || pages.length === 0) return 0;\n\n const lastPage = pages[pages.length - 1];\n\n return lastPage.data.page.totalElements;\n};\n\nexport const invalidateLiveSessionsWithFiltersQuery = () => {\n return queryClient.invalidateQueries([liveSessionsWithFiltersQueryKey]);\n};\n\nexport const useLiveSessionsWithFilters = () => {\n const { filters, updateFilters } = useLiveSessionsFilters();\n const url = (options: QueryFunctionContext<(string | LiveSessionsFilters)[], any>) =>\n liveSessionsWithFiltersUrl({ ...filters, page: options.pageParam });\n const fetchRequest = useInfiniteQuery(\n ['taggingRecordings', filters],\n (options) => {\n return useBackendApi(url(options), HTTPMethod.GET, transformLiveSessions);\n },\n {\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n },\n );\n const data = useMemo(\n () => ({\n liveSessions: getLiveSessionsItems(fetchRequest?.data?.pages),\n totalElements: getTotalElementsFromPage(fetchRequest?.data?.pages),\n fetchNextPage: fetchRequest?.fetchNextPage,\n }),\n [fetchRequest?.data?.pages, fetchRequest?.fetchNextPage],\n );\n\n return { ...fetchRequest, data, updateFilters, filters };\n};\n","import { Button, Grid, Typography } from '@mui/material';\nimport { fontSizes } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router-dom';\n\nimport {\n invalidateLiveSessionsWithFiltersQuery,\n useLiveSessionsWithFilters,\n} from 'api/tagging-tool/use-live-sessions-with-filters';\nimport RecordingsList from 'pages/recordings-list/components/recordings-list';\nimport { DateRange } from 'shared/components/date-range';\nimport IconPlus from 'shared/components/icons/icon-plus';\nimport IconStrawberry from 'shared/components/icons/icon-strawberry';\nimport { ListTitle } from 'shared/components/list/list-title';\nimport { ListTitleContainer } from 'shared/components/list/list-title-container';\nimport Pagination from 'shared/components/pagination';\nimport { useDates } from 'shared/hooks/use-dates';\nimport { fetchCreateLiveTaggingRecording } from 'tagging-tool/service/taggingRecording.service';\nimport { dateToPrintableDateTimeString } from 'tagging-tool/utility/date';\nimport { makeRecordingDetailRoute } from 'tagging-tool/utility/navigation';\n\nimport { LiveSessionsFilterNames } from '../../../../api/tagging-tool/use-live-sessions-with-filters/hooks/use-live-sessions-filters';\n\nexport const TaggingRecordingList = () => {\n const { t } = useTranslation();\n const history = useHistory();\n const [openFilter, setOpenFilter] = useState<LiveSessionsFilterNames>();\n const { data, isFetchingNextPage, filters, updateFilters } = useLiveSessionsWithFilters();\n const { parseDateForApi } = useDates();\n\n const handleNewLiveRecording = useCallback(() => {\n const now = new Date();\n const name = dateToPrintableDateTimeString(now);\n const date = now.toISOString();\n const start_recording_time = now.getTime();\n\n fetchCreateLiveTaggingRecording({\n name,\n date,\n startTime: start_recording_time,\n }).then((res) => {\n if (res.error) {\n return;\n }\n\n setTimeout(() => {\n history.push(\n makeRecordingDetailRoute({\n recordingId: res.data.id,\n showsKeypad: true,\n isLive: true,\n }),\n );\n }, 0);\n });\n }, [history]);\n\n const handleDateRangeClose = useCallback(\n (start: Date | null, end: Date | null) => {\n updateFilters({\n from: start ? parseDateForApi(start) : start,\n to: end ? parseDateForApi(end) : end,\n });\n setOpenFilter(undefined);\n },\n [parseDateForApi, updateFilters],\n );\n\n return (\n <Grid container direction={'column'} spacing={4}>\n <Grid container item justifyContent={'flex-end'} alignItems={'center'} spacing={1}>\n <Grid item>\n <Button\n variant='contained'\n onClick={handleNewLiveRecording}\n startIcon={<IconPlus size='small' sx={{ color: 'common.white' }} />}\n >\n {t('tagging-tool:tagging-recording.new-live-tag')}\n </Button>\n </Grid>\n </Grid>\n <Grid item container justifyContent={'space-between'} alignItems={'center'}>\n <Grid item container alignItems={'center'} spacing={1} xs={4}>\n <ListTitleContainer>\n <ListTitle dataTestId='page-title'>{t('tagging-tool:tagging-recording.recordings-title')}</ListTitle>\n </ListTitleContainer>\n </Grid>\n <Grid item container spacing={4} xs={8} justifyContent={'flex-end'}>\n <Grid display='flex' item alignItems={'center'}>\n <IconStrawberry size='small' />\n <Typography fontSize={fontSizes.small}>{t('tagging-tool:tagging-recording.filter-by')}</Typography>\n </Grid>\n <Grid item display='flex' gap={2}>\n <DateRange\n from={filters.from}\n to={filters.to}\n isOpen={openFilter === LiveSessionsFilterNames.from}\n onClick={() => setOpenFilter(LiveSessionsFilterNames.from)}\n hasSelectedOptions={Boolean(filters.from) && Boolean(filters.to)}\n onClose={handleDateRangeClose}\n />\n </Grid>\n </Grid>\n </Grid>\n <Grid item>\n <RecordingsList\n isLoading={!data.liveSessions}\n onDeleteSuccess={invalidateLiveSessionsWithFiltersQuery}\n recordings={data.liveSessions ? data.liveSessions : []}\n />\n <Pagination\n total={data.totalElements}\n displayed={data.liveSessions.length}\n onShowMore={data.fetchNextPage}\n loading={isFetchingNextPage}\n getStatsText={(displayed, total) => t('recordings-list:pagination.total', { displayed, total, count: total })}\n />\n </Grid>\n </Grid>\n );\n};\n","import { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useLiveSessionsWithFilters } from 'api/tagging-tool/use-live-sessions-with-filters';\nimport Container from 'shared/components/container';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { useBranding } from 'shared/hooks/use-branding/useBranding';\n\nimport { TaggingRecordingList } from './components/tagging-recording-list';\nimport { RecordingListPageSkeleton } from '../recordings-list/components/recording-list-page-skeleton';\n\nexport const TaggingToolRecordingList = () => {\n const { t } = useTranslation();\n const { isLoading, isSuccess } = useLiveSessionsWithFilters();\n\n const branding = useBranding();\n\n useEffect(() => {\n document.title = t('common:metas.title.tagging', { clientDisplayName: branding.displayName });\n }, [branding.displayName, t]);\n\n if (isLoading) return <RecordingListPageSkeleton />;\n\n return (\n <SidebarLayout>\n <Container>{isSuccess && <TaggingRecordingList />}</Container>\n </SidebarLayout>\n );\n};\n","import { Box, OutlinedInput, styled, TextField } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const UploadAutocompleteTextField = styled(TextField)(() => ({\n background: Colors.white,\n}));\n\nexport const UploadColumn = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(2),\n}));\n\nexport const UploadInput = styled(TextField)(() => ({\n background: Colors.white,\n}));\n\nexport const UploadLabelWithLink = styled(Box)(() => ({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n}));\n\nexport const UploadOutlinedInput = styled(OutlinedInput)(() => ({\n background: Colors.white,\n}));\n","import { nativeEnum, object, string, TypeOf, union } from 'zod';\n\nexport type AutocompleteTeamsValue = { label: string; value: string };\n\nexport enum UploadVideoStepOneFormFields {\n recordingTitle = 'name',\n type = 'type',\n country = 'country',\n city = 'city',\n date = 'date',\n stadium = 'stadium',\n competition = 'competitionName',\n homeTeam = 'homeTeam',\n awayTeam = 'awayTeam',\n homeTeamId = 'homeTeamId',\n awayTeamId = 'awayTeamId',\n videoSource = 'videoSource',\n}\n\nexport enum UploadVideoStepOneType {\n game = 'game',\n training = 'training',\n}\n\nexport const uploadVideoStepOneDefaultValues = {\n [UploadVideoStepOneFormFields.type]: UploadVideoStepOneType.game,\n};\n\nconst typeSchema = nativeEnum(UploadVideoStepOneType);\nconst teamSchema = object({ label: string(), value: string() }).optional();\nconst dateSchema = string().transform((value) => new Date(value).toISOString());\nconst stringSchema = string();\n\nconst recordingTitleSchema = string().min(2);\n\nconst uploadVideoStepOneTrainingSchema = object({\n [UploadVideoStepOneFormFields.city]: stringSchema,\n [UploadVideoStepOneFormFields.country]: stringSchema,\n [UploadVideoStepOneFormFields.date]: dateSchema,\n [UploadVideoStepOneFormFields.recordingTitle]: recordingTitleSchema,\n [UploadVideoStepOneFormFields.stadium]: stringSchema,\n [UploadVideoStepOneFormFields.type]: typeSchema,\n [UploadVideoStepOneFormFields.videoSource]: stringSchema,\n [UploadVideoStepOneFormFields.awayTeam]: teamSchema,\n [UploadVideoStepOneFormFields.homeTeam]: teamSchema,\n});\n\nconst uploadVideoStepOneMatchSchema = object({\n ...uploadVideoStepOneTrainingSchema.shape,\n [UploadVideoStepOneFormFields.competition]: stringSchema,\n [UploadVideoStepOneFormFields.homeTeamId]: stringSchema,\n [UploadVideoStepOneFormFields.awayTeamId]: stringSchema,\n});\n\nexport const uploadVideoStepOneFormSchema = union([uploadVideoStepOneMatchSchema, uploadVideoStepOneTrainingSchema]);\nexport type UploadVideoStepOneFormSchema = TypeOf<typeof uploadVideoStepOneFormSchema>;\n","import { teamUrl } from 'api/routes';\n\nimport { fetchRequest } from './base';\nimport { FetchTeamsResponse } from './teams';\n\nexport const fetchTeams = () => {\n return fetchRequest<FetchTeamsResponse>({\n url: teamUrl,\n });\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { Button, Grid, Autocomplete, FormControl, RadioGroup, FormControlLabel, Radio } from '@mui/material';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router';\nimport { generatePath } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport Container from 'shared/components/container';\nimport { FormFormLabel } from 'shared/components/form/form-form-label';\nimport { PageTitle } from 'shared/components/page-title';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport Spinner from 'shared/components/spinner';\n\nimport {\n UploadAutocompleteTextField,\n UploadColumn,\n UploadInput,\n UploadLabelWithLink,\n UploadOutlinedInput,\n} from './styled';\nimport {\n AutocompleteTeamsValue,\n uploadVideoStepOneDefaultValues,\n UploadVideoStepOneFormFields,\n uploadVideoStepOneFormSchema,\n UploadVideoStepOneFormSchema,\n UploadVideoStepOneType,\n} from './utils/upload-video-step-one-form';\nimport { fetchCreateUploadRecording } from '../../tagging-tool/service/taggingRecording.service';\nimport { fetchTeams } from '../../tagging-tool/service/teams.service';\nimport { sortArray } from '../../tagging-tool/utility/arrays';\n\nexport const UploadVideoStep1Screen = () => {\n const history = useHistory();\n const { t } = useTranslation();\n const [fetching, setFetching] = useState<boolean>(false);\n\n const [teams, setTeams] = useState<Array<AutocompleteTeamsValue>>([]);\n\n const {\n register,\n control,\n watch,\n setValue,\n handleSubmit: handleFormSubmit,\n } = useForm<UploadVideoStepOneFormSchema>({\n resolver: zodResolver(uploadVideoStepOneFormSchema),\n defaultValues: uploadVideoStepOneDefaultValues,\n });\n\n const formTypeValue = watch(UploadVideoStepOneFormFields.type);\n\n const refreshTeamsData = () => {\n fetchTeams().then((res) => {\n if (res.error) {\n return;\n }\n setTeams(\n sortArray({\n data: res.data,\n key: 'name',\n asc: true,\n }).map(({ id: value, name: label }) => ({ value, label })),\n );\n });\n };\n\n useEffect(() => {\n refreshTeamsData();\n }, []);\n\n const handleNext = useCallback(\n (formValues: UploadVideoStepOneFormSchema) => {\n setFetching(true);\n // send only the values that are needed\n // (homeTeam and awayTeam are objects used in Autocomplete which have label and value properties,\n // but we only need the value for the request - this value is set in other fields - homeTeamId and awayTeamId)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { homeTeam, awayTeam, videoSource, ...requiredValues } = formValues;\n\n const uploadRecordingBody = {\n ...requiredValues,\n ...(videoSource && { videoSource }), // don't include empty value\n };\n\n fetchCreateUploadRecording(uploadRecordingBody).then((res) => {\n setFetching(false);\n\n if (res.error) {\n return;\n }\n\n const { id: recordingId } = res.data;\n history.replace(generatePath(routes.TAGGING_TOOL_UPLOAD_STEP_TWO, { recordingId }));\n });\n },\n [history],\n );\n\n const handleCancel = useCallback(() => history.replace(routes.TAGGING_TOOL), [history]);\n\n return (\n <SidebarLayout>\n <Container>\n {teams === undefined && <Spinner isFullPage />}\n\n <form onSubmit={handleFormSubmit(handleNext)}>\n {teams !== undefined && (\n <Grid container justifyContent={'center'}>\n <Grid xs={10}>\n <PageTitle>{t('tagging-tool:upload-video.form-title')}</PageTitle>\n\n <FormControl required margin='normal' fullWidth>\n <FormFormLabel>{t('tagging-tool:upload-video.recording-title')}</FormFormLabel>\n <UploadInput\n fullWidth\n size='small'\n variant='outlined'\n required\n {...register(UploadVideoStepOneFormFields.recordingTitle)}\n />\n </FormControl>\n\n <FormControl required margin='dense' fullWidth>\n <Controller\n name={UploadVideoStepOneFormFields.type}\n control={control}\n render={({ field }) => (\n <RadioGroup {...field} row>\n <FormControlLabel\n value={UploadVideoStepOneType.game}\n control={<Radio />}\n label={t('tagging-tool:upload-video.type-match')}\n />\n <FormControlLabel\n value={UploadVideoStepOneType.training}\n control={<Radio />}\n label={t('tagging-tool:upload-video.type-training')}\n />\n </RadioGroup>\n )}\n ></Controller>\n </FormControl>\n\n <UploadColumn>\n <FormControl required margin='normal' fullWidth>\n <FormFormLabel>{t('tagging-tool:upload-video.country')}</FormFormLabel>\n <UploadInput required size='small' {...register(UploadVideoStepOneFormFields.country)} />\n </FormControl>\n <FormControl required margin='normal' fullWidth>\n <FormFormLabel>{t('tagging-tool:upload-video.city')}</FormFormLabel>\n <UploadInput required size='small' {...register(UploadVideoStepOneFormFields.city)} />\n </FormControl>\n </UploadColumn>\n <FormControl required margin='normal' fullWidth>\n <FormFormLabel>{t('tagging-tool:upload-video.stadium')}</FormFormLabel>\n <UploadInput required size='small' {...register(UploadVideoStepOneFormFields.stadium)} />\n </FormControl>\n\n <FormControl required fullWidth margin='normal'>\n <FormFormLabel>{t('tagging-tool:upload-video.date')}</FormFormLabel>\n <UploadOutlinedInput\n required\n size='small'\n type='date'\n {...register(UploadVideoStepOneFormFields.date)}\n />\n </FormControl>\n\n {formTypeValue === UploadVideoStepOneType.game && (\n <>\n <FormControl required margin='normal' fullWidth>\n <FormFormLabel>{t('tagging-tool:upload-video.competition')}</FormFormLabel>\n <UploadInput\n fullWidth\n size='small'\n variant='outlined'\n required\n {...register(UploadVideoStepOneFormFields.competition)}\n />\n </FormControl>\n\n <FormControl required margin='normal' fullWidth>\n <UploadLabelWithLink>\n <FormFormLabel>{t('tagging-tool:upload-video.home-team')}</FormFormLabel>\n </UploadLabelWithLink>\n <Controller\n name={UploadVideoStepOneFormFields.homeTeam}\n control={control}\n render={({ field }) => (\n <Autocomplete\n disablePortal\n id={UploadVideoStepOneFormFields.homeTeam}\n options={teams}\n loadingText={t('common:pagination.loading')}\n {...field}\n onChange={(event, value) => {\n if (!value) return;\n setValue(UploadVideoStepOneFormFields.homeTeamId, value.value);\n return setValue(UploadVideoStepOneFormFields.homeTeam, value);\n }}\n renderInput={(params) => (\n <UploadAutocompleteTextField\n {...params}\n size='small'\n required\n placeholder={t('tagging-tool:upload-video.autocomplete-placeholder')}\n />\n )}\n />\n )}\n />\n </FormControl>\n <FormControl required margin='normal' fullWidth>\n <UploadLabelWithLink>\n <FormFormLabel>{t('tagging-tool:upload-video.away-team')}</FormFormLabel>\n </UploadLabelWithLink>\n <Controller\n name={UploadVideoStepOneFormFields.awayTeam}\n control={control}\n render={({ field }) => (\n <Autocomplete\n disablePortal\n id={UploadVideoStepOneFormFields.awayTeam}\n options={teams}\n loadingText={t('common:pagination.loading')}\n {...field}\n onChange={(event, value) => {\n if (!value) return;\n setValue(UploadVideoStepOneFormFields.awayTeamId, value.value);\n return setValue(UploadVideoStepOneFormFields.awayTeam, value);\n }}\n renderInput={(params) => (\n <UploadAutocompleteTextField\n {...params}\n size='small'\n required\n placeholder={t('tagging-tool:upload-video.autocomplete-placeholder')}\n />\n )}\n />\n )}\n />\n </FormControl>\n </>\n )}\n\n <FormControl margin='normal' fullWidth>\n <FormFormLabel>{t('tagging-tool:upload-video.video-source')}</FormFormLabel>\n <UploadInput size='small' {...register(UploadVideoStepOneFormFields.videoSource)} />\n </FormControl>\n </Grid>\n </Grid>\n )}\n <Grid display='flex' gap={2} justifyContent='center' marginTop={2}>\n <Button size='large' color='secondary' variant='outlined' onClick={handleCancel} disabled={fetching}>\n {t('common:actions.cancel')}\n </Button>\n <Button size='large' variant='contained' type='submit' disabled={fetching}>\n {t('common:actions.next')}\n </Button>\n </Grid>\n </form>\n </Container>\n </SidebarLayout>\n );\n};\n","export default \"data:image/svg+xml,%3csvg%20width='75'%20height='75'%20viewBox='0%200%2075%2075'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='75'%20height='75'%20rx='18'%20fill='%23F5F5F7'%20/%3e%3cpath%20d='M50.274%2053.637H24.628V56.7h25.646v-3.063z'%20fill='%23CECED9'%20/%3e%3cpath%20d='M24.637%2057.552H50.274c.514%200%20.953-.391.953-.85v-3.056c0-.46-.439-.851-.953-.851H24.638c-.515%200-.954.391-.954.851v3.055c0%201.098%201.907%201.098%201.907%200v-3.055l-.954.851H50.274l-.954-.851v3.055l.954-.85H24.638a.854.854%200%20000%201.701zM33.008%2049.332h8.58v-20.34h8.638L37.23%2018.158l-12.594%2011.09h8.37v20.084z'%20fill='%23CECED9'%20/%3e%3c/svg%3e\"","import { Box, LinearProgress, styled } from '@mui/material';\nimport { Colors } from 'kognia-ui';\n\nexport const UploadVideoDropArea = styled('div')(({ theme }) => ({\n alignItems: 'center',\n background: Colors.white,\n borderColor: Colors.storm,\n borderRadius: theme.spacing(2),\n borderStyle: 'dashed',\n borderWidth: '2px',\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n height: '20rem',\n justifyContent: 'center',\n marginTop: theme.spacing(2),\n}));\n\nexport const UploadProgress = styled(LinearProgress)(({ theme }) => ({\n height: theme.spacing(2),\n}));\n\nexport const UploadMessageContainer = styled(Box)(({ theme }) => ({\n margin: theme.spacing(2, 0),\n padding: theme.spacing(0, 1),\n}));\n","import { Button, Grid, Typography } from '@mui/material';\nimport { Colors, fontSizes, fontWeight } from 'kognia-ui';\nimport React, { useCallback, useState } from 'react';\nimport { useDropzone } from 'react-dropzone';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router';\nimport { useParams } from 'react-router-dom';\n\nimport { routes } from 'kognia/router/routes';\nimport UploadIcon from 'shared/assets/upload-icon.svg';\nimport Container from 'shared/components/container';\nimport { Message } from 'shared/components/message';\nimport { PageSubTitle } from 'shared/components/page-sub-title';\nimport { PageTitle } from 'shared/components/page-title';\nimport { SidebarLayout } from 'shared/components/sidebar-layout';\nimport { NotificationType, useNotifications } from 'shared/hooks/notifications';\n\nimport { UploadMessageContainer, UploadProgress, UploadVideoDropArea } from './index.styled';\nimport {\n fetchAbortMultipartUpload,\n fetchUploadMultipartVideo,\n} from '../../tagging-tool/service/taggingRecording.service';\n\nexport const UploadVideoStep2Screen = () => {\n const triggerNotification = useNotifications();\n const { t } = useTranslation();\n\n const history = useHistory();\n const { recordingId } = useParams<{ recordingId: string }>();\n\n // state\n\n const [error, setError] = useState<boolean>(false);\n const [fileName, setFileName] = useState<string>();\n const [uploading, setUploading] = useState<boolean>(false);\n const [multipartProgress, setMultipartProgress] = useState<number>(0);\n const [finished, setFinished] = useState<boolean>(false);\n const [multipartUploadId, setMultipartUploadId] = useState<string>('');\n const [abortController, setAbortController] = useState<AbortController>(new AbortController());\n\n // state: dnd\n\n const onDrop = useCallback(\n (acceptedFiles: Array<File>) => {\n if (!acceptedFiles.length) {\n return;\n }\n\n const file: File = acceptedFiles[0];\n\n const onError = () => {\n setError(true);\n setUploading(false);\n setMultipartProgress(0);\n setFinished(false);\n setFileName(undefined);\n setAbortController(new AbortController());\n };\n\n setError(false);\n setUploading(true);\n setMultipartProgress(0);\n setFinished(false);\n setFileName(file.name);\n\n fetchUploadMultipartVideo({\n recordingId,\n file,\n onInit: (uploadId) => {\n setMultipartUploadId(uploadId);\n },\n onProgress: (progress) => {\n setMultipartProgress(progress);\n },\n abortController,\n }).then((res) => {\n if (res.error) {\n return onError();\n }\n setUploading(false);\n setFinished(true);\n });\n },\n [abortController, recordingId],\n );\n\n const { getRootProps, getInputProps, isDragActive, isDragAccept, isDragReject } = useDropzone({\n onDrop,\n minSize: 1,\n maxFiles: 1,\n disabled: uploading || finished,\n accept: ['video/mp4', 'video/x-matroska', 'video/x-msvideo', 'video/quicktime', 'video/*,.mkv'],\n });\n\n // handlers\n\n const handleNext = useCallback(() => {\n triggerNotification({\n type: NotificationType.WARNING,\n message: t('tagging-tool:upload-video.processing-upload-video-warning'),\n });\n history.replace(routes.TAGGING_TOOL);\n }, [history, t, triggerNotification]);\n\n const handleCancel = useCallback(() => {\n history.replace(routes.TAGGING_TOOL);\n }, [history]);\n\n const handleCancelUpload = useCallback(() => {\n abortController.abort();\n fetchAbortMultipartUpload({ recordingId, uploadId: multipartUploadId });\n }, [abortController, recordingId, multipartUploadId]);\n\n // shortcuts\n\n const { onClick, ...rootProps } = getRootProps();\n\n return (\n <SidebarLayout>\n <Container>\n <Grid container justifyContent={'center'}>\n <Grid item xs={10}>\n <PageTitle>{t('tagging-tool:upload-video.uploader-title')}</PageTitle>\n <PageSubTitle>{t('tagging-tool:upload-video.uploader-mime-types')}</PageSubTitle>\n <UploadVideoDropArea {...rootProps}>\n <input {...getInputProps()} />\n {!isDragActive && (\n <>\n <img src={UploadIcon} alt='' />\n <Typography\n fontSize={fontSizes.default}\n fontWeight={fontWeight['500']}\n color={uploading ? Colors.storm : Colors.night}\n >\n {t('tagging-tool:upload-video.uploader-new-video')}\n </Typography>\n <Typography fontSize={fontSizes.small} color={Colors.storm}>\n {t('tagging-tool:upload-video.uploader-click-or-press')}\n </Typography>\n\n {uploading ? (\n <Button onClick={handleCancelUpload} variant='contained' color='error' size='large'>\n {t('common:actions.cancel')}\n </Button>\n ) : (\n <Button onClick={onClick as () => void} variant='contained' size='large' disabled={finished}>\n {t('tagging-tool:upload-video.uploader-button-title')}\n </Button>\n )}\n </>\n )}\n {isDragActive && isDragAccept && (\n <Typography fontSize={fontSizes.default} fontWeight={fontWeight['500']} color={Colors.storm}>\n {t('tagging-tool:upload-video.uploader-drag-accept-hint')}\n </Typography>\n )}\n {isDragActive && isDragReject && (\n <>\n <Typography fontSize={fontSizes.default} fontWeight={fontWeight['500']} color={Colors.red}>\n {t('tagging-tool:upload-video.uploader-drag-reject-hint')}\n </Typography>\n <Typography fontSize={fontSizes.default} color={Colors.storm}>\n {t('tagging-tool:upload-video.uploader-mime-types')}\n </Typography>\n </>\n )}\n </UploadVideoDropArea>\n {(uploading || finished) && (\n <>\n <UploadMessageContainer>\n {!finished && (\n <Typography fontSize={fontSizes.default} fontWeight={fontWeight['500']}>{`${t(\n 'tagging-tool:upload-video.uploading',\n {\n fileName: fileName ?? '',\n },\n )}${Math.round(multipartProgress * 100)}%`}</Typography>\n )}\n {finished && (\n <Typography fontSize={fontSizes.default} fontWeight={fontWeight['500']}>{`${t(\n 'tagging-tool:upload-video.upload-complete',\n {\n fileName: fileName ?? '',\n },\n )}`}</Typography>\n )}\n <UploadProgress variant='determinate' value={Math.round(multipartProgress * 100)} />\n </UploadMessageContainer>\n {!finished && <Message>{t('tagging-tool:upload-video.uploading-hint')}</Message>}\n </>\n )}\n {error && (\n <Typography fontSize={fontSizes.default} fontWeight={fontWeight['500']} color={Colors.red}>\n {t('tagging-tool:upload-video.upload-failed', { fileName: fileName ?? '' })}\n </Typography>\n )}\n </Grid>\n </Grid>\n <Grid display='flex' gap={2} justifyContent='center' marginTop={2}>\n {!finished && (\n <Button variant='outlined' size='large' color='secondary' onClick={handleCancel} disabled={uploading}>\n {t('common:actions.cancel')}\n </Button>\n )}\n <Button variant='contained' size='large' onClick={handleNext} disabled={uploading || !finished}>\n {t('common:actions.finish')}\n </Button>\n </Grid>\n </Container>\n </SidebarLayout>\n );\n};\n","import { useEffect } from 'react';\nimport { Redirect, Switch } from 'react-router-dom';\n\nimport { FEATURE_FLAG } from 'api/user/use-fetch-feature-flags';\nimport { routes } from 'kognia/router/routes';\nimport AccountPage from 'pages/account/AccountPageContainer';\nimport HomeContainer from 'pages/home/HomeContainer.page';\nimport LiveTaggingSessionEditPage from 'pages/live-tagging-sessions/components/live-tagging-session-edit-page';\nimport PlaylistDetailContainer from 'pages/playlist-detail/PlaylistDetailContainer.page';\nimport { PlaylistsContainer } from 'pages/playlists/PlaylistsContainer';\nimport RecordingEditPage from 'pages/recording-edit/components/recording-edit-page';\nimport RecordingPlaylistsContainer from 'pages/recording-playlists/RecordingPlaylistsContainer';\nimport RecordingsListPage from 'pages/recordings-list/RecordingsListPageContainer';\nimport { TacticalAnalysisContainer } from 'pages/tactical-analysis/TacticalAnalysisContainer';\nimport { KeypadEditPage } from 'pages/tagging-tool-keypad-edit';\nimport { KeypadListPage } from 'pages/tagging-tool-keypad-list';\nimport { TaggingToolTagContainer } from 'pages/tagging-tool-tag-recording/TaggingToolTagContainer';\nimport { ProtectedRoute } from 'shared/components/protected-route';\nimport { useIsAppSettled } from 'shared/contexts/app-state';\n\nimport useIsLanguageDetectionReady from './kognia/i18n/hooks/use-is-language-detection-ready';\nimport { BackofficeContainer } from './pages/backoffice/BackofficeContainer';\nimport { DashboardPreviewPage } from './pages/dashboard-preview/DashboardPreview.page';\nimport { PlayerProfileDashboardPage } from './pages/player-profile-dashboard/PlayerProfileDashboard.page';\nimport { RecordingAlignment } from './pages/tagging-tool-align-recording';\nimport { AlignmentSourceListContainer } from './pages/tagging-tool-aling-sources/AlignmentSourceListContainer';\nimport { TaggingToolRecordingList } from './pages/tagging-tool-recording-list';\nimport { UploadVideoStep1Screen } from './pages/tagging-tool-upload-video-step-one';\nimport { UploadVideoStep2Screen } from './pages/tagging-tool-upload-video-step-two/UploadVideoStep2Screen';\nimport { useBranding } from './shared/hooks/use-branding/useBranding';\n\nconst Routes = () => {\n const isLanguageReady = useIsLanguageDetectionReady();\n const isAppSettled = useIsAppSettled();\n const branding = useBranding();\n\n useEffect(() => {\n const favicon = document.querySelector('link[rel=\"icon\"]');\n if (isAppSettled && branding.faviconUrl && favicon && favicon.getAttribute('href') !== branding.faviconUrl) {\n favicon.setAttribute('href', branding.faviconUrl);\n }\n }, [branding.faviconUrl, isAppSettled]);\n\n if (!isAppSettled || !isLanguageReady) return null;\n\n return (\n <Switch>\n <ProtectedRoute path={routes.HOME_PAGE} component={HomeContainer} exact />\n <ProtectedRoute path={routes.RECORDING_LIST} exact component={RecordingsListPage} />\n <ProtectedRoute path={routes.RECORDING_EDIT} exact component={RecordingEditPage} />\n <ProtectedRoute path={routes.PLAYLISTS} component={PlaylistsContainer} exact />\n <ProtectedRoute path={routes.RECORDING_PLAYLISTS} exact component={RecordingPlaylistsContainer} />\n <ProtectedRoute path={routes.PERFORMANCE_REPORT_TIMELINE} component={TacticalAnalysisContainer} />\n <ProtectedRoute path={routes.RECORDING_PLAYLIST_DETAIL} component={PlaylistDetailContainer} />\n <ProtectedRoute path={routes.ACCOUNT} component={AccountPage} />\n <ProtectedRoute path={routes.TAGGING_TOOL} exact component={TaggingToolRecordingList} />\n <ProtectedRoute path={routes.TAGGING_TOOL_UPLOAD_STEP_ONE} exact component={UploadVideoStep1Screen} />\n <ProtectedRoute path={routes.TAGGING_TOOL_UPLOAD_STEP_TWO} exact component={UploadVideoStep2Screen} />\n <ProtectedRoute path={routes.TAGGING_TOOL_ALIGN_SOURCES} exact component={AlignmentSourceListContainer} />\n <ProtectedRoute\n path={[routes.TAGGING_TOOL_ALIGN_RECORDING_WITH_SOURCE, routes.TAGGING_TOOL_ALIGN_RECORDING]}\n exact\n component={RecordingAlignment}\n />\n <ProtectedRoute\n path={[routes.TAGGING_TOOL_TAG, routes.TAGGING_TOOL_RECORDING]}\n exact\n component={TaggingToolTagContainer}\n />\n <ProtectedRoute path={routes.KEYPADS_EDIT} component={KeypadEditPage} />\n <ProtectedRoute path={routes.KEYPADS} component={KeypadListPage} />\n <ProtectedRoute path={routes.LIVE_TAGGING_SESSION_EDIT} exact component={LiveTaggingSessionEditPage} />\n <ProtectedRoute onlyAdminAccess path={routes.BACKOFFICE} component={BackofficeContainer} />\n <ProtectedRoute\n component={PlayerProfileDashboardPage}\n path={routes.PLAYER_PROFILE_DASHBOARD}\n featureFlag={FEATURE_FLAG.APP_DASHBOARDS}\n />\n <ProtectedRoute\n component={DashboardPreviewPage}\n path={routes.DASHBOARD_PREVIEW}\n featureFlag={FEATURE_FLAG.APP_DASHBOARD_PREVIEW}\n />\n <Redirect to={routes.HOME_PAGE} />\n </Switch>\n );\n};\n\nexport default Routes;\n","import { useEffect } from 'react';\n\nimport { useMetrics } from 'kognia/metrics/hooks/use-metrics';\nimport { ActionTypes } from 'shared/streams/actionTypes';\nimport { applicationEvents$ } from 'shared/streams/eventEmitter';\n\nexport const useSubscribeEvents = () => {\n const { pushEvent } = useMetrics();\n\n useEffect(() => {\n const subscription = applicationEvents$.subscribe((action) => {\n if (action.type === ActionTypes.SEND_METRICS) {\n pushEvent(action.payload.name, action.payload.data);\n }\n });\n\n return () => {\n subscription.unsubscribe();\n };\n }, [pushEvent]);\n};\n","import { ErrorBoundary } from '@sentry/react';\nimport { Router } from 'react-router-dom';\n\nimport { AppTheme } from 'kognia/theme';\nimport { ErrorBoundaryPage } from 'shared/components/error-boundary';\nimport AppContext from 'shared/contexts/app-context';\n\nimport browserHistory from './browserHistory';\nimport 'kognia/i18n';\n// eslint-disable-next-line import/order\nimport Routes from './Routes';\n\nimport './App.scss';\n\nimport { useSubscribeEvents } from './shared/hooks/use-subscribe-events';\n\nfunction App(): JSX.Element {\n useSubscribeEvents();\n\n return (\n <AppTheme>\n <Router history={browserHistory}>\n <AppContext>\n <ErrorBoundary fallback={(props) => <ErrorBoundaryPage {...props} />}>\n <Routes />\n </ErrorBoundary>\n </AppContext>\n </Router>\n </AppTheme>\n );\n}\n\nexport default App;\n","import * as Sentry from '@sentry/react';\nimport map from 'lodash/map';\nimport { matchPath } from 'react-router-dom';\n\nimport { SENTRY_DSN_URL } from 'config';\nimport { routes } from 'kognia/router/routes';\nimport { Environments, getEnvironment, getReleaseVersion } from 'shared/utils/environment';\n\nimport browserHistory from '../../../browserHistory';\n\nexport const initErrorTracker = () => {\n const environment = getEnvironment();\n const sentryRoutes: Array<{ path: string }> = map(routes, (route: string) => ({ path: route }));\n\n Sentry.init({\n dsn: SENTRY_DSN_URL,\n release: getReleaseVersion(),\n integrations: [\n new Sentry.BrowserTracing({\n routingInstrumentation: Sentry.reactRouterV5Instrumentation(browserHistory, sentryRoutes, matchPath),\n }),\n ],\n environment,\n enabled: environment !== Environments.Unknown,\n tracesSampleRate: 1.0,\n });\n};\n","import { getWebInstrumentations, initializeFaro } from '@grafana/faro-web-sdk';\nimport { TracingInstrumentation } from '@grafana/faro-web-tracing';\n\nimport { GRAFANA_FARO_COLECTOR_URL } from 'config';\nimport { getEnvironment, getReleaseVersion } from 'shared/utils/environment';\n\nexport const initMetricsCollector = () => {\n initializeFaro({\n url: GRAFANA_FARO_COLECTOR_URL,\n app: {\n name: 'Kognia App',\n version: getReleaseVersion(),\n environment: getEnvironment(),\n },\n sessionTracking: {\n enabled: false,\n },\n instrumentations: [\n // Mandatory, overwriting the instrumentations array would cause the default instrumentations to be omitted\n ...getWebInstrumentations(),\n\n // Initialization of the tracing package.\n // These packages are optional because it increases the bundle size noticeably.\n // Only add it if you want tracing data.\n new TracingInstrumentation(),\n ],\n });\n};\n","import ReactDOM from 'react-dom/client';\n\nimport 'focus-visible';\n\nimport App from './App';\nimport { initErrorTracker } from './kognia/error-tracking/init';\nimport { initMetricsCollector } from './kognia/metrics/init';\nimport { APP_COLLECT_METRICS } from './kognia/metrics/utils';\n\ninitErrorTracker();\nAPP_COLLECT_METRICS && initMetricsCollector();\n\nconst root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);\n\nroot.render(<App />);\n"],"names":["AppTheme","children","jsx","StyledEngineProvider","ThemeProvider","theme","apiHost","queryClient","QueryClient","define_import_meta_env_default","generateQueryParamsFromOptionsAndFilters","options","filters","reduce","result","filter","key","FeatureFlagsUrl","matchWithEpisodesUrl","recordingId","liveTaggingSessionAsMatchUrl","liveTaggingSessionId","tacticalAnalysesAsItems","tacticalAnalysisWithFilters","tacticalAnalysisId","tacticalAnalysesFilters","recordingIds","queryString","keypadsUrl","keypadUrl","id","keypadCopyUrl","keypadTagsUrl","keypadId","deleteKeypadTagsUrl","tagId","playlistsUrl","playlistUrl","duplicatePlaylistUrl","playlistId","recordingPlaylistsUrl","includeEmpty","tacticsInRange","downloadPlaylistUrl","joinSources","showOverlays","showTitles","downloadClipsUrl","downloadEffectiveTimeVideosUrl","playlistsWithFiltersUrl","playlistItemsBaseUrl","deletePlaylistItemUrl","playlistItemId","deletePlaylistItemsUrl","updatePlaylistItemUrl","postManyPlaylistItem","duplicatePlaylistItemsUrl","downloadPlaylistXmlUrl","playlistPreview","initiateMultipartUploadUrl","getMultipartUploadUrl","uploadId","partNumber","partLength","completeMultipartUploadUrl","abortMultipartUploadUrl","recordingsBaseUrl","recordingsListUrl","specificRecordingUrl","recordingsByNameUrl","tacticalAnalysesBaseUrl","invalidateTacticalAnalysisUrl","validateTacticalAnalysisUrl","taggingRecordingsBaseUrl","liveSessionsWithFiltersBaseUrl","liveSessionsWithFiltersUrl","taggingEventBaseUrl","matchOrLiveTaggingEventsUrl","isLive","matchTaggingEventUrl","taggingEventId","cropTaggingEventUrl","editAllAlignmentsUrl","alignAllWithRecordingUrl","liveTaggingSessionsBaseUrl","liveTaggingSessionUrl","importTaggingEventUrl","exportTaggingEventUrl","teamUrl","userBatchClientIdsUrl","userAuth0Url","userUrl","usersWithFiltersUrl","loginUrl","LogoutUrl","AccountUrl","getOauth2LoginUrl","path","returnTo","ENVIRONMENT","XMLDownloadUrl","isEffectiveTime","clientBaseUrl","clientEditUrl","clientsWithFiltersUrl","clientBrandingUrl","clientId","userPresetsBaseUrl","userPresetsWithFiltersUrl","scope","ref","dashboardGuestToken","dashboardId","HTTPMethod","axios","useBackendApi","url","requestType","onSuccess","params","handleError","error","response","e","ICON_SIZES","SvgIconContainer","styled","MuiSvgIcon","prop","isButton","size","themeBaseSpacing","SvgIcon","htmlColor","color","restProps","useTheme","IconClose","props","NotificationType","DEFAULT_AUTO_HIDE_TIME","ERROR_AUTO_HIDE_TIME","getAutoHideDurationFromNotificationType","type","useNotifications","isMobile","useMediaQuery","enqueueSnackbar","closeSnackbar","useSnackbar","closeButton","IconButton","message","persist","useFetchRequest","queryRef","onError","onSettled","transformer","transformerData","errorMessage","successMessage","data","method","triggerNotification","useQuery","logoutRedirect","useLogOutAccount","t","useTranslation","routesPrefixes","routes","routesSectionsList","routesSections","queryParams","getIsFormTag","tagName","IconChevronDown","IconDone","registerTrackedUser","user","Sentry.setTag","Sentry.setUser","unregisterTrackedUser","Sentry.configureScope","clientBaseSchema","object","string","clientBrandingSchema","clientSchema","UserAuthority","PAGE_STATES","pageStateMachine","createMachine","usePageStateMachine","dataFetching","isError","isFetching","isSuccess","isMissingData","refetch","isInvalidDataClient","current","send","useMachine","useEffect","isPageReady","isPageLoading","isPageError","isPageNotFound","isPageMissingData","isInvalidClient","defaultUserState","defaultFeatureFlagsState","USER_ATOM_KEY","IS_AUTHORIZED_ATOM_KEY","CURRENT_CLIENT_ID_ATOM_KEY","FEATURE_FLAGS_ATOM_KEY","APP_STATE_ATOM_KEY","userAtom","atom","isAuthorizedAtom","currentClientIdAtom","featureFlagsState","appState","transformUser","authority","useFetchAccount","useMemo","fetchRequest","setQueryData","useCallback","transformFeatureFlags","featureFlags","FEATURE_FLAG","FEATURE_FLAGS_VALUES","LOCALHOST_HOSTNAME","useFetchFeatureFlags","fetchQueryRef","useAppData","onAuthorizationError","fetchAccount","fetchFeatureFlags","IconLoading","Spinner","className","isFullPage","sx","classNames","styles","animations","AppLoading","isLoaded","Backdrop","useClientId","updateClientId","useRecoilState","setClientId","newClientId","Cookies","useClientIdValue","useRecoilValue","useUnauthorize","setAppState","useSetRecoilState","setUserState","setIsAuthorized","setFeatureFlagState","AppStateProvider","setUser","setFeatureFlags","logout","setCurrentClientId","isAppSettled","jsxs","Fragment","useFeatureFlag","featureFlag","useIsAppSettled","status","useUser","isUserAdmin","useUserActiveClient","currentClientId","client","useIsUserAuthorized","openSidebarWidth","collapsedSidebarWidth","openedMixin","closedMixin","SidebarLayoutSidebar","MuiDrawer","open","SidebarLayoutWrapper","Box","SidebarLayoutContent","Colors","UserAvatar","SidebarLogoWrapper","spacingBottom","SidebarHeader","LIST_ITEM_HEIGHT","VISIBLE_CLIENTS_AMOUNT","PADDING","LIST_HEIGHT","ClientDropdown","isSidebarOpen","anchorEl","setAnchorEl","useState","searchValue","setSearchValue","history","useHistory","hideText","isLimitedListHeight","currentClientName","_a","handleClick","event","handleClose","handleListItemClick","handleChange","clients","Tooltip","Button","Popover","TextField","Divider","List","name","ListItem","fontSizes","KogniaLogoSmall","KogniaLogotype","KogniaFavicon","useCurrentClient","useBranding","currentClient","LogoImg","LogoImgSmall","SidebarLogo","isSmall","branding","useRedirectTo","link","MenuItem","MenuButton","ListItemButton","MenuIcon","ListItemIcon","SubMenuItem","bottomDivider","SubMenuButton","SubMenuPaper","Paper","Menu","routesValues","findRouteByLink","route","matchPath","isMatchingRoute","currentLocation","currentMatchedRoute","currentMatchedLink","isMatchingAnyMenuItemLinkRoute","itemLinks","isMatchingSection","currentRouteSection","getMenuItemSelected","ListItemTextStyles","SidebarMenuItem","item","isSelected","onClick","useRef","isMenuItemSelected","handleOnClick","ListItemText","SidebarMenuItemTitle","Stack","SidebarMenuItemWithOptions","isMenuOpen","setIsMenuOpen","popperRef","setPopperRef","redirectTo","handleOnClose","subMenuLinks","MenuItemType","isMenuSelected","handleSubMenuClick","Popper","TransitionProps","Grow","ClickAwayListener","subMenuItem","index","SidebarMenu","menuItems","isAdmin","allowedMenuItems","handleItemClick","sidebarOpenState","useSidebar","setIsSidebarOpen","toggleSidebar","IconWhistle","SwitchEnvironmentBackground","ContainerWrapper","backgroundImage","backgroundSize","backgroundColor","Content","fullScreen","IconCircleBackground","ErrorContainerWrapper","ErrorContainerContent","ErrorContainerTitle","Typography","fontWeight","ErrorContainerText","ErrorContainerButton","ErrorContainerLink","Link","ErrorContainerImage","ErrorContainer","handleRefreshPage","PageBackground","Trans","IconBall","IconDashboard","IconDoubleArrowLeft","IconDoubleArrowRight","IconHome","IconInfo","IconKeypadEmpty","IconPlaylist","IconTag","IconTutorial","IconUser","DialogBackdrop","disableBackground","DialogCloseButton","Dialog","disableBackdropOnClose","onClose","rest","MuiDialog","IconArrowLeft","IconArrowRight","IconMinus","IconPlus","IconScrollDown","IconScrollUp","KeyboardKeyOptions","KeyboardKeyOptions2","KeyboardKeyContainer","KeyboardKey","keyItem","SingleShortcut","keys","shortcut","KeyboardShortcut","isArray","keysGroups","keyGroup","isLast","getIsMacOS","userAgent","KeyboardShortcutsModal","isOpen","isMacOs","keyboardShortcutsList","sectionItem","shortcutsList","shortcutItem","DialogTitle","DialogContent","SidebarLayoutComponent","isKeyboardShortcutsModalOpen","setIsKeyboardShortcutsModalOpen","showAppDashboards","showAppDashboardPreview","firstName","lastName","avatarUrl","logOutUser","handleDrawerChange","handleKeyboardShortcutsModalOpen","handleKeyboardShortcutsModalClose","toggleKeyboardShortcutsModal","prev","handleKeyDown","primaryMenuItems","items","dashboardPreviewItem","dashboardItem","footerMenuItems","accountMenuItems","spacing","SidebarLayoutWithErrorBoundary","ErrorBoundary","ErrorPage","SidebarLayout","ErrorBoundaryPage","errorPageId","setErrorPageId","location","useLocation","ApiQueryProvider","QueryClientProvider","ReactQueryDevtools","AppContext","RecoilRoot","SnackbarProvider","browserHistory","createBrowserHistory","Locales","Namespaces","translations","account","api","common","createTeam","descriptions","forms","fundamentals","home","languages","playlistDetail","playlists","recording","recordingEdit","recordingsList","recordingPlaylists","recordings","sharePlaylistModal","switchEnvironment","taggingTool","timeline","tutorials","videoPlayer","faqs","namespaces","resources","enUS","esES","deDE","initConfig","i18n","initReactI18next","LanguageDetector","Input","inputRef","label","suffix","autoSelect","useLayoutEffect","classnames","InputList","disabled","onSelect","selectedOption","option","Select","AccountForm","languageOptions","getSelectedLocale","locale","selectedLocale","Alert","Container","AccountPageContainer","SolutionCardVariants","SolutionSvgIconContainer","IconMatchAnalysis","IconPlaylists","IconTaggingTool","LinkWithExternal","to","SolutionCardWrapper","variant","SolutionCard","SolutionActionDescription","SolutionCardContainer","Solutions","Grid","generatePath","HomeContainer","useAppQueryClient","generateLiveSessionRef","useFetchLiveTaggingSession","useUpdateLiveTaggingSession","onPatchSuccess","updateLiveTaggingSession","useMutation","updatedLiveTaggingSession","updateParams","LiveTaggingSessionEditForm","initialData","onCancel","onSubmit","liveTaggingSessionData","setLiveTaggingSessionData","onChange","isEqual","LiveTaggingSessionEditPage","redirectToRecordingListPage","recordingListPath","sendLiveTaggingSessionUpdate","setIsPageReady","showLoading","showPage","showError","LiveTaggingSessionEditContainer","DialogActionsWrapper","DialogActions","DialogContentWrapper","DialogTextVariants","DialogContentTextWrapper","MuiDialogContentText","textVariant","DialogContentText","textAlign","DialogHeaderWrapper","MuiDialogTitle","letterSpacing","DialogIcon","DialogHeader","icon","IconChevronRight","useCommonResourceClients","clientIds","acc","ClientButton","ClientButtonsWrapper","SwitchEnvironment","resourceClientsIds","setNewClientId","commonClients","isLoading","handleEnvironmentSwitch","handleClientChange","debounce","isSingleSelection","PLAYLIST_ITEM_GAP","PLAYLIST_ITEM_WIDTH","PLAYLIST_ITEM_HEIGHT","PLAYLIST_ITEM_FULL_WIDTH","PLAYLIST_TIMELINE_HEIGHT","PLAYLIST_TIMELINE_HEADER_HEIGHT","PLAYLIST_HEADER_HEIGHT","PLAYLIST_VIDEO_PLAYER_HEIGHT","PlaylistVideoPlayerContainer","PlaylistDetailSkeleton","Skeleton","RecordingTypes","TacticalAnalysisStates","VideoSourceStates","ViewTypes","PlayBackTypes","getVODTacticalCameraVideo","videoSources","source","getVODPanoramaVideoSource","getVODUploadedVideoSource","defaultEmptyVideoSource","getDefaultVideoSource","getVideoSources","iso8601DurationToSeconds","duration","regex","matches","days","hours","minutes","seconds","round","memoize","time","MatchSegmentTypes","enrichEpisodesWithName","episodes","a","b","episode","idx","defaultMatchSegments","enrichSegmentMatchStarts","segments","matchSegment","filteredEpisodes","episodeStartTime","episodeEndTime","generateMatchSegments","transformFilters","eventsStarting","map","eventsEnding","scenarios","scenario","offensiveTactics","tactic","defensiveTactics","_b","sortByJerseyNumber","player1","player2","matchPlayer1Number","matchPlayer2Number","teams","team","teamId","player","playerId","transformScenariosOrTacticsInside","filtersScenariosOrTacticsInside","tactics","transformFiltersForRequest","transformRecordingVideoSources","video","transformMatchWithEpisodes","match","defaultVideoSource","recordingMatch","segment","recordingEpisodes","RecordingAnnotationTypes","RecordingFilters","mapAnnotationTypeFilters","allAnnotationFiltersApplied","newAnnotationTypeFilterOptions","transformRecording","r","isProcessingVideo","videoSourceState","transformEditRecording","transformRecordingByName","transformRecordings","transformPlaylistItem","playlistItem","recordingHasHomographies","episodeVideo","transformPlaylist","recordingsByName","recordingItem","filterKey","optionKey","transformPlaylists","generateFetchPlaylistQueryRef","fetchPlaylistQueryRef","invalidatePlaylistQuery","usePlaylist","transformUserPreset","invalidateUserPresetsQuery","useUserPresets","prefix","UserPresetScope","USER_PRESET_KEYS","playlistMultimatchAppliedFilters","CHUNKS_QUANTITY_TO_STORE","getChunksToKeep","currentChunkNumber","nextChunkNumber","chunksToKeep","chunksQuantityToRemove","chunksCleaned","value","validateChunkData","state","DEFAULT_CHUNK_SIZE","DEFAULT_DATA","DEFAULT_META_DATA","INITIAL_STATUS","INITIAL_FRAME_INFO","reducer","action","initStore","store","createStore","QUALITY_TO_SCALE_FACTOR","INITIAL_QUALITY","getState","setState","chunkNumber","payload","renderScale","frameInfo","preloadData","currentFrame","chunkSize","isNextChunkLoaded","shouldPreloadNextChunk","getChunkNumberFromFrameAndChunkSize","frame","getVideoScale","videoWidth","newWidth","makeFetch","headers","fetchInterface","transformTimeSeries","timeSeries","homographies","series","ReferenceType","loadMetaData","domainUrl","overlayMetaData","Duration","loadChunk","startFrame","endFrame","overlayTactics","trajectories","scaleMatrix","matrix","matrixScale","videoScale","upscaleMatrix","adjustedByVideoScale","multiply","transformHomographyIntoMatrix3d","h","Quality","CHUNK_SIZE","OverlayGenerator","config","__publicField","OverlayRenderer","container","currentFrameChunkNumber","isCurrentFrameChunkLoaded","metaData","videoSourceSize","recordingData","overlayElementsMetaData","quality","updatedMetadata","resultMetaData","async","scaledMatrix","__decorateClass","LogEvent","Events","Time","cache","useOverlayGeneratorById","generator","useStore","create","useOverlayGenerator","overlayGenerator","frameRate","isReady","createAnimation","callback","Konva","changeQuality","OverlayElementNames","PlayingModes","TacticsVariants","RecordingsFiltersEventsSchema","z","RecordingFiltersTacticSchema","RecordingFiltersTacticsSchema","RecordingFiltersScenariosOrTacticsInsideSchema","RecordingsFiltersSchema","PLAYBACK_RATES","PLAYBACK_RATES_VALUES","ZOOM_LEVELS","ZOOM_LEVELS_VALUES","selectedTacticsValidateData","PRESET_SCHEMA","validateWithSchema","schema","getPreset","preset","playlistMultimatchAppliedFiltersAtom","atomFamily","useSetPlaylistMultimatchAppliedFilters","usePlaylistMultimatchAppliedFilters","useMultimatchAppliedFiltersPreset","setPlaylistMultimatchAppliedFilters","fetchUserPresets","usePlaylistPage","playlist","TACTICAL_CAMERA_WITH_OVERLAYS_PLAYING_MODE","TACTICAL_CAMERA_WITHOUT_OVERLAYS_PLAYING_MODE","PANORAMIC_PLAYING_MODE","EPISODES_PLAYING_MODE","PLAYLIST_WITH_OVERLAYS_PLAYING_MODE","PLAYLIST_WITHOUT_OVERLAYS_PLAYING_MODE","getPlayingMode","playingMode","mode","useEffectiveTime","DEFAULT_TACTICAL_CAMERA_PLAYING_MODE","findEpisodeForPlaylistItem","startTime","endTime","episodeClips","episodeClip","generateFullMatchVideoSource","fullMatchVideo","generatePlaylistVideoSource","generateVideoSourcesFromVideoTypes","episodesVideos","useCustomOverlays","hasEpisodes","isEmpty","hasTacticalCameraVideo","hasUploadedVideo","hasPanoramaVideo","useMapVideos","customOverlaysFeatureFlag","playlistItemRecording","videoTypes","VIDEO_PLAYER_MACHINE_ID","PLAYER_STATES","READY_STATES","PLAYER_ACTIONS","currentTime","playerStatus","isPlaying","playlistDefault","isInStandBy","videoPlayerStateAtoms","isFullMatchVideo","getVideoByVideoType","preferredVideoType","videoType","videoTypeWithOverlays","isAnyVideoTypeWithSources","getVideoSourceByIndex","videoSourceIndex","getCurrentVideoSource","context","currentSelectedPlayingMode","getClosestMatchingVideoSourceIndex","matchTime","currentVideoIndex","newVideoIndex","getCurrentTimeAndVideoSourceIndex","videoSource","isFullMatch","foundVideoIndex","areAllOverlayTacticsSelected","playlistItems","areOverlaysReady","useSetAreOverlaysReady","useVideoPlayerId","useAreOverlaysReady","useSetOverlaysFrameInfo","useOverlaysFrameInfo","useRenderFrameRate","useOverlaysController","videoPlayerContainerRef","useCurrentPlaylistItem","videoPlayerRef","useVideoPlayerRef","setAreOverlaysReady","setOverlaysFrameInfo","actions","useVideoPlayerActions","matrix3dTransformation","setMatrix3dTransformation","handleUpdateFrame","videoPlayerWidth","videoPlayerHeight","overlayContainer","matrix3d","handleVideoTimeUpdate","videoFrame","videoPlayerContainer","update","observer","usePlayerSetIsPlaying","usePlayerSetPlaylist","usePlayerUpdateStandBy","useSetCurrentTime","useGetCurrentTime","usePlayerState","getCurrentPlaylistItemTime","absoluteCurrentTime","isFullMatchNotEffectiveTime","adjustedStartTime","getVideoPlayerFixedStateContext","hookName","React","VideoPlayerStateFixedContext","useVideoPlayerContainerRef","usePlayerCurrentSource","useCurrentVideoSourceDuration","useVideoPlayerPlayingMode","useCurrentPlaylistItemId","useVideoPlayerPlaylistItem","currentPlaylistItem","useDuration","useIsSeeking","seeking","usePlayerContext","useIsBuffering","showCustomOverlaysFlag","useRouteMatch","buffering","useVideoPlayerIsPlaying","useVideoPlayerIsInStandBy","useVideoPlayerState","readyState","get","usePlaylistCurrentPlaylistItemId","useIsCurrentPlaylistItem","usePlaylistItems","useCurrentPlaylistItemVideoSources","useCurrentVideoSourceIndex","useCurrentVideoSource","useCurrentVideoSourceTime","nonReactiveCurrentMatchTimeAtomFamily","useNonReactiveCurrentTime","getCurrentTimeByVideoSource","currentVideoSource","hasMultipleVideoSources","useCurrentMatchTime","mutableMatchTime","useCurrentTime","CHANGE_SOURCE_STATES","CHANGE_SOURCE_ACTIONS","isSameVideoSource","_c","isVideoSourceReady","isCurrentSource","_e","_d","_g","_f","isCurrentTime","correction","timeDifference","isInStartTime","_h","sendParent","changeSourceMachine","createActions","autoplayNextPlaylistItem","tryToKeepCurrentTime","autoplay","percent","initialStartTime","autoPlay","playlistItemsIds","CONTROLS_THROTTLE_TIME","useGenerateVideoPlayerActions","throttlePlay","throttle","throttlePause","throttlePreviousPlaylistItem","throttleNextPlaylistItem","throttlePreviousVideoSource","throttleNextVideoSource","throttleRemovePlaylistItem","throttleTogglePlaying","throttleSkipForward5s","throttleSkipBackward5s","throttleJumpToTimeInMatch","throttleJumpToTimePercentage","getNextPlaylistItem","nextVideoIndex","getPreviousPlaylistItem","previousVideoIndex","getVideoSourceIndexAndTimeFromPlaylistTime","timeInVideoSource","getVideoSourceIndexAndTimeFromMatchTime","timeInMatch","isPlayingSelectionNotEffectiveTime","x","diff","getVideoSourceIndexAndTimeFromPercentTime","timeInPercentage","secondInPercent","isPaused","isLastVideoSource","isLastPlaylistItem","isFirstPlaylistItem","isPlaylistEmpty","isPlayerNotReady","isPlayerReady","isNotLastPlaylistItem","shouldAutoplayNextPlaylistItem","isCurrentPlaylistItem","_event","hasPlaylistItemNoDuration","jumpToPlaylistItem","selectedVideoType","jumpToVideoSource","AsyncQueue","task","currentTask","playerPlayingControlQueue","replacePlayListItemByIndex","array","ret","SKIP_STEP_SIZE","skipTime","currentSourceTime","nextVideoSource","assign","nextVideoSourceIndex","previousVideoSource","previousVideoSourceIndex","restart","seekNewTime","jumpToMatchTime","setVideoRef","getValidCurrentTime","newTime","addPlaylistItems","isCurrentPlaylistEmpty","playingItem","currentPlaylistItemId","updatedPlaylistItem","updatePlaylistItem","playlistItemIndex","EMPTY_PLAYLIST","updatePlaylistItems","setPlaylistItems","currentPlayingMode","currentMatchTime","initialTime","videoIndex","setPlayerToPlay","setResumeStandBy","setStandBy","toggleFullScreen","setPlayerToPause","reorderPlaylistItem","reorderedPlaylistItems","arrayMoveImmutable","changeAutoplayNextPlaylistItem","findNearestPlaylistItem","changePlayingMode","oldVideoSource","removePlaylistItem","modifiedPlaylistItems","newCurrentVideoIndex","removePlaylistItems","setPlaylistItem","play","pause","skipForward","skipBackward","nextPlaylistItem","firstPlaylistItem","previousPlaylistItem","canDurationToPlaylistItemBeChanged","hasHomographies","addDurationToPlaylistItem","fixPlaylistItemWithoutNoDuration","adjustedPlaylistItem","defaultPlayerState","playerStateMachine","usePlayerStateMachine","setPlayerState","setIsPlaying","setPlaylist","setIsInStandBy","playerContainerRef","setCurrentTime","createContext","VideoPlayerStateProvider","refreshData","useUpdatePlaylist","patchUrl","updatePlaylist","updatedPlaylist","bulkMode","bulkSelectedItems","useIsBulkModeActive","useSetIsBulkModeActive","PlaylistActions","PlaylistContainerGrid","IconTime","formatDuration","shortForm","mins","secs","secondsAsDuration","BadgeText","PlaylistDetails","PlaylistHeaderGrid","PlaylistTimelineContainer","PlaylistTimelineHeader","boxShadows","useMutationRequest","isFunction","useDownloadPlaylist","mutate","useDownloadPlaylistItems","useDownloadPlaylistXml","downloadXmlFile","blob","blobURL","downloadLink","IconDownload","DownloadModalWrapper","DOWNLOAD_TYPE","DOWNLOAD_BUTTON_MIN_WIDTH","DownloadPlaylistItemsModal","isPlaylistDownload","itemsToDownload","setShowOverlays","downloadTypeValue","setDownloadTypeValue","setShowTitles","exportXml","setExportXml","downloadPlaylist","downloadPlaylistItems","downloadPlaylistXml","isSinglePlaylistItemDownload","handleSubmit","handleDownloadTypeChange","handleShowOverlaysChange","handleTitleChange","showTitle","handleExportXml","exportXmlChecked","Modal","FormControl","RadioGroup","FormControlLabel","Radio","FormGroup","Checkbox","DownloadCurrentPlaylistItemModal","EnableBulkModeButton","playingItems","enabledBulkMode","setEnabledBulkMode","handleSelectClick","createSelectFundamentalsPayload","playlistItemIds","fundamentalsSelected","createTrimItemsPayload","before","after","useBatchUpdatePlaylistItems","IconOverlays","overlayPanelOpenState","useIsOverlayPanelOpen","overlayPanelSelectedTab","useOverlaySelectedTab","useSetOverlaySelectedTab","useSetIsOverlayPanelOpen","isOverlayPanelOpen","setIsOverlayPanelOpen","CheckboxWithCustomColor","MuiCheckbox","customColor","Tabs","MUITabs","TabPanelContainer","TabPanel","other","TabsPanel","TacticCheckBox","selected","isAvailableInFrame","handleToggleTactic","IconChevronLeft","Panel","PanelContent","width","animationDurations","PanelTitle","PanelSectionTitle","IconChevron","ClosedPanelButton","OverlaySelectorContent","availableTactics","initialSelectedTactics","frameTactics","onTacticsChange","selectedTab","setSelectedTab","selectedTactics","availableOffensiveTactics","availableDefensiveTactics","selectedOffensiveTactics","selectedDefensiveTactics","handleTabChange","newValue","handleTacticToggle","tacticId","areAllOffensiveTacticsSelected","areAllDefensiveTacticsSelected","handleToggleAllOffensiveTactics","handleToggleAllDefensiveTactics","Tab","MAX_PANEL_WIDTH","MIN_PANEL_WIDTH","OverlaySelectorPanel","onIsOverlayPanelOpenChange","setIsOverlayPanelOpenState","handlePanelToggle","panelWidth","useBulkSelectedItems","useSetBulkSelectedItems","useActivePlaylistItemIds","isBulkModeActive","bulkSelectedPlaylistItems","selectedPlaylistItems","transformTactics","tacticsList","playlistItemsTactics","useTacticsInRange","getTacticsInRange","useSelectedItemsOverlayTactics","overlayTacticsAndSelectedItems","setOverlayTacticsAndSelectedItems","PlaylistOverlaysSelectorPanelFeature","readOnly","videoPlayerId","mapVideos","handleReplacePlaylistItem","updateBatchPlaylistItems","handleToggleTacticReadOnly","useDeletePlaylistItems","useDuplicatePlaylistItems","ItemsListBulk","ItemsListContainer","NotFoundImg","PlaylistItemsListEmptyImg","PlaylistItemsEmpty","PlaylistBulkButtonBase","ButtonBase","PlaylistBulkButton","IconComponent","iconColor","iconSize","useAddManyToPlaylist","useDates","parseBackendDateString","dateString","dateToString","date","dateAndTimeToString","dateToTime","parseDateForApi","guid","s4","SortDirection","PlaylistSortOptions","PlaylistFiltersNames","INITIAL_PLAYLISTS_FILTERS","playlistFilters","usePlaylistsFilters","useSetPlaylistsFilters","getTotalElementsFromPage","pages","getFilters","getPlaylistItems","page","AUTOCOMPLETE_PAGE_SIZE_INITIAL","AUTOCOMPLETE_PAGE_SIZE_SEARCH","getTimelinePlaylistPageSize","nameParam","PAGE_SIZE","NAME_SEARCH_LENGTH_LIMIT","FETCH_PLAYLIST_QUERY_KEY","invalidatePlaylistsQuery","usePlaylists","initialFilters","refetchInterval","enabled","isAutocomplete","appliedFilters","setFilters","pageSizeParam","setPageSizeParam","useInfiniteQuery","lastPage","invalidateQuery","setName","setTypes","setCompetitions","competition","setDateRange","from","setSort","sort","sortDirection","filterActions","removePlaylistItemFromList","NotificationLink","generateFetchPlaylistsQueryRef","useCreatePlaylist","handleAddToPlaylistSuccess","translation","res","IconAddFolder","MenuItemNewPlaylist","showForm","setShowForm","inputValue","setInputValue","createPlaylist","handleInputChange","useAutocompleteStyles","makeStyles","IconSearch","specialKeysCodes","DEFAULT_RESULTS_HEIGHT","DEFAULT_INPUT_WIDTH","DEFAULT_LIST_WIDTH","CONTAINER_PADDING","DEBOUNCE_TIME","Autocomplete","autoFocus","getItemLabel","getOptionDisabled","inputWidth","listWidth","multiple","placeholder","renderOption","renderTags","resultsHeight","resultsNoMatches","updateValue","PopperComponent","autoHighlight","PaperComponent","isOptionEqualToValue","useInputChange","onBlur","onKeyUp","onSearchTermChange","onFocus","fetchNextPage","autocompleteKey","setAutocompleteKey","autocompleteClasses","loadNextPageOnScrollEnd","target","handleOnChange","searchTerm","handleOnKeyUp","handleOnKeyDown","renderInput","style","listProps","handleAutocompleteOnChange","reason","AutocompleteMUI","SearchPlaylistResults","SearchPlaylistResultsPopOver","Card","PopperWrapper","SearchItemClipsCount","SearchPlaylistAutocomplete","onUpdateValue","onKeyDown","onClickElement","title","showResultsInPopOver","setSearchTerm","isActive","setIsActive","handleTermChange","handleOnFocus","handleOnBlur","handleOnSubmit","PlaylistResultsComponent","PlaylistResultsPopOverComponent","createElement","handleUpdateValue","PlaylistMenuVerticalPosition","PlaylistMenuHorizontalPosition","AutoCompleteWrapper","PLAYLIST_ID","SelectPlaylistDialog","onPopoverClose","onClickItem","verticalPosition","horizontalPosition","openPopover","CopyToDialog","addManyToPlaylist","handleAddToPlaylistSettle","handleCopyToPlaylist","SelectedItemsCopyToDialog","selectedItems","anchor","moveTo","arrayToReorder","reorderedArray","useUpdatePlaylistItemOrder","newIndex","reorderedItems","useHandleSelect","setSelectedItems","filteredItems","PlaylistItemsList","forwardRef","Row","AutoSizer","height","useDeletePlaylistItem","useUpdatePlaylistItem","values","useHandleSetPlaylistItem","useHandlePlaylistItemClick","handleSelectItem","handleSetPlaylistItem","PlaylistItemWrapper","isCurrent","isDeleting","isEditing","isDisabled","isDraggable","getPlaylistItemFirstVideoSource","generateCopyToPlaylistItem","playlistItemVideoSource","ContentBottomRow","ContentTopRow","CounterBadge","ItemContentWrapper","IconPlay","IconVerticalMenu","MenuList","anchorOrigin","transformOrigin","Fade","defaultTriggerComponent","KebabMenu","triggerComponent","disableButtonPadding","menuId","menuOptions","IconPause","PlayButton","isEnded","handlePause","handlePlay","ProgressBar","useMotionValue","widthPercent","useMotionTemplate","currentPercent","motion","PlaylistItemProgressBar","isVisible","PlaylistItemContent","showProgressBar","isEditingMode","getMenuOptions","isChecked","kebabRef","ConfirmPopoverDialog","cancelLabel","confirmLabel","description","onConfirm","setIsOpen","buttonColor","handleCancel","handleConfirm","IconAnalysis","IconBackward","IconBackward5","IconCamera","IconChevronUp","IconCopy","IconDefense","IconDelete","IconEdit","IconExport","IconFilter","IconFolder","IconForward","IconForward5","IconFullScreen","IconKeyboard","IconKeypad","IconOffense","IconOpenIn","AscArrowPath","DescArrowPath","StyledAscPath","order","StyledDescPath","IconOrder","svgProps","IconPlaySpeed","IconReplay","IconSave","IconShare","IconShield","IconSort","IconStar","IconStrawberry","IconSync","IconTimeline","IconTransition","IconTrim","IconCopyTo","useUserPlaylistItemOptions","setTrimmingPlaylistItem","setCopyToAnchor","setIsOpenRenameDialog","setIsOpenDeleteDialog","setIsDownloadModalOpen","onPlaylistItemDuplicate","duplicatePlaylistItems","downloadPlaylistFeatureFlag","handleDuplicate","handleOpenCopyToDialog","handleGoToTimeline","hasOverlays","overlayOption","RenameDialog","inputName","setInputName","handleNameChange","palette","UserPlaylistItem","memo","onPlaylistItemDelete","copyToAnchor","isDeleted","setIsDeleted","isDownloadModalOpen","isOpenRenameDialog","isOpenDeleteDialog","deletePlaylistItem","handleUpdatePlaylistItem","handleRenameDialogClose","handleCloseCopyToDialog","handleCloseDownloadModal","controls","useAnimation","handleConfirmDelete","SortableItemList","onOrderChange","onDragStart","onDragEnd","renderClone","renderChildren","isDropDisabled","direction","handleDragStart","handleDragEnd","DragDropContext","Droppable","droppableProvided","provided","SortableItem","isDragDisabled","Draggable","draggableProvided","SortablePlaylistItemsList","trimmingPlaylistItemId","handleSelect","updatePlaylistItemOrder","onOrderChangeStart","onOrderChangeEnd","onPlaylistOrderChange","handleOrderChange","currentIndex","handlePlaylistItemDuplicate","handlePlaylistItemDelete","PlaylistItemElement","VirtualizedList","handleRenderClone","snapshot","rubric","DialogButtonContainer","noHeader","hasIcon","DialogNew","hiddenActions","buttonCancelText","buttonSubmitText","submitDisabled","buttonFormId","InputAdornment","css","TextFieldWithHiddenArrows","ControlButton","defaultInputProps","isNumber","number","NumberField","valueProp","setValue","inputSettings","simulateChangeEvent","customValue","handleIncrement","handleDecrement","trimFormId","TrimFormFieldsNames","trimFormSchema","MINIMUM_SECONDS","MAXIMUM_SECONDS","SECONDS_INPUT_CONTAINER_WIDTH","TrimModal","itemsToTrim","formRef","videoPlayerActions","control","isDirty","useForm","zodResolver","Controller","field","UserPlaylistItemsList","deleteModalOpen","setDeleteModalOpen","trimModalOpen","setTrimModalOpen","copyToModalOpen","setCopyToModalOpen","deletePlaylistItems","downloadRef","copyToRef","deleteRef","allItemsSelected","selectAllIndeterminate","handleSelectAll","handleTrimModalOpen","handleTrimModalClose","handleTrimClick","handleDuplicateAll","handleDeleteAll","handleSetDisabledBulkMode","handleSetDownloadModalOpen","handleCloseDeleteModal","handleCloseCopyToModal","handleOpenCopyToModal","handleOpenDeleteModal","generateQueryRef","useTacticalAnalysesFilters","TIMELINE_DEFAULT_FILTERS","defaultRecordingsFiltersEvents","defaultRecordingsFiltersTactic","category","defaultRecordingsFiltersTactics","defaultRecordingFiltersScenariosOrTacticsInside","useTacticalAnalysesPlaylistItems","useSaveUserPreset","timelinePlayingModePreset","timelineSelectedTacticsPreset","timelineZoomPreset","timelineHeightPreset","timelinePinScenariosPreset","timelineHeadersWidthPreset","timelineAppliedFiltersPreset","timelineTimePreset","timelineTeamIdFocus","timelineShowBallPossession","timelineShowNoBallPossession","videoPlayerSpeedPreset","PlaylistCommonUserPreset","PlaylistMultimatchAppliedFiltersPreset","CommonUserPreset","TimelinePlayingModePreset","TimelineZoomPreset","TimelineSelectedTacticsPreset","TimelineHeightPreset","TimelinePinScenariosPreset","TimelineAppliedFiltersPreset","TimelineHeadersWidthPreset","TimelineTimePreset","TimelineTeamIdFocusPreset","TimelineShowBallPossession","TimelineShowNoBallPossession","VideoPlayerSpeedPreset","useSavePlaylistMultimatchFiltersAppliedPreset","savePreset","playingModePreset","FilterContainer","FilterTabs","withStyles","createStyles","TabSelectedBadge","TabUnSelectedBadge","FilterTab","active","tabProps","FilterTabPanel","LoadingBlock","ActionType","ActionType2","useMultipleRecordingsFilters","dispatch","useReducer","reset","setEventsStartingFilter","setEventsEndingFilter","setScenariosInsideAnEpisodeFilter","ActiveFilters","FilterBlock","FilterBlockClear","FilterBlockStatus","FilterColumn","expand","NotificationCircle","visible","ButtonDropdown","fullWidth","minWidth","FilterMultiSelect","displayName","invalid","onUpdate","selectedValues","setValues","actionRef","handleButtonClick","handleAddValue","handleRemoveValue","currentOptions","TeamTypes","getTeamType","getPlayerName","teamPlayer","FilterPlayerTabPanel","PlayersList","filteredPlayers","isPlayerSelected","isPlayerDisabled","isPlayerSelectionInvalid","FilterPlayerTabs","FilterPlayerTab","getSelectedValues","players","FilterPlayer","onRemove","teamsWithPlayers","showRemoveButton","newValues","hasInvalidPlayersSelected","handleChangeTab","handleChangeValues","checked","currentValues","flatten","handleResetAll","generateDisplayName","playerValues","FilterSelect","selectedValue","filterId","currentOption","head","Zones","LABEL_REQUIRED_CLASS_NAME","CONTENT_REQUIRED_CLASS_NAME","Label","FormLabel","CheckboxZone","zone","labelProps","idString","defaultZoneValues","FilterZone","some","zoneId","handleSetValue","zoneNumber","endPlayFundamentals","startPlayFundamentals","isEndingAPlayEvent","isStartingAPlayEvent","scenariosInsideAndEpisode","EventType","checkAppliedFilters","FilterEvents","actionsStarting","appliedFilter","setAppliedFilter","isAppliedFilters","clearFilters","handleUpdateZoneFilter","zones","handleUpdateTeamFilter","handleUpdateTacticalScenarioFilter","handleUpdatePlayerFilter","generateEventActionsOptions","eventAction","teamsOptions","eventsOptions","hasPlayers","RecordingsFiltersActions","isOffensiveTactic","RecordingTacticsPlayersFilter","handleRemove","onPlayersChange","onScenarioChange","onTeamsChange","listOfTactics","fundamental","listOfTacticsOptions","sortBy","RecordingsFilterInsideAnEpisodeTactics","isFiltersApplied","handleSetTacticFilters","handleUpdatePlayersFilter","handleUpdateTeamsFilter","tacticFiltersWithTeams","removeIdx","handleAddFundamental","firstRowTeamIds","RecordingsFiltersInsideAnEpisode","handleUpdateOffensiveTacticsAndPlayers","offensiveTacticFilters","handleUpdateDefensiveTacticsAndPlayers","defensiveTacticFilters","scenariosOptions","tacticalScenario","isTacticsApplied","isAppliedInsideFilters","getFilterStatus","areFiltersStartingApplied","areFiltersEndingApplied","areFiltersInsideApplied","MultiAnalysisFilters","applyButtonLabel","applyButtonDefaultLabel","resetButtonLabel","filtersData","isLoadingFilters","getFilteredItems","onApply","isPrevAppliedFilters","areFiltersApplied","handleOnApply","selectedTabIndex","setSelectedTabIndex","areFiltersDisabled","LoadingButton","MultiAnalysisFiltersPlaylist","isLoadingRecordings","isAddManyToPlaylistLoading","isLoadingFilteredData","addPlaylistItemsToPlaylist","RecordingsFiltersContent","RecordingsFiltersHeader","recordingsByNameQueryRef","getQueryParamsString","omitBy","getUrl","useRecordingsByName","isQueryEnabled","setIsQueryEnabled","pageSize","setPageSize","recordingsIds","setRecordingIds","removeQueries","pageParam","DefaultVariant","ActiveFilter","logo","contained","hasTeamFocus","ActiveRecordingFilter","isScoreAvailable","handleOnRemove","HeaderAddClipsContainer","alpha","RecordingResult","ResultsWrapper","onResetRecordings","useSyncRecordingsSelection","setRecordings","fetchRecordingsByName","handleSearchRecordings","SelectRecordings","autocompleteValues","setAutocompleteValues","syncRecordings","recordingsByNameData","close","handleAddClipsClick","handleApply","handleReset","handleRemoveRecording","updatedRecordings","handleRemoveRecordings","handleRemoveAutocompleteRecording","handleRenderItem","paperComponent","MultimatchFiltersModal","setAppliedFilters","saveMultimatchAppliedFiltersPreset","handleUpdateMultimatchAppliedFilters","handleSetRecordings","currentRecordingsSelection","recordingsSelection","AddMultipleClips","handleOpen","PlainText","originalText","InputTextField","PlaylistTitle","EditableText","canEdit","isSubmitting","setIsEditing","newText","setNewText","handleKeyUp","onClickOutside","handleIconClick","CopyBarContainer","CopyBarUrl","SharePlaylistModal","onCloseModal","userCopiedUrl","setUserCopiedUrl","shareCheckboxValue","setShareCheckboxValue","activeClient","origin","playlistDetailUrl","copyPlaylistUrl","urlToCopy","closeModal","copyUrl","handleShareCheckboxChange","VerticalIconButton","Icon","NextVideoSourceButton","buttonRef","PlayCircle","ButtonControls","ButtonControlsLeft","ButtonControlsRight","VideoControls","controlsRef","setIsVisible","handleMouseLeave","handleMouseOver","isHidden","PlayerSkeleton","PreviousVideoSourceButton","ProgressBarVideoSource","progressBarRef","isBuffering","isSeeking","handleJumpToPercent","clientRect","percentPositionClick","endTimeInMatch","startTimeInMatch","showBuffering","MINUTE_TIME","findSegmentForTime","matchSegments","formattedTime","short","adjustedTime","exceededTime","format","ProgressTimeVideoSource","ActionTypes","MetricsNames","eventEmitter","Subject","frameRateEmitter","publishEvent","publishFrameRateEvent","OVERLAYS_FRAME_RATE_BUFFER_TIME","metrics$","overlaysFrameRate$","bufferTime","actionsFrameRateSum","averageFrameRate","applicationEvents$","merge","Backward5Button","DownloadButton","onDownloadSource","handleDownloadCurrentVideo","Forward5Button","requestFullscreen","element","exitFullScreen","getFullScreenElement","prefixes","FullscreenButton","containerRef","setShowFullScreen","isFormTag","handleOnFullscreenChange","containerCurrent","ForwardButton","PlayBackButton","playButtonRef","pauseButtonRef","handleClickPlay","handleClickPause","BackwardButton","clickPosition","getEndTimeOfMatch","getEndTimeByPlayingMode","lastVideoSourceEndTime","ProgressTime","currentVideoSourceTime","formattedCurrentTime","formattedEndTimeOfMatch","RulesWrapper","Line","LineVertical","LineHorizontal","Rules","SpeedItemButton","videoPlayerSpeedAtom","useVideoPlayerSpeed","useSetVideoPlayerSpeed","SpeedButton","playbackRate","setVideoPlayerSpeed","handleChangeSpeed","speed","speedPreset","playbackRateValue","TextOverlay","VideoOverlaysTab","overlaysFrameInfo","TableContainer","Table","TableBody","TableRow","TableCell","TableHead","VideoPlayerTab","videoSourceStartTime","videoSourceEndTime","shortcuts","Chip","VideoPlayerDebugContent","CardContent","VideoPlayerDebug","VideoSpinner","videoPlayerBarContainerHeight","VideoPlayerBarContainer","VideoBarContent","aspectRatioFromSize","separator","DEFAULT_VIDEO_ASPECT_RATIO","defaultVideoAspectRatio","getAspectRatioSizes","ratioWidth","ratioHeight","adjustedWidth","useVideoAspectRatio","videoAspectRatio","setVideoAspectRatio","aspectRatioFromContainer","handleUpdateSize","handleContainerResize","containerElement","VideoOverlays","areOverlaysVisible","Switch","MuiSwitch","offColor","onColor","Toggle","OverlaysQualitySelector","setQuality","VideoBarBlockContainer","hideSeparator","VideoBarBlock","useVideoPlayerChangePlayingMode","setPlayingMode","videoPlayerPlayingMode","VideoBarTacticDrawingsMode","showTacticDrawingsOnly","disabledTacticDrawings","isOverlaysQualityDropDownAvailable","handleTacticDrawingsSwitch","showOverlaysQualityDropDown","VideoBarHeader","shouldShowTacticDrawings","SelectButton","sxSelectPaperStyles","VIDEO_SOURCE_LIST_ITEM_INDENT","VideoSourceList","VideSourceListItemContent","VideoSourceListItemText","inset","VideoSourceListItemButton","VideoSourceListItemIcon","VideoSourceListDivider","VideoSourceSelectListItemTypes","VideoSourceSelectList","optionsList","listItem","hasPrefixIcon","isInset","VideoSourceSelect","VideoPlayerBar","showTacticDrawings","selectableVideoTypes","handlePlayingModeChange","selectOptions","isVideoSourceSelectDisabled","VideoPlayerComponent","showRules","showVideoSourceControls","showVideoPlayerBar","onPlayingModeChange","showCustomOverlays","isPageWhitelisted","showFullScreen","areOverlaysEnabledInTimeline","handleChangePlayingMode","handleTogglePlaying","handleTimeUpdate","isFullScreen","showVideoSourceTimeInFullscreen","videoSourceSrc","isTextOverlayVisible","handleNextVideoSource","Player","Dash","VideoPlayerWithErrorBoundary","TrimSliderTooltip","ValueLabelComponent","TrimSlider","Slider","generateTrimmedPlaylistItem","generateState","min","max","INITIAL_CLIP_DURATION","INITIAL_VALUE","INITIAL_LAST_VALUE","INITIAL_SLIDER_STATE","PlaylistItemTrimPlayer","sliderState","setSliderState","lastValue","setLastValue","clipDuration","setClipDuration","isTrimmingReady","start","end","handleChangeCommit","hasStartTimeChanged","hasEndTimeChanged","PlaylistItemTrimDialog","PlaylistItemTrimModal","handleOnConfirm","findVideoById","videos","UserPlaylist","updatePlaylistName","isPlaylistUpdating","trimmingPlaylistItem","isModalOpen","setIsModalOpen","isCurrentItemDownloadModalOpen","setIsCurrentItemDownloadModalOpen","openModal","onUpdateName","trim","canEditName","trimmingPlaylistItemItem","handleTrimmingPlaylistItem","handleDownloadModalOpen","handleDownloadModalClose","handleOpenDownloadCurrentItemModal","handleCloseDownloadCurrentItemModal","UserPlaylistWidget","PlaylistDetailContainer","PlaylistDetail","EmptyCell","EmptyCellGrid","cells","_","NotFound","header","showGridBackground","showContactLink","contentStyle","EmptyPage","useQueryParams","search","useDuplicatePlaylist","noop","CopyPlaylistModal","playlistUserName","playlistName","duplicatePlaylist","CopyPlaylist","isCopyPlaylistModalOpen","setIsCopyPlaylistModalOpen","userClient","handleFetchPlaylistSuccess","handleCopyPlaylistModalClose","disablePadding","ListContainer","ListHeader","ListHeaderOptionTitle","ListHeaderOption","showOrder","ListTitle","dataTestId","ListTitleActions","ListTitleContainer","PaginationLoadingButton","ELEMENTS_PER_PAGE","Pagination","total","displayed","onShowMore","getStatsText","loading","resultsPerPage","percentageLoaded","loadingBarClassed","CreatePlaylist","isCreatePlaylistOpen","setIsCreatePlaylistOpen","playlistNameValue","setPlaylistNameValue","registerLocale","es","en","de","DateRange","hasSelectedOptions","dateRangeKey","setDateRangeKey","startDate","setStartDate","endDate","setEndDate","dates","handleClear","DatePicker","GlobalStyles","themeZIndexes","defaultFontFamily","FilterLabel","Filter","onClickOpen","updateMenuPosition","CheckboxMenuWrapper","MuiFormControlLabel","FilterControls","isResetDisabled","onClickReset","onClickApply","showApplyButton","showResetButton","handleResetClick","CheckBoxMenu","initialOptions","submitOptions","autoSubmit","setMenuOptions","onSelectOption","updatedOptions","resetOptions","SearchPlaylistAutocompleteInput","SearchPlaylist","handleOnUpdate","handleBlur","handleSearchTermChange","Filters","filtersList","openFilter","setOpenFilter","handleOpenFilter","getQueryString","filterAllowedFields","allowedFields","updateQueryString","currentQueryString","useQueryStringState","listOfFieldsToUpdate","updateValues","transformQueryStringValuesToFilters","queryStringValues","ALLOWED_QUERY_PARAMS","usePlaylistsWithQueryStringState","useDeletePlaylist","Variants","recordingVariants","getAnimationStatus","isPresent","component","ListItemTitle","useConfirmPopoverDialog","DuplicatePlaylistDialog","nameGenerator","DateInfo","PlayListDuration","PlaylistNumberOfClips","PlaylistsListItemDetails","PlaylistCard","shareModalOpen","setShareModalOpen","deletePlaylist","isDeleteSuccess","safeToRemove","usePresence","duplicateModalOpen","setDuplicateModalOpen","handleOnClickPlaylist","openDuplicateModal","onClickShare","handleDelete","onDuplicateModal","PlaylistDuration","PlaylistListSkeleton","PlaylistsList","isFetchingNextPage","handleSortChange","PlaylistsSkeleton","PlaylistsContainer","query","setPlaylistsFilters","listen","copyPlaylistQueryParam","change","EmptyList","generateUseGetRecordingQueryRef","useFetchRecording","secondsToTimeString","str","dateFormatter","timeFormatter","dateToPrintableDateTimeString","dateToPrintableDateString","toISODateString","extractRecordingUpdateData","useUpdateRecording","updateRecording","sendUpdate","isUpdating","dateFormat","InputBar","displayDate","displayValue","DateSelector","onChangeDate","RBChecked","RBUnchecked","RBDisabled","getLabelClass","RadioButton","labelClass","RadioButtonIcon","RecordingEditForm","setRecordingData","onUpdateSuccess","onUpdateError","onUpdateSettled","sanitiseUpdate","recordingUpdate","submitForm","pick","sanitisedUpdate","onChangeType","RadioButtons","recordingType","startCase","RecordingEditPage","RecordingEditContainer","useFetchRecordingPlaylists","variants","PlaylistsGrid","playlistsList","setPlaylistsList","RecordingPlaylistsPage","matchId","RecordingPlaylistsSkeleton","pageStyles","RecordingPlaylistsContainer","useParams","annotationType","pickBy","matchday","generateFetchRecordingsQueryRef","RecordingsStateContext","SORT","useRecordings","extraKey","useRecordingsListFilters","RecordingCardLoading","isAnimated","RecordingsListLoading","RecordingListPageSkeleton","getFiltersFromUrl","searchParams","has","getSelectedAnnotationType","annotationFilter","urlFilters","firstKey","AnnotationTypeFilter","applyFilters","annotationTypeOptionApplied","isDropdownVisible","setDropdownVisible","Caret","filtersReducer","useRecordingsFilters","initialFiltersState","filtersApplied","removeFilter","useDeleteLiveRecording","useIsTaggingTool","routerMatch","useInvalidateTacticalAnalysis","useValidateTacticalAnalysis","Scenarios","EventsStarting","isEventStarting","isValidScenario","MatchTeamTypes","useRecordingValidationOption","tacticalAnalysis","aRecording","validateTacticalAnalysis","invalidateTacticalAnalysis","KebabMenuRecordings","extraOptions","validationOption","RecordingsListItemDetails","RecordingCard","editPath","hasVideoSource","hideActions","onDelete","isTaggingTool","defaultMenuOptions","ListInfo","makeRecordingDetailRoute","makeRecordingAlignmentSourcesRoute","makeRecordingAlignmentRoute","makeTimelineRoute","makePlaylistIndexRoute","CompetitionInfo","competitionName","useCircularLoaderStyles","LiveRecordingInfo","classes","CircularProgress","StartTime","LiveRecordingCard","onDeleteSuccess","deleteRecording","handleClickToTaggingTool","stylesCard","TacticsNotFoundImg","onNotFoundClick","useDeleteRecording","getTacticalAnalysisStateIcon","tacticalAnalysisState","StateAnalysis","hidden","StateCamera","StateTags","gridItemStyles","StateInfo","MatchDayInfo","matchDay","ScoresInfo","VODRecordingCard","taggingToolPath","cardPath","analysisPath","handleLinkToTagging","handleLinkToAnalysis","handleLinkToCardPath","extraMenuOptions","groupRecordingsByMatchDay","currentCompetition","RecordingsList","groupedRecordings","LoadingView","NotFoundView","RecordingListWithFilters","handleOnDeleteSuccess","PRODUCTION_HOST","STAGING_HOST","PREVIEW_HOST","Environments","getEnvironment","hostname","getReleaseVersion","VITE_REACT_APP_RELEASE_VERSION","APP_COLLECT_METRICS","useMetrics","attributes","domain","faro","pushEvent","mapFilterOptions","mappedOptions","filterOptions","selectedOptions","countBy","selectInitialCompetitionIndex","competitionsTabs","competitionTabIndex","competitionsTab","RecordingTypesTabsAndFilters","tab","setTab","selectedCompetition","generateFiltersList","_filter","generateAppliedFilters","recordingsFilters","customRecordingFilters","recordingFilter","isApplied","generateInitialFilters","initialCompetition","RecordingsListPage","defaultFilters","totalElements","setRecordingsFilters","handleSetRecordingsFilters","COMPETITION_PRIORITY","sortTabsTypesByPriority","first","second","RecordingsListPageContainer","TypeOfPlaySource","TypeOfPlay","groupTagsByType","tags","groupedTagData","tagType","filteredTags","ResizeBarWrapper","isDragging","isHorizontal","applyResizeLimits","mainPanelSize","secondaryPanelSize","mainPanelMinSize","secondaryPanelMinSize","isMainPanelSizeValid","resizer","mainPanelElement","secondaryPanelElement","callBack","directionChangeProperty","updateProperty","previousPosition","mainPanel","secondaryPanel","mousemove","newPosition","mouseup","resizerTouch","directionChangeValue","touchmove","touchend","Bar","ResizeBar","setIsDragging","handleResize","handleScreenResize","changeValue","handleStartDrag","handleEndDrag","TacticalAnalysisContainer","TacticalAnalysisVideoContainer","TacticalAnalysisTimelineContainer","generateNoEffectiveTimeClip","rowId","generateEpisodeClips","timelineTableBlocks","clipType","clipIdPrefix","nextEpisodeIndex","nextEpisode","isHalfTime","generateEpisodesRows","generateBlockContainerClip","rowType","entityId","sortByTitle","row1","row2","findLastValidScenarioInEpisode","highest","lastScenarioIndex","tmp","generateEventsRows","endingEventsRowList","startingEventsRowList","firstValidScenario","find","row","latestValidScenario","startingEventsRows","startingEventsRowGroup","endingEventsRows","endingEventsRowsGroup","eventsRowGroups","generateRandomUUID","createParentClip","childClips","elementId","parentClipId","clips","clip","defaultTitle","i18next","checkForOverlappingClips","initialUsedClips","usedClips","overlappingClips","c","clipsInScope","parentClip","filteredClips","generateClipsWithOverlappingTime","resultClips","getClipsForFilters","filterClips","generateFiltersRow","filterEpisodes","filterUniqueId","totalOffensiveTactics","totalDefensiveTactics","areFundamentalsFiltered","unfilteredEpisode","anEpisode","generateFullMatchTimelineBlockFromDuration","getClipsFromTaggingEvent","mappedClips","generateManualTagsRows","groupedTags","rows","forEach","tagGroup","tag","SCENARIOS_ORDER","sortScenarios","ida","idb","generateScenariosRows","scenariosIdsList","extractedRows","TacticActionType","getClipsFromTacticalFundamental","mappedClipsByTeamIdAndType","clipsByType","generateTacticsRows","tacticsIdsList","offensiveRows","offensiveRowGroup","defensiveRows","defensiveRowGroup","DEFAULT_TIMELINE_DATA","transformEpisodeToTimelineTableBlock","generateTimelineRows","timelineBlocks","episodesRow","scenariosRowGroup","eventsRowGroup","tacticsRowGroup","manualTagsRowGroup","TacticalAnalysisPlayingMode","isTimelineReadyToRender","timelineMultiselectActive","showFilteredClips","shouldResetPlayHead","zoomLevel","MINIMUM_TIMELINE_TRACKS_HEIGHT","HEADER_MIN_WIDTH","headersWidth","matchVideoSource","teamIdFocus","timelineTableData","showBallPossession","showNoBallPossession","timelineMatchAtoms","timelineAtoms","useTacticalAnalysisEpisodes","useSetTacticalAnalysisEpisodes","useTacticalAnalysisMatch","useSetTacticalAnalysisMatch","useSetTacticalAnalysisMatchSegments","useTacticalAnalysisMatchSegments","getDurationFromEpisodes","accumulator","generateEffectiveTimeSources","generateVideoSourceTypeEffectiveTime","generateEffectiveTimeFullGameSources","src","srcDownload","generateVideoSourceTypeFullGame","tacticalCameraVideo","generatePlaylistItemFromEpisodes","fullVideoSourceDuration","generateMatchWithPlaylistRef","useMatchWithEpisodes","getUserNameFromUserId","userId","usersInfo","userInfo","generateTaggingEventsFilters","taggingEvents","applyTypeOfPlayFilter","typeOfPlay","taggingEvent","isCurrentTypeOfPlay","areAllSelected","areFilterOptionsEmpty","isNameInFilterOptions","applyUserFilter","transformTaggingEvents","DEFAULT_TAGGING_EVENTS_FILTERS","useFetchTaggingEvents","request","orderBy","addTaggingEvent","addMultipleTaggingEvents","events","removeTaggingEvent","updateTaggingEvent","updatedTaggingEvent","resetFilters","hasFiltersApplied","filterType","getValidPlayingMode","generateTacticalAnalysisPlaylistItems","matchWithEpisodes","selectedPlayingMode","areTimelineOverlaysEnabled","resolve","shouldUseEpisodesMode","shouldUseTacticalCameraMode","shouldUseTacticalCameraModeWithEpisodes","validateSelectedPlayingMode","useGenerateTacticalAnalysisPlaylistItems","rowAtomFamily","rowGroupIsCollapsedFamily","rowGroupHighlighted","useRow","useSetRowGroupIsCollapsed","useRowGroupIsCollapsed","useSetRowIsHighlighted","useRowIsHighlighted","clipAtomFamily","clipIdsAtom","rowIdsAtom","lastSelectedClipIdAtom","selectedClipIdsAtom","useClipsIdsSelection","notEmpty","getClipsFromClip","clipsFromClip","selectionActionsCreator","set","setLastSelectedClip","clipId","getSelectedClipIds","replaceSelectedClipIds","updatedClipsSelected","getListOfClipIds","getListOfRowIds","getLastSelectedClipId","getClip","getClipList","clipIds","getRow","getRowList","rowIds","getFiltersClips","getRowClips","initClip","changeClipSelection","selectClip","unSelectClip","toggleClip","resetSelection","clearSelectedClips","selectedClips","currVal","clipsIds","skipClipsIds","last","clearSelection","useResetTimelineSelectionAtoms","useRecoilCallback","useValidateSelection","useRowClips","useSelectPlayingSelectionClipsIds","useUnselectPlayingSelectionClips","useSelectRow","useUnselectRows","useGetClipsList","useGetClip","useAddClipsToSelectionList","validateSelection","useAddRowsToSelectionList","useAddRowToSelectionList","useAddClipShiftSelection","isSelectionMode","clipWithSelection","lastSelectedClipId","lastClickedClipValue","firstClipIndex","lastClipIndex","clipsRangeToSelect","useAddClipsShiftSelection","clipsId","listOfClipIds","useAddRowClips","rowClips","useAddClipsAction","useReplaceMultipleClipsAction","useToggleClipSelection","selectedClipIds","useToggleCtrlClipSelection","useToggleClipsSelection","clipsToSelect","useToggleCtrlClipsSelection","useRemoveClipFromSelection","useCleanSelection","pinScenariosAtom","usePinScenarios","useSetPinScenarios","setPinScenario","updatePreset","pinScenariosPreset","useSetPresetPlayingMode","usePresetPlayingMode","useTacticalAnalysisAppliedFilters","useSetTacticalAnalysisAppliedFilters","useSetTacticalAnalysisSelectedTactics","useTacticalAnalysisSelectedTactics","useSetTimelineShowBallPossession","setShowBallPossession","show","useTimelineShowBallPossession","useSetTimelineNoShowBallPossession","setShowNoBallPossession","useTimelineShowNoBallPossession","useSetTimelineHeadersWidth","useTimelineHeadersWidth","useSetTimelineHeight","useTimelineHeight","timelineInitialTimeAtom","useSetTimelineInitialTime","useTimelineInitialTime","useSetTacticalAnalysisTeams","useTacticalAnalysisTeams","useSetTimelineTeamIdFocus","setTimelineTeamIdFocus","useTeamUtils","useTimelineTeamIdFocus","RangeSlider","step","sliderValue","setSliderValue","changeCallback","targetValue","ZoomContainer","trackColor","thumbHeight","thumbColor","thumbWidth","trackWidth","trackHeight","trackRadius","track","thumb","Separator","isZoomLevel","isNextStepEnabled","isPreviousStepEnabled","STEP_ZOOM","MIN_ZOOM","MAX_ZOOM","SeparatorsList","ZoomRange","setZoomLevel","useTimelineZoomLevel","getPreviousStep","getNextStep","useSetTimelineZoomLevel","handleSaveZoomLevelPreset","zoomPreset","setZoomLevelAndCenterPlayHead","handleLessZoomLevel","previous","handleMoreZoomLevel","next","fixPlayingMode","useOverlays","useTacticalAnalysisPresets","setPinScenarios","setTimelineZoomLevel","setTimelineHeight","setTimelineInitialTime","setSelectedTactics","setNoShowBallPossession","setTacticalAnalysisAppliedFilters","setTimelineHeadersWidth","fetchTimelineRecordingPresets","initialTimePreset","showBallNoPossession","fetchTimelineGlobalPresets","heightPreset","pinScenarios","placeHolderData","useTacticalAnalysisFilteredItems","useTacticalAnalysisAvailableFilters","useSetTacticalAnalysisAvailableFilters","useTacticalAnalysisFilteredEpisodes","useTacticalAnalysisClearFilters","setTimelineData","useSetTimelineTableData","useTimelineTableData","timelineData","useSetTacticalAnalysisFiltersResults","setTimelineTableData","updateTimelineData","useTacticalAnalysisId","useSetTacticalAnalysisId","useTacticalAnalysisMode","useSetTacticalAnalysisMode","extractClipsFromParentClip","extractClipsFromTimelineTableData","rowClip","parentClips","generateTimelineRowsQuery","useTacticalAnalysisData","presetPlayingMode","setTacticalAnalysisTeams","setCurrentTacticalAnalysisId","setTacticalAnalysisAvailableFilters","setTacticalAnalysisMatch","setTacticalAnalysisEpisodes","setMatchSegments","setTimelineVideoSource","resetTimelineSelectionAtoms","setTimelineMode","setTacticalAnalysisFiltersResults","fetchMatchWithEpisodes","focusTeamId","fetchTaggingEvents","hasSource","timelineRowsQuery","initialPlayingMode","extractRowsFromGroup","rowGroup","rg","extractAllRows","rowGroups","allRows","addRowsForSelection","addRowForSelection","addClipsForSelection","rowCLips","extractTacticsFromTimelineData","useTimelineTactics","extractedTacticsFromTimelineData","handleTacticSelection","tacticsIds","tacticsIdsToSave","useGenerateTimelinePlaylist","timelineVideoSource","useTimelinePlayingMode","videoPlayerState","setPresetPlayingMode","generateTimelinePlaylist","handleSetPlayingMode","TimelineOverlaysSelectorPanel","TacticalAnalysisVideoPlayer","handleToggle","SectionContainer","FiltersSummary","FiltersSummaryItem","emptyZones","defaultEventsStartingAnEpisode","defaultEventsEndingAnEpisode","defaultFundamentalWithPlayers","defaultFundamentalsFilters","defaultScenarioInsideAnEpisode","findTeamById","ActiveFilterTeam","teamType","showCloseButton","EventsEndingEpisodeSummary","clearTeamFilter","clearTacticalFilter","updateZoneFilter","clearAllFilters","EventsStartingEpisodeSummary","FundamentalsSummary","onClosePlayer","fundamentalTeamType","ScenariosInsideEpisodeSummary","homeTeam","opponentTeam","offensiveTeamId","defensiveTeamId","offensiveTeamType","defensiveTeamType","clearFundamentalTeamFilter","clearFundamental","fundamentalId","filteredFundamentals","clearFundamentalPlayer","filteredFundamentalPlayers","offensiveTeams","o","defensiveTeams","FiltersBarSummary","summaryAnchor","onMouseEnter","onMouseLeave","FiltersModalContent","FiltersModal","availableFilters","handleGetFiltersWithTacticalAnalysisId","handleClearFilters","roundVideoSourceTimes","roundClipTimes","getFirstClipInRange","clipWithRoundedTimes","otherClip","getClipsWithoutDuplicatedTime","clipWithRoundedTime","isClipWithSameTime","itemWithRoundedTime","isClipWithSameTimeInAcc","clipsWithSameStartTime","longestClipWithSameStartTime","itemClipWithRoundedTime","isClipWithSameStartTimeInAcc","getClipLength","findVideoSourceForClip","isEpisodeMode","createVideoSourcesFromClips","clipItem","allClips","clipLength","cutClipLength","isFulltimeNotEffectiveTime","videoSourceFromCut","clipLeftFromCut","firstClipInRange","videoSourceFromCutEndTime","selectedPlayingRow","useSelectedPlayingRow","useSetSelectedPlayingRow","useSelectionPlaying","getClipsList","cleanSelection","selectRow","clipIdsSelection","isHomeTeam","selectClipsForPlaying","unselectRows","unselectPlayingSelectionClips","tacticalAnalysisMode","setTacticalAnalysisMode","setSelectedPlayingRow","createPlaylistItemsFromClips","clipsList","playAll","newPlaylistItems","clipsToSelectUnique","FiltersContainer","episodeCount","setFiltersSummaryAnchor","timeoutIdRef","areFiltersOpen","setAreFiltersOpen","toggleOpenFilters","handleCloseFilters","handleApplyFilters","filtersWithRecordingId","showFiltersApplied","handleOpenSummary","handlePopupMouseEnter","handleCloseSummary","ExportModalContent","ExportModalIconContainer","useDownloadEffectiveTimeVideos","ExportVideoTypes","ExportModal","modalTitle","findFirstEnabled","setSelectedOption","downloadEffectiveTimeVideos","handleSelectOption","newOption","handleExportClick","ExportModals","exportUrl","exportButtonProps","ExportVideoModal","fullMatchDownloadUrl","ExportXMLModal","enableFullMatch","enableEffectiveTime","ExportModals2","ExportButton","fullMatchTacticalCamera","currentModal","setCurrentModal","handleCloseModal","handleCloseMenu","handleOpenModal","modal","fullMatchDownload","FiltersBarContainer","useTimelineIsMultiselectModeActive","isMultiselectModeActive","setIsMultiselectModeActive","FiltersBar","AddToPlaylistMenuStateContext","AddToPlaylistMenuStateProvider","usePlaylistMenuId","generatePlaylistMenuItemId","playlistMenuId","useRemovePlaylistMenuItem","removeClipFromSelection","useRemoveMultiplePlaylistMenuItem","setPlaylistMenuItemIds","playlistMenuAtoms","clipsIdsToRemove","useAddMultiplePlaylistItems","usePlaylistMenuItems","playlistMenuState","playlistMenuItem","playlistItemsSelector","selectorFamily","finalItems","playlistItemsSelectorIds","idsToRemove","MENU_WIDTH","AddToPlaylistMenuContainer","isClosed","AddToPlaylistMenuContent","CurrentPlaylistMenu","selectedPlaylist","onDeletePlaylistItem","PlaylistItemsSelectorMenuTitle","PlaylistItemsSelectorMenuNoItemsText","SelectedPlaylistItem","removePlaylistMenuItem","PlaylistItemsSelectorMenu","onSave","PlaylistSelectorMenuTitle","PlaylistSelectorMenuLink","RouterLink","PlaylistSelectorMenu","anchorSubmenu","setAnchorSubmenu","handleOpenSubmenu","handleCloseSubmenu","handleSelectPlaylist","UnsavedChangesDialogIconContainer","UnsavedChangesDialog","handleSave","useGetSelectedClips","getClips","selectedClipsIds","getMergedClips","clipIdsWithParentClips","getUnMergedClips","useGeneratePlaylistItemName","isHomeTeamSelected","ep","useUpdatePlaylistMenuClips","generatePlaylistItemName","useSynchronizeTimelineSelectionWithPlaylistMenu","updatePlaylistMenuClips","getSelectedClips","AddToPlaylistMenu","setMenuOpen","isUnsavedDialogOpen","setIsUnsavedDialogOpen","setSelectedPlaylist","handleMenuClose","handleSelectedPlaylistChange","handleDeletePlaylistItem","useMapClipsToPlaylistItems","useAddToPlaylistValidator","isValidationModalOpen","setIsValidationModalOpen","clipsToSave","setClipsToSave","setPlaylistId","setFundamentalsSelected","onModalOpen","onModalClose","checkForParentClips","setData","resetData","OverlappingClipsModal","mergeClips","setMergeClips","AddToPlaylistMenuTimeline","mapClipsToPlaylistItems","handleSubmitRequest","callbackData","playlistItemsToSave","AddToPlaylistMenuTimeline$1","getTimeZoomLevelAdjustment","getBlockSizeByZoomLevel","adjustTimeSpaceByZoomLevel","TIMELINE_CONFIG","calculateWidthFromEpisodeClips","SEPARATOR_DOUBLE_WIDTH","SEPARATOR_WIDTH","timelineInnerWidth","useTimelineInnerWidth","useSetTimelineInnerWidth","setTimelineInnerWidth","useGenerateTimelineWidth","innerWidth","effectiveTime","CSS_HOME_TEAM_COLOR","CSS_HOME_TEAM_COLOR_HOVER","CSS_OPPONENT_TEAM_COLOR","CSS_OPPONENT_TEAM_COLOR_HOVER","CSS_FILTER_COLOR","CSS_FILTER_COLOR_HOVER","CSS_EPISODE_CLIP_COLOR","CSS_EPISODE_CLIP_COLOR_HOVER","CSS_TAGS_OFFENSE_COLOR","CSS_TAGS_OFFENSE_COLOR_HOVER","CSS_TAGS_DEFENSIVE_COLOR","CSS_TAGS_DEFENSIVE_COLOR_HOVER","CSS_TAGS_TRANSITION_COLOR","CSS_TAGS_TRANSITION_COLOR_HOVER","CSS_TAGS_IMPORTED_COLOR","CSS_TAGS_IMPORTED_COLOR_HOVER","CSS_CLIP_BORDER_COLOR","CSS_CLIP_ZOOM_WIDTH","CSS_TIMELINE_INNER_WIDTH","CSS_EFFECTIVE_TIME_SEPARATOR","CSS_EFFECTIVE_TIME_SEPARATOR_HALF_TIME","CSS_EFFECTIVE_TIME_VISIBILITY","CSS_IS_HOME_TEAM_SELECTED_VISIBILITY","CSS_IS_OPPONENT_TEAM_SELECTED_VISIBILITY","timelineColors","TimelineCssVariables","isOpponentTeamSelected","stylesEffectiveTime","stylesTeamColor","stylesWidth","SelectableClip","borderStyle","isOpponentTeam","clipStyle","isHome","isOpponent","shouldReverseHomeTeam","shouldReverseOpponentTeam","useRowTeam","ParentSelectableClipCounter","propName","ParentSelectableClipContainer","ParentClip","hasScroll","setHasScroll","childClipsCount","selectedChildClips","selectionState","handleMouseEnter","modalContent","relatedTarget","clipWidth","clipLeft","BlockClipsList","innerClip","ClipBlockContainer","useTimelineConfigs","EpisodeClip","isSelectedForPlaying","EpisodeName","ClipEpisode","showShortName","setShowShortName","showName","setShowName","nameRef","boxRef","entries","entry","hasTextOverflow","NotEffectiveTimeClipsList","ClipNotEffectiveTime","ClipTimeline","EpisodesClips","EpisodesRow","getRowTotalClips","hasFiltersResults","filtersRow","ClipsList","BASIC_ROW_HEIGHT","RowGroupHeaderContainer","level","isClickable","RowContentContainerWrapper","isHighlighted","isBorderTop","RowContentContainer","borderTop","timelineStyles","RowContent","isRowHighlighted","setRowHighlighted","FiltersContentRow","VerticalSeparator","RowHeaderContainerWrapper","RowHeaderContainer","RowHeaderContent","RowHeaderTotal","getScenarioClips","compareFunction","RowScenariosContent","TeamRowHighlight","RowHeaderScenario","playingRow","homeTeamClips","opponentTeamClips","getIsEnabled","homeRowIsSelected","opponentRowIsSelected","RowHeaderTactic","totalNumberOfClips","RowHeader","FiltersHeaderRow","ChevronContainer","Chevron","IconPin","IconPinSolid","RowGroupList","rowsGroup","RowsHeadersGroup","onPin","isPinned","isCollapsed","setRowIsCollapsed","handleCollapse","handleOnPin","RowGroupsList","RowHeadersContent","TIMELINE_TABLE_MIN_WIDTH","RowHeadersResizeBar","headerContentDiv","contentDiv","handleSaveHeaderWidth","headerWidthPreset","RowsContent","RowsContentHeader","isShadow","RowGroupRows","RowsContentGroup","RowGroups","RowsContentContainer","scenariosRow","stickComponents","contentRowGroups","RowsContentInner","RowsHeaders","ScenariosRowGroupContent","ScenariosRowGroupHeader","TimelineContentHeaderContainer","useJumpToTimeInMatch","timePreset","useTimelineEventsHandlers","jumpToTimeInMatch","toggleClipSelection","toggleCtrlClipsSelection","toggleCtrlClipSelection","toggleClipsSelection","addClipShift","addClipsShift","addRowClips","playSelection","addMultipleClips","replaceMultipleClips","handlePlayClip","handlePlaySelectedClips","handlePlayRowCommon","handlePlayRow","handlePlayHomeTeamRow","handlePlayOpponentTeamRow","handleOpponentTeamClick","rowElement","handleHomeTeamClick","handleSelectClip","ctrlKey","shiftKey","metaKey","handleDeselectClip","handleDoubleClick","handleSelectRowClips","IconSelect","IconSelectAll","ClipActionsMenuTitle","ClipActions","menuAnchorEl","deselectClip","playClip","playSelectedClips","anchorSingleClipSubmenu","setAnchorSingleClipSubmenu","anchorMultipleClipsSubmenu","setAnchorMultipleClipsSubmenu","areMultipleClipsSelectedWithCurrentClip","selectedClipsCount","showPlaySelectedOption","handleOpenSingleClipSubmenu","handleOpenMultipleClipSubmenu","closeAllMenus","handleClickAway","isMultipleClipsMode","handleClearSelection","handleSelectRow","handleOverlappingModalSubmit","multipleClipsMenuItemsList","RowActions","playRow","playOpponentTeamRow","playHomeTeamRow","TimelineTableWrapper","clipAnchorEl","setClipAnchorEl","contextMenuClip","setContextMenuClip","rowAnchorEl","setRowAnchorEl","contextMenuRow","setContextMenuRow","clickTimeout","setClickTimeout","handleTimelineClick","timeoutTime","timeoutId","handleContextMenu","handleRowClose","showHomeTeamBallPossession","showOpponentTeamBallPossession","useSetIsTimelineReadyToRender","useIsTimelineReadyToRender","findPlayHeadPositionWithEpisodes","episodeLeftTime","episodeNumber","currentEpisode","separatorWidth","getPlayHeadPositionByTime","isPositionByEpisode","getCenterToPlayHeadLeftPosition","playHeadPosition","clientWidth","centeredPosition","useSyncRowContent","visibleContentRef","headerRef","handleSyncScroll","handleWheelScroll","visibleContent","maxVisibleContentScroll","usePlayHeadPositionInTimeline","headerContentRef","isFirstLoad","setIsFirstLoad","setIsTimelineReadyToRender","timelineInitialTime","nonReactiveCurrentTime","handleCenterPlayHead","scrollLeft","maxScroll","useSyncHeight","masterDiv","syncDiv","useTimelineWheelZoom","scrollableContentRef","lessZoomLevel","moreZoomLevel","content","handleWheel","SeparatorContainer","SeparatorContent","EffectiveTimeSeparatorsWrapper","EmptySeparator","emptyStyle","EffectiveTimeSeparators","episodesClips","ColumnEmptyContainer","FilterHighlightsWrapper","ColumnHighlightContent","ColumnHighlight","filterClip","ColumnEmpty","FilterHighlights","playHeadShadowTime","playHeadShadowVisibility","usePlayHeadShadowTime","useSetPlayHeadShadowTime","usePlayHeadShadowVisibility","useSetPlayHeadShadowVisibility","ARROW_SIZE","TIMER_WIDTH","PlayHeadContent","PlayHeadArrowDown","PlayHeadTime","PlayHeadHeader","PlayHeadShadow","playHeadShadowContentDiv","shadowTime","leftPosition","useTimelineCurrentVideoSourceTime","currentTimeMatch","currentSource","shouldSaveTimePreset","visibleTime","isPlayHeadVisible","playHeadPositionByWithScroll","getPlayHeadThreshold","PlayHead","playHeadPositioningActions","lastPlayHeadPosition","playHeadContentDiv","playHeadThreshold","Block","shouldRenderTime","blockNumber","MAX_TEXT_WIDTH","TimeRulerBlockContainer","setPlayHeadShadowVisibility","zoomScaleAdjustment","blockSizeByZoomLevel","setPlayHeadShadowTime","showPlayHeadShadow","hidePlayHeadShadow","handleMouseMove","left","isValidTime","numberOfBlocks","timePerBlock","containerWidth","blockWidth","TimeRulerEffectiveTime","TimeRulerFullTime","TimeRuler","setEndTime","IconNoBall","LogoContainer","NoLogoImg","TeamLogo","PlayingModeToggle","getCssVariable","propertyValue","teamColors","useTeamColors","homeTeamColor","opponentTeamColor","TIMELINE_TEAM_CONTROLS_HEIGHT","TIMELINE_TEAM_CONTROLS_NO_EPISODES_HEIGHT","TimelineControlsWrapper","TimelineControlsContent","TimelineControls","teamColor","handleToggleShowBallPossession","handleToggleShowNoBallPossession","TimelineTable","containerDiv","episodesRowRef","playHeadContainerRef","rulerContainerRef","initialHeadersWidth","TimelineContainer","TimelineContent","Timeline","MINIMUM_VIDEO_PLAYER_HEIGHT","TacticalAnalysis","trackContainerRef","timelineHeight","handleSaveHeight","FILTERS_BAR_HEIGHT","TacticalAnalysisSkeletonContainer","TacticalAnalysisSkeletonVideoContainer","TacticalAnalysisSkeletonVideoSkeleton","TacticalAnalysisSkeletonContent","TacticalAnalysisSkeletonContentFilters","TacticalAnalysisSkeletonContentTimeline","TacticalAnalysisSkeletonFiltersLoading","TacticalAnalysisPageSkeleton","useTacticalAnalysisPage","tacticalAnalysisData","NotFoundContainer","initialStartTimeFromClip","KeypadEditKeypadActionsVariant","KeypadEditSubTitle","KeypadEditKeypadContainer","KeypadEditKeypadFault","KeypadEditOffenseBottom","KeypadEditKeypadActions","KeypadEditKeypadMiddle","KeypadEditKeypadHContent","KeypadEditKeypadVContent","makeUUID","makeCustomKeypadTag","keypadTagId","PROXY_HEADER_BASEURL","PROXY_HEADER_COOKIE","KEY_BASEURL","KEY_PROXY_COOKIE","getStorageExtraRequestHeaders","baseURL","cookie","gen","initialValue","run","observers","makeContainer","gen$","getValue","nextValue","setter","mountedRef","nextServiceError","lastServiceError","extraHeaders","err","_message","serviceError","fetchKeypads","fetchCreateKeypad","body","fetchDuplicateKeypad","fetchUpdateKeypad","fetchDeleteKeypad","fetchKeypad","fetchCreateKeypadTag","fetchUpdateKeypadTag","fetchDeleteKeypadTag","HOTKEY_SPLIT_KEY_PRINTABLE","HOTKEY_SPLIT_KEY","hotKeyToString","hotKey","hotKeyToPrintableString","keyboardEventToKey","ev","code","makeHotKeyResolver","keypadData","hotKeyToIndexKey","hotkey","indexKey","updateData","customButtonsData","keypad","useKeypadEditScreenState","handleEnabledChange","isEnabled","prevItem","nextItem","handleUpdateKeypadTag","handleCreateKeypadTag","handleRemoveKeypadTag","CustomButtonsBoxContainer","CustomButtonsBoxHeader","CustomButtonsBoxList","CustomButtonsSkeletonContainer","CustomButtonsSkeletonItem","CustomButtonsSkeletonGradient","CustomButtonsSkeleton","Dot","useEventButtonState","initialState","EventButton","handleEdit","isGrey","isPurple","isOrange","isGreen","_i","CustomButtonsBox","onEdit","onEnabledChange","custom","CustomButtonPanel","handleAddNew","GoalVariant","goalHeight","goalWidth","KeypadGoalWrapper","KeypadGoal","FormInputLabel","InputLabel","KeypadCustomButtonForm","KeypadCustomButtonCutBox","KeypadSelectContainer","KeypadFormItem","KeypadFormRow","KeypadOptionalText","TextFieldExtended","TimeframeEndAdornment","KeypadCustomButtonFieldsNames","SCOPE","HotkeyInput","setRecording","fingers","handler","hotkeys","handleRecord","handleRestore","showsRecordButton","initialValues","KeypadTagFormModal","defaultValues","register","formState","watch","getValues","handleFormSubmit","top1Options","top2Options","typeOfPlayOptions","typeOfPlaySourceOptions","formIsDisabled","RemoveButtonModal","KeypadEdit","removeModalOpen","createButtonModalOpen","handleModalCancel","handleModalClosed","handleRemoveModalShow","handleRemoveModalCancel","handleRemoveModalClosed","KeypadEditPage","PageSubTitle","PageTitle","KeypadListItemContainer","KeypadNameContainer","KeypadIconContainer","KeypadMenuWrapper","KeypadDefaultBadge","KeypadListItem","onChangeName","onDuplicate","onSetDefault","isDefaultLoading","setIsDefaultLoading","handleChangeName","handleSetDefault","KeypadNameModal","nameValue","setNameValue","isSubmitDisabled","KeypadRemoveModal","KeypadListContent","comparer","sortArray","asc","f","isDefault","bodyUpdate","useKeypadListScreenState","AddKeypadButton","AddKeypadButtonActionText","KeypadListScreen","nameModalOpen","removeKeypadModalOpen","handleNameModalCancel","handleNameModalSave","handleDeleteModalCancel","handleDeleteModalSave","KeypadListPage","useCreateTaggingEvent","useCreateTaggingEventFromCurrentVideo","createTaggingEvent","recordingIdRef","recordingIsLiveRef","keypadTag","timeBefore","timeAfter","typeOfPlaySource","scrollbarStyles","TagFilterBar","TagsList","transformKeypads","keypads","transformKeypad","generateFetchKeypadQueryRef","useFetchKeypad","generateFetchKeypadsQueryRef","useFetchKeypads","loadingKeypad","useKeypads","setKeypadId","isKeypadFetchError","defaultKeypad","kp","handleChangeKeypad","ClipPlayerDialogIconButton","transformTaggingEventJobToPlaylistItem","calcStartTime","videoTypesPreferred","ClipPlayerDialog","playerElementRef","meta","interval","ClipTrimmerActions","sanitizeString","s","sanitizeNumber","n","startRecordingTime","mutatedVideoSources","r1","r2","fetchDeleteTaggingEvent","fetchRenameTaggingEvent","fetchUploadImportedTaggingEvents","fetchExportTaggingEvents","fetchTrimTaggingEvent","MIN_RANGE_TIME","RESCALE_FACTOR","updateState","range","valueLeft","valueRight","ClipTrimmer","setLoading","times","v","_ev","right","factor","SectionContent","SectionGroup","SectionChild","Section","rowChildrenCounterMap","colMap","childrenCounter","rowIdx","currentRowCounter","col","inc","cols","col_a","col_b","col_c","col_d","colIdx","nextCol","_props","KeypadPanelContainer","KeypadsPanelTopBar","KeypadsPanelKickOffTags","KeypadsPanelTitlesContainer","KeypadsPanelTitleContainer","KeypadPanelSections","KeypadPanelCustomButtons","KeypadPanelCustomButtonsContent","KeypadPanelCustomButtonsColumn","onPress","onPressStart","onPressEnd","onLongPress","onAnimationEnd","submit","buttonProps","pressTriggeredRef","longPressTriggeredRef","opts","bind","useLongPress","TagButtonBase","pressing","setPressing","animate","setAnimate","showTooltip","setShowTooltip","handleLongPress","handlePressStart","handlePressEnd","handlePress","handleAnimationEnd","isWhite","tooltipText","LiveStreamTagButton","videoStartRecordingTime","RecordingTagButton","TagButton","KeypadsPanel","offense","transition","defense","hasCustomButtons","getCustomButtons","TagFiltersContent","TagFiltersColumn","TagFiltersItem","TagFilterType","handleToggleAll","handleCheckFilterOption","filterOption","m","TagFiltersModal","handelApplyFilters","handleResetFilters","updateFilterType","ActionIcon","text","ImportUploaderContainer","ImportUploaderContent","ImportUploaderLabel","TagEventClipActionsContainer","TagEventActionButton","TagEventClipActions","ImportUploader","fileList","setFileList","TagRecordingActions","handleImportEvents","importing","setImporting","setShowsKeypad","showsKeypad","videoSrc","showsIEMenu","setShowsIEMenu","actionIconRef","handleShowIEMenu","handleHideIEMenu","handleCancelImport","handleShowImportForm","handleImportMenuOption","handleExportMenuOption","SortBy","onSort","handleSort","TagRecordingFilters","handleShowFiltersModal","filtering","TypeCounterContainer","TypeCounter","getIconPlayColor","TaggingEventClipTypeBackgroundColor","TaggingEventClipTypeColor","TaggingEventClipContainer","multiselect","TaggingEventClipEnd","TaggingEventEditableTextContainer","TaggingEventEditableText","outlinedInputClasses","TagEventClipMenu","initialShow","hasVideo","onTrim","onRename","setShow","showDeleteConfirm","setShowDeleteConfirm","handleShowDeleteConfirm","handleRename","handleShowPlaylistModal","handleClosePlaylistModal","handleShowTrimModal","handleAddClipToPlaylist","eventName","usePlaylistMenuItemId","useAddPlaylistMenuItem","setPlaylistMenuItems","setPlaylistItemValue","useResetRecoilState","TaggingEventClip","counter","onPlay","menuOpen","renaming","setRenaming","renamingLoading","setRenamingLoading","addPlaylistItem","resetUI","handleRenameCancel","handleRenameConfirm","handleEditNameInputChange","TaggingEventsListContainer","TaggingEventsListNotFoundImg","TagEventsSkeletonContainer","TagEventsSkeletonContent","Stripes","TagEventsListSkeleton","TaggingEventsList","TagRecordingScreen","sortOrder","setSortOrder","playingTaggingEvent","setPlayingTaggingEvent","removeMultiplePlaylistItems","addMultiplePlaylistItems","createTaggingEventFromCurrentVideo","keypadsData","handleCancelClipPlayer","showsFiltersModal","setShowsFiltersModal","trimEvent","setTrimEvent","handleCloseKeypads","handleStartTrim","handleEndTrim","handleHideFiltersModal","handleSaveTrim","newOrder","handlePlaylist","handleTimeline","countSelectedClips","handleOnMultiselectChange","selectedClip","handleShowKeypad","handleShowMultiselectMode","showSidePanel","generateLiveSessionAsMatchRef","useLiveTaggingSessionAsMatch","useTaggingToolTagRecordingData","isErrorMatch","isFetchingMatch","isSuccessMatch","isLoadingMatch","isErrorTaggingEvents","isFetchingTaggingEvents","isSuccessTaggingEvents","isLoadingTaggingEvents","keyPads","isErrorKeypads","isFetchingKeypads","isSuccessKeypads","isLoadingKeypads","useTaggingToolTagRecordingPage","taggingToolTagRecordingData","generateTaggingVideoTypes","sources","TaggingToolTagContainer","useSetUserAndClientIdForMetrics","redirectToExternalLogin","ProtectedRoute","Component","onlyAdminAccess","hasFeatureEnabled","isUserAuthorized","historyLocation","setUserAndClientIdForMetrics","Route","useIsLanguageDetectionReady","isLanguageReady","setIsLanguageReady","changeLanguage","BackofficeUnauthorizedContainer","BackofficeLoadingContainer","ALLOWED_BACKOFFICE_ORIGINS","backofficeDomainUrl","backofficeApiPrefix","backofficeApiVersionPrefix","backofficeApiWithVersionPrefix","cvatPrefix","fbvarsPrefix","watcherPrefix","jobManagerPrefix","backofficeApiUrl","validateBackofficeOrigin","allowedOrigin","annotationApiUrls","gameId","seasonId","addUpdatePlayersToGamesUrl","omitSortOptions","omit","playersWithFiltersUrl","getCompetitionsUrl","getSeasonClientsUrl","getCoachesUrl","getVenuesUrl","getSeasonsUrl","getStagesUrl","teamsWithFiltersUrl","getGamesUrl","googleAuthUrl","getGoogleOauth2LoginUrl","callbackUrl","useIsGoogleAuthorized","redirectToGoogleLogin","isLocalhost","BackofficeProtectedRoute","isBackofficeAuthorized","IconSystemAdmin","BackofficeSidebarLayoutSidebar","sidebarOpen","BackofficeSidebarLetterIcon","Avatar","useBackofficeSidebar","isBackofficeSidebarOpen","setIsBackofficeSidebarOpen","toggleBackofficeSidebar","BackofficeSidebarLayout","useAddUsersToClients","kogniaUsers","kogniaUserLocales","localeSchema","kogniaUserSchema","boolean","AddUsersToClientsFormFieldsNames","addUsersToClientsFormSchema","BackofficeContentContainer","getItems","getPage","useInfinityQuery","generateUrl","queryOptions","infinityQueryOptions","chooseNextCursorValue","totalPages","currentPage","transformClientWithLinks","transformClients","INITIAL_CLIENTS_FILTERS","clientsQueryKey","useClients","invalidateClients","AutocompleteActiveFilter","AutocompleteDropdownButton","AutocompletePopper","AutocompletePopperContent","AutocompletePopperWrapper","Details","Name","maxWidth","Result","AutocompleteResult","autocompleteWidth","AutocompleteResultsWrapper","onReset","resetText","AutocompleteTag","useSyncClientsSelection","setClients","setIsEnabled","clientsResults","handleSearchClients","AUTOCOMPLETE_WIDTH","SelectClients","syncClients","handleRemoveClient","updatedValues","handleRemoveAutocompleteClient","handleSetName","isOptionEqual","getOptionName","transformUsers","INITIAL_USERS_FILTERS","useKogniaUsers","SelectUsers","setKogniaUsersOnChange","kogniaUsersResults","handleSetFirstName","kogniaUser","AddUserToEnvironmentContainer","updatedKogniaUsers","setUpdateKogniaUsers","selectedClients","selectedKogniaUsers","handleAddOnSuccess","addUsersToClients","isValidSelection","setSelectedKogniaUsers","setSelectedClients","handleAddUsersToClients","CardActions","getQueryParams","isUndefined","useAllowedBackofficeOrigin","metadataApiErrorParser","fallbackErrorMessage","useAnnotationTask","getIsAllowedBackofficeOrigin","mutationRequest","AnnotationFormFieldsNames","BackofficeTaskType","BackofficePipelineType","BackofficeAnnotationToolType","optionalEmptyStringTransform","literal","recordingIdSchema","taskTypeSchema","nativeEnum","startIxSchema","endIxSchema","loadAllSchema","dryRunSchema","pipelineTypeSchema","annotationToolSchema","refineIndex","input","customIndexError","createTaskFormSchema","deleteTaskFormSchema","annotationsTaskFormSchema","labelsTaskFormSchema","validationTaskFormSchema","reprocessSyncFormSchema","reprocessThirdPartyEventsFormSchema","AnnotationFormLabels","AnnotationFormActions","FormItem","FormField","required","FormSelectField","helperText","showNoneOption","labelId","FormHelperText","getTypeOptions","AnnotationToolField","errors","FormInputField","EndIxField","StartIxField","IndexTypeGroup","resetField","indexType","setIndexType","handleRadioChange","PipelineTypeField","RecordingIdField","TaskTypeField","AnnotationsTask","annotateTask","AccordionDetails","AccordionActions","useCreateTask","FormSwitchField","defaultChecked","LoadAnnotationsField","CreateTask","createTask","handleCreateTask","deleteEpisodeOverlaysFormSchema","useDeleteEpisodeOverlays","EpisodeIndexField","DeleteEpisodeOverlays","confirmationDialogOpen","setConfirmationDialogOpen","handleConfirmDialogOpen","handleConfirmDialogClose","deleteEpisodeOverlays","handleConfirmSubmit","useDeleteTask","DeleteTask","hasStartIndexValue","hasEndIndexValue","deleteTask","useLabelsTask","LabelsTask","labelsTask","processEpisodeFormSchema","useProcessEpisode","ProcessEpisode","processEpisode","useReprocessSync","ReprocessSync","reprocessSync","useReprocessThirdPartyEvents","ReprocessThirdPartyEvents","reprocessThirdPartyEvents","useValidateTask","DryRunField","ValidateTask","validateTask","Annotation","Accordion","AccordionSummary","transformSeasonClients","seasonClient","transformSeasonClientsList","QUERY_KEY","useSeasonClients","useInvalidateSeasonClients","useQueryClient","getButtonTypeFromConfirmDialogType","ConfirmDialog","SeasonClientsListItem","useDeleteSeasonClients","invalidateSeasonClients","SeasonClientsFormFieldsNames","useCreateSeasonClients","useUpdateSeasonClients","useOnChangeSeasonSelection","setAutocompleteValue","results","selectedSeason","updatedSelectedSeason","transformStageSummaries","childStage","transformStages","transformStagesResponse","transformSeason","transformSeasons","useSeasons","isAllowedBackofficeOrigin","useInvalidateSeasons","RenderSelectOption","printSeasonName","season","printSummarySeasonName","INITIAL_RECORDING_SEASONS_FILTERS","SelectSeason","setSeasonOnChange","autocompleteValue","handleOnChangeSelection","handleDropdownClick","handleSelectSeason","SearchResults","SelectClient","setClientOnChange","handleSelectClient","SeasonClientsFormComponent","seasonName","isEdit","CompetitionSchema","StageMiniSummarySchema","StageSummarySchema","SeasonSchema","seasonClientsFormSchema","seasonClientsUpdateFormSchema","seasonClientsFormId","EMPTY_VALUES","SeasonClientsModal","handleCreate","originalClient","handleUpdate","handleCreateOrUpdate","SeasonClientsItem","seasonClients","isEditModalOpen","setIsEditModalOpen","isConfirmDeleteDialogOpen","setIsConfirmDeleteDialogOpen","deleteSeasonClients","handleEditModalOpen","handleEditModalClose","handleDeleteSeasonClients","SeasonClientsList","seasonClientsList","seasonClientsItems","SeasonClientsListHeaderGrid","ListSkeleton","SeasonClients","isCreateModalOpen","setIsCreateModalOpen","handleCreateModalOpen","handleCreateModalClose","transformData","transformCoaches","useCoaches","useInvalidateCoaches","useCreateCoach","formData","useUpdateCoach","LabelOptional","FormFormLabel","optional","CoachFormFieldsNames","CoachesForm","trigger","coachFormSchema","CoachPhotoPreviewContainer","CoachPhotoContainer","CoachImageContainer","CoachImageElement","fullSize","CoachPhoto","CoachPhotoSkeletonContainer","small","CoachPhotoSkeleton","CoachPhotoPreview","photoUrl","coachesFormId","CoachModal","coach","invalidateCoaches","coachImage","photoUrlValue","CoachListItem","useDeleteCoach","coachId","CoachItem","deleteCoach","handleDeleteCoach","CoachesList","coaches","coachesItems","coache","Coaches","handleSearchChange","transformCompetitions","useCompetitions","useInvalidateCompetitions","useCreateCompetition","invalidateCompetitions","useUpdateCompetition","CompetitionFormFieldsNames","CompetitionsForm","competitionFormSchema","competitionsFormId","CompetitionModal","CompetitionsListItem","useDeleteCompetition","competitionId","CompetitionItem","deleteCompetition","handleDeleteCompetition","CompetitionsList","competitions","competitionsItems","Competitions","useCreateClient","getErrorByFieldName","fieldName","EnvironmentFormFieldsNames","EnvironmentFormLabels","isValidId","environmentFormSchema","val","Countries","generateEnvironmentFormFields","country","EnvironmentForm","useImperativeHandle","handleOnFormSubmit","formFieldRender","ErrorMessage","formFieldsRender","CreateEnvironmentPage","createClient","environmentFormRef","handleCreateClient","transformClient","useCreateBranding","BrandingPreviewImg","BrandingFormFieldsNames","BrandingFormLabels","brandingFormRequiredSchema","fields","brandingFormOptionalSchema","generateBrandingFormFields","previewUrls","BrandingForm","brandingAssetsUrls","CreateEnvironmentBranding","createBrandingFormRef","environment","handleCreateBranding","backendApiErrorParser","useCreateUser","CreateUserFormFieldsNames","createUserFormSchema","CreateClientFormLabels","CreateUserContainer","createdUser","setCreatedUser","createUser","handleCreateUser","inputFormFields","useEditClient","EditEnvironment","editClient","isLoadingClient","useEditBranding","EditEnvironmentBranding","edit","editBrandingFormRef","useRemoveBranding","EnvironmentDetail","remove","handleRemoveBranding","EnvironmentItemContainer","EnvironmentItemColumn","IconEye","EnvironmentItem","hasBranding","EnvironmentsList","environments","environmentItems","handleCreateEnvironment","transformMetadataTeam","transformMetadataCoach","transformMetadataPlayer","transformMetadataGame","transformMetadataGames","transformMetadataGamesFromApiResponse","getMetadataGameQueryKey","useMetadataGame","useInvalidateMetadataGame","useMetadataGames","useInvalidateMetadataGames","useInvalidateMetadataRecordings","useCreateMetadataRecording","invalidateRecordings","invalidateMetadataGames","GameListHeaderGrid","GridListItem","GridListItemRecording","GamerRecording","invalidateMetadataGame","setClientIds","GameRecordingsList","isValidDate","generateRecordingId","dateStr","homeAbb","awayAbb","year","month","day","DEFAULT_RECORDING_TYPE","AddRecordingIdDialogForm","game","isValid","newRecordingSchema","hasRecordingIds","defaultRecordingId","NewRecordingFormFieldsNames","AddRecordingIdDialog","GamesListItem","useDeleteMetadataGame","PlayerPhotoSkeletonContainer","PlayerPhotoSkeleton","GameItem","isRecordingDialogOpen","setIsRecordingDialogOpen","deleteMetadataGame","handleDeleteGame","hasRecordings","GamesList","games","gamesItems","newGameData","NEW_GAMES_STEPS","NEW_GAME_FORM_STEPS","FORM_IDS","getCurrentStepFromPathName","pathname","useIsCreateGameStepValid","gameData","useIsUpdateCreateGameStepValid","useCheckValidateStep","checkIsCreateGameStepValid","checkIsUpdateGameStepValid","useTeamData","useGameInfo","useSetTeamData","setNewGameData","teamData","useResetGameFormData","useSetGameInfo","gameInfo","useSetGameData","Games","resetFormData","EditGame","setHomeTeamMetaData","p","awayTeam","transformMappings","position","side","usePlayersMappings","GridListItemTeamPlayer","TeamCard","mappings","GridListItemPlayer","GameSummary","resetGameFormData","CardHeader","BackButton","GameFormNavigation","handleSubmitCurrentForm","form","handleBackButton","finishAction","LABELS","GameFormStepper","Stepper","Step","StepLabel","TextsWithFieldHoverLabel","addPlayersToGameErrorParser","useAddPlayersToGame","useCreateMetadataGame","invalidateGames","MatchEndType","useCreateNewGameWithPlayers","addPlayersToGame","useDeleteMetadataGamePlayers","useUpdateMetadataGame","useUpdateNewGameWithPlayers","deleteMetadataGamePlayers","handleAddNewPlayerToGame","INITIAL_RECORDING_COACHES_FILTERS","SelectCoach","setCoachOnChange","handleSelectCoach","transformVenues","useVenues","useInvalidateVenues","INITIAL_RECORDING_VENUES_FILTERS","SelectVenue","setVenueOnChange","venue","handleSelectVenue","useStages","useInvalidateStages","useCreateStage","invalidateStages","useUpdateStage","stageId","StageFormFieldsNames","useSeason","adjustOrderIndexForDisplay","orderIndex","DEFAULT_ORDER_INDEX","StagesForm","formSeason","parentStageId","stage","numberTextField","stageFormSchema","stagesFormId","StageModal","VenueSchema","metadataTeamSchema","playerFixtureTeamSchema","playerFixtureSchema","playerSummarySchema","TeamFormFieldsNames","gameTeamFormSchema","jerseyNumbers","GameInfoFormFieldsNames","coachSchema","gameInfoFormSchema","generateDefaultTitle","GameInfoForm","setGameInfo","invalidateSeasons","isCreateStageModalOpen","setIsCreateStageModalOpen","gameInfoFormRef","createGame","updateGame","handleSetTeamData","seasonValue","restFieldProps","GameFormInfo","transformGamePlayer","PlayerListHeader","IconRemove","PlayerImageContainer","PlayerImageElement","PlayerPhoto","getJerseyNumber","getTeamName","getTeamLastGameDate","isIndexSpecificPosition","getSideValue","found","getPlayerSide","SelectedPlayerItem","removePlayers","onUpdatePlayer","hasJerseyNumberError","handleSelectPosition","handleSelectSide","handleOnBlurJerseyNumber","jerseyNumber","playersPositions","playersSides","teamName","lastGameDate","formattedLastGameDate","isGoalkeeperPosition","isUnknownPosition","SelectedPlayersList","selectedPlayers","jerseyNumbersCount","SelectedPlayers","getLatestPlayersFromGames","latestUniquePlayersFromGames","gamePlayers","playerFixturesDateInAcc","playerFixturesDateInPlayer","transformTeam","fixture","transformTeams","useTeam","transformPlayer","transformPlayers","transformPlayersResponse","useCreatePlayer","PLAYERS_QUERY_KEY","usePlayers","useInvalidatePlayers","PlayerFormFieldsNames","PlayerForm","createPlayerFormSchema","editPlayerFormSchema","PlayerPhotoPreviewContainer","PlayerPhotoContainer","PlayerPhotoPreview","CreatePlayerModal","invalidatePlayers","playerImage","createPlayer","handleCreatePlayer","handleModalSubmit","TEAMS_QUERY_KEY","useTeams","useInvalidateTeams","useCreateBackofficeTeam","teamFormSchema","createTeamFormSchema","editTeamFormSchema","TeamForm","teamLogo","logoUrlValue","teamTypes","countryCodes","CreateTeamModal","handleCreateTeam","useMetadataGameQueries","gameIds","gameQueries","useQueries","SelectableListOfPlayers","latestPlayers","addPlayers","displayOption","isMappingsLoading","handleCheckboxChange","toggleAllPlayers","playerIds","isIndeterminate","Team","Date","AutocompletePlayerResult","INITIAL_PLAYERS_FILTERS","SelectPlayers","setPlayersOnChange","showPlayersSelectionList","playersResults","handleSetPlayersOnChange","handleRemoveAutocompletePlayer","INITIAL_TEAMS_FILTERS","SelectMetadataTeam","setTeamOnChange","teamsResults","handleSelectTeam","selectedFixtureIds","setSelectedFixtureIds","isCreateTeamModalOpen","setIsCreateTeamModalOpen","isCreatePlayerModalOpen","setIsCreatePlayerModalOpen","setTeamData","teamFormRef","selectedTeam","isLoadingGames","handleAddPlayers","selectedPlayersIds","playersToAdd","handleAddPlayer","handleUpdatePlayer","handleRemovePlayers","removePlayerIds","latestPlayersFromGames","HomeTeamForm","OpponentTeamForm","BackofficeSectionWrapper","BackofficeSectionTitle","BackofficeSectionIcon","BackofficeSection","getPageTitle","GameForm","currentStep","NewGame","resetNewGameData","useEditPlayer","EditPlayerModal","editPlayer","handleEditPlayer","createData","TableData","playerFixture","PlayerDetailsModal","playerDetails","PlayersListItem","PlayerItem","isDetailsModalOpen","setIsDetailsModalOpen","handleDetailsModalOpen","handleDetailsModalClose","playersItems","PlayersListSkeleton","Players","handleCreatePlayerModalOpen","handleCreatePlayerModalClose","ProcessGamePreset","PresetSelector","selectedPreset","handleSelectPreset","ButtonGroup","FilesChyronHegoSetOneFieldsNames","FilesChyronHegoSetTwoFieldsNames","FilesHawkeyeFieldsNames","FilesSecondSpectrumFieldsNames","FilesSignalityFieldsNames","FilesOptaFieldsNames","FilesBundesligaFieldsNames","SportlogiqTrackingType","filesHawkeyeSchema","filesChyronHegoSetOneSchema","filesChyronHegoSetTwoSchema","filesSecondSpectrumSetOneSchema","filesSecondSpectrumSetTwoSchema","filesSignalitySchema","filesOptaSchema","filesBundesligaSchema","ProcessGameEventsProvider","ProcessGamePipelineType","ProcessGameFieldsNames","ProcessGameTrackingProvider","filesSchema","processGameFormSchema","eventsFilesFieldsNames","trackingFilesFieldsNames","processGameDefaultValues","PRESETS_FORMS_DEFAULTS","BundesligaForm","textFieldsList","textField","ChyronHegoForm","setSet","textFieldsListSetOne","textFieldsListSetTwo","textFieldsSetOne","textFieldsSetTwo","HawkeyeForm","OptaForm","SecondSpectrumForm","SignalityForm","SportlogiqForm","defaultValue","useProcessGame","eventsFileNames","isEventsFile","trackingFileNames","isTrackingFile","useHandleProcessGameSubmit","processGame","videoPath","bucket","pipelineType","trackingProvider","eventsProvider","runProcessing","restartProcessing","autoRunTacticalAnalysis","sportlogiqTrackingType","restData","filesNonEmptyData","ProcessGameFormWidget","handleProcessGameSubmit","unregister","showProviderField","showTrackingProviderFields","showEventsProviderFields","ProcessGamePage","setSelectedPreset","renderCounter","setRenderCounter","handlePresetChange","prevCounter","useCreateSeason","useUpdateSeason","SeasonCompetitionFormFieldsNames","FIRST_YEAR","getYears","addYears","SelectCompetition","setCompetitionOnChange","competitionResults","handleSelectCompetition","SeasonCompetitionsForm","seasonCompetitionFormSchema","seasonsFormId","SeasonCompetitionModal","crossesYear","StageItem","childStages","nested","SeasonCompetitionStages","stages","collapsed","setCollapsed","filteredStages","stagesChunk1","stagesChunk2","SeasonCompetitionsListItem","useDeleteSeason","SeasonCompetitionItem","deleteSeason","handleDeleteSeason","seasonYearName","SeasonCompetitionsList","seasons","seasonsItems","SeasonCompetitionsListHeaderGrid","SeasonCompetitions","StagesListItem","useDeleteStage","deleteStage","handleDeleteStage","stageValues","StagesList","stagesItems","StageListHeaderGrid","Stages","TeamListItem","useUpdateTeam","EditTeamModal","editTeam","handleEditTeam","teamFixture","TeamDetailsModal","teamDetails","TeamItem","TeamsList","teamsItems","TeamsListSkeleton","TeamListHeaderGrid","Teams","handleCreateTeamModalOpen","handleCreateTeamModalClose","useCreateVenue","invalidateVenues","useUpdateVenue","VenueFormFieldsNames","VenuesForm","venueFormSchema","venuesFormId","VenueModal","VenuesListItem","useDeleteVenue","VenueItem","deleteVenue","handleDeleteVenue","countryCode","VenuesList","venues","venuesItems","VenueListHeaderGrid","Venues","BackofficeContent","BackofficeContainer","useGenerateTemporaryPlaylist","SENTRY_DSN_URL","GRAFANA_FARO_COLECTOR_URL","SUPERSET_URL","VITE_SUPERSET_URL","SUPERSET_PLAYER_PROFILE_DASHBOARD_ID","VITE_SUPERSET_PLAYER_PROFILE_DASHBOARD_ID","fetchGuestToken","embedSupersetDashboard","dashboardUrlParams","embedDashboard","fetchDashboard","useEmbeddedDashboard","EmbeddedDashboardFeature","dontPassThisParam","paramsObject","DashboardPlaylistItemSchema","DashboardPlaylistGenericPayloadSchema","useDashboardEvents","onEvent","messageHandler","INPUT_WIDTH","saveTemporaryPlaylistSchema","SaveTemporaryPlaylistFeature","showModal","setShowModal","PlaylistItemPositionWrapper","useTemporaryPlaylistItemOptions","TemporaryPlaylistItem","TemporaryPlaylistItemsList","TemporaryPlaylist","TemporaryPlaylistWidget","DashboardPreviewPage","dashboardIdQueryParam","setDashboardId","temporalPlaylist","setTemporalPlaylist","generateTemporaryPlaylist","PlayerProfileDashboardPage","MessageContainer","Message","fetchCreateLiveTaggingRecording","fetchUpdateTaggingRecordingAlignment","fetchUpdateTaggingRecordingAlignmentWithMerge","fetchCreateUploadRecording","fetchUploadVideo","onProgress","calculateProgress","abortController","loaded","fetchInitiateMultipartUpload","fetchMultipartUploadUrl","fetchCompleteMultipartUpload","fetchAbortMultipartUpload","fetchUploadMultipartVideo","file","onInit","initResponse","FILE_CHUNK_SIZE","NUM_CHUNKS","partETags","presignedUrlResponse","uploadPartResponse","AlignRecordingContainer","AlignRecordingContent","AlignRecordingVideoPlayerContainer","AlignRecordingActionsContainer","AlignRecordingClipListContainer","AlignRecordingClipContainer","AlignRecordingName","AlignRecordingBottomActions","AlignRecordingClipCard","RecordingAlignmentClip","aligning","alignmentDiff","videoDuration","onCheckedChange","AlignRecording","setAligning","canAlign","setMeta","setEvents","sourceRecordingId","setCanAlign","canFinish","setCanFinish","setAlignmentDiff","selectedAlignmentEvent","setSelectedAlignmentEvent","fetching","setFetching","handleAlign","handleEditAlignment","handleFinish","finalize","handleBack","showFinish","diffTime","ALIGNMENT_PLAYER_ID","RecordingAlignment","generateVideoTypes","useFetchTaggingRecordings","AlignmentSourceRecordingList","AlignmentSourceRecordingListItem","AlignmentSourceRecordingCard","AlignmentSourceActions","AlignmentSourceList","setSelected","AlignmentSourceListContainer","LiveSessionsFilterNames","ALLOWED_LIVE_SESSIONS_QUERY_PARAMS","useLiveSessionsFilters","transformLiveSessionsRecordings","transformLiveSessions","liveSessionsWithFiltersQueryKey","getLiveSessionsItems","invalidateLiveSessionsWithFiltersQuery","useLiveSessionsWithFilters","updateFilters","TaggingRecordingList","handleNewLiveRecording","now","start_recording_time","handleDateRangeClose","TaggingToolRecordingList","UploadAutocompleteTextField","UploadColumn","UploadInput","UploadLabelWithLink","UploadOutlinedInput","OutlinedInput","UploadVideoStepOneFormFields","UploadVideoStepOneType","uploadVideoStepOneDefaultValues","typeSchema","teamSchema","dateSchema","stringSchema","recordingTitleSchema","uploadVideoStepOneTrainingSchema","uploadVideoStepOneMatchSchema","uploadVideoStepOneFormSchema","union","fetchTeams","UploadVideoStep1Screen","setTeams","formTypeValue","refreshTeamsData","handleNext","formValues","requiredValues","uploadRecordingBody","UploadIcon","UploadVideoDropArea","UploadProgress","LinearProgress","UploadMessageContainer","UploadVideoStep2Screen","setError","fileName","setFileName","uploading","setUploading","multipartProgress","setMultipartProgress","finished","setFinished","multipartUploadId","setMultipartUploadId","setAbortController","onDrop","acceptedFiles","progress","getRootProps","getInputProps","isDragActive","isDragAccept","isDragReject","useDropzone","handleCancelUpload","rootProps","Routes","favicon","AccountPage","Redirect","useSubscribeEvents","subscription","App","Router","initErrorTracker","sentryRoutes","Sentry.init","Sentry.BrowserTracing","Sentry.reactRouterV5Instrumentation","initMetricsCollector","initializeFaro","getWebInstrumentations","TracingInstrumentation","root","ReactDOM"],"mappings":"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"}