feat: support removing watch status when null
A user can choose to remove a show from being in their media list completely, by setting the watch status to null
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
import { graphql } from "gql.tada";
|
||||
import { GraphQLClient } from "graphql-request";
|
||||
|
||||
import type { WatchStatus } from "~/types/title";
|
||||
import { AnilistTitleNotFoundError } from "~/libs/errors/TitleNotFound";
|
||||
import type { WatchStatus } from "~/types/title/watchStatus";
|
||||
|
||||
const UpdateWatchStatusQuery = graphql(`
|
||||
const UpdateWatchStatusMutation = graphql(`
|
||||
mutation UpdateWatchStatus($titleId: Int!, $watchStatus: MediaListStatus!) {
|
||||
SaveMediaListEntry(mediaId: $titleId, status: $watchStatus) {
|
||||
id
|
||||
@@ -11,20 +12,60 @@ const UpdateWatchStatusQuery = graphql(`
|
||||
}
|
||||
`);
|
||||
|
||||
/** Updates the watch status for a title on Anilist. If the token is null, the watch status will not be updated. */
|
||||
const GetMediaListEntryQuery = graphql(`
|
||||
query GetMediaListEntry($titleId: Int!) {
|
||||
Media(id: $titleId) {
|
||||
mediaListEntry {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`);
|
||||
|
||||
const DeleteMediaListEntryMutation = graphql(`
|
||||
mutation DeleteMediaListEntry($entryId: Int!) {
|
||||
DeleteMediaListEntry(id: $entryId) {
|
||||
deleted
|
||||
}
|
||||
}
|
||||
`);
|
||||
|
||||
/** Updates the watch status for a title on Anilist. If the token is null, the watch status will not be updated.
|
||||
*
|
||||
* @returns true if the watch status was updated or if the token was null, false if it was not
|
||||
*/
|
||||
export async function maybeUpdateWatchStatusOnAnilist(
|
||||
titleId: number,
|
||||
watchStatus: WatchStatus,
|
||||
watchStatus: WatchStatus | null,
|
||||
aniListToken: string | undefined,
|
||||
) {
|
||||
if (!aniListToken) {
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
const client = new GraphQLClient("https://graphql.anilist.co/");
|
||||
const headers = new Headers({ Authorization: `Bearer ${aniListToken}` });
|
||||
|
||||
if (!watchStatus) {
|
||||
return client
|
||||
.request(GetMediaListEntryQuery, { titleId }, headers)
|
||||
.then((data) => data?.Media?.mediaListEntry?.id)
|
||||
.then((mediaListEntryId) => {
|
||||
if (!mediaListEntryId) {
|
||||
throw new AnilistTitleNotFoundError();
|
||||
}
|
||||
|
||||
return client
|
||||
.request(
|
||||
DeleteMediaListEntryMutation,
|
||||
{ entryId: mediaListEntryId },
|
||||
headers,
|
||||
)
|
||||
.then((data) => !!data?.DeleteMediaListEntry?.deleted);
|
||||
});
|
||||
}
|
||||
|
||||
return client
|
||||
.request(UpdateWatchStatusQuery, { titleId, watchStatus }, headers)
|
||||
.request(UpdateWatchStatusMutation, { titleId, watchStatus }, headers)
|
||||
.then((data) => !!data?.SaveMediaListEntry?.id);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user