@shipfox/client-workspace-settings 4.0.0 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +51 -0
- package/dist/components/members/form-errors.d.ts +1 -0
- package/dist/components/members/form-errors.d.ts.map +1 -1
- package/dist/components/members/form-errors.js +26 -13
- package/dist/components/members/form-errors.js.map +1 -1
- package/dist/components/members/workspace-members-section.d.ts.map +1 -1
- package/dist/components/members/workspace-members-section.js +31 -28
- package/dist/components/members/workspace-members-section.js.map +1 -1
- package/dist/core/membership.d.ts +41 -0
- package/dist/core/membership.d.ts.map +1 -0
- package/dist/core/membership.js +16 -0
- package/dist/core/membership.js.map +1 -0
- package/dist/feature.d.ts +15 -72
- package/dist/feature.d.ts.map +1 -1
- package/dist/feature.js +20 -102
- package/dist/feature.js.map +1 -1
- package/dist/hooks/api/create-invitation.d.ts +4 -2
- package/dist/hooks/api/create-invitation.d.ts.map +1 -1
- package/dist/hooks/api/create-invitation.js +6 -3
- package/dist/hooks/api/create-invitation.js.map +1 -1
- package/dist/hooks/api/invitation-mapper.d.ts +2 -2
- package/dist/hooks/api/invitation-mapper.d.ts.map +1 -1
- package/dist/hooks/api/invitation-mapper.js.map +1 -1
- package/dist/hooks/api/list-invitations.d.ts +5 -5
- package/dist/hooks/api/list-invitations.d.ts.map +1 -1
- package/dist/hooks/api/list-invitations.js.map +1 -1
- package/dist/hooks/api/list-members.d.ts +10 -11
- package/dist/hooks/api/list-members.d.ts.map +1 -1
- package/dist/hooks/api/list-members.js +11 -5
- package/dist/hooks/api/list-members.js.map +1 -1
- package/dist/hooks/api/membership-mapper.d.ts +4 -0
- package/dist/hooks/api/membership-mapper.d.ts.map +1 -0
- package/dist/hooks/api/membership-mapper.js +14 -0
- package/dist/hooks/api/membership-mapper.js.map +1 -0
- package/dist/hooks/api/remove-member.d.ts +2 -1
- package/dist/hooks/api/remove-member.d.ts.map +1 -1
- package/dist/hooks/api/remove-member.js +6 -8
- package/dist/hooks/api/remove-member.js.map +1 -1
- package/dist/hooks/api/revoke-invitation.d.ts +2 -1
- package/dist/hooks/api/revoke-invitation.d.ts.map +1 -1
- package/dist/hooks/api/revoke-invitation.js +4 -4
- package/dist/hooks/api/revoke-invitation.js.map +1 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -7
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +10 -16
- package/src/components/members/form-errors.test.ts +57 -4
- package/src/components/members/form-errors.ts +21 -10
- package/src/components/members/workspace-members-section.tsx +38 -35
- package/src/core/membership.test.ts +69 -0
- package/src/core/membership.ts +64 -0
- package/src/feature.ts +27 -104
- package/src/hooks/api/create-invitation.ts +8 -4
- package/src/hooks/api/invitation-mapper.ts +2 -2
- package/src/hooks/api/list-invitations.ts +2 -2
- package/src/hooks/api/list-members.ts +17 -7
- package/src/hooks/api/membership-mapper.test.ts +24 -0
- package/src/hooks/api/membership-mapper.ts +15 -0
- package/src/hooks/api/remove-member.ts +11 -8
- package/src/hooks/api/revoke-invitation.ts +11 -6
- package/src/index.ts +0 -7
- package/test/pages.tsx +1 -5
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/core/invitation.d.ts +0 -15
- package/dist/core/invitation.d.ts.map +0 -1
- package/dist/core/invitation.js +0 -3
- package/dist/core/invitation.js.map +0 -1
- package/dist/pages/events-settings-page.d.ts +0 -2
- package/dist/pages/events-settings-page.d.ts.map +0 -1
- package/dist/pages/events-settings-page.js +0 -30
- package/dist/pages/events-settings-page.js.map +0 -1
- package/dist/pages/integrations-settings-page.d.ts +0 -2
- package/dist/pages/integrations-settings-page.d.ts.map +0 -1
- package/dist/pages/integrations-settings-page.js +0 -10
- package/dist/pages/integrations-settings-page.js.map +0 -1
- package/dist/pages/model-providers-settings-page.d.ts +0 -2
- package/dist/pages/model-providers-settings-page.d.ts.map +0 -1
- package/dist/pages/model-providers-settings-page.js +0 -20
- package/dist/pages/model-providers-settings-page.js.map +0 -1
- package/dist/pages/provisioners-settings-page.d.ts +0 -2
- package/dist/pages/provisioners-settings-page.d.ts.map +0 -1
- package/dist/pages/provisioners-settings-page.js +0 -14
- package/dist/pages/provisioners-settings-page.js.map +0 -1
- package/dist/pages/runners-settings-page.d.ts +0 -2
- package/dist/pages/runners-settings-page.d.ts.map +0 -1
- package/dist/pages/runners-settings-page.js +0 -14
- package/dist/pages/runners-settings-page.js.map +0 -1
- package/dist/pages/secrets-settings-page.d.ts +0 -2
- package/dist/pages/secrets-settings-page.d.ts.map +0 -1
- package/dist/pages/secrets-settings-page.js +0 -14
- package/dist/pages/secrets-settings-page.js.map +0 -1
- package/dist/pages/variables-settings-page.d.ts +0 -2
- package/dist/pages/variables-settings-page.d.ts.map +0 -1
- package/dist/pages/variables-settings-page.js +0 -14
- package/dist/pages/variables-settings-page.js.map +0 -1
- package/dist/routes/agents.d.ts +0 -6
- package/dist/routes/agents.d.ts.map +0 -1
- package/dist/routes/agents.js +0 -7
- package/dist/routes/agents.js.map +0 -1
- package/dist/routes/events.d.ts +0 -8
- package/dist/routes/events.d.ts.map +0 -1
- package/dist/routes/events.js +0 -9
- package/dist/routes/events.js.map +0 -1
- package/dist/routes/integrations.d.ts +0 -6
- package/dist/routes/integrations.d.ts.map +0 -1
- package/dist/routes/integrations.js +0 -7
- package/dist/routes/integrations.js.map +0 -1
- package/dist/routes/provisioners.d.ts +0 -6
- package/dist/routes/provisioners.d.ts.map +0 -1
- package/dist/routes/provisioners.js +0 -7
- package/dist/routes/provisioners.js.map +0 -1
- package/dist/routes/runners.d.ts +0 -6
- package/dist/routes/runners.d.ts.map +0 -1
- package/dist/routes/runners.js +0 -7
- package/dist/routes/runners.js.map +0 -1
- package/dist/routes/secrets.d.ts +0 -6
- package/dist/routes/secrets.d.ts.map +0 -1
- package/dist/routes/secrets.js +0 -7
- package/dist/routes/secrets.js.map +0 -1
- package/dist/routes/variables.d.ts +0 -6
- package/dist/routes/variables.d.ts.map +0 -1
- package/dist/routes/variables.js +0 -7
- package/dist/routes/variables.js.map +0 -1
- package/src/core/invitation.ts +0 -15
- package/src/pages/events-settings-page.tsx +0 -25
- package/src/pages/integrations-settings-page.test.tsx +0 -72
- package/src/pages/integrations-settings-page.tsx +0 -6
- package/src/pages/model-providers-settings-page.test.tsx +0 -48
- package/src/pages/model-providers-settings-page.tsx +0 -15
- package/src/pages/provisioners-settings-page.test.tsx +0 -29
- package/src/pages/provisioners-settings-page.tsx +0 -14
- package/src/pages/runners-settings-page.test.tsx +0 -23
- package/src/pages/runners-settings-page.tsx +0 -14
- package/src/pages/secrets-settings-page.tsx +0 -14
- package/src/pages/variables-settings-page.tsx +0 -14
- package/src/routes/agents.tsx +0 -3
- package/src/routes/events.tsx +0 -7
- package/src/routes/integrations.tsx +0 -3
- package/src/routes/provisioners.tsx +0 -3
- package/src/routes/runners.tsx +0 -3
- package/src/routes/secrets.tsx +0 -3
- package/src/routes/variables.tsx +0 -3
- package/test/typecheck/route-ids.tsx +0 -7
- package/test/typecheck/settings-composition.tsx +0 -95
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {listInvitationsResponseSchema} from '@shipfox/api-workspaces-dto';
|
|
2
2
|
import {checkedApiRequest} from '@shipfox/client-api';
|
|
3
3
|
import {queryOptions, useQuery} from '@tanstack/react-query';
|
|
4
|
-
import type {
|
|
4
|
+
import type {PendingInvitation} from '#core/membership.js';
|
|
5
5
|
import {toInvitation} from './invitation-mapper.js';
|
|
6
6
|
|
|
7
7
|
export const listInvitationsQueryKey = (workspaceId: string) =>
|
|
8
8
|
['workspaces', workspaceId, 'invitations'] as const;
|
|
9
9
|
|
|
10
|
-
async function listInvitations(workspaceId: string): Promise<
|
|
10
|
+
async function listInvitations(workspaceId: string): Promise<PendingInvitation[]> {
|
|
11
11
|
const response = await checkedApiRequest(
|
|
12
12
|
listInvitationsResponseSchema,
|
|
13
13
|
`/workspaces/${workspaceId}/invitations`,
|
|
@@ -1,17 +1,27 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {useQuery} from '@tanstack/react-query';
|
|
1
|
+
import {listMembersResponseSchema} from '@shipfox/api-workspaces-dto';
|
|
2
|
+
import {checkedApiRequest} from '@shipfox/client-api';
|
|
3
|
+
import {queryOptions, useQuery} from '@tanstack/react-query';
|
|
4
|
+
import type {WorkspaceMember} from '#core/membership.js';
|
|
5
|
+
import {toWorkspaceMember} from './membership-mapper.js';
|
|
4
6
|
|
|
5
7
|
export const listMembersQueryKey = (workspaceId: string) =>
|
|
6
8
|
['workspaces', workspaceId, 'members'] as const;
|
|
7
9
|
|
|
8
|
-
async function listMembers(workspaceId: string): Promise<
|
|
9
|
-
|
|
10
|
+
async function listMembers(workspaceId: string): Promise<WorkspaceMember[]> {
|
|
11
|
+
const response = await checkedApiRequest(
|
|
12
|
+
listMembersResponseSchema,
|
|
13
|
+
`/workspaces/${workspaceId}/members`,
|
|
14
|
+
);
|
|
15
|
+
return response.members.map(toWorkspaceMember);
|
|
10
16
|
}
|
|
11
17
|
|
|
12
|
-
export function
|
|
13
|
-
return
|
|
18
|
+
export function listMembersQueryOptions(workspaceId: string) {
|
|
19
|
+
return queryOptions({
|
|
14
20
|
queryKey: listMembersQueryKey(workspaceId),
|
|
15
21
|
queryFn: () => listMembers(workspaceId),
|
|
16
22
|
});
|
|
17
23
|
}
|
|
24
|
+
|
|
25
|
+
export function useListMembers(workspaceId: string) {
|
|
26
|
+
return useQuery(listMembersQueryOptions(workspaceId));
|
|
27
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {toWorkspaceMember} from './membership-mapper.js';
|
|
2
|
+
|
|
3
|
+
test('maps the member transport response to the package domain model', () => {
|
|
4
|
+
const member = toWorkspaceMember({
|
|
5
|
+
id: 'f87901d8-4a7e-43e7-84f5-a9c73456657f',
|
|
6
|
+
workspace_id: 'ab03cfd0-1845-453b-867c-a661c8e62f13',
|
|
7
|
+
user_id: 'b8d2ab85-9e38-4449-af50-8beaabf058e5',
|
|
8
|
+
user_email: 'member@example.com',
|
|
9
|
+
user_name: 'Noé',
|
|
10
|
+
created_at: '2026-07-22T12:00:00.000Z',
|
|
11
|
+
updated_at: '2026-07-22T12:00:00.000Z',
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
expect(member).toEqual({
|
|
15
|
+
id: 'f87901d8-4a7e-43e7-84f5-a9c73456657f',
|
|
16
|
+
workspaceId: 'ab03cfd0-1845-453b-867c-a661c8e62f13',
|
|
17
|
+
userId: 'b8d2ab85-9e38-4449-af50-8beaabf058e5',
|
|
18
|
+
email: 'member@example.com',
|
|
19
|
+
name: 'Noé',
|
|
20
|
+
role: 'admin',
|
|
21
|
+
joinedAt: '2026-07-22T12:00:00.000Z',
|
|
22
|
+
updatedAt: '2026-07-22T12:00:00.000Z',
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type {MembershipWithUserDto} from '@shipfox/api-workspaces-dto';
|
|
2
|
+
import type {WorkspaceMember} from '#core/membership.js';
|
|
3
|
+
|
|
4
|
+
export function toWorkspaceMember(dto: MembershipWithUserDto): WorkspaceMember {
|
|
5
|
+
return {
|
|
6
|
+
id: dto.id,
|
|
7
|
+
userId: dto.user_id,
|
|
8
|
+
workspaceId: dto.workspace_id,
|
|
9
|
+
email: dto.user_email,
|
|
10
|
+
name: dto.user_name,
|
|
11
|
+
role: 'admin',
|
|
12
|
+
joinedAt: dto.created_at,
|
|
13
|
+
updatedAt: dto.updated_at,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {checkedApiRequest, emptyResponseSchema} from '@shipfox/client-api';
|
|
2
2
|
import {useMutation, useQueryClient} from '@tanstack/react-query';
|
|
3
|
-
import {
|
|
3
|
+
import type {RemoveWorkspaceMemberCommand} from '#core/membership.js';
|
|
4
|
+
import {listMembersQueryOptions} from './list-members.js';
|
|
4
5
|
|
|
5
|
-
async function removeMember(params: {workspaceId: string;
|
|
6
|
-
await
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
async function removeMember(params: {workspaceId: string; command: RemoveWorkspaceMemberCommand}) {
|
|
7
|
+
await checkedApiRequest(
|
|
8
|
+
emptyResponseSchema,
|
|
9
|
+
`/workspaces/${params.workspaceId}/members/${params.command.userId}`,
|
|
10
|
+
{method: 'DELETE'},
|
|
11
|
+
);
|
|
9
12
|
}
|
|
10
13
|
|
|
11
14
|
export function useRemoveMember(workspaceId: string) {
|
|
12
15
|
const queryClient = useQueryClient();
|
|
13
16
|
return useMutation({
|
|
14
|
-
mutationFn: (
|
|
17
|
+
mutationFn: (command: RemoveWorkspaceMemberCommand) => removeMember({workspaceId, command}),
|
|
15
18
|
onSuccess: async () => {
|
|
16
|
-
await queryClient.invalidateQueries(
|
|
19
|
+
await queryClient.invalidateQueries(listMembersQueryOptions(workspaceId));
|
|
17
20
|
},
|
|
18
21
|
});
|
|
19
22
|
}
|
|
@@ -1,17 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {checkedApiRequest, emptyResponseSchema} from '@shipfox/client-api';
|
|
2
2
|
import {useMutation, useQueryClient} from '@tanstack/react-query';
|
|
3
|
+
import type {RevokeInvitationCommand} from '#core/membership.js';
|
|
3
4
|
import {listInvitationsQueryOptions} from './list-invitations.js';
|
|
4
5
|
|
|
5
|
-
async function revokeInvitation(params: {workspaceId: string;
|
|
6
|
-
await
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
async function revokeInvitation(params: {workspaceId: string; command: RevokeInvitationCommand}) {
|
|
7
|
+
await checkedApiRequest(
|
|
8
|
+
emptyResponseSchema,
|
|
9
|
+
`/workspaces/${params.workspaceId}/invitations/${params.command.invitationId}`,
|
|
10
|
+
{
|
|
11
|
+
method: 'DELETE',
|
|
12
|
+
},
|
|
13
|
+
);
|
|
9
14
|
}
|
|
10
15
|
|
|
11
16
|
export function useRevokeInvitation(workspaceId: string) {
|
|
12
17
|
const queryClient = useQueryClient();
|
|
13
18
|
return useMutation({
|
|
14
|
-
mutationFn: (
|
|
19
|
+
mutationFn: (command: RevokeInvitationCommand) => revokeInvitation({workspaceId, command}),
|
|
15
20
|
onSuccess: async () => {
|
|
16
21
|
await queryClient.invalidateQueries(listInvitationsQueryOptions(workspaceId));
|
|
17
22
|
},
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1 @@
|
|
|
1
|
-
export * from './pages/events-settings-page.js';
|
|
2
|
-
export * from './pages/integrations-settings-page.js';
|
|
3
1
|
export * from './pages/members-settings-page.js';
|
|
4
|
-
export * from './pages/model-providers-settings-page.js';
|
|
5
|
-
export * from './pages/provisioners-settings-page.js';
|
|
6
|
-
export * from './pages/runners-settings-page.js';
|
|
7
|
-
export * from './pages/secrets-settings-page.js';
|
|
8
|
-
export * from './pages/variables-settings-page.js';
|
package/test/pages.tsx
CHANGED
|
@@ -22,11 +22,7 @@ const authState: AuthState = {
|
|
|
22
22
|
user: {
|
|
23
23
|
id: '22222222-2222-4222-8222-222222222222',
|
|
24
24
|
email: 'user@example.com',
|
|
25
|
-
|
|
26
|
-
email_verified_at: new Date().toISOString(),
|
|
27
|
-
status: 'active',
|
|
28
|
-
created_at: new Date().toISOString(),
|
|
29
|
-
updated_at: new Date().toISOString(),
|
|
25
|
+
emailVerifiedAt: new Date().toISOString(),
|
|
30
26
|
},
|
|
31
27
|
workspaces: [{id: WORKSPACE_SETTINGS_TEST_WID, name: 'Acme', membershipId: 'm-1'}],
|
|
32
28
|
};
|