import {
ActionIcon,
Badge,
Card,
Center,
Flex,
Group,
Image,
Stack,
Text,
Tooltip,
} from '@mantine/core';
import { notifications } from '@mantine/notifications';
import { IconCheck, IconGitPullRequest, IconThumbDown, IconThumbUp } from '@tabler/icons-react';
import { useTranslation } from 'next-i18next';
import { api } from '~/utils/api';
import { defineWidget } from '../helper';
import { WidgetLoading } from '../loading';
import { IWidget } from '../widgets';
import { useMediaRequestQuery } from './media-request-query';
import { MediaRequest, MediaRequestStatus } from './media-request-types';
import { useConfigContext } from '~/config/provider';
const definition = defineWidget({
id: 'media-requests-list',
icon: IconGitPullRequest,
options: {
replaceLinksWithExternalHost: {
type: 'switch',
defaultValue: true,
},
},
component: MediaRequestListTile,
gridstack: {
minWidth: 3,
minHeight: 2,
maxWidth: 12,
maxHeight: 12,
},
});
export type MediaRequestListWidget = IWidget<(typeof definition)['id'], typeof definition>;
interface MediaRequestListWidgetProps {
widget: MediaRequestListWidget;
}
type MediaRequestDecisionVariables = {
request: MediaRequest;
isApproved: boolean;
};
const useMediaRequestDecisionMutation = () => {
const { name: configName } = useConfigContext();
const utils = api.useContext();
const { mutateAsync } = api.overseerr.decide.useMutation({
onSuccess() {
utils.mediaRequest.all.invalidate();
},
});
return async (variables: MediaRequestDecisionVariables) => {
const action = variables.isApproved ? 'Approving' : 'Declining';
notifications.show({
id: `decide-${variables.request.id}`,
color: 'yellow',
title: `${action} request...`,
message: undefined,
loading: true,
});
await mutateAsync(
{
configName: configName!,
id: variables.request.id,
isApproved: variables.isApproved,
},
{
onSuccess(_data, variables) {
const title = variables.isApproved ? 'Request was approved!' : 'Request was declined!';
notifications.update({
id: `decide-${variables.id}`,
color: 'teal',
title,
message: undefined,
icon: