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 ( + + + + + + + + + + + + + ); +}