pstream is dead; long live pstream taciturnaxolotl.github.io/pstream-ng/
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #569 from movie-web/fix-some-bugs

Fix numerous bugs

authored by

William Oldham and committed by
GitHub
dd569860 66001a16

+34 -11
+1 -1
package.json
··· 1 1 { 2 2 "name": "movie-web", 3 - "version": "4.1.0", 3 + "version": "4.1.1", 4 4 "private": true, 5 5 "homepage": "https://movie-web.app", 6 6 "scripts": {
+1
src/assets/locales/en.json
··· 25 25 }, 26 26 "generate": { 27 27 "title": "Your passphrase", 28 + "passphraseFrameLabel": "Passphrase", 28 29 "next": "I have saved my passphrase", 29 30 "description": "Your passphrase acts as your username and password. Make sure to keep it safe as you will need to enter it to login to your account" 30 31 },
+11 -1
src/backend/helpers/report.ts
··· 9 9 // for anybody who cares - these are anonymous metrics. 10 10 // They are just used for figuring out if providers are broken or not 11 11 const metricsEndpoint = "https://backend.movie-web.app/metrics/providers"; 12 + const captchaMetricsEndpoint = "https://backend.movie-web.app/metrics/captcha"; 12 13 const batchId = () => nanoid(32); 13 14 14 15 export type ProviderMetric = { ··· 136 137 export function useReportProviders() { 137 138 const report = useCallback((items: ProviderMetric[]) => { 138 139 if (items.length === 0) return; 139 - reportProviders(items); 140 + reportProviders(items).catch(() => {}); 140 141 }, []); 141 142 142 143 return { report }; 143 144 } 145 + 146 + export function reportCaptchaSolve(success: boolean) { 147 + ofetch(captchaMetricsEndpoint, { 148 + method: "POST", 149 + body: { 150 + success, 151 + }, 152 + }).catch(() => {}); 153 + }
+3 -1
src/components/form/PassphraseDisplay.tsx
··· 25 25 return ( 26 26 <div className="rounded-lg border border-authentication-border/50 "> 27 27 <div className="px-4 py-2 flex justify-between border-b border-authentication-border/50"> 28 - <p className="font-bold text-sm text-white">Passphrase</p> 28 + <p className="font-bold text-sm text-white"> 29 + {t("auth.generate.passphraseFrameLabel")} 30 + </p> 29 31 <button 30 32 type="button" 31 33 className="text-authentication-copyText hover:text-authentication-copyTextHover transition-colors flex gap-2 items-center cursor-pointer"
+5 -3
src/hooks/auth/useAuthData.ts
··· 24 24 const clearProgress = useProgressStore((s) => s.clear); 25 25 const setTheme = useThemeStore((s) => s.setTheme); 26 26 const setAppLanguage = useLanguageStore((s) => s.setLanguage); 27 - const setCaptionLanguage = useSubtitleStore((s) => s.setLanguage); 27 + const importSubtitleLanguage = useSubtitleStore( 28 + (s) => s.importSubtitleLanguage 29 + ); 28 30 29 31 const replaceBookmarks = useBookmarkStore((s) => s.replaceBookmarks); 30 32 const replaceItems = useProgressStore((s) => s.replaceItems); ··· 72 74 } 73 75 74 76 if (settings.defaultSubtitleLanguage) { 75 - setCaptionLanguage(settings.defaultSubtitleLanguage); 77 + importSubtitleLanguage(settings.defaultSubtitleLanguage); 76 78 } 77 79 78 80 if (settings.applicationTheme) { ··· 83 85 replaceBookmarks, 84 86 replaceItems, 85 87 setAppLanguage, 86 - setCaptionLanguage, 88 + importSubtitleLanguage, 87 89 setTheme, 88 90 ] 89 91 );
+1 -1
src/hooks/useSettingsState.ts
··· 24 24 const setter = useCallback<Dispatch<SetStateAction<T>>>( 25 25 (inp) => { 26 26 if (!(inp instanceof Function)) setOverwrite(inp); 27 - else setOverwrite((s) => inp(s ?? initial)); 27 + else setOverwrite((s) => inp(s !== undefined ? s : initial)); 28 28 }, 29 29 [initial, setOverwrite] 30 30 );
+1 -1
src/pages/Settings.tsx
··· 196 196 <SettingsLayout> 197 197 <div id="settings-account"> 198 198 <Heading1 border className="!mb-0"> 199 - Account 199 + {t("settings.account.title")} 200 200 </Heading1> 201 201 {user.account && state.profile.state ? ( 202 202 <AccountSettings
+1 -1
src/pages/parts/settings/SidebarPart.tsx
··· 122 122 boundaryElement=".sidebar-boundary" 123 123 > 124 124 <div className="hidden lg:block"> 125 - <SidebarSection title="Settings"> 125 + <SidebarSection title={t("global.pages.settings")}> 126 126 {settingLinks.map((v) => ( 127 127 <SidebarLink 128 128 icon={v.icon}
+10 -2
src/stores/turnstile/index.tsx
··· 2 2 import { create } from "zustand"; 3 3 import { immer } from "zustand/middleware/immer"; 4 4 5 + import { reportCaptchaSolve } from "@/backend/helpers/report"; 5 6 import { conf } from "@/setup/config"; 6 7 7 8 export interface TurnstileStore { ··· 52 53 return !!getTurnstile(); 53 54 } 54 55 55 - export function getTurnstileToken() { 56 + export async function getTurnstileToken() { 56 57 const turnstile = getTurnstile(); 57 58 turnstile?.reset(); 58 59 turnstile?.execute(); 59 - return useTurnstileStore.getState().getToken(); 60 + try { 61 + const token = await useTurnstileStore.getState().getToken(); 62 + reportCaptchaSolve(true); 63 + return token; 64 + } catch (err) { 65 + reportCaptchaSolve(false); 66 + throw err; 67 + } 60 68 } 61 69 62 70 export function TurnstileProvider() {