feat: add availability information about media requests (#1794)
This commit is contained in:
@@ -16,7 +16,9 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"approved": "Approved",
|
"approved": "Approved",
|
||||||
"pendingApproval": "Pending approval",
|
"pendingApproval": "Pending approval",
|
||||||
"declined": "Declined"
|
"declined": "Declined",
|
||||||
|
"available": "Available",
|
||||||
|
"partial": "Partial"
|
||||||
},
|
},
|
||||||
"tooltips": {
|
"tooltips": {
|
||||||
"approve": "Approve requests",
|
"approve": "Approve requests",
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ export const mediaRequestsRouter = createTRPCRouter({
|
|||||||
userRequestCount: item.requestedBy.requestCount,
|
userRequestCount: item.requestedBy.requestCount,
|
||||||
airDate: genericItem.airDate,
|
airDate: genericItem.airDate,
|
||||||
status: item.status,
|
status: item.status,
|
||||||
|
availability: item.is4k ? item.media.status4k : item.media.status,
|
||||||
backdropPath: `https://image.tmdb.org/t/p/original/${genericItem.backdropPath}`,
|
backdropPath: `https://image.tmdb.org/t/p/original/${genericItem.backdropPath}`,
|
||||||
posterPath: `https://image.tmdb.org/t/p/w600_and_h900_bestv2/${genericItem.posterPath}`,
|
posterPath: `https://image.tmdb.org/t/p/w600_and_h900_bestv2/${genericItem.posterPath}`,
|
||||||
href: `${appUrl}/${item.type}/${item.media.tmdbId}`,
|
href: `${appUrl}/${item.type}/${item.media.tmdbId}`,
|
||||||
@@ -215,6 +216,7 @@ type OverseerrResponseItem = {
|
|||||||
status: number;
|
status: number;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
type: 'movie' | 'tv';
|
type: 'movie' | 'tv';
|
||||||
|
is4k: boolean;
|
||||||
rootFolder: string;
|
rootFolder: string;
|
||||||
requestedBy: OverseerrResponseItemUser;
|
requestedBy: OverseerrResponseItemUser;
|
||||||
media: OverseerrResponseItemMedia;
|
media: OverseerrResponseItemMedia;
|
||||||
@@ -222,6 +224,8 @@ type OverseerrResponseItem = {
|
|||||||
|
|
||||||
type OverseerrResponseItemMedia = {
|
type OverseerrResponseItemMedia = {
|
||||||
tmdbId: number;
|
tmdbId: number;
|
||||||
|
status: number;
|
||||||
|
status4k: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type OverseerrResponseItemUser = {
|
type OverseerrResponseItemUser = {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import { defineWidget } from '../helper';
|
|||||||
import { WidgetLoading } from '../loading';
|
import { WidgetLoading } from '../loading';
|
||||||
import { IWidget } from '../widgets';
|
import { IWidget } from '../widgets';
|
||||||
import { useMediaRequestQuery } from './media-request-query';
|
import { useMediaRequestQuery } from './media-request-query';
|
||||||
import { MediaRequest, MediaRequestStatus } from './media-request-types';
|
import { MediaRequest, MediaRequestAvailability, MediaRequestStatus } from './media-request-types';
|
||||||
|
|
||||||
const definition = defineWidget({
|
const definition = defineWidget({
|
||||||
id: 'media-requests-list',
|
id: 'media-requests-list',
|
||||||
@@ -154,7 +154,10 @@ function MediaRequestListTile({ widget }: MediaRequestListWidgetProps) {
|
|||||||
<Stack spacing={0}>
|
<Stack spacing={0}>
|
||||||
<Group spacing="xs">
|
<Group spacing="xs">
|
||||||
{item.airDate && <Text>{item.airDate.split('-')[0]}</Text>}
|
{item.airDate && <Text>{item.airDate.split('-')[0]}</Text>}
|
||||||
<MediaRequestStatusBadge status={item.status} />
|
<MediaRequestStatusBadge
|
||||||
|
status={item.status}
|
||||||
|
availability={item.availability}
|
||||||
|
/>
|
||||||
</Group>
|
</Group>
|
||||||
<Anchor
|
<Anchor
|
||||||
href={item.href}
|
href={item.href}
|
||||||
@@ -245,11 +248,24 @@ function MediaRequestListTile({ widget }: MediaRequestListWidgetProps) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const MediaRequestStatusBadge = ({ status }: { status: MediaRequestStatus }) => {
|
const MediaRequestStatusBadge = ({
|
||||||
|
status,
|
||||||
|
availability,
|
||||||
|
}: {
|
||||||
|
status: MediaRequestStatus;
|
||||||
|
availability: MediaRequestAvailability;
|
||||||
|
}) => {
|
||||||
const { t } = useTranslation('modules/media-requests-list');
|
const { t } = useTranslation('modules/media-requests-list');
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case MediaRequestStatus.Approved:
|
case MediaRequestStatus.Approved:
|
||||||
return <Badge color="green">{t('state.approved')}</Badge>;
|
switch (availability) {
|
||||||
|
case MediaRequestAvailability.Available:
|
||||||
|
return <Badge color="green">{t('state.available')}</Badge>;
|
||||||
|
case MediaRequestAvailability.Partial:
|
||||||
|
return <Badge color="yellow">{t('state.partial')}</Badge>;
|
||||||
|
default:
|
||||||
|
return <Badge color="violet">{t('state.approved')}</Badge>;
|
||||||
|
}
|
||||||
case MediaRequestStatus.Declined:
|
case MediaRequestStatus.Declined:
|
||||||
return <Badge color="red">{t('state.declined')}</Badge>;
|
return <Badge color="red">{t('state.declined')}</Badge>;
|
||||||
case MediaRequestStatus.PendingApproval:
|
case MediaRequestStatus.PendingApproval:
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ export type MediaRequest = {
|
|||||||
userRequestCount: number;
|
userRequestCount: number;
|
||||||
airDate?: string;
|
airDate?: string;
|
||||||
status: MediaRequestStatus;
|
status: MediaRequestStatus;
|
||||||
|
availability: MediaRequestAvailability;
|
||||||
backdropPath: string;
|
backdropPath: string;
|
||||||
posterPath: string;
|
posterPath: string;
|
||||||
href: string;
|
href: string;
|
||||||
@@ -30,3 +31,11 @@ export enum MediaRequestStatus {
|
|||||||
Approved = 2,
|
Approved = 2,
|
||||||
Declined = 3,
|
Declined = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum MediaRequestAvailability {
|
||||||
|
Unknown = 1,
|
||||||
|
Pending = 2,
|
||||||
|
Processing = 3,
|
||||||
|
Partial = 4,
|
||||||
|
Available = 5,
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user