From e5b136b8b5d4e87e62476d4ebf33a7351a324dd0 Mon Sep 17 00:00:00 2001 From: louiscklaw Date: Sun, 11 May 2025 13:06:58 +0800 Subject: [PATCH] update main-nav refactoring, working, --- .../layout/vertical/main-nav/_GUIDELINE.md | 3 + .../vertical/main-nav/contacts-button.tsx | 73 +++++++++++++++++++ .../{main-nav.tsx => main-nav/index.tsx} | 46 +++--------- .../vertical/main-nav/language-switch.tsx | 62 ++++++++++++++++ .../main-nav/notifications-button.tsx | 49 +++++++++++++ .../vertical/main-nav/search-button.tsx | 29 ++++++++ .../layout/vertical/main-nav/user-button.tsx | 44 +++++++++++ .../layout/vertical/main-nav/user.tsx | 9 +++ 8 files changed, 279 insertions(+), 36 deletions(-) create mode 100644 002_source/cms/src/components/dashboard/layout/vertical/main-nav/_GUIDELINE.md create mode 100644 002_source/cms/src/components/dashboard/layout/vertical/main-nav/contacts-button.tsx rename 002_source/cms/src/components/dashboard/layout/vertical/{main-nav.tsx => main-nav/index.tsx} (83%) create mode 100644 002_source/cms/src/components/dashboard/layout/vertical/main-nav/language-switch.tsx create mode 100644 002_source/cms/src/components/dashboard/layout/vertical/main-nav/notifications-button.tsx create mode 100644 002_source/cms/src/components/dashboard/layout/vertical/main-nav/search-button.tsx create mode 100644 002_source/cms/src/components/dashboard/layout/vertical/main-nav/user-button.tsx create mode 100644 002_source/cms/src/components/dashboard/layout/vertical/main-nav/user.tsx diff --git a/002_source/cms/src/components/dashboard/layout/vertical/main-nav/_GUIDELINE.md b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/_GUIDELINE.md new file mode 100644 index 0000000..929b878 --- /dev/null +++ b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/_GUIDELINE.md @@ -0,0 +1,3 @@ +# GUIDELINE + +- please keep one default `export` per file diff --git a/002_source/cms/src/components/dashboard/layout/vertical/main-nav/contacts-button.tsx b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/contacts-button.tsx new file mode 100644 index 0000000..f0f541d --- /dev/null +++ b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/contacts-button.tsx @@ -0,0 +1,73 @@ +'use client'; + +import * as React from 'react'; +import IconButton from '@mui/material/IconButton'; +import Popover from '@mui/material/Popover'; +import List from '@mui/material/List'; +import ListItem from '@mui/material/ListItem'; +import ListItemButton from '@mui/material/ListItemButton'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import Tooltip from '@mui/material/Tooltip'; +import { ChatCenteredDots as ChatCenteredDotsIcon } from '@phosphor-icons/react/dist/ssr/ChatCenteredDots'; +import { EnvelopeSimple as EnvelopeSimpleIcon } from '@phosphor-icons/react/dist/ssr/EnvelopeSimple'; +import { User as UserIcon } from '@phosphor-icons/react/dist/ssr/User'; + +export function ContactsButton(): React.JSX.Element { + const [anchorEl, setAnchorEl] = React.useState(null); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const open = Boolean(anchorEl); + const id = open ? 'contacts-popover' : undefined; + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/002_source/cms/src/components/dashboard/layout/vertical/main-nav.tsx b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/index.tsx similarity index 83% rename from 002_source/cms/src/components/dashboard/layout/vertical/main-nav.tsx rename to 002_source/cms/src/components/dashboard/layout/vertical/main-nav/index.tsx index 83095c1..e087711 100644 --- a/002_source/cms/src/components/dashboard/layout/vertical/main-nav.tsx +++ b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/index.tsx @@ -19,13 +19,15 @@ import type { User } from '@/types/user'; import { useDialog } from '@/hooks/use-dialog'; import { usePopover } from '@/hooks/use-popover'; -import { ContactsPopover } from '../contacts-popover'; -import { languageFlags, LanguagePopover } from '../language-popover'; -import type { Language } from '../language-popover'; -import { MobileNav } from '../mobile-nav'; -import { NotificationsPopover } from '../notifications-popover'; -import { SearchDialog } from '../search-dialog'; -import { UserPopover } from '../user-popover/user-popover'; +import { ContactsPopover } from '../../contacts-popover'; +import { languageFlags, LanguagePopover } from '../../language-popover'; +import type { Language } from '../../language-popover'; +import { MobileNav } from '../../mobile-nav'; +import { NotificationsPopover } from '../../notifications-popover'; +import { SearchDialog } from '../../search-dialog'; +import { UserPopover } from '../../user-popover/user-popover'; +import { NotificationsButton } from './notifications-button'; +import { LanguageSwitch } from './language-switch'; export interface MainNavProps { items: NavItemConfig[]; @@ -146,35 +148,7 @@ function ContactsButton(): React.JSX.Element { ); } -function NotificationsButton(): React.JSX.Element { - const popover = usePopover(); - - return ( - - - - - - - - - - - ); -} - -function LanguageSwitch(): React.JSX.Element { +function LanguageSwitch1(): React.JSX.Element { const { i18n } = useTranslation(); const popover = usePopover(); const language = (i18n.language || 'en') as Language; diff --git a/002_source/cms/src/components/dashboard/layout/vertical/main-nav/language-switch.tsx b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/language-switch.tsx new file mode 100644 index 0000000..5ff6c46 --- /dev/null +++ b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/language-switch.tsx @@ -0,0 +1,62 @@ +'use client'; + +import * as React from 'react'; +import Avatar from '@mui/material/Avatar'; +import Badge from '@mui/material/Badge'; +import Box from '@mui/material/Box'; +import Divider from '@mui/material/Divider'; +import IconButton from '@mui/material/IconButton'; +import Stack from '@mui/material/Stack'; +import Tooltip from '@mui/material/Tooltip'; +import { Bell as BellIcon } from '@phosphor-icons/react/dist/ssr/Bell'; +import { List as ListIcon } from '@phosphor-icons/react/dist/ssr/List'; +import { MagnifyingGlass as MagnifyingGlassIcon } from '@phosphor-icons/react/dist/ssr/MagnifyingGlass'; +import { Users as UsersIcon } from '@phosphor-icons/react/dist/ssr/Users'; +import { useTranslation } from 'next-i18next'; + +import type { NavItemConfig } from '@/types/nav'; +import type { User } from '@/types/user'; +import { useDialog } from '@/hooks/use-dialog'; +import { usePopover } from '@/hooks/use-popover'; + +import { ContactsPopover } from '../../contacts-popover'; +import { languageFlags, LanguagePopover } from '../../language-popover'; +import type { Language } from '../../language-popover'; +import { MobileNav } from '../../mobile-nav'; +import { NotificationsPopover } from '../../notifications-popover'; +import { SearchDialog } from '../../search-dialog'; +import { UserPopover } from '../../user-popover/user-popover'; +import { NotificationsButton } from './notifications-button'; + +export function LanguageSwitch(): React.JSX.Element { + const { i18n } = useTranslation(); + const popover = usePopover(); + const language = (i18n.language || 'en') as Language; + const flag = languageFlags[language]; + + return ( + + + + + + + + + + + ); +} diff --git a/002_source/cms/src/components/dashboard/layout/vertical/main-nav/notifications-button.tsx b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/notifications-button.tsx new file mode 100644 index 0000000..2c8612f --- /dev/null +++ b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/notifications-button.tsx @@ -0,0 +1,49 @@ +'use client'; + +import * as React from 'react'; +import Badge from '@mui/material/Badge'; +import IconButton from '@mui/material/IconButton'; +import Popover from '@mui/material/Popover'; +import Tooltip from '@mui/material/Tooltip'; +import { Bell as BellIcon } from '@phosphor-icons/react/dist/ssr/Bell'; + +export function NotificationsButton(): React.JSX.Element { + const [anchorEl, setAnchorEl] = React.useState(null); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const open = Boolean(anchorEl); + const id = open ? 'notifications-popover' : undefined; + + return ( + + + + + + + + + + {/* Notification content would go here */} + + + ); +} diff --git a/002_source/cms/src/components/dashboard/layout/vertical/main-nav/search-button.tsx b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/search-button.tsx new file mode 100644 index 0000000..eaa26b3 --- /dev/null +++ b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/search-button.tsx @@ -0,0 +1,29 @@ +'use client'; + +import * as React from 'react'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import { MagnifyingGlass as MagnifyingGlassIcon } from '@phosphor-icons/react/dist/ssr/MagnifyingGlass'; +import { useDialog } from '@/hooks/use-dialog'; +import { SearchDialog } from '../../search-dialog'; + +export function SearchButton(): React.JSX.Element { + const dialog = useDialog(); + + return ( + + + + + + + + + ); +} diff --git a/002_source/cms/src/components/dashboard/layout/vertical/main-nav/user-button.tsx b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/user-button.tsx new file mode 100644 index 0000000..22d5cf9 --- /dev/null +++ b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/user-button.tsx @@ -0,0 +1,44 @@ +'use client'; + +import * as React from 'react'; +import { User as UserIcon } from '@phosphor-icons/react/dist/ssr/User'; +import { Avatar, Popover, Tooltip } from '@mui/material'; + +export function UserButton(): React.JSX.Element { + const [anchorEl, setAnchorEl] = React.useState(null); + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const open = Boolean(anchorEl); + const id = open ? 'user-popover' : undefined; + + return ( + + + + + + + + {/* User menu content would go here */} + + + ); +} diff --git a/002_source/cms/src/components/dashboard/layout/vertical/main-nav/user.tsx b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/user.tsx new file mode 100644 index 0000000..4c0f08f --- /dev/null +++ b/002_source/cms/src/components/dashboard/layout/vertical/main-nav/user.tsx @@ -0,0 +1,9 @@ +'use client'; +import type { User } from '@/types/user'; + +export const user = { + id: 'USR-000', + name: 'Sofia Rivers', + avatar: '/assets/avatar.png', + email: 'sofia@devias.io', +} satisfies User;