{"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}>;\n listItem: ComponentType>;\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 {\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 \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;\n}\n\nexport const Input = React.forwardRef(\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
\n \n {children}\n
\n \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 {\n inputRef?: Ref;\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 []>(\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 \n {children}\n \n \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\n | DatePickerValueProps, 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, DateRangeValue>,\n): DateRangePickerState {\n const now = useCurrentDateTime();\n const [isPlaceholder, setIsPlaceholder] = useState({\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(null);\n const [isHighlighting, setIsHighlighting] = useState(false);\n const [highlightedRange, setHighlightedRange] =\n useState(internalValue);\n const [calendarDates, setCalendarDates] = useState(() => {\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 => {\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 | 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 \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 = 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 {\n enteredKeys.current = '';\n e.target.scrollIntoView({block: 'nearest'});\n },\n onClick: e => {\n e.preventDefault();\n e.stopPropagation();\n },\n } as HTMLAttributes)}\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 \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 {\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 \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
\n {segments.map((segment, index) => {\n if (segment.type === 'literal') {\n return (\n \n );\n }\n return (\n \n );\n })}\n
\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const KeyboardArrowRightIcon = createSvgIcon(\n \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 \n \n {date.day}\n \n {isHighlighted && sameMonth && (\n \n )}\n \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
\n \n
\n \n {[...new Array(weeksInMonth).keys()].map(weekIndex => (\n \n {[...new Array(7).keys()].map(dayIndex => (\n \n ))}\n \n ))}\n
\n
\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
\n {\n shiftCalendars('backward');\n }}\n >\n \n \n
\n {monthFormatter.format(currentMonth.toDate(timezone))}\n
\n {\n shiftCalendars('forward');\n }}\n >\n \n \n
\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
\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 \n
\n {weekday}\n
\n
\n );\n })}\n \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 \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 \n );\n })}\n \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)[\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 {value};\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 \n {DateRangePresets.map(preset => (\n {\n const newValue = preset.getRangeValue();\n onPresetSelected(newValue);\n }}\n >\n \n \n ))}\n \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, '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(\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
\n \n {description && !errorMessage && (\n
\n {description}\n
\n )}\n {errorMessage && (\n
\n {errorMessage}\n
\n )}\n
\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 = {\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 ;\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 \n {DateRangeComparePresets.map(preset => (\n {\n const newValue = preset.getRangeValue(originalRangeValue);\n onPresetSelected(newValue);\n }}\n >\n \n \n ))}\n \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(state);\n const hasPlaceholder = state.isPlaceholder.start || state.isPlaceholder.end;\n const [compareVisible, setCompareVisible] = useState(compareVisibleDefault);\n\n const footer = (\n \n \n \n ) : undefined\n }\n >\n {\n state.setSelectedValue(initialStateRef.current.selectedValue);\n state.setIsPlaceholder(initialStateRef.current.isPlaceholder);\n close();\n }}\n >\n \n \n {\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 \n \n \n );\n\n return (\n \n \n {!isTablet && (\n
\n {\n state.setSelectedValue(preset);\n if (state.closeDialogOnSelection) {\n close(preset);\n }\n }}\n />\n {!!compareState && (\n \n setCompareVisible(e.target.checked)}\n >\n \n \n {compareVisible && (\n {\n compareState.setSelectedValue(preset);\n }}\n />\n )}\n \n )}\n
\n )}\n \n \n \n
\n {!state.closeDialogOnSelection && footer}\n
\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 \n {showInlineDatePickerField && (\n
\n \n {!!compareState && compareVisible && (\n }\n />\n )}\n
\n )}\n
\n \n
\n \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 \n {\n setSelectedValue({...selectedValue, start: newValue});\n }}\n />\n \n {\n setSelectedValue({...selectedValue, end: newValue});\n }}\n />\n \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>,\n Omit {}\nexport function DateRangePicker(props: DateRangePickerProps) {\n const {granularity, closeDialogOnSelection, ...fieldProps} = props;\n const state = useDateRangePickerState(props);\n const inputRef = useRef(null);\n const isMobile = useIsMobileMediaQuery();\n const hideCalendarIcon = isMobile && granularity !== 'day';\n\n const dialog = (\n \n \n \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 \n : undefined}\n {...fieldProps}\n >\n {\n onChange({start: newValue, end: value.end});\n }}\n />\n \n {\n onChange({start: value.start, end: newValue});\n }}\n />\n \n {dialog}\n \n );\n}\n\nfunction isHourSegment(e: MouseEvent): 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 = {\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 ;\n}\n\nexport function absoluteRangeToDateRange(props: FormDateRange | null) {\n const {start, end, preset} = props || {};\n const dateRange: Partial = {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 = {}): 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,\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(\n endpoint: string,\n params: GetDatatableDataParams,\n options?: Omit<\n UseQueryOptions<\n PaginatedBackendResponse,\n unknown,\n PaginatedBackendResponse,\n any[]\n >,\n 'queryKey' | 'queryFn'\n >,\n onLoad?: (data: PaginatedBackendResponse) => void,\n) {\n if (!params.paginate) {\n params.paginate = 'simple';\n }\n return useQuery({\n queryKey: DatatableDataQueryKey(endpoint, params),\n queryFn: ({signal}) => paginate(endpoint, params, onLoad, signal),\n placeholderData: keepPreviousData,\n ...options,\n });\n}\n\nasync function paginate(\n endpoint: string,\n params: GetDatatableDataParams,\n onLoad?: (data: PaginatedBackendResponse) => void,\n signal?: AbortSignal,\n): Promise> {\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 = 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 {\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[];\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['onAction'];\n selectRowOnContextMenu: TableProps['selectRowOnContextMenu'];\n cellHeight: string | undefined;\n headerCellHeight: string | undefined;\n}\nexport const TableContext = createContext(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 \n
\n {column.body(item, rowContext)}\n
\n \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;\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({\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\n extends ComponentPropsWithoutRef<'tr'> {\n item: T & {isPlaceholder?: boolean};\n}\n\ninterface TableRowProps {\n item: TableDataItem;\n index: number;\n renderAs?: JSXElementConstructor;\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 = 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 setIsHovered(true))}\n onPointerLeave={createEventHandler(() => setIsHovered(false))}\n style={style}\n {...domProps}\n >\n {columns.map((column, cellIndex) => (\n \n ))}\n \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 = {\n key: 'checkbox',\n header: () => ,\n align: 'center',\n width: 'w-24 flex-shrink-0',\n body: (item, row) => {\n if (row.isPlaceholder) {\n return ;\n }\n return ;\n },\n};\n\ninterface SelectRowCheckboxProps {\n item: TableDataItem;\n}\nfunction SelectRowCheckbox({item}: SelectRowCheckboxProps) {\n const {selectedRows, toggleRow} = useContext(TableContext);\n return (\n 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 {\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 \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 {\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
{column.header()}
\n ) : (\n column.header()\n )}\n \n {allowSorting && (\n \n \n \n )}\n \n \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 \n {columns.map((column, columnIndex) => (\n \n ))}\n \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\n extends ComponentPropsWithoutRef<'table'> {\n className?: string;\n columns: ColumnConfig[];\n hideHeaderRow?: boolean;\n data: T[];\n meta?: any;\n tableRef?: MutableRefObject;\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>;\n tableBody?: ReactElement;\n hideBorder?: boolean;\n closeOnInteractOutside?: boolean;\n collapseOnMobile?: boolean;\n cellHeight?: string;\n headerCellHeight?: string;\n}\nexport function Table({\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) {\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 = {\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 = ;\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 \n {\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 && }\n {tableBody}\n \n \n );\n}\n\nexport interface TableBodyProps {\n renderRowAs?: TableProps['renderRowAs'];\n}\nfunction BasicTableBody({renderRowAs}: TableBodyProps) {\n const {data} = useContext(TableContext);\n return (\n \n {data.map((item, rowIndex) => (\n \n ))}\n \n );\n}\n","import {BackendResponse} from './backend-response';\n\nexport interface LengthAwarePaginationResponse {\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 {\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 {\n data: T[];\n next_cursor: string | null;\n per_page: number;\n prev_cursor: string | null;\n}\n\nexport type PaginationResponse =\n | LengthAwarePaginationResponse\n | SimplePaginationResponse\n | CursorPaginationResponse;\n\nexport const EMPTY_PAGINATION_RESPONSE = {\n pagination: {data: [], from: 0, to: 0, per_page: 15, current_page: 1},\n};\n\nexport interface PaginatedBackendResponse extends BackendResponse {\n pagination: PaginationResponse;\n}\n\nexport function hasPreviousPage(\n pagination: PaginationResponse,\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): 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 \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(\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 \n \n \n {React.Children.map(children, (child, index) => {\n if (!isValidElement(child)) return null;\n return cloneElement(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 \n \n \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(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) => {\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
\n \n
\n );\n\n return (\n \n \n {\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
\n
\n {label}\n
\n {description && (\n
{description}
\n )}\n
\n {chevronPosition === 'right' && chevron}\n \n {endAppend && (\n
\n {endAppend}\n
\n )}\n \n \n
\n {!isLazy || wasExpandedOnce ? children : null}\n
\n {footerContent}\n \n \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) {\n const {trans} = useTrans();\n\n return (\n \n {filter.control.options.map(option => (\n \n \n \n ))}\n \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) {\n return (\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 {\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(\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 \n ) : (\n
\n \n
\n );\n\n if (label) {\n renderedAvatar = {renderedAvatar};\n }\n\n const wrapperProps: ComponentProps = {\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 \n {renderedAvatar}\n \n ) : (\n
{renderedAvatar}
\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,\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(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,\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,\n): Promise {\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;\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(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
\n
{label}
\n \n \n {\n setSelectedValue('');\n setInputValue('');\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n inputRef.current?.click();\n });\n }}\n />\n \n
\n {description && !errorMessage && (\n
{description}
\n )}\n {errorMessage && (\n
{errorMessage}
\n )}\n \n );\n }\n\n return (\n \n {model => (\n }\n >\n {model.name}\n \n )}\n \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 ;\n }\n\n return (\n \n {data.model.image && }\n
\n
{data.model.name}
\n
{data.model.description}
\n
\n }>\n \n \n \n \n \n );\n}\n\nfunction LoadingSkeleton() {\n return (\n \n \n
\n \n \n
\n \n
\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 {\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) {\n return (\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) {\n const control = filter.control;\n return (\n \n \n {filter.operators?.map(operator => (\n \n {}\n \n ))}\n \n \n \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) {\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 \n {Children.map(children, chip => {\n if (isValidElement(chip)) {\n return cloneElement(chip, {\n size,\n color,\n selectable,\n radius,\n });\n }\n })}\n \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 {\n invalid?: boolean;\n errorMessage?: string;\n}\n\nexport type ChipFieldProps = Omit<\n ListboxProps,\n 'selectionMode' | 'displayWith'\n> &\n Omit<\n BaseFieldPropsWithDom,\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['children'];\n placeholder?: string;\n chipSize?: ChipProps['size'];\n openMenuOnFocus?: boolean;\n valueKey?: 'id' | 'name';\n onChipClick?: (value: ChipValue) => void;\n };\n\nfunction ChipFieldInner(\n props: ChipFieldProps,\n ref: Ref,\n) {\n const fieldRef = useRef(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 \n );\n\n const dropdownArrow = showDropdownArrow ? : null;\n\n const {fieldProps, inputProps} = useField({\n ...inputFieldProps,\n focusRef: inputRef,\n endAdornment: isLoading && listboxIsOpen ? loadingIndicator : dropdownArrow,\n });\n\n return (\n \n {\n // refocus input when clicking outside it, but while still inside chip field\n inputRef.current?.focus();\n }}\n >\n \n \n {children}\n \n \n \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 \n {items.map(item => (\n : 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 \n ))}\n \n );\n}\n\ninterface ChipInputProps {\n showEmptyMessage?: boolean;\n inputProps: ReturnType['inputProps'];\n inputValue?: string;\n onInputValueChange?: (value: string) => void;\n fieldRef: RefObject;\n inputRef: RefObject;\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['children'];\n size: FieldProps['size'];\n}\nfunction ChipInput(props: ChipInputProps) {\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({\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 {\n // prevent focus from leaving input when scrolling listbox via mouse\n e.preventDefault();\n }}\n >\n {\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)}\n />\n \n );\n}\n\nfunction useChipFieldValueState({\n onChange,\n value,\n defaultValue,\n valueKey,\n}: ChipFieldProps) {\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(\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 (\n props: ChipFieldProps & {ref?: Ref},\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 = ChipFieldProps & {\n name: string;\n};\n\nexport function FormChipField({children, ...props}: FormChipFieldProps) {\n const {\n field: {onChange, onBlur, value = [], ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial> = {\n onChange,\n onBlur,\n value,\n invalid,\n errorMessage: error?.message,\n };\n\n return (\n \n {children}\n \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) {\n const {trans} = useTrans();\n return (\n \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 \n {}\n \n )}\n \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 {\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 {\n setExpandedFilters([]);\n }}\n >\n \n \n );\n\n const applyButton = (\n \n \n \n );\n\n return (\n \n \n \n \n \n \n \n \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 = {};\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>({defaultValues});\n const {formId, close} = useDialogContext();\n\n return (\n {\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 \n {filters.map(filter => (\n \n }\n key={filter.key}\n value={filter.key}\n label={}\n bodyClassName=\"max-h-288 overflow-y-auto compact-scrollbar\"\n >\n {filter.description && (\n \n \n \n )}\n \n \n ))}\n \n \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 }\n />\n );\n case FilterControlType.ChipField:\n return (\n }\n />\n );\n case FilterControlType.DateRangePicker:\n return (\n }\n />\n );\n case FilterControlType.SelectModel:\n return (\n }\n />\n );\n case FilterControlType.Input:\n return (\n }\n />\n );\n case FilterControlType.BooleanToggle:\n return (\n }\n />\n );\n case 'custom':\n const CustomComponent = filter.control.panel;\n return (\n }\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 = ,\n color = 'primary',\n variant = 'outline',\n size = 'sm',\n disabled,\n className,\n}: AddFilterButtonProps) {\n const isMobile = useIsMobileMediaQuery();\n\n const desktopButton = (\n \n \n \n );\n\n const mobileButton = (\n \n {icon}\n \n );\n\n return (\n \n {isMobile ? mobileButton : desktopButton}\n \n \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, '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 ;\n }\n\n return ;\n});\n\ninterface InactiveFilterButtonProps\n extends Omit, 'color'> {\n filter: BackendFilter;\n}\nexport const InactiveFilterButton = forwardRef<\n HTMLButtonElement,\n InactiveFilterButtonProps\n>(({filter, ...domProps}, ref) => {\n return (\n }\n {...domProps}\n >\n \n \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 }\n ref={ref}\n {...domProps}\n >\n \n \n \n {children}\n \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 {\n label: ReactNode;\n panel: ReactNode;\n}\nexport function FilterListItemDialogTrigger(\n props: FilterListItemDialogTriggerProps\n) {\n const {onValueChange, isInactive, filter, label} = props;\n return (\n {\n if (value !== undefined) {\n onValueChange(value);\n }\n }}\n >\n \n {label}\n \n \n \n );\n}\n\nexport function FilterListControlDialog({\n filter,\n panel,\n value,\n operator,\n}: FilterListItemDialogTriggerProps) {\n const form = useForm>({\n defaultValues: {\n [filter.key]: {value, operator},\n },\n });\n const {close, formId} = useDialogContext();\n return (\n \n \n \n \n \n {\n close(formValue[filter.key]);\n }}\n >\n {filter.description && (\n
\n \n
\n )}\n {panel}\n \n
\n \n \n \n \n \n
\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 {formatter.format(value)};\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 {\n filter: BackendFilter;\n onValueChange: (value: FilterItemFormValue) => void;\n value: T;\n operator?: FilterOperator;\n isInactive?: boolean;\n}\nexport function FilterListControl(props: FilterListControlProps) {\n switch (props.filter.control.type) {\n case FilterControlType.DateRangePicker:\n return ;\n case FilterControlType.BooleanToggle:\n return ;\n case FilterControlType.Select:\n return ;\n case FilterControlType.ChipField:\n return ;\n case FilterControlType.Input:\n return ;\n case FilterControlType.SelectModel:\n return ;\n case FilterControlType.Custom:\n const Control = (props.filter.control as CustomFilterControl).listItem;\n return ;\n default:\n return null;\n }\n}\n\nfunction DatePickerControl(\n props: FilterListControlProps<\n Required,\n DatePickerFilterControl\n >,\n) {\n const {value, filter} = props;\n\n let valueLabel: ReactNode;\n if (value.preset !== undefined) {\n valueLabel = ;\n } else {\n valueLabel = (\n \n );\n }\n\n return (\n }\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 {\n onValueChange({value: filter.control.defaultValue});\n }}\n filter={filter}\n isInactive={isInactive}\n />\n );\n}\n\nfunction SelectControl(\n props: FilterListControlProps,\n) {\n const {filter, value} = props;\n const option = filter.control.options.find(o => o.key === value);\n return (\n : null}\n panel={}\n />\n );\n}\n\nfunction ChipFieldControl(\n props: FilterListControlProps,\n) {\n return (\n }\n panel={}\n />\n );\n}\n\nfunction MultipleValues(\n props: FilterListControlProps,\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 \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 \n );\n\n // indicate that there are some names not shown\n return notShownCount > 0 ? (\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 \n ) : null;\n\n const formattedValue =\n filter.control.inputType === 'number' ? (\n \n ) : (\n value\n );\n\n return (\n \n {operatorLabel} {formattedValue}\n \n }\n panel={}\n />\n );\n}\n\nfunction SelectModelControl(\n props: FilterListControlProps,\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 \n \n \n \n );\n const modelPreview = (\n \n \n {data?.model.name}\n \n );\n\n const label = isLoading || !data ? skeleton : modelPreview;\n\n return (\n }\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
\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
\n {!field.isInactive && (\n {\n remove(field.key);\n }}\n >\n \n \n )}\n \n
\n );\n })}\n
\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 \n \n \n \n \n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AddIcon = createSvgIcon(\n \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
\n {image && (\n \n )}\n
\n \n {label}\n
\n {description && (\n
\n {description}\n
\n )}\n
\n \n );\n}\n\nexport function NameWithAvatarPlaceholder({\n labelClassName,\n showDescription,\n}: Partial & {\n showDescription?: boolean;\n}) {\n return (\n
\n \n
\n
\n \n
\n {showDescription && (\n
{}
\n )}\n
\n
\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
\n {(label || showValueLabel) && (\n
\n {label && (\n {\n // Safari does not focus elements when clicking on an associated \n )}\n {showValueLabel && (\n \n {outputValue}\n \n )}\n
\n )}\n \n \n \n {children}\n
\n \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 {\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;\n trackRef: RefObject;\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(null);\n\n // values will be stored in internal state as an array for both slider and range slider\n const [values, setValues] = useControlledState(\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(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(\n new Array(values.length).fill(false),\n );\n const draggedThumbsRef = useRef(null);\n draggedThumbsRef.current = draggedThumbs;\n\n // formatted value for 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(\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(\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(null);\n\n const currentPointer = useRef(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(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(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;\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(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 {\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 {\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 \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 {\n inputRef?: Ref;\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 \n \n \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 ;\n}\n","import {useEffect, useRef} from 'react';\n\nexport function usePrevious(value: T) {\n const ref = useRef();\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();\nexport const droppables = new Map();\nexport const dragMonitors = new Map();\nexport const dragSession: DragSession = {\n status: 'inactive',\n};\n","import React from 'react';\n\ntype NativeEvent =\n | React.PointerEvent\n | PointerEvent\n | React.DragEvent\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\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 {\n type: string;\n id: DraggableId;\n getData: () => T;\n ref: RefObject;\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;\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(null);\n const {addGlobalListener, removeAllGlobalListeners} = useGlobalListeners();\n\n const state = useRef({\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) => {\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 | 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) => {\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 {\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 {\n return new Promise((resolve, reject) => entry.file(resolve, reject));\n}\n","export async function asyncIterableToArray(\n iterator: AsyncIterable\n): Promise {\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;\n}\n\n// File dragged in from desktop\nexport interface NativeFileDraggable {\n type: 'nativeFile';\n el: null;\n ref: null;\n getData: () => Promise;\n}\n\ninterface UseDroppableProps {\n id: DraggableId;\n disabled?: boolean;\n types: ('nativeFile' | string)[];\n ref: RefObject;\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\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 | false;\n acceptsDrop?: (target: MixedDraggable) => boolean;\n}\n\ninterface DroppableState {\n dragOverElements: Set;\n dropActivateTimer: ReturnType | undefined;\n}\n\nconst DROP_ACTIVATE_TIMEOUT = 400;\n\nexport function useDroppable({\n id,\n disabled,\n ref,\n ...options\n}: UseDroppableProps) {\n const state = useRef({\n dragOverElements: new Set(),\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) => {\n const draggable = getDraggable(e);\n if (draggable) {\n optionsRef.current.onDragLeave?.(draggable);\n }\n };\n\n const onDragEnter = (e: React.DragEvent) => {\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) => {\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) => {\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) => {\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\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(\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(\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;\n}\n\nlet sortSession: null | SortSession = null;\n\nexport type DropPosition = 'before' | 'after' | null;\n\ntype StrategyName = 'line' | 'liveSort' | 'moveNode';\n\nconst strategies: Record = {\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;\n type: string;\n preview?: RefObject;\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 \n, 'TuneOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MoreVertIcon = createSvgIcon(\n \n, 'MoreVertOutlined');\n","import React, {RefObject} from 'react';\n\nexport interface TabsContext {\n selectedTab: number;\n setSelectedTab: (newTab: number) => void;\n tabsRef: RefObject;\n size: 'sm' | 'md';\n isLazy?: boolean;\n id: string;\n}\n\nexport const TabContext = React.createContext(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, ReactElement];\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([]);\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 \n
{children}
\n
\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({\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 \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 \n \n {childrenArray.map((child, index) => {\n if (isValidElement(child)) {\n return cloneElement(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 \n \n \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;\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) => {\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 {\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
\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 \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(null);\n const domRef = useRef(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 or another element that does not accept div as child\n return createPortal(\n \n {children}\n ,\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();\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 {\n onSubmit: SubmitHandler;\n form: UseFormReturn;\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({\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) {\n const {isSticky, sentinelRef} = useStickySentinel();\n const isDirty = !disableSaveWhenNotDirty\n ? true\n : Object.keys(form.formState.dirtyFields).length;\n\n return (\n form.clearErrors()}\n form={form}\n >\n
\n \n \n {backButton}\n
\n

\n {title}\n

\n {subTitle &&
{subTitle}
}\n
\n
\n {actions}\n \n \n \n
\n \n \n
{children}
\n \n \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 \n \n {\n close();\n }}\n >\n \n \n
\n {images?.length ? (\n {\n setActiveIndex(activeIndex - 1);\n }}\n >\n \n \n ) : null}\n \n {images?.length ? (\n {\n setActiveIndex(activeIndex + 1);\n }}\n >\n \n \n ) : null}\n
\n
\n
\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ChevronLeftIcon = createSvgIcon(\n \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 | null,\n): Record {\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,\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,\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 = {},\n): Promise {\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 & {\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 {\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;\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 \n, 'GridViewOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ViewWeekIcon = createSvgIcon(\n \n, 'ViewWeekOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ViewListIcon = createSvgIcon(\n \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: ,\n },\n [Layout.landscapeGrid]: {\n label: message('Landscape'),\n icon: ,\n },\n [Layout.list]: {\n label: message('List'),\n icon: ,\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();\n return (\n }\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 \n ))}\n \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();\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 }\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 \n );\n }\n })}\n \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 \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;\n}\n\ninterface Payload {\n channelConfig?: Partial;\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(`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\n extends PaginatedBackendResponse {}\n\ninterface Options {\n paginate?: boolean;\n}\n\nexport function useChannelContent<\n T extends ChannelContentItem = ChannelContentItem,\n>(\n channel: Channel,\n params?: Record | 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(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(\n channel: Channel,\n params: any,\n) {\n return apiClient\n .get>(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) {\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) {\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 \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 | 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 \n );\n }\n\n return (\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(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 \n
    \n {range.map((item, index) => {\n const isCurrentPage = item === currentPage;\n return (\n
  • \n scrollToTop(ref) : undefined}\n >\n {item}\n \n
  • \n );\n })}\n
\n \n );\n}\n\ninterface SimplePaginationProps {\n data: SimplePaginationResponse;\n className?: string;\n scrollToTop?: boolean;\n}\nfunction SimplePagination({\n data,\n className,\n scrollToTop: shouldScrollToTop,\n}: SimplePaginationProps) {\n const ref = useRef(null);\n const currentPage = data.current_page;\n const isLastPage = !hasNextPage(data);\n return (\n
\n {currentPage > 1 && (\n }\n onClick={shouldScrollToTop ? () => scrollToTop(ref) : undefined}\n size=\"xs\"\n >\n \n \n )}\n }\n onClick={shouldScrollToTop ? () => scrollToTop(ref) : undefined}\n size=\"xs\"\n >\n \n \n }\n onClick={shouldScrollToTop ? () => scrollToTop(ref) : undefined}\n size=\"xs\"\n >\n \n \n
\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;\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(`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 {\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[] = [\n {\n key: 'dragHandle',\n width: 'w-42 flex-shrink-0',\n header: () => ,\n hideHeader: true,\n body: () => (\n \n ),\n },\n {\n key: 'name',\n header: () => ,\n visibleInMode: 'all',\n body: item => {\n return (\n \n {item.name}\n \n ) : (\n item.name\n )\n }\n description={item.description}\n />\n );\n },\n },\n {\n key: 'type',\n header: () => ,\n width: 'w-100 flex-shrink-0',\n body: item => {item.model_type},\n },\n {\n key: 'actions',\n header: () => ,\n hideHeader: true,\n align: 'end',\n width: 'w-42 flex-shrink-0',\n visibleInMode: 'all',\n body: item => ,\n },\n];\n\ninterface Props {\n searchField: ReactElement;\n title?: ReactNode;\n noResultsMessage?: ReactNode;\n}\nexport function ChannelContentEditor({\n searchField,\n title,\n noResultsMessage,\n}: Props) {\n const {watch, getValues} = useFormContext();\n const channel = getValues();\n const contentType = watch('config.contentType');\n const addToChannel = useAddToChannel();\n const query = useChannelContent>(\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
\n
\n

\n {title || }\n

\n \n \n {contentType === 'manual'\n ? cloneElement(searchField, {\n onResultSelected: result => {\n addToChannel.mutate({\n channelId: channel.id,\n item: result,\n });\n },\n })\n : null}\n
\n \n \n \n {!pagination.data?.length && contentType === 'manual'\n ? noResultsMessage || (\n }\n description={\n \n }\n image={}\n />\n )\n : null}\n
\n );\n}\n\nfunction ContentTableRow({\n item,\n children,\n className,\n ...domProps\n}: RowElementProps) {\n const isTouchDevice = useIsTouchDevice();\n const {data, meta} = useContext(TableContext);\n const {getValues} = useFormContext();\n const domRef = useRef(null);\n const reorderContent = useReorderChannelContent();\n const previewRef = useRef(null);\n const [dropPosition, setDropPosition] = useState(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\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 \n {children}\n {!item.isPlaceholder && }\n \n );\n}\n\ninterface RowDragPreviewProps {\n item: NormalizedModel;\n}\nconst RowDragPreview = React.forwardRef<\n DragPreviewRenderer,\n RowDragPreviewProps\n>(({item}, ref) => {\n return (\n \n {() => (\n
{item.name}
\n )}\n
\n );\n});\n\ninterface RemoveItemColumnProps {\n item: NormalizedModel;\n}\nfunction RemoveItemColumn({item}: RemoveItemColumnProps) {\n const removeFromChannel = useRemoveFromChannel();\n const {getValues} = useFormContext();\n return (\n {\n removeFromChannel.mutate({\n channelId: getValues('id'),\n item: item,\n });\n }}\n >\n \n \n );\n}\n\nfunction ContentNotEditableWarning() {\n const {watch} = useFormContext();\n const contentType = watch('config.contentType');\n\n if (contentType === 'manual') {\n return null;\n }\n\n return (\n
\n \n
\n {contentType === 'listAll' ? (\n \n ) : null}\n {contentType === 'autoUpdate' ? (\n \n ) : null}\n
\n
\n );\n}\n\nfunction UpdateContentButton() {\n const {slugOrId} = useParams();\n const updateContent = useUpdateChannelContent(slugOrId!);\n const {setValue, watch, getValues} = useFormContext();\n\n if (watch('config.contentType') !== 'autoUpdate') {\n return null;\n }\n\n return (\n }\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 \n \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(`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();\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 }\n hideEndAdornment\n >\n {data?.results.map(result => (\n onResultSelected?.(result)}\n startIcon={imgRenderer ? imgRenderer(result) : null}\n description={result.description}\n textLabel={result.name}\n >\n {result.name}\n \n ))}\n \n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ImageIcon = createSvgIcon(\n \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 \"\"\n ) : (\n \n \n \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 {\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 \n {children ?? article.title}\n \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 \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 \n ) : (\n \n \n \n );\n\n return (\n \n {image}\n
\n \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 {\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 {\n user?: User;\n}\nexport function UserAvatar({user, ...props}: UserAvatarProps) {\n const {auth} = useContext(SiteConfigContext);\n return (\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 & 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,\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 extends BackendResponse {\n pagination: PaginationResponse;\n}\n\nexport interface UseInfiniteDataProps {\n initialPage?: PaginationResponse | null;\n queryKey: QueryKey;\n queryParams?: Record;\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) => Response;\n}\nexport function useInfiniteData(\n props: UseInfiniteDataProps,\n): UseInfiniteDataResult {\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({\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(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;\n}\n\nasync function fetchData(\n endpoint: string,\n params: GetDatatableDataParams,\n transformResponse?: UseInfiniteDataProps['transformResponse'],\n signal?: AbortSignal,\n): Promise> {\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,\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({\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 {\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 \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 \n \n {score} / 10\n
\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const StarBorderIcon = createSvgIcon(\n \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 {\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 {\n onValueChange?.(number);\n }}\n onPointerEnter={() => {\n setHoverRating(number);\n }}\n >\n {isActive ? : }\n \n );\n })}\n \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
\n {items.map((child, index) => (\n \n
{child}
\n {index < items.length - 1 ?
: null}\n
\n ))}\n
\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const SortIcon = createSvgIcon(\n \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 onValueChange(newValue as string)}\n selectionMode=\"single\"\n >\n \n \n {SortOptions.filter(\n option => option.value !== 'reports_count:desc' || showReportsItem\n ).map(option => (\n \n \n \n ))}\n \n \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 {\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 \n {children}\n \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 {\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 \n {children ?? (\n \n )}\n \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 {\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 \n {children ?? {episode?.name}}\n \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 \n \n \n );\n }\n\n if (seasonNum) {\n return (\n \n \n \n );\n }\n\n if (episodeNum) {\n return (\n \n \n \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 {\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 \n {children ?? title.name}\n \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 \n {title.name} ()\n \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 ,\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 \n ) : (\n \n \n \n );\n\n const linkChildren = (\n \n {image}\n \n \n );\n\n return (\n \n {link ? (\n \n {linkChildren}\n \n ) : (\n \n {linkChildren}\n \n )}\n {showPlayButton ? (\n
\n \n \n \n
\n ) : null}\n \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
\n \n \n
\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(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\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>]) => 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>]) => 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()(\n subscribeWithSelector(\n immer((set, get, store) => {\n const listeners = new Set>();\n const internalListeners: Partial = {\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 {\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);\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(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 \n {children}\n \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 =>\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();\n\nexport async function loadYoutubePoster(\n videoId: string\n): Promise {\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,\n iframeRef: RefObject,\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,\n iframeRef: RefObject,\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 extends {\n getState: () => infer T;\n}\n ? T\n : never;\n\ntype UsePlayerStore = {\n (): ExtractState>;\n (\n selector: (\n state: ExtractState>\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;\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(null);\n\n const youtubeApi = useCallback(\n (\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({\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 {\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;\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;\n }>;\n}\n\nexport function useHtmlMediaInternalState(\n ref: RefObject\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 {\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(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 \n {cuedMedia?.captions?.map((caption, index) => (\n \n ))}\n \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(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 \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
\n \n
\n );\n});\n\nfunction Provider() {\n const provider = usePlayerStore(s => s.providerName);\n switch (provider) {\n case 'youtube':\n return ;\n case 'htmlVideo':\n return ;\n case 'htmlAudio':\n return ;\n case 'hls':\n return (\n \n \n \n );\n case 'dash':\n return (\n \n \n \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 {\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 \n {posterUrl ? (\n \n ) : (\n fallback\n )}\n \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 \n {isActive && (\n \n \n \n )}\n \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 {\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 [,,],\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 \n ) : (\n \n );\n\n return (\n \n {\n if (stopPropagation) {\n e.stopPropagation();\n }\n if (isPlaying) {\n player.pause();\n } else {\n player.play();\n }\n }}\n >\n {isPlaying ? : }\n \n \n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaNextIcon = createSvgIcon(\n [,,],\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 } usePortal={false}>\n {\n if (stopPropagation) {\n e.stopPropagation();\n }\n player.playNext();\n }}\n >\n \n \n \n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaMuteIcon = createSvgIcon(\n [,,],\n 'MediaMute',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaVolumeLowIcon = createSvgIcon(\n [,,],\n 'MediaVolumeLow',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaVolumeHighIcon = createSvgIcon(\n [,,,],\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
\n \n {\n player.setVolume(value);\n }}\n />\n
\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 } usePortal={false}>\n player.setMuted(false)}\n >\n \n \n \n );\n }\n return (\n }>\n player.setMuted(true)}\n >\n {volume < 40 ? : }\n \n \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 {formattedValue};\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 \n = 600}\n />\n \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 \n = 600}\n />\n \n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaClosedCaptionsIcon = createSvgIcon(\n ,\n 'MediaClosedCaptions',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaClosedCaptionsOnIcon = createSvgIcon(\n [,,],\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 } usePortal={false}>\n {\n player.setTextTrackVisibility(!captionsVisible);\n }}\n >\n {captionsVisible ? (\n \n ) : (\n \n )}\n \n \n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowRightIcon = createSvgIcon(\n \n, 'ArrowRightOutlined');\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaSettingsIcon = createSvgIcon(\n ,\n 'MediaSettings',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaPlaybackSpeedCircleIcon = createSvgIcon(\n [,,,,,],\n 'MediaPlaybackSpeedCircle',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaSettingsMenuIcon = createSvgIcon(\n [,,,,,,],\n 'MediaSettingsMenu',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaArrowLeftIcon = createSvgIcon(\n ,\n 'MediaArrowLeft',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaLanguageIcon = createSvgIcon(\n [,,],\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 \n \n \n \n \n \n \n \n \n \n );\n}\n\nfunction PlaybackOptionsPanel() {\n const [activePanel, setActivePanel] = useState('options');\n const PanelComponent = Panels[activePanel];\n\n return (\n \n \n \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 \n \n }\n endSection={\n
\n {activeRate}x\n \n
\n }\n onSelected={() => onActivePanelChange('rate')}\n >\n \n \n }\n endSection={\n
\n {activeQuality ? activeQuality : }\n \n
\n }\n onSelected={() => onActivePanelChange('quality')}\n >\n \n \n }\n endSection={\n
\n {currentTextTrack ? (\n currentTextTrack.label\n ) : (\n \n )}\n \n
\n }\n onSelected={() => onActivePanelChange('captions')}\n >\n \n \n {availableAudioTracks.length > 1 && (\n }\n endSection={\n
\n {currentAudioTrack ? (\n currentAudioTrack.label\n ) : (\n \n )}\n \n
\n }\n onSelected={() => onActivePanelChange('language')}\n >\n \n \n )}\n
\n \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 }\n >\n \n {availableRates.map(rate => (\n {\n player.setPlaybackRate(rate);\n onActivePanelChange('options');\n }}\n >\n {rate}x\n \n ))}\n \n \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 }\n >\n \n {availableQualities.map(quality => (\n {\n player.setPlaybackQuality(quality);\n onActivePanelChange('options');\n }}\n >\n {quality}\n \n ))}\n \n \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 }\n >\n \n {\n player.setCurrentTextTrack(-1);\n onActivePanelChange('options');\n }}\n >\n \n \n {textTracks.map((track, index) => (\n {\n player.setCurrentTextTrack(index);\n onActivePanelChange('options');\n }}\n >\n {track.label}\n \n ))}\n \n \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 }\n >\n \n {audioTracks.map((track, index) => (\n {\n player.setCurrentAudioTrack(index);\n onActivePanelChange('options');\n }}\n >\n {track.label}\n \n ))}\n \n \n );\n}\n\ninterface PanelLayoutProps extends OptionsPanelProps {\n children: ReactNode;\n title: ReactNode;\n}\nfunction PanelLayout({onActivePanelChange, children, title}: PanelLayoutProps) {\n return (\n \n
\n }\n onClick={() => onActivePanelChange('options')}\n >\n {title}\n \n
\n {children}\n \n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaFullscreenExitIcon = createSvgIcon(\n [,,,,],\n 'MediaFullscreenExit',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaFullscreenIcon = createSvgIcon(\n [,,,,],\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 } usePortal={false}>\n {\n if (isFullscreen) {\n player.exitFullscreen();\n } else {\n player.enterFullscreen();\n }\n }}\n >\n {isFullscreen ? : }\n \n \n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaPictureInPictureExitIcon = createSvgIcon(\n [,,],\n 'MediaPictureInPictureExit',\n '0 0 32 32'\n);\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const MediaPictureInPictureIcon = createSvgIcon(\n [,,],\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 } usePortal={false}>\n {\n if (isPip) {\n player.exitPip();\n } else {\n player.enterPip();\n }\n }}\n >\n {isPip ? (\n \n ) : (\n \n )}\n \n \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 \n ) : (\n \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 e.stopPropagation()}\n className={clsx('bottom-0 left-0 right-0 p-8', className)}\n >\n \n
\n \n \n \n \n /{' '}\n \n \n
\n {rightActions}\n \n \n \n \n
\n
\n \n );\n}\n\nfunction MobileControls({\n rightActions,\n onPointerEnter,\n onPointerLeave,\n className,\n}: ResponsiveControlsProps) {\n return (\n \n e.stopPropagation()}\n className={clsx('left-0 right-0 top-0 px-6 pt-6 ', className)}\n >\n
\n {rightActions}\n \n \n \n \n
\n \n e.stopPropagation()}\n className={clsx('bottom-0 left-0 right-0 px-12', className)}\n >\n
\n
\n /{' '}\n \n
\n \n
\n \n \n
\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;\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 \n \n \n \n );\n}\n\ninterface PlayerLayoutProps {\n apiRef?: MutableRefObject;\n rightActions?: ReactNode;\n}\nfunction PlayerLayout({apiRef, rightActions}: PlayerLayoutProps) {\n const leaveTimerRef = useRef();\n const inactiveTimerRef = useRef();\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 {\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 \n \n \n \n \n \n {\n pointerIsOverControls.current = true;\n setControlsVisible(true);\n clearTimers();\n }}\n onPointerLeave={() => {\n pointerIsOverControls.current = false;\n }}\n />\n \n );\n}\n\nfunction OverlayButtons() {\n const showPlayButton = usePlayerStore(s => !s.isPlaying && !s.isSeeking);\n return (\n \n \n \n \n \n );\n}\n\n// required in order for \"onPointerEnter\" to fire consistently when player provider is iframe\nfunction Blocker() {\n return
;\n}\n\nfunction BottomGradient() {\n const controlsVisible = usePlayerStore(s => s.controlsVisible);\n return (\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 \n ) : (\n \n \n \n );\n\n const playButton = showPlayButton ? (\n
\n \n \n \n
\n ) : null;\n\n if (wrapWithLink) {\n if (episode) {\n img = (\n \n {img}\n \n );\n } else if (title) {\n img = (\n \n {img}\n \n );\n }\n }\n\n return (\n
\n {img}\n {playButton}\n {wrapWithLink && (\n
\n )}\n
\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(\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 \n );\n }\n if (fallback) {\n return fallback;\n }\n return ;\n }\n\n return (\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 \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,\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
\n }\n imageHeight=\"h-auto\"\n title={}\n />\n );\n } else if (query.isInitialLoading) {\n content = ;\n } else {\n content = (\n \n \n {query.items.map(episode => (\n \n
{episode.episode_number}
\n
{episode.name}
\n
\n }\n >\n onSelected(episode)}\n />\n \n ))}\n \n \n \n );\n }\n\n return {content};\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 onSelected() : undefined}\n >\n \n {isPlayable ? (\n \n \n \n ) : undefined}\n \n

{episode.description}

\n \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 \n {children}\n \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 ;\n }\n\n if (video.type === 'embed') {\n return ;\n }\n\n if (video.type === 'external') {\n return (\n
\n }\n />\n window.open(video.src, '_blank')}\n >\n \n \n \n
\n \n );\n }\n\n return ;\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('\n
\n \n
\n \n );\n }\n\n return (\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(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 {\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 {\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).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\n>;\n\nexport interface GetTitleResponse extends BackendResponse {\n title: Title;\n seasons?: LengthAwarePaginationResponse;\n episodes?: LengthAwarePaginationResponse;\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(`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) {\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 {\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 \n \n \n \n \n {item.model_type === EPISODE_MODEL ? (\n \n ) : (\n \n )}\n
\n \n \n \n \n {initialRating && (\n \n \n \n )}\n
\n
\n
\n );\n}\n\ninterface TitleDetailsProps {\n title: Title;\n}\nfunction TitleDetails({title}: TitleDetailsProps) {\n return (\n
\n \n
\n
{title.name}
\n
{title.year}
\n
\n
\n );\n}\n\ninterface EpisodeDetailsProps {\n title: Title;\n episode: Episode;\n}\nfunction EpisodeDetails({title, episode}: EpisodeDetailsProps) {\n return (\n
\n \n
\n \n
\n {episode.name} ()\n
\n
\n
\n );\n}\n\ninterface DialogTitleProps {\n item: Title | Episode;\n}\nfunction DialogTitle({item}: DialogTitleProps) {\n if (item.model_type === EPISODE_MODEL) {\n return ;\n } else if (item.is_series) {\n return ;\n } else {\n return ;\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;\n title: Record;\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(`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 \n {score ? (\n
\n \n
\n ) : null}\n \n \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 \n \n \n );\n } else {\n content = (\n \n \n {rating ? (\n \n ) : (\n }\n className=\"min-w-120\"\n >\n \n \n )}\n \n \n \n );\n }\n\n return (\n \n {content}\n \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
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n \n
\n
\n {episode.description || (\n \n \n \n )}\n
\n {children}\n
\n
\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 \n ) : (\n \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,\n queryParams?: Record\n) {\n return useInfiniteData({\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 \n ) : (\n \n \n \n );\n\n return link ? (\n \n {image}\n \n ) : (\n \n {image}\n \n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PlayCircleIcon = createSvgIcon(\n \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
\n {heading}\n
\n {videos.slice(0, count).map(video => (\n \n ))}\n
\n
\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
\n \n \n \n \n \n {showCategory && {video.category}}\n \n \n \n {name || video.name}\n \n
\n );\n}\n\ninterface VideoGridItemSkeletonProps {\n className?: string;\n}\nexport function VideoGridItemSkeleton({className}: VideoGridItemSkeletonProps) {\n return (\n
\n \n \n
\n );\n}\n\nexport function VideoGridItemBottomGradient() {\n return (\n
\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(\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 {\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 \n {children ?? person.name}\n \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 \n ) : (\n \n \n \n );\n\n return (\n \n {image}\n \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 \n {person.known_for ? : null}\n {person.primary_credit ? (\n {\n e.stopPropagation();\n }}\n />\n ) : null}\n \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;\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(`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({\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(`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) {\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('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
\n }\n required\n autoFocus\n className=\"mb-24\"\n />\n }\n inputElementType=\"textarea\"\n rows={2}\n className=\"mb-24\"\n />\n \n \n }\n >\n \n \n \n \n \n \n \n }\n searchField={}\n noResultsMessage={}\n />\n
\n );\n}\n\nfunction SearchField(props: ChannelContentSearchFieldProps) {\n return (\n }\n />\n );\n}\n\nfunction NoResultsMessage() {\n return (\n }\n description={}\n image={}\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({\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 \n \n \n \n \n \n \n }\n form={form}\n onSubmit={values => {\n createList.mutate(values);\n }}\n title={}\n isLoading={createList.isPending}\n >\n \n \n \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) {\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(`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 \n \n \n \n \n \n \n \n ) : (\n \n );\n}\n\ninterface PageContentProps {\n list: Channel;\n children: ReactNode;\n}\nfunction PageContent({list, children}: PageContentProps) {\n const form = useForm({\n // @ts-ignore\n defaultValues: {\n ...list,\n },\n });\n const updateList = useUpdateList(form);\n\n return (\n \n \n \n }\n form={form}\n onSubmit={values => {\n updateList.mutate(values);\n }}\n title={}\n isLoading={updateList.isPending}\n >\n {children}\n \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 {\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 \n {user.display_name}\n \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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"}