{"version":3,"file":"site-routes-4f702e39.js","sources":["../../../common/resources/client/channels/requests/use-infinite-channel-content.ts","../../../resources/client/channels/channel-header/channel-sort-button.tsx","../../../resources/client/titles/site-section-heading.tsx","../../../resources/client/channels/channel-header/use-channel-layouts.ts","../../../resources/client/channels/channel-header/channel-layout-button.tsx","../../../resources/client/user-lists/user-list-byline.tsx","../../../common/resources/client/utils/urls/share-link-socially.ts","../../../resources/client/sharing/copy-link-icon.tsx","../../../resources/client/sharing/share-menu-trigger.tsx","../../../resources/client/user-lists/user-list-link.tsx","../../../resources/client/user-lists/user-list-details.tsx","../../../resources/client/channels/channel-header/channel-header.tsx","../../../resources/client/channels/content-grid/content-grid-layout.tsx","../../../resources/client/people/person-age.tsx","../../../resources/client/news/news-article-grid-item.tsx","../../../resources/client/channels/content-grid/title-grid-item.tsx","../../../resources/client/channels/content-grid/channel-content-grid-item.tsx","../../../resources/client/channels/content-grid/channel-content-grid.tsx","../../../node_modules/just-debounce-it/index.mjs","../../../resources/client/channels/carousel/use-carousel.ts","../../../resources/client/channels/carousel/channel-content-carousel.tsx","../../../resources/client/channels/channel-content-slider.tsx","../../../resources/client/news/news-article-source-link.tsx","../../../resources/client/news/news-article-byline.tsx","../../../resources/client/channels/channel-content-news.tsx","../../../resources/client/channels/channel-content-list-item.tsx","../../../resources/client/channels/channel-content-list.tsx","../../../resources/client/channels/channel-content.tsx","../../../resources/client/search/requests/use-search-results.ts","../../../resources/client/search/search-autocomplete.tsx","../../../resources/client/main-navbar.tsx","../../../common/resources/client/admin/ads/ad-host.tsx","../../../resources/client/site-page-layout.tsx","../../../resources/client/channels/channel-page.tsx","../../../resources/client/titles/pages/title-page/sections/title-page-image-grid.tsx","../../../resources/client/titles/pages/title-page/title-credits-grid/title-credits-grid.tsx","../../../resources/client/titles/pages/title-page/sections/title-page-cast.tsx","../../../resources/client/titles/requests/use-related-titles.ts","../../../resources/client/titles/related-titles-panel.tsx","../../../resources/client/titles/pages/title-page/sections/title-page-season-grid.tsx","../../../resources/client/titles/compact-credits.tsx","../../../resources/client/titles/genre-link.tsx","../../../resources/client/titles/pages/title-page/sections/title-news/use-title-news.ts","../../../resources/client/titles/pages/title-page/sections/title-news/title-news.tsx","../../../node_modules/linkify-string/dist/linkify-string.es.js","../../../common/resources/client/utils/hooks/use-linkified-string.ts","../../../common/resources/client/ui/truncated-description.tsx","../../../resources/client/reviews/review-list/new-review-form.tsx","../../../resources/client/reviews/requests/use-submit-review-feedback.ts","../../../common/resources/client/reports/requests/use-submit-report.ts","../../../common/resources/client/reports/requests/use-delete-report.ts","../../../resources/client/reviews/review-list/review-list-item.tsx","../../../common/resources/client/comments/comment-list/account-required-card.tsx","../../../resources/client/reviews/review-list/review-list.tsx","../../../resources/client/titles/pages/title-page/sections/title-page-review-list.tsx","../../../resources/client/titles/pages/title-page/sections/title-page-video-grid.tsx","../../../resources/client/titles/pages/title-page/sections/title-page-episode-grid.tsx","../../../resources/client/titles/pages/title-page/title-page-main-content.tsx","../../../resources/client/titles/pages/title-page/title-page-header-layout.tsx","../../../resources/client/user-lists/requests/use-current-user-watchlist.ts","../../../resources/client/user-lists/requests/use-add-to-watchlist.ts","../../../resources/client/user-lists/requests/use-remove-from-watchlist.ts","../../../resources/client/user-lists/watchlist-button.tsx","../../../resources/client/titles/pages/title-page/title-page-header.tsx","../../../resources/client/titles/pages/title-page/title-page-header-image.tsx","../../../resources/client/titles/pages/title-page/title-page-aside-layout.tsx","../../../resources/client/titles/keyword-link.tsx","../../../resources/client/titles/production-country-link.tsx","../../../resources/client/titles/pages/title-page/watch-now-button.tsx","../../../resources/client/videos/use-is-streaming-mode.ts","../../../resources/client/titles/pages/title-page/title-page-aside.tsx","../../../resources/client/titles/pages/title-page/title-page.tsx","../../../resources/client/seasons/season-page.tsx","../../../resources/client/episodes/episode-page-header.tsx","../../../resources/client/episodes/episode-page.tsx","../../../resources/client/videos/requests/use-watch-page-video.ts","../../../common/resources/client/comments/requests/use-comments.ts","../../../common/resources/client/comments/requests/use-create-comment.ts","../../../common/resources/client/comments/new-comment-form.tsx","../../../common/resources/client/votes/requests/use-store-vote.ts","../../../common/resources/client/votes/thumb-buttons.tsx","../../../common/resources/client/comments/comment-list/comment-list-item.tsx","../../../common/resources/client/comments/comment-list/comment-list.tsx","../../../resources/client/videos/watch-page/watch-page-title-details.tsx","../../../resources/client/videos/watch-page/watch-page-aside.tsx","../../../resources/client/videos/watch-page/watch-page-alternative-videos.tsx","../../../resources/client/videos/watch-page/watch-page.tsx","../../../resources/client/titles/pages/title-videos-page.tsx","../../../resources/client/titles/pages/title-images-page.tsx","../../../resources/client/people/person-page/person-page-aside.tsx","../../../resources/client/people/requests/use-full-person-credits-for-title.ts","../../../resources/client/people/person-page/character-or-job.tsx","../../../resources/client/people/person-page/person-page-credits.tsx","../../../resources/client/people/person-page/person-page.tsx","../../../resources/client/titles/pages/title-full-credits-page.tsx","../../../resources/client/episodes/epispde-full-credits-page.tsx","../../../resources/client/news/news-article-page.tsx","../../../resources/client/user-lists/requests/use-delete-list.ts","../../../resources/client/user-lists/pages/user-lists-index-page/user-list-index-item.tsx","../../../resources/client/profile/requests/use-profile-lists.ts","../../../resources/client/user-lists/pages/user-lists-index-page/user-lists-index-page.tsx","../../../resources/client/profile/requests/use-user-profile.ts","../../../resources/client/profile/header/profile-description.tsx","../../../common/resources/client/users/queries/use-followed-users.ts","../../../common/resources/client/users/queries/use-follow-user.ts","../../../common/resources/client/users/queries/use-unfollow-user.ts","../../../common/resources/client/users/follow-button.tsx","../../../resources/client/profile/profile-links-form.tsx","../../../resources/client/profile/requests/use-update-user-profile.ts","../../../resources/client/profile/edit-user-profile-dialog.tsx","../../../resources/client/profile/header/profile-stats-list.tsx","../../../common/resources/client/ui/remote-favicon.tsx","../../../resources/client/profile/header/profile-links.tsx","../../../resources/client/profile/header/profile-page-header.tsx","../../../resources/client/profile/user-profile-page.tsx","../../../resources/client/profile/panels/profile-lists-panel.tsx","../../../resources/client/profile/requests/use-profile-ratings.ts","../../../resources/client/channels/content-grid/episode-grid-item.tsx","../../../resources/client/profile/panels/profile-ratings-panel.tsx","../../../resources/client/profile/requests/use-profile-reviews.ts","../../../resources/client/profile/panels/profile-reviews-panel.tsx","../../../resources/client/profile/requests/use-profile-comments.ts","../../../resources/client/profile/panels/profile-comments-panel.tsx","../../../resources/client/profile/requests/use-profile-followers.ts","../../../resources/client/profile/follower-list-item.tsx","../../../resources/client/profile/panels/profile-followers-panel.tsx","../../../resources/client/profile/requests/use-profile-followed-users.ts","../../../resources/client/profile/panels/profile-followed-users-panel.tsx","../../../resources/client/search/search-page.tsx","../../../resources/client/site-routes.tsx"],"sourcesContent":["import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {Channel, ChannelContentItem} from '@common/channels/channel';\nimport {\n  channelEndpoint,\n  channelQueryKey,\n} from '@common/channels/requests/use-channel';\nimport {useChannelQueryParams} from '@common/channels/use-channel-query-params';\n\nexport function useInfiniteChannelContent<\n  T extends ChannelContentItem = ChannelContentItem,\n>(channel: Channel<T>) {\n  const queryParams = useChannelQueryParams(channel);\n  return useInfiniteData<T>({\n    willSortOrFilter: true,\n    initialPage: channel.content,\n    queryKey: channelQueryKey(channel.id),\n    endpoint: channelEndpoint(channel.id),\n    queryParams: {\n      returnContentOnly: 'true',\n      ...queryParams,\n    },\n  });\n}\n","import {Channel, ChannelContentItem} from '@common/channels/channel';\nimport {\n  channelContentConfig,\n  Sort,\n} from '@app/admin/channels/channel-content-config';\nimport {Button} from '@common/ui/buttons/button';\nimport {SortIcon} from '@common/icons/material/Sort';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {useSearchParams} from 'react-router-dom';\nimport {\n  Menu,\n  MenuItem,\n  MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {message} from '@common/i18n/message';\nimport {IconButton} from '@common/ui/buttons/icon-button';\n\ninterface ChannelSortButtonProps<T = ChannelContentItem> {\n  channel: Channel;\n}\nexport function ChannelSortButton<T = ChannelContentItem>({\n  channel,\n}: ChannelSortButtonProps<T>) {\n  const config = channelContentConfig.models[channel.config.contentModel];\n  const sortMethods =\n    config?.sortMethods.map(method => ({\n      key: method,\n      label: channelContentConfig.sortingMethods[method].label,\n    })) || [];\n\n  if (channel.config.contentType === 'manual') {\n    sortMethods.unshift({\n      key: Sort.curated,\n      label: message('Default order'),\n    });\n  }\n\n  const [searchParams, setSearchParams] = useSearchParams();\n  const selectedValue =\n    searchParams.get('order') || channel.config.contentOrder;\n\n  if (sortMethods?.length < 2) {\n    return null;\n  }\n\n  const label = sortMethods?.find(\n    method => method.key === selectedValue\n  )?.label;\n\n  return (\n    <MenuTrigger\n      selectionMode=\"single\"\n      showCheckmark\n      selectedValue={selectedValue}\n      onSelectionChange={newValue => {\n        // order by date added to channel, if content is cured\n        if (\n          newValue === Sort.recent &&\n          channel.config.contentType === 'manual'\n        ) {\n          newValue = 'channelables.created_at:desc';\n        }\n\n        setSearchParams(\n          prev => {\n            prev.set('order', newValue as string);\n            return prev;\n          },\n          {\n            replace: true,\n          }\n        );\n      }}\n    >\n      <span role=\"button\" aria-label=\"Toggle menu\">\n        <IconButton className=\"md:hidden\" role=\"presentation\">\n          <SortIcon />\n        </IconButton>\n        <Button\n          startIcon={<SortIcon />}\n          className=\"max-md:hidden\"\n          role=\"presentation\"\n        >\n          {label ? <Trans {...label} /> : <Trans message=\"Popularity\" />}\n        </Button>\n      </span>\n      <Menu>\n        {sortMethods?.map(method => (\n          <MenuItem key={method.key} value={method.key}>\n            <Trans {...method.label} />\n          </MenuItem>\n        ))}\n      </Menu>\n    </MenuTrigger>\n  );\n}\n","import {IconButton} from '@common/ui/buttons/icon-button';\nimport {Link} from 'react-router-dom';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport {ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface Props {\n  children: ReactNode;\n  titleAppend?: ReactNode;\n  link?: string;\n  fontSize?: string;\n  fontWeight?: string;\n  margin?: string;\n  headingType?: 'h1' | 'h2' | 'div';\n  className?: string;\n  description?: ReactNode;\n  descriptionFontSize?: string;\n  actions?: ReactNode;\n  hideBorder?: boolean;\n}\nexport function SiteSectionHeading({\n  children,\n  titleAppend,\n  link,\n  fontSize = 'text-2xl md:text-3xl',\n  fontWeight = 'font-bold',\n  margin = 'mb-20',\n  className,\n  headingType: HeadingType = 'h2',\n  description,\n  descriptionFontSize = 'text-base',\n  actions,\n  hideBorder,\n}: Props) {\n  const title = link ? (\n    <Link\n      to={link}\n      className=\"rounded outline-none transition-colors hover:underline focus-visible:ring-2 focus-visible:ring-offset-2\"\n    >\n      {children}\n    </Link>\n  ) : (\n    children\n  );\n\n  return (\n    <section className={clsx(className, margin)}>\n      <div className=\"flex items-center gap-44 max-md:overflow-x-auto\">\n        <div className=\"flex-auto\">\n          <div\n            className={clsx(\n              'relative flex items-center gap-4',\n              !hideBorder &&\n                'pl-14 before:absolute before:left-0 before:h-5/6 before:w-4 before:rounded before:bg-primary'\n            )}\n          >\n            <HeadingType className={clsx(fontSize, fontWeight)}>\n              {title}\n            </HeadingType>\n            {titleAppend && (\n              <span className=\"pt-4 text-base text-muted\">{titleAppend}</span>\n            )}\n            {link && (\n              <IconButton\n                elementType={Link}\n                to={link}\n                size=\"sm\"\n                iconSize=\"lg\"\n                className=\"mt-4 max-md:hidden\"\n              >\n                <KeyboardArrowRightIcon />\n              </IconButton>\n            )}\n          </div>\n        </div>\n        {actions && (\n          <div className=\"flex flex-shrink-0 items-center gap-4\">{actions}</div>\n        )}\n      </div>\n      {description && (\n        <div className={clsx('mt-6', descriptionFontSize)}>{description}</div>\n      )}\n    </section>\n  );\n}\n","import {Channel} from '@common/channels/channel';\nimport {channelContentConfig} from '@app/admin/channels/channel-content-config';\nimport {useCookie} from '@common/utils/hooks/use-cookie';\n\nexport function useChannelLayouts(channel: Channel) {\n  const config = channelContentConfig.models[channel.config.contentModel];\n  const availableLayouts = config?.layoutMethods\n    .filter(m => channelContentConfig.userSelectableLayouts.includes(m))\n    .map(method => ({\n      key: method,\n      label: channelContentConfig.layoutMethods[method].label,\n      icon: channelContentConfig.layoutMethods[method].icon,\n    }));\n\n  const [selectedLayout, setSelectedLayout] = useCookie(\n    `channel-layout-${channel.config.contentModel}`,\n    channel.config.selectedLayout || channel.config.layout\n  );\n\n  return {selectedLayout, setSelectedLayout, availableLayouts};\n}\n","import {Channel} from '@common/channels/channel';\nimport {Trans} from '@common/i18n/trans';\nimport {\n  Menu,\n  MenuItem,\n  MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {useChannelLayouts} from '@app/channels/channel-header/use-channel-layouts';\nimport {Button} from '@common/ui/buttons/button';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {GridViewIcon} from '@common/icons/material/GridView';\n\ninterface Props {\n  channel: Channel;\n}\nexport function ChannelLayoutButton({channel}: Props) {\n  const {selectedLayout, setSelectedLayout, availableLayouts} =\n    useChannelLayouts(channel);\n\n  if (availableLayouts?.length < 2) {\n    return null;\n  }\n\n  const layoutConfig = availableLayouts?.find(\n    method => method.key === selectedLayout\n  );\n\n  return (\n    <MenuTrigger\n      selectionMode=\"single\"\n      showCheckmark\n      selectedValue={selectedLayout}\n      onSelectionChange={newValue => setSelectedLayout(newValue as string)}\n    >\n      <span role=\"button\" aria-label=\"Toggle menu\">\n        <IconButton className=\"md:hidden\" role=\"presentation\">\n          {layoutConfig?.icon || <GridViewIcon />}\n        </IconButton>\n        <Button\n          role=\"presentation\"\n          className=\"max-md:hidden\"\n          startIcon={layoutConfig?.icon || <GridViewIcon />}\n        >\n          {layoutConfig?.label ? (\n            <Trans {...layoutConfig.label} />\n          ) : (\n            <Trans message=\"Popularity\" />\n          )}\n        </Button>\n      </span>\n      <Menu>\n        {availableLayouts?.map(method => (\n          <MenuItem key={method.key} value={method.key}>\n            <Trans {...method.label} />\n          </MenuItem>\n        ))}\n      </Menu>\n    </MenuTrigger>\n  );\n}\n","import {User} from '@common/auth/user';\nimport React, {useContext} from 'react';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {UserAvatar} from '@common/ui/images/user-avatar';\nimport {Trans} from '@common/i18n/trans';\nimport {Link} from 'react-router-dom';\n\ninterface Props {\n  user: User;\n}\nexport function UserListByline({user}: Props) {\n  const {auth} = useContext(SiteConfigContext);\n  return (\n    <div className=\"flex-shrink-0 flex items-center gap-8 mr-24\">\n      <UserAvatar user={user} circle size=\"sm\" />\n      <div>\n        <Trans\n          message=\"List by <a>:name</a>\"\n          values={{\n            a: () => (\n              <Link\n                to={auth.getUserProfileLink!(user)}\n                className=\"font-bold hover:underline\"\n              >\n                {user.display_name}\n              </Link>\n            ),\n          }}\n        />\n      </div>\n    </div>\n  );\n}\n","export type ShareableNetworks =\n  | 'facebook'\n  | 'twitter'\n  | 'pinterest'\n  | 'tumblr'\n  | 'blogger'\n  | 'mail';\n\nexport function shareLinkSocially(\n  network: ShareableNetworks,\n  link: string,\n  name?: string,\n  image?: string\n) {\n  const url = generateShareUrl(network, link, name, image);\n\n  if (network === 'mail') {\n    window.location.href = url;\n  } else {\n    openNewWindow(url);\n  }\n}\n\nfunction openNewWindow(url: string) {\n  const width = 575,\n    height = 400,\n    left = (window.innerWidth - width) / 2,\n    top = (window.innerHeight - height) / 2,\n    opts =\n      'status=1, scrollbars=1' +\n      ',width=' +\n      width +\n      ',height=' +\n      height +\n      ',top=' +\n      top +\n      ',left=' +\n      left;\n\n  window.open(url, 'share', opts);\n}\n\nfunction generateShareUrl(\n  type: ShareableNetworks,\n  link: string,\n  name?: string,\n  image?: string\n): string {\n  switch (type) {\n    case 'facebook':\n      return 'https://www.facebook.com/sharer/sharer.php?u=' + link;\n    case 'twitter':\n      return `https://twitter.com/intent/tweet?text=${name}&url=${link}`;\n    case 'pinterest':\n      return (\n        'https://pinterest.com/pin/create/button/?url=' +\n        link +\n        '&media=' +\n        image\n      );\n    case 'tumblr':\n      const base =\n        'https://www.tumblr.com/widgets/share/tool?shareSource=legacy&canonicalUrl=&posttype=photo&title=&caption=';\n      return base + name + '&content=' + image + '&url=' + link;\n    case 'blogger':\n      return (\n        'https://www.blogger.com/blog_this.pyra?t&u=' + link + '&n=' + name\n      );\n    case 'mail':\n      return `mailto:?subject=Check out this link.&body=${link}`;\n  }\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const CopyLinkIcon = createSvgIcon(\n  <path d=\"M 4 2 C 2.895 2 2 2.895 2 4 L 2 18 L 4 18 L 4 4 L 18 4 L 18 2 L 4 2 z M 8 6 C 6.895 6 6 6.895 6 8 L 6 20 C 6 21.105 6.895 22 8 22 L 20 22 C 21.105 22 22 21.105 22 20 L 22 8 C 22 6.895 21.105 6 20 6 L 8 6 z M 8 8 L 20 8 L 20 20 L 8 20 L 8 8 z M 16 9.0058594 C 15.230215 9.0058594 14.460443 9.2973698 13.878906 9.8789062 L 12.607422 11.150391 L 14.021484 12.564453 L 12.556641 14.029297 L 11.142578 12.615234 L 9.8789062 13.878906 C 8.7158332 15.041979 8.7158332 16.958021 9.8789062 18.121094 C 10.460397 18.702585 11.234094 19 12 19 C 12.765906 19 13.539603 18.702585 14.121094 18.121094 L 15.384766 16.857422 L 13.970703 15.443359 L 15.457031 13.957031 L 14.042969 12.542969 L 15.292969 11.292969 C 15.691896 10.894042 16.308104 10.894042 16.707031 11.292969 C 17.105958 11.691896 17.105958 12.308104 16.707031 12.707031 L 15.464844 13.949219 L 16.878906 15.363281 L 18.121094 14.121094 C 19.284167 12.958021 19.284167 11.041979 18.121094 9.8789062 C 17.539557 9.2973698 16.769785 9.0058594 16 9.0058594 z M 12.542969 14.042969 L 13.957031 15.457031 L 12.707031 16.707031 C 12.506522 16.90754 12.258094 17 12 17 C 11.741906 17 11.493478 16.90754 11.292969 16.707031 C 10.894042 16.308104 10.894042 15.691896 11.292969 15.292969 L 12.542969 14.042969 z\"></path>\n);\n","import {Menu, MenuTrigger} from '@common/ui/navigation/menu/menu-trigger';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {Trans} from '@common/i18n/trans';\nimport {FacebookIcon} from '@common/icons/social/facebook';\nimport {TwitterIcon} from '@common/icons/social/twitter';\nimport useClipboard from 'react-use-clipboard';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {shareLinkSocially} from '@common/utils/urls/share-link-socially';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {ReactElement} from 'react';\nimport {CopyLinkIcon} from '@app/sharing/copy-link-icon';\n\ninterface Props {\n  link: string;\n  children: ReactElement;\n}\nexport function ShareMenuTrigger({link, children}: Props) {\n  const {trans} = useTrans();\n  const [, setUrlCopied] = useClipboard(link);\n\n  return (\n    <MenuTrigger>\n      {children}\n      <Menu>\n        <Item\n          value=\"clipboard\"\n          startIcon={<CopyLinkIcon />}\n          onSelected={() => {\n            setUrlCopied();\n            toast.positive(message('Copied link to clipboard'));\n          }}\n        >\n          <Trans message=\"Copy to clipboard\" />\n        </Item>\n        <Item\n          value=\"facebook\"\n          startIcon={<FacebookIcon />}\n          onClick={() => {\n            shareLinkSocially(\n              'facebook',\n              link,\n              trans(message('Check out this link')),\n            );\n          }}\n        >\n          <Trans message=\"Share to facebook\" />\n        </Item>\n        <Item\n          value=\"twitter\"\n          startIcon={<TwitterIcon />}\n          onClick={() => {\n            shareLinkSocially(\n              'twitter',\n              link,\n              trans(message('Check out this link')),\n            );\n          }}\n        >\n          <Trans message=\"Share to twitter\" />\n        </Item>\n      </Menu>\n    </MenuTrigger>\n  );\n}\n","import React, {useMemo} from 'react';\nimport {\n  BaseMediaLink,\n  BaseMediaLinkProps,\n  getBaseMediaLink,\n} from '@app/base-media-link';\nimport {Channel} from '@common/channels/channel';\nimport {Trans} from '@common/i18n/trans';\n\ninterface Props extends Omit<BaseMediaLinkProps, 'link'> {\n  list: Channel;\n}\nexport function UserListLink({list, children, ...linkProps}: Props) {\n  const link = useMemo(() => {\n    return getUserListLink(list);\n  }, [list]);\n\n  let content;\n\n  if (children) {\n    content = children;\n  } else if (list.internal && list.name === 'watchlist') {\n    return <Trans message=\"Watchlist\" />;\n  } else {\n    content = list.name;\n  }\n\n  return (\n    <BaseMediaLink {...linkProps} link={link}>\n      {content}\n    </BaseMediaLink>\n  );\n}\n\ninterface Options {\n  absolute?: boolean;\n  season?: number | string;\n  episode?: number | string;\n}\n\nexport function getUserListLink(\n  list: Channel,\n  {absolute}: Options = {}\n): string {\n  return getBaseMediaLink(`/lists/${list.id}`, {\n    absolute,\n  });\n}\n","import {Trans} from '@common/i18n/trans';\nimport {FormattedRelativeTime} from '@common/i18n/formatted-relative-time';\nimport {LockIcon} from '@common/icons/material/Lock';\nimport React, {Fragment} from 'react';\nimport {LockOpenIcon} from '@common/icons/material/LockOpen';\nimport clsx from 'clsx';\nimport {Channel} from '@common/channels/channel';\nimport {Button} from '@common/ui/buttons/button';\nimport {ShareIcon} from '@common/icons/material/Share';\nimport {ShareMenuTrigger} from '@app/sharing/share-menu-trigger';\nimport {getUserListLink} from '@app/user-lists/user-list-link';\n\ninterface Props {\n  list: Channel;\n  className?: string;\n  showShareButton?: boolean;\n  showVisibility?: boolean;\n}\nexport function UserListDetails({\n  list,\n  className,\n  showShareButton,\n  showVisibility = true,\n}: Props) {\n  return (\n    <div\n      className={clsx(\n        'flex flex-shrink-0 items-center gap-4 whitespace-nowrap text-muted',\n        className,\n      )}\n    >\n      {showShareButton && (\n        <Fragment>\n          <ShareButton list={list} />\n          <Divider marginLeft=\"ml-2\" />\n        </Fragment>\n      )}\n      {list.items_count ? (\n        <Fragment>\n          <Trans message=\":count items\" values={{count: list.items_count}} />\n          <Divider />\n        </Fragment>\n      ) : null}\n      <span>\n        <Trans\n          message=\"Updated :date\"\n          values={{\n            date: <FormattedRelativeTime date={list.updated_at} />,\n          }}\n        />\n      </span>\n      {showVisibility && (\n        <Fragment>\n          <Divider />\n          {list.public ? <LockOpenIcon size=\"sm\" /> : <LockIcon size=\"sm\" />}\n          <div>\n            {list.public ? (\n              <Trans message=\"Public\" />\n            ) : (\n              <Trans message=\"Private\" />\n            )}\n          </div>\n        </Fragment>\n      )}\n    </div>\n  );\n}\n\ninterface ShareButtonProps {\n  list: Channel;\n}\nfunction ShareButton({list}: ShareButtonProps) {\n  const link = getUserListLink(list, {absolute: true});\n  return (\n    <ShareMenuTrigger link={link}>\n      <Button startIcon={<ShareIcon />} sizeClassName=\"px-10 py-6\">\n        <Trans message=\"Share\" />\n      </Button>\n    </ShareMenuTrigger>\n  );\n}\n\ninterface DividerProps {\n  marginLeft?: string;\n}\nfunction Divider({marginLeft = 'ml-12'}: DividerProps) {\n  return <div className={clsx('mr-10 h-20 w-1 bg-divider', marginLeft)} />;\n}\n","import React, {Fragment, ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {Channel} from '@common/channels/channel';\nimport {FilterList} from '@common/datatable/filters/filter-list/filter-list';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {useBackendFilterUrlParams} from '@common/datatable/filters/backend-filter-url-params';\nimport {MOVIE_MODEL, SERIES_MODEL, TITLE_MODEL} from '@app/titles/models/title';\nimport {ChannelSortButton} from '@app/channels/channel-header/channel-sort-button';\nimport {AddFilterButton} from '@common/datatable/filters/add-filter-button';\nimport {TuneIcon} from '@common/icons/material/Tune';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Trans} from '@common/i18n/trans';\nimport {useParams} from 'react-router-dom';\nimport {ChannelLayoutButton} from '@app/channels/channel-header/channel-layout-button';\nimport {useTitleIndexFilters} from '@app/titles/use-title-index-filters';\nimport {FilterListSkeleton} from '@common/datatable/filters/filter-list/filter-list-skeleton';\nimport {UserListByline} from '@app/user-lists/user-list-byline';\nimport {UserListDetails} from '@app/user-lists/user-list-details';\n\nconst FilterModelTypes = [TITLE_MODEL, MOVIE_MODEL, SERIES_MODEL];\n\ninterface Props {\n  channel: Channel;\n  margin?: string;\n  isNested: boolean;\n  actions?: ReactNode;\n}\nexport function ChannelHeader({\n  channel,\n  isNested,\n  actions,\n  margin = isNested ? 'mb-16 md:mb-30' : 'mb-20 md:mb-40',\n}: Props) {\n  const shouldShowFilterButton =\n    !isNested &&\n    FilterModelTypes.includes(channel.config.contentModel) &&\n    channel.config.contentType === 'listAll';\n\n  const {encodedFilters} = useBackendFilterUrlParams();\n  const {filters, filtersLoading} = useTitleIndexFilters({\n    disabled: !shouldShowFilterButton,\n  });\n\n  if (channel.config.hideTitle) {\n    return null;\n  }\n\n  return (\n    <section className={clsx(margin)}>\n      <ChannelTitle\n        channel={channel}\n        isNested={isNested}\n        actions={\n          <Fragment>\n            {actions}\n            {!isNested && <ChannelSortButton channel={channel} />}\n            {shouldShowFilterButton && (\n              <AddFilterButton\n                icon={<TuneIcon />}\n                color={null}\n                variant=\"text\"\n                disabled={filtersLoading}\n                filters={filters}\n              />\n            )}\n            {!isNested && <ChannelLayoutButton channel={channel} />}\n          </Fragment>\n        }\n      />\n      {shouldShowFilterButton && (\n        <div className=\"mt-14\">\n          <AnimatePresence initial={false} mode=\"wait\">\n            {filtersLoading && encodedFilters ? (\n              <FilterListSkeleton />\n            ) : (\n              <m.div key=\"filter-list\" {...opacityAnimation}>\n                <FilterList filters={filters} />\n              </m.div>\n            )}\n          </AnimatePresence>\n        </div>\n      )}\n    </section>\n  );\n}\n\ninterface ChannelTitleProps {\n  channel: Channel;\n  isNested: boolean;\n  actions?: ReactNode;\n}\nfunction ChannelTitle({channel, isNested, actions}: ChannelTitleProps) {\n  const {restriction: urlParam} = useParams();\n  if (channel.config.hideTitle) {\n    return null;\n  }\n\n  const link =\n    channel.config.restriction && urlParam\n      ? `/${channel.slug}/${urlParam}`\n      : `/${channel.slug}`;\n\n  return (\n    <SiteSectionHeading\n      className=\"flex-auto\"\n      margin=\"m-0\"\n      description={<ChannelDescription channel={channel} />}\n      actions={actions}\n      headingType={isNested ? 'h2' : 'h1'}\n      descriptionFontSize={isNested ? 'text-sm' : undefined}\n      fontWeight={isNested ? 'font-normal' : undefined}\n      link={isNested ? link : undefined}\n    >\n      <Trans message={channel.name} />\n    </SiteSectionHeading>\n  );\n}\n\ninterface ChannelDescriptionProps {\n  channel: Channel;\n}\nfunction ChannelDescription({channel}: ChannelDescriptionProps) {\n  if (channel.type === 'channel') {\n    return <Fragment>{channel.description}</Fragment>;\n  }\n\n  return (\n    <div className=\"mt-18 items-center text-sm md:flex\">\n      {channel.user && <UserListByline user={channel.user} />}\n      <UserListDetails\n        list={channel}\n        className=\"ml-auto max-md:mt-14\"\n        showShareButton\n      />\n    </div>\n  );\n}\n","import {ReactNode} from 'react';\nimport clsx from 'clsx';\n\nexport interface ContentGridProps {\n  className?: string;\n  children: ReactNode;\n  variant?: 'portrait' | 'landscape';\n  gridCols?: string;\n}\nexport function ContentGridLayout({\n  children,\n  className,\n  variant,\n  gridCols = 'grid-cols-[repeat(var(--nVisibleItems),minmax(0,1fr))]',\n}: ContentGridProps) {\n  return (\n    <div\n      className={clsx(\n        'grid gap-24',\n        gridCols,\n        className,\n        variant === 'landscape'\n          ? 'content-grid-landscape'\n          : 'content-grid-portrait'\n      )}\n    >\n      {children}\n    </div>\n  );\n}\n","import {Person} from '@app/titles/models/person';\nimport {FormattedDateTimeRange} from '@common/i18n/formatted-date-time-range';\nimport {Fragment, memo} from 'react';\n\ninterface Props {\n  person: Person;\n  showRange?: boolean;\n}\nexport const PersonAge = memo(({person, showRange}: Props) => {\n  if (showRange && person.birth_date && person.death_date) {\n    return (\n      <FormattedDateTimeRange\n        start={person.birth_date}\n        end={person.death_date}\n        options={{year: 'numeric'}}\n      />\n    );\n  }\n\n  if (person.birth_date) {\n    return (\n      <Fragment>\n        {calculateAgeFromBirthDate(person.birth_date, person.death_date)}\n      </Fragment>\n    );\n  }\n\n  return null;\n});\n\nfunction calculateAgeFromBirthDate(\n  _birthDate: string,\n  _deathDate?: string\n): number {\n  const until = _deathDate ? new Date(_deathDate) : new Date();\n  const birthDate = new Date(_birthDate);\n  let age = until.getFullYear() - birthDate.getFullYear();\n  const m = until.getMonth() - birthDate.getMonth();\n  if (m < 0 || (m === 0 && until.getDate() < birthDate.getDate())) {\n    age--;\n  }\n  return age;\n}\n","import {NewsArticleImage} from '@app/news/news-article-image';\nimport {NewsArticleLink} from '@app/news/news-article-link';\nimport {BulletSeparatedItems} from '@app/titles/bullet-separated-items';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {NewsArticle} from '@app/titles/models/news-article';\n\ninterface Props {\n  article: NewsArticle;\n}\nexport function NewsArticleGridItem({article}: Props) {\n  return (\n    <div className=\"items-start gap-14 lg:flex\">\n      <NewsArticleImage\n        article={article}\n        className=\"aspect-poster max-w-90 max-md:hidden\"\n      />\n      <div className=\"min-w-0 overflow-hidden overflow-ellipsis text-base md:mt-24 lg:mt-6\">\n        <NewsArticleLink article={article} className=\"font-medium\" />\n        <BulletSeparatedItems className=\"mt-10 min-w-0 overflow-hidden overflow-ellipsis text-xs\">\n          <FormattedDate date={article.created_at} />\n          <div className=\"overflow-hidden overflow-ellipsis whitespace-nowrap\">\n            {article.source}\n          </div>\n        </BulletSeparatedItems>\n      </div>\n    </div>\n  );\n}\n","import {Title} from '@app/titles/models/title';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {TitleRating} from '@app/reviews/title-rating';\nimport {TitleLink} from '@app/titles/title-link';\nimport {ReactNode} from 'react';\nimport {TitleBackdrop} from '@app/titles/title-poster/title-backdrop';\nimport {BulletSeparatedItems} from '@app/titles/bullet-separated-items';\nimport {FormattedDate} from '@common/i18n/formatted-date';\n\nexport interface TitlePortraitGridItemProps {\n  item: Title;\n  rating?: number;\n  description?: ReactNode;\n}\nexport function TitlePortraitGridItem({\n  item,\n  rating,\n  description,\n}: TitlePortraitGridItemProps) {\n  return (\n    <div>\n      <div className=\"relative\">\n        <TitlePoster title={item} srcSize=\"md\" showPlayButton />\n      </div>\n      <div className=\"mt-10 text-sm\">\n        <RatingOrReleaseDate title={item} rating={rating} className=\"mb-4\" />\n        <TitleLink title={item} className=\"block text-base font-medium\" />\n        {description ? <div className=\"mt-4\">{description}</div> : null}\n      </div>\n    </div>\n  );\n}\n\nexport function TitleLandscapeGridItem({item}: TitlePortraitGridItemProps) {\n  return (\n    <div>\n      <TitleBackdrop\n        title={item}\n        srcSize=\"lg\"\n        size=\"w-full\"\n        className=\"rounded\"\n        wrapWithLink\n        showPlayButton\n      />\n      <div className=\"mt-10 text-sm\">\n        <TitleLink\n          title={item}\n          className=\"mb-4 block text-base font-semibold\"\n        />\n        <BulletSeparatedItems className=\"mb-4\">\n          {item.release_date && <FormattedDate date={item.release_date} />}\n          {item.certification && (\n            <div className=\"uppercase\">{item.certification}</div>\n          )}\n        </BulletSeparatedItems>\n        <TitleRating score={item.rating} className=\"mb-4\" />\n      </div>\n    </div>\n  );\n}\n\ninterface RatingOrReleaseDateProps {\n  title: Title;\n  rating?: number;\n  className?: string;\n}\nfunction RatingOrReleaseDate({\n  title,\n  rating,\n  className,\n}: RatingOrReleaseDateProps) {\n  if (!rating) {\n    rating = title.rating;\n  }\n  if (rating) {\n    return <TitleRating score={rating} className={className} />;\n  }\n  if (title.release_date) {\n    return (\n      <div className={className}>\n        <FormattedDate date={title.release_date} />\n      </div>\n    );\n  }\n  return null;\n}\n","import {TITLE_MODEL} from '@app/titles/models/title';\nimport {ChannelContentModel} from '@app/admin/channels/channel-content-config';\nimport {NEWS_ARTICLE_MODEL} from '@app/titles/models/news-article';\nimport {ContentGridProps} from '@app/channels/content-grid/content-grid-layout';\nimport {Person, PERSON_MODEL} from '@app/titles/models/person';\nimport {PersonPoster} from '@app/people/person-poster/person-poster';\nimport {PersonLink} from '@app/people/person-link';\nimport {PersonAge} from '@app/people/person-age';\nimport {NewsArticleGridItem} from '@app/news/news-article-grid-item';\nimport {\n  TitleLandscapeGridItem,\n  TitlePortraitGridItem,\n} from '@app/channels/content-grid/title-grid-item';\n\ninterface Props {\n  item: ChannelContentModel;\n  variant?: ContentGridProps['variant'];\n}\nexport function ChannelContentGridItem({item, variant}: Props) {\n  switch (item.model_type) {\n    case TITLE_MODEL:\n      return variant === 'landscape' ? (\n        <TitleLandscapeGridItem item={item} />\n      ) : (\n        <TitlePortraitGridItem item={item} />\n      );\n    case PERSON_MODEL:\n      return <PersonGridItem item={item} />;\n    case NEWS_ARTICLE_MODEL:\n      return <NewsArticleGridItem article={item} />;\n    default:\n      return null;\n  }\n}\n\ninterface PersonGridItemProps {\n  item: Person;\n}\nfunction PersonGridItem({item}: PersonGridItemProps) {\n  return (\n    <div>\n      <PersonPoster person={item} srcSize=\"md\" size=\"w-full\" rounded />\n      <div className=\"mt-10 text-center text-sm\">\n        <PersonLink person={item} className=\"block text-base font-medium\" />\n        <div>\n          <PersonAge person={item} showRange />\n        </div>\n      </div>\n    </div>\n  );\n}\n","import {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport React, {Fragment} from 'react';\nimport {ChannelContentProps} from '@app/channels/channel-content';\nimport {useInfiniteChannelContent} from '@common/channels/requests/use-infinite-channel-content';\nimport {ChannelHeader} from '@app/channels/channel-header/channel-header';\nimport {\n  ContentGridLayout,\n  ContentGridProps,\n} from '@app/channels/content-grid/content-grid-layout';\nimport {ChannelContentGridItem} from '@app/channels/content-grid/channel-content-grid-item';\nimport {ChannelContentModel} from '@app/admin/channels/channel-content-config';\nimport {useChannelContent} from '@common/channels/requests/use-channel-content';\nimport clsx from 'clsx';\nimport {\n  PaginationControls,\n  PaginationControlsType,\n} from '@common/ui/navigation/pagination-controls';\n\ninterface ChannelContentGridProps extends ChannelContentProps {\n  variant?: ContentGridProps['variant'];\n}\nexport function ChannelContentGrid(props: ChannelContentGridProps) {\n  const isInfiniteScroll =\n    !props.isNested &&\n    (!props.channel.config.paginationType ||\n      props.channel.config.paginationType === 'infiniteScroll');\n  return (\n    <Fragment>\n      <ChannelHeader {...props} />\n      {isInfiniteScroll ? (\n        <InfiniteScrollGrid {...props} />\n      ) : (\n        <PaginatedGrid {...props} />\n      )}\n    </Fragment>\n  );\n}\n\nfunction InfiniteScrollGrid({channel, variant}: ChannelContentGridProps) {\n  const query = useInfiniteChannelContent<ChannelContentModel>(channel);\n  return (\n    <div\n      className={clsx('transition-opacity', query.isReloading && 'opacity-70')}\n    >\n      <ContentGrid content={query.items} variant={variant} />\n      <InfiniteScrollSentinel query={query} />\n    </div>\n  );\n}\n\nfunction PaginatedGrid({channel, variant, isNested}: ChannelContentGridProps) {\n  const shouldPaginate = !isNested;\n  const query = useChannelContent(channel, null, {paginate: shouldPaginate});\n  return (\n    <div\n      className={clsx(\n        'transition-opacity',\n        query.isPlaceholderData && 'opacity-70',\n      )}\n    >\n      {shouldPaginate && (\n        <PaginationControls\n          pagination={query.data}\n          type={channel.config.paginationType as PaginationControlsType}\n          className=\"mb-24\"\n        />\n      )}\n      <ContentGrid content={query.data?.data} variant={variant} />\n      {shouldPaginate && (\n        <PaginationControls\n          pagination={query.data}\n          type={channel.config.paginationType as PaginationControlsType}\n          className=\"mt-24\"\n          scrollToTop\n        />\n      )}\n    </div>\n  );\n}\n\ninterface ContentProps {\n  content: ChannelContentModel[] | undefined;\n  variant: ContentGridProps['variant'];\n}\nexport function ContentGrid({content = [], variant}: ContentProps) {\n  return (\n    <ContentGridLayout variant={variant}>\n      {content.map(item => (\n        <ChannelContentGridItem\n          key={`${item.id}-${item.model_type}`}\n          item={item}\n          variant={variant}\n        />\n      ))}\n    </ContentGridLayout>\n  );\n}\n","var functionDebounce = debounce;\n\nfunction debounce(fn, wait, callFirst) {\n  var timeout = null;\n  var debouncedFn = null;\n\n  var clear = function() {\n    if (timeout) {\n      clearTimeout(timeout);\n\n      debouncedFn = null;\n      timeout = null;\n    }\n  };\n\n  var flush = function() {\n    var call = debouncedFn;\n    clear();\n\n    if (call) {\n      call();\n    }\n  };\n\n  var debounceWrapper = function() {\n    if (!wait) {\n      return fn.apply(this, arguments);\n    }\n\n    var context = this;\n    var args = arguments;\n    var callNow = callFirst && !timeout;\n    clear();\n\n    debouncedFn = function() {\n      fn.apply(context, args);\n    };\n\n    timeout = setTimeout(function() {\n      timeout = null;\n\n      if (!callNow) {\n        var call = debouncedFn;\n        debouncedFn = null;\n\n        return call();\n      }\n    }, wait);\n\n    if (callNow) {\n      return debouncedFn();\n    }\n  };\n\n  debounceWrapper.cancel = clear;\n  debounceWrapper.flush = flush;\n\n  return debounceWrapper;\n}\n\nexport {functionDebounce as default};\n","import {useCallback, useEffect, useRef, useState} from 'react';\nimport debounce from 'just-debounce-it';\nimport {useLayoutEffect} from '@react-aria/utils';\n\ninterface Options {\n  rotate?: boolean;\n}\n\nconst containerClassName =\n  'content-carousel content-grid relative w-full grid grid-flow-col grid-rows-[auto] overflow-x-auto overflow-y-hidden gap-24 snap-always snap-x snap-mandatory hidden-scrollbar scroll-smooth';\nconst itemClassName = 'snap-start snap-normal';\n\nexport function useCarousel({rotate = false}: Options = {}) {\n  const scrollContainerRef = useRef<HTMLDivElement>(null);\n  const itemWidth = useRef<number>(0);\n  const perPage = useRef<number>(5);\n\n  const [canScrollBackward, setCanScrollBackward] = useState(rotate);\n  const [canScrollForward, setCanScrollForward] = useState(true);\n  const [activePage, setActivePage] = useState(0);\n\n  const updateNavStatus = useCallback(() => {\n    const el = scrollContainerRef.current;\n    if (el && itemWidth.current) {\n      if (!rotate) {\n        setCanScrollForward(\n          el.scrollWidth - 1 > el.scrollLeft + el.clientWidth\n        );\n        setCanScrollBackward(el.scrollLeft > 0);\n      }\n      const pageWidth = el.clientWidth;\n      const activePage = Math.round(el.scrollLeft / pageWidth);\n      setActivePage(activePage);\n    }\n  }, [rotate]);\n\n  // enable/disable navigation buttons based on element scroll offset\n  useEffect(() => {\n    const el = scrollContainerRef.current;\n    const handleScroll = debounce(() => updateNavStatus(), 100);\n    if (el) {\n      el.addEventListener('scroll', handleScroll);\n    }\n    return () => el?.removeEventListener('scroll', handleScroll);\n  }, [updateNavStatus]);\n\n  // get width for first grid item\n  useLayoutEffect(() => {\n    const el = scrollContainerRef.current;\n    if (el) {\n      perPage.current = Number(\n        getComputedStyle(el).getPropertyValue('--nVisibleItems')\n      );\n      const firstGridItem = el.children.item(0);\n      const observer = new ResizeObserver(entries => {\n        itemWidth.current = entries[0].contentRect.width;\n        updateNavStatus();\n      });\n      if (firstGridItem) {\n        observer.observe(firstGridItem);\n      }\n      return () => observer.unobserve(el);\n    }\n  }, [updateNavStatus]);\n\n  const scrollToIndex = useCallback((index: number) => {\n    if (scrollContainerRef.current) {\n      setActivePage(index);\n      const amount = itemWidth.current * index;\n      scrollContainerRef.current.scrollTo({left: amount});\n    }\n  }, []);\n\n  const scrollToPreviousPage = useCallback(() => {\n    if (scrollContainerRef.current) {\n      const pageWidth = scrollContainerRef.current.clientWidth;\n      const currentScroll = scrollContainerRef.current.scrollLeft;\n      const scrollLeft =\n        !currentScroll && rotate\n          ? scrollContainerRef.current.scrollWidth - pageWidth\n          : currentScroll - pageWidth;\n      scrollContainerRef.current.scrollTo({\n        left: scrollLeft,\n      });\n    }\n  }, [rotate]);\n\n  const scrollToNextPage = useCallback(() => {\n    if (scrollContainerRef.current) {\n      const pageWidth = scrollContainerRef.current.clientWidth;\n      const currentScroll = scrollContainerRef.current.scrollLeft;\n      const scrollLeft =\n        rotate &&\n        currentScroll + pageWidth >= scrollContainerRef.current.scrollWidth\n          ? 0\n          : (activePage + 1) * pageWidth;\n      scrollContainerRef.current.scrollTo({left: scrollLeft});\n    }\n  }, [activePage, rotate]);\n\n  return {\n    scrollContainerRef,\n    scrollToIndex,\n    scrollToPreviousPage,\n    scrollToNextPage,\n    canScrollForward,\n    canScrollBackward,\n    activePage,\n    containerClassName,\n    itemClassName,\n  };\n}\n","import React, {Fragment} from 'react';\nimport {ChannelContentProps} from '@app/channels/channel-content';\nimport {ChannelHeader} from '@app/channels/channel-header/channel-header';\nimport {ChannelContentGridItem} from '@app/channels/content-grid/channel-content-grid-item';\nimport {useCarousel} from '@app/channels/carousel/use-carousel';\nimport clsx from 'clsx';\nimport {ContentGridProps} from '@app/channels/content-grid/content-grid-layout';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {KeyboardArrowLeftIcon} from '@common/icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\n\ninterface Props extends ChannelContentProps {\n  variant?: ContentGridProps['variant'];\n}\nexport function ChannelContentCarousel(props: Props) {\n  const {channel, variant} = props;\n  const {\n    scrollContainerRef,\n    canScrollForward,\n    canScrollBackward,\n    scrollToPreviousPage,\n    scrollToNextPage,\n    containerClassName,\n    itemClassName,\n  } = useCarousel();\n\n  const gridClassName =\n    variant === 'landscape'\n      ? 'content-grid-landscape'\n      : 'content-grid-portrait';\n\n  return (\n    <div>\n      <ChannelHeader\n        {...props}\n        actions={\n          <Fragment>\n            <IconButton\n              disabled={!canScrollBackward}\n              onClick={() => scrollToPreviousPage()}\n              aria-label=\"Previous page\"\n            >\n              <KeyboardArrowLeftIcon />\n            </IconButton>\n            <IconButton\n              disabled={!canScrollForward}\n              onClick={() => scrollToNextPage()}\n              aria-label=\"Next page\"\n            >\n              <KeyboardArrowRightIcon />\n            </IconButton>\n          </Fragment>\n        }\n      />\n      <div\n        ref={scrollContainerRef}\n        className={clsx(containerClassName, gridClassName)}\n      >\n        {channel.content?.data.map(item => (\n          <div className={itemClassName} key={`${item.id}-${item.model_type}`}>\n            <ChannelContentGridItem item={item} variant={variant} />\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n}\n","import {ChannelContentProps} from '@app/channels/channel-content';\nimport React, {Fragment} from 'react';\nimport {useCarousel} from '@app/channels/carousel/use-carousel';\nimport {Title} from '@app/titles/models/title';\nimport {TitleRating} from '@app/reviews/title-rating';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport {TitleLink} from '@app/titles/title-link';\nimport {TitleBackdrop} from '@app/titles/title-poster/title-backdrop';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ChevronLeftIcon} from '@common/icons/material/ChevronLeft';\nimport {ChevronRightIcon} from '@common/icons/material/ChevronRight';\nimport {ChannelHeader} from '@app/channels/channel-header/channel-header';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {Link} from 'react-router-dom';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {useChannelContent} from '@common/channels/requests/use-channel-content';\nimport {Channel, ChannelContentItem} from '@common/channels/channel';\n\nexport function ChannelContentSlider({\n  channel,\n  isNested,\n}: ChannelContentProps<Title>) {\n  const {\n    scrollContainerRef,\n    activePage,\n    canScrollBackward,\n    canScrollForward,\n    scrollToNextPage,\n    scrollToPreviousPage,\n  } = useCarousel({rotate: true});\n  const {data: pagination} =\n    useChannelContent<ChannelContentItem<Title>>(channel);\n\n  return (\n    <Fragment>\n      <ChannelHeader\n        channel={channel as Channel}\n        isNested={isNested}\n        margin=\"mb-18\"\n      />\n      <div className=\"gap-24 md:flex\">\n        <div className=\"relative flex-auto\">\n          <div\n            ref={scrollContainerRef}\n            className=\"hidden-scrollbar flex h-full select-none snap-x snap-mandatory snap-always items-center overflow-x-auto\"\n          >\n            {pagination?.data.map((item, index) => (\n              <Slide key={item.id} item={item} index={index} />\n            ))}\n          </div>\n          <div className=\"absolute top-10 z-20 w-full md:top-[170px]\">\n            <div className=\"absolute left-8 hidden md:left-14 md:block\">\n              <IconButton\n                variant=\"outline\"\n                size=\"lg\"\n                color=\"white\"\n                disabled={!canScrollBackward}\n                onClick={() => scrollToPreviousPage()}\n              >\n                <ChevronLeftIcon />\n              </IconButton>\n            </div>\n            <div className=\"absolute right-8 hidden md:right-14 md:block\">\n              <IconButton\n                variant=\"outline\"\n                size=\"lg\"\n                color=\"white\"\n                disabled={!canScrollForward}\n                onClick={() => scrollToNextPage()}\n              >\n                <ChevronRightIcon />\n              </IconButton>\n            </div>\n          </div>\n        </div>\n        <UpNext titles={pagination?.data ?? []} activePage={activePage} />\n      </div>\n    </Fragment>\n  );\n}\n\ninterface SlideProps {\n  item: Title;\n  index: number;\n}\nfunction Slide({item, index}: SlideProps) {\n  return (\n    <div className=\"relative h-full w-full flex-shrink-0 snap-start snap-normal overflow-hidden rounded\">\n      <TitleBackdrop\n        title={item}\n        lazy={index > 0}\n        className=\"min-h-240 md:min-h-0\"\n        wrapperClassName=\"h-full\"\n      />\n      <div className=\"absolute inset-0 isolate flex h-full w-full items-center justify-start gap-24 rounded p-30 text-white md:items-end\">\n        <div className=\"absolute left-0 h-full w-full bg-gradient-to-b from-black/40 max-md:top-0 md:bottom-0 md:h-3/4 md:bg-gradient-to-t md:from-black/100\" />\n        <TitlePoster\n          title={item}\n          size=\"max-h-320\"\n          srcSize=\"md\"\n          className=\"z-10 shadow-md max-md:hidden\"\n        />\n        <div className=\"z-10 text-lg md:max-w-620\">\n          <TitleRating score={item.rating} />\n          <div className=\"my-8 text-2xl md:text-5xl\">\n            <TitleLink title={item} />\n          </div>\n          {item.description && (\n            <p className=\"max-md:hidden\">{item.description}</p>\n          )}\n          {item.primary_video && (\n            <Button\n              variant=\"flat\"\n              color=\"primary\"\n              startIcon={<MediaPlayIcon />}\n              radius=\"rounded-full\"\n              className=\"mt-24 md:min-h-42 md:min-w-144\"\n              elementType={Link}\n              to={getWatchLink(item.primary_video)}\n            >\n              {item.primary_video.category === 'full' ? (\n                <Trans message=\"Watch now\" />\n              ) : (\n                <Trans message=\"Play trailer\" />\n              )}\n            </Button>\n          )}\n        </div>\n      </div>\n    </div>\n  );\n}\n\ninterface UpNextProps {\n  titles: Title[];\n  activePage: number;\n}\nfunction UpNext({titles, activePage}: UpNextProps) {\n  const itemCount = titles.length;\n  const start = activePage + 1;\n  const end = start + 3;\n  const items = titles.slice(start, end);\n  if (end > itemCount) {\n    items.push(...titles.slice(0, end - itemCount));\n  }\n\n  return (\n    <AnimatePresence initial={false} mode=\"wait\">\n      <div className=\"w-1/4 max-w-200 flex-shrink-0 max-md:hidden\">\n        <div className=\"mb-12 text-lg font-semibold\">\n          <Trans message=\"Up next\" />\n        </div>\n        <div className=\"flex flex-col gap-24\">\n          {items.map(item => (\n            <m.div\n              key={item.id}\n              className=\"relative flex-auto\"\n              initial={{opacity: 0}}\n              animate={{opacity: 1}}\n              exit={{opacity: 0}}\n              transition={{duration: 0.2}}\n            >\n              <TitleBackdrop\n                title={item}\n                className=\"mb-6 rounded\"\n                size=\"w-full\"\n                srcSize=\"md\"\n                wrapWithLink\n                showPlayButton\n              />\n              <div className=\"mb-2 overflow-hidden overflow-ellipsis whitespace-nowrap text-sm\">\n                <TitleLink title={item} className=\"text-base font-medium\" />\n              </div>\n              <div>\n                <TitleRating score={item.rating} className=\"text-sm\" />\n              </div>\n            </m.div>\n          ))}\n        </div>\n      </div>\n    </AnimatePresence>\n  );\n}\n","import {NewsArticle} from '@app/titles/models/news-article';\nimport clsx from 'clsx';\nimport {OpenInNewIcon} from '@common/icons/material/OpenInNew';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport React from 'react';\n\ninterface SourceLinkProps {\n  article: NewsArticle;\n  className?: string;\n}\nexport function NewsArticleSourceLink({article, className}: SourceLinkProps) {\n  return (\n    <div className={clsx('flex items-center gap-4 text-primary', className)}>\n      <OpenInNewIcon size=\"xs\" className=\"flex-shrink-0\" />\n      <a\n        href={article.source_url}\n        target=\"_blank\"\n        rel=\"noreferrer\"\n        className={clsx(\n          LinkStyle,\n          'whitespace-nowrap overflow-hidden overflow-ellipsis'\n        )}\n      >\n        {article.source}\n      </a>\n    </div>\n  );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {NewsArticle} from '@app/titles/models/news-article';\n\ninterface Props {\n  article: NewsArticle;\n}\nexport function NewsArticleByline({article}: Props) {\n  return article.byline ? (\n    <span className=\"whitespace-nowrap\">\n      <Trans message=\"By :name\" values={{name: article.byline}} />\n    </span>\n  ) : null;\n}\n","import {ChannelContentProps} from '@app/channels/channel-content';\nimport React from 'react';\nimport {NewsArticle} from '@app/titles/models/news-article';\nimport {BulletSeparatedItems} from '@app/titles/bullet-separated-items';\nimport {ChannelHeader} from '@app/channels/channel-header/channel-header';\nimport {NewsArticleImage} from '@app/news/news-article-image';\nimport {NewsArticleLink} from '@app/news/news-article-link';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {NewsArticleSourceLink} from '@app/news/news-article-source-link';\nimport {NewsArticleByline} from '@app/news/news-article-byline';\nimport {useChannelContent} from '@common/channels/requests/use-channel-content';\nimport {Channel, ChannelContentItem} from '@common/channels/channel';\nimport {\n  PaginationControls,\n  PaginationControlsType,\n} from '@common/ui/navigation/pagination-controls';\n\nexport function ChannelContentNews({\n  channel,\n  isNested,\n}: ChannelContentProps<NewsArticle>) {\n  const shouldPaginate = !isNested;\n  const query = useChannelContent<ChannelContentItem<NewsArticle>>(\n    channel,\n    null,\n    {\n      paginate: shouldPaginate,\n    },\n  );\n\n  return (\n    <div>\n      <ChannelHeader channel={channel as Channel} isNested={isNested} />\n      {shouldPaginate && (\n        <PaginationControls\n          pagination={query.data}\n          type={channel.config.paginationType as PaginationControlsType}\n          className=\"mb-34\"\n        />\n      )}\n      <div className=\"flex gap-34\">\n        <div className=\"w-240 flex-shrink-0\">\n          {query.data?.data\n            .slice(0, 3)\n            .map(article => (\n              <LeftColArticle\n                key={article.id}\n                article={article}\n                className=\"mb-14\"\n              />\n            ))}\n        </div>\n        <div className=\"flex-auto\">\n          {query.data?.data.slice(3, 12).map(article => (\n            <div key={article.id} className=\"mb-12 flex items-center gap-14\">\n              <NewsArticleImage article={article} size=\"w-84 h-84\" />\n              <div className=\"flex-auto\">\n                <NewsArticleLink article={article} className=\"font-semibold\" />\n                <BulletSeparatedItems className=\"text-sm\">\n                  <FormattedDate date={article.created_at} />\n                  <NewsArticleByline article={article} />\n                  <NewsArticleSourceLink article={article} />\n                </BulletSeparatedItems>\n              </div>\n            </div>\n          ))}\n        </div>\n      </div>\n      {shouldPaginate && (\n        <PaginationControls\n          pagination={query.data}\n          type={channel.config.paginationType as PaginationControlsType}\n          className=\"mt-34\"\n          scrollToTop\n        />\n      )}\n    </div>\n  );\n}\n\ninterface LeftColArticleProps {\n  article: NewsArticle;\n  className?: string;\n}\nfunction LeftColArticle({article, className}: LeftColArticleProps) {\n  return (\n    <div className={className}>\n      <NewsArticleImage article={article} size=\"aspect-video w-full\" />\n      <NewsArticleLink\n        article={article}\n        className=\"mt-10 block text-sm font-semibold\"\n      />\n      <div className=\"mt-8 text-xs text-muted\">\n        <NewsArticleByline article={article} />\n        <NewsArticleSourceLink article={article} className=\"mt-4\" />\n      </div>\n    </div>\n  );\n}\n","import {TITLE_MODEL} from '@app/titles/models/title';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {TitleLink} from '@app/titles/title-link';\nimport {ChannelContentModel} from '@app/admin/channels/channel-content-config';\nimport {NEWS_ARTICLE_MODEL} from '@app/titles/models/news-article';\nimport {NewsArticleImage} from '@app/news/news-article-image';\nimport {NewsArticleLink} from '@app/news/news-article-link';\nimport {BulletSeparatedItems} from '@app/titles/bullet-separated-items';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {NewsArticleSourceLink} from '@app/news/news-article-source-link';\nimport {PERSON_MODEL} from '@app/titles/models/person';\nimport {PersonPoster} from '@app/people/person-poster/person-poster';\nimport {PersonLink} from '@app/people/person-link';\nimport {KnownForCompact} from '@app/people/known-for-compact';\nimport React from 'react';\nimport {FormattedDuration} from '@common/i18n/formatted-duration';\nimport {InteractableRating} from '@app/reviews/interactable-rating';\n\ninterface Props {\n  item: ChannelContentModel;\n}\nexport function ChannelContentListItem({item}: Props) {\n  switch (item.model_type) {\n    case TITLE_MODEL:\n      return (\n        <div className=\"flex items-start gap-24 mb-24\">\n          <TitlePoster title={item} srcSize=\"md\" size=\"w-128\" showPlayButton />\n          <div className=\"flex-auto min-w-0 pt-12\">\n            <TitleLink title={item} className=\"font-medium\" />\n            <BulletSeparatedItems className=\"text-sm mt-4\">\n              {item.runtime ? (\n                <FormattedDuration minutes={item.runtime} verbose />\n              ) : null}\n              {item.certification && (\n                <span className=\"uppercase\">{item.certification}</span>\n              )}\n            </BulletSeparatedItems>\n            {item.rating && item.status !== 'upcoming' ? (\n              <InteractableRating size=\"md\" title={item} className=\"my-12\" />\n            ) : (\n              <div className=\"my-12\">\n                <FormattedDate date={item.release_date} />\n              </div>\n            )}\n            {item.description ? (\n              <p className=\"text-sm\">{item.description}</p>\n            ) : null}\n          </div>\n        </div>\n      );\n    case PERSON_MODEL:\n      return (\n        <div className=\"flex items-start gap-24 mb-24\">\n          <PersonPoster person={item} srcSize=\"md\" size=\"w-128\" />\n          <div className=\"flex-auto min-w-0 pt-12\">\n            <PersonLink person={item} className=\"block font-medium text-lg\" />\n            {item.primary_credit ? (\n              <div className=\"text-sm mt-4\">\n                <KnownForCompact person={item} />\n              </div>\n            ) : null}\n            <p className=\"text-sm mt-12\">{item.description}</p>\n          </div>\n        </div>\n      );\n    case NEWS_ARTICLE_MODEL:\n      return (\n        <div className=\"flex items-start gap-14 mb-44\">\n          <NewsArticleImage article={item} className=\"aspect-poster max-w-90\" />\n          <div className=\"mt-6 text-base\">\n            <NewsArticleLink article={item} className=\"font-medium\" />\n            <p className=\"text-sm mt-10\">{item.body}</p>\n            <BulletSeparatedItems className=\"text-xs mt-10\">\n              <FormattedDate date={item.created_at} />\n              <NewsArticleSourceLink article={item} />\n            </BulletSeparatedItems>\n          </div>\n        </div>\n      );\n    default:\n      return null;\n  }\n}\n","import {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport React, {Fragment, ReactNode} from 'react';\nimport {ChannelContentProps} from '@app/channels/channel-content';\nimport {useInfiniteChannelContent} from '@common/channels/requests/use-infinite-channel-content';\nimport {ChannelHeader} from '@app/channels/channel-header/channel-header';\nimport {ChannelContentModel} from '@app/admin/channels/channel-content-config';\nimport {ChannelContentListItem} from '@app/channels/channel-content-list-item';\nimport {useChannelContent} from '@common/channels/requests/use-channel-content';\nimport clsx from 'clsx';\nimport {\n  PaginationControls,\n  PaginationControlsType,\n} from '@common/ui/navigation/pagination-controls';\n\nexport function ChannelContentList(props: ChannelContentProps) {\n  const isInfiniteScroll =\n    !props.isNested &&\n    (!props.channel.config.paginationType ||\n      props.channel.config.paginationType === 'infiniteScroll');\n  return (\n    <Fragment>\n      <ChannelHeader {...props} />\n      {isInfiniteScroll ? (\n        <InfiniteScrollList {...props} />\n      ) : (\n        <PaginatedList {...props} />\n      )}\n    </Fragment>\n  );\n}\n\nfunction InfiniteScrollList({channel}: ChannelContentProps) {\n  const query = useInfiniteChannelContent<ChannelContentModel>(channel);\n  return (\n    <Content\n      content={query.items}\n      className={clsx('transition-opacity', query.isReloading && 'opacity-70')}\n    >\n      <InfiniteScrollSentinel query={query} />\n    </Content>\n  );\n}\n\nfunction PaginatedList({channel, isNested}: ChannelContentProps) {\n  const shouldPaginate = !isNested;\n  const query = useChannelContent(channel, null, {paginate: shouldPaginate});\n  return (\n    <div\n      className={clsx(\n        'transition-opacity',\n        query.isPlaceholderData && 'opacity-70',\n      )}\n    >\n      {shouldPaginate && (\n        <PaginationControls\n          pagination={query.data}\n          type={channel.config.paginationType as PaginationControlsType}\n          className=\"mb-24\"\n        />\n      )}\n      <Content content={query.data?.data} />\n      {shouldPaginate && (\n        <PaginationControls\n          pagination={query.data}\n          type={channel.config.paginationType as PaginationControlsType}\n          className=\"mt-24\"\n          scrollToTop\n        />\n      )}\n    </div>\n  );\n}\n\ninterface ContentProps {\n  content: ChannelContentModel[] | undefined;\n  children?: ReactNode;\n  className?: string;\n}\nfunction Content({content = [], children, className}: ContentProps) {\n  return (\n    <div className={className}>\n      {content.map(item => (\n        <ChannelContentListItem\n          key={`${item.id}-${item.model_type}`}\n          item={item}\n        />\n      ))}\n      {children}\n    </div>\n  );\n}\n","import React, {Fragment} from 'react';\nimport {Channel, CHANNEL_MODEL} from '@common/channels/channel';\nimport {ChannelContentGrid} from '@app/channels/content-grid/channel-content-grid';\nimport {ChannelHeader} from '@app/channels/channel-header/channel-header';\nimport {\n  ChannelContentModel,\n  Layout,\n} from '@app/admin/channels/channel-content-config';\nimport {ChannelContentCarousel} from '@app/channels/carousel/channel-content-carousel';\nimport {ChannelContentSlider} from '@app/channels/channel-content-slider';\nimport {ChannelContentNews} from '@app/channels/channel-content-news';\nimport {ChannelContentList} from '@app/channels/channel-content-list';\nimport {Title} from '@app/titles/models/title';\nimport {NewsArticle} from '@app/titles/models/news-article';\nimport {useChannelLayouts} from '@app/channels/channel-header/use-channel-layouts';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {Trans} from '@common/i18n/trans';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport todoImage from '@app/admin/lists/todo.svg';\n\nexport interface ChannelContentProps<\n  T extends ChannelContentModel = ChannelContentModel\n> {\n  channel: Channel<T>;\n  isNested: boolean;\n}\nexport function ChannelContent(props: ChannelContentProps) {\n  // only show no results message in non nested channels\n  if (props.isNested && !props.channel.content?.data.length) {\n    return null;\n  }\n  if (props.channel.config.contentModel === CHANNEL_MODEL) {\n    return <NestedChannels {...(props as ChannelContentProps<Channel>)} />;\n  } else {\n    return (\n      <Fragment>\n        <ChannelLayout {...props} />\n        <NoResultsMessage channel={props.channel} />\n      </Fragment>\n    );\n  }\n}\n\ninterface NestedChannelsProps {\n  channel: ChannelContentProps['channel'];\n}\nfunction NoResultsMessage({channel}: NestedChannelsProps) {\n  if (channel.content?.data.length === 0) {\n    return (\n      <IllustratedMessage\n        className=\"mt-60\"\n        image={<SvgImage src={todoImage} />}\n        title={\n          channel.type === 'list' ? (\n            <Trans message=\"This list does not have any content yet.\" />\n          ) : (\n            <Trans message=\"This channel does not have any content yet.\" />\n          )\n        }\n      />\n    );\n  }\n  return null;\n}\n\nexport function ChannelLayout(props: ChannelContentProps) {\n  const {channel, isNested} = props;\n  const {selectedLayout} = useChannelLayouts(channel);\n  const layout = (\n    isNested ? channel.config.nestedLayout : selectedLayout\n  ) as Layout;\n\n  switch (layout) {\n    case 'grid':\n      return <ChannelContentGrid {...props} variant=\"portrait\" />;\n    case 'landscapeGrid':\n      return <ChannelContentGrid {...props} variant=\"landscape\" />;\n    case 'list':\n      return <ChannelContentList {...props} />;\n    case 'carousel':\n      return <ChannelContentCarousel {...props} variant=\"portrait\" />;\n    case 'landscapeCarousel':\n      return <ChannelContentCarousel {...props} variant=\"landscape\" />;\n    case 'slider':\n      return (\n        <ChannelContentSlider {...(props as ChannelContentProps<Title>)} />\n      );\n    case 'news':\n      return (\n        <ChannelContentNews {...(props as ChannelContentProps<NewsArticle>)} />\n      );\n    default:\n      return null;\n  }\n}\n\nfunction NestedChannels({channel, isNested}: ChannelContentProps) {\n  return (\n    <Fragment>\n      <ChannelHeader channel={channel} isNested={isNested} />\n      {channel.content?.data.map(nestedChannel => (\n        <div key={nestedChannel.id} className=\"mb-40 md:mb-50\">\n          <ChannelContent\n            channel={nestedChannel as Channel<Channel>}\n            isNested\n          />\n        </div>\n      ))}\n    </Fragment>\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 {Title} from '@app/titles/models/title';\nimport {Person} from '@app/titles/models/person';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nexport interface SearchResponse extends BackendResponse {\n  query: string;\n  results: (Title | Person)[];\n}\n\nexport function useSearchResults(\n  loader: 'searchPage' | 'searchAutocomplete',\n  query: string = '',\n) {\n  query = query.trim();\n  // sending only dot will cause an error as browser strips it out\n  if (query === '.') {\n    query = '';\n  }\n  return useQuery({\n    queryKey: ['search', query, loader],\n    queryFn: ({signal}) => search(loader, query, signal),\n    enabled: !!query,\n    placeholderData: !!query ? keepPreviousData : undefined,\n    initialData: () => {\n      const data = getBootstrapData().loaders?.[loader];\n      if (query && data?.query == query) {\n        return data;\n      }\n    },\n  });\n}\n\nasync function search(loader: string, query: string, signal: AbortSignal) {\n  await new Promise(resolve => setTimeout(resolve, 300));\n  return apiClient\n    .get<SearchResponse>(`search/${encodeURIComponent(query)}`, {\n      params: {loader},\n      signal,\n    })\n    .then(response => response.data);\n}\n","import {SearchIcon} from '@common/icons/material/Search';\nimport {message} from '@common/i18n/message';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {ComboBox} from '@common/ui/forms/combobox/combobox';\nimport React, {useState} from 'react';\nimport {useTrans} from '@common/i18n/use-trans';\nimport clsx from 'clsx';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useParams} from 'react-router-dom';\nimport {useSearchResults} from '@app/search/requests/use-search-results';\nimport {TITLE_MODEL} from '@app/titles/models/title';\nimport {getTitleLink} from '@app/titles/title-link';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {PERSON_MODEL} from '@app/titles/models/person';\nimport {getPersonLink} from '@app/people/person-link';\nimport {PersonPoster} from '@app/people/person-poster/person-poster';\nimport {KnownForCompact} from '@app/people/known-for-compact';\nimport {Trans} from '@common/i18n/trans';\n\ninterface SearchAutocompleteProps {\n  className?: string;\n}\nexport function SearchAutocomplete({className}: SearchAutocompleteProps) {\n  const {searchQuery} = useParams();\n  const {trans} = useTrans();\n  const navigate = useNavigate();\n  const [query, setQuery] = useState(searchQuery || '');\n  const [isOpen, setIsOpen] = useState(false);\n  const {isFetching, data} = useSearchResults('searchAutocomplete', query);\n\n  return (\n    <form\n      onSubmit={e => {\n        e.preventDefault();\n        if (query.trim().length) {\n          setIsOpen(false);\n          navigate(`/search/${encodeURIComponent(query.trim())}`);\n        }\n      }}\n      className={clsx(\n        'flex max-w-580 flex-auto items-center rounded bg-chip/40 text',\n        className,\n      )}\n    >\n      <ComboBox\n        size=\"sm\"\n        startAdornment={\n          <button type=\"submit\" aria-label={trans(message('Search'))}>\n            <SearchIcon className=\"flex-shrink-0 text-muted\" />\n          </button>\n        }\n        className=\"w-full\"\n        offset={6}\n        inputClassName=\"w-full outline-none text-sm placeholder:text-muted\"\n        isAsync\n        hideEndAdornment\n        placeholder={trans(\n          message('Search for movies, tv shows and people...'),\n        )}\n        isLoading={isFetching}\n        inputValue={query}\n        onInputValueChange={setQuery}\n        clearInputOnItemSelection\n        blurReferenceOnItemSelection\n        selectionMode=\"none\"\n        openMenuOnFocus\n        floatingMaxHeight={670}\n        isOpen={isOpen}\n        onOpenChange={setIsOpen}\n        autoFocusFirstItem={false}\n        focusLoopingMode=\"deselect\"\n      >\n        {data?.results?.map(result => {\n          switch (result.model_type) {\n            case TITLE_MODEL:\n              return (\n                <Item\n                  key={result.id}\n                  value={result.id}\n                  onSelected={() => {\n                    navigate(getTitleLink(result));\n                  }}\n                  startIcon={\n                    <TitlePoster title={result} srcSize=\"sm\" size=\"w-46\" />\n                  }\n                  description={\n                    <div>\n                      <div className=\"mb-4\">{result.year}</div>\n                      <div>\n                        {result.is_series ? (\n                          <Trans message=\"Tv series\" />\n                        ) : (\n                          <Trans message=\"Movie\" />\n                        )}\n                      </div>\n                    </div>\n                  }\n                  textLabel={result.name}\n                >\n                  {result.name}\n                </Item>\n              );\n            case PERSON_MODEL:\n              return (\n                <Item\n                  key={result.id}\n                  value={result.id}\n                  onSelected={() => {\n                    navigate(getPersonLink(result));\n                  }}\n                  startIcon={\n                    <PersonPoster\n                      person={result}\n                      srcSize=\"sm\"\n                      className=\"w-56\"\n                    />\n                  }\n                  description={<KnownForCompact person={result} />}\n                  textLabel={result.name}\n                >\n                  {result.name}\n                </Item>\n              );\n          }\n        })}\n      </ComboBox>\n    </form>\n  );\n}\n","import {Navbar} from '@common/ui/navigation/navbar/navbar';\nimport {SearchAutocomplete} from '@app/search/search-autocomplete';\nimport clsx from 'clsx';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {Link} from 'react-router-dom';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\ninterface Props {\n  position?: 'fixed' | 'relative';\n}\nexport function MainNavbar({position = 'relative'}: Props) {\n  return (\n    <Navbar\n      size=\"md\"\n      menuPosition=\"primary\"\n      className={clsx(position, 'z-40 w-full flex-shrink-0')}\n      border=\"border-none\"\n      alwaysDarkMode\n    >\n      <Tooltip label={<Trans message=\"Search\" />}>\n        <IconButton elementType={Link} to=\"/search\" className=\"md:hidden\">\n          <SearchIcon />\n        </IconButton>\n      </Tooltip>\n      <SearchAutocomplete className=\"max-md:hidden\" />\n    </Navbar>\n  );\n}\n","import {useAuth} from '../../auth/use-auth';\nimport {memo, useEffect, useId, useMemo, useRef} from 'react';\nimport lazyLoader from '../../utils/http/lazy-loader';\nimport clsx from 'clsx';\nimport {useSettings} from '../../core/settings/use-settings';\nimport dot from 'dot-object';\nimport {Settings} from '@common/core/settings/settings';\nimport {getScrollParent} from '@react-aria/utils';\n\ninterface AdHostProps {\n  slot: keyof Omit<NonNullable<Settings['ads']>, 'disable'>;\n  className?: string;\n}\nexport function AdHost({slot, className}: AdHostProps) {\n  const settings = useSettings();\n  const {isSubscribed} = useAuth();\n  const adCode = useMemo(() => {\n    return dot.pick(`ads.${slot}`, settings);\n  }, [slot, settings]);\n\n  if (settings.ads?.disable || isSubscribed || !adCode) return null;\n\n  return <InvariantAd className={className} slot={slot} adCode={adCode} />;\n}\n\ninterface InvariantAdProps {\n  slot: string;\n  adCode: string;\n  className?: string;\n}\nconst InvariantAd = memo(\n  ({slot, adCode, className}: InvariantAdProps) => {\n    const ref = useRef<HTMLDivElement>(null);\n\n    const id = useId();\n\n    useEffect(() => {\n      if (ref.current) {\n        loadAdScripts(adCode, ref.current).then(() => {\n          executeAdJavascript(adCode, id);\n        });\n      }\n      return () => {\n        // @ts-ignore\n        delete window['google_ad_modifications'];\n      };\n    }, [adCode, id]);\n\n    // remove height modifications added by adsense\n    useEffect(() => {\n      if (ref.current) {\n        const scrollParent = getScrollParent(ref.current) as HTMLElement;\n        if (scrollParent) {\n          const observer = new MutationObserver(function () {\n            scrollParent.style.height = '';\n            scrollParent.style.minHeight = '';\n          });\n          observer.observe(scrollParent, {\n            attributes: true,\n            attributeFilter: ['style'],\n          });\n          return () => observer.disconnect();\n        }\n      }\n    }, []);\n\n    return (\n      <div\n        ref={ref}\n        id={id}\n        className={clsx(\n          'ad-host flex max-h-[600px] min-h-90 w-full max-w-full items-center justify-center overflow-hidden',\n          `${slot.replace(/\\./g, '-')}-host`,\n          className,\n        )}\n        dangerouslySetInnerHTML={{__html: getAdHtml(adCode)}}\n      ></div>\n    );\n  },\n  () => {\n    // never re-render\n    return false;\n  },\n);\n\nfunction getAdHtml(adCode: string) {\n  // strip out all script tags from ad code and leave only html\n  return adCode\n    ?.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '')\n    .trim();\n}\n\n// Load any external scripts needed by ad.\nfunction loadAdScripts(adCode: string, parentEl: HTMLDivElement): Promise<any> {\n  const promises = [];\n\n  // load ad code script\n  const pattern = /<script.*?src=['\"](.*?)['\"]/g;\n  let match;\n\n  while ((match = pattern.exec(adCode))) {\n    if (match[1]) {\n      promises.push(lazyLoader.loadAsset(match[1], {type: 'js', parentEl}));\n    }\n  }\n\n  return Promise.all(promises);\n}\n\n// Execute ad code javascript and replace document.write if needed.\nfunction executeAdJavascript(adCode: string, id: string) {\n  // find any ad code javascript that needs to be executed\n  const pattern = /<script\\b[^>]*>([\\s\\S]*?)<\\/script>/g;\n  let content;\n\n  while ((content = pattern.exec(adCode))) {\n    if (content[1]) {\n      const r = `var d = document.createElement('div'); d.innerHTML = $1; document.getElementById('${id}').appendChild(d.firstChild);`;\n      const toEval = content[1].replace(/document.write\\((.+?)\\);/, r);\n      eval(toEval);\n    }\n  }\n}\n","import {Footer} from '@common/ui/footer/footer';\nimport {MainNavbar} from '@app/main-navbar';\nimport {ReactNode} from 'react';\nimport {useScrollToTop} from '@common/ui/navigation/use-scroll-to-top';\nimport {AdHost} from '@common/admin/ads/ad-host';\n\ninterface Props {\n  children: ReactNode;\n}\nexport function SitePageLayout({children}: Props) {\n  useScrollToTop();\n  return (\n    <div className=\"flex flex-col\">\n      <MainNavbar />\n      <div className=\"flex-auto\">\n        <AdHost slot=\"general_top\" className=\"py-24\" />\n        <div className=\"relative min-h-[1000px] overflow-hidden\">\n          {children}\n        </div>\n        <AdHost slot=\"general_bottom\" className=\"py-24\" />\n      </div>\n      <Footer className=\"container mx-auto mt-48 flex-shrink-0 px-24\" />\n    </div>\n  );\n}\n","import React from 'react';\nimport {PageStatus} from '@common/http/page-status';\nimport {useChannel} from '@common/channels/requests/use-channel';\nimport {ChannelContent} from '@app/channels/channel-content';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {Channel} from '@common/channels/channel';\nimport {ChannelContentModel} from '@app/admin/channels/channel-content-config';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\n\ninterface ChannelPageProps {\n  slugOrId?: string | number;\n  type?: 'list' | 'channel';\n}\nexport function ChannelPage({slugOrId, type = 'channel'}: ChannelPageProps) {\n  const query = useChannel(slugOrId, 'channelPage', {channelType: type});\n\n  let content = null;\n\n  if (query.data) {\n    content = (\n      <div>\n        <PageMetaTags query={query} />\n        <div className=\"pb-24\">\n          <div className=\"container mx-auto p-14 @container md:p-24\">\n            <ChannelContent\n              channel={query.data.channel as Channel<ChannelContentModel>}\n              // set key to force re-render when channel changes\n              key={query.data.channel.id}\n              isNested={false}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  } else {\n    content = (\n      <PageStatus\n        query={query}\n        loaderClassName=\"absolute inset-0 m-auto\"\n        loaderIsScreen={false}\n      />\n    );\n  }\n\n  return <SitePageLayout>{content}</SitePageLayout>;\n}\n","import {TitleImage} from '@app/titles/models/title-image';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ImageZoomDialog} from '@common/ui/overlays/dialog/image-zoom-dialog';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {ImageSize, useImageSrc} from '@app/images/use-image-src';\nimport {ReactNode} from 'react';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\ninterface Props {\n  images: TitleImage[];\n  count?: number;\n  heading?: ReactNode;\n  srcSize?: ImageSize;\n}\nexport function TitlePageImageGrid({images, count, heading, srcSize}: Props) {\n  const isMobile = useIsMobileMediaQuery();\n  const {trans} = useTrans();\n  if (!images?.length) return null;\n\n  if (!count) {\n    count = isMobile ? 6 : 5;\n  }\n\n  return (\n    <div className=\"mt-48\">\n      {heading}\n      <div className=\"grid grid-cols-3 gap-12 md:grid-cols-5 md:gap-24\">\n        {images.slice(0, count).map((image, index) => (\n          <DialogTrigger type=\"modal\" key={image.id}>\n            <ButtonBase\n              aria-label={trans(message('Image :index', {values: {index}}))}\n            >\n              <ImageItem image={image} srcSize={srcSize} />\n            </ButtonBase>\n            <ImageZoomDialog\n              images={images.map(img => img.url)}\n              defaultActiveIndex={index}\n            />\n          </DialogTrigger>\n        ))}\n      </div>\n    </div>\n  );\n}\n\ninterface ImageProps {\n  image: TitleImage;\n  srcSize?: ImageSize;\n}\nfunction ImageItem({image, srcSize = 'md'}: ImageProps) {\n  const src = useImageSrc(image.url, {size: srcSize});\n  return (\n    <img\n      className=\"aspect-square w-full cursor-pointer rounded object-cover\"\n      src={src}\n      alt=\"\"\n    />\n  );\n}\n","import {PersonPoster} from '@app/people/person-poster/person-poster';\nimport {PersonLink} from '@app/people/person-link';\nimport {TitleCredit} from '@app/titles/models/title';\nimport clsx from 'clsx';\nimport {Fragment} from 'react';\nimport {Trans} from '@common/i18n/trans';\n\ninterface Props {\n  credits: TitleCredit[];\n  className?: string;\n}\nexport function TitleCreditsGrid({credits, className}: Props) {\n  if (!credits.length) {\n    return (\n      <div className=\"text-muted italic\">\n        <Trans message=\"We've no cast information for this title yet.\" />\n      </div>\n    );\n  }\n\n  return (\n    <div\n      className={clsx('grid gap-14 md:gap-20 title-credits-grid', className)}\n    >\n      {credits.map(credit => (\n        <div\n          key={credit.pivot.id}\n          className=\"flex items-center gap-14 md:gap-20\"\n        >\n          <PersonPoster\n            rounded\n            person={credit}\n            size=\"w-70 md:w-96\"\n            srcSize=\"md\"\n          />\n          <div className=\"max-md:text-sm\">\n            <PersonLink className=\"block font-bold\" person={credit} />\n            <div className=\"text-muted\">\n              <Description credit={credit} />\n            </div>\n          </div>\n        </div>\n      ))}\n    </div>\n  );\n}\n\ninterface DescriptionProps {\n  credit: TitleCredit;\n}\nfunction Description({credit}: DescriptionProps) {\n  if (credit.pivot.department === 'actors') {\n    return <Fragment>{credit.pivot.character}</Fragment>;\n  }\n  return (\n    <span className=\"capitalize\">\n      <Trans message={credit.pivot.job} />\n    </span>\n  );\n}\n","import {TitleCredit} from '@app/titles/models/title';\nimport {Trans} from '@common/i18n/trans';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Button} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\nimport {ArrowForwardIcon} from '@common/icons/material/ArrowForward';\nimport {TitleCreditsGrid} from '@app/titles/pages/title-page/title-credits-grid/title-credits-grid';\n\ninterface Props {\n  credits: TitleCredit[] | undefined;\n}\nexport function TitlePageCast({credits = []}: Props) {\n  const cast = credits.filter(credit => credit.pivot.department === 'actors');\n  return (\n    <div className=\"mt-48\">\n      <SiteSectionHeading>\n        <Trans message=\"Cast\" />\n      </SiteSectionHeading>\n      <TitleCreditsGrid credits={cast} />\n      <Button\n        className=\"mt-24\"\n        variant=\"outline\"\n        color=\"primary\"\n        elementType={Link}\n        to=\"full-credits\"\n        endIcon={<ArrowForwardIcon />}\n      >\n        <Trans message=\"All cast and crew\" />\n      </Button>\n    </div>\n  );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {Title} from '@app/titles/models/title';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\n\ninterface Response extends BackendResponse {\n  titles: Title[];\n}\n\nexport function useRelatedTitles(titleId: number) {\n  return useQuery({\n    queryKey: ['titles', titleId, 'related'],\n    queryFn: () => fetchRelatedTitles(titleId!),\n  });\n}\n\nfunction fetchRelatedTitles(titleId: number | string) {\n  return apiClient\n    .get<Response>(`titles/${titleId}/related`)\n    .then(response => response.data);\n}\n","import {Title} from '@app/titles/models/title';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Trans} from '@common/i18n/trans';\nimport {useRelatedTitles} from '@app/titles/requests/use-related-titles';\nimport {useCarousel} from '@app/channels/carousel/use-carousel';\nimport React, {Fragment} from 'react';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {KeyboardArrowLeftIcon} from '@common/icons/material/KeyboardArrowLeft';\nimport {KeyboardArrowRightIcon} from '@common/icons/material/KeyboardArrowRight';\nimport clsx from 'clsx';\nimport {TitlePortraitGridItem} from '@app/channels/content-grid/title-grid-item';\n\ninterface Props {\n  title: Title;\n}\nexport function RelatedTitlesPanel({title}: Props) {\n  const {data} = useRelatedTitles(title.id);\n\n  if (!data || data.titles.length === 0) {\n    return null;\n  }\n\n  return <RelatedTitlesCarousel titles={data.titles} />;\n}\n\ninterface RelatedTitlesCarouselProps {\n  titles: Title[];\n}\nfunction RelatedTitlesCarousel({titles}: RelatedTitlesCarouselProps) {\n  const {\n    scrollContainerRef,\n    canScrollForward,\n    canScrollBackward,\n    scrollToPreviousPage,\n    scrollToNextPage,\n    containerClassName,\n    itemClassName,\n  } = useCarousel();\n\n  return (\n    <div className=\"mt-48\">\n      <SiteSectionHeading\n        actions={\n          <Fragment>\n            <IconButton\n              disabled={!canScrollBackward}\n              onClick={() => scrollToPreviousPage()}\n              aria-label=\"Scroll left\"\n            >\n              <KeyboardArrowLeftIcon />\n            </IconButton>\n            <IconButton\n              disabled={!canScrollForward}\n              onClick={() => scrollToNextPage()}\n              aria-label=\"Scroll right\"\n            >\n              <KeyboardArrowRightIcon />\n            </IconButton>\n          </Fragment>\n        }\n      >\n        <Trans message=\"More like this\" />\n      </SiteSectionHeading>\n      <div\n        ref={scrollContainerRef}\n        className={clsx(containerClassName, 'content-grid-portrait')}\n      >\n        {titles.map(item => (\n          <div className={itemClassName} key={item.id}>\n            <TitlePortraitGridItem item={item} />\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n}\n","import {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {SeasonPoster} from '@app/seasons/season-poster';\nimport {SeasonLink} from '@app/seasons/season-link';\nimport {GetTitleResponse} from '@app/titles/requests/use-title';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {useTitleSeasons} from '@app/titles/requests/use-title-seasons';\n\ninterface Props {\n  data: GetTitleResponse;\n}\nexport function TitlePageSeasonGrid({data: {title, seasons}}: Props) {\n  const query = useTitleSeasons(title.id, seasons);\n  return (\n    <div className=\"mt-48\">\n      <SiteSectionHeading\n        titleAppend={seasons?.total ? `(${seasons.total})` : undefined}\n      >\n        <Trans message=\"Seasons\" />\n      </SiteSectionHeading>\n      <div>\n        <div className=\"grid grid-cols-4 gap-14 sm:grid-cols-6 lg:grid-cols-8\">\n          {query.items.map(season => (\n            <div key={season.id}>\n              <SeasonPoster\n                title={title}\n                season={season}\n                srcSize=\"sm\"\n                className=\"aspect-poster flex-shrink-0\"\n              />\n              <div className=\"mt-4\">\n                <SeasonLink\n                  className=\"text-sm\"\n                  title={title}\n                  seasonNumber={season.number}\n                  color=\"primary\"\n                />\n                <div className=\"text-xs text-muted\">\n                  <FormattedDate\n                    date={season.release_date}\n                    options={{year: 'numeric'}}\n                  />\n                </div>\n              </div>\n            </div>\n          ))}\n        </div>\n        <InfiniteScrollSentinel\n          query={query}\n          variant=\"loadMore\"\n          loaderMarginTop=\"mt-14\"\n          size=\"sm\"\n        />\n      </div>\n    </div>\n  );\n}\n","import {memo, ReactNode} from 'react';\nimport {Trans} from '@common/i18n/trans';\nimport {BulletSeparatedItems} from '@app/titles/bullet-separated-items';\nimport {PersonLink} from '@app/people/person-link';\nimport {GroupTitleCredits} from '@app/titles/requests/use-title';\n\ninterface Props {\n  credits: GroupTitleCredits | undefined;\n}\nexport const CompactCredits = memo(({credits = {}}: Props) => (\n  <div className=\"mt-16 flex flex-col gap-14 border-t pt-16\">\n    {credits.creators?.length ? (\n      <PeopleDetail label={<Trans message=\"Created by\" />}>\n        <BulletSeparatedItems className=\"hidden-scrollbar overflow-x-auto\">\n          {credits.creators.slice(0, 3).map(creator => (\n            <PersonLink\n              person={creator}\n              key={creator.id}\n              color=\"primary\"\n              className=\"whitespace-nowrap\"\n            />\n          ))}\n        </BulletSeparatedItems>\n      </PeopleDetail>\n    ) : null}\n    {credits.directing?.length ? (\n      <PeopleDetail\n        label={\n          <Trans\n            message=\"[one Director|other Directors]\"\n            values={{count: credits.directing.length}}\n          />\n        }\n      >\n        <BulletSeparatedItems className=\"hidden-scrollbar overflow-x-auto\">\n          {credits.directing.slice(0, 3).map(director => (\n            <PersonLink\n              person={director}\n              key={director.id}\n              color=\"primary\"\n              className=\"whitespace-nowrap\"\n            />\n          ))}\n        </BulletSeparatedItems>\n      </PeopleDetail>\n    ) : null}\n    {credits.writing?.length ? (\n      <PeopleDetail\n        label={\n          <Trans\n            message=\"[one Writer|other Writers]\"\n            values={{count: credits.writing.length}}\n          />\n        }\n      >\n        <BulletSeparatedItems className=\"hidden-scrollbar overflow-x-auto\">\n          {credits.writing.slice(0, 3).map(writer => (\n            <PersonLink\n              person={writer}\n              key={writer.id}\n              color=\"primary\"\n              className=\"whitespace-nowrap\"\n            />\n          ))}\n        </BulletSeparatedItems>\n      </PeopleDetail>\n    ) : null}\n    {credits.actors?.length ? (\n      <PeopleDetail label={<Trans message=\"Stars\" />}>\n        <BulletSeparatedItems className=\"hidden-scrollbar overflow-x-auto\">\n          {credits.actors.slice(0, 3).map(actor => (\n            <PersonLink\n              person={actor}\n              key={actor.id}\n              color=\"primary\"\n              className=\"whitespace-nowrap\"\n            />\n          ))}\n        </BulletSeparatedItems>\n      </PeopleDetail>\n    ) : null}\n  </div>\n));\n\ninterface PeopleDetailProps {\n  label: ReactNode;\n  children: ReactNode;\n}\nfunction PeopleDetail({label, children}: PeopleDetailProps) {\n  return (\n    <div className=\"flex-shrink-0 gap-24 md:flex\">\n      <div className=\"min-w-84 font-bold\">{label}</div>\n      <div>{children}</div>\n    </div>\n  );\n}\n","import React, {useMemo} from 'react';\nimport {Genre} from '@app/titles/models/genre';\nimport {\n  BaseMediaLink,\n  BaseMediaLinkProps,\n  getBaseMediaLink,\n} from '@app/base-media-link';\nimport {Trans} from '@common/i18n/trans';\n\ninterface Props extends Omit<BaseMediaLinkProps, 'link'> {\n  genre: Genre;\n}\nexport function GenreLink({genre, children, ...otherProps}: Props) {\n  const link = useMemo(() => getGenreLink(genre), [genre]);\n  return (\n    <BaseMediaLink {...otherProps} link={link}>\n      {children ?? <Trans message={genre.display_name || genre.name} />}\n    </BaseMediaLink>\n  );\n}\n\nexport function getGenreLink(\n  genre: Genre,\n  {absolute}: {absolute?: boolean} = {}\n): string {\n  return getBaseMediaLink(`/genre/${genre.name}`, {absolute});\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {NewsArticle} from '@app/titles/models/news-article';\n\ninterface Response {\n  news_articles: NewsArticle[];\n}\n\nexport function useTitleNews(titleId: number | string) {\n  return useQuery({\n    queryKey: ['titles', `${titleId}`, 'news'],\n    queryFn: () => fetchNews(titleId),\n  });\n}\n\nfunction fetchNews(titleId: number | string) {\n  return apiClient\n    .get<Response>(`titles/${titleId}/news`)\n    .then(response => response.data);\n}\n","import {useTitleNews} from '@app/titles/pages/title-page/sections/title-news/use-title-news';\nimport React from 'react';\nimport {NewsArticleGridItem} from '@app/news/news-article-grid-item';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Trans} from '@common/i18n/trans';\nimport {Title} from '@app/titles/models/title';\n\ninterface Props {\n  title: Title;\n}\nexport function TitleNews({title}: Props) {\n  const {data, isLoading} = useTitleNews(title.id);\n\n  if (!isLoading && !data?.news_articles.length) {\n    return null;\n  }\n\n  return (\n    <section className=\"mt-48\">\n      <SiteSectionHeading>\n        <Trans message=\"Related news\" />\n      </SiteSectionHeading>\n      <div className=\"grid grid-cols-2 gap-24\">\n        {data?.news_articles.map(article => (\n          <NewsArticleGridItem key={article.id} article={article} />\n        ))}\n      </div>\n    </section>\n  );\n}\n","import { Options, tokenize } from 'linkifyjs';\n\n/**\n\tConvert strings of text into linkable HTML text\n*/\nfunction escapeText(text) {\n  return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\nfunction escapeAttr(href) {\n  return href.replace(/\"/g, '&quot;');\n}\nfunction attributesToString(attributes) {\n  const result = [];\n  for (const attr in attributes) {\n    let val = attributes[attr] + '';\n    result.push(`${attr}=\"${escapeAttr(val)}\"`);\n  }\n  return result.join(' ');\n}\nfunction defaultRender(_ref) {\n  let {\n    tagName,\n    attributes,\n    content\n  } = _ref;\n  return `<${tagName} ${attributesToString(attributes)}>${escapeText(content)}</${tagName}>`;\n}\n\n/**\n * Convert a plan text string to an HTML string with links. Expects that the\n * given strings does not contain any HTML entities. Use the linkify-html\n * interface if you need to parse HTML entities.\n *\n * @param {string} str string to linkify\n * @param {import('linkifyjs').Opts} [opts] overridable options\n * @returns {string}\n */\nfunction linkifyStr(str, opts) {\n  if (opts === void 0) {\n    opts = {};\n  }\n  opts = new Options(opts, defaultRender);\n  const tokens = tokenize(str);\n  const result = [];\n  for (let i = 0; i < tokens.length; i++) {\n    const token = tokens[i];\n    if (token.t === 'nl' && opts.get('nl2br')) {\n      result.push('<br>\\n');\n    } else if (!token.isLink || !opts.check(token)) {\n      result.push(escapeText(token.toString()));\n    } else {\n      result.push(opts.render(token));\n    }\n  }\n  return result.join('');\n}\nif (!String.prototype.linkify) {\n  Object.defineProperty(String.prototype, 'linkify', {\n    writable: false,\n    value: function linkify(options) {\n      return linkifyStr(this, options);\n    }\n  });\n}\n\nexport { linkifyStr as default };\n","import {useMemo} from 'react';\nimport linkifyStr from 'linkify-string';\n\nexport function useLinkifiedString(text: string | null | undefined) {\n  return useMemo(() => {\n    if (!text) {\n      return text;\n    }\n    return linkifyStr(text, {\n      nl2br: true,\n      attributes: {rel: 'nofollow'},\n    });\n  }, [text]);\n}\n","import {useLinkifiedString} from '@common/utils/hooks/use-linkified-string';\nimport {Fragment, useRef, useState} from 'react';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport clsx from 'clsx';\nimport {useLayoutEffect} from '@react-aria/utils';\n\ninterface TruncatedDescriptionProps {\n  description?: string;\n  className?: string;\n}\n\nexport function TruncatedDescription({\n  description,\n  className,\n}: TruncatedDescriptionProps) {\n  const linkifiedDescription = useLinkifiedString(description);\n  const wrapperRef = useRef<HTMLDivElement>(null);\n  const contentRef = useRef<HTMLDivElement>(null);\n  const [isOverflowing, setIsOverflowing] = useState(false);\n  const [isShowingAll, setIsShowingAll] = useState(false);\n\n  useLayoutEffect(() => {\n    const wrapperHeight =\n      wrapperRef.current?.getBoundingClientRect().height || 0;\n    const contentHeight = wrapperRef.current?.scrollHeight || 0;\n    if (contentHeight > wrapperHeight) {\n      setIsOverflowing(true);\n    }\n  }, []);\n\n  if (!linkifiedDescription) return null;\n\n  return (\n    <Fragment>\n      <div\n        ref={wrapperRef}\n        className={clsx(\n          'relative',\n          className,\n          !isShowingAll && 'max-h-160 overflow-hidden',\n          !isShowingAll &&\n            isOverflowing &&\n            'after:absolute after:bottom-0 after:left-0 after:h-20 after:w-full after:bg-gradient-to-b after:from-transparent after:to-background'\n        )}\n      >\n        <div\n          ref={contentRef}\n          dangerouslySetInnerHTML={{__html: linkifiedDescription}}\n        />\n      </div>\n      {isOverflowing && (\n        <Button\n          size=\"xs\"\n          className=\"mt-20\"\n          variant=\"outline\"\n          onClick={() => setIsShowingAll(!isShowingAll)}\n        >\n          {isShowingAll ? (\n            <Trans message=\"Show less\" />\n          ) : (\n            <Trans message=\"Show more\" />\n          )}\n        </Button>\n      )}\n    </Fragment>\n  );\n}\n","import {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useState,\n} from 'react';\nimport {useAuth} from '@common/auth/use-auth';\nimport {\n  CreateReviewPayload,\n  useCreateReview,\n} from '@app/reviews/requests/use-create-review';\nimport {useForm} from 'react-hook-form';\nimport {Form} from '@common/ui/forms/form';\nimport {Avatar} from '@common/ui/images/avatar';\nimport {Trans} from '@common/i18n/trans';\nimport {StarSelector} from '@app/reviews/review-list/star-selector';\nimport {Button} from '@common/ui/buttons/button';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Reviewable} from '@app/reviews/reviewable';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport clsx from 'clsx';\nimport {Review} from '@app/titles/models/review';\n\nexport interface NewReviewFormActions {\n  openReviewPanel: () => void;\n}\n\ninterface Props {\n  reviewable: Reviewable;\n  currentReview?: Review;\n  className?: string;\n  disabled?: boolean;\n}\nexport const NewReviewForm = forwardRef<NewReviewFormActions, Props>(\n  ({reviewable, currentReview, className, disabled}, ref) => {\n    const [isExpanded, setIsExpanded] = useState(false);\n    const {user} = useAuth();\n    const form = useForm<CreateReviewPayload>({\n      defaultValues: {\n        score: 8,\n      },\n    });\n\n    useEffect(() => {\n      if (currentReview) {\n        form.setValue('title', currentReview.title);\n        form.setValue('body', currentReview.body);\n        form.setValue('score', currentReview.score);\n      }\n    }, [form, currentReview]);\n\n    const openReviewPanel = useCallback(() => {\n      setIsExpanded(true);\n    }, []);\n\n    useImperativeHandle(\n      ref,\n      () => ({\n        openReviewPanel,\n      }),\n      [openReviewPanel],\n    );\n\n    const createReview = useCreateReview(form);\n    return (\n      <Form\n        className={clsx('rounded border bg-alt p-14', className)}\n        form={form}\n        onSubmit={newValues => {\n          if (disabled) return;\n          createReview.mutate(\n            {\n              ...newValues,\n              reviewable,\n            },\n            {\n              onSuccess: () => {\n                toast(message('Review posted'));\n                setIsExpanded(false);\n              },\n            },\n          );\n        }}\n      >\n        <div className=\"items-center gap-24 lg:flex\">\n          <Avatar\n            size=\"xl\"\n            circle\n            src={user?.avatar}\n            label={user?.display_name}\n          />\n          <div className=\"flex-auto\">\n            <div className=\"mb-4 text-xs text-muted max-md:mt-10\">\n              <Trans\n                message=\"Review as :name\"\n                values={{\n                  name: (\n                    <span className=\"font-medium text\">\n                      {user?.display_name}\n                    </span>\n                  ),\n                }}\n              />\n            </div>\n            <StarSelector\n              readonly={disabled}\n              className=\"-ml-8 max-lg:mb-12\"\n              count={10}\n              value={disabled ? 0 : form.watch('score')}\n              onValueChange={newScore => {\n                form.setValue('score', newScore);\n              }}\n            />\n          </div>\n          {!isExpanded && (\n            <Button\n              variant=\"flat\"\n              color=\"primary\"\n              onClick={() => openReviewPanel()}\n              disabled={!user || disabled}\n            >\n              {currentReview ? (\n                <Trans message=\"Update review\" />\n              ) : (\n                <Trans message=\"Add review\" />\n              )}\n            </Button>\n          )}\n        </div>\n        {isExpanded && (\n          <div className=\"mt-24\">\n            <FormTextField\n              name=\"title\"\n              className=\"mb-24\"\n              label={<Trans message=\"Title\" />}\n              labelSuffix={<Trans message=\"10 character minimum\" />}\n              autoFocus\n              minLength={10}\n              required\n            />\n            <FormTextField\n              name=\"body\"\n              label={<Trans message=\"Review\" />}\n              labelSuffix={<Trans message=\"100 character minimum\" />}\n              inputElementType=\"textarea\"\n              rows={5}\n              minLength={100}\n              required\n            />\n            <div className=\"mt-16 flex items-center justify-end gap-8\">\n              <Button\n                variant=\"outline\"\n                className=\"min-w-100\"\n                onClick={() => {\n                  setIsExpanded(false);\n                  form.reset(currentReview);\n                }}\n              >\n                <Trans message=\"Cancel\" />\n              </Button>\n              <Button\n                type=\"submit\"\n                variant=\"flat\"\n                color=\"primary\"\n                className=\"min-w-100\"\n                disabled={createReview.isPending}\n              >\n                <Trans message=\"Post\" />\n              </Button>\n            </div>\n          </div>\n        )}\n      </Form>\n    );\n  },\n);\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {apiClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {Review} from '@app/titles/models/review';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\n\ninterface Response extends BackendResponse {\n  review: Review;\n}\n\ninterface Payload {\n  isHelpful: boolean;\n}\n\nexport function useSubmitReviewFeedback(review: Review) {\n  return useMutation({\n    mutationFn: (payload: Payload) => submitFeedback(payload, review),\n    onSuccess: () => {\n      toast(message('Feedback submitted'));\n    },\n    onError: r => showHttpErrorToast(r),\n  });\n}\n\nfunction submitFeedback(payload: Payload, review: Review): Promise<Response> {\n  return apiClient\n    .post(`reviews/${review.id}/feedback`, {\n      is_helpful: payload.isHelpful,\n    })\n    .then(r => r.data);\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 {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {Reportable} from '@common/reports/Reportable';\n\ninterface Response extends BackendResponse {\n  model: Reportable;\n}\n\ninterface Payload {\n  reason?: string;\n}\n\nexport function useSubmitReport(model: Reportable) {\n  return useMutation({\n    mutationFn: (payload: Payload) => submitReport(model, payload),\n    onSuccess: () => {\n      toast(message('Thanks for reporting. We will review this content.'));\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n\nfunction submitReport(model: Reportable, payload: Payload) {\n  return apiClient\n    .post<Response>('report', {\n      reason: payload.reason,\n      model_id: model.id,\n      model_type: model.model_type,\n    })\n    .then(r => r.data);\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 {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {Reportable} from '@common/reports/Reportable';\n\ninterface Response extends BackendResponse {}\n\nexport function useDeleteReport(model: Reportable) {\n  return useMutation({\n    mutationFn: () => deleteReport(model),\n    onSuccess: () => {\n      toast(message('Report removed'));\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n\nfunction deleteReport(reportable: Reportable) {\n  return apiClient\n    .delete<Response>(`report/${reportable.model_type}/${reportable.id}`)\n    .then(r => r.data);\n}\n","import {Review} from '@app/titles/models/review';\nimport {UserAvatar} from '@common/ui/images/user-avatar';\nimport {FormattedRelativeTime} from '@common/i18n/formatted-relative-time';\nimport {TitleRating} from '@app/reviews/title-rating';\nimport {Trans} from '@common/i18n/trans';\nimport React, {\n  Fragment,\n  ReactElement,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n} from 'react';\nimport {Link, useLocation} from 'react-router-dom';\nimport {Button} from '@common/ui/buttons/button';\nimport {useSubmitReviewFeedback} from '@app/reviews/requests/use-submit-review-feedback';\nimport clsx from 'clsx';\nimport {useAuth} from '@common/auth/use-auth';\nimport {useAuthClickCapture} from '@app/use-auth-click-capture';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {useSubmitReport} from '@common/reports/requests/use-submit-report';\nimport {useDeleteReport} from '@common/reports/requests/use-delete-report';\nimport {ShareIcon} from '@common/icons/material/Share';\nimport useClipboard from 'react-use-clipboard';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {\n  Menu,\n  MenuItem,\n  MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {MoreVertIcon} from '@common/icons/material/MoreVert';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {useDeleteReviews} from '@app/reviews/requests/use-delete-reviews';\nimport {User} from '@common/auth/user';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\ninterface Props {\n  review: Review;\n  isShared?: boolean;\n  hideShareButton?: boolean;\n  avatar?: ReactElement;\n}\nexport function ReviewListItem({\n  review,\n  isShared,\n  hideShareButton,\n  avatar,\n}: Props) {\n  const isMobile = useIsMobileMediaQuery();\n  const ref = useRef<HTMLDivElement>(null);\n  const scrolled = useRef(false);\n\n  useEffect(() => {\n    if (isShared && !scrolled.current) {\n      setTimeout(() => {\n        ref.current?.scrollIntoView({behavior: 'smooth'});\n        scrolled.current = true;\n      }, 50);\n    }\n  }, [isShared]);\n\n  return (\n    <div ref={ref}>\n      {isShared && (\n        <div className=\"mb-8 mt-16 text-sm\">\n          <Trans message=\"Shared review\" />\n        </div>\n      )}\n      <div\n        className={clsx(\n          'group flex min-h-70 items-start gap-24 rounded py-18',\n          isShared && 'mb-34 border bg-alt pl-12',\n        )}\n      >\n        {!isMobile &&\n          (avatar || <UserAvatar user={review.user} size=\"xl\" circle />)}\n        <div className=\"flex-auto text-sm\">\n          <div className=\"mb-4 flex items-center gap-8\">\n            {review.user && <UserDisplayName user={review.user} />}\n            <time className=\"text-xs text-muted\">\n              <FormattedRelativeTime date={review.created_at} />\n            </time>\n          </div>\n          <TitleRating className=\"mb-8 mt-10\" score={review.score} />\n          {review.title && (\n            <div className=\"mb-8 text-base font-medium\">{review.title}</div>\n          )}\n          <div className=\"whitespace-break-spaces text-sm\">{review.body}</div>\n          <div className=\"mt-16 items-center gap-8 md:flex\">\n            <Feedback review={review} />\n            {!hideShareButton && <ShareButton review={review} />}\n            <ReviewOptionsTrigger review={review} />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\ninterface ShareButtonProps {\n  review: Review;\n}\nfunction ShareButton({review}: ShareButtonProps) {\n  const {base_url} = useSettings();\n  const location = useLocation();\n  const url = `${base_url}${location.pathname}?reviewId=${review.id}`;\n  const [, copyLink] = useClipboard(url);\n  return (\n    <Tooltip label={<Trans message=\"Share\" />}>\n      <IconButton\n        className=\"text-muted\"\n        onClick={() => {\n          copyLink();\n          toast(message('Review link copied to clipboard'));\n        }}\n      >\n        <ShareIcon />\n      </IconButton>\n    </Tooltip>\n  );\n}\n\ninterface FeedbackProps {\n  review: Review;\n}\nfunction Feedback({review}: FeedbackProps) {\n  const {user} = useAuth();\n  const authHandler = useAuthClickCapture();\n  const submitFeedback = useSubmitReviewFeedback(review);\n  const isDisabled =\n    submitFeedback.isPending || (user != null && user.id === review.user_id);\n\n  const [helpfulCount, setHelpfulCount] = useState(review.helpful_count || 1);\n  const [total, setTotal] = useState(\n    review.helpful_count + review.not_helpful_count || 1,\n  );\n\n  let initialFeedback: string | undefined;\n  if (review.current_user_feedback != null) {\n    initialFeedback = review.current_user_feedback ? 'helpful' : 'not_helpful';\n  }\n  const [currentFeedback, setCurrentFeedback] = useState<string | undefined>(\n    initialFeedback,\n  );\n\n  return (\n    <div className=\"mr-auto flex flex-wrap items-center gap-6 max-md:mb-12\">\n      <div className=\"text-xs text-muted\">\n        <Trans\n          message=\":helpfulCount out of :total people found this helpful. Was this review helpful?\"\n          values={{helpfulCount, total}}\n        />\n      </div>\n      <div className=\"flex items-center gap-6 pb-2\">\n        <Button\n          variant=\"link\"\n          className={clsx(\n            'uppercase',\n            currentFeedback === 'helpful' && 'pointer-events-none',\n          )}\n          color={currentFeedback === 'helpful' ? 'primary' : undefined}\n          disabled={isDisabled}\n          onClickCapture={authHandler}\n          onClick={() =>\n            submitFeedback.mutate(\n              {isHelpful: true},\n              {\n                onSuccess: () => {\n                  setHelpfulCount(count => count + 1);\n                  setCurrentFeedback('helpful');\n                  if (!currentFeedback) {\n                    setTotal(count => count + 1);\n                  }\n                },\n              },\n            )\n          }\n        >\n          <Trans message=\"Yes\" />\n        </Button>\n        <div className=\"h-14 w-1 bg-divider\"></div>\n        <Button\n          variant=\"link\"\n          className={clsx(\n            'uppercase',\n            currentFeedback === 'not_helpful' && 'pointer-events-none',\n          )}\n          color={currentFeedback === 'not_helpful' ? 'primary' : undefined}\n          disabled={isDisabled}\n          onClickCapture={authHandler}\n          onClick={() =>\n            submitFeedback.mutate(\n              {isHelpful: false},\n              {\n                onSuccess: () => {\n                  setHelpfulCount(count => count - 1);\n                  setCurrentFeedback('not_helpful');\n                  if (!currentFeedback) {\n                    setTotal(count => count + 1);\n                  }\n                },\n              },\n            )\n          }\n        >\n          <Trans message=\"No\" />\n        </Button>\n      </div>\n    </div>\n  );\n}\n\ninterface ReviewOptionsTriggerProps {\n  review: Review;\n}\nexport function ReviewOptionsTrigger({review}: ReviewOptionsTriggerProps) {\n  const {user, hasPermission} = useAuth();\n  const report = useSubmitReport(review);\n  const deleteReport = useDeleteReport(review);\n  const [isReported, setIsReported] = useState(review.current_user_reported);\n  const handleReport = () => {\n    if (isReported) {\n      deleteReport.mutate(undefined, {\n        onSuccess: () => setIsReported(false),\n      });\n    } else {\n      report.mutate({}, {onSuccess: () => setIsReported(true)});\n    }\n  };\n\n  const deleteReview = useDeleteReviews();\n  const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);\n  const showDeleteButton =\n    (user && review.user_id === user.id) || hasPermission('reviews.delete');\n  const handleDelete = (isConfirmed: boolean) => {\n    setIsDeleteDialogOpen(false);\n    if (isConfirmed) {\n      deleteReview.mutate({reviewIds: [review.id]});\n    }\n  };\n\n  return (\n    <Fragment>\n      <MenuTrigger>\n        <IconButton className=\"text-muted\" aria-label=\"More options\">\n          <MoreVertIcon />\n        </IconButton>\n        <Menu>\n          <MenuItem value=\"report\" onSelected={() => handleReport()}>\n            {isReported ? (\n              <Trans message=\"Remove report\" />\n            ) : (\n              <Trans message=\"Report review\" />\n            )}\n          </MenuItem>\n          {showDeleteButton && (\n            <MenuItem\n              value=\"delete\"\n              onSelected={() => setIsDeleteDialogOpen(true)}\n            >\n              <Trans message=\"Delete\" />\n            </MenuItem>\n          )}\n        </Menu>\n      </MenuTrigger>\n      <DialogTrigger\n        type=\"modal\"\n        isOpen={isDeleteDialogOpen}\n        onClose={isConfirmed => handleDelete(isConfirmed)}\n      >\n        <ConfirmationDialog\n          isDanger\n          title={<Trans message=\"Delete review?\" />}\n          body={\n            <Trans message=\"Are you sure you want to delete this review?\" />\n          }\n          confirm={<Trans message=\"Delete\" />}\n        />\n      </DialogTrigger>\n    </Fragment>\n  );\n}\n\ninterface UserDisplayNameProps {\n  user: User;\n}\nfunction UserDisplayName({user}: UserDisplayNameProps) {\n  const isMobile = useIsMobileMediaQuery();\n  const {auth} = useContext(SiteConfigContext);\n  const sharedClassName = 'flex items-center gap-8 text-base font-medium';\n  if (auth.getUserProfileLink) {\n    return (\n      <Fragment>\n        {isMobile && <UserAvatar user={user} size=\"sm\" circle />}\n        <Link\n          to={auth.getUserProfileLink(user)}\n          className={clsx('hover:underline', sharedClassName)}\n        >\n          {user.display_name}\n        </Link>\n      </Fragment>\n    );\n  }\n  return (\n    <div className={sharedClassName}>\n      {isMobile && <UserAvatar user={user} size=\"sm\" circle />}\n      {user.display_name}\n    </div>\n  );\n}\n","import {useAuth} from '@common/auth/use-auth';\nimport {Trans} from '@common/i18n/trans';\nimport {Link} from 'react-router-dom';\nimport {LinkStyle} from '@common/ui/buttons/external-link';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\ninterface Props {\n  message: MessageDescriptor;\n}\nexport function AccountRequiredCard({message}: Props) {\n  const {user} = useAuth();\n  if (user) return null;\n  return (\n    <div className=\"border border-dashed py-30 px-20 my-40 mx-auto text-center max-w-850 rounded\">\n      <div className=\"text-xl font-semibold mb-8\">\n        <Trans message=\"Account required\" />\n      </div>\n      <div className=\"text-muted text-base\">\n        <Trans\n          {...message}\n          values={{\n            l: parts => (\n              <Link className={LinkStyle} to=\"/login\">\n                {parts}\n              </Link>\n            ),\n            r: parts => (\n              <Link className={LinkStyle} to=\"/register\">\n                {parts}\n              </Link>\n            ),\n          }}\n        />\n      </div>\n    </div>\n  );\n}\n","import {useReviews} from '@app/reviews/requests/use-reviews';\nimport {Reviewable} from '@app/reviews/reviewable';\nimport {\n  NewReviewForm,\n  NewReviewFormActions,\n} from '@app/reviews/review-list/new-review-form';\nimport React, {ReactNode, useRef} from 'react';\nimport {ReviewListItem} from '@app/reviews/review-list/review-list-item';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {Review} from '@app/titles/models/review';\nimport {AccountRequiredCard} from '@common/comments/comment-list/account-required-card';\nimport {useAuth} from '@common/auth/use-auth';\nimport {message} from '@common/i18n/message';\n\nconst accountRequiredMessage = message(\n  'Please <l>login</l> or <r>create account</r> to add a review',\n);\n\ninterface Props {\n  reviewable: Reviewable;\n  disabled?: boolean;\n  noResultsMessage?: ReactNode;\n  showAccountRequiredMessage?: boolean;\n}\nexport function ReviewList({\n  reviewable,\n  disabled,\n  noResultsMessage,\n  showAccountRequiredMessage,\n}: Props) {\n  const query = useReviews(reviewable);\n  const actionsRef = useRef<NewReviewFormActions>(null);\n  const {user} = useAuth();\n\n  const currentUserReview = query.data?.pages[0].current_user_review;\n  const sharedReview = query.data?.pages[0].shared_review;\n\n  return (\n    <div>\n      <NewReviewForm\n        className=\"mb-14 md:-mx-14\"\n        reviewable={reviewable}\n        currentReview={currentUserReview}\n        ref={actionsRef}\n        disabled={disabled}\n      />\n      <div>\n        {showAccountRequiredMessage && (\n          <AccountRequiredCard message={accountRequiredMessage} />\n        )}\n        <AnimatePresence initial={false} mode=\"wait\">\n          {query.isLoading ? (\n            <ReviewListSkeletons count={4} />\n          ) : (\n            <ReviewListItems\n              reviews={query.items}\n              sharedReview={sharedReview}\n              noResultsMessage={noResultsMessage}\n            />\n          )}\n        </AnimatePresence>\n        <div className=\"ml-84\">\n          <InfiniteScrollSentinel\n            query={query}\n            variant=\"loadMore\"\n            loaderMarginTop=\"mt-14\"\n            loadMoreExtraContent={\n              <Button\n                variant=\"flat\"\n                color=\"primary\"\n                disabled={!user}\n                onClick={() => {\n                  actionsRef.current?.openReviewPanel();\n                }}\n              >\n                <Trans message=\"Add a review\" />\n              </Button>\n            }\n          />\n        </div>\n      </div>\n    </div>\n  );\n}\n\ninterface ReviewListItemsProps {\n  reviews: Review[];\n  sharedReview?: Review;\n  noResultsMessage?: ReactNode;\n}\nfunction ReviewListItems({\n  reviews,\n  sharedReview,\n  noResultsMessage,\n}: ReviewListItemsProps) {\n  const {user} = useAuth();\n\n  let content: ReactNode;\n\n  if (!reviews.length) {\n    content = user\n      ? noResultsMessage || (\n          <IllustratedMessage\n            className=\"mt-24\"\n            size=\"sm\"\n            title={<Trans message=\"Seems a little quiet over here\" />}\n            description={<Trans message=\"Be the first to leave a review\" />}\n          />\n        )\n      : null;\n  } else {\n    content = reviews.map(review => (\n      <ReviewListItem key={review.id} review={review} />\n    ));\n  }\n\n  return (\n    <m.div key=\"reviews\" {...opacityAnimation}>\n      {sharedReview && <ReviewListItem review={sharedReview} isShared />}\n      {content}\n    </m.div>\n  );\n}\n\ninterface ReviewListSkeletonsProps {\n  count: number;\n}\nexport function ReviewListSkeletons({count}: ReviewListSkeletonsProps) {\n  return (\n    <m.div key=\"loading-skeleton\" {...opacityAnimation}>\n      {[...new Array(count).keys()].map(index => (\n        <div\n          key={index}\n          className=\"flex items-start gap-24 py-18 min-h-[212px] group\"\n        >\n          <Skeleton variant=\"avatar\" radius=\"rounded-full\" size=\"w-60 h-60\" />\n          <div className=\"flex-auto text-sm\">\n            <Skeleton\n              className=\"text-base font-medium max-w-200 mb-4\"\n              variant=\"text\"\n            />\n            <Skeleton variant=\"text\" className=\"max-w-60 mb-8 mt-10 text-lg\" />\n            <Skeleton variant=\"text\" className=\"mb-8 text-base max-w-240\" />\n            <Skeleton className=\"text-sm\" variant=\"text\" />\n            <Skeleton className=\"text-sm\" variant=\"text\" />\n            <Skeleton className=\"text-xs mt-16\" variant=\"text\" />\n          </div>\n        </div>\n      ))}\n    </m.div>\n  );\n}\n","import {Title} from '@app/titles/models/title';\nimport {useReviews} from '@app/reviews/requests/use-reviews';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {TitleRating} from '@app/reviews/title-rating';\nimport {Trans} from '@common/i18n/trans';\nimport {ReviewList} from '@app/reviews/review-list/review-list';\nimport {useLocalStorage} from '@common/utils/hooks/local-storage';\nimport {ReviewListSortButton} from '@app/reviews/review-list/review-list-sort-button';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport React from 'react';\nimport {FormattedDate} from '@common/i18n/formatted-date';\n\ninterface Props {\n  title: Title;\n}\nexport function TitlePageReviewList({title}: Props) {\n  const [sort, setSort] = useLocalStorage(\n    `reviewSort.${title.model_type}`,\n    'created_at:desc'\n  );\n  const query = useReviews(title);\n  return (\n    <div className=\"mt-48\">\n      <SiteSectionHeading\n        titleAppend={\n          query.totalItems ? <span>({query.totalItems})</span> : null\n        }\n        actions={\n          <div className=\"flex items-center gap-24\">\n            <TitleRating score={title.rating} className=\"max-md:hidden\" />\n            <ReviewListSortButton\n              value={sort}\n              onValueChange={newValue => setSort(newValue)}\n            />\n          </div>\n        }\n      >\n        <Trans message=\"Reviews\" />\n      </SiteSectionHeading>\n      <ReviewList\n        reviewable={title}\n        showAccountRequiredMessage={title.status !== 'upcoming'}\n        noResultsMessage={\n          title.status === 'upcoming' ? (\n            <IllustratedMessage\n              className=\"mt-24\"\n              size=\"sm\"\n              title={<Trans message=\"This title is not released yet\" />}\n              description={\n                <Trans\n                  message=\"Come back after :date to see the reviews\"\n                  values={{date: <FormattedDate date={title.release_date} />}}\n                />\n              }\n            />\n          ) : undefined\n        }\n      />\n    </div>\n  );\n}\n","import {Title} from '@app/titles/models/title';\nimport {Episode} from '@app/titles/models/episode';\nimport {getEpisodeLink} from '@app/episodes/episode-link';\nimport {getTitleLink} from '@app/titles/title-link';\nimport {VideoGrid} from '@app/titles/video-grid';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Trans} from '@common/i18n/trans';\n\ninterface Props {\n  title: Title;\n  episode?: Episode;\n}\nexport function TitlePageVideoGrid({title, episode}: Props) {\n  const videos = episode ? episode.videos : title.videos;\n  const link = episode\n    ? `${getEpisodeLink(\n        title,\n        episode.season_number,\n        episode.episode_number\n      )}/episodes/${episode.id}/videos`\n    : `${getTitleLink(title)}/videos`;\n  return (\n    <VideoGrid\n      videos={videos}\n      title={title}\n      episode={episode}\n      heading={\n        <SiteSectionHeading link={link}>\n          <Trans message=\"Videos\" />\n        </SiteSectionHeading>\n      }\n    />\n  );\n}\n","import React, {Fragment, ReactNode, useState} from 'react';\nimport {useSeasonEpisodes} from '@app/titles/requests/use-season-episodes';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Trans} from '@common/i18n/trans';\nimport {ContentGridLayout} from '@app/channels/content-grid/content-grid-layout';\nimport {EpisodePoster} from '@app/episodes/episode-poster/episode-poster';\nimport {Link, useParams} from 'react-router-dom';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {Episode} from '@app/titles/models/episode';\nimport {Title} from '@app/titles/models/title';\nimport {CompactSeasonEpisode} from '@app/episodes/compact-season-episode';\nimport {\n  Menu,\n  MenuItem,\n  MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {message} from '@common/i18n/message';\nimport {SortIcon} from '@common/icons/material/Sort';\nimport {ExpandMoreIcon} from '@common/icons/material/ExpandMore';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {UseInfiniteDataResult} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {FormattedDuration} from '@common/i18n/formatted-duration';\nimport {GetTitleResponse} from '@app/titles/requests/use-title';\n\ninterface Props {\n  data: GetTitleResponse;\n  label?: ReactNode;\n  showSeasonSelector?: boolean;\n}\nexport function TitlePageEpisodeGrid({data, label, showSeasonSelector}: Props) {\n  const {season} = useParams();\n  const [selectedSeason, setSelectedSeason] = useState<number>(\n    season ? parseInt(season) : 1,\n  );\n  const query = useSeasonEpisodes(\n    data.episodes,\n    {\n      perPage: 21,\n      excludeDescription: 'true',\n    },\n    {\n      season: selectedSeason,\n      willSortOrFilter: true,\n      defaultOrderBy: 'episode_number',\n      defaultOrderDir: 'asc',\n      titleId: data.title.id,\n    },\n  );\n  const {isInitialLoading, items, sortDescriptor, setSortDescriptor} = query;\n\n  return (\n    <div className=\"mt-48\">\n      <SiteSectionHeading\n        actions={\n          <Fragment>\n            {showSeasonSelector && (\n              <SeasonSelector\n                selectedSeason={selectedSeason}\n                onSeasonChange={setSelectedSeason}\n                seasonCount={data.title.seasons_count}\n              />\n            )}\n            <SortButton\n              value={`${sortDescriptor.orderBy}:${sortDescriptor?.orderDir}`}\n              onValueChange={value => {\n                const [orderBy, orderDir] = value.split(':');\n                setSortDescriptor({\n                  orderBy,\n                  orderDir: orderDir as 'asc' | 'desc',\n                });\n              }}\n            />\n          </Fragment>\n        }\n      >\n        {label || <Trans message=\"Episodes\" />}\n      </SiteSectionHeading>\n      <AnimatePresence initial={false} mode=\"wait\">\n        {isInitialLoading ? (\n          <SkeletonGrid />\n        ) : (\n          <EpisodeGrid episodes={items} title={data.title} query={query} />\n        )}\n      </AnimatePresence>\n    </div>\n  );\n}\n\ninterface GridItemProps {\n  episode: Episode;\n  title: Title;\n}\nfunction GridItem({episode, title}: GridItemProps) {\n  const runtime = episode.runtime || title.runtime;\n  const name = (\n    <Fragment>\n      <CompactSeasonEpisode className=\"uppercase\" episode={episode} /> -{' '}\n      {episode.name}\n    </Fragment>\n  );\n  return (\n    <div>\n      <div className=\"relative\">\n        <EpisodePoster\n          episode={episode}\n          title={title}\n          srcSize=\"md\"\n          showPlayButton\n          rightAction={\n            runtime ? (\n              <span className=\"rounded bg-black/50 p-4 text-xs font-medium text-white\">\n                <FormattedDuration minutes={runtime} verbose />\n              </span>\n            ) : null\n          }\n        />\n      </div>\n      <div className=\"mt-10\">\n        {episode.release_date && (\n          <div className=\"mb-2 text-sm text-muted\">\n            <FormattedDate date={episode.release_date} />\n          </div>\n        )}\n        <div className=\"overflow-hidden overflow-ellipsis whitespace-nowrap text-base\">\n          {episode.primary_video ? (\n            <Link\n              className=\"rounded outline-none hover:underline focus-visible:ring focus-visible:ring-offset-2\"\n              to={getWatchLink(episode.primary_video)}\n            >\n              {name}\n            </Link>\n          ) : (\n            name\n          )}\n        </div>\n      </div>\n    </div>\n  );\n}\n\ninterface EpisodeGridProps {\n  episodes: Episode[];\n  title: Title;\n  query: UseInfiniteDataResult<Episode>;\n}\nfunction EpisodeGrid({title, episodes, query}: EpisodeGridProps) {\n  return (\n    <m.div key=\"episode-grid\" {...opacityAnimation}>\n      <ContentGridLayout variant=\"landscape\">\n        {episodes.map(episode => (\n          <GridItem key={episode.id} episode={episode} title={title} />\n        ))}\n      </ContentGridLayout>\n      <InfiniteScrollSentinel\n        query={query}\n        variant=\"loadMore\"\n        size=\"sm\"\n        loaderMarginTop=\"mt-16\"\n      />\n    </m.div>\n  );\n}\n\nfunction SkeletonGrid() {\n  return (\n    <m.div key=\"episode-grid\" {...opacityAnimation}>\n      <ContentGridLayout variant=\"landscape\">\n        {[...new Array(6).keys()].map(number => (\n          <div key={number}>\n            <Skeleton variant=\"rect\" size=\"aspect-video\" animation=\"pulsate\" />\n            <div className=\"mt-10 min-h-44\">\n              <Skeleton variant=\"text\" />\n              <Skeleton variant=\"text\" />\n            </div>\n          </div>\n        ))}\n      </ContentGridLayout>\n    </m.div>\n  );\n}\n\ninterface SeasonSelectorProps {\n  selectedSeason: number;\n  onSeasonChange: (newSeason: number) => void;\n  seasonCount: number;\n}\nfunction SeasonSelector({\n  selectedSeason,\n  onSeasonChange,\n  seasonCount,\n}: SeasonSelectorProps) {\n  return (\n    <MenuTrigger\n      selectedValue={selectedSeason}\n      onSelectionChange={newValue => onSeasonChange(newValue as number)}\n      selectionMode=\"single\"\n    >\n      <Button variant=\"outline\" startIcon={<ExpandMoreIcon />} className=\"mr-4\">\n        <Trans message=\"Season :number\" values={{number: selectedSeason}} />\n      </Button>\n      <Menu>\n        {[...new Array(seasonCount).keys()].map(number => {\n          const seasonNumber = number + 1;\n          return (\n            <MenuItem value={seasonNumber} key={seasonNumber}>\n              <Trans message=\"Season :number\" values={{number: seasonNumber}} />\n            </MenuItem>\n          );\n        })}\n      </Menu>\n    </MenuTrigger>\n  );\n}\n\nconst SortOptions = [\n  {\n    value: 'episode_number:desc',\n    label: message('Newest'),\n  },\n  {\n    value: 'episode_number:asc',\n    label: message('Oldest'),\n  },\n];\n\ninterface SortButtonProps {\n  value: string;\n  onValueChange: (newValue: string) => void;\n}\nfunction SortButton({value, onValueChange}: SortButtonProps) {\n  let selectedOption = SortOptions.find(option => option.value === value);\n  if (!selectedOption) {\n    selectedOption = SortOptions[0];\n  }\n  return (\n    <MenuTrigger\n      selectedValue={value}\n      onSelectionChange={newValue => onValueChange(newValue as string)}\n      selectionMode=\"single\"\n    >\n      <Button variant=\"outline\" startIcon={<SortIcon />}>\n        <Trans {...selectedOption.label} />\n      </Button>\n      <Menu>\n        {SortOptions.map(option => (\n          <MenuItem value={option.value} key={option.value}>\n            <Trans {...option.label} />\n          </MenuItem>\n        ))}\n      </Menu>\n    </MenuTrigger>\n  );\n}\n","import {ChipList} from '@common/ui/forms/input-field/chip-field/chip-list';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\nimport {Link} from 'react-router-dom';\nimport {TitlePageImageGrid} from '@app/titles/pages/title-page/sections/title-page-image-grid';\nimport {TitlePageCast} from '@app/titles/pages/title-page/sections/title-page-cast';\nimport {RelatedTitlesPanel} from '@app/titles/related-titles-panel';\nimport {TitlePageSeasonGrid} from '@app/titles/pages/title-page/sections/title-page-season-grid';\nimport {CompactCredits} from '@app/titles/compact-credits';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Trans} from '@common/i18n/trans';\nimport {getTitleLink} from '@app/titles/title-link';\nimport {getGenreLink} from '@app/titles/genre-link';\nimport {TitleNews} from '@app/titles/pages/title-page/sections/title-news/title-news';\nimport {TruncatedDescription} from '@common/ui/truncated-description';\nimport clsx from 'clsx';\nimport {TitlePageReviewList} from '@app/titles/pages/title-page/sections/title-page-review-list';\nimport {GetTitleResponse} from '@app/titles/requests/use-title';\nimport {TitlePageVideoGrid} from '@app/titles/pages/title-page/sections/title-page-video-grid';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useAuth} from '@common/auth/use-auth';\nimport {TitlePageEpisodeGrid} from '@app/titles/pages/title-page/sections/title-page-episode-grid';\nimport {TitlePageSections} from '@app/titles/pages/title-page/sections/title-page-sections';\nimport {Title} from '@app/titles/models/title';\nimport {AdHost} from '@common/admin/ads/ad-host';\n\ninterface Props {\n  data: GetTitleResponse;\n  className?: string;\n}\nexport function TitlePageMainContent({data, className}: Props) {\n  const {title, credits} = data;\n  const {title_page} = useSettings();\n  return (\n    <main className={clsx(className, '@container')}>\n      {title.genres?.length ? (\n        <ChipList>\n          {title.genres.map(genre => (\n            <Chip\n              className=\"capitalize\"\n              elementType={Link}\n              to={getGenreLink(genre)}\n              key={genre.id}\n            >\n              <Trans message={genre.display_name || genre.name} />\n            </Chip>\n          ))}\n        </ChipList>\n      ) : null}\n      {title.tagline && (\n        <blockquote className=\"mt-16\">“{title.tagline}”</blockquote>\n      )}\n      <TruncatedDescription className=\"mt-16\" description={title.description} />\n      <CompactCredits credits={credits} />\n      <AdHost slot=\"title_top\" className=\"pt-48\" />\n      {title_page?.sections?.map(name => (\n        <TitlePageSection key={name} name={name} title={title} data={data} />\n      ))}\n    </main>\n  );\n}\n\ninterface TitlePageSectionProps {\n  title: Title;\n  data: GetTitleResponse;\n  name: (typeof TitlePageSections)[number];\n}\nfunction TitlePageSection({name, title, data}: TitlePageSectionProps) {\n  const {titles} = useSettings();\n  const {hasPermission} = useAuth();\n  switch (name) {\n    case 'episodes':\n      return title.is_series ? (\n        <TitlePageEpisodeGrid data={data} showSeasonSelector />\n      ) : null;\n    case 'seasons':\n      return title.is_series ? <TitlePageSeasonGrid data={data} /> : null;\n    case 'videos':\n      return <TitlePageVideoGrid title={title} />;\n    case 'images':\n      return (\n        <TitlePageImageGrid\n          images={title.images}\n          heading={\n            <SiteSectionHeading link={`${getTitleLink(title)}/images`}>\n              <Trans message=\"Images\" />\n            </SiteSectionHeading>\n          }\n        />\n      );\n    case 'reviews':\n      return titles.enable_reviews && hasPermission('reviews.view') ? (\n        <TitlePageReviewList title={title} />\n      ) : null;\n    case 'cast':\n      return <TitlePageCast credits={data.credits?.actors} />;\n    case 'news':\n      return <TitleNews title={title} />;\n    case 'related':\n      return <RelatedTitlesPanel title={title} />;\n  }\n}\n","import {ReactNode} from 'react';\n\ninterface Props {\n  name: ReactNode;\n  poster?: ReactNode;\n  description?: ReactNode;\n  right?: ReactNode;\n  children?: ReactNode;\n}\nexport function TitlePageHeaderLayout({\n  name,\n  description,\n  children,\n  right,\n  poster,\n}: Props) {\n  return (\n    <div className=\"mb-24 items-center justify-between gap-24 lg:flex\">\n      {poster}\n      <div className=\"flex-auto\">\n        {children}\n        <h1 className=\"mb-12 text-4xl md:mb-8 md:text-5xl\">{name}</h1>\n        {description && (\n          <div className=\"text-base font-normal\">{description}</div>\n        )}\n      </div>\n      {right}\n    </div>\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  watchlist: {\n    id: number;\n    items: {\n      title: Record<number, boolean>;\n      episode: Record<number, boolean>;\n    };\n  };\n}\n\nexport function useCurrentUserWatchlist() {\n  const {user} = useAuth();\n  return useQuery({\n    queryKey: ['channel', 'watchlist', 'compact'],\n    queryFn: () => fetchWatchlist(),\n    enabled: !!user,\n  });\n}\n\nexport function useIsItemWatchlisted(item: Title | Episode) {\n  const query = useCurrentUserWatchlist();\n  return {\n    isLoading: query.isLoading && query.fetchStatus !== 'idle',\n    isWatchlisted: !!query.data?.watchlist?.items[item.model_type]?.[item.id],\n  };\n}\n\nfunction fetchWatchlist() {\n  return apiClient\n    .get<Response>(`users/me/watchlist`)\n    .then(response => response.data);\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {Title} from '@app/titles/models/title';\nimport {useCurrentUserWatchlist} from '@app/user-lists/requests/use-current-user-watchlist';\n\ninterface Response extends BackendResponse {}\n\nexport function useAddToWatchlist() {\n  const {data} = useCurrentUserWatchlist();\n  return useMutation({\n    mutationFn: (payload: Title) =>\n      addToWatchlist(data!.watchlist!.id, payload),\n    onSuccess: async () => {\n      await queryClient.invalidateQueries({\n        queryKey: ['channel', 'watchlist'],\n      });\n      toast(message('Added to your watchlist'));\n    },\n    onError: r => showHttpErrorToast(r),\n  });\n}\n\nfunction addToWatchlist(listId: number, payload: Title): Promise<Response> {\n  return apiClient\n    .post(`channel/${listId}/add`, {\n      itemId: payload.id,\n      itemType: payload.model_type,\n    })\n    .then(r => r.data);\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {Title} from '@app/titles/models/title';\nimport {useCurrentUserWatchlist} from '@app/user-lists/requests/use-current-user-watchlist';\n\ninterface Response extends BackendResponse {}\n\nexport function useRemoveFromWatchlist() {\n  const {data} = useCurrentUserWatchlist();\n  return useMutation({\n    mutationFn: (payload: Title) =>\n      removeFromWatchlist(data!.watchlist.id, payload),\n    onSuccess: async () => {\n      await queryClient.invalidateQueries({\n        queryKey: ['channel', 'watchlist'],\n      });\n      toast(message('Removed from your watchlist'));\n    },\n    onError: r => showHttpErrorToast(r),\n  });\n}\n\nfunction removeFromWatchlist(\n  listId: number,\n  payload: Title,\n): Promise<Response> {\n  return apiClient\n    .post(`channel/${listId}/remove`, {\n      itemId: payload.id,\n      itemType: payload.model_type,\n    })\n    .then(r => r.data);\n}\n","import {Button, ButtonProps} from '@common/ui/buttons/button';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {Trans} from '@common/i18n/trans';\nimport {Title} from '@app/titles/models/title';\nimport {CheckIcon} from '@common/icons/material/Check';\nimport {useAddToWatchlist} from '@app/user-lists/requests/use-add-to-watchlist';\nimport {useRemoveFromWatchlist} from '@app/user-lists/requests/use-remove-from-watchlist';\nimport {useIsItemWatchlisted} from '@app/user-lists/requests/use-current-user-watchlist';\nimport {useAuthClickCapture} from '@app/use-auth-click-capture';\nimport React from 'react';\nimport clsx from 'clsx';\n\ninterface Props {\n  variant?: ButtonProps['variant'];\n  color?: ButtonProps['color'];\n  item: Title;\n  size?: 'sm' | 'lg';\n  className?: string;\n}\nexport function WatchlistButton({\n  item,\n  variant = 'flat',\n  color = 'primary',\n  size = 'lg',\n  className,\n}: Props) {\n  const {isLoading, isWatchlisted} = useIsItemWatchlisted(item);\n  const addToWatchlist = useAddToWatchlist();\n  const removeFromWatchlist = useRemoveFromWatchlist();\n  const authHandler = useAuthClickCapture();\n\n  return (\n    <Button\n      variant={variant}\n      color={color}\n      size={size === 'sm' ? 'xs' : undefined}\n      className={clsx(size === 'lg' && 'mt-14 min-h-40 w-full', className)}\n      startIcon={isWatchlisted ? <CheckIcon /> : <AddIcon />}\n      disabled={\n        addToWatchlist.isPending || removeFromWatchlist.isPending || isLoading\n      }\n      onClickCapture={authHandler}\n      onClick={() => {\n        if (isWatchlisted) {\n          removeFromWatchlist.mutate(item);\n        } else {\n          addToWatchlist.mutate(item);\n        }\n      }}\n    >\n      {isWatchlisted ? (\n        <Trans message=\"In watchlist\" />\n      ) : size === 'sm' ? (\n        <Trans message=\"Watchlist\" />\n      ) : (\n        <Trans message=\"Add to watchlist\" />\n      )}\n    </Button>\n  );\n}\n","import {InteractableRating} from '@app/reviews/interactable-rating';\nimport {Title} from '@app/titles/models/title';\nimport {TitlePageHeaderLayout} from '@app/titles/pages/title-page/title-page-header-layout';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {FormattedDuration} from '@common/i18n/formatted-duration';\nimport {BulletSeparatedItems} from '@app/titles/bullet-separated-items';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {TitleLink} from '@app/titles/title-link';\nimport React from 'react';\nimport {WatchlistButton} from '@app/user-lists/watchlist-button';\n\ninterface Props {\n  title: Title;\n  showPoster?: boolean;\n}\nexport function TitlePageHeader({title, showPoster = false}: Props) {\n  return (\n    <TitlePageHeaderLayout\n      name={<TitleLink title={title} />}\n      poster={\n        showPoster ? (\n          <TitlePoster title={title} size=\"w-80\" srcSize=\"sm\" />\n        ) : null\n      }\n      description={\n        <div>\n          <BulletSeparatedItems>\n            <FormattedDate date={title.release_date} />\n            {title.certification && (\n              <div className=\"uppercase\">{title.certification}</div>\n            )}\n            {title.runtime && (\n              <FormattedDuration minutes={title.runtime} verbose />\n            )}\n          </BulletSeparatedItems>\n        </div>\n      }\n      right={\n        <div className=\"flex items-center justify-between gap-10 max-md:mt-10\">\n          <InteractableRating title={title} />\n          <WatchlistButton item={title} size=\"sm\" className=\"md:hidden\" />\n        </div>\n      }\n    />\n  );\n}\n","import {Title} from '@app/titles/models/title';\nimport {Episode} from '@app/titles/models/episode';\nimport {TitleBackdrop} from '@app/titles/title-poster/title-backdrop';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport {Link} from 'react-router-dom';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {Season} from '@app/titles/models/season';\n\ninterface Props {\n  title: Title;\n  season?: Season;\n  episode?: Episode;\n}\nexport function TitlePageHeaderImage({title, season, episode}: Props) {\n  const {streaming} = useSettings();\n  const watchItem = episode || season || title;\n  const backdropUrl = episode?.poster || title.backdrop;\n\n  if (!backdropUrl) {\n    return null;\n  }\n\n  const backdrop = (\n    <TitleBackdrop\n      title={title}\n      episode={episode}\n      size=\"w-full h-full\"\n      className=\"object-top\"\n      lazy={false}\n    />\n  );\n  return (\n    <header className=\"relative isolate max-h-320 overflow-hidden bg-black md:max-h-400 lg:max-h-450\">\n      <div className=\"container relative left-0 right-0 top-0 z-20 mx-auto h-full w-full px-24\">\n        {backdrop}\n      </div>\n      <div className=\"h-[calc(100% + 20px)] absolute left-1/2 top-1/2 z-10 w-[calc(100%+100px)] -translate-x-1/2 -translate-y-1/2 bg-black opacity-50 blur-md\">\n        {backdrop}\n      </div>\n      <div className=\"pointer-events-none absolute left-0 top-0 z-30 h-full w-full bg-gradient-to-b from-black/20 md:from-black/40\" />\n      {streaming?.show_header_play && watchItem?.primary_video ? (\n        <PlayButton item={watchItem} />\n      ) : null}\n    </header>\n  );\n}\n\ninterface PlayButtonProps {\n  item: Season | Episode | Title;\n}\nfunction PlayButton({item}: PlayButtonProps) {\n  const link = getWatchLink(item.primary_video!);\n  return (\n    <IconButton\n      radius=\"rounded-full\"\n      color=\"white\"\n      variant=\"raised\"\n      size=\"lg\"\n      className=\"absolute inset-0 z-40 m-auto\"\n      elementType={Link}\n      to={link}\n    >\n      <MediaPlayIcon />\n    </IconButton>\n  );\n}\n","import {Fragment, ReactElement, ReactNode} from 'react';\nimport clsx from 'clsx';\n\ninterface Props {\n  poster: ReactElement;\n  children: ReactNode;\n  className?: string;\n}\nexport function TitlePageAsideLayout({poster, children, className}: Props) {\n  return (\n    <div className={clsx('top-40 flex-shrink-0 md:sticky md:w-1/4', className)}>\n      {poster}\n      <div className=\"flex-auto max-md:ml-16 max-md:text-sm\">{children}</div>\n    </div>\n  );\n}\n\ninterface DetailItemProps {\n  label: ReactNode;\n  children: ReactNode;\n}\nexport function DetailItem({label, children}: DetailItemProps) {\n  return (\n    <Fragment>\n      <dt className=\"font-semibold\">{label}</dt>\n      <dl className=\"mb-12 md:mb-24\">{children}</dl>\n    </Fragment>\n  );\n}\n","import React, {useMemo} from 'react';\nimport {\n  BaseMediaLink,\n  BaseMediaLinkProps,\n  getBaseMediaLink,\n} from '@app/base-media-link';\nimport {Keyword} from '@app/titles/models/keyword';\nimport {Trans} from '@common/i18n/trans';\n\ninterface Props extends Omit<BaseMediaLinkProps, 'link'> {\n  keyword: Keyword;\n}\nexport function KeywordLink({keyword, children, ...otherProps}: Props) {\n  const link = useMemo(() => getKeywordLink(keyword), [keyword]);\n  return (\n    <BaseMediaLink {...otherProps} link={link}>\n      {children ?? <Trans message={keyword.display_name || keyword.name} />}\n    </BaseMediaLink>\n  );\n}\n\nexport function getKeywordLink(\n  keyword: Keyword,\n  {absolute}: {absolute?: boolean} = {}\n): string {\n  return getBaseMediaLink(`/keyword/${keyword.name}`, {absolute});\n}\n","import React, {useMemo} from 'react';\nimport {\n  BaseMediaLink,\n  BaseMediaLinkProps,\n  getBaseMediaLink,\n} from '@app/base-media-link';\nimport {ProductionCountry} from '@app/titles/models/production-country';\n\ninterface Props extends Omit<BaseMediaLinkProps, 'link'> {\n  country: ProductionCountry;\n}\nexport function ProductionCountryLink({\n  country,\n  children,\n  ...otherProps\n}: Props) {\n  const link = useMemo(() => getKeywordLink(country), [country]);\n  return (\n    <BaseMediaLink {...otherProps} link={link}>\n      {children ?? (country.display_name || country.name)}\n    </BaseMediaLink>\n  );\n}\n\nexport function getKeywordLink(\n  country: ProductionCountry,\n  {absolute}: {absolute?: boolean} = {}\n): string {\n  return getBaseMediaLink(`/production-countries/${country.name}`, {absolute});\n}\n","import {MediaPlayIcon} from '@common/icons/media/media-play';\nimport {Trans} from '@common/i18n/trans';\nimport {Button, ButtonProps} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {Video} from '@app/titles/models/video';\nimport {CompactSeasonEpisode} from '@app/episodes/compact-season-episode';\n\ninterface Props {\n  variant?: ButtonProps['variant'];\n  color?: ButtonProps['color'];\n  size?: string;\n  video: Video;\n  defaultLabel?: boolean;\n}\nexport function WatchNowButton({\n  video,\n  variant = 'outline',\n  color = 'primary',\n  size = 'w-full min-h-40 mt-14',\n  defaultLabel,\n}: Props) {\n  const label =\n    video.episode_num && !defaultLabel ? (\n      <span className=\"inline-flex gap-4\">\n        <Trans message=\"Start watching\" />\n        <CompactSeasonEpisode\n          seasonNum={video.season_num}\n          episodeNum={video.episode_num}\n        />\n      </span>\n    ) : (\n      <Trans message=\"Watch now\" />\n    );\n\n  return (\n    <Button\n      to={getWatchLink(video)}\n      elementType={Link}\n      startIcon={<MediaPlayIcon />}\n      color={color}\n      variant={variant}\n      className={size}\n    >\n      {label}\n    </Button>\n  );\n}\n","import {useSettings} from '@common/core/settings/use-settings';\n\nexport function useIsStreamingMode() {\n  const {streaming} = useSettings();\n  return streaming?.prefer_full || false;\n}\n","import {Title} from '@app/titles/models/title';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedCurrency} from '@common/i18n/formatted-currency';\nimport {WatchlistButton} from '@app/user-lists/watchlist-button';\nimport {\n  DetailItem,\n  TitlePageAsideLayout,\n} from '@app/titles/pages/title-page/title-page-aside-layout';\nimport {KeywordLink} from '@app/titles/keyword-link';\nimport {ProductionCountryLink} from '@app/titles/production-country-link';\nimport {WatchNowButton} from '@app/titles/pages/title-page/watch-now-button';\nimport {useIsStreamingMode} from '@app/videos/use-is-streaming-mode';\nimport {getTitleLink} from '@app/titles/title-link';\nimport {ShareMenuTrigger} from '@app/sharing/share-menu-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport React from 'react';\nimport {ShareIcon} from '@common/icons/material/Share';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {Link} from 'react-router-dom';\nimport {useAuth} from '@common/auth/use-auth';\nimport {GetTitleResponse} from '@app/titles/requests/use-title';\n\ninterface Props {\n  data: GetTitleResponse;\n  className?: string;\n}\nexport function TitlePageAside({data: {title, language}, className}: Props) {\n  const isStreamingMode = useIsStreamingMode();\n  const {hasPermission} = useAuth();\n  return (\n    <TitlePageAsideLayout\n      className={className}\n      poster={\n        <div className=\"relative\">\n          <TitlePoster title={title} size=\"w-full\" srcSize=\"lg\" />\n          {hasPermission('titles.update') && (\n            <IconButton\n              elementType={Link}\n              to={`/admin/titles/${title.id}/edit`}\n              className=\"absolute bottom-6 right-4\"\n              color=\"white\"\n            >\n              <EditIcon />\n            </IconButton>\n          )}\n        </div>\n      }\n    >\n      {isStreamingMode && title.primary_video && (\n        <WatchNowButton video={title.primary_video} variant=\"flat\" />\n      )}\n      <WatchlistButton\n        item={title}\n        variant={isStreamingMode ? 'outline' : 'flat'}\n      />\n      <ShareButton title={title} />\n      <dl className=\"mt-14\">\n        {language && (\n          <DetailItem label={<Trans message=\"Original language\" />}>\n            <Trans message={language} />\n          </DetailItem>\n        )}\n        {title.original_title !== title.name && (\n          <DetailItem label={<Trans message=\"Original title\" />}>\n            {title.original_title}\n          </DetailItem>\n        )}\n        {title.budget ? (\n          <DetailItem label={<Trans message=\"Budget\" />}>\n            <FormattedCurrency value={title.budget} currency=\"usd\" />\n          </DetailItem>\n        ) : null}\n        {title.revenue ? (\n          <DetailItem label={<Trans message=\"Revenue\" />}>\n            <FormattedCurrency value={title.revenue} currency=\"usd\" />\n          </DetailItem>\n        ) : null}\n        {title.production_countries?.length ? (\n          <DetailItem label={<Trans message=\"Production countries\" />}>\n            <ul className=\"mt-12 flex flex-wrap gap-8\">\n              {title.production_countries.map(country => (\n                <li\n                  key={country.id}\n                  className=\"w-max rounded-full border px-10 py-4 text-xs\"\n                >\n                  <ProductionCountryLink country={country} />\n                </li>\n              ))}\n            </ul>\n          </DetailItem>\n        ) : null}\n        {title.keywords?.length ? (\n          <DetailItem label={<Trans message=\"Keywords\" />}>\n            <ul className=\"mt-12 flex flex-wrap gap-8\">\n              {title.keywords.map(keyword => (\n                <li\n                  key={keyword.id}\n                  className=\"w-max rounded-full border px-10 py-4 text-xs\"\n                >\n                  <KeywordLink keyword={keyword} />\n                </li>\n              ))}\n            </ul>\n          </DetailItem>\n        ) : null}\n      </dl>\n    </TitlePageAsideLayout>\n  );\n}\n\ninterface ShareButtonProps {\n  title: Title;\n}\nfunction ShareButton({title}: ShareButtonProps) {\n  const link = getTitleLink(title, {absolute: true});\n  return (\n    <ShareMenuTrigger link={link}>\n      <Button\n        variant=\"outline\"\n        color=\"primary\"\n        startIcon={<ShareIcon />}\n        className=\"mt-14 min-h-40 w-full\"\n      >\n        <Trans message=\"Share\" />\n      </Button>\n    </ShareMenuTrigger>\n  );\n}\n","import {GetTitleResponse, useTitle} from '@app/titles/requests/use-title';\nimport {PageStatus} from '@common/http/page-status';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport React, {Fragment} from 'react';\nimport {TitlePageMainContent} from '@app/titles/pages/title-page/title-page-main-content';\nimport {TitlePageHeader} from '@app/titles/pages/title-page/title-page-header';\nimport {TitlePageHeaderImage} from '@app/titles/pages/title-page/title-page-header-image';\nimport {TitlePageAside} from '@app/titles/pages/title-page/title-page-aside';\nimport {SitePageLayout} from '@app/site-page-layout';\n\nexport function TitlePage() {\n  const query = useTitle('titlePage');\n\n  const content = query.data ? (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <PageContent data={query.data} />\n    </Fragment>\n  ) : (\n    <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n  );\n\n  return <SitePageLayout>{content}</SitePageLayout>;\n}\n\ninterface PageContentProps {\n  data: GetTitleResponse;\n}\nfunction PageContent({data}: PageContentProps) {\n  return (\n    <Fragment>\n      <TitlePageHeaderImage title={data.title} />\n      <div className=\"container mx-auto mt-24 px-14 md:mt-40 md:px-24\">\n        <div className=\"items-start gap-54 md:flex\">\n          <TitlePageAside data={data} className=\"max-lg:hidden\" />\n          <div className=\"flex-auto\">\n            <TitlePageHeader title={data.title} />\n            <TitlePageMainContent data={data} />\n          </div>\n        </div>\n      </div>\n    </Fragment>\n  );\n}\n","import React, {Fragment} from 'react';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {PageStatus} from '@common/http/page-status';\nimport {GetSeasonResponse, useSeason} from '@app/seasons/requests/use-season';\nimport {TitlePageHeaderImage} from '@app/titles/pages/title-page/title-page-header-image';\nimport {Title} from '@app/titles/models/title';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {Trans} from '@common/i18n/trans';\nimport {TitleLink} from '@app/titles/title-link';\nimport {SeasonLink} from '@app/seasons/season-link';\nimport {useParams} from 'react-router-dom';\nimport clsx from 'clsx';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {EpisodeListItem} from '@app/seasons/episode-list-item';\nimport {useSeasonEpisodes} from '@app/titles/requests/use-season-episodes';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\n\nexport function SeasonPage() {\n  const query = useSeason('seasonPage');\n  const content = query.data ? (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <PageContent data={query.data} />\n    </Fragment>\n  ) : (\n    <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n  );\n\n  return <SitePageLayout>{content}</SitePageLayout>;\n}\n\ninterface PageContentProps {\n  data: GetSeasonResponse;\n}\nfunction PageContent({data}: PageContentProps) {\n  const {title, season} = data;\n  return (\n    <div>\n      <TitlePageHeaderImage title={title} season={season} />\n      <div className=\"container mx-auto mt-24 px-14 md:mt-40 md:px-24\">\n        <div className=\"mb-24 flex items-center gap-12\">\n          <TitlePoster size=\"w-70\" srcSize=\"sm\" title={title} />\n          <div>\n            <TitleLink title={title} color=\"primary\" className=\"text-xl\" />\n            <div className=\"text-lg\">\n              <Trans message=\"Episode list\" />\n            </div>\n          </div>\n        </div>\n        <SeasonList title={title} />\n        <EpisodeList data={data} />\n        <SeasonList title={title} />\n      </div>\n    </div>\n  );\n}\n\ninterface SeasonListProps {\n  title: Title;\n}\nfunction SeasonList({title}: SeasonListProps) {\n  const {season} = useParams();\n  return (\n    <div>\n      <div className=\"mb-4 text-base font-semibold\">\n        <Trans message=\"Seasons\" />:\n      </div>\n      <div className=\"mb-34 flex flex-wrap items-center gap-10\">\n        {[...new Array(title.seasons_count).keys()].map(index => {\n          const number = index + 1;\n          const isActive = season === `${number}`;\n          return (\n            <SeasonLink\n              key={number}\n              title={title}\n              seasonNumber={number}\n              className={clsx(\n                'flex h-30 w-30 flex-shrink-0 items-center justify-center rounded border text-base',\n                isActive\n                  ? 'pointer-events-none bg-primary text-white'\n                  : 'text-primary',\n              )}\n            >\n              {number}\n            </SeasonLink>\n          );\n        })}\n      </div>\n    </div>\n  );\n}\n\ninterface EpisodeListProps {\n  data: GetSeasonResponse;\n}\nfunction EpisodeList({data: {episodes, title}}: EpisodeListProps) {\n  const query = useSeasonEpisodes(episodes);\n  return (\n    <main>\n      {query.items.map(episode => (\n        <EpisodeListItem\n          key={episode.id}\n          episode={episode}\n          title={title}\n          allowRating\n          showPlayButton\n          className=\"mb-34\"\n        />\n      ))}\n      <InfiniteScrollSentinel query={query} />\n    </main>\n  );\n}\n","import {TitlePageHeaderLayout} from '@app/titles/pages/title-page/title-page-header-layout';\nimport {BulletSeparatedItems} from '@app/titles/bullet-separated-items';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport {FormattedDuration} from '@common/i18n/formatted-duration';\nimport {InteractableRating} from '@app/reviews/interactable-rating';\nimport {Breadcrumb} from '@common/ui/breadcrumbs/breadcrumb';\nimport {BreadcrumbItem} from '@common/ui/breadcrumbs/breadcrumb-item';\nimport {getTitleLink} from '@app/titles/title-link';\nimport {getSeasonLink} from '@app/seasons/season-link';\nimport React from 'react';\nimport {Title} from '@app/titles/models/title';\nimport {Episode} from '@app/titles/models/episode';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\n\ninterface Props {\n  title: Title;\n  episode: Episode;\n  showPoster?: boolean;\n}\nexport function EpisodePageHeader({title, episode, showPoster}: Props) {\n  const navigate = useNavigate();\n  const runtime = episode.runtime || title.runtime;\n  return (\n    <TitlePageHeaderLayout\n      poster={\n        showPoster ? (\n          <TitlePoster title={title} size=\"w-80\" srcSize=\"sm\" />\n        ) : undefined\n      }\n      name={episode.name}\n      description={\n        <BulletSeparatedItems className=\"my-10 md:my-0\">\n          <Trans\n            message=\"Aired :date\"\n            values={{\n              date: <FormattedDate date={episode.release_date} />,\n            }}\n          />\n          <span className=\"uppercase\">{title.certification}</span>\n          {runtime ? <FormattedDuration minutes={runtime} verbose /> : null}\n        </BulletSeparatedItems>\n      }\n      right={<InteractableRating title={title} episode={episode} />}\n    >\n      <Breadcrumb isNavigation>\n        <BreadcrumbItem onSelected={() => navigate(getTitleLink(title))}>\n          {title.name}\n        </BreadcrumbItem>\n        <BreadcrumbItem\n          onSelected={() =>\n            navigate(getSeasonLink(title, episode.season_number))\n          }\n        >\n          <Trans\n            message=\"Season :number\"\n            values={{number: episode.season_number}}\n          />\n        </BreadcrumbItem>\n        <BreadcrumbItem>\n          <Trans\n            message=\"Episode :number\"\n            values={{number: episode.episode_number}}\n          />\n        </BreadcrumbItem>\n      </Breadcrumb>\n    </TitlePageHeaderLayout>\n  );\n}\n","import {PageStatus} from '@common/http/page-status';\nimport {Title} from '@app/titles/models/title';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport React, {Fragment} from 'react';\nimport {TitlePageHeaderImage} from '@app/titles/pages/title-page/title-page-header-image';\nimport {\n  GetEpisodeResponse,\n  useEpisode,\n} from '@app/episodes/requests/use-episode';\nimport {ChipList} from '@common/ui/forms/input-field/chip-field/chip-list';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\nimport {Link} from 'react-router-dom';\nimport {TitlePageCast} from '@app/titles/pages/title-page/sections/title-page-cast';\nimport {RelatedTitlesPanel} from '@app/titles/related-titles-panel';\nimport {CompactCredits} from '@app/titles/compact-credits';\nimport {TitlePageAsideLayout} from '@app/titles/pages/title-page/title-page-aside-layout';\nimport {WatchlistButton} from '@app/user-lists/watchlist-button';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {getGenreLink} from '@app/titles/genre-link';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {EpisodePageHeader} from '@app/episodes/episode-page-header';\nimport {TruncatedDescription} from '@common/ui/truncated-description';\nimport {TitlePageVideoGrid} from '@app/titles/pages/title-page/sections/title-page-video-grid';\nimport {useIsStreamingMode} from '@app/videos/use-is-streaming-mode';\nimport {WatchNowButton} from '@app/titles/pages/title-page/watch-now-button';\nimport {Episode} from '@app/titles/models/episode';\nimport {TitlePageSections} from '@app/titles/pages/title-page/sections/title-page-sections';\nimport {TitlePageEpisodeGrid} from '@app/titles/pages/title-page/sections/title-page-episode-grid';\nimport {Trans} from '@common/i18n/trans';\nimport {useSettings} from '@common/core/settings/use-settings';\n\nexport function EpisodePage() {\n  const query = useEpisode('episodePage');\n\n  const content = query.data ? (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <PageContent data={query.data} />\n    </Fragment>\n  ) : (\n    <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n  );\n\n  return <SitePageLayout>{content}</SitePageLayout>;\n}\n\ninterface PageContentProps {\n  data: GetEpisodeResponse;\n}\nfunction PageContent({data}: PageContentProps) {\n  const {episode, title} = data;\n  return (\n    <div>\n      <TitlePageHeaderImage title={title} episode={episode} />\n      <div className=\"container mx-auto mt-12 px-14 md:mt-40 md:px-24\">\n        <div className=\"items-start gap-54 md:flex\">\n          <Aside title={title} episode={episode} />\n          <div className=\"flex-auto\">\n            <EpisodePageHeader title={title} episode={episode} />\n            <MainContent data={data} />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\ninterface MainContentProps {\n  data: GetEpisodeResponse;\n}\nfunction MainContent({data}: MainContentProps) {\n  const {episode, title, credits} = data;\n  const {title_page} = useSettings();\n  return (\n    <main className=\"@container\">\n      {title.genres?.length ? (\n        <ChipList>\n          {title.genres.map(genre => (\n            <Chip\n              className=\"capitalize\"\n              elementType={Link}\n              to={getGenreLink(genre)}\n              key={genre.id}\n            >\n              {genre.display_name || genre.name}\n            </Chip>\n          ))}\n        </ChipList>\n      ) : null}\n      <TruncatedDescription\n        className=\"mt-16\"\n        description={episode.description}\n      />\n      <CompactCredits credits={credits} />\n      {title_page?.sections.map(name => (\n        <EpisodePageSection key={name} name={name} data={data} />\n      ))}\n    </main>\n  );\n}\n\ninterface EpisodePageSectionProps {\n  data: GetEpisodeResponse;\n  name: (typeof TitlePageSections)[number];\n}\nfunction EpisodePageSection({name, data}: EpisodePageSectionProps) {\n  switch (name) {\n    case 'videos':\n      return <TitlePageVideoGrid title={data.title} episode={data.episode} />;\n    case 'cast':\n      return <TitlePageCast credits={data.credits?.actors} />;\n    case 'related':\n      return <RelatedTitlesPanel title={data.title} />;\n    case 'episodes':\n      return (\n        <TitlePageEpisodeGrid\n          data={data}\n          label={<Trans message=\"Other episodes\" />}\n        />\n      );\n    default:\n      return null;\n  }\n}\n\ninterface AsideProps {\n  title: Title;\n  episode: Episode;\n}\nfunction Aside({title, episode}: AsideProps) {\n  const isStreamingMode = useIsStreamingMode();\n  return (\n    <TitlePageAsideLayout\n      className=\"max-md:hidden\"\n      poster={<TitlePoster title={title} size=\"w-full\" srcSize=\"lg\" />}\n    >\n      {isStreamingMode && episode.primary_video && (\n        <WatchNowButton\n          video={episode.primary_video}\n          variant=\"flat\"\n          defaultLabel\n        />\n      )}\n      <WatchlistButton\n        item={title}\n        variant={isStreamingMode ? 'outline' : 'flat'}\n      />\n    </TitlePageAsideLayout>\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 {useParams} from 'react-router-dom';\nimport {Title} from '@app/titles/models/title';\nimport {Video} from '@app/titles/models/video';\nimport {Episode} from '@app/titles/models/episode';\nimport {getBootstrapData} from '@common/core/bootstrap-data/use-backend-bootstrap-data';\n\nexport interface UseWatchPageVideoResponse extends BackendResponse {\n  title: Title;\n  episode?: Episode;\n  video: Video;\n  related_videos: Video[];\n  alternative_videos: Video[];\n}\n\nexport function useWatchPageVideo() {\n  const {videoId} = useParams();\n  return useQuery<UseWatchPageVideoResponse>({\n    queryKey: ['video', 'watch-page', videoId],\n    queryFn: () => fetchVideo(videoId),\n    placeholderData: keepPreviousData,\n    initialData: () => {\n      const data = getBootstrapData().loaders?.watchPage;\n      if (data && `${data.video.id}` === videoId) {\n        return data;\n      }\n    },\n  });\n}\n\nfunction fetchVideo(videoId?: string) {\n  return apiClient\n    .get<UseWatchPageVideoResponse>(`watch/${videoId}`)\n    .then(response => response.data);\n}\n","import {Commentable} from '@common/comments/commentable';\nimport {Comment} from '@common/comments/comment';\nimport {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\n\ninterface QueryParams {\n  perPage?: number;\n}\n\nexport function commentsQueryKey(\n  commentable: Commentable,\n  params: QueryParams = {}\n) {\n  return ['comment', `${commentable.id}-${commentable.model_type}`, params];\n}\n\nexport function useComments(\n  commentable: Commentable,\n  params: QueryParams = {}\n) {\n  return useInfiniteData<Comment>({\n    queryKey: commentsQueryKey(commentable, params),\n    endpoint: 'commentable/comments',\n    //paginate: 'cursor',\n    queryParams: {\n      commentable_type: commentable.model_type,\n      commentable_id: commentable.id,\n      ...params,\n    },\n  });\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation, useQueryClient} from '@tanstack/react-query';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {Commentable} from '@common/comments/commentable';\nimport {Comment} from '@common/comments/comment';\n\ninterface Response extends BackendResponse {\n  //\n}\n\nexport interface CreateCommentPayload {\n  commentable: Commentable;\n  content: string;\n  inReplyTo?: Comment;\n}\n\nexport function useCreateComment() {\n  const queryClient = useQueryClient();\n  return useMutation({\n    mutationFn: (props: CreateCommentPayload) => createComment(props),\n    onSuccess: async (response, props) => {\n      await queryClient.invalidateQueries({\n        queryKey: [\n          'comment',\n          `${props.commentable.id}-${props.commentable.model_type}`,\n        ],\n      });\n      toast(message('Comment posted'));\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n\nfunction createComment({\n  commentable,\n  content,\n  inReplyTo,\n  ...other\n}: CreateCommentPayload): Promise<Response> {\n  const payload = {\n    commentable_id: commentable.id,\n    commentable_type: commentable.model_type,\n    content,\n    inReplyTo,\n    ...other,\n  };\n  return apiClient.post('comment', payload).then(r => r.data);\n}\n","import {Commentable} from '@common/comments/commentable';\nimport {Comment} from '@common/comments/comment';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {useAuth} from '@common/auth/use-auth';\nimport {useCreateComment} from '@common/comments/requests/use-create-comment';\nimport {RefObject, useState} from 'react';\nimport clsx from 'clsx';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Avatar} from '@common/ui/images/avatar';\nimport {message} from '@common/i18n/message';\nimport {Trans} from '@common/i18n/trans';\nimport {useObjectRef} from '@react-aria/utils';\nimport {Button} from '@common/ui/buttons/button';\n\nexport interface NewCommentFormProps {\n  commentable: Commentable;\n  inReplyTo?: Comment;\n  onSuccess?: () => void;\n  className?: string;\n  autoFocus?: boolean;\n  inputRef?: RefObject<HTMLInputElement>;\n  // additional data that should be sent to backend when creating comments\n  payload?: Record<string, number | string>;\n}\nexport function NewCommentForm({\n  commentable,\n  inReplyTo,\n  onSuccess,\n  className,\n  autoFocus,\n  payload,\n  ...props\n}: NewCommentFormProps) {\n  const {trans} = useTrans();\n  const {user} = useAuth();\n  const createComment = useCreateComment();\n  const inputRef = useObjectRef<HTMLInputElement>(props.inputRef);\n  const [inputIsExpanded, setInputIsExpanded] = useState(false);\n  const [inputValue, setInputValue] = useState('');\n\n  const clearInput = () => {\n    setInputIsExpanded(false);\n    if (inputRef.current) {\n      inputRef.current.blur();\n      setInputValue('');\n    }\n  };\n\n  return (\n    <form\n      className={clsx('py-6 flex gap-24', className)}\n      onSubmit={e => {\n        e.preventDefault();\n        if (inputValue && !createComment.isPending) {\n          createComment.mutate(\n            {\n              ...payload,\n              commentable,\n              content: inputValue,\n              inReplyTo,\n            },\n            {\n              onSuccess: () => {\n                clearInput();\n                onSuccess?.();\n              },\n            },\n          );\n        }\n      }}\n    >\n      <Avatar size=\"xl\" circle src={user?.avatar} label={user?.display_name} />\n      <div className=\"flex-auto\">\n        <div className=\"text-xs text-muted mb-10\">\n          <Trans\n            message=\"Comment as :name\"\n            values={{\n              name: (\n                <span className=\"font-medium text\">{user?.display_name}</span>\n              ),\n            }}\n          />\n        </div>\n        <TextField\n          inputRef={inputRef}\n          autoFocus={autoFocus}\n          inputElementType=\"textarea\"\n          inputClassName=\"resize-none\"\n          value={inputValue}\n          onChange={e => setInputValue(e.target.value)}\n          onFocus={() => setInputIsExpanded(true)}\n          onBlur={() => {\n            if (!inputValue) {\n              setInputIsExpanded(false);\n            }\n          }}\n          minLength={3}\n          rows={inputIsExpanded ? 3 : 1}\n          placeholder={\n            inReplyTo\n              ? trans(message('Write a reply'))\n              : trans(message('Leave a comment'))\n          }\n        />\n        {inputIsExpanded && (\n          <div className=\"flex items-center gap-12 justify-end mt-12\">\n            <Button variant=\"outline\" onClick={() => clearInput()}>\n              <Trans message=\"Cancel\" />\n            </Button>\n            <Button\n              variant=\"outline\"\n              color=\"primary\"\n              type=\"submit\"\n              disabled={createComment.isPending || inputValue.length < 3}\n            >\n              <Trans message=\"Comment\" />\n            </Button>\n          </div>\n        )}\n      </div>\n    </form>\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 {VotableModel} from '@common/votes/votable-model';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {\n  model: VotableModel;\n}\n\ninterface Payload {\n  voteType: 'upvote' | 'downvote';\n}\n\nexport function useStoreVote(model: VotableModel) {\n  return useMutation({\n    mutationFn: (payload: Payload) => changeVote(model, payload),\n    onSuccess: response => {\n      //\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n\nfunction changeVote(model: VotableModel, payload: Payload) {\n  return apiClient\n    .post<Response>('vote', {\n      vote_type: payload.voteType,\n      model_id: model.id,\n      model_type: model.model_type,\n    })\n    .then(r => r.data);\n}\n","import {ThumbUpIcon} from '@common/icons/material/ThumbUp';\nimport {ThumbDownIcon} from '@common/icons/material/ThumbDown';\nimport {VotableModel} from '@common/votes/votable-model';\nimport {Button} from '@common/ui/buttons/button';\nimport {useStoreVote} from '@common/votes/requests/use-store-vote';\nimport {useState} from 'react';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport clsx from 'clsx';\n\ninterface Props {\n  model: VotableModel;\n  className?: string;\n  showUpvotesOnly?: boolean;\n}\nexport function ThumbButtons({model, className, showUpvotesOnly}: Props) {\n  const changeVote = useStoreVote(model);\n\n  const [upvotes, setUpvotes] = useState(model.upvotes || 0);\n  const [downvotes, setDownvotes] = useState(model.downvotes || 0);\n  const [currentVote, setCurrentVote] = useState(model.current_vote);\n\n  const syncLocalState = (model: VotableModel) => {\n    setUpvotes(model.upvotes);\n    setDownvotes(model.downvotes);\n    setCurrentVote(model.current_vote);\n  };\n\n  return (\n    <div className={clsx(className, 'whitespace-nowrap')}>\n      <Button\n        className=\"gap-6\"\n        sizeClassName=\"px-8 py-4\"\n        color={currentVote === 'upvote' ? 'primary' : undefined}\n        disabled={changeVote.isPending}\n        aria-label=\"Upvote\"\n        onClick={() => {\n          changeVote.mutate(\n            {voteType: 'upvote'},\n            {\n              onSuccess: response => syncLocalState(response.model),\n            },\n          );\n        }}\n      >\n        <ThumbUpIcon />\n        <div>\n          <FormattedNumber value={upvotes} />\n        </div>\n      </Button>\n      {!showUpvotesOnly && (\n        <Button\n          className=\"gap-6\"\n          sizeClassName=\"px-8 py-4\"\n          color={currentVote === 'downvote' ? 'primary' : undefined}\n          disabled={changeVote.isPending}\n          aria-label=\"Downvote\"\n          onClick={() => {\n            changeVote.mutate(\n              {voteType: 'downvote'},\n              {\n                onSuccess: response => syncLocalState(response.model),\n              },\n            );\n          }}\n        >\n          <ThumbDownIcon />\n          <div>\n            <FormattedNumber value={downvotes} />\n          </div>\n        </Button>\n      )}\n    </div>\n  );\n}\n","import React, {Fragment, memo, useContext, useState} from 'react';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {Link} from 'react-router-dom';\nimport {Comment} from '@common/comments/comment';\nimport {useAuth} from '@common/auth/use-auth';\nimport {UserAvatar} from '@common/ui/images/user-avatar';\nimport {Button} from '@common/ui/buttons/button';\nimport {Trans} from '@common/i18n/trans';\nimport {NewCommentForm} from '@common/comments/new-comment-form';\nimport {User} from '@common/auth/user';\nimport {Commentable} from '@common/comments/commentable';\nimport {useDeleteComments} from '@common/comments/requests/use-delete-comments';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {queryClient} from '@common/http/query-client';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {FormattedDuration} from '@common/i18n/formatted-duration';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {ThumbButtons} from '@common/votes/thumb-buttons';\nimport {ReplyIcon} from '@common/icons/material/Reply';\nimport {MoreVertIcon} from '@common/icons/material/MoreVert';\nimport {\n  Menu,\n  MenuItem,\n  MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\nimport {FormattedRelativeTime} from '@common/i18n/formatted-relative-time';\nimport {useSubmitReport} from '@common/reports/requests/use-submit-report';\n\ninterface CommentListItemProps {\n  comment: Comment;\n  commentable: Commentable;\n  canDelete?: boolean;\n}\nexport function CommentListItem({\n  comment,\n  commentable,\n  // user can delete comment if they have created it, or they have relevant permissions on commentable\n  canDelete,\n}: CommentListItemProps) {\n  const isMobile = useIsMobileMediaQuery();\n  const {user, hasPermission} = useAuth();\n  const [replyFormVisible, setReplyFormVisible] = useState(false);\n  const showReplyButton =\n    user != null &&\n    !comment.deleted &&\n    !isMobile &&\n    comment.depth < 5 &&\n    hasPermission('comments.create');\n\n  return (\n    <div\n      style={{paddingLeft: `${comment.depth * 20}px`}}\n      onClick={() => {\n        if (isMobile) {\n          setReplyFormVisible(!replyFormVisible);\n        }\n      }}\n    >\n      <div className=\"group flex min-h-70 items-start gap-24 py-18\">\n        <UserAvatar user={comment.user} size={isMobile ? 'lg' : 'xl'} circle />\n        <div className=\"flex-auto text-sm\">\n          <div className=\"mb-4 flex items-center gap-8\">\n            {comment.user && <UserDisplayName user={comment.user} />}\n            <time className=\"text-xs text-muted\">\n              <FormattedRelativeTime date={comment.created_at} />\n            </time>\n            {comment.position ? (\n              <Position commentable={commentable} position={comment.position} />\n            ) : null}\n          </div>\n          <div className=\"whitespace-pre-line\">\n            {comment.deleted ? (\n              <span className=\"italic text-muted\">\n                <Trans message=\"[COMMENT DELETED]\" />\n              </span>\n            ) : (\n              comment.content\n            )}\n          </div>\n          {!comment.deleted && (\n            <div className=\"-ml-8 mt-10 flex items-center gap-8\">\n              {showReplyButton && (\n                <Button\n                  sizeClassName=\"text-sm px-8 py-4\"\n                  startIcon={<ReplyIcon />}\n                  onClick={() => setReplyFormVisible(!replyFormVisible)}\n                >\n                  <Trans message=\"Reply\" />\n                </Button>\n              )}\n              <ThumbButtons model={comment} showUpvotesOnly />\n              <CommentOptionsTrigger\n                comment={comment}\n                canDelete={canDelete}\n                user={user}\n              />\n            </div>\n          )}\n        </div>\n      </div>\n      {replyFormVisible ? (\n        <NewCommentForm\n          className={!comment?.depth ? 'pl-20' : undefined}\n          commentable={commentable}\n          inReplyTo={comment}\n          autoFocus\n          onSuccess={() => {\n            setReplyFormVisible(false);\n          }}\n        />\n      ) : null}\n    </div>\n  );\n}\n\ninterface PositionProps {\n  commentable: Commentable;\n  position: number;\n}\nconst Position = memo(({commentable, position}: PositionProps) => {\n  if (!commentable.duration) return null;\n  const seconds = (position / 100) * (commentable.duration / 1000);\n  return (\n    <span className=\"text-xs text-muted\">\n      <Trans\n        message=\"at :position\"\n        values={{\n          position: <FormattedDuration seconds={seconds} />,\n        }}\n      />\n    </span>\n  );\n});\n\ninterface DeleteCommentsButtonProps {\n  comment: Comment;\n  canDelete?: boolean;\n  user: User | null;\n}\nexport function CommentOptionsTrigger({\n  comment,\n  canDelete,\n  user,\n}: DeleteCommentsButtonProps) {\n  const deleteComments = useDeleteComments();\n  const reportComment = useSubmitReport(comment);\n\n  const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);\n  const showDeleteButton =\n    (comment.user_id === user?.id || canDelete) && !comment.deleted;\n\n  const handleReport = () => {\n    reportComment.mutate({});\n  };\n\n  const handleDelete = (isConfirmed: boolean) => {\n    setIsDeleteDialogOpen(false);\n    if (isConfirmed) {\n      deleteComments.mutate(\n        {commentIds: [comment.id]},\n        {\n          onSuccess: () => {\n            queryClient.invalidateQueries({queryKey: ['comment']});\n          },\n        },\n      );\n    }\n  };\n\n  return (\n    <Fragment>\n      <MenuTrigger>\n        <Button startIcon={<MoreVertIcon />} sizeClassName=\"text-sm px-8 py-4\">\n          <Trans message=\"More\" />\n        </Button>\n        <Menu>\n          <MenuItem value=\"report\" onSelected={() => handleReport()}>\n            <Trans message=\"Report comment\" />\n          </MenuItem>\n          {showDeleteButton && (\n            <MenuItem\n              value=\"delete\"\n              onSelected={() => setIsDeleteDialogOpen(true)}\n            >\n              <Trans message=\"Delete\" />\n            </MenuItem>\n          )}\n        </Menu>\n      </MenuTrigger>\n      <DialogTrigger\n        type=\"modal\"\n        isOpen={isDeleteDialogOpen}\n        onClose={isConfirmed => handleDelete(isConfirmed)}\n      >\n        <ConfirmationDialog\n          isDanger\n          title={<Trans message=\"Delete comment?\" />}\n          body={\n            <Trans message=\"Are you sure you want to delete this comment?\" />\n          }\n          confirm={<Trans message=\"Delete\" />}\n        />\n      </DialogTrigger>\n    </Fragment>\n  );\n}\n\ninterface UserDisplayNameProps {\n  user: User;\n}\nfunction UserDisplayName({user}: UserDisplayNameProps) {\n  const {auth} = useContext(SiteConfigContext);\n  if (auth.getUserProfileLink) {\n    return (\n      <Link\n        to={auth.getUserProfileLink(user)}\n        className=\"text-base font-medium hover:underline\"\n      >\n        {user.display_name}\n      </Link>\n    );\n  }\n  return <div className=\"text-base font-medium\">{user.display_name}</div>;\n}\n","import {Comment} from '@common/comments/comment';\nimport {Trans} from '@common/i18n/trans';\nimport {CommentIcon} from '@common/icons/material/Comment';\nimport {Commentable} from '@common/comments/commentable';\nimport {useComments} from '@common/comments/requests/use-comments';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {CommentListItem} from '@common/comments/comment-list/comment-list-item';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {ReactNode} from 'react';\nimport {AccountRequiredCard} from '@common/comments/comment-list/account-required-card';\nimport {message} from '@common/i18n/message';\n\nconst accountRequiredMessage = message(\n  'Please <l>login</l> or <r>create account</r> to comment'\n);\n\ninterface CommentListProps {\n  commentable: Commentable;\n  canDeleteAllComments?: boolean;\n  className?: string;\n  children?: ReactNode;\n  perPage?: number;\n}\nexport function CommentList({\n  className,\n  commentable,\n  canDeleteAllComments = false,\n  children,\n  perPage = 25,\n}: CommentListProps) {\n  const {items, totalItems, ...query} = useComments(commentable, {perPage});\n\n  if (query.isError) {\n    return null;\n  }\n\n  return (\n    <div className={className}>\n      <div className=\"mb-8 pb-8 border-b flex items-center gap-8\">\n        <CommentIcon size=\"sm\" className=\"text-muted\" />\n        {query.isInitialLoading ? (\n          <Trans message=\"Loading comments...\" />\n        ) : (\n          <Trans\n            message=\":count comments\"\n            values={{count: <FormattedNumber value={totalItems || 0} />}}\n          />\n        )}\n      </div>\n      {children}\n      <AccountRequiredCard message={accountRequiredMessage} />\n      <AnimatePresence initial={false} mode=\"wait\">\n        {query.isInitialLoading ? (\n          <CommentSkeletons count={4} />\n        ) : (\n          <CommentListItems\n            comments={items}\n            canDeleteAllComments={canDeleteAllComments}\n            commentable={commentable}\n          />\n        )}\n      </AnimatePresence>\n      <InfiniteScrollSentinel query={query} variant=\"loadMore\" />\n    </div>\n  );\n}\n\ninterface CommentListItemsProps {\n  comments: Comment[];\n  canDeleteAllComments: boolean;\n  commentable: Commentable;\n}\nfunction CommentListItems({\n  comments,\n  commentable,\n  canDeleteAllComments,\n}: CommentListItemsProps) {\n  if (!comments.length) {\n    return (\n      <IllustratedMessage\n        className=\"mt-24\"\n        size=\"sm\"\n        title={<Trans message=\"Seems a little quiet over here\" />}\n        description={<Trans message=\"Be the first to comment\" />}\n      />\n    );\n  }\n\n  return (\n    <m.div key=\"comments\" {...opacityAnimation}>\n      {comments.map(comment => (\n        <CommentListItem\n          key={comment.id}\n          comment={comment}\n          commentable={commentable}\n          canDelete={canDeleteAllComments}\n        />\n      ))}\n    </m.div>\n  );\n}\n\ninterface CommentSkeletonsProps {\n  count: number;\n}\nfunction CommentSkeletons({count}: CommentSkeletonsProps) {\n  return (\n    <m.div key=\"loading-skeleton\" {...opacityAnimation}>\n      {[...new Array(count).keys()].map(index => (\n        <div\n          key={index}\n          className=\"flex items-start gap-24 py-18 min-h-70 group\"\n        >\n          <Skeleton variant=\"avatar\" radius=\"rounded-full\" size=\"w-60 h-60\" />\n          <div className=\"text-sm flex-auto\">\n            <Skeleton className=\"text-base max-w-184 mb-4\" />\n            <Skeleton className=\"text-sm\" />\n            <div className=\"flex items-center gap-8 mt-10\">\n              <Skeleton className=\"text-sm max-w-70\" />\n              <Skeleton className=\"text-sm max-w-40\" />\n              <Skeleton className=\"text-sm max-w-60\" />\n            </div>\n          </div>\n        </div>\n      ))}\n    </m.div>\n  );\n}\n","import {useWatchPageVideo} from '@app/videos/requests/use-watch-page-video';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {TitleLink} from '@app/titles/title-link';\nimport React, {Fragment, ReactNode, useState} from 'react';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {ThumbButtons} from '@common/votes/thumb-buttons';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ShareIcon} from '@common/icons/material/Share';\nimport {FlagIcon} from '@common/icons/material/Flag';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\nimport {useSubmitReport} from '@common/reports/requests/use-submit-report';\nimport {useDeleteReport} from '@common/reports/requests/use-delete-report';\nimport {Video} from '@app/titles/models/video';\nimport {useIsStreamingMode} from '@app/videos/use-is-streaming-mode';\nimport {EpisodeLink} from '@app/episodes/episode-link';\nimport {CompactSeasonEpisode} from '@app/episodes/compact-season-episode';\nimport {ShareMenuTrigger} from '@app/sharing/share-menu-trigger';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\n\nexport function WatchPageTitleDetails() {\n  const {data} = useWatchPageVideo();\n  const isStreamingMode = useIsStreamingMode();\n\n  const content = !data ? (\n    <Layout\n      key=\"skeleton\"\n      poster={<Skeleton variant=\"rect\" size=\"w-132 aspect-poster\" />}\n      titleLink={<Skeleton className=\"max-w-144\" />}\n      videoName={<Skeleton className=\"max-w-240\" />}\n      description={\n        <Fragment>\n          <Skeleton />\n          <Skeleton />\n        </Fragment>\n      }\n      rate={\n        <div className=\"flex h-32 items-center gap-2\">\n          <Skeleton variant=\"rect\" size=\"w-56 h-24\" className=\"mr-10\" />\n          <Skeleton variant=\"rect\" size=\"w-56 h-24\" />\n        </div>\n      }\n    />\n  ) : (\n    <Layout\n      key=\"loaded\"\n      poster={\n        <TitlePoster\n          size=\"w-132\"\n          srcSize=\"md\"\n          title={data.title}\n          showPlayButton\n          className=\"max-md:hidden\"\n        />\n      }\n      titleLink={<TitleLink title={data.title} />}\n      videoName={!isStreamingMode ? data.video.name : undefined}\n      episodeName={\n        data.episode ? (\n          <EpisodeLink title={data.title} episode={data.episode}>\n            {data.episode.name} (<CompactSeasonEpisode episode={data.episode} />\n            )\n          </EpisodeLink>\n        ) : undefined\n      }\n      description={data.episode?.description || data.title.description}\n      rate={\n        <div className=\"flex items-center gap-2\">\n          <ThumbButtons model={data.video} className=\"mr-auto\" />\n          <ReportButton video={data.video} />\n          <ShareButton video={data.video} />\n        </div>\n      }\n    />\n  );\n\n  return (\n    <AnimatePresence initial={false} mode=\"wait\">\n      {content}\n    </AnimatePresence>\n  );\n}\n\ninterface ShareButtonProps {\n  video: Video;\n}\nfunction ShareButton({video}: ShareButtonProps) {\n  const link = getWatchLink(video, {absolute: true});\n  return (\n    <ShareMenuTrigger link={link}>\n      <Tooltip label={<Trans message=\"Share\" />}>\n        <IconButton>\n          <ShareIcon />\n        </IconButton>\n      </Tooltip>\n    </ShareMenuTrigger>\n  );\n}\n\ninterface ReportButtonProps {\n  video: Video;\n}\nfunction ReportButton({video}: ReportButtonProps) {\n  const report = useSubmitReport(video);\n  const deleteReport = useDeleteReport(video);\n  const [isReported, setIsReported] = useState(video.current_user_reported);\n\n  return (\n    <Tooltip label={<Trans message=\"Report\" />}>\n      <IconButton\n        onClick={() => {\n          if (isReported) {\n            deleteReport.mutate();\n          } else {\n            report.mutate({});\n          }\n          setIsReported(!isReported);\n        }}\n      >\n        <FlagIcon />\n      </IconButton>\n    </Tooltip>\n  );\n}\n\ninterface LayoutProps {\n  poster?: ReactNode;\n  titleLink: ReactNode;\n  videoName: ReactNode;\n  episodeName?: ReactNode;\n  description: ReactNode;\n  rate?: ReactNode;\n}\nfunction Layout({\n  poster,\n  titleLink,\n  videoName,\n  episodeName,\n  description,\n  rate,\n}: LayoutProps) {\n  return (\n    <m.div\n      className=\"flex items-start gap-16 overflow-hidden rounded pr-6\"\n      {...opacityAnimation}\n    >\n      {poster}\n      <div className=\"flex-auto py-6\">\n        <h1 className=\"mb-6 text-2xl font-medium\">{titleLink}</h1>\n        {episodeName && (\n          <div className=\"text-base font-medium\">{episodeName}</div>\n        )}\n        {videoName && <div className=\"text-base font-medium\">{videoName}</div>}\n        <div className=\"my-12\">{rate}</div>\n        {description && (\n          <p className=\"max-w-780 text-sm text-muted\">{description}</p>\n        )}\n      </div>\n    </m.div>\n  );\n}\n","import {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Trans} from '@common/i18n/trans';\nimport {VideoGridItem, VideoGridItemSkeleton} from '@app/titles/video-grid';\nimport React, {ReactNode} from 'react';\nimport {useWatchPageVideo} from '@app/videos/requests/use-watch-page-video';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {useIsStreamingMode} from '@app/videos/use-is-streaming-mode';\nimport {Video} from '@app/titles/models/video';\nimport {CompactSeasonEpisode} from '@app/episodes/compact-season-episode';\nimport clsx from 'clsx';\n\nexport function WatchPageAside() {\n  const {data} = useWatchPageVideo();\n\n  const content = !data ? (\n    <m.div key=\"skeleton\" {...opacityAnimation}>\n      <VideoGridItemSkeleton className=\"mb-34\" />\n      <VideoGridItemSkeleton className=\"mb-34\" />\n      <VideoGridItemSkeleton className=\"mb-34\" />\n    </m.div>\n  ) : (\n    <m.div key=\"loaded\" {...opacityAnimation}>\n      {data.related_videos.map(video => (\n        <RelatedVideo video={video} key={video.id} activeVideo={data.video} />\n      ))}\n    </m.div>\n  );\n\n  return (\n    <aside className=\"w-350 flex-shrink-0 max-lg:mt-54\">\n      <SiteSectionHeading\n        fontWeight=\"font-medium\"\n        fontSize=\"text-2xl\"\n        margin=\"mb-28\"\n      >\n        <Header video={data?.video} />\n      </SiteSectionHeading>\n      <AnimatePresence initial={false} mode=\"wait\">\n        {content}\n      </AnimatePresence>\n    </aside>\n  );\n}\n\ninterface HeaderProps {\n  video?: Video;\n}\nfunction Header({video}: HeaderProps) {\n  const isStreamingMode = useIsStreamingMode();\n\n  if (!video) {\n    return <div className=\"h-32\" />;\n  }\n\n  return isStreamingMode ? (\n    <Trans message=\"Related movies & series\" />\n  ) : (\n    <Trans message=\"Related videos\" />\n  );\n}\n\ninterface RelatedVideoProps {\n  video: Video;\n  activeVideo: Video;\n}\nfunction RelatedVideo({video, activeVideo}: RelatedVideoProps) {\n  const isStreamingMode = useIsStreamingMode();\n\n  let name: ReactNode = video.name;\n\n  if (isStreamingMode) {\n    if (video.episode) {\n      name = (\n        <span>\n          {video.episode.name} (<CompactSeasonEpisode episode={video.episode} />\n          )\n        </span>\n      );\n    } else {\n      name = video.title!.name;\n    }\n  }\n\n  return (\n    <VideoGridItem\n      video={video}\n      title={video.title}\n      episode={video.episode}\n      forceTitleBackdrop={isStreamingMode}\n      className={clsx(\n        'mb-24 text-sm',\n        activeVideo.id === video.id && 'text-primary'\n      )}\n      showCategory={!isStreamingMode}\n      name={name}\n    />\n  );\n}\n","import {UseWatchPageVideoResponse} from '@app/videos/requests/use-watch-page-video';\nimport {MediaPlayIcon} from '@common/icons/media/media-play';\nimport {getWatchLink} from '@app/videos/watch-page/get-watch-link';\nimport {Button} from '@common/ui/buttons/button';\nimport {Link, useParams} from 'react-router-dom';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {Skeleton} from '@common/ui/skeleton/skeleton';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport clsx from 'clsx';\nimport {Video} from '@app/titles/models/video';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport React, {Fragment} from 'react';\nimport {EpisodeSelector} from '@app/videos/watch-page/episode-selector';\nimport {MediaEpisodesIcon} from '@common/icons/media/media-episodes';\nimport {Trans} from '@common/i18n/trans';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {\n  Menu,\n  MenuItem,\n  MenuTrigger,\n} from '@common/ui/navigation/menu/menu-trigger';\n\nconst className = 'flex items-center flex-wrap gap-14';\n\ninterface Props {\n  data: UseWatchPageVideoResponse | undefined;\n}\nexport function WatchPageAlternativeVideos({data}: Props) {\n  const navigate = useNavigate();\n  const {streaming} = useSettings();\n  const title = data?.title;\n  const episode = data?.episode;\n  const video = data?.video;\n\n  const showEpisodeSelector =\n    title &&\n    episode &&\n    video &&\n    (video.type === 'embed' || video.type === 'external');\n\n  if (!showEpisodeSelector && !streaming.show_video_selector) {\n    return null;\n  }\n\n  return (\n    <div className=\"mt-14 flex items-start justify-between gap-48\">\n      {streaming.show_video_selector && (\n        <Fragment>\n          <VideoDropdown\n            className=\"lg:hidden\"\n            videos={data?.alternative_videos || []}\n          />\n          <div className=\"max-lg:hidden\">\n            <AnimatePresence initial={false} mode=\"wait\">\n              {data ? (\n                <VideoList videos={data.alternative_videos} />\n              ) : (\n                <Skeletons />\n              )}\n            </AnimatePresence>\n          </div>\n        </Fragment>\n      )}\n      {showEpisodeSelector && (\n        <EpisodeSelector\n          title={title}\n          currentEpisode={episode}\n          onSelected={episode => {\n            navigate(getWatchLink(episode.primary_video));\n          }}\n          trigger={\n            <Button\n              variant=\"outline\"\n              className=\"min-h-40\"\n              startIcon={<MediaEpisodesIcon />}\n            >\n              <Trans message=\"Episodes\" />\n            </Button>\n          }\n        />\n      )}\n    </div>\n  );\n}\n\ninterface VideoDropdownProps {\n  videos: Video[];\n  className?: string;\n}\nfunction VideoDropdown({videos, className}: VideoDropdownProps) {\n  const navigate = useNavigate();\n  return (\n    <MenuTrigger>\n      <Button\n        variant=\"outline\"\n        className={clsx('min-h-40', className)}\n        startIcon={<MediaPlayIcon />}\n      >\n        <Trans message=\"Other sources\" />\n      </Button>\n      <Menu>\n        {videos.map(video => (\n          <MenuItem\n            value={video.id}\n            key={video.id}\n            startIcon={<MediaPlayIcon />}\n            endSection={<QualityBadge video={video} />}\n            onSelected={() => navigate(getWatchLink(video))}\n          >\n            {video.name}\n          </MenuItem>\n        ))}\n      </Menu>\n    </MenuTrigger>\n  );\n}\n\ninterface VideoListProps {\n  videos: Video[];\n}\nfunction VideoList({videos}: VideoListProps) {\n  const {videoId} = useParams();\n\n  if (videos.length < 2) {\n    return null;\n  }\n\n  return (\n    <m.div\n      key=\"alternative-sources\"\n      className={className}\n      {...opacityAnimation}\n    >\n      {videos.map(video => (\n        <Button\n          elementType={Link}\n          to={getWatchLink(video)}\n          key={video.id}\n          variant=\"outline\"\n          color={videoId === `${video.id}` ? 'primary' : 'chip'}\n          startIcon={<MediaPlayIcon aria-hidden />}\n          className=\"min-h-40 gap-10\"\n        >\n          {video.name}\n          <QualityBadge video={video} />\n        </Button>\n      ))}\n    </m.div>\n  );\n}\n\ninterface QualityBadgeProps {\n  video: Video;\n}\nfunction QualityBadge({video}: QualityBadgeProps) {\n  if (!video.quality || video.quality === 'default') {\n    return null;\n  }\n  return (\n    <span className=\"rounded border px-6 text-xs font-bold uppercase\">\n      {video.quality}\n    </span>\n  );\n}\n\nfunction Skeletons() {\n  return (\n    <m.div\n      key=\"skeletons\"\n      className={clsx(className, 'h-40')}\n      {...opacityAnimation}\n    >\n      <Skeleton variant=\"rect\" size=\"h-full w-[116px]\" />\n      <Skeleton variant=\"rect\" size=\"h-full w-[116px]\" />\n      <Skeleton variant=\"rect\" size=\"h-full w-[116px]\" />\n      <Skeleton variant=\"rect\" size=\"h-full w-[116px]\" />\n      <Skeleton variant=\"rect\" size=\"h-full w-[116px]\" />\n    </m.div>\n  );\n}\n","import React, {Fragment, useState} from 'react';\nimport {MainNavbar} from '@app/main-navbar';\nimport {useDarkThemeVariables} from '@common/ui/themes/use-dark-theme-variables';\nimport {\n  useWatchPageVideo,\n  UseWatchPageVideoResponse,\n} from '@app/videos/requests/use-watch-page-video';\nimport {Footer} from '@common/ui/footer/footer';\nimport {PageErrorMessage} from '@common/errors/page-error-message';\nimport {CommentList} from '@common/comments/comment-list/comment-list';\nimport {NewCommentForm} from '@common/comments/new-comment-form';\nimport {WatchPageTitleDetails} from '@app/videos/watch-page/watch-page-title-details';\nimport {WatchPageAside} from '@app/videos/watch-page/watch-page-aside';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {opacityAnimation} from '@common/ui/animation/opacity-animation';\nimport {useScrollToTop} from '@common/ui/navigation/use-scroll-to-top';\nimport {VideoPlayerSkeleton} from '@app/videos/video-player-skeleton';\nimport {SiteVideoPlayer} from '@app/videos/site-video-player';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {useAuth} from '@common/auth/use-auth';\nimport {useIsStreamingMode} from '@app/videos/use-is-streaming-mode';\nimport {WatchPageAlternativeVideos} from '@app/videos/watch-page/watch-page-alternative-videos';\nimport {AdHost} from '@common/admin/ads/ad-host';\nimport {Episode} from '@app/titles/models/episode';\nimport {Title} from '@app/titles/models/title';\nimport {Video} from '@app/titles/models/video';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {useLayoutEffect} from '@react-aria/utils';\nimport {VideoThumbnail} from '@app/videos/video-thumbnail';\nimport {Trans} from '@common/i18n/trans';\nimport {Button} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\n\nexport function WatchPage() {\n  const darkThemeVars = useDarkThemeVariables();\n  useScrollToTop();\n\n  return (\n    <Fragment>\n      <MainNavbar />\n      <div style={darkThemeVars} className=\"dark min-h-screen bg text\">\n        <div className=\"container mx-auto p-14 md:p-24\">\n          <Content />\n          <Footer className=\"mt-48\" />\n        </div>\n      </div>\n    </Fragment>\n  );\n}\n\nfunction Content() {\n  const {titles, comments} = useSettings();\n  const {isLoggedIn, hasPermission} = useAuth();\n  const query = useWatchPageVideo();\n  const {data, isLoading} = query;\n  const title = data?.title;\n  const episode = data?.episode;\n  const video = data?.video;\n  let commentable: Episode | Title | Video | undefined = video;\n\n  if (!comments?.per_video) {\n    commentable = episode || title;\n  }\n\n  const shouldShowComments =\n    title && video && titles.enable_comments && hasPermission('comments.view');\n\n  if (data || isLoading) {\n    return (\n      <Fragment key={video?.id || 'loading'}>\n        <PageMetaTags query={query} />\n        <VideoWrapper data={data} />\n        <WatchPageAlternativeVideos data={data} />\n        <AdHost slot=\"watch_top\" className=\"pt-48\" />\n        <section className=\"mt-42 items-start gap-56 lg:flex\">\n          <div className=\"flex-auto\">\n            <WatchPageTitleDetails />\n            {shouldShowComments && (\n              <CommentList\n                commentable={commentable!}\n                className=\"mt-44\"\n                perPage={20}\n              >\n                {isLoggedIn && hasPermission('comments.create') && (\n                  <NewCommentForm\n                    commentable={commentable!}\n                    className=\"mb-14 mt-24\"\n                  />\n                )}\n              </CommentList>\n            )}\n          </div>\n          <WatchPageAside />\n        </section>\n      </Fragment>\n    );\n  }\n\n  return <PageErrorMessage />;\n}\n\ninterface VideoWrapperProps {\n  data?: UseWatchPageVideoResponse;\n}\nfunction VideoWrapper({data}: VideoWrapperProps) {\n  const isStreamingMode = useIsStreamingMode();\n  const {hasPermission} = useAuth();\n\n  const [isVisible, setIsVisible] = useState(false);\n  useLayoutEffect(() => {\n    setIsVisible(true);\n  }, []);\n\n  return (\n    <AnimatePresence initial={false} mode=\"wait\">\n      {data?.video && isVisible ? (\n        <m.div key=\"player\" {...opacityAnimation}>\n          {hasPermission('videos.play') ? (\n            <SiteVideoPlayer\n              title={data.title}\n              episode={data.episode}\n              video={data.video}\n              relatedVideos={data.related_videos}\n              autoPlay\n              logPlays\n              showEpisodeSelector={isStreamingMode}\n            />\n          ) : (\n            <UpgradeMessage video={data.video} />\n          )}\n        </m.div>\n      ) : (\n        <m.div className=\"relative\" key=\"skeleton\" {...opacityAnimation}>\n          <VideoPlayerSkeleton animate />\n        </m.div>\n      )}\n    </AnimatePresence>\n  );\n}\n\ninterface UpgradeMessageProps {\n  video: Video;\n}\nfunction UpgradeMessage({video}: UpgradeMessageProps) {\n  return (\n    <div className=\"relative flex aspect-video items-center justify-center bg-alt\">\n      <div className=\"blur\">\n        <VideoThumbnail video={video} />\n      </div>\n      <div className=\"absolute h-max w-max max-w-full rounded-lg bg-black/60 p-24 text-lg font-medium\">\n        <div>\n          <Trans message=\"Your current plan does not allow watching videos. Upgrade to unlock this feature.\" />\n        </div>\n        <div className=\"mt-14 text-center\">\n          <Button\n            variant=\"flat\"\n            color=\"primary\"\n            elementType={Link}\n            to=\"/pricing\"\n          >\n            <Trans message=\"Upgrade\" />\n          </Button>\n        </div>\n      </div>\n    </div>\n  );\n}\n","import React, {Fragment} from 'react';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {PageStatus} from '@common/http/page-status';\nimport {TitlePageHeaderImage} from '@app/titles/pages/title-page/title-page-header-image';\nimport {Title} from '@app/titles/models/title';\nimport {VideoGrid} from '@app/titles/video-grid';\nimport {TitlePageHeader} from '@app/titles/pages/title-page/title-page-header';\nimport {Trans} from '@common/i18n/trans';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {useTitle} from '@app/titles/requests/use-title';\n\nexport function TitleVideosPage() {\n  const query = useTitle('titlePage');\n\n  const content = query.data ? (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <PageContent title={query.data.title} />;\n    </Fragment>\n  ) : (\n    <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n  );\n\n  return <SitePageLayout>{content}</SitePageLayout>;\n}\n\ninterface PageContentProps {\n  title: Title;\n}\nfunction PageContent({title}: PageContentProps) {\n  return (\n    <div>\n      <TitlePageHeaderImage title={title} />\n      <div className=\"container mx-auto mt-24 px-14 md:mt-40 md:px-24\">\n        <TitlePageHeader title={title} showPoster />\n        <VideoGrid\n          videos={title.videos}\n          title={title}\n          count={24}\n          heading={\n            <SiteSectionHeading>\n              <Trans message=\"Video gallery\" />\n            </SiteSectionHeading>\n          }\n        />\n      </div>\n    </div>\n  );\n}\n","import React, {Fragment} from 'react';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {PageStatus} from '@common/http/page-status';\nimport {TitlePageHeaderImage} from '@app/titles/pages/title-page/title-page-header-image';\nimport {Title} from '@app/titles/models/title';\nimport {TitlePageHeader} from '@app/titles/pages/title-page/title-page-header';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {TitlePageImageGrid} from '@app/titles/pages/title-page/sections/title-page-image-grid';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Trans} from '@common/i18n/trans';\nimport {useTitle} from '@app/titles/requests/use-title';\n\nexport function TitleImagesPage() {\n  const query = useTitle('titlePage');\n\n  const content = query.data ? (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <PageContent title={query.data.title} />;\n    </Fragment>\n  ) : (\n    <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n  );\n\n  return <SitePageLayout>{content}</SitePageLayout>;\n}\n\ninterface PageContentProps {\n  title: Title;\n}\nfunction PageContent({title}: PageContentProps) {\n  return (\n    <div>\n      <TitlePageHeaderImage title={title} />\n      <div className=\"container mx-auto mt-24 px-14 md:mt-40 md:px-24\">\n        <TitlePageHeader title={title} showPoster />\n        <TitlePageImageGrid\n          images={title.images}\n          srcSize=\"lg\"\n          count={24}\n          heading={\n            <SiteSectionHeading>\n              <Trans message=\"Image gallery\" />\n            </SiteSectionHeading>\n          }\n        />\n      </div>\n    </div>\n  );\n}\n","import {\n  DetailItem,\n  TitlePageAsideLayout,\n} from '@app/titles/pages/title-page/title-page-aside-layout';\nimport {PersonPoster} from '@app/people/person-poster/person-poster';\nimport {Trans} from '@common/i18n/trans';\nimport {FormattedDate} from '@common/i18n/formatted-date';\nimport React from 'react';\nimport {PersonAge} from '@app/people/person-age';\nimport {GetPersonResponse} from '@app/people/requests/use-person';\nimport {ShareMenuTrigger} from '@app/sharing/share-menu-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {ShareIcon} from '@common/icons/material/Share';\nimport {Person} from '@app/titles/models/person';\nimport {getPersonLink} from '@app/people/person-link';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {Link} from 'react-router-dom';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {useAuth} from '@common/auth/use-auth';\n\ninterface Props {\n  data: GetPersonResponse;\n}\nexport function PersonPageAside({data: {person, total_credits_count}}: Props) {\n  const {hasPermission} = useAuth();\n  const age = (\n    <Trans\n      message=\":count years old\"\n      values={{count: <PersonAge person={person} />}}\n    />\n  );\n\n  return (\n    <TitlePageAsideLayout\n      className=\"max-md:flex\"\n      poster={\n        <div>\n          <div className=\"relative\">\n            <PersonPoster person={person} size=\"w-140 md:w-full\" srcSize=\"lg\" />\n            {hasPermission('titles.update') && (\n              <IconButton\n                elementType={Link}\n                to={`/admin/people/${person.id}/edit`}\n                className=\"absolute bottom-6 right-4\"\n                color=\"white\"\n              >\n                <EditIcon />\n              </IconButton>\n            )}\n          </div>\n          <ShareButton person={person} />\n        </div>\n      }\n    >\n      <dl className=\"mt-12 md:mt-24\">\n        {person.known_for && (\n          <DetailItem label={<Trans message=\"Known for\" />}>\n            <Trans message={person.known_for} />\n          </DetailItem>\n        )}\n        {person.gender && (\n          <DetailItem label={<Trans message=\"Gender\" />}>\n            <span className=\"capitalize\">\n              <Trans message={person.gender} />\n            </span>\n          </DetailItem>\n        )}\n        {total_credits_count ? (\n          <DetailItem label={<Trans message=\"Known credits\" />}>\n            {total_credits_count}\n          </DetailItem>\n        ) : null}\n        {person.birth_date ? (\n          <DetailItem label={<Trans message=\"Born\" />}>\n            <FormattedDate date={person.birth_date} />{' '}\n            {!person.death_date && age}\n          </DetailItem>\n        ) : null}\n        {person.birth_place ? (\n          <DetailItem label={<Trans message=\"Birthplace\" />}>\n            {person.birth_place}\n          </DetailItem>\n        ) : null}\n        {person.death_date ? (\n          <DetailItem label={<Trans message=\"Died\" />}>\n            <FormattedDate date={person.death_date} /> ({age})\n          </DetailItem>\n        ) : null}\n      </dl>\n    </TitlePageAsideLayout>\n  );\n}\n\ninterface ShareButtonProps {\n  person: Person;\n}\nfunction ShareButton({person}: ShareButtonProps) {\n  const link = getPersonLink(person, {absolute: true});\n  return (\n    <ShareMenuTrigger link={link}>\n      <Button\n        variant=\"outline\"\n        color=\"primary\"\n        startIcon={<ShareIcon />}\n        className=\"mt-14 md:min-h-40 md:w-full\"\n      >\n        <Trans message=\"Share\" />\n      </Button>\n    </ShareMenuTrigger>\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 {EpisodeCredit, PersonCredit} from '@app/titles/models/title';\nimport {Person} from '@app/titles/models/person';\n\nexport interface GetFullTitleCreditsResponse extends BackendResponse {\n  credits: EpisodeCredit[];\n}\n\ninterface Params {\n  credit: PersonCredit;\n  department: string;\n  person: Person;\n}\n\ninterface Options {\n  enabled?: boolean;\n}\n\nexport function useFullPersonCreditsForTitle(\n  {person, credit, department}: Params,\n  options: Options,\n) {\n  return useQuery({\n    queryKey: [\n      'people',\n      `${person.id}`,\n      'full-credits',\n      `${credit.id}`,\n      `${department}`,\n    ],\n    queryFn: () => fetchCredits(person.id, credit.id, department),\n    enabled: options.enabled,\n  });\n}\n\nfunction fetchCredits(\n  personId: number | string,\n  titleId: number | string,\n  department: string,\n) {\n  return apiClient\n    .get<GetFullTitleCreditsResponse>(\n      `people/${personId}/full-credits/${titleId}/${department}`,\n    )\n    .then(response => response.data);\n}\n","import {EpisodeCredit, PersonCredit} from '@app/titles/models/title';\nimport {Trans} from '@common/i18n/trans';\n\ninterface Props {\n  credit: PersonCredit | EpisodeCredit;\n  className?: string;\n}\nexport function CharacterOrJob({credit, className}: Props) {\n  return (\n    <div className={className}>\n      {credit.pivot?.department === 'actors' ? (\n        credit.pivot?.character ?? <Trans message=\"Unknown\" />\n      ) : (\n        <span className=\"capitalize\">\n          {credit.pivot?.job ? (\n            <Trans message={credit.pivot?.job} />\n          ) : (\n            <Trans message=\"Unknown\" />\n          )}\n        </span>\n      )}\n    </div>\n  );\n}\n","import {GetPersonResponse} from '@app/people/requests/use-person';\nimport {Accordion, AccordionItem} from '@common/ui/accordion/accordion';\nimport {Trans} from '@common/i18n/trans';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {TitleLink} from '@app/titles/title-link';\nimport {PersonCredit} from '@app/titles/models/title';\nimport {BulletSeparatedItems} from '@app/titles/bullet-separated-items';\nimport {CompactSeasonEpisode} from '@app/episodes/compact-season-episode';\nimport {EpisodeLink} from '@app/episodes/episode-link';\nimport {Button} from '@common/ui/buttons/button';\nimport {Fragment, useState} from 'react';\nimport {useFullPersonCreditsForTitle} from '@app/people/requests/use-full-person-credits-for-title';\nimport {CharacterOrJob} from '@app/people/person-page/character-or-job';\nimport {Person} from '@app/titles/models/person';\n\ninterface Props {\n  data: GetPersonResponse;\n}\nexport function PersonPageCredits({data: {credits, person}}: Props) {\n  return (\n    <div className=\"mt-34\">\n      <SiteSectionHeading fontSize=\"text-xl\">\n        <Trans message=\"Credits\" />\n      </SiteSectionHeading>\n      <Accordion mode=\"multiple\" defaultExpandedValues={[0]} isLazy>\n        {Object.entries(credits).map(([department, credits]) => (\n          <AccordionItem\n            labelClassName=\"font-semibold text-base\"\n            description={\n              <Trans\n                message=\"(:count credits)\"\n                values={{count: credits.length}}\n              />\n            }\n            key={department}\n            label={\n              <span className=\"capitalize\">\n                <Trans\n                  message={department === 'actors' ? 'Acting' : department}\n                />\n              </span>\n            }\n          >\n            {credits.map((credit, index) => {\n              const isLast = credit === credits[credits.length - 1];\n              return (\n                <Fragment key={credit.id}>\n                  <div className=\"flex items-start py-6\">\n                    <TitlePoster\n                      title={credit}\n                      size=\"w-40\"\n                      className=\"mr-12\"\n                      lazy\n                      srcSize=\"sm\"\n                    />\n                    <div className=\"mr-24 pt-2\">\n                      <div className=\"font-semibold text-base\">\n                        <TitleLink title={credit} />\n                      </div>\n                      <CharacterOrJob\n                        className=\"text-sm text-muted\"\n                        credit={credit}\n                      />\n                      {credit.credited_episode_count ? (\n                        <EpisodeList\n                          credit={credit}\n                          department={department}\n                          person={person}\n                        />\n                      ) : null}\n                    </div>\n                    <div className=\"text-sm text-muted ml-auto\">\n                      {credit.year}\n                    </div>\n                  </div>\n                  {!isLast && credit.year !== credits[index + 1]?.year && (\n                    <div className=\"h-1 w-full bg-divider my-8\" />\n                  )}\n                </Fragment>\n              );\n            })}\n          </AccordionItem>\n        ))}\n      </Accordion>\n    </div>\n  );\n}\n\ninterface EpisodeListProps {\n  credit: PersonCredit;\n  department: string;\n  person: Person;\n}\nfunction EpisodeList({credit, department, person}: EpisodeListProps) {\n  const [loadMoreEpisodes, setLoadMoreEpisodes] = useState(false);\n  const query = useFullPersonCreditsForTitle(\n    {person, department, credit},\n    {\n      enabled: loadMoreEpisodes,\n    }\n  );\n  const allEpisodesLoaded =\n    credit.episodes.length === credit.credited_episode_count ||\n    query.data != null;\n  const isLoadingMore = query.isLoading && query.fetchStatus !== 'idle';\n  const shouldShowLoadMoreBtn = isLoadingMore || !allEpisodesLoaded;\n  const episodeCredits = query.data?.credits.length\n    ? query.data.credits\n    : credit.episodes;\n\n  return (\n    <div className=\"mt-4\">\n      <div>\n        {episodeCredits.map(episodeCredit => (\n          <div className=\"text-xs pl-10 mb-4\" key={episodeCredit.id}>\n            <BulletSeparatedItems>\n              <span>\n                -{' '}\n                <EpisodeLink\n                  title={credit}\n                  episode={episodeCredit}\n                  seasonNumber={episodeCredit.season_number}\n                />{' '}\n                ({episodeCredit.year})\n              </span>\n              <CompactSeasonEpisode episode={episodeCredit} />\n              <CharacterOrJob credit={episodeCredit} />\n            </BulletSeparatedItems>\n          </div>\n        ))}\n      </div>\n      {shouldShowLoadMoreBtn && (\n        <div className=\"mt-8\">\n          <Button\n            size=\"xs\"\n            disabled={isLoadingMore}\n            onClick={() => {\n              setLoadMoreEpisodes(true);\n            }}\n          >\n            <Trans\n              message=\"Show all :count episodes\"\n              values={{count: credit.credited_episode_count}}\n            />\n          </Button>\n        </div>\n      )}\n    </div>\n  );\n}\n","import {PageStatus} from '@common/http/page-status';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport React, {Fragment} from 'react';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {GetPersonResponse, usePerson} from '@app/people/requests/use-person';\nimport {Person} from '@app/titles/models/person';\nimport {Trans} from '@common/i18n/trans';\nimport {TitlePageHeaderLayout} from '@app/titles/pages/title-page/title-page-header-layout';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {PersonPageAside} from '@app/people/person-page/person-page-aside';\nimport {ContentGridLayout} from '@app/channels/content-grid/content-grid-layout';\nimport {PersonCredit} from '@app/titles/models/title';\nimport {TitlePortraitGridItem} from '@app/channels/content-grid/title-grid-item';\nimport {PersonPageCredits} from '@app/people/person-page/person-page-credits';\nimport {TruncatedDescription} from '@common/ui/truncated-description';\nimport {CharacterOrJob} from '@app/people/person-page/character-or-job';\nimport {AdHost} from '@common/admin/ads/ad-host';\n\nexport function PersonPage() {\n  const query = usePerson('personPage');\n\n  const content = query.data ? (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <PageContent data={query.data} />\n    </Fragment>\n  ) : (\n    <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n  );\n\n  return <SitePageLayout>{content}</SitePageLayout>;\n}\n\ninterface PageContentProps {\n  data: GetPersonResponse;\n}\nfunction PageContent({data}: PageContentProps) {\n  const {person, knownFor} = data;\n  return (\n    <Fragment>\n      <div className=\"container mx-auto mt-14 px-14 md:mt-40 md:px-24\">\n        <div className=\"items-start gap-54 md:flex\">\n          <PersonPageAside data={data} />\n          <main className=\"flex-auto @container max-md:mt-34\">\n            <TitlePageHeaderLayout name={person.name} />\n            <Biography person={person} />\n            <AdHost slot=\"person_top\" className=\"pt-48\" />\n            <KnowForList items={knownFor} />\n            <PersonPageCredits data={data} />\n          </main>\n        </div>\n      </div>\n    </Fragment>\n  );\n}\n\ninterface BiographyProps {\n  person: Person;\n}\nfunction Biography({person}: BiographyProps) {\n  if (!person.description) return null;\n  return (\n    <Fragment>\n      <SiteSectionHeading fontSize=\"text-xl\">\n        <Trans message=\"Biography\" />\n      </SiteSectionHeading>\n      <TruncatedDescription\n        className=\"text-sm\"\n        description={person.description}\n      />\n    </Fragment>\n  );\n}\n\ninterface KnownForProps {\n  items: PersonCredit[];\n}\nfunction KnowForList({items}: KnownForProps) {\n  if (!items?.length) return null;\n  return (\n    <div className=\"mt-34\">\n      <SiteSectionHeading fontSize=\"text-xl\">\n        <Trans message=\"Known for\" />\n      </SiteSectionHeading>\n      <ContentGridLayout variant=\"portrait\">\n        {items.slice(0, 4).map(item => (\n          <TitlePortraitGridItem\n            key={item.id}\n            item={item}\n            description={\n              <CharacterOrJob className=\"text-muted\" credit={item} />\n            }\n          />\n        ))}\n      </ContentGridLayout>\n    </div>\n  );\n}\n","import React, {Fragment} from 'react';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {PageStatus} from '@common/http/page-status';\nimport {TitlePageHeaderImage} from '@app/titles/pages/title-page/title-page-header-image';\nimport {TitlePageHeader} from '@app/titles/pages/title-page/title-page-header';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {GetTitleResponse, useTitle} from '@app/titles/requests/use-title';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Trans} from '@common/i18n/trans';\nimport {TitleCreditsGrid} from '@app/titles/pages/title-page/title-credits-grid/title-credits-grid';\n\nexport function TitleFullCreditsPage() {\n  const query = useTitle('titleCreditsPage');\n\n  const content = query.data ? (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <PageContent data={query.data} />\n    </Fragment>\n  ) : (\n    <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n  );\n\n  return <SitePageLayout>{content}</SitePageLayout>;\n}\n\ninterface PageContentProps {\n  data: GetTitleResponse;\n}\nfunction PageContent({\n  data: {title, credits: groupedCredits = {}},\n}: PageContentProps) {\n  return (\n    <div>\n      <TitlePageHeaderImage title={title} />\n      <div className=\"container mx-auto mt-24 px-14 md:mt-40 md:px-24\">\n        <TitlePageHeader title={title} showPoster />\n        <div className=\"mt-48 @container\">\n          <SiteSectionHeading headingType=\"h2\" className=\"mb-40\">\n            <Trans message=\"Full cast and crew\" />\n          </SiteSectionHeading>\n          {Object.entries(groupedCredits).map(([department, credits]) => (\n            <div key={department}>\n              <h3 className=\"mb-16 text-2xl font-bold capitalize\">\n                <Trans message={department} />\n              </h3>\n              <TitleCreditsGrid credits={credits} className=\"mb-68\" />\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n}\n","import React, {Fragment} from 'react';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {PageStatus} from '@common/http/page-status';\nimport {TitlePageHeaderImage} from '@app/titles/pages/title-page/title-page-header-image';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Trans} from '@common/i18n/trans';\nimport {TitleCreditsGrid} from '@app/titles/pages/title-page/title-credits-grid/title-credits-grid';\nimport {\n  GetEpisodeResponse,\n  useEpisode,\n} from '@app/episodes/requests/use-episode';\nimport {EpisodePageHeader} from '@app/episodes/episode-page-header';\n\nexport function EpisodeFullCreditsPage() {\n  const query = useEpisode('episodeCreditsPage');\n\n  const content = query.data ? (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <PageContent data={query.data} />\n    </Fragment>\n  ) : (\n    <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n  );\n\n  return <SitePageLayout>{content}</SitePageLayout>;\n}\n\ninterface PageContentProps {\n  data: GetEpisodeResponse;\n}\nfunction PageContent({\n  data: {title, episode, credits: groupedCredits},\n}: PageContentProps) {\n  return (\n    <div>\n      <TitlePageHeaderImage title={title} episode={episode} />\n      <div className=\"container mx-auto mt-24 px-14 md:mt-40 md:px-24\">\n        <EpisodePageHeader title={title} episode={episode} showPoster />\n        <div className=\"mt-48 @container\">\n          <SiteSectionHeading headingType=\"h2\" className=\"mb-40\">\n            <Trans message=\"Full cast and crew\" />\n          </SiteSectionHeading>\n          {groupedCredits &&\n            Object.entries(groupedCredits).map(([department, credits]) => (\n              <div key={department}>\n                <h3 className=\"mb-16 text-2xl font-bold capitalize\">\n                  <Trans message={department} />\n                </h3>\n                <TitleCreditsGrid credits={credits} className=\"mb-68\" />\n              </div>\n            ))}\n        </div>\n      </div>\n    </div>\n  );\n}\n","import React, { Fragment } from \"react\";\nimport { PageMetaTags } from \"@common/http/page-meta-tags\";\nimport { PageStatus } from \"@common/http/page-status\";\nimport { SitePageLayout } from \"@app/site-page-layout\";\nimport {\n  GetNewsArticleResponse,\n  useNewsArticle\n} from \"@app/admin/news/requests/use-news-article\";\nimport { NewsArticle } from \"@app/titles/models/news-article\";\nimport { Trans } from \"@common/i18n/trans\";\nimport { FormattedDate } from \"@common/i18n/formatted-date\";\nimport { BulletSeparatedItems } from \"@app/titles/bullet-separated-items\";\nimport { NewsArticleImage } from \"@app/news/news-article-image\";\nimport { NewsArticleLink } from \"@app/news/news-article-link\";\nimport { NewsArticleByline } from \"@app/news/news-article-byline\";\nimport { NewsArticleSourceLink } from \"@app/news/news-article-source-link\";\n\nexport function NewsArticlePage() {\n  const query = useNewsArticle('newsArticlePage');\n\n  const content = query.data ? (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <PageContent data={query.data} />\n    </Fragment>\n  ) : (\n    <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n  );\n\n  return <SitePageLayout>{content}</SitePageLayout>;\n}\n\ninterface PageContentProps {\n  data: GetNewsArticleResponse;\n}\nfunction PageContent({data: {article, related}}: PageContentProps) {\n  return (\n    <div className=\"container mx-auto mt-14 items-start gap-40 px-14 md:mt-40 md:px-24 lg:flex\">\n      <main className=\"mb-24 rounded border p-16 flex-auto\">\n        <h1 className=\"mb-24 text-3xl md:text-4xl\">{article.title}</h1>\n        <div className=\"items-start gap-16 md:flex\">\n          <NewsArticleImage\n            article={article}\n            size=\"w-184 h-184\"\n            className=\"max-md:mb-24\"\n          />\n          <div\n            className=\"prose text dark:prose-invert\"\n            dangerouslySetInnerHTML={{__html: article.body}}\n          />\n        </div>\n        <BulletSeparatedItems className=\"mt-24 text-sm text-muted\">\n          <FormattedDate date={article.created_at} />\n          {article.byline ? <NewsArticleByline article={article} /> : null}\n          {article.source ? (\n            <NewsArticleSourceLink article={article} />\n          ) : null}\n        </BulletSeparatedItems>\n      </main>\n      <OtherNews articles={related} />\n    </div>\n  );\n}\n\ninterface OtherNewsProps {\n  articles: NewsArticle[];\n}\nfunction OtherNews({articles}: OtherNewsProps) {\n  return (\n    <div className=\"w-full max-w-full flex-shrink-0 lg:w-400\">\n      <h2 className=\"mb-14 text-2xl\">\n        <Trans message=\"Other news\" />\n      </h2>\n      {articles.map(article => (\n        <div\n          key={article.id}\n          className=\"mb-14 flex items-center gap-14 rounded border pr-14\"\n        >\n          <NewsArticleImage article={article} size=\"w-80 h-80\" lazy={false} />\n          <div className=\"min-w-0\">\n            <h3 className=\"line-clamp-2 text-sm font-semibold\">\n              <NewsArticleLink article={article} />\n            </h3>\n            <BulletSeparatedItems className=\"mt-6 text-sm text-muted\">\n              <FormattedDate date={article.created_at} />\n              <NewsArticleByline article={article} />\n            </BulletSeparatedItems>\n          </div>\n        </div>\n      ))}\n    </div>\n  );\n}\n","import {useMutation} from '@tanstack/react-query';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {toast} from '@common/ui/toast/toast';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {message} from '@common/i18n/message';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n  listId: number | string;\n}\n\nexport function useDeleteList() {\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (payload: Payload) => deleteList(payload),\n    onSuccess: async () => {\n      await queryClient.invalidateQueries({queryKey: ['channel']});\n      toast(trans(message('List deleted')));\n    },\n    onError: err => showHttpErrorToast(err),\n  });\n}\n\nfunction deleteList(payload: Payload) {\n  return apiClient\n    .delete<Response>(`channel/${payload.listId}`)\n    .then(r => r.data);\n}\n","import {Channel} from '@common/channels/channel';\nimport {Title} from '@app/titles/models/title';\nimport {Person} from '@app/titles/models/person';\nimport {useDeleteList} from '@app/user-lists/requests/use-delete-list';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\nimport {ConfirmationDialog} from '@common/ui/overlays/dialog/confirmation-dialog';\nimport {Trans} from '@common/i18n/trans';\nimport React, {Fragment} from 'react';\nimport {getUserListLink, UserListLink} from '@app/user-lists/user-list-link';\nimport {Button} from '@common/ui/buttons/button';\nimport {Link} from 'react-router-dom';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {UserListByline} from '@app/user-lists/user-list-byline';\nimport {UserListDetails} from '@app/user-lists/user-list-details';\nimport clsx from 'clsx';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {PersonPoster} from '@app/people/person-poster/person-poster';\nimport {User} from '@common/auth/user';\nimport {useAuth} from '@common/auth/use-auth';\n\ninterface UserListIndexItemProps {\n  list: Channel;\n  user: User;\n  showVisibility?: boolean;\n}\nexport function UserListIndexItem({\n  list,\n  user,\n  showVisibility = true,\n}: UserListIndexItemProps) {\n  const {user: authUser} = useAuth();\n  const canEdit = authUser && authUser.id === user.id;\n  return (\n    <div className=\"flex items-center gap-24 border-b py-24\">\n      {\n        <ItemsPreview\n          className=\"max-md:hidden\"\n          list={list as Channel<Title | Person>}\n        />\n      }\n      <section className=\"flex-auto\">\n        <div className=\"flex items-center gap-8\">\n          <UserListLink\n            list={list}\n            className=\"mr-auto block text-lg font-semibold capitalize\"\n          />\n          {!list.config.preventDeletion && !list.internal && canEdit && (\n            <Fragment>\n              <Button\n                elementType={Link}\n                to={`${getUserListLink(list)}/edit`}\n                variant=\"outline\"\n                size=\"2xs\"\n                color=\"primary\"\n              >\n                <Trans message=\"Edit\" />\n              </Button>\n              <DialogTrigger type=\"modal\">\n                <Button\n                  color=\"danger\"\n                  variant=\"outline\"\n                  radius=\"rounded\"\n                  size=\"2xs\"\n                >\n                  <Trans message=\"Delete\" />\n                </Button>\n                <DeleteListDialog list={list} />\n              </DialogTrigger>\n            </Fragment>\n          )}\n        </div>\n        {list.description && (\n          <p className=\"mt-8 whitespace-nowrap text-sm text-muted\">\n            {list.description}\n          </p>\n        )}\n        <div className=\"mt-12 text-sm\">\n          <div className=\"items-center justify-between gap-24 md:flex\">\n            {user && <UserListByline user={user} />}\n            <UserListDetails\n              list={list}\n              showVisibility={showVisibility}\n              className=\"max-md:mt-12\"\n            />\n          </div>\n        </div>\n      </section>\n    </div>\n  );\n}\n\ninterface ItemPreviewProps {\n  list: Channel<Title | Person>;\n  className?: string;\n}\nfunction ItemsPreview({list, className}: ItemPreviewProps) {\n  if (!list.items?.length) return null;\n  return (\n    <div\n      className={clsx('flex items-center overflow-hidden rounded', className)}\n    >\n      {list.items?.map((item, index) => (\n        <div\n          key={item.id}\n          style={{zIndex: 100 - index}}\n          className={clsx(\n            'relative overflow-hidden rounded shadow-[2px_0_7px_#000]',\n            index !== 0 && '-ml-30',\n          )}\n        >\n          {item.model_type === 'title' ? (\n            <TitlePoster title={item} size=\"w-70\" srcSize=\"sm\" />\n          ) : (\n            <PersonPoster person={item} size=\"w-70\" srcSize=\"sm\" />\n          )}\n          <div className=\"pointer-events-none absolute inset-0 shadow-[inset_0_0_0_1px_rgba(221,238,255,.35)]\" />\n        </div>\n      ))}\n    </div>\n  );\n}\n\ninterface DeleteButtonProps {\n  list: Channel;\n}\nfunction DeleteListDialog({list}: DeleteButtonProps) {\n  const deleteList = useDeleteList();\n  const {close} = useDialogContext();\n\n  return (\n    <ConfirmationDialog\n      isDanger\n      title={<Trans message=\"Delete list\" />}\n      body={<Trans message=\"Are you sure you want to delete this list?\" />}\n      confirm={<Trans message=\"Delete\" />}\n      isLoading={deleteList.isPending}\n      onConfirm={() => deleteList.mutate({listId: list.id}, {onSuccess: close})}\n    />\n  );\n}\n","import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {useParams} from 'react-router-dom';\nimport {Channel} from '@common/channels/channel';\n\nexport function useProfileLists() {\n  const {userId = 'me'} = useParams();\n  return useInfiniteData<Channel>({\n    endpoint: `user-profile/${userId}/lists`,\n    queryKey: ['channel', 'profile-lists', userId],\n    paginate: 'simple',\n  });\n}\n","import React from 'react';\nimport {PageStatus} from '@common/http/page-status';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport {Link} from 'react-router-dom';\nimport {Button} from '@common/ui/buttons/button';\nimport {Channel} from '@common/channels/channel';\nimport {UserListIndexItem} from '@app/user-lists/pages/user-lists-index-page/user-list-index-item';\nimport {useProfileLists} from '@app/profile/requests/use-profile-lists';\nimport {StaticPageTitle} from '@common/seo/static-page-title';\nimport {useAuth} from '@common/auth/use-auth';\nimport {UseInfiniteDataResult} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SvgImage} from '@common/ui/images/svg-image/svg-image';\nimport todoImage from '@app/admin/lists/todo.svg';\n\nexport function UserListsIndexPage() {\n  const query = useProfileLists();\n\n  const content = query.data ? (\n    <PageContent query={query} />\n  ) : (\n    <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n  );\n\n  return (\n    <SitePageLayout>\n      <StaticPageTitle>\n        <Trans message=\"Your lists\" />\n      </StaticPageTitle>\n      <div className=\"container mx-auto mt-48 px-24\">\n        <header>\n          <SiteSectionHeading\n            headingType=\"h1\"\n            margin=\"mb-34\"\n            actions={\n              <Button\n                variant=\"flat\"\n                color=\"primary\"\n                elementType={Link}\n                to=\"new\"\n              >\n                <Trans message=\"New list\" />\n              </Button>\n            }\n          >\n            <Trans message=\"My lists\" />\n          </SiteSectionHeading>\n        </header>\n        {content}\n      </div>\n    </SitePageLayout>\n  );\n}\n\ninterface PageContentProps {\n  query: UseInfiniteDataResult<Channel>;\n}\nfunction PageContent({query}: PageContentProps) {\n  const {user} = useAuth();\n\n  if (query.noResults) {\n    return (\n      <IllustratedMessage\n        className=\"mt-80\"\n        image={<SvgImage src={todoImage} />}\n        title={<Trans message=\"You have not created any lists yet.\" />}\n      />\n    );\n  }\n\n  return (\n    <div>\n      {query.items.map(list => (\n        <UserListIndexItem list={list} key={list.id} user={user!} />\n      ))}\n      <InfiniteScrollSentinel query={query} />\n    </div>\n  );\n}\n","import {useQuery} from '@tanstack/react-query';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {User} from '@common/auth/user';\nimport {apiClient} from '@common/http/query-client';\nimport {useParams} from 'react-router-dom';\n\nexport interface UseUserProfileResponse extends BackendResponse {\n  user: User;\n}\n\nexport const userProfileQueryKey = (userId: number | string) => [\n  'users',\n  `${userId}`,\n  'profile',\n];\n\nexport function useUserProfile() {\n  const {userId} = useParams();\n  return useQuery({\n    queryKey: userProfileQueryKey(userId!),\n    queryFn: () => fetchProfile(userId!),\n  });\n}\n\nfunction fetchProfile(userId: string) {\n  return apiClient\n    .get<UseUserProfileResponse>(`user-profile/${userId}`)\n    .then(response => response.data);\n}\n","import {UserProfile} from '@app/profile/user-profile';\nimport clsx from 'clsx';\n\ninterface Props {\n  profile?: UserProfile;\n  className?: string;\n}\nexport function ProfileDescription({profile, className}: Props) {\n  if (!profile) return null;\n  return (\n    <div className={clsx('text-sm', className)}>\n      {profile.description && (\n        <p className=\"rounded text-secondary whitespace-nowrap overflow-hidden overflow-ellipsis\">\n          {profile.description}\n        </p>\n      )}\n      {profile.city || profile.country ? (\n        <div className=\"flex items-center gap-24 justify-between mt-4\">\n          {(profile.city || profile.country) && (\n            <div className=\"rounded text-secondary w-max\">\n              {profile.city}\n              {profile.city && ','} {profile.country}\n            </div>\n          )}\n        </div>\n      ) : null}\n    </div>\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 {User} from '@common/auth/user';\n\ninterface Response extends BackendResponse {\n  ids: number[];\n}\n\nexport function useFollowedUsers() {\n  const {user} = useAuth();\n  return useQuery({\n    queryKey: ['users', 'followed', 'ids'],\n    queryFn: () => fetchIds(),\n    enabled: !!user,\n  });\n}\n\nexport function useIsUserFollowing(user: User) {\n  const {data, isLoading} = useFollowedUsers();\n  return {\n    isLoading,\n    isFollowing: !!data?.ids.includes(user.id),\n  };\n}\n\nfunction fetchIds() {\n  return apiClient\n    .get<Response>(`users/me/followed-users/ids`)\n    .then(response => response.data);\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {User} from '@common/auth/user';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n  user: User;\n}\n\nexport function useFollowUser() {\n  return useMutation({\n    mutationFn: (payload: Payload) => followUser(payload),\n    onSuccess: async (response, {user}) => {\n      await queryClient.invalidateQueries({queryKey: ['users']});\n      toast(message('Following :name', {values: {name: user.display_name}}));\n    },\n    onError: r => showHttpErrorToast(r),\n  });\n}\n\nfunction followUser({user}: Payload): Promise<Response> {\n  return apiClient.post(`users/${user.id}/follow`).then(r => r.data);\n}\n","import {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useMutation} from '@tanstack/react-query';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\nimport {apiClient, queryClient} from '@common/http/query-client';\nimport {showHttpErrorToast} from '@common/utils/http/show-http-error-toast';\nimport {User} from '@common/auth/user';\n\ninterface Response extends BackendResponse {}\n\ninterface Payload {\n  user: User;\n}\n\nexport function useUnfollowUser() {\n  return useMutation({\n    mutationFn: (payload: Payload) => unfollowUser(payload),\n    onSuccess: async (response, {user}) => {\n      await queryClient.invalidateQueries({queryKey: ['users']});\n      toast(\n        message('Stopped following :name', {values: {name: user.display_name}}),\n      );\n    },\n    onError: r => showHttpErrorToast(r),\n  });\n}\n\nfunction unfollowUser({user}: Payload): Promise<Response> {\n  return apiClient.post(`users/${user.id}/unfollow`).then(r => r.data);\n}\n","import {Button, ButtonProps} from '@common/ui/buttons/button';\nimport {useAuth} from '@common/auth/use-auth';\nimport {User} from '@common/auth/user';\nimport {useIsUserFollowing} from '@common/users/queries/use-followed-users';\nimport {useFollowUser} from '@common/users/queries/use-follow-user';\nimport {useUnfollowUser} from '@common/users/queries/use-unfollow-user';\nimport {Trans} from '@common/i18n/trans';\nimport clsx from 'clsx';\n\ninterface Props extends Omit<ButtonProps, 'onClick' | 'disabled'> {\n  user: User;\n  minWidth?: string | null;\n}\nexport function FollowButton({\n  user,\n  className,\n  minWidth = 'min-w-82',\n  ...buttonProps\n}: Props) {\n  const {user: currentUser} = useAuth();\n  const {isFollowing, isLoading} = useIsUserFollowing(user);\n  const followUser = useFollowUser();\n  const unfollowUser = useUnfollowUser();\n\n  const mergedClassName = clsx(className, minWidth);\n\n  if (isFollowing) {\n    return (\n      <Button\n        {...buttonProps}\n        className={mergedClassName}\n        onClick={() => unfollowUser.mutate({user})}\n        disabled={\n          !currentUser ||\n          currentUser?.id === user.id ||\n          unfollowUser.isPending ||\n          isLoading\n        }\n      >\n        <Trans message=\"Unfollow\" />\n      </Button>\n    );\n  }\n\n  return (\n    <Button\n      {...buttonProps}\n      className={mergedClassName}\n      onClick={() => followUser.mutate({user})}\n      disabled={\n        !currentUser ||\n        currentUser?.id === user.id ||\n        followUser.isPending ||\n        isLoading\n      }\n    >\n      <Trans message=\"Follow\" />\n    </Button>\n  );\n}\n","import {useFieldArray} from 'react-hook-form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {Button} from '@common/ui/buttons/button';\nimport {AddIcon} from '@common/icons/material/Add';\nimport React from 'react';\nimport {UserLink} from '@app/profile/user-link';\n\nexport function ProfileLinksForm() {\n  const {fields, append, remove} = useFieldArray<{links: UserLink[]}>({\n    name: 'links',\n  });\n  return (\n    <div>\n      {fields.map((field, index) => {\n        return (\n          <div key={field.id} className=\"flex gap-10 mb-10 items-end\">\n            <FormTextField\n              required\n              type=\"url\"\n              label={<Trans message=\"URL\" />}\n              name={`links.${index}.url`}\n              size=\"sm\"\n              className=\"flex-auto\"\n            />\n            <FormTextField\n              required\n              label={<Trans message=\"Short title\" />}\n              name={`links.${index}.title`}\n              size=\"sm\"\n              className=\"flex-auto\"\n            />\n            <IconButton\n              size=\"sm\"\n              color=\"primary\"\n              className=\"flex-shrink-0\"\n              onClick={() => {\n                remove(index);\n              }}\n            >\n              <CloseIcon />\n            </IconButton>\n          </div>\n        );\n      })}\n      <Button\n        variant=\"text\"\n        color=\"primary\"\n        startIcon={<AddIcon />}\n        size=\"xs\"\n        onClick={() => {\n          append({url: '', title: ''});\n        }}\n      >\n        <Trans message=\"Add another link\" />\n      </Button>\n    </div>\n  );\n}\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 {onFormQueryError} from '@common/errors/on-form-query-error';\nimport {UseFormReturn} from 'react-hook-form';\nimport {BackendResponse} from '@common/http/backend-response/backend-response';\nimport {useAuth} from '@common/auth/use-auth';\nimport {UserLink} from '@app/profile/user-link';\nimport {userProfileQueryKey} from '@app/profile/requests/use-user-profile';\nimport {User} from '@common/auth/user';\n\ninterface Response extends BackendResponse {\n  user: User;\n}\n\nexport interface UpdateProfilePayload {\n  user: {\n    avatar?: string;\n    first_name?: string;\n    last_name?: string;\n    username?: string;\n  };\n  profile: {\n    city?: string;\n    country?: string;\n    description?: string;\n  };\n  links: UserLink[];\n}\n\nexport function useUpdateUserProfile(\n  form: UseFormReturn<UpdateProfilePayload>,\n) {\n  const {user} = useAuth();\n  const {trans} = useTrans();\n  return useMutation({\n    mutationFn: (payload: UpdateProfilePayload) => updateProfile(payload),\n    onSuccess: async () => {\n      if (user) {\n        await queryClient.invalidateQueries({\n          queryKey: userProfileQueryKey(user.id),\n        });\n      }\n      toast(trans(message('Profile updated')));\n    },\n    onError: err => onFormQueryError(err, form),\n  });\n}\n\nfunction updateProfile(payload: UpdateProfilePayload): Promise<Response> {\n  return apiClient.put('user-profile/me', payload).then(r => r.data);\n}\n","import {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {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 {User} from '@common/auth/user';\nimport {Form} from '@common/ui/forms/form';\nimport {FormTextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {FormImageSelector} from '@common/ui/images/image-selector';\nimport {FileUploadProvider} from '@common/uploads/uploader/file-upload-provider';\nimport {Option} from '@common/ui/forms/combobox/combobox';\nimport {useValueLists} from '@common/http/value-lists';\nimport {useForm} from 'react-hook-form';\nimport {ProfileLinksForm} from '@app/profile/profile-links-form';\nimport {\n  UpdateProfilePayload,\n  useUpdateUserProfile,\n} from '@app/profile/requests/use-update-user-profile';\nimport {FormSelect} from '@common/ui/forms/select/select';\n\ninterface Props {\n  user: User;\n}\nexport function EditUserProfileDialog({user}: Props) {\n  const {close, formId} = useDialogContext();\n  const {data} = useValueLists(['countries']);\n  const form = useForm<UpdateProfilePayload>({\n    defaultValues: {\n      user: {\n        username: user.username,\n        avatar: user.avatar,\n        first_name: user.first_name,\n        last_name: user.last_name,\n      },\n      profile: {\n        city: user.profile?.city,\n        country: user.profile?.country,\n        description: user.profile?.description,\n      },\n      links: user.links,\n    },\n  });\n  const updateProfile = useUpdateUserProfile(form);\n  return (\n    <Dialog size=\"xl\">\n      <DialogHeader>\n        <Trans message=\"Edit your profile\" />\n      </DialogHeader>\n      <DialogBody>\n        <Form\n          id={formId}\n          form={form}\n          onSubmit={values =>\n            updateProfile.mutate(values, {onSuccess: () => close()})\n          }\n        >\n          <FileUploadProvider>\n            <div className=\"md:flex items-start gap-30\">\n              <FormImageSelector\n                label={<Trans message=\"Avatar\" />}\n                name=\"user.avatar\"\n                diskPrefix=\"avatars\"\n                variant=\"avatar\"\n                previewSize=\"w-200 h-200\"\n                className=\"max-md:mb-20\"\n              />\n              <div className=\"flex-auto\">\n                <FormTextField\n                  name=\"user.username\"\n                  label={<Trans message=\"Username\" />}\n                  className=\"mb-24\"\n                />\n                <div className=\"flex items-center gap-24\">\n                  <FormTextField\n                    name=\"user.first_name\"\n                    label={<Trans message=\"First name\" />}\n                    className=\"flex-1 mb-24\"\n                  />\n                  <FormTextField\n                    name=\"user.last_name\"\n                    label={<Trans message=\"Last name\" />}\n                    className=\"flex-1 mb-24\"\n                  />\n                </div>\n                <div className=\"flex items-center gap-24\">\n                  <FormTextField\n                    name=\"profile.city\"\n                    label={<Trans message=\"City\" />}\n                    className=\"flex-1 mb-24\"\n                  />\n                  <FormSelect\n                    showSearchField\n                    className=\"flex-1 mb-24\"\n                    selectionMode=\"single\"\n                    name=\"profile.country\"\n                    label={<Trans message=\"Country\" />}\n                  >\n                    <Option key=\"none\" value={undefined}>\n                      <Trans message=\"None\" />\n                    </Option>\n                    {data?.countries?.map(country => (\n                      <Option key={country.code} value={country.name}>\n                        {country.name}\n                      </Option>\n                    ))}\n                  </FormSelect>\n                </div>\n                <FormTextField\n                  name=\"profile.description\"\n                  label={<Trans message=\"Description\" />}\n                  inputElementType=\"textarea\"\n                  rows={4}\n                />\n              </div>\n            </div>\n            <div className=\"mt-24\">\n              <div className=\"mb-16 pb-16 border-b\">\n                <Trans message=\"Your links\" />\n              </div>\n              <ProfileLinksForm />\n            </div>\n          </FileUploadProvider>\n        </Form>\n      </DialogBody>\n      <DialogFooter>\n        <Button\n          type=\"button\"\n          onClick={() => {\n            close();\n          }}\n        >\n          <Trans message=\"Cancel\" />\n        </Button>\n        <Button\n          form={formId}\n          type=\"submit\"\n          variant=\"flat\"\n          color=\"primary\"\n          disabled={updateProfile.isPending}\n        >\n          <Trans message=\"Save\" />\n        </Button>\n      </DialogFooter>\n    </Dialog>\n  );\n}\n","import {User} from '@common/auth/user';\nimport React, {\n  Children,\n  Fragment,\n  ReactElement,\n  ReactNode,\n  useContext,\n} from 'react';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {Trans} from '@common/i18n/trans';\nimport {Link} from 'react-router-dom';\nimport {FormattedNumber} from '@common/i18n/formatted-number';\n\ninterface Props {\n  user: User;\n}\nexport function ProfileStatsList({user}: Props) {\n  const {\n    auth: {getUserProfileLink},\n  } = useContext(SiteConfigContext);\n  const profileLink = getUserProfileLink!(user);\n\n  return (\n    <StatsItems>\n      <StatsItem\n        label={<Trans message=\"Followers\" />}\n        value={user.followers_count || 0}\n        link={`${profileLink}/followers`}\n      />\n      <StatsItem\n        label={<Trans message=\"Following\" />}\n        value={user.followed_users_count || 0}\n        link={`${profileLink}/followed-users`}\n      />\n      <StatsItem\n        label={<Trans message=\"Lists\" />}\n        value={user.lists_count || 0}\n        link={`${profileLink}/lists`}\n      />\n    </StatsItems>\n  );\n}\n\ninterface StatsItemsProps {\n  children: ReactNode;\n}\nfunction StatsItems(props: StatsItemsProps) {\n  const children = Children.toArray(props.children);\n  return (\n    <div className=\"flex items-center\">\n      {children.map((child, index) => (\n        <Fragment key={index}>\n          {child}\n          {index < children.length - 1 && (\n            <div className=\"mx-10 h-34 w-1 bg-divider\" />\n          )}\n        </Fragment>\n      ))}\n    </div>\n  );\n}\n\ninterface StatsItemProps {\n  label: ReactElement;\n  value: number;\n  link: string;\n}\nfunction StatsItem({label, value, link}: StatsItemProps) {\n  return (\n    <Link to={link} className=\"group block text-center\">\n      <div className=\"text-lg font-bold\">\n        <FormattedNumber value={value} />\n      </div>\n      <div className=\"text-xs uppercase text-muted transition-colors group-hover:text-primary\">\n        {label}\n      </div>\n    </Link>\n  );\n}\n","import {isAbsoluteUrl} from '../utils/urls/is-absolute-url';\nimport memoize from 'nano-memoize';\nimport clsx from 'clsx';\n\ninterface RemoteFaviconProps {\n  url: string;\n  className?: string;\n  size?: string;\n  alt?: string;\n}\nexport function RemoteFavicon({\n  url,\n  className,\n  size = 'w-16 h-16',\n  alt,\n}: RemoteFaviconProps) {\n  if (!url) {\n    return null;\n  }\n\n  const src = getFaviconSrc(url);\n\n  return (\n    <img\n      className={clsx(size, className)}\n      src={getFaviconSrc(url)}\n      alt={alt || `${src} favicon`}\n    />\n  );\n}\n\nconst getFaviconSrc = memoize((url: string): string => {\n  if (url.includes('youtube')) {\n    return 'https://www.youtube.com/s/desktop/ca54e1bd/img/favicon.ico';\n  }\n\n  // relative url to current site\n  if (!isAbsoluteUrl(url)) {\n    url = `${window.location.protocol}//${window.location.host}`;\n  }\n  const domain = new URL(url).origin;\n  return 'https://www.google.com/s2/favicons?domain=' + domain;\n});\n","import {UserLink} from '@app/profile/user-link';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {RemoteFavicon} from '@common/ui/remote-favicon';\nimport clsx from 'clsx';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {OpenInNewIcon} from '@common/icons/material/OpenInNew';\n\ninterface Props {\n  links?: UserLink[];\n  className?: string;\n}\nexport function ProfileLinks({links, className}: Props) {\n  if (!links?.length) return null;\n\n  if (links.length === 1) {\n    return (\n      <a\n        className=\"flex items-center max-md:justify-center gap-6 mt-24 md:mt-12 hover:text-primary transition-colors\"\n        href={links[0].url}\n      >\n        <OpenInNewIcon className=\"text-muted\" size=\"sm\" />\n        <span className=\"capitalize\">{links[0].title}</span>\n      </a>\n    );\n  }\n\n  return (\n    <div className={clsx('flex items-center', className)}>\n      {links.map(link => (\n        <Tooltip label={link.title} key={link.url}>\n          <ButtonBase\n            elementType=\"a\"\n            href={link.url}\n            target=\"_blank\"\n            rel=\"noreferrer\"\n          >\n            <RemoteFavicon url={link.url} alt={link.title} size=\"w-20 h-20\" />\n          </ButtonBase>\n        </Tooltip>\n      ))}\n    </div>\n  );\n}\n","import {UserAvatar} from '@common/ui/images/user-avatar';\nimport {ProfileDescription} from '@app/profile/header/profile-description';\nimport {FollowButton} from '@common/users/follow-button';\nimport React from 'react';\nimport {useAuth} from '@common/auth/use-auth';\nimport {User} from '@common/auth/user';\nimport {Trans} from '@common/i18n/trans';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Button} from '@common/ui/buttons/button';\nimport {EditIcon} from '@common/icons/material/Edit';\nimport {EditUserProfileDialog} from '@app/profile/edit-user-profile-dialog';\nimport {ProfileStatsList} from '@app/profile/header/profile-stats-list';\nimport {ProfileLinks} from '@app/profile/header/profile-links';\nimport {Chip} from '@common/ui/forms/input-field/chip-field/chip';\n\ninterface Props {\n  user: User;\n}\nexport function ProfilePageHeader({user}: Props) {\n  const {user: currentUser} = useAuth();\n  return (\n    <div className=\"flex flex-col md:flex-row items-center gap-24\">\n      <UserAvatar user={user} circle size=\"w-140 h-140\" />\n      <div className=\"flex-auto\">\n        <div className=\"flex items-center mb-8 gap-8\">\n          <h1 className=\"text-2xl font-bold\">{user.display_name}</h1>\n          {user.is_pro && (\n            <Chip size=\"xs\" color=\"primary\" radius=\"rounded\" className=\"mt-2\">\n              <Trans message=\"PRO\" />\n            </Chip>\n          )}\n        </div>\n        <ProfileDescription profile={user.profile} />\n        <div className=\"flex items-center gap-14 mt-12\">\n          {currentUser?.id !== user.id && (\n            <FollowButton\n              variant=\"outline\"\n              color=\"primary\"\n              size=\"xs\"\n              user={user}\n            />\n          )}\n          {currentUser?.id === user.id && <EditButton user={user} />}\n        </div>\n      </div>\n      <div>\n        <ProfileStatsList user={user} />\n        <ProfileLinks\n          links={user.links}\n          className=\"flex-shrink-0 ml-auto mt-12\"\n        />\n      </div>\n    </div>\n  );\n}\n\ninterface EditButtonProps {\n  user: User;\n}\nfunction EditButton({user}: EditButtonProps) {\n  return (\n    <DialogTrigger type=\"modal\">\n      <Button variant=\"outline\" size=\"xs\" startIcon={<EditIcon />}>\n        <Trans message=\"Edit profile\" />\n      </Button>\n      <EditUserProfileDialog user={user} />\n    </DialogTrigger>\n  );\n}\n","import {useUserProfile} from '@app/profile/requests/use-user-profile';\nimport React, {Fragment, useContext} from 'react';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {PageStatus} from '@common/http/page-status';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {User} from '@common/auth/user';\nimport {Tabs} from '@common/ui/tabs/tabs';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Tab} from '@common/ui/tabs/tab';\nimport {Trans} from '@common/i18n/trans';\nimport {Link, Outlet, useLocation} from 'react-router-dom';\nimport {SiteConfigContext} from '@common/core/settings/site-config-context';\nimport {message} from '@common/i18n/message';\nimport {ProfilePageHeader} from '@app/profile/header/profile-page-header';\n\nconst PageTabs = [\n  {uri: 'lists', label: message('Lists')},\n  {uri: 'ratings', label: message('Ratings')},\n  {uri: 'reviews', label: message('Reviews')},\n  {uri: 'comments', label: message('Comments')},\n  {uri: 'followers', label: message('Followers')},\n  {uri: 'followed-users', label: message('Following')},\n];\n\nexport function UserProfilePage() {\n  const query = useUserProfile();\n\n  const content = query.data ? (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <PageContent user={query.data.user} />\n    </Fragment>\n  ) : (\n    <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />\n  );\n\n  return <SitePageLayout>{content}</SitePageLayout>;\n}\n\ninterface PageContentProps {\n  user: User;\n}\nfunction PageContent({user}: PageContentProps) {\n  return (\n    <div className=\"container mx-auto mt-24 px-14 md:mt-40 md:px-24\">\n      <ProfilePageHeader user={user} />\n      <ProfileTabs user={user} />\n    </div>\n  );\n}\n\ninterface ProfileTabsProps {\n  user: User;\n}\nfunction ProfileTabs({user}: ProfileTabsProps) {\n  const {\n    auth: {getUserProfileLink},\n  } = useContext(SiteConfigContext);\n  const profileLink = getUserProfileLink!(user);\n\n  const {pathname} = useLocation();\n  const tabName = pathname.split('/').pop();\n  let selectedTab = PageTabs.findIndex(tab => tab.uri === tabName);\n  if (selectedTab === -1) {\n    selectedTab = 0;\n  }\n\n  return (\n    <Tabs className=\"mt-34\" selectedTab={selectedTab}>\n      <TabList>\n        {PageTabs.map(tab => (\n          <Tab\n            key={tab.uri}\n            width=\"min-w-132\"\n            elementType={Link}\n            to={`${profileLink}/${tab.uri}`}\n            replace\n          >\n            <Trans {...tab.label} />\n          </Tab>\n        ))}\n      </TabList>\n      <div className=\"mt-24\">\n        <Outlet />\n      </div>\n    </Tabs>\n  );\n}\n","import {useProfileLists} from '@app/profile/requests/use-profile-lists';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {ListAltIcon} from '@common/icons/material/ListAlt';\nimport {Trans} from '@common/i18n/trans';\nimport {UserListIndexItem} from '@app/user-lists/pages/user-lists-index-page/user-list-index-item';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {PageStatus} from '@common/http/page-status';\nimport React from 'react';\nimport {useUserProfile} from '@app/profile/requests/use-user-profile';\n\nexport function ProfileListsPanel() {\n  const userQuery = useUserProfile();\n  const user = userQuery.data!.user;\n  const listsQuery = useProfileLists();\n\n  if (listsQuery.noResults) {\n    return (\n      <IllustratedMessage\n        imageHeight=\"h-auto\"\n        imageMargin=\"mb-14\"\n        image={<ListAltIcon className=\"text-muted\" />}\n        size=\"sm\"\n        title={<Trans message=\"No lists yet\" />}\n        description={\n          <Trans\n            message=\"Follow :user for updates on lists they create in the future.\"\n            values={{user: user.display_name}}\n          />\n        }\n      />\n    );\n  }\n\n  if (listsQuery.data) {\n    return (\n      <div>\n        {listsQuery.items.map(list => (\n          <UserListIndexItem\n            key={list.id}\n            list={list}\n            user={user}\n            showVisibility={false}\n          />\n        ))}\n        <InfiniteScrollSentinel query={listsQuery} />\n      </div>\n    );\n  }\n\n  return <PageStatus query={listsQuery} />;\n}\n","import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {useParams} from 'react-router-dom';\nimport {Review} from '@app/titles/models/review';\n\nexport function useProfileRatings() {\n  const {userId = 'me'} = useParams();\n  return useInfiniteData<Review>({\n    endpoint: `user-profile/${userId}/ratings`,\n    queryKey: ['reviews', 'profile-page-ratings', userId],\n    paginate: 'simple',\n  });\n}\n","import {TitleRating} from '@app/reviews/title-rating';\nimport React from 'react';\nimport {Episode} from '@app/titles/models/episode';\nimport {EpisodePoster} from '@app/episodes/episode-poster/episode-poster';\nimport {Title} from '@app/titles/models/title';\nimport {TitleLinkWithEpisodeNumber} from '@app/titles/title-link';\n\nexport interface EpisodePortraitGridItemProps {\n  item: Episode;\n  title: Title;\n  rating?: number;\n}\nexport function EpisodePortraitGridItem({\n  item,\n  title,\n  rating,\n}: EpisodePortraitGridItemProps) {\n  return (\n    <div>\n      <EpisodePoster\n        episode={item}\n        title={title}\n        srcSize=\"lg\"\n        aspect=\"aspect-poster\"\n        showPlayButton\n      />\n      <div className=\"mt-10 text-sm\">\n        <TitleRating score={rating ?? item.rating} className=\"mb-4\" />\n        <TitleLinkWithEpisodeNumber\n          title={title}\n          episode={item}\n          className=\"block font-medium text-base\"\n        />\n      </div>\n    </div>\n  );\n}\n","import {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {Trans} from '@common/i18n/trans';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {PageStatus} from '@common/http/page-status';\nimport React, {Fragment} from 'react';\nimport {StarIcon} from '@common/icons/material/Star';\nimport {useProfileRatings} from '@app/profile/requests/use-profile-ratings';\nimport {ContentGridLayout} from '@app/channels/content-grid/content-grid-layout';\nimport {Title} from '@app/titles/models/title';\nimport {TitlePortraitGridItem} from '@app/channels/content-grid/title-grid-item';\nimport {useUserProfile} from '@app/profile/requests/use-user-profile';\nimport {Episode} from '@app/titles/models/episode';\nimport {EpisodePortraitGridItem} from '@app/channels/content-grid/episode-grid-item';\n\nexport function ProfileRatingsPanel() {\n  const userQuery = useUserProfile();\n  const user = userQuery.data!.user;\n  const ratingsQuery = useProfileRatings();\n\n  if (ratingsQuery.noResults) {\n    return (\n      <IllustratedMessage\n        imageHeight=\"h-auto\"\n        imageMargin=\"mb-14\"\n        image={<StarIcon className=\"text-muted\" />}\n        size=\"sm\"\n        title={<Trans message=\"No ratings yet\" />}\n        description={\n          <Trans\n            message=\"Follow :user for updates on titles they rate in the future.\"\n            values={{user: user.display_name}}\n          />\n        }\n      />\n    );\n  }\n\n  if (ratingsQuery.data) {\n    return (\n      <Fragment>\n        <ContentGridLayout variant=\"portrait\">\n          {ratingsQuery.items.map(review => {\n            const reviewable = review.reviewable as Title | Episode;\n            if (reviewable.model_type === 'episode') {\n              return (\n                <EpisodePortraitGridItem\n                  key={review.id}\n                  item={reviewable}\n                  title={reviewable.title!}\n                  rating={review.score}\n                />\n              );\n            }\n            return (\n              <TitlePortraitGridItem\n                item={review.reviewable as Title}\n                key={review.id}\n                rating={review.score}\n              />\n            );\n          })}\n        </ContentGridLayout>\n        <InfiniteScrollSentinel query={ratingsQuery} />\n      </Fragment>\n    );\n  }\n\n  return <PageStatus query={ratingsQuery} />;\n}\n","import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {useParams} from 'react-router-dom';\nimport {Review} from '@app/titles/models/review';\n\nexport function useProfileReviews() {\n  const {userId = 'me'} = useParams();\n  return useInfiniteData<Review>({\n    endpoint: `user-profile/${userId}/reviews`,\n    queryKey: ['reviews', 'profile-page-reviews', userId],\n    paginate: 'simple',\n  });\n}\n","import {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {Trans} from '@common/i18n/trans';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {PageStatus} from '@common/http/page-status';\nimport React, {Fragment} from 'react';\nimport {useUserProfile} from '@app/profile/requests/use-user-profile';\nimport {RateReviewIcon} from '@common/icons/material/RateReview';\nimport {useProfileReviews} from '@app/profile/requests/use-profile-reviews';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {Title} from '@app/titles/models/title';\nimport {Review} from '@app/titles/models/review';\nimport {TitleRating} from '@app/reviews/title-rating';\nimport {TitleLink, TitleLinkWithEpisodeNumber} from '@app/titles/title-link';\nimport {Episode} from '@app/titles/models/episode';\n\nexport function ProfileReviewsPanel() {\n  const userQuery = useUserProfile();\n  const user = userQuery.data!.user;\n  const reviewsQuery = useProfileReviews();\n\n  if (reviewsQuery.noResults) {\n    return (\n      <IllustratedMessage\n        imageHeight=\"h-auto\"\n        imageMargin=\"mb-14\"\n        image={<RateReviewIcon className=\"text-muted\" />}\n        size=\"sm\"\n        title={<Trans message=\"No reviews yet\" />}\n        description={\n          <Trans\n            message=\"Follow :user for updates on titles they review in the future.\"\n            values={{user: user.display_name}}\n          />\n        }\n      />\n    );\n  }\n\n  if (reviewsQuery.data) {\n    return (\n      <Fragment>\n        {reviewsQuery.items.map(review => (\n          <ReviewListItem key={review.id} review={review} />\n        ))}\n        <InfiniteScrollSentinel query={reviewsQuery} />\n      </Fragment>\n    );\n  }\n\n  return <PageStatus query={reviewsQuery} />;\n}\n\ninterface ReviewListItemProps {\n  review: Review;\n}\nfunction ReviewListItem({review}: ReviewListItemProps) {\n  const totalVotes = review.helpful_count + review.not_helpful_count;\n  const reviewable = review.reviewable as Title | Episode;\n  const title =\n    reviewable.model_type === 'episode' ? reviewable.title! : reviewable;\n  return (\n    <div className=\"mb-24 flex items-start gap-24 border-b pb-24\">\n      <TitlePoster title={title} size=\"w-90\" srcSize=\"sm\" />\n      <div>\n        <div className=\"text-lg font-semibold\">\n          {reviewable.model_type === 'episode' ? (\n            <TitleLinkWithEpisodeNumber\n              title={title}\n              episode={reviewable}\n              target=\"_blank\"\n            />\n          ) : (\n            <TitleLink title={title} target=\"_blank\" />\n          )}\n        </div>\n        <TitleRating className=\"mb-8 mt-14\" score={review.score} />\n        <div className=\"text-base font-semibold\">{review.title}</div>\n        <p className=\"mt-10 whitespace-pre-line text-sm\">{review.body}</p>\n        {totalVotes ? (\n          <div className=\"mt-12 text-xs text-muted\">\n            <Trans\n              message=\":helpfulCount out of :total people found this helpful.\"\n              values={{\n                helpfulCount: review.helpful_count,\n                total: review.helpful_count + review.not_helpful_count,\n              }}\n            />\n          </div>\n        ) : null}\n      </div>\n    </div>\n  );\n}\n","import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {useParams} from 'react-router-dom';\nimport {Comment} from '@common/comments/comment';\n\nexport function useProfileComments() {\n  const {userId = 'me'} = useParams();\n  return useInfiniteData<Comment>({\n    endpoint: `user-profile/${userId}/comments`,\n    queryKey: ['comment', 'profile-page-comments', userId],\n    paginate: 'simple',\n  });\n}\n","import {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {Trans} from '@common/i18n/trans';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {PageStatus} from '@common/http/page-status';\nimport React, {Fragment} from 'react';\nimport {useUserProfile} from '@app/profile/requests/use-user-profile';\nimport {RateReviewIcon} from '@common/icons/material/RateReview';\nimport {TitlePoster} from '@app/titles/title-poster/title-poster';\nimport {Title} from '@app/titles/models/title';\nimport {TitleLink, TitleLinkWithEpisodeNumber} from '@app/titles/title-link';\nimport {Episode} from '@app/titles/models/episode';\nimport {useProfileComments} from '@app/profile/requests/use-profile-comments';\nimport {Comment} from '@common/comments/comment';\nimport {ThumbUpIcon} from '@common/icons/material/ThumbUp';\nimport {FormattedRelativeTime} from '@common/i18n/formatted-relative-time';\n\nexport function ProfileCommentsPanel() {\n  const userQuery = useUserProfile();\n  const user = userQuery.data!.user;\n  const commentsQuery = useProfileComments();\n\n  if (commentsQuery.noResults) {\n    return (\n      <IllustratedMessage\n        imageHeight=\"h-auto\"\n        imageMargin=\"mb-14\"\n        image={<RateReviewIcon className=\"text-muted\" />}\n        size=\"sm\"\n        title={<Trans message=\"No comments yet\" />}\n        description={\n          <Trans\n            message=\"Follow :user for updates on comments they post in the future.\"\n            values={{user: user.display_name}}\n          />\n        }\n      />\n    );\n  }\n\n  if (commentsQuery.data) {\n    return (\n      <Fragment>\n        {commentsQuery.items.map(comment => (\n          <CommentListItem key={comment.id} comment={comment} />\n        ))}\n        <InfiniteScrollSentinel query={commentsQuery} />\n      </Fragment>\n    );\n  }\n\n  return <PageStatus query={commentsQuery} />;\n}\n\ninterface CommentListItemProps {\n  comment: Comment;\n}\nfunction CommentListItem({comment}: CommentListItemProps) {\n  const commentable = comment.commentable as Title | Episode;\n  const title =\n    commentable.model_type === 'episode' ? commentable.title! : commentable;\n  return (\n    <div className=\"mb-24 flex items-start gap-24 border-b pb-24\">\n      <TitlePoster title={title} size=\"w-90\" srcSize=\"sm\" />\n      <div>\n        <div className=\"text-lg font-semibold\">\n          {commentable.model_type === 'episode' ? (\n            <TitleLinkWithEpisodeNumber\n              title={title}\n              episode={commentable}\n              target=\"_blank\"\n            />\n          ) : (\n            <TitleLink title={title} target=\"_blank\" />\n          )}\n        </div>\n        <time className=\"mt-12 block text-xs text-muted\">\n          <FormattedRelativeTime date={comment.created_at} />\n        </time>\n        <p className=\"mt-8 whitespace-pre-line text-sm\">{comment.content}</p>\n        {comment.upvotes ? (\n          <div className=\"mt-12 flex items-center gap-8 text-muted\">\n            <ThumbUpIcon size=\"sm\" />\n            <div>{comment.upvotes}</div>\n          </div>\n        ) : null}\n      </div>\n    </div>\n  );\n}\n","import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {useParams} from 'react-router-dom';\nimport {User} from '@common/auth/user';\n\nexport function useProfileFollowers() {\n  const {userId = 'me'} = useParams();\n  return useInfiniteData<User>({\n    endpoint: `users/${userId}/followers`,\n    queryKey: ['users', 'profile-page-followers', userId],\n    paginate: 'simple',\n  });\n}\n","import {User} from '@common/auth/user';\nimport {Trans} from '@common/i18n/trans';\nimport React from 'react';\nimport {UserProfileLink} from '@common/users/user-profile-link';\nimport {UserAvatar} from '@common/ui/images/user-avatar';\nimport {FollowButton} from '@common/users/follow-button';\n\ninterface Props {\n  follower: User;\n}\nexport function FollowerListItem({follower}: Props) {\n  return (\n    <div\n      key={follower.id}\n      className=\"flex items-center gap-16 mb-16 pb-16 border-b\"\n    >\n      <UserAvatar user={follower} size=\"lg\" />\n      <div className=\"text-sm\">\n        <UserProfileLink user={follower} />\n        {follower.followers_count && follower.followers_count > 0 ? (\n          <div className=\"text-xs text-muted\">\n            <Trans\n              message=\"[one 1 followers|other :count followers]\"\n              values={{count: follower.followers_count}}\n            />\n          </div>\n        ) : null}\n      </div>\n      <FollowButton\n        variant=\"outline\"\n        size=\"xs\"\n        className=\"ml-auto\"\n        user={follower}\n      />\n    </div>\n  );\n}\n","import {Trans} from '@common/i18n/trans';\nimport React, {Fragment} from 'react';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {BookmarkBorderIcon} from '@common/icons/material/BookmarkBorder';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {useUserProfile} from '@app/profile/requests/use-user-profile';\nimport {useProfileFollowers} from '@app/profile/requests/use-profile-followers';\nimport {FollowerListItem} from '@app/profile/follower-list-item';\nimport {PageStatus} from '@common/http/page-status';\n\nexport function ProfileFollowersPanel() {\n  const userQuery = useUserProfile();\n  const user = userQuery.data!.user;\n  const followersQuery = useProfileFollowers();\n\n  if (followersQuery.noResults) {\n    return (\n      <IllustratedMessage\n        imageHeight=\"h-auto\"\n        imageMargin=\"mb-14\"\n        image={<BookmarkBorderIcon className=\"text-muted\" />}\n        size=\"sm\"\n        title={<Trans message=\"No followers yet\" />}\n        description={\n          <Trans\n            message=\"Be the first to follow :name.\"\n            values={{name: user.display_name}}\n          />\n        }\n      />\n    );\n  }\n\n  if (followersQuery.data) {\n    return (\n      <Fragment>\n        {followersQuery.items.map(follower => (\n          <FollowerListItem key={follower.id} follower={follower} />\n        ))}\n        <InfiniteScrollSentinel query={followersQuery} />\n      </Fragment>\n    );\n  }\n\n  return <PageStatus query={followersQuery} />;\n}\n","import {useInfiniteData} from '@common/ui/infinite-scroll/use-infinite-data';\nimport {useParams} from 'react-router-dom';\nimport {User} from '@common/auth/user';\n\nexport function useProfileFollowedUsers() {\n  const {userId = 'me'} = useParams();\n  return useInfiniteData<User>({\n    endpoint: `users/${userId}/followed-users`,\n    queryKey: ['users', 'profile-page-followed-users', userId],\n    paginate: 'simple',\n  });\n}\n","import {Trans} from '@common/i18n/trans';\nimport React, {Fragment} from 'react';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {BookmarkBorderIcon} from '@common/icons/material/BookmarkBorder';\nimport {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel';\nimport {useUserProfile} from '@app/profile/requests/use-user-profile';\nimport {FollowerListItem} from '@app/profile/follower-list-item';\nimport {useProfileFollowedUsers} from '@app/profile/requests/use-profile-followed-users';\nimport {PageStatus} from '@common/http/page-status';\n\nexport function ProfileFollowedUsersPanel() {\n  const userQuery = useUserProfile();\n  const user = userQuery.data!.user;\n  const followedUsersQuery = useProfileFollowedUsers();\n\n  if (followedUsersQuery.noResults) {\n    return (\n      <IllustratedMessage\n        imageHeight=\"h-auto\"\n        imageMargin=\"mb-14\"\n        image={<BookmarkBorderIcon className=\"text-muted\" />}\n        size=\"sm\"\n        title={<Trans message=\"Not following anyone yet\" />}\n        description={\n          <Trans\n            message=\"Check back later to see users :user is following.\"\n            values={{user: user.display_name}}\n          />\n        }\n      />\n    );\n  }\n\n  if (followedUsersQuery.data) {\n    return (\n      <Fragment>\n        {followedUsersQuery.items.map(followedUser => (\n          <FollowerListItem key={followedUser.id} follower={followedUser} />\n        ))}\n        <InfiniteScrollSentinel query={followedUsersQuery} />\n      </Fragment>\n    );\n  }\n\n  return <PageStatus query={followedUsersQuery} />;\n}\n","import {\n  SearchResponse,\n  useSearchResults,\n} from '@app/search/requests/use-search-results';\nimport {useParams} from 'react-router-dom';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {Trans} from '@common/i18n/trans';\nimport {SiteSectionHeading} from '@app/titles/site-section-heading';\nimport React, {Fragment, useMemo} from 'react';\nimport {Title, TITLE_MODEL} from '@app/titles/models/title';\nimport {Person, PERSON_MODEL} from '@app/titles/models/person';\nimport {ContentGrid} from '@app/channels/content-grid/channel-content-grid';\nimport {PageMetaTags} from '@common/http/page-meta-tags';\nimport {useNavigate} from '@common/utils/hooks/use-navigate';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {message} from '@common/i18n/message';\nimport {UseQueryResult} from '@tanstack/react-query';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {IllustratedMessage} from '@common/ui/images/illustrated-message';\nimport {SearchIcon} from '@common/icons/material/Search';\nimport {PageStatus} from '@common/http/page-status';\n\nexport function SearchPage() {\n  const {query: searchTerm} = useParams();\n  const query = useSearchResults('searchPage', searchTerm);\n\n  return (\n    <Fragment>\n      <PageMetaTags query={query} />\n      <SitePageLayout>\n        <section className=\"container mx-auto mt-24 px-14 md:mt-40 md:px-24\">\n          <main>\n            <MobileSearchBar />\n            <PageContent query={query} />\n          </main>\n        </section>\n      </SitePageLayout>\n    </Fragment>\n  );\n}\n\nfunction MobileSearchBar() {\n  const {searchQuery = ''} = useParams();\n  const navigate = useNavigate();\n  const {trans} = useTrans();\n\n  return (\n    <TextField\n      defaultValue={searchQuery}\n      onChange={e => {\n        navigate(`/search/${e.target.value}`, {replace: true});\n      }}\n      autoFocus\n      className=\"w-full md:hidden\"\n      size=\"lg\"\n      placeholder={trans(message('Search...'))}\n    />\n  );\n}\n\ninterface PageContentProps {\n  query: UseQueryResult<SearchResponse>;\n}\nfunction PageContent({query}: PageContentProps) {\n  const {branding} = useSettings();\n\n  if (query.data) {\n    return <SearchResults query={query} />;\n  }\n\n  if (query.fetchStatus === 'idle') {\n    return (\n      <IllustratedMessage\n        className=\"mt-40\"\n        image={<SearchIcon size=\"xl\" />}\n        imageHeight=\"h-auto\"\n        imageMargin=\"mb-12\"\n        title={\n          <Trans\n            message=\"Search :siteName\"\n            values={{siteName: branding.site_name}}\n          />\n        }\n        description={\n          <Trans message=\"Find movies, tv series, people and more.\" />\n        }\n      />\n    );\n  }\n\n  return <PageStatus query={query} loaderClassName=\"absolute inset-0 m-auto\" />;\n}\n\ninterface PageContentProps {\n  query: UseQueryResult<SearchResponse>;\n}\nfunction SearchResults({query}: PageContentProps) {\n  const {query: searchTerm} = useParams();\n  const {movies, series, people} = useMemo(() => {\n    const movies: Title[] = [];\n    const series: Title[] = [];\n    const people: Person[] = [];\n\n    query.data?.results.forEach(result => {\n      if (result.model_type === TITLE_MODEL && result.is_series) {\n        series.push(result);\n      } else if (result.model_type === TITLE_MODEL && !result.is_series) {\n        movies.push(result);\n      } else if (result.model_type === PERSON_MODEL) {\n        people.push(result);\n      }\n    });\n\n    return {movies, series, people};\n  }, [query]);\n\n  return (\n    <Fragment>\n      <SiteSectionHeading\n        className=\"my-24 md:mb-48\"\n        headingType=\"h1\"\n        fontSize=\"text-xl md:text-3xl\"\n        hideBorder\n      >\n        <Trans\n          message=\"Search results for: “:query“\"\n          values={{query: searchTerm}}\n        />\n      </SiteSectionHeading>\n      {movies.length > 0 && (\n        <div className=\"mb-48\">\n          <SiteSectionHeading fontSize=\"text-2xl\">\n            <Trans message=\"Movies\" />\n          </SiteSectionHeading>\n          <ContentGrid content={movies} variant=\"portrait\" />\n        </div>\n      )}\n      {series.length > 0 && (\n        <div className=\"mb-48\">\n          <SiteSectionHeading fontSize=\"text-2xl\">\n            <Trans message=\"Series\" />\n          </SiteSectionHeading>\n          <ContentGrid content={series} variant=\"portrait\" />\n        </div>\n      )}\n      {people.length > 0 && (\n        <div className=\"mb-48\">\n          <SiteSectionHeading fontSize=\"text-2xl\">\n            <Trans message=\"People\" />\n          </SiteSectionHeading>\n          <ContentGrid content={people} variant=\"portrait\" />\n        </div>\n      )}\n    </Fragment>\n  );\n}\n","import {RouteObject, useRoutes} from 'react-router-dom';\nimport React from 'react';\nimport {ChannelPage} from '@app/channels/channel-page';\nimport {TitlePage} from '@app/titles/pages/title-page/title-page';\nimport {SeasonPage} from '@app/seasons/season-page';\nimport {EpisodePage} from '@app/episodes/episode-page';\nimport {useSettings} from '@common/core/settings/use-settings';\nimport {WatchPage} from '@app/videos/watch-page/watch-page';\nimport {TitleVideosPage} from '@app/titles/pages/title-videos-page';\nimport {TitleImagesPage} from '@app/titles/pages/title-images-page';\nimport {PersonPage} from '@app/people/person-page/person-page';\nimport {TitleFullCreditsPage} from '@app/titles/pages/title-full-credits-page';\nimport {EpisodeFullCreditsPage} from '@app/episodes/epispde-full-credits-page';\nimport {NewsArticlePage} from '@app/news/news-article-page';\nimport {UserListsIndexPage} from '@app/user-lists/pages/user-lists-index-page/user-lists-index-page';\nimport {EditUserListPage} from '@app/user-lists/pages/edit-user-list-page';\nimport {CreateUserListPage} from '@app/user-lists/pages/create-user-list-page';\nimport {SitePageLayout} from '@app/site-page-layout';\nimport {UserProfilePage} from '@app/profile/user-profile-page';\nimport {AuthRoute} from '@common/auth/guards/auth-route';\nimport {ProfileListsPanel} from '@app/profile/panels/profile-lists-panel';\nimport {ProfileRatingsPanel} from '@app/profile/panels/profile-ratings-panel';\nimport {ProfileReviewsPanel} from '@app/profile/panels/profile-reviews-panel';\nimport {ProfileCommentsPanel} from '@app/profile/panels/profile-comments-panel';\nimport {ProfileFollowersPanel} from '@app/profile/panels/profile-followers-panel';\nimport {ProfileFollowedUsersPanel} from '@app/profile/panels/profile-followed-users-panel';\nimport {SearchPage} from '@app/search/search-page';\nimport {NotFoundPage} from '@common/ui/not-found-page/not-found-page';\n\nconst RouteConfig: RouteObject[] = [\n  {\n    index: true,\n    element: <HomepageChannelPage />,\n  },\n  {\n    path: 'search',\n    element: <SearchPage />,\n  },\n  {\n    path: 'search/:query',\n    element: <SearchPage />,\n  },\n  // Watch\n  {\n    path: 'watch/:videoId',\n    element: <WatchPage />,\n  },\n  // Titles\n  {\n    path: '/titles/:titleId/:titleSlug',\n    element: <TitlePage />,\n  },\n  {\n    path: '/titles/:titleId/:titleSlug/videos',\n    element: <TitleVideosPage />,\n  },\n  {\n    path: '/titles/:titleId/:titleSlug/images',\n    element: <TitleImagesPage />,\n  },\n  {\n    path: '/titles/:titleId/:titleSlug/full-credits',\n    element: <TitleFullCreditsPage />,\n  },\n  {\n    path: '/titles/:titleId/:titleSlug/season/:season',\n    element: <SeasonPage />,\n  },\n  {\n    path: '/titles/:titleId/:titleSlug/season/:season/episode/:episode',\n    element: <EpisodePage />,\n  },\n  {\n    path: '/titles/:titleId/:titleSlug/season/:season/episode/:episode/full-credits',\n    element: <EpisodeFullCreditsPage />,\n  },\n  // People\n  {\n    path: '/people/:personId',\n    element: <PersonPage />,\n  },\n  {\n    path: '/people/:personId/:personSlug',\n    element: <PersonPage />,\n  },\n  // News\n  {\n    path: '/news/:articleId',\n    element: <NewsArticlePage />,\n  },\n  // Profile page\n  {\n    path: 'user/:userId/:slug',\n    element: <UserProfilePage />,\n    children: [\n      {\n        index: true,\n        element: <ProfileListsPanel />,\n      },\n      {\n        path: 'lists',\n        element: <ProfileListsPanel />,\n      },\n      {\n        path: 'ratings',\n        element: <ProfileRatingsPanel />,\n      },\n      {\n        path: 'reviews',\n        element: <ProfileReviewsPanel />,\n      },\n      {\n        path: 'comments',\n        element: <ProfileCommentsPanel />,\n      },\n      {\n        path: 'followers',\n        element: <ProfileFollowersPanel />,\n      },\n      {\n        path: 'followed-users',\n        element: <ProfileFollowedUsersPanel />,\n      },\n    ],\n  },\n  {\n    path: 'user/:userId/:slug/:tab',\n    element: <UserProfilePage />,\n  },\n  // User Lists\n  {\n    path: '/lists',\n    element: (\n      <AuthRoute>\n        <UserListsIndexPage />\n      </AuthRoute>\n    ),\n  },\n  {\n    path: '/lists/new',\n    element: (\n      <AuthRoute>\n        <SitePageLayout>\n          <CreateUserListPage />\n        </SitePageLayout>\n      </AuthRoute>\n    ),\n  },\n  {\n    path: '/lists/:slugOrId',\n    element: <ChannelPage type=\"list\" />,\n  },\n  {\n    path: '/lists/:slugOrId/edit',\n    element: (\n      <SitePageLayout>\n        <EditUserListPage />\n      </SitePageLayout>\n    ),\n  },\n\n  // Channels\n  {\n    path: ':slugOrId',\n    element: <ChannelPage />,\n  },\n  {\n    path: 'channel/:slugOrId',\n    element: <ChannelPage />,\n  },\n  {\n    path: ':slugOrId/:restriction',\n    element: <ChannelPage />,\n  },\n  {\n    path: 'channel/:slugOrId/:restriction',\n    element: <ChannelPage />,\n  },\n  {\n    path: '*',\n    element: <NotFoundPage />,\n  },\n];\n\nfunction HomepageChannelPage() {\n  const {homepage} = useSettings();\n  let slugOrId = 'homepage';\n  if (homepage?.type === 'channel' && homepage.value) {\n    slugOrId = homepage.value;\n  }\n  return <ChannelPage slugOrId={slugOrId} />;\n}\n\nexport default function SiteRoutes() {\n  return useRoutes(RouteConfig);\n}\n"],"names":["channel","queryParams","config","sortMethods","method","searchParams","setSearchParams","selectedValue","label","_a","jsxs","newValue","prev","jsx","MenuItem","children","titleAppend","link","fontSize","fontWeight","margin","className","HeadingType","description","descriptionFontSize","actions","hideBorder","title","availableLayouts","m","selectedLayout","setSelectedLayout","layoutConfig","user","auth","useContext","network","name","image","url","left","top","opts","type","trans","setUrlCopied","list","linkProps","useMemo","content","absolute","showShareButton","showVisibility","Fragment","ShareButton","marginLeft","isNested","shouldShowFilterButton","encodedFilters","filters","filtersLoading","urlParam","variant","gridCols","memo","person","showRange","_birthDate","_deathDate","until","birthDate","age","article","item","rating","props","isInfiniteScroll","query","shouldPaginate","fn","wait","callFirst","timeout","debouncedFn","clear","flush","call","debounceWrapper","context","args","callNow","rotate","scrollContainerRef","useRef","itemWidth","perPage","canScrollBackward","setCanScrollBackward","useState","canScrollForward","setCanScrollForward","activePage","setActivePage","updateNavStatus","useCallback","el","pageWidth","useEffect","handleScroll","debounce","useLayoutEffect","firstGridItem","observer","entries","scrollToIndex","index","amount","scrollToPreviousPage","currentScroll","scrollLeft","scrollToNextPage","containerClassName","itemClassName","gridClassName","pagination","titles","itemCount","start","end","items","_b","Content","nestedChannel","loader","signal","data","resolve","response","searchQuery","navigate","setQuery","isOpen","setIsOpen","isFetching","e","ComboBox","result","position","slot","settings","isSubscribed","adCode","ref","id","useId","scrollParent","getScrollParent","parentEl","promises","pattern","match","slugOrId","images","count","heading","srcSize","isMobile","img","src","credits","credit","cast","titleId","seasons","season","creator","director","_c","writer","_d","actor","genre","isLoading","text","href","attributes","attr","val","_ref","tagName","str","tokens","token","options","linkifiedDescription","wrapperRef","contentRef","isOverflowing","setIsOverflowing","isShowingAll","setIsShowingAll","wrapperHeight","forwardRef","reviewable","currentReview","disabled","isExpanded","setIsExpanded","form","openReviewPanel","useImperativeHandle","createReview","newValues","newScore","review","payload","r","model","err","reportable","ReviewListItem","isShared","hideShareButton","avatar","scrolled","UserDisplayName","base_url","location","copyLink","authHandler","submitFeedback","isDisabled","helpfulCount","setHelpfulCount","total","setTotal","initialFeedback","currentFeedback","setCurrentFeedback","hasPermission","report","deleteReport","isReported","setIsReported","handleReport","deleteReview","isDeleteDialogOpen","setIsDeleteDialogOpen","showDeleteButton","handleDelete","isConfirmed","sharedClassName","message","parts","accountRequiredMessage","noResultsMessage","showAccountRequiredMessage","actionsRef","currentUserReview","sharedReview","reviews","sort","setSort","episode","videos","showSeasonSelector","selectedSeason","setSelectedSeason","isInitialLoading","sortDescriptor","setSortDescriptor","value","orderBy","orderDir","runtime","episodes","number","onSeasonChange","seasonCount","seasonNumber","onValueChange","selectedOption","option","title_page","right","poster","listId","color","size","isWatchlisted","addToWatchlist","removeFromWatchlist","showPoster","streaming","watchItem","backdrop","keyword","otherProps","getKeywordLink","country","video","defaultLabel","language","isStreamingMode","PageContent","EpisodeList","isActive","videoId","commentable","params","queryClient","inReplyTo","other","onSuccess","autoFocus","createComment","inputRef","useObjectRef","inputIsExpanded","setInputIsExpanded","inputValue","setInputValue","clearInput","showUpvotesOnly","changeVote","upvotes","setUpvotes","downvotes","setDownvotes","currentVote","setCurrentVote","syncLocalState","CommentListItem","comment","canDelete","replyFormVisible","setReplyFormVisible","showReplyButton","seconds","deleteComments","reportComment","canDeleteAllComments","totalItems","comments","titleLink","videoName","episodeName","rate","activeVideo","showEpisodeSelector","darkThemeVars","isLoggedIn","shouldShowComments","isVisible","setIsVisible","total_credits_count","department","personId","isLast","loadMoreEpisodes","setLoadMoreEpisodes","allEpisodesLoaded","isLoadingMore","shouldShowLoadMoreBtn","episodeCredits","episodeCredit","knownFor","groupedCredits","related","articles","authUser","canEdit","deleteList","close","userId","profile","minWidth","buttonProps","currentUser","isFollowing","followUser","unfollowUser","mergedClassName","fields","append","remove","field","formId","updateProfile","values","Option","getUserProfileLink","profileLink","Children","child","alt","links","pathname","tabName","selectedTab","tab","listsQuery","ratingsQuery","reviewsQuery","totalVotes","commentsQuery","follower","followersQuery","followedUsersQuery","followedUser","searchTerm","branding","movies","series","people","homepage"],"mappings":"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","x_google_ignoreList":[18,44]}