goon/mobile/src/PreferencesContext.tsx
goon-foss 90a63b1e77
Some checks are pending
Backend tests / test (push) Waiting to run
feat: wylaczalny auto-rotate w playerze + '+N' liczy takze filmy
1) Auto-rotate (bug-report 55da1c3f: 'I can't turn off auto rotate. Which is a
problem when I put the phone on a flat surface'). Player robil bezwarunkowy
unlockAsync, wiec telefon lezacy plasko skakal miedzy orientacjami. Nowa
preferencja goon.player_auto_rotate (default true = dotychczasowe zachowanie),
przelacznik w Settings. Off = player zostaje w pionie, ale przycisk pelnego
ekranu dalej wchodzi w poziom recznie, wiec nic nie ginie.

2) '+N nowych' na ulubionym performerze/studiu liczylo TYLKO sceny (user-request
2026-07-28). Dochodzi _new_movie_counts: filmy z zywym playbackiem, created_at >
last_seen_at, po MoviePerformer / Movie.studio_id. Filmow jest o rzedy wielkosci
mniej niz scen (brak tube-spamu), wiec bez okna top-N i odsiewu stub/backfill -
te pojecia dotycza scen. Zweryfikowane: performer 1633 scen + 436 filmow = 2069,
studio 648 + 95 = 743, /favorites 200 OK.
2026-07-28 09:34:37 +02:00

80 lines
2 KiB
TypeScript

import React, { createContext, useContext, useEffect, useState } from 'react';
import {
DefaultQuality,
getAutoRotate,
getDefaultQuality,
getGridColumns,
setAutoRotate as persistAutoRotate,
setDefaultQuality as persistDefaultQuality,
setGridColumns as persistGridColumns,
} from './storage';
/**
* Globalne preferencje UI. Ładowane raz przy montażu z SecureStore (async) i dalej
* trzymane synchronicznie w state, żeby ekrany czytały wartość w renderze bez await.
*/
interface Prefs {
gridColumns: number;
setGridColumns: (n: number) => void;
defaultQuality: DefaultQuality;
setDefaultQuality: (q: DefaultQuality) => void;
autoRotate: boolean;
setAutoRotate: (on: boolean) => void;
}
const Ctx = createContext<Prefs | null>(null);
export function PreferencesProvider({ children }: { children: React.ReactNode }) {
const [gridColumns, setCols] = useState(2);
const [defaultQuality, setQuality] = useState<DefaultQuality>('auto');
const [autoRotate, setRotate] = useState(true);
useEffect(() => {
getGridColumns()
.then(setCols)
.catch(() => {});
getDefaultQuality()
.then(setQuality)
.catch(() => {});
getAutoRotate()
.then(setRotate)
.catch(() => {});
}, []);
const setGridColumns = (n: number) => {
setCols(n);
persistGridColumns(n).catch(() => {});
};
const setDefaultQuality = (q: DefaultQuality) => {
setQuality(q);
persistDefaultQuality(q).catch(() => {});
};
const setAutoRotate = (on: boolean) => {
setRotate(on);
persistAutoRotate(on).catch(() => {});
};
return (
<Ctx.Provider
value={{
gridColumns,
setGridColumns,
defaultQuality,
setDefaultQuality,
autoRotate,
setAutoRotate,
}}
>
{children}
</Ctx.Provider>
);
}
export function usePreferences(): Prefs {
const c = useContext(Ctx);
if (!c) throw new Error('usePreferences outside PreferencesProvider');
return c;
}