11"use client"
22
3- import { useState } from "react"
3+ import { useEffect , useMemo , useState } from "react"
44import { DataTable } from "@/components/common/datatable"
55import { Switch } from "@/components/common/switch"
66import type { Service } from "@/generated/prisma/client"
7+ import { useAuth } from "@/hooks/useAuth"
78import { useDialog } from "@/hooks/useDialog"
89import { insertServiceCategory } from "@/lib/prisma/service_category/insertServiceCategory"
910import type { ServiceCategoryWithRelations } from "@/lib/prisma/service_category/types"
1011import { updateServiceCategory } from "@/lib/prisma/service_category/updateServiceCategory"
12+ import type { StaffUserWithRelations } from "@/lib/prisma/staff_user/types"
13+ import { resolvePolicy } from "@/utils/policies/resolvePolicy"
14+ import type { UserContext } from "@/utils/policies/types"
1115import { ConfirmArchiveServiceCategoryModal } from "../ConfirmArchiveServiceCategoryModal"
1216import { CreateServiceCategoryModal } from "../CreateServiceCategoryModal"
1317import { EditServiceCategoryModal } from "../EditServiceCategoryModal"
1418import { columns } from "./columns"
1519
1620export type ServiceCategoryTableProps = {
21+ currentUser : StaffUserWithRelations | null
1722 serviceCategories : ServiceCategoryWithRelations [ ]
1823 services : Service [ ]
1924 revalidateTable : ( ) => Promise < void >
2025}
2126
2227export const ServiceCategoryTable = ( {
28+ currentUser,
2329 serviceCategories,
2430 services,
2531 revalidateTable,
2632} : ServiceCategoryTableProps ) => {
33+ const { role, idir_user_guid } = useAuth ( )
2734 const {
2835 open : editServiceCategoryModalOpen ,
2936 openDialog : openEditServiceCategoryModal ,
@@ -40,9 +47,36 @@ export const ServiceCategoryTable = ({
4047 closeDialog : closeConfirmArchiveServiceCategoryModal ,
4148 } = useDialog ( )
4249
50+ const userContext = useMemo < UserContext > (
51+ ( ) => ( {
52+ staff_user_id : idir_user_guid ?? null ,
53+ role,
54+ location_code : currentUser ?. locationCode ?? null ,
55+ } ) ,
56+ [ idir_user_guid , role , currentUser ?. locationCode ]
57+ )
58+
59+ const actions = resolvePolicy ( "service_category" , userContext )
60+
4361 const [ showArchived , setShowArchived ] = useState < boolean > ( false )
4462 const [ selectedServiceCategory , setSelectedServiceCategory ] =
4563 useState < ServiceCategoryWithRelations | null > ( null )
64+ const [ canEditSelectedServiceCategory , setCanEditSelectedServiceCategory ] =
65+ useState < boolean > ( false )
66+ const [ canArchiveSelectedServiceCategory , setCanArchiveSelectedServiceCategory ] =
67+ useState < boolean > ( false )
68+
69+ // Determine if the current user can edit/archive the selected service category whenever either changes
70+ useEffect ( ( ) => {
71+ if ( selectedServiceCategory ) {
72+ const actions = resolvePolicy ( "service_category" , userContext , selectedServiceCategory )
73+ setCanEditSelectedServiceCategory ( actions . includes ( "edit" ) )
74+ setCanArchiveSelectedServiceCategory ( actions . includes ( "archive" ) )
75+ } else {
76+ setCanEditSelectedServiceCategory ( false )
77+ setCanArchiveSelectedServiceCategory ( false )
78+ }
79+ } , [ selectedServiceCategory , userContext ] )
4680
4781 const handleRowClick = ( serviceCategory : ServiceCategoryWithRelations ) => {
4882 setSelectedServiceCategory ( serviceCategory )
@@ -52,12 +86,20 @@ export const ServiceCategoryTable = ({
5286 const serviceCategoriesToShow = showArchived
5387 ? serviceCategories
5488 : serviceCategories . filter ( ( serviceCategory ) => serviceCategory . deletedAt === null )
89+
90+ const canCreate = actions . includes ( "create" )
91+
5592 return (
5693 < >
5794 < div className = "flex items-center justify-end mb-3 gap-4" >
5895 < h3 className = "self-center text-sm font-medium text-gray-700" > Show Archived</ h3 >
5996 < Switch checked = { showArchived } onChange = { setShowArchived } />
60- < button type = "button" onClick = { openCreateServiceCategoryModal } className = "primary" >
97+ < button
98+ type = "button"
99+ onClick = { openCreateServiceCategoryModal }
100+ disabled = { ! canCreate }
101+ className = "primary"
102+ >
61103 + Create
62104 </ button >
63105 </ div >
@@ -84,6 +126,8 @@ export const ServiceCategoryTable = ({
84126 updateServiceCategory = { updateServiceCategory }
85127 revalidateTable = { revalidateTable }
86128 openConfirmArchiveServiceCategoryModal = { openConfirmArchiveServiceCategoryModal }
129+ canEdit = { canEditSelectedServiceCategory }
130+ canArchive = { canArchiveSelectedServiceCategory }
87131 />
88132 < CreateServiceCategoryModal
89133 open = { createServiceCategoryModalOpen }
0 commit comments