koperasi/services/frontend/app/routes/member/route.tsx

64 lines
2.0 KiB
TypeScript
Raw Normal View History

2025-08-08 07:12:40 +00:00
import type { LoaderFunctionArgs } from "@remix-run/node";
import { Form, Outlet, json, redirect, useNavigation } from "@remix-run/react";
import { LogOutIcon } from "lucide-react";
import { Button } from "~/components/ui/button";
import {
isAdmin,
isMemberBasic,
isMemberHasOTP,
isMemberNotActive,
isMemberPlatinum,
} from "~/lib/middleware";
import RegisterCarousel from "../auth/components/RegisterCarousel";
export async function loader({ request }: LoaderFunctionArgs) {
const isUserAdmin = await isAdmin(request);
const isPlatinum = await isMemberPlatinum(request);
const isMember = await isMemberBasic(request);
const isNonActive = await isMemberNotActive(request);
const isMemberOTP = await isMemberHasOTP(request);
if (isUserAdmin) {
return redirect("/dashboard");
}
if (isPlatinum || isMember) {
return redirect("/app");
}
if (isMemberOTP) {
return redirect("/otp");
}
if (!isNonActive) {
throw json(
{ message: "Anda belum terdaftar sebagai anggota koperasi." },
{ status: 401, statusText: "Anda tidak memiliki akses ke halaman ini" },
);
}
return null;
}
export default function MemberLayout() {
const navigation = useNavigation();
return (
<main className="max-h-screen min-h-screen w-full lg:grid lg:grid-cols-2">
<div className="hidden lg:block xl:p-10}">
<div className="relative flex h-full items-center justify-center rounded-md bg-[#F1FFF9]">
<RegisterCarousel />
</div>
</div>
<div className="flex max-h-screen items-center justify-center overflow-auto py-12">
<Form className="!p-0 absolute top-5 right-10" method="post" action="/action/logout">
<Button
className="w-full cursor-pointer justify-between text-start"
disabled={navigation.state === "submitting"}
variant="destructive"
type="submit"
>
Keluar <LogOutIcon className="ms-3 size-5" />
</Button>
</Form>
<Outlet />
</div>
</main>
);
}