pstream is dead; long live pstream
taciturnaxolotl.github.io/pstream-ng/
1import { useCallback } from "react";
2
3import { LoginResponse, SessionResponse } from "@/backend/accounts/auth";
4import { SettingsResponse } from "@/backend/accounts/settings";
5import {
6 BookmarkResponse,
7 ProgressResponse,
8 UserResponse,
9 WatchHistoryResponse,
10 bookmarkResponsesToEntries,
11 progressResponsesToEntries,
12 watchHistoryResponsesToEntries,
13} from "@/backend/accounts/user";
14import { useAuthStore } from "@/stores/auth";
15import { useBookmarkStore } from "@/stores/bookmarks";
16import { useGroupOrderStore } from "@/stores/groupOrder";
17import { useLanguageStore } from "@/stores/language";
18import { usePreferencesStore } from "@/stores/preferences";
19import { useProgressStore } from "@/stores/progress";
20import { useSubtitleStore } from "@/stores/subtitles";
21import { useThemeStore } from "@/stores/theme";
22import { useWatchHistoryStore } from "@/stores/watchHistory";
23
24export function useAuthData() {
25 const loggedIn = !!useAuthStore((s) => s.account);
26 const setAccount = useAuthStore((s) => s.setAccount);
27 const removeAccount = useAuthStore((s) => s.removeAccount);
28 const setProxySet = useAuthStore((s) => s.setProxySet);
29 const clearBookmarks = useBookmarkStore((s) => s.clear);
30 const clearProgress = useProgressStore((s) => s.clear);
31 const clearWatchHistory = useWatchHistoryStore((s) => s.clear);
32 const clearGroupOrder = useGroupOrderStore((s) => s.clear);
33 const setTheme = useThemeStore((s) => s.setTheme);
34 const setAppLanguage = useLanguageStore((s) => s.setLanguage);
35 const importSubtitleLanguage = useSubtitleStore(
36 (s) => s.importSubtitleLanguage,
37 );
38 const setFebboxKey = usePreferencesStore((s) => s.setFebboxKey);
39 const setdebridToken = usePreferencesStore((s) => s.setdebridToken);
40 const setdebridService = usePreferencesStore((s) => s.setdebridService);
41
42 const replaceBookmarks = useBookmarkStore((s) => s.replaceBookmarks);
43 const replaceItems = useProgressStore((s) => s.replaceItems);
44 const replaceWatchHistory = useWatchHistoryStore((s) => s.replaceItems);
45
46 const setEnableThumbnails = usePreferencesStore((s) => s.setEnableThumbnails);
47 const setEnableAutoplay = usePreferencesStore((s) => s.setEnableAutoplay);
48 const setEnableSkipCredits = usePreferencesStore(
49 (s) => s.setEnableSkipCredits,
50 );
51 const setEnableDiscover = usePreferencesStore((s) => s.setEnableDiscover);
52 const setEnableFeatured = usePreferencesStore((s) => s.setEnableFeatured);
53 const setEnableDetailsModal = usePreferencesStore(
54 (s) => s.setEnableDetailsModal,
55 );
56 const setEnableImageLogos = usePreferencesStore((s) => s.setEnableImageLogos);
57 const setEnableCarouselView = usePreferencesStore(
58 (s) => s.setEnableCarouselView,
59 );
60 const setForceCompactEpisodeView = usePreferencesStore(
61 (s) => s.setForceCompactEpisodeView,
62 );
63 const setSourceOrder = usePreferencesStore((s) => s.setSourceOrder);
64 const setEnableSourceOrder = usePreferencesStore(
65 (s) => s.setEnableSourceOrder,
66 );
67 const setLastSuccessfulSource = usePreferencesStore(
68 (s) => s.setLastSuccessfulSource,
69 );
70 const setEnableLastSuccessfulSource = usePreferencesStore(
71 (s) => s.setEnableLastSuccessfulSource,
72 );
73 const setEmbedOrder = usePreferencesStore((s) => s.setEmbedOrder);
74 const setEnableEmbedOrder = usePreferencesStore((s) => s.setEnableEmbedOrder);
75
76 const setProxyTmdb = usePreferencesStore((s) => s.setProxyTmdb);
77
78 const setEnableLowPerformanceMode = usePreferencesStore(
79 (s) => s.setEnableLowPerformanceMode,
80 );
81 const setEnableNativeSubtitles = usePreferencesStore(
82 (s) => s.setEnableNativeSubtitles,
83 );
84 const setEnableHoldToBoost = usePreferencesStore(
85 (s) => s.setEnableHoldToBoost,
86 );
87 const setHomeSectionOrder = usePreferencesStore((s) => s.setHomeSectionOrder);
88 const setEnableDoubleClickToSeek = usePreferencesStore(
89 (s) => s.setEnableDoubleClickToSeek,
90 );
91 const setManualSourceSelection = usePreferencesStore(
92 (s) => s.setManualSourceSelection,
93 );
94 const setEnableAutoResumeOnPlaybackError = usePreferencesStore(
95 (s) => s.setEnableAutoResumeOnPlaybackError,
96 );
97 const setEnableNumberKeySeeking = usePreferencesStore(
98 (s) => s.setEnableNumberKeySeeking,
99 );
100 const setKeyboardShortcuts = usePreferencesStore(
101 (s) => s.setKeyboardShortcuts,
102 );
103 const setEnableMinimalCards = usePreferencesStore(
104 (s) => s.setEnableMinimalCards,
105 );
106
107 const login = useCallback(
108 async (
109 loginResponse: LoginResponse,
110 user: UserResponse,
111 session: SessionResponse,
112 seed: string,
113 ) => {
114 const account = {
115 token: loginResponse.token,
116 userId: user.id,
117 sessionId: loginResponse.session.id,
118 deviceName: session.device,
119 profile: user.profile,
120 nickname: user.nickname,
121 seed,
122 };
123 setAccount(account);
124 return account;
125 },
126 [setAccount],
127 );
128
129 const logout = useCallback(async () => {
130 removeAccount();
131 clearBookmarks();
132 clearProgress();
133 clearWatchHistory();
134 clearGroupOrder();
135 setFebboxKey(null);
136 }, [
137 removeAccount,
138 clearBookmarks,
139 clearProgress,
140 clearWatchHistory,
141 clearGroupOrder,
142 setFebboxKey,
143 ]);
144
145 const syncData = useCallback(
146 async (
147 _user: UserResponse,
148 _session: SessionResponse,
149 progress: ProgressResponse[],
150 bookmarks: BookmarkResponse[],
151 watchHistory: WatchHistoryResponse[],
152 settings: SettingsResponse,
153 groupOrder: { groupOrder: string[] },
154 ) => {
155 replaceBookmarks(bookmarkResponsesToEntries(bookmarks));
156 replaceItems(progressResponsesToEntries(progress));
157 replaceWatchHistory(watchHistoryResponsesToEntries(watchHistory));
158
159 if (groupOrder?.groupOrder) {
160 useGroupOrderStore.getState().setGroupOrder(groupOrder.groupOrder);
161 }
162
163 if (settings.applicationLanguage) {
164 setAppLanguage(settings.applicationLanguage);
165 }
166
167 if (settings.defaultSubtitleLanguage) {
168 importSubtitleLanguage(settings.defaultSubtitleLanguage);
169 }
170
171 if (settings.applicationTheme) {
172 setTheme(settings.applicationTheme);
173 }
174
175 if (settings.proxyUrls) {
176 setProxySet(settings.proxyUrls);
177 }
178
179 if (settings.enableThumbnails !== undefined) {
180 setEnableThumbnails(settings.enableThumbnails);
181 }
182
183 if (settings.enableAutoplay !== undefined) {
184 setEnableAutoplay(settings.enableAutoplay);
185 }
186
187 if (settings.enableSkipCredits !== undefined) {
188 setEnableSkipCredits(settings.enableSkipCredits);
189 }
190
191 if (settings.enableDiscover !== undefined) {
192 setEnableDiscover(settings.enableDiscover);
193 }
194
195 if (settings.enableFeatured !== undefined) {
196 setEnableFeatured(settings.enableFeatured);
197 }
198
199 if (settings.enableDetailsModal !== undefined) {
200 setEnableDetailsModal(settings.enableDetailsModal);
201 }
202
203 if (settings.enableImageLogos !== undefined) {
204 setEnableImageLogos(settings.enableImageLogos);
205 }
206
207 if (settings.enableCarouselView !== undefined) {
208 setEnableCarouselView(settings.enableCarouselView);
209 }
210
211 if (settings.forceCompactEpisodeView !== undefined) {
212 setForceCompactEpisodeView(settings.forceCompactEpisodeView);
213 }
214
215 if (settings.sourceOrder !== undefined) {
216 setSourceOrder(settings.sourceOrder ?? []);
217 }
218
219 if (settings.enableSourceOrder !== undefined) {
220 setEnableSourceOrder(settings.enableSourceOrder);
221 }
222
223 if (settings.lastSuccessfulSource !== undefined) {
224 setLastSuccessfulSource(settings.lastSuccessfulSource);
225 }
226
227 if (settings.enableLastSuccessfulSource !== undefined) {
228 setEnableLastSuccessfulSource(settings.enableLastSuccessfulSource);
229 }
230
231 if (settings.embedOrder !== undefined) {
232 setEmbedOrder(settings.embedOrder ?? []);
233 }
234
235 if (settings.enableEmbedOrder !== undefined) {
236 setEnableEmbedOrder(settings.enableEmbedOrder);
237 }
238
239 if (settings.proxyTmdb !== undefined) {
240 setProxyTmdb(settings.proxyTmdb);
241 }
242
243 if (settings.febboxKey !== undefined) {
244 setFebboxKey(settings.febboxKey);
245 }
246
247 if (settings.debridToken !== undefined) {
248 setdebridToken(settings.debridToken);
249 }
250
251 if (settings.debridService !== undefined) {
252 setdebridService(settings.debridService);
253 }
254
255 if (settings.enableLowPerformanceMode !== undefined) {
256 setEnableLowPerformanceMode(settings.enableLowPerformanceMode);
257 }
258
259 if (settings.enableNativeSubtitles !== undefined) {
260 setEnableNativeSubtitles(settings.enableNativeSubtitles);
261 }
262
263 if (settings.enableHoldToBoost !== undefined) {
264 setEnableHoldToBoost(settings.enableHoldToBoost);
265 }
266
267 if (settings.homeSectionOrder !== undefined) {
268 setHomeSectionOrder(
269 settings.homeSectionOrder ?? ["watching", "bookmarks"],
270 );
271 }
272
273 if (settings.manualSourceSelection !== undefined) {
274 setManualSourceSelection(settings.manualSourceSelection);
275 }
276
277 if (settings.enableDoubleClickToSeek !== undefined) {
278 setEnableDoubleClickToSeek(settings.enableDoubleClickToSeek);
279 }
280
281 if (settings.enableAutoResumeOnPlaybackError !== undefined) {
282 setEnableAutoResumeOnPlaybackError(
283 settings.enableAutoResumeOnPlaybackError,
284 );
285 }
286
287 if (settings.enableNumberKeySeeking !== undefined) {
288 setEnableNumberKeySeeking(settings.enableNumberKeySeeking);
289 }
290
291 if (settings.keyboardShortcuts !== undefined) {
292 setKeyboardShortcuts(settings.keyboardShortcuts);
293 }
294
295 if (settings.enableMinimalCards !== undefined) {
296 setEnableMinimalCards(settings.enableMinimalCards);
297 }
298 },
299 [
300 replaceBookmarks,
301 replaceItems,
302 replaceWatchHistory,
303 setAppLanguage,
304 importSubtitleLanguage,
305 setTheme,
306 setProxySet,
307 setEnableThumbnails,
308 setEnableAutoplay,
309 setEnableSkipCredits,
310 setEnableDiscover,
311 setEnableFeatured,
312 setEnableDetailsModal,
313 setEnableImageLogos,
314 setEnableCarouselView,
315 setForceCompactEpisodeView,
316 setSourceOrder,
317 setEnableSourceOrder,
318 setLastSuccessfulSource,
319 setEnableLastSuccessfulSource,
320 setEmbedOrder,
321 setEnableEmbedOrder,
322 setProxyTmdb,
323 setFebboxKey,
324 setdebridToken,
325 setdebridService,
326 setEnableLowPerformanceMode,
327 setEnableNativeSubtitles,
328 setEnableHoldToBoost,
329 setHomeSectionOrder,
330 setManualSourceSelection,
331 setEnableDoubleClickToSeek,
332 setEnableAutoResumeOnPlaybackError,
333 setEnableNumberKeySeeking,
334 setKeyboardShortcuts,
335 setEnableMinimalCards,
336 ],
337 );
338
339 return {
340 loggedIn,
341 login,
342 logout,
343 syncData,
344 };
345}