/* * Copyright (C) Contributors to the Suwayomi project * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import React, { useContext, useEffect } from 'react'; import { IconButton } from '@mui/material'; import TravelExploreIcon from '@mui/icons-material/TravelExplore'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { ISource } from '@/typings'; import requestManager from '@/lib/RequestManager'; import useLocalStorage from '@/util/useLocalStorage'; import { sourceDefualtLangs, sourceForcedDefaultLangs, langSortCmp } from '@/util/language'; import { translateExtensionLanguage } from '@/screens/util/Extensions'; import LoadingPlaceholder from '@/components/util/LoadingPlaceholder'; import NavbarContext from '@/components/context/NavbarContext'; import SourceCard from '@/components/SourceCard'; import LangSelect from '@/components/navbar/action/LangSelect'; function sourceToLangList(sources: ISource[]) { const result: string[] = []; sources.forEach((source) => { if (result.indexOf(source.lang) === -1) { result.push(source.lang); } }); result.sort(langSortCmp); return result; } function groupByLang(sources: ISource[]) { const result = {} as any; sources.forEach((source) => { if (result[source.lang] === undefined) { result[source.lang] = [] as ISource[]; } result[source.lang].push(source); }); return result; } export default function Sources() { const { t } = useTranslation(); const { setTitle, setAction } = useContext(NavbarContext); const [shownLangs, setShownLangs] = useLocalStorage('shownSourceLangs', sourceDefualtLangs()); const [showNsfw] = useLocalStorage('showNsfw', true); const { data: sources, isLoading } = requestManager.useGetSourceList(); const navigate = useNavigate(); useEffect(() => { // make sure all of forcedDefaultLangs() exists in shownLangs sourceForcedDefaultLangs().forEach((forcedLang) => { let hasLang = false; shownLangs.forEach((lang) => { if (lang === forcedLang) hasLang = true; }); if (!hasLang) { setShownLangs((shownLangsCopy) => { shownLangsCopy.push(forcedLang); return shownLangsCopy; }); } }); }, []); useEffect(() => { setTitle(t('source.title')); setAction( <> navigate('/sources/all/search/')} size="large"> , ); }, [t, shownLangs, sources]); if (isLoading) return ; if (sources?.length === 0) { return

{t('source.error.label.no_sources_found')}

; } return ( <> {Object.entries(groupByLang(sources ?? [])) .sort((a, b) => langSortCmp(a[0], b[0])) .map( ([lang, list]) => shownLangs.indexOf(lang) !== -1 && (

{translateExtensionLanguage(lang)}

{(list as ISource[]) .filter((source) => showNsfw || !source.isNsfw) .map((source) => ( ))}
), )} ); }