feat: api hooks n stuff

This commit is contained in:
Adrian Castro
2024-04-19 19:19:59 +02:00
parent 3fb2567ae1
commit eea4eab60b
7 changed files with 427 additions and 2 deletions

View File

@@ -0,0 +1,170 @@
import { useCallback } from "react";
import type {
BookmarkResponse,
LoginResponse,
ProgressResponse,
SessionResponse,
SettingsResponse,
UserResponse,
} from "@movie-web/api";
import type { ScrapeMedia } from "@movie-web/provider-utils";
import type { ItemData } from "~/components/item/item";
import type { WatchHistoryItem } from "~/stores/settings";
import type { ThemeStoreOption } from "~/stores/theme";
import {
useAuthStore,
useBookmarkStore,
useWatchHistoryStore,
} from "~/stores/settings";
import { useThemeStore } from "~/stores/theme";
export function useAuthData() {
const loggedIn = !!useAuthStore((s) => s.account);
const setAccount = useAuthStore((s) => s.setAccount);
const removeAccount = useAuthStore((s) => s.removeAccount);
const setBookmarks = useBookmarkStore((s) => s.setBookmarks);
const setProxySet = useAuthStore((s) => s.setProxySet);
const setWatchHistory = useWatchHistoryStore((s) => s.setWatchHistory);
const clearBookmarks = useCallback(() => setBookmarks([]), [setBookmarks]);
const clearProgress = useCallback(
() => setWatchHistory([]),
[setWatchHistory],
);
const replaceBookmarks = useCallback(
(bookmarks: ItemData[]) => setBookmarks(bookmarks),
[setBookmarks],
);
const replaceItems = useCallback(
(items: WatchHistoryItem[]) => setWatchHistory(items),
[setWatchHistory],
);
const setTheme = useThemeStore((s) => s.setTheme);
// const setAppLanguage = useLanguageStore((s) => s.setLanguage);
// const importSubtitleLanguage = useSubtitleStore(
// (s) => s.importSubtitleLanguage,
// );
const login = useCallback(
(
loginResponse: LoginResponse,
user: UserResponse,
session: SessionResponse,
seed: string,
) => {
const account = {
token: loginResponse.token,
userId: user.id,
sessionId: loginResponse.session.id,
deviceName: session.device,
profile: user.profile,
seed,
};
setAccount(account);
return account;
},
[setAccount],
);
const logout = useCallback(() => {
removeAccount();
clearBookmarks();
clearProgress();
}, [removeAccount, clearBookmarks, clearProgress]);
const syncData = useCallback(
(
_user: UserResponse,
_session: SessionResponse,
progress: ProgressResponse[],
bookmarks: BookmarkResponse[],
settings: SettingsResponse,
) => {
const bookmarkResponseToItemData = (
bookmarks: BookmarkResponse[],
): ItemData[] => {
return bookmarks.map((bookmark) => ({
id: bookmark.tmdbId,
title: bookmark.meta.title,
type: bookmark.meta.type === "show" ? "tv" : "movie",
year: bookmark.meta.year,
posterUrl: bookmark.meta.poster ?? "",
}));
};
const progressResponseToWatchHistoryItem = (
progress: ProgressResponse[],
): WatchHistoryItem[] => {
return progress.map((entry) => {
const isShow = entry.meta.type === "show";
const commonMedia = {
title: entry.meta.title,
releaseYear: entry.meta.year,
tmdbId: entry.tmdbId,
};
const media: ScrapeMedia = isShow
? {
...commonMedia,
type: "show",
season: {
number: entry.season.number ?? 0,
tmdbId: entry.season.id ?? "",
},
episode: {
number: entry.episode.number ?? 0,
tmdbId: entry.episode.id ?? "",
},
}
: {
...commonMedia,
type: "movie",
};
return {
item: {
id: entry.tmdbId,
title: entry.meta.title,
type: entry.meta.type === "show" ? "tv" : "movie",
season: entry.season.number,
episode: entry.episode.number,
year: entry.meta.year,
posterUrl: entry.meta.poster ?? "",
},
media: media,
positionMillis: parseInt(entry.watched, 10),
};
});
};
replaceBookmarks(bookmarkResponseToItemData(bookmarks));
replaceItems(progressResponseToWatchHistoryItem(progress));
// if (settings.applicationLanguage) {
// setAppLanguage(settings.applicationLanguage);
// }
// if (settings.defaultSubtitleLanguage) {
// importSubtitleLanguage(settings.defaultSubtitleLanguage);
// }
if (settings.applicationTheme) {
setTheme(settings.applicationTheme as unknown as ThemeStoreOption);
}
if (settings.proxyUrls) {
setProxySet(settings.proxyUrls);
}
},
[replaceBookmarks, replaceItems, setTheme, setProxySet],
);
return {
loggedIn,
login,
logout,
syncData,
};
}