diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 5201d8cc7..e91e54379 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -225,8 +225,8 @@ importers: specifier: ^3.10.0 version: 3.10.0(react-hook-form@7.71.2(react@18.3.1)) '@raystack/proton': - specifier: 0.1.0-d8accdc231fe7e3b23b38c0535b2aa92da42cf24 - version: 0.1.0-d8accdc231fe7e3b23b38c0535b2aa92da42cf24(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 0.1.0-dcca57385227df0690df54d66f73b3baacfc580d + version: 0.1.0-dcca57385227df0690df54d66f73b3baacfc580d(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': specifier: ^5.90.2 version: 5.90.21(react@18.3.1) @@ -2306,6 +2306,14 @@ packages: '@tanstack/react-query': optional: true + '@raystack/proton@0.1.0-dcca57385227df0690df54d66f73b3baacfc580d': + resolution: {integrity: sha512-KEQwx7obRikkAqIVzFMMDlpic2YBjHnkPB5KBeQ0/ljJQ6ik8EHWrYiPGXgfwQ2UKVcZSJ89UAMBddN5PCtovw==} + peerDependencies: + '@tanstack/react-query': ^5.0.0 + peerDependenciesMeta: + '@tanstack/react-query': + optional: true + '@remix-run/router@1.23.2': resolution: {integrity: sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==} engines: {node: '>=14.0.0'} @@ -9875,6 +9883,20 @@ snapshots: - react - react-dom + '@raystack/proton@0.1.0-dcca57385227df0690df54d66f73b3baacfc580d(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@bufbuild/protobuf': 2.11.0 + '@connectrpc/connect': 2.1.1(@bufbuild/protobuf@2.11.0) + '@connectrpc/connect-query': 2.1.1(@bufbuild/protobuf@2.11.0)(@connectrpc/connect@2.1.1(@bufbuild/protobuf@2.11.0))(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.21(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@protobuf-ts/runtime': 2.11.1 + '@protobuf-ts/runtime-rpc': 2.11.1 + optionalDependencies: + '@tanstack/react-query': 5.90.21(react@18.3.1) + transitivePeerDependencies: + - '@tanstack/query-core' + - react + - react-dom + '@remix-run/router@1.23.2': {} '@rolldown/pluginutils@1.0.0-beta.27': {} diff --git a/web/sdk/package.json b/web/sdk/package.json index 2babce272..5b6647144 100644 --- a/web/sdk/package.json +++ b/web/sdk/package.json @@ -104,7 +104,7 @@ "@connectrpc/connect-query": "2.1.1", "@connectrpc/connect-web": "2.1.1", "@hookform/resolvers": "^3.10.0", - "@raystack/proton": "0.1.0-d8accdc231fe7e3b23b38c0535b2aa92da42cf24", + "@raystack/proton": "0.1.0-dcca57385227df0690df54d66f73b3baacfc580d", "@tanstack/react-query": "^5.90.2", "@tanstack/react-router": "1.58.17", "axios": "^1.9.0", diff --git a/web/sdk/react/views/members/member-columns.tsx b/web/sdk/react/views/members/member-columns.tsx index 591bbfbec..215f3cca1 100644 --- a/web/sdk/react/views/members/member-columns.tsx +++ b/web/sdk/react/views/members/member-columns.tsx @@ -14,14 +14,12 @@ import { DropdownMenu, DataTableColumnDef } from '@raystack/apsara'; -import type { Role, Policy } from '@raystack/proton/frontier'; +import type { Role } from '@raystack/proton/frontier'; import { differenceWith, getInitials, isEqualById } from '~/utils'; -import { useMutation, useQuery } from '@connectrpc/connect-query'; +import { useMutation } from '@connectrpc/connect-query'; import { FrontierServiceQueries, - DeletePolicyRequestSchema, - CreatePolicyRequestSchema, - ListPoliciesRequestSchema + SetOrganizationMemberRoleRequestSchema } from '@raystack/proton/frontier'; import { create } from '@bufbuild/protobuf'; import type { MemberWithInvite } from '~/react/hooks/useOrganizationMembers'; @@ -129,35 +127,10 @@ const MembersActions = ({ refetch: () => void; onRemoveMember?: MembersTableType['onRemoveMember']; }) => { - // Query to fetch policies for the current member const [isMenuOpen, setIsMenuOpen] = useState(false); - const { data: policiesData, refetch: refetchPolicies } = useQuery( - FrontierServiceQueries.listPolicies, - create(ListPoliciesRequestSchema, { - orgId: organizationId, - userId: member.id - }), - { - enabled: isMenuOpen && !!member.id, - staleTime: 60_000, - gcTime: 300_000 - } - ); - - const { mutateAsync: deletePolicy } = useMutation( - FrontierServiceQueries.deletePolicy, - { - onError: (error: any) => { - toast.error('Something went wrong', { - description: error?.message || 'Failed to delete policy' - }); - } - } - ); - - const { mutateAsync: createPolicy } = useMutation( - FrontierServiceQueries.createPolicy, + const { mutateAsync: setMemberRole } = useMutation( + FrontierServiceQueries.setOrganizationMemberRole, { onSuccess: () => { refetch(); @@ -165,7 +138,7 @@ const MembersActions = ({ }, onError: (error: any) => { toast.error('Something went wrong', { - description: error?.message || 'Failed to create policy' + description: error?.message || 'Failed to update member role' }); } } @@ -173,44 +146,12 @@ const MembersActions = ({ async function updateRole(role: Role) { try { - const resource = `app/organization:${organizationId}`; - const principal = `app/user:${member?.id}`; - - // Use policies from Connect RPC query - const policies = policiesData?.policies || []; - - // Delete existing policies with individual error handling - const deleteResults = await Promise.allSettled( - policies.map((p: Policy) => { - const req = create(DeletePolicyRequestSchema, { - id: p.id as string - }); - return deletePolicy(req); - }) - ); - - // Check for delete errors - const deleteErrors = deleteResults - .filter( - (result): result is PromiseRejectedResult => - result.status === 'rejected' - ) - .map(result => result.reason); - - if (deleteErrors.length > 0) { - console.warn('Some policy deletions failed:', deleteErrors); - } - - // Create new policy - const createReq = create(CreatePolicyRequestSchema, { - body: { - roleId: role.id as string, - title: role.name as string, - resource: resource, - principal: principal - } + const req = create(SetOrganizationMemberRoleRequestSchema, { + orgId: organizationId, + userId: member?.id, + roleId: role.id as string }); - await createPolicy(createReq); + await setMemberRole(req); } catch (error: any) { toast.error('Something went wrong', { description: error?.message || 'Failed to update member role' @@ -222,10 +163,7 @@ const MembersActions = ({ { - setIsMenuOpen(open); - if (open) refetchPolicies(); - }} + onOpenChange={setIsMenuOpen} >