mirror of
https://github.com/KuekHaoYang/KVideo.git
synced 2026-08-16 09:13:42 +08:00
119 lines
4.0 KiB
TypeScript
119 lines
4.0 KiB
TypeScript
'use client';
|
|
|
|
import { useState, useEffect, useCallback } from 'react';
|
|
import { settingsStore, AdFilterMode } from '@/lib/store/settings-store';
|
|
|
|
/**
|
|
* Hook to access and update player settings from the settings store
|
|
* Provides reactive updates when settings change
|
|
*/
|
|
export function usePlayerSettings() {
|
|
const [settings, setSettings] = useState(() => {
|
|
const stored = settingsStore.getSettings();
|
|
return {
|
|
autoNextEpisode: stored.autoNextEpisode,
|
|
autoSkipIntro: stored.autoSkipIntro,
|
|
skipIntroSeconds: stored.skipIntroSeconds,
|
|
autoSkipOutro: stored.autoSkipOutro,
|
|
skipOutroSeconds: stored.skipOutroSeconds,
|
|
showModeIndicator: stored.showModeIndicator,
|
|
adFilter: stored.adFilter,
|
|
adFilterMode: stored.adFilterMode,
|
|
adKeywords: stored.adKeywords,
|
|
fullscreenType: stored.fullscreenType,
|
|
proxyMode: stored.proxyMode,
|
|
};
|
|
});
|
|
|
|
// Subscribe to settings changes
|
|
useEffect(() => {
|
|
const unsubscribe = settingsStore.subscribe(() => {
|
|
const stored = settingsStore.getSettings();
|
|
setSettings({
|
|
autoNextEpisode: stored.autoNextEpisode,
|
|
autoSkipIntro: stored.autoSkipIntro,
|
|
skipIntroSeconds: stored.skipIntroSeconds,
|
|
autoSkipOutro: stored.autoSkipOutro,
|
|
skipOutroSeconds: stored.skipOutroSeconds,
|
|
showModeIndicator: stored.showModeIndicator,
|
|
adFilter: stored.adFilter,
|
|
adFilterMode: stored.adFilterMode,
|
|
adKeywords: stored.adKeywords,
|
|
fullscreenType: stored.fullscreenType,
|
|
proxyMode: stored.proxyMode,
|
|
});
|
|
});
|
|
return unsubscribe;
|
|
}, []);
|
|
|
|
const updateSetting = useCallback(<K extends keyof typeof settings>(
|
|
key: K,
|
|
value: typeof settings[K]
|
|
) => {
|
|
const currentSettings = settingsStore.getSettings();
|
|
settingsStore.saveSettings({
|
|
...currentSettings,
|
|
[key]: value,
|
|
});
|
|
}, []);
|
|
|
|
const setAutoNextEpisode = useCallback((value: boolean) => {
|
|
updateSetting('autoNextEpisode', value);
|
|
}, [updateSetting]);
|
|
|
|
const setAutoSkipIntro = useCallback((value: boolean) => {
|
|
updateSetting('autoSkipIntro', value);
|
|
}, [updateSetting]);
|
|
|
|
const setSkipIntroSeconds = useCallback((value: number) => {
|
|
updateSetting('skipIntroSeconds', Math.max(0, value));
|
|
}, [updateSetting]);
|
|
|
|
const setAutoSkipOutro = useCallback((value: boolean) => {
|
|
updateSetting('autoSkipOutro', value);
|
|
}, [updateSetting]);
|
|
|
|
const setSkipOutroSeconds = useCallback((value: number) => {
|
|
updateSetting('skipOutroSeconds', Math.max(0, value));
|
|
}, [updateSetting]);
|
|
|
|
const setShowModeIndicator = useCallback((value: boolean) => {
|
|
updateSetting('showModeIndicator', value);
|
|
}, [updateSetting]);
|
|
|
|
const setAdFilter = useCallback((value: boolean) => {
|
|
updateSetting('adFilter', value);
|
|
}, [updateSetting]);
|
|
|
|
const setAdFilterMode = useCallback((value: AdFilterMode) => {
|
|
updateSetting('adFilterMode', value);
|
|
}, [updateSetting]);
|
|
|
|
const setAdKeywords = useCallback((value: string[]) => {
|
|
updateSetting('adKeywords', value);
|
|
}, [updateSetting]);
|
|
|
|
const setFullscreenType = useCallback((value: 'auto' | 'native' | 'window') => {
|
|
updateSetting('fullscreenType', value);
|
|
}, [updateSetting]);
|
|
|
|
const setProxyMode = useCallback((value: 'retry' | 'none' | 'always') => {
|
|
updateSetting('proxyMode', value);
|
|
}, [updateSetting]);
|
|
|
|
return {
|
|
...settings,
|
|
setAutoNextEpisode,
|
|
setAutoSkipIntro,
|
|
setSkipIntroSeconds,
|
|
setAutoSkipOutro,
|
|
setSkipOutroSeconds,
|
|
setShowModeIndicator,
|
|
setAdFilter,
|
|
setAdFilterMode,
|
|
setAdKeywords,
|
|
setFullscreenType,
|
|
setProxyMode,
|
|
};
|
|
}
|