import {message} from '@common/i18n/message'; import { MOVIE_MODEL, SERIES_MODEL, Title, TITLE_MODEL, } from '@app/titles/models/title'; import {NEWS_ARTICLE_MODEL, NewsArticle} from '@app/titles/models/news-article'; import {Channel, CHANNEL_MODEL} from '@common/channels/channel'; import {ChannelContentConfig} from '@common/admin/channels/channel-editor/channel-content-config'; import {Person, PERSON_MODEL} from '@app/titles/models/person'; import {GridViewIcon} from '@common/icons/material/GridView'; import {ViewWeekIcon} from '@common/icons/material/ViewWeek'; import {ViewListIcon} from '@common/icons/material/ViewList'; export enum Sort { popular = 'popularity:desc', recent = 'created_at:desc', rating = 'rating:desc', curated = 'channelables.order:asc', name = 'name:asc', birthdayDesc = 'birth_date:desc', birthdayAsc = 'birth_date:asc', budget = 'budget:desc', revenue = 'revenue:desc', } export enum Layout { grid = 'grid', landscapeGrid = 'landscapeGrid', list = 'list', news = 'news', carousel = 'carousel', landscapeCarousel = 'landscapeCarousel', slider = 'slider', } enum Auto { latestVideos = 'latestVideos', mostPopular = 'mostPopular', topRated = 'topRated', upcoming = 'upcoming', nowPlaying = 'nowPlaying', airingToday = 'airingToday', airingThisWeek = 'airingThisWeek', trendingPeople = 'trendingPeople', discover = 'discover', } const contentModels: ChannelContentConfig['models'] = { [MOVIE_MODEL]: { label: message('Movies'), sortMethods: [ Sort.popular, Sort.recent, Sort.rating, Sort.budget, Sort.revenue, ], layoutMethods: [ Layout.grid, Layout.landscapeGrid, Layout.list, Layout.carousel, Layout.landscapeCarousel, Layout.slider, ], autoUpdateMethods: [ Auto.latestVideos, Auto.mostPopular, Auto.topRated, Auto.upcoming, Auto.nowPlaying, Auto.discover, ], }, [SERIES_MODEL]: { label: message('TV series'), sortMethods: [ Sort.popular, Sort.recent, Sort.rating, Sort.budget, Sort.revenue, ], layoutMethods: [ Layout.grid, Layout.landscapeGrid, Layout.list, Layout.carousel, Layout.landscapeCarousel, Layout.slider, ], autoUpdateMethods: [ Auto.latestVideos, Auto.mostPopular, Auto.topRated, Auto.airingThisWeek, Auto.airingToday, Auto.discover, ], }, [TITLE_MODEL]: { label: message('Titles (movies and series)'), sortMethods: [ Sort.popular, Sort.recent, Sort.rating, Sort.budget, Sort.revenue, ], layoutMethods: [ Layout.grid, Layout.landscapeGrid, Layout.list, Layout.carousel, Layout.landscapeCarousel, Layout.slider, ], autoUpdateMethods: [Auto.latestVideos], }, [NEWS_ARTICLE_MODEL]: { label: message('News articles'), sortMethods: [Sort.recent], layoutMethods: [Layout.news, Layout.landscapeCarousel, Layout.list], }, [PERSON_MODEL]: { label: message('People'), sortMethods: [ Sort.popular, Sort.recent, Sort.name, Sort.birthdayDesc, Sort.birthdayAsc, ], layoutMethods: [Layout.grid, Layout.list, Layout.carousel], autoUpdateMethods: [Auto.trendingPeople], }, [CHANNEL_MODEL]: { label: message('Channels'), sortMethods: [], layoutMethods: [Layout.list], }, }; const contentSortingMethods: Record< Sort, ChannelContentConfig['sortingMethods']['any'] > = { [Sort.popular]: { label: message('Most popular first'), }, [Sort.recent]: { label: message('Recently added first'), }, [Sort.rating]: { label: message('Highest rated first'), }, [Sort.curated]: { label: message('Curated (reorder below)'), contentTypes: ['manual'], }, [Sort.name]: { label: message('Name (A-Z)'), contentTypes: ['manual'], }, [Sort.birthdayDesc]: { label: message('Youngest first'), }, [Sort.birthdayAsc]: { label: message('Oldest first'), }, [Sort.budget]: { label: message('Biggest budget first'), }, [Sort.revenue]: { label: message('Biggest revenue first'), }, }; const contentLayoutMethods: Record< Layout, ChannelContentConfig['layoutMethods']['any'] > = { [Layout.grid]: { label: message('Grid'), icon: , }, [Layout.landscapeGrid]: { label: message('Landscape'), icon: , }, [Layout.list]: { label: message('List'), icon: , }, [Layout.carousel]: { label: message('Carousel (portrait)'), }, [Layout.landscapeCarousel]: { label: message('Carousel (landscape)'), }, [Layout.slider]: { label: message('Slider'), }, [Layout.news]: { label: message('News'), }, }; const contentAutoUpdateMethods: Record< Auto, ChannelContentConfig['autoUpdateMethods']['any'] > = { [Auto.discover]: { label: message('Discover (TMDB only)'), provider: 'tmdb', }, [Auto.mostPopular]: { label: message('Most popular'), }, [Auto.topRated]: { label: message('Top rated'), }, [Auto.upcoming]: { label: message('Upcoming'), }, [Auto.nowPlaying]: { label: message('In theaters'), }, [Auto.airingToday]: { label: message('Airing today'), }, [Auto.airingThisWeek]: { label: message('Airing this week'), }, [Auto.trendingPeople]: { label: message('Trending people'), }, [Auto.latestVideos]: { label: message('Most recently published videos'), provider: 'local', }, }; export const channelContentConfig: ChannelContentConfig = { models: contentModels, sortingMethods: contentSortingMethods, layoutMethods: contentLayoutMethods, autoUpdateMethods: contentAutoUpdateMethods, userSelectableLayouts: [Layout.grid, Layout.landscapeGrid, Layout.list], }; export type ChannelContentModel = (Title | NewsArticle | Person | Channel) & { channelable_id?: number; channelable_order?: number; };