bazarr/frontend/src/modules/socketio/reducer.ts

188 lines
5.0 KiB
TypeScript

import queryClient from "@/apis/queries";
import { QueryKeys } from "@/apis/queries/keys";
import { LOG } from "@/utilities/console";
import { setCriticalError, setOnlineStatus } from "@/utilities/event";
import { showNotification } from "@mantine/notifications";
import { notification, task } from "../task";
export function createDefaultReducer(): SocketIO.Reducer[] {
return [
{
key: "connect",
any: () => setOnlineStatus(true),
},
{
key: "connect_error",
any: () => {
setCriticalError("Cannot connect to backend");
},
},
{
key: "disconnect",
any: () => setOnlineStatus(false),
},
{
key: "message",
update: (msg) => {
msg
.map((message) => notification.info("Notification", message))
.forEach(showNotification);
},
},
{
key: "progress",
update: task.updateProgress.bind(task),
delete: task.removeProgress.bind(task),
},
{
key: "series",
update: (ids) => {
LOG("info", "Invalidating series", ids);
ids.forEach((id) => {
queryClient.invalidateQueries([QueryKeys.Series, id]);
});
},
delete: (ids) => {
LOG("info", "Invalidating series", ids);
ids.forEach((id) => {
queryClient.invalidateQueries([QueryKeys.Series, id]);
});
},
},
{
key: "movie",
update: (ids) => {
LOG("info", "Invalidating movies", ids);
ids.forEach((id) => {
queryClient.invalidateQueries([QueryKeys.Movies, id]);
});
},
delete: (ids) => {
LOG("info", "Invalidating movies", ids);
ids.forEach((id) => {
queryClient.invalidateQueries([QueryKeys.Movies, id]);
});
},
},
{
key: "episode",
update: (ids) => {
// Currently invalidate episodes is impossible because we don't directly fetch episodes (we fetch episodes by series id)
// So we need to invalidate series instead
// TODO: Make a query for episodes and invalidate that instead
LOG("info", "Invalidating episodes", ids);
ids.forEach((id) => {
const episode = queryClient.getQueryData<Item.Episode>([
QueryKeys.Episodes,
id,
]);
if (episode !== undefined) {
queryClient.invalidateQueries([
QueryKeys.Series,
episode.sonarrSeriesId,
]);
}
});
},
delete: (ids) => {
LOG("info", "Invalidating episodes", ids);
ids.forEach((id) => {
const episode = queryClient.getQueryData<Item.Episode>([
QueryKeys.Episodes,
id,
]);
if (episode !== undefined) {
queryClient.invalidateQueries([
QueryKeys.Series,
episode.sonarrSeriesId,
]);
}
});
},
},
{
key: "episode-wanted",
update: (ids) => {
// Find a better way to update wanted
queryClient.invalidateQueries([QueryKeys.Episodes, QueryKeys.Wanted]);
},
delete: () => {
queryClient.invalidateQueries([QueryKeys.Episodes, QueryKeys.Wanted]);
},
},
{
key: "movie-wanted",
update: (ids) => {
// Find a better way to update wanted
queryClient.invalidateQueries([QueryKeys.Movies, QueryKeys.Wanted]);
},
delete: () => {
queryClient.invalidateQueries([QueryKeys.Movies, QueryKeys.Wanted]);
},
},
{
key: "settings",
any: () => {
queryClient.invalidateQueries([QueryKeys.System]);
},
},
{
key: "languages",
any: () => {
queryClient.invalidateQueries([QueryKeys.System, QueryKeys.Languages]);
},
},
{
key: "badges",
any: () => {
queryClient.invalidateQueries([QueryKeys.System, QueryKeys.Badges]);
},
},
{
key: "movie-history",
any: () => {
queryClient.invalidateQueries([QueryKeys.Movies, QueryKeys.History]);
},
},
{
key: "movie-blacklist",
any: () => {
queryClient.invalidateQueries([QueryKeys.Movies, QueryKeys.Blacklist]);
},
},
{
key: "episode-history",
any: () => {
queryClient.invalidateQueries([QueryKeys.Episodes, QueryKeys.History]);
},
},
{
key: "episode-blacklist",
any: () => {
queryClient.invalidateQueries([
QueryKeys.Episodes,
QueryKeys.Blacklist,
]);
},
},
{
key: "reset-episode-wanted",
any: () => {
queryClient.invalidateQueries([QueryKeys.Episodes, QueryKeys.Wanted]);
},
},
{
key: "reset-movie-wanted",
any: () => {
queryClient.invalidateQueries([QueryKeys.Movies, QueryKeys.Wanted]);
},
},
{
key: "task",
any: () => {
queryClient.invalidateQueries([QueryKeys.System, QueryKeys.Tasks]);
},
},
];
}