diff --git a/src/webapp/components/navigation/navbar/Navbar.tsx b/src/webapp/components/navigation/navbar/Navbar.tsx
index 3beb45e5..2a55da1b 100644
--- a/src/webapp/components/navigation/navbar/Navbar.tsx
+++ b/src/webapp/components/navigation/navbar/Navbar.tsx
@@ -16,6 +16,7 @@ import {
import { LuLibrary } from 'react-icons/lu';
import { MdOutlineEmojiNature } from 'react-icons/md';
import { FaRegNoteSticky } from 'react-icons/fa6';
+import { TbSettings } from 'react-icons/tb';
import Link from 'next/link';
import SembleLogo from '@/assets/semble-logo.svg';
import ProfileMenu from '@/features/profile/components/profileMenu/ProfileMenu';
@@ -62,6 +63,11 @@ export default function Navbar() {
label="Cards"
icon={}
/>
+ }
+ />
--
2.51.2
From 694e882c215262aa4b4d23393d050b7065052359 Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 14:36:38 -0800
Subject: [PATCH 02/14] feat: settings route and layout
---
.../app/(dashboard)/settings/layout.tsx | 24 +++++++++++++++++++
src/webapp/app/(dashboard)/settings/page.tsx | 9 +++++++
2 files changed, 33 insertions(+)
create mode 100644 src/webapp/app/(dashboard)/settings/layout.tsx
create mode 100644 src/webapp/app/(dashboard)/settings/page.tsx
diff --git a/src/webapp/app/(dashboard)/settings/layout.tsx b/src/webapp/app/(dashboard)/settings/layout.tsx
new file mode 100644
index 00000000..aff26ced
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/layout.tsx
@@ -0,0 +1,24 @@
+import BackButton from '@/components/navigation/backButton/BackButton';
+import Header from '@/components/navigation/header/Header';
+import type { Metadata } from 'next';
+import { Fragment } from 'react';
+
+export const metadata: Metadata = {
+ title: 'Settings',
+ description: 'Settings',
+};
+
+interface Props {
+ children: React.ReactNode;
+}
+
+export default function Layout(props: Props) {
+ return (
+
+
+ {props.children}
+
+ );
+}
diff --git a/src/webapp/app/(dashboard)/settings/page.tsx b/src/webapp/app/(dashboard)/settings/page.tsx
new file mode 100644
index 00000000..cef1cba0
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/page.tsx
@@ -0,0 +1,9 @@
+import { verifySessionOnServer } from '@/lib/auth/dal.server';
+import { redirect } from 'next/navigation';
+
+export default async function Page() {
+ const session = await verifySessionOnServer();
+ if (!session) redirect('/login');
+
+ return <>>;
+}
--
2.51.2
From 6edbc60a43c4c0f84b13b00d3a5067c699724b44 Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 14:36:50 -0800
Subject: [PATCH 03/14] feat: account summary
---
.../accountSummary/AccountSummary.tsx | 53 +++++++++++++++++++
1 file changed, 53 insertions(+)
create mode 100644 src/webapp/features/settings/components/accountSummary/AccountSummary.tsx
diff --git a/src/webapp/features/settings/components/accountSummary/AccountSummary.tsx b/src/webapp/features/settings/components/accountSummary/AccountSummary.tsx
new file mode 100644
index 00000000..5e3aa420
--- /dev/null
+++ b/src/webapp/features/settings/components/accountSummary/AccountSummary.tsx
@@ -0,0 +1,53 @@
+'use client';
+
+import useMyProfile from '@/features/profile/lib/queries/useMyProfile';
+import { useAuth } from '@/hooks/useAuth';
+import { Avatar, Button, Card, Group, Stack, Text } from '@mantine/core';
+import { useRouter } from 'next/navigation';
+import { IoMdLogOut } from 'react-icons/io';
+
+export default function AccountSummary() {
+ const { data: profile } = useMyProfile();
+ const { logout } = useAuth();
+ const router = useRouter();
+
+ const handleLogout = async () => {
+ try {
+ await logout();
+ router.push('/');
+ } catch (error) {
+ console.error('Error logging out:', error);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ {profile.name}
+
+
+ {profile.handle}
+
+
+
+
+ }
+ variant="light"
+ color="red"
+ onClick={handleLogout}
+ >
+ Log out
+
+
+
+ );
+}
--
2.51.2
From db9376e538c30c321c0e01141f26e96ffb701f80 Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 15:19:01 -0800
Subject: [PATCH 04/14] feat: account summary
---
.../accountSummary/AccountSummary.tsx | 25 +------------------
1 file changed, 1 insertion(+), 24 deletions(-)
diff --git a/src/webapp/features/settings/components/accountSummary/AccountSummary.tsx b/src/webapp/features/settings/components/accountSummary/AccountSummary.tsx
index 5e3aa420..a0ad846f 100644
--- a/src/webapp/features/settings/components/accountSummary/AccountSummary.tsx
+++ b/src/webapp/features/settings/components/accountSummary/AccountSummary.tsx
@@ -1,24 +1,10 @@
'use client';
import useMyProfile from '@/features/profile/lib/queries/useMyProfile';
-import { useAuth } from '@/hooks/useAuth';
-import { Avatar, Button, Card, Group, Stack, Text } from '@mantine/core';
-import { useRouter } from 'next/navigation';
-import { IoMdLogOut } from 'react-icons/io';
+import { Avatar, Card, Group, Stack, Text } from '@mantine/core';
export default function AccountSummary() {
const { data: profile } = useMyProfile();
- const { logout } = useAuth();
- const router = useRouter();
-
- const handleLogout = async () => {
- try {
- await logout();
- router.push('/');
- } catch (error) {
- console.error('Error logging out:', error);
- }
- };
return (
@@ -38,15 +24,6 @@ export default function AccountSummary() {
-
- }
- variant="light"
- color="red"
- onClick={handleLogout}
- >
- Log out
-
);
--
2.51.2
From 8e3e1a2da931fa52a554d70ddc18ef175267b583 Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 15:47:06 -0800
Subject: [PATCH 05/14] feat: appearance container
---
.../AppearanceContainer.tsx | 29 +++++++++++++++++++
1 file changed, 29 insertions(+)
create mode 100644 src/webapp/features/settings/containers/appearanceContainer/AppearanceContainer.tsx
diff --git a/src/webapp/features/settings/containers/appearanceContainer/AppearanceContainer.tsx b/src/webapp/features/settings/containers/appearanceContainer/AppearanceContainer.tsx
new file mode 100644
index 00000000..d41843ab
--- /dev/null
+++ b/src/webapp/features/settings/containers/appearanceContainer/AppearanceContainer.tsx
@@ -0,0 +1,29 @@
+'use client';
+
+import { Container, Stack, Title, SegmentedControl } from '@mantine/core';
+import { useMantineColorScheme } from '@mantine/core';
+
+export default function AppearanceContainer() {
+ const { colorScheme, setColorScheme } = useMantineColorScheme();
+
+ return (
+
+
+ Appearance
+
+
+ setColorScheme(value as 'light' | 'dark' | 'auto')
+ }
+ data={[
+ { label: 'Light', value: 'light' },
+ { label: 'Dark', value: 'dark' },
+ { label: 'Auto', value: 'auto' },
+ ]}
+ />
+
+
+ );
+}
--
2.51.2
From 4338bc8bbbc086d1774a3f7fe278d00153d198cc Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 15:47:15 -0800
Subject: [PATCH 06/14] feat: setting item
---
.../components/settingItem/SettingItem.tsx | 32 +++++++++++++++++++
1 file changed, 32 insertions(+)
create mode 100644 src/webapp/features/settings/components/settingItem/SettingItem.tsx
diff --git a/src/webapp/features/settings/components/settingItem/SettingItem.tsx b/src/webapp/features/settings/components/settingItem/SettingItem.tsx
new file mode 100644
index 00000000..52404d71
--- /dev/null
+++ b/src/webapp/features/settings/components/settingItem/SettingItem.tsx
@@ -0,0 +1,32 @@
+import type { IconType } from 'react-icons/lib';
+import { Button } from '@mantine/core';
+import Link from 'next/link';
+import { isValidElement } from 'react';
+
+interface Props {
+ href: string;
+ icon: IconType | React.ReactElement;
+ children: React.ReactNode;
+}
+export default function SettingItem(props: Props) {
+ const renderIcon = () => {
+ if (isValidElement(props.icon)) return props.icon;
+
+ const IconComponent = props.icon as IconType;
+ return ;
+ };
+
+ return (
+
+ );
+}
--
2.51.2
From daed613ae327c4681e4e636df1a6a8df27f30862 Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 15:47:34 -0800
Subject: [PATCH 07/14] feat: basic settings page
---
.../settings/appearance/layout.tsx | 15 +++++++++
.../(dashboard)/settings/appearance/page.tsx | 5 +++
src/webapp/app/(dashboard)/settings/page.tsx | 3 +-
.../settingsContainer/SettingsContainer.tsx | 31 +++++++++++++++++++
4 files changed, 53 insertions(+), 1 deletion(-)
create mode 100644 src/webapp/app/(dashboard)/settings/appearance/layout.tsx
create mode 100644 src/webapp/app/(dashboard)/settings/appearance/page.tsx
create mode 100644 src/webapp/features/settings/containers/settingsContainer/SettingsContainer.tsx
diff --git a/src/webapp/app/(dashboard)/settings/appearance/layout.tsx b/src/webapp/app/(dashboard)/settings/appearance/layout.tsx
new file mode 100644
index 00000000..7f0ecec2
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/appearance/layout.tsx
@@ -0,0 +1,15 @@
+import type { Metadata } from 'next';
+import { Fragment } from 'react';
+
+export const metadata: Metadata = {
+ title: 'Appearance',
+ description: 'Appearance',
+};
+
+interface Props {
+ children: React.ReactNode;
+}
+
+export default function Layout(props: Props) {
+ return {props.children};
+}
diff --git a/src/webapp/app/(dashboard)/settings/appearance/page.tsx b/src/webapp/app/(dashboard)/settings/appearance/page.tsx
new file mode 100644
index 00000000..faee726d
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/appearance/page.tsx
@@ -0,0 +1,5 @@
+import AppearanceContainer from '@/features/settings/containers/appearanceContainer/AppearanceContainer';
+
+export default function Page() {
+ return ;
+}
diff --git a/src/webapp/app/(dashboard)/settings/page.tsx b/src/webapp/app/(dashboard)/settings/page.tsx
index cef1cba0..2bae3d67 100644
--- a/src/webapp/app/(dashboard)/settings/page.tsx
+++ b/src/webapp/app/(dashboard)/settings/page.tsx
@@ -1,3 +1,4 @@
+import SettingsContainer from '@/features/settings/containers/settingsContainer/SettingsContainer';
import { verifySessionOnServer } from '@/lib/auth/dal.server';
import { redirect } from 'next/navigation';
@@ -5,5 +6,5 @@ export default async function Page() {
const session = await verifySessionOnServer();
if (!session) redirect('/login');
- return <>>;
+ return ;
}
diff --git a/src/webapp/features/settings/containers/settingsContainer/SettingsContainer.tsx b/src/webapp/features/settings/containers/settingsContainer/SettingsContainer.tsx
new file mode 100644
index 00000000..3cee2fb7
--- /dev/null
+++ b/src/webapp/features/settings/containers/settingsContainer/SettingsContainer.tsx
@@ -0,0 +1,31 @@
+import { ButtonGroup, Container, Stack, Title } from '@mantine/core';
+import AccountSummary from '../../components/accountSummary/AccountSummary';
+import SettingItem from '../../components/settingItem/SettingItem';
+import {
+ IoMdColorPalette,
+ IoMdHelpCircle,
+ IoMdInformationCircle,
+} from 'react-icons/io';
+
+export default function SettingsContainer() {
+ return (
+
+
+ Settings
+
+
+
+
+ Appearance
+
+
+ Help
+
+
+ About
+
+
+
+
+ );
+}
--
2.51.2
From 3939525bc104fc0a9eea98a7482084bef6f482ef Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 15:48:29 -0800
Subject: [PATCH 08/14] feat: lighter colour on setting item
---
.../features/settings/components/settingItem/SettingItem.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/webapp/features/settings/components/settingItem/SettingItem.tsx b/src/webapp/features/settings/components/settingItem/SettingItem.tsx
index 52404d71..263a471d 100644
--- a/src/webapp/features/settings/components/settingItem/SettingItem.tsx
+++ b/src/webapp/features/settings/components/settingItem/SettingItem.tsx
@@ -24,6 +24,7 @@ export default function SettingItem(props: Props) {
size="md"
justify="start"
radius={'lg'}
+ c="gray"
leftSection={renderIcon()}
>
{props.children}
--
2.51.2
From 49b1ba38e96ba042673393c278e8c6895e242991 Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 15:53:50 -0800
Subject: [PATCH 09/14] rename "auto" theme to "system"
---
.../features/profile/components/profileMenu/ProfileMenu.tsx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/webapp/features/profile/components/profileMenu/ProfileMenu.tsx b/src/webapp/features/profile/components/profileMenu/ProfileMenu.tsx
index 9eb22e2f..33ba10a9 100644
--- a/src/webapp/features/profile/components/profileMenu/ProfileMenu.tsx
+++ b/src/webapp/features/profile/components/profileMenu/ProfileMenu.tsx
@@ -16,8 +16,8 @@ import {
MdBugReport,
MdDarkMode,
MdLightMode,
- MdAutoAwesome,
MdCollectionsBookmark,
+ MdOutlineSmartphone,
} from 'react-icons/md';
import { TbStackForward } from 'react-icons/tb';
import { useAuth } from '@/hooks/useAuth';
@@ -102,7 +102,7 @@ export default function ProfileMenu() {
color="gray"
leftSection={
colorScheme === 'auto' ? (
-
+
) : computedColorScheme === 'dark' ? (
) : (
@@ -112,7 +112,7 @@ export default function ProfileMenu() {
closeMenuOnClick={false}
onClick={handleThemeToggle}
>
- Theme: {colorScheme}
+ Theme: {colorScheme === 'auto' ? 'system' : colorScheme}
--
2.51.2
From fc695e845b6f136187fe813271f45385e81ff907 Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 15:54:02 -0800
Subject: [PATCH 10/14] feat: appearance control icon
---
.../AppearanceContainer.tsx | 39 +++++++++++++++++--
1 file changed, 35 insertions(+), 4 deletions(-)
diff --git a/src/webapp/features/settings/containers/appearanceContainer/AppearanceContainer.tsx b/src/webapp/features/settings/containers/appearanceContainer/AppearanceContainer.tsx
index d41843ab..c29fce4b 100644
--- a/src/webapp/features/settings/containers/appearanceContainer/AppearanceContainer.tsx
+++ b/src/webapp/features/settings/containers/appearanceContainer/AppearanceContainer.tsx
@@ -1,7 +1,14 @@
'use client';
-import { Container, Stack, Title, SegmentedControl } from '@mantine/core';
+import {
+ Container,
+ Stack,
+ Title,
+ SegmentedControl,
+ Center,
+} from '@mantine/core';
import { useMantineColorScheme } from '@mantine/core';
+import { MdDarkMode, MdLightMode, MdOutlineSmartphone } from 'react-icons/md';
export default function AppearanceContainer() {
const { colorScheme, setColorScheme } = useMantineColorScheme();
@@ -18,9 +25,33 @@ export default function AppearanceContainer() {
setColorScheme(value as 'light' | 'dark' | 'auto')
}
data={[
- { label: 'Light', value: 'light' },
- { label: 'Dark', value: 'dark' },
- { label: 'Auto', value: 'auto' },
+ {
+ label: (
+
+
+ Light
+
+ ),
+ value: 'light',
+ },
+ {
+ label: (
+
+
+ Dark
+
+ ),
+ value: 'dark',
+ },
+ {
+ label: (
+
+
+ System
+
+ ),
+ value: 'auto',
+ },
]}
/>
--
2.51.2
From a40de4fe89b33ba3ef2a7d791153ab87e7ae23ee Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 16:26:40 -0800
Subject: [PATCH 11/14] feat: about page
---
.../app/(dashboard)/settings/about/layout.tsx | 15 ++++++++++
.../app/(dashboard)/settings/about/page.tsx | 5 ++++
.../aboutContainer/AboutContainer.tsx | 29 +++++++++++++++++++
3 files changed, 49 insertions(+)
create mode 100644 src/webapp/app/(dashboard)/settings/about/layout.tsx
create mode 100644 src/webapp/app/(dashboard)/settings/about/page.tsx
create mode 100644 src/webapp/features/settings/containers/aboutContainer/AboutContainer.tsx
diff --git a/src/webapp/app/(dashboard)/settings/about/layout.tsx b/src/webapp/app/(dashboard)/settings/about/layout.tsx
new file mode 100644
index 00000000..32b1e417
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/about/layout.tsx
@@ -0,0 +1,15 @@
+import type { Metadata } from 'next';
+import { Fragment } from 'react';
+
+export const metadata: Metadata = {
+ title: 'About',
+ description: 'About',
+};
+
+interface Props {
+ children: React.ReactNode;
+}
+
+export default function Layout(props: Props) {
+ return {props.children};
+}
diff --git a/src/webapp/app/(dashboard)/settings/about/page.tsx b/src/webapp/app/(dashboard)/settings/about/page.tsx
new file mode 100644
index 00000000..a17bffec
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/about/page.tsx
@@ -0,0 +1,5 @@
+import AboutContainer from '@/features/settings/containers/aboutContainer/AboutContainer';
+
+export default function Page() {
+ return ;
+}
diff --git a/src/webapp/features/settings/containers/aboutContainer/AboutContainer.tsx b/src/webapp/features/settings/containers/aboutContainer/AboutContainer.tsx
new file mode 100644
index 00000000..65e8b433
--- /dev/null
+++ b/src/webapp/features/settings/containers/aboutContainer/AboutContainer.tsx
@@ -0,0 +1,29 @@
+import { ButtonGroup, Container, Stack, Title } from '@mantine/core';
+import SettingItem from '../../components/settingItem/SettingItem';
+import { MdSpeakerNotes } from 'react-icons/md';
+import { FaGithub } from 'react-icons/fa6';
+
+export default function AboutContainer() {
+ return (
+
+
+ About
+
+
+ Follow our blog for updates
+
+
+
+ View source code
+
+
+
+
+ );
+}
--
2.51.2
From 550fa290cb3aae32533559f0b967fcc1d2ef92f8 Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 16:26:46 -0800
Subject: [PATCH 12/14] feat: help page
---
.../app/(dashboard)/settings/help/layout.tsx | 15 +++++++++
.../app/(dashboard)/settings/help/page.tsx | 5 +++
.../helpContainer/HelpContainer.tsx | 31 +++++++++++++++++++
3 files changed, 51 insertions(+)
create mode 100644 src/webapp/app/(dashboard)/settings/help/layout.tsx
create mode 100644 src/webapp/app/(dashboard)/settings/help/page.tsx
create mode 100644 src/webapp/features/settings/containers/helpContainer/HelpContainer.tsx
diff --git a/src/webapp/app/(dashboard)/settings/help/layout.tsx b/src/webapp/app/(dashboard)/settings/help/layout.tsx
new file mode 100644
index 00000000..c7ca49a9
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/help/layout.tsx
@@ -0,0 +1,15 @@
+import type { Metadata } from 'next';
+import { Fragment } from 'react';
+
+export const metadata: Metadata = {
+ title: 'Help',
+ description: 'Help',
+};
+
+interface Props {
+ children: React.ReactNode;
+}
+
+export default function Layout(props: Props) {
+ return {props.children};
+}
diff --git a/src/webapp/app/(dashboard)/settings/help/page.tsx b/src/webapp/app/(dashboard)/settings/help/page.tsx
new file mode 100644
index 00000000..ca1a3279
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/help/page.tsx
@@ -0,0 +1,5 @@
+import HelpContainer from '@/features/settings/containers/helpContainer/HelpContainer';
+
+export default function Page() {
+ return ;
+}
diff --git a/src/webapp/features/settings/containers/helpContainer/HelpContainer.tsx b/src/webapp/features/settings/containers/helpContainer/HelpContainer.tsx
new file mode 100644
index 00000000..663b56d1
--- /dev/null
+++ b/src/webapp/features/settings/containers/helpContainer/HelpContainer.tsx
@@ -0,0 +1,31 @@
+import { Container, Stack, Title, ButtonGroup } from '@mantine/core';
+import { FaDiscord } from 'react-icons/fa6';
+import SettingItem from '../../components/settingItem/SettingItem';
+import { MdBugReport, MdMenuBook } from 'react-icons/md';
+
+export default function HelpContainer() {
+ return (
+
+
+ Help
+
+
+ Semble Docs
+
+
+ Submit an issue
+
+
+ Join our discord community
+
+
+
+
+ );
+}
--
2.51.2
From 8ac8f1555c36d90eb475c4b28e1a99589d4c9dac Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 17:17:04 -0800
Subject: [PATCH 13/14] feat: settings skeleton
---
.../(dashboard)/settings/about/loading.tsx | 5 ++
.../settings/appearance/loading.tsx | 5 ++
.../app/(dashboard)/settings/help/loading.tsx | 5 ++
.../app/(dashboard)/settings/loading.tsx | 5 ++
src/webapp/assets/cosmik-bg-banner-small.webp | Bin 0 -> 3500 bytes
.../accountSummary/AccountSummary.tsx | 38 ++++-----
.../Skeleton.AccountSummary.tsx | 13 +++
.../components/settingItem/SettingItem.tsx | 7 +-
.../settingItem/Skeleton.SettingItem.tsx | 17 ++++
.../settingLogoutItem/SettingLogoutItem.tsx | 35 +++++++++
.../aboutContainer/AboutContainer.tsx | 59 +++++++++++++-
.../Skeleton.AboutContainer.tsx | 74 ++++++++++++++++++
.../Skeleton.AppearanceContainer.tsx | 14 ++++
.../helpContainer/HelpContainer.tsx | 8 +-
.../helpContainer/Skeleton.HelpContainer.tsx | 17 ++++
.../settingsContainer/SettingsContainer.tsx | 26 +++---
.../Skeleton.SettingsContainer.tsx | 23 ++++++
17 files changed, 317 insertions(+), 34 deletions(-)
create mode 100644 src/webapp/app/(dashboard)/settings/about/loading.tsx
create mode 100644 src/webapp/app/(dashboard)/settings/appearance/loading.tsx
create mode 100644 src/webapp/app/(dashboard)/settings/help/loading.tsx
create mode 100644 src/webapp/app/(dashboard)/settings/loading.tsx
create mode 100644 src/webapp/assets/cosmik-bg-banner-small.webp
create mode 100644 src/webapp/features/settings/components/accountSummary/Skeleton.AccountSummary.tsx
create mode 100644 src/webapp/features/settings/components/settingItem/Skeleton.SettingItem.tsx
create mode 100644 src/webapp/features/settings/components/settingLogoutItem/SettingLogoutItem.tsx
create mode 100644 src/webapp/features/settings/containers/aboutContainer/Skeleton.AboutContainer.tsx
create mode 100644 src/webapp/features/settings/containers/appearanceContainer/Skeleton.AppearanceContainer.tsx
create mode 100644 src/webapp/features/settings/containers/helpContainer/Skeleton.HelpContainer.tsx
create mode 100644 src/webapp/features/settings/containers/settingsContainer/Skeleton.SettingsContainer.tsx
diff --git a/src/webapp/app/(dashboard)/settings/about/loading.tsx b/src/webapp/app/(dashboard)/settings/about/loading.tsx
new file mode 100644
index 00000000..a62a9ac3
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/about/loading.tsx
@@ -0,0 +1,5 @@
+import AboutContainerSkeleton from '@/features/settings/containers/aboutContainer/Skeleton.AboutContainer';
+
+export default function Loading() {
+ return ;
+}
diff --git a/src/webapp/app/(dashboard)/settings/appearance/loading.tsx b/src/webapp/app/(dashboard)/settings/appearance/loading.tsx
new file mode 100644
index 00000000..db72794b
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/appearance/loading.tsx
@@ -0,0 +1,5 @@
+import AppearanceContainerSkeleton from '@/features/settings/containers/appearanceContainer/Skeleton.AppearanceContainer';
+
+export default function Loading() {
+ return ;
+}
diff --git a/src/webapp/app/(dashboard)/settings/help/loading.tsx b/src/webapp/app/(dashboard)/settings/help/loading.tsx
new file mode 100644
index 00000000..5e487e0a
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/help/loading.tsx
@@ -0,0 +1,5 @@
+import HelpContainerSkeleton from '@/features/settings/containers/helpContainer/Skeleton.HelpContainer';
+
+export default function Loading() {
+ return ;
+}
diff --git a/src/webapp/app/(dashboard)/settings/loading.tsx b/src/webapp/app/(dashboard)/settings/loading.tsx
new file mode 100644
index 00000000..6fcf2a4b
--- /dev/null
+++ b/src/webapp/app/(dashboard)/settings/loading.tsx
@@ -0,0 +1,5 @@
+import SettingsContainerSkeleton from '@/features/settings/containers/settingsContainer/Skeleton.SettingsContainer';
+
+export default function Loading() {
+ return ;
+}
diff --git a/src/webapp/assets/cosmik-bg-banner-small.webp b/src/webapp/assets/cosmik-bg-banner-small.webp
new file mode 100644
index 0000000000000000000000000000000000000000..f50bfce2a6d9fc570a379578a817ddb0d220e553
GIT binary patch
literal 3500
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
literal 0
HcmV?d00001
diff --git a/src/webapp/features/settings/components/accountSummary/AccountSummary.tsx b/src/webapp/features/settings/components/accountSummary/AccountSummary.tsx
index a0ad846f..91b3b916 100644
--- a/src/webapp/features/settings/components/accountSummary/AccountSummary.tsx
+++ b/src/webapp/features/settings/components/accountSummary/AccountSummary.tsx
@@ -2,29 +2,29 @@
import useMyProfile from '@/features/profile/lib/queries/useMyProfile';
import { Avatar, Card, Group, Stack, Text } from '@mantine/core';
+import Link from 'next/link';
export default function AccountSummary() {
const { data: profile } = useMyProfile();
return (
-
-
-
-
-
-
- {profile.name}
-
-
- {profile.handle}
-
-
-
-
-
+
+
+
+
+ {profile.name}
+
+
+ @{profile.handle}
+
+
+
);
}
diff --git a/src/webapp/features/settings/components/accountSummary/Skeleton.AccountSummary.tsx b/src/webapp/features/settings/components/accountSummary/Skeleton.AccountSummary.tsx
new file mode 100644
index 00000000..5752d058
--- /dev/null
+++ b/src/webapp/features/settings/components/accountSummary/Skeleton.AccountSummary.tsx
@@ -0,0 +1,13 @@
+import { Stack, Avatar, Skeleton } from '@mantine/core';
+
+export default function AccountSummarySkeleton() {
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/webapp/features/settings/components/settingItem/SettingItem.tsx b/src/webapp/features/settings/components/settingItem/SettingItem.tsx
index 263a471d..caebbad5 100644
--- a/src/webapp/features/settings/components/settingItem/SettingItem.tsx
+++ b/src/webapp/features/settings/components/settingItem/SettingItem.tsx
@@ -5,6 +5,7 @@ import { isValidElement } from 'react';
interface Props {
href: string;
+ openInNewTab?: boolean;
icon: IconType | React.ReactElement;
children: React.ReactNode;
}
@@ -20,12 +21,14 @@ export default function SettingItem(props: Props) {
diff --git a/src/webapp/features/settings/components/settingItem/Skeleton.SettingItem.tsx b/src/webapp/features/settings/components/settingItem/Skeleton.SettingItem.tsx
new file mode 100644
index 00000000..bd548abf
--- /dev/null
+++ b/src/webapp/features/settings/components/settingItem/Skeleton.SettingItem.tsx
@@ -0,0 +1,17 @@
+import { Button } from '@mantine/core';
+
+export default function SettingItemSkeleton() {
+ return (
+
+ );
+}
diff --git a/src/webapp/features/settings/components/settingLogoutItem/SettingLogoutItem.tsx b/src/webapp/features/settings/components/settingLogoutItem/SettingLogoutItem.tsx
new file mode 100644
index 00000000..4ec0f981
--- /dev/null
+++ b/src/webapp/features/settings/components/settingLogoutItem/SettingLogoutItem.tsx
@@ -0,0 +1,35 @@
+'use client';
+
+import { useAuth } from '@/hooks/useAuth';
+import { Button } from '@mantine/core';
+import { useRouter } from 'next/navigation';
+import { IoMdLogOut } from 'react-icons/io';
+
+export default function SettingLogoutItem() {
+ const { logout } = useAuth();
+ const router = useRouter();
+
+ const handleLogout = async () => {
+ try {
+ await logout();
+ router.push('/');
+ } catch (error) {
+ console.error('Error logging out:', error);
+ }
+ };
+
+ return (
+ }
+ onClick={handleLogout}
+ my={1}
+ >
+ Log out
+
+ );
+}
diff --git a/src/webapp/features/settings/containers/aboutContainer/AboutContainer.tsx b/src/webapp/features/settings/containers/aboutContainer/AboutContainer.tsx
index 65e8b433..c7411727 100644
--- a/src/webapp/features/settings/containers/aboutContainer/AboutContainer.tsx
+++ b/src/webapp/features/settings/containers/aboutContainer/AboutContainer.tsx
@@ -1,7 +1,19 @@
-import { ButtonGroup, Container, Stack, Title } from '@mantine/core';
+import {
+ ButtonGroup,
+ Card,
+ Container,
+ Stack,
+ Image,
+ Title,
+ Text,
+ Group,
+} from '@mantine/core';
import SettingItem from '../../components/settingItem/SettingItem';
import { MdSpeakerNotes } from 'react-icons/md';
import { FaGithub } from 'react-icons/fa6';
+import CosmikLogo from '@/assets/cosmik-logo-full.svg';
+import CosmikLogoWhite from '@/assets/cosmik-logo-full-white.svg';
+import CosmikBanner from '@/assets/cosmik-bg-banner-small.webp';
export default function AboutContainer() {
return (
@@ -11,6 +23,7 @@ export default function AboutContainer() {
Follow our blog for updates
@@ -18,11 +31,55 @@ export default function AboutContainer() {
View source code
+
+
+
+
+ {/* dark logo */}
+
+
+ Semble is lovingly built by the team at Cosmik Network
+
+
+
+
);
diff --git a/src/webapp/features/settings/containers/aboutContainer/Skeleton.AboutContainer.tsx b/src/webapp/features/settings/containers/aboutContainer/Skeleton.AboutContainer.tsx
new file mode 100644
index 00000000..1dd0419d
--- /dev/null
+++ b/src/webapp/features/settings/containers/aboutContainer/Skeleton.AboutContainer.tsx
@@ -0,0 +1,74 @@
+import {
+ ButtonGroup,
+ Card,
+ Container,
+ Stack,
+ Image,
+ Title,
+ Text,
+ Group,
+} from '@mantine/core';
+import SettingItem from '../../components/settingItem/SettingItem';
+import { MdSpeakerNotes } from 'react-icons/md';
+import { FaGithub } from 'react-icons/fa6';
+import CosmikLogo from '@/assets/cosmik-logo-full.svg';
+import CosmikLogoWhite from '@/assets/cosmik-logo-full-white.svg';
+import CosmikBanner from '@/assets/cosmik-bg-banner-small.webp';
+import SettingItemSkeleton from '../../components/settingItem/Skeleton.SettingItem';
+
+export default function AboutContainerSkeleton() {
+ return (
+
+
+ Loading
+
+
+
+
+
+
+
+
+ {/* dark logo */}
+
+
+ Semble is lovingly built by the team at Cosmik Network
+
+
+
+
+
+
+ );
+}
diff --git a/src/webapp/features/settings/containers/appearanceContainer/Skeleton.AppearanceContainer.tsx b/src/webapp/features/settings/containers/appearanceContainer/Skeleton.AppearanceContainer.tsx
new file mode 100644
index 00000000..171a5880
--- /dev/null
+++ b/src/webapp/features/settings/containers/appearanceContainer/Skeleton.AppearanceContainer.tsx
@@ -0,0 +1,14 @@
+'use client';
+
+import { Container, Stack, Title, Skeleton } from '@mantine/core';
+
+export default function AppearanceContainerSkeleton() {
+ return (
+
+
+ Appearance
+
+
+
+ );
+}
diff --git a/src/webapp/features/settings/containers/helpContainer/HelpContainer.tsx b/src/webapp/features/settings/containers/helpContainer/HelpContainer.tsx
index 663b56d1..27285faa 100644
--- a/src/webapp/features/settings/containers/helpContainer/HelpContainer.tsx
+++ b/src/webapp/features/settings/containers/helpContainer/HelpContainer.tsx
@@ -11,17 +11,23 @@ export default function HelpContainer() {
Semble Docs
Submit an issue
-
+
Join our discord community
diff --git a/src/webapp/features/settings/containers/helpContainer/Skeleton.HelpContainer.tsx b/src/webapp/features/settings/containers/helpContainer/Skeleton.HelpContainer.tsx
new file mode 100644
index 00000000..bd2ca93d
--- /dev/null
+++ b/src/webapp/features/settings/containers/helpContainer/Skeleton.HelpContainer.tsx
@@ -0,0 +1,17 @@
+import { Container, Stack, Title, ButtonGroup } from '@mantine/core';
+import SettingItemSkeleton from '../../components/settingItem/Skeleton.SettingItem';
+
+export default function HelpContainerSkeleton() {
+ return (
+
+
+ Help
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/webapp/features/settings/containers/settingsContainer/SettingsContainer.tsx b/src/webapp/features/settings/containers/settingsContainer/SettingsContainer.tsx
index 3cee2fb7..20e70573 100644
--- a/src/webapp/features/settings/containers/settingsContainer/SettingsContainer.tsx
+++ b/src/webapp/features/settings/containers/settingsContainer/SettingsContainer.tsx
@@ -6,6 +6,7 @@ import {
IoMdHelpCircle,
IoMdInformationCircle,
} from 'react-icons/io';
+import SettingLogoutItem from '../../components/settingLogoutItem/SettingLogoutItem';
export default function SettingsContainer() {
return (
@@ -14,17 +15,20 @@ export default function SettingsContainer() {
Settings
-
-
- Appearance
-
-
- Help
-
-
- About
-
-
+
+
+
+ Appearance
+
+
+ Help
+
+
+ About
+
+
+
+
);
diff --git a/src/webapp/features/settings/containers/settingsContainer/Skeleton.SettingsContainer.tsx b/src/webapp/features/settings/containers/settingsContainer/Skeleton.SettingsContainer.tsx
new file mode 100644
index 00000000..325e8b0f
--- /dev/null
+++ b/src/webapp/features/settings/containers/settingsContainer/Skeleton.SettingsContainer.tsx
@@ -0,0 +1,23 @@
+import { ButtonGroup, Container, Stack, Title } from '@mantine/core';
+import AccountSummarySkeleton from '../../components/accountSummary/Skeleton.AccountSummary';
+import SettingItemSkeleton from '../../components/settingItem/Skeleton.SettingItem';
+
+export default function SettingsContainerSkeleton() {
+ return (
+
+
+ Settings
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
--
2.51.2
From d56ab7dedab8e8fa5a75af903bc3f390914566cc Mon Sep 17 00:00:00 2001
From: Pouria Delfanazari
Date: Thu, 20 Nov 2025 17:20:31 -0800
Subject: [PATCH 14/14] feat: headers on settings pages
---
src/webapp/app/(dashboard)/settings/about/layout.tsx | 11 ++++++++++-
.../app/(dashboard)/settings/appearance/layout.tsx | 11 ++++++++++-
src/webapp/app/(dashboard)/settings/help/layout.tsx | 11 ++++++++++-
src/webapp/app/(dashboard)/settings/layout.tsx | 9 +--------
src/webapp/app/(dashboard)/settings/page.tsx | 12 +++++++++++-
5 files changed, 42 insertions(+), 12 deletions(-)
diff --git a/src/webapp/app/(dashboard)/settings/about/layout.tsx b/src/webapp/app/(dashboard)/settings/about/layout.tsx
index 32b1e417..78ad4d83 100644
--- a/src/webapp/app/(dashboard)/settings/about/layout.tsx
+++ b/src/webapp/app/(dashboard)/settings/about/layout.tsx
@@ -1,3 +1,5 @@
+import BackButton from '@/components/navigation/backButton/BackButton';
+import Header from '@/components/navigation/header/Header';
import type { Metadata } from 'next';
import { Fragment } from 'react';
@@ -11,5 +13,12 @@ interface Props {
}
export default function Layout(props: Props) {
- return {props.children};
+ return (
+
+
+ {props.children}
+
+ );
}
diff --git a/src/webapp/app/(dashboard)/settings/appearance/layout.tsx b/src/webapp/app/(dashboard)/settings/appearance/layout.tsx
index 7f0ecec2..14cd9a5b 100644
--- a/src/webapp/app/(dashboard)/settings/appearance/layout.tsx
+++ b/src/webapp/app/(dashboard)/settings/appearance/layout.tsx
@@ -1,3 +1,5 @@
+import BackButton from '@/components/navigation/backButton/BackButton';
+import Header from '@/components/navigation/header/Header';
import type { Metadata } from 'next';
import { Fragment } from 'react';
@@ -11,5 +13,12 @@ interface Props {
}
export default function Layout(props: Props) {
- return {props.children};
+ return (
+
+
+ {props.children}
+
+ );
}
diff --git a/src/webapp/app/(dashboard)/settings/help/layout.tsx b/src/webapp/app/(dashboard)/settings/help/layout.tsx
index c7ca49a9..442872df 100644
--- a/src/webapp/app/(dashboard)/settings/help/layout.tsx
+++ b/src/webapp/app/(dashboard)/settings/help/layout.tsx
@@ -1,3 +1,5 @@
+import BackButton from '@/components/navigation/backButton/BackButton';
+import Header from '@/components/navigation/header/Header';
import type { Metadata } from 'next';
import { Fragment } from 'react';
@@ -11,5 +13,12 @@ interface Props {
}
export default function Layout(props: Props) {
- return {props.children};
+ return (
+
+
+ {props.children}
+
+ );
}
diff --git a/src/webapp/app/(dashboard)/settings/layout.tsx b/src/webapp/app/(dashboard)/settings/layout.tsx
index aff26ced..7bc1ee7f 100644
--- a/src/webapp/app/(dashboard)/settings/layout.tsx
+++ b/src/webapp/app/(dashboard)/settings/layout.tsx
@@ -13,12 +13,5 @@ interface Props {
}
export default function Layout(props: Props) {
- return (
-
-
- {props.children}
-
- );
+ return {props.children};
}
diff --git a/src/webapp/app/(dashboard)/settings/page.tsx b/src/webapp/app/(dashboard)/settings/page.tsx
index 2bae3d67..bcd1a1a3 100644
--- a/src/webapp/app/(dashboard)/settings/page.tsx
+++ b/src/webapp/app/(dashboard)/settings/page.tsx
@@ -1,10 +1,20 @@
+import BackButton from '@/components/navigation/backButton/BackButton';
+import Header from '@/components/navigation/header/Header';
import SettingsContainer from '@/features/settings/containers/settingsContainer/SettingsContainer';
import { verifySessionOnServer } from '@/lib/auth/dal.server';
import { redirect } from 'next/navigation';
+import { Fragment } from 'react';
export default async function Page() {
const session = await verifySessionOnServer();
if (!session) redirect('/login');
- return ;
+ return (
+
+
+
+
+ );
}