Merge remote-tracking branch 'origin/master' into feature/slicing

This commit is contained in:
fredy.siswanto 2025-03-03 19:16:30 +07:00
commit 01925c7c63
4 changed files with 65 additions and 16 deletions

View File

@ -1,12 +1,15 @@
import { Link } from 'react-router' import { Button, Popover, PopoverButton, PopoverPanel } from '@headlessui/react'
import { Link, useFetcher, useRouteLoaderData } from 'react-router'
import { ChevronIcon } from '~/components/icons/chevron' import { ChevronIcon } from '~/components/icons/chevron'
import { NotificationIcon } from '~/components/icons/notification' import { NotificationIcon } from '~/components/icons/notification'
import { APP } from '~/configs/meta' import { APP } from '~/configs/meta'
import { useAdminContext } from '~/contexts/admin' import type { loader } from '~/routes/_admin.lg-admin'
export const Navbar = () => { export const Navbar = () => {
const { adminProfile } = useAdminContext() const loaderData = useRouteLoaderData<typeof loader>('routes/_admin.lg-admin')
const staffData = loaderData?.staffData
const fetcher = useFetcher()
return ( return (
<div className="flex h-20 items-center justify-between border-b border-[#ECECEC] bg-white px-10 py-5"> <div className="flex h-20 items-center justify-between border-b border-[#ECECEC] bg-white px-10 py-5">
@ -21,13 +24,37 @@ export const Navbar = () => {
/> />
</Link> </Link>
<div className="flex items-center gap-x-8"> <div className="flex items-center gap-x-8">
<div className="flex w-3xs items-center justify-between"> <Popover className="relative">
<div className="flex items-center"> <PopoverButton className="flex w-3xs cursor-pointer items-center justify-between focus:outline-none">
<div className="mr-3 h-8 w-8 rounded-full bg-[#C4C4C4]" /> <div className="flex items-center">
<span className="text-xs">{adminProfile.name}</span> <img
</div> src={staffData?.profile_picture}
<ChevronIcon className="opacity-50" /> alt={staffData?.name}
</div> className="mr-3 h-8 w-8 rounded-full bg-[#C4C4C4] object-cover"
/>
<span className="text-xs">{staffData?.name}</span>
</div>
<ChevronIcon className="opacity-50" />
</PopoverButton>
<PopoverPanel
anchor={{ to: 'bottom', gap: '8px' }}
transition
className="flex w-3xs flex-col rounded-xl border border-[#ECECEC] bg-white p-3 transition duration-200 ease-in-out data-[closed]:-translate-y-1 data-[closed]:opacity-0"
>
<fetcher.Form
method="POST"
action="/actions/admin/logout"
className="grid"
>
<Button
type="submit"
className="cursor-pointer rounded p-1 hover:bg-[#707FDD]/10 hover:text-[#5363AB]"
>
Logout
</Button>
</fetcher.Form>
</PopoverPanel>
</Popover>
<NotificationIcon <NotificationIcon
className="text-[#B0C3CC]" className="text-[#B0C3CC]"
showBadge={true} showBadge={true}

View File

@ -1,4 +1,4 @@
import { NavLink, useLocation } from 'react-router' import { Link, useLocation } from 'react-router'
import { twMerge } from 'tailwind-merge' import { twMerge } from 'tailwind-merge'
import { MENU } from './menu' import { MENU } from './menu'
@ -15,7 +15,7 @@ export const Sidebar = () => {
> >
<div className="px-5 pb-4 text-[#4C5CA0]/50 uppercase">{group}</div> <div className="px-5 pb-4 text-[#4C5CA0]/50 uppercase">{group}</div>
{items.map(({ title, url, icon: Icon }) => ( {items.map(({ title, url, icon: Icon }) => (
<NavLink <Link
to={url} to={url}
key={`${group}-${title}`} key={`${group}-${title}`}
className={twMerge( className={twMerge(
@ -37,7 +37,7 @@ export const Sidebar = () => {
> >
{title} {title}
</span> </span>
</NavLink> </Link>
))} ))}
</div> </div>
))} ))}

View File

@ -12,7 +12,7 @@ export const loader = async ({ request }: Route.LoaderArgs) => {
const { staffToken } = await handleCookie(request) const { staffToken } = await handleCookie(request)
const { pathname } = new URL(request.url) const { pathname } = new URL(request.url)
const isAuthPage = AUTH_PAGES.includes(pathname) const isAuthPage = AUTH_PAGES.includes(pathname)
let adminData let staffData
if (!isAuthPage && !staffToken) { if (!isAuthPage && !staffToken) {
throw redirect('/lg-admin/login') throw redirect('/lg-admin/login')
@ -26,11 +26,11 @@ export const loader = async ({ request }: Route.LoaderArgs) => {
const { data } = await getStaff({ const { data } = await getStaff({
accessToken: staffToken, accessToken: staffToken,
}) })
adminData = data staffData = data
} }
return { return {
adminData, staffData,
} }
} }

View File

@ -0,0 +1,22 @@
import { data } from 'react-router'
import { setStaffLogoutHeaders } from '~/libs/logout-header.server'
export const action = async () => {
try {
const responseHeaders = setStaffLogoutHeaders()
return data(
{ success: true },
{ headers: responseHeaders, status: 200, statusText: 'OK' },
)
} catch {
return data(
{
message: 'Something went wrong',
success: false,
},
{ status: 500 },
)
}
}