/* * 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 { useTranslation } from 'react-i18next'; import { useState } from 'react'; import PopupState, { bindDialog, bindTrigger } from 'material-ui-popup-state'; import ListItemButton from '@mui/material/ListItemButton'; import Chip from '@mui/material/Chip'; import ListItemAvatar from '@mui/material/ListItemAvatar'; import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction'; import Avatar from '@mui/material/Avatar'; import ListItemText from '@mui/material/ListItemText'; import Dialog from '@mui/material/Dialog'; import DialogTitle from '@mui/material/DialogTitle'; import DialogContent from '@mui/material/DialogContent'; import TextField from '@mui/material/TextField'; import DialogActions from '@mui/material/DialogActions'; import Button from '@mui/material/Button'; import { PasswordTextField } from '@/features/core/components/inputs/PasswordTextField.tsx'; import { makeToast } from '@/features/core/utils/Toast.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { Trackers } from '@/features/tracker/services/Trackers.ts'; import { getErrorMessage } from '@/lib/HelperFunctions.ts'; import { useLocalStorage } from '@/features/core/hooks/useStorage.tsx'; import { TTrackerSearch } from '@/features/tracker/Tracker.types.ts'; export const SettingsTrackerCard = ({ tracker }: { tracker: TTrackerSearch }) => { const { t } = useTranslation(); const [serverAddress] = useLocalStorage('serverBaseURL', import.meta.env.VITE_SERVER_URL_DEFAULT); const [loginTrackerCredentials, { loading: isCredentialLoginInProgress }] = requestManager.useLoginToTrackerCredentials(); const [logoutFromTracker] = requestManager.useLogoutFromTracker(); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const isOAuthLogin = !tracker.isLoggedIn && !!tracker.authUrl; const handleLogout = async () => { try { await logoutFromTracker({ variables: { trackerId: tracker.id } }); } catch (e) { makeToast(t('tracking.action.logout.label.failure', { name: tracker.name }), 'error', getErrorMessage(e)); } }; const handleLogin = async () => { if (isOAuthLogin) { const state = { redirectUrl: `${serverAddress}/tracker/login/oauth`, clientName: 'Suwayomi-WebUI', trackerId: tracker.id, trackerName: tracker.name, }; window.open(`${tracker.authUrl}&state=${JSON.stringify(state)}`, '_self'); return; } try { await loginTrackerCredentials({ variables: { input: { trackerId: tracker.id, username, password } } }); } catch (e) { makeToast(t('tracking.action.login.label.failure', { name: tracker.name }), 'error', getErrorMessage(e)); } }; const onClick = (openPopup: () => void) => { if (!isOAuthLogin) { openPopup(); return; } handleLogin(); }; return ( {(popupState) => ( <> onClick(popupState.open)}> {Trackers.isLoggedIn(tracker) && ( )} {t( Trackers.isLoggedIn(tracker) ? 'tracking.settings.dialog.title.log_out' : 'tracking.settings.dialog.title.log_in', { name: tracker.name }, )} {!isOAuthLogin && !tracker.isLoggedIn && ( setUsername(e.target.value)} /> setPassword(e.target.value)} /> )} )} ); };