diff --git a/web/apps/client-demo/src/Router.tsx b/web/apps/client-demo/src/Router.tsx
index b3256d4d1..c7798371e 100644
--- a/web/apps/client-demo/src/Router.tsx
+++ b/web/apps/client-demo/src/Router.tsx
@@ -9,6 +9,7 @@ import Updates from './pages/Updates';
import Organization from './pages/Organization';
import Settings from './pages/Settings';
import General from './pages/settings/General';
+import Preferences from './pages/settings/Preferences';
function Router() {
return (
@@ -24,6 +25,7 @@ function Router() {
} />
}>
} />
+ } />
} />
diff --git a/web/apps/client-demo/src/pages/Settings.tsx b/web/apps/client-demo/src/pages/Settings.tsx
index f909e2c09..f87964cf7 100644
--- a/web/apps/client-demo/src/pages/Settings.tsx
+++ b/web/apps/client-demo/src/pages/Settings.tsx
@@ -4,7 +4,8 @@ import { Outlet, useParams, useLocation, Navigate } from 'react-router-dom';
import { useFrontier } from '@raystack/frontier/react';
const NAV_ITEMS = [
- { label: 'General', path: 'general' }
+ { label: 'General', path: 'general' },
+ { label: 'Preferences', path: 'preferences' }
];
export default function Settings() {
diff --git a/web/apps/client-demo/src/pages/settings/Preferences.tsx b/web/apps/client-demo/src/pages/settings/Preferences.tsx
new file mode 100644
index 000000000..121e95235
--- /dev/null
+++ b/web/apps/client-demo/src/pages/settings/Preferences.tsx
@@ -0,0 +1,5 @@
+import { PreferencesView } from '@raystack/frontier/react';
+
+export default function Preferences() {
+ return ;
+}
diff --git a/web/sdk/react/components/view-container/view-container.module.css b/web/sdk/react/components/view-container/view-container.module.css
index 3510a88e0..bc5c01e87 100644
--- a/web/sdk/react/components/view-container/view-container.module.css
+++ b/web/sdk/react/components/view-container/view-container.module.css
@@ -7,6 +7,5 @@
}
.content {
- max-width: 1512px;
width: 100%;
}
diff --git a/web/sdk/react/components/view-container/view-container.tsx b/web/sdk/react/components/view-container/view-container.tsx
index 4579b1fd3..8ab4adbc6 100644
--- a/web/sdk/react/components/view-container/view-container.tsx
+++ b/web/sdk/react/components/view-container/view-container.tsx
@@ -9,7 +9,7 @@ export interface ViewContainerProps extends ComponentProps {
export function ViewContainer({ children, contentProps, className, ...props }: ViewContainerProps) {
return (
-
+
{children}
diff --git a/web/sdk/react/index.ts b/web/sdk/react/index.ts
index 61d5678f0..eb15cbb30 100644
--- a/web/sdk/react/index.ts
+++ b/web/sdk/react/index.ts
@@ -30,6 +30,7 @@ export { ImageUpload } from './components/image-upload';
export { ViewContainer } from './components/view-container';
export { ViewHeader } from './components/view-header';
export { GeneralView } from './views-new/general';
+export { PreferencesView, PreferenceRow } from './views-new/preferences';
export type {
FrontierClientOptions,
diff --git a/web/sdk/react/views-new/preferences/components/preference-row.tsx b/web/sdk/react/views-new/preferences/components/preference-row.tsx
new file mode 100644
index 000000000..3378525df
--- /dev/null
+++ b/web/sdk/react/views-new/preferences/components/preference-row.tsx
@@ -0,0 +1,46 @@
+import { ComponentProps } from 'react';
+import { Flex, Text, Skeleton } from '@raystack/apsara-v1';
+import styles from './preferences-row.module.css';
+import { cx } from 'class-variance-authority';
+
+export interface PreferenceRowProps extends ComponentProps {
+ title: string;
+ description: string;
+ isLoading?: boolean;
+ contentProps?: ComponentProps;
+}
+
+export function PreferenceRow({
+ title,
+ description,
+ isLoading,
+ children,
+ className,
+ contentProps,
+ ...props
+}: PreferenceRowProps) {
+ return (
+
+
+ {isLoading ? (
+ <>
+
+
+ >
+ ) : (
+ <>
+
+ {title}
+
+
+ {description}
+
+ >
+ )}
+
+
+ {isLoading ? : children}
+
+
+ );
+}
diff --git a/web/sdk/react/views-new/preferences/components/preferences-row.module.css b/web/sdk/react/views-new/preferences/components/preferences-row.module.css
new file mode 100644
index 000000000..78f0feb59
--- /dev/null
+++ b/web/sdk/react/views-new/preferences/components/preferences-row.module.css
@@ -0,0 +1,10 @@
+.row {
+ padding: var(--rs-space-7) 0;
+ border-bottom: 1px dashed var(--rs-color-border-base-primary);
+}
+.content {
+ flex: 1;
+}
+.children {
+ min-width: 135px;
+}
diff --git a/web/sdk/react/views-new/preferences/index.ts b/web/sdk/react/views-new/preferences/index.ts
new file mode 100644
index 000000000..b275ef776
--- /dev/null
+++ b/web/sdk/react/views-new/preferences/index.ts
@@ -0,0 +1,2 @@
+export { PreferencesView } from './preferences-view';
+export { PreferenceRow } from './components/preference-row';
diff --git a/web/sdk/react/views-new/preferences/preferences-view.module.css b/web/sdk/react/views-new/preferences/preferences-view.module.css
new file mode 100644
index 000000000..d17915b1d
--- /dev/null
+++ b/web/sdk/react/views-new/preferences/preferences-view.module.css
@@ -0,0 +1,3 @@
+.selectTrigger {
+ width: 100%;
+}
diff --git a/web/sdk/react/views-new/preferences/preferences-view.tsx b/web/sdk/react/views-new/preferences/preferences-view.tsx
new file mode 100644
index 000000000..f5f091dc3
--- /dev/null
+++ b/web/sdk/react/views-new/preferences/preferences-view.tsx
@@ -0,0 +1,80 @@
+import { Flex, Select, Skeleton } from '@raystack/apsara-v1';
+import { SunIcon, MoonIcon, GearIcon } from '@radix-ui/react-icons';
+import { BellIcon, BellSlashIcon } from '@raystack/apsara-v1/icons';
+import { ViewContainer } from '~/react/components/view-container';
+import { ViewHeader } from '~/react/components/view-header';
+import { usePreferences } from '~/react/hooks/usePreferences';
+import { PREFERENCE_OPTIONS } from '~/react/utils/constants';
+import { PreferenceRow } from './components/preference-row';
+import { useTheme } from '@raystack/apsara';
+import styles from './preferences-view.module.css';
+
+export function PreferencesView() {
+ const { theme, setTheme } = useTheme();
+ const { preferences, isLoading, isFetching, updatePreferences } =
+ usePreferences({});
+ console.log(theme);
+
+ const newsletterValue =
+ preferences?.[PREFERENCE_OPTIONS.NEWSLETTER]?.value ?? 'false';
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}