/* * 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 Box from '@mui/material/Box'; import { useTranslation } from 'react-i18next'; import Card from '@mui/material/Card'; import Typography from '@mui/material/Typography'; import IconButton from '@mui/material/IconButton'; import SettingsIcon from '@mui/icons-material/Settings'; import { useNavigate } from 'react-router-dom'; import Dialog from '@mui/material/Dialog'; import DialogTitle from '@mui/material/DialogTitle'; import DialogContent from '@mui/material/DialogContent'; import { useMemo } from 'react'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts'; import { LoadingPlaceholder } from '@/modules/core/components/feedback/LoadingPlaceholder'; import { EmptyViewAbsoluteCentered } from '@/modules/core/components/feedback/EmptyViewAbsoluteCentered'; import { getErrorMessage } from '@/lib/HelperFunctions'; import { CustomTooltip } from '@/modules/core/components/CustomTooltip'; import { AppRoutes } from '@/modules/core/AppRoute.constants'; import { translateExtensionLanguage } from '@/modules/extension/Extensions.utils'; import { StyledGroupItemWrapper } from '@/modules/core/components/virtuoso/StyledGroupItemWrapper.tsx'; import { TExtension } from '@/modules/extension/Extensions.types.ts'; import { Sources } from '@/modules/source/services/Sources.ts'; import { ListCardContent } from '@/modules/core/components/lists/cards/ListCardContent.tsx'; interface IExtensionOptions { extensionId: TExtension['pkgName'] | undefined; closeDialog: () => void; } export function ExtensionOptions({ extensionId, closeDialog }: IExtensionOptions) { const { t } = useTranslation(); const navigate = useNavigate(); const { data, loading: isLoading, error, refetch, } = requestManager.useGetSourceList({ notifyOnNetworkStatusChange: true }); if (error) { return ; } const relevantSources = useMemo(() => { if (!extensionId) return []; return data?.sources.nodes.filter((source) => source.extension.pkgName === extensionId); }, [data?.sources.nodes, extensionId]); return ( {t('extension.settings.dialog.title')} {isLoading && } {error && ( refetch().catch(defaultPromiseErrorHandler('ExtensionOptions::refetch'))} /> )} {!isLoading && !error && ( {relevantSources?.map((source) => ( {translateExtensionLanguage(Sources.getLanguage(source))} {source.isConfigurable && ( navigate( AppRoutes.sources.childRoutes.configure.path(source.id), ) } color="inherit" > )} ))} )} ); }