Skip to content

Commit d7d13b2

Browse files
general settings
1 parent 979e84e commit d7d13b2

File tree

6 files changed

+137
-99
lines changed

6 files changed

+137
-99
lines changed

packages/web/src/app/(app)/@sidebar/components/settingsSidebar/nav.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
type LucideIcon,
1717
PlugIcon,
1818
ScrollTextIcon,
19+
Settings2Icon,
1920
ShieldIcon,
2021
UserIcon,
2122
UsersIcon,
@@ -31,6 +32,7 @@ const iconMap = {
3132
"plug": PlugIcon,
3233
"chart-area": ChartAreaIcon,
3334
"scroll-text": ScrollTextIcon,
35+
"settings": Settings2Icon,
3436
"user": UserIcon,
3537
} satisfies Record<string, LucideIcon>;
3638

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
'use client';
2+
3+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
4+
import { UserAvatar } from "@/components/userAvatar";
5+
import { HomeView, useHomeView } from "@/hooks/useHomeView";
6+
import { useKeymapType } from "@/hooks/useKeymapType";
7+
import { KeymapType } from "@/lib/types";
8+
import { useTheme } from "next-themes";
9+
import { useMemo } from "react";
10+
import { BasicSettingsCard, SettingsCard, SettingsCardGroup } from "../components/settingsCard";
11+
12+
const themeOptions = [
13+
{ value: "light", label: "Light" },
14+
{ value: "dark", label: "Dark" },
15+
{ value: "system", label: "System" },
16+
] as const;
17+
18+
const homeViewOptions = [
19+
{ value: "search", label: "Code Search" },
20+
{ value: "ask", label: "Ask" },
21+
] as const;
22+
23+
const keymapOptions = [
24+
{ value: "default", label: "Standard" },
25+
{ value: "vim", label: "Vim" },
26+
] as const;
27+
28+
interface GeneralPageProps {
29+
userName?: string;
30+
userEmail?: string;
31+
userImage?: string;
32+
}
33+
34+
export function GeneralPage({ userName, userEmail, userImage }: GeneralPageProps) {
35+
const { theme: _theme, setTheme } = useTheme();
36+
const [homeView, setHomeView] = useHomeView();
37+
const [keymapType, setKeymapType] = useKeymapType();
38+
39+
const theme = useMemo(() => {
40+
return _theme ?? "light";
41+
}, [_theme]);
42+
43+
return (
44+
<div className="flex flex-col gap-6">
45+
<div>
46+
<h3 className="text-lg font-medium">General</h3>
47+
<p className="text-sm text-muted-foreground">
48+
Manage your profile and preferences.
49+
</p>
50+
</div>
51+
52+
<div className="flex flex-col gap-2">
53+
<h4 className="text-sm font-medium text-muted-foreground">Profile</h4>
54+
<SettingsCard>
55+
<div className="flex items-center gap-4">
56+
<UserAvatar
57+
email={userEmail}
58+
imageUrl={userImage}
59+
className="h-12 w-12"
60+
/>
61+
<div className="flex flex-col">
62+
<span className="font-medium">{userName ?? "User"}</span>
63+
{userEmail && (
64+
<span className="text-sm text-muted-foreground">{userEmail}</span>
65+
)}
66+
</div>
67+
</div>
68+
</SettingsCard>
69+
</div>
70+
71+
<div className="flex flex-col gap-2">
72+
<h4 className="text-sm font-medium text-muted-foreground">Preferences</h4>
73+
<SettingsCardGroup>
74+
<BasicSettingsCard name="Default home view" description="Choose which page to show when you open Sourcebot.">
75+
<Select value={homeView} onValueChange={(value) => setHomeView(value as HomeView)}>
76+
<SelectTrigger className="w-36">
77+
<SelectValue />
78+
</SelectTrigger>
79+
<SelectContent>
80+
{homeViewOptions.map((option) => (
81+
<SelectItem key={option.value} value={option.value}>
82+
{option.label}
83+
</SelectItem>
84+
))}
85+
</SelectContent>
86+
</Select>
87+
</BasicSettingsCard>
88+
<BasicSettingsCard name="Appearance" description="Choose how Sourcebot looks to you.">
89+
<Select value={theme} onValueChange={setTheme}>
90+
<SelectTrigger className="w-36">
91+
<SelectValue />
92+
</SelectTrigger>
93+
<SelectContent>
94+
{themeOptions.map((option) => (
95+
<SelectItem key={option.value} value={option.value}>
96+
{option.label}
97+
</SelectItem>
98+
))}
99+
</SelectContent>
100+
</Select>
101+
</BasicSettingsCard>
102+
<BasicSettingsCard name="Editor keymap" description="Choose the keyboard shortcuts used in the code viewer.">
103+
<Select value={keymapType} onValueChange={(value) => setKeymapType(value as KeymapType)}>
104+
<SelectTrigger className="w-36">
105+
<SelectValue />
106+
</SelectTrigger>
107+
<SelectContent>
108+
{keymapOptions.map((option) => (
109+
<SelectItem key={option.value} value={option.value}>
110+
{option.label}
111+
</SelectItem>
112+
))}
113+
</SelectContent>
114+
</Select>
115+
</BasicSettingsCard>
116+
</SettingsCardGroup>
117+
</div>
118+
</div>
119+
);
120+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { authenticatedPage } from "@/middleware/authenticatedPage";
2+
import { GeneralPage } from "./generalPage";
3+
4+
export default authenticatedPage(async ({ user }) => {
5+
return (
6+
<GeneralPage
7+
userName={user.name ?? undefined}
8+
userEmail={user.email ?? undefined}
9+
userImage={user.image ?? undefined}
10+
/>
11+
);
12+
});

packages/web/src/app/(app)/settings/layout.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ export const getSidebarNavGroups = async () =>
6262
label: "Account",
6363
items: [
6464
{
65-
title: "Profile",
66-
href: `/settings/profile`,
67-
icon: "user" as const,
65+
title: "General",
66+
href: `/settings/general`,
67+
icon: "settings" as const,
6868
},
6969
...(env.DISABLE_API_KEY_USAGE_FOR_NON_OWNER_USERS === 'false' || role === OrgRole.OWNER ? [
7070
{

packages/web/src/app/(app)/settings/profile/page.tsx

Lines changed: 0 additions & 6 deletions
This file was deleted.

packages/web/src/app/(app)/settings/profile/profilePage.tsx

Lines changed: 0 additions & 90 deletions
This file was deleted.

0 commit comments

Comments
 (0)