mirror of
https://github.com/Portabase/portabase.git
synced 2026-07-14 11:16:13 +02:00
Hiding notifiers if not admin or owner in organization.
This commit is contained in:
@@ -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);
|
||||
};
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user