From 5779701b7d3f30649c7babc0df9b21a43d8b4db4 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Fri, 2 Aug 2024 19:35:57 +0530 Subject: [PATCH] feat(sidebar): respect preferences --- ui/components/Sidebar.tsx | 94 +++++++++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 19 deletions(-) diff --git a/ui/components/Sidebar.tsx b/ui/components/Sidebar.tsx index cc2097d..546e2fd 100644 --- a/ui/components/Sidebar.tsx +++ b/ui/components/Sidebar.tsx @@ -4,10 +4,16 @@ import { cn } from '@/lib/utils'; import { BookOpenText, Home, Search, SquarePen, Settings } from 'lucide-react'; import Link from 'next/link'; import { useSelectedLayoutSegments } from 'next/navigation'; -import React, { useState, type ReactNode } from 'react'; +import React, { useEffect, useMemo, useState, type ReactNode } from 'react'; import Layout from './Layout'; import SettingsDialog from './SettingsDialog'; +export type Preferences = { + isLibraryEnabled: boolean; + isDiscoverEnabled: boolean; + isCopilotEnabled: boolean; +}; + const VerticalIconContainer = ({ children }: { children: ReactNode }) => { return (
{children}
@@ -18,6 +24,31 @@ const Sidebar = ({ children }: { children: React.ReactNode }) => { const segments = useSelectedLayoutSegments(); const [isSettingsOpen, setIsSettingsOpen] = useState(false); + const [preferences, setPreferences] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchPreferences = async () => { + setLoading(true); + + const res = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}/config/preferences`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + + const data = await res.json(); + + setPreferences(data); + setLoading(false); + }; + + fetchPreferences(); + }, []); const navLinks = [ { @@ -25,22 +56,44 @@ const Sidebar = ({ children }: { children: React.ReactNode }) => { href: '/', active: segments.length === 0 || segments.includes('c'), label: 'Home', + show: true, }, { icon: Search, href: '/discover', active: segments.includes('discover'), label: 'Discover', + show: preferences?.isDiscoverEnabled, }, { icon: BookOpenText, href: '/library', active: segments.includes('library'), label: 'Library', + show: preferences?.isLibraryEnabled, }, ]; - return ( + return loading ? ( +
+ +
+ ) : (
@@ -48,23 +101,26 @@ const Sidebar = ({ children }: { children: React.ReactNode }) => { - {navLinks.map((link, i) => ( - - - {link.active && ( -
- )} - - ))} + {navLinks.map( + (link, i) => + link.show === true && ( + + + {link.active && ( +
+ )} + + ), + )}