import sb from '../../sb'; 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; hide_awc_badges: boolean; pinned_badge_wall_categories: string[]; } interface NewUserPreferences { updated_at?: string; pinned_hololive_streams?: string[]; hide_missing_badges?: boolean; badge_wall_css?: string; biography?: string; hide_awc_badges?: boolean; pinned_badge_wall_categories?: string[]; } export const getUserPreferences = async (userId: number) => { const { data, error } = await sb.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 sb .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 : ''), hide_awc_badges: preferences.hide_awc_badges || false, pinned_badge_wall_categories: preferences.pinned_badge_wall_categories || (userPreferences ? userPreferences.pinned_badge_wall_categories : '') }, { 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 toggleHideAWCBadges = async (userId: number) => { const userPreferences = await getUserPreferences(userId); return await setUserPreferences(userId, { updated_at: new Date().toISOString(), hide_awc_badges: userPreferences ? !userPreferences.hide_awc_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' }); }; export const togglePinnedBadgeWallCategory = async (userId: number, category: string) => { const userPreferences = await getUserPreferences(userId); if (!userPreferences) return null; const pinnedCategories = userPreferences.pinned_badge_wall_categories; const index = pinnedCategories.indexOf(category); if (index === -1) pinnedCategories.push(category); else pinnedCategories.splice(index, 1); return await setUserPreferences(userId, { updated_at: new Date().toISOString(), pinned_hololive_streams: userPreferences.pinned_hololive_streams, hide_missing_badges: userPreferences.hide_missing_badges, badge_wall_css: userPreferences.badge_wall_css, pinned_badge_wall_categories: pinnedCategories }); }; export const setPinnedBadgeWallCategories = async (userId: number, categories: string[]) => { const userPreferences = await getUserPreferences(userId); if (!userPreferences) return null; return await setUserPreferences(userId, { updated_at: new Date().toISOString(), pinned_hololive_streams: userPreferences.pinned_hololive_streams, hide_missing_badges: userPreferences.hide_missing_badges, badge_wall_css: userPreferences.badge_wall_css, pinned_badge_wall_categories: categories }); };