feat: refactor organization membership logic and simplify admin role checks
This commit is contained in:
@@ -22,10 +22,7 @@ import {
|
|||||||
type listBoardsApiV1BoardsGetResponse,
|
type listBoardsApiV1BoardsGetResponse,
|
||||||
useListBoardsApiV1BoardsGet,
|
useListBoardsApiV1BoardsGet,
|
||||||
} from "@/api/generated/boards/boards";
|
} from "@/api/generated/boards/boards";
|
||||||
import {
|
import { useOrganizationMembership } from "@/lib/use-organization-membership";
|
||||||
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
|
||||||
} from "@/api/generated/organizations/organizations";
|
|
||||||
import type {
|
import type {
|
||||||
ActivityEventRead,
|
ActivityEventRead,
|
||||||
AgentRead,
|
AgentRead,
|
||||||
@@ -84,19 +81,7 @@ export default function AgentDetailPage() {
|
|||||||
const agentIdParam = params?.agentId;
|
const agentIdParam = params?.agentId;
|
||||||
const agentId = Array.isArray(agentIdParam) ? agentIdParam[0] : agentIdParam;
|
const agentId = Array.isArray(agentIdParam) ? agentIdParam[0] : agentIdParam;
|
||||||
|
|
||||||
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
const { isAdmin } = useOrganizationMembership(isSignedIn);
|
||||||
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
ApiError
|
|
||||||
>({
|
|
||||||
query: {
|
|
||||||
enabled: Boolean(isSignedIn),
|
|
||||||
refetchOnMount: "always",
|
|
||||||
retry: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const member =
|
|
||||||
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
|
||||||
const isAdmin = member ? ["owner", "admin"].includes(member.role) : false;
|
|
||||||
|
|
||||||
const [deleteOpen, setDeleteOpen] = useState(false);
|
const [deleteOpen, setDeleteOpen] = useState(false);
|
||||||
const [deleteError, setDeleteError] = useState<string | null>(null);
|
const [deleteError, setDeleteError] = useState<string | null>(null);
|
||||||
|
|||||||
@@ -13,10 +13,7 @@ import {
|
|||||||
useListBoardsApiV1BoardsGet,
|
useListBoardsApiV1BoardsGet,
|
||||||
} from "@/api/generated/boards/boards";
|
} from "@/api/generated/boards/boards";
|
||||||
import { useCreateAgentApiV1AgentsPost } from "@/api/generated/agents/agents";
|
import { useCreateAgentApiV1AgentsPost } from "@/api/generated/agents/agents";
|
||||||
import {
|
import { useOrganizationMembership } from "@/lib/use-organization-membership";
|
||||||
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
|
||||||
} from "@/api/generated/organizations/organizations";
|
|
||||||
import type { BoardRead } from "@/api/generated/model";
|
import type { BoardRead } from "@/api/generated/model";
|
||||||
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
||||||
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
||||||
@@ -86,19 +83,7 @@ export default function NewAgentPage() {
|
|||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { isSignedIn } = useAuth();
|
const { isSignedIn } = useAuth();
|
||||||
|
|
||||||
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
const { isAdmin } = useOrganizationMembership(isSignedIn);
|
||||||
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
ApiError
|
|
||||||
>({
|
|
||||||
query: {
|
|
||||||
enabled: Boolean(isSignedIn),
|
|
||||||
refetchOnMount: "always",
|
|
||||||
retry: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const member =
|
|
||||||
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
|
||||||
const isAdmin = member ? ["owner", "admin"].includes(member.role) : false;
|
|
||||||
|
|
||||||
const [name, setName] = useState("");
|
const [name, setName] = useState("");
|
||||||
const [boardId, setBoardId] = useState<string>("");
|
const [boardId, setBoardId] = useState<string>("");
|
||||||
|
|||||||
@@ -42,10 +42,7 @@ import {
|
|||||||
getListBoardsApiV1BoardsGetQueryKey,
|
getListBoardsApiV1BoardsGetQueryKey,
|
||||||
useListBoardsApiV1BoardsGet,
|
useListBoardsApiV1BoardsGet,
|
||||||
} from "@/api/generated/boards/boards";
|
} from "@/api/generated/boards/boards";
|
||||||
import {
|
import { useOrganizationMembership } from "@/lib/use-organization-membership";
|
||||||
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
|
||||||
} from "@/api/generated/organizations/organizations";
|
|
||||||
import type { AgentRead } from "@/api/generated/model";
|
import type { AgentRead } from "@/api/generated/model";
|
||||||
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
||||||
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
||||||
@@ -94,19 +91,7 @@ export default function AgentsPage() {
|
|||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
const { isAdmin } = useOrganizationMembership(isSignedIn);
|
||||||
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
ApiError
|
|
||||||
>({
|
|
||||||
query: {
|
|
||||||
enabled: Boolean(isSignedIn),
|
|
||||||
refetchOnMount: "always",
|
|
||||||
retry: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const member =
|
|
||||||
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
|
||||||
const isAdmin = member ? ["owner", "admin"].includes(member.role) : false;
|
|
||||||
|
|
||||||
const [sorting, setSorting] = useState<SortingState>([
|
const [sorting, setSorting] = useState<SortingState>([
|
||||||
{ id: "name", desc: false },
|
{ id: "name", desc: false },
|
||||||
|
|||||||
@@ -22,10 +22,7 @@ import {
|
|||||||
type listGatewaysApiV1GatewaysGetResponse,
|
type listGatewaysApiV1GatewaysGetResponse,
|
||||||
useListGatewaysApiV1GatewaysGet,
|
useListGatewaysApiV1GatewaysGet,
|
||||||
} from "@/api/generated/gateways/gateways";
|
} from "@/api/generated/gateways/gateways";
|
||||||
import {
|
import { useOrganizationMembership } from "@/lib/use-organization-membership";
|
||||||
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
|
||||||
} from "@/api/generated/organizations/organizations";
|
|
||||||
import type {
|
import type {
|
||||||
BoardGroupRead,
|
BoardGroupRead,
|
||||||
BoardRead,
|
BoardRead,
|
||||||
@@ -65,19 +62,7 @@ export default function EditBoardPage() {
|
|||||||
const boardIdParam = params?.boardId;
|
const boardIdParam = params?.boardId;
|
||||||
const boardId = Array.isArray(boardIdParam) ? boardIdParam[0] : boardIdParam;
|
const boardId = Array.isArray(boardIdParam) ? boardIdParam[0] : boardIdParam;
|
||||||
|
|
||||||
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
const { isAdmin } = useOrganizationMembership(isSignedIn);
|
||||||
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
ApiError
|
|
||||||
>({
|
|
||||||
query: {
|
|
||||||
enabled: Boolean(isSignedIn),
|
|
||||||
refetchOnMount: "always",
|
|
||||||
retry: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const member =
|
|
||||||
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
|
||||||
const isAdmin = member ? ["owner", "admin"].includes(member.role) : false;
|
|
||||||
|
|
||||||
const mainRef = useRef<HTMLElement | null>(null);
|
const mainRef = useRef<HTMLElement | null>(null);
|
||||||
|
|
||||||
|
|||||||
@@ -18,10 +18,7 @@ import {
|
|||||||
type listGatewaysApiV1GatewaysGetResponse,
|
type listGatewaysApiV1GatewaysGetResponse,
|
||||||
useListGatewaysApiV1GatewaysGet,
|
useListGatewaysApiV1GatewaysGet,
|
||||||
} from "@/api/generated/gateways/gateways";
|
} from "@/api/generated/gateways/gateways";
|
||||||
import {
|
import { useOrganizationMembership } from "@/lib/use-organization-membership";
|
||||||
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
|
||||||
} from "@/api/generated/organizations/organizations";
|
|
||||||
import type { BoardGroupRead } from "@/api/generated/model";
|
import type { BoardGroupRead } from "@/api/generated/model";
|
||||||
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
||||||
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
||||||
@@ -42,19 +39,7 @@ export default function NewBoardPage() {
|
|||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { isSignedIn } = useAuth();
|
const { isSignedIn } = useAuth();
|
||||||
|
|
||||||
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
const { isAdmin } = useOrganizationMembership(isSignedIn);
|
||||||
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
ApiError
|
|
||||||
>({
|
|
||||||
query: {
|
|
||||||
enabled: Boolean(isSignedIn),
|
|
||||||
refetchOnMount: "always",
|
|
||||||
retry: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const member =
|
|
||||||
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
|
||||||
const isAdmin = member ? ["owner", "admin"].includes(member.role) : false;
|
|
||||||
|
|
||||||
const [name, setName] = useState("");
|
const [name, setName] = useState("");
|
||||||
const [gatewayId, setGatewayId] = useState<string>("");
|
const [gatewayId, setGatewayId] = useState<string>("");
|
||||||
|
|||||||
@@ -25,10 +25,7 @@ import {
|
|||||||
type listBoardGroupsApiV1BoardGroupsGetResponse,
|
type listBoardGroupsApiV1BoardGroupsGetResponse,
|
||||||
useListBoardGroupsApiV1BoardGroupsGet,
|
useListBoardGroupsApiV1BoardGroupsGet,
|
||||||
} from "@/api/generated/board-groups/board-groups";
|
} from "@/api/generated/board-groups/board-groups";
|
||||||
import {
|
import { useOrganizationMembership } from "@/lib/use-organization-membership";
|
||||||
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
|
||||||
} from "@/api/generated/organizations/organizations";
|
|
||||||
import type { BoardGroupRead, BoardRead } from "@/api/generated/model";
|
import type { BoardGroupRead, BoardRead } from "@/api/generated/model";
|
||||||
import { DashboardSidebar } from "@/components/organisms/DashboardSidebar";
|
import { DashboardSidebar } from "@/components/organisms/DashboardSidebar";
|
||||||
import { DashboardShell } from "@/components/templates/DashboardShell";
|
import { DashboardShell } from "@/components/templates/DashboardShell";
|
||||||
@@ -62,19 +59,7 @@ export default function BoardsPage() {
|
|||||||
const { isSignedIn } = useAuth();
|
const { isSignedIn } = useAuth();
|
||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
const { isAdmin } = useOrganizationMembership(isSignedIn);
|
||||||
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
ApiError
|
|
||||||
>({
|
|
||||||
query: {
|
|
||||||
enabled: Boolean(isSignedIn),
|
|
||||||
refetchOnMount: "always",
|
|
||||||
retry: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const member =
|
|
||||||
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
|
||||||
const isAdmin = member ? ["owner", "admin"].includes(member.role) : false;
|
|
||||||
const [deleteTarget, setDeleteTarget] = useState<BoardRead | null>(null);
|
const [deleteTarget, setDeleteTarget] = useState<BoardRead | null>(null);
|
||||||
|
|
||||||
const boardsKey = getListBoardsApiV1BoardsGetQueryKey();
|
const boardsKey = getListBoardsApiV1BoardsGetQueryKey();
|
||||||
|
|||||||
@@ -13,10 +13,7 @@ import {
|
|||||||
useGetGatewayApiV1GatewaysGatewayIdGet,
|
useGetGatewayApiV1GatewaysGatewayIdGet,
|
||||||
useUpdateGatewayApiV1GatewaysGatewayIdPatch,
|
useUpdateGatewayApiV1GatewaysGatewayIdPatch,
|
||||||
} from "@/api/generated/gateways/gateways";
|
} from "@/api/generated/gateways/gateways";
|
||||||
import {
|
import { useOrganizationMembership } from "@/lib/use-organization-membership";
|
||||||
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
|
||||||
} from "@/api/generated/organizations/organizations";
|
|
||||||
import type { GatewayUpdate } from "@/api/generated/model";
|
import type { GatewayUpdate } from "@/api/generated/model";
|
||||||
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
||||||
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
||||||
@@ -40,19 +37,7 @@ export default function EditGatewayPage() {
|
|||||||
? gatewayIdParam[0]
|
? gatewayIdParam[0]
|
||||||
: gatewayIdParam;
|
: gatewayIdParam;
|
||||||
|
|
||||||
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
const { isAdmin } = useOrganizationMembership(isSignedIn);
|
||||||
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
ApiError
|
|
||||||
>({
|
|
||||||
query: {
|
|
||||||
enabled: Boolean(isSignedIn),
|
|
||||||
refetchOnMount: "always",
|
|
||||||
retry: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const member =
|
|
||||||
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
|
||||||
const isAdmin = member ? ["owner", "admin"].includes(member.role) : false;
|
|
||||||
|
|
||||||
const [name, setName] = useState<string | undefined>(undefined);
|
const [name, setName] = useState<string | undefined>(undefined);
|
||||||
const [gatewayUrl, setGatewayUrl] = useState<string | undefined>(undefined);
|
const [gatewayUrl, setGatewayUrl] = useState<string | undefined>(undefined);
|
||||||
|
|||||||
@@ -18,10 +18,7 @@ import {
|
|||||||
type listAgentsApiV1AgentsGetResponse,
|
type listAgentsApiV1AgentsGetResponse,
|
||||||
useListAgentsApiV1AgentsGet,
|
useListAgentsApiV1AgentsGet,
|
||||||
} from "@/api/generated/agents/agents";
|
} from "@/api/generated/agents/agents";
|
||||||
import {
|
import { useOrganizationMembership } from "@/lib/use-organization-membership";
|
||||||
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
|
||||||
} from "@/api/generated/organizations/organizations";
|
|
||||||
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
||||||
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
||||||
import { DashboardSidebar } from "@/components/organisms/DashboardSidebar";
|
import { DashboardSidebar } from "@/components/organisms/DashboardSidebar";
|
||||||
@@ -55,19 +52,7 @@ export default function GatewayDetailPage() {
|
|||||||
? gatewayIdParam[0]
|
? gatewayIdParam[0]
|
||||||
: gatewayIdParam;
|
: gatewayIdParam;
|
||||||
|
|
||||||
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
const { isAdmin } = useOrganizationMembership(isSignedIn);
|
||||||
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
ApiError
|
|
||||||
>({
|
|
||||||
query: {
|
|
||||||
enabled: Boolean(isSignedIn),
|
|
||||||
refetchOnMount: "always",
|
|
||||||
retry: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const member =
|
|
||||||
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
|
||||||
const isAdmin = member ? ["owner", "admin"].includes(member.role) : false;
|
|
||||||
|
|
||||||
const gatewayQuery = useGetGatewayApiV1GatewaysGatewayIdGet<
|
const gatewayQuery = useGetGatewayApiV1GatewaysGatewayIdGet<
|
||||||
getGatewayApiV1GatewaysGatewayIdGetResponse,
|
getGatewayApiV1GatewaysGatewayIdGetResponse,
|
||||||
|
|||||||
@@ -9,10 +9,7 @@ import { SignedIn, SignedOut, useAuth } from "@/auth/clerk";
|
|||||||
|
|
||||||
import { ApiError } from "@/api/mutator";
|
import { ApiError } from "@/api/mutator";
|
||||||
import { useCreateGatewayApiV1GatewaysPost } from "@/api/generated/gateways/gateways";
|
import { useCreateGatewayApiV1GatewaysPost } from "@/api/generated/gateways/gateways";
|
||||||
import {
|
import { useOrganizationMembership } from "@/lib/use-organization-membership";
|
||||||
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
|
||||||
} from "@/api/generated/organizations/organizations";
|
|
||||||
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
||||||
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
||||||
import { GatewayForm } from "@/components/gateways/GatewayForm";
|
import { GatewayForm } from "@/components/gateways/GatewayForm";
|
||||||
@@ -30,19 +27,7 @@ export default function NewGatewayPage() {
|
|||||||
const { isSignedIn } = useAuth();
|
const { isSignedIn } = useAuth();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
const { isAdmin } = useOrganizationMembership(isSignedIn);
|
||||||
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
ApiError
|
|
||||||
>({
|
|
||||||
query: {
|
|
||||||
enabled: Boolean(isSignedIn),
|
|
||||||
refetchOnMount: "always",
|
|
||||||
retry: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const member =
|
|
||||||
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
|
||||||
const isAdmin = member ? ["owner", "admin"].includes(member.role) : false;
|
|
||||||
|
|
||||||
const [name, setName] = useState("");
|
const [name, setName] = useState("");
|
||||||
const [gatewayUrl, setGatewayUrl] = useState("");
|
const [gatewayUrl, setGatewayUrl] = useState("");
|
||||||
|
|||||||
@@ -35,10 +35,7 @@ import {
|
|||||||
useDeleteGatewayApiV1GatewaysGatewayIdDelete,
|
useDeleteGatewayApiV1GatewaysGatewayIdDelete,
|
||||||
useListGatewaysApiV1GatewaysGet,
|
useListGatewaysApiV1GatewaysGet,
|
||||||
} from "@/api/generated/gateways/gateways";
|
} from "@/api/generated/gateways/gateways";
|
||||||
import {
|
import { useOrganizationMembership } from "@/lib/use-organization-membership";
|
||||||
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
|
||||||
} from "@/api/generated/organizations/organizations";
|
|
||||||
import type { GatewayRead } from "@/api/generated/model";
|
import type { GatewayRead } from "@/api/generated/model";
|
||||||
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
import { AdminOnlyNotice } from "@/components/auth/AdminOnlyNotice";
|
||||||
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
import { SignedOutPanel } from "@/components/auth/SignedOutPanel";
|
||||||
@@ -65,19 +62,7 @@ export default function GatewaysPage() {
|
|||||||
const { isSignedIn } = useAuth();
|
const { isSignedIn } = useAuth();
|
||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
const { isAdmin } = useOrganizationMembership(isSignedIn);
|
||||||
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
ApiError
|
|
||||||
>({
|
|
||||||
query: {
|
|
||||||
enabled: Boolean(isSignedIn),
|
|
||||||
refetchOnMount: "always",
|
|
||||||
retry: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const member =
|
|
||||||
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
|
||||||
const isAdmin = member ? ["owner", "admin"].includes(member.role) : false;
|
|
||||||
const [sorting, setSorting] = useState<SortingState>([
|
const [sorting, setSorting] = useState<SortingState>([
|
||||||
{ id: "name", desc: false },
|
{ id: "name", desc: false },
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -15,10 +15,7 @@ import {
|
|||||||
|
|
||||||
import { useAuth } from "@/auth/clerk";
|
import { useAuth } from "@/auth/clerk";
|
||||||
import { ApiError } from "@/api/mutator";
|
import { ApiError } from "@/api/mutator";
|
||||||
import {
|
import { useOrganizationMembership } from "@/lib/use-organization-membership";
|
||||||
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
|
||||||
} from "@/api/generated/organizations/organizations";
|
|
||||||
import {
|
import {
|
||||||
type healthzHealthzGetResponse,
|
type healthzHealthzGetResponse,
|
||||||
useHealthzHealthzGet,
|
useHealthzHealthzGet,
|
||||||
@@ -28,19 +25,7 @@ import { cn } from "@/lib/utils";
|
|||||||
export function DashboardSidebar() {
|
export function DashboardSidebar() {
|
||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const { isSignedIn } = useAuth();
|
const { isSignedIn } = useAuth();
|
||||||
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
const { isAdmin } = useOrganizationMembership(isSignedIn);
|
||||||
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
|
||||||
ApiError
|
|
||||||
>({
|
|
||||||
query: {
|
|
||||||
enabled: Boolean(isSignedIn),
|
|
||||||
refetchOnMount: "always",
|
|
||||||
retry: false,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const member =
|
|
||||||
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
|
||||||
const isAdmin = member ? ["owner", "admin"].includes(member.role) : false;
|
|
||||||
const healthQuery = useHealthzHealthzGet<healthzHealthzGetResponse, ApiError>(
|
const healthQuery = useHealthzHealthzGet<healthzHealthzGetResponse, ApiError>(
|
||||||
{
|
{
|
||||||
query: {
|
query: {
|
||||||
|
|||||||
33
frontend/src/lib/use-organization-membership.ts
Normal file
33
frontend/src/lib/use-organization-membership.ts
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import { ApiError } from "@/api/mutator";
|
||||||
|
import {
|
||||||
|
type getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
||||||
|
useGetMyMembershipApiV1OrganizationsMeMemberGet,
|
||||||
|
} from "@/api/generated/organizations/organizations";
|
||||||
|
|
||||||
|
export const isOrganizationAdminRole = (
|
||||||
|
role: string | null | undefined,
|
||||||
|
): boolean => role === "owner" || role === "admin";
|
||||||
|
|
||||||
|
export function useOrganizationMembership(
|
||||||
|
isSignedIn: boolean | null | undefined,
|
||||||
|
) {
|
||||||
|
const membershipQuery = useGetMyMembershipApiV1OrganizationsMeMemberGet<
|
||||||
|
getMyMembershipApiV1OrganizationsMeMemberGetResponse,
|
||||||
|
ApiError
|
||||||
|
>({
|
||||||
|
query: {
|
||||||
|
enabled: Boolean(isSignedIn),
|
||||||
|
refetchOnMount: "always",
|
||||||
|
retry: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const member =
|
||||||
|
membershipQuery.data?.status === 200 ? membershipQuery.data.data : null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
membershipQuery,
|
||||||
|
member,
|
||||||
|
isAdmin: isOrganizationAdminRole(member?.role),
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user