diff --git a/app/components/text-editor/editor-button.tsx b/app/components/text-editor/editor-button.tsx index cd51d13..e71113f 100644 --- a/app/components/text-editor/editor-button.tsx +++ b/app/components/text-editor/editor-button.tsx @@ -21,7 +21,7 @@ export const EditorButton = (properties: TProperties) => { onClick={onClick} disabled={disabled} className={twMerge( - 'flex h-6 w-8 cursor-pointer items-center justify-center rounded-md p-2 hover:bg-[#2E2F7C] hover:text-white disabled:cursor-not-allowed disabled:bg-[#2E2F7C]/50 disabled:text-white disabled:hover:bg-[#2E2F7C]/50', + 'flex h-6 w-8 cursor-pointer items-center justify-center rounded-md p-2 hover:bg-[#2E2F7C] hover:text-white disabled:cursor-not-allowed disabled:bg-[#2E2F7C]/50 disabled:text-white disabled:opacity-50', isActive ? 'bg-[#2E2F7C]/10' : '', className, )} diff --git a/app/components/ui/input-file.tsx b/app/components/ui/input-file.tsx index c6bb7d8..b3570cc 100644 --- a/app/components/ui/input-file.tsx +++ b/app/components/ui/input-file.tsx @@ -11,6 +11,8 @@ import { import { useRemixFormContext } from 'remix-hook-form' import { twMerge } from 'tailwind-merge' +import { useAdminContext } from '~/contexts/admin' + import { Button } from './button' type TInputProperties = Omit< @@ -40,6 +42,7 @@ export const InputFile = >( labelClassName, ...restProperties } = properties + const { setIsUploadOpen } = useAdminContext() const { register, @@ -59,7 +62,7 @@ export const InputFile = >( >( variant="icon" size="fit" className="absolute right-3 h-[42px]" - onClick={() => {}} + onClick={() => { + setIsUploadOpen('featured_image') + }} > diff --git a/app/components/ui/input.tsx b/app/components/ui/input.tsx index ee6fb6a..7dfb802 100644 --- a/app/components/ui/input.tsx +++ b/app/components/ui/input.tsx @@ -63,7 +63,7 @@ export const Input = >( > +} + +const AdminContext = createContext( + undefined, +) + +export const AdminProvider = ({ children }: PropsWithChildren) => { + const [isUploadOpen, setIsUploadOpen] = useState() + + return ( + + {children} + + ) +} + +export const useAdminContext = (): AdminContextProperties => { + const context = useContext(AdminContext) + if (!context) { + throw new Error('useAdminContext must be used within a AdminProvider') + } + return context +} diff --git a/app/layouts/admin/dashboard.tsx b/app/layouts/admin/dashboard.tsx index a57480e..74e7858 100644 --- a/app/layouts/admin/dashboard.tsx +++ b/app/layouts/admin/dashboard.tsx @@ -1,10 +1,14 @@ +import { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react' import type { PropsWithChildren } from 'react' +import { useAdminContext } from '~/contexts/admin' + import { Navbar } from './navbar' import { Sidebar } from './sidebar' export const AdminDashboardLayout = (properties: PropsWithChildren) => { const { children } = properties + const { isUploadOpen, setIsUploadOpen } = useAdminContext() return (
@@ -12,6 +16,28 @@ export const AdminDashboardLayout = (properties: PropsWithChildren) => {
{children}
+ + { + setIsUploadOpen(undefined) + }} + className="relative z-50" + transition + > + +
+ + Upload di mari {isUploadOpen} + +
+
) } diff --git a/app/routes/_admin.lg-admin._dashboard.tsx b/app/routes/_admin.lg-admin._dashboard.tsx index 11b5ffc..61edd57 100644 --- a/app/routes/_admin.lg-admin._dashboard.tsx +++ b/app/routes/_admin.lg-admin._dashboard.tsx @@ -2,6 +2,7 @@ import { Outlet } from 'react-router' import { getCategories } from '~/apis/common/get-categories' import { getTags } from '~/apis/common/get-tags' +import { AdminProvider } from '~/contexts/admin' import { AdminDashboardLayout } from '~/layouts/admin/dashboard' import type { Route } from './+types/_admin.lg-admin._dashboard' @@ -18,9 +19,11 @@ export const loader = async ({}: Route.LoaderArgs) => { const DashboardLayout = () => { return ( - - - + + + + + ) } export default DashboardLayout diff --git a/app/routes/_admin.lg-admin.tsx b/app/routes/_admin.lg-admin.tsx index eea1a83..3beecde 100644 --- a/app/routes/_admin.lg-admin.tsx +++ b/app/routes/_admin.lg-admin.tsx @@ -1,9 +1,11 @@ import { Outlet, redirect } from 'react-router' +import { XiorError } from 'xior' import { getStaff } from '~/apis/admin/get-staff' import { AUTH_PAGES } from '~/configs/pages' import { AdminDefaultLayout } from '~/layouts/admin/default' import { handleCookie } from '~/libs/cookies' +import { setStaffLogoutHeaders } from '~/libs/logout-header.server' import type { Route } from './+types/_admin.lg-admin' @@ -13,6 +15,19 @@ export const loader = async ({ request }: Route.LoaderArgs) => { const isAuthPage = AUTH_PAGES.includes(pathname) let staffData + if (staffToken) { + try { + const { data } = await getStaff({ + accessToken: staffToken, + }) + staffData = data + } catch (error) { + if (error instanceof XiorError && error.response?.status === 401) { + setStaffLogoutHeaders() + } + } + } + if (!isAuthPage && !staffToken) { throw redirect('/lg-admin/login') } @@ -21,13 +36,6 @@ export const loader = async ({ request }: Route.LoaderArgs) => { throw redirect('/lg-admin') } - if (staffToken) { - const { data } = await getStaff({ - accessToken: staffToken, - }) - staffData = data - } - return { staffData, } diff --git a/app/routes/_news.tsx b/app/routes/_news.tsx index 18f091d..2ec9028 100644 --- a/app/routes/_news.tsx +++ b/app/routes/_news.tsx @@ -1,4 +1,5 @@ import { Outlet } from 'react-router' +import { XiorError } from 'xior' import { getCategories } from '~/apis/common/get-categories' import { getSubscriptions } from '~/apis/common/get-subscriptions' @@ -6,6 +7,7 @@ import { getUser } from '~/apis/news/get-user' import { NewsProvider } from '~/contexts/news' import { NewsDefaultLayout } from '~/layouts/news/default' import { handleCookie } from '~/libs/cookies' +import { setUserLogoutHeaders } from '~/libs/logout-header.server' import type { Route } from './+types/_news' @@ -13,10 +15,16 @@ export const loader = async ({ request }: Route.LoaderArgs) => { const { userToken } = await handleCookie(request) let userData if (userToken) { - const { data } = await getUser({ - accessToken: userToken, - }) - userData = data + try { + const { data } = await getUser({ + accessToken: userToken, + }) + userData = data + } catch (error) { + if (error instanceof XiorError && error.response?.status === 401) { + setUserLogoutHeaders() + } + } } const { data: subscriptionsData } = await getSubscriptions() const { data: categoriesData } = await getCategories()