diff options
| author | Fuwn <[email protected]> | 2024-02-17 21:04:59 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-02-17 21:04:59 -0800 |
| commit | f1a09f3348cf4dbc7a0fb6116f9f41fcde372f4c (patch) | |
| tree | be69710d2dbf59badb9be88a1e6dce3c710d6525 /src/lib/Database/userPreferences.ts | |
| parent | feat(events): avatar for all events (diff) | |
| download | due.moe-f1a09f3348cf4dbc7a0fb6116f9f41fcde372f4c.tar.xz due.moe-f1a09f3348cf4dbc7a0fb6116f9f41fcde372f4c.zip | |
feat(hololive): move pinned to preferences
Diffstat (limited to 'src/lib/Database/userPreferences.ts')
| -rw-r--r-- | src/lib/Database/userPreferences.ts | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/lib/Database/userPreferences.ts b/src/lib/Database/userPreferences.ts new file mode 100644 index 00000000..f04a49e1 --- /dev/null +++ b/src/lib/Database/userPreferences.ts @@ -0,0 +1,63 @@ +import supabase from './supabase'; + +export interface UserPreferences { + created_at: string; + updated_at: string; + user_id: number; + pinned_hololive_streams: string[]; + hide_missing_badges: boolean; +} + +interface NewUserPreferences { + updated_at?: string; + pinned_hololive_streams?: string[]; + hide_missing_badges?: boolean; +} + +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 + }, + { onConflict: 'user_id' } + ) + .select(); + + if (error || !data || (data as []).length === 0) return null; + + return data[0].configuration 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 + }); +}; |