import {
Link,
NavLink,
useLocation,
useNavigate,
useOutletContext,
useParams,
} from 'react-router-dom';
import clsx from 'clsx';
import {Trans} from '@common/i18n/trans';
import {message} from '@common/i18n/message';
import {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';
import {StaticPageTitle} from '@common/seo/static-page-title';
import {Option, Select} from '@common/ui/forms/select/select';
import React, {Fragment, ReactNode, useRef} from 'react';
import {useStickySentinel} from '@common/utils/hooks/sticky-sentinel';
import {getTitleLink} from '@app/titles/title-link';
import {IconButton} from '@common/ui/buttons/icon-button';
import {OpenInNewIcon} from '@common/icons/material/OpenInNew';
import {Title} from '@app/titles/models/title';
import {useScrollToTop} from '@common/ui/navigation/use-scroll-to-top';
import {InfoDialogTriggerIcon} from '@common/ui/overlays/dialog/info-dialog-trigger/info-dialog-trigger-icon';
const allMenuItems = [
{to: 'primary-facts', label: message('Primary Facts')},
{to: 'seasons', label: message('Seasons'), hideIfMovie: true},
{to: 'images', label: message('Images')},
{to: 'videos', label: message('Videos')},
{to: 'cast', label: message('Cast')},
{to: 'crew', label: message('Crew')},
{to: 'genres', label: message('Genres')},
{to: 'keywords', label: message('Keywords')},
{to: 'countries', label: message('Countries')},
{to: 'reviews', label: message('Reviews')},
{to: 'comments', label: message('Comments')},
];
function useFilteredMenuItems() {
const title = useOutletContext
();
const isMovie = !title?.is_series;
return allMenuItems.filter(item => !isMovie || !item.hideIfMovie);
}
interface Props {
children: ReactNode;
actions?: ReactNode;
}
export function TitleEditorLayout({children, actions}: Props) {
const isMobile = useIsMobileMediaQuery();
const {isSticky, sentinelRef} = useStickySentinel();
const title = useOutletContext();
const {season, episode} = useParams();
const link = title ? getTitleLink(title, {season, episode}) : null;
const ref = useRef(null);
const heading = title ? (
) : (
);
useScrollToTop(ref);
return (
{heading}
{link ? (
) : null}
{actions}
{isMobile ?
:
}
{children}
);
}
function MobileNav() {
const {titleId} = useParams();
const {pathname} = useLocation();
const navigate = useNavigate();
const value = titleId ? pathname.split('/').pop() : 'primary-facts';
const menuItems = useFilteredMenuItems();
return (
);
}
function DesktopNav() {
const {titleId} = useParams();
const menuItems = useFilteredMenuItems();
return (
{menuItems.map(item => {
const link = titleId ? itemLink(titleId, item.to) : '';
return (
clsx(
'block p-14 whitespace-nowrap mb-8 rounded border-l-4 text-sm transition-bg-color',
!link && 'pointer-events-none text-muted',
(isActive && link) || (item.to === 'primary-facts' && !link)
? 'bg-primary/selected border-l-primary font-medium'
: 'border-l-transparent hover:bg-hover'
)
}
>
);
})}
{!titleId ? (
) : null}
);
}
const itemLink = (titleId: string | number, to: string) =>
`/admin/titles/${titleId}/edit/${to}`;