/* * Kyoo - A portable and vast media library solution. * Copyright (c) Kyoo. * * See AUTHORS.md and LICENSE file in the project root for full license information. * * Kyoo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * Kyoo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Kyoo. If not, see . */ import { HR, Icon, IconButton, Menu, P, PressableFeedback, tooltip, ts } from "@kyoo/primitives"; import ArrowDownward from "@material-symbols/svg-400/rounded/arrow_downward.svg"; import ArrowUpward from "@material-symbols/svg-400/rounded/arrow_upward.svg"; import FilterList from "@material-symbols/svg-400/rounded/filter_list.svg"; import GridView from "@material-symbols/svg-400/rounded/grid_view.svg"; import Sort from "@material-symbols/svg-400/rounded/sort.svg"; import ViewList from "@material-symbols/svg-400/rounded/view_list.svg"; import { forwardRef } from "react"; import { useTranslation } from "react-i18next"; import { type PressableProps, View } from "react-native"; import { useYoshiki } from "yoshiki/native"; import { Layout, type MediaType, MediaTypeAll, SearchSort, SortOrd } from "./types"; const SortTrigger = forwardRef(function SortTrigger( { sortKey, ...props }, ref, ) { const { css } = useYoshiki(); const { t } = useTranslation(); return (

{t(`browse.sortkey.${sortKey}` as any)}

); }); const MediaTypeTrigger = forwardRef( function MediaTypeTrigger({ mediaType, ...props }, ref) { const { css } = useYoshiki(); const { t } = useTranslation(); const labelKey = mediaType !== MediaTypeAll ? `browse.mediatypekey.${mediaType.key}` : "browse.mediatypelabel"; const icon = mediaType !== MediaTypeAll ? mediaType?.icon ?? FilterList : FilterList; return (

{t(labelKey as any)}

); }, ); export const BrowseSettings = ({ availableSorts, sortKey, sortOrd, setSort, availableMediaTypes, mediaType, setMediaType, layout, setLayout, }: { availableSorts: string[]; sortKey: string; sortOrd: SortOrd; setSort: (sort: string, ord: SortOrd) => void; availableMediaTypes: MediaType[]; mediaType: MediaType; setMediaType: (mediaType: MediaType) => void; layout: Layout; setLayout: (layout: Layout) => void; }) => { const { css, theme } = useYoshiki(); const { t } = useTranslation(); return ( {availableSorts.map((x) => ( setSort(x, sortKey === x && sortOrd === SortOrd.Asc ? SortOrd.Desc : SortOrd.Asc) } /> ))}
setLayout(Layout.Grid)} color={layout === Layout.Grid ? theme.accent : undefined} {...tooltip(t("browse.switchToGrid"))} {...css({ padding: ts(0.5), marginY: "auto" })} /> setLayout(Layout.List)} color={layout === Layout.List ? theme.accent : undefined} {...tooltip(t("browse.switchToList"))} {...css({ padding: ts(0.5), marginY: "auto" })} />
{availableMediaTypes.map((x) => ( setMediaType(x)} /> ))}
); };