Files
mtdb_movie/bootstrap/ssr/assets/user-profile-link-0bca566c.mjs.map
maher 703f50a09d
Some checks failed
Build / run (push) Has been cancelled
first commit
2025-10-29 11:42:25 +01:00

1 line
783 KiB
Plaintext
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"user-profile-link-0bca566c.mjs","sources":["../../../common/resources/client/datatable/filters/backend-filter.ts","../../../common/resources/client/utils/date/start-of-day.ts","../../../common/resources/client/utils/date/end-of-day.ts","../../../common/resources/client/i18n/get-user-timezone.ts","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets.ts","../../../common/resources/client/icons/material/DateRange.tsx","../../../common/resources/client/ui/forms/input-field/input.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/date-picker-field.tsx","../../../common/resources/client/ui/forms/input-field/date/utils.ts","../../../common/resources/client/ui/forms/input-field/date/use-base-date-picker-state.ts","../../../common/resources/client/i18n/use-current-date-time.ts","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/use-date-range-picker-state.ts","../../../common/resources/client/icons/material/ArrowRightAlt.tsx","../../../common/resources/client/ui/forms/input-field/date/segments/utils/adjust-segment.ts","../../../common/resources/client/ui/forms/input-field/date/segments/utils/set-segment.ts","../../../common/resources/client/ui/forms/input-field/date/segments/utils/page-step.ts","../../../common/resources/client/ui/forms/input-field/date/segments/editable-date-segment.tsx","../../../common/resources/client/ui/forms/input-field/date/segments/literal-segment.tsx","../../../common/resources/client/ui/forms/input-field/date/segments/utils/get-segment-limits.ts","../../../common/resources/client/ui/forms/input-field/date/segments/date-segment-list.tsx","../../../common/resources/client/icons/material/KeyboardArrowRight.tsx","../../../common/resources/client/ui/forms/input-field/date/calendar/calendar-cell.tsx","../../../common/resources/client/ui/forms/input-field/date/calendar/calendar-month.tsx","../../../common/resources/client/ui/forms/input-field/date/calendar/calendar.tsx","../../../common/resources/client/i18n/formatted-date-time-range.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-preset-list.tsx","../../../common/resources/client/utils/hooks/is-tablet-media-query.ts","../../../common/resources/client/ui/forms/toggle/switch.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-presets.ts","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-preset-list.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/dialog/date-range-dialog.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/date-range-picker.tsx","../../../common/resources/client/ui/forms/input-field/date/date-range-picker/form-date-range-picker.tsx","../../../common/resources/client/datatable/filters/backend-filters-url-key.ts","../../../common/resources/client/datatable/filters/utils/decode-backend-filters.ts","../../../common/resources/client/datatable/filters/utils/encode-backend-filters.ts","../../../common/resources/client/datatable/filters/backend-filter-url-params.ts","../../../common/resources/client/datatable/requests/paginated-resources.ts","../../../common/resources/client/utils/keybinds/is-ctrl-key-pressed.ts","../../../common/resources/client/ui/tables/navigate-grid.ts","../../../common/resources/client/ui/tables/table-context.ts","../../../common/resources/client/ui/tables/style/use-table-cell-style.ts","../../../common/resources/client/ui/tables/table-cell.tsx","../../../common/resources/client/ui/interactions/use-pointer-events.ts","../../../common/resources/client/utils/keybinds/is-ctrl-or-shift-pressed.ts","../../../common/resources/client/ui/tables/style/use-table-row-style.ts","../../../common/resources/client/ui/tables/table-row.tsx","../../../common/resources/client/ui/tables/checkbox-column-config.tsx","../../../common/resources/client/icons/material/ArrowDownward.tsx","../../../common/resources/client/ui/tables/header-cell.tsx","../../../common/resources/client/ui/tables/table-header-row.tsx","../../../common/resources/client/ui/tables/table.tsx","../../../common/resources/client/http/backend-response/pagination-response.ts","../../../common/resources/client/icons/material/FilterAlt.tsx","../../../common/resources/client/ui/accordion/accordtion-animation.ts","../../../common/resources/client/ui/accordion/accordion.tsx","../../../common/resources/client/datatable/filters/panels/select-filter-panel.tsx","../../../common/resources/client/datatable/filters/panels/date-range-filter-panel.tsx","../../../common/resources/client/ui/images/avatar.tsx","../../../common/resources/client/users/queries/use-normalized-models.ts","../../../common/resources/client/users/queries/use-normalized-model.ts","../../../common/resources/client/ui/forms/normalized-model-field.tsx","../../../common/resources/client/datatable/filters/panels/normalized-model-filter-panel.tsx","../../../common/resources/client/datatable/filters/filter-operator-names.ts","../../../common/resources/client/datatable/filters/panels/input-filter-panel.tsx","../../../common/resources/client/datatable/filters/panels/boolean-filter-panel.tsx","../../../common/resources/client/ui/forms/input-field/chip-field/chip-list.tsx","../../../common/resources/client/ui/forms/input-field/chip-field/string-to-chip-value.ts","../../../common/resources/client/ui/forms/input-field/chip-field/chip-field.tsx","../../../common/resources/client/ui/forms/input-field/chip-field/form-chip-field.tsx","../../../common/resources/client/datatable/filters/panels/chip-field-filter-panel.tsx","../../../common/resources/client/datatable/filters/add-filter-dialog.tsx","../../../common/resources/client/datatable/filters/add-filter-button.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-trigger-button.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-item-dialog-trigger.tsx","../../../common/resources/client/i18n/formatted-number.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-control.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list.tsx","../../../common/resources/client/datatable/filters/filter-list/filter-list-skeleton.tsx","../../../common/resources/client/icons/material/Add.tsx","../../../common/resources/client/datatable/column-templates/name-with-avatar.tsx","../../../common/resources/client/ui/forms/slider/base-slider.tsx","../../../common/resources/client/ui/forms/slider/use-slider.ts","../../../common/resources/client/ui/forms/slider/slider-thumb.tsx","../../../common/resources/client/ui/forms/slider/slider.tsx","../../../common/resources/client/utils/hooks/use-previous.ts","../../../common/resources/client/ui/interactions/dnd/drag-state.ts","../../../common/resources/client/ui/interactions/interactable-event.ts","../../../common/resources/client/ui/interactions/active-interaction.ts","../../../common/resources/client/ui/interactions/utils/dom-rect-to-obj.ts","../../../common/resources/client/ui/interactions/dnd/update-rects.ts","../../../common/resources/client/ui/interactions/dnd/use-draggable.ts","../../../common/resources/client/ui/interactions/dnd/read-files-from-data-transfer.ts","../../../common/resources/client/utils/array/async-iterable-to-array.ts","../../../common/resources/client/ui/interactions/dnd/use-droppable.ts","../../../common/resources/client/ui/interactions/dnd/sortable/sortable-line-strategy.ts","../../../common/resources/client/utils/array/move-item-in-array.ts","../../../common/resources/client/utils/array/move-item-in-new-array.ts","../../../common/resources/client/ui/interactions/dnd/sortable/sortable-transform-strategy.ts","../../../common/resources/client/ui/interactions/dnd/sortable/sortable-move-node-strategy.ts","../../../common/resources/client/ui/interactions/dnd/sortable/use-sortable.ts","../../../common/resources/client/icons/material/Tune.tsx","../../../common/resources/client/icons/material/MoreVert.tsx","../../../common/resources/client/ui/tabs/tabs-context.tsx","../../../common/resources/client/ui/tabs/tabs.tsx","../../../common/resources/client/ui/tabs/tab-line.tsx","../../../common/resources/client/ui/tabs/tab-list.tsx","../../../common/resources/client/ui/tabs/tab.tsx","../../../common/resources/client/icons/material/DragHandle.tsx","../../../common/resources/client/ui/interactions/dnd/drag-preview.tsx","../../../common/resources/client/utils/hooks/sticky-sentinel.ts","../../../common/resources/client/admin/crupdate-resource-layout.tsx","../../../common/resources/client/ui/overlays/dialog/image-zoom-dialog.tsx","../../../common/resources/client/icons/material/ChevronLeft.tsx","../../../common/resources/client/admin/channels/playlist.svg","../../../common/resources/client/channels/use-channel-query-params.ts","../../../common/resources/client/channels/requests/use-channel.ts","../../../resources/client/titles/models/title.ts","../../../resources/client/titles/models/news-article.ts","../../../common/resources/client/channels/channel.ts","../../../resources/client/titles/models/person.ts","../../../common/resources/client/icons/material/GridView.tsx","../../../common/resources/client/icons/material/ViewWeek.tsx","../../../common/resources/client/icons/material/ViewList.tsx","../../../resources/client/admin/channels/channel-content-config.tsx","../../../common/resources/client/admin/channels/channel-editor/controls/content-model-field.tsx","../../../resources/client/titles/models/genre.ts","../../../resources/client/titles/models/production-country.ts","../../../common/resources/client/admin/channels/channel-editor/controls/content-order-field.tsx","../../../common/resources/client/utils/hooks/is-touch-device.ts","../../../common/resources/client/icons/material/Refresh.tsx","../../../common/resources/client/admin/channels/requests/use-update-channel-content.ts","../../../common/resources/client/channels/requests/use-channel-content.ts","../../../common/resources/client/ui/navigation/use-scroll-to-top.ts","../../../common/resources/client/icons/material/FirstPage.tsx","../../../common/resources/client/ui/navigation/pagination-controls.tsx","../../../common/resources/client/admin/channels/requests/use-reorder-channel-content.ts","../../../common/resources/client/admin/channels/requests/use-add-to-channel.ts","../../../common/resources/client/admin/channels/requests/use-remove-from-channel.ts","../../../common/resources/client/admin/channels/channel-editor/channel-content-editor.tsx","../../../common/resources/client/admin/channels/requests/use-addable-content.ts","../../../common/resources/client/admin/channels/channel-editor/channel-content-search-field.tsx","../../../common/resources/client/icons/material/Image.tsx","../../../resources/client/admin/channels/channel-content-item-image.tsx","../../../resources/client/news/news-article-link.tsx","../../../common/resources/client/icons/material/Newspaper.tsx","../../../resources/client/news/news-article-image.tsx","../../../common/resources/client/comments/requests/use-delete-comments.ts","../../../common/resources/client/ui/images/user-avatar.tsx","../../../common/resources/client/ui/infinite-scroll/use-infinite-data.ts","../../../resources/client/reviews/requests/use-reviews.ts","../../../resources/client/reviews/requests/use-delete-reviews.ts","../../../common/resources/client/icons/material/Star.tsx","../../../resources/client/reviews/title-rating.tsx","../../../common/resources/client/icons/material/StarBorder.tsx","../../../resources/client/reviews/review-list/star-selector.tsx","../../../resources/client/titles/bullet-separated-items.tsx","../../../common/resources/client/icons/material/Sort.tsx","../../../resources/client/reviews/review-list/review-list-sort-button.tsx","../../../resources/client/base-media-link.tsx","../../../resources/client/seasons/season-link.tsx","../../../resources/client/episodes/episode-link.tsx","../../../resources/client/episodes/compact-season-episode.tsx","../../../resources/client/titles/title-link.tsx","../../../resources/client/videos/watch-page/get-watch-link.ts","../../../common/resources/client/icons/media/media-play.tsx","../../../resources/client/titles/title-poster/title-poster.tsx","../../../resources/client/videos/video-player-skeleton.tsx","../../../common/resources/client/utils/platform.ts","../../../common/resources/client/player/utils/guess-player-provider.ts","../../../common/resources/client/utils/array/shuffle-array.ts","../../../common/resources/client/player/utils/player-local-storage.ts","../../../common/resources/client/utils/array/prepend-to-array-at-index.ts","../../../common/resources/client/player/utils/reset-media-session.ts","../../../common/resources/client/player/player-queue.ts","../../../common/resources/client/player/handle-player-keybinds.ts","../../../common/resources/client/player/utils/init-player-media-session.ts","../../../common/resources/client/player/utils/is-same-media.ts","../../../common/resources/client/player/state/fullscreen/screen-orientation.ts","../../../common/resources/client/player/state/fullscreen/create-native-fullscreen-adapter.ts","../../../common/resources/client/player/state/fullscreen/create-iphone-fullscreen-adapter.ts","../../../common/resources/client/player/state/fullscreen/fullscreen-slice.ts","../../../common/resources/client/player/state/pip/chrome-pip-adapter.ts","../../../common/resources/client/player/state/pip/safari-pip-adapter.ts","../../../common/resources/client/player/state/pip/pip-slice.ts","../../../common/resources/client/player/state/player-store.tsx","../../../common/resources/client/player/player-context.tsx","../../../common/resources/client/player/providers/youtube/youtube-types.ts","../../../common/resources/client/utils/number/is-number.ts","../../../common/resources/client/utils/http/load-image.ts","../../../common/resources/client/player/providers/youtube/load-youtube-poster.ts","../../../common/resources/client/player/providers/youtube/handle-youtube-embed-message.tsx","../../../common/resources/client/player/hooks/use-player-store.tsx","../../../common/resources/client/player/hooks/use-player-actions.ts","../../../common/resources/client/player/utils/youtube-id-from-src.ts","../../../common/resources/client/player/providers/youtube/use-youtube-provider-src.ts","../../../common/resources/client/player/providers/youtube/youtube-provider.tsx","../../../common/resources/client/utils/dom/create-ref-loop.ts","../../../common/resources/client/player/providers/html-media/use-html-media-internal-state.ts","../../../common/resources/client/player/providers/html-media/use-html-media-events.ts","../../../common/resources/client/player/providers/html-media/use-html-media-api.ts","../../../common/resources/client/player/providers/html-video-provider.tsx","../../../common/resources/client/player/providers/html-audio-provider.tsx","../../../common/resources/client/player/ui/player-outlet.tsx","../../../common/resources/client/player/ui/controls/player-poster.tsx","../../../common/resources/client/player/hooks/use-player-click-handler.ts","../../../common/resources/client/player/ui/controls/buffering-spinner.tsx","../../../common/resources/client/player/hooks/use-current-time.ts","../../../common/resources/client/player/ui/controls/seeking/seekbar.tsx","../../../common/resources/client/icons/media/media-pause.tsx","../../../common/resources/client/player/ui/controls/play-button.tsx","../../../common/resources/client/icons/media/media-next.tsx","../../../common/resources/client/player/ui/controls/next-button.tsx","../../../common/resources/client/icons/media/media-mute.tsx","../../../common/resources/client/icons/media/media-volume-low.tsx","../../../common/resources/client/icons/media/media-volume-high.tsx","../../../common/resources/client/player/ui/controls/volume-controls.tsx","../../../common/resources/client/i18n/formatted-duration.tsx","../../../common/resources/client/player/ui/controls/formatted-current-time.tsx","../../../common/resources/client/player/ui/controls/formatted-player-duration.tsx","../../../common/resources/client/icons/media/media-closed-captions.tsx","../../../common/resources/client/icons/media/media-closed-captions-on.tsx","../../../common/resources/client/player/ui/controls/toggle-captions-button.tsx","../../../common/resources/client/icons/material/ArrowRight.tsx","../../../common/resources/client/icons/media/media-settings.tsx","../../../common/resources/client/icons/media/media-playback-speed-circle.tsx","../../../common/resources/client/icons/media/media-settings-menu.tsx","../../../common/resources/client/icons/media/media-arrow-left.tsx","../../../common/resources/client/icons/media/media-language.tsx","../../../common/resources/client/player/ui/controls/playback-options-button.tsx","../../../common/resources/client/icons/media/media-fullscreen-exit.tsx","../../../common/resources/client/icons/media/media-fullscreen.tsx","../../../common/resources/client/player/ui/controls/fullscreen-button.tsx","../../../common/resources/client/icons/media/media-picture-in-picture-exit.tsx","../../../common/resources/client/icons/media/media-picture-in-picture.tsx","../../../common/resources/client/player/ui/controls/pip-button.tsx","../../../common/resources/client/player/ui/video-player/video-player-controls.tsx","../../../common/resources/client/player/ui/video-player/video-player.tsx","../../../resources/client/titles/title-poster/title-backdrop.tsx","../../../resources/client/videos/video-thumbnail.tsx","../../../resources/client/videos/requests/use-log-video-play.ts","../../../resources/client/episodes/episode-poster/episode-poster.tsx","../../../common/resources/client/icons/material/ArrowBack.tsx","../../../common/resources/client/icons/material/ArrowForward.tsx","../../../common/resources/client/icons/material/Tv.tsx","../../../resources/client/seasons/requests/use-season.ts","../../../resources/client/titles/requests/use-season-episodes.ts","../../../common/resources/client/ui/infinite-scroll/infinite-scroll-sentinel.tsx","../../../common/resources/client/icons/media/media-episodes.tsx","../../../resources/client/videos/watch-page/episode-selector.tsx","../../../resources/client/videos/site-video-player.tsx","../../../resources/client/channels/channel-header/get-title-channel-filters.ts","../../../resources/client/titles/use-title-index-filters.ts","../../../resources/client/titles/requests/use-title.ts","../../../resources/client/titles/models/episode.ts","../../../resources/client/reviews/requests/use-create-review.ts","../../../resources/client/reviews/rating-dialog.tsx","../../../resources/client/reviews/requests/use-current-user-ratings.ts","../../../resources/client/use-auth-click-capture.ts","../../../resources/client/reviews/interactable-rating.tsx","../../../resources/client/seasons/episode-list-item.tsx","../../../resources/client/titles/requests/use-title-seasons.ts","../../../resources/client/seasons/season-poster.tsx","../../../common/resources/client/icons/material/PlayCircle.tsx","../../../resources/client/titles/video-grid.tsx","../../../resources/client/episodes/requests/use-episode.ts","../../../resources/client/people/person-link.tsx","../../../resources/client/people/person-poster/person-poster.tsx","../../../resources/client/people/known-for-compact.tsx","../../../resources/client/people/requests/use-person.ts","../../../resources/client/admin/news/requests/use-news-article.ts","../../../resources/client/admin/lists/todo.svg","../../../resources/client/user-lists/requests/use-create-list.ts","../../../resources/client/user-lists/pages/crupdate-user-list-form.tsx","../../../resources/client/user-lists/pages/create-user-list-page.tsx","../../../resources/client/user-lists/requests/use-update-list.ts","../../../resources/client/user-lists/pages/edit-user-list-page.tsx","../../../common/resources/client/users/user-profile-link.tsx"],"sourcesContent":["import {ComponentType} from 'react';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {ChipValue} from '@common/ui/forms/input-field/chip-field/chip-field';\nimport {AbsoluteDateRange} from '@common/ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {DateValue} from '@internationalized/date';\nimport {FilterListControlProps} from '@common/datatable/filters/filter-list/filter-list-control';\n\nexport interface FilterSelectControl {\n type: FilterControlType.Select;\n options: {label: MessageDescriptor; key: string | number; value: any}[];\n defaultValue?: string | number | boolean;\n placeholder?: MessageDescriptor;\n searchPlaceholder?: MessageDescriptor;\n showSearchField?: boolean;\n}\n\nexport interface FilterNumberInputControl {\n type: FilterControlType.Input;\n placeholder?: MessageDescriptor;\n inputType: 'number';\n minValue?: number;\n maxValue?: number;\n defaultValue: number;\n}\n\nexport interface FilterTextInputControl {\n type: FilterControlType.Input;\n placeholder?: MessageDescriptor;\n inputType: 'string';\n minLength?: number;\n maxLength?: number;\n defaultValue: string;\n}\n\nexport interface FilterSelectModelControl {\n type: FilterControlType.SelectModel;\n model: string;\n defaultValue?: NormalizedModel;\n}\n\nexport interface FilterChipFieldControl {\n type: FilterControlType.ChipField;\n options: FilterSelectControl['options'];\n placeholder?: MessageDescriptor;\n defaultValue: ChipValue[];\n}\n\nexport interface FilterBooleanToggleControl {\n type: FilterControlType.BooleanToggle;\n // value can be something other than boolean, toggling will either send that value or nothing\n defaultValue: string | number | boolean | null;\n}\n\nexport interface DatePickerFilterControl {\n type: FilterControlType.DateRangePicker;\n defaultValue: AbsoluteDateRange;\n min?: DateValue;\n max?: DateValue;\n}\n\nexport interface CustomFilterControl {\n type: FilterControlType.Custom;\n panel: ComponentType<{filter: BackendFilter<CustomFilterControl>}>;\n listItem: ComponentType<FilterListControlProps<number, CustomFilterControl>>;\n defaultValue?: any;\n}\n\nexport type FilterControl =\n | FilterSelectControl\n | FilterNumberInputControl\n | FilterTextInputControl\n | FilterSelectModelControl\n | FilterChipFieldControl\n | DatePickerFilterControl\n | FilterBooleanToggleControl\n | CustomFilterControl;\n\nexport interface BackendFilter<T = FilterControl> {\n key: string;\n label: MessageDescriptor;\n description?: MessageDescriptor;\n control: T;\n defaultOperator: FilterOperator;\n operators?: FilterOperator[];\n extraFilters?: {key: string; operator: FilterOperator; value: any}[];\n}\n\nexport enum FilterControlType {\n Select = 'select',\n DateRangePicker = 'dateRangePicker',\n SelectModel = 'selectModel',\n Input = 'input',\n BooleanToggle = 'booleanToggle',\n ChipField = 'chipField',\n Custom = 'custom',\n}\n\nexport enum FilterOperator {\n eq = '=',\n ne = '!=',\n gt = '>',\n gte = '>=',\n lt = '<',\n lte = '<=',\n has = 'has',\n hasAll = 'hasAll',\n doesntHave = 'doesntHave',\n between = 'between',\n}\n\nexport const ALL_PRIMITIVE_OPERATORS = [\n FilterOperator.eq,\n FilterOperator.ne,\n FilterOperator.gt,\n FilterOperator.gte,\n FilterOperator.lt,\n FilterOperator.lte,\n];\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function startOfDay(date: ZonedDateTime): ZonedDateTime {\n return date.set({hour: 0, minute: 0, second: 0, millisecond: 0});\n}\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function endOfDay(date: ZonedDateTime): ZonedDateTime {\n return date.set({\n hour: 24 - 1,\n minute: 60 - 1,\n second: 60 - 1,\n millisecond: 1000 - 1,\n });\n}\n","import {getBootstrapData} from '../core/bootstrap-data/use-backend-bootstrap-data';\nimport {getLocalTimeZone} from '@internationalized/date';\n\nexport function getUserTimezone(): string {\n const defaultTimezone = getBootstrapData()?.settings.dates.default_timezone;\n const preferredTimezone =\n getBootstrapData()?.user?.timezone || defaultTimezone || 'auto';\n\n if (!preferredTimezone || preferredTimezone === 'auto') {\n return getLocalTimeZone();\n }\n return preferredTimezone;\n}\n","import {DateRangeValue} from '../date-range-value';\nimport {message} from '@common/i18n/message';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {\n endOfMonth,\n endOfWeek,\n endOfYear,\n now,\n startOfMonth,\n startOfWeek,\n startOfYear,\n} from '@internationalized/date';\nimport {startOfDay} from '@common/utils/date/start-of-day';\nimport {endOfDay} from '@common/utils/date/end-of-day';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {getUserTimezone} from '@common/i18n/get-user-timezone';\n\nconst Now = startOfDay(now(getUserTimezone()));\nconst locale = getBootstrapData()?.i18n?.language || 'en';\n\nexport interface DateRangePreset {\n key: number;\n label: MessageDescriptor;\n getRangeValue: () => DateRangeValue;\n}\n\nexport const DateRangePresets: DateRangePreset[] = [\n {\n key: 0,\n label: message('Today'),\n getRangeValue: () => ({\n preset: 0,\n start: Now,\n end: endOfDay(Now),\n }),\n },\n {\n key: 1,\n label: message('Yesterday'),\n getRangeValue: () => ({\n preset: 1,\n start: Now.subtract({days: 1}),\n end: endOfDay(Now).subtract({days: 1}),\n }),\n },\n {\n key: 2,\n label: message('This week'),\n getRangeValue: () => ({\n preset: 2,\n start: startOfWeek(Now, locale),\n end: endOfWeek(endOfDay(Now), locale),\n }),\n },\n {\n key: 3,\n label: message('Last week'),\n getRangeValue: () => {\n const start = startOfWeek(Now, locale).subtract({days: 7});\n return {\n preset: 3,\n start,\n end: start.add({days: 6}),\n };\n },\n },\n {\n key: 4,\n label: message('Last 7 days'),\n getRangeValue: () => ({\n preset: 4,\n start: Now.subtract({days: 7}),\n end: endOfDay(Now),\n }),\n },\n {\n key: 6,\n label: message('Last 30 days'),\n getRangeValue: () => ({\n preset: 6,\n start: Now.subtract({days: 30}),\n end: endOfDay(Now),\n }),\n },\n {\n key: 7,\n label: message('Last 3 months'),\n getRangeValue: () => ({\n preset: 7,\n start: Now.subtract({months: 3}),\n end: endOfDay(Now),\n }),\n },\n {\n key: 8,\n label: message('Last 12 months'),\n getRangeValue: () => ({\n preset: 8,\n start: Now.subtract({months: 12}),\n end: endOfDay(Now),\n }),\n },\n {\n key: 9,\n label: message('This month'),\n getRangeValue: () => ({\n preset: 9,\n start: startOfMonth(Now),\n end: endOfMonth(endOfDay(Now)),\n }),\n },\n {\n key: 10,\n label: message('This year'),\n getRangeValue: () => ({\n preset: 10,\n start: startOfYear(Now),\n end: endOfYear(endOfDay(Now)),\n }),\n },\n {\n key: 11,\n label: message('Last year'),\n getRangeValue: () => ({\n preset: 11,\n start: startOfYear(Now).subtract({years: 1}),\n end: endOfYear(endOfDay(Now)).subtract({years: 1}),\n }),\n },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DateRangeIcon = createSvgIcon(\n <path d=\"M7 11h2v2H7v-2zm14-5v14c0 1.1-.9 2-2 2H5c-1.11 0-2-.9-2-2l.01-14c0-1.1.88-2 1.99-2h1V2h2v2h8V2h2v2h1c1.1 0 2 .9 2 2zM5 8h14V6H5v2zm14 12V10H5v10h14zm-4-7h2v-2h-2v2zm-4 0h2v-2h-2v2z\" />\n, 'DateRangeOutlined');\n","import {FocusScope} from '@react-aria/focus';\nimport React, {ComponentPropsWithoutRef, CSSProperties, ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface InputProps {\n className?: string;\n children: ReactNode;\n autoFocus?: boolean;\n disabled?: boolean;\n style?: CSSProperties;\n inputProps?: ComponentPropsWithoutRef<'div'>;\n wrapperProps?: ComponentPropsWithoutRef<'div'>;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\nexport const Input = React.forwardRef<HTMLDivElement, InputProps>(\n (props, ref) => {\n const {\n children,\n inputProps,\n wrapperProps,\n className,\n autoFocus,\n style,\n onClick,\n } = props;\n\n return (\n <div {...wrapperProps} onClick={onClick}>\n <div\n {...inputProps}\n role=\"group\"\n className={clsx(\n className,\n 'flex items-center focus-within:ring focus-within:ring-primary/focus focus-within:border-primary/60'\n )}\n ref={ref}\n style={style}\n >\n <FocusScope autoFocus={autoFocus}>{children}</FocusScope>\n </div>\n </div>\n );\n }\n);\n","import React, {ComponentPropsWithoutRef, FocusEventHandler, Ref} from 'react';\nimport clsx from 'clsx';\nimport {createFocusManager} from '@react-aria/focus';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {getInputFieldClassNames} from '../../get-input-field-class-names';\nimport {Field, FieldProps} from '../../field';\nimport {Input} from '../../input';\nimport {useField} from '../../use-field';\n\nexport interface DatePickerFieldProps\n extends Omit<FieldProps, 'fieldClassNames'> {\n inputRef?: Ref<HTMLDivElement>;\n onBlur?: FocusEventHandler;\n showCalendarFooter?: boolean;\n}\nexport const DatePickerField = React.forwardRef<\n HTMLDivElement,\n DatePickerFieldProps\n>(({inputRef, wrapperProps, children, onBlur, ...other}, ref) => {\n const fieldClassNames = getInputFieldClassNames(other);\n const objRef = useObjectRef(ref);\n\n const {fieldProps, inputProps} = useField({\n ...other,\n focusRef: objRef,\n labelElementType: 'span',\n });\n\n fieldClassNames.wrapper = clsx(\n fieldClassNames.wrapper,\n other.disabled && 'pointer-events-none',\n );\n\n return (\n <Field\n wrapperProps={mergeProps<ComponentPropsWithoutRef<'div'>[]>(\n wrapperProps!,\n {\n onBlur: e => {\n if (!objRef.current.contains(e.relatedTarget)) {\n onBlur?.(e);\n }\n },\n onClick: () => {\n // focus first segment when clicking on label or somewhere else in the field, but no directly on segment\n const focusManager = createFocusManager(objRef);\n focusManager?.focusFirst();\n },\n },\n )}\n fieldClassNames={fieldClassNames}\n ref={objRef}\n {...fieldProps}\n >\n <Input\n inputProps={inputProps}\n className={clsx(fieldClassNames.input, 'gap-10')}\n ref={inputRef}\n >\n {children}\n </Input>\n </Field>\n );\n});\n","import {CalendarDate, DateValue} from '@internationalized/date';\n\nexport function getDefaultGranularity(date: DateValue) {\n if (date instanceof CalendarDate) {\n return 'day';\n }\n return 'minute';\n}\n\nexport function dateIsInvalid(\n date: CalendarDate,\n min?: DateValue,\n max?: DateValue\n) {\n return (\n (min != null && date.compare(min) < 0) ||\n (max != null && date.compare(max) > 0)\n );\n}\n","import {useState} from 'react';\nimport {DateValue, toZoned, ZonedDateTime} from '@internationalized/date';\nimport {getDefaultGranularity} from './utils';\nimport type {DatePickerValueProps} from './date-picker/use-date-picker-state';\nimport {DateRangeValue} from './date-range-picker/date-range-value';\nimport {useUserTimezone} from '@common/i18n/use-user-timezone';\n\nexport function useBaseDatePickerState(\n selectedDate: DateValue,\n props:\n | DatePickerValueProps<ZonedDateTime>\n | DatePickerValueProps<Partial<DateRangeValue>, DateRangeValue>\n) {\n const timezone = useUserTimezone();\n const [calendarIsOpen, setCalendarIsOpen] = useState(false);\n const closeDialogOnSelection = props.closeDialogOnSelection ?? true;\n\n const granularity = props.granularity || getDefaultGranularity(selectedDate);\n const min = props.min ? toZoned(props.min, timezone) : undefined;\n const max = props.max ? toZoned(props.max, timezone) : undefined;\n\n return {\n timezone,\n granularity,\n min,\n max,\n calendarIsOpen,\n setCalendarIsOpen,\n closeDialogOnSelection,\n };\n}\n","import {useMemo} from 'react';\nimport {now} from '@internationalized/date';\nimport {useUserTimezone} from './use-user-timezone';\n\nexport function useCurrentDateTime() {\n const timezone = useUserTimezone();\n return useMemo(() => {\n return now(timezone);\n }, [timezone]);\n}\n","import {useControlledState} from '@react-stately/utils';\nimport {HTMLAttributes, useCallback, useState} from 'react';\nimport {\n CalendarDate,\n DateValue,\n endOfMonth,\n isSameDay,\n isSameMonth,\n maxDate,\n minDate,\n startOfMonth,\n toCalendarDate,\n toZoned,\n ZonedDateTime,\n} from '@internationalized/date';\nimport {\n BaseDatePickerState,\n DatePickerValueProps,\n} from '../date-picker/use-date-picker-state';\nimport {DateRangeValue} from './date-range-value';\nimport {useBaseDatePickerState} from '../use-base-date-picker-state';\nimport {startOfDay} from '@common/utils/date/start-of-day';\nimport {endOfDay} from '@common/utils/date/end-of-day';\nimport {useCurrentDateTime} from '@common/i18n/use-current-date-time';\n\nexport interface IsPlaceholderValue {\n start: boolean;\n end: boolean;\n}\n\nexport type DateRangePickerState = BaseDatePickerState<\n DateRangeValue,\n IsPlaceholderValue\n>;\n\nexport function useDateRangePickerState(\n props: DatePickerValueProps<Partial<DateRangeValue>, DateRangeValue>,\n): DateRangePickerState {\n const now = useCurrentDateTime();\n const [isPlaceholder, setIsPlaceholder] = useState<IsPlaceholderValue>({\n start: (!props.value || !props.value.start) && !props.defaultValue?.start,\n end: (!props.value || !props.value.end) && !props.defaultValue?.end,\n });\n\n // if user clears the date, we will want to still keep an\n // instance internally, but return null via \"onChange\" callback\n const setStateValue = props.onChange;\n const [internalValue, setInternalValue] = useControlledState(\n props.value ? completeRange(props.value, now) : undefined,\n !props.value ? completeRange(props.defaultValue, now) : undefined,\n value => {\n setIsPlaceholder({start: false, end: false});\n setStateValue?.(value);\n },\n );\n\n const {\n min,\n max,\n granularity,\n timezone,\n calendarIsOpen,\n setCalendarIsOpen,\n closeDialogOnSelection,\n } = useBaseDatePickerState(internalValue.start, props);\n\n const clear = useCallback(() => {\n setIsPlaceholder({start: true, end: true});\n setInternalValue(completeRange(null, now));\n setStateValue?.(null);\n setCalendarIsOpen(false);\n }, [now, setInternalValue, setStateValue, setCalendarIsOpen]);\n\n const [anchorDate, setAnchorDate] = useState<CalendarDate | null>(null);\n const [isHighlighting, setIsHighlighting] = useState(false);\n const [highlightedRange, setHighlightedRange] =\n useState<DateRangeValue>(internalValue);\n const [calendarDates, setCalendarDates] = useState<CalendarDate[]>(() => {\n return rangeToCalendarDates(internalValue, max);\n });\n\n const constrainRange = useCallback(\n (range: DateRangeValue): DateRangeValue => {\n let start = range.start;\n let end = range.end;\n\n // make sure start date is after min date and before max date/range end\n if (min) {\n start = maxDate(start, min);\n }\n const startMax = max ? minDate(max, end) : end;\n start = minDate(start, startMax);\n\n // make sure end date is after min date/range start and before max date\n const endMin = min ? maxDate(min, start) : start;\n end = maxDate(end, endMin);\n\n if (max) {\n end = minDate(end, max);\n }\n\n return {start: toZoned(start, timezone), end: toZoned(end, timezone)};\n },\n [min, max, timezone],\n );\n\n const setSelectedValue = useCallback(\n (newRange: DateRangeValue) => {\n const value = {\n ...constrainRange(newRange),\n preset: newRange.preset,\n };\n setInternalValue(value);\n setHighlightedRange(value);\n setCalendarDates(rangeToCalendarDates(value, max));\n setIsPlaceholder({start: false, end: false});\n },\n [setInternalValue, constrainRange, max],\n );\n\n const dayIsActive = useCallback(\n (day: CalendarDate) => {\n return (\n (!isPlaceholder.start && isSameDay(day, highlightedRange.start)) ||\n (!isPlaceholder.end && isSameDay(day, highlightedRange.end))\n );\n },\n [highlightedRange, isPlaceholder],\n );\n\n const dayIsHighlighted = useCallback(\n (day: CalendarDate) => {\n return (\n (isHighlighting || (!isPlaceholder.start && !isPlaceholder.end)) &&\n day.compare(highlightedRange.start) >= 0 &&\n day.compare(highlightedRange.end) <= 0\n );\n },\n [highlightedRange, isPlaceholder, isHighlighting],\n );\n\n const dayIsRangeStart = useCallback(\n (day: CalendarDate) => isSameDay(day, highlightedRange.start),\n [highlightedRange],\n );\n\n const dayIsRangeEnd = useCallback(\n (day: CalendarDate) => isSameDay(day, highlightedRange.end),\n [highlightedRange],\n );\n\n const getCellProps = useCallback(\n (date: CalendarDate, isSameMonth: boolean): HTMLAttributes<HTMLElement> => {\n return {\n onPointerEnter: () => {\n if (isHighlighting && isSameMonth) {\n setHighlightedRange(\n makeRange({start: anchorDate!, end: date, timezone}),\n );\n }\n },\n onClick: () => {\n if (!isHighlighting) {\n setIsHighlighting(true);\n setAnchorDate(date);\n setHighlightedRange(makeRange({start: date, end: date, timezone}));\n } else {\n const finalRange = makeRange({\n start: anchorDate!,\n end: date,\n timezone,\n });\n // cast to start and end of day after making range, because \"makeRange\"\n // will flip start and end dates, if they are out of order\n finalRange.start = startOfDay(finalRange.start);\n finalRange.end = endOfDay(finalRange.end);\n setIsHighlighting(false);\n setAnchorDate(null);\n setSelectedValue?.(finalRange);\n if (closeDialogOnSelection) {\n setCalendarIsOpen?.(false);\n }\n }\n },\n };\n },\n [\n anchorDate,\n isHighlighting,\n setSelectedValue,\n setCalendarIsOpen,\n closeDialogOnSelection,\n timezone,\n ],\n );\n\n return {\n selectedValue: internalValue,\n setSelectedValue,\n calendarIsOpen,\n setCalendarIsOpen,\n dayIsActive,\n dayIsHighlighted,\n dayIsRangeStart,\n dayIsRangeEnd,\n getCellProps,\n calendarDates,\n setIsPlaceholder,\n isPlaceholder,\n clear,\n setCalendarDates,\n min,\n max,\n granularity,\n timezone,\n closeDialogOnSelection,\n };\n}\n\nfunction rangeToCalendarDates(\n range: DateRangeValue,\n max?: DateValue,\n): CalendarDate[] {\n let start = toCalendarDate(startOfMonth(range.start));\n let end = toCalendarDate(endOfMonth(range.end));\n\n // make sure we don't show the same month twice\n if (isSameMonth(start, end)) {\n end = endOfMonth(end.add({months: 1}));\n }\n\n // if next month is disabled, show previous instead\n if (max && end.compare(max) > 0) {\n end = start;\n start = startOfMonth(start.subtract({months: 1}));\n }\n return [start, end];\n}\n\ninterface MakeRangeProps {\n start: DateValue;\n end: DateValue;\n timezone: string;\n}\nfunction makeRange(props: MakeRangeProps): DateRangeValue {\n const start = toZoned(props.start, props.timezone);\n const end = toZoned(props.end, props.timezone);\n if (start.compare(end) > 0) {\n return {start: end, end: start};\n }\n return {start, end};\n}\n\nfunction completeRange(\n range: Partial<DateRangeValue> | null | undefined,\n now: ZonedDateTime,\n): DateRangeValue {\n if (range?.start && range?.end) {\n return range as DateRangeValue;\n } else if (!range?.start && range?.end) {\n range.start = range.end.subtract({months: 1});\n return range as DateRangeValue;\n } else if (!range?.end && range?.start) {\n range.end = range.start.add({months: 1});\n return range as DateRangeValue;\n }\n return {start: now, end: now.add({months: 1})};\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowRightAltIcon = createSvgIcon(\n <path d=\"M16.01 11H4v2h12.01v3L20 12l-3.99-4v3z\" />\n, 'ArrowRightAltOutlined');\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function adjustSegment(\n value: ZonedDateTime,\n part: string,\n amount: number,\n options: Intl.ResolvedDateTimeFormatOptions\n) {\n switch (part) {\n case 'era':\n case 'year':\n case 'month':\n case 'day':\n return value.cycle(part, amount, {round: part === 'year'});\n }\n\n if ('hour' in value) {\n switch (part) {\n case 'dayPeriod': {\n const hours = value.hour;\n const isPM = hours >= 12;\n return value.set({hour: isPM ? hours - 12 : hours + 12});\n }\n case 'hour':\n case 'minute':\n case 'second':\n return value.cycle(part, amount, {\n round: part !== 'hour',\n hourCycle: options.hour12 ? 12 : 24,\n });\n }\n }\n\n return value;\n}\n","import {ZonedDateTime} from '@internationalized/date';\n\nexport function setSegment(\n value: ZonedDateTime,\n part: string,\n segmentValue: number,\n options: Intl.ResolvedDateTimeFormatOptions\n) {\n switch (part) {\n case 'day':\n case 'month':\n case 'year':\n return value.set({[part]: segmentValue});\n }\n\n if ('hour' in value) {\n switch (part) {\n case 'dayPeriod': {\n const hours = value.hour;\n const wasPM = hours >= 12;\n const isPM = segmentValue >= 12;\n if (isPM === wasPM) {\n return value;\n }\n return value.set({hour: wasPM ? hours - 12 : hours + 12});\n }\n case 'hour':\n // In 12 hour time, ensure that AM/PM does not change\n if (options.hour12) {\n const hours = value.hour;\n const wasPM = hours >= 12;\n if (!wasPM && segmentValue === 12) {\n segmentValue = 0;\n }\n if (wasPM && segmentValue < 12) {\n segmentValue += 12;\n }\n }\n // fallthrough\n case 'minute':\n case 'second':\n return value.set({[part]: segmentValue});\n }\n }\n\n return value;\n}\n","export const PAGE_STEP = {\n year: 5,\n month: 2,\n day: 7,\n hour: 2,\n minute: 15,\n second: 15,\n dayPeriod: 1,\n};\n","import {useFocusManager} from '@react-aria/focus';\nimport React, {\n ComponentPropsWithoutRef,\n HTMLAttributes,\n KeyboardEventHandler,\n useMemo,\n useRef,\n} from 'react';\nimport {NumberParser} from '@internationalized/number';\nimport {mergeProps} from '@react-aria/utils';\nimport {today, ZonedDateTime} from '@internationalized/date';\nimport {useSelectedLocale} from '@common/i18n/selected-locale';\nimport {useDateFormatter} from '@common/i18n/use-date-formatter';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {adjustSegment} from './utils/adjust-segment';\nimport {setSegment} from './utils/set-segment';\nimport {PAGE_STEP} from './utils/page-step';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\nexport interface EditableSegment {\n type: 'day' | 'dayPeriod' | 'hour' | 'minute' | 'month' | 'second' | 'year';\n text: string;\n value: number;\n minValue: number;\n maxValue: number;\n minLength: number;\n}\n\ninterface DatePickerSegmentProps {\n segment: EditableSegment;\n domProps?: ComponentPropsWithoutRef<'div'>;\n state: DatePickerState | DateRangePickerState;\n value: ZonedDateTime;\n onChange: (newValue: ZonedDateTime) => void;\n isPlaceholder?: boolean;\n}\nexport function EditableDateSegment({\n segment,\n domProps,\n value,\n onChange,\n isPlaceholder,\n state: {timezone, calendarIsOpen, setCalendarIsOpen},\n}: DatePickerSegmentProps) {\n const isMobile = useIsMobileMediaQuery();\n const enteredKeys = useRef('');\n const {localeCode} = useSelectedLocale();\n const focusManager = useFocusManager();\n const formatter = useDateFormatter({timeZone: timezone});\n const parser = useMemo(\n () => new NumberParser(localeCode, {maximumFractionDigits: 0}),\n [localeCode],\n );\n\n const setSegmentValue = (newValue: number) => {\n onChange(\n setSegment(value, segment.type, newValue, formatter.resolvedOptions()),\n );\n };\n\n const adjustSegmentValue = (amount: number) => {\n onChange(\n adjustSegment(value, segment.type, amount, formatter.resolvedOptions()),\n );\n };\n\n const backspace = () => {\n if (parser.isValidPartialNumber(segment.text)) {\n const newValue = segment.text.slice(0, -1);\n const parsed = parser.parse(newValue);\n if (newValue.length === 0 || parsed === 0) {\n const now = today(timezone);\n if (segment.type in now) {\n // @ts-ignore\n setSegmentValue(now[segment.type]);\n }\n } else {\n setSegmentValue(parsed);\n }\n enteredKeys.current = newValue;\n } else if (segment.type === 'dayPeriod') {\n adjustSegmentValue(-1);\n }\n };\n\n const onKeyDown: KeyboardEventHandler = e => {\n if (e.ctrlKey || e.metaKey || e.shiftKey || e.altKey) {\n return;\n }\n\n // Navigation between date segments and deletion\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n e.stopPropagation();\n focusManager?.focusPrevious();\n break;\n case 'ArrowRight':\n e.preventDefault();\n e.stopPropagation();\n focusManager?.focusNext();\n break;\n case 'Enter':\n (e.target as HTMLElement).closest('form')?.requestSubmit();\n setCalendarIsOpen(!calendarIsOpen);\n break;\n case 'Tab':\n break;\n case 'Backspace':\n case 'Delete': {\n e.preventDefault();\n e.stopPropagation();\n backspace();\n break;\n }\n\n // Spinbutton incrementing/decrementing\n case 'ArrowUp':\n e.preventDefault();\n enteredKeys.current = '';\n adjustSegmentValue(1);\n break;\n case 'ArrowDown':\n e.preventDefault();\n enteredKeys.current = '';\n adjustSegmentValue(-1);\n break;\n case 'PageUp':\n e.preventDefault();\n enteredKeys.current = '';\n adjustSegmentValue(PAGE_STEP[segment.type] || 1);\n break;\n case 'PageDown':\n e.preventDefault();\n enteredKeys.current = '';\n adjustSegmentValue(-(PAGE_STEP[segment.type] || 1));\n break;\n case 'Home':\n e.preventDefault();\n enteredKeys.current = '';\n setSegmentValue(segment.maxValue);\n break;\n case 'End':\n e.preventDefault();\n enteredKeys.current = '';\n setSegmentValue(segment.minValue);\n break;\n }\n\n onInput(e.key);\n };\n\n const amPmFormatter = useDateFormatter({hour: 'numeric', hour12: true});\n const am = useMemo(() => {\n const amDate = new Date();\n amDate.setHours(0);\n return amPmFormatter\n .formatToParts(amDate)\n .find(part => part.type === 'dayPeriod')!.value;\n }, [amPmFormatter]);\n const pm = useMemo(() => {\n const pmDate = new Date();\n pmDate.setHours(12);\n return amPmFormatter\n .formatToParts(pmDate)\n .find(part => part.type === 'dayPeriod')!.value;\n }, [amPmFormatter]);\n\n // Update date values on user keyboard input\n const onInput = (key: string) => {\n const newValue = enteredKeys.current + key;\n\n switch (segment.type) {\n case 'dayPeriod':\n if (am.toLowerCase().startsWith(key)) {\n setSegmentValue(0);\n } else if (pm.toLowerCase().startsWith(key)) {\n setSegmentValue(12);\n } else {\n break;\n }\n focusManager?.focusNext();\n break;\n case 'day':\n case 'hour':\n case 'minute':\n case 'second':\n case 'month':\n case 'year': {\n if (!parser.isValidPartialNumber(newValue)) {\n return;\n }\n\n let numberValue = parser.parse(newValue);\n let segmentValue = numberValue;\n let allowsZero = segment.minValue === 0;\n if (segment.type === 'hour' && formatter.resolvedOptions().hour12) {\n switch (formatter.resolvedOptions().hourCycle) {\n case 'h11':\n if (numberValue > 11) {\n segmentValue = parser.parse(key);\n }\n break;\n case 'h12':\n allowsZero = false;\n if (numberValue > 12) {\n segmentValue = parser.parse(key);\n }\n break;\n }\n\n if (segment.value >= 12 && numberValue > 1) {\n numberValue += 12;\n }\n } else if (numberValue > segment.maxValue) {\n segmentValue = parser.parse(key);\n }\n\n if (Number.isNaN(numberValue)) {\n return;\n }\n\n const shouldSetValue = segmentValue !== 0 || allowsZero;\n if (shouldSetValue) {\n setSegmentValue(segmentValue);\n }\n\n if (\n Number(`${numberValue}0`) > segment.maxValue ||\n newValue.length >= String(segment.maxValue).length\n ) {\n enteredKeys.current = '';\n if (shouldSetValue) {\n focusManager?.focusNext();\n }\n } else {\n enteredKeys.current = newValue;\n }\n break;\n }\n }\n };\n\n const spinButtonProps: HTMLAttributes<HTMLDivElement> = isMobile\n ? {}\n : {\n 'aria-label': segment.type,\n 'aria-valuetext': isPlaceholder ? undefined : `${segment.value}`,\n 'aria-valuemin': segment.minValue,\n 'aria-valuemax': segment.maxValue,\n 'aria-valuenow': isPlaceholder ? undefined : segment.value,\n tabIndex: 0,\n onKeyDown,\n };\n\n return (\n <div\n {...mergeProps(domProps!, {\n ...spinButtonProps,\n onFocus: e => {\n enteredKeys.current = '';\n e.target.scrollIntoView({block: 'nearest'});\n },\n onClick: e => {\n e.preventDefault();\n e.stopPropagation();\n },\n } as HTMLAttributes<HTMLDivElement>)}\n className=\"box-content cursor-default select-none whitespace-nowrap rounded p-2 text-center tabular-nums caret-transparent outline-none focus:bg-primary focus:text-on-primary\"\n >\n {segment.text.padStart(segment.minLength, '0')}\n </div>\n );\n}\n","import {useFocusManager} from '@react-aria/focus';\nimport {ComponentPropsWithoutRef} from 'react';\n\nexport interface LiteralSegment {\n type: 'literal';\n minLength: 1;\n text: string;\n}\n\ninterface LiteralSegmentProps extends ComponentPropsWithoutRef<'div'> {\n segment: LiteralSegment;\n domProps?: ComponentPropsWithoutRef<'div'>;\n}\nexport function LiteralDateSegment({segment, domProps}: LiteralSegmentProps) {\n const focusManager = useFocusManager();\n return (\n <div\n {...domProps}\n onPointerDown={e => {\n if (e.pointerType === 'mouse') {\n e.preventDefault();\n const res = focusManager?.focusNext({from: e.target as HTMLElement});\n if (!res) {\n focusManager?.focusPrevious({from: e.target as HTMLElement});\n }\n }\n }}\n aria-hidden\n className=\"min-w-4 cursor-default select-none\"\n >\n {segment.text}\n </div>\n );\n}\n","import {\n DateValue,\n getMinimumDayInMonth,\n getMinimumMonthInYear,\n} from '@internationalized/date';\n\nexport function getSegmentLimits(\n date: DateValue,\n type: string,\n options: Intl.ResolvedDateTimeFormatOptions\n) {\n switch (type) {\n case 'year':\n return {\n value: date.year,\n placeholder: 'yyyy',\n minValue: 1,\n maxValue: date.calendar.getYearsInEra(date),\n };\n case 'month':\n return {\n value: date.month,\n placeholder: 'mm',\n minValue: getMinimumMonthInYear(date),\n maxValue: date.calendar.getMonthsInYear(date),\n };\n case 'day':\n return {\n value: date.day,\n minValue: getMinimumDayInMonth(date),\n maxValue: date.calendar.getDaysInMonth(date),\n placeholder: 'dd',\n };\n }\n\n if ('hour' in date) {\n switch (type) {\n case 'dayPeriod':\n return {\n value: date.hour >= 12 ? 12 : 0,\n minValue: 0,\n maxValue: 12,\n placeholder: '--',\n };\n case 'hour':\n if (options.hour12) {\n const isPM = date.hour >= 12;\n return {\n value: date.hour,\n minValue: isPM ? 12 : 0,\n maxValue: isPM ? 23 : 11,\n placeholder: '--',\n };\n }\n\n return {\n value: date.hour,\n minValue: 0,\n maxValue: 23,\n placeholder: '--',\n };\n case 'minute':\n return {\n value: date.minute,\n minValue: 0,\n maxValue: 59,\n placeholder: '--',\n };\n }\n }\n\n return {};\n}\n","import React, {ComponentPropsWithoutRef, useMemo} from 'react';\nimport {ZonedDateTime} from '@internationalized/date';\nimport {EditableDateSegment, EditableSegment} from './editable-date-segment';\nimport {LiteralDateSegment, LiteralSegment} from './literal-segment';\nimport {useDateFormatter} from '@common/i18n/use-date-formatter';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {getSegmentLimits} from './utils/get-segment-limits';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\ninterface DateSegmentListProps {\n segmentProps?: ComponentPropsWithoutRef<'div'>;\n state: DatePickerState | DateRangePickerState;\n value: ZonedDateTime;\n onChange: (newValue: ZonedDateTime) => void;\n isPlaceholder?: boolean;\n}\nexport function DateSegmentList({\n segmentProps,\n state,\n value,\n onChange,\n isPlaceholder,\n}: DateSegmentListProps) {\n const {granularity} = state;\n const options = useMemo(() => {\n const memoOptions: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric',\n };\n if (granularity === 'minute') {\n memoOptions.hour = 'numeric';\n memoOptions.minute = 'numeric';\n }\n return memoOptions;\n }, [granularity]);\n\n const formatter = useDateFormatter(options);\n\n const dateValue = useMemo(() => value.toDate(), [value]);\n const segments = useMemo(() => {\n return formatter.formatToParts(dateValue).map(segment => {\n const limits = getSegmentLimits(\n value,\n segment.type,\n formatter.resolvedOptions(),\n );\n const textValue =\n isPlaceholder && segment.type !== 'literal'\n ? limits.placeholder\n : segment.value;\n return {\n type: segment.type,\n text: segment.value === ', ' ? ' ' : textValue,\n ...limits,\n minLength:\n segment.type !== 'literal' ? String(limits.maxValue).length : 1,\n } as LiteralSegment | EditableSegment;\n });\n }, [dateValue, formatter, isPlaceholder, value]);\n\n return (\n <div className=\"flex items-center\">\n {segments.map((segment, index) => {\n if (segment.type === 'literal') {\n return (\n <LiteralDateSegment\n domProps={segmentProps}\n key={index}\n segment={segment}\n />\n );\n }\n return (\n <EditableDateSegment\n isPlaceholder={isPlaceholder}\n domProps={segmentProps}\n state={state}\n value={value}\n onChange={onChange}\n segment={segment}\n key={index}\n />\n );\n })}\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const KeyboardArrowRightIcon = createSvgIcon(\n <path d=\"M8.59 16.59 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z\" />\n, 'KeyboardArrowRightOutlined');\n","import React from 'react';\nimport clsx from 'clsx';\nimport {\n CalendarDate,\n DateValue,\n getDayOfWeek,\n isSameMonth,\n isToday,\n} from '@internationalized/date';\nimport {useSelectedLocale} from '../../../../../i18n/selected-locale';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {dateIsInvalid} from '../utils';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\ninterface CalendarCellProps {\n date: CalendarDate;\n currentMonth: DateValue;\n state: DatePickerState | DateRangePickerState;\n}\nexport function CalendarCell({\n date,\n currentMonth,\n state: {\n dayIsActive,\n dayIsHighlighted,\n dayIsRangeStart,\n dayIsRangeEnd,\n getCellProps,\n timezone,\n min,\n max,\n },\n}: CalendarCellProps) {\n const {localeCode} = useSelectedLocale();\n const dayOfWeek = getDayOfWeek(date, localeCode);\n const isActive = dayIsActive(date);\n const isHighlighted = dayIsHighlighted(date);\n const isRangeStart = dayIsRangeStart(date);\n const isRangeEnd = dayIsRangeEnd(date);\n const dayIsToday = isToday(date, timezone);\n const sameMonth = isSameMonth(date, currentMonth);\n const isDisabled = dateIsInvalid(date, min, max);\n\n return (\n <div\n role=\"button\"\n aria-disabled={isDisabled}\n className={clsx(\n 'w-40 h-40 text-sm relative isolate flex-shrink-0',\n isDisabled && 'text-disabled pointer-events-none',\n !sameMonth && 'invisible pointer-events-none'\n )}\n {...getCellProps(date, sameMonth)}\n >\n <span\n className={clsx(\n 'absolute inset-0 flex items-center justify-center rounded-full w-full h-full select-none z-10 cursor-pointer',\n !isActive && !dayIsToday && 'hover:bg-hover',\n isActive && 'bg-primary text-on-primary font-semibold',\n dayIsToday && !isActive && 'bg-chip'\n )}\n >\n {date.day}\n </span>\n {isHighlighted && sameMonth && (\n <span\n className={clsx(\n 'absolute w-full h-full inset-0 bg-primary/focus',\n (isRangeStart || dayOfWeek === 0 || date.day === 1) &&\n 'rounded-l-full',\n (isRangeEnd ||\n dayOfWeek === 6 ||\n date.day ===\n currentMonth.calendar.getDaysInMonth(currentMonth)) &&\n 'rounded-r-full'\n )}\n />\n )}\n </div>\n );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {m} from 'framer-motion';\nimport {\n CalendarDate,\n endOfMonth,\n getWeeksInMonth,\n startOfMonth,\n startOfWeek,\n} from '@internationalized/date';\nimport {KeyboardArrowLeftIcon} from '../../../../../icons/material/KeyboardArrowLeft';\nimport {IconButton} from '../../../../buttons/icon-button';\nimport {KeyboardArrowRightIcon} from '../../../../../icons/material/KeyboardArrowRight';\nimport {CalendarCell} from './calendar-cell';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {useDateFormatter} from '../../../../../i18n/use-date-formatter';\nimport {useSelectedLocale} from '../../../../../i18n/selected-locale';\nimport {dateIsInvalid} from '../utils';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\nexport interface CalendarMonthProps {\n state: DatePickerState | DateRangePickerState;\n startDate: CalendarDate;\n isFirst: boolean;\n isLast: boolean;\n}\nexport function CalendarMonth({\n startDate,\n state,\n isFirst,\n isLast,\n}: CalendarMonthProps) {\n const {localeCode} = useSelectedLocale();\n const weeksInMonth = getWeeksInMonth(startDate, localeCode);\n const monthStart = startOfWeek(startDate, localeCode);\n\n return (\n <div className=\"w-280 flex-shrink-0\">\n <CalendarMonthHeader\n isFirst={isFirst}\n isLast={isLast}\n state={state}\n currentMonth={startDate}\n />\n <div className=\"block\" role=\"grid\">\n <WeekdayHeader state={state} startDate={startDate} />\n {[...new Array(weeksInMonth).keys()].map(weekIndex => (\n <m.div className=\"flex mb-6\" key={weekIndex}>\n {[...new Array(7).keys()].map(dayIndex => (\n <CalendarCell\n key={dayIndex}\n date={monthStart.add({weeks: weekIndex, days: dayIndex})}\n currentMonth={startDate}\n state={state}\n />\n ))}\n </m.div>\n ))}\n </div>\n </div>\n );\n}\n\ninterface CalendarMonthHeaderProps {\n state: DatePickerState | DateRangePickerState;\n currentMonth: CalendarDate;\n isFirst: boolean;\n isLast: boolean;\n}\nfunction CalendarMonthHeader({\n currentMonth,\n isFirst,\n isLast,\n state: {calendarDates, setCalendarDates, timezone, min, max},\n}: CalendarMonthHeaderProps) {\n const shiftCalendars = (direction: 'forward' | 'backward') => {\n const count = calendarDates.length;\n let newDates: CalendarDate[];\n if (direction === 'forward') {\n newDates = calendarDates.map(date =>\n endOfMonth(date.add({months: count}))\n );\n } else {\n newDates = calendarDates.map(date =>\n endOfMonth(date.subtract({months: count}))\n );\n }\n setCalendarDates(newDates);\n };\n\n const monthFormatter = useDateFormatter({\n month: 'long',\n year: 'numeric',\n era: currentMonth.calendar.identifier !== 'gregory' ? 'long' : undefined,\n calendar: currentMonth.calendar.identifier,\n });\n\n const isBackwardDisabled = dateIsInvalid(\n currentMonth.subtract({days: 1}),\n min,\n max\n );\n const isForwardDisabled = dateIsInvalid(\n startOfMonth(currentMonth.add({months: 1})),\n min,\n max\n );\n\n return (\n <div className=\"flex items-center justify-between gap-10\">\n <IconButton\n size=\"md\"\n className={clsx('text-muted', !isFirst && 'invisible')}\n disabled={!isFirst || isBackwardDisabled}\n aria-hidden={!isFirst}\n onClick={() => {\n shiftCalendars('backward');\n }}\n >\n <KeyboardArrowLeftIcon />\n </IconButton>\n <div className=\"text-sm font-semibold select-none\">\n {monthFormatter.format(currentMonth.toDate(timezone))}\n </div>\n <IconButton\n size=\"md\"\n className={clsx('text-muted', !isLast && 'invisible')}\n disabled={!isLast || isForwardDisabled}\n aria-hidden={!isLast}\n onClick={() => {\n shiftCalendars('forward');\n }}\n >\n <KeyboardArrowRightIcon />\n </IconButton>\n </div>\n );\n}\n\ninterface WeekdayHeaderProps {\n state: DatePickerState | DateRangePickerState;\n startDate: CalendarDate;\n}\nfunction WeekdayHeader({state: {timezone}, startDate}: WeekdayHeaderProps) {\n const {localeCode} = useSelectedLocale();\n const dayFormatter = useDateFormatter({weekday: 'short'});\n\n const monthStart = startOfWeek(startDate, localeCode);\n\n return (\n <div className=\"flex\">\n {[...new Array(7).keys()].map(index => {\n const date = monthStart.add({days: index});\n const dateDay = date.toDate(timezone);\n const weekday = dayFormatter.format(dateDay);\n return (\n <div\n className=\"w-40 h-40 text-sm font-semibold relative flex-shrink-0\"\n key={index}\n >\n <div className=\"absolute flex items-center justify-center w-full h-full select-none\">\n {weekday}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import React, {Fragment} from 'react';\nimport {startOfMonth, toCalendarDate} from '@internationalized/date';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {CalendarMonth} from './calendar-month';\nimport {DatePickerState} from '../date-picker/use-date-picker-state';\nimport {DateRangePickerState} from '../date-range-picker/use-date-range-picker-state';\n\ninterface CalendarProps {\n state: DatePickerState | DateRangePickerState;\n visibleMonths?: 1 | 2;\n}\nexport function Calendar({state, visibleMonths = 1}: CalendarProps) {\n const isMobile = useIsMobileMediaQuery();\n\n if (isMobile) {\n visibleMonths = 1;\n }\n\n return (\n <Fragment>\n {[...new Array(visibleMonths).keys()].map(index => {\n const startDate = toCalendarDate(\n startOfMonth(state.calendarDates[index])\n );\n const isFirst = index === 0;\n const isLast = index === visibleMonths - 1;\n return (\n <CalendarMonth\n key={index}\n state={state}\n startDate={startDate}\n isFirst={isFirst}\n isLast={isLast}\n />\n );\n })}\n </Fragment>\n );\n}\n","import {DateValue, parseAbsolute} from '@internationalized/date';\nimport {Fragment, memo} from 'react';\nimport {useDateFormatter} from './use-date-formatter';\nimport {useSettings} from '../core/settings/use-settings';\nimport {shallowEqual} from '../utils/shallow-equal';\nimport {useUserTimezone} from './use-user-timezone';\nimport {DateFormatPresets} from '@common/i18n/formatted-date';\n\ninterface FormattedDateTimeRangeProps {\n start?: string | DateValue | Date;\n end?: string | DateValue | Date;\n options?: Intl.DateTimeFormatOptions;\n preset?: keyof typeof DateFormatPresets;\n}\nexport const FormattedDateTimeRange = memo(\n ({start, end, options, preset}: FormattedDateTimeRangeProps) => {\n const {dates} = useSettings();\n const timezone = useUserTimezone();\n const formatter = useDateFormatter(\n options ||\n (DateFormatPresets as Record<string, Intl.DateTimeFormatOptions>)[\n preset || dates?.format\n ]\n );\n\n if (!start || !end) {\n return null;\n }\n\n let value: string;\n\n try {\n value = formatter.formatRange(\n castToDate(start, timezone),\n castToDate(end, timezone)\n );\n } catch (e) {\n value = '';\n }\n\n return <Fragment>{value}</Fragment>;\n },\n shallowEqual\n);\n\nfunction castToDate(date: string | DateValue | Date, timezone: string): Date {\n if (typeof date === 'string') {\n return parseAbsolute(date, timezone).toDate();\n }\n if ('toDate' in date) {\n return date.toDate(timezone);\n }\n return date;\n}\n","import {List, ListItem} from '@common/ui/list/list';\nimport {DateRangePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {Trans} from '@common/i18n/trans';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\n\ninterface DateRangePresetList {\n onPresetSelected: (value: DateRangeValue) => void;\n selectedValue?: DateRangeValue | null;\n}\nexport function DatePresetList({\n onPresetSelected,\n selectedValue,\n}: DateRangePresetList) {\n return (\n <List>\n {DateRangePresets.map(preset => (\n <ListItem\n borderRadius=\"rounded-none\"\n capitalizeFirst\n key={preset.key}\n isSelected={selectedValue?.preset === preset.key}\n onSelected={() => {\n const newValue = preset.getRangeValue();\n onPresetSelected(newValue);\n }}\n >\n <Trans {...preset.label} />\n </ListItem>\n ))}\n </List>\n );\n}\n","import {useMediaQuery, UseMediaQueryOptions} from './use-media-query';\n\nexport function useIsTabletMediaQuery(options?: UseMediaQueryOptions) {\n return useMediaQuery('(max-width: 1024px)', options);\n}\n","import React, {ComponentPropsWithoutRef, ReactNode, useId} from 'react';\nimport clsx from 'clsx';\nimport {useController} from 'react-hook-form';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {InputSize} from '../input-field/input-size';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\nimport {AutoFocusProps, useAutoFocus} from '../../focus/use-auto-focus';\n\ninterface SwitchProps\n extends AutoFocusProps,\n Omit<ComponentPropsWithoutRef<'input'>, 'size'> {\n size?: InputSize;\n className?: string;\n description?: ReactNode;\n invalid?: boolean;\n errorMessage?: string;\n iconRight?: ReactNode;\n}\nexport const Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n (props, ref) => {\n const {\n children,\n size = 'sm',\n description,\n className,\n invalid,\n autoFocus,\n errorMessage,\n iconRight,\n ...domProps\n } = props;\n\n const inputRef = useObjectRef(ref);\n useAutoFocus({autoFocus}, inputRef);\n\n const style = getSizeClassName(size);\n const fieldClassNames = getInputFieldClassNames(props);\n\n const descriptionId = useId();\n\n return (\n <div className={clsx(className, 'isolate')}>\n <label className=\"flex select-none items-center\">\n <input\n {...domProps}\n type=\"checkbox\"\n role=\"switch\"\n aria-invalid={invalid || undefined}\n aria-describedby={description ? descriptionId : undefined}\n ref={inputRef}\n aria-checked={domProps.checked}\n className={clsx(\n style,\n !invalid &&\n 'checked:border-primary checked:bg-primary dark:checked:border-primary-dark dark:checked:bg-primary-dark',\n invalid && 'checked:border-danger checked:bg-danger',\n 'relative flex flex-shrink-0 cursor-pointer appearance-none items-center overflow-hidden rounded-3xl border border-chip bg-chip p-0 outline-none transition-colors checked:border-primary checked:bg-primary',\n 'before:z-10 before:block before:translate-x-2 before:rounded-3xl before:border before:bg-white before:transition-transform',\n 'checked:before:border-white',\n 'focus-visible:ring',\n props.disabled && 'cursor-not-allowed opacity-80',\n )}\n />\n {children && (\n <span\n className={clsx(\n fieldClassNames.size.font,\n 'ml-12',\n invalid && 'text-danger',\n props.disabled && 'text-disabled',\n )}\n >\n {children}\n </span>\n )}\n {iconRight}\n </label>\n {description && !errorMessage && (\n <div id={descriptionId} className={fieldClassNames.description}>\n {description}\n </div>\n )}\n {errorMessage && (\n <div id={descriptionId} className={fieldClassNames.error}>\n {errorMessage}\n </div>\n )}\n </div>\n );\n },\n);\n\ninterface FormSwitchProps extends SwitchProps {\n name: string;\n}\nexport function FormSwitch(props: FormSwitchProps) {\n const {\n field: {onChange, onBlur, value = false, ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<SwitchProps> = {\n onChange: e => {\n if (e.target.value && e.target.value !== 'on') {\n onChange(e.target.checked ? e.target.value : false);\n } else {\n onChange(e);\n }\n },\n onBlur,\n checked: !!value,\n invalid,\n errorMessage: error?.message,\n name: props.name,\n };\n\n return <Switch ref={ref} {...mergeProps(props, formProps)} />;\n}\n\nfunction getSizeClassName(size: InputSize): string {\n switch (size) {\n case 'xl':\n return 'w-68 h-36 before:w-28 before:h-28 checked:before:translate-x-36';\n case 'lg':\n return 'w-56 h-30 before:w-22 before:h-22 checked:before:translate-x-30';\n case 'md':\n return 'w-46 h-24 before:w-18 before:h-18 checked:before:translate-x-24';\n case 'xs':\n return 'w-30 h-18 before:w-12 before:h-12 checked:before:translate-x-14';\n default:\n return 'w-38 h-20 before:w-14 before:h-14 checked:before:translate-x-20';\n }\n}\n","import {message} from '@common/i18n/message';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport interface DateRangeComparePreset {\n key: number;\n label: MessageDescriptor;\n getRangeValue: (range: DateRangeValue) => DateRangeValue;\n}\n\nexport const DateRangeComparePresets: DateRangeComparePreset[] = [\n {\n key: 0,\n label: message('Preceding period'),\n getRangeValue: (range: DateRangeValue) => {\n const startDate = range.start;\n const endDate = range.end;\n\n const diffInMilliseconds =\n endDate.toDate().getTime() - startDate.toDate().getTime();\n const diffInMinutes = diffInMilliseconds / (1000 * 60);\n const newStart = startDate.subtract({minutes: diffInMinutes});\n return {\n preset: 0,\n start: newStart,\n end: startDate,\n };\n },\n },\n {\n key: 1,\n label: message('Same period last year'),\n getRangeValue: (range: DateRangeValue) => {\n return {\n start: range.start.subtract({years: 1}),\n end: range.end.subtract({years: 1}),\n preset: 1,\n };\n },\n },\n {\n key: 2,\n label: message('Custom'),\n getRangeValue: (range: DateRangeValue) => {\n return {\n start: range.start.subtract({weeks: 1}),\n end: range.end.subtract({weeks: 1}),\n preset: 2,\n };\n },\n },\n];\n","import {List, ListItem} from '@common/ui/list/list';\nimport {Trans} from '@common/i18n/trans';\nimport {DateRangeValue} from '@common/ui/forms/input-field/date/date-range-picker/date-range-value';\nimport {DateRangeComparePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-presets';\n\ninterface DateRangePresetList {\n originalRangeValue: DateRangeValue;\n onPresetSelected: (value: DateRangeValue) => void;\n selectedValue?: DateRangeValue | null;\n}\nexport function DateRangeComparePresetList({\n originalRangeValue,\n onPresetSelected,\n selectedValue,\n}: DateRangePresetList) {\n return (\n <List>\n {DateRangeComparePresets.map(preset => (\n <ListItem\n borderRadius=\"rounded-none\"\n capitalizeFirst\n key={preset.key}\n isSelected={selectedValue?.preset === preset.key}\n onSelected={() => {\n const newValue = preset.getRangeValue(originalRangeValue);\n onPresetSelected(newValue);\n }}\n >\n <Trans {...preset.label} />\n </ListItem>\n ))}\n </List>\n );\n}\n","import React, {Fragment, ReactNode, useRef, useState} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {DatePickerField} from '../date-picker-field';\nimport {DateRangePickerState} from '../use-date-range-picker-state';\nimport {Calendar} from '../../calendar/calendar';\nimport {DialogFooter} from '@common/ui/overlays/dialog/dialog-footer';\nimport {Button} from '@common/ui/buttons/button';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {ArrowRightAltIcon} from '@common/icons/material/ArrowRightAlt';\nimport {DateSegmentList} from '../../segments/date-segment-list';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDateTimeRange} from '@common/i18n/formatted-date-time-range';\nimport {DatePresetList} from './date-range-preset-list';\nimport {useIsTabletMediaQuery} from '@common/utils/hooks/is-tablet-media-query';\nimport {Switch} from '@common/ui/forms/toggle/switch';\nimport {DateRangeComparePresetList} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-compare-preset-list';\n\ninterface DateRangeDialogProps {\n state: DateRangePickerState;\n compareState?: DateRangePickerState;\n compareVisibleDefault?: boolean;\n showInlineDatePickerField?: boolean;\n}\nexport function DateRangeDialog({\n state,\n compareState,\n showInlineDatePickerField = false,\n compareVisibleDefault = false,\n}: DateRangeDialogProps) {\n const isTablet = useIsTabletMediaQuery();\n const {close} = useDialogContext();\n const initialStateRef = useRef<DateRangePickerState>(state);\n const hasPlaceholder = state.isPlaceholder.start || state.isPlaceholder.end;\n const [compareVisible, setCompareVisible] = useState(compareVisibleDefault);\n\n const footer = (\n <DialogFooter\n dividerTop\n startAction={\n !hasPlaceholder && !isTablet ? (\n <div className=\"text-xs\">\n <FormattedDateTimeRange\n start={state.selectedValue.start.toDate()}\n end={state.selectedValue.end.toDate()}\n options={{dateStyle: 'medium'}}\n />\n </div>\n ) : undefined\n }\n >\n <Button\n variant=\"text\"\n size=\"xs\"\n onClick={() => {\n state.setSelectedValue(initialStateRef.current.selectedValue);\n state.setIsPlaceholder(initialStateRef.current.isPlaceholder);\n close();\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button\n variant=\"flat\"\n color=\"primary\"\n size=\"xs\"\n onClick={() => {\n const value = state.selectedValue;\n if (compareState && compareVisible) {\n value.compareStart = compareState.selectedValue.start;\n value.compareEnd = compareState.selectedValue.end;\n }\n close(value);\n }}\n >\n <Trans message=\"Select\" />\n </Button>\n </DialogFooter>\n );\n\n return (\n <Dialog size=\"auto\">\n <DialogBody className=\"flex\" padding=\"p-0\">\n {!isTablet && (\n <div className=\"min-w-192 py-14\">\n <DatePresetList\n selectedValue={state.selectedValue}\n onPresetSelected={preset => {\n state.setSelectedValue(preset);\n if (state.closeDialogOnSelection) {\n close(preset);\n }\n }}\n />\n {!!compareState && (\n <Fragment>\n <Switch\n className=\"mx-20 mb-10 mt-14\"\n checked={compareVisible}\n onChange={e => setCompareVisible(e.target.checked)}\n >\n <Trans message=\"Compare\" />\n </Switch>\n {compareVisible && (\n <DateRangeComparePresetList\n originalRangeValue={state.selectedValue}\n selectedValue={compareState.selectedValue}\n onPresetSelected={preset => {\n compareState.setSelectedValue(preset);\n }}\n />\n )}\n </Fragment>\n )}\n </div>\n )}\n <AnimatePresence initial={false}>\n <Calendars\n state={state}\n compareState={compareState}\n showInlineDatePickerField={showInlineDatePickerField}\n compareVisible={compareVisible}\n />\n </AnimatePresence>\n </DialogBody>\n {!state.closeDialogOnSelection && footer}\n </Dialog>\n );\n}\n\ninterface CustomRangePanelProps {\n state: DateRangePickerState;\n compareState?: DateRangePickerState;\n showInlineDatePickerField?: boolean;\n compareVisible: boolean;\n}\nfunction Calendars({\n state,\n compareState,\n showInlineDatePickerField,\n compareVisible,\n}: CustomRangePanelProps) {\n return (\n <m.div\n initial={{width: 0, overflow: 'hidden'}}\n animate={{width: 'auto'}}\n exit={{width: 0, overflow: 'hidden'}}\n transition={{type: 'tween', duration: 0.125}}\n className=\"border-l px-20 pb-20 pt-10\"\n >\n {showInlineDatePickerField && (\n <div>\n <InlineDatePickerField state={state} />\n {!!compareState && compareVisible && (\n <InlineDatePickerField\n state={compareState}\n label={<Trans message=\"Compare\" />}\n />\n )}\n </div>\n )}\n <div className=\"flex items-start gap-36\">\n <Calendar state={state} visibleMonths={2} />\n </div>\n </m.div>\n );\n}\n\ninterface InlineDatePickerFieldProps {\n state: DateRangePickerState;\n label?: ReactNode;\n}\nfunction InlineDatePickerField({state, label}: InlineDatePickerFieldProps) {\n const {selectedValue, setSelectedValue} = state;\n return (\n <DatePickerField className=\"mb-20 mt-10\" label={label}>\n <DateSegmentList\n state={state}\n value={selectedValue.start}\n onChange={newValue => {\n setSelectedValue({...selectedValue, start: newValue});\n }}\n />\n <ArrowRightAltIcon className=\"block flex-shrink-0 text-muted\" size=\"md\" />\n <DateSegmentList\n state={state}\n value={selectedValue.end}\n onChange={newValue => {\n setSelectedValue({...selectedValue, end: newValue});\n }}\n />\n </DatePickerField>\n );\n}\n","import React, {\n ComponentPropsWithoutRef,\n Fragment,\n MouseEvent,\n useRef,\n} from 'react';\nimport {DateRangeIcon} from '../../../../../icons/material/DateRange';\nimport {DialogTrigger} from '../../../../overlays/dialog/dialog-trigger';\nimport {DatePickerField, DatePickerFieldProps} from './date-picker-field';\nimport {useDateRangePickerState} from './use-date-range-picker-state';\nimport {ArrowRightAltIcon} from '../../../../../icons/material/ArrowRightAlt';\nimport {DatePickerValueProps} from '../date-picker/use-date-picker-state';\nimport {DateRangeValue} from './date-range-value';\nimport {DateSegmentList} from '../segments/date-segment-list';\nimport {DateRangeDialog} from './dialog/date-range-dialog';\nimport {useIsMobileMediaQuery} from '../../../../../utils/hooks/is-mobile-media-query';\n\nexport interface DateRangePickerProps\n extends DatePickerValueProps<Partial<DateRangeValue>>,\n Omit<DatePickerFieldProps, 'children'> {}\nexport function DateRangePicker(props: DateRangePickerProps) {\n const {granularity, closeDialogOnSelection, ...fieldProps} = props;\n const state = useDateRangePickerState(props);\n const inputRef = useRef<HTMLDivElement>(null);\n const isMobile = useIsMobileMediaQuery();\n const hideCalendarIcon = isMobile && granularity !== 'day';\n\n const dialog = (\n <DialogTrigger\n offset={8}\n placement=\"bottom-start\"\n isOpen={state.calendarIsOpen}\n onOpenChange={state.setCalendarIsOpen}\n type=\"popover\"\n triggerRef={inputRef}\n returnFocusToTrigger={false}\n moveFocusToDialog={false}\n >\n <DateRangeDialog state={state} />\n </DialogTrigger>\n );\n\n const openOnClick: ComponentPropsWithoutRef<'div'> = {\n onClick: e => {\n e.stopPropagation();\n e.preventDefault();\n if (!isHourSegment(e)) {\n state.setCalendarIsOpen(true);\n } else {\n state.setCalendarIsOpen(false);\n }\n },\n };\n\n const value = state.selectedValue;\n const onChange = state.setSelectedValue;\n\n return (\n <Fragment>\n <DatePickerField\n ref={inputRef}\n wrapperProps={openOnClick}\n endAdornment={!hideCalendarIcon ? <DateRangeIcon /> : undefined}\n {...fieldProps}\n >\n <DateSegmentList\n isPlaceholder={state.isPlaceholder?.start}\n state={state}\n segmentProps={openOnClick}\n value={value.start}\n onChange={newValue => {\n onChange({start: newValue, end: value.end});\n }}\n />\n <ArrowRightAltIcon\n className=\"block flex-shrink-0 text-muted\"\n size=\"md\"\n />\n <DateSegmentList\n isPlaceholder={state.isPlaceholder?.end}\n state={state}\n segmentProps={openOnClick}\n value={value.end}\n onChange={newValue => {\n onChange({start: value.start, end: newValue});\n }}\n />\n </DatePickerField>\n {dialog}\n </Fragment>\n );\n}\n\nfunction isHourSegment(e: MouseEvent<HTMLDivElement>): boolean {\n return ['hour', 'minute', 'dayPeriod'].includes(\n (e.currentTarget as HTMLElement).ariaLabel || ''\n );\n}\n","import {parseAbsoluteToLocal, ZonedDateTime} from '@internationalized/date';\nimport {DateRangeValue} from './date-range-value';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport React from 'react';\nimport {DateRangePicker, DateRangePickerProps} from './date-range-picker';\n\nexport interface AbsoluteDateRange {\n start?: string;\n end?: string;\n preset?: number;\n}\n\ninterface FormDateRange {\n start?: string | ZonedDateTime;\n end?: string | ZonedDateTime;\n preset?: number;\n}\n\nexport interface FormDateRangePickerProps extends DateRangePickerProps {\n name: string;\n}\nexport function FormDateRangePicker(props: FormDateRangePickerProps) {\n const {\n field: {onChange, onBlur, value, ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<DateRangePickerProps> = {\n onChange: e => {\n onChange(e ? dateRangeToAbsoluteRange(e) : null);\n },\n onBlur,\n value: absoluteRangeToDateRange(value),\n invalid,\n errorMessage: error?.message,\n inputRef: ref,\n };\n\n return <DateRangePicker {...mergeProps(formProps, props)} />;\n}\n\nexport function absoluteRangeToDateRange(props: FormDateRange | null) {\n const {start, end, preset} = props || {};\n const dateRange: Partial<DateRangeValue> = {preset};\n try {\n if (start) {\n dateRange.start =\n typeof start === 'string' ? parseAbsoluteToLocal(start) : start;\n }\n if (end) {\n dateRange.end = typeof end === 'string' ? parseAbsoluteToLocal(end) : end;\n }\n } catch (e) {\n // ignore\n }\n return dateRange;\n}\n\nexport function dateRangeToAbsoluteRange({\n start,\n end,\n preset,\n}: Partial<DateRangeValue> = {}): AbsoluteDateRange {\n const absoluteRange: AbsoluteDateRange = {\n preset,\n };\n if (start) {\n absoluteRange.start = start.toAbsoluteString();\n }\n if (end) {\n absoluteRange.end = end.toAbsoluteString();\n }\n return absoluteRange;\n}\n","export const BackendFiltersUrlKey = 'filters';\n","import {FilterListValue} from './encode-backend-filters';\n\nexport function decodeBackendFilters(\n encodedFilters: string | null\n): FilterListValue[] {\n if (!encodedFilters) return [];\n let filtersFromQuery: FilterListValue[] = [];\n try {\n filtersFromQuery = JSON.parse(atob(decodeURIComponent(encodedFilters)));\n filtersFromQuery.map(filterValue => {\n // set value key as value so selects work properly\n if (filterValue.valueKey != null) {\n filterValue.value = filterValue.valueKey;\n }\n return filterValue;\n });\n } catch (e) {\n //\n }\n return filtersFromQuery;\n}\n","import {BackendFilter} from '../backend-filter';\n\nexport interface FilterListValue {\n key: string | number;\n value: BackendFilter['control']['defaultValue'];\n operator?: BackendFilter['defaultOperator'];\n valueKey?: string | number;\n isInactive?: boolean;\n extraFilters?: {key: string; operator: string; value: any}[];\n}\n\nexport function encodeBackendFilters(\n filterValues: FilterListValue[] | null,\n filters?: BackendFilter[],\n): string {\n if (!filterValues) return '';\n\n // prepare values for backend\n filterValues = !filters\n ? filterValues\n : filterValues\n .filter(item => item.value !== '')\n .map(item => transformValue(item, filters));\n\n // remove all placeholder filters\n filterValues = filterValues.filter(fm => !fm.isInactive);\n\n if (!filterValues.length) {\n return '';\n }\n\n return encodeURIComponent(btoa(JSON.stringify(filterValues)));\n}\n\nfunction transformValue(\n filterValue: FilterListValue,\n filters: BackendFilter[],\n) {\n const filterConfig = filters.find(f => f.key === filterValue.key);\n // select components will use a key always, because we can't use objects as\n // value. Map over select options and replace key with actual value\n if (filterConfig?.control.type === 'select') {\n const option = (filterConfig.control.options || []).find(\n o => o.key === filterValue.value,\n );\n // if it's language or country select, there might not be an option\n if (option) {\n return {...filterValue, value: option.value, valueKey: option.key};\n }\n }\n\n if (filterConfig?.extraFilters?.length) {\n filterValue['extraFilters'] = filterConfig.extraFilters;\n }\n\n return filterValue;\n}\n","import {useNavigate, useSearchParams} from 'react-router-dom';\nimport {Key, useCallback, useMemo} from 'react';\nimport {BackendFilter} from './backend-filter';\nimport {BackendFiltersUrlKey} from './backend-filters-url-key';\nimport {decodeBackendFilters} from './utils/decode-backend-filters';\nimport {\n encodeBackendFilters,\n FilterListValue,\n} from './utils/encode-backend-filters';\n\nexport function useBackendFilterUrlParams(\n filters?: BackendFilter[],\n pinnedFilters?: string[]\n) {\n const [searchParams] = useSearchParams();\n const navigate = useNavigate();\n\n const encodedFilters = searchParams.get(BackendFiltersUrlKey);\n\n const decodedFilters: FilterListValue[] = useMemo(() => {\n if (!filters) return [];\n const decoded = decodeBackendFilters(encodedFilters);\n\n // if filter is pinned, and it is not applied yet, add a placeholder\n (pinnedFilters || []).forEach(key => {\n if (!decoded.find(f => f.key === key)) {\n const config = filters.find(f => f.key === key)!;\n decoded.push({\n key,\n value: config.control.defaultValue,\n operator: config.defaultOperator,\n isInactive: true,\n });\n }\n });\n\n // preserve original filter order from configuration\n decoded.sort(\n (a, b) =>\n filters.findIndex(f => f.key === a.key) -\n filters.findIndex(f => f.key === b.key)\n );\n\n return decoded;\n }, [encodedFilters, pinnedFilters, filters]);\n\n const getDecodedWithoutKeys = useCallback(\n (values: (FilterListValue | Key)[]) => {\n const newFilters = [...decodedFilters];\n values.forEach(value => {\n const key = typeof value === 'object' ? value.key : value;\n const index = newFilters.findIndex(f => f.key === key);\n if (index > -1) {\n newFilters.splice(index, 1);\n }\n });\n return newFilters;\n },\n [decodedFilters]\n );\n\n const replaceAll = useCallback(\n (filterValues: FilterListValue[]) => {\n const encodedFilters = encodeBackendFilters(filterValues, filters);\n if (encodedFilters) {\n searchParams.set(BackendFiltersUrlKey, encodedFilters);\n } else {\n searchParams.delete(BackendFiltersUrlKey);\n }\n navigate({search: `?${searchParams}`}, {replace: true});\n },\n [filters, navigate, searchParams]\n );\n\n const add = useCallback(\n (filterValues: FilterListValue[]) => {\n const existing = getDecodedWithoutKeys(filterValues);\n const decodedFilters = [...existing, ...filterValues];\n replaceAll(decodedFilters);\n },\n [getDecodedWithoutKeys, replaceAll]\n );\n\n const remove = useCallback(\n (key: Key) => replaceAll(getDecodedWithoutKeys([key])),\n [getDecodedWithoutKeys, replaceAll]\n );\n\n return {\n add,\n remove,\n replaceAll,\n decodedFilters,\n encodedFilters,\n };\n}\n","import {\n keepPreviousData,\n useQuery,\n UseQueryOptions,\n} from '@tanstack/react-query';\nimport {PaginatedBackendResponse} from '../../http/backend-response/pagination-response';\nimport {apiClient} from '../../http/query-client';\n\nexport interface GetDatatableDataParams {\n orderBy?: string;\n orderDir?: 'asc' | 'desc';\n filters?: string | null;\n query?: string;\n with?: string;\n perPage?: number | string | null;\n page?: number | string;\n paginate?: 'simple' | 'lengthAware' | 'cursor';\n [key: string]: string | number | boolean | undefined | null;\n}\n\nexport const DatatableDataQueryKey = (\n endpoint: string,\n params?: GetDatatableDataParams | Record<string, string | number | boolean>,\n) => {\n // split endpoint by slash, so we can clear cache from the root later,\n // for example, 'link-group' will clear 'link-group/1/links' endpoint\n const key: (string | GetDatatableDataParams)[] = endpoint.split('/');\n if (params) {\n key.push(params);\n }\n return key;\n};\n\nexport function useDatatableData<T = object>(\n endpoint: string,\n params: GetDatatableDataParams,\n options?: Omit<\n UseQueryOptions<\n PaginatedBackendResponse<T>,\n unknown,\n PaginatedBackendResponse<T>,\n any[]\n >,\n 'queryKey' | 'queryFn'\n >,\n onLoad?: (data: PaginatedBackendResponse<T>) => void,\n) {\n if (!params.paginate) {\n params.paginate = 'simple';\n }\n return useQuery({\n queryKey: DatatableDataQueryKey(endpoint, params),\n queryFn: ({signal}) => paginate<T>(endpoint, params, onLoad, signal),\n placeholderData: keepPreviousData,\n ...options,\n });\n}\n\nasync function paginate<T>(\n endpoint: string,\n params: GetDatatableDataParams,\n onLoad?: (data: PaginatedBackendResponse<T>) => void,\n signal?: AbortSignal,\n): Promise<PaginatedBackendResponse<T>> {\n if (params.query) {\n await new Promise(resolve => setTimeout(resolve, 300));\n }\n const response = await apiClient\n .get(endpoint, {params, signal: params.query ? signal : undefined})\n .then(response => response.data);\n onLoad?.(response);\n return response;\n}\n","import {isMac} from '@react-aria/utils';\n\ninterface Event {\n altKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n}\n\nexport function isCtrlKeyPressed(e: Event) {\n if (isMac()) {\n return e.metaKey;\n }\n\n return e.ctrlKey;\n}\n","import React, {KeyboardEventHandler} from 'react';\nimport {getFocusableTreeWalker} from '@react-aria/focus';\nimport {focusWithoutScrolling} from '@react-aria/utils';\nimport {isCtrlKeyPressed} from '../../utils/keybinds/is-ctrl-key-pressed';\n\ninterface Props {\n cellCount: number;\n rowCount: number;\n}\nexport function useGridNavigation(props: Props) {\n const {cellCount, rowCount} = props;\n const onKeyDown: KeyboardEventHandler<HTMLElement> = e => {\n switch (e.key) {\n case 'ArrowLeft':\n focusSiblingCell(e, {cell: {op: 'decrement'}}, props);\n break;\n case 'ArrowRight':\n focusSiblingCell(e, {cell: {op: 'increment'}}, props);\n break;\n case 'ArrowUp':\n focusSiblingCell(e, {row: {op: 'decrement'}}, props);\n break;\n case 'ArrowDown':\n focusSiblingCell(e, {row: {op: 'increment'}}, props);\n break;\n case 'PageUp':\n focusSiblingCell(e, {row: {op: 'decrement', count: 5}}, props);\n break;\n case 'PageDown':\n focusSiblingCell(e, {row: {op: 'increment', count: 5}}, props);\n break;\n case 'Tab':\n focusFirstElementAfterGrid(e);\n break;\n case 'Home':\n if (isCtrlKeyPressed(e)) {\n // move to first cell in first row\n focusSiblingCell(\n e,\n {\n row: {op: 'decrement', count: rowCount},\n cell: {op: 'decrement', count: cellCount},\n },\n props\n );\n } else {\n // move to first cell in current row\n focusSiblingCell(\n e,\n {cell: {op: 'decrement', count: cellCount}},\n props\n );\n }\n break;\n case 'End':\n if (isCtrlKeyPressed(e)) {\n // move to last cell in last row\n focusSiblingCell(\n e,\n {\n row: {op: 'increment', count: rowCount},\n cell: {op: 'increment', count: cellCount},\n },\n props\n );\n } else {\n // move to last cell in current row\n focusSiblingCell(\n e,\n {cell: {op: 'increment', count: cellCount}},\n props\n );\n }\n break;\n }\n };\n\n return {onKeyDown};\n}\n\ninterface Operations {\n cell?: {\n op: 'increment' | 'decrement';\n count?: number;\n };\n row?: {\n op: 'increment' | 'decrement';\n count?: number;\n };\n}\nfunction focusSiblingCell(\n e: React.KeyboardEvent,\n operations: Operations,\n {cellCount, rowCount}: Props\n) {\n if (document.activeElement?.tagName === 'input') return;\n e.preventDefault();\n const grid = e.currentTarget as HTMLElement;\n\n // focused element might be inside the cell and not the cell itself\n const currentCell = (e.target as HTMLElement).closest('[aria-colindex]');\n if (!currentCell || !grid) return;\n\n const row = currentCell.closest('[aria-rowindex]');\n if (!row) return;\n\n // grab row and cell index from aria attributes\n let rowIndex = parseInt(row.getAttribute('aria-rowindex') as string);\n let cellIndex = parseInt(currentCell.getAttribute('aria-colindex') as string);\n if (Number.isNaN(rowIndex) || Number.isNaN(cellIndex)) return;\n\n // adjust row index for next cell selector\n const rowOpCount = operations.row?.count ?? 1;\n if (operations.row?.op === 'increment') {\n rowIndex = Math.min(rowCount, rowIndex + rowOpCount);\n } else if (operations.row?.op === 'decrement') {\n rowIndex = Math.max(1, rowIndex - rowOpCount);\n }\n\n // adjust cell index for next cell selector\n const cellOpCount = operations.cell?.count ?? 1;\n if (operations.cell?.op === 'increment') {\n cellIndex = Math.min(cellCount, cellIndex + cellOpCount);\n } else if (operations.cell?.op === 'decrement') {\n cellIndex = Math.max(1, cellIndex - cellOpCount);\n }\n\n // find the next cell that should be focused\n const nextCell = grid.querySelector(\n `[aria-rowindex=\"${rowIndex}\"] [aria-colindex=\"${cellIndex}\"]`\n ) as HTMLElement | undefined;\n if (!nextCell) return;\n\n // find any focusable elements inside the cell\n const walker = getFocusableTreeWalker(nextCell);\n const nextFocusableElement = (walker.nextNode() || nextCell) as HTMLElement;\n\n // adjust tab index on current and next cells and focus either next cell or first focusable element inside that cell\n currentCell.setAttribute('tabindex', '-1');\n nextFocusableElement.setAttribute('tabindex', '0');\n nextFocusableElement.focus();\n}\n\n// grid is treated as a single tab stop, focus first element after grid, instead of moving focus withing grid on tab press\nfunction focusFirstElementAfterGrid(e: React.KeyboardEvent) {\n const grid = e.currentTarget as HTMLElement;\n if (e.shiftKey) {\n grid.focus();\n } else {\n const walker = getFocusableTreeWalker(grid, {tabbable: true});\n let next: HTMLElement;\n let last: HTMLElement;\n do {\n last = walker.lastChild() as HTMLElement;\n if (last) {\n next = last;\n }\n } while (last);\n\n // @ts-ignore\n if (next && !next.contains(document.activeElement)) {\n focusWithoutScrolling(next);\n }\n }\n}\n","import {createContext} from 'react';\nimport type {SortDescriptor} from './types/sort-descriptor';\nimport type {TableProps} from './table';\nimport type {ColumnConfig} from '../../datatable/column-config';\nimport type {TableDataItem} from './types/table-data-item';\n\nexport type TableSelectionStyle = 'checkbox' | 'highlight';\n\nexport interface TableContextValue<T extends TableDataItem = TableDataItem> {\n isCollapsedMode: boolean;\n selectedRows: (string | number)[];\n onSelectionChange: (keys: (string | number)[]) => void;\n sortDescriptor?: SortDescriptor;\n onSortChange?: (descriptor: SortDescriptor) => any;\n enableSelection?: boolean;\n enableSorting?: boolean;\n selectionStyle: TableSelectionStyle;\n data: T[];\n meta?: any;\n columns: ColumnConfig<T>[];\n toggleRow: (item: T) => void;\n selectRow: (item: T | null, merge?: boolean) => void;\n hideBorder: boolean;\n hideHeaderRow: boolean;\n collapseOnMobile: boolean;\n onAction: TableProps<T>['onAction'];\n selectRowOnContextMenu: TableProps<T>['selectRowOnContextMenu'];\n cellHeight: string | undefined;\n headerCellHeight: string | undefined;\n}\nexport const TableContext = createContext<TableContextValue>(null!);\n","import clsx from 'clsx';\nimport {useContext} from 'react';\nimport {TableContext} from '@common/ui/tables/table-context';\n\ninterface Props {\n index: number;\n isHeader: boolean;\n}\nexport function useTableCellStyle({index, isHeader}: Props) {\n const {\n columns,\n cellHeight = 'h-46',\n headerCellHeight = 'h-46',\n } = useContext(TableContext);\n const column = columns[index];\n\n const userPadding = column?.padding;\n\n let justify = 'justify-start';\n if (column?.align === 'center') {\n justify = 'justify-center';\n } else if (column?.align === 'end') {\n justify = 'justify-end';\n }\n\n return clsx(\n 'flex items-center overflow-hidden whitespace-nowrap overflow-ellipsis outline-none focus-visible:outline focus-visible:outline-offset-2',\n isHeader ? headerCellHeight : cellHeight,\n column?.width ?? 'flex-1',\n column?.maxWidth,\n column?.minWidth,\n justify,\n userPadding,\n column?.className\n );\n}\n","import {useContext, useMemo} from 'react';\nimport {TableContext} from './table-context';\nimport {TableDataItem} from './types/table-data-item';\nimport {RowContext} from '@common/datatable/column-config';\nimport {useTableCellStyle} from '@common/ui/tables/style/use-table-cell-style';\n\ninterface TableCellProps {\n rowIsHovered: boolean;\n rowIndex: number;\n index: number;\n item: TableDataItem;\n id?: string;\n}\nexport function TableCell({\n rowIndex,\n rowIsHovered,\n index,\n item,\n id,\n}: TableCellProps) {\n const {columns} = useContext(TableContext);\n const column = columns[index];\n\n const rowContext: RowContext = useMemo(() => {\n return {\n index: rowIndex,\n isHovered: rowIsHovered,\n isPlaceholder: item.isPlaceholder,\n };\n }, [rowIndex, rowIsHovered, item.isPlaceholder]);\n\n const style = useTableCellStyle({\n index: index,\n isHeader: false,\n });\n\n return (\n <div\n tabIndex={-1}\n role=\"gridcell\"\n aria-colindex={index + 1}\n id={id}\n className={style}\n >\n <div className=\"overflow-x-hidden overflow-ellipsis min-w-0 w-full\">\n {column.body(item, rowContext)}\n </div>\n </div>\n );\n}\n","import React, {HTMLAttributes, useRef} from 'react';\nimport {createEventHandler} from '../../utils/dom/create-event-handler';\nimport {useGlobalListeners} from '@react-aria/utils';\n\ninterface PointerState {\n lastPosition: {x: number; y: number};\n id?: number;\n started: boolean;\n el?: HTMLElement;\n originalTouchAction?: string;\n originalUserSelect?: string;\n longPressTimer?: any;\n longPressTriggered?: boolean;\n}\n\ninterface UsePointerEventsReturn {\n domProps: HTMLAttributes<HTMLElement>;\n}\n\nexport interface UsePointerEventsProps {\n onMoveStart?: (e: PointerEvent, el: HTMLElement) => false | void;\n onMove?: (e: PointerEvent, deltaX: number, deltaY: number) => void;\n onMoveEnd?: (e: PointerEvent) => void;\n onPointerDown?: (e: React.PointerEvent) => void | false;\n onPointerUp?: (e: PointerEvent, el: HTMLElement) => void;\n onPress?: (e: PointerEvent, el: HTMLElement) => void;\n onLongPress?: (e: PointerEvent | React.PointerEvent, el: HTMLElement) => void;\n preventDefault?: boolean;\n stopPropagation?: boolean;\n minimumMovement?: number;\n}\nexport function usePointerEvents({\n onMoveStart,\n onMove,\n onMoveEnd,\n minimumMovement = 0,\n preventDefault,\n stopPropagation = true,\n onPress,\n onLongPress,\n ...props\n}: UsePointerEventsProps): UsePointerEventsReturn {\n const stateRef = useRef<PointerState>({\n lastPosition: {x: 0, y: 0},\n started: false,\n longPressTriggered: false,\n });\n const state = stateRef.current;\n\n const {addGlobalListener, removeGlobalListener} = useGlobalListeners();\n\n const start = (e: PointerEvent) => {\n if (!state.el) return;\n const result = onMoveStart?.(e, state.el);\n\n // allow user to cancel interaction\n if (result === false) return;\n\n state.originalTouchAction = state.el.style.touchAction;\n state.el.style.touchAction = 'none';\n state.originalUserSelect = document.documentElement.style.userSelect;\n document.documentElement.style.userSelect = 'none';\n state.started = true;\n };\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (e.button === 0 && state.id == null) {\n state.started = false;\n\n const result = props.onPointerDown?.(e);\n if (result === false) return;\n\n if (stopPropagation) {\n e.stopPropagation();\n }\n if (preventDefault) {\n e.preventDefault();\n }\n state.id = e.pointerId;\n state.el = e.currentTarget as HTMLElement;\n state.lastPosition = {x: e.clientX, y: e.clientY};\n\n // use global listeners, so we don't have to capture pointer,\n // which would prevent click events on child nodes\n\n if (onLongPress) {\n state.longPressTimer = setTimeout(() => {\n onLongPress(e, state.el!);\n state.longPressTriggered = true;\n }, 400);\n }\n\n if (onMoveStart || onMove) {\n addGlobalListener(window, 'pointermove', onPointerMove, false);\n }\n addGlobalListener(window, 'pointerup', onPointerUp, false);\n addGlobalListener(window, 'pointercancel', onPointerUp, false);\n }\n };\n\n const onPointerMove = (e: PointerEvent) => {\n if (e.pointerId === state.id) {\n const deltaX = e.clientX - state.lastPosition.x;\n const deltaY = e.clientY - state.lastPosition.y;\n\n if (\n (Math.abs(deltaX) >= minimumMovement ||\n Math.abs(deltaY) >= minimumMovement) &&\n !state.started\n ) {\n start(e);\n }\n\n if (state.started) {\n onMove?.(e, deltaX, deltaY);\n state.lastPosition = {x: e.clientX, y: e.clientY};\n }\n }\n };\n\n const onPointerUp = (e: PointerEvent) => {\n if (e.pointerId === state.id) {\n // cancel long press timer, if exists\n if (state.longPressTimer) {\n clearTimeout(state.longPressTimer);\n }\n\n const longPressTriggered = state.longPressTriggered;\n state.longPressTriggered = false;\n\n // only call onMoveEnd if we actually started moving\n if (state.started) {\n onMoveEnd?.(e);\n }\n\n if (state.el) {\n // handle press only if event was not cancelled (via touch scroll on mobile for example)\n if (e.type !== 'pointercancel') {\n props.onPointerUp?.(e, state.el);\n\n // only call onPress if pointer did not leave onPointerDown element\n if (e.target && state.el.contains(e.target as HTMLElement)) {\n // trigger either onPress or onLongPress\n if (longPressTriggered) {\n onLongPress?.(e, state.el);\n } else {\n onPress?.(e, state.el);\n }\n }\n }\n\n document.documentElement.style.userSelect =\n state.originalUserSelect || '';\n state.el.style.touchAction = state.originalTouchAction || '';\n }\n state.id = undefined;\n state.started = false;\n removeGlobalListener(window, 'pointermove', onPointerMove, false);\n removeGlobalListener(window, 'pointerup', onPointerUp, false);\n removeGlobalListener(window, 'pointercancel', onPointerUp, false);\n }\n };\n\n return {\n domProps: {\n onPointerDown: createEventHandler(onPointerDown),\n },\n };\n}\n","import {isCtrlKeyPressed} from './is-ctrl-key-pressed';\n\ninterface Event {\n altKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n shiftKey: boolean;\n}\n\nexport function isCtrlOrShiftPressed(e: Event) {\n return e.shiftKey || isCtrlKeyPressed(e);\n}\n","import clsx from 'clsx';\nimport {useContext} from 'react';\nimport {TableContext} from '@common/ui/tables/table-context';\nimport {useIsDarkMode} from '@common/ui/themes/use-is-dark-mode';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\ninterface Props {\n index: number;\n isSelected: boolean;\n isHeader?: boolean;\n}\nexport function useTableRowStyle({index, isSelected, isHeader}: Props) {\n const isDarkMode = useIsDarkMode();\n const isMobile = useIsMobileMediaQuery();\n const {hideBorder, enableSelection, collapseOnMobile, onAction} =\n useContext(TableContext);\n const isFirst = index === 0;\n return clsx(\n 'flex gap-x-16 break-inside-avoid outline-none border border-transparent',\n onAction && 'cursor-pointer',\n isMobile && collapseOnMobile && hideBorder\n ? 'mb-8 pl-8 pr-0 rounded'\n : 'px-16',\n !hideBorder && 'border-b-divider',\n !hideBorder && isFirst && 'border-t-divider',\n isSelected &&\n !isDarkMode &&\n 'bg-primary/selected hover:bg-primary/focus focus-visible:bg-primary/focus',\n isSelected &&\n isDarkMode &&\n 'bg-selected hover:bg-focus focus-visible:bg-focus',\n !isSelected &&\n !isHeader &&\n (enableSelection || onAction) &&\n 'focus-visible:bg-focus hover:bg-hover'\n );\n}\n","import React, {\n ComponentPropsWithoutRef,\n JSXElementConstructor,\n KeyboardEventHandler,\n MouseEventHandler,\n useContext,\n useRef,\n useState,\n} from 'react';\nimport {TableContext} from './table-context';\nimport {TableCell} from './table-cell';\nimport {TableDataItem} from './types/table-data-item';\nimport {createEventHandler} from '../../utils/dom/create-event-handler';\nimport {usePointerEvents} from '../interactions/use-pointer-events';\nimport {isCtrlOrShiftPressed} from '../../utils/keybinds/is-ctrl-or-shift-pressed';\nimport {useTableRowStyle} from '@common/ui/tables/style/use-table-row-style';\nimport clsx from 'clsx';\n\nconst interactableElements = ['button', 'a', 'input', 'select', 'textarea'];\n\nexport interface RowElementProps<T = TableDataItem>\n extends ComponentPropsWithoutRef<'tr'> {\n item: T & {isPlaceholder?: boolean};\n}\n\ninterface TableRowProps {\n item: TableDataItem;\n index: number;\n renderAs?: JSXElementConstructor<RowElementProps>;\n className?: string;\n style?: React.CSSProperties;\n}\nexport function TableRow({\n item,\n index,\n renderAs,\n className,\n style,\n}: TableRowProps) {\n const {\n selectedRows,\n columns,\n toggleRow,\n selectRow,\n onAction,\n selectRowOnContextMenu,\n enableSelection,\n selectionStyle,\n hideHeaderRow,\n } = useContext(TableContext);\n\n const isTouchDevice = useRef(false);\n const isSelected = selectedRows.includes(item.id);\n const [isHovered, setIsHovered] = useState(false);\n\n const clickedOnInteractable = (e: React.MouseEvent | PointerEvent) => {\n return (e.target as HTMLElement).closest(interactableElements.join(','));\n };\n\n const doubleClickHandler: MouseEventHandler<HTMLDivElement> = e => {\n if (\n selectionStyle === 'highlight' &&\n onAction &&\n !isTouchDevice.current &&\n !clickedOnInteractable(e)\n ) {\n e.preventDefault();\n e.stopPropagation();\n onAction(item, index);\n }\n };\n\n const anyRowsSelected = !!selectedRows.length;\n\n const handleRowTap = (e: PointerEvent) => {\n if (clickedOnInteractable(e)) return;\n if (selectionStyle === 'checkbox') {\n if (enableSelection && (anyRowsSelected || !onAction)) {\n toggleRow(item);\n } else if (onAction) {\n onAction(item, index);\n }\n } else if (selectionStyle === 'highlight') {\n if (isTouchDevice.current) {\n if (enableSelection && anyRowsSelected) {\n toggleRow(item);\n } else {\n onAction?.(item, index);\n }\n } else if (enableSelection) {\n selectRow(item, isCtrlOrShiftPressed(e));\n }\n }\n };\n\n const {domProps} = usePointerEvents({\n onPointerDown: e => {\n isTouchDevice.current = e.pointerType === 'touch';\n },\n onPress: handleRowTap,\n onLongPress: enableSelection\n ? () => {\n if (isTouchDevice.current) {\n toggleRow(item);\n }\n }\n : undefined,\n });\n\n const keyboardHandler: KeyboardEventHandler = e => {\n if (enableSelection && e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n if (selectionStyle === 'checkbox') {\n toggleRow(item);\n } else {\n selectRow(item);\n }\n } else if (e.key === 'Enter' && !selectedRows.length && onAction) {\n e.preventDefault();\n e.stopPropagation();\n onAction(item, index);\n }\n };\n\n const contextMenuHandler: MouseEventHandler = e => {\n if (selectRowOnContextMenu && enableSelection) {\n if (!selectedRows.includes(item.id)) {\n selectRow(item);\n }\n }\n // prevent context menu on mobile\n if (isTouchDevice.current) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n const styleClassName = useTableRowStyle({index, isSelected});\n\n const RowElement = renderAs || 'div';\n return (\n <RowElement\n role=\"row\"\n aria-rowindex={index + 1 + (hideHeaderRow ? 0 : 1)}\n aria-selected={isSelected}\n tabIndex={-1}\n className={clsx(className, styleClassName)}\n item={RowElement === 'div' ? (undefined as any) : item}\n onDoubleClick={createEventHandler(doubleClickHandler)}\n onKeyDown={createEventHandler(keyboardHandler)}\n onContextMenu={createEventHandler(contextMenuHandler)}\n onPointerEnter={createEventHandler(() => setIsHovered(true))}\n onPointerLeave={createEventHandler(() => setIsHovered(false))}\n style={style}\n {...domProps}\n >\n {columns.map((column, cellIndex) => (\n <TableCell\n rowIndex={index}\n rowIsHovered={isHovered}\n index={cellIndex}\n item={item}\n key={`${item.id}-${column.key}`}\n />\n ))}\n </RowElement>\n );\n}\n","import {ColumnConfig} from '@common/datatable/column-config';\nimport {TableDataItem} from '@common/ui/tables/types/table-data-item';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport React, {useContext} from 'react';\nimport {Checkbox} from '@common/ui/forms/toggle/checkbox';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {TableContext} from '@common/ui/tables/table-context';\n\nexport const CheckboxColumnConfig: ColumnConfig<TableDataItem> = {\n key: 'checkbox',\n header: () => <SelectAllCheckbox />,\n align: 'center',\n width: 'w-24 flex-shrink-0',\n body: (item, row) => {\n if (row.isPlaceholder) {\n return <Skeleton size=\"w-24 h-24\" variant=\"rect\" />;\n }\n return <SelectRowCheckbox item={item} />;\n },\n};\n\ninterface SelectRowCheckboxProps {\n item: TableDataItem;\n}\nfunction SelectRowCheckbox({item}: SelectRowCheckboxProps) {\n const {selectedRows, toggleRow} = useContext(TableContext);\n return (\n <Checkbox\n checked={selectedRows.includes(item.id)}\n onChange={() => toggleRow(item)}\n />\n );\n}\n\nfunction SelectAllCheckbox() {\n const {trans} = useTrans();\n\n const {data, selectedRows, onSelectionChange} = useContext(TableContext);\n const allRowsSelected = !!data.length && data.length === selectedRows.length;\n const someRowsSelected = !allRowsSelected && !!selectedRows.length;\n\n return (\n <Checkbox\n aria-label={trans({message: 'Select all'})}\n isIndeterminate={someRowsSelected}\n checked={allRowsSelected}\n onChange={() => {\n if (allRowsSelected) {\n onSelectionChange([]);\n } else {\n onSelectionChange(data.map(d => d.id));\n }\n }}\n />\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowDownwardIcon = createSvgIcon(\n <path d=\"m20 12-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z\" />\n, 'ArrowDownwardOutlined');\n","import {useContext, useState} from 'react';\nimport clsx from 'clsx';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {TableContext} from './table-context';\nimport {SortDescriptor} from './types/sort-descriptor';\nimport {ArrowDownwardIcon} from '../../icons/material/ArrowDownward';\nimport {useTableCellStyle} from '@common/ui/tables/style/use-table-cell-style';\n\ninterface HeaderCellProps {\n index: number;\n}\nexport function HeaderCell({index}: HeaderCellProps) {\n const {columns, sortDescriptor, onSortChange, enableSorting} =\n useContext(TableContext);\n const column = columns[index];\n\n const style = useTableCellStyle({\n index: index,\n isHeader: true,\n });\n\n const [isHovered, setIsHovered] = useState(false);\n\n const sortingKey = column.sortingKey || column.key;\n const allowSorting = column.allowsSorting && enableSorting;\n const {orderBy, orderDir} = sortDescriptor || {};\n\n const sortActive = allowSorting && orderBy === sortingKey;\n\n let ariaSort: 'ascending' | 'descending' | 'none' | undefined;\n if (sortActive && orderDir === 'asc') {\n ariaSort = 'ascending';\n } else if (sortActive && orderDir === 'desc') {\n ariaSort = 'descending';\n } else if (allowSorting) {\n ariaSort = 'none';\n }\n\n const toggleSorting = () => {\n if (!allowSorting) return;\n\n let newSort: SortDescriptor;\n\n // if this col was sorted desc, go to asc\n if (sortActive && orderDir === 'desc') {\n newSort = {orderDir: 'asc', orderBy: sortingKey};\n\n // if this col was sorted asc, clear sort\n } else if (sortActive && orderDir === 'asc') {\n newSort = {orderBy: undefined, orderDir: undefined};\n\n // if sort was on another col, or no sort was applied yet, start from desc\n } else {\n newSort = {orderDir: 'desc', orderBy: sortingKey};\n }\n\n onSortChange?.(newSort);\n };\n\n const sortVisible = sortActive || isHovered;\n const sortVariants = {\n visible: {opacity: 1, y: 0},\n hidden: {opacity: 0, y: '-25%'},\n };\n\n return (\n <div\n role=\"columnheader\"\n tabIndex={-1}\n aria-colindex={index + 1}\n aria-sort={ariaSort}\n className={clsx(\n style,\n 'text-xs font-medium text-muted',\n allowSorting && 'cursor-pointer',\n )}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n onKeyDown={e => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n toggleSorting();\n }\n }}\n onClick={toggleSorting}\n >\n {column.hideHeader ? (\n <div className=\"opacity-0\">{column.header()}</div>\n ) : (\n column.header()\n )}\n <AnimatePresence>\n {allowSorting && (\n <m.span\n variants={sortVariants}\n animate={sortVisible ? 'visible' : 'hidden'}\n initial={false}\n transition={{type: 'tween'}}\n key=\"sort-icon\"\n className=\"-mt-2 ml-6 inline-block\"\n data-testid=\"table-sort-button\"\n aria-hidden={!sortVisible}\n >\n <ArrowDownwardIcon\n size=\"xs\"\n className={clsx(\n 'text-muted',\n orderDir === 'asc' &&\n orderBy === sortingKey &&\n 'rotate-180 transition-transform',\n )}\n />\n </m.span>\n )}\n </AnimatePresence>\n </div>\n );\n}\n","import {HeaderCell} from '@common/ui/tables/header-cell';\nimport React, {useContext} from 'react';\nimport {TableContext} from '@common/ui/tables/table-context';\n\nexport function TableHeaderRow() {\n const {columns} = useContext(TableContext);\n return (\n <div\n role=\"row\"\n aria-rowindex={1}\n tabIndex={-1}\n className=\"flex gap-x-16 px-16\"\n >\n {columns.map((column, columnIndex) => (\n <HeaderCell index={columnIndex} key={column.key} />\n ))}\n </div>\n );\n}\n","import React, {\n cloneElement,\n ComponentPropsWithoutRef,\n Fragment,\n JSXElementConstructor,\n MutableRefObject,\n ReactElement,\n useCallback,\n useContext,\n useMemo,\n} from 'react';\nimport {useControlledState} from '@react-stately/utils';\nimport {SortDescriptor} from './types/sort-descriptor';\nimport {useGridNavigation} from './navigate-grid';\nimport {RowElementProps, TableRow} from './table-row';\nimport {\n TableContext,\n TableContextValue,\n TableSelectionStyle,\n} from './table-context';\nimport {ColumnConfig} from '../../datatable/column-config';\nimport {TableDataItem} from './types/table-data-item';\nimport clsx from 'clsx';\nimport {useInteractOutside} from '@react-aria/interactions';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {isCtrlKeyPressed} from '@common/utils/keybinds/is-ctrl-key-pressed';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {CheckboxColumnConfig} from '@common/ui/tables/checkbox-column-config';\nimport {TableHeaderRow} from '@common/ui/tables/table-header-row';\n\nexport interface TableProps<T extends TableDataItem>\n extends ComponentPropsWithoutRef<'table'> {\n className?: string;\n columns: ColumnConfig<T>[];\n hideHeaderRow?: boolean;\n data: T[];\n meta?: any;\n tableRef?: MutableRefObject<HTMLTableElement>;\n selectedRows?: (number | string)[];\n defaultSelectedRows?: (number | string)[];\n onSelectionChange?: (keys: (number | string)[]) => void;\n sortDescriptor?: SortDescriptor;\n onSortChange?: (descriptor: SortDescriptor) => any;\n enableSorting?: boolean;\n onDelete?: (items: T[]) => void;\n enableSelection?: boolean;\n selectionStyle?: TableSelectionStyle;\n ariaLabelledBy?: string;\n onAction?: (item: T, index: number) => void;\n selectRowOnContextMenu?: boolean;\n renderRowAs?: JSXElementConstructor<RowElementProps<T>>;\n tableBody?: ReactElement<TableBodyProps>;\n hideBorder?: boolean;\n closeOnInteractOutside?: boolean;\n collapseOnMobile?: boolean;\n cellHeight?: string;\n headerCellHeight?: string;\n}\nexport function Table<T extends TableDataItem>({\n className,\n columns: userColumns,\n collapseOnMobile = true,\n hideHeaderRow = false,\n hideBorder = false,\n data,\n selectedRows: propsSelectedRows,\n defaultSelectedRows: propsDefaultSelectedRows,\n onSelectionChange: propsOnSelectionChange,\n sortDescriptor: propsSortDescriptor,\n onSortChange: propsOnSortChange,\n enableSorting = true,\n onDelete,\n enableSelection = true,\n selectionStyle = 'checkbox',\n ariaLabelledBy,\n selectRowOnContextMenu,\n onAction,\n renderRowAs,\n tableBody,\n meta,\n tableRef: propsTableRef,\n closeOnInteractOutside = false,\n cellHeight,\n headerCellHeight,\n ...domProps\n}: TableProps<T>) {\n const isMobile = useIsMobileMediaQuery();\n const isCollapsedMode = !!isMobile && collapseOnMobile;\n if (isCollapsedMode) {\n hideHeaderRow = true;\n hideBorder = true;\n }\n\n const [selectedRows, onSelectionChange] = useControlledState(\n propsSelectedRows,\n propsDefaultSelectedRows || [],\n propsOnSelectionChange,\n );\n\n const [sortDescriptor, onSortChange] = useControlledState(\n propsSortDescriptor,\n undefined,\n propsOnSortChange,\n );\n\n const toggleRow = useCallback(\n (item: TableDataItem) => {\n const newValues = [...selectedRows];\n if (!newValues.includes(item.id)) {\n newValues.push(item.id);\n } else {\n const index = newValues.indexOf(item.id);\n newValues.splice(index, 1);\n }\n onSelectionChange(newValues);\n },\n [selectedRows, onSelectionChange],\n );\n\n const selectRow = useCallback(\n // allow deselecting all rows by passing in null\n (item: TableDataItem | null, merge?: boolean) => {\n let newValues: (string | number)[] = [];\n if (item) {\n newValues = merge\n ? [...selectedRows?.filter(id => id !== item.id), item.id]\n : [item.id];\n }\n onSelectionChange(newValues);\n },\n [selectedRows, onSelectionChange],\n );\n\n // add checkbox columns to config, if selection is enabled\n const columns = useMemo(() => {\n const filteredColumns = userColumns.filter(c => {\n const visibleInMode = c.visibleInMode || 'regular';\n if (visibleInMode === 'all') {\n return true;\n }\n if (visibleInMode === 'compact' && isCollapsedMode) {\n return true;\n }\n if (visibleInMode === 'regular' && !isCollapsedMode) {\n return true;\n }\n });\n const showCheckboxCell =\n enableSelection && selectionStyle !== 'highlight' && !isMobile;\n if (showCheckboxCell) {\n filteredColumns.unshift(CheckboxColumnConfig);\n }\n return filteredColumns;\n }, [isMobile, userColumns, enableSelection, selectionStyle, isCollapsedMode]);\n\n const contextValue: TableContextValue<T> = {\n isCollapsedMode,\n cellHeight,\n headerCellHeight,\n hideBorder,\n hideHeaderRow,\n selectedRows,\n onSelectionChange,\n enableSorting,\n enableSelection,\n selectionStyle,\n data,\n columns,\n sortDescriptor,\n onSortChange,\n toggleRow,\n selectRow,\n onAction,\n selectRowOnContextMenu,\n meta,\n collapseOnMobile,\n };\n\n const navProps = useGridNavigation({\n cellCount: enableSelection ? columns.length + 1 : columns.length,\n rowCount: data.length + 1,\n });\n\n const tableBodyProps: TableBodyProps = {\n renderRowAs: renderRowAs as any,\n };\n\n if (!tableBody) {\n tableBody = <BasicTableBody {...tableBodyProps} />;\n } else {\n tableBody = cloneElement(tableBody, tableBodyProps);\n }\n\n // deselect rows when clicking outside the table\n const tableRef = useObjectRef(propsTableRef);\n useInteractOutside({\n ref: tableRef,\n onInteractOutside: e => {\n if (\n closeOnInteractOutside &&\n enableSelection &&\n selectedRows?.length &&\n // don't deselect if clicking on a dialog (for example is table row has a context menu)\n !(e.target as HTMLElement).closest('[role=\"dialog\"]')\n ) {\n onSelectionChange([]);\n }\n },\n });\n\n return (\n <TableContext.Provider value={contextValue as any}>\n <div\n {...mergeProps(domProps, navProps, {\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n if (selectedRows?.length) {\n onSelectionChange([]);\n }\n } else if (e.key === 'Delete') {\n e.preventDefault();\n e.stopPropagation();\n if (selectedRows?.length) {\n onDelete?.(\n data.filter(item => selectedRows?.includes(item.id)),\n );\n }\n } else if (isCtrlKeyPressed(e) && e.key === 'a') {\n e.preventDefault();\n e.stopPropagation();\n if (enableSelection) {\n onSelectionChange(data.map(item => item.id));\n }\n }\n },\n })}\n role=\"grid\"\n tabIndex={0}\n aria-rowcount={data.length + 1}\n aria-colcount={columns.length + 1}\n ref={tableRef}\n aria-multiselectable={enableSelection ? true : undefined}\n aria-labelledby={ariaLabelledBy}\n className={clsx(\n className,\n 'isolate select-none text-sm outline-none focus-visible:ring-2',\n )}\n >\n {!hideHeaderRow && <TableHeaderRow />}\n {tableBody}\n </div>\n </TableContext.Provider>\n );\n}\n\nexport interface TableBodyProps {\n renderRowAs?: TableProps<TableDataItem>['renderRowAs'];\n}\nfunction BasicTableBody({renderRowAs}: TableBodyProps) {\n const {data} = useContext(TableContext);\n return (\n <Fragment>\n {data.map((item, rowIndex) => (\n <TableRow\n item={item}\n index={rowIndex}\n key={item.id}\n renderAs={renderRowAs}\n />\n ))}\n </Fragment>\n );\n}\n","import {BackendResponse} from './backend-response';\n\nexport interface LengthAwarePaginationResponse<T = unknown> {\n data: T[];\n from: number;\n to: number;\n total: number;\n per_page: number;\n current_page: number;\n last_page: number;\n next_page?: number;\n prev_page?: number;\n}\n\nexport interface SimplePaginationResponse<T = unknown> {\n data: T[];\n from: number;\n to: number;\n per_page: number;\n current_page: number;\n next_page?: number | null;\n prev_page?: number | null;\n}\n\ninterface CursorPaginationResponse<T> {\n data: T[];\n next_cursor: string | null;\n per_page: number;\n prev_cursor: string | null;\n}\n\nexport type PaginationResponse<T> =\n | LengthAwarePaginationResponse<T>\n | SimplePaginationResponse<T>\n | CursorPaginationResponse<T>;\n\nexport const EMPTY_PAGINATION_RESPONSE = {\n pagination: {data: [], from: 0, to: 0, per_page: 15, current_page: 1},\n};\n\nexport interface PaginatedBackendResponse<T> extends BackendResponse {\n pagination: PaginationResponse<T>;\n}\n\nexport function hasPreviousPage(\n pagination: PaginationResponse<unknown>,\n): boolean {\n if ('prev_cursor' in pagination) {\n return pagination.prev_cursor != null;\n }\n\n if ('prev_page' in pagination) {\n return pagination.prev_page != null;\n }\n\n return pagination.current_page > 1;\n}\n\nexport function hasNextPage(pagination: PaginationResponse<unknown>): boolean {\n if ('next_cursor' in pagination) {\n return pagination.next_cursor != null;\n }\n\n if ('last_page' in pagination) {\n return pagination.current_page < pagination.last_page;\n }\n\n if ('next_page' in pagination) {\n return pagination.next_page != null;\n }\n\n return (\n pagination.data.length > 0 && pagination.data.length >= pagination.per_page\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FilterAltIcon = createSvgIcon(\n <path d=\"M7 6h10l-5.01 6.3L7 6zm-2.75-.39C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39c.51-.66.04-1.61-.79-1.61H5.04c-.83 0-1.3.95-.79 1.61z\" />\n, 'FilterAltOutlined');\n","export const AccordionAnimation = {\n variants: {\n open: {\n height: 'auto',\n visibility: 'visible',\n transitionEnd: {\n overflow: 'auto',\n },\n },\n closed: {\n height: 0,\n overflow: 'hidden',\n transitionEnd: {\n visibility: 'hidden',\n },\n },\n },\n transition: {type: 'tween', duration: 0.2},\n} as const;\n","import React, {\n cloneElement,\n isValidElement,\n ReactElement,\n ReactNode,\n useId,\n useRef,\n} from 'react';\nimport clsx from 'clsx';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {useControlledState} from '@react-stately/utils';\nimport {FocusScope, useFocusManager} from '@react-aria/focus';\nimport {AccordionAnimation} from '@common/ui/accordion/accordtion-animation';\nimport {ArrowDropDownIcon} from '@common/icons/material/ArrowDropDown';\n\ntype Props = {\n variant?: 'outline' | 'default' | 'minimal';\n children?: ReactNode;\n mode?: 'single' | 'multiple';\n expandedValues?: (string | number)[];\n defaultExpandedValues?: (string | number)[];\n onExpandedChange?: (key: (string | number)[]) => void;\n className?: string;\n isLazy?: boolean;\n};\nexport const Accordion = React.forwardRef<HTMLDivElement, Props>(\n (\n {\n variant = 'default',\n mode = 'single',\n children,\n className,\n isLazy,\n ...other\n },\n ref,\n ) => {\n const [expandedValues, setExpandedValues] = useControlledState(\n other.expandedValues,\n other.defaultExpandedValues || [],\n other.onExpandedChange,\n );\n\n const itemsCount = React.Children.count(children);\n\n return (\n <div\n className={clsx(variant === 'outline' && 'space-y-10', className)}\n ref={ref}\n role=\"presentation\"\n >\n <AnimatePresence>\n <FocusScope>\n {React.Children.map(children, (child, index) => {\n if (!isValidElement<AccordionItemProps>(child)) return null;\n return cloneElement<AccordionItemProps>(child, {\n key: child.key || index,\n value: child.props.value || index,\n isFirst: index === 0,\n isLast: index === itemsCount - 1,\n mode,\n variant,\n expandedValues,\n setExpandedValues,\n isLazy,\n });\n })}\n </FocusScope>\n </AnimatePresence>\n </div>\n );\n },\n);\n\ninterface AccordionItemProps {\n children: ReactNode;\n disabled?: boolean;\n label: ReactNode;\n description?: ReactNode;\n value?: string | number;\n isFirst?: boolean;\n isLast?: boolean;\n bodyClassName?: string;\n labelClassName?: string;\n buttonPadding?: string;\n chevronPosition?: 'left' | 'right';\n startIcon?: ReactElement;\n endAppend?: ReactElement;\n variant?: 'outline' | 'default' | 'minimal';\n expandedValues?: (string | number)[];\n setExpandedValues?: (keys: (string | number)[]) => void;\n mode?: 'single' | 'multiple';\n footerContent?: ReactNode;\n isLazy?: boolean;\n onHeaderMouseEnter?: () => void;\n onHeaderMouseLeave?: () => void;\n}\nexport function AccordionItem(props: AccordionItemProps) {\n const {\n children,\n label,\n disabled,\n bodyClassName,\n labelClassName,\n buttonPadding = 'py-10 pl-14 pr-10',\n startIcon,\n description,\n endAppend,\n chevronPosition = 'right',\n isFirst,\n mode,\n isLazy,\n variant,\n footerContent,\n onHeaderMouseEnter,\n onHeaderMouseLeave,\n } = props;\n const expandedValues = props.expandedValues || [];\n const value = props.value || 0;\n const setExpandedValues = props.setExpandedValues || (() => {});\n const ref = useRef<HTMLButtonElement>(null);\n const isExpanded = !disabled && expandedValues!.includes(value!);\n const wasExpandedOnce = useRef(false);\n if (isExpanded) {\n wasExpandedOnce.current = true;\n }\n const focusManager = useFocusManager();\n const id = useId();\n const buttonId = `${id}-button`;\n const panelId = `${id}-panel`;\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (e.key) {\n case 'ArrowDown':\n focusManager?.focusNext();\n break;\n case 'ArrowUp':\n focusManager?.focusPrevious();\n break;\n case 'Home':\n focusManager?.focusFirst();\n break;\n case 'End':\n focusManager?.focusLast();\n break;\n }\n };\n\n const toggle = () => {\n const i = expandedValues.indexOf(value);\n if (i > -1) {\n const newKeys = [...expandedValues];\n newKeys.splice(i, 1);\n setExpandedValues(newKeys);\n } else if (mode === 'single') {\n setExpandedValues([value]);\n } else {\n setExpandedValues([...expandedValues, value]);\n }\n };\n\n const chevron = (\n <div className={clsx(variant === 'minimal' && '')}>\n <ArrowDropDownIcon\n aria-hidden=\"true\"\n size=\"md\"\n className={clsx(\n disabled ? 'text-disabled' : 'text-muted',\n isExpanded && 'rotate-180 transition-transform',\n )}\n />\n </div>\n );\n\n return (\n <div\n className={clsx(\n variant === 'default' && 'border-b',\n variant === 'outline' && 'rounded-panel border',\n disabled && 'text-disabled',\n )}\n >\n <h3\n className={clsx(\n 'flex w-full items-center justify-between text-sm',\n disabled && 'pointer-events-none',\n isFirst && variant === 'default' && 'border-t',\n isExpanded && variant !== 'minimal'\n ? 'border-b'\n : 'border-b border-b-transparent',\n variant === 'outline'\n ? isExpanded\n ? 'rounded-panel-t'\n : 'rounded-panel'\n : undefined,\n )}\n onMouseEnter={onHeaderMouseEnter}\n onMouseLeave={onHeaderMouseLeave}\n >\n <button\n disabled={disabled}\n aria-expanded={isExpanded}\n id={buttonId}\n aria-controls={panelId}\n type=\"button\"\n ref={ref}\n onKeyDown={onKeyDown}\n onClick={() => {\n if (!disabled) {\n toggle();\n }\n }}\n className={clsx(\n 'flex flex-auto items-center gap-10 text-left outline-none hover:bg-hover focus-visible:bg-primary/focus',\n buttonPadding,\n )}\n >\n {chevronPosition === 'left' && chevron}\n {startIcon &&\n cloneElement(startIcon, {\n size: 'md',\n className: clsx(\n startIcon.props.className,\n disabled ? 'text-disabled' : 'text-muted',\n ),\n })}\n <div className=\"flex-auto overflow-hidden overflow-ellipsis\">\n <div className={labelClassName} data-testid=\"accordion-label\">\n {label}\n </div>\n {description && (\n <div className=\"text-xs text-muted\">{description}</div>\n )}\n </div>\n {chevronPosition === 'right' && chevron}\n </button>\n {endAppend && (\n <div className=\"flex-shrink-0 px-4 text-sm text-muted\">\n {endAppend}\n </div>\n )}\n </h3>\n <m.div\n aria-labelledby={id}\n role=\"region\"\n variants={AccordionAnimation.variants}\n transition={AccordionAnimation.transition}\n initial={false}\n animate={isExpanded ? 'open' : 'closed'}\n >\n <div className={clsx('p-16', bodyClassName)}>\n {!isLazy || wasExpandedOnce ? children : null}\n </div>\n {footerContent}\n </m.div>\n </div>\n );\n}\n","import {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Trans} from '@common/i18n/trans';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {FilterSelectControl} from '@common/datatable/filters/backend-filter';\n\nexport function SelectFilterPanel({\n filter,\n}: FilterPanelProps<FilterSelectControl>) {\n const {trans} = useTrans();\n\n return (\n <FormSelect\n size=\"sm\"\n name={`${filter.key}.value`}\n selectionMode=\"single\"\n showSearchField={filter.control.showSearchField}\n placeholder={\n filter.control.placeholder\n ? trans(filter.control.placeholder)\n : undefined\n }\n searchPlaceholder={\n filter.control.searchPlaceholder\n ? trans(filter.control.searchPlaceholder)\n : undefined\n }\n >\n {filter.control.options.map(option => (\n <Item key={option.key} value={option.key}>\n <Trans {...option.label} />\n </Item>\n ))}\n </FormSelect>\n );\n}\n","import {FormDateRangePicker} from '@common/ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {DatePickerFilterControl} from '@common/datatable/filters/backend-filter';\n\nexport function DateRangeFilterPanel({\n filter,\n}: FilterPanelProps<DatePickerFilterControl>) {\n return (\n <FormDateRangePicker\n min={filter.control.min}\n max={filter.control.max}\n size=\"sm\"\n name={`${filter.key}.value`}\n granularity=\"day\"\n closeDialogOnSelection={true}\n />\n );\n}\n","import clsx from 'clsx';\nimport React, {\n ComponentProps,\n ComponentPropsWithoutRef,\n forwardRef,\n} from 'react';\nimport {Link} from 'react-router-dom';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {AvatarPlaceholderIcon} from '@common/auth/ui/account-settings/avatar/avatar-placeholder-icon';\n\ntype Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | string;\n\nexport interface AvatarProps extends ComponentPropsWithoutRef<any> {\n className?: string;\n src?: string;\n label?: string;\n circle?: boolean;\n size?: Size;\n link?: string;\n fallback?: 'initials' | 'generic';\n lazy?: boolean;\n}\nexport const Avatar = forwardRef<HTMLImageElement, AvatarProps>(\n (\n {\n className,\n circle,\n size = 'md',\n src,\n link,\n label,\n fallback = 'generic',\n lazy = true,\n ...domProps\n },\n ref,\n ) => {\n let renderedAvatar = src ? (\n <img\n ref={ref}\n src={src}\n alt={label}\n loading={lazy ? 'lazy' : undefined}\n className=\"block h-full w-full object-cover\"\n />\n ) : (\n <div className=\"h-full w-full bg-alt dark:bg-chip\">\n <AvatarPlaceholderIcon\n viewBox=\"0 0 48 48\"\n className=\"h-full w-full text-muted\"\n />\n </div>\n );\n\n if (label) {\n renderedAvatar = <Tooltip label={label}>{renderedAvatar}</Tooltip>;\n }\n\n const wrapperProps: ComponentProps<any> = {\n ...domProps,\n className: clsx(\n className,\n 'relative block overflow-hidden select-none flex-shrink-0',\n getSizeClassName(size),\n circle ? 'rounded-full' : 'rounded',\n ),\n };\n\n return link ? (\n <Link {...wrapperProps} to={link}>\n {renderedAvatar}\n </Link>\n ) : (\n <div {...wrapperProps}>{renderedAvatar}</div>\n );\n },\n);\n\nfunction getSizeClassName(size: Size) {\n switch (size) {\n case 'xs':\n return 'w-18 h-18';\n case 'sm':\n return 'w-24 h-24';\n case 'md':\n return 'w-32 h-32';\n case 'lg':\n return 'w-40 h-40';\n case 'xl':\n return 'w-60 h-60';\n // allow overriding with custom classNames\n default:\n return size;\n }\n}\n","import {\n keepPreviousData,\n useQuery,\n UseQueryOptions,\n} from '@tanstack/react-query';\nimport {NormalizedModel} from '../../datatable/filters/normalized-model';\nimport {apiClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\n\ninterface Response extends BackendResponse {\n results: NormalizedModel[];\n}\n\ninterface Params {\n query?: string;\n perPage?: number;\n with?: string;\n}\n\nexport function useNormalizedModels(\n endpoint: string,\n queryParams: Params,\n queryOptions?: Omit<\n UseQueryOptions<Response, unknown, Response, [string, Params]>,\n 'queryKey' | 'queryFn'\n > | null,\n) {\n return useQuery({\n queryKey: [endpoint, queryParams],\n queryFn: () => fetchModels(endpoint, queryParams),\n placeholderData: keepPreviousData,\n ...queryOptions,\n });\n}\n\nasync function fetchModels(endpoint: string, params: Params) {\n return apiClient.get<Response>(endpoint, {params}).then(r => r.data);\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {NormalizedModel} from '../../datatable/filters/normalized-model';\nimport {apiClient} from '../../http/query-client';\nimport {BackendResponse} from '../../http/backend-response/backend-response';\n\ninterface Response extends BackendResponse {\n model: NormalizedModel;\n}\n\nexport function useNormalizedModel(\n endpoint: string,\n queryParams?: Record<string, string>,\n queryOptions?: {enabled?: boolean},\n) {\n return useQuery({\n queryKey: [endpoint, queryParams],\n queryFn: () => fetchModel(endpoint, queryParams),\n ...queryOptions,\n });\n}\n\nasync function fetchModel(\n endpoint: string,\n params?: Record<string, string>,\n): Promise<Response> {\n return apiClient.get(endpoint, {params}).then(r => r.data);\n}\n","import React, {ReactNode, useRef, useState} from 'react';\nimport {useTrans} from '../../i18n/use-trans';\nimport {Trans} from '../../i18n/trans';\nimport {Avatar} from '../images/avatar';\nimport {Tooltip} from '../tooltip/tooltip';\nimport {IconButton} from '../buttons/icon-button';\nimport {EditIcon} from '../../icons/material/Edit';\nimport {message} from '../../i18n/message';\nimport {Item} from './listbox/item';\nimport {useController, useFormContext} from 'react-hook-form';\nimport {useControlledState} from '@react-stately/utils';\nimport {getInputFieldClassNames} from './input-field/get-input-field-class-names';\nimport clsx from 'clsx';\nimport {Skeleton} from '../skeleton/skeleton';\nimport {useNormalizedModels} from '../../users/queries/use-normalized-models';\nimport {useNormalizedModel} from '../../users/queries/use-normalized-model';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '../animation/opacity-animation';\nimport {Select} from '@common/ui/forms/select/select';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {BaseFieldProps} from '@common/ui/forms/input-field/base-field-props';\n\ninterface NormalizedModelFieldProps {\n label?: ReactNode;\n className?: string;\n background?: BaseFieldProps['background'];\n value?: string | number;\n placeholder?: MessageDescriptor;\n searchPlaceholder?: MessageDescriptor;\n defaultValue?: string | number;\n onChange?: (value: string | number) => void;\n invalid?: boolean;\n errorMessage?: string;\n description?: ReactNode;\n autoFocus?: boolean;\n queryParams?: Record<string, string>;\n endpoint: string;\n disabled?: boolean;\n required?: boolean;\n}\nexport function NormalizedModelField({\n label,\n className,\n background,\n value,\n defaultValue = '',\n placeholder = message('Select item...'),\n searchPlaceholder = message('Find an item...'),\n onChange,\n description,\n errorMessage,\n invalid,\n autoFocus,\n queryParams,\n endpoint,\n disabled,\n required,\n}: NormalizedModelFieldProps) {\n const inputRef = useRef<HTMLButtonElement>(null);\n const [inputValue, setInputValue] = useState('');\n const [selectedValue, setSelectedValue] = useControlledState(\n value,\n defaultValue,\n onChange,\n );\n const query = useNormalizedModels(endpoint, {\n query: inputValue,\n ...queryParams,\n });\n const {trans} = useTrans();\n\n const fieldClassNames = getInputFieldClassNames({size: 'md'});\n\n if (selectedValue) {\n return (\n <div className={className}>\n <div className={fieldClassNames.label}>{label}</div>\n <div\n className={clsx(\n 'rounded-input border p-8',\n background,\n invalid && 'border-danger',\n )}\n >\n <AnimatePresence initial={false} mode=\"wait\">\n <SelectedModelPreview\n disabled={disabled}\n endpoint={endpoint}\n modelId={selectedValue}\n queryParams={queryParams}\n onEditClick={() => {\n setSelectedValue('');\n setInputValue('');\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n inputRef.current?.click();\n });\n }}\n />\n </AnimatePresence>\n </div>\n {description && !errorMessage && (\n <div className={fieldClassNames.description}>{description}</div>\n )}\n {errorMessage && (\n <div className={fieldClassNames.error}>{errorMessage}</div>\n )}\n </div>\n );\n }\n\n return (\n <Select\n className={className}\n showSearchField\n invalid={invalid}\n errorMessage={errorMessage}\n description={description}\n color=\"white\"\n isAsync\n background={background}\n placeholder={trans(placeholder)}\n searchPlaceholder={trans(searchPlaceholder)}\n label={label}\n isLoading={query.isFetching}\n items={query.data?.results}\n inputValue={inputValue}\n onInputValueChange={setInputValue}\n selectionMode=\"single\"\n selectedValue={selectedValue}\n onSelectionChange={setSelectedValue}\n ref={inputRef}\n autoFocus={autoFocus}\n disabled={disabled}\n required={required}\n >\n {model => (\n <Item\n value={model.id}\n key={model.id}\n description={model.description}\n startIcon={<Avatar src={model.image} />}\n >\n {model.name}\n </Item>\n )}\n </Select>\n );\n}\n\ninterface SelectedModelPreviewProps {\n modelId: string | number;\n selectedValue?: number | string;\n onEditClick?: () => void;\n endpoint?: string;\n disabled?: boolean;\n queryParams?: NormalizedModelFieldProps['queryParams'];\n}\nfunction SelectedModelPreview({\n modelId,\n onEditClick,\n endpoint,\n disabled,\n queryParams,\n}: SelectedModelPreviewProps) {\n const {data, isLoading} = useNormalizedModel(\n `${endpoint}/${modelId}`,\n queryParams,\n );\n\n if (isLoading || !data?.model) {\n return <LoadingSkeleton key=\"skeleton\" />;\n }\n\n return (\n <m.div\n className={clsx(\n 'flex items-center gap-10',\n disabled && 'pointer-events-none cursor-not-allowed text-disabled',\n )}\n key=\"preview\"\n {...opacityAnimation}\n >\n {data.model.image && <Avatar src={data.model.image} />}\n <div>\n <div className=\"text-sm leading-4\">{data.model.name}</div>\n <div className=\"text-xs text-muted\">{data.model.description}</div>\n </div>\n <Tooltip label={<Trans message=\"Change item\" />}>\n <IconButton\n className=\"ml-auto text-muted\"\n size=\"sm\"\n onClick={onEditClick}\n disabled={disabled}\n >\n <EditIcon />\n </IconButton>\n </Tooltip>\n </m.div>\n );\n}\n\nfunction LoadingSkeleton() {\n return (\n <m.div className=\"flex items-center gap-10\" {...opacityAnimation}>\n <Skeleton variant=\"rect\" size=\"w-32 h-32\" />\n <div className=\"max-h-[36px] flex-auto\">\n <Skeleton className=\"text-xs\" />\n <Skeleton className=\"max-h-8 text-xs\" />\n </div>\n <Skeleton variant=\"icon\" size=\"w-24 h-24\" />\n </m.div>\n );\n}\n\ninterface FormNormalizedModelFieldProps extends NormalizedModelFieldProps {\n name: string;\n}\nexport function FormNormalizedModelField({\n name,\n ...fieldProps\n}: FormNormalizedModelFieldProps) {\n const {clearErrors} = useFormContext();\n const {\n field: {onChange, value = ''},\n fieldState: {invalid, error},\n } = useController({\n name,\n });\n\n return (\n <NormalizedModelField\n value={value}\n onChange={value => {\n onChange(value);\n clearErrors(name);\n }}\n invalid={invalid}\n errorMessage={error?.message}\n {...fieldProps}\n />\n );\n}\n","import {FilterPanelProps} from './filter-panel-props';\nimport {FormNormalizedModelField} from '@common/ui/forms/normalized-model-field';\nimport {FilterSelectModelControl} from '@common/datatable/filters/backend-filter';\n\nexport function NormalizedModelFilterPanel({\n filter,\n}: FilterPanelProps<FilterSelectModelControl>) {\n return (\n <FormNormalizedModelField\n name={`${filter.key}.value`}\n endpoint={`normalized-models/${filter.control.model}`}\n />\n );\n}\n","import {FilterOperator} from './backend-filter';\nimport {message} from '../../i18n/message';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\n\nexport const FilterOperatorNames: {[op in FilterOperator]: MessageDescriptor} =\n {\n '=': message('is'),\n '!=': message('is not'),\n '>': message('is greater than'),\n '>=': message('is greater than or equal to'),\n '<': message('is less than'),\n '<=': message('is less than or equal to'),\n has: message('Include'),\n doesntHave: message('Do not include'),\n between: message('Is between'),\n hasAll: message('Include all'),\n };\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {FormSelect} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {FilterOperatorNames} from '@common/datatable/filters/filter-operator-names';\nimport {Fragment} from 'react';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {\n FilterNumberInputControl,\n FilterTextInputControl,\n} from '@common/datatable/filters/backend-filter';\n\nexport function InputFilterPanel({\n filter,\n}: FilterPanelProps<FilterTextInputControl | FilterNumberInputControl>) {\n const control = filter.control;\n return (\n <Fragment>\n <FormSelect\n selectionMode=\"single\"\n name={`${filter.key}.operator`}\n className=\"mb-14\"\n size=\"sm\"\n required\n >\n {filter.operators?.map(operator => (\n <Item key={operator} value={operator}>\n {<Trans {...FilterOperatorNames[operator]} />}\n </Item>\n ))}\n </FormSelect>\n <FormTextField\n size=\"sm\"\n name={`${filter.key}.value`}\n type={filter.control.inputType}\n min={'minValue' in control ? control.minValue : undefined}\n max={'maxValue' in control ? control.maxValue : undefined}\n minLength={'minLength' in control ? control.minLength : undefined}\n maxLength={'maxLength' in control ? control.maxLength : undefined}\n required\n />\n </Fragment>\n );\n}\n","import {FilterPanelProps} from './filter-panel-props';\nimport {FilterBooleanToggleControl} from '@common/datatable/filters/backend-filter';\n\nexport function BooleanFilterPanel({\n filter,\n}: FilterPanelProps<FilterBooleanToggleControl>) {\n // Toggling accordion in the dialog will already apply boolean filter, no need for any extra fields here\n return null;\n}\n","import React, {\n Children,\n cloneElement,\n isValidElement,\n ReactElement,\n} from 'react';\nimport clsx from 'clsx';\nimport type {ChipProps} from './chip';\n\nexport interface ChipListProps {\n className?: string;\n children?: ReactElement | ReactElement[];\n size?: ChipProps['size'];\n radius?: ChipProps['radius'];\n color?: ChipProps['color'];\n selectable?: ChipProps['selectable'];\n wrap?: boolean;\n}\nexport function ChipList({\n className,\n children,\n size,\n color,\n radius,\n selectable,\n wrap = true,\n}: ChipListProps) {\n return (\n <div\n className={clsx(\n 'flex items-center gap-8',\n wrap && 'flex-wrap',\n className,\n )}\n >\n {Children.map(children, chip => {\n if (isValidElement<ChipProps>(chip)) {\n return cloneElement<ChipProps>(chip, {\n size,\n color,\n selectable,\n radius,\n });\n }\n })}\n </div>\n );\n}\n","import {ChipValue} from './chip-field';\n\nexport function stringToChipValue(value: string | number): ChipValue {\n // add both name and description so \"validateWith\" works properly in chip field, if it depends on description\n return {id: value, name: `${value}`, description: `${value}`};\n}\n","import React, {\n HTMLAttributes,\n Key,\n ReactElement,\n ReactNode,\n Ref,\n RefObject,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {useFocusManager} from '@react-aria/focus';\nimport clsx from 'clsx';\nimport {mergeProps, useLayoutEffect, useObjectRef} from '@react-aria/utils';\nimport {useControlledState} from '@react-stately/utils';\nimport {ChipList} from './chip-list';\nimport {Field, FieldProps} from '../field';\nimport {Input} from '../input';\nimport {Chip, ChipProps} from './chip';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {getInputFieldClassNames} from '../get-input-field-class-names';\nimport {ProgressCircle} from '../../../progress/progress-circle';\nimport {useField} from '../use-field';\nimport {Avatar} from '../../../images/avatar';\nimport {Listbox} from '../../listbox/listbox';\nimport {useListbox} from '../../listbox/use-listbox';\nimport {BaseFieldPropsWithDom} from '../base-field-props';\nimport {useListboxKeyboardNavigation} from '../../listbox/use-listbox-keyboard-navigation';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {ListBoxChildren, ListboxProps} from '../../listbox/types';\nimport {stringToChipValue} from './string-to-chip-value';\nimport {Popover} from '../../../overlays/popover';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\n\nexport interface ChipValue extends Omit<NormalizedModel, 'model_type'> {\n invalid?: boolean;\n errorMessage?: string;\n}\n\nexport type ChipFieldProps<T> = Omit<\n ListboxProps,\n 'selectionMode' | 'displayWith'\n> &\n Omit<\n BaseFieldPropsWithDom<HTMLInputElement>,\n 'value' | 'onChange' | 'defaultValue'\n > & {\n value?: (ChipValue | string)[];\n defaultValue?: (ChipValue | string)[];\n displayWith?: (value: ChipValue) => ReactNode;\n validateWith?: (value: ChipValue) => ChipValue;\n allowCustomValue?: boolean;\n showDropdownArrow?: boolean;\n onChange?: (value: ChipValue[]) => void;\n suggestions?: T[];\n children?: ListBoxChildren<T>['children'];\n placeholder?: string;\n chipSize?: ChipProps['size'];\n openMenuOnFocus?: boolean;\n valueKey?: 'id' | 'name';\n onChipClick?: (value: ChipValue) => void;\n };\n\nfunction ChipFieldInner<T>(\n props: ChipFieldProps<T>,\n ref: Ref<HTMLInputElement>,\n) {\n const fieldRef = useRef<HTMLDivElement>(null);\n const inputRef = useObjectRef(ref);\n const {\n displayWith = v => v.name,\n validateWith,\n children,\n suggestions,\n isLoading,\n inputValue,\n onInputValueChange,\n onItemSelected,\n placeholder,\n onOpenChange,\n chipSize = 'sm',\n openMenuOnFocus = true,\n showEmptyMessage,\n value: propsValue,\n defaultValue,\n onChange: propsOnChange,\n valueKey,\n isAsync,\n allowCustomValue = true,\n showDropdownArrow,\n onChipClick,\n ...inputFieldProps\n } = props;\n const fieldClassNames = getInputFieldClassNames({\n ...props,\n flexibleHeight: true,\n });\n\n const [value, onChange] = useChipFieldValueState(props);\n\n const [listboxIsOpen, setListboxIsOpen] = useState(false);\n\n const loadingIndicator = (\n <ProgressCircle isIndeterminate size=\"sm\" aria-label=\"loading...\" />\n );\n\n const dropdownArrow = showDropdownArrow ? <KeyboardArrowDownIcon /> : null;\n\n const {fieldProps, inputProps} = useField({\n ...inputFieldProps,\n focusRef: inputRef,\n endAdornment: isLoading && listboxIsOpen ? loadingIndicator : dropdownArrow,\n });\n\n return (\n <Field fieldClassNames={fieldClassNames} {...fieldProps}>\n <Input\n ref={fieldRef}\n className={clsx('flex flex-wrap items-center', fieldClassNames.input)}\n onClick={() => {\n // refocus input when clicking outside it, but while still inside chip field\n inputRef.current?.focus();\n }}\n >\n <ListWrapper\n displayChipUsing={displayWith}\n onChipClick={onChipClick}\n items={value}\n setItems={onChange}\n chipSize={chipSize}\n />\n <ChipInput\n size={props.size}\n showEmptyMessage={showEmptyMessage}\n inputProps={inputProps}\n inputValue={inputValue}\n onInputValueChange={onInputValueChange}\n fieldRef={fieldRef}\n inputRef={inputRef}\n chips={value}\n setChips={onChange}\n validateWith={validateWith}\n isLoading={isLoading}\n suggestions={suggestions}\n placeholder={placeholder}\n openMenuOnFocus={openMenuOnFocus}\n listboxIsOpen={listboxIsOpen}\n setListboxIsOpen={setListboxIsOpen}\n allowCustomValue={allowCustomValue}\n >\n {children}\n </ChipInput>\n </Input>\n </Field>\n );\n}\n\ninterface ListWrapperProps {\n items: ChipValue[];\n setItems: (items: ChipValue[]) => void;\n displayChipUsing: (value: ChipValue) => ReactNode;\n chipSize?: ChipProps['size'];\n onChipClick?: (value: ChipValue) => void;\n}\nfunction ListWrapper({\n items,\n setItems,\n displayChipUsing,\n chipSize,\n onChipClick,\n}: ListWrapperProps) {\n const manager = useFocusManager();\n const removeItem = useCallback(\n (key: Key) => {\n const i = items.findIndex(cr => cr.id === key);\n const newItems = [...items];\n if (i > -1) {\n newItems.splice(i, 1);\n setItems(newItems);\n }\n return newItems;\n },\n [items, setItems],\n );\n\n return (\n <ChipList\n className={clsx(\n 'max-w-full flex-shrink-0 flex-wrap',\n chipSize === 'xs' ? 'my-6' : 'my-8',\n )}\n size={chipSize}\n selectable\n >\n {items.map(item => (\n <Chip\n key={item.id}\n errorMessage={item.errorMessage}\n adornment={item.image ? <Avatar circle src={item.image} /> : null}\n onClick={() => onChipClick?.(item)}\n onRemove={() => {\n const newItems = removeItem(item.id);\n if (newItems.length) {\n // focus previous chip\n manager?.focusPrevious({tabbable: true});\n } else {\n // focus input\n manager?.focusLast();\n }\n }}\n >\n {displayChipUsing(item)}\n </Chip>\n ))}\n </ChipList>\n );\n}\n\ninterface ChipInputProps<T> {\n showEmptyMessage?: boolean;\n inputProps: ReturnType<typeof useField>['inputProps'];\n inputValue?: string;\n onInputValueChange?: (value: string) => void;\n fieldRef: RefObject<HTMLDivElement>;\n inputRef: RefObject<HTMLInputElement>;\n chips: ChipValue[];\n setChips: (items: ChipValue[]) => void;\n validateWith?: (value: ChipValue) => ChipValue;\n isLoading?: boolean;\n suggestions?: T[];\n placeholder?: string;\n openMenuOnFocus?: boolean;\n listboxIsOpen: boolean;\n setListboxIsOpen: (value: boolean) => void;\n allowCustomValue: boolean;\n children: ListBoxChildren<T>['children'];\n size: FieldProps['size'];\n}\nfunction ChipInput<T>(props: ChipInputProps<T>) {\n const {\n inputRef,\n fieldRef,\n validateWith,\n setChips,\n chips,\n suggestions,\n inputProps,\n placeholder,\n openMenuOnFocus,\n listboxIsOpen,\n setListboxIsOpen,\n allowCustomValue,\n isLoading,\n size,\n } = props;\n const manager = useFocusManager();\n\n const addItems = useCallback(\n (items?: ChipValue[]) => {\n items = (items || []).filter(item => {\n const invalid = !item || !item.id || !item.name;\n const alreadyExists = chips.findIndex(cr => cr.id === item?.id) > -1;\n return !alreadyExists && !invalid;\n });\n if (!items.length) return;\n\n if (validateWith) {\n items = items.map(item => validateWith(item));\n }\n setChips([...chips, ...items]);\n },\n [chips, setChips, validateWith],\n );\n\n const listbox = useListbox<T>({\n ...props,\n clearInputOnItemSelection: true,\n isOpen: listboxIsOpen,\n onOpenChange: setListboxIsOpen,\n items: suggestions,\n selectionMode: 'none',\n role: 'listbox',\n virtualFocus: true,\n onItemSelected: value => {\n handleItemSelection(value as string);\n },\n });\n\n const {\n state: {\n activeIndex,\n setActiveIndex,\n isOpen,\n setIsOpen,\n inputValue,\n setInputValue,\n },\n refs,\n listboxId,\n collection,\n onInputChange,\n } = listbox;\n\n const handleItemSelection = (textValue: string) => {\n const option =\n collection.size && activeIndex != null\n ? [...collection.values()][activeIndex]\n : null;\n if (option?.item) {\n addItems([option.item]);\n } else if (allowCustomValue) {\n addItems([stringToChipValue(option ? option.value : textValue)]);\n }\n\n setInputValue('');\n setActiveIndex(null);\n setIsOpen(false);\n };\n\n // position dropdown relative to whole chip field, not the input\n useLayoutEffect(() => {\n if (fieldRef.current && refs.reference.current !== fieldRef.current) {\n listbox.reference(fieldRef.current);\n }\n }, [fieldRef, listbox, refs]);\n\n const {handleTriggerKeyDown, handleListboxKeyboardNavigation} =\n useListboxKeyboardNavigation(listbox);\n\n const handleFocusAndClick = createEventHandler(() => {\n if (openMenuOnFocus && !isOpen) {\n setIsOpen(true);\n }\n });\n\n return (\n <Listbox\n listbox={listbox}\n mobileOverlay={Popover}\n isLoading={isLoading}\n onPointerDown={e => {\n // prevent focus from leaving input when scrolling listbox via mouse\n e.preventDefault();\n }}\n >\n <input\n type=\"text\"\n className={clsx(\n 'mx-8 my-4 min-w-30 flex-[1_1_60px] bg-transparent text-sm outline-none',\n size === 'xs' ? 'h-20' : 'h-30',\n )}\n placeholder={placeholder}\n {...mergeProps(inputProps, {\n ref: inputRef,\n value: inputValue,\n onChange: onInputChange,\n onPaste: e => {\n const paste = e.clipboardData.getData('text');\n const emails = paste.match(\n /([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\\.[a-zA-Z0-9._-]+)/gi,\n );\n if (emails) {\n e.preventDefault();\n const selection = window.getSelection();\n if (selection?.rangeCount) {\n selection.deleteFromDocument();\n addItems(emails.map(email => stringToChipValue(email)));\n }\n }\n },\n 'aria-autocomplete': 'list',\n 'aria-controls': isOpen ? listboxId : undefined,\n autoComplete: 'off',\n autoCorrect: 'off',\n spellCheck: 'false',\n onKeyDown: e => {\n const input = e.target as HTMLInputElement;\n\n if (e.key === 'Enter') {\n // prevent form submitting\n e.preventDefault();\n // add chip from selected listbox option or current input text value\n handleItemSelection(input.value);\n return;\n }\n\n // on escape, clear input and close dropdown\n if (e.key === 'Escape' && isOpen) {\n setIsOpen(false);\n setInputValue('');\n }\n\n // move focus to input when focus is on first item and prevent arrow up from cycling listbox\n if (\n e.key === 'ArrowUp' &&\n isOpen &&\n (activeIndex === 0 || activeIndex == null)\n ) {\n setActiveIndex(null);\n return;\n }\n\n // block left and right arrows from navigating in input, if focus is on listbox\n if (\n activeIndex != null &&\n (e.key === 'ArrowLeft' || e.key === 'ArrowRight')\n ) {\n e.preventDefault();\n return;\n }\n\n // move focus on the last chip, if focus is at the start of input\n if (\n (e.key === 'ArrowLeft' ||\n e.key === 'Backspace' ||\n e.key === 'Delete') &&\n input.selectionStart === 0 &&\n activeIndex == null &&\n chips.length\n ) {\n manager?.focusPrevious({tabbable: true});\n return;\n }\n\n // fallthrough to listbox navigation handlers for arrow keys\n const handled = handleTriggerKeyDown(e);\n if (!handled) {\n handleListboxKeyboardNavigation(e);\n }\n },\n onFocus: handleFocusAndClick,\n onClick: handleFocusAndClick,\n } as HTMLAttributes<HTMLInputElement>)}\n />\n </Listbox>\n );\n}\n\nfunction useChipFieldValueState({\n onChange,\n value,\n defaultValue,\n valueKey,\n}: ChipFieldProps<any>) {\n // convert value from string[] to ChipValue[], if needed\n const propsValue = useMemo(() => {\n return mixedValueToChipValue(value);\n }, [value]);\n\n // convert defaultValue from string[] to ChipValue[], if needed\n const propsDefaultValue = useMemo(() => {\n return mixedValueToChipValue(defaultValue);\n }, [defaultValue]);\n\n // emit string[] or ChipValue[] on change, based on \"valueKey\" prop\n const handleChange = useCallback(\n (value: ChipValue[]) => {\n const newValue = valueKey ? value.map(v => v[valueKey]) : value;\n onChange?.(newValue as any);\n },\n [onChange, valueKey],\n );\n\n return useControlledState<ChipValue[]>(\n !propsValue ? undefined : propsValue,\n propsDefaultValue || [],\n handleChange,\n );\n}\n\nfunction mixedValueToChipValue(\n value?: (string | number | ChipValue)[] | null,\n): ChipValue[] | undefined {\n if (value == null) {\n return undefined;\n }\n\n return value.map(v => {\n return typeof v !== 'object' ? stringToChipValue(v as string) : v;\n });\n}\n\nexport const ChipField = React.forwardRef(ChipFieldInner) as <T>(\n props: ChipFieldProps<T> & {ref?: Ref<HTMLInputElement>},\n) => ReactElement;\n","import {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport React from 'react';\nimport {ChipField, ChipFieldProps} from './chip-field';\n\nexport type FormChipFieldProps<T> = ChipFieldProps<T> & {\n name: string;\n};\n\nexport function FormChipField<T>({children, ...props}: FormChipFieldProps<T>) {\n const {\n field: {onChange, onBlur, value = [], ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<ChipFieldProps<T>> = {\n onChange,\n onBlur,\n value,\n invalid,\n errorMessage: error?.message,\n };\n\n return (\n <ChipField ref={ref} {...mergeProps(formProps, props)}>\n {children}\n </ChipField>\n );\n}\n","import {Item} from '@common/ui/forms/listbox/item';\nimport {FilterPanelProps} from '@common/datatable/filters/panels/filter-panel-props';\nimport {FormChipField} from '@common/ui/forms/input-field/chip-field/form-chip-field';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {FilterChipFieldControl} from '@common/datatable/filters/backend-filter';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ChipFieldFilterPanel({\n filter,\n}: FilterPanelProps<FilterChipFieldControl>) {\n const {trans} = useTrans();\n return (\n <FormChipField\n size=\"sm\"\n name={`${filter.key}.value`}\n valueKey=\"id\"\n allowCustomValue={false}\n showDropdownArrow\n placeholder={\n filter.control.placeholder\n ? trans(filter.control.placeholder)\n : undefined\n }\n displayWith={chip =>\n filter.control.options.find(o => o.key === chip.id)?.label.message\n }\n suggestions={filter.control.options.map(o => ({\n id: o.key,\n name: o.label.message,\n }))}\n >\n {chip => (\n <Item key={chip.id} value={chip.id}>\n {<Trans message={chip.name} />}\n </Item>\n )}\n </FormChipField>\n );\n}\n","import {Dialog} from '../../ui/overlays/dialog/dialog';\nimport {\n BackendFilter,\n CustomFilterControl,\n DatePickerFilterControl,\n FilterBooleanToggleControl,\n FilterChipFieldControl,\n FilterControlType,\n FilterOperator,\n FilterSelectControl,\n FilterSelectModelControl,\n FilterTextInputControl,\n} from './backend-filter';\nimport {Trans} from '../../i18n/trans';\nimport {useState} from 'react';\nimport {DialogHeader} from '../../ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '../../ui/overlays/dialog/dialog-body';\nimport {useBackendFilterUrlParams} from './backend-filter-url-params';\nimport {useDialogContext} from '../../ui/overlays/dialog/dialog-context';\nimport {Accordion, AccordionItem} from '../../ui/accordion/accordion';\nimport {Button} from '../../ui/buttons/button';\nimport {useForm} from 'react-hook-form';\nimport {Form} from '../../ui/forms/form';\nimport {Checkbox} from '../../ui/forms/toggle/checkbox';\nimport {SelectFilterPanel} from './panels/select-filter-panel';\nimport {DateRangeFilterPanel} from './panels/date-range-filter-panel';\nimport {NormalizedModelFilterPanel} from './panels/normalized-model-filter-panel';\nimport {InputFilterPanel} from './panels/input-filter-panel';\nimport {BooleanFilterPanel} from './panels/boolean-filter-panel';\nimport clsx from 'clsx';\nimport {ChipFieldFilterPanel} from '@common/datatable/filters/panels/chip-field-filter-panel';\n\nexport interface FilterItemFormValue<T = any> {\n value: T;\n operator?: FilterOperator;\n}\n\ninterface AddFilterDialogProps {\n filters: BackendFilter[];\n}\nexport function AddFilterDialog({filters}: AddFilterDialogProps) {\n const {decodedFilters} = useBackendFilterUrlParams(filters);\n const {formId} = useDialogContext();\n\n // expand currently active filters\n const [expandedFilters, setExpandedFilters] = useState<(string | number)[]>(\n () => {\n return decodedFilters.map(f => f.key);\n },\n );\n\n const clearButton = (\n <Button\n size=\"xs\"\n variant=\"outline\"\n className=\"mr-auto\"\n onClick={() => {\n setExpandedFilters([]);\n }}\n >\n <Trans message=\"Clear\" />\n </Button>\n );\n\n const applyButton = (\n <Button\n size=\"xs\"\n variant=\"flat\"\n color=\"primary\"\n className=\"ml-auto\"\n type=\"submit\"\n form={formId}\n >\n <Trans message=\"Apply\" />\n </Button>\n );\n\n return (\n <Dialog className=\"min-w-[300px]\" maxWidth=\"max-w-400\" size=\"auto\">\n <DialogHeader\n padding=\"px-14 py-10\"\n leftAdornment={clearButton}\n rightAdornment={applyButton}\n >\n <Trans message=\"Filter\" />\n </DialogHeader>\n <DialogBody padding=\"p-0\">\n <FilterList\n filters={filters}\n expandedFilters={expandedFilters}\n setExpandedFilters={setExpandedFilters}\n />\n </DialogBody>\n </Dialog>\n );\n}\n\ninterface FilterListProps {\n filters: BackendFilter[];\n expandedFilters: (string | number)[];\n setExpandedFilters: (value: (string | number)[]) => void;\n}\nfunction FilterList({\n filters,\n expandedFilters,\n setExpandedFilters,\n}: FilterListProps) {\n const {decodedFilters, replaceAll} = useBackendFilterUrlParams(filters);\n\n // either get value and operator from url params if filter is active, or get defaults from filter config\n const defaultValues: Record<string, FilterItemFormValue> = {};\n filters.forEach(filter => {\n const appliedFilter = decodedFilters.find(f => f.key === filter.key);\n defaultValues[filter.key] =\n appliedFilter?.value !== undefined\n ? // there might be some extra keys set on filter besides\n // \"value\" and \"operator\", so add the whole object to form\n appliedFilter\n : {\n value: filter.control.defaultValue,\n operator: filter.defaultOperator,\n };\n });\n const form = useForm<Record<string, FilterItemFormValue>>({defaultValues});\n const {formId, close} = useDialogContext();\n\n return (\n <Form\n form={form}\n id={formId}\n onSubmit={formValue => {\n const filterValue = Object.entries(formValue)\n // remove undefined and non-expanded filters, so \"clear\" button will correctly remove active filters\n .filter(\n ([key, fieldValue]) =>\n expandedFilters.includes(key) && fieldValue !== undefined,\n )\n .map(([key, fieldValue]) => ({\n key,\n ...fieldValue, // value and operator from form\n }));\n\n replaceAll(filterValue);\n close();\n }}\n >\n <Accordion\n mode=\"multiple\"\n expandedValues={expandedFilters}\n onExpandedChange={setExpandedFilters}\n >\n {filters.map(filter => (\n <AccordionItem\n startIcon={\n <Checkbox checked={expandedFilters.includes(filter.key)} />\n }\n key={filter.key}\n value={filter.key}\n label={<Trans {...filter.label} />}\n bodyClassName=\"max-h-288 overflow-y-auto compact-scrollbar\"\n >\n {filter.description && (\n <div\n className={clsx(\n 'text-xs text-muted',\n // boolean filter will have nothing in the panel, no need to add margin\n filter.control.type !== FilterControlType.BooleanToggle &&\n 'mb-14',\n )}\n >\n <Trans {...filter.description} />\n </div>\n )}\n <AddFilterDialogPanel filter={filter} />\n </AccordionItem>\n ))}\n </Accordion>\n </Form>\n );\n}\n\ninterface ActiveFilterPanelProps {\n filter: BackendFilter;\n}\nexport function AddFilterDialogPanel({filter}: ActiveFilterPanelProps) {\n switch (filter.control.type) {\n case FilterControlType.Select:\n return (\n <SelectFilterPanel\n filter={filter as BackendFilter<FilterSelectControl>}\n />\n );\n case FilterControlType.ChipField:\n return (\n <ChipFieldFilterPanel\n filter={filter as BackendFilter<FilterChipFieldControl>}\n />\n );\n case FilterControlType.DateRangePicker:\n return (\n <DateRangeFilterPanel\n filter={filter as BackendFilter<DatePickerFilterControl>}\n />\n );\n case FilterControlType.SelectModel:\n return (\n <NormalizedModelFilterPanel\n filter={filter as BackendFilter<FilterSelectModelControl>}\n />\n );\n case FilterControlType.Input:\n return (\n <InputFilterPanel\n filter={filter as BackendFilter<FilterTextInputControl>}\n />\n );\n case FilterControlType.BooleanToggle:\n return (\n <BooleanFilterPanel\n filter={filter as BackendFilter<FilterBooleanToggleControl>}\n />\n );\n case 'custom':\n const CustomComponent = filter.control.panel;\n return (\n <CustomComponent\n filter={filter as BackendFilter<CustomFilterControl>}\n />\n );\n default:\n return null;\n }\n}\n","import {Button, ButtonProps} from '../../ui/buttons/button';\nimport {BackendFilter} from './backend-filter';\nimport {FilterAltIcon} from '../../icons/material/FilterAlt';\nimport {Trans} from '../../i18n/trans';\nimport {useIsMobileMediaQuery} from '../../utils/hooks/is-mobile-media-query';\nimport {IconButton} from '../../ui/buttons/icon-button';\nimport {DialogTrigger} from '../../ui/overlays/dialog/dialog-trigger';\nimport {AddFilterDialog} from './add-filter-dialog';\nimport {ReactElement} from 'react';\n\ninterface AddFilterButtonProps {\n filters: BackendFilter[];\n icon?: ReactElement;\n color?: ButtonProps['color'];\n variant?: ButtonProps['variant'];\n disabled?: boolean;\n size?: ButtonProps['size'];\n className?: string;\n}\nexport function AddFilterButton({\n filters,\n icon = <FilterAltIcon />,\n color = 'primary',\n variant = 'outline',\n size = 'sm',\n disabled,\n className,\n}: AddFilterButtonProps) {\n const isMobile = useIsMobileMediaQuery();\n\n const desktopButton = (\n <Button\n variant={variant}\n color={color}\n startIcon={icon}\n disabled={disabled}\n size={size}\n className={className}\n >\n <Trans message=\"Filter\" />\n </Button>\n );\n\n const mobileButton = (\n <IconButton\n color={color}\n size=\"sm\"\n variant={variant}\n disabled={disabled}\n className={className}\n >\n {icon}\n </IconButton>\n );\n\n return (\n <DialogTrigger type=\"popover\">\n {isMobile ? mobileButton : desktopButton}\n <AddFilterDialog filters={filters} />\n </DialogTrigger>\n );\n}\n","import {BackendFilter, FilterControlType} from '../backend-filter';\nimport {ComponentPropsWithRef, forwardRef, ReactNode} from 'react';\nimport {Button} from '@common/ui/buttons/button';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\nimport {Trans} from '@common/i18n/trans';\nimport clsx from 'clsx';\n\ninterface TriggerButtonProps\n extends Omit<ComponentPropsWithRef<'button'>, 'color'> {\n isInactive?: boolean;\n filter: BackendFilter;\n children?: ReactNode;\n}\nexport const FilterListTriggerButton = forwardRef<\n HTMLButtonElement,\n TriggerButtonProps\n>((props, ref) => {\n // pass through all props from menu trigger and dialog trigger to button\n const {isInactive, filter, ...domProps} = props;\n\n if (isInactive) {\n return <InactiveFilterButton filter={filter} {...domProps} ref={ref} />;\n }\n\n return <ActiveFilterButton filter={filter} {...domProps} ref={ref} />;\n});\n\ninterface InactiveFilterButtonProps\n extends Omit<ComponentPropsWithRef<'button'>, 'color'> {\n filter: BackendFilter;\n}\nexport const InactiveFilterButton = forwardRef<\n HTMLButtonElement,\n InactiveFilterButtonProps\n>(({filter, ...domProps}, ref) => {\n return (\n <Button\n variant=\"outline\"\n size=\"xs\"\n color=\"paper\"\n radius=\"rounded-md\"\n border=\"border\"\n ref={ref}\n endIcon={<KeyboardArrowDownIcon />}\n {...domProps}\n >\n <Trans {...filter.label} />\n </Button>\n );\n});\n\nexport const ActiveFilterButton = forwardRef<\n HTMLButtonElement,\n InactiveFilterButtonProps\n>(({filter, children, ...domProps}, ref) => {\n const isBoolean = filter.control.type === FilterControlType.BooleanToggle;\n return (\n <Button\n variant=\"outline\"\n size=\"xs\"\n color=\"primary\"\n radius=\"rounded-r-md\"\n border=\"border-y border-r\"\n endIcon={!isBoolean && <KeyboardArrowDownIcon />}\n ref={ref}\n {...domProps}\n >\n <span\n className={clsx(\n !isBoolean && 'border-r border-r-primary-light mr-8 pr-8'\n )}\n >\n <Trans {...filter.label} />\n </span>\n {children}\n </Button>\n );\n});\n","import {DialogTrigger} from '../../../ui/overlays/dialog/dialog-trigger';\nimport {FilterListTriggerButton} from './filter-list-trigger-button';\nimport {ReactNode} from 'react';\nimport {useForm} from 'react-hook-form';\nimport {FilterItemFormValue} from '../add-filter-dialog';\nimport {useDialogContext} from '../../../ui/overlays/dialog/dialog-context';\nimport {Dialog} from '../../../ui/overlays/dialog/dialog';\nimport {DialogHeader} from '../../../ui/overlays/dialog/dialog-header';\nimport {Trans} from '../../../i18n/trans';\nimport {DialogBody} from '../../../ui/overlays/dialog/dialog-body';\nimport {Form} from '../../../ui/forms/form';\nimport {DialogFooter} from '../../../ui/overlays/dialog/dialog-footer';\nimport {Button} from '../../../ui/buttons/button';\nimport {FilterListControlProps} from './filter-list-control';\n\ninterface FilterListItemDialogTriggerProps extends FilterListControlProps<any> {\n label: ReactNode;\n panel: ReactNode;\n}\nexport function FilterListItemDialogTrigger(\n props: FilterListItemDialogTriggerProps\n) {\n const {onValueChange, isInactive, filter, label} = props;\n return (\n <DialogTrigger\n offset={10}\n type=\"popover\"\n onClose={(value?: FilterItemFormValue) => {\n if (value !== undefined) {\n onValueChange(value);\n }\n }}\n >\n <FilterListTriggerButton isInactive={isInactive} filter={filter}>\n {label}\n </FilterListTriggerButton>\n <FilterListControlDialog {...props} />\n </DialogTrigger>\n );\n}\n\nexport function FilterListControlDialog({\n filter,\n panel,\n value,\n operator,\n}: FilterListItemDialogTriggerProps) {\n const form = useForm<Record<string, FilterItemFormValue>>({\n defaultValues: {\n [filter.key]: {value, operator},\n },\n });\n const {close, formId} = useDialogContext();\n return (\n <Dialog size=\"xs\">\n <DialogHeader>\n <Trans {...filter.label} />\n </DialogHeader>\n <DialogBody padding=\"px-14 pt-14 pb-4 max-h-288\">\n <Form\n form={form}\n id={formId}\n onSubmit={formValue => {\n close(formValue[filter.key]);\n }}\n >\n {filter.description && (\n <div className=\"text-muted text-xs mb-14\">\n <Trans {...filter.description} />\n </div>\n )}\n {panel}\n </Form>\n </DialogBody>\n <DialogFooter>\n <Button\n form={formId}\n type=\"submit\"\n variant=\"flat\"\n color=\"primary\"\n size=\"xs\"\n >\n <Trans message=\"Apply\" />\n </Button>\n </DialogFooter>\n </Dialog>\n );\n}\n","import {Fragment, memo} from 'react';\nimport {useNumberFormatter} from './use-number-formatter';\nimport {NumberFormatOptions} from '@internationalized/number';\nimport {shallowEqual} from '../utils/shallow-equal';\n\ninterface FormattedNumberProps extends NumberFormatOptions {\n value: number;\n}\nexport const FormattedNumber = memo(\n ({value, ...options}: FormattedNumberProps) => {\n const formatter = useNumberFormatter(options);\n\n if (isNaN(value)) {\n value = 0;\n }\n\n return <Fragment>{formatter.format(value)}</Fragment>;\n },\n shallowEqual\n);\n","import {\n BackendFilter,\n CustomFilterControl,\n DatePickerFilterControl,\n FilterBooleanToggleControl,\n FilterChipFieldControl,\n FilterControl,\n FilterControlType,\n FilterNumberInputControl,\n FilterOperator,\n FilterSelectControl,\n FilterSelectModelControl,\n FilterTextInputControl,\n} from '../backend-filter';\nimport {FilterListTriggerButton} from './filter-list-trigger-button';\nimport {Trans} from '@common/i18n/trans';\nimport {SelectFilterPanel} from '../panels/select-filter-panel';\nimport {FilterListItemDialogTrigger} from './filter-list-item-dialog-trigger';\nimport {Avatar} from '@common/ui/images/avatar';\nimport {NormalizedModelFilterPanel} from '../panels/normalized-model-filter-panel';\nimport {DateRangeFilterPanel} from '../panels/date-range-filter-panel';\nimport {Fragment, Key, ReactNode} from 'react';\nimport {DateRangePresets} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {FormattedDateTimeRange} from '@common/i18n/formatted-date-time-range';\nimport {AbsoluteDateRange} from '@common/ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {InputFilterPanel} from '../panels/input-filter-panel';\nimport {FilterOperatorNames} from '../filter-operator-names';\nimport {FilterItemFormValue} from '../add-filter-dialog';\nimport {useNormalizedModel} from '@common/users/queries/use-normalized-model';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {ChipFieldFilterPanel} from '@common/datatable/filters/panels/chip-field-filter-panel';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\n\nexport interface FilterListControlProps<T = unknown, E = FilterControl> {\n filter: BackendFilter<E>;\n onValueChange: (value: FilterItemFormValue<T>) => void;\n value: T;\n operator?: FilterOperator;\n isInactive?: boolean;\n}\nexport function FilterListControl(props: FilterListControlProps<any, any>) {\n switch (props.filter.control.type) {\n case FilterControlType.DateRangePicker:\n return <DatePickerControl {...props} />;\n case FilterControlType.BooleanToggle:\n return <BooleanToggleControl {...props} />;\n case FilterControlType.Select:\n return <SelectControl {...props} />;\n case FilterControlType.ChipField:\n return <ChipFieldControl {...props} />;\n case FilterControlType.Input:\n return <InputControl {...props} />;\n case FilterControlType.SelectModel:\n return <SelectModelControl {...props} />;\n case FilterControlType.Custom:\n const Control = (props.filter.control as CustomFilterControl).listItem;\n return <Control {...props} />;\n default:\n return null;\n }\n}\n\nfunction DatePickerControl(\n props: FilterListControlProps<\n Required<AbsoluteDateRange>,\n DatePickerFilterControl\n >,\n) {\n const {value, filter} = props;\n\n let valueLabel: ReactNode;\n if (value.preset !== undefined) {\n valueLabel = <Trans {...DateRangePresets[value.preset].label} />;\n } else {\n valueLabel = (\n <FormattedDateTimeRange\n start={new Date(value.start)}\n end={new Date(value.end)}\n options={{dateStyle: 'medium'}}\n />\n );\n }\n\n return (\n <FilterListItemDialogTrigger\n {...props}\n label={valueLabel}\n panel={<DateRangeFilterPanel filter={filter} />}\n />\n );\n}\n\nfunction BooleanToggleControl({\n filter,\n isInactive,\n onValueChange,\n}: FilterListControlProps<\n FilterBooleanToggleControl['defaultValue'],\n FilterBooleanToggleControl\n>) {\n // todo: toggle control on or off here\n return (\n <FilterListTriggerButton\n onClick={() => {\n onValueChange({value: filter.control.defaultValue});\n }}\n filter={filter}\n isInactive={isInactive}\n />\n );\n}\n\nfunction SelectControl(\n props: FilterListControlProps<Key, FilterSelectControl>,\n) {\n const {filter, value} = props;\n const option = filter.control.options.find(o => o.key === value);\n return (\n <FilterListItemDialogTrigger\n {...props}\n label={option ? <Trans {...option.label} /> : null}\n panel={<SelectFilterPanel filter={filter} />}\n />\n );\n}\n\nfunction ChipFieldControl(\n props: FilterListControlProps<string[], FilterChipFieldControl>,\n) {\n return (\n <FilterListItemDialogTrigger\n {...props}\n label={<MultipleValues {...props} />}\n panel={<ChipFieldFilterPanel filter={props.filter} />}\n />\n );\n}\n\nfunction MultipleValues(\n props: FilterListControlProps<string[], FilterChipFieldControl>,\n) {\n const {trans} = useTrans();\n const {filter, value} = props;\n const options = value.map(v => filter.control.options.find(o => o.key === v));\n const maxShownCount = 3;\n const notShownCount = value.length - maxShownCount;\n\n // translate names, add commas and limit to 3\n const names = (\n <Fragment>\n {options\n .filter(Boolean)\n .slice(0, maxShownCount)\n .map((o, i) => {\n let name = '';\n if (i !== 0) {\n name += ', ';\n }\n name += trans(o!.label);\n return name;\n })}\n </Fragment>\n );\n\n // indicate that there are some names not shown\n return notShownCount > 0 ? (\n <Trans\n message=\":names + :count more\"\n values={{names: names, count: notShownCount}}\n />\n ) : (\n names\n );\n}\n\nfunction InputControl(\n props: FilterListControlProps<\n string,\n FilterTextInputControl | FilterNumberInputControl\n >,\n) {\n const {filter, value, operator} = props;\n\n const operatorLabel = operator ? (\n <Trans {...FilterOperatorNames[operator]} />\n ) : null;\n\n const formattedValue =\n filter.control.inputType === 'number' ? (\n <FormattedNumber value={value as any} />\n ) : (\n value\n );\n\n return (\n <FilterListItemDialogTrigger\n {...props}\n label={\n <Fragment>\n {operatorLabel} {formattedValue}\n </Fragment>\n }\n panel={<InputFilterPanel filter={filter} />}\n />\n );\n}\n\nfunction SelectModelControl(\n props: FilterListControlProps<string, FilterSelectModelControl>,\n) {\n const {value, filter} = props;\n const {isLoading, data} = useNormalizedModel(\n `normalized-models/${filter.control.model}/${value}`,\n undefined,\n {enabled: !!value},\n );\n\n const skeleton = (\n <Fragment>\n <Skeleton variant=\"avatar\" size=\"w-18 h-18 mr-6\" />\n <Skeleton variant=\"rect\" size=\"w-50\" />\n </Fragment>\n );\n const modelPreview = (\n <Fragment>\n <Avatar size=\"xs\" src={data?.model.image} className=\"mr-6\" />\n {data?.model.name}\n </Fragment>\n );\n\n const label = isLoading || !data ? skeleton : modelPreview;\n\n return (\n <FilterListItemDialogTrigger\n {...props}\n label={label}\n panel={<NormalizedModelFilterPanel filter={filter} />}\n />\n );\n}\n","import clsx from 'clsx';\nimport {BackendFilter} from '../backend-filter';\nimport {useBackendFilterUrlParams} from '../backend-filter-url-params';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {FilterListControl} from './filter-list-control';\nimport {FilterItemFormValue} from '../add-filter-dialog';\n\ninterface FilterListProps {\n filters: BackendFilter[];\n // these filters will always be shown, even if value is not yet selected for filter\n pinnedFilters?: string[];\n className?: string;\n}\nexport function FilterList({\n filters,\n pinnedFilters,\n className,\n}: FilterListProps) {\n const {decodedFilters, remove, replaceAll} = useBackendFilterUrlParams(\n filters,\n pinnedFilters\n );\n\n if (!decodedFilters.length) return null;\n\n return (\n <div className={clsx('flex items-center gap-6 overflow-x-auto', className)}>\n {decodedFilters.map((field, index) => {\n const filter = filters.find(f => f.key === field.key);\n\n if (!filter) return null;\n\n const handleValueChange = (payload: FilterItemFormValue) => {\n const newFilters = [...decodedFilters];\n newFilters.splice(index, 1, {\n key: filter.key,\n value: payload.value,\n isInactive: false,\n operator: payload.operator || filter.defaultOperator,\n });\n replaceAll(newFilters);\n };\n\n return (\n <div key={field.key}>\n {!field.isInactive && (\n <IconButton\n variant=\"outline\"\n color=\"primary\"\n size=\"xs\"\n radius=\"rounded-l-md\"\n onClick={() => {\n remove(field.key);\n }}\n >\n <CloseIcon />\n </IconButton>\n )}\n <FilterListControl\n filter={filter}\n isInactive={field.isInactive}\n value={field.valueKey != null ? field.valueKey : field.value}\n operator={field.operator}\n onValueChange={handleValueChange}\n />\n </div>\n );\n })}\n </div>\n );\n}\n","import {m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport React from 'react';\n\nexport function FilterListSkeleton() {\n return (\n <m.div\n className=\"flex items-center gap-6 h-30\"\n key=\"filter-list-skeleton\"\n {...opacityAnimation}\n >\n <Skeleton variant=\"rect\" size=\"h-full w-144\" radius=\"rounded-md\" />\n <Skeleton variant=\"rect\" size=\"h-full w-112\" radius=\"rounded-md\" />\n <Skeleton variant=\"rect\" size=\"h-full w-172\" radius=\"rounded-md\" />\n </m.div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AddIcon = createSvgIcon(\n <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n, 'AddOutlined');\n","import React, {ReactNode} from 'react';\nimport {Avatar, AvatarProps} from '../../ui/images/avatar';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport clsx from 'clsx';\n\ninterface Props {\n image?: string;\n label: ReactNode;\n description?: ReactNode;\n labelClassName?: string;\n avatarSize?: AvatarProps['size'];\n}\nexport function NameWithAvatar({\n image,\n label,\n description,\n labelClassName,\n avatarSize = 'md',\n}: Props) {\n return (\n <div className=\"flex items-center gap-12\">\n {image && (\n <Avatar size={avatarSize} className=\"flex-shrink-0\" src={image} />\n )}\n <div className=\"min-w-0 overflow-hidden\">\n <div\n className={clsx(labelClassName, 'overflow-hidden overflow-ellipsis')}\n >\n {label}\n </div>\n {description && (\n <div className=\"overflow-hidden overflow-ellipsis text-xs text-muted\">\n {description}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function NameWithAvatarPlaceholder({\n labelClassName,\n showDescription,\n}: Partial<Props> & {\n showDescription?: boolean;\n}) {\n return (\n <div className=\"flex w-full max-w-4/5 items-center gap-12\">\n <Skeleton size=\"w-40 h-40 md:w-32 md:h-32\" variant=\"rect\" />\n <div className=\"flex-auto\">\n <div className={clsx(labelClassName, 'leading-3')}>\n <Skeleton />\n </div>\n {showDescription && (\n <div className=\"mt-4 leading-3 text-muted\">{<Skeleton />}</div>\n )}\n </div>\n </div>\n );\n}\n","import React, {ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\nimport {UseSliderProps, UseSliderReturn} from './use-slider';\n\nexport interface BaseSliderProps extends UseSliderProps {\n slider: UseSliderReturn;\n children: ReactNode;\n}\n\nexport function BaseSlider(props: BaseSliderProps) {\n const {\n size = 'md',\n inline,\n label,\n showValueLabel = !!label,\n className,\n width = 'w-full',\n slider,\n children,\n trackColor = 'primary',\n fillColor = 'primary',\n } = props;\n\n const {\n domProps,\n trackRef,\n getThumbPercent,\n getThumbValueLabel,\n labelId,\n groupId,\n thumbIds,\n isDisabled,\n numberFormatter,\n minValue,\n maxValue,\n step,\n values,\n getValueLabel,\n } = slider;\n\n let outputValue = '';\n let maxLabelLength = Math.max(\n [...numberFormatter.format(minValue)].length,\n [...numberFormatter.format(maxValue)].length,\n [...numberFormatter.format(step)].length,\n );\n\n if (getValueLabel) {\n outputValue = getValueLabel(values[0]);\n } else if (values.length === 1) {\n outputValue = getThumbValueLabel(0);\n } else if (values.length === 2) {\n // This should really use the NumberFormat#formatRange proposal...\n // https://github.com/tc39/ecma402/issues/393\n // https://github.com/tc39/proposal-intl-numberformat-v3#formatrange-ecma-402-393\n outputValue = `${getThumbValueLabel(0)} ${getThumbValueLabel(1)}`;\n maxLabelLength =\n 3 +\n 2 *\n Math.max(\n maxLabelLength,\n [...numberFormatter.format(minValue)].length,\n [...numberFormatter.format(maxValue)].length,\n );\n }\n const style = getInputFieldClassNames({\n size,\n disabled: isDisabled,\n labelDisplay: 'flex',\n });\n\n const wrapperClassname = clsx('touch-none', className, width, {\n 'flex items-center': inline,\n });\n\n return (\n <div className={wrapperClassname} role=\"group\" id={groupId}>\n {(label || showValueLabel) && (\n <div className={clsx(style.label, 'select-none')}>\n {label && (\n <label\n onClick={() => {\n // Safari does not focus <input type=\"range\"> elements when clicking on an associated <label>,\n // so do it manually. In addition, make sure we show the focus ring.\n document.getElementById(thumbIds[0])?.focus();\n }}\n id={labelId}\n htmlFor={groupId}\n >\n {label}\n </label>\n )}\n {showValueLabel && (\n <output\n htmlFor={thumbIds[0]}\n className=\"ml-auto text-right\"\n aria-live=\"off\"\n style={\n !maxLabelLength\n ? undefined\n : {\n width: `${maxLabelLength}ch`,\n minWidth: `${maxLabelLength}ch`,\n }\n }\n >\n {outputValue}\n </output>\n )}\n </div>\n )}\n <div\n ref={trackRef}\n className={clsx('relative', getWrapperHeight(props))}\n {...domProps}\n role=\"presentation\"\n >\n <div\n className={clsx(\n 'absolute inset-0 m-auto rounded',\n getTrackColor(trackColor, isDisabled),\n getTrackHeight(size),\n )}\n />\n <div\n className={clsx(\n 'absolute inset-0 my-auto rounded',\n getFillColor(fillColor, isDisabled),\n getTrackHeight(size),\n )}\n style={{width: `${Math.max(getThumbPercent(0) * 100, 0)}%`}}\n />\n {children}\n </div>\n </div>\n );\n}\n\nfunction getWrapperHeight({size, wrapperHeight}: UseSliderProps): string {\n if (wrapperHeight) return wrapperHeight;\n switch (size) {\n case 'xs':\n return 'h-14';\n case 'sm':\n return 'h-20';\n default:\n return 'h-30';\n }\n}\n\nfunction getTrackHeight(size: UseSliderProps['size']): string {\n switch (size) {\n case 'xs':\n return 'h-2';\n case 'sm':\n return 'h-3';\n default:\n return 'h-4';\n }\n}\n\nfunction getTrackColor(color: string, isDisabled: boolean): string {\n if (isDisabled) {\n color = 'disabled';\n }\n switch (color) {\n case 'disabled':\n return 'bg-slider-disabled/60';\n case 'primary':\n return 'bg-primary-light';\n case 'neutral':\n return 'bg-divider';\n default:\n return color;\n }\n}\n\nfunction getFillColor(color: string, isDisabled: boolean): string {\n if (isDisabled) {\n color = 'disabled';\n }\n switch (color) {\n case 'disabled':\n return 'bg-slider-disabled';\n case 'primary':\n return 'bg-primary';\n default:\n return color;\n }\n}\n","import {\n mergeProps,\n snapValueToStep,\n useGlobalListeners,\n} from '@react-aria/utils';\nimport {useControlledState} from '@react-stately/utils';\nimport React, {\n HTMLAttributes,\n ReactNode,\n RefObject,\n useId,\n useRef,\n useState,\n} from 'react';\nimport {clamp} from '@common/utils/number/clamp';\nimport {usePointerEvents} from '../../interactions/use-pointer-events';\nimport {useNumberFormatter} from '@common/i18n/use-number-formatter';\nimport type {NumberFormatOptions} from '@internationalized/number';\n\nexport interface UseSliderProps<T = number[]> {\n formatOptions?: NumberFormatOptions;\n onPointerDown?: () => void;\n onPointerMove?: (e: React.PointerEvent) => void;\n onChange?: (value: T) => void;\n onChangeEnd?: (value: T) => void;\n value?: T;\n defaultValue?: T;\n getValueLabel?: (value: number) => string;\n minValue?: number;\n maxValue?: number;\n step?: number;\n isDisabled?: boolean;\n size?: 'xs' | 'sm' | 'md';\n label?: ReactNode;\n inline?: boolean;\n className?: string;\n width?: string;\n showValueLabel?: boolean;\n fillColor?: 'primary' | string;\n trackColor?: 'primary' | 'neutral' | string;\n showThumbOnHoverOnly?: boolean;\n thumbSize?: string;\n wrapperHeight?: string;\n}\n\nexport interface UseSliderReturn {\n domProps: HTMLAttributes<HTMLElement>;\n trackRef: RefObject<HTMLDivElement>;\n isPointerOver: boolean;\n showThumbOnHoverOnly?: boolean;\n thumbSize?: string;\n step: number;\n isDisabled: boolean;\n values: number[];\n minValue: number;\n maxValue: number;\n focusedThumb: number | undefined;\n labelId: string | undefined;\n groupId: string;\n thumbIds: string[];\n numberFormatter: Intl.NumberFormat;\n getThumbPercent: (index: number) => number;\n getThumbMinValue: (index: number) => number;\n getThumbMaxValue: (index: number) => number;\n getThumbValueLabel: (index: number) => string;\n setThumbValue: (index: number, value: number) => void;\n updateDraggedThumbs: (index: number, dragging: boolean) => void;\n isThumbDragging: (index: number) => boolean;\n setThumbEditable: (index: number, editable: boolean) => void;\n setFocusedThumb: (index: number | undefined) => void;\n getValueLabel?: (value: number) => string;\n}\n\nexport function useSlider({\n minValue = 0,\n maxValue = 100,\n isDisabled = false,\n step = 1,\n formatOptions,\n onChangeEnd,\n onPointerDown,\n label,\n getValueLabel,\n showThumbOnHoverOnly,\n thumbSize,\n onPointerMove,\n ...props\n}: UseSliderProps): UseSliderReturn {\n const [isPointerOver, setIsPointerOver] = useState(false);\n const numberFormatter = useNumberFormatter(formatOptions);\n const {addGlobalListener, removeGlobalListener} = useGlobalListeners();\n const trackRef = useRef<HTMLDivElement>(null);\n\n // values will be stored in internal state as an array for both slider and range slider\n const [values, setValues] = useControlledState<number[]>(\n props.value ? props.value : undefined,\n props.defaultValue ?? ([minValue] as any),\n props.onChange as any,\n );\n // need to also store values in ref, because state value would\n // lag behind by one between pointer down and move callbacks\n const valuesRef = useRef<number[] | null>(null);\n valuesRef.current = values;\n\n // indices of thumbs that are being dragged currently (state and ref for same reasons as above)\n const [draggedThumbs, setDraggedThumbs] = useState<boolean[]>(\n new Array(values.length).fill(false),\n );\n const draggedThumbsRef = useRef<boolean[] | null>(null);\n draggedThumbsRef.current = draggedThumbs;\n\n // formatted value for <output> and thumb aria labels\n function getFormattedValue(value: number) {\n return numberFormatter.format(value);\n }\n\n const isThumbDragging = (index: number) => {\n return draggedThumbsRef.current?.[index] || false;\n };\n\n const getThumbValueLabel = (index: number) =>\n getFormattedValue(values[index]);\n\n const getThumbMinValue = (index: number) =>\n index === 0 ? minValue : values[index - 1];\n const getThumbMaxValue = (index: number) =>\n index === values.length - 1 ? maxValue : values[index + 1];\n\n const setThumbValue = (index: number, value: number) => {\n if (isDisabled || !isThumbEditable(index) || !valuesRef.current) {\n return;\n }\n const thisMin = getThumbMinValue(index);\n const thisMax = getThumbMaxValue(index);\n\n // Round value to multiple of step, clamp value between min and max\n value = snapValueToStep(value, thisMin, thisMax, step);\n valuesRef.current = replaceIndex(valuesRef.current, index, value);\n setValues(valuesRef.current);\n };\n\n // update \"dragging\" status of specified thumb\n const updateDraggedThumbs = (index: number, dragging: boolean) => {\n if (isDisabled || !isThumbEditable(index)) {\n return;\n }\n\n const wasDragging = draggedThumbsRef.current?.[index];\n draggedThumbsRef.current = replaceIndex(\n draggedThumbsRef.current || [],\n index,\n dragging,\n );\n setDraggedThumbs(draggedThumbsRef.current);\n\n // Call onChangeEnd if no handles are dragging.\n if (onChangeEnd && wasDragging && !draggedThumbsRef.current.some(Boolean)) {\n onChangeEnd(valuesRef.current || []);\n }\n };\n\n const [focusedThumb, setFocusedThumb] = useState<number | undefined>(\n undefined,\n );\n\n const getValuePercent = (value: number) => {\n const x = Math.min(1, (value - minValue) / (maxValue - minValue));\n if (isNaN(x)) {\n return 0;\n }\n return x;\n };\n\n const getThumbPercent = (index: number) =>\n getValuePercent(valuesRef.current![index]);\n\n const setThumbPercent = (index: number, percent: number) => {\n setThumbValue(index, getPercentValue(percent));\n };\n\n const getRoundedValue = (value: number) =>\n Math.round((value - minValue) / step) * step + minValue;\n\n const getPercentValue = (percent: number) => {\n const val = percent * (maxValue - minValue) + minValue;\n return clamp(getRoundedValue(val), minValue, maxValue);\n };\n\n // allows disabling individual thumbs in range slider, instead of disable the whole slider\n const editableThumbsRef = useRef<boolean[]>(\n new Array(values.length).fill(true),\n );\n const isThumbEditable = (index: number) => editableThumbsRef.current[index];\n const setThumbEditable = (index: number, editable: boolean) => {\n editableThumbsRef.current[index] = editable;\n };\n\n // When the user clicks or drags the track, we want the motion to set and drag the\n // closest thumb. Hence, we also need to install useMove() on the track element.\n // Here, we keep track of which index is the \"closest\" to the drag start point.\n // It is set onMouseDown/onTouchDown; see trackProps below.\n const realTimeTrackDraggingIndex = useRef<number | null>(null);\n\n const currentPointer = useRef<number | null | undefined>(undefined);\n const handlePointerDown = (e: React.PointerEvent) => {\n if (\n e.pointerType === 'mouse' &&\n (e.button !== 0 || e.altKey || e.ctrlKey || e.metaKey)\n ) {\n return;\n }\n\n onPointerDown?.();\n\n // We only trigger track-dragging if the user clicks on the track itself and nothing is currently being dragged.\n if (\n trackRef.current &&\n !isDisabled &&\n values.every((_, i) => !draggedThumbs[i])\n ) {\n const size = trackRef.current.offsetWidth;\n // Find the closest thumb\n const trackPosition = trackRef.current.getBoundingClientRect().left;\n const offset = e.clientX - trackPosition;\n const percent = offset / size;\n const value = getPercentValue(percent);\n\n // to find the closet thumb we split the array based on the first thumb position to the \"right/end\" of the click.\n let closestThumb;\n const split = values.findIndex(v => value - v < 0);\n if (split === 0) {\n // If the index is zero then the closest thumb is the first one\n closestThumb = split;\n } else if (split === -1) {\n // If no index is found they've clicked past all the thumbs\n closestThumb = values.length - 1;\n } else {\n const lastLeft = values[split - 1];\n const firstRight = values[split];\n // Pick the last left/start thumb, unless they are stacked on top of each other, then pick the right/end one\n if (Math.abs(lastLeft - value) < Math.abs(firstRight - value)) {\n closestThumb = split - 1;\n } else {\n closestThumb = split;\n }\n }\n\n // Confirm that the found closest thumb is editable, not disabled, and move it\n if (closestThumb >= 0 && isThumbEditable(closestThumb)) {\n // Don't un-focus anything\n e.preventDefault();\n\n realTimeTrackDraggingIndex.current = closestThumb;\n setFocusedThumb(closestThumb);\n currentPointer.current = e.pointerId;\n\n updateDraggedThumbs(realTimeTrackDraggingIndex.current, true);\n setThumbValue(closestThumb, value);\n\n addGlobalListener(window, 'pointerup', onUpTrack, false);\n } else {\n realTimeTrackDraggingIndex.current = null;\n }\n }\n };\n\n const currentPosition = useRef<number | null>(null);\n const {domProps: moveDomProps} = usePointerEvents({\n onPointerDown: handlePointerDown,\n onMoveStart() {\n currentPosition.current = null;\n },\n onMove(e, deltaX) {\n const size = trackRef.current?.offsetWidth || 0;\n\n if (currentPosition.current == null) {\n currentPosition.current =\n getThumbPercent(realTimeTrackDraggingIndex.current || 0) * size;\n }\n\n currentPosition.current += deltaX;\n\n if (realTimeTrackDraggingIndex.current != null && trackRef.current) {\n const percent = clamp(currentPosition.current / size, 0, 1);\n setThumbPercent(realTimeTrackDraggingIndex.current, percent);\n }\n },\n onMoveEnd() {\n if (realTimeTrackDraggingIndex.current != null) {\n updateDraggedThumbs(realTimeTrackDraggingIndex.current, false);\n realTimeTrackDraggingIndex.current = null;\n }\n },\n });\n\n const domProps = mergeProps(moveDomProps, {\n onPointerEnter: () => {\n setIsPointerOver(true);\n },\n onPointerLeave: () => {\n setIsPointerOver(false);\n },\n onPointerMove: (e: React.PointerEvent) => {\n onPointerMove?.(e);\n },\n });\n\n const onUpTrack = (e: PointerEvent) => {\n const id = e.pointerId;\n if (id === currentPointer.current) {\n if (realTimeTrackDraggingIndex.current != null) {\n updateDraggedThumbs(realTimeTrackDraggingIndex.current, false);\n realTimeTrackDraggingIndex.current = null;\n }\n\n removeGlobalListener(window, 'pointerup', onUpTrack, false);\n }\n };\n\n const id = useId();\n const labelId = label ? `${id}-label` : undefined;\n const groupId = `${id}-group`;\n const thumbIds = [...Array(values.length)].map((v, i) => {\n return `${id}-thumb-${i}`;\n });\n\n return {\n domProps,\n trackRef,\n isDisabled,\n step,\n values,\n minValue,\n maxValue,\n focusedThumb,\n labelId,\n groupId,\n thumbIds,\n numberFormatter,\n getThumbPercent,\n getThumbMinValue,\n getThumbMaxValue,\n getThumbValueLabel,\n isThumbDragging,\n setThumbValue,\n updateDraggedThumbs,\n setThumbEditable,\n setFocusedThumb,\n getValueLabel,\n isPointerOver,\n showThumbOnHoverOnly,\n thumbSize,\n };\n}\n\nfunction replaceIndex<T>(array: T[], index: number, value: T) {\n if (array[index] === value) {\n return array;\n }\n\n return [...array.slice(0, index), value, ...array.slice(index + 1)];\n}\n","import React, {Ref, useCallback, useEffect, useRef} from 'react';\nimport clsx from 'clsx';\nimport {UseSliderReturn} from './use-slider';\nimport {useGlobalListeners, useObjectRef} from '@react-aria/utils';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {BaseSliderProps} from '@common/ui/forms/slider/base-slider';\n\ninterface SliderThumb {\n index: number;\n slider: UseSliderReturn;\n isDisabled?: boolean;\n ariaLabel?: string;\n inputRef?: Ref<HTMLInputElement>;\n onBlur?: React.FocusEventHandler;\n fillColor?: BaseSliderProps['fillColor'];\n}\n\nexport function SliderThumb({\n index,\n slider,\n isDisabled: isThumbDisabled,\n ariaLabel,\n inputRef,\n onBlur,\n fillColor = 'primary',\n}: SliderThumb) {\n const inputObjRef = useObjectRef(inputRef);\n const {addGlobalListener, removeGlobalListener} = useGlobalListeners();\n\n const {\n step,\n values,\n focusedThumb,\n labelId,\n thumbIds,\n isDisabled: isSliderDisabled,\n getThumbPercent,\n getThumbMinValue,\n getThumbMaxValue,\n getThumbValueLabel,\n setThumbValue,\n updateDraggedThumbs,\n isThumbDragging,\n setThumbEditable,\n setFocusedThumb,\n isPointerOver,\n showThumbOnHoverOnly,\n thumbSize = 'w-18 h-18',\n } = slider;\n\n const isDragging = isThumbDragging(index);\n const value = values[index];\n\n // Immediately register editability with the state\n setThumbEditable(index, !isThumbDisabled);\n const isDisabled = isThumbDisabled || isSliderDisabled;\n\n const focusInput = useCallback(() => {\n if (inputObjRef.current) {\n inputObjRef.current.focus({preventScroll: true});\n }\n }, [inputObjRef]);\n\n // we will focus the native range input when slider is clicked or thumb is\n // focused in some other way, and let browser handle keyboard interactions\n const isFocused = focusedThumb === index;\n useEffect(() => {\n if (isFocused) {\n focusInput();\n }\n }, [isFocused, focusInput]);\n\n const currentPointer = useRef<number | undefined>(undefined);\n const handlePointerUp = (e: PointerEvent) => {\n if (e.pointerId === currentPointer.current) {\n focusInput();\n updateDraggedThumbs(index, false);\n removeGlobalListener(window, 'pointerup', handlePointerUp, false);\n }\n };\n\n const className = clsx(\n 'outline-none rounded-full top-1/2 -translate-y-1/2 -translate-x-1/2 absolute inset-0 transition-button duration-200',\n thumbSize,\n !isDisabled && 'shadow-md',\n thumbColor({fillColor, isDisabled, isDragging: isDragging}),\n // show thumb on hover and while dragging, otherwise \"blur\" event will fire on thumb and dragging will stop\n !showThumbOnHoverOnly ||\n (showThumbOnHoverOnly && isDragging) ||\n isPointerOver\n ? 'visible'\n : 'invisible',\n );\n\n return (\n <div\n role=\"presentation\"\n className={className}\n style={{\n left: `${Math.max(getThumbPercent(index) * 100, 0)}%`,\n }}\n onPointerDown={e => {\n if (e.button !== 0 || e.altKey || e.ctrlKey || e.metaKey) {\n return;\n }\n focusInput();\n currentPointer.current = e.pointerId;\n updateDraggedThumbs(index, true);\n\n addGlobalListener(window, 'pointerup', handlePointerUp, false);\n }}\n >\n <input\n id={thumbIds[index]}\n onKeyDown={createEventHandler(() => {\n updateDraggedThumbs(index, true);\n })}\n onKeyUp={createEventHandler(() => {\n // make sure \"onChangeEnd\" is fired on keyboard navigation\n updateDraggedThumbs(index, false);\n })}\n ref={inputObjRef}\n tabIndex={!isDisabled ? 0 : undefined}\n min={getThumbMinValue(index)}\n max={getThumbMaxValue(index)}\n step={step}\n value={value}\n disabled={isDisabled}\n aria-label={ariaLabel}\n aria-labelledby={labelId}\n aria-orientation=\"horizontal\"\n aria-valuetext={getThumbValueLabel(index)}\n onFocus={() => {\n setFocusedThumb(index);\n }}\n onBlur={e => {\n setFocusedThumb(undefined);\n updateDraggedThumbs(index, false);\n onBlur?.(e);\n }}\n onChange={e => {\n setThumbValue(index, parseFloat(e.target.value));\n }}\n type=\"range\"\n className=\"sr-only\"\n />\n </div>\n );\n}\n\ninterface SliderThumbColorProps {\n isDisabled?: boolean;\n isDragging: boolean;\n fillColor?: BaseSliderProps['fillColor'];\n}\n\nfunction thumbColor({\n isDisabled,\n isDragging,\n fillColor,\n}: SliderThumbColorProps): string {\n if (isDisabled) {\n return 'bg-slider-disabled cursor-default';\n }\n\n if (fillColor && fillColor !== 'primary') {\n return fillColor;\n }\n\n return clsx(\n 'hover:bg-primary-dark',\n isDragging ? 'bg-primary-dark' : 'bg-primary',\n );\n}\n","import {BaseSlider} from './base-slider';\nimport {useSlider, UseSliderProps} from './use-slider';\nimport React, {Ref} from 'react';\nimport {SliderThumb} from './slider-thumb';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\n\ninterface SliderProps extends UseSliderProps<number> {\n inputRef?: Ref<HTMLInputElement>;\n onBlur?: React.FocusEventHandler;\n}\nexport function Slider({inputRef, onBlur, ...props}: SliderProps) {\n const {onChange, onChangeEnd, value, defaultValue, ...otherProps} = props;\n\n const baseProps: UseSliderProps = {\n ...otherProps,\n // Normalize `value: number[]` to `value: number`\n value: value != null ? [value] : undefined,\n defaultValue: defaultValue != null ? [defaultValue] : undefined,\n onChange: (v: number[]): void => {\n onChange?.(v[0]);\n },\n onChangeEnd: (v: number[]): void => {\n onChangeEnd?.(v[0]);\n },\n };\n\n const slider = useSlider(baseProps);\n\n return (\n <BaseSlider {...baseProps} slider={slider}>\n <SliderThumb\n fillColor={props.fillColor}\n index={0}\n slider={slider}\n inputRef={inputRef}\n onBlur={onBlur}\n />\n </BaseSlider>\n );\n}\n\nexport interface FormSliderProps extends SliderProps {\n name: string;\n}\n\nexport function FormSlider({name, ...props}: FormSliderProps) {\n const {\n field: {onChange, onBlur, value = '', ref},\n } = useController({\n name,\n });\n\n const formProps: SliderProps = {\n onChange,\n onBlur,\n value: value || '', // avoid issues with \"null\" value when setting form defaults from backend model\n };\n\n return <Slider inputRef={ref} {...mergeProps(formProps, props)} />;\n}\n","import {useEffect, useRef} from 'react';\n\nexport function usePrevious<T>(value: T) {\n const ref = useRef<T>();\n // Store current value in ref\n useEffect(() => {\n ref.current = value;\n }, [value]); // Only re-run if value changes\n // Return previous value (happens before update in useEffect above)\n return ref.current;\n}\n","import {DragMonitor} from './use-drag-monitor';\nimport {ConnectedDraggable, DraggableId} from './use-draggable';\nimport {ConnectedDroppable} from './use-droppable';\n\nexport type DragSessionStatus =\n | 'dropSuccess'\n | 'dropFail'\n | 'dragging'\n | 'inactive';\n\nexport interface DragSession {\n dragTargetId?: DraggableId;\n status: DragSessionStatus;\n}\n\nexport const draggables = new Map<DraggableId, ConnectedDraggable>();\nexport const droppables = new Map<DraggableId, ConnectedDroppable>();\nexport const dragMonitors = new Map<DraggableId, DragMonitor>();\nexport const dragSession: DragSession = {\n status: 'inactive',\n};\n","import React from 'react';\n\ntype NativeEvent =\n | React.PointerEvent\n | PointerEvent\n | React.DragEvent<HTMLElement>\n | DragEvent;\n\nexport interface InteractableEvent {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n rect: InteractableRect;\n nativeEvent: NativeEvent;\n}\n\nexport interface InteractableRect {\n left: number;\n top: number;\n width: number;\n height: number;\n angle?: number;\n}\n\nexport function interactableEvent({\n e,\n rect,\n deltaX,\n deltaY,\n}: {\n e: NativeEvent;\n rect: InteractableRect;\n deltaX?: number;\n deltaY?: number;\n}): InteractableEvent {\n return {\n rect,\n x: e.clientX,\n y: e.clientY,\n deltaX: deltaX ?? 0,\n deltaY: deltaY ?? 0,\n nativeEvent: e,\n };\n}\n","type InteractionName = null | 'resize' | 'rotate' | 'drag' | 'move';\n\nexport let activeInteraction: InteractionName = null;\n\nexport function setActiveInteraction(name: InteractionName) {\n activeInteraction = name;\n}\n","import {InteractableRect} from '../interactable-event';\n\nexport function domRectToObj(rect: DOMRect): InteractableRect {\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n}\n","// use intersection observer instead of getBoundingClientRect for better performance as this will be called in onPointerMove event\nimport {InteractableRect} from '../interactable-event';\nimport {ConnectedMouseSelectable} from './mouse-selection/use-mouse-selectable';\nimport {DraggableId} from './use-draggable';\nimport {ConnectedDroppable} from './use-droppable';\n\nexport function updateRects(\n targets: Map<DraggableId, ConnectedDroppable | ConnectedMouseSelectable>\n) {\n const observer = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n const {width, height, left, top} = entry.boundingClientRect;\n const [id, target] =\n [...targets].find(\n ([, target]) => target.ref.current === entry.target\n ) || [];\n if (id == null || target == null) return;\n\n const rect: InteractableRect = {\n width,\n height,\n left,\n top,\n };\n targets.set(id, {...target, rect});\n });\n observer.disconnect();\n });\n\n [...targets.values()].forEach(target => {\n if (target.ref.current) {\n observer.observe(target.ref.current);\n }\n });\n}\n","import React, {RefObject, useLayoutEffect, useRef} from 'react';\nimport {draggables, dragMonitors, dragSession, droppables} from './drag-state';\nimport {\n InteractableEvent,\n interactableEvent,\n InteractableRect,\n} from '../interactable-event';\nimport {activeInteraction, setActiveInteraction} from '../active-interaction';\nimport {domRectToObj} from '../utils/dom-rect-to-obj';\nimport {updateRects} from './update-rects';\nimport {useGlobalListeners} from '@react-aria/utils';\nimport {DragMonitor} from './use-drag-monitor';\nimport {NativeFileDraggable} from './use-droppable';\n\ninterface DragState {\n currentRect?: InteractableRect;\n lastPosition: {x: number; y: number};\n clickedEl?: HTMLElement;\n}\n\nexport type DragPreviewRenderer = (\n draggable: ConnectedDraggable,\n callback: (node: HTMLElement) => void\n) => void;\n\nexport type DraggableId = string | number | object;\n\nexport interface ConnectedDraggable<T = any> {\n type: string;\n id: DraggableId;\n getData: () => T;\n ref: RefObject<HTMLElement>;\n}\n\n// Either draggable from within the app, or file dragged in from the desktop\nexport type MixedDraggable = ConnectedDraggable | NativeFileDraggable;\n\ninterface UseDragProps extends ConnectedDraggable {\n disabled?: boolean;\n onDragStart?: (e: InteractableEvent, target: ConnectedDraggable) => void;\n onDragMove?: (e: InteractableEvent, target: ConnectedDraggable) => void;\n onDragEnd?: (e: InteractableEvent, target: ConnectedDraggable) => void;\n preview?: RefObject<DragPreviewRenderer>;\n hidePreview?: boolean;\n}\nexport function useDraggable({\n id,\n disabled,\n ref,\n preview,\n hidePreview,\n ...options\n}: UseDragProps) {\n const dragHandleRef = useRef<HTMLButtonElement>(null);\n const {addGlobalListener, removeAllGlobalListeners} = useGlobalListeners();\n\n const state = useRef<DragState>({\n lastPosition: {x: 0, y: 0},\n }).current;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useLayoutEffect(() => {\n if (!disabled) {\n draggables.set(id, {\n ...draggables.get(id),\n id,\n ref,\n type: optionsRef.current.type,\n getData: optionsRef.current.getData,\n });\n } else {\n draggables.delete(id);\n }\n return () => {\n draggables.delete(id);\n };\n }, [id, disabled, optionsRef, ref]);\n\n // notify monitors connected to the same drag type as this draggable\n const notifyMonitors = (callback: (m: DragMonitor) => void) => {\n dragMonitors.forEach(monitor => {\n if (monitor.type === draggables.get(id)?.type) {\n callback(monitor);\n }\n });\n };\n\n const onDragStart = (e: React.DragEvent<HTMLElement>) => {\n const draggable = draggables.get(id);\n const el = ref.current;\n const clickedOnHandle =\n !dragHandleRef.current ||\n !state.clickedEl ||\n dragHandleRef.current.contains(state.clickedEl);\n\n // if another interaction is in progress (rotate, resize, drag etc.), bail\n if (activeInteraction || !el || !draggable || !clickedOnHandle) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n updateRects(droppables);\n setActiveInteraction('drag');\n\n // hide default browser ghost image\n if (hidePreview) {\n hideNativeGhostImage(e);\n }\n // this will hide default browser cursor icon, if \"dropEffect\" is not set in dragOver/dragEnter\n e.dataTransfer.effectAllowed = 'move';\n\n state.lastPosition = {x: e.clientX, y: e.clientY};\n state.currentRect = domRectToObj(el.getBoundingClientRect());\n const ie = interactableEvent({rect: state.currentRect!, e});\n\n // If there is a preview option, use it to render a custom preview image that will\n // appear under the pointer while dragging. If not, the element itself is dragged by the browser.\n if (preview?.current) {\n preview.current(draggable, node => {\n e.dataTransfer.setDragImage(node, 0, 0);\n });\n }\n\n dragSession.status = 'dragging';\n dragSession.dragTargetId = id;\n if (ref.current) {\n ref.current.dataset.dragging = 'true';\n }\n\n optionsRef.current.onDragStart?.(ie, draggable);\n\n // wait until next frame so changes made in \"onDragStart\" are reflected in drag monitors\n requestAnimationFrame(() => {\n notifyMonitors(m => m.onDragStart?.(ie, draggable));\n });\n\n // firefox does not provide clientX/clientY in \"onDrag\", need to listen for dragOver on window instead\n addGlobalListener(window, 'dragover', onDragOver, true);\n };\n\n const onDragOver = (e: React.DragEvent<HTMLElement> | DragEvent) => {\n e.preventDefault();\n\n if (!state.currentRect) return;\n\n const deltaX = e.clientX - state.lastPosition.x;\n const deltaY = e.clientY - state.lastPosition.y;\n\n const newRect = {\n ...state.currentRect,\n left: state.currentRect.left + deltaX,\n top: state.currentRect.top + deltaY,\n };\n\n const ie = interactableEvent({rect: newRect, e, deltaX, deltaY});\n\n const target = draggables.get(id);\n if (target) {\n optionsRef.current.onDragMove?.(ie, target);\n notifyMonitors(m => m.onDragMove?.(ie, target));\n }\n\n state.lastPosition = {x: e.clientX, y: e.clientY};\n state.currentRect = newRect;\n };\n\n const onDragEnd = (e: React.DragEvent<HTMLElement>) => {\n removeAllGlobalListeners();\n if (!state.currentRect) return;\n\n setActiveInteraction(null);\n if (emptyImage) {\n emptyImage.remove();\n }\n\n const ie = interactableEvent({rect: state.currentRect, e});\n\n const draggable = draggables.get(id);\n if (draggable) {\n optionsRef.current.onDragEnd?.(ie, draggable);\n notifyMonitors(m => m.onDragEnd?.(ie, draggable, dragSession!.status));\n }\n\n // wait a frame before clearing so monitors have a chance to use drag session status\n requestAnimationFrame(() => {\n dragSession.dragTargetId = undefined;\n dragSession.status = 'inactive';\n if (ref.current) {\n delete ref.current.dataset.dragging;\n }\n });\n };\n\n const draggableProps = {\n draggable: !disabled,\n onDragStart,\n onDragEnd,\n onPointerDown: (e: React.PointerEvent) => {\n state.clickedEl = e.target as HTMLElement;\n },\n };\n\n return {draggableProps, dragHandleRef};\n}\n\nlet emptyImage: HTMLImageElement | undefined;\nfunction hideNativeGhostImage(e: React.DragEvent) {\n if (!emptyImage) {\n emptyImage = new Image();\n // image needs to be in the dom to prevent \"globe\" icon in chrome\n document.body.append(emptyImage);\n emptyImage.src =\n 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n }\n\n e.dataTransfer.setDragImage(emptyImage, 0, 0);\n}\n","import {UploadedFile} from '@common/uploads/uploaded-file';\n\nexport async function* readFilesFromDataTransfer(dataTransfer: DataTransfer) {\n const entries: FileSystemEntry[] = [];\n\n // Pull out all entries before reading them, otherwise\n // some entries will be lost due to recursion with promises\n for (const item of dataTransfer.items) {\n if (item.kind === 'file') {\n const entry = item.webkitGetAsEntry();\n if (entry) {\n entries.push(entry);\n }\n }\n }\n\n for (const entry of entries) {\n if (entry.isFile) {\n if (entry.name === '.DS_Store') continue;\n const file = await getEntryFile(entry as FileSystemFileEntry);\n yield new UploadedFile(file, entry.fullPath);\n } else if (entry.isDirectory) {\n yield* getEntriesFromDirectory(entry as FileSystemDirectoryEntry);\n }\n }\n}\n\nasync function* getEntriesFromDirectory(\n item: FileSystemDirectoryEntry\n): AsyncIterable<any> {\n const reader = item.createReader();\n\n // We must call readEntries repeatedly because there may be a limit to the\n // number of entries that are returned at once.\n let entries: FileSystemEntry[];\n do {\n entries = await new Promise((resolve, reject) => {\n reader.readEntries(resolve, reject);\n });\n\n for (const entry of entries) {\n if (entry.isFile) {\n if (entry.name === '.DS_Store') continue;\n const file = await getEntryFile(entry as FileSystemFileEntry);\n yield new UploadedFile(file, entry.fullPath);\n } else if (entry.isDirectory) {\n yield* getEntriesFromDirectory(entry as FileSystemDirectoryEntry);\n }\n }\n } while (entries.length > 0);\n}\n\nfunction getEntryFile(entry: FileSystemFileEntry): Promise<File> {\n return new Promise((resolve, reject) => entry.file(resolve, reject));\n}\n","export async function asyncIterableToArray<T>(\n iterator: AsyncIterable<T>\n): Promise<T[]> {\n const items: T[] = [];\n for await (const item of iterator) {\n items.push(item);\n }\n return items;\n}\n","import React, {RefObject, useLayoutEffect, useRef} from 'react';\nimport {draggables, dragSession, droppables} from './drag-state';\nimport {readFilesFromDataTransfer} from './read-files-from-data-transfer';\nimport {asyncIterableToArray} from '@common/utils/array/async-iterable-to-array';\nimport {InteractableRect} from '../interactable-event';\nimport {DraggableId, MixedDraggable} from './use-draggable';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\n\nexport interface ConnectedDroppable {\n id: DraggableId;\n rect?: InteractableRect;\n disabled?: boolean;\n ref: RefObject<HTMLElement>;\n}\n\n// File dragged in from desktop\nexport interface NativeFileDraggable {\n type: 'nativeFile';\n el: null;\n ref: null;\n getData: () => Promise<UploadedFile[]>;\n}\n\ninterface UseDroppableProps<T extends HTMLElement> {\n id: DraggableId;\n disabled?: boolean;\n types: ('nativeFile' | string)[];\n ref: RefObject<T>;\n // this will fire dragEnter/dragLeave/dragOver events when same element is both draggable and drop target and dragging target over itself. Used for showing line previews before/after element during sort.\n allowDragEventsFromItself?: boolean;\n onDragEnter?: (target: MixedDraggable) => void;\n onDragLeave?: (target: MixedDraggable) => void;\n onDragOver?: (\n target: MixedDraggable,\n e: React.DragEvent<HTMLElement>\n ) => void;\n // Handler that is called after draggable is held over droppable for a period of time.\n // This typically opens the item so that the user can drop within it.\n onDropActivate?: (e: MixedDraggable) => void;\n onDrop?: (target: MixedDraggable) => void | Promise<void> | false;\n acceptsDrop?: (target: MixedDraggable) => boolean;\n}\n\ninterface DroppableState {\n dragOverElements: Set<Element>;\n dropActivateTimer: ReturnType<typeof setTimeout> | undefined;\n}\n\nconst DROP_ACTIVATE_TIMEOUT = 400;\n\nexport function useDroppable<T extends HTMLElement>({\n id,\n disabled,\n ref,\n ...options\n}: UseDroppableProps<T>) {\n const state = useRef<DroppableState>({\n dragOverElements: new Set<Element>(),\n dropActivateTimer: undefined,\n }).current;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useLayoutEffect(() => {\n droppables.set(id, {\n ...droppables.get(id),\n disabled,\n id,\n ref,\n });\n return () => {\n droppables.delete(id);\n };\n }, [id, optionsRef, disabled, ref]);\n\n // check if drop target accepts drag target\n const canDrop = (draggable: MixedDraggable): boolean => {\n const options = optionsRef.current;\n\n const allowEventsOnSelf =\n options.allowDragEventsFromItself ||\n ref.current !== draggable.ref?.current;\n\n return !!(\n draggable?.type &&\n allowEventsOnSelf &&\n options.types.includes(draggable.type) &&\n (!options.acceptsDrop || options.acceptsDrop(draggable))\n );\n };\n\n const fireDragLeave = (e: React.DragEvent<HTMLElement>) => {\n const draggable = getDraggable(e);\n if (draggable) {\n optionsRef.current.onDragLeave?.(draggable);\n }\n };\n\n const onDragEnter = (e: React.DragEvent<HTMLElement>) => {\n e.stopPropagation();\n\n state.dragOverElements.add(e.target as Element);\n if (state.dragOverElements.size > 1) {\n return;\n }\n\n const draggable = getDraggable(e);\n if (draggable && canDrop(draggable)) {\n optionsRef.current.onDragEnter?.(draggable);\n\n clearTimeout(state.dropActivateTimer);\n if (typeof optionsRef.current.onDropActivate === 'function') {\n state.dropActivateTimer = setTimeout(() => {\n if (draggable) {\n optionsRef.current.onDropActivate?.(draggable);\n }\n }, DROP_ACTIVATE_TIMEOUT);\n }\n }\n };\n\n const onDragLeave = (e: React.DragEvent<HTMLElement>) => {\n e.stopPropagation();\n\n // Track all the targets of dragenter events in a set, and remove them\n // in dragleave. When the set becomes empty, we've left the drop target completely.\n // We must also remove any elements that are no longer in the DOM, because dragleave\n // events will never be fired for these. This can happen, for example, with drop\n // indicators between items, which disappear when the drop target changes.\n state.dragOverElements.delete(e.target as Element);\n for (const element of state.dragOverElements) {\n if (!e.currentTarget.contains(element)) {\n state.dragOverElements.delete(element);\n }\n }\n\n if (state.dragOverElements.size > 0) {\n return;\n }\n\n const draggable = getDraggable(e);\n if (draggable && canDrop(draggable)) {\n fireDragLeave(e);\n clearTimeout(state.dropActivateTimer);\n }\n };\n\n const onDrop = async (e: React.DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n state.dragOverElements.clear();\n\n fireDragLeave(e);\n clearTimeout(state.dropActivateTimer);\n\n const draggable = getDraggable(e);\n if (draggable) {\n optionsRef.current.onDragLeave?.(draggable);\n\n // drop target does not accept this type of droppable\n if (!canDrop(draggable)) {\n if (dragSession.status !== 'inactive') {\n dragSession.status = 'dropFail';\n }\n // drop target accepts this type, but it might still reject the drop in callback\n } else {\n // allow callback to mark drop as failed\n const dropResult = optionsRef.current.onDrop?.(draggable);\n\n // drag session will only be active for draggables within the app, never for files dragged in from desktop\n if (dragSession.status !== 'inactive') {\n dragSession.status =\n dropResult === false ? 'dropFail' : 'dropSuccess';\n }\n }\n }\n };\n\n const droppableProps = {\n onDragOver: (e: React.DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const draggable = getDraggable(e);\n if (draggable && canDrop(draggable)) {\n optionsRef.current.onDragOver?.(draggable, e);\n }\n },\n onDragEnter,\n onDragLeave,\n onDrop,\n };\n\n return {\n droppableProps: disabled ? {} : droppableProps,\n };\n}\n\nfunction getDraggable(\n e: React.DragEvent<HTMLElement>\n): MixedDraggable | undefined {\n if (dragSession.dragTargetId != null) {\n return draggables.get(dragSession.dragTargetId);\n } else if (e.dataTransfer.types.includes('Files')) {\n return {\n type: 'nativeFile',\n el: null,\n ref: null,\n getData: () => {\n return asyncIterableToArray(readFilesFromDataTransfer(e.dataTransfer));\n },\n };\n }\n}\n","import {\n DropPosition,\n SortSession,\n} from '@common/ui/interactions/dnd/sortable/use-sortable';\nimport {SortableStrategy} from '@common/ui/interactions/dnd/sortable/sortable-strategy';\nimport {droppables} from '@common/ui/interactions/dnd/drag-state';\n\nexport const sortableLineStrategy: SortableStrategy = {\n onDragStart: () => {},\n onDragEnter: () => {},\n onDragOver: ({e, ref, item, sortSession, onDropPositionChange}) => {\n const previousPosition = sortSession.dropPosition;\n let newPosition: DropPosition = null;\n\n const rect = droppables.get(item)?.rect;\n if (rect) {\n const midY = rect.top + rect.height / 2;\n if (e.clientY <= midY) {\n newPosition = 'before';\n } else if (e.clientY >= midY) {\n newPosition = 'after';\n }\n }\n\n if (newPosition !== previousPosition) {\n const overIndex = sortSession.sortables.indexOf(item);\n sortSession.dropPosition = newPosition;\n onDropPositionChange?.(sortSession.dropPosition);\n\n clearLinePreview(sortSession);\n if (ref.current) {\n if (sortSession.dropPosition === 'after') {\n addLinePreview(ref.current, 'bottom', sortSession);\n } else {\n // if it's the first row, add preview to the top border, as there's no previous element\n if (overIndex === 0) {\n addLinePreview(ref.current, 'top', sortSession);\n // otherwise add preview to the bottom border of the previous row\n } else {\n const droppableId = sortSession.sortables[overIndex - 1];\n const droppable = droppables.get(droppableId);\n if (droppable?.ref.current) {\n addLinePreview(droppable.ref.current, 'bottom', sortSession);\n }\n }\n }\n }\n\n const itemIndex = sortSession.sortables.indexOf(item);\n\n // don't move item at all if hovering over itself\n if (sortSession.activeIndex === itemIndex) {\n sortSession.finalIndex = sortSession.activeIndex;\n return;\n }\n\n // adjust final drop index based on whether we're dropping drag target after or before it's original index\n // this is needed, so we get the same index if target is dropped after current item or before next item\n const dragDirection =\n overIndex > sortSession.activeIndex ? 'after' : 'before';\n if (dragDirection === 'after') {\n sortSession.finalIndex =\n sortSession.dropPosition === 'before' ? itemIndex - 1 : itemIndex;\n } else {\n sortSession.finalIndex =\n sortSession.dropPosition === 'after' ? itemIndex + 1 : itemIndex;\n }\n }\n },\n onDragEnd: sortSession => {\n clearLinePreview(sortSession);\n },\n};\n\nfunction clearLinePreview(sortSession: SortSession) {\n if (sortSession?.linePreviewEl) {\n sortSession.linePreviewEl.style.borderBottomColor = '';\n sortSession.linePreviewEl.style.borderTopColor = '';\n sortSession.linePreviewEl = undefined;\n }\n}\n\nfunction addLinePreview(\n el: HTMLElement,\n side: 'top' | 'bottom',\n sortSession: SortSession,\n) {\n const color = 'rgb(var(--be-primary))';\n if (side === 'top') {\n el.style.borderTopColor = color;\n } else {\n el.style.borderBottomColor = color;\n }\n if (sortSession) {\n sortSession.linePreviewEl = el;\n }\n}\n","import {clamp} from '../number/clamp';\n\nexport function moveItemInArray<T = any>(\n array: T[],\n fromIndex: number,\n toIndex: number\n): T[] {\n const from = clamp(fromIndex, 0, array.length - 1);\n const to = clamp(toIndex, 0, array.length - 1);\n\n if (from === to) {\n return array;\n }\n\n const target = array[from];\n const delta = to < from ? -1 : 1;\n\n for (let i = from; i !== to; i += delta) {\n array[i] = array[i + delta];\n }\n\n array[to] = target;\n\n return array;\n}\n","export function moveItemInNewArray<T>(\n array: T[],\n from: number,\n to: number\n): T[] {\n const newArray = array.slice();\n newArray.splice(\n to < 0 ? newArray.length + to : to,\n 0,\n newArray.splice(from, 1)[0]\n );\n\n return newArray;\n}\n","import {moveItemInArray} from '@common/utils/array/move-item-in-array';\nimport {droppables} from '@common/ui/interactions/dnd/drag-state';\nimport {moveItemInNewArray} from '@common/utils/array/move-item-in-new-array';\nimport type {SortSession} from '@common/ui/interactions/dnd/sortable/use-sortable';\nimport type {SortableStrategy} from '@common/ui/interactions/dnd/sortable/sortable-strategy';\n\nconst transition = 'transform 0.2s cubic-bezier(0.2, 0, 0, 1)';\n\nexport const sortableTransformStrategy: SortableStrategy = {\n onDragStart: sortSession => {\n sortSession.sortables.forEach((sortable, index) => {\n const droppable = droppables.get(sortable);\n if (!droppable?.ref.current) return;\n\n droppable.ref.current.style.transition = transition;\n\n if (sortSession?.activeIndex === index) {\n droppable.ref.current.style.opacity = '0.4';\n }\n });\n },\n onDragEnter: (\n sortSession: SortSession,\n overIndex: number,\n currentIndex: number,\n ) => {\n moveItemInArray(sortSession.sortables, currentIndex, overIndex);\n const rects = sortSession.sortables.map(s => droppables.get(s)?.rect);\n\n sortSession.sortables.forEach((sortable, index) => {\n if (!sortSession) return;\n\n const newRects = moveItemInNewArray(\n rects,\n overIndex,\n sortSession.activeIndex,\n );\n const oldRect = rects[index];\n const newRect = newRects[index];\n const sortableTarget = droppables.get(sortable);\n\n if (sortableTarget?.ref.current && newRect && oldRect) {\n const x = newRect.left - oldRect.left;\n const y = newRect.top - oldRect.top;\n sortableTarget.ref.current.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n }\n });\n\n sortSession.finalIndex = overIndex;\n },\n onDragOver: () => {},\n onDragEnd: sortSession => {\n // clear any styles and transforms applied to sortables during sorting\n sortSession.sortables.forEach(sortable => {\n const droppable = droppables.get(sortable);\n if (droppable?.ref.current) {\n droppable.ref.current.style.transform = '';\n droppable.ref.current.style.transition = '';\n droppable.ref.current.style.opacity = '';\n droppable.ref.current.style.zIndex = '';\n }\n });\n },\n};\n","import {moveItemInArray} from '@common/utils/array/move-item-in-array';\nimport {droppables} from '@common/ui/interactions/dnd/drag-state';\nimport {SortableStrategy} from '@common/ui/interactions/dnd/sortable/sortable-strategy';\n\nexport const sortableMoveNodeStrategy: SortableStrategy = {\n onDragStart: () => {},\n onDragOver: () => {},\n onDragEnter: (sortSession, overIndex: number, currentIndex: number) => {\n const node = droppables.get(sortSession.sortables[currentIndex])?.ref\n .current;\n if (node) {\n moveNode(node, currentIndex, overIndex);\n moveItemInArray(sortSession.sortables, currentIndex, overIndex);\n sortSession.finalIndex = overIndex;\n }\n },\n onDragEnd: () => {},\n};\n\nfunction moveNode(el: HTMLElement, currentIndex: number, newIndex: number) {\n const parentEl = el.parentElement!;\n if (newIndex < 0) {\n parentEl.prepend(el);\n } else {\n // if parent already contains this node, and we're changing\n // node's index within parent, need to adjust index by one\n if (currentIndex > -1 && currentIndex <= newIndex) {\n newIndex++;\n }\n const ref = parentEl.children.item(newIndex);\n if (ref) {\n ref.before(el);\n } else {\n parentEl.append(el);\n }\n }\n}\n","import {DraggableId, DragPreviewRenderer, useDraggable} from '../use-draggable';\nimport {useDroppable} from '../use-droppable';\nimport {RefObject, useEffect} from 'react';\nimport {getScrollParent, mergeProps} from '@react-aria/utils';\nimport {droppables} from '../drag-state';\nimport {updateRects} from '@common/ui/interactions/dnd/update-rects';\nimport {sortableLineStrategy} from '@common/ui/interactions/dnd/sortable/sortable-line-strategy';\nimport {sortableTransformStrategy} from '@common/ui/interactions/dnd/sortable/sortable-transform-strategy';\nimport {sortableMoveNodeStrategy} from '@common/ui/interactions/dnd/sortable/sortable-move-node-strategy';\nimport {SortableStrategy} from '@common/ui/interactions/dnd/sortable/sortable-strategy';\n\nexport interface SortSession {\n // items in this list will be moved when user is sorting\n sortables: DraggableId[];\n\n // sortable user started dragging to start this session\n activeSortable: DraggableId;\n activeIndex: number;\n\n // final index sortable was dropped in and should be moved to\n finalIndex: number;\n\n // drop position for displaying line preview\n dropPosition: DropPosition;\n // element that currently has a line preview at the top or bottom\n linePreviewEl?: HTMLElement;\n scrollParent?: Element;\n scrollListener: () => void;\n ref: RefObject<HTMLElement>;\n}\n\nlet sortSession: null | SortSession = null;\n\nexport type DropPosition = 'before' | 'after' | null;\n\ntype StrategyName = 'line' | 'liveSort' | 'moveNode';\n\nconst strategies: Record<StrategyName, SortableStrategy> = {\n line: sortableLineStrategy,\n liveSort: sortableTransformStrategy,\n moveNode: sortableMoveNodeStrategy,\n};\n\nexport interface UseSortableProps {\n item: DraggableId;\n items: DraggableId[];\n onSortStart?: () => void;\n onSortEnd?: (oldIndex: number, newIndex: number) => void;\n onDragEnd?: () => void;\n onDropPositionChange?: (dropPosition: DropPosition) => void;\n ref: RefObject<HTMLElement>;\n type: string;\n preview?: RefObject<DragPreviewRenderer>;\n strategy?: StrategyName;\n disabled?: boolean;\n}\nexport function useSortable({\n item,\n items,\n type,\n ref,\n onSortEnd,\n onSortStart,\n onDragEnd,\n preview,\n disabled,\n onDropPositionChange,\n strategy = 'liveSort',\n}: UseSortableProps) {\n // todo: issue with sorting after scrolling menu editor item list\n\n // update sortables and active index, in case we lazy load more items while sorting\n useEffect(() => {\n if (sortSession && sortSession.sortables.length !== items.length) {\n sortSession.sortables = [...items];\n sortSession.activeIndex = items.indexOf(item);\n }\n }, [items, item]);\n\n const {draggableProps, dragHandleRef} = useDraggable({\n id: item,\n ref,\n type,\n preview,\n disabled,\n onDragStart: () => {\n sortSession = {\n sortables: [...items],\n activeSortable: item,\n activeIndex: items.indexOf(item),\n finalIndex: items.indexOf(item),\n dropPosition: null,\n ref,\n scrollParent: ref.current ? getScrollParent(ref.current) : undefined,\n scrollListener: () => {\n updateRects(droppables);\n },\n };\n strategies[strategy].onDragStart(sortSession);\n\n onSortStart?.();\n sortSession.scrollParent?.addEventListener(\n 'scroll',\n sortSession.scrollListener,\n );\n },\n onDragEnd: () => {\n if (!sortSession) return;\n\n sortSession.dropPosition = null;\n onDropPositionChange?.(sortSession.dropPosition);\n if (sortSession.activeIndex !== sortSession.finalIndex) {\n onSortEnd?.(sortSession.activeIndex, sortSession.finalIndex);\n }\n sortSession.scrollParent?.removeEventListener(\n 'scroll',\n sortSession.scrollListener,\n );\n strategies[strategy].onDragEnd(sortSession);\n // call \"onDragEnd\" after \"onSortEnd\", so listener has a chance to use sort session data\n onDragEnd?.();\n sortSession = null;\n },\n getData: () => {},\n });\n\n const {droppableProps} = useDroppable({\n id: item,\n ref,\n types: [type],\n disabled,\n allowDragEventsFromItself: true,\n onDragOver: (target, e) => {\n if (!sortSession) return;\n strategies[strategy].onDragOver({\n e,\n ref,\n item,\n sortSession,\n onDropPositionChange,\n });\n },\n onDragEnter: () => {\n if (!sortSession) return;\n const overIndex = sortSession.sortables.indexOf(item);\n const oldIndex = sortSession.sortables.indexOf(\n sortSession.activeSortable,\n );\n strategies[strategy].onDragEnter(sortSession, overIndex, oldIndex);\n },\n onDragLeave: () => {\n if (!sortSession) return;\n sortSession.dropPosition = null;\n onDropPositionChange?.(sortSession.dropPosition);\n },\n });\n\n return {\n sortableProps: {...mergeProps(draggableProps, droppableProps)},\n dragHandleRef,\n };\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TuneIcon = createSvgIcon(\n <path d=\"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z\" />\n, 'TuneOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MoreVertIcon = createSvgIcon(\n <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n, 'MoreVertOutlined');\n","import React, {RefObject} from 'react';\n\nexport interface TabsContext {\n selectedTab: number;\n setSelectedTab: (newTab: number) => void;\n tabsRef: RefObject<HTMLElement[]>;\n size: 'sm' | 'md';\n isLazy?: boolean;\n id: string;\n}\n\nexport const TabContext = React.createContext<TabsContext>(null!);\n","import React, {ReactElement, useId, useMemo, useRef} from 'react';\nimport clsx from 'clsx';\nimport {useControlledState} from '@react-stately/utils';\nimport {TabContext, TabsContext} from './tabs-context';\nimport {TabListProps} from './tab-list';\nimport {TabPanelsProps} from './tab-panels';\n\nexport interface TabsProps {\n children: [ReactElement<TabListProps>, ReactElement<TabPanelsProps>];\n size?: 'sm' | 'md';\n className?: string;\n selectedTab?: number;\n defaultSelectedTab?: number;\n onTabChange?: (newTab: number) => void;\n isLazy?: boolean;\n overflow?: string;\n}\n\nexport function Tabs(props: TabsProps) {\n const {\n size = 'md',\n children,\n className,\n isLazy,\n overflow = 'overflow-hidden',\n } = props;\n\n const tabsRef = useRef<HTMLButtonElement[]>([]);\n const id = useId();\n\n const [selectedTab, setSelectedTab] = useControlledState(\n props.selectedTab,\n props.defaultSelectedTab || 0,\n props.onTabChange\n );\n\n const ContextValue: TabsContext = useMemo(() => {\n return {\n selectedTab,\n setSelectedTab,\n tabsRef,\n size,\n isLazy,\n id,\n };\n }, [selectedTab, id, isLazy, setSelectedTab, size]);\n\n return (\n <TabContext.Provider value={ContextValue}>\n <div className={clsx(className, overflow, 'max-w-full')}>{children}</div>\n </TabContext.Provider>\n );\n}\n","import React, {useContext, useState} from 'react';\nimport {useLayoutEffect} from '@react-aria/utils';\nimport clsx from 'clsx';\nimport {TabContext} from './tabs-context';\n\ninterface TabLineStyle {\n width?: string;\n transform?: string;\n className?: string;\n}\n\nexport function TabLine() {\n const {tabsRef, selectedTab} = useContext(TabContext);\n const [style, setStyle] = useState<TabLineStyle>({\n width: undefined,\n transform: undefined,\n className: undefined,\n });\n\n useLayoutEffect(() => {\n if (selectedTab != null && tabsRef.current) {\n const el = tabsRef.current[selectedTab];\n if (!el) return;\n\n setStyle(prevState => {\n return {\n width: `${el.offsetWidth}px`,\n transform: `translateX(${el.offsetLeft}px)`,\n // disable initial transition for tabline\n className: prevState.width === undefined ? '' : 'transition-all',\n };\n });\n }\n }, [setStyle, selectedTab, tabsRef]);\n\n return (\n <div\n className={clsx(\n 'absolute bottom-0 left-0 h-2 bg-primary',\n style.className\n )}\n role=\"presentation\"\n style={{width: style.width, transform: style.transform}}\n />\n );\n}\n","import React, {Children, cloneElement, isValidElement, ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {FocusScope} from '@react-aria/focus';\nimport {TabProps} from './tab';\nimport {TabLine} from './tab-line';\n\nexport interface TabListProps {\n children: ReactNode;\n // center tabs within tablist\n center?: boolean;\n // expand tabs to fill in tablist space fully. By default, tabs are only as wide as their content.\n expand?: boolean;\n className?: string;\n}\nexport function TabList({children, center, expand, className}: TabListProps) {\n const childrenArray = Children.toArray(children);\n\n return (\n <FocusScope>\n <div\n className={clsx(\n // hide scrollbar completely on mobile, show compact one on desktop\n 'flex relative max-w-full overflow-auto border-b max-sm:hidden-scrollbar md:compact-scrollbar',\n className\n )}\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n >\n {childrenArray.map((child, index) => {\n if (isValidElement<TabProps>(child)) {\n return cloneElement<TabProps>(child, {\n index,\n className: clsx(\n child.props.className,\n expand && 'flex-auto',\n center && index === 0 && 'ml-auto',\n center && index === childrenArray.length - 1 && 'mr-auto'\n ),\n });\n }\n return null;\n })}\n <TabLine />\n </div>\n </FocusScope>\n );\n}\n","import React, {JSXElementConstructor, ReactNode, useContext} from 'react';\nimport clsx from 'clsx';\nimport {useFocusManager} from '@react-aria/focus';\nimport {TabContext} from './tabs-context';\nimport {LinkProps} from 'react-router-dom';\n\nexport interface TabProps {\n className?: string;\n index?: number;\n children: ReactNode;\n isDisabled?: boolean;\n padding?: string;\n elementType?: 'button' | 'a' | JSXElementConstructor<any>;\n to?: LinkProps['to'];\n relative?: LinkProps['relative'];\n replace?: LinkProps['replace'];\n width?: string;\n}\nexport function Tab({\n index,\n className,\n isDisabled,\n children,\n padding: paddingProp,\n elementType = 'button',\n to,\n relative,\n width = 'min-w-min',\n}: TabProps) {\n const {\n selectedTab,\n setSelectedTab,\n tabsRef,\n size = 'md',\n id,\n } = useContext(TabContext);\n const isSelected = index === selectedTab;\n const focusManager = useFocusManager();\n const padding = paddingProp || (size === 'sm' ? 'px-12' : 'px-18');\n\n const mergedClassname = clsx(\n 'tracking-wide overflow-hidden capitalize text-sm flex items-center justify-center outline-none transition-colors',\n 'focus-visible:ring focus-visible:ring-2 ring-inset rounded whitespace-nowrap cursor-pointer',\n width,\n textColor({isDisabled, isSelected}),\n className,\n size === 'md' && `${padding} h-48`,\n size === 'sm' && `${padding} h-32`,\n isDisabled && 'pointer-events-none',\n );\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (e.key) {\n case 'ArrowLeft':\n focusManager?.focusPrevious();\n break;\n case 'ArrowRight':\n focusManager?.focusNext();\n break;\n case 'Home':\n focusManager?.focusFirst();\n break;\n case 'End':\n focusManager?.focusLast();\n break;\n }\n };\n\n const tabIndex = isSelected ? 0 : -1;\n const Element = elementType;\n\n return (\n <Element\n disabled={isDisabled}\n id={`${id}-${index}-tab`}\n aria-controls={`${id}-${index}-tabpanel`}\n type=\"button\"\n role=\"tab\"\n aria-selected={isSelected}\n tabIndex={isDisabled ? undefined : tabIndex}\n onKeyDown={onKeyDown}\n onClick={() => {\n setSelectedTab(index!);\n }}\n to={to}\n relative={relative}\n className={mergedClassname}\n ref={(el: HTMLElement) => {\n if (tabsRef.current && el) {\n tabsRef.current[index!] = el;\n }\n }}\n >\n {children}\n </Element>\n );\n}\n\ninterface TextColorProps {\n isDisabled?: boolean;\n isSelected: boolean;\n}\nfunction textColor({isDisabled, isSelected}: TextColorProps): string {\n if (isDisabled) {\n return 'text-disabled cursor-default';\n }\n if (isSelected) {\n return 'text-primary';\n }\n return 'text-muted hover:text-main';\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DragHandleIcon = createSvgIcon(\n <path d=\"M20 9H4v2h16V9zM4 15h16v-2H4v2z\" />\n, 'DragHandleOutlined');\n","import {createPortal, flushSync} from 'react-dom';\nimport React, {useImperativeHandle, useRef, useState} from 'react';\nimport {ConnectedDraggable, DragPreviewRenderer} from './use-draggable';\nimport {rootEl} from '@common/core/root-el';\n\nexport interface DragPreviewProps {\n children: (draggable: ConnectedDraggable) => JSX.Element;\n}\nexport const DragPreview = React.forwardRef<\n DragPreviewRenderer,\n DragPreviewProps\n>((props, ref) => {\n const render = props.children;\n const [children, setChildren] = useState<JSX.Element | null>(null);\n const domRef = useRef<HTMLDivElement>(null!);\n\n useImperativeHandle(\n ref,\n () =>\n (\n draggable: ConnectedDraggable,\n callback: (node: HTMLElement) => void,\n ) => {\n // This will be called during the onDragStart event by useDrag. We need to render the\n // preview synchronously before this event returns, so we can call event.dataTransfer.setDragImage.\n flushSync(() => {\n setChildren(render(draggable));\n });\n\n // Yield back to useDrag to set the drag image.\n callback(domRef.current);\n\n // Remove the preview from the DOM after a frame so the browser has time to paint.\n requestAnimationFrame(() => {\n setChildren(null);\n });\n },\n [render],\n );\n\n if (!children) {\n return null;\n }\n\n // portal preview, in case in needs to be used in <tr> or another element that does not accept div as child\n return createPortal(\n <div\n style={{zIndex: -100, position: 'absolute', top: 0, left: -100000}}\n ref={domRef}\n >\n {children}\n </div>,\n rootEl,\n );\n});\n","import {useCallback, useRef, useState} from 'react';\n\nexport function useStickySentinel() {\n const [isSticky, setIsSticky] = useState(false);\n\n const observerRef = useRef<IntersectionObserver>();\n\n const sentinelRef = useCallback((sentinel: HTMLDivElement | null) => {\n if (sentinel) {\n const observer = new IntersectionObserver(\n ([e]) => setIsSticky(e.intersectionRatio < 1),\n {threshold: [1]}\n );\n observerRef.current = observer;\n observer.observe(sentinel);\n } else if (observerRef.current) {\n observerRef.current?.disconnect();\n }\n }, []);\n\n return {isSticky, sentinelRef};\n}\n","import {FieldValues, SubmitHandler, UseFormReturn} from 'react-hook-form';\nimport clsx from 'clsx';\nimport React, {ReactNode} from 'react';\nimport {useStickySentinel} from '../utils/hooks/sticky-sentinel';\nimport {Form} from '../ui/forms/form';\nimport {Button} from '../ui/buttons/button';\nimport {Trans} from '../i18n/trans';\n\ninterface Props<T extends FieldValues> {\n onSubmit: SubmitHandler<T>;\n form: UseFormReturn<T>;\n title: ReactNode;\n subTitle?: ReactNode;\n isLoading: boolean;\n children: ReactNode;\n actions?: ReactNode;\n backButton?: ReactNode;\n disableSaveWhenNotDirty?: boolean;\n wrapInContainer?: boolean;\n}\nexport function CrupdateResourceLayout<T extends FieldValues>({\n onSubmit,\n form,\n title,\n subTitle,\n children,\n actions,\n backButton,\n isLoading = false,\n disableSaveWhenNotDirty = false,\n wrapInContainer = true,\n}: Props<T>) {\n const {isSticky, sentinelRef} = useStickySentinel();\n const isDirty = !disableSaveWhenNotDirty\n ? true\n : Object.keys(form.formState.dirtyFields).length;\n\n return (\n <Form\n onSubmit={onSubmit}\n onBeforeSubmit={() => form.clearErrors()}\n form={form}\n >\n <div ref={sentinelRef} />\n <div\n className={clsx(\n 'sticky top-0 z-10 my-12 transition-shadow md:my-24',\n isSticky && 'bg shadow',\n )}\n >\n <div\n className={clsx(\n 'flex items-center gap-24 py-14 md:items-start',\n wrapInContainer && 'container mx-auto px-24',\n )}\n >\n {backButton}\n <div className=\"overflow-hidden overflow-ellipsis md:mr-64\">\n <h1 className=\"overflow-hidden overflow-ellipsis whitespace-nowrap text-xl md:text-3xl\">\n {title}\n </h1>\n {subTitle && <div className=\"mt-4\">{subTitle}</div>}\n </div>\n <div className=\"mr-auto\"></div>\n {actions}\n <Button\n variant=\"flat\"\n color=\"primary\"\n type=\"submit\"\n disabled={isLoading || !isDirty}\n >\n <Trans message=\"Save\" />\n </Button>\n </div>\n </div>\n <div\n className={\n wrapInContainer ? 'container mx-auto px-24 pb-24' : undefined\n }\n >\n <div className=\"rounded\">{children}</div>\n </div>\n </Form>\n );\n}\n","import React from 'react';\nimport {useDialogContext} from './dialog-context';\nimport {Dialog} from './dialog';\nimport {DialogBody} from './dialog-body';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {KeyboardArrowLeftIcon} from '@common/icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport {useControlledState} from '@react-stately/utils';\n\ninterface Props {\n image?: string;\n images?: string[];\n activeIndex?: number;\n onActiveIndexChange?: (index: number) => void;\n defaultActiveIndex?: number;\n}\nexport function ImageZoomDialog(props: Props) {\n const {close} = useDialogContext();\n const {image, images} = props;\n const [activeIndex, setActiveIndex] = useControlledState(\n props.activeIndex,\n props.defaultActiveIndex,\n props.onActiveIndexChange,\n );\n const src = image || images?.[activeIndex];\n\n return (\n <Dialog size=\"fullscreenTakeover\" background=\"bg-black/80\">\n <DialogBody padding=\"p-0\" className=\"h-full w-full\">\n <IconButton\n size=\"lg\"\n color=\"paper\"\n className=\"absolute right-0 top-0 z-20 text-white\"\n onClick={() => {\n close();\n }}\n >\n <CloseIcon />\n </IconButton>\n <div className=\"relative flex h-full w-full items-center justify-center p-40\">\n {images?.length ? (\n <IconButton\n size=\"lg\"\n color=\"white\"\n variant=\"flat\"\n className=\"absolute bottom-0 left-20 top-0 my-auto\"\n disabled={activeIndex < 1}\n onClick={() => {\n setActiveIndex(activeIndex - 1);\n }}\n >\n <KeyboardArrowLeftIcon />\n </IconButton>\n ) : null}\n <img\n src={src}\n alt=\"\"\n className=\"max-h-full w-auto object-contain shadow\"\n />\n {images?.length ? (\n <IconButton\n size=\"lg\"\n color=\"white\"\n variant=\"flat\"\n className=\"absolute bottom-0 right-20 top-0 my-auto\"\n disabled={activeIndex + 1 === images?.length}\n onClick={() => {\n setActiveIndex(activeIndex + 1);\n }}\n >\n <KeyboardArrowRightIcon />\n </IconButton>\n ) : null}\n </div>\n </DialogBody>\n </Dialog>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ChevronLeftIcon = createSvgIcon(\n <path d=\"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12l4.58-4.59z\" />\n, 'ChevronLeftOutlined');\n","export default \"__VITE_ASSET__ceea0447__\"","import {Channel} from '@common/channels/channel';\nimport {useParams, useSearchParams} from 'react-router-dom';\nimport {useBackendFilterUrlParams} from '@common/datatable/filters/backend-filter-url-params';\nimport {BackendFiltersUrlKey} from '@common/datatable/filters/backend-filters-url-key';\n\nexport function useChannelQueryParams(\n channel?: Channel,\n userParams?: Record<string, string | null> | null,\n): Record<string, string | number | null> {\n const params = useParams();\n const [searchParams] = useSearchParams();\n const {encodedFilters} = useBackendFilterUrlParams();\n\n const queryParams = {\n ...userParams,\n restriction: params.restriction || '',\n order: searchParams.get('order'),\n [BackendFiltersUrlKey]: encodedFilters,\n };\n\n // always set default channel order to keep query key stable\n if (!queryParams.order && channel) {\n queryParams.order = channel.config.contentOrder || 'popularity:desc';\n }\n\n return queryParams;\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useParams} from 'react-router-dom';\nimport {Channel} from '@common/channels/channel';\nimport {useChannelQueryParams} from '@common/channels/use-channel-query-params';\nimport {isSsr} from '@common/utils/dom/is-ssr';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nexport interface GetChannelResponse extends BackendResponse {\n channel: Channel;\n}\n\nexport function useChannel(\n slugOrId: string | number | undefined,\n loader: 'channelPage' | 'editChannelPage' | 'editUserListPage',\n userParams?: Record<string, string | null>,\n) {\n const params = useParams();\n const channelId = slugOrId || params.slugOrId!;\n const queryParams = useChannelQueryParams(undefined, userParams);\n return useQuery({\n // only refetch when channel ID or restriction changes and not query params.\n // content will be re-fetched in channel content components\n // on SSR use query params as well, to avoid caching wrong data when query params change\n queryKey: isSsr()\n ? channelQueryKey(channelId, queryParams)\n : channelQueryKey(channelId, {restriction: queryParams.restriction}),\n\n queryFn: () => fetchChannel(channelId, {...queryParams, loader}),\n initialData: () => {\n // @ts-ignore\n const data = getBootstrapData().loaders?.[loader];\n const isSameChannel =\n data?.channel.id == channelId || data?.channel.slug == channelId;\n const isSameRestriction =\n !queryParams.restriction ||\n data?.channel.restriction?.name === queryParams.restriction;\n if (isSameChannel && isSameRestriction) {\n return data;\n }\n },\n });\n}\n\nexport function channelQueryKey(\n slugOrId: number | string,\n params?: Record<string, string | number | null>,\n) {\n const key: any[] = ['channel', `${slugOrId}`];\n if (params) {\n key.push(params);\n }\n return key;\n}\n\nexport function channelEndpoint(slugOrId: number | string) {\n return `channel/${slugOrId}`;\n}\n\nfunction fetchChannel(\n slugOrId: number | string,\n params: Record<string, string | number | undefined | null> = {},\n): Promise<GetChannelResponse> {\n return apiClient\n .get(channelEndpoint(slugOrId), {params})\n .then(response => response.data);\n}\n","import {Video} from './video';\nimport {TitleImage} from './title-image';\nimport {Episode} from './episode';\nimport {Season} from './season';\nimport {Review} from './review';\nimport {Genre} from '@app/titles/models/genre';\nimport {Keyword} from '@app/titles/models/keyword';\nimport {ProductionCountry} from '@app/titles/models/production-country';\nimport {Person} from '@app/titles/models/person';\n\nexport interface EpisodeCredit extends Episode {\n pivot: TitleCreditPivot;\n}\n\nexport interface TitleCredit extends Person {\n pivot: TitleCreditPivot;\n}\n\nexport interface PersonCredit extends Title {\n credited_episode_count?: number;\n episodes: EpisodeCredit[];\n pivot: TitleCreditPivot;\n}\n\nexport interface TitleCreditPivot {\n id: number;\n job: string;\n department: 'directing' | 'writing' | 'actors' | 'creators';\n character: string;\n}\n\nexport const TITLE_MODEL = 'title';\nexport const MOVIE_MODEL = 'movie';\nexport const SERIES_MODEL = 'series';\n\nexport interface Title {\n id: number;\n name: string;\n original_title: string;\n model_type: typeof TITLE_MODEL;\n is_series: boolean;\n status: 'released' | 'upcoming' | 'ongoing' | 'ended';\n description: string;\n tagline: string;\n runtime: number;\n rating: number;\n budget: number;\n poster?: string;\n backdrop: string;\n revenue: number;\n views: number;\n popularity: number;\n seasons_count: number;\n release_date: string;\n year: number;\n genres: Genre[];\n keywords: Keyword[];\n production_countries: ProductionCountry[];\n videos: Video[];\n all_videos?: Video[];\n primary_video: Video;\n primary_video_count?: number;\n certification?: string;\n images: TitleImage[];\n season?: Season;\n seasons?: Season[];\n reviews?: Review[];\n language: string;\n updated_at?: string;\n}\n","export const NEWS_ARTICLE_MODEL = 'newsArticle';\n\nexport interface NewsArticle {\n id: number;\n title?: string;\n body: string;\n slug: string;\n image: string;\n byline?: string;\n source?: string;\n source_url?: string;\n model_type: typeof NEWS_ARTICLE_MODEL;\n created_at?: string;\n updated_at?: string;\n}\n","import {PaginationResponse} from '@common/http/backend-response/pagination-response';\nimport {User} from '@common/auth/user';\n\nexport const CHANNEL_MODEL = 'channel';\n\nexport type ChannelContentItem<T = unknown> = T & {\n channelable_id?: number;\n channelable_order?: number;\n};\n\nexport interface ChannelConfig {\n autoUpdateMethod?: string;\n autoUpdateProvider?: string;\n disablePagination?: boolean;\n disablePlayback?: boolean;\n restriction?: string;\n restrictionModelId?: 'urlParam' | number;\n contentModel: string;\n contentType: 'listAll' | 'manual' | 'autoUpdate';\n contentOrder: string;\n // layout user selected manually, it's stored in a cookie and set as this\n // prop in channel controller so there are no mismatches during SSR\n selectedLayout?: string;\n layout: string;\n nestedLayout: string;\n hideTitle?: boolean;\n lockSlug?: boolean;\n preventDeletion?: boolean;\n actions?: {tooltip: string; icon: string; route: string}[];\n adminDescription?: string;\n paginationType?: 'infiniteScroll' | 'lengthAware' | 'simple';\n}\n\nexport interface Channel<T = ChannelContentItem> {\n id: number;\n name: string;\n internal: boolean;\n public: boolean;\n description?: string;\n type: string;\n slug: string;\n config: ChannelConfig;\n items?: T[];\n model_type: 'channel';\n items_count?: number;\n user?: User;\n updated_at?: string;\n restriction?: {id: number; name: string; model_type: string};\n content?: PaginationResponse<T>;\n}\n","import {PersonCredit} from './title';\n\nexport const PERSON_MODEL = 'person';\n\nexport interface Person {\n id: number;\n name: string;\n poster?: string;\n known_for?: string;\n gender?: string;\n birth_date: string;\n death_date: string;\n birth_place: string;\n primary_credit?: PersonCredit;\n views?: number;\n popularity?: number;\n updated_at?: string;\n description: string;\n model_type: typeof PERSON_MODEL;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const GridViewIcon = createSvgIcon(\n <path d=\"M3 3v8h8V3H3zm6 6H5V5h4v4zm-6 4v8h8v-8H3zm6 6H5v-4h4v4zm4-16v8h8V3h-8zm6 6h-4V5h4v4zm-6 4v8h8v-8h-8zm6 6h-4v-4h4v4z\" />\n, 'GridViewOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ViewWeekIcon = createSvgIcon(\n <path d=\"M20 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zM8 18H4V6h4v12zm6 0h-4V6h4v12zm6 0h-4V6h4v12z\" />\n, 'ViewWeekOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ViewListIcon = createSvgIcon(\n <path d=\"M3 5v14h18V5H3zm4 2v2H5V7h2zm-2 6v-2h2v2H5zm0 2h2v2H5v-2zm14 2H9v-2h10v2zm0-4H9v-2h10v2zm0-4H9V7h10v2z\" />\n, 'ViewListOutlined');\n","import {message} from '@common/i18n/message';\nimport {\n MOVIE_MODEL,\n SERIES_MODEL,\n Title,\n TITLE_MODEL,\n} from '@app/titles/models/title';\nimport {NEWS_ARTICLE_MODEL, NewsArticle} from '@app/titles/models/news-article';\nimport {Channel, CHANNEL_MODEL} from '@common/channels/channel';\nimport {ChannelContentConfig} from '@common/admin/channels/channel-editor/channel-content-config';\nimport {Person, PERSON_MODEL} from '@app/titles/models/person';\nimport {GridViewIcon} from '@common/icons/material/GridView';\nimport {ViewWeekIcon} from '@common/icons/material/ViewWeek';\nimport {ViewListIcon} from '@common/icons/material/ViewList';\n\nexport enum Sort {\n popular = 'popularity:desc',\n recent = 'created_at:desc',\n rating = 'rating:desc',\n curated = 'channelables.order:asc',\n name = 'name:asc',\n birthdayDesc = 'birth_date:desc',\n birthdayAsc = 'birth_date:asc',\n budget = 'budget:desc',\n revenue = 'revenue:desc',\n}\nexport enum Layout {\n grid = 'grid',\n landscapeGrid = 'landscapeGrid',\n list = 'list',\n news = 'news',\n carousel = 'carousel',\n landscapeCarousel = 'landscapeCarousel',\n slider = 'slider',\n}\nenum Auto {\n latestVideos = 'latestVideos',\n mostPopular = 'mostPopular',\n topRated = 'topRated',\n upcoming = 'upcoming',\n nowPlaying = 'nowPlaying',\n airingToday = 'airingToday',\n airingThisWeek = 'airingThisWeek',\n trendingPeople = 'trendingPeople',\n discover = 'discover',\n}\n\nconst contentModels: ChannelContentConfig['models'] = {\n [MOVIE_MODEL]: {\n label: message('Movies'),\n sortMethods: [\n Sort.popular,\n Sort.recent,\n Sort.rating,\n Sort.budget,\n Sort.revenue,\n ],\n layoutMethods: [\n Layout.grid,\n Layout.landscapeGrid,\n Layout.list,\n Layout.carousel,\n Layout.landscapeCarousel,\n Layout.slider,\n ],\n autoUpdateMethods: [\n Auto.latestVideos,\n Auto.mostPopular,\n Auto.topRated,\n Auto.upcoming,\n Auto.nowPlaying,\n Auto.discover,\n ],\n },\n [SERIES_MODEL]: {\n label: message('TV series'),\n sortMethods: [\n Sort.popular,\n Sort.recent,\n Sort.rating,\n Sort.budget,\n Sort.revenue,\n ],\n layoutMethods: [\n Layout.grid,\n Layout.landscapeGrid,\n Layout.list,\n Layout.carousel,\n Layout.landscapeCarousel,\n Layout.slider,\n ],\n autoUpdateMethods: [\n Auto.latestVideos,\n Auto.mostPopular,\n Auto.topRated,\n Auto.airingThisWeek,\n Auto.airingToday,\n Auto.discover,\n ],\n },\n [TITLE_MODEL]: {\n label: message('Titles (movies and series)'),\n sortMethods: [\n Sort.popular,\n Sort.recent,\n Sort.rating,\n Sort.budget,\n Sort.revenue,\n ],\n layoutMethods: [\n Layout.grid,\n Layout.landscapeGrid,\n Layout.list,\n Layout.carousel,\n Layout.landscapeCarousel,\n Layout.slider,\n ],\n autoUpdateMethods: [Auto.latestVideos],\n },\n [NEWS_ARTICLE_MODEL]: {\n label: message('News articles'),\n sortMethods: [Sort.recent],\n layoutMethods: [Layout.news, Layout.landscapeCarousel, Layout.list],\n },\n [PERSON_MODEL]: {\n label: message('People'),\n sortMethods: [\n Sort.popular,\n Sort.recent,\n Sort.name,\n Sort.birthdayDesc,\n Sort.birthdayAsc,\n ],\n layoutMethods: [Layout.grid, Layout.list, Layout.carousel],\n autoUpdateMethods: [Auto.trendingPeople],\n },\n [CHANNEL_MODEL]: {\n label: message('Channels'),\n sortMethods: [],\n layoutMethods: [Layout.list],\n },\n};\n\nconst contentSortingMethods: Record<\n Sort,\n ChannelContentConfig['sortingMethods']['any']\n> = {\n [Sort.popular]: {\n label: message('Most popular first'),\n },\n [Sort.recent]: {\n label: message('Recently added first'),\n },\n [Sort.rating]: {\n label: message('Highest rated first'),\n },\n [Sort.curated]: {\n label: message('Curated (reorder below)'),\n contentTypes: ['manual'],\n },\n [Sort.name]: {\n label: message('Name (A-Z)'),\n contentTypes: ['manual'],\n },\n [Sort.birthdayDesc]: {\n label: message('Youngest first'),\n },\n [Sort.birthdayAsc]: {\n label: message('Oldest first'),\n },\n [Sort.budget]: {\n label: message('Biggest budget first'),\n },\n [Sort.revenue]: {\n label: message('Biggest revenue first'),\n },\n};\n\nconst contentLayoutMethods: Record<\n Layout,\n ChannelContentConfig['layoutMethods']['any']\n> = {\n [Layout.grid]: {\n label: message('Grid'),\n icon: <GridViewIcon />,\n },\n [Layout.landscapeGrid]: {\n label: message('Landscape'),\n icon: <ViewWeekIcon />,\n },\n [Layout.list]: {\n label: message('List'),\n icon: <ViewListIcon />,\n },\n [Layout.carousel]: {\n label: message('Carousel (portrait)'),\n },\n [Layout.landscapeCarousel]: {\n label: message('Carousel (landscape)'),\n },\n [Layout.slider]: {\n label: message('Slider'),\n },\n [Layout.news]: {\n label: message('News'),\n },\n};\n\nconst contentAutoUpdateMethods: Record<\n Auto,\n ChannelContentConfig['autoUpdateMethods']['any']\n> = {\n [Auto.discover]: {\n label: message('Discover (TMDB only)'),\n provider: 'tmdb',\n },\n [Auto.mostPopular]: {\n label: message('Most popular'),\n },\n [Auto.topRated]: {\n label: message('Top rated'),\n },\n [Auto.upcoming]: {\n label: message('Upcoming'),\n },\n [Auto.nowPlaying]: {\n label: message('In theaters'),\n },\n [Auto.airingToday]: {\n label: message('Airing today'),\n },\n [Auto.airingThisWeek]: {\n label: message('Airing this week'),\n },\n [Auto.trendingPeople]: {\n label: message('Trending people'),\n },\n [Auto.latestVideos]: {\n label: message('Most recently published videos'),\n provider: 'local',\n },\n};\nexport const channelContentConfig: ChannelContentConfig = {\n models: contentModels,\n sortingMethods: contentSortingMethods,\n layoutMethods: contentLayoutMethods,\n autoUpdateMethods: contentAutoUpdateMethods,\n userSelectableLayouts: [Layout.grid, Layout.landscapeGrid, Layout.list],\n};\n\nexport type ChannelContentModel = (Title | NewsArticle | Person | Channel) & {\n channelable_id?: number;\n channelable_order?: number;\n};\n","import {useFormContext} from 'react-hook-form';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {Trans} from '@common/i18n/trans';\nimport {UpdateChannelPayload} from '@common/admin/channels/requests/use-update-channel';\nimport React from 'react';\nimport {ChannelContentConfig} from '@common/admin/channels/channel-editor/channel-content-config';\n\ninterface Props {\n config: ChannelContentConfig;\n className?: string;\n exclude?: string[];\n}\nexport function ContentModelField({config, className, exclude}: Props) {\n const {setValue, getValues} = useFormContext<UpdateChannelPayload>();\n return (\n <FormSelect\n className={className}\n selectionMode=\"single\"\n name=\"config.contentModel\"\n label={<Trans message=\"Type of content\" />}\n onSelectionChange={newValue => {\n const modelConfig = config.models[newValue];\n if (\n getValues('config.contentType') === 'autoUpdate' &&\n !modelConfig.autoUpdateMethods?.length\n ) {\n (setValue as any)('config.contentType', 'manual');\n }\n setValue('config.autoUpdateMethod', modelConfig.autoUpdateMethods?.[0]);\n setValue(\n 'config.contentOrder',\n modelConfig.sortMethods[0] || 'channelables.order:asc',\n );\n setValue('config.layout', modelConfig.layoutMethods[0]);\n }}\n >\n {Object.entries(config.models)\n .filter(([model]) => !exclude?.includes(model))\n .map(([model, {label}]) => (\n <Option value={model} key={model}>\n <Trans {...label} />\n </Option>\n ))}\n </FormSelect>\n );\n}\n","export const GENRE_MODEL = 'genre';\n\nexport interface Genre {\n id: number;\n name: string;\n display_name: string;\n updated_at: string;\n created_at: string;\n model_type: typeof GENRE_MODEL;\n}\n","export const PRODUCTION_COUNTRY_MODEL = 'production_country';\n\nexport interface ProductionCountry {\n id: number;\n name: string;\n display_name: string;\n updated_at: string;\n created_at: string;\n model_type: typeof PRODUCTION_COUNTRY_MODEL;\n}\n","import {useFormContext} from 'react-hook-form';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {Trans} from '@common/i18n/trans';\nimport {UpdateChannelPayload} from '@common/admin/channels/requests/use-update-channel';\nimport {ChannelContentConfig} from '@common/admin/channels/channel-editor/channel-content-config';\n\ninterface Props {\n config: ChannelContentConfig;\n className?: string;\n}\nexport function ContentOrderField({config, className}: Props) {\n const {watch} = useFormContext<UpdateChannelPayload>();\n const contentType = watch('config.contentType');\n const modelConfig = config.models[watch('config.contentModel')];\n const sortMethods = [...modelConfig.sortMethods, 'channelables.order:asc'];\n\n return (\n <FormSelect\n className={className}\n selectionMode=\"single\"\n name=\"config.contentOrder\"\n label={<Trans message=\"How to order content\" />}\n >\n {sortMethods.map(method => {\n const sortConfig = config.sortingMethods[method];\n if (\n !sortConfig.contentTypes ||\n sortConfig.contentTypes.includes(contentType)\n ) {\n return (\n <Option value={method} key={method}>\n <Trans {...sortConfig.label} />\n </Option>\n );\n }\n })}\n </FormSelect>\n );\n}\n","import {useMediaQuery} from './use-media-query';\n\nexport function useIsTouchDevice() {\n return useMediaQuery('((pointer: coarse))');\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RefreshIcon = createSvgIcon(\n <path d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\" />\n, 'RefreshOutlined');\n","import {useMutation} from '@tanstack/react-query';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {Channel, ChannelConfig} from '@common/channels/channel';\nimport {channelQueryKey} from '@common/channels/requests/use-channel';\n\ninterface Response extends BackendResponse {\n channel: Channel<NormalizedModel>;\n}\n\ninterface Payload {\n channelConfig?: Partial<ChannelConfig>;\n}\n\nexport function useUpdateChannelContent(channelId: number | string) {\n const {trans} = useTrans();\n return useMutation({\n mutationFn: (payload: Payload) => updateChannel(channelId, payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: channelQueryKey(channelId),\n });\n toast(trans(message('Channel content updated')));\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction updateChannel(channelId: number | string, payload: Payload) {\n return apiClient\n .post<Response>(`channel/${channelId}/update-content`, {\n ...payload,\n normalizeContent: true,\n })\n .then(r => r.data);\n}\n","import {hashKey, keepPreviousData, useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {Channel, ChannelContentItem} from '@common/channels/channel';\nimport {\n channelEndpoint,\n channelQueryKey,\n} from '@common/channels/requests/use-channel';\nimport {PaginatedBackendResponse} from '@common/http/backend-response/pagination-response';\nimport {useRef} from 'react';\nimport {useChannelQueryParams} from '@common/channels/use-channel-query-params';\nimport {useSearchParams} from 'react-router-dom';\n\ninterface Response<T extends ChannelContentItem = ChannelContentItem>\n extends PaginatedBackendResponse<T> {}\n\ninterface Options {\n paginate?: boolean;\n}\n\nexport function useChannelContent<\n T extends ChannelContentItem = ChannelContentItem,\n>(\n channel: Channel<T>,\n params?: Record<string, string> | null,\n options?: Options,\n) {\n const [searchParams] = useSearchParams();\n const queryParams = useChannelQueryParams(channel, params);\n if (options?.paginate) {\n queryParams.page = searchParams.get('page') || '1';\n }\n const queryKey = channelQueryKey(channel.id, queryParams);\n const initialQueryKey = useRef(hashKey(queryKey)).current;\n\n const query = useQuery({\n queryKey: channelQueryKey(channel.id, queryParams),\n queryFn: () => fetchChannelContent<T>(channel, queryParams),\n placeholderData: keepPreviousData,\n initialData: () => {\n if (hashKey(queryKey) === initialQueryKey) {\n return channel.content;\n }\n return undefined;\n },\n });\n\n return {\n ...query,\n queryKey,\n };\n}\n\nfunction fetchChannelContent<T extends ChannelContentItem = ChannelContentItem>(\n channel: Channel<T>,\n params: any,\n) {\n return apiClient\n .get<Response<T>>(channelEndpoint(channel.id), {\n params: {\n ...params,\n paginate:\n channel.config.paginationType === 'lengthAware'\n ? 'lengthAware'\n : 'simple',\n returnContentOnly: 'true',\n },\n })\n .then(response => response.data.pagination);\n}\n","import {useLocation} from 'react-router-dom';\nimport {RefObject, useEffect} from 'react';\nimport {usePrevious} from '@common/utils/hooks/use-previous';\nimport {getScrollParent} from '@react-aria/utils';\n\nexport function useScrollToTop(ref?: RefObject<HTMLElement>) {\n const {pathname} = useLocation();\n\n const previousPathname = usePrevious(pathname);\n\n useEffect(() => {\n if (previousPathname !== pathname) {\n scrollToTop(ref);\n }\n }, [pathname, previousPathname, ref]);\n}\n\nexport function scrollToTop(ref?: RefObject<HTMLElement>) {\n const scrollParent = ref?.current\n ? getScrollParent(ref.current)\n : document.documentElement;\n scrollParent.scrollTo({\n top: 0,\n left: 0,\n });\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FirstPageIcon = createSvgIcon(\n <path d=\"M18.41 16.59 13.82 12l4.59-4.59L17 6l-6 6 6 6 1.41-1.41zM6 6h2v12H6V6z\" />\n, 'FirstPageOutlined');\n","import {\n hasNextPage,\n hasPreviousPage,\n LengthAwarePaginationResponse,\n PaginationResponse,\n SimplePaginationResponse,\n} from '@common/http/backend-response/pagination-response';\nimport {Button} from '@common/ui/buttons/button';\nimport memoize from 'nano-memoize';\nimport {Link} from 'react-router-dom';\nimport clsx from 'clsx';\nimport {Trans} from '@common/i18n/trans';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport {KeyboardArrowLeftIcon} from '@common/icons/material/KeyboardArrowLeft';\nimport {scrollToTop} from '@common/ui/navigation/use-scroll-to-top';\nimport {useRef} from 'react';\nimport {FirstPageIcon} from '@common/icons/material/FirstPage';\n\nexport type PaginationControlsType = 'simple' | 'lengthAware';\n\ninterface Props {\n pagination: PaginationResponse<unknown> | undefined;\n className?: string;\n type?: PaginationControlsType;\n scrollToTop?: boolean;\n}\nexport function PaginationControls({\n pagination,\n className,\n type,\n scrollToTop,\n}: Props) {\n if (\n !pagination?.data?.length ||\n (!hasNextPage(pagination) && !hasPreviousPage(pagination))\n ) {\n return null;\n }\n\n const isLengthAware =\n (!type || type === 'lengthAware') &&\n 'total' in pagination &&\n pagination.total != null;\n\n if (isLengthAware) {\n return (\n <LengthAwarePagination\n data={pagination as LengthAwarePaginationResponse}\n className={className}\n scrollToTop={scrollToTop}\n />\n );\n }\n\n return (\n <SimplePagination\n data={pagination as SimplePaginationResponse}\n className={className}\n scrollToTop={scrollToTop}\n />\n );\n}\n\ninterface LengthAwarePaginationProps {\n data: LengthAwarePaginationResponse;\n className?: string;\n scrollToTop?: boolean;\n}\nfunction LengthAwarePagination({\n data,\n className,\n scrollToTop: shouldScrollToTop,\n}: LengthAwarePaginationProps) {\n const ref = useRef<HTMLElement>(null);\n const currentPage = data.current_page;\n const total = data.total;\n const perPage = data.per_page;\n\n const range = generatePaginationRangeWithDots(currentPage, total, perPage);\n\n return (\n <nav\n ref={ref}\n className={clsx('flex flex-wrap items-center justify-center', className)}\n >\n <ul className=\"flex items-center gap-4\">\n {range.map((item, index) => {\n const isCurrentPage = item === currentPage;\n return (\n <li key={item === '...' ? `...-${index}` : item}>\n <Button\n elementType={isCurrentPage ? undefined : Link}\n to={!isCurrentPage ? `?page=${item}` : undefined}\n variant={isCurrentPage ? 'outline' : undefined}\n disabled={isCurrentPage || item === '...'}\n onClick={shouldScrollToTop ? () => scrollToTop(ref) : undefined}\n >\n {item}\n </Button>\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n\ninterface SimplePaginationProps {\n data: SimplePaginationResponse<unknown>;\n className?: string;\n scrollToTop?: boolean;\n}\nfunction SimplePagination({\n data,\n className,\n scrollToTop: shouldScrollToTop,\n}: SimplePaginationProps) {\n const ref = useRef<HTMLDivElement>(null);\n const currentPage = data.current_page;\n const isLastPage = !hasNextPage(data);\n return (\n <div ref={ref} className={clsx('flex items-center gap-12', className)}>\n {currentPage > 1 && (\n <Button\n variant=\"outline\"\n elementType={Link}\n className=\"min-w-110\"\n to=\"?page=1\"\n startIcon={<FirstPageIcon />}\n onClick={shouldScrollToTop ? () => scrollToTop(ref) : undefined}\n size=\"xs\"\n >\n <Trans message=\"First\" />\n </Button>\n )}\n <Button\n variant=\"outline\"\n elementType={currentPage == 1 ? undefined : Link}\n disabled={currentPage == 1}\n className=\"mr-auto min-w-110\"\n to={currentPage == 1 ? undefined : `?page=${currentPage - 1}`}\n startIcon={<KeyboardArrowLeftIcon />}\n onClick={shouldScrollToTop ? () => scrollToTop(ref) : undefined}\n size=\"xs\"\n >\n <Trans message=\"Previous\" />\n </Button>\n <Button\n variant=\"outline\"\n elementType={isLastPage ? undefined : Link}\n disabled={isLastPage}\n className=\"min-w-110\"\n to={isLastPage ? undefined : `?page=${currentPage + 1}`}\n endIcon={<KeyboardArrowRightIcon />}\n onClick={shouldScrollToTop ? () => scrollToTop(ref) : undefined}\n size=\"xs\"\n >\n <Trans message=\"Next\" />\n </Button>\n </div>\n );\n}\n\nconst generatePaginationRangeWithDots = memoize(\n (currentPage: number, total: number, perPage: number) => {\n const totalPages = Math.ceil(total / perPage);\n const delta = 3;\n const range = [];\n for (\n let i = Math.max(2, currentPage - delta);\n i <= Math.min(totalPages - 1, currentPage + delta);\n i++\n ) {\n range.push(i);\n }\n if (currentPage - delta > 2) {\n range.unshift('...');\n }\n if (currentPage + delta < totalPages - 1) {\n range.push('...');\n }\n range.unshift(1);\n range.push(totalPages);\n return range;\n },\n);\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {Channel} from '@common/channels/channel';\n\ninterface Response extends BackendResponse {\n channel: Channel<NormalizedModel>;\n}\n\ninterface Payload {\n channelId: number | string;\n modelType: string;\n ids: (number | string)[];\n}\n\nexport function useReorderChannelContent() {\n return useMutation({\n mutationFn: (payload: Payload) => reorderContent(payload),\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction reorderContent({channelId, ids, modelType}: Payload) {\n return apiClient\n .post<Response>(`channel/${channelId}/reorder-content`, {\n modelType,\n ids,\n })\n .then(r => r.data);\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {channelQueryKey} from '@common/channels/requests/use-channel';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n channelId: number | string;\n item: NormalizedModel;\n}\n\nexport function useAddToChannel() {\n return useMutation({\n mutationFn: (payload: Payload) => addToChannel(payload),\n onSuccess: async (_, payload) => {\n await queryClient.invalidateQueries({\n queryKey: channelQueryKey(payload.channelId),\n });\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction addToChannel({channelId, item}: Payload): Promise<Response> {\n return apiClient\n .post(`channel/${channelId}/add`, {\n itemId: item.id,\n itemType: item.model_type,\n })\n .then(r => r.data);\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {channelQueryKey} from '@common/channels/requests/use-channel';\n\ninterface Payload {\n channelId: number | string;\n item: NormalizedModel;\n}\n\nexport function useRemoveFromChannel() {\n return useMutation({\n mutationFn: (payload: Payload) => removeFromChannel(payload),\n onSuccess: async (_, payload) => {\n await queryClient.invalidateQueries({\n queryKey: channelQueryKey(payload.channelId),\n });\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction removeFromChannel({channelId, item}: Payload) {\n return apiClient\n .post(`channel/${channelId}/remove`, {\n itemId: item.id,\n itemType: item.model_type,\n })\n .then(r => r.data);\n}\n","import {useFormContext} from 'react-hook-form';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {Trans} from '@common/i18n/trans';\nimport {Table} from '@common/ui/tables/table';\nimport {RowElementProps} from '@common/ui/tables/table-row';\nimport {useIsTouchDevice} from '@common/utils/hooks/is-touch-device';\nimport React, {\n cloneElement,\n ReactElement,\n ReactNode,\n useContext,\n useRef,\n useState,\n} from 'react';\nimport {TableContext} from '@common/ui/tables/table-context';\nimport {DragPreviewRenderer} from '@common/ui/interactions/dnd/use-draggable';\nimport {\n DropPosition,\n useSortable,\n} from '@common/ui/interactions/dnd/sortable/use-sortable';\nimport clsx from 'clsx';\nimport {mergeProps} from '@react-aria/utils';\nimport {ColumnConfig} from '@common/datatable/column-config';\nimport {DragHandleIcon} from '@common/icons/material/DragHandle';\nimport {NameWithAvatar} from '@common/datatable/column-templates/name-with-avatar';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {DragPreview} from '@common/ui/interactions/dnd/drag-preview';\nimport {WarningIcon} from '@common/icons/material/Warning';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport playlist from '../playlist.svg';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport {Link, useParams} from 'react-router-dom';\nimport {Button} from '@common/ui/buttons/button';\nimport {RefreshIcon} from '@common/icons/material/Refresh';\nimport {UpdateChannelPayload} from '@common/admin/channels/requests/use-update-channel';\nimport {useUpdateChannelContent} from '@common/admin/channels/requests/use-update-channel-content';\nimport {ChannelContentSearchFieldProps} from '@common/admin/channels/channel-editor/channel-content-search-field';\nimport {useChannelContent} from '@common/channels/requests/use-channel-content';\nimport {PaginationControls} from '@common/ui/navigation/pagination-controls';\nimport {queryClient} from '@common/http/query-client';\nimport {PaginationResponse} from '@common/http/backend-response/pagination-response';\nimport {moveItemInNewArray} from '@common/utils/array/move-item-in-new-array';\nimport {useReorderChannelContent} from '@common/admin/channels/requests/use-reorder-channel-content';\nimport {useAddToChannel} from '@common/admin/channels/requests/use-add-to-channel';\nimport {useRemoveFromChannel} from '@common/admin/channels/requests/use-remove-from-channel';\nimport {ChannelContentItem} from '@common/channels/channel';\n\nconst columnConfig: ColumnConfig<NormalizedModel>[] = [\n {\n key: 'dragHandle',\n width: 'w-42 flex-shrink-0',\n header: () => <Trans message=\"Drag handle\" />,\n hideHeader: true,\n body: () => (\n <DragHandleIcon className=\"cursor-pointer text-muted hover:text\" />\n ),\n },\n {\n key: 'name',\n header: () => <Trans message=\"Content item\" />,\n visibleInMode: 'all',\n body: item => {\n return (\n <NameWithAvatar\n image={item.image}\n label={\n item.model_type === 'channel' ? (\n <Link\n className=\"hover:underline\"\n to={`/admin/channels/${item.id}/edit`}\n target=\"_blank\"\n >\n {item.name}\n </Link>\n ) : (\n item.name\n )\n }\n description={item.description}\n />\n );\n },\n },\n {\n key: 'type',\n header: () => <Trans message=\"Content type\" />,\n width: 'w-100 flex-shrink-0',\n body: item => <span className=\"capitalize\">{item.model_type}</span>,\n },\n {\n key: 'actions',\n header: () => <Trans message=\"Actions\" />,\n hideHeader: true,\n align: 'end',\n width: 'w-42 flex-shrink-0',\n visibleInMode: 'all',\n body: item => <RemoveItemColumn item={item} />,\n },\n];\n\ninterface Props {\n searchField: ReactElement<ChannelContentSearchFieldProps>;\n title?: ReactNode;\n noResultsMessage?: ReactNode;\n}\nexport function ChannelContentEditor({\n searchField,\n title,\n noResultsMessage,\n}: Props) {\n const {watch, getValues} = useFormContext<UpdateChannelPayload>();\n const channel = getValues();\n const contentType = watch('config.contentType');\n const addToChannel = useAddToChannel();\n const query = useChannelContent<ChannelContentItem<NormalizedModel>>(\n channel,\n {loader: 'editChannelPage', paginate: 'simple'},\n {paginate: true},\n );\n const pagination = query.data!;\n\n // only show delete and drag buttons when channel content is managed manually\n const filteredColumns = columnConfig.filter(col => {\n return !(\n contentType !== 'manual' &&\n (col.key === 'actions' || col.key === 'dragHandle')\n );\n });\n\n return (\n <div className=\"mt-40\">\n <div className=\"mb-40\">\n <h2 className=\"mb-10 text-2xl\">\n {title || <Trans message=\"Channel content\" />}\n </h2>\n <ContentNotEditableWarning />\n <UpdateContentButton />\n {contentType === 'manual'\n ? cloneElement<ChannelContentSearchFieldProps>(searchField, {\n onResultSelected: result => {\n addToChannel.mutate({\n channelId: channel.id,\n item: result,\n });\n },\n })\n : null}\n </div>\n <PaginationControls\n pagination={query.data}\n type=\"simple\"\n className=\"mb-24\"\n />\n <Table\n className=\"mt-24\"\n columns={filteredColumns}\n data={pagination?.data || []}\n meta={query.queryKey}\n renderRowAs={contentType === 'manual' ? ContentTableRow : undefined}\n enableSelection={false}\n hideHeaderRow\n />\n <PaginationControls\n pagination={query.data}\n type=\"simple\"\n className=\"mt-24\"\n scrollToTop\n />\n {!pagination.data?.length && contentType === 'manual'\n ? noResultsMessage || (\n <IllustratedMessage\n title={<Trans message=\"Channel is empty\" />}\n description={\n <Trans message=\"No content is attached to this channel yet.\" />\n }\n image={<SvgImage src={playlist} />}\n />\n )\n : null}\n </div>\n );\n}\n\nfunction ContentTableRow({\n item,\n children,\n className,\n ...domProps\n}: RowElementProps<NormalizedModel>) {\n const isTouchDevice = useIsTouchDevice();\n const {data, meta} = useContext(TableContext);\n const {getValues} = useFormContext<UpdateChannelPayload>();\n const domRef = useRef<HTMLTableRowElement>(null);\n const reorderContent = useReorderChannelContent();\n const previewRef = useRef<DragPreviewRenderer>(null);\n const [dropPosition, setDropPosition] = useState<DropPosition>(null);\n\n const {sortableProps} = useSortable({\n ref: domRef,\n disabled: isTouchDevice ?? false,\n item,\n items: data,\n type: 'channelContentItem',\n preview: previewRef,\n strategy: 'line',\n onDropPositionChange: position => {\n setDropPosition(position);\n },\n onSortEnd: (oldIndex, newIndex) => {\n // do optimistic reorder\n const newPagination = queryClient.setQueryData<\n PaginationResponse<unknown>\n >(meta, pagination => {\n if (pagination) {\n pagination = {\n ...pagination,\n data: moveItemInNewArray(pagination.data, oldIndex, newIndex),\n };\n }\n return pagination;\n });\n\n // reorder on backend\n if (newPagination) {\n reorderContent.mutate({\n channelId: getValues('id'),\n modelType: item.model_type,\n ids: newPagination.data.map(item => (item as NormalizedModel).id),\n });\n }\n },\n });\n\n return (\n <div\n className={clsx(\n className,\n dropPosition === 'before' && 'sort-preview-before',\n dropPosition === 'after' && 'sort-preview-after',\n )}\n ref={domRef}\n {...mergeProps(sortableProps, domProps)}\n >\n {children}\n {!item.isPlaceholder && <RowDragPreview item={item} ref={previewRef} />}\n </div>\n );\n}\n\ninterface RowDragPreviewProps {\n item: NormalizedModel;\n}\nconst RowDragPreview = React.forwardRef<\n DragPreviewRenderer,\n RowDragPreviewProps\n>(({item}, ref) => {\n return (\n <DragPreview ref={ref}>\n {() => (\n <div className=\"rounded bg-chip p-8 text-base shadow\">{item.name}</div>\n )}\n </DragPreview>\n );\n});\n\ninterface RemoveItemColumnProps {\n item: NormalizedModel;\n}\nfunction RemoveItemColumn({item}: RemoveItemColumnProps) {\n const removeFromChannel = useRemoveFromChannel();\n const {getValues} = useFormContext<UpdateChannelPayload>();\n return (\n <IconButton\n size=\"md\"\n className=\"text-muted\"\n disabled={removeFromChannel.isPending}\n onClick={() => {\n removeFromChannel.mutate({\n channelId: getValues('id'),\n item: item,\n });\n }}\n >\n <CloseIcon />\n </IconButton>\n );\n}\n\nfunction ContentNotEditableWarning() {\n const {watch} = useFormContext<UpdateChannelPayload>();\n const contentType = watch('config.contentType');\n\n if (contentType === 'manual') {\n return null;\n }\n\n return (\n <div className=\"mb-20 mt-4 flex items-center gap-8\">\n <WarningIcon size=\"xs\" />\n <div className=\"text-xs text-muted\">\n {contentType === 'listAll' ? (\n <Trans message=\"This channel is listing all available content of specified type, and can't be curated manually.\" />\n ) : null}\n {contentType === 'autoUpdate' ? (\n <Trans message=\"This channel content is set to update automatically and can't be curated manually.\" />\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction UpdateContentButton() {\n const {slugOrId} = useParams();\n const updateContent = useUpdateChannelContent(slugOrId!);\n const {setValue, watch, getValues} = useFormContext<UpdateChannelPayload>();\n\n if (watch('config.contentType') !== 'autoUpdate') {\n return null;\n }\n\n return (\n <Button\n size=\"xs\"\n variant=\"outline\"\n color=\"primary\"\n startIcon={<RefreshIcon />}\n onClick={() => {\n updateContent.mutate(\n {\n channelConfig: (getValues as any)('config'),\n },\n {\n onSuccess: response => {\n if (response.channel.content) {\n (setValue as any)('content', response.channel.content);\n }\n },\n },\n );\n }}\n disabled={\n updateContent.isPending ||\n !watch('config.autoUpdateMethod') ||\n !watch('id')\n }\n >\n <Trans message=\"Update content now\" />\n </Button>\n );\n}\n","import {keepPreviousData, useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {NormalizedModel} from '@common/datatable/filters/normalized-model';\n\nexport interface SearchResponse extends BackendResponse {\n results: NormalizedModel[];\n}\n\ninterface SearchParams {\n query?: string;\n limit?: number;\n modelType: string;\n}\n\nexport function useAddableContent(params: SearchParams) {\n return useQuery({\n queryKey: ['search', params],\n queryFn: () => search(params),\n //enabled: !!params.query,\n placeholderData: params.query ? keepPreviousData : undefined,\n });\n}\n\nfunction search(params: SearchParams) {\n return apiClient\n .get<SearchResponse>(`channel/search-for-addable-content`, {params})\n .then(response => response.data);\n}\n","import {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {useFormContext} from 'react-hook-form';\nimport {UpdateChannelPayload} from '@common/admin/channels/requests/use-update-channel';\nimport {useTrans} from '@common/i18n/use-trans';\nimport React, {useState} from 'react';\nimport {useAddableContent} from '@common/admin/channels/requests/use-addable-content';\nimport {ComboBox} from '@common/ui/forms/combobox/combobox';\nimport {message} from '@common/i18n/message';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {Item} from '@common/ui/forms/listbox/item';\n\nexport interface ChannelContentSearchFieldProps {\n onResultSelected?: (result: NormalizedModel) => void;\n imgRenderer?: (result: NormalizedModel) => React.ReactNode;\n}\nexport function ChannelContentSearchField({\n onResultSelected,\n imgRenderer,\n}: ChannelContentSearchFieldProps) {\n const {watch} = useFormContext<UpdateChannelPayload>();\n const contentModel = watch('config.contentModel');\n const {trans} = useTrans();\n const [query, setQuery] = useState('');\n const {isFetching, data} = useAddableContent({\n query,\n modelType: contentModel,\n limit: 20,\n });\n return (\n <ComboBox\n isAsync\n placeholder={trans(message('Search for content to add...'))}\n isLoading={isFetching}\n inputValue={query}\n onInputValueChange={setQuery}\n clearInputOnItemSelection\n blurReferenceOnItemSelection\n selectionMode=\"none\"\n openMenuOnFocus\n floatingMaxHeight={670}\n startAdornment={<SearchIcon />}\n hideEndAdornment\n >\n {data?.results.map(result => (\n <Item\n key={result.id}\n value={result.id}\n onSelected={() => onResultSelected?.(result)}\n startIcon={imgRenderer ? imgRenderer(result) : null}\n description={result.description}\n textLabel={result.name}\n >\n {result.name}\n </Item>\n ))}\n </ComboBox>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ImageIcon = createSvgIcon(\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86-3 3.87L9 13.14 6 17h12l-3.86-5.14z\" />\n, 'ImageOutlined');\n","import {NormalizedModel} from '@common/datatable/filters/normalized-model';\nimport {useImageSrc} from '@app/images/use-image-src';\nimport clsx from 'clsx';\nimport {ImageIcon} from '@common/icons/material/Image';\n\ninterface Props {\n item: NormalizedModel;\n}\nexport function ChannelContentItemImage({item}: Props) {\n const src = useImageSrc(item.image, {size: 'sm'});\n\n const imageClassName = clsx(\n 'aspect-square w-40 rounded object-cover',\n !src ? 'flex items-center justify-center' : 'block',\n );\n\n return src ? (\n <img className={imageClassName} src={src} alt=\"\" />\n ) : (\n <span className={imageClassName}>\n <ImageIcon className=\"max-w-[60%] text-divider\" size=\"text-6xl\" />\n </span>\n );\n}\n","import {Link, LinkProps} from 'react-router-dom';\nimport clsx from 'clsx';\nimport React, {ReactNode, useMemo} from 'react';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {NewsArticle} from '@app/titles/models/news-article';\n\ninterface Props extends Omit<LinkProps, 'to'> {\n article: NewsArticle;\n className?: string;\n children?: ReactNode;\n color?: 'primary' | 'inherit';\n}\nexport function NewsArticleLink({\n article,\n className,\n children,\n color = 'inherit',\n ...linkProps\n}: Props) {\n const finalUri = useMemo(() => {\n return getNewsArticleLink(article);\n }, [article]);\n\n return (\n <Link\n {...linkProps}\n className={clsx(\n color === 'primary'\n ? 'text-primary hover:text-primary-dark'\n : 'text-inherit',\n 'overflow-x-hidden overflow-ellipsis outline-none transition-colors hover:underline focus-visible:underline',\n className,\n )}\n to={finalUri}\n >\n {children ?? article.title}\n </Link>\n );\n}\n\nexport function getNewsArticleLink(\n article: NewsArticle,\n {absolute}: {absolute?: boolean} = {},\n): string {\n let link = `/news/${article.slug}`;\n if (absolute) {\n link = `${getBootstrapData().settings.base_url}${link}`;\n }\n return link;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const NewspaperIcon = createSvgIcon(\n <path d=\"m22 3-1.67 1.67L18.67 3 17 4.67 15.33 3l-1.66 1.67L12 3l-1.67 1.67L8.67 3 7 4.67 5.33 3 3.67 4.67 2 3v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V3zM11 19H4v-6h7v6zm9 0h-7v-2h7v2zm0-4h-7v-2h7v2zm0-4H4V8h16v3z\" />\n, 'NewspaperOutlined');\n","import {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport clsx from 'clsx';\nimport {NewsArticle} from '@app/titles/models/news-article';\nimport {NewsArticleLink} from '@app/news/news-article-link';\nimport {NewspaperIcon} from '@common/icons/material/Newspaper';\n\ninterface Props {\n article: NewsArticle;\n className?: string;\n size?: string;\n lazy?: boolean;\n}\nexport function NewsArticleImage({\n article,\n className,\n size,\n lazy = true,\n}: Props) {\n const {trans} = useTrans();\n const src = article.image;\n\n const imageClassName = clsx(\n className,\n size,\n 'object-cover bg-fg-base/4 rounded',\n !src ? 'flex items-center justify-center' : 'block'\n );\n\n const image = src ? (\n <img\n className={imageClassName}\n draggable={false}\n loading={lazy ? 'lazy' : 'eager'}\n src={src}\n alt={trans(message('Image for :name', {values: {name: article.title}}))}\n />\n ) : (\n <span className={imageClassName}>\n <NewspaperIcon className=\"max-w-[60%] text-divider\" size=\"text-6xl\" />\n </span>\n );\n\n return (\n <NewsArticleLink article={article} className=\"group relative flex-shrink-0\">\n {image}\n <div className=\"pointer-events-none absolute inset-0 bg-black opacity-0 transition-opacity group-hover:opacity-10\" />\n </NewsArticleLink>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n //\n}\n\ninterface Payload {\n commentIds: number[];\n}\n\nexport function useDeleteComments() {\n return useMutation({\n mutationFn: (payload: Payload) => deleteComments(payload),\n onSuccess: (response, payload) => {\n toast(\n message('[one Comment deleted|other Deleted :count comments]', {\n values: {count: payload.commentIds.length},\n }),\n );\n },\n onError: err => showHttpErrorToast(err),\n });\n}\n\nfunction deleteComments({commentIds}: Payload): Promise<Response> {\n return apiClient.delete(`comment/${commentIds.join(',')}`).then(r => r.data);\n}\n","import {Avatar, AvatarProps} from '@common/ui/images/avatar';\nimport {User} from '@common/auth/user';\nimport {useContext} from 'react';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\n\ninterface UserAvatarProps extends Omit<AvatarProps, 'label' | 'src' | 'link'> {\n user?: User;\n}\nexport function UserAvatar({user, ...props}: UserAvatarProps) {\n const {auth} = useContext(SiteConfigContext);\n return (\n <Avatar\n {...props}\n label={user?.display_name}\n src={user?.avatar}\n link={user?.id && auth.getUserProfileLink?.(user)}\n />\n );\n}\n","import {\n hashKey,\n InfiniteData,\n keepPreviousData,\n useInfiniteQuery,\n UseInfiniteQueryResult,\n} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {\n hasNextPage,\n PaginationResponse,\n} from '@common/http/backend-response/pagination-response';\nimport {useMemo, useRef, useState} from 'react';\nimport {SortDescriptor} from '@common/ui/tables/types/sort-descriptor';\nimport {GetDatatableDataParams} from '@common/datatable/requests/paginated-resources';\nimport {QueryKey} from '@tanstack/query-core/src/types';\n\nexport type UseInfiniteDataResult<\n T,\n E extends object = object,\n> = UseInfiniteQueryResult<InfiniteData<PaginationResponse<T> & E>> & {\n items: T[];\n totalItems: number | null;\n // initial load is done and no results were returned from backend\n noResults: boolean;\n // true when changing filters or sorting, not on initial load, background fetch or infinite load\n isReloading: boolean;\n sortDescriptor: SortDescriptor;\n setSortDescriptor: (sortDescriptor: SortDescriptor) => void;\n searchQuery: string;\n setSearchQuery: (searchQuery: string) => void;\n};\n\nfunction buildQueryKey(\n {\n queryKey,\n defaultOrderDir,\n defaultOrderBy,\n queryParams,\n }: UseInfiniteDataProps<any>,\n sortDescriptor: SortDescriptor,\n searchQuery: string = '',\n) {\n // make sure to always set default order dir and col so query keys are consistent\n if (!sortDescriptor.orderBy) {\n sortDescriptor.orderBy = defaultOrderBy;\n }\n if (!sortDescriptor.orderDir) {\n sortDescriptor.orderDir = defaultOrderDir;\n }\n return [...queryKey, sortDescriptor, searchQuery, queryParams];\n}\n\ninterface Response<T> extends BackendResponse {\n pagination: PaginationResponse<T>;\n}\n\nexport interface UseInfiniteDataProps<T> {\n initialPage?: PaginationResponse<T> | null;\n queryKey: QueryKey;\n queryParams?: Record<string, string | number | null>;\n endpoint: string;\n defaultOrderBy?: SortDescriptor['orderBy'];\n defaultOrderDir?: SortDescriptor['orderDir'];\n // whether user can sort items manually (table header, dropdown, etc)\n willSortOrFilter?: boolean;\n // ordering is not available with cursor pagination\n paginate?: 'simple' | 'lengthAware' | 'cursor';\n transformResponse?: (response: Response<T>) => Response<T>;\n}\nexport function useInfiniteData<T, E extends object = {}>(\n props: UseInfiniteDataProps<T>,\n): UseInfiniteDataResult<T, E> {\n const {\n initialPage,\n endpoint,\n defaultOrderBy,\n defaultOrderDir,\n queryParams,\n paginate,\n transformResponse,\n willSortOrFilter = false,\n } = props;\n const [searchQuery, setSearchQuery] = useState('');\n const [sortDescriptor, setSortDescriptor] = useState<SortDescriptor>({\n orderBy: defaultOrderBy,\n orderDir: defaultOrderDir,\n });\n\n const queryKey = buildQueryKey(props, sortDescriptor, searchQuery);\n const initialQueryKey = useRef(hashKey(queryKey)).current;\n\n const query = useInfiniteQuery({\n placeholderData: willSortOrFilter ? keepPreviousData : undefined,\n queryKey,\n queryFn: ({pageParam, signal}) => {\n const params: GetDatatableDataParams = {\n ...queryParams,\n perPage: initialPage?.per_page || queryParams?.perPage,\n query: (queryParams?.query as string) ?? searchQuery,\n paginate,\n ...sortDescriptor,\n };\n if (paginate === 'cursor') {\n params.cursor = pageParam;\n } else {\n params.page = pageParam || 1;\n }\n return fetchData<T>(endpoint, params, transformResponse, signal);\n },\n initialPageParam: paginate === 'cursor' ? '' : 1,\n getNextPageParam: lastResponse => {\n if (!hasNextPage(lastResponse.pagination)) {\n return null;\n }\n if ('next_cursor' in lastResponse.pagination) {\n return lastResponse.pagination.next_cursor;\n }\n return lastResponse.pagination.current_page + 1;\n },\n initialData: () => {\n // initial data will be for initial query key only, remove\n // initial data if query key changes, so query is reset\n if (!initialPage || hashKey(queryKey) !== initialQueryKey) {\n return undefined;\n }\n\n return {\n pageParams: [undefined, 1],\n pages: [{pagination: initialPage}],\n };\n },\n });\n\n const items = useMemo(() => {\n return query.data?.pages.flatMap(p => p.pagination.data) || [];\n }, [query.data?.pages]);\n\n const firstPage = query.data?.pages[0].pagination;\n const totalItems =\n firstPage && 'total' in firstPage && firstPage.total\n ? firstPage.total\n : null;\n\n return {\n ...query,\n items,\n totalItems,\n noResults: query.data?.pages?.[0].pagination.data.length === 0,\n // can't use \"isRefetching\", it's true for some reason when changing sorting or filters\n isReloading:\n query.isFetching && !query.isFetchingNextPage && query.isPlaceholderData,\n sortDescriptor,\n setSortDescriptor,\n searchQuery,\n setSearchQuery,\n } as UseInfiniteDataResult<T, E>;\n}\n\nasync function fetchData<T>(\n endpoint: string,\n params: GetDatatableDataParams,\n transformResponse?: UseInfiniteDataProps<T>['transformResponse'],\n signal?: AbortSignal,\n): Promise<Response<T>> {\n if (params.query) {\n await new Promise(resolve => setTimeout(resolve, 300));\n }\n return apiClient\n .get(endpoint, {params, signal: params.query ? signal : undefined})\n .then(r => {\n if (transformResponse) {\n return transformResponse(r.data);\n }\n return r.data;\n });\n}\n","import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {Reviewable} from '@app/reviews/reviewable';\nimport {Review} from '@app/titles/models/review';\nimport {useLocalStorage} from '@common/utils/hooks/local-storage';\nimport {useSearchParams} from 'react-router-dom';\n\nexport interface UseReviewAdditionalData {\n current_user_review?: Review;\n shared_review?: Review;\n}\n\nexport function reviewsQueryKey(\n reviewable?: Reviewable,\n params?: Record<string, any>,\n) {\n const key: any[] = ['reviews'];\n if (reviewable) {\n key.push(`${reviewable.id}-${reviewable.model_type}`);\n }\n if (params) {\n key.push(params);\n }\n return key;\n}\n\nexport function useReviews(reviewable: Reviewable) {\n const [searchParams] = useSearchParams();\n const [sort] = useLocalStorage(\n `reviewSort.${reviewable.model_type}`,\n 'created_at:desc',\n );\n const [defaultOrderBy, defaultOrderDir] = sort.split(':');\n return useInfiniteData<Review, UseReviewAdditionalData>({\n willSortOrFilter: true,\n queryKey: reviewsQueryKey(reviewable, {sort}),\n endpoint: 'reviewable/reviews',\n defaultOrderBy,\n defaultOrderDir: defaultOrderDir as 'asc' | 'desc',\n queryParams: {\n reviewable_type: reviewable.model_type,\n reviewable_id: reviewable.id,\n perPage: 5,\n sharedReviewId: searchParams.get('reviewId'),\n },\n });\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {reviewsQueryKey} from '@app/reviews/requests/use-reviews';\n\ninterface Response extends BackendResponse {\n //\n}\n\ninterface Payload {\n reviewIds: number[];\n}\n\nexport function useDeleteReviews() {\n return useMutation({\n mutationFn: (payload: Payload) => deleteReviews(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: reviewsQueryKey()});\n },\n onError: r => showHttpErrorToast(r),\n });\n}\n\nfunction deleteReviews({reviewIds}: Payload): Promise<Response> {\n return apiClient.delete(`reviews/${reviewIds.join(',')}`).then(r => r.data);\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const StarIcon = createSvgIcon(\n <path d=\"M12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27z\" />\n, 'StarOutlined');\n","import {StarIcon} from '@common/icons/material/Star';\nimport clsx from 'clsx';\n\ninterface Props {\n score: number | null;\n className?: string;\n}\nexport function TitleRating({score, className}: Props) {\n if (!score) return null;\n return (\n <div\n className={clsx(\n 'flex items-center gap-4 flex-shrink-0 whitespace-nowrap',\n className\n )}\n >\n <StarIcon className=\"text-primary\" />\n <span>{score} / 10</span>\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const StarBorderIcon = createSvgIcon(\n <path d=\"m22 9.24-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z\" />\n, 'StarBorderOutlined');\n","import {useState} from 'react';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {StarIcon} from '@common/icons/material/Star';\nimport {StarBorderIcon} from '@common/icons/material/StarBorder';\nimport clsx from 'clsx';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\ninterface Props {\n count: number;\n value: number;\n onValueChange?: (value: number) => void;\n className?: string;\n readonly?: boolean;\n}\nexport function StarSelector({\n count,\n value,\n onValueChange,\n className,\n readonly,\n}: Props) {\n const isMobile = useIsMobileMediaQuery();\n const [hoverRating, setHoverRating] = useState(value);\n const {trans} = useTrans();\n return (\n <div\n className={clsx('flex items-center', className)}\n onPointerLeave={() => {\n if (!readonly) {\n setHoverRating(value);\n }\n }}\n >\n {Array.from({length: count}).map((_, i) => {\n const number = i + 1;\n const isActive = hoverRating >= number;\n return (\n <IconButton\n key={i}\n size={isMobile ? 'xs' : 'sm'}\n aria-label={trans(\n message('Rate :count stars', {values: {count: number}})\n )}\n iconSize=\"md\"\n color={isActive ? 'primary' : undefined}\n disabled={readonly}\n onClick={() => {\n onValueChange?.(number);\n }}\n onPointerEnter={() => {\n setHoverRating(number);\n }}\n >\n {isActive ? <StarIcon /> : <StarBorderIcon />}\n </IconButton>\n );\n })}\n </div>\n );\n}\n","import React, {Children, Fragment, ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface BulletSeparatedItemsProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function BulletSeparatedItems({\n children,\n className,\n}: BulletSeparatedItemsProps) {\n const items = Children.toArray(children);\n return (\n <div className={clsx('flex items-center gap-4 overflow-hidden', className)}>\n {items.map((child, index) => (\n <Fragment key={index}>\n <div>{child}</div>\n {index < items.length - 1 ? <div>&bull;</div> : null}\n </Fragment>\n ))}\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SortIcon = createSvgIcon(\n <path d=\"M3 18h6v-2H3v2zM3 6v2h18V6H3zm0 7h12v-2H3v2z\" />\n, 'SortOutlined');\n","import {message} from '@common/i18n/message';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {Button, ButtonProps} from '@common/ui/buttons/button';\nimport {SortIcon} from '@common/icons/material/Sort';\nimport {Trans} from '@common/i18n/trans';\n\nconst SortOptions = [\n {\n value: 'created_at:desc',\n label: message('Newest'),\n },\n {\n value: 'created_at:asc',\n label: message('Oldest'),\n },\n {\n value: 'mostHelpful',\n label: message('Most helpful'),\n },\n {\n value: 'reports_count:desc',\n label: message('Most reported'),\n },\n];\n\ninterface Props {\n value: string;\n onValueChange: (newValue: string) => void;\n color?: ButtonProps['color'];\n showReportsItem?: boolean;\n}\nexport function ReviewListSortButton({\n value,\n onValueChange,\n color,\n showReportsItem,\n}: Props) {\n let selectedOption = SortOptions.find(option => option.value === value);\n if (!selectedOption) {\n selectedOption = SortOptions[0];\n }\n return (\n <MenuTrigger\n selectedValue={value}\n onSelectionChange={newValue => onValueChange(newValue as string)}\n selectionMode=\"single\"\n >\n <Button variant=\"outline\" startIcon={<SortIcon />} color={color}>\n <Trans {...selectedOption.label} />\n </Button>\n <Menu>\n {SortOptions.filter(\n option => option.value !== 'reports_count:desc' || showReportsItem\n ).map(option => (\n <MenuItem value={option.value} key={option.value}>\n <Trans {...option.label} />\n </MenuItem>\n ))}\n </Menu>\n </MenuTrigger>\n );\n}\n","import {Link, LinkProps} from 'react-router-dom';\nimport clsx from 'clsx';\nimport React, {ReactNode} from 'react';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nexport interface BaseMediaLinkProps extends Omit<LinkProps, 'to' | 'title'> {\n link: string;\n className?: string;\n children?: ReactNode;\n color?: 'primary' | 'inherit';\n displayContents?: boolean;\n}\nexport function BaseMediaLink({\n link,\n className,\n children,\n color = 'inherit',\n displayContents,\n ...linkProps\n}: BaseMediaLinkProps) {\n const baseClassName = displayContents\n ? 'contents'\n : clsx(\n color === 'primary'\n ? 'text-primary hover:text-primary-dark'\n : 'text-inherit',\n 'hover:underline outline-none focus-visible:underline overflow-x-hidden overflow-ellipsis transition-colors'\n );\n return (\n <Link {...linkProps} className={clsx(baseClassName, className)} to={link}>\n {children}\n </Link>\n );\n}\n\nexport function getBaseMediaLink(\n link: string,\n {absolute}: {absolute?: boolean} = {}\n): string {\n if (absolute) {\n link = `${getBootstrapData().settings.base_url}${link}`;\n }\n return link;\n}\n","import React, {useMemo} from 'react';\nimport {Title} from '@app/titles/models/title';\nimport {getTitleLink} from '@app/titles/title-link';\nimport {Trans} from '@common/i18n/trans';\nimport {BaseMediaLink, BaseMediaLinkProps} from '@app/base-media-link';\n\nexport interface SeasonLinkProps extends Omit<BaseMediaLinkProps, 'link'> {\n title: Title;\n seasonNumber: number;\n}\nexport function SeasonLink({\n title,\n seasonNumber,\n children,\n color = 'inherit',\n ...linkProps\n}: SeasonLinkProps) {\n const link = useMemo(() => {\n return getSeasonLink(title, seasonNumber);\n }, [title, seasonNumber]);\n\n return (\n <BaseMediaLink {...linkProps} link={link}>\n {children ?? (\n <Trans message=\"Season :number\" values={{number: seasonNumber}} />\n )}\n </BaseMediaLink>\n );\n}\n\nexport function getSeasonLink(\n title: Title,\n seasonNumber: number | string,\n {absolute}: {absolute?: boolean} = {}\n): string {\n const titleLink = getTitleLink(title, {absolute});\n return `${titleLink}/season/${seasonNumber}`;\n}\n","import React, {useMemo} from 'react';\nimport {Title} from '@app/titles/models/title';\nimport {getSeasonLink, SeasonLinkProps} from '@app/seasons/season-link';\nimport {Episode} from '@app/titles/models/episode';\nimport {BaseMediaLink} from '@app/base-media-link';\n\ninterface Props extends Omit<SeasonLinkProps, 'seasonNumber'> {\n episodeNumber?: number;\n seasonNumber?: number;\n episode?: Episode;\n}\nexport function EpisodeLink({\n title,\n seasonNumber,\n episodeNumber,\n episode,\n children,\n color = 'inherit',\n ...linkProps\n}: Props) {\n const link = useMemo(() => {\n return getEpisodeLink(\n title,\n seasonNumber || episode?.episode_number || 1,\n episodeNumber || episode?.episode_number || 1\n );\n }, [title, seasonNumber, episodeNumber, episode]);\n\n return (\n <BaseMediaLink {...linkProps} link={link}>\n {children ?? <span>{episode?.name}</span>}\n </BaseMediaLink>\n );\n}\n\nexport function getEpisodeLink(\n title: Title,\n seasonNumber: number | string,\n episodeNumber: number | string,\n {absolute}: {absolute?: boolean} = {}\n): string {\n const seasonLink = getSeasonLink(title, seasonNumber, {absolute});\n return `${seasonLink}/episode/${episodeNumber}`;\n}\n","import {Episode} from '@app/titles/models/episode';\nimport {Trans} from '@common/i18n/trans';\n\ninterface Props {\n episode?: Episode;\n seasonNum?: number;\n episodeNum?: number;\n className?: string;\n}\nexport function CompactSeasonEpisode({\n episode,\n seasonNum,\n episodeNum,\n className,\n}: Props) {\n if (!seasonNum && episode) {\n seasonNum = episode.season_number;\n }\n if (!episodeNum && episode) {\n episodeNum = episode.episode_number;\n }\n\n if (seasonNum && episodeNum) {\n return (\n <span className={className}>\n <Trans\n message=\"s:seasone:episode\"\n values={{\n season: prefixWithZero(seasonNum),\n episode: prefixWithZero(episodeNum),\n }}\n />\n </span>\n );\n }\n\n if (seasonNum) {\n return (\n <span className={className}>\n <Trans\n message=\"s:season\"\n values={{\n season: prefixWithZero(seasonNum),\n }}\n />\n </span>\n );\n }\n\n if (episodeNum) {\n return (\n <span className={className}>\n <Trans\n message=\"e:episode\"\n values={{\n episode: prefixWithZero(episodeNum),\n }}\n />\n </span>\n );\n }\n\n return null;\n}\n\nfunction prefixWithZero(value: number): string {\n return value < 10 ? `0${value}` : `${value}`;\n}\n","import React, {useMemo} from 'react';\nimport {slugifyString} from '@common/utils/string/slugify-string';\nimport {Title} from '@app/titles/models/title';\nimport {\n BaseMediaLink,\n BaseMediaLinkProps,\n getBaseMediaLink,\n} from '@app/base-media-link';\nimport {getEpisodeLink} from '@app/episodes/episode-link';\nimport {getSeasonLink} from '@app/seasons/season-link';\nimport {Episode} from '@app/titles/models/episode';\nimport {CompactSeasonEpisode} from '@app/episodes/compact-season-episode';\n\ninterface Props extends Omit<BaseMediaLinkProps, 'link'> {\n title: Title;\n}\nexport function TitleLink({title, children, ...linkProps}: Props) {\n const link = useMemo(() => {\n return getTitleLink(title);\n }, [title]);\n\n return (\n <BaseMediaLink {...linkProps} link={link}>\n {children ?? title.name}\n </BaseMediaLink>\n );\n}\n\ninterface WithEpisodeProps extends Props {\n episode: Episode;\n}\nexport function TitleLinkWithEpisodeNumber({\n title,\n episode,\n children,\n ...linkProps\n}: WithEpisodeProps) {\n const link = useMemo(() => {\n return getEpisodeLink(title, episode.season_number, episode.episode_number);\n }, [title, episode]);\n\n return (\n <BaseMediaLink {...linkProps} link={link}>\n {title.name} (<CompactSeasonEpisode episode={episode} />)\n </BaseMediaLink>\n );\n}\n\ninterface Options {\n absolute?: boolean;\n season?: number | string;\n episode?: number | string;\n}\n\nexport function getTitleLink(\n title: Title,\n {absolute, season, episode}: Options = {}\n): string {\n if (episode && season) {\n return getEpisodeLink(title, season, episode, {absolute});\n } else if (season) {\n return getSeasonLink(title, season, {absolute});\n }\n return getBaseMediaLink(`/titles/${title.id}/${slugifyString(title.name)}`, {\n absolute,\n });\n}\n","import {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {Video} from '@app/titles/models/video';\n\nexport function getWatchLink(\n video: Video,\n {absolute}: {absolute?: boolean} = {}\n): string {\n let link = `/watch/${video.id}`;\n if (absolute) {\n link = `${getBootstrapData().settings.base_url}${link}`;\n }\n return link;\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaPlayIcon = createSvgIcon(\n <path d=\"M10.6667 6.6548C10.6667 6.10764 11.2894 5.79346 11.7295 6.11862L24.377 15.4634C24.7377 15.7298 24.7377 16.2692 24.3771 16.5357L11.7295 25.8813C11.2895 26.2065 10.6667 25.8923 10.6667 25.3451L10.6667 6.6548Z\"/>,\n 'MediaPlay',\n '0 0 32 32'\n);\n","import {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport clsx from 'clsx';\nimport {Title} from '@app/titles/models/title';\nimport {TitleLink} from '@app/titles/title-link';\nimport {ImageSize, useImageSrc} from '@app/images/use-image-src';\nimport {Link} from 'react-router-dom';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Fragment} from 'react';\nimport {MovieIcon} from '@common/icons/material/Movie';\n\ninterface Props {\n title: Title;\n className?: string;\n size?: string;\n lazy?: boolean;\n srcSize?: ImageSize;\n aspect?: string;\n showPlayButton?: boolean;\n link?: string;\n}\nexport function TitlePoster({\n title,\n className,\n size = 'w-full',\n srcSize,\n lazy = true,\n aspect = 'aspect-poster',\n showPlayButton,\n link,\n}: Props) {\n const {trans} = useTrans();\n const src = useImageSrc(title?.poster, {size: srcSize});\n if (!title.primary_video) {\n showPlayButton = false;\n }\n\n const imageClassName = clsx(\n 'h-full w-full rounded bg-fg-base/4 object-cover',\n !src ? 'flex items-center justify-center' : 'block',\n );\n\n const image = src ? (\n <img\n className={imageClassName}\n decoding=\"async\"\n draggable={false}\n loading={lazy ? 'lazy' : 'eager'}\n src={src}\n alt={trans(message('Poster for :name', {values: {name: title.name}}))}\n />\n ) : (\n <span className={clsx(imageClassName, 'overflow-hidden')}>\n <MovieIcon className=\"max-w-[60%] text-divider\" size=\"text-6xl\" />\n </span>\n );\n\n const linkChildren = (\n <Fragment>\n {image}\n <span className=\"pointer-events-none absolute inset-0 block bg-black opacity-0 transition-opacity group-hover:opacity-10\" />\n </Fragment>\n );\n\n return (\n <div\n className={clsx(size, aspect, className, 'group relative flex-shrink-0')}\n >\n {link ? (\n <Link to={link} className=\"contents\">\n {linkChildren}\n </Link>\n ) : (\n <TitleLink title={title} displayContents>\n {linkChildren}\n </TitleLink>\n )}\n {showPlayButton ? (\n <div className=\"absolute bottom-14 left-14\">\n <IconButton\n color=\"white\"\n variant=\"flat\"\n className=\"shadow-md\"\n radius=\"rounded-full\"\n elementType={Link}\n to={getWatchLink(title.primary_video)}\n aria-label={`Play ${title.name}`}\n >\n <MediaPlayIcon />\n </IconButton>\n </div>\n ) : null}\n </div>\n );\n}\n","import {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport React from 'react';\n\ninterface Props {\n animate?: boolean;\n}\nexport function VideoPlayerSkeleton({animate}: Props) {\n return (\n <div className=\"relative\">\n <Skeleton\n variant=\"rect\"\n className=\"aspect-video\"\n animation={animate ? 'pulsate' : null}\n />\n <MediaPlayIcon\n className=\"absolute inset-0 m-auto text-fg-base/40\"\n size=\"w-80 h-80\"\n />\n </div>\n );\n}\n","export const IS_CLIENT = typeof window !== 'undefined';\nexport const UA = IS_CLIENT ? window.navigator?.userAgent.toLowerCase() : '';\nexport const IS_IOS = /iphone|ipad|ipod|ios|CriOS|FxiOS/.test(UA);\nexport const IS_ANDROID = /android/.test(UA);\nexport const IS_MOBILE = IS_CLIENT && (IS_IOS || IS_ANDROID);\nexport const IS_IPHONE =\n IS_CLIENT && /(iPhone|iPod)/gi.test(window.navigator?.platform);\nexport const IS_FIREFOX = /firefox/.test(UA);\n// @ts-ignore\nexport const IS_CHROME = IS_CLIENT && window.chrome;\nexport const IS_SAFARI =\n IS_CLIENT &&\n !IS_CHROME &&\n // @ts-ignore\n (window.safari || IS_IOS || /(apple|safari)/.test(UA));\n","import {MediaItem} from '@common/player/media-item';\nimport {IS_IOS} from '@common/utils/platform';\n\nconst hlsRegex = /\\.(m3u8)($|\\?)/i;\nconst dashRegex = /\\.(mpd)($|\\?)/i;\nconst audioRegex =\n /\\.(m4a|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx|flac)($|\\?)/i;\nconst youtubeUrlRegex =\n /(?:youtu\\.be|youtube|youtube\\.com|youtube-nocookie\\.com)\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=|)((?:\\w|-){11})/;\nconst youtubeIdRegex = /^((?:\\w|-){11})$/;\nexport function guessPlayerProvider(src: string): MediaItem['provider'] {\n if (youtubeUrlRegex.test(src) || youtubeIdRegex.test(src)) {\n return 'youtube';\n } else if (audioRegex.test(src)) {\n return 'htmlAudio';\n } else if (hlsRegex.test(src)) {\n if (IS_IOS) {\n return 'htmlVideo';\n } else {\n return 'hls';\n }\n } else if (dashRegex.test(src)) {\n return 'dash';\n } else {\n return 'htmlVideo';\n }\n}\n","export function shuffleArray(items: any[], keepFirst = false) {\n let first = keepFirst ? items.shift() : null;\n\n let currentIndex = items.length,\n temporaryValue,\n randomIndex;\n\n while (0 !== currentIndex) {\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex -= 1;\n\n temporaryValue = items[currentIndex];\n items[currentIndex] = items[randomIndex];\n items[randomIndex] = temporaryValue;\n }\n\n if (first) {\n items.unshift(first);\n }\n\n return [...items];\n}\n","import {getFromLocalStorage} from '@common/utils/hooks/local-storage';\nimport {PlayerStoreOptions} from '@common/player/state/player-store-options';\nimport {PlayerState} from '@common/player/state/player-state';\n\nexport interface PersistablePlayerState {\n muted?: PlayerState['muted'];\n repeat?: PlayerState['repeat'];\n shuffling?: PlayerState['shuffling'];\n volume?: PlayerState['volume'];\n}\n\nexport interface PlayerInitialData {\n state?: PersistablePlayerState;\n queue?: PlayerState['originalQueue'];\n cuedMediaId?: string | number;\n}\n\nexport function getPlayerStateFromLocalStorage(\n id: string | number,\n options?: PlayerStoreOptions\n): PlayerInitialData {\n const defaultVolume = options?.defaultVolume || 30;\n return {\n state: {\n muted: getFromLocalStorage(`player.${id}.muted`) ?? false,\n repeat: getFromLocalStorage(`player.${id}.repeat`) ?? 'all',\n shuffling: getFromLocalStorage(`player.${id}.shuffling`) ?? false,\n volume: getFromLocalStorage(`player.${id}.volume`) ?? defaultVolume,\n },\n queue: getFromLocalStorage(`player.${id}.queue`, []),\n cuedMediaId: getFromLocalStorage(`player.${id}.cuedMediaId`),\n };\n}\n","export function prependToArrayAtIndex<T>(array: T[], toAdd: T[], index = 0): T[] {\n const copyOfArray = [...array];\n const tail = copyOfArray.splice(index + 1);\n return [...copyOfArray, ...toAdd, ...tail];\n}\n","export function resetMediaSession() {\n if ('mediaSession' in navigator) {\n const actionHandlers: MediaSessionAction[] = [\n 'play',\n 'pause',\n 'previoustrack',\n 'nexttrack',\n 'stop',\n 'seekbackward',\n 'seekforward',\n 'seekto',\n ];\n actionHandlers.forEach(action =>\n navigator.mediaSession.setActionHandler(action, null)\n );\n navigator.mediaSession.metadata = null;\n navigator.mediaSession.playbackState = 'none';\n }\n}\n","import {MediaItem} from '@common/player/media-item';\nimport {PlayerState} from '@common/player/state/player-state';\n\nexport function playerQueue(state: () => PlayerState) {\n const getPointer = (): number => {\n if (state().cuedMedia) {\n return (\n state().shuffledQueue.findIndex(\n item => item.id === state().cuedMedia?.id\n ) || 0\n );\n }\n return 0;\n };\n const getCurrent = (): MediaItem | undefined => {\n return state().shuffledQueue[getPointer()];\n };\n const getFirst = (): MediaItem | undefined => {\n return state().shuffledQueue[0];\n };\n const getLast = (): MediaItem | undefined => {\n return state().shuffledQueue[state().shuffledQueue.length - 1];\n };\n const getNext = (): MediaItem | undefined => {\n return state().shuffledQueue[getPointer() + 1];\n };\n const getPrevious = (): MediaItem | undefined => {\n return state().shuffledQueue[getPointer() - 1];\n };\n const isLast = (): boolean => {\n return getPointer() === state().originalQueue.length - 1;\n };\n\n return {\n getPointer,\n getCurrent,\n getFirst,\n getLast,\n getNext,\n getPrevious,\n isLast,\n };\n}\n","import {PlayerState} from '@common/player/state/player-state';\nimport {isCtrlOrShiftPressed} from '@common/utils/keybinds/is-ctrl-or-shift-pressed';\n\nexport function handlePlayerKeybinds(\n e: KeyboardEvent,\n state: () => PlayerState,\n) {\n if (\n ['input', 'textarea'].includes(\n (e.target as HTMLElement)?.tagName.toLowerCase(),\n )\n )\n return;\n\n if (e.key === ' ' || e.key === 'k') {\n e.preventDefault();\n if (state().isPlaying) {\n state().pause();\n } else {\n state().play();\n }\n }\n\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n if (isCtrlOrShiftPressed(e)) {\n state().playPrevious();\n } else {\n state().seek(state().getCurrentTime() - 10);\n }\n }\n\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n if (isCtrlOrShiftPressed(e)) {\n state().playNext();\n } else {\n state().seek(state().getCurrentTime() + 10);\n }\n }\n}\n","import {Optional} from 'utility-types';\nimport {PlayerState} from '@common/player/state/player-state';\nimport {PlayerStoreOptions} from '@common/player/state/player-store-options';\n\nexport function initPlayerMediaSession(\n state: () => PlayerState,\n options: PlayerStoreOptions\n) {\n if ('mediaSession' in navigator) {\n const actionHandlers: Optional<\n Record<MediaSessionAction, MediaSessionActionHandler>\n > = {\n play: () => state().play(),\n pause: () => state().pause(),\n previoustrack: () => state().playPrevious(),\n nexttrack: () => state().playNext(),\n stop: () => state().stop(),\n seekbackward: () => state().seek(state().getCurrentTime() - 10),\n seekforward: () => state().seek(state().getCurrentTime() + 10),\n seekto: details => state().seek(details.seekTime || 0),\n };\n for (const key in actionHandlers) {\n try {\n navigator.mediaSession.setActionHandler(\n key as MediaSessionAction,\n actionHandlers[key as MediaSessionAction]!\n );\n } catch (error) {}\n }\n const cuedMedia = state().cuedMedia;\n if (cuedMedia) {\n options.setMediaSessionMetadata?.(cuedMedia);\n }\n }\n}\n","import {MediaItem} from '@common/player/media-item';\n\nexport function isSameMedia(a?: MediaItem, b?: MediaItem): boolean {\n if (!a || !b) return false;\n return a.id === b.id && a.groupId === b.groupId;\n}\n","export class ScreenOrientation {\n protected currentLock: OrientationLockType | undefined;\n\n async lock(lockType: OrientationLockType = 'landscape') {\n if (!this.canOrientScreen() || this.currentLock) return;\n try {\n await (screen.orientation as any).lock(lockType);\n this.currentLock = lockType;\n } catch (e) {}\n }\n\n async unlock() {\n if (!this.canOrientScreen() || !this.currentLock) return;\n await screen.orientation.unlock();\n }\n\n canOrientScreen(): boolean {\n return (\n screen.orientation != null &&\n !!(screen.orientation as any).lock &&\n !!screen.orientation.unlock\n );\n }\n}\n\nexport type OrientationLockType =\n /**\n * Any is an orientation that means the screen can be locked to any one of portrait-primary,\n * portrait-secondary, landscape-primary and landscape-secondary.\n */\n | 'any'\n\n /**\n * Landscape is an orientation where the screen width is greater than the screen height and\n * depending on platform convention locking the screen to landscape can represent\n * landscape-primary, landscape-secondary or both.\n */\n | 'landscape'\n\n /**\n * Landscape-primary is an orientation where the screen width is greater than the screen height.\n * If the device's natural orientation is landscape, then it is in landscape-primary when held\n * in that position. If the device's natural orientation is portrait, the user agent sets\n * landscape-primary from the two options as shown in the screen orientation values table.\n */\n | 'landscape-primary'\n\n /**\n * Landscape-secondary is an orientation where the screen width is greater than the screen\n * height. If the device's natural orientation is landscape, it is in landscape-secondary when\n * rotated 180º from its natural orientation. If the device's natural orientation is portrait,\n * the user agent sets landscape-secondary from the two options as shown in the screen\n * orientation values table.\n */\n | 'landscape-secondary'\n\n /**\n * Natural is an orientation that refers to either portrait-primary or landscape-primary\n * depending on the device's usual orientation. This orientation is usually provided by the\n * underlying operating system.\n */\n | 'natural'\n\n /**\n * Portrait is an orientation where the screen width is less than or equal to the screen height\n * and depending on platform convention locking the screen to portrait can represent\n * portrait-primary, portrait-secondary or both.\n */\n | 'portrait'\n\n /**\n * Portrait-primary is an orientation where the screen width is less than or equal to the screen\n * height. If the device's natural orientation is portrait, then it is in portrait-primary when\n * held in that position. If the device's natural orientation is landscape, the user agent sets\n * portrait-primary from the two options as shown in the screen orientation values table.\n */\n | 'portrait-primary'\n\n /**\n * Portrait-secondary is an orientation where the screen width is less than or equal to the\n * screen height. If the device's natural orientation is portrait, then it is in\n * portrait-secondary when rotated 180º from its natural position. If the device's natural\n * orientation is landscape, the user agent sets portrait-secondary from the two options as\n * shown in the screen orientation values table.\n */\n | 'portrait-secondary';\n","import {FullscreenAdapter} from '@common/player/state/fullscreen/fullscreen-adapter';\nimport fscreen from 'fscreen';\n\nexport function createNativeFullscreenAdapter(\n host: HTMLElement,\n onChange: () => void\n): FullscreenAdapter {\n host = host.closest('.fullscreen-host') ?? host;\n return {\n isFullscreen: () => {\n if (fscreen.fullscreenElement === host) return true;\n try {\n // Throws in iOS Safari...\n return host.matches(\n // @ts-expect-error - `fullscreenPseudoClass` is missing from `@types/fscreen`.\n fscreen.fullscreenPseudoClass\n );\n } catch (error) {\n return false;\n }\n },\n canFullScreen: () => {\n return fscreen.fullscreenEnabled;\n },\n enter: () => {\n return fscreen.requestFullscreen(host);\n },\n exit: () => {\n return fscreen.exitFullscreen();\n },\n bindEvents: () => {\n fscreen.addEventListener('fullscreenchange', onChange);\n fscreen.addEventListener('fullscreenerror', onChange);\n },\n unbindEvents: () => {\n fscreen.removeEventListener('fullscreenchange', onChange);\n fscreen.removeEventListener('fullscreenerror', onChange);\n },\n };\n}\n","import {FullscreenAdapter} from '@common/player/state/fullscreen/fullscreen-adapter';\nimport {IS_IPHONE} from '@common/utils/platform';\n\nexport function createIphoneFullscreenAdapter(\n host: HTMLVideoElement,\n onChange: () => void\n): FullscreenAdapter {\n return {\n /**\n * @link https://developer.apple.com/documentation/webkitjs/htmlvideoelement/1631913-webkitpresentationmode\n */\n isFullscreen: () => {\n return host.webkitPresentationMode === 'fullscreen';\n },\n /**\n * @link https://developer.apple.com/documentation/webkitjs/htmlvideoelement/1628805-webkitsupportsfullscreen\n */\n canFullScreen: () => {\n return (\n IS_IPHONE &&\n typeof host.webkitSetPresentationMode === 'function' &&\n (host.webkitSupportsFullscreen ?? false)\n );\n },\n enter: () => {\n return host.webkitSetPresentationMode?.('fullscreen');\n },\n exit: () => {\n return host.webkitSetPresentationMode?.('inline');\n },\n bindEvents: () => {\n host.removeEventListener('webkitpresentationmodechanged', onChange);\n },\n unbindEvents: () => {\n host.addEventListener('webkitpresentationmodechanged', onChange);\n },\n };\n}\n","import {StateCreator} from 'zustand';\nimport {\n PlayerState,\n ProviderListeners,\n} from '@common/player/state/player-state';\nimport {ScreenOrientation} from '@common/player/state/fullscreen/screen-orientation';\nimport {IS_IPHONE} from '@common/utils/platform';\nimport {FullscreenAdapter} from '@common/player/state/fullscreen/fullscreen-adapter';\nimport {createNativeFullscreenAdapter} from '@common/player/state/fullscreen/create-native-fullscreen-adapter';\nimport {createIphoneFullscreenAdapter} from '@common/player/state/fullscreen/create-iphone-fullscreen-adapter';\nimport {PipSlice} from '@common/player/state/pip/pip-slice';\n\nexport interface FullscreenSlice {\n isFullscreen: boolean;\n canFullscreen: boolean;\n enterFullscreen: () => void;\n exitFullscreen: () => void;\n toggleFullscreen: () => void;\n initFullscreen: () => void;\n destroyFullscreen: () => void;\n}\n\ntype BaseSliceCreator = StateCreator<\n FullscreenSlice & PlayerState & PipSlice,\n [['zustand/immer', unknown]],\n [],\n FullscreenSlice\n>;\n\ntype StoreLice = BaseSliceCreator extends (...a: infer U) => infer R\n ? (...a: [...U, Set<Partial<ProviderListeners>>]) => R\n : never;\n\nconst iPhoneProviderBlacklist = ['youtube'];\n\nexport const createFullscreenSlice: StoreLice = (set, get) => {\n let subscription: () => void | undefined;\n const orientation = new ScreenOrientation();\n let adapter: FullscreenAdapter | undefined;\n\n const onFullscreenChange = async () => {\n const isFullscreen = adapter?.isFullscreen();\n if (isFullscreen) {\n // lock orientation to landscape\n orientation.lock();\n } else {\n orientation.unlock();\n }\n set({isFullscreen});\n };\n\n const isSupported = (): boolean => {\n // iPhone only allows putting video element in fullscreen, and\n // there's no way to get access to it with YouTube iframe api\n if (IS_IPHONE && iPhoneProviderBlacklist.includes(get().providerName!)) {\n return false;\n }\n return adapter?.canFullScreen() ?? false;\n };\n\n return {\n isFullscreen: false,\n canFullscreen: false,\n enterFullscreen: () => {\n if (!isSupported() || adapter?.isFullscreen()) return;\n\n // exit pip if it's active\n if (get().isPip) {\n get().exitPip();\n }\n return adapter?.enter();\n },\n exitFullscreen: () => {\n if (!adapter?.isFullscreen()) return;\n return adapter.exit();\n },\n toggleFullscreen: () => {\n if (get().isFullscreen) {\n get().exitFullscreen();\n } else {\n get().enterFullscreen();\n }\n },\n initFullscreen: () => {\n subscription = get().subscribe({\n providerReady: ({el}) => {\n // when changing adapters, remove previous adapter events and exit fullscreen\n adapter?.unbindEvents();\n if (get().isFullscreen) {\n adapter?.exit();\n }\n // create new adapter, and if fullscreen is supported, bind events\n adapter = IS_IPHONE\n ? createIphoneFullscreenAdapter(\n el as HTMLVideoElement,\n onFullscreenChange\n )\n : createNativeFullscreenAdapter(el, onFullscreenChange);\n const canFullscreen = isSupported();\n set({canFullscreen});\n if (canFullscreen) {\n adapter.bindEvents();\n }\n },\n });\n },\n destroyFullscreen: () => {\n get().exitFullscreen();\n subscription?.();\n },\n };\n};\n","import {PipAdapter} from '@common/player/state/pip/pip-adapter';\nimport {IS_CLIENT} from '@common/utils/platform';\n\nexport const createChromePipAdapter = (\n host: HTMLVideoElement,\n onChange: () => void\n): PipAdapter => {\n return {\n isSupported: () => canUsePiPInChrome(),\n isPip: () => {\n return host === document.pictureInPictureElement;\n },\n enter: () => {\n if (canUsePiPInChrome()) {\n return host.requestPictureInPicture();\n }\n },\n exit: () => {\n if (canUsePiPInChrome()) {\n return document.exitPictureInPicture();\n }\n },\n bindEvents: () => {\n if (canUsePiPInChrome()) {\n host.addEventListener('enterpictureinpicture', onChange);\n host.addEventListener('leavepictureinpicture', onChange);\n }\n },\n unbindEvents: () => {\n if (canUsePiPInChrome()) {\n host.removeEventListener('enterpictureinpicture', onChange);\n host.removeEventListener('leavepictureinpicture', onChange);\n }\n },\n };\n};\n\n/**\n * Checks if the native HTML5 video player can enter picture-in-picture (PIP) mode when using\n * the Chrome browser.\n *\n * @see https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n */\nlet _canUsePiPInChrome: boolean | undefined;\nconst canUsePiPInChrome = (): boolean => {\n if (!IS_CLIENT) return false;\n if (_canUsePiPInChrome == null) {\n const video = document.createElement('video');\n _canUsePiPInChrome =\n !!document.pictureInPictureEnabled && !video.disablePictureInPicture;\n }\n return _canUsePiPInChrome;\n};\n","import {PipAdapter} from '@common/player/state/pip/pip-adapter';\nimport {IS_CLIENT, IS_IPHONE} from '@common/utils/platform';\n\nexport const createSafariPipAdapter = (\n host: HTMLVideoElement,\n onChange: () => void\n): PipAdapter => {\n return {\n isSupported: () => canUsePiPInSafari(),\n isPip: () => {\n return host.webkitPresentationMode === 'picture-in-picture';\n },\n enter: () => {\n if (canUsePiPInSafari()) {\n return host.webkitSetPresentationMode?.('picture-in-picture');\n }\n },\n exit: () => {\n if (canUsePiPInSafari()) {\n return host.webkitSetPresentationMode?.('inline');\n }\n },\n bindEvents: () => {\n if (canUsePiPInSafari()) {\n host.addEventListener('webkitpresentationmodechanged', onChange);\n }\n },\n unbindEvents: () => {\n if (canUsePiPInSafari()) {\n host.removeEventListener('webkitpresentationmodechanged', onChange);\n }\n },\n };\n};\n\n/**\n * Checks if the native HTML5 video player can enter picture-in-picture (PIP) mode when using\n * the desktop Safari browser, iOS Safari appears to \"support\" PiP through the check, however PiP\n * does not function.\n *\n * @see https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n */\nlet _canUsePiPInSafari: boolean | undefined;\nconst canUsePiPInSafari = (): boolean => {\n if (!IS_CLIENT) return false;\n const video = document.createElement('video');\n if (_canUsePiPInSafari == null) {\n _canUsePiPInSafari =\n // @ts-ignore\n !!video.webkitSupportsPresentationMode &&\n // @ts-ignore\n !!video.webkitSetPresentationMode &&\n !IS_IPHONE;\n }\n return _canUsePiPInSafari;\n};\n","import {StateCreator} from 'zustand';\nimport {\n PlayerState,\n ProviderListeners,\n} from '@common/player/state/player-state';\nimport {PipAdapter} from '@common/player/state/pip/pip-adapter';\nimport {createChromePipAdapter} from '@common/player/state/pip/chrome-pip-adapter';\nimport {createSafariPipAdapter} from '@common/player/state/pip/safari-pip-adapter';\n\nexport interface PipSlice {\n isPip: boolean;\n canPip: boolean;\n enterPip: () => void;\n exitPip: () => void;\n togglePip: () => void;\n initPip: () => void;\n destroyPip: () => void;\n}\n\ntype BaseSliceCreator = StateCreator<\n PipSlice & PlayerState,\n [['zustand/immer', unknown]],\n [],\n PipSlice\n>;\n\ntype StoreLice = BaseSliceCreator extends (...a: infer U) => infer R\n ? (...a: [...U, Set<Partial<ProviderListeners>>]) => R\n : never;\n\nconst adapterFactories = [createChromePipAdapter, createSafariPipAdapter];\n\nexport const createPipSlice: StoreLice = (set, get) => {\n let subscription: () => void | undefined;\n let adapters: PipAdapter[] = [];\n\n const onPipChange = () => {\n set({isPip: adapters.some(a => a.isPip())});\n };\n\n const isSupported = (): boolean => {\n if (get().providerName !== 'htmlVideo') {\n return false;\n }\n return adapters.some(adapter => adapter.isSupported());\n };\n\n return {\n isPip: false,\n canPip: false,\n enterPip: async () => {\n if (get().isPip || !isSupported()) return;\n await adapters.find(a => a.isSupported())?.enter();\n },\n exitPip: async () => {\n if (!get().isPip) return;\n await adapters.find(a => a.isSupported())?.exit();\n },\n togglePip: () => {\n if (get().isPip) {\n get().exitPip();\n } else {\n get().enterPip();\n }\n },\n initPip: () => {\n subscription = get().subscribe({\n providerReady: ({el}) => {\n // when changing adapters, remove previous adapter events and exit pip\n adapters.every(a => a.unbindEvents());\n if (get().isPip) {\n adapters.every(a => a.exit());\n }\n // create new adapters, and if pip is supported on at least one, bind events\n adapters = adapterFactories.map(factory =>\n factory(el as HTMLVideoElement, onPipChange)\n );\n const canPip = isSupported();\n if (canPip) {\n adapters.every(a => a.bindEvents());\n }\n set({canPip});\n },\n });\n },\n destroyPip: () => {\n get().exitPip();\n subscription?.();\n },\n };\n};\n","import {createStore} from 'zustand';\nimport {immer} from 'zustand/middleware/immer';\nimport {MediaItem} from '@common/player/media-item';\nimport {setInLocalStorage as _setInLocalStorage} from '@common/utils/hooks/local-storage';\nimport {shuffleArray} from '@common/utils/array/shuffle-array';\nimport {PlayerStoreOptions} from '@common/player/state/player-store-options';\nimport {getPlayerStateFromLocalStorage} from '@common/player/utils/player-local-storage';\nimport {prependToArrayAtIndex} from '@common/utils/array/prepend-to-array-at-index';\nimport deepMerge from 'deepmerge';\nimport {resetMediaSession} from '@common/player/utils/reset-media-session';\nimport {playerQueue} from '@common/player/player-queue';\nimport type {\n PlayerState,\n ProviderListeners,\n RepeatMode,\n} from '@common/player/state/player-state';\nimport {handlePlayerKeybinds} from '@common/player/handle-player-keybinds';\nimport {initPlayerMediaSession} from '@common/player/utils/init-player-media-session';\nimport {isSameMedia} from '@common/player/utils/is-same-media';\nimport {\n createFullscreenSlice,\n FullscreenSlice,\n} from '@common/player/state/fullscreen/fullscreen-slice';\nimport {createPipSlice, PipSlice} from '@common/player/state/pip/pip-slice';\nimport {subscribeWithSelector} from 'zustand/middleware';\n\nexport const createPlayerStore = (\n id: string | number,\n options: PlayerStoreOptions,\n) => {\n // initialData from options should take priority over local storage data\n const initialData = deepMerge(\n getPlayerStateFromLocalStorage(id, options),\n options.initialData || {},\n );\n\n const setInLocalStorage = (key: string, value: any) => {\n _setInLocalStorage(`player.${id}.${key}`, value);\n };\n\n return createStore<PlayerState & FullscreenSlice & PipSlice>()(\n subscribeWithSelector(\n immer((set, get, store) => {\n const listeners = new Set<Partial<ProviderListeners>>();\n const internalListeners: Partial<ProviderListeners> = {\n play: () => {\n set(s => {\n s.isPlaying = true;\n s.playbackStarted = true;\n });\n },\n pause: () => {\n set(s => {\n s.isPlaying = false;\n s.controlsVisible = true;\n });\n },\n error: e => {\n set(s => {\n // there could be a number of non-fatal errors where player will continue to\n // work properly, like autoplay error from HTML5 video or buffer full from HLS\n if (e?.fatal) {\n s.isPlaying = false;\n }\n });\n },\n durationChange: payload => {\n set({mediaDuration: payload.duration});\n },\n streamTypeChange: payload => {\n set({streamType: payload.streamType});\n },\n buffered: payload => {\n //\n },\n playbackRateChange: payload => {\n set({playbackRate: payload.rate});\n },\n playbackRates: ({rates}) => {\n set({playbackRates: rates});\n },\n playbackQualities: ({qualities}) => {\n set({playbackQualities: qualities});\n },\n audioTracks: ({tracks}) => {\n set({audioTracks: tracks});\n },\n currentAudioTrackChange: ({trackId}) => {\n set({currentAudioTrack: trackId});\n },\n playbackQualityChange: ({quality}) => {\n set({playbackQuality: quality});\n },\n textTracks: ({tracks}) => {\n set({textTracks: tracks});\n },\n currentTextTrackChange: ({trackId}) => {\n set({currentTextTrack: trackId});\n },\n textTrackVisibilityChange: ({isVisible}) => {\n set({textTrackIsVisible: isVisible});\n },\n buffering: ({isBuffering}) => {\n set({isBuffering});\n },\n playbackEnd: async () => {\n const media = get().cuedMedia;\n\n // don't play next or repeat while seeking via seekbar\n if (get().isSeeking) return;\n if (queue.isLast() && options.loadMoreMediaItems) {\n const items = await options.loadMoreMediaItems(media);\n if (items?.length) {\n get().appendToQueue(items);\n }\n }\n\n get().playNext();\n },\n posterLoaded: ({url}) => {\n set({posterUrl: url});\n },\n providerReady: () => {\n const provider = get().providerApi;\n if (provider) {\n provider.setVolume(get().volume);\n provider.setMuted(get().muted);\n if (options.autoPlay) {\n provider.play();\n }\n set({providerReady: true});\n }\n },\n };\n\n const queue = playerQueue(get);\n\n const keybindsHandler = (e: KeyboardEvent) => {\n handlePlayerKeybinds(e, get);\n };\n\n const initialQueue = initialData.queue || [];\n return {\n options,\n ...createFullscreenSlice(set, get, store, listeners),\n ...createPipSlice(set, get, store, listeners),\n originalQueue: initialQueue,\n shuffledQueue: initialData.state?.shuffling\n ? shuffleArray(initialQueue)\n : initialQueue,\n isPlaying: false,\n isBuffering: false,\n streamType: null,\n playbackStarted: false,\n providerReady: false,\n pauseWhileSeeking: options.pauseWhileSeeking ?? true,\n isSeeking: false,\n setIsSeeking: (isSeeking: boolean) => {\n set({isSeeking});\n },\n controlsVisible: true,\n setControlsVisible: (isVisible: boolean) => {\n set(s => {\n s.controlsVisible = isVisible;\n });\n },\n volume: initialData.state?.volume ?? 30,\n setVolume: value => {\n get().providerApi?.setVolume(value);\n set(s => {\n s.volume = value;\n });\n setInLocalStorage('volume', value);\n },\n muted: initialData.state?.muted ?? false,\n setMuted: isMuted => {\n get().providerApi?.setMuted(isMuted);\n set(s => {\n s.muted = isMuted;\n });\n setInLocalStorage('muted', isMuted);\n },\n playbackRates: [],\n playbackRate: 1,\n setPlaybackRate: speed => {\n get().providerApi?.setPlaybackRate(speed);\n },\n playbackQuality: 'auto',\n setPlaybackQuality: quality => {\n get().providerApi?.setPlaybackQuality?.(quality);\n },\n playbackQualities: [],\n repeat: initialData.state?.repeat ?? 'all',\n toggleRepeatMode: () => {\n let newRepeat: RepeatMode = 'all';\n const currentRepeat = get().repeat;\n if (currentRepeat === 'all') {\n newRepeat = 'one';\n } else if (currentRepeat === 'one') {\n newRepeat = false;\n }\n\n set({repeat: newRepeat});\n setInLocalStorage('repeat', newRepeat);\n },\n shuffling: initialData.state?.shuffling ?? false,\n toggleShuffling: () => {\n let newQueue: MediaItem[] = [];\n\n if (get().shuffling) {\n newQueue = get().originalQueue;\n } else {\n newQueue = shuffleArray([...get().shuffledQueue]);\n }\n\n set(s => {\n s.shuffling = !s.shuffling;\n s.shuffledQueue = newQueue;\n });\n },\n mediaDuration: 0,\n seek: time => {\n const timeStr = `${time}`;\n if (timeStr.startsWith('+')) {\n time = get().getCurrentTime() + Number(time);\n } else if (timeStr.startsWith('-')) {\n time = get().getCurrentTime() - Number(timeStr.replace('-', ''));\n } else {\n time = Number(time);\n }\n get().providerApi?.seek(time);\n get().emit('seek', {time});\n },\n getCurrentTime: () => {\n return get().providerApi?.getCurrentTime() || 0;\n },\n play: async media => {\n // get currently active queue item, if none is provided\n if (media) {\n await get().cue(media);\n } else {\n media = get().cuedMedia || queue.getCurrent();\n }\n // if no media to play, stop player and bail\n if (!media) {\n get().stop();\n return;\n }\n await options.onBeforePlay?.();\n await get().providerApi?.play();\n },\n pause: () => {\n get().providerApi?.pause();\n },\n stop: () => {\n if (!get().isPlaying) return;\n get().pause();\n get().seek(0);\n },\n playNext: async () => {\n get().stop();\n let media = queue.getCurrent();\n\n if (get().repeat === 'all' && queue.isLast()) {\n media = queue.getFirst();\n } else if (get().repeat !== 'one') {\n media = queue.getNext();\n }\n\n // YouTube provider will not play the same tray unless we wait some time after playback end\n if (get().repeat === 'one' && get().providerName === 'youtube') {\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n\n // allow user to handle playing next track\n if (options.onBeforePlayNext?.(media)) {\n return;\n }\n\n if (media) {\n await get().play(media);\n } else {\n get().seek(0);\n get().play();\n }\n },\n playPrevious: async () => {\n get().stop();\n let media = queue.getCurrent();\n\n if (get().repeat === 'all' && queue.getPointer() === 0) {\n media = queue.getLast();\n } else if (get().repeat !== 'one') {\n media = queue.getPrevious();\n }\n\n // allow user to handle playing previous track\n if (options.onBeforePlayPrevious?.(media)) {\n return;\n }\n\n if (media) {\n await get().play(media);\n } else {\n get().seek(0);\n get().play();\n }\n },\n cue: async media => {\n if (isSameMedia(media, get().cuedMedia)) return;\n\n get().emit('beforeCued', {previous: get().cuedMedia});\n\n return new Promise((resolve, reject) => {\n const previousProvider = get().providerName;\n\n // wait until media is cued on provider or 3 seconds\n const timeoutId = setTimeout(() => {\n unsubscribe();\n resolve();\n }, 3000);\n const unsubscribe = get().subscribe({\n cued: () => {\n clearTimeout(timeoutId);\n unsubscribe();\n resolve();\n },\n error: e => {\n clearTimeout(timeoutId);\n unsubscribe();\n reject('Could not cue media');\n },\n });\n\n set({\n cuedMedia: media,\n posterUrl: media.poster,\n providerName: media.provider,\n providerReady: previousProvider === media.provider,\n streamType: 'streamType' in media ? media.streamType : null,\n });\n\n if (media) {\n options.setMediaSessionMetadata?.(media);\n }\n\n if (options.persistQueueInLocalStorage) {\n setInLocalStorage('cuedMediaId', media.id);\n }\n });\n },\n async overrideQueue(\n mediaItems: MediaItem[],\n queuePointer: number = 0,\n ): Promise<any> {\n if (!mediaItems?.length) return;\n const items = [...mediaItems];\n set(s => {\n s.shuffledQueue = get().shuffling\n ? shuffleArray(items, true)\n : items;\n s.originalQueue = items;\n });\n if (options.persistQueueInLocalStorage) {\n setInLocalStorage('queue', get().originalQueue.slice(0, 15));\n }\n const media =\n queuePointer > -1 ? mediaItems[queuePointer] : queue.getCurrent();\n if (media) {\n return get().cue(media);\n }\n },\n appendToQueue: (mediaItems, afterCuedMedia = true) => {\n const shuffledNewItems = get().shuffling\n ? shuffleArray([...mediaItems])\n : [...mediaItems];\n const index = afterCuedMedia ? queue.getPointer() : 0;\n set(s => {\n s.shuffledQueue = prependToArrayAtIndex(\n s.shuffledQueue,\n shuffledNewItems,\n index,\n );\n s.originalQueue = prependToArrayAtIndex(\n s.originalQueue,\n mediaItems,\n index,\n );\n });\n if (options.persistQueueInLocalStorage) {\n setInLocalStorage('queue', get().originalQueue.slice(0, 15));\n }\n },\n removeFromQueue: mediaItems => {\n set(s => {\n s.shuffledQueue = s.shuffledQueue.filter(\n item => !mediaItems.find(m => isSameMedia(m, item)),\n );\n s.originalQueue = s.originalQueue.filter(\n item => !mediaItems.find(m => isSameMedia(m, item)),\n );\n });\n if (options.persistQueueInLocalStorage) {\n setInLocalStorage('queue', get().originalQueue.slice(0, 15));\n }\n },\n textTracks: [],\n currentTextTrack: -1,\n setCurrentTextTrack: trackId => {\n get().providerApi?.setCurrentTextTrack?.(trackId);\n },\n textTrackIsVisible: false,\n setTextTrackVisibility: isVisible => {\n get().providerApi?.setTextTrackVisibility?.(isVisible);\n },\n audioTracks: [],\n currentAudioTrack: -1,\n setCurrentAudioTrack: trackId => {\n get().providerApi?.setCurrentAudioTrack?.(trackId);\n },\n destroy: () => {\n get().destroyFullscreen();\n get().destroyPip();\n options?.onDestroy?.();\n resetMediaSession();\n listeners.clear();\n document.removeEventListener('keydown', keybindsHandler);\n },\n init: async () => {\n // add initial and listeners from options, these will be present for the entire lifetime of the player\n get().initFullscreen();\n\n listeners.add(internalListeners);\n if (options.listeners) {\n listeners.add(options.listeners as Partial<ProviderListeners>);\n }\n\n const mediaId =\n initialData.cuedMediaId || initialData.queue?.[0]?.id;\n const mediaToCue = initialData.queue?.find(\n media => media.id === mediaId,\n );\n if (mediaToCue) {\n await get().cue(mediaToCue);\n }\n initPlayerMediaSession(get, options);\n document.addEventListener('keydown', keybindsHandler);\n },\n subscribe: newListeners => {\n listeners.add(newListeners);\n return () => listeners.delete(newListeners);\n },\n emit(event, payload?: any) {\n listeners.forEach(l => l[event]?.({state: get(), ...payload}));\n },\n };\n }),\n ),\n );\n};\n","import {createContext, ReactNode, useState} from 'react';\nimport {createPlayerStore} from '@common/player/state/player-store';\nimport {PlayerStoreOptions} from '@common/player/state/player-store-options';\nimport type {PlayerStoreApi} from '@common/player/state/player-state';\n\nexport const PlayerStoreContext = createContext<PlayerStoreApi>(null!);\n\ninterface PlayerContextProps {\n children: ReactNode;\n id: string | number;\n options: PlayerStoreOptions;\n}\nexport function PlayerContext({children, id, options}: PlayerContextProps) {\n //lazily create store object only once\n const [store] = useState(() => {\n return createPlayerStore(id, options);\n });\n\n return (\n <PlayerStoreContext.Provider value={store}>\n {children}\n </PlayerStoreContext.Provider>\n );\n}\n","/**\n * @see https://developers.google.com/youtube/iframe_api_reference#Playback_controls\n */\nexport const enum YoutubeCommand {\n Play = 'playVideo',\n Pause = 'pauseVideo',\n Stop = 'stopVideo',\n Seek = 'seekTo',\n Cue = 'cueVideoById',\n CueAndPlay = 'loadVideoById',\n Mute = 'mute',\n Unmute = 'unMute',\n SetVolume = 'setVolume',\n SetPlaybackRate = 'setPlaybackRate',\n SetPlaybackQuality = 'setPlaybackQuality',\n}\n\nexport interface YouTubeCommandArg {\n [YoutubeCommand.Play]: void;\n [YoutubeCommand.Pause]: void;\n [YoutubeCommand.Stop]: void;\n [YoutubeCommand.Seek]: number;\n [YoutubeCommand.Cue]: string;\n [YoutubeCommand.CueAndPlay]: string;\n [YoutubeCommand.Mute]: void;\n [YoutubeCommand.Unmute]: void;\n [YoutubeCommand.SetVolume]: number;\n [YoutubeCommand.SetPlaybackRate]: number;\n [YoutubeCommand.SetPlaybackQuality]: string;\n}\n\n/**\n * @see https://developers.google.com/youtube/iframe_api_reference#onStateChange\n */\nexport const enum YouTubePlayerState {\n Unstarted = -1,\n Ended = 0,\n Playing = 1,\n Paused = 2,\n Buffering = 3,\n Cued = 5,\n}\n\nexport interface YoutubeInternalState {\n duration: number;\n currentTime: number;\n videoId?: string;\n lastTimeUpdate: number;\n playbackRate: number;\n playbackReady: boolean;\n buffered: number;\n state: YouTubePlayerState;\n firedPlaybackEnd: boolean;\n}\n\nexport const enum YouTubePlaybackQuality {\n Unknown = 'unknown',\n Tiny = 'tiny',\n Small = 'small',\n Medium = 'medium',\n Large = 'large',\n Hd720 = 'hd720',\n Hd1080 = 'hd1080',\n Highres = 'highres',\n Max = 'max',\n}\n\nexport interface YouTubeMessage {\n channel: string;\n event: 'initialDelivery' | 'onReady' | 'infoDelivery' | 'apiInfoDelivery';\n info?: YoutubeMessageInfo;\n}\n\nexport interface YoutubeMessageInfo {\n availablePlaybackRates?: number[];\n availableQualityLevels?: YouTubePlaybackQuality[];\n currentTime?: number;\n currentTimeLastUpdated?: number;\n videoLoadedFraction?: number;\n volume?: number;\n videoUrl?: string;\n videoData?: {\n author: string;\n title: string;\n video_id: string;\n errorCode?: string;\n };\n duration?: number;\n muted?: boolean;\n playbackQuality?: YouTubePlaybackQuality;\n playbackRate?: number;\n playerState?: YouTubePlayerState;\n}\n\nexport interface YoutubeProviderError {\n code?: string;\n videoId?: string;\n}\n\nexport interface YoutubeProviderInternalApi {\n loadVideoById: (videoId: string) => void;\n}\n","export function isNumber(value: any): value is number {\n return typeof value === 'number' && !Number.isNaN(value);\n}\n","/**\n * Load image avoiding xhr/fetch CORS issues. Server status can't be obtained this way\n * unfortunately, so this uses \"naturalWidth\" to determine if the image has been loaded. By\n * default, it checks if it is at least 1px.\n */\nexport const loadImage = (\n src: string,\n minWidth = 1\n): Promise<HTMLImageElement> =>\n new Promise((resolve, reject) => {\n const image = new Image();\n const handler = () => {\n // @ts-expect-error\n delete image.onload;\n // @ts-expect-error\n delete image.onerror;\n if (image.naturalWidth >= minWidth) {\n resolve(image);\n } else {\n reject('Could not load youtube image');\n }\n };\n Object.assign(image, {onload: handler, onerror: handler, src});\n });\n","import {loadImage} from '@common/utils/http/load-image';\n\nconst posterCache = new Map<string, string>();\n\nexport async function loadYoutubePoster(\n videoId: string\n): Promise<string | undefined> {\n if (!videoId) return;\n if (posterCache.has(videoId)) {\n return posterCache.get(videoId);\n }\n\n const posterURL = (quality: string) =>\n `https://i.ytimg.com/vi/${videoId}/${quality}.jpg`;\n\n /**\n * We are testing that the image has a min-width of 121px because if the thumbnail does not\n * exist YouTube returns a blank/error image that is 120px wide.\n */\n return loadImage(posterURL('maxresdefault'), 121) // 1080p (no padding)\n .catch(() => loadImage(posterURL('sddefault'), 121)) // 640p (padded 4:3)\n .catch(() => loadImage(posterURL('hqdefault'), 121)) // 480p (padded 4:3)\n .catch(() => {})\n .then(img => {\n if (!img) return;\n const poster = img.src;\n posterCache.set(videoId, poster);\n return poster;\n });\n}\n","import {\n YoutubeInternalState,\n YouTubeMessage,\n YoutubeMessageInfo,\n YouTubePlayerState,\n YoutubeProviderError,\n} from '@common/player/providers/youtube/youtube-types';\nimport {MutableRefObject, RefObject} from 'react';\nimport {PlayerStoreApi} from '@common/player/state/player-state';\nimport {isNumber} from '@common/utils/number/is-number';\nimport {loadYoutubePoster} from '@common/player/providers/youtube/load-youtube-poster';\n\nexport function handleYoutubeEmbedMessage(\n e: MessageEvent,\n internalStateRef: MutableRefObject<YoutubeInternalState>,\n iframeRef: RefObject<HTMLIFrameElement>,\n store: PlayerStoreApi\n) {\n const data = (\n typeof e.data === 'string' ? JSON.parse(e.data) : e.data\n ) as YouTubeMessage;\n const info = data.info;\n const internalState = internalStateRef.current;\n const emit = store.getState().emit;\n if (!info) return;\n\n if (info.videoData?.video_id) {\n internalState.videoId = info.videoData.video_id;\n }\n\n if (info.videoData?.errorCode) {\n const event: YoutubeProviderError = {\n code: info.videoData.errorCode,\n videoId: internalState.videoId,\n };\n emit('error', {sourceEvent: event});\n }\n\n if (isNumber(info.duration) && info.duration !== internalState.duration) {\n internalState.duration = info.duration;\n emit('durationChange', {duration: internalState.duration});\n }\n\n if (\n isNumber(info.currentTime) &&\n info.currentTime !== internalState.currentTime\n ) {\n internalState.currentTime = info.currentTime;\n // don't fire progress events while seeking via seekbar\n if (!store.getState().isSeeking) {\n emit('progress', {currentTime: internalState.currentTime});\n }\n }\n\n if (isNumber(info.currentTimeLastUpdated)) {\n internalState.lastTimeUpdate = info.currentTimeLastUpdated;\n }\n\n if (isNumber(info.playbackRate)) {\n if (internalState.playbackRate !== info.playbackRate) {\n emit('playbackRateChange', {rate: info.playbackRate});\n }\n internalState.playbackRate = info.playbackRate;\n }\n\n if (isNumber(info.videoLoadedFraction)) {\n const buffered = info.videoLoadedFraction * internalState.duration;\n if (internalState.buffered !== buffered) {\n emit('buffered', {\n seconds: info.videoLoadedFraction * internalState.duration,\n });\n }\n internalState.buffered = buffered;\n }\n\n if (Array.isArray(info.availablePlaybackRates)) {\n emit('playbackRates', {rates: info.availablePlaybackRates});\n }\n\n if (isNumber(info.playerState)) {\n onYoutubeStateChange(info, internalStateRef, iframeRef, store);\n internalState.state = info.playerState;\n }\n}\n\nfunction onYoutubeStateChange(\n info: YoutubeMessageInfo,\n internalStateRef: MutableRefObject<YoutubeInternalState>,\n iframeRef: RefObject<HTMLIFrameElement>,\n store: PlayerStoreApi\n) {\n const emit = store.getState().emit;\n const state = info.playerState!;\n\n const onCued = async () => {\n // load poster, if needed\n if (info.videoData?.video_id && !store.getState().cuedMedia?.poster) {\n const url = await loadYoutubePoster(info.videoData.video_id);\n if (url) {\n store.getState().emit('posterLoaded', {url});\n }\n }\n\n // mark provider as ready\n if (!internalStateRef.current.playbackReady) {\n emit('providerReady', {el: iframeRef.current!});\n internalStateRef.current.playbackReady = true;\n }\n emit('cued');\n };\n\n emit('youtubeStateChange', {state});\n emit('buffering', {isBuffering: state === YouTubePlayerState.Buffering});\n\n if (state !== YouTubePlayerState.Ended) {\n internalStateRef.current.firedPlaybackEnd = false;\n }\n\n switch (state) {\n case YouTubePlayerState.Unstarted:\n // When using autoplay, but autoplay fails, player will get \"unstarted\" event\n onCued();\n break;\n case YouTubePlayerState.Ended:\n // will sometimes fire twice without this, if player starts buffering as a result of seek to the end\n if (!internalStateRef.current.firedPlaybackEnd) {\n emit('playbackEnd');\n internalStateRef.current.firedPlaybackEnd = true;\n }\n break;\n case YouTubePlayerState.Playing:\n // When using autoplay, \"cued\" event is never fired, handle \"cued\" here instead\n onCued();\n emit('play');\n break;\n case YouTubePlayerState.Paused:\n emit('pause');\n break;\n case YouTubePlayerState.Cued:\n onCued();\n break;\n }\n}\n","import {StoreApi} from 'zustand';\nimport {useContext} from 'react';\nimport {PlayerStoreContext} from '@common/player/player-context';\nimport {PlayerState} from '@common/player/state/player-state';\nimport {FullscreenSlice} from '@common/player/state/fullscreen/fullscreen-slice';\nimport {PipSlice} from '@common/player/state/pip/pip-slice';\nimport {useStoreWithEqualityFn} from 'zustand/traditional';\n\ntype ExtractState<S> = S extends {\n getState: () => infer T;\n}\n ? T\n : never;\n\ntype UsePlayerStore = {\n (): ExtractState<StoreApi<PlayerState>>;\n <U>(\n selector: (\n state: ExtractState<StoreApi<PlayerState & FullscreenSlice & PipSlice>>\n ) => U,\n equalityFn?: (a: U, b: U) => boolean\n ): U;\n};\n\n// @ts-ignore\nexport const usePlayerStore: UsePlayerStore = (selector, equalityFn) => {\n const store = useContext(PlayerStoreContext);\n return useStoreWithEqualityFn(store, selector, equalityFn);\n};\n","import {useContext, useMemo} from 'react';\nimport {PlayerStoreContext} from '@common/player/player-context';\nimport {MediaItem} from '@common/player/media-item';\n\nexport type PlayerActions = ReturnType<typeof usePlayerActions>;\n\nexport function usePlayerActions() {\n const store = useContext(PlayerStoreContext);\n\n return useMemo(() => {\n const s = store.getState();\n\n const overrideQueueAndPlay = async (\n mediaItems: MediaItem[],\n queuePointer?: number\n ) => {\n s.stop();\n await s.overrideQueue(mediaItems, queuePointer);\n return s.play();\n };\n\n return {\n play: s.play,\n playNext: s.playNext,\n playPrevious: s.playPrevious,\n pause: s.pause,\n subscribe: s.subscribe,\n emit: s.emit,\n getCurrentTime: s.getCurrentTime,\n seek: s.seek,\n toggleRepeatMode: s.toggleRepeatMode,\n toggleShuffling: s.toggleShuffling,\n getState: store.getState,\n setVolume: s.setVolume,\n setMuted: s.setMuted,\n appendToQueue: s.appendToQueue,\n removeFromQueue: s.removeFromQueue,\n enterFullscreen: s.enterFullscreen,\n exitFullscreen: s.exitFullscreen,\n toggleFullscreen: s.toggleFullscreen,\n enterPip: s.enterPip,\n exitPip: s.exitPip,\n setTextTrackVisibility: s.setTextTrackVisibility,\n setCurrentTextTrack: s.setCurrentTextTrack,\n setCurrentAudioTrack: s.setCurrentAudioTrack,\n setIsSeeking: s.setIsSeeking,\n setControlsVisible: s.setControlsVisible,\n cue: s.cue,\n overrideQueueAndPlay,\n overrideQueue: s.overrideQueue,\n setPlaybackRate: s.setPlaybackRate,\n setPlaybackQuality: s.setPlaybackQuality,\n };\n }, [store]);\n}\n","export function youtubeIdFromSrc(src: string) {\n return src.match(/((?:\\w|-){11})/)?.[0];\n}\n","import {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {useCallback, useEffect, useState} from 'react';\nimport {YoutubeMediaItem} from '@common/player/media-item';\nimport {usePlayerActions} from '@common/player/hooks/use-player-actions';\nimport {youtubeIdFromSrc} from '@common/player/utils/youtube-id-from-src';\n\nconst queryString =\n '&controls=0&disablekb=1&enablejsapi=1&iv_load_policy=3&modestbranding=1&playsinline=1&rel=0&showinfo=0';\n\nexport function useYoutubeProviderSrc(\n loadVideoById: (videoId: string) => void\n) {\n const {getState, emit} = usePlayerActions();\n const options = usePlayerStore(s => s.options);\n const media = usePlayerStore(s => s.cuedMedia) as\n | YoutubeMediaItem\n | undefined;\n\n const origin = options.youtube?.useCookies\n ? 'https://www.youtube.com'\n : 'https://www.youtube-nocookie.com';\n\n const [initialVideoId, setInitialVideoId] = useState(() => {\n if (media?.src && media.src !== 'resolve') {\n return youtubeIdFromSrc(media.src);\n }\n });\n\n const updateVideoIds = useCallback(\n (src: string) => {\n const videoId = youtubeIdFromSrc(src);\n if (!videoId) return;\n\n // use setState callback, so we don't need to use \"initialVideoId\" in the dependency array\n setInitialVideoId(prevId => {\n if (!prevId) {\n return videoId;\n } else {\n // changing src of iframe will cause it to fully reload, use \"loadVideoById\" api method instead\n loadVideoById(videoId);\n return prevId;\n }\n });\n },\n [loadVideoById]\n );\n\n useEffect(() => {\n if (media?.src && media.src !== 'resolve') {\n updateVideoIds(media.src);\n } else if (media) {\n emit('buffering', {isBuffering: true});\n options.youtube?.srcResolver?.(media).then(item => {\n // check if resolved media matches the one currently in the store to prevent race conditions.\n // check against current value in store, because this callback will close over old value\n if (item?.src && getState().cuedMedia?.id === item.id) {\n updateVideoIds(item.src);\n }\n });\n }\n // only update when media id changes to prevent infinite loops\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options, updateVideoIds, media?.id]);\n\n return {\n initialVideoUrl: initialVideoId\n ? `${origin}/embed/${initialVideoId}?${queryString}&autoplay=${\n options.autoPlay ? '1' : '0'\n }&mute=${getState().muted ? '1' : '0'}&start=${media?.initialTime ?? 0}`\n : undefined,\n origin,\n };\n}\n","import {useGlobalListeners} from '@react-aria/utils';\nimport {useCallback, useContext, useEffect, useRef} from 'react';\nimport {PlayerStoreContext} from '@common/player/player-context';\nimport {\n YoutubeCommand,\n YouTubeCommandArg,\n YoutubeInternalState,\n YoutubeProviderInternalApi,\n} from '@common/player/providers/youtube/youtube-types';\nimport {handleYoutubeEmbedMessage} from '@common/player/providers/youtube/handle-youtube-embed-message';\nimport {useYoutubeProviderSrc} from '@common/player/providers/youtube/use-youtube-provider-src';\n\nexport function YoutubeProvider() {\n const {addGlobalListener, removeAllGlobalListeners} = useGlobalListeners();\n const iframeRef = useRef<HTMLIFrameElement>(null);\n\n const youtubeApi = useCallback(\n <T extends keyof YouTubeCommandArg>(\n command: T,\n arg?: YouTubeCommandArg[T]\n ) =>\n iframeRef.current?.contentWindow?.postMessage(\n JSON.stringify({\n event: 'command',\n func: command,\n args: arg ? [arg] : undefined,\n }),\n '*'\n ),\n []\n );\n\n const loadVideoById = useCallback(\n (videoId: string) => {\n // using \"YoutubeCommand.Cue\" does not play video when changing sources,\n // it requires double click on play button without this\n youtubeApi(YoutubeCommand.CueAndPlay, videoId);\n },\n [youtubeApi]\n );\n\n const {initialVideoUrl, origin} = useYoutubeProviderSrc(loadVideoById);\n const store = useContext(PlayerStoreContext);\n\n const internalStateRef = useRef<YoutubeInternalState>({\n duration: 0,\n currentTime: 0,\n lastTimeUpdate: 0,\n playbackRate: 1,\n state: -1,\n playbackReady: false,\n buffered: 0,\n firedPlaybackEnd: false,\n });\n\n const registerApi = useCallback(() => {\n const internalProviderApi: YoutubeProviderInternalApi = {\n loadVideoById,\n };\n store.setState({\n providerApi: {\n play: () => {\n youtubeApi(YoutubeCommand.Play);\n },\n pause: () => {\n youtubeApi(YoutubeCommand.Pause);\n },\n stop: () => {\n youtubeApi(YoutubeCommand.Stop);\n },\n seek: (time: number) => {\n if (time !== internalStateRef.current.currentTime) {\n youtubeApi(YoutubeCommand.Seek, time);\n }\n },\n setVolume: (volume: number) => {\n youtubeApi(YoutubeCommand.SetVolume, volume);\n },\n setMuted: (muted: boolean) => {\n if (muted) {\n youtubeApi(YoutubeCommand.Mute);\n } else {\n youtubeApi(YoutubeCommand.Unmute);\n }\n },\n setPlaybackRate: (value: number) => {\n youtubeApi(YoutubeCommand.SetPlaybackRate, value);\n },\n setPlaybackQuality: (value: string) => {\n youtubeApi(YoutubeCommand.SetPlaybackQuality, value);\n },\n getCurrentTime: () => {\n return internalStateRef.current.currentTime;\n },\n getSrc: () => {\n return internalStateRef.current.videoId;\n },\n internalProviderApi,\n },\n });\n }, [store, loadVideoById, youtubeApi]);\n\n useEffect(() => {\n addGlobalListener(window, 'message', event => {\n const e = event as MessageEvent;\n if (\n e.origin === origin &&\n e.source === iframeRef.current?.contentWindow\n ) {\n handleYoutubeEmbedMessage(e, internalStateRef, iframeRef, store);\n }\n });\n\n registerApi();\n\n return () => {\n removeAllGlobalListeners();\n };\n }, [addGlobalListener, removeAllGlobalListeners, store, origin, registerApi]);\n\n if (!initialVideoUrl) {\n return null;\n }\n\n return (\n <iframe\n className=\"w-full h-full\"\n ref={iframeRef}\n src={initialVideoUrl}\n allowFullScreen\n allow=\"autoplay; encrypted-media; picture-in-picture;\"\n onLoad={() => {\n // window does not receive \"message\" events on safari without waiting a small amount of time for some reason\n setTimeout(() => {\n iframeRef.current?.contentWindow?.postMessage(\n JSON.stringify({event: 'listening'}),\n '*'\n );\n registerApi();\n });\n }}\n />\n );\n}\n","export function createRafLoop(callback: () => void) {\n let id: number | undefined;\n\n function start() {\n // Time updates are already in progress.\n if (!isUndefined(id)) return;\n loop();\n }\n\n function loop() {\n id = window.requestAnimationFrame(function rafLoop() {\n if (isUndefined(id)) return;\n callback();\n loop();\n });\n }\n\n function stop() {\n if (isNumber(id)) window.cancelAnimationFrame(id);\n id = undefined;\n }\n\n return {\n start,\n stop,\n };\n}\n\nfunction isUndefined(value: unknown): value is undefined {\n return typeof value === 'undefined';\n}\n\nfunction isNumber(value: any): value is number {\n return typeof value === 'number' && !Number.isNaN(value);\n}\n","import {\n MutableRefObject,\n RefObject,\n useCallback,\n useContext,\n useEffect,\n useRef,\n} from 'react';\nimport {createRafLoop} from '@common/utils/dom/create-ref-loop';\nimport {PlayerStoreContext} from '@common/player/player-context';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\n\nexport interface HtmlMediaInternalStateReturn {\n ref: RefObject<HTMLMediaElement>;\n updateCurrentTime: () => void;\n updateBuffered: () => void;\n toggleTextTrackModes: (newTrackId: number, isVisible: boolean) => void;\n internalState: MutableRefObject<{\n currentTime: number;\n playbackReady: boolean;\n timeRafLoop: ReturnType<typeof createRafLoop>;\n }>;\n}\n\nexport function useHtmlMediaInternalState(\n ref: RefObject<HTMLMediaElement>\n): HtmlMediaInternalStateReturn {\n const store = useContext(PlayerStoreContext);\n const cuedMedia = usePlayerStore(s => s.cuedMedia);\n\n const internalState = useRef({\n currentTime: 0,\n buffered: 0,\n isMediaWaiting: false,\n playbackReady: false,\n /**\n * The `timeupdate` event fires surprisingly infrequently during playback, meaning your progress\n * bar (or whatever else is synced to the currentTime) moves in a choppy fashion. This helps\n * resolve that by retrieving time updates in a request animation frame loop.\n */\n timeRafLoop: createRafLoop(() => {\n updateCurrentTime();\n updateBuffered();\n }),\n });\n\n const updateBuffered = useCallback(() => {\n const timeRange = ref.current?.buffered;\n const seconds =\n !timeRange || timeRange.length === 0\n ? 0\n : timeRange.end(timeRange.length - 1);\n\n if (internalState.current.buffered !== seconds) {\n store.getState().emit('buffered', {seconds});\n internalState.current.buffered = seconds;\n }\n }, [ref, store]);\n\n const updateCurrentTime = useCallback(() => {\n const newTime = ref.current?.currentTime || 0;\n if (\n internalState.current.currentTime !== newTime &&\n !store.getState().isSeeking\n ) {\n store.getState().emit('progress', {currentTime: newTime});\n internalState.current.currentTime = newTime;\n }\n }, [internalState, store, ref]);\n\n const toggleTextTrackModes = useCallback(\n (newTrackId: number, isVisible: boolean) => {\n if (!ref.current) return;\n const {textTracks} = ref.current;\n\n if (newTrackId === -1) {\n Array.from(textTracks).forEach(track => {\n track.mode = 'disabled';\n });\n } else {\n const oldTrack = textTracks[store.getState().currentTextTrack];\n if (oldTrack) oldTrack.mode = 'disabled';\n }\n\n const nextTrack = textTracks[newTrackId];\n\n if (nextTrack) {\n nextTrack.mode = isVisible ? 'showing' : 'hidden';\n }\n\n store.getState().emit('currentTextTrackChange', {\n trackId: !isVisible ? -1 : newTrackId,\n });\n store\n .getState()\n .emit('textTrackVisibilityChange', {isVisible: isVisible});\n },\n [ref, store]\n );\n\n // stop current time loop on unmount\n useEffect(() => {\n const timeRafLoop = internalState.current.timeRafLoop;\n return () => {\n timeRafLoop.stop();\n };\n }, []);\n\n // reload metadata when new media is cued\n useEffect(() => {\n ref.current?.load();\n }, [cuedMedia?.src, ref]);\n\n return {\n ref,\n internalState,\n updateCurrentTime,\n toggleTextTrackModes,\n updateBuffered,\n };\n}\n","import {\n HTMLAttributes,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n} from 'react';\nimport {PlayerStoreContext} from '@common/player/player-context';\nimport {HtmlMediaInternalStateReturn} from '@common/player/providers/html-media/use-html-media-internal-state';\n\nconst defaultPlaybackRates = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n\nexport function useHtmlMediaEvents({\n ref,\n updateCurrentTime,\n updateBuffered,\n internalState,\n}: HtmlMediaInternalStateReturn): HTMLAttributes<HTMLMediaElement> {\n const store = useContext(PlayerStoreContext);\n\n const onTextTracksChange = useCallback(() => {\n if (!ref.current) return;\n const tracks = Array.from(ref.current.textTracks).filter(\n t => t.label && (t.kind === 'subtitles' || t.kind === 'captions')\n );\n\n let trackId = -1;\n for (let id = 0; id < tracks.length; id += 1) {\n if (tracks[id].mode === 'hidden') {\n // Do not break in case there is a following track with showing.\n trackId = id;\n } else if (tracks[id].mode === 'showing') {\n trackId = id;\n break;\n }\n }\n\n const isVisible = trackId !== -1 && tracks[trackId].mode === 'showing';\n store.getState().emit('currentTextTrackChange', {trackId});\n store.getState().emit('textTrackVisibilityChange', {isVisible});\n store.getState().emit('textTracks', {tracks});\n }, [ref, store]);\n\n useEffect(() => {\n const el = ref.current;\n return () => {\n el?.textTracks.removeEventListener('change', onTextTracksChange);\n };\n }, [ref, onTextTracksChange]);\n\n return useMemo(() => {\n const emit = store.getState().emit;\n return {\n // set some common props used on audio/video/hls/dash providers\n autoPlay: false,\n onContextMenu: e => e.preventDefault(),\n controlsList: 'nodownload',\n preload: 'metadata',\n 'x-webkit-airplay': 'allow',\n onEnded: () => {\n emit('playbackEnd');\n updateCurrentTime();\n internalState.current.timeRafLoop.stop();\n },\n onStalled: e => {\n if (e.currentTarget.readyState < 3) {\n emit('buffering', {isBuffering: true});\n }\n },\n onWaiting: () => {\n emit('buffering', {isBuffering: true});\n },\n onPlaying: () => {\n emit('play');\n emit('buffering', {isBuffering: false});\n },\n onPause: e => {\n emit('pause');\n emit('buffering', {isBuffering: false});\n internalState.current.timeRafLoop.stop();\n },\n onSuspend: () => {\n emit('buffering', {isBuffering: false});\n },\n onSeeking: () => {\n updateCurrentTime();\n },\n onSeeked: () => {\n updateCurrentTime();\n },\n onTimeUpdate: () => {\n updateCurrentTime();\n },\n onError: e => {\n emit('error', {sourceEvent: e});\n },\n onDurationChange: e => {\n updateCurrentTime();\n emit('durationChange', {duration: e.currentTarget.duration});\n },\n onRateChange: e => {\n emit('playbackRateChange', {rate: e.currentTarget.playbackRate});\n },\n onLoadedMetadata: e => {\n if (!internalState.current.playbackReady) {\n emit('providerReady', {el: e.currentTarget});\n internalState.current.playbackReady = true;\n updateBuffered();\n onTextTracksChange();\n e.currentTarget.textTracks.addEventListener('change', () => {\n onTextTracksChange();\n });\n }\n emit('cued');\n emit('playbackRates', {rates: defaultPlaybackRates});\n },\n };\n }, [\n internalState,\n store,\n updateCurrentTime,\n onTextTracksChange,\n updateBuffered,\n ]);\n}\n","import {HtmlMediaInternalStateReturn} from '@common/player/providers/html-media/use-html-media-internal-state';\nimport {useContext, useMemo} from 'react';\nimport {PlayerStoreContext} from '@common/player/player-context';\nimport {PlayerProviderApi} from '@common/player/state/player-provider-api';\n\nexport function useHtmlMediaApi({\n ref,\n internalState,\n toggleTextTrackModes,\n}: HtmlMediaInternalStateReturn): PlayerProviderApi {\n const store = useContext(PlayerStoreContext);\n return useMemo(\n () => ({\n play: async () => {\n try {\n await ref.current?.play();\n } catch (e) {\n store.getState().emit('error', {sourceEvent: e});\n }\n internalState.current.timeRafLoop.start();\n },\n pause: () => {\n ref.current?.pause();\n internalState.current.timeRafLoop.stop();\n },\n stop: () => {\n if (ref.current) {\n ref.current.pause();\n ref.current.currentTime = 0;\n }\n },\n seek: (time: number) => {\n if (time !== internalState.current.currentTime && ref.current) {\n ref.current.currentTime = time;\n }\n },\n setVolume: (volume: number) => {\n if (ref.current) {\n ref.current.volume = volume / 100;\n }\n },\n setMuted: (muted: boolean) => {\n if (ref.current) {\n ref.current.muted = muted;\n }\n },\n setPlaybackRate: (value: number) => {\n if (ref.current) {\n ref.current.playbackRate = value;\n }\n },\n setTextTrackVisibility: isVisible => {\n toggleTextTrackModes(store.getState().currentTextTrack, isVisible);\n },\n setCurrentTextTrack: newTrackId => {\n toggleTextTrackModes(newTrackId, store.getState().textTrackIsVisible);\n },\n getCurrentTime: () => {\n return internalState.current.currentTime;\n },\n getSrc: () => {\n return ref.current?.src;\n },\n }),\n [ref, store, internalState, toggleTextTrackModes]\n );\n}\n","import {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {useContext, useEffect, useRef} from 'react';\nimport {PlayerStoreContext} from '@common/player/player-context';\nimport {useHtmlMediaInternalState} from '@common/player/providers/html-media/use-html-media-internal-state';\nimport {useHtmlMediaEvents} from '@common/player/providers/html-media/use-html-media-events';\nimport {useHtmlMediaApi} from '@common/player/providers/html-media/use-html-media-api';\n\nexport function HtmlVideoProvider() {\n const ref = useRef<HTMLVideoElement>(null);\n\n const autoPlay = usePlayerStore(s => s.options.autoPlay);\n const muted = usePlayerStore(s => s.muted);\n const cuedMedia = usePlayerStore(s => s.cuedMedia);\n const store = useContext(PlayerStoreContext);\n\n const state = useHtmlMediaInternalState(ref);\n const events = useHtmlMediaEvents(state);\n const providerApi = useHtmlMediaApi(state);\n\n useEffect(() => {\n store.setState({\n providerApi,\n });\n }, [store, providerApi]);\n\n let src = cuedMedia?.src;\n if (src && cuedMedia?.initialTime) {\n src = `${src}#t=${cuedMedia.initialTime}`;\n }\n\n return (\n <video\n className=\"w-full h-full\"\n ref={ref}\n src={src}\n playsInline\n poster={cuedMedia?.poster}\n autoPlay={autoPlay}\n muted={muted}\n {...events}\n >\n {cuedMedia?.captions?.map((caption, index) => (\n <track\n key={caption.id}\n label={caption.label}\n kind=\"subtitles\"\n srcLang={caption.language || 'en'}\n src={caption.src}\n default={index === 0}\n />\n ))}\n </video>\n );\n}\n","import {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {useContext, useEffect, useRef} from 'react';\nimport {PlayerStoreContext} from '@common/player/player-context';\nimport {useHtmlMediaInternalState} from '@common/player/providers/html-media/use-html-media-internal-state';\nimport {useHtmlMediaEvents} from '@common/player/providers/html-media/use-html-media-events';\nimport {useHtmlMediaApi} from '@common/player/providers/html-media/use-html-media-api';\n\nexport function HtmlAudioProvider() {\n const ref = useRef<HTMLAudioElement>(null);\n\n const autoPlay = usePlayerStore(s => s.options.autoPlay);\n const muted = usePlayerStore(s => s.muted);\n const cuedMedia = usePlayerStore(s => s.cuedMedia);\n const store = useContext(PlayerStoreContext);\n\n const state = useHtmlMediaInternalState(ref);\n const events = useHtmlMediaEvents(state);\n const providerApi = useHtmlMediaApi(state);\n\n useEffect(() => {\n store.setState({\n providerApi,\n });\n }, [store, providerApi]);\n\n let src = cuedMedia?.src;\n if (src && cuedMedia?.initialTime) {\n src = `${src}#t=${cuedMedia.initialTime}`;\n }\n\n return (\n <audio\n className=\"w-full h-full\"\n ref={ref}\n src={src}\n autoPlay={autoPlay}\n muted={muted}\n {...events}\n />\n );\n}\n","import React, {memo, Suspense, useContext, useEffect} from 'react';\nimport {PlayerStoreContext} from '@common/player/player-context';\nimport {YoutubeProvider} from '@common/player/providers/youtube/youtube-provider';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {HtmlVideoProvider} from '@common/player/providers/html-video-provider';\nimport {HtmlAudioProvider} from '@common/player/providers/html-audio-provider';\n\nconst HlsProvider = React.lazy(\n () => import('@common/player/providers/hls-provider')\n);\nconst DashProvider = React.lazy(\n () => import('@common/player/providers/dash-provider')\n);\n\ninterface Props {\n className?: string;\n}\nexport const PlayerOutlet = memo(({className}: Props) => {\n const {getState} = useContext(PlayerStoreContext);\n\n useEffect(() => {\n getState().init();\n return getState().destroy;\n }, [getState]);\n\n return (\n <div className={className}>\n <Provider />\n </div>\n );\n});\n\nfunction Provider() {\n const provider = usePlayerStore(s => s.providerName);\n switch (provider) {\n case 'youtube':\n return <YoutubeProvider />;\n case 'htmlVideo':\n return <HtmlVideoProvider />;\n case 'htmlAudio':\n return <HtmlAudioProvider />;\n case 'hls':\n return (\n <Suspense>\n <HlsProvider />\n </Suspense>\n );\n case 'dash':\n return (\n <Suspense>\n <DashProvider />\n </Suspense>\n );\n default:\n return null;\n }\n}\n","import {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport clsx from 'clsx';\nimport {HTMLAttributes, ReactElement} from 'react';\n\ninterface Props extends HTMLAttributes<HTMLDivElement> {\n hideDuringPlayback?: boolean;\n fallback?: ReactElement;\n}\nexport function PlayerPoster({\n className,\n hideDuringPlayback = true,\n fallback,\n ...domProps\n}: Props) {\n const posterUrl = usePlayerStore(s => s.posterUrl);\n const shouldHidePoster = usePlayerStore(\n s =>\n hideDuringPlayback && s.playbackStarted && s.providerName !== 'htmlAudio',\n );\n if (!posterUrl && !fallback) return null;\n return (\n <div\n {...domProps}\n className={clsx(\n 'pointer-events-none flex max-h-full w-full items-center justify-center bg-black transition-opacity',\n shouldHidePoster ? 'opacity-0' : 'opacity-100',\n className,\n )}\n >\n {posterUrl ? (\n <img\n loading=\"lazy\"\n src={posterUrl}\n alt=\"\"\n className=\"max-h-full w-full flex-shrink-0 object-cover\"\n />\n ) : (\n fallback\n )}\n </div>\n );\n}\n","import {useCallback, useRef} from 'react';\nimport {usePlayerActions} from '@common/player/hooks/use-player-actions';\n\nexport function usePlayerClickHandler() {\n const clickRef = useRef(0);\n const player = usePlayerActions();\n\n const togglePlay = useCallback(() => {\n if (player.getState().isPlaying) {\n player.pause();\n } else {\n player.play();\n }\n }, [player]);\n\n return useCallback(() => {\n if (!player.getState().providerReady) return;\n clickRef.current += 1;\n togglePlay();\n if (clickRef.current === 1) {\n setTimeout(() => {\n if (clickRef.current > 1) {\n player.toggleFullscreen();\n }\n clickRef.current = 0;\n }, 300);\n }\n }, [player, togglePlay]);\n}\n","import {\n ProgressCircle,\n ProgressCircleProps,\n} from '@common/ui/progress/progress-circle';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\n\ninterface Props {\n className?: string;\n trackColor?: string;\n fillColor?: string;\n size?: ProgressCircleProps['size'];\n}\nexport function BufferingSpinner({\n className,\n trackColor,\n fillColor,\n size,\n}: Props) {\n const isActive = usePlayerStore(\n s =>\n // YouTube will already show a spinner, no need for a custom one\n (s.isBuffering && s.providerName !== 'youtube') ||\n (s.playbackStarted && !s.providerReady)\n );\n return (\n <AnimatePresence initial={false}>\n {isActive && (\n <m.div {...opacityAnimation} className={className}>\n <ProgressCircle\n isIndeterminate\n trackColor={trackColor}\n fillColor={fillColor}\n size={size}\n />\n </m.div>\n )}\n </AnimatePresence>\n );\n}\n","import {useEffect, useRef, useState} from 'react';\nimport {usePlayerActions} from '@common/player/hooks/use-player-actions';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\n\ninterface Props {\n precision: 'ms' | 'seconds';\n disabled?: boolean;\n}\nexport function useCurrentTime(\n {precision, disabled}: Props = {precision: 'ms', disabled: false},\n) {\n const timeRef = useRef(0);\n const {subscribe, getCurrentTime} = usePlayerActions();\n const providerKey = usePlayerStore(s =>\n s.providerName && s.cuedMedia?.id\n ? `${s.providerName}+${s.cuedMedia.id}`\n : null,\n );\n\n const [currentTime, setCurrentTime] = useState(() => getCurrentTime());\n\n useEffect(() => {\n let unsubscribe: () => void;\n if (!disabled) {\n unsubscribe = subscribe({\n progress: ({currentTime}) => {\n const time =\n precision === 'ms' ? currentTime : Math.floor(currentTime);\n if (timeRef.current !== time) {\n setCurrentTime(time);\n timeRef.current = time;\n }\n },\n });\n }\n return () => unsubscribe?.();\n }, [precision, subscribe, disabled]);\n\n // update current time when media or provider changes\n useEffect(() => {\n if (providerKey) {\n setCurrentTime(getCurrentTime());\n }\n }, [providerKey, getCurrentTime]);\n\n return currentTime;\n}\n","import {Slider} from '@common/ui/forms/slider/slider';\nimport {UseSliderProps} from '@common/ui/forms/slider/use-slider';\nimport {usePlayerActions} from '@common/player/hooks/use-player-actions';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {useCurrentTime} from '@common/player/hooks/use-current-time';\nimport {useRef} from 'react';\n\ninterface Props {\n trackColor?: UseSliderProps['trackColor'];\n fillColor?: UseSliderProps['fillColor'];\n className?: string;\n onPointerMove?: UseSliderProps['onPointerMove'];\n}\nexport function Seekbar({\n trackColor,\n fillColor,\n className,\n onPointerMove,\n}: Props) {\n const {pause, seek, setIsSeeking, play, getState} = usePlayerActions();\n const duration = usePlayerStore(s => s.mediaDuration);\n const playerReady = usePlayerStore(s => s.providerReady);\n const pauseWhileSeeking = usePlayerStore(s => s.pauseWhileSeeking);\n\n const currentTime = useCurrentTime();\n\n const wasPlayingBeforeDragging = useRef(false);\n\n return (\n <Slider\n fillColor={fillColor}\n trackColor={trackColor}\n thumbSize=\"w-14 h-14\"\n showThumbOnHoverOnly\n className={className}\n width=\"w-auto\"\n isDisabled={!playerReady}\n value={currentTime}\n minValue={0}\n maxValue={duration}\n onPointerMove={onPointerMove}\n onPointerDown={() => {\n setIsSeeking(true);\n if (pauseWhileSeeking) {\n wasPlayingBeforeDragging.current =\n getState().isPlaying || getState().isBuffering;\n pause();\n }\n }}\n onChange={value => {\n getState().emit('progress', {currentTime: value});\n seek(value);\n }}\n onChangeEnd={() => {\n setIsSeeking(false);\n if (pauseWhileSeeking && wasPlayingBeforeDragging.current) {\n play();\n wasPlayingBeforeDragging.current = false;\n }\n }}\n />\n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaPauseIcon = createSvgIcon(\n [<path d=\"M8.66667 6.66667C8.29848 6.66667 8 6.96514 8 7.33333V24.6667C8 25.0349 8.29848 25.3333 8.66667 25.3333H12.6667C13.0349 25.3333 13.3333 25.0349 13.3333 24.6667V7.33333C13.3333 6.96514 13.0349 6.66667 12.6667 6.66667H8.66667Z\" key=\"0\"/>,<path d=\"M19.3333 6.66667C18.9651 6.66667 18.6667 6.96514 18.6667 7.33333V24.6667C18.6667 25.0349 18.9651 25.3333 19.3333 25.3333H23.3333C23.7015 25.3333 24 25.0349 24 24.6667V7.33333C24 6.96514 23.7015 6.66667 23.3333 6.66667H19.3333Z\" key=\"1\"/>,],\n 'MediaPause',\n '0 0 32 32'\n);\n","import {IconButton} from '@common/ui/buttons/icon-button';\nimport {ButtonProps} from '@common/ui/buttons/button';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {usePlayerActions} from '@common/player/hooks/use-player-actions';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport {MediaPauseIcon} from '@common/icons/media/media-pause';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\ninterface Props {\n color?: ButtonProps['color'];\n size?: ButtonProps['size'];\n iconSize?: ButtonProps['size'];\n className?: string;\n stopPropagation?: boolean;\n}\nexport function PlayButton({\n size = 'md',\n iconSize = 'xl',\n color,\n stopPropagation,\n}: Props) {\n const isPlaying = usePlayerStore(s => s.isPlaying);\n const playerReady = usePlayerStore(s => s.providerReady);\n const player = usePlayerActions();\n\n const label = isPlaying ? (\n <Trans message=\"Pause (k)\" />\n ) : (\n <Trans message=\"Play (k)\" />\n );\n\n return (\n <Tooltip label={label} usePortal={false}>\n <IconButton\n color={color}\n size={size}\n iconSize={iconSize}\n disabled={!playerReady}\n onClick={e => {\n if (stopPropagation) {\n e.stopPropagation();\n }\n if (isPlaying) {\n player.pause();\n } else {\n player.play();\n }\n }}\n >\n {isPlaying ? <MediaPauseIcon /> : <MediaPlayIcon />}\n </IconButton>\n </Tooltip>\n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaNextIcon = createSvgIcon(\n [<path d=\"M6.39617 6.78532C5.9561 6.46017 5.33334 6.77434 5.33334 7.32151V24.6785C5.33334 25.2257 5.95612 25.5398 6.39619 25.2147L18.1415 16.5358C18.5021 16.2693 18.5021 15.7299 18.1415 15.4634L6.39617 6.78532Z\" key=\"0\"/>,<path d=\"M23.5339 6.6667C23.1657 6.6667 22.8672 6.96518 22.8672 7.33337V24.6667C22.8672 25.0349 23.1657 25.3334 23.5339 25.3334H25.5339C25.902 25.3334 26.2005 25.0349 26.2005 24.6667V7.33337C26.2005 6.96518 25.902 6.6667 25.5339 6.6667H23.5339Z\" key=\"1\"/>,],\n 'MediaNext',\n '0 0 32 32'\n);\n","import {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {usePlayerActions} from '@common/player/hooks/use-player-actions';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ButtonProps} from '@common/ui/buttons/button';\nimport {MediaNextIcon} from '@common/icons/media/media-next';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\n\ninterface Props {\n color?: ButtonProps['color'];\n size?: ButtonProps['size'];\n iconSize?: ButtonProps['size'];\n className?: string;\n stopPropagation?: boolean;\n}\nexport function NextButton({\n size = 'md',\n iconSize,\n color,\n className,\n stopPropagation,\n}: Props) {\n const player = usePlayerActions();\n const playerReady = usePlayerStore(s => s.providerReady);\n\n return (\n <Tooltip label={<Trans message=\"Next\" />} usePortal={false}>\n <IconButton\n disabled={!playerReady}\n size={size}\n color={color}\n iconSize={iconSize}\n className={className}\n onClick={e => {\n if (stopPropagation) {\n e.stopPropagation();\n }\n player.playNext();\n }}\n >\n <MediaNextIcon />\n </IconButton>\n </Tooltip>\n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaMuteIcon = createSvgIcon(\n [<path d=\"M17.5091 24.6594C17.5091 25.2066 16.8864 25.5208 16.4463 25.1956L9.44847 20.0252C9.42553 20.0083 9.39776 19.9991 9.36923 19.9991H4.66667C4.29848 19.9991 4 19.7006 4 19.3325V12.6658C4 12.2976 4.29848 11.9991 4.66667 11.9991H9.37115C9.39967 11.9991 9.42745 11.99 9.45039 11.973L16.4463 6.8036C16.8863 6.47842 17.5091 6.79259 17.5091 7.33977L17.5091 24.6594Z\" key=\"0\"/>,<path d=\"M28.8621 13.6422C29.1225 13.3818 29.1225 12.9597 28.8621 12.6994L27.9193 11.7566C27.659 11.4962 27.2368 11.4962 26.9765 11.7566L24.7134 14.0197C24.6613 14.0717 24.5769 14.0717 24.5248 14.0197L22.262 11.7568C22.0016 11.4964 21.5795 11.4964 21.3191 11.7568L20.3763 12.6996C20.116 12.9599 20.116 13.382 20.3763 13.6424L22.6392 15.9053C22.6913 15.9573 22.6913 16.0418 22.6392 16.0938L20.3768 18.3562C20.1165 18.6166 20.1165 19.0387 20.3768 19.299L21.3196 20.2419C21.58 20.5022 22.0021 20.5022 22.2624 20.2418L24.5248 17.9795C24.5769 17.9274 24.6613 17.9274 24.7134 17.9795L26.976 20.2421C27.2363 20.5024 27.6585 20.5024 27.9188 20.2421L28.8616 19.2992C29.122 19.0389 29.122 18.6168 28.8616 18.3564L26.599 16.0938C26.547 16.0418 26.547 15.9573 26.599 15.9053L28.8621 13.6422Z\" key=\"1\"/>,],\n 'MediaMute',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaVolumeLowIcon = createSvgIcon(\n [<path d=\"M17.5091 24.6594C17.5091 25.2066 16.8864 25.5207 16.4463 25.1956L9.44847 20.0252C9.42553 20.0083 9.39776 19.9991 9.36923 19.9991H4.66667C4.29848 19.9991 4 19.7006 4 19.3324V12.6658C4 12.2976 4.29848 11.9991 4.66667 11.9991H9.37115C9.39967 11.9991 9.42745 11.99 9.45039 11.973L16.4463 6.80358C16.8863 6.4784 17.5091 6.79258 17.5091 7.33975L17.5091 24.6594Z\" key=\"0\"/>,<path d=\"M22.8424 12.6667C22.8424 12.2985 22.544 12 22.1758 12H20.8424C20.4743 12 20.1758 12.2985 20.1758 12.6667V19.3333C20.1758 19.7015 20.4743 20 20.8424 20H22.1758C22.544 20 22.8424 19.7015 22.8424 19.3333V12.6667Z\" key=\"1\"/>,],\n 'MediaVolumeLow',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaVolumeHighIcon = createSvgIcon(\n [<path d=\"M17.5091 24.6595C17.5091 25.2066 16.8864 25.5208 16.4463 25.1956L9.44847 20.0252C9.42553 20.0083 9.39776 19.9992 9.36923 19.9992H4.66667C4.29848 19.9992 4 19.7007 4 19.3325V12.6658C4 12.2976 4.29848 11.9992 4.66667 11.9992H9.37115C9.39967 11.9992 9.42745 11.99 9.45039 11.9731L16.4463 6.80363C16.8863 6.47845 17.5091 6.79262 17.5091 7.3398L17.5091 24.6595Z\" key=\"0\"/>,<path d=\"M27.5091 9.33336C27.8773 9.33336 28.1758 9.63184 28.1758 10V22C28.1758 22.3682 27.8773 22.6667 27.5091 22.6667H26.1758C25.8076 22.6667 25.5091 22.3682 25.5091 22V10C25.5091 9.63184 25.8076 9.33336 26.1758 9.33336L27.5091 9.33336Z\" key=\"1\"/>,<path d=\"M22.1758 12C22.544 12 22.8424 12.2985 22.8424 12.6667V19.3334C22.8424 19.7016 22.544 20 22.1758 20H20.8424C20.4743 20 20.1758 19.7016 20.1758 19.3334V12.6667C20.1758 12.2985 20.4743 12 20.8424 12H22.1758Z\" key=\"2\"/>,],\n 'MediaVolumeHigh',\n '0 0 32 32'\n);\n","import {Slider} from '@common/ui/forms/slider/slider';\nimport {usePlayerActions} from '@common/player/hooks/use-player-actions';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {BaseSliderProps} from '@common/ui/forms/slider/base-slider';\nimport {ButtonProps} from '@common/ui/buttons/button';\nimport {MediaMuteIcon} from '@common/icons/media/media-mute';\nimport {MediaVolumeLowIcon} from '@common/icons/media/media-volume-low';\nimport {MediaVolumeHighIcon} from '@common/icons/media/media-volume-high';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\nimport clsx from 'clsx';\n\ninterface Props {\n trackColor?: BaseSliderProps['trackColor'];\n fillColor?: BaseSliderProps['fillColor'];\n buttonColor?: ButtonProps['color'];\n className?: string;\n}\nexport function VolumeControls({\n trackColor,\n fillColor,\n buttonColor,\n className,\n}: Props) {\n const volume = usePlayerStore(s => s.volume);\n const player = usePlayerActions();\n const playerReady = usePlayerStore(s => s.providerReady);\n\n return (\n <div className={clsx('flex w-min items-center gap-4', className)}>\n <ToggleMuteButton color={buttonColor} />\n <Slider\n isDisabled={!playerReady}\n showThumbOnHoverOnly\n thumbSize=\"w-14 h-14\"\n trackColor={trackColor}\n fillColor={fillColor}\n minValue={0}\n maxValue={100}\n className=\"flex-auto\"\n width=\"w-96\"\n value={volume}\n onChange={value => {\n player.setVolume(value);\n }}\n />\n </div>\n );\n}\n\ninterface ToggleMuteButtonProps {\n color?: ButtonProps['color'];\n size?: ButtonProps['size'];\n iconSize?: ButtonProps['size'];\n}\nexport function ToggleMuteButton({\n color,\n size = 'sm',\n iconSize = 'md',\n}: ToggleMuteButtonProps) {\n const isMuted = usePlayerStore(s => s.muted);\n const volume = usePlayerStore(s => s.volume);\n const player = usePlayerActions();\n const playerReady = usePlayerStore(s => s.providerReady);\n\n if (isMuted) {\n return (\n <Tooltip label={<Trans message=\"Unmute\" />} usePortal={false}>\n <IconButton\n disabled={!playerReady}\n color={color}\n size={size}\n iconSize={iconSize}\n onClick={() => player.setMuted(false)}\n >\n <MediaMuteIcon />\n </IconButton>\n </Tooltip>\n );\n }\n return (\n <Tooltip label={<Trans message=\"Mute\" />}>\n <IconButton\n disabled={!playerReady}\n color={color}\n size={size}\n iconSize={iconSize}\n onClick={() => player.setMuted(true)}\n >\n {volume < 40 ? <MediaVolumeLowIcon /> : <MediaVolumeHighIcon />}\n </IconButton>\n </Tooltip>\n );\n}\n","import {Fragment, memo} from 'react';\nimport {useTrans, UseTransReturn} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\n\ninterface ParsedMS {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\ninterface FormattedTrackDurationProps {\n ms?: number;\n minutes?: number;\n seconds?: number;\n verbose?: boolean;\n addZeroToFirstUnit?: boolean;\n}\nexport const FormattedDuration = memo(\n ({\n minutes,\n seconds,\n ms,\n verbose = false,\n addZeroToFirstUnit = true,\n }: FormattedTrackDurationProps) => {\n const {trans} = useTrans();\n\n if (minutes) {\n ms = minutes * 60000;\n } else if (seconds) {\n ms = seconds * 1000;\n }\n if (!ms) {\n ms = 0;\n }\n\n const unsignedMs = ms < 0 ? -ms : ms;\n const parsedMS: ParsedMS = {\n days: Math.trunc(unsignedMs / 86400000),\n hours: Math.trunc(unsignedMs / 3600000) % 24,\n minutes: Math.trunc(unsignedMs / 60000) % 60,\n seconds: Math.trunc(unsignedMs / 1000) % 60,\n };\n\n let formattedValue: string;\n if (verbose) {\n formattedValue = formatVerbose(parsedMS, trans);\n } else {\n formattedValue = formatCompact(parsedMS, addZeroToFirstUnit);\n }\n\n return <Fragment>{formattedValue}</Fragment>;\n }\n);\n\nfunction formatVerbose(t: ParsedMS, trans: UseTransReturn['trans']) {\n const output: string[] = [];\n\n if (t.days) {\n output.push(`${t.days}${trans(message('d'))}`);\n }\n if (t.hours) {\n output.push(`${t.hours}${trans(message('hr'))}`);\n }\n if (t.minutes) {\n output.push(`${t.minutes}${trans(message('min'))}`);\n }\n if (t.seconds && !t.hours) {\n output.push(`${t.seconds}${trans(message('sec'))}`);\n }\n\n return output.join(' ');\n}\n\nfunction formatCompact(t: ParsedMS, addZeroToFirstUnit = true) {\n const seconds = addZero(t.seconds);\n let output = '';\n if (t.days && !output) {\n output = `${t.days}:${addZero(t.hours)}:${addZero(t.minutes)}:${seconds}`;\n }\n if (t.hours && !output) {\n output = `${addZero(t.hours, addZeroToFirstUnit)}:${addZero(\n t.minutes\n )}:${seconds}`;\n }\n if (!output) {\n output = `${addZero(t.minutes, addZeroToFirstUnit)}:${seconds}`;\n }\n return output;\n}\n\nfunction addZero(v: number, addZero = true) {\n if (!addZero) return v;\n let value = `${v}`;\n if (value.length === 1) {\n value = '0' + value;\n }\n return value;\n}\n","import {useCurrentTime} from '@common/player/hooks/use-current-time';\nimport {FormattedDuration} from '@common/i18n/formatted-duration';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\n\ninterface Props {\n className?: string;\n}\nexport function FormattedCurrentTime({className}: Props) {\n const duration = usePlayerStore(s => s.mediaDuration);\n const currentTime = useCurrentTime();\n return (\n <span className={className}>\n <FormattedDuration\n seconds={currentTime}\n addZeroToFirstUnit={duration >= 600}\n />\n </span>\n );\n}\n","import {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {FormattedDuration} from '@common/i18n/formatted-duration';\n\ninterface Props {\n className?: string;\n}\nexport function FormattedPlayerDuration({className}: Props) {\n const duration = usePlayerStore(s => s.mediaDuration);\n return (\n <span className={className}>\n <FormattedDuration\n seconds={duration}\n addZeroToFirstUnit={duration >= 600}\n />\n </span>\n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaClosedCaptionsIcon = createSvgIcon(\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M4.6661 6.66699C4.29791 6.66699 3.99943 6.96547 3.99943 7.33366V24.667C3.99943 25.0352 4.29791 25.3337 4.6661 25.3337H27.3328C27.701 25.3337 27.9994 25.0352 27.9994 24.667V7.33366C27.9994 6.96547 27.701 6.66699 27.3328 6.66699H4.6661ZM8.66667 21.3333C8.29848 21.3333 8 21.0349 8 20.6667V11.3333C8 10.9651 8.29848 10.6667 8.66667 10.6667H14C14.3682 10.6667 14.6667 10.9651 14.6667 11.3333V12.6667C14.6667 13.0349 14.3682 13.3333 14 13.3333H10.8C10.7264 13.3333 10.6667 13.393 10.6667 13.4667V18.5333C10.6667 18.607 10.7264 18.6667 10.8 18.6667H14C14.3682 18.6667 14.6667 18.9651 14.6667 19.3333V20.6667C14.6667 21.0349 14.3682 21.3333 14 21.3333H8.66667ZM18 21.3333C17.6318 21.3333 17.3333 21.0349 17.3333 20.6667V11.3333C17.3333 10.9651 17.6318 10.6667 18 10.6667H23.3333C23.7015 10.6667 24 10.9651 24 11.3333V12.6667C24 13.0349 23.7015 13.3333 23.3333 13.3333H20.1333C20.0597 13.3333 20 13.393 20 13.4667V18.5333C20 18.607 20.0597 18.6667 20.1333 18.6667H23.3333C23.7015 18.6667 24 18.9651 24 19.3333V20.6667C24 21.0349 23.7015 21.3333 23.3333 21.3333H18Z\"/>,\n 'MediaClosedCaptions',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaClosedCaptionsOnIcon = createSvgIcon(\n [<path d=\"M8 28.0003C8 27.6321 8.29848 27.3336 8.66667 27.3336H23.3333C23.7015 27.3336 24 27.6321 24 28.0003V29.3336C24 29.7018 23.7015 30.0003 23.3333 30.0003H8.66667C8.29848 30.0003 8 29.7018 8 29.3336V28.0003Z\" key=\"0\"/>,<path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M4.66602 6.66699C4.29783 6.66699 3.99935 6.96547 3.99935 7.33366V24.667C3.99935 25.0352 4.29783 25.3337 4.66602 25.3337H27.3327C27.7009 25.3337 27.9994 25.0352 27.9994 24.667V7.33366C27.9994 6.96547 27.7009 6.66699 27.3327 6.66699H4.66602ZM8.66659 21.3333C8.2984 21.3333 7.99992 21.0349 7.99992 20.6667V11.3333C7.99992 10.9651 8.2984 10.6667 8.66659 10.6667H13.9999C14.3681 10.6667 14.6666 10.9651 14.6666 11.3333V12.6667C14.6666 13.0349 14.3681 13.3333 13.9999 13.3333H10.7999C10.7263 13.3333 10.6666 13.393 10.6666 13.4667V18.5333C10.6666 18.607 10.7263 18.6667 10.7999 18.6667H13.9999C14.3681 18.6667 14.6666 18.9651 14.6666 19.3333V20.6667C14.6666 21.0349 14.3681 21.3333 13.9999 21.3333H8.66659ZM17.9999 21.3333C17.6317 21.3333 17.3333 21.0349 17.3333 20.6667V11.3333C17.3333 10.9651 17.6317 10.6667 17.9999 10.6667H23.3333C23.7014 10.6667 23.9999 10.9651 23.9999 11.3333V12.6667C23.9999 13.0349 23.7014 13.3333 23.3333 13.3333H20.1333C20.0596 13.3333 19.9999 13.393 19.9999 13.4667V18.5333C19.9999 18.607 20.0596 18.6667 20.1333 18.6667H23.3333C23.7014 18.6667 23.9999 18.9651 23.9999 19.3333V20.6667C23.9999 21.0349 23.7014 21.3333 23.3333 21.3333H17.9999Z\" key=\"1\"/>,],\n 'MediaClosedCaptionsOn',\n '0 0 32 32'\n);\n","import {ButtonProps} from '@common/ui/buttons/button';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {usePlayerActions} from '@common/player/hooks/use-player-actions';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {message} from '@common/i18n/message';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\nimport {MediaClosedCaptionsIcon} from '@common/icons/media/media-closed-captions';\nimport {MediaClosedCaptionsOnIcon} from '@common/icons/media/media-closed-captions-on';\n\ninterface Props {\n color?: ButtonProps['color'];\n size?: ButtonProps['size'];\n iconSize?: ButtonProps['size'];\n className?: string;\n}\nexport function ToggleCaptionsButton({\n size = 'md',\n iconSize,\n color,\n className,\n}: Props) {\n const {trans} = useTrans();\n const player = usePlayerActions();\n const playerReady = usePlayerStore(s => s.providerReady);\n const captionsVisible = usePlayerStore(s => s.textTrackIsVisible);\n const haveCaptions = usePlayerStore(s => !!s.textTracks.length);\n\n if (!haveCaptions) {\n return null;\n }\n\n const labelMessage = trans(\n captionsVisible\n ? message('Hide subtitles/captions (c)')\n : message('Show subtitles/captions (c)')\n );\n\n return (\n <Tooltip label={<Trans message={labelMessage} />} usePortal={false}>\n <IconButton\n disabled={!playerReady}\n aria-label={labelMessage}\n size={size}\n color={color}\n iconSize={iconSize}\n className={className}\n onClick={() => {\n player.setTextTrackVisibility(!captionsVisible);\n }}\n >\n {captionsVisible ? (\n <MediaClosedCaptionsOnIcon />\n ) : (\n <MediaClosedCaptionsIcon />\n )}\n </IconButton>\n </Tooltip>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowRightIcon = createSvgIcon(\n <path d=\"m10 17 5-5-5-5v10z\" />\n, 'ArrowRightOutlined');\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaSettingsIcon = createSvgIcon(\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M13.5722 5.33333C13.2429 5.33333 12.9629 5.57382 12.9132 5.89938L12.4063 9.21916C12.4 9.26058 12.3746 9.29655 12.3378 9.31672C12.2387 9.37118 12.1409 9.42779 12.0444 9.48648C12.0086 9.5083 11.9646 9.51242 11.9255 9.49718L8.79572 8.27692C8.48896 8.15732 8.14083 8.27958 7.9762 8.56472L5.5491 12.7686C5.38444 13.0538 5.45271 13.4165 5.70981 13.6223L8.33308 15.7225C8.3658 15.7487 8.38422 15.7887 8.38331 15.8306C8.38209 15.8867 8.38148 15.9429 8.38148 15.9993C8.38148 16.0558 8.3821 16.1121 8.38332 16.1684C8.38423 16.2102 8.36582 16.2503 8.33313 16.2765L5.7103 18.3778C5.45334 18.5836 5.38515 18.9462 5.54978 19.2314L7.97688 23.4352C8.14155 23.7205 8.48981 23.8427 8.79661 23.723L11.926 22.5016C11.9651 22.4864 12.009 22.4905 12.0449 22.5123C12.1412 22.5709 12.2388 22.6274 12.3378 22.6818C12.3745 22.7019 12.4 22.7379 12.4063 22.7793L12.9132 26.0993C12.9629 26.4249 13.2429 26.6654 13.5722 26.6654H18.4264C18.7556 26.6654 19.0356 26.425 19.0854 26.0995L19.5933 22.7801C19.5997 22.7386 19.6252 22.7027 19.6619 22.6825C19.7614 22.6279 19.8596 22.5711 19.9564 22.5121C19.9923 22.4903 20.0362 22.4862 20.0754 22.5015L23.2035 23.7223C23.5103 23.842 23.8585 23.7198 24.0232 23.4346L26.4503 19.2307C26.6149 18.9456 26.5467 18.583 26.2898 18.3771L23.6679 16.2766C23.6352 16.2504 23.6168 16.2104 23.6177 16.1685C23.619 16.1122 23.6196 16.0558 23.6196 15.9993C23.6196 15.9429 23.619 15.8866 23.6177 15.8305C23.6168 15.7886 23.6353 15.7486 23.668 15.7224L26.2903 13.623C26.5474 13.4172 26.6156 13.0544 26.451 12.7692L24.0239 8.56537C23.8592 8.28023 23.5111 8.15797 23.2043 8.27757L20.0758 9.49734C20.0367 9.51258 19.9927 9.50846 19.9569 9.48664C19.8599 9.42762 19.7616 9.37071 19.6618 9.31596C19.6251 9.2958 19.5997 9.25984 19.5933 9.21843L19.0854 5.89915C19.0356 5.57369 18.7556 5.33333 18.4264 5.33333H13.5722ZM16.0001 20.2854C18.3672 20.2854 20.2862 18.3664 20.2862 15.9993C20.2862 13.6322 18.3672 11.7132 16.0001 11.7132C13.6329 11.7132 11.714 13.6322 11.714 15.9993C11.714 18.3664 13.6329 20.2854 16.0001 20.2854Z\"/>,\n 'MediaSettings',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaPlaybackSpeedCircleIcon = createSvgIcon(\n [<path d=\"M13.9213 5.53573C14.3146 5.45804 14.6666 5.76987 14.6666 6.17079V7.57215C14.6666 7.89777 14.4305 8.17277 14.114 8.24925C12.5981 8.61559 11.2506 9.41368 10.2091 10.506C9.98474 10.7414 9.62903 10.8079 9.34742 10.6453L8.14112 9.94885C7.79394 9.7484 7.69985 9.28777 7.96359 8.98585C9.48505 7.24409 11.5636 6.00143 13.9213 5.53573Z\" key=\"0\"/>,<path d=\"M5.88974 12.5908C6.01805 12.2101 6.46491 12.0603 6.81279 12.2611L8.01201 12.9535C8.29379 13.1162 8.41396 13.4577 8.32238 13.7699C8.11252 14.4854 7.99998 15.2424 7.99998 16.0257C7.99998 16.809 8.11252 17.566 8.32238 18.2814C8.41396 18.5936 8.29378 18.9352 8.01201 19.0979L6.82742 19.7818C6.48051 19.9821 6.03488 19.8337 5.90521 19.4547C5.5345 18.3712 5.33331 17.2091 5.33331 16C5.33331 14.8078 5.5289 13.6613 5.88974 12.5908Z\" key=\"1\"/>,<path d=\"M8.17106 22.0852C7.82291 22.2862 7.72949 22.7486 7.99532 23.0502C9.51387 24.773 11.5799 26.0017 13.9213 26.4642C14.3146 26.5419 14.6666 26.2301 14.6666 25.8291V24.4792C14.6666 24.1536 14.4305 23.8786 14.114 23.8021C12.5981 23.4358 11.2506 22.6377 10.2091 21.5453C9.98474 21.31 9.62903 21.2435 9.34742 21.4061L8.17106 22.0852Z\" key=\"2\"/>,<path d=\"M17.3333 25.8291C17.3333 26.2301 17.6857 26.5418 18.079 26.4641C22.9748 25.4969 26.6666 21.1796 26.6666 16C26.6666 10.8204 22.9748 6.50302 18.079 5.5358C17.6857 5.4581 17.3333 5.76987 17.3333 6.17079V7.57215C17.3333 7.89777 17.5697 8.17282 17.8862 8.24932C21.3942 9.09721 24 12.2572 24 16.0257C24 19.7942 21.3942 22.9542 17.8862 23.802C17.5697 23.8785 17.3333 24.1536 17.3333 24.4792V25.8291Z\" key=\"3\"/>,<path d=\"M14.3961 10.4163C13.9561 10.0911 13.3333 10.4053 13.3333 10.9525L13.3333 21.0474C13.3333 21.5946 13.9561 21.9087 14.3962 21.5836L21.2273 16.5359C21.5879 16.2694 21.5879 15.73 21.2273 15.4635L14.3961 10.4163Z\" key=\"4\"/>,],\n 'MediaPlaybackSpeedCircle',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaSettingsMenuIcon = createSvgIcon(\n [<path d=\"M18.6669 10.4001C18.6669 10.7683 18.3684 11.0667 18.0002 11.0667H16.2668C15.8987 11.0667 15.6002 10.7683 15.6002 10.4001V9.86674C15.6002 9.7931 15.5405 9.73341 15.4669 9.73341H5.99998C5.63179 9.73341 5.33331 9.43493 5.33331 9.06674V7.33341C5.33331 6.96522 5.63179 6.66674 5.99998 6.66674H15.4669C15.5405 6.66674 15.6002 6.60704 15.6002 6.53341V6.00007C15.6002 5.63188 15.8987 5.3334 16.2668 5.3334H18.0002C18.3684 5.3334 18.6669 5.63188 18.6669 6.00007V10.4001Z\" key=\"0\"/>,<path d=\"M11.3334 18.8668C11.7016 18.8668 12.0001 18.5683 12.0001 18.2001V13.8001C12.0001 13.4319 11.7016 13.1335 11.3334 13.1335H9.60006C9.23187 13.1335 8.93339 13.4319 8.93339 13.8001V14.3335C8.93339 14.4071 8.8737 14.4668 8.80006 14.4668H6.00006C5.63187 14.4668 5.33339 14.7653 5.33339 15.1335V16.8668C5.33339 17.235 5.63187 17.5335 6.00006 17.5335H8.80006C8.8737 17.5335 8.93339 17.5932 8.93339 17.6668V18.2001C8.93339 18.5683 9.23187 18.8668 9.60006 18.8668H11.3334Z\" key=\"1\"/>,<path d=\"M18.6667 26.0001C18.6667 26.3683 18.3682 26.6668 18 26.6668H16.2667C15.8985 26.6668 15.6 26.3683 15.6 26.0001V25.4668C15.6 25.3931 15.5403 25.3334 15.4667 25.3334H6.00014C5.63195 25.3334 5.33348 25.0349 5.33348 24.6668V22.9334C5.33348 22.5652 5.63195 22.2668 6.00014 22.2668H15.4667C15.5403 22.2668 15.6 22.2071 15.6 22.1334V21.6001C15.6 21.2319 15.8985 20.9334 16.2667 20.9334H18C18.3682 20.9334 18.6667 21.2319 18.6667 21.6001V26.0001Z\" key=\"2\"/>,<path d=\"M22 24.6668C22 25.0349 22.2985 25.3334 22.6667 25.3334H26.0001C26.3683 25.3334 26.6668 25.0349 26.6668 24.6668V22.9334C26.6668 22.5652 26.3683 22.2668 26.0001 22.2668H22.6667C22.2985 22.2668 22 22.5652 22 22.9334V24.6668Z\" key=\"3\"/>,<path d=\"M16.0001 17.5335C15.6319 17.5335 15.3334 17.235 15.3334 16.8668V15.1335C15.3334 14.7653 15.6319 14.4668 16.0001 14.4668H26.0001C26.3683 14.4668 26.6667 14.7653 26.6667 15.1335V16.8668C26.6667 17.235 26.3683 17.5335 26.0001 17.5335H16.0001Z\" key=\"4\"/>,<path d=\"M22.0002 9.06674C22.0002 9.43493 22.2987 9.73341 22.6669 9.73341H26C26.3682 9.73341 26.6666 9.43493 26.6666 9.06674V7.3334C26.6666 6.96521 26.3682 6.66674 26 6.66674H22.6669C22.2987 6.66674 22.0002 6.96522 22.0002 7.33341V9.06674Z\" key=\"5\"/>,],\n 'MediaSettingsMenu',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaArrowLeftIcon = createSvgIcon(\n <path d=\"M13.0908 14.3334C12.972 14.3334 12.9125 14.1898 12.9965 14.1058L17.7021 9.40022C17.9625 9.13987 17.9625 8.71776 17.7021 8.45741L16.2879 7.04319C16.0275 6.78284 15.6054 6.78284 15.3451 7.04319L6.8598 15.5285C6.59945 15.7888 6.59945 16.2109 6.8598 16.4713L8.27401 17.8855L8.27536 17.8868L15.3453 24.9568C15.6057 25.2172 16.0278 25.2172 16.2881 24.9568L17.7024 23.5426C17.9627 23.2822 17.9627 22.8601 17.7024 22.5998L12.9969 17.8944C12.9129 17.8104 12.9724 17.6668 13.0912 17.6668L26 17.6668C26.3682 17.6668 26.6667 17.3683 26.6667 17.0001V15.0001C26.6667 14.6319 26.3682 14.3334 26 14.3334L13.0908 14.3334Z\"/>,\n 'MediaArrowLeft',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaLanguageIcon = createSvgIcon(\n [<path d=\"M4 7.38854C4 7.3149 4.0597 7.2552 4.13333 7.2552H10.1792C10.2528 7.2552 10.3125 7.19551 10.3125 7.12187V5.46666C10.3125 5.39302 10.3722 5.33333 10.4458 5.33333H12.726C12.7997 5.33333 12.8594 5.39302 12.8594 5.46666V7.12187C12.8594 7.19551 12.9191 7.2552 12.9927 7.2552H19.0333C19.107 7.2552 19.1667 7.3149 19.1667 7.38854V9.66354C19.1667 9.73717 19.107 9.79687 19.0333 9.79687H16.7106C16.6533 9.79687 16.6021 9.83433 16.5838 9.88869C15.4447 13.2641 14.1144 15.1953 13.5156 16.0573C13.4808 16.113 15.1333 17.5629 15.4974 17.8813C15.5402 17.9187 15.5534 17.9781 15.5321 18.0308L14.6529 20.2077C14.622 20.2843 14.5295 20.3146 14.4597 20.2703C13.5546 19.6951 12.8558 19.0727 11.9724 18.1584C11.9193 18.1036 11.8302 18.1049 11.7777 18.1603C9.69726 20.3578 8.60797 21.1142 6.80933 22.179C6.7475 22.2156 6.66731 22.1967 6.62871 22.1361L5.43696 20.2647C5.39711 20.2021 5.41633 20.1189 5.47911 20.0794C7.36746 18.8903 8.68502 17.6997 10.1302 16.1862C10.1752 16.139 10.1792 16.0655 10.14 16.0134C8.91005 14.3765 8.20369 13.2435 7.313 11.3664C7.28331 11.3039 7.30645 11.2285 7.36636 11.1938L9.32729 10.0573C9.39495 10.0181 9.48168 10.0453 9.51522 10.116C10.2082 11.5756 10.9182 12.7663 11.7071 13.8661C11.7622 13.9428 11.8775 13.9384 11.9269 13.8579C12.7208 12.5654 13.2411 11.5051 13.8451 9.97878C13.8797 9.89149 13.8153 9.79687 13.7214 9.79687H4V7.38854Z\" key=\"0\"/>,<path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M16.8316 26.6665C17.1181 26.6665 17.3726 26.4835 17.4637 26.2119L18.4836 23.1708C18.5018 23.1165 18.5527 23.0799 18.61 23.0799H23.8867C23.9439 23.0799 23.9948 23.1165 24.0131 23.1708L25.035 26.2122C25.1262 26.4837 25.3805 26.6665 25.6669 26.6665H27.0582C27.5181 26.6665 27.8398 26.2119 27.687 25.7782L23.0292 12.5661C22.9352 12.2994 22.6832 12.1211 22.4004 12.1211H20.0915C19.8087 12.1211 19.5566 12.2996 19.4627 12.5664L14.8113 25.7785C14.6587 26.2122 14.9804 26.6665 15.4402 26.6665H16.8316ZM23.0859 20.9634C23.1771 20.9634 23.2414 20.874 23.2123 20.7876L21.3208 15.1579C21.31 15.1257 21.2798 15.104 21.2459 15.104C21.2119 15.104 21.1818 15.1257 21.171 15.1579L19.2829 20.7877C19.2539 20.8741 19.3182 20.9634 19.4093 20.9634H23.0859Z\" key=\"1\"/>,],\n 'MediaLanguage',\n '0 0 32 32'\n);\n","import {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {List, ListItem} from '@common/ui/list/list';\nimport {Trans} from '@common/i18n/trans';\nimport {ReactNode, useState} from 'react';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {Button, ButtonProps} from '@common/ui/buttons/button';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {usePlayerActions} from '@common/player/hooks/use-player-actions';\nimport {ArrowRightIcon} from '@common/icons/material/ArrowRight';\nimport {useDarkThemeVariables} from '@common/ui/themes/use-dark-theme-variables';\nimport {MediaSettingsIcon} from '@common/icons/media/media-settings';\nimport {MediaPlaybackSpeedCircleIcon} from '@common/icons/media/media-playback-speed-circle';\nimport {MediaSettingsMenuIcon} from '@common/icons/media/media-settings-menu';\nimport {MediaClosedCaptionsIcon} from '@common/icons/media/media-closed-captions';\nimport {MediaArrowLeftIcon} from '@common/icons/media/media-arrow-left';\nimport {MediaLanguageIcon} from '@common/icons/media/media-language';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\ntype OptionsPanel = 'rate' | 'quality' | 'captions' | 'options' | 'language';\n\nconst Panels = {\n rate: PlaybackRatePanel,\n quality: PlaybackQualityPanel,\n options: OptionsListPanel,\n captions: CaptionsPanel,\n language: LanguagePanel,\n};\n\ninterface Props {\n color?: ButtonProps['color'];\n size?: ButtonProps['size'];\n iconSize?: ButtonProps['size'];\n className?: string;\n}\nexport function PlaybackOptionsButton({\n color,\n size,\n iconSize,\n className,\n}: Props) {\n const darkThemeVars = useDarkThemeVariables();\n const isMobile = useIsMobileMediaQuery();\n return (\n <DialogTrigger\n type=\"popover\"\n mobileType=\"tray\"\n placement=\"top-end\"\n usePortal={!!isMobile}\n >\n <IconButton\n color={color}\n size={size}\n iconSize={iconSize}\n className={className}\n >\n <MediaSettingsIcon />\n </IconButton>\n <Dialog size=\"w-256\" style={darkThemeVars}>\n <DialogBody padding=\"p-0\">\n <PlaybackOptionsPanel />\n </DialogBody>\n </Dialog>\n </DialogTrigger>\n );\n}\n\nfunction PlaybackOptionsPanel() {\n const [activePanel, setActivePanel] = useState<OptionsPanel>('options');\n const PanelComponent = Panels[activePanel];\n\n return (\n <AnimatePresence initial={false}>\n <PanelComponent\n activePanel={activePanel}\n onActivePanelChange={setActivePanel}\n />\n </AnimatePresence>\n );\n}\n\ninterface OptionsPanelProps {\n activePanel: OptionsPanel;\n onActivePanelChange: (panel: OptionsPanel) => void;\n}\nfunction OptionsListPanel({onActivePanelChange}: OptionsPanelProps) {\n const activeRate = usePlayerStore(s => s.playbackRate);\n const availableQualities = usePlayerStore(s => s.playbackQualities);\n const activeQuality = usePlayerStore(s => s.playbackQuality);\n\n const availableTextTracks = usePlayerStore(s => s.textTracks);\n const textTrackId = usePlayerStore(s => s.currentTextTrack);\n const currentTextTrack = availableTextTracks[textTrackId];\n\n const availableAudioTracks = usePlayerStore(s => s.audioTracks);\n const audioTrackId = usePlayerStore(s => s.currentAudioTrack);\n const currentAudioTrack = availableAudioTracks[audioTrackId];\n\n return (\n <m.div\n initial={{x: '-100%', opacity: 0}}\n animate={{x: 0, opacity: 1}}\n exit={{x: '100%', opacity: 0}}\n transition={{type: 'tween', duration: 0.14}}\n >\n <List>\n <ListItem\n startIcon={<MediaPlaybackSpeedCircleIcon />}\n endSection={\n <div className=\"flex items-center gap-2\">\n {activeRate}x\n <ArrowRightIcon size=\"sm\" />\n </div>\n }\n onSelected={() => onActivePanelChange('rate')}\n >\n <Trans message=\"Speed\" />\n </ListItem>\n <ListItem\n isDisabled={!availableQualities.length}\n startIcon={<MediaSettingsMenuIcon />}\n endSection={\n <div className=\"flex items-center gap-2 capitalize\">\n {activeQuality ? activeQuality : <Trans message=\"Auto\" />}\n <ArrowRightIcon size=\"sm\" />\n </div>\n }\n onSelected={() => onActivePanelChange('quality')}\n >\n <Trans message=\"Quality\" />\n </ListItem>\n <ListItem\n isDisabled={!availableTextTracks.length}\n startIcon={<MediaClosedCaptionsIcon />}\n endSection={\n <div className=\"flex items-center gap-2 capitalize\">\n {currentTextTrack ? (\n currentTextTrack.label\n ) : (\n <Trans message=\"None\" />\n )}\n <ArrowRightIcon size=\"sm\" />\n </div>\n }\n onSelected={() => onActivePanelChange('captions')}\n >\n <Trans message=\"Subtitles/CC\" />\n </ListItem>\n {availableAudioTracks.length > 1 && (\n <ListItem\n startIcon={<MediaLanguageIcon />}\n endSection={\n <div className=\"flex items-center gap-2 capitalize\">\n {currentAudioTrack ? (\n currentAudioTrack.label\n ) : (\n <Trans message=\"None\" />\n )}\n <ArrowRightIcon size=\"sm\" />\n </div>\n }\n onSelected={() => onActivePanelChange('language')}\n >\n <Trans message=\"Language\" />\n </ListItem>\n )}\n </List>\n </m.div>\n );\n}\n\nfunction PlaybackRatePanel({\n activePanel,\n onActivePanelChange,\n}: OptionsPanelProps) {\n const activeRate = usePlayerStore(s => s.playbackRate);\n const availableRates = usePlayerStore(s => s.playbackRates);\n const player = usePlayerActions();\n\n return (\n <PanelLayout\n activePanel={activePanel}\n onActivePanelChange={onActivePanelChange}\n title={<Trans message=\"Playback speed\" />}\n >\n <List>\n {availableRates.map(rate => (\n <ListItem\n key={rate}\n showCheckmark\n isSelected={activeRate === rate}\n onSelected={() => {\n player.setPlaybackRate(rate);\n onActivePanelChange('options');\n }}\n >\n {rate}x\n </ListItem>\n ))}\n </List>\n </PanelLayout>\n );\n}\n\nfunction PlaybackQualityPanel({\n activePanel,\n onActivePanelChange,\n}: OptionsPanelProps) {\n const activeQuality = usePlayerStore(s => s.playbackQuality);\n const availableQualities = usePlayerStore(s => s.playbackQualities);\n const player = usePlayerActions();\n\n return (\n <PanelLayout\n activePanel={activePanel}\n onActivePanelChange={onActivePanelChange}\n title={<Trans message=\"Playback quality\" />}\n >\n <List>\n {availableQualities.map(quality => (\n <ListItem\n capitalizeFirst\n key={quality}\n showCheckmark\n isSelected={activeQuality === quality}\n onSelected={() => {\n player.setPlaybackQuality(quality);\n onActivePanelChange('options');\n }}\n >\n {quality}\n </ListItem>\n ))}\n </List>\n </PanelLayout>\n );\n}\n\nfunction CaptionsPanel({activePanel, onActivePanelChange}: OptionsPanelProps) {\n const currentTextTrack = usePlayerStore(s => s.currentTextTrack);\n const textTracks = usePlayerStore(s => s.textTracks);\n const player = usePlayerActions();\n\n return (\n <PanelLayout\n activePanel={activePanel}\n onActivePanelChange={onActivePanelChange}\n title={<Trans message=\"Subtitles/Captions\" />}\n >\n <List>\n <ListItem\n key=\"off\"\n showCheckmark\n isSelected={currentTextTrack === -1}\n onSelected={() => {\n player.setCurrentTextTrack(-1);\n onActivePanelChange('options');\n }}\n >\n <Trans message=\"Off\" />\n </ListItem>\n {textTracks.map((track, index) => (\n <ListItem\n key={index}\n showCheckmark\n isSelected={currentTextTrack === index}\n onSelected={() => {\n player.setCurrentTextTrack(index);\n onActivePanelChange('options');\n }}\n >\n {track.label}\n </ListItem>\n ))}\n </List>\n </PanelLayout>\n );\n}\n\nfunction LanguagePanel({activePanel, onActivePanelChange}: OptionsPanelProps) {\n const currentAudioTrack = usePlayerStore(s => s.currentAudioTrack);\n const audioTracks = usePlayerStore(s => s.audioTracks);\n const player = usePlayerActions();\n\n return (\n <PanelLayout\n activePanel={activePanel}\n onActivePanelChange={onActivePanelChange}\n title={<Trans message=\"Language\" />}\n >\n <List>\n {audioTracks.map((track, index) => (\n <ListItem\n key={index}\n showCheckmark\n isSelected={currentAudioTrack === index}\n onSelected={() => {\n player.setCurrentAudioTrack(index);\n onActivePanelChange('options');\n }}\n >\n {track.label}\n </ListItem>\n ))}\n </List>\n </PanelLayout>\n );\n}\n\ninterface PanelLayoutProps extends OptionsPanelProps {\n children: ReactNode;\n title: ReactNode;\n}\nfunction PanelLayout({onActivePanelChange, children, title}: PanelLayoutProps) {\n return (\n <m.div\n initial={{x: '100%', opacity: 0}}\n animate={{x: 0, opacity: 1}}\n exit={{x: '-100%', opacity: 0}}\n transition={{type: 'tween', duration: 0.14}}\n >\n <div className=\"border-b p-10\">\n <Button\n className=\"w-full\"\n color=\"white\"\n justify=\"justify-start\"\n startIcon={<MediaArrowLeftIcon />}\n onClick={() => onActivePanelChange('options')}\n >\n {title}\n </Button>\n </div>\n {children}\n </m.div>\n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaFullscreenExitIcon = createSvgIcon(\n [<path d=\"M19.3334 13.3333C18.9652 13.3333 18.6667 13.0349 18.6667 12.6667L18.6667 7.33333C18.6667 6.96514 18.9652 6.66666 19.3334 6.66666H21.3334C21.7015 6.66666 22 6.96514 22 7.33333V9.86666C22 9.9403 22.0597 10 22.1334 10L24.6667 10C25.0349 10 25.3334 10.2985 25.3334 10.6667V12.6667C25.3334 13.0349 25.0349 13.3333 24.6667 13.3333L19.3334 13.3333Z\" key=\"0\"/>,<path d=\"M13.3334 19.3333C13.3334 18.9651 13.0349 18.6667 12.6667 18.6667H7.33335C6.96516 18.6667 6.66669 18.9651 6.66669 19.3333V21.3333C6.66669 21.7015 6.96516 22 7.33335 22H9.86669C9.94032 22 10 22.0597 10 22.1333L10 24.6667C10 25.0349 10.2985 25.3333 10.6667 25.3333H12.6667C13.0349 25.3333 13.3334 25.0349 13.3334 24.6667L13.3334 19.3333Z\" key=\"1\"/>,<path d=\"M18.6667 24.6667C18.6667 25.0349 18.9652 25.3333 19.3334 25.3333H21.3334C21.7015 25.3333 22 25.0349 22 24.6667V22.1333C22 22.0597 22.0597 22 22.1334 22H24.6667C25.0349 22 25.3334 21.7015 25.3334 21.3333V19.3333C25.3334 18.9651 25.0349 18.6667 24.6667 18.6667L19.3334 18.6667C18.9652 18.6667 18.6667 18.9651 18.6667 19.3333L18.6667 24.6667Z\" key=\"2\"/>,<path d=\"M10.6667 13.3333H12.6667C13.0349 13.3333 13.3334 13.0349 13.3334 12.6667L13.3334 10.6667V7.33333C13.3334 6.96514 13.0349 6.66666 12.6667 6.66666H10.6667C10.2985 6.66666 10 6.96514 10 7.33333L10 9.86666C10 9.9403 9.94033 10 9.86669 10L7.33335 10C6.96516 10 6.66669 10.2985 6.66669 10.6667V12.6667C6.66669 13.0349 6.96516 13.3333 7.33335 13.3333L10.6667 13.3333Z\" key=\"3\"/>,],\n 'MediaFullscreenExit',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaFullscreenIcon = createSvgIcon(\n [<path d=\"M25.3299 7.26517C25.2958 6.929 25.0119 6.66666 24.6667 6.66666H19.3334C18.9652 6.66666 18.6667 6.96514 18.6667 7.33333V9.33333C18.6667 9.70152 18.9652 10 19.3334 10L21.8667 10C21.9403 10 22 10.0597 22 10.1333V12.6667C22 13.0349 22.2985 13.3333 22.6667 13.3333H24.6667C25.0349 13.3333 25.3334 13.0349 25.3334 12.6667V7.33333C25.3334 7.31032 25.3322 7.28758 25.3299 7.26517Z\" key=\"0\"/>,<path d=\"M22 21.8667C22 21.9403 21.9403 22 21.8667 22L19.3334 22C18.9652 22 18.6667 22.2985 18.6667 22.6667V24.6667C18.6667 25.0349 18.9652 25.3333 19.3334 25.3333L24.6667 25.3333C25.0349 25.3333 25.3334 25.0349 25.3334 24.6667V19.3333C25.3334 18.9651 25.0349 18.6667 24.6667 18.6667H22.6667C22.2985 18.6667 22 18.9651 22 19.3333V21.8667Z\" key=\"1\"/>,<path d=\"M12.6667 22H10.1334C10.0597 22 10 21.9403 10 21.8667V19.3333C10 18.9651 9.70154 18.6667 9.33335 18.6667H7.33335C6.96516 18.6667 6.66669 18.9651 6.66669 19.3333V24.6667C6.66669 25.0349 6.96516 25.3333 7.33335 25.3333H12.6667C13.0349 25.3333 13.3334 25.0349 13.3334 24.6667V22.6667C13.3334 22.2985 13.0349 22 12.6667 22Z\" key=\"2\"/>,<path d=\"M10 12.6667V10.1333C10 10.0597 10.0597 10 10.1334 10L12.6667 10C13.0349 10 13.3334 9.70152 13.3334 9.33333V7.33333C13.3334 6.96514 13.0349 6.66666 12.6667 6.66666H7.33335C6.96516 6.66666 6.66669 6.96514 6.66669 7.33333V12.6667C6.66669 13.0349 6.96516 13.3333 7.33335 13.3333H9.33335C9.70154 13.3333 10 13.0349 10 12.6667Z\" key=\"3\"/>,],\n 'MediaFullscreen',\n '0 0 32 32'\n);\n","import {ButtonProps} from '@common/ui/buttons/button';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {usePlayerActions} from '@common/player/hooks/use-player-actions';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {message} from '@common/i18n/message';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\nimport {MediaFullscreenExitIcon} from '@common/icons/media/media-fullscreen-exit';\nimport {MediaFullscreenIcon} from '@common/icons/media/media-fullscreen';\n\ninterface Props {\n color?: ButtonProps['color'];\n size?: ButtonProps['size'];\n iconSize?: ButtonProps['size'];\n className?: string;\n}\nexport function FullscreenButton({\n size = 'md',\n iconSize,\n color,\n className,\n}: Props) {\n const {trans} = useTrans();\n const player = usePlayerActions();\n const playerReady = usePlayerStore(s => s.providerReady);\n const isFullscreen = usePlayerStore(s => s.isFullscreen);\n const canFullscreen = usePlayerStore(s => s.canFullscreen);\n\n if (!canFullscreen) {\n return null;\n }\n\n const labelMessage = trans(\n isFullscreen\n ? message('Exit fullscreen (f)')\n : message('Enter fullscreen (f)')\n );\n\n return (\n <Tooltip label={<Trans message={labelMessage} />} usePortal={false}>\n <IconButton\n disabled={!playerReady}\n aria-label={labelMessage}\n size={size}\n color={color}\n iconSize={iconSize}\n className={className}\n onClick={() => {\n if (isFullscreen) {\n player.exitFullscreen();\n } else {\n player.enterFullscreen();\n }\n }}\n >\n {isFullscreen ? <MediaFullscreenExitIcon /> : <MediaFullscreenIcon />}\n </IconButton>\n </Tooltip>\n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaPictureInPictureExitIcon = createSvgIcon(\n [<path d=\"M5.33334 26V19.4667C5.33334 19.393 5.39304 19.3333 5.46668 19.3333H7.86668C7.94031 19.3333 8.00001 19.393 8.00001 19.4667V23.3333C8.00001 23.7015 8.29849 24 8.66668 24H23.3333C23.7015 24 24 23.7015 24 23.3333V8.66666C24 8.29847 23.7015 7.99999 23.3333 7.99999H19.4667C19.393 7.99999 19.3333 7.9403 19.3333 7.86666V5.46666C19.3333 5.39302 19.393 5.33333 19.4667 5.33333H26C26.3682 5.33333 26.6667 5.63181 26.6667 5.99999V26C26.6667 26.3682 26.3682 26.6667 26 26.6667H6.00001C5.63182 26.6667 5.33334 26.3682 5.33334 26Z\" key=\"0\"/>,<path d=\"M14.0098 8.42359H10.806C10.6872 8.42359 10.6277 8.56721 10.7117 8.6512L16.5491 14.4886C16.8094 14.7489 16.8094 15.171 16.5491 15.4314L15.3234 16.657C15.0631 16.9174 14.641 16.9174 14.3806 16.657L8.63739 10.9138C8.55339 10.8298 8.40978 10.8893 8.40978 11.0081V14.0236C8.40978 14.3918 8.1113 14.6903 7.74311 14.6903H6.00978C5.64159 14.6903 5.34311 14.3918 5.34311 14.0236L5.34311 6.02359C5.34311 5.6554 5.64159 5.35692 6.00978 5.35692L14.0098 5.35692C14.378 5.35692 14.6764 5.6554 14.6764 6.02359V7.75692C14.6764 8.12511 14.378 8.42359 14.0098 8.42359Z\" key=\"1\"/>,],\n 'MediaPictureInPictureExit',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaPictureInPictureIcon = createSvgIcon(\n [<path d=\"M16 15.3333C15.6318 15.3333 15.3333 15.6318 15.3333 16V20C15.3333 20.3682 15.6318 20.6667 16 20.6667H21.3333C21.7015 20.6667 22 20.3682 22 20V16C22 15.6318 21.7015 15.3333 21.3333 15.3333H16Z\" key=\"0\"/>,<path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M5.33333 7.33334C5.33333 6.96515 5.63181 6.66667 5.99999 6.66667H26C26.3682 6.66667 26.6667 6.96515 26.6667 7.33334V24.6667C26.6667 25.0349 26.3682 25.3333 26 25.3333H5.99999C5.63181 25.3333 5.33333 25.0349 5.33333 24.6667V7.33334ZM7.99999 10C7.99999 9.63182 8.29847 9.33334 8.66666 9.33334H23.3333C23.7015 9.33334 24 9.63182 24 10V22C24 22.3682 23.7015 22.6667 23.3333 22.6667H8.66666C8.29847 22.6667 7.99999 22.3682 7.99999 22V10Z\" key=\"1\"/>,],\n 'MediaPictureInPicture',\n '0 0 32 32'\n);\n","import {ButtonProps} from '@common/ui/buttons/button';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {usePlayerActions} from '@common/player/hooks/use-player-actions';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {message} from '@common/i18n/message';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\nimport {MediaPictureInPictureExitIcon} from '@common/icons/media/media-picture-in-picture-exit';\nimport {MediaPictureInPictureIcon} from '@common/icons/media/media-picture-in-picture';\n\ninterface Props {\n color?: ButtonProps['color'];\n size?: ButtonProps['size'];\n iconSize?: ButtonProps['size'];\n className?: string;\n}\nexport function PipButton({size = 'md', iconSize, color, className}: Props) {\n const {trans} = useTrans();\n const player = usePlayerActions();\n const playerReady = usePlayerStore(s => s.providerReady);\n const isPip = usePlayerStore(s => s.isPip);\n const canPip = usePlayerStore(s => s.canPip);\n\n if (!canPip) {\n return null;\n }\n\n const labelMessage = trans(\n isPip\n ? message('Exit picture-in-picture (p)')\n : message('Enter picture-in-picture (p)')\n );\n\n return (\n <Tooltip label={<Trans message={labelMessage} />} usePortal={false}>\n <IconButton\n disabled={!playerReady}\n aria-label={labelMessage}\n size={size}\n color={color}\n iconSize={iconSize}\n className={className}\n onClick={() => {\n if (isPip) {\n player.exitPip();\n } else {\n player.enterPip();\n }\n }}\n >\n {isPip ? (\n <MediaPictureInPictureExitIcon />\n ) : (\n <MediaPictureInPictureIcon />\n )}\n </IconButton>\n </Tooltip>\n );\n}\n","import {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport clsx from 'clsx';\nimport {Seekbar} from '@common/player/ui/controls/seeking/seekbar';\nimport {PlayButton} from '@common/player/ui/controls/play-button';\nimport {NextButton} from '@common/player/ui/controls/next-button';\nimport {\n ToggleMuteButton,\n VolumeControls,\n} from '@common/player/ui/controls/volume-controls';\nimport {FormattedCurrentTime} from '@common/player/ui/controls/formatted-current-time';\nimport {FormattedPlayerDuration} from '@common/player/ui/controls/formatted-player-duration';\nimport {ToggleCaptionsButton} from '@common/player/ui/controls/toggle-captions-button';\nimport {PlaybackOptionsButton} from '@common/player/ui/controls/playback-options-button';\nimport {FullscreenButton} from '@common/player/ui/controls/fullscreen-button';\nimport {PipButton} from '@common/player/ui/controls/pip-button';\nimport {Fragment, ReactNode} from 'react';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\ninterface Props {\n rightActions?: ReactNode;\n onPointerEnter?: () => void;\n onPointerLeave?: () => void;\n}\nexport function VideoPlayerControls(props: Props) {\n const isMobile = useIsMobileMediaQuery();\n const controlsVisible = usePlayerStore(s => s.controlsVisible);\n\n const className = clsx(\n 'player-bottom-text-shadow absolute z-40 text-white/87 transition-opacity duration-300',\n controlsVisible ? 'opacity-100' : 'opacity-0'\n );\n\n return isMobile ? (\n <MobileControls className={className} {...props} />\n ) : (\n <DesktopControls className={className} {...props} />\n );\n}\n\ninterface ResponsiveControlsProps extends Props {\n className: string;\n}\nfunction DesktopControls({\n onPointerEnter,\n onPointerLeave,\n rightActions,\n className,\n}: ResponsiveControlsProps) {\n return (\n <div\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onClick={e => e.stopPropagation()}\n className={clsx('bottom-0 left-0 right-0 p-8', className)}\n >\n <Seekbar trackColor=\"bg-white/40\" />\n <div className=\"flex w-full items-center gap-4\">\n <PlayButton color=\"white\" />\n <NextButton color=\"white\" />\n <VolumeControls\n className=\"max-md:hidden\"\n fillColor=\"bg-white\"\n trackColor=\"bg-white/20\"\n buttonColor=\"white\"\n />\n <span className=\"ml-10 text-sm\">\n <FormattedCurrentTime className=\"min-w-40 text-right\" /> /{' '}\n <FormattedPlayerDuration className=\"min-w-40 text-right\" />\n </span>\n <div className=\"ml-auto flex flex-shrink-0 items-center gap-4\">\n {rightActions}\n <ToggleCaptionsButton color=\"white\" />\n <PlaybackOptionsButton color=\"white\" />\n <FullscreenButton className=\"ml-auto\" color=\"white\" />\n <PipButton color=\"white\" />\n </div>\n </div>\n </div>\n );\n}\n\nfunction MobileControls({\n rightActions,\n onPointerEnter,\n onPointerLeave,\n className,\n}: ResponsiveControlsProps) {\n return (\n <Fragment>\n <div\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onClick={e => e.stopPropagation()}\n className={clsx('left-0 right-0 top-0 px-6 pt-6 ', className)}\n >\n <div className=\"flex items-end justify-end\">\n {rightActions}\n <ToggleCaptionsButton color=\"white\" />\n <PlaybackOptionsButton color=\"white\" />\n <PipButton color=\"white\" />\n <ToggleMuteButton color=\"white\" size=\"md\" />\n </div>\n </div>\n <div\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n onClick={e => e.stopPropagation()}\n className={clsx('bottom-0 left-0 right-0 px-12', className)}\n >\n <div className=\"flex items-end gap-24\">\n <div className=\"text-sm\">\n <FormattedCurrentTime className=\"min-w-40 text-right\" /> /{' '}\n <FormattedPlayerDuration className=\"min-w-40 text-right\" />\n </div>\n <FullscreenButton\n size=\"sm\"\n iconSize=\"lg\"\n color=\"white\"\n className=\"ml-auto\"\n />\n </div>\n <Seekbar trackColor=\"bg-white/40\" />\n </div>\n </Fragment>\n );\n}\n","import {\n MutableRefObject,\n ReactNode,\n useCallback,\n useEffect,\n useRef,\n} from 'react';\nimport {PlayerContext} from '@common/player/player-context';\nimport {MediaItem} from '@common/player/media-item';\nimport {PlayerOutlet} from '@common/player/ui/player-outlet';\nimport {\n PlayerActions,\n usePlayerActions,\n} from '@common/player/hooks/use-player-actions';\nimport {usePlayerStore} from '@common/player/hooks/use-player-store';\nimport clsx from 'clsx';\nimport {PlayerPoster} from '@common/player/ui/controls/player-poster';\nimport {usePlayerClickHandler} from '@common/player/hooks/use-player-click-handler';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport {BufferingSpinner} from '@common/player/ui/controls/buffering-spinner';\nimport {guessPlayerProvider} from '@common/player/utils/guess-player-provider';\nimport {usePrevious} from '@common/utils/hooks/use-previous';\nimport {PlayerStoreOptions} from '@common/player/state/player-store-options';\nimport {VideoPlayerControls} from '@common/player/ui/video-player/video-player-controls';\n\ninterface Props {\n id: string;\n queue?: MediaItem[];\n cuedMediaId?: string;\n autoPlay?: boolean;\n src?: string;\n listeners?: PlayerStoreOptions['listeners'];\n onDestroy?: PlayerStoreOptions['onDestroy'];\n onBeforePlayNext?: PlayerStoreOptions['onBeforePlayNext'];\n onBeforePlayPrevious?: PlayerStoreOptions['onBeforePlayPrevious'];\n apiRef?: MutableRefObject<PlayerActions>;\n rightActions?: ReactNode;\n}\nexport function VideoPlayer({\n id,\n queue,\n cuedMediaId,\n autoPlay,\n src,\n listeners,\n onBeforePlayPrevious,\n onBeforePlayNext,\n onDestroy,\n apiRef,\n rightActions,\n}: Props) {\n return (\n <PlayerContext\n id={id}\n options={{\n autoPlay,\n listeners,\n onDestroy,\n onBeforePlayNext,\n onBeforePlayPrevious,\n initialData: {\n queue: queue ? queue : [mediaItemFromSrc(src!)],\n cuedMediaId,\n },\n }}\n >\n <QueueOverrider src={src} queue={queue} />\n <PlayerLayout apiRef={apiRef} rightActions={rightActions} />\n </PlayerContext>\n );\n}\n\ninterface PlayerLayoutProps {\n apiRef?: MutableRefObject<PlayerActions>;\n rightActions?: ReactNode;\n}\nfunction PlayerLayout({apiRef, rightActions}: PlayerLayoutProps) {\n const leaveTimerRef = useRef<number | null>();\n const inactiveTimerRef = useRef<number | null>();\n const pointerIsOverControls = useRef(false);\n const actions = usePlayerActions();\n const controlsVisible = usePlayerStore(s => s.controlsVisible);\n const {setControlsVisible, getState} = actions;\n\n const clickHandler = usePlayerClickHandler();\n\n const clearTimers = () => {\n if (leaveTimerRef.current) {\n clearTimeout(leaveTimerRef.current);\n leaveTimerRef.current = null;\n }\n if (inactiveTimerRef.current) {\n clearTimeout(inactiveTimerRef.current);\n inactiveTimerRef.current = null;\n }\n };\n\n const startInactiveTimer = useCallback(() => {\n if (getState().isPlaying) {\n inactiveTimerRef.current = window.setTimeout(() => {\n setControlsVisible(false);\n }, 3500);\n }\n }, [getState, setControlsVisible]);\n\n // show controls when any key is pressed\n useEffect(() => {\n const listener = () => {\n clearTimers();\n setControlsVisible(true);\n };\n document.addEventListener('keydown', listener);\n return () => document.removeEventListener('keydown', listener);\n }, [setControlsVisible]);\n\n useEffect(() => {\n if (apiRef) {\n apiRef.current = actions;\n return actions.subscribe({\n play: () => startInactiveTimer(),\n });\n }\n }, [apiRef, actions, setControlsVisible, startInactiveTimer]);\n\n return (\n <div\n className={clsx(\n 'fullscreen-host relative isolate aspect-video bg-black',\n !controlsVisible && 'cursor-none',\n )}\n onClick={clickHandler}\n onPointerEnter={() => {\n setControlsVisible(true);\n clearTimers();\n }}\n onPointerMove={() => {\n if (pointerIsOverControls.current && controlsVisible) {\n return;\n }\n if (inactiveTimerRef.current) {\n setControlsVisible(true);\n }\n clearTimers();\n startInactiveTimer();\n }}\n onPointerLeave={() => {\n clearTimers();\n if (!getState().isPlaying) {\n return;\n }\n leaveTimerRef.current = window.setTimeout(() => {\n setControlsVisible(false);\n }, 2500);\n }}\n >\n <PlayerOutlet className=\"z-50 h-full w-full\" />\n <Blocker />\n <PlayerPoster className=\"absolute inset-0 z-30\" />\n <OverlayButtons />\n <BufferingSpinner\n className=\"spinner pointer-events-none absolute inset-0 z-40 m-auto h-50 w-50\"\n fillColor=\"border-white\"\n trackColor=\"border-white/30\"\n size=\"w-50 h-50\"\n />\n <BottomGradient />\n <VideoPlayerControls\n rightActions={rightActions}\n onPointerEnter={() => {\n pointerIsOverControls.current = true;\n setControlsVisible(true);\n clearTimers();\n }}\n onPointerLeave={() => {\n pointerIsOverControls.current = false;\n }}\n />\n </div>\n );\n}\n\nfunction OverlayButtons() {\n const showPlayButton = usePlayerStore(s => !s.isPlaying && !s.isSeeking);\n return (\n <div\n className={clsx(\n 'absolute left-0 top-0 z-40 flex h-full w-full items-center justify-center transition-opacity',\n showPlayButton ? 'opacity-100' : 'pointer-events-none opacity-0',\n )}\n >\n <IconButton\n color=\"primary\"\n variant=\"raised\"\n size=\"lg\"\n radius=\"rounded-full\"\n >\n <MediaPlayIcon />\n </IconButton>\n </div>\n );\n}\n\n// required in order for \"onPointerEnter\" to fire consistently when player provider is iframe\nfunction Blocker() {\n return <div className=\"absolute inset-0 z-20\" />;\n}\n\nfunction BottomGradient() {\n const controlsVisible = usePlayerStore(s => s.controlsVisible);\n return (\n <div\n className={clsx(\n 'player-bottom-gradient pointer-events-none absolute bottom-0 z-30 h-full w-full transition-opacity duration-300',\n controlsVisible ? 'opacity-100' : 'opacity-0',\n )}\n />\n );\n}\n\nfunction mediaItemFromSrc(src: string): MediaItem {\n return {\n id: src,\n src,\n provider: guessPlayerProvider(src),\n };\n}\n\ninterface QueueOverriderProps {\n src?: string;\n queue?: MediaItem[];\n}\nfunction QueueOverrider({src, queue}: QueueOverriderProps) {\n const {getState, overrideQueue} = usePlayerActions();\n\n const queueKey = queue?.map(item => item.id).join('-') ?? '';\n const previousKey = usePrevious(queueKey);\n\n // override queue when any of specified queue item id or order changes\n useEffect(() => {\n if (queue && previousKey && queueKey && previousKey !== queueKey) {\n overrideQueue(queue);\n }\n }, [queueKey, previousKey, queue, overrideQueue]);\n\n // override queue when src changes\n useEffect(() => {\n if (src && getState().cuedMedia?.src !== src) {\n overrideQueue([mediaItemFromSrc(src)]);\n }\n }, [src, getState, overrideQueue]);\n\n return null;\n}\n","import {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport clsx from 'clsx';\nimport {Title} from '@app/titles/models/title';\nimport {\n ImageSize,\n useImageSrc,\n useImageSrcSet,\n} from '@app/images/use-image-src';\nimport {Episode} from '@app/titles/models/episode';\nimport {TitleLink} from '@app/titles/title-link';\nimport {EpisodeLink} from '@app/episodes/episode-link';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Link} from 'react-router-dom';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport {MovieIcon} from '@common/icons/material/Movie';\n\n// can provide either url for backdrop directly or\n// title/episode object if main backdrop for it should be used\ninterface Props {\n src?: string;\n title?: Title;\n episode?: Episode;\n className?: string;\n size?: string;\n lazy?: boolean;\n srcSize?: ImageSize;\n wrapWithLink?: boolean;\n showPlayButton?: boolean;\n wrapperClassName?: string;\n}\nexport function TitleBackdrop({\n src: initialSrc,\n title,\n episode,\n className,\n size,\n srcSize,\n lazy = true,\n wrapWithLink = false,\n showPlayButton,\n wrapperClassName,\n}: Props) {\n const {trans} = useTrans();\n const primaryVideo = episode?.primary_video || title?.primary_video;\n if (!primaryVideo) {\n showPlayButton = false;\n }\n\n if (!initialSrc && episode) {\n initialSrc = episode?.poster;\n }\n if (!initialSrc && title) {\n initialSrc = title.backdrop;\n }\n\n const src = useImageSrc(initialSrc, {size: srcSize});\n const item = episode || title;\n const srcset = useImageSrcSet(initialSrc);\n\n const imageClassName = clsx(\n className,\n size,\n 'aspect-video bg-fg-base/4 object-cover',\n !src ? 'flex items-center justify-center' : 'block',\n );\n\n let img = src ? (\n <img\n className={imageClassName}\n draggable={false}\n decoding=\"async\"\n sizes={!srcSize ? `100vw` : undefined}\n loading={lazy ? 'lazy' : 'eager'}\n src={src}\n srcSet={!srcSize ? srcset : undefined}\n alt={\n item\n ? trans(\n message('Backdrop for :name', {\n values: {name: item.name},\n }),\n )\n : ''\n }\n />\n ) : (\n <span className={imageClassName}>\n <MovieIcon className=\"max-w-[60%] text-divider\" size=\"text-6xl\" />\n </span>\n );\n\n const playButton = showPlayButton ? (\n <div className=\"absolute bottom-14 left-14\">\n <IconButton\n color=\"white\"\n variant=\"flat\"\n className=\"shadow-md\"\n radius=\"rounded-full\"\n elementType={Link}\n to={getWatchLink(primaryVideo!)}\n aria-label=\"Play\"\n >\n <MediaPlayIcon />\n </IconButton>\n </div>\n ) : null;\n\n if (wrapWithLink) {\n if (episode) {\n img = (\n <EpisodeLink\n episode={episode}\n title={title!}\n seasonNumber={episode.season_number}\n displayContents\n >\n {img}\n </EpisodeLink>\n );\n } else if (title) {\n img = (\n <TitleLink title={title} displayContents>\n {img}\n </TitleLink>\n );\n }\n }\n\n return (\n <div className={clsx('group relative flex-shrink-0', wrapperClassName)}>\n {img}\n {playButton}\n {wrapWithLink && (\n <div className=\"pointer-events-none absolute inset-0 bg-black opacity-0 transition-opacity group-hover:opacity-10\" />\n )}\n </div>\n );\n}\n","import {Video} from '@app/titles/models/video';\nimport React, {ReactElement, useEffect, useState} from 'react';\nimport {Title} from '@app/titles/models/title';\nimport {Episode} from '@app/titles/models/episode';\nimport {TitleBackdrop} from '@app/titles/title-poster/title-backdrop';\nimport {ImageSize} from '@app/images/use-image-src';\nimport {VideoPlayerSkeleton} from '@app/videos/video-player-skeleton';\nimport clsx from 'clsx';\nimport {loadYoutubePoster} from '@common/player/providers/youtube/load-youtube-poster';\nimport {youtubeIdFromSrc} from '@common/player/utils/youtube-id-from-src';\n\ninterface Props {\n video: Video;\n isLazy?: boolean;\n title?: Title;\n episode?: Episode;\n srcSize?: ImageSize;\n size?: string;\n fallback?: ReactElement;\n forceTitleBackdrop?: boolean;\n}\nexport function VideoThumbnail({\n video,\n isLazy,\n title,\n episode,\n srcSize,\n size = 'w-full max-h-full',\n fallback,\n forceTitleBackdrop = false,\n}: Props) {\n const [thumbnailUrl, setThumbnailUrl] = useState<string | undefined>(\n video.thumbnail\n );\n\n useEffect(() => {\n if (\n !video.thumbnail &&\n !forceTitleBackdrop &&\n video.src.includes('youtube')\n ) {\n const youtubeId = youtubeIdFromSrc(video.src);\n if (youtubeId) {\n loadYoutubePoster(youtubeId).then(url => {\n if (url) {\n setThumbnailUrl(url);\n }\n });\n }\n }\n }, [video.src, video.thumbnail, forceTitleBackdrop]);\n\n if (forceTitleBackdrop || !thumbnailUrl) {\n if (title) {\n return (\n <TitleBackdropFallback\n title={title}\n episode={episode}\n srcSize={srcSize}\n size={size}\n />\n );\n }\n if (fallback) {\n return fallback;\n }\n return <VideoPlayerSkeleton animate={false} />;\n }\n\n return (\n <img\n loading={isLazy ? 'lazy' : undefined}\n decoding=\"async\"\n src={thumbnailUrl}\n alt=\"\"\n className={clsx(size, 'aspect-video flex-shrink-0 object-cover')}\n />\n );\n}\n\ninterface TitleBackdropFallbackProps {\n title: Title;\n episode?: Episode;\n srcSize?: ImageSize;\n size?: string;\n}\nfunction TitleBackdropFallback({\n title,\n episode,\n srcSize,\n size,\n}: TitleBackdropFallbackProps) {\n return (\n <TitleBackdrop\n title={title}\n episode={episode}\n srcSize={srcSize}\n size={size}\n />\n );\n}\n","import {PlayerActions} from '@common/player/hooks/use-player-actions';\nimport {MediaItem} from '@common/player/media-item';\nimport {Video} from '@app/titles/models/video';\nimport {MutableRefObject, useCallback} from 'react';\nimport {getCookie} from 'react-use-cookie';\n\ninterface Options {\n enabled?: boolean;\n}\n\nexport function useLogVideoPlay(\n playerRef: MutableRefObject<PlayerActions>,\n {enabled = true}: Options = {}\n) {\n return useCallback((): boolean => {\n const player = playerRef.current;\n if (!player || !enabled) {\n return false;\n }\n const media = player.getState().cuedMedia as MediaItem<Video> | undefined;\n if (!media?.meta?.id || player.getCurrentTime() === 0) {\n return false;\n }\n return navigator.sendBeacon(\n `/api/v1/videos/${media.meta.id}/log-play`,\n JSON.stringify({\n currentTime: player.getCurrentTime(),\n duration: player.getState().mediaDuration,\n _token: getCookie('XSRF-TOKEN'),\n })\n );\n }, [playerRef, enabled]);\n}\n","import {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport clsx from 'clsx';\nimport {ImageSize, useImageSrc} from '@app/images/use-image-src';\nimport {Episode} from '@app/titles/models/episode';\nimport {EpisodeLink} from '@app/episodes/episode-link';\nimport {Title} from '@app/titles/models/title';\nimport {ReactNode} from 'react';\nimport {Link} from 'react-router-dom';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport {MovieIcon} from '@common/icons/material/Movie';\n\ninterface Props {\n title: Title;\n episode: Episode;\n seasonNumber?: number;\n className?: string;\n size?: string;\n lazy?: boolean;\n srcSize?: ImageSize;\n children?: ReactNode;\n aspect?: string;\n link?: string;\n wrapWithLink?: boolean;\n showPlayButton?: boolean;\n rightAction?: ReactNode;\n}\nexport function EpisodePoster({\n episode,\n title,\n seasonNumber,\n className,\n size,\n srcSize,\n lazy = true,\n children,\n aspect = 'aspect-video',\n link,\n wrapWithLink = true,\n showPlayButton,\n rightAction,\n}: Props) {\n const {trans} = useTrans();\n const src = useImageSrc(episode.poster, {size: srcSize});\n\n const imageClassName = clsx(\n 'w-full h-full object-cover bg-fg-base/4',\n !src ? 'flex items-center justify-center' : 'block',\n );\n\n let image = src ? (\n <img\n className={imageClassName}\n draggable={false}\n loading={lazy ? 'lazy' : 'eager'}\n src={src}\n alt={trans(message('Poster for :name', {values: {name: episode.name}}))}\n />\n ) : (\n <span className={imageClassName}>\n <MovieIcon className=\"max-w-[60%] text-divider\" size=\"text-6xl\" />\n </span>\n );\n\n const playButton =\n showPlayButton && episode.primary_video ? (\n <IconButton\n color=\"white\"\n variant=\"flat\"\n className=\"absolute bottom-12 left-12 z-10 shadow-md\"\n elementType={Link}\n radius=\"rounded-full\"\n to={getWatchLink(episode.primary_video)}\n >\n <MediaPlayIcon />\n </IconButton>\n ) : null;\n\n if (wrapWithLink) {\n image = link ? (\n <Link to={link}>{image}</Link>\n ) : (\n <EpisodeLink\n title={title}\n episode={episode}\n seasonNumber={episode.season_number ?? seasonNumber}\n displayContents\n >\n {image}\n </EpisodeLink>\n );\n }\n\n return (\n <div\n className={clsx('group relative flex-shrink-0', size, aspect, className)}\n >\n {image}\n {playButton}\n {children && <div className=\"absolute bottom-14 left-14\">{children}</div>}\n {wrapWithLink && (\n <div className=\"pointer-events-none absolute inset-0 bg-black opacity-0 transition-opacity group-hover:opacity-10\" />\n )}\n {rightAction && (\n <div className=\"absolute bottom-12 right-12 z-10 shadow-md\">\n {rightAction}\n </div>\n )}\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowBackIcon = createSvgIcon(\n <path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\" />\n, 'ArrowBackOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowForwardIcon = createSvgIcon(\n <path d=\"m12 4-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8-8-8z\" />\n, 'ArrowForwardOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TvIcon = createSvgIcon(\n <path d=\"M21 3H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.1-.9-2-2-2zm0 14H3V5h18v12z\" />\n, 'TvOutlined');\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {useParams} from 'react-router-dom';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Season} from '@app/titles/models/season';\nimport {Title} from '@app/titles/models/title';\nimport {Episode} from '@app/titles/models/episode';\nimport {PaginationResponse} from '@common/http/backend-response/pagination-response';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nexport interface GetSeasonResponse extends BackendResponse {\n season: Season;\n title: Title;\n episodes?: PaginationResponse<Episode>;\n}\n\ninterface Params {\n skipUpdating?: boolean;\n truncateDescriptions?: boolean;\n load?: string;\n}\n\nexport const seasonQueryKey = (\n titleId: number | string,\n season: number | string,\n params?: any,\n) => {\n const key = ['titles', `${titleId}`, 'seasons', `${season}`];\n if (params) {\n key.push(params);\n }\n return key;\n};\n\nexport function useSeason(loader: 'seasonPage' | 'season' | 'editSeasonPage') {\n const {titleId, season} = useParams();\n return useQuery({\n queryKey: seasonQueryKey(titleId!, season!, loader),\n queryFn: () => fetchSeason(titleId!, season!, loader),\n initialData: () => {\n const data = getBootstrapData().loaders?.[loader];\n if (data?.title?.id == titleId && data?.season?.number == season) {\n return data;\n }\n return undefined;\n },\n });\n}\n\nfunction fetchSeason(\n titleId: number | string,\n seasonNumber: number | string,\n loader: string,\n) {\n return apiClient\n .get<GetSeasonResponse>(`titles/${titleId}/seasons/${seasonNumber}`, {\n params: {loader},\n })\n .then(response => response.data);\n}\n","import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {PaginationResponse} from '@common/http/backend-response/pagination-response';\nimport {Episode} from '@app/titles/models/episode';\nimport {useParams} from 'react-router-dom';\nimport {seasonQueryKey} from '@app/seasons/requests/use-season';\n\ninterface Props {\n titleId?: number | string;\n season?: number | string;\n willSortOrFilter?: boolean;\n defaultOrderBy?: string;\n defaultOrderDir?: 'desc' | 'asc';\n}\n\nexport function useSeasonEpisodes(\n initialPage?: PaginationResponse<Episode>,\n queryParams?: Record<string, string | number>,\n props: Props = {}\n) {\n const urlParams = useParams();\n const titleId = props.titleId || urlParams.titleId;\n const season = props.season || urlParams.season;\n return useInfiniteData<Episode>({\n initialPage,\n willSortOrFilter: props.willSortOrFilter,\n defaultOrderBy: props.defaultOrderBy,\n defaultOrderDir: props.defaultOrderDir,\n endpoint: `titles/${titleId}/seasons/${season}/episodes`,\n queryKey: [...seasonQueryKey(titleId!, season!), 'episodes'],\n queryParams,\n });\n}\n","import React, {ReactNode, useEffect, useRef, useState} from 'react';\nimport clsx from 'clsx';\nimport {UseInfiniteQueryResult} from '@tanstack/react-query/src/types';\nimport {Trans} from '@common/i18n/trans';\nimport {Button} from '@common/ui/buttons/button';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\n\nexport interface InfiniteScrollSentinelProps {\n loaderMarginTop?: string;\n children?: ReactNode;\n loadMoreExtraContent?: ReactNode;\n query: UseInfiniteQueryResult;\n style?: React.CSSProperties;\n className?: string;\n variant?: 'infiniteScroll' | 'loadMore';\n size?: 'sm' | 'md';\n}\nexport function InfiniteScrollSentinel({\n query: {isInitialLoading, fetchNextPage, isFetchingNextPage, hasNextPage},\n children,\n loaderMarginTop = 'mt-24',\n style,\n className,\n variant: _variant = 'infiniteScroll',\n loadMoreExtraContent,\n size = 'md',\n}: InfiniteScrollSentinelProps) {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const isLoading = isFetchingNextPage || isInitialLoading;\n const [loadMoreClickCount, setLoadMoreClickCount] = useState(0);\n const innerVariant =\n _variant === 'loadMore' && loadMoreClickCount < 3\n ? 'loadMore'\n : 'infiniteScroll';\n\n useEffect(() => {\n const sentinelEl = sentinelRef.current;\n if (!sentinelEl || innerVariant === 'loadMore') return;\n const observer = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting && hasNextPage && !isLoading) {\n fetchNextPage();\n }\n });\n observer.observe(sentinelEl);\n return () => {\n observer.unobserve(sentinelEl);\n };\n }, [fetchNextPage, hasNextPage, isLoading, innerVariant]);\n\n let content: ReactNode;\n\n if (children) {\n // children might already be wrapped in AnimatePresence, so only wrap default loader with it\n content = isFetchingNextPage ? children : null;\n } else if (innerVariant === 'loadMore') {\n content = !isInitialLoading && hasNextPage && (\n <div className={clsx('flex items-center gap-8', loaderMarginTop)}>\n {loadMoreExtraContent}\n <Button\n size={size === 'md' ? 'sm' : 'xs'}\n className={clsx(\n size === 'sm' ? 'min-h-24 min-w-96' : 'min-h-36 min-w-112'\n )}\n variant=\"outline\"\n color=\"primary\"\n onClick={() => {\n fetchNextPage();\n setLoadMoreClickCount(loadMoreClickCount + 1);\n }}\n disabled={isLoading}\n >\n {loadMoreClickCount >= 2 && !isFetchingNextPage ? (\n <Trans message=\"Load all\" />\n ) : (\n <Trans message=\"Show more\" />\n )}\n </Button>\n </div>\n );\n } else {\n content = (\n <AnimatePresence>\n {isFetchingNextPage && (\n <m.div\n className={clsx('flex justify-center w-full', loaderMarginTop)}\n {...opacityAnimation}\n >\n <ProgressCircle size={size} isIndeterminate aria-label=\"loading\" />\n </m.div>\n )}\n </AnimatePresence>\n );\n }\n\n return (\n <div\n style={style}\n className={clsx('w-full', className, hasNextPage && 'min-h-36')}\n role=\"presentation\"\n >\n <div ref={sentinelRef} aria-hidden />\n {content}\n </div>\n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaEpisodesIcon = createSvgIcon(\n [<path d=\"M24 19.3328V9.46667C24 9.39303 23.9403 9.33334 23.8667 9.33334L11.3333 9.33334C10.9652 9.33334 10.6667 9.03486 10.6667 8.66667V7.33334C10.6667 6.96515 10.9652 6.66667 11.3333 6.66667H26C26.3682 6.66667 26.6667 6.96515 26.6667 7.33334V19.3328C26.6667 19.701 26.3682 19.9994 26 19.9994H24.6667C24.2985 19.9994 24 19.701 24 19.3328Z\" key=\"0\"/>,<path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M6.00001 12C5.63182 12 5.33334 12.2985 5.33334 12.6667V24.6667C5.33334 25.0349 5.63182 25.3333 6.00001 25.3333H20.6672C21.0354 25.3333 21.3338 25.0349 21.3338 24.6667V12.6667C21.3338 12.2985 21.0354 12 20.6672 12H6.00001ZM8.66668 14.6667C8.29849 14.6667 8.00001 14.9651 8.00001 15.3333V22C8.00001 22.3682 8.29849 22.6667 8.66668 22.6667H18C18.3682 22.6667 18.6667 22.3682 18.6667 22V15.3333C18.6667 14.9651 18.3682 14.6667 18 14.6667H8.66668Z\" key=\"1\"/>,],\n 'MediaEpisodes',\n '0 0 32 32'\n);\n","import {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {useDarkThemeVariables} from '@common/ui/themes/use-dark-theme-variables';\nimport {Title} from '@app/titles/models/title';\nimport {Episode} from '@app/titles/models/episode';\nimport {Accordion, AccordionItem} from '@common/ui/accordion/accordion';\nimport {EpisodePoster} from '@app/episodes/episode-poster/episode-poster';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport React, {Fragment, ReactElement, ReactNode, useState} from 'react';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\nimport {List, ListItem} from '@common/ui/list/list';\nimport {FullPageLoader} from '@common/ui/progress/full-page-loader';\nimport {ArrowForwardIcon} from '@common/icons/material/ArrowForward';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {TvIcon} from '@common/icons/material/Tv';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {useSeasonEpisodes} from '@app/titles/requests/use-season-episodes';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {MediaEpisodesIcon} from '@common/icons/media/media-episodes';\n\ninterface Props {\n title: Title;\n currentEpisode: Episode;\n onSelected: (episode: Episode) => void;\n trigger?: ReactElement;\n}\nexport function EpisodeSelector(props: Props) {\n const trigger = props.trigger || (\n <Tooltip label={<Trans message=\"Episodes\" />}>\n <IconButton>\n <MediaEpisodesIcon />\n </IconButton>\n </Tooltip>\n );\n return (\n <DialogTrigger type=\"popover\" placement=\"top\">\n {trigger}\n <EpisodeSelectorDialog {...props} />\n </DialogTrigger>\n );\n}\n\ntype SelectorPanel = 'episodes' | 'seasons';\n\nfunction EpisodeSelectorDialog({title, currentEpisode, onSelected}: Props) {\n const {close} = useDialogContext();\n const darkThemeVars = useDarkThemeVariables();\n const [activeTab, setActiveTab] = useState<SelectorPanel>('episodes');\n const [selectedSeason, setSelectedSeason] = useState(\n currentEpisode.season_number\n );\n\n const heading =\n activeTab === 'episodes' ? (\n <Trans message=\"Season :number\" values={{number: selectedSeason}} />\n ) : (\n title.name\n );\n\n const showBackButton = activeTab === 'episodes' && title.seasons_count > 1;\n\n return (\n <Dialog style={darkThemeVars} className=\"dark\" size=\"lg\">\n <DialogHeader\n titleTextSize=\"text-md\"\n closeButtonSize=\"md\"\n className=\"h-60\"\n padding={showBackButton ? 'pl-10 pr-20' : 'px-20'}\n leftAdornment={\n showBackButton ? (\n <IconButton onClick={() => setActiveTab('seasons')}>\n <ArrowBackIcon />\n </IconButton>\n ) : null\n }\n >\n {heading}\n </DialogHeader>\n <DialogBody\n className=\"stable-scrollbar relative h-400 text-main\"\n padding=\"p-0\"\n >\n <AnimatePresence initial={false}>\n {activeTab === 'episodes' ? (\n <EpisodeList\n title={title}\n season={selectedSeason}\n onSelected={episode => {\n close();\n onSelected(episode);\n }}\n selectedEpisodeId={\n currentEpisode.season_number === selectedSeason\n ? currentEpisode.id\n : undefined\n }\n />\n ) : (\n <SeasonList\n title={title}\n selectedSeason={selectedSeason}\n onSelected={number => {\n setSelectedSeason(number);\n setActiveTab('episodes');\n }}\n />\n )}\n </AnimatePresence>\n </DialogBody>\n </Dialog>\n );\n}\n\ninterface SeasonListProps {\n title: Title;\n onSelected: (number: number) => void;\n selectedSeason?: number;\n}\nfunction SeasonList({title, onSelected, selectedSeason}: SeasonListProps) {\n return (\n <AnimatedPanel name=\"seasons\">\n <List>\n {[...new Array(title.seasons_count).keys()].map(season => {\n const seasonNumber = season + 1;\n return (\n <ListItem\n className=\"group\"\n endIcon={\n <ArrowForwardIcon\n className=\"invisible group-hover:visible\"\n size=\"sm\"\n />\n }\n showCheckmark\n isSelected={selectedSeason === seasonNumber}\n onSelected={() => onSelected(seasonNumber)}\n key={seasonNumber}\n onClick={() => onSelected(seasonNumber)}\n >\n <Trans message=\"Season :number\" values={{number: seasonNumber}} />\n </ListItem>\n );\n })}\n </List>\n </AnimatedPanel>\n );\n}\n\ninterface EpisodeListProps {\n title: Title;\n season: number;\n onSelected: (episode: Episode) => void;\n selectedEpisodeId: number | undefined;\n}\nfunction EpisodeList({\n title,\n season,\n selectedEpisodeId,\n onSelected,\n}: EpisodeListProps) {\n const query = useSeasonEpisodes(\n undefined,\n {truncateDescriptions: 'true'},\n {titleId: title.id, season}\n );\n\n let content: ReactNode;\n\n if (query.noResults) {\n content = (\n <IllustratedMessage\n className=\"pt-56\"\n imageMargin=\"mb-8\"\n image={\n <div className=\"text-muted\">\n <TvIcon size=\"xl\" />\n </div>\n }\n imageHeight=\"h-auto\"\n title={<Trans message=\"This season has not episodes yet.\" />}\n />\n );\n } else if (query.isInitialLoading) {\n content = <FullPageLoader />;\n } else {\n content = (\n <Fragment>\n <Accordion\n defaultExpandedValues={\n selectedEpisodeId ? [selectedEpisodeId] : undefined\n }\n >\n {query.items.map(episode => (\n <AccordionItem\n value={episode.id}\n key={episode.id}\n buttonPadding=\"py-10 pl-26 pr-10\"\n label={\n <div className=\"flex items-center gap-14\">\n <div>{episode.episode_number}</div>\n <div>{episode.name}</div>\n </div>\n }\n >\n <EpisodeItem\n title={title}\n episode={episode}\n isSelected={episode.id === selectedEpisodeId}\n onSelected={() => onSelected(episode)}\n />\n </AccordionItem>\n ))}\n </Accordion>\n <InfiniteScrollSentinel query={query} />\n </Fragment>\n );\n }\n\n return <AnimatedPanel name=\"episodes\">{content}</AnimatedPanel>;\n}\n\ninterface EpisodeItemProps {\n title: Title;\n episode: Episode;\n isSelected: boolean;\n onSelected: () => void;\n}\nfunction EpisodeItem({\n episode,\n title,\n isSelected,\n onSelected,\n}: EpisodeItemProps) {\n const isPlayable = !isSelected && episode.primary_video;\n return (\n <div\n className=\"flex gap-20 text-lg text-main\"\n onClick={isPlayable ? () => onSelected() : undefined}\n >\n <EpisodePoster\n wrapWithLink={false}\n size=\"w-224\"\n title={title}\n episode={episode}\n >\n {isPlayable ? (\n <IconButton variant=\"flat\" color=\"white\">\n <MediaPlayIcon />\n </IconButton>\n ) : undefined}\n </EpisodePoster>\n <p className=\"pt-12 text-sm\">{episode.description}</p>\n </div>\n );\n}\n\nconst variants = {\n enter: (activeTab: SelectorPanel) => {\n return {\n x: activeTab === 'episodes' ? 608 : -608,\n opacity: 0,\n };\n },\n center: {\n x: 0,\n opacity: 1,\n },\n exit: (direction: SelectorPanel) => {\n return {\n zIndex: 0,\n x: direction === 'seasons' ? 608 : -608,\n opacity: 0,\n };\n },\n};\n\ninterface AnimatedPanelProps {\n name: SelectorPanel;\n children: ReactNode;\n}\nfunction AnimatedPanel({name, children}: AnimatedPanelProps) {\n return (\n <m.div\n className=\"absolute h-full w-full\"\n key={name}\n custom={name}\n variants={variants}\n initial=\"enter\"\n animate=\"center\"\n exit=\"exit\"\n transition={{type: 'tween', duration: 0.15}}\n >\n {children}\n </m.div>\n );\n}\n","import {guessPlayerProvider} from '@common/player/utils/guess-player-provider';\nimport {VideoPlayer} from '@common/player/ui/video-player/video-player';\nimport {VideoThumbnail} from '@app/videos/video-thumbnail';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport React, {memo, useEffect, useRef} from 'react';\nimport {Video} from '@app/titles/models/video';\nimport {Title} from '@app/titles/models/title';\nimport {Episode} from '@app/titles/models/episode';\nimport {VideoPlayerSkeleton} from '@app/videos/video-player-skeleton';\nimport {MediaItem} from '@common/player/media-item';\nimport {useLogVideoPlay} from '@app/videos/requests/use-log-video-play';\nimport {PlayerActions} from '@common/player/hooks/use-player-actions';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {isSameMedia} from '@common/player/utils/is-same-media';\nimport {Trans} from '@common/i18n/trans';\nimport {EpisodeSelector} from '@app/videos/watch-page/episode-selector';\n\ninterface Props {\n video: Video;\n relatedVideos?: Video[];\n autoPlay?: boolean;\n title?: Title;\n episode?: Episode;\n mediaItemId?: string;\n logPlays?: boolean;\n showEpisodeSelector?: boolean;\n}\nexport const SiteVideoPlayer = memo((props: Props) => {\n const {video, autoPlay, title, episode} = props;\n if (\n video.type === 'video' ||\n video.type === 'stream' ||\n (video.type === 'embed' && video.src.includes('youtube'))\n ) {\n return <NativeVideoPlayer {...props} />;\n }\n\n if (video.type === 'embed') {\n return <EmbedPlayer src={video.src} autoPlay={autoPlay} />;\n }\n\n if (video.type === 'external') {\n return (\n <div className=\"relative\">\n <VideoThumbnail\n title={title}\n episode={episode}\n video={video}\n fallback={<div className=\"aspect-video w-full bg-fg-base/4\" />}\n />\n <div\n className=\"absolute left-0 top-0 flex h-full w-full items-center justify-center\"\n onClick={() => window.open(video.src, '_blank')}\n >\n <IconButton variant=\"flat\" color=\"primary\" size=\"lg\">\n <MediaPlayIcon />\n </IconButton>\n </div>\n </div>\n );\n }\n\n return <VideoPlayerSkeleton />;\n});\n\ninterface EmberPlayerProps {\n src: string;\n autoPlay?: boolean;\n}\nconst EmbedPlayer = memo(({src, autoPlay}: EmberPlayerProps) => {\n let finalSrc = '';\n try {\n const url = src.includes('<iframe') ? src.match(/src=\"([^\"]*)\"/)?.[1] : src;\n const parsed = new URL(url || '');\n parsed.searchParams.set('autoplay', autoPlay ? '1' : '0');\n finalSrc = parsed.toString();\n } catch {}\n\n if (!finalSrc) {\n return (\n <div className=\"flex aspect-video w-full items-center justify-center\">\n <div className=\"rounded-panel border p-10\">\n <Trans message=\"There was an issue playting this video.\" />\n </div>\n </div>\n );\n }\n\n return (\n <iframe\n src={finalSrc}\n className=\"aspect-video w-full\"\n allowFullScreen\n allow=\"autoplay; encrypted-media; picture-in-picture;\"\n />\n );\n});\n\nfunction NativeVideoPlayer({\n video,\n title,\n episode,\n mediaItemId,\n relatedVideos,\n autoPlay,\n logPlays,\n showEpisodeSelector,\n}: Props) {\n const playerRef = useRef<PlayerActions>(null!);\n const logVideoPlay = useLogVideoPlay(playerRef, {enabled: logPlays});\n const mediaItem = videoToMediaItem(video, mediaItemId);\n const related = relatedVideos?.map(v => videoToMediaItem(v)) ?? [];\n const navigate = useNavigate();\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n logVideoPlay();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n return () =>\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n }, [logVideoPlay]);\n\n return (\n <VideoPlayer\n apiRef={playerRef}\n id=\"player\"\n queue={[mediaItem, ...related]}\n autoPlay={autoPlay}\n onBeforePlayNext={nextMedia => {\n if (nextMedia && !isSameMedia(mediaItem, nextMedia)) {\n navigate(getWatchLink(nextMedia.meta));\n }\n return true;\n }}\n onDestroy={() => logVideoPlay()}\n listeners={{\n playbackEnd: () => logVideoPlay(),\n beforeCued: ({previous}) => {\n // only log when cueing from previous video and not when cueing initial one\n if (previous) {\n logVideoPlay();\n }\n },\n }}\n rightActions={\n showEpisodeSelector && title && episode ? (\n <EpisodeSelector\n title={title}\n currentEpisode={episode}\n onSelected={episode => {\n navigate(getWatchLink(episode.primary_video));\n }}\n />\n ) : undefined\n }\n />\n );\n}\n\nfunction videoToMediaItem(video: Video, mediaItemId?: string): MediaItem {\n return {\n id: mediaItemId || video.id,\n provider: guessPlayerProvider(video.src),\n src: video.src,\n poster: video.thumbnail,\n meta: video,\n initialTime: video.latest_play?.time_watched ?? undefined,\n captions: video.captions?.map(caption => ({\n id: caption.id,\n src: caption.url,\n label: caption.name,\n language: caption.language,\n })),\n };\n}\n","import {\n ALL_PRIMITIVE_OPERATORS,\n BackendFilter,\n FilterControlType,\n FilterOperator,\n} from '@common/datatable/filters/backend-filter';\nimport {message} from '@common/i18n/message';\nimport {FetchValueListsResponse} from '@common/http/value-lists';\nimport {dateRangeToAbsoluteRange} from '@common/ui/forms/input-field/date/date-range-picker/form-date-range-picker';\nimport {\n DateRangePreset,\n DateRangePresets,\n} from '@common/ui/forms/input-field/date/date-range-picker/dialog/date-range-presets';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {now, parseDateTime} from '@internationalized/date';\nimport {getUserTimezone} from '@common/i18n/get-user-timezone';\nimport {Channel} from '@common/channels/channel';\nimport {GENRE_MODEL} from '@app/titles/models/genre';\nimport {PRODUCTION_COUNTRY_MODEL} from '@app/titles/models/production-country';\n\ninterface Props {\n languages: FetchValueListsResponse['titleFilterLanguages'];\n countries: FetchValueListsResponse['productionCountries'];\n genres: FetchValueListsResponse['genres'];\n ageRatings: FetchValueListsResponse['titleFilterAgeRatings'];\n restriction?: Channel['restriction'];\n}\n\nexport const getTitleChannelFilters = ({\n languages,\n countries,\n genres,\n ageRatings,\n restriction,\n}: Props): BackendFilter[] => {\n return [\n restriction?.model_type !== GENRE_MODEL\n ? {\n key: 'genres',\n label: message('Genres'),\n defaultOperator: FilterOperator.hasAll,\n control: {\n type: FilterControlType.ChipField,\n placeholder: message('Pick genres'),\n defaultValue: [],\n options: genres.map(genre => ({\n label: message(genre.name),\n key: genre.value,\n value: genre.value,\n })),\n },\n }\n : null,\n {\n key: 'release_date',\n label: message('Release date'),\n defaultOperator: FilterOperator.between,\n control: {\n type: FilterControlType.DateRangePicker,\n defaultValue: dateRangeToAbsoluteRange(\n (DateRangePresets[9] as Required<DateRangePreset>).getRangeValue()\n ),\n min: parseDateTime('1900-01-01'),\n max: now(getUserTimezone()).add({years: 5}),\n },\n },\n {\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n minValue: 1,\n maxValue: 10,\n defaultValue: 7,\n },\n key:\n getBootstrapData().settings.content.title_provider !== 'tmdb'\n ? 'tmdb_vote_average'\n : 'local_vote_average',\n label: message('User rating'),\n defaultOperator: FilterOperator.gte,\n operators: ALL_PRIMITIVE_OPERATORS,\n },\n {\n key: 'runtime',\n label: message('Runtime'),\n description: message('Runtime in minutes'),\n defaultOperator: FilterOperator.lte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n minValue: 1,\n maxValue: 255,\n defaultValue: 180,\n },\n },\n {\n key: 'language',\n label: message('Original language'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n placeholder: message('Pick a language'),\n searchPlaceholder: message('Search for language'),\n showSearchField: true,\n options: languages.map(({name, value}) => ({\n label: message(name),\n key: value,\n value: value,\n })),\n },\n },\n restriction?.model_type !== PRODUCTION_COUNTRY_MODEL\n ? {\n control: {\n type: FilterControlType.ChipField,\n placeholder: message('Pick countries'),\n defaultValue: [],\n options: countries?.map(({name, value}) => ({\n label: message(name),\n key: value,\n value: value,\n })),\n },\n key: 'productionCountries',\n label: message('Production countries'),\n defaultOperator: FilterOperator.hasAll,\n }\n : null,\n {\n key: 'certification',\n label: message('Age rating'),\n defaultOperator: FilterOperator.eq,\n control: {\n type: FilterControlType.Select,\n placeholder: message('Pick an age rating'),\n showSearchField: true,\n searchPlaceholder: message('Search for age rating'),\n options: ageRatings.map(({name, value}) => ({\n label: message(name),\n key: value,\n value: value,\n })),\n },\n },\n {\n key: 'budget',\n label: message('Budget'),\n description: message('Budget in US dollars'),\n defaultOperator: FilterOperator.lte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n minValue: 1,\n maxValue: 1000000000,\n defaultValue: 100000000,\n },\n },\n {\n key: 'revenue',\n label: message('Revenue'),\n description: message('Revenue in US dollars'),\n defaultOperator: FilterOperator.lte,\n operators: ALL_PRIMITIVE_OPERATORS,\n control: {\n type: FilterControlType.Input,\n inputType: 'number',\n minValue: 1,\n maxValue: 1000000000,\n defaultValue: 100000000,\n },\n },\n ].filter(Boolean) as BackendFilter[];\n};\n","import {useValueLists} from '@common/http/value-lists';\nimport {useMemo} from 'react';\nimport {getTitleChannelFilters} from '@app/channels/channel-header/get-title-channel-filters';\n\ninterface Options {\n disabled?: boolean;\n}\n\nexport function useTitleIndexFilters(options: Options = {}) {\n const {data, isLoading, fetchStatus} = useValueLists(\n [\n 'titleFilterLanguages',\n 'productionCountries',\n 'genres',\n 'titleFilterAgeRatings',\n ],\n undefined,\n options\n );\n const filters = useMemo(() => {\n return getTitleChannelFilters({\n countries: data?.productionCountries || [],\n languages: data?.titleFilterLanguages || [],\n genres: data?.genres || [],\n ageRatings: data?.titleFilterAgeRatings || [],\n });\n }, [data]);\n\n return {filters, filtersLoading: isLoading && fetchStatus !== 'idle'};\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {useParams} from 'react-router-dom';\nimport {Title, TitleCredit, TitleCreditPivot} from '@app/titles/models/title';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {LengthAwarePaginationResponse} from '@common/http/backend-response/pagination-response';\nimport {Season} from '@app/titles/models/season';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {Episode} from '@app/titles/models/episode';\n\nexport type GroupTitleCredits = Partial<\n Record<TitleCreditPivot['department'], TitleCredit[]>\n>;\n\nexport interface GetTitleResponse extends BackendResponse {\n title: Title;\n seasons?: LengthAwarePaginationResponse<Season>;\n episodes?: LengthAwarePaginationResponse<Episode>;\n credits?: GroupTitleCredits;\n language?: string;\n}\n\nexport function useTitle(\n loader: 'title' | 'titlePage' | 'titleCreditsPage' | 'editTitlePage',\n) {\n const {titleId} = useParams();\n return useQuery({\n queryKey: ['titles', `${titleId}`, loader],\n queryFn: () => fetchTitle(titleId!, loader),\n initialData: () => {\n const data = getBootstrapData().loaders?.[loader];\n if (data?.title?.id == titleId) {\n return data;\n }\n return undefined;\n },\n });\n}\n\nfunction fetchTitle(titleId: number | string, loader: string) {\n return apiClient\n .get<GetTitleResponse>(`titles/${titleId}`, {params: {loader}})\n .then(response => response.data);\n}\n","import {Video} from './video';\nimport {Title} from '@app/titles/models/title';\n\nexport const EPISODE_MODEL = 'episode';\n\nexport interface Episode {\n id: number;\n name: string;\n model_type: typeof EPISODE_MODEL;\n status: 'released' | 'upcoming';\n poster: string;\n runtime: number;\n popularity: number;\n rating: number;\n description: string;\n season_number: number;\n episode_number: number;\n title?: Title;\n title_id: number;\n release_date: string;\n year: number;\n videos?: Video[];\n primary_video: Video;\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {Review} from '@app/titles/models/review';\nimport {Reviewable} from '@app/reviews/reviewable';\nimport {UseFormReturn} from 'react-hook-form';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {reviewsQueryKey} from '@app/reviews/requests/use-reviews';\n\ninterface Response extends BackendResponse {\n review: Review;\n}\n\nexport interface CreateReviewPayload {\n score: number;\n title?: string;\n body?: string;\n}\n\ninterface Payload extends CreateReviewPayload {\n reviewable: Reviewable;\n}\n\nexport function useCreateReview(form?: UseFormReturn<CreateReviewPayload>) {\n return useMutation({\n mutationFn: (payload: Payload) => createReview(payload),\n onSuccess: async () => {\n await queryClient.invalidateQueries({queryKey: reviewsQueryKey()});\n },\n onError: r => (form ? onFormQueryError(r, form) : showHttpErrorToast(r)),\n });\n}\n\nfunction createReview(payload: Payload): Promise<Response> {\n return apiClient\n .post(`reviews`, {\n reviewable_id: payload.reviewable.id,\n reviewable_type: payload.reviewable.model_type,\n score: payload.score,\n title: payload.title,\n body: payload.body,\n })\n .then(r => r.data);\n}\n","import {Title} from '@app/titles/models/title';\nimport {Episode, EPISODE_MODEL} from '@app/titles/models/episode';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {Trans} from '@common/i18n/trans';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {useState} from 'react';\nimport {Button} from '@common/ui/buttons/button';\nimport {useCreateReview} from '@app/reviews/requests/use-create-review';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {useDeleteReviews} from '@app/reviews/requests/use-delete-reviews';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {EpisodePoster} from '@app/episodes/episode-poster/episode-poster';\nimport {TitleLink} from '@app/titles/title-link';\nimport {CompactSeasonEpisode} from '@app/episodes/compact-season-episode';\nimport {StarSelector} from '@app/reviews/review-list/star-selector';\n\ninterface Props {\n title: Title;\n episode?: Episode;\n initialRating?: {id: number; score: number};\n}\nexport function RatingDialog({title, episode, initialRating}: Props) {\n const item = episode || title;\n const createReview = useCreateReview();\n const deleteReview = useDeleteReviews();\n const {close} = useDialogContext();\n const [currentRating, setCurrentRating] = useState(initialRating?.score || 0);\n\n const handleCreateReview = () => {\n if (currentRating) {\n createReview.mutate(\n {reviewable: item, score: currentRating},\n {\n onSuccess: () => close(),\n },\n );\n }\n };\n\n const handleDeleteReview = () => {\n if (initialRating) {\n deleteReview.mutate(\n {reviewIds: [initialRating.id]},\n {\n onSuccess: () => close(),\n },\n );\n }\n };\n\n return (\n <Dialog size=\"w-auto\">\n <DialogHeader>\n <DialogTitle item={item} />\n </DialogHeader>\n <DialogBody>\n {item.model_type === EPISODE_MODEL ? (\n <EpisodeDetails title={title} episode={episode!} />\n ) : (\n <TitleDetails title={title} />\n )}\n <div className=\"pb-16\">\n <StarSelector\n count={10}\n value={currentRating}\n onValueChange={setCurrentRating}\n className=\"my-14\"\n />\n <Button\n variant=\"flat\"\n color=\"primary\"\n className=\"w-full\"\n disabled={!currentRating || createReview.isPending}\n onClick={handleCreateReview}\n >\n <Trans message=\"Rate\" />\n </Button>\n {initialRating && (\n <Button\n className=\"w-full mt-14\"\n disabled={deleteReview.isPending}\n onClick={handleDeleteReview}\n >\n <Trans message=\"Remove rating\" />\n </Button>\n )}\n </div>\n </DialogBody>\n </Dialog>\n );\n}\n\ninterface TitleDetailsProps {\n title: Title;\n}\nfunction TitleDetails({title}: TitleDetailsProps) {\n return (\n <div className=\"flex items-center gap-12 mb-24\">\n <TitlePoster size=\"w-60\" srcSize=\"sm\" title={title} />\n <div className=\"text-sm\">\n <div>{title.name}</div>\n <div>{title.year}</div>\n </div>\n </div>\n );\n}\n\ninterface EpisodeDetailsProps {\n title: Title;\n episode: Episode;\n}\nfunction EpisodeDetails({title, episode}: EpisodeDetailsProps) {\n return (\n <div className=\"flex items-center gap-12 mb-24\">\n <EpisodePoster size=\"w-100\" title={title} episode={episode} />\n <div className=\"text-base\">\n <TitleLink title={title} color=\"primary\" />\n <div className=\"text-sm\">\n {episode.name} (<CompactSeasonEpisode episode={episode} />)\n </div>\n </div>\n </div>\n );\n}\n\ninterface DialogTitleProps {\n item: Title | Episode;\n}\nfunction DialogTitle({item}: DialogTitleProps) {\n if (item.model_type === EPISODE_MODEL) {\n return <Trans message=\"Rate this episode\" />;\n } else if (item.is_series) {\n return <Trans message=\"Rate this series\" />;\n } else {\n return <Trans message=\"Rate this movie\" />;\n }\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useAuth} from '@common/auth/use-auth';\nimport {Title} from '@app/titles/models/title';\nimport {Episode} from '@app/titles/models/episode';\n\ninterface Response extends BackendResponse {\n ratings: {\n episode: Record<number, {id: number; score: number}>;\n title: Record<number, {id: number; score: number}>;\n };\n}\n\nexport function useCurrentUserRatings() {\n const {user} = useAuth();\n return useQuery({\n queryKey: ['reviews', 'users', `${user?.id}`],\n queryFn: () => fetchRatings(),\n enabled: !!user,\n });\n}\n\nexport function useCurrentUserRatingFor(item: Title | Episode) {\n const query = useCurrentUserRatings();\n return {\n isLoading: query.isLoading && query.fetchStatus !== 'idle',\n rating: query.data?.ratings?.[item.model_type]?.[item.id],\n };\n}\n\nfunction fetchRatings() {\n return apiClient\n .get<Response>(`users/me/ratings`)\n .then(response => response.data);\n}\n","import {MouseEvent, useCallback} from 'react';\nimport {useAuth} from '@common/auth/use-auth';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\nexport function useAuthClickCapture() {\n const dialogContext = useDialogContext();\n const {isLoggedIn} = useAuth();\n const navigate = useNavigate();\n\n return useCallback(\n (e: MouseEvent) => {\n if (!isLoggedIn) {\n e.preventDefault();\n e.stopPropagation();\n\n if (dialogContext) {\n dialogContext.close();\n }\n\n navigate('/login');\n }\n },\n [navigate, isLoggedIn, dialogContext]\n );\n}\n","import {Title} from '@app/titles/models/title';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {StarBorderIcon} from '@common/icons/material/StarBorder';\nimport {Trans} from '@common/i18n/trans';\nimport {RatingDialog} from '@app/reviews/rating-dialog';\nimport {Episode} from '@app/titles/models/episode';\nimport clsx from 'clsx';\nimport {TitleRating} from '@app/reviews/title-rating';\nimport {useCurrentUserRatingFor} from '@app/reviews/requests/use-current-user-ratings';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {ReactElement} from 'react';\nimport {useAuthClickCapture} from '@app/use-auth-click-capture';\n\ninterface Props {\n title: Title;\n episode?: Episode;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\nexport function InteractableRating({\n title,\n episode,\n size = 'md',\n className,\n}: Props) {\n const isUpcoming = episode\n ? episode.status === 'upcoming'\n : title.status === 'upcoming';\n const score = (episode || title).rating;\n\n if (isUpcoming) {\n return null;\n }\n\n return (\n <div\n className={clsx(\n 'flex min-w-[249px] flex-shrink-0 items-center',\n getSizeClassName(size),\n className\n )}\n >\n {score ? (\n <div className=\"border-r pr-14\">\n <TitleRating score={score} />\n </div>\n ) : null}\n <RateButton title={title} episode={episode} />\n </div>\n );\n}\n\nfunction RateButton({title, episode}: Props) {\n const item = episode || title;\n const {isLoading, rating} = useCurrentUserRatingFor(item);\n const authHandler = useAuthClickCapture();\n\n let content: ReactElement;\n\n if (isLoading) {\n content = (\n <m.div\n key=\"skeleton\"\n {...opacityAnimation}\n className=\"flex min-h-36 items-center\"\n >\n <Skeleton variant=\"rect\" size=\"w-[106px] h-16 ml-14\" />\n </m.div>\n );\n } else {\n content = (\n <m.div key=\"button\" {...opacityAnimation}>\n <DialogTrigger type=\"modal\">\n {rating ? (\n <Button onClickCapture={authHandler}>\n <Trans\n message=\"Your rating: :value / 10\"\n values={{value: rating.score}}\n />\n </Button>\n ) : (\n <Button\n onClickCapture={authHandler}\n startIcon={<StarBorderIcon />}\n className=\"min-w-120\"\n >\n <Trans message=\"Rate this\" />\n </Button>\n )}\n <RatingDialog\n title={title}\n episode={episode}\n initialRating={rating}\n />\n </DialogTrigger>\n </m.div>\n );\n }\n\n return (\n <AnimatePresence initial={false} mode=\"wait\">\n {content}\n </AnimatePresence>\n );\n}\n\nfunction getSizeClassName(size: Props['size']) {\n switch (size) {\n case 'sm':\n return 'text-sm';\n case 'md':\n return 'text-base';\n case 'lg':\n return 'text-lg';\n }\n}\n","import {EpisodePoster} from '@app/episodes/episode-poster/episode-poster';\nimport {CompactSeasonEpisode} from '@app/episodes/compact-season-episode';\nimport {EpisodeLink} from '@app/episodes/episode-link';\nimport {InteractableRating} from '@app/reviews/interactable-rating';\nimport React, {ReactNode} from 'react';\nimport {Episode} from '@app/titles/models/episode';\nimport {Title} from '@app/titles/models/title';\nimport {TitleRating} from '@app/reviews/title-rating';\nimport clsx from 'clsx';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDate} from '@common/i18n/formatted-date';\n\ninterface Props {\n episode: Episode;\n title: Title;\n allowRating?: boolean;\n className?: string;\n children?: ReactNode;\n showPlayButton?: boolean;\n centerPlayButton?: boolean;\n}\nexport function EpisodeListItem({\n episode,\n title,\n allowRating = true,\n className,\n children,\n showPlayButton,\n}: Props) {\n return (\n <div className={clsx('flex items-center gap-20', className)}>\n <div className=\"relative w-288 flex-shrink-0 overflow-hidden rounded max-md:hidden\">\n <EpisodePoster\n title={title}\n episode={episode}\n seasonNumber={episode.season_number}\n lazy={true}\n srcSize=\"md\"\n showPlayButton={showPlayButton}\n />\n <div className=\"absolute bottom-0 left-0 w-full bg-black/50 p-6 text-center text-sm text-white\">\n <CompactSeasonEpisode episode={episode} />\n </div>\n </div>\n <div className=\"flex-auto\">\n <EpisodeLink\n title={title}\n seasonNumber={episode.season_number}\n episode={episode}\n color=\"primary\"\n className=\"text-base font-semibold\"\n />\n <div className=\"mt-4 text-xs text-muted\">\n <FormattedDate date={episode.release_date} preset=\"long\" />\n </div>\n <div className=\"my-12\">\n <EpisodeRating\n title={title}\n episode={episode}\n allowRating={allowRating}\n />\n </div>\n <div className=\"text-sm\">\n {episode.description || (\n <span className=\"italic\">\n <Trans message=\"We have no overview for this episode yet.\" />\n </span>\n )}\n </div>\n {children}\n </div>\n </div>\n );\n}\n\ninterface EpisodeRatingProps {\n title: Title;\n episode: Episode;\n allowRating: boolean;\n}\nfunction EpisodeRating({title, episode, allowRating}: EpisodeRatingProps) {\n if (episode.status === 'upcoming') {\n return null;\n }\n\n return allowRating ? (\n <InteractableRating title={title} episode={episode} />\n ) : (\n <TitleRating score={episode.rating} />\n );\n}\n","import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {Season} from '@app/titles/models/season';\nimport {PaginationResponse} from '@common/http/backend-response/pagination-response';\n\nexport const titleSeasonsQueryKey = (titleId: number | string) => [\n 'title',\n `${titleId}`,\n 'seasons',\n];\n\nexport function useTitleSeasons(\n titleId: string | number,\n initialPage?: PaginationResponse<Season>,\n queryParams?: Record<string, string | number>\n) {\n return useInfiniteData<Season>({\n initialPage,\n endpoint: `titles/${titleId}/seasons`,\n queryKey: titleSeasonsQueryKey(titleId),\n queryParams,\n });\n}\n","import {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport clsx from 'clsx';\nimport {ImageSize, useImageSrc} from '@app/images/use-image-src';\nimport {Season} from '@app/titles/models/season';\nimport {SeasonLink} from '@app/seasons/season-link';\nimport {Title} from '@app/titles/models/title';\nimport {Link} from 'react-router-dom';\nimport {MovieIcon} from '@common/icons/material/Movie';\n\ninterface Props {\n title: Title;\n season: Season;\n className?: string;\n size?: string;\n lazy?: boolean;\n srcSize?: ImageSize;\n link?: string;\n}\nexport function SeasonPoster({\n title,\n season,\n className,\n size = 'w-full',\n srcSize,\n lazy = true,\n link,\n}: Props) {\n const {trans} = useTrans();\n const src = useImageSrc(season.poster || title.poster, {size: srcSize});\n\n const imageClassName = clsx(\n className,\n size,\n 'object-cover bg-fg-base/4 aspect-poster rounded',\n !src ? 'flex items-center justify-center' : 'block'\n );\n\n const image = src ? (\n <img\n className={imageClassName}\n draggable={false}\n loading={lazy ? 'lazy' : 'eager'}\n src={src}\n alt={trans(\n message('Poster for season :number of :title', {\n values: {number: season.number, title: title.name},\n })\n )}\n />\n ) : (\n <span className={imageClassName}>\n <MovieIcon className=\"max-w-[60%] text-divider\" size=\"text-6xl\" />\n </span>\n );\n\n return link ? (\n <Link to={link} className=\"flex-shrink-0\">\n {image}\n </Link>\n ) : (\n <SeasonLink\n title={title}\n seasonNumber={season.number}\n className=\"flex-shrink-0\"\n >\n {image}\n </SeasonLink>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PlayCircleIcon = createSvgIcon(\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-2.5-3.5 7-4.5-7-4.5v9z\" />\n, 'PlayCircleOutlined');\n","import {Video} from '@app/titles/models/video';\nimport {PlayCircleIcon} from '@common/icons/material/PlayCircle';\nimport {ReactNode} from 'react';\nimport {Link} from 'react-router-dom';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport clsx from 'clsx';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {VideoThumbnail} from '@app/videos/video-thumbnail';\nimport {Title} from '@app/titles/models/title';\nimport {Episode} from '@app/titles/models/episode';\n\ninterface Props {\n videos?: Video[];\n heading?: ReactNode;\n count?: number;\n title?: Title;\n episode?: Episode;\n}\nexport function VideoGrid({videos, heading, count, title, episode}: Props) {\n const isMobile = useIsMobileMediaQuery();\n if (!videos?.length) return null;\n\n if (!count) {\n count = isMobile ? 4 : 3;\n }\n\n return (\n <div className=\"mt-48\">\n {heading}\n <div className=\"grid grid-cols-2 gap-12 md:grid-cols-3 md:gap-24\">\n {videos.slice(0, count).map(video => (\n <VideoGridItem\n key={video.id}\n video={video}\n title={title}\n episode={episode}\n />\n ))}\n </div>\n </div>\n );\n}\n\ninterface VideoGridItemProps {\n video: Video;\n className?: string;\n title?: Title;\n episode?: Episode;\n name?: ReactNode;\n showCategory?: boolean;\n forceTitleBackdrop?: boolean;\n}\nexport function VideoGridItem({\n video,\n className,\n title,\n episode,\n name,\n showCategory = true,\n forceTitleBackdrop = false,\n}: VideoGridItemProps) {\n const link = getWatchLink(video);\n return (\n <div key={video.id} className={className}>\n <Link to={link} className=\"relative isolate block\">\n <VideoThumbnail\n video={video}\n title={title}\n episode={episode}\n srcSize=\"lg\"\n forceTitleBackdrop={forceTitleBackdrop}\n />\n <VideoGridItemBottomGradient />\n <span className=\"absolute bottom-0 left-0 z-30 flex items-center gap-x-6 p-10 text-white\">\n <PlayCircleIcon size={showCategory ? 'md' : 'lg'} />\n {showCategory && <span className=\"capitalize\">{video.category}</span>}\n </span>\n </Link>\n <Link to={link} className=\"mt-12 block hover:underline\">\n {name || video.name}\n </Link>\n </div>\n );\n}\n\ninterface VideoGridItemSkeletonProps {\n className?: string;\n}\nexport function VideoGridItemSkeleton({className}: VideoGridItemSkeletonProps) {\n return (\n <div className={clsx(className, 'h-[228px]')}>\n <Skeleton variant=\"rect\" size=\"w-full aspect-video\" animation=\"pulsate\" />\n <Skeleton variant=\"text\" size=\"w-3/4 mt-12 h-20\" />\n </div>\n );\n}\n\nexport function VideoGridItemBottomGradient() {\n return (\n <div className=\"pointer-events-none absolute bottom-0 z-20 h-full w-full bg-gradient-to-t from-black to-40%\" />\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {useParams} from 'react-router-dom';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Title} from '@app/titles/models/title';\nimport {Episode} from '@app/titles/models/episode';\nimport {seasonQueryKey} from '@app/seasons/requests/use-season';\nimport {GroupTitleCredits} from '@app/titles/requests/use-title';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nexport interface GetEpisodeResponse extends BackendResponse {\n episode: Episode;\n title: Title;\n credits?: GroupTitleCredits;\n}\n\nexport function useEpisode(\n loader: 'episodePage' | 'episodeCreditsPage' | 'episode',\n) {\n const {titleId, season, episode} = useParams();\n return useQuery({\n queryKey: [\n ...seasonQueryKey(titleId!, season!),\n 'episodes',\n `${episode}`,\n loader,\n ],\n queryFn: () => fetchEpisode(titleId!, season!, episode!, loader),\n initialData: () => {\n const data = getBootstrapData().loaders?.[loader];\n if (\n data?.title.id == titleId &&\n data?.episode.season_number == season &&\n data?.episode.episode_number == episode\n ) {\n return data;\n }\n return undefined;\n },\n });\n}\n\nfunction fetchEpisode(\n titleId: string,\n seasonNumber: string,\n episodeNumber: string,\n loader: string,\n) {\n return apiClient\n .get<GetEpisodeResponse>(\n `titles/${titleId}/seasons/${seasonNumber}/episodes/${episodeNumber}`,\n {params: {loader}},\n )\n .then(response => response.data);\n}\n","import {Link, LinkProps} from 'react-router-dom';\nimport clsx from 'clsx';\nimport React, {ReactNode, useMemo} from 'react';\nimport {slugifyString} from '@common/utils/string/slugify-string';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\nimport {Person} from '@app/titles/models/person';\n\ninterface Props extends Omit<LinkProps, 'to'> {\n person: Person;\n className?: string;\n children?: ReactNode;\n color?: 'primary' | 'inherit';\n}\nexport function PersonLink({\n person,\n className,\n children,\n color = 'inherit',\n ...linkProps\n}: Props) {\n const finalUri = useMemo(() => {\n return getPersonLink(person);\n }, [person]);\n\n return (\n <Link\n {...linkProps}\n className={clsx(\n color === 'primary'\n ? 'text-primary hover:text-primary-dark'\n : 'text-inherit',\n 'hover:underline outline-none focus-visible:underline overflow-x-hidden overflow-ellipsis transition-colors',\n className\n )}\n to={finalUri}\n >\n {children ?? person.name}\n </Link>\n );\n}\n\nexport function getPersonLink(\n person: Person,\n {absolute}: {absolute?: boolean} = {}\n): string {\n let link = `/people/${person.id}/${slugifyString(person.name)}`;\n if (absolute) {\n link = `${getBootstrapData().settings.base_url}${link}`;\n }\n return link;\n}\n","import {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport clsx from 'clsx';\nimport {Person} from '@app/titles/models/person';\nimport {PersonLink} from '@app/people/person-link';\nimport {ImageSize, useImageSrc} from '@app/images/use-image-src';\nimport {PersonIcon} from '@common/icons/material/Person';\n\ninterface Props {\n person: Person;\n className?: string;\n size?: string;\n lazy?: boolean;\n srcSize?: ImageSize;\n rounded?: boolean;\n}\nexport function PersonPoster({\n person,\n className,\n size,\n srcSize,\n lazy = true,\n rounded = false,\n}: Props) {\n const {trans} = useTrans();\n const src = useImageSrc(person?.poster, {size: srcSize});\n\n const imageClassName = clsx(\n className,\n size,\n 'bg-fg-base/4 object-cover',\n rounded ? 'aspect-square rounded-full' : 'aspect-poster rounded',\n !src ? 'flex items-center justify-center' : 'block'\n );\n\n const image = src ? (\n <img\n decoding=\"async\"\n className={imageClassName}\n draggable={false}\n loading={lazy ? 'lazy' : 'eager'}\n src={src}\n alt={trans(\n message('Cover image for :name', {values: {name: person.name}})\n )}\n />\n ) : (\n <span className={imageClassName}>\n <PersonIcon className=\"max-w-[60%] text-divider\" size=\"text-5xl\" />\n </span>\n );\n\n return (\n <PersonLink person={person} className=\"flex-shrink-0\">\n {image}\n </PersonLink>\n );\n}\n","import {Person} from '@app/titles/models/person';\nimport {BulletSeparatedItems} from '@app/titles/bullet-separated-items';\nimport {Trans} from '@common/i18n/trans';\nimport {TitleLink} from '@app/titles/title-link';\nimport {HTMLAttributeAnchorTarget} from 'react';\nimport {BaseMediaLinkProps} from '@app/base-media-link';\n\ninterface Props {\n person: Person;\n linkTarget?: HTMLAttributeAnchorTarget;\n linkColor?: BaseMediaLinkProps['color'];\n}\nexport function KnownForCompact({\n person,\n linkTarget,\n linkColor = 'primary',\n}: Props) {\n return (\n <BulletSeparatedItems>\n {person.known_for ? <Trans message={person.known_for} /> : null}\n {person.primary_credit ? (\n <TitleLink\n target={linkTarget}\n color={linkColor}\n title={person.primary_credit}\n onClick={e => {\n e.stopPropagation();\n }}\n />\n ) : null}\n </BulletSeparatedItems>\n );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {useParams} from 'react-router-dom';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Person} from '@app/titles/models/person';\nimport {PersonCredit} from '@app/titles/models/title';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nexport interface GetPersonResponse extends BackendResponse {\n person: Person;\n knownFor: PersonCredit[];\n credits: Record<string, PersonCredit[]>;\n total_credits_count: number;\n}\n\nexport function usePerson(loader: 'personPage' | 'editPersonPage') {\n const {personId} = useParams();\n return useQuery({\n queryKey: ['people', `${personId}`, loader],\n queryFn: () => fetchPerson(personId!, loader),\n initialData: () => {\n const data = getBootstrapData().loaders?.[loader];\n if (data?.person?.id == personId) {\n return data;\n }\n return undefined;\n },\n });\n}\n\nfunction fetchPerson(personId: number | string, loader: string) {\n return apiClient\n .get<GetPersonResponse>(`people/${personId}`, {params: {loader}})\n .then(response => response.data);\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {NewsArticle} from '@app/titles/models/news-article';\nimport {useParams} from 'react-router-dom';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nexport interface GetNewsArticleResponse extends BackendResponse {\n article: NewsArticle;\n related: NewsArticle[];\n}\n\nexport function useNewsArticle(loader: 'newsArticlePage') {\n const {articleId} = useParams();\n return useQuery<GetNewsArticleResponse>({\n queryKey: ['news-articles', `${articleId}`],\n queryFn: () => fetchNewsArticle(articleId!),\n initialData: () => {\n const data = getBootstrapData().loaders?.[loader];\n if (data?.article?.id == articleId) {\n return data;\n }\n return undefined;\n },\n });\n}\n\nfunction fetchNewsArticle(articleId: string) {\n return apiClient\n .get<GetNewsArticleResponse>(`news/${articleId}`)\n .then(response => response.data);\n}\n","export default \"__VITE_ASSET__1f8798d3__\"","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {message} from '@common/i18n/message';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {Channel} from '@common/channels/channel';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {CreateChannelPayload} from '@common/admin/channels/requests/use-create-channel';\n\ninterface Response extends BackendResponse {\n channel: Channel;\n}\n\nexport function useCreateList(form: UseFormReturn<CreateChannelPayload>) {\n const {trans} = useTrans();\n const navigate = useNavigate();\n return useMutation({\n mutationFn: (payload: CreateChannelPayload) => createList(payload),\n onSuccess: async response => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('channel'),\n });\n toast(trans(message('List created')));\n navigate(`../${response.channel.id}/edit`, {\n replace: true,\n relative: 'path',\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createList(payload: CreateChannelPayload) {\n return apiClient.post<Response>('channel', payload).then(r => r.data);\n}\n","import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {ContentModelField} from '@common/admin/channels/channel-editor/controls/content-model-field';\nimport {\n channelContentConfig,\n Layout,\n} from '@app/admin/channels/channel-content-config';\nimport {NEWS_ARTICLE_MODEL} from '@app/titles/models/news-article';\nimport {CHANNEL_MODEL} from '@common/channels/channel';\nimport {MOVIE_MODEL, SERIES_MODEL} from '@app/titles/models/title';\nimport {ContentOrderField} from '@common/admin/channels/channel-editor/controls/content-order-field';\nimport {FormSelect, Option} from '@common/ui/forms/select/select';\nimport {ChannelContentEditor} from '@common/admin/channels/channel-editor/channel-content-editor';\nimport React from 'react';\nimport {\n ChannelContentSearchField,\n ChannelContentSearchFieldProps,\n} from '@common/admin/channels/channel-editor/channel-content-search-field';\nimport {ChannelContentItemImage} from '@app/admin/channels/channel-content-item-image';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport playlist from '@common/admin/channels/playlist.svg';\nimport {FormSwitch} from '@common/ui/forms/toggle/switch';\n\nexport function CrupdateUserListForm() {\n return (\n <div>\n <FormTextField\n name=\"name\"\n label={<Trans message=\"Name\" />}\n required\n autoFocus\n className=\"mb-24\"\n />\n <FormTextField\n name=\"description\"\n label={<Trans message=\"Description\" />}\n inputElementType=\"textarea\"\n rows={2}\n className=\"mb-24\"\n />\n <ContentModelField\n config={channelContentConfig}\n className=\"mb-24\"\n exclude={[NEWS_ARTICLE_MODEL, CHANNEL_MODEL, MOVIE_MODEL, SERIES_MODEL]}\n />\n <ContentOrderField config={channelContentConfig} />\n <FormSelect\n className=\"flex-auto w-full\"\n selectionMode=\"single\"\n name=\"config.layout\"\n label={<Trans message=\"Layout\" />}\n >\n <Option value={Layout.grid}>\n <Trans {...channelContentConfig.layoutMethods[Layout.grid].label} />\n </Option>\n <Option value={Layout.list}>\n <Trans {...channelContentConfig.layoutMethods[Layout.list].label} />\n </Option>\n <Option value={Layout.landscapeGrid}>\n <Trans\n {...channelContentConfig.layoutMethods[Layout.landscapeGrid].label}\n />\n </Option>\n </FormSelect>\n <FormSwitch name=\"public\" className=\"mt-24\">\n <Trans message=\"Public\" />\n </FormSwitch>\n <ChannelContentEditor\n title={<Trans message=\"List content\" />}\n searchField={<SearchField />}\n noResultsMessage={<NoResultsMessage />}\n />\n </div>\n );\n}\n\nfunction SearchField(props: ChannelContentSearchFieldProps) {\n return (\n <ChannelContentSearchField\n {...props}\n imgRenderer={item => <ChannelContentItemImage item={item} />}\n />\n );\n}\n\nfunction NoResultsMessage() {\n return (\n <IllustratedMessage\n title={<Trans message=\"List is empty\" />}\n description={<Trans message=\"No content is attached to this list yet.\" />}\n image={<SvgImage src={playlist} />}\n />\n );\n}\n","import React, {Fragment} from 'react';\nimport {useForm} from 'react-hook-form';\nimport {CrupdateResourceLayout} from '@common/admin/crupdate-resource-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {StaticPageTitle} from '@common/seo/static-page-title';\nimport {useCreateList} from '@app/user-lists/requests/use-create-list';\nimport {CrupdateUserListForm} from '@app/user-lists/pages/crupdate-user-list-form';\nimport {TITLE_MODEL} from '@app/titles/models/title';\nimport {EMPTY_PAGINATION_RESPONSE} from '@common/http/backend-response/pagination-response';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Link} from 'react-router-dom';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\nimport {CreateChannelPayload} from '@common/admin/channels/requests/use-create-channel';\n\nexport function CreateUserListPage() {\n const form = useForm<CreateChannelPayload>({\n defaultValues: {\n type: 'list',\n public: true,\n config: {\n contentType: 'manual',\n contentModel: TITLE_MODEL,\n layout: 'grid',\n contentOrder: 'channelables.order:asc',\n },\n content: EMPTY_PAGINATION_RESPONSE.pagination,\n },\n });\n const createList = useCreateList(form);\n\n return (\n <Fragment>\n <StaticPageTitle>\n <Trans message=\"New list\" />\n </StaticPageTitle>\n <CrupdateResourceLayout\n backButton={\n <IconButton elementType={Link} relative=\"path\" to=\"../\">\n <ArrowBackIcon />\n </IconButton>\n }\n form={form}\n onSubmit={values => {\n createList.mutate(values);\n }}\n title={<Trans message=\"New list\" />}\n isLoading={createList.isPending}\n >\n <CrupdateUserListForm />\n </CrupdateResourceLayout>\n </Fragment>\n );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {UseFormReturn} from 'react-hook-form';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {message} from '@common/i18n/message';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useParams} from 'react-router-dom';\nimport {DatatableDataQueryKey} from '@common/datatable/requests/paginated-resources';\nimport {Channel} from '@common/channels/channel';\nimport {CreateChannelPayload} from '@common/admin/channels/requests/use-create-channel';\n\ninterface Response extends BackendResponse {\n list: Channel;\n}\n\nexport function useUpdateList(form: UseFormReturn<CreateChannelPayload>) {\n const {trans} = useTrans();\n const {slugOrId} = useParams();\n const navigate = useNavigate();\n return useMutation({\n mutationFn: (payload: CreateChannelPayload) =>\n createList(payload, slugOrId!),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: DatatableDataQueryKey('channel'),\n });\n toast(trans(message('List updated')));\n navigate(`../../`, {\n replace: true,\n relative: 'path',\n });\n },\n onError: err => onFormQueryError(err, form),\n });\n}\n\nfunction createList(payload: CreateChannelPayload, listId: string) {\n return apiClient\n .put<Response>(`channel/${listId}`, payload)\n .then(r => r.data);\n}\n","import React, {Fragment, ReactNode} from 'react';\nimport {PageStatus} from '@common/http/page-status';\nimport {useForm} from 'react-hook-form';\nimport {CrupdateResourceLayout} from '@common/admin/crupdate-resource-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {StaticPageTitle} from '@common/seo/static-page-title';\nimport {useUpdateList} from '@app/user-lists/requests/use-update-list';\nimport {CrupdateUserListForm} from '@app/user-lists/pages/crupdate-user-list-form';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ArrowBackIcon} from '@common/icons/material/ArrowBack';\nimport {Link} from 'react-router-dom';\nimport {CreateChannelPayload} from '@common/admin/channels/requests/use-create-channel';\nimport {useChannel} from '@common/channels/requests/use-channel';\nimport {Channel} from '@common/channels/channel';\n\nexport function EditUserListPage() {\n const query = useChannel(undefined, 'editUserListPage');\n\n return query.data ? (\n <Fragment>\n <StaticPageTitle>\n <Trans message=\"Edit list\" />\n </StaticPageTitle>\n <PageContent list={query.data.channel}>\n <CrupdateUserListForm />\n </PageContent>\n </Fragment>\n ) : (\n <PageStatus query={query} loaderClassName=\"absolute m-auto inset-0\" />\n );\n}\n\ninterface PageContentProps {\n list: Channel;\n children: ReactNode;\n}\nfunction PageContent({list, children}: PageContentProps) {\n const form = useForm<CreateChannelPayload>({\n // @ts-ignore\n defaultValues: {\n ...list,\n },\n });\n const updateList = useUpdateList(form);\n\n return (\n <CrupdateResourceLayout\n backButton={\n <IconButton elementType={Link} relative=\"path\" to=\"../../\">\n <ArrowBackIcon />\n </IconButton>\n }\n form={form}\n onSubmit={values => {\n updateList.mutate(values);\n }}\n title={<Trans message=\"Edit “:name“ List\" values={{name: list.name}} />}\n isLoading={updateList.isPending}\n >\n {children}\n </CrupdateResourceLayout>\n );\n}\n","import {Link, LinkProps} from 'react-router-dom';\nimport clsx from 'clsx';\nimport React, {useContext, useMemo} from 'react';\nimport {User} from '@common/auth/user';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\n\ninterface UserProfileLinkProps extends Omit<LinkProps, 'to'> {\n user: User;\n className?: string;\n}\nexport function UserProfileLink({\n user,\n className,\n ...linkProps\n}: UserProfileLinkProps) {\n const {auth} = useContext(SiteConfigContext);\n const finalUri = useMemo(() => {\n return auth.getUserProfileLink!(user);\n }, [auth, user]);\n\n return (\n <Link\n {...linkProps}\n className={clsx('hover:underline', className)}\n to={finalUri}\n >\n {user.display_name}\n </Link>\n );\n}\n"],"names":["FilterControlType","FilterOperator","_a","_c","_b","now","isSameMonth","getSizeClassName","encodedFilters","decodedFilters","response","_d","Select","value","FilterList","id","target","useLayoutEffect","m","options","sortSession","Sort","Layout","Option","scrollToTop","addToChannel","reorderContent","item","removeFromChannel","ComboBox","paginate","MenuItem","setInLocalStorage","_setInLocalStorage","YoutubeCommand","YouTubePlayerState","isNumber","currentTime","addZero","hasNextPage","useNavigate","episode","createReview","createList"],"mappings":"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"}