mirror of
https://github.com/movie-web/native-app.git
synced 2025-09-13 16:33:26 +00:00
feat: api hooks n stuff
This commit is contained in:
170
apps/expo/src/hooks/useAuthData.ts
Normal file
170
apps/expo/src/hooks/useAuthData.ts
Normal 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,
|
||||
};
|
||||
}
|
Reference in New Issue
Block a user