import supabase from './supabase'; export interface UserPreferences { created_at: string; updated_at: string; user_id: number; pinned_hololive_streams: string[]; hide_missing_badges: boolean; biography: string | null; badge_wall_css: string; } interface NewUserPreferences { updated_at?: string; pinned_hololive_streams?: string[]; hide_missing_badges?: boolean; badge_wall_css?: string; biography?: string; } export const getUserPreferences = async (userId: number) => { const { data, error } = await supabase.from('user_preferences').select('*').eq('user_id', userId); if (error || data.length === 0 || data[0].user_id !== userId) return null; return data[0] as UserPreferences; }; export const setUserPreferences = async (userId: number, preferences: NewUserPreferences) => { const userPreferences = await getUserPreferences(userId); const { data, error } = await supabase .from('user_preferences') .upsert( { user_id: userId, updated_at: preferences.updated_at || new Date().toISOString(), pinned_hololive_streams: preferences.pinned_hololive_streams || (userPreferences ? userPreferences.pinned_hololive_streams : []), hide_missing_badges: preferences.hide_missing_badges || false, biography: preferences.biography || (userPreferences ? userPreferences.biography : null), badge_wall_css: preferences.badge_wall_css || (userPreferences ? userPreferences.badge_wall_css : '') }, { onConflict: 'user_id' } ) .select(); if (error || !data || (data as []).length === 0) return null; return data[0] as UserPreferences; }; export const toggleHololiveStreamPinning = async (userId: number, streamId: string) => { const userPreferences = await getUserPreferences(userId); if (!userPreferences) return null; const pinnedStreams = userPreferences.pinned_hololive_streams; const index = pinnedStreams.indexOf(streamId); if (index === -1) pinnedStreams.push(streamId); else pinnedStreams.splice(index, 1); return await setUserPreferences(userId, { updated_at: new Date().toISOString(), pinned_hololive_streams: pinnedStreams, hide_missing_badges: userPreferences.hide_missing_badges }); }; export const toggleHideMissingBadges = async (userId: number) => { const userPreferences = await getUserPreferences(userId); return await setUserPreferences(userId, { updated_at: new Date().toISOString(), pinned_hololive_streams: userPreferences ? userPreferences.pinned_hololive_streams : [], hide_missing_badges: userPreferences ? !userPreferences.hide_missing_badges : false }); }; export const setCSS = async (userId: number, css: string) => { const userPreferences = await getUserPreferences(userId); return await setUserPreferences(userId, { updated_at: new Date().toISOString(), pinned_hololive_streams: userPreferences ? userPreferences.pinned_hololive_streams : [], hide_missing_badges: userPreferences ? userPreferences.hide_missing_badges : false, badge_wall_css: css || "/* Use classes and IDs such as .badges, #badges, .badge, or standard elements like body and details, or anything, as long as it's valid CSS! */" }); }; export const setBiography = async (userId: number, biography: string) => { const userPreferences = await getUserPreferences(userId); return await setUserPreferences(userId, { updated_at: new Date().toISOString(), pinned_hololive_streams: userPreferences ? userPreferences.pinned_hololive_streams : [], hide_missing_badges: userPreferences ? userPreferences.hide_missing_badges : false, badge_wall_css: userPreferences ? userPreferences.badge_wall_css : '', biography: biography || '\n' }); };