/* * 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 Card from '@mui/material/Card'; import CardContent from '@mui/material/CardContent'; import Avatar from '@mui/material/Avatar'; import { useTranslation } from 'react-i18next'; import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Divider, FormGroup, IconButton, Link, ListItemButton, MenuItem, Stack, Tooltip, Typography, } from '@mui/material'; import MoreVertIcon from '@mui/icons-material/MoreVert'; import PopupState, { bindDialog, bindMenu, bindTrigger } from 'material-ui-popup-state'; import { useMemo, useState } from 'react'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { Trackers, TTrackRecord, UNSET_DATE } from '@/lib/data/Trackers.ts'; import { ListPreference } from '@/components/sourceConfiguration/ListPreference.tsx'; import { NumberSetting } from '@/components/settings/NumberSetting.tsx'; import { DateSetting } from '@/components/settings/DateSetting.tsx'; import { makeToast } from '@/components/util/Toast.tsx'; import { Menu } from '@/components/menu/Menu'; import { CARD_STYLING } from '@/components/tracker/constants.ts'; import { TypographyMaxLines } from '@/components/atoms/TypographyMaxLines.tsx'; import { SelectSetting, SelectSettingValue } from '@/components/settings/SelectSetting.tsx'; import { CheckboxInput } from '@/components/atoms/CheckboxInput'; const TrackerActiveLink = ({ children, url }: { children: React.ReactNode; url: string }) => ( {children} ); const TrackerActiveRemoveBind = ({ trackRecord: { tracker, ...trackRecord }, onClick, onClose, }: { trackRecord: TTrackRecord; onClick: () => void; onClose: () => void; }) => { const { t } = useTranslation(); const [removeRemoteTracking, setRemoveRemoteTracking] = useState(false); const removeBind = () => { onClose(); requestManager .unbindTracker(trackRecord.id, removeRemoteTracking) .response.then(() => makeToast(t('manga.action.track.remove.label.success'), 'success')) .catch(() => makeToast(t('manga.action.track.remove.label.error'), 'error')); }; return ( {(popupState) => ( <> { onClick(); popupState.open(); }} onTouchStart={() => { onClick(); popupState.open(); }} > {t('global.button.remove')} { onClose(); popupState.close(); }} > {t('manga.action.track.remove.dialog.label.title', { tracker: tracker.name })} {t('manga.action.track.remove.dialog.label.description')} {tracker.supportsTrackDeletion && ( setRemoveRemoteTracking(checked)} /> )} )} ); }; const TrackerActiveHeader = ({ trackRecord: { tracker, ...trackRecord }, openSearch, }: { trackRecord: TTrackRecord; openSearch: () => void; }) => { const { t } = useTranslation(); return ( {trackRecord.title} {(popupState) => ( <> {(onClose, setHideMenu) => [ onClose()}> {t('global.label.open_in_browser')} , setHideMenu(true)} onClose={onClose} />, ]} )} ); }; const TrackerActiveCardInfoRow = ({ children }: { children: React.ReactNode }) => ( {children} ); const isUnsetScore = (score: string | number): boolean => !Math.trunc(Number(score)); export const TrackerActiveCard = ({ trackRecord: { tracker, ...trackRecord }, onClick, }: { trackRecord: TTrackRecord; onClick: () => void; }) => { const { t } = useTranslation(); const isScoreUnset = isUnsetScore(trackRecord.displayScore); const currentScore = isScoreUnset ? tracker.scores[0] : trackRecord.displayScore; const selectSettingValues = useMemo( () => tracker.scores.map( (score) => [score, { text: isUnsetScore(score) ? '-' : score }] satisfies SelectSettingValue< TTrackRecord['tracker']['scores'][number] >, ), [tracker.scores], ); const updateTrackerBind = (patch: Parameters[1]) => { requestManager .updateTrackerBind(trackRecord.id, patch) .response.catch(() => makeToast(t('global.error.label.failed_to_save_changes'), 'error')); }; return ( status.name)} key="status" type="ListPreference" entryValues={tracker.statuses.map((status) => `${status.value}`)} ListPreferenceCurrentValue={`${trackRecord.status}`} updateValue={(_, status) => updateTrackerBind({ status: status as unknown as number }) } summary="%s" /> updateTrackerBind({ lastChapterRead })} /> settingName={t('tracking.track_record.label.score')} defaultValue={tracker.scores[0]} value={currentScore} values={selectSettingValues} handleChange={(score) => updateTrackerBind({ scoreString: score })} /> updateTrackerBind({ startDate: startDate ?? UNSET_DATE }) } /> updateTrackerBind({ finishDate: finishDate ?? UNSET_DATE }) } /> ); };