Hiding notifiers if not admin or owner in organization.

This commit is contained in:
charlesgauthereau
2025-12-08 09:57:17 +01:00
parent 0f9bbbda3c
commit 7410aaea38
4 changed files with 99 additions and 25 deletions
@@ -3,7 +3,7 @@
import {Tabs, TabsContent, TabsList, TabsTrigger} from "@/components/ui/tabs";
import {useEffect, useState} from "react";
import {useRouter, useSearchParams} from "next/navigation";
import {OrganizationWithMembers} from "@/db/schema/03_organization";
import {MemberWithUser, OrganizationWithMembers} from "@/db/schema/03_organization";
import {
SettingsOrganizationMembersTable
} from "@/components/wrappers/dashboard/settings/settings-organization-members-table";
@@ -11,18 +11,26 @@ import {
OrganizationNotifiersTab
} from "@/components/wrappers/dashboard/organization/tabs/organization-notifiers-tab/organization-notifiers-tab";
import {NotificationChannel} from "@/db/schema/09_notification-channel";
import {useOrganizationPermissions} from "@/hooks/use-organization-permissions";
export type OrganizationTabsProps = {
organization: OrganizationWithMembers;
notificationChannels: NotificationChannel[];
activeMember: MemberWithUser
};
export const OrganizationTabs = ({organization, notificationChannels}: OrganizationTabsProps) => {
export const OrganizationTabs = ({activeMember, organization, notificationChannels}: OrganizationTabsProps) => {
const router = useRouter();
const searchParams = useSearchParams();
const [tab, setTab] = useState<string>(() => searchParams.get("tab") ?? "users");
const {
canManageUsers,
canManageNotifications,
} = useOrganizationPermissions(activeMember);
useEffect(() => {
const newTab = searchParams.get("tab") ?? "users";
setTab(newTab);
@@ -32,25 +40,43 @@ export const OrganizationTabs = ({organization, notificationChannels}: Organizat
router.push(`?tab=${value}`);
};
return (
<Tabs className="h-full" value={tab} onValueChange={handleChangeTab}>
<TabsList className="w-full">
<TabsTrigger className="w-full" value="users">
Users
</TabsTrigger>
<TabsTrigger className="w-full" value="notifications">
Notifiers
</TabsTrigger>
</TabsList>
<TabsContent className="h-full" value="users">
<div className="h-full">
{canManageNotifications ?
<Tabs className="h-full" value={tab} onValueChange={handleChangeTab}>
<TabsList className="w-full">
<TabsTrigger
className="w-full"
value="users"
>
Users
</TabsTrigger>
<TabsTrigger
className="w-full"
value="notifications"
>
Notifiers
</TabsTrigger>
</TabsList>
<TabsContent className="h-full" value="users">
<SettingsOrganizationMembersTable organization={organization}/>
</TabsContent>
<TabsContent className="h-full" value="notifications">
<OrganizationNotifiersTab
organization={organization}
notificationChannels={notificationChannels}
/>
</TabsContent>
</Tabs>
:
<SettingsOrganizationMembersTable organization={organization}/>
</TabsContent>
<TabsContent className="h-full" value="notifications">
<OrganizationNotifiersTab
organization={organization}
notificationChannels={notificationChannels}
/>
</TabsContent>
</Tabs>
}
</div>
);
};
@@ -0,0 +1,8 @@
"use client";
import {MemberWithUser} from "@/db/schema/03_organization";
import {computeOrganizationPermissions} from "@/lib/acl/organization-acl";
export const useOrganizationPermissions = (activeMember: MemberWithUser | null) => {
return computeOrganizationPermissions(activeMember);
};
+37
View File
@@ -0,0 +1,37 @@
import {MemberWithUser} from "@/db/schema/03_organization";
export type OrganizationPermissions = {
role: string | null;
isOwner: boolean;
isAdmin: boolean;
isMember: boolean;
canManageSettings: boolean;
canManageUsers: boolean;
canManageNotifications: boolean;
canManageDangerZone: boolean;
};
export const computeOrganizationPermissions = (
activeMember: MemberWithUser | null
): OrganizationPermissions => {
const role = activeMember?.role ?? null;
const isOwner = role === "owner";
const isAdmin = role === "admin";
const isMember = role === "member";
return {
role,
isOwner,
isAdmin,
isMember,
canManageSettings: isOwner || isAdmin,
canManageUsers: isOwner || isAdmin,
canManageNotifications: isOwner || isAdmin,
canManageDangerZone: isOwner,
};
};