{"version":3,"file":"site-routes-cce2e301.mjs","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","../../../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","../../../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/titles/pages/title-page/title-page-header.tsx","../../../resources/client/titles/pages/title-page/title-page-header-image.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-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) {\n const queryParams = useChannelQueryParams(channel);\n return useInfiniteData({\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 {\n channel: Channel;\n}\nexport function ChannelSortButton({\n channel,\n}: ChannelSortButtonProps) {\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 {\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 \n \n \n \n }\n className=\"max-md:hidden\"\n role=\"presentation\"\n >\n {label ? : }\n \n \n \n {sortMethods?.map(method => (\n \n \n \n ))}\n \n \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 \n {children}\n \n ) : (\n children\n );\n\n return (\n
\n
\n
\n \n \n {title}\n \n {titleAppend && (\n {titleAppend}\n )}\n {link && (\n \n \n \n )}\n
\n
\n {actions && (\n
{actions}
\n )}\n \n {description && (\n
{description}
\n )}\n
\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 setSelectedLayout(newValue as string)}\n >\n \n \n {layoutConfig?.icon || }\n \n }\n >\n {layoutConfig?.label ? (\n \n ) : (\n \n )}\n \n \n \n {availableLayouts?.map(method => (\n \n \n \n ))}\n \n \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
\n \n
\n :name\"\n values={{\n a: () => (\n \n {user.display_name}\n \n ),\n }}\n />\n
\n
\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 \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 \n {children}\n \n }\n onSelected={() => {\n setUrlCopied();\n toast.positive(message('Copied link to clipboard'));\n }}\n >\n \n \n }\n onClick={() => {\n shareLinkSocially(\n 'facebook',\n link,\n trans(message('Check out this link')),\n );\n }}\n >\n \n \n }\n onClick={() => {\n shareLinkSocially(\n 'twitter',\n link,\n trans(message('Check out this link')),\n );\n }}\n >\n \n \n \n \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 {\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 ;\n } else {\n content = list.name;\n }\n\n return (\n \n {content}\n \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 \n {showShareButton && (\n \n \n \n \n )}\n {list.items_count ? (\n \n \n \n \n ) : null}\n \n ,\n }}\n />\n \n {showVisibility && (\n \n \n {list.public ? : }\n
\n {list.public ? (\n \n ) : (\n \n )}\n
\n
\n )}\n \n );\n}\n\ninterface ShareButtonProps {\n list: Channel;\n}\nfunction ShareButton({list}: ShareButtonProps) {\n const link = getUserListLink(list, {absolute: true});\n return (\n \n \n \n );\n}\n\ninterface DividerProps {\n marginLeft?: string;\n}\nfunction Divider({marginLeft = 'ml-12'}: DividerProps) {\n return
;\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
\n \n {actions}\n {!isNested && }\n {shouldShowFilterButton && (\n }\n color={null}\n variant=\"text\"\n disabled={filtersLoading}\n filters={filters}\n />\n )}\n {!isNested && }\n \n }\n />\n {shouldShowFilterButton && (\n
\n \n {filtersLoading && encodedFilters ? (\n \n ) : (\n \n \n \n )}\n \n
\n )}\n
\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 }\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 \n \n );\n}\n\ninterface ChannelDescriptionProps {\n channel: Channel;\n}\nfunction ChannelDescription({channel}: ChannelDescriptionProps) {\n if (channel.type === 'channel') {\n return {channel.description};\n }\n\n return (\n
\n {channel.user && }\n \n
\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 \n {children}\n
\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 \n );\n }\n\n if (person.birth_date) {\n return (\n \n {calculateAgeFromBirthDate(person.birth_date, person.death_date)}\n \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
\n \n
\n \n \n \n
\n {article.source}\n
\n
\n
\n
\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
\n
\n \n
\n
\n \n \n {description ?
{description}
: null}\n
\n
\n );\n}\n\nexport function TitleLandscapeGridItem({item}: TitlePortraitGridItemProps) {\n return (\n
\n \n
\n \n \n {item.release_date && }\n {item.certification && (\n
{item.certification}
\n )}\n
\n \n
\n
\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 ;\n }\n if (title.release_date) {\n return (\n
\n \n
\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 \n ) : (\n \n );\n case PERSON_MODEL:\n return ;\n case NEWS_ARTICLE_MODEL:\n return ;\n default:\n return null;\n }\n}\n\ninterface PersonGridItemProps {\n item: Person;\n}\nfunction PersonGridItem({item}: PersonGridItemProps) {\n return (\n
\n \n
\n \n
\n \n
\n
\n
\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 \n \n {isInfiniteScroll ? (\n \n ) : (\n \n )}\n \n );\n}\n\nfunction InfiniteScrollGrid({channel, variant}: ChannelContentGridProps) {\n const query = useInfiniteChannelContent(channel);\n return (\n \n \n \n \n );\n}\n\nfunction PaginatedGrid({channel, variant, isNested}: ChannelContentGridProps) {\n const shouldPaginate = !isNested;\n const query = useChannelContent(channel, null, {paginate: shouldPaginate});\n return (\n \n {shouldPaginate && (\n \n )}\n \n {shouldPaginate && (\n \n )}\n \n );\n}\n\ninterface ContentProps {\n content: ChannelContentModel[] | undefined;\n variant: ContentGridProps['variant'];\n}\nexport function ContentGrid({content = [], variant}: ContentProps) {\n return (\n \n {content.map(item => (\n \n ))}\n \n );\n}\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(null);\n const itemWidth = useRef(0);\n const perPage = useRef(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
\n \n scrollToPreviousPage()}\n aria-label=\"Previous page\"\n >\n \n \n scrollToNextPage()}\n aria-label=\"Next page\"\n >\n \n \n \n }\n />\n \n {channel.content?.data.map(item => (\n
\n \n
\n ))}\n
\n \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) {\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 {\n BackendResponse\n} from \"@common/http/backend-response/backend-response\";\nimport { Title } from \"@app/titles/models/title\";\nimport { Person } from \"@app/titles/models/person\";\nimport {\n getBootstrapData\n} 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 >\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 {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 {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';\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={<InteractableRating title={title} />}\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 {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';\n\ninterface Props {\n variant?: ButtonProps['variant'];\n color?: ButtonProps['color'];\n item: Title;\n}\nexport function WatchlistButton({\n item,\n variant = 'flat',\n color = 'primary',\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 startIcon={isWatchlisted ? <CheckIcon /> : <AddIcon />}\n className=\"mt-14 min-h-40 w-full\"\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 ) : (\n <Trans message=\"Add to watchlist\" />\n )}\n </Button>\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 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":["MenuItem","className","m","content","ShareButton","activePage","containerClassName","itemClassName","Content","ComboBox","adCode","id","pattern","r","ReviewListItem","UserDisplayName","submitFeedback","deleteReport","message","accountRequiredMessage","_a","addToWatchlist","removeFromWatchlist","getKeywordLink","PageContent","EpisodeList","queryClient","createComment","changeVote","model","CommentListItem","episode","credits","deleteList","followUser","unfollowUser","updateProfile","Option","movies","series","people"],"mappings":"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"}