mirror of
https://github.com/movie-web/native-app.git
synced 2025-09-13 08:23:26 +00:00
171 lines
4.8 KiB
TypeScript
171 lines
4.8 KiB
TypeScript
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,
|
|
};
|
|
}
|