import React from 'react'; import { UserData } from '@aiostreams/core'; import { QUALITIES, RESOLUTIONS, SERVICE_DETAILS, } from '../../../core/src/utils/constants'; import { useStatus } from './status'; const DefaultUserData: UserData = { services: Object.values(SERVICE_DETAILS).map((service) => ({ id: service.id, enabled: false, credentials: {}, })), presets: [], formatter: { id: 'gdrive', }, preferredQualities: Object.values(QUALITIES), preferredResolutions: Object.values(RESOLUTIONS), excludedQualities: ['CAM', 'SCR', 'TS', 'TC'], excludedVisualTags: ['3D'], sortCriteria: { global: [ { key: 'cached', direction: 'desc', }, { key: 'library', direction: 'desc', }, { key: 'resolution', direction: 'desc', }, { key: 'size', direction: 'desc', }, ], }, deduplicator: { enabled: false, keys: ['filename', 'infoHash'], cached: 'single_result', uncached: 'per_service', p2p: 'single_result', }, }; interface UserDataContextType { userData: UserData; setUserData: (data: ((prev: UserData) => UserData | null) | null) => void; uuid: string | null; setUuid: (uuid: string | null) => void; password: string | null; setPassword: (password: string | null) => void; encryptedPassword: string | null; setEncryptedPassword: (encryptedPassword: string | null) => void; } const UserDataContext = React.createContext( undefined ); export function UserDataProvider({ children }: { children: React.ReactNode }) { const { status } = useStatus(); const [userData, setUserData] = React.useState(DefaultUserData); const [uuid, setUuid] = React.useState(null); const [password, setPassword] = React.useState(null); const [encryptedPassword, setEncryptedPassword] = React.useState< string | null >(null); // Effect to apply forced and default values from status React.useEffect(() => { if (!status) return; const forced = status.settings.forced; const defaults = status.settings.defaults; const services = status.settings.services; setUserData((prev) => { const newData = { ...prev }; newData.proxy = { ...newData.proxy, enabled: forced.proxy.enabled ?? defaults.proxy?.enabled ?? undefined, id: (forced.proxy.id ?? defaults.proxy?.id ?? 'mediaflow') as | 'mediaflow' | 'stremthru' | undefined, url: forced.proxy.url ?? defaults.proxy?.url ?? undefined, publicIp: forced.proxy.publicIp ?? defaults.proxy?.publicIp ?? undefined, credentials: forced.proxy.credentials ?? defaults.proxy?.credentials ?? undefined, proxiedServices: forced.proxy.proxiedServices ?? defaults.proxy?.proxiedServices ?? [], }; newData.services = (newData.services ?? []).map((service) => { const serviceMeta = services[service.id]; if (!serviceMeta) return service; serviceMeta.credentials.forEach((credential) => { if (credential.forced) { service.credentials[credential.id] = credential.forced; } else if (credential.default) { service.credentials[credential.id] = credential.default; } }); // enable if every credential is set service.enabled = serviceMeta.credentials.every( (credential) => credential.forced || credential.default || service.credentials[credential.id] !== undefined ); return service; }); return newData; }); }, [status]); const safeSetUserData = ( data: ((prev: UserData) => UserData | null) | null ) => { if (data === null) { setUserData((prev) => ({ ...prev, ...DefaultUserData, })); } else { setUserData((prev) => { const result = data(prev); return result === null ? DefaultUserData : result; }); } }; return ( {children} ); } export function useUserData() { const context = React.useContext(UserDataContext); if (context === undefined) { throw new Error('useUserData must be used within a UserDataProvider'); } return context; }