@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.
Files changed (147) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +51 -0
  3. package/dist/components/members/form-errors.d.ts +1 -0
  4. package/dist/components/members/form-errors.d.ts.map +1 -1
  5. package/dist/components/members/form-errors.js +26 -13
  6. package/dist/components/members/form-errors.js.map +1 -1
  7. package/dist/components/members/workspace-members-section.d.ts.map +1 -1
  8. package/dist/components/members/workspace-members-section.js +31 -28
  9. package/dist/components/members/workspace-members-section.js.map +1 -1
  10. package/dist/core/membership.d.ts +41 -0
  11. package/dist/core/membership.d.ts.map +1 -0
  12. package/dist/core/membership.js +16 -0
  13. package/dist/core/membership.js.map +1 -0
  14. package/dist/feature.d.ts +15 -72
  15. package/dist/feature.d.ts.map +1 -1
  16. package/dist/feature.js +20 -102
  17. package/dist/feature.js.map +1 -1
  18. package/dist/hooks/api/create-invitation.d.ts +4 -2
  19. package/dist/hooks/api/create-invitation.d.ts.map +1 -1
  20. package/dist/hooks/api/create-invitation.js +6 -3
  21. package/dist/hooks/api/create-invitation.js.map +1 -1
  22. package/dist/hooks/api/invitation-mapper.d.ts +2 -2
  23. package/dist/hooks/api/invitation-mapper.d.ts.map +1 -1
  24. package/dist/hooks/api/invitation-mapper.js.map +1 -1
  25. package/dist/hooks/api/list-invitations.d.ts +5 -5
  26. package/dist/hooks/api/list-invitations.d.ts.map +1 -1
  27. package/dist/hooks/api/list-invitations.js.map +1 -1
  28. package/dist/hooks/api/list-members.d.ts +10 -11
  29. package/dist/hooks/api/list-members.d.ts.map +1 -1
  30. package/dist/hooks/api/list-members.js +11 -5
  31. package/dist/hooks/api/list-members.js.map +1 -1
  32. package/dist/hooks/api/membership-mapper.d.ts +4 -0
  33. package/dist/hooks/api/membership-mapper.d.ts.map +1 -0
  34. package/dist/hooks/api/membership-mapper.js +14 -0
  35. package/dist/hooks/api/membership-mapper.js.map +1 -0
  36. package/dist/hooks/api/remove-member.d.ts +2 -1
  37. package/dist/hooks/api/remove-member.d.ts.map +1 -1
  38. package/dist/hooks/api/remove-member.js +6 -8
  39. package/dist/hooks/api/remove-member.js.map +1 -1
  40. package/dist/hooks/api/revoke-invitation.d.ts +2 -1
  41. package/dist/hooks/api/revoke-invitation.d.ts.map +1 -1
  42. package/dist/hooks/api/revoke-invitation.js +4 -4
  43. package/dist/hooks/api/revoke-invitation.js.map +1 -1
  44. package/dist/index.d.ts +0 -7
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +0 -7
  47. package/dist/index.js.map +1 -1
  48. package/dist/tsconfig.test.tsbuildinfo +1 -1
  49. package/package.json +10 -16
  50. package/src/components/members/form-errors.test.ts +57 -4
  51. package/src/components/members/form-errors.ts +21 -10
  52. package/src/components/members/workspace-members-section.tsx +38 -35
  53. package/src/core/membership.test.ts +69 -0
  54. package/src/core/membership.ts +64 -0
  55. package/src/feature.ts +27 -104
  56. package/src/hooks/api/create-invitation.ts +8 -4
  57. package/src/hooks/api/invitation-mapper.ts +2 -2
  58. package/src/hooks/api/list-invitations.ts +2 -2
  59. package/src/hooks/api/list-members.ts +17 -7
  60. package/src/hooks/api/membership-mapper.test.ts +24 -0
  61. package/src/hooks/api/membership-mapper.ts +15 -0
  62. package/src/hooks/api/remove-member.ts +11 -8
  63. package/src/hooks/api/revoke-invitation.ts +11 -6
  64. package/src/index.ts +0 -7
  65. package/test/pages.tsx +1 -5
  66. package/tsconfig.build.tsbuildinfo +1 -1
  67. package/dist/core/invitation.d.ts +0 -15
  68. package/dist/core/invitation.d.ts.map +0 -1
  69. package/dist/core/invitation.js +0 -3
  70. package/dist/core/invitation.js.map +0 -1
  71. package/dist/pages/events-settings-page.d.ts +0 -2
  72. package/dist/pages/events-settings-page.d.ts.map +0 -1
  73. package/dist/pages/events-settings-page.js +0 -30
  74. package/dist/pages/events-settings-page.js.map +0 -1
  75. package/dist/pages/integrations-settings-page.d.ts +0 -2
  76. package/dist/pages/integrations-settings-page.d.ts.map +0 -1
  77. package/dist/pages/integrations-settings-page.js +0 -10
  78. package/dist/pages/integrations-settings-page.js.map +0 -1
  79. package/dist/pages/model-providers-settings-page.d.ts +0 -2
  80. package/dist/pages/model-providers-settings-page.d.ts.map +0 -1
  81. package/dist/pages/model-providers-settings-page.js +0 -20
  82. package/dist/pages/model-providers-settings-page.js.map +0 -1
  83. package/dist/pages/provisioners-settings-page.d.ts +0 -2
  84. package/dist/pages/provisioners-settings-page.d.ts.map +0 -1
  85. package/dist/pages/provisioners-settings-page.js +0 -14
  86. package/dist/pages/provisioners-settings-page.js.map +0 -1
  87. package/dist/pages/runners-settings-page.d.ts +0 -2
  88. package/dist/pages/runners-settings-page.d.ts.map +0 -1
  89. package/dist/pages/runners-settings-page.js +0 -14
  90. package/dist/pages/runners-settings-page.js.map +0 -1
  91. package/dist/pages/secrets-settings-page.d.ts +0 -2
  92. package/dist/pages/secrets-settings-page.d.ts.map +0 -1
  93. package/dist/pages/secrets-settings-page.js +0 -14
  94. package/dist/pages/secrets-settings-page.js.map +0 -1
  95. package/dist/pages/variables-settings-page.d.ts +0 -2
  96. package/dist/pages/variables-settings-page.d.ts.map +0 -1
  97. package/dist/pages/variables-settings-page.js +0 -14
  98. package/dist/pages/variables-settings-page.js.map +0 -1
  99. package/dist/routes/agents.d.ts +0 -6
  100. package/dist/routes/agents.d.ts.map +0 -1
  101. package/dist/routes/agents.js +0 -7
  102. package/dist/routes/agents.js.map +0 -1
  103. package/dist/routes/events.d.ts +0 -8
  104. package/dist/routes/events.d.ts.map +0 -1
  105. package/dist/routes/events.js +0 -9
  106. package/dist/routes/events.js.map +0 -1
  107. package/dist/routes/integrations.d.ts +0 -6
  108. package/dist/routes/integrations.d.ts.map +0 -1
  109. package/dist/routes/integrations.js +0 -7
  110. package/dist/routes/integrations.js.map +0 -1
  111. package/dist/routes/provisioners.d.ts +0 -6
  112. package/dist/routes/provisioners.d.ts.map +0 -1
  113. package/dist/routes/provisioners.js +0 -7
  114. package/dist/routes/provisioners.js.map +0 -1
  115. package/dist/routes/runners.d.ts +0 -6
  116. package/dist/routes/runners.d.ts.map +0 -1
  117. package/dist/routes/runners.js +0 -7
  118. package/dist/routes/runners.js.map +0 -1
  119. package/dist/routes/secrets.d.ts +0 -6
  120. package/dist/routes/secrets.d.ts.map +0 -1
  121. package/dist/routes/secrets.js +0 -7
  122. package/dist/routes/secrets.js.map +0 -1
  123. package/dist/routes/variables.d.ts +0 -6
  124. package/dist/routes/variables.d.ts.map +0 -1
  125. package/dist/routes/variables.js +0 -7
  126. package/dist/routes/variables.js.map +0 -1
  127. package/src/core/invitation.ts +0 -15
  128. package/src/pages/events-settings-page.tsx +0 -25
  129. package/src/pages/integrations-settings-page.test.tsx +0 -72
  130. package/src/pages/integrations-settings-page.tsx +0 -6
  131. package/src/pages/model-providers-settings-page.test.tsx +0 -48
  132. package/src/pages/model-providers-settings-page.tsx +0 -15
  133. package/src/pages/provisioners-settings-page.test.tsx +0 -29
  134. package/src/pages/provisioners-settings-page.tsx +0 -14
  135. package/src/pages/runners-settings-page.test.tsx +0 -23
  136. package/src/pages/runners-settings-page.tsx +0 -14
  137. package/src/pages/secrets-settings-page.tsx +0 -14
  138. package/src/pages/variables-settings-page.tsx +0 -14
  139. package/src/routes/agents.tsx +0 -3
  140. package/src/routes/events.tsx +0 -7
  141. package/src/routes/integrations.tsx +0 -3
  142. package/src/routes/provisioners.tsx +0 -3
  143. package/src/routes/runners.tsx +0 -3
  144. package/src/routes/secrets.tsx +0 -3
  145. package/src/routes/variables.tsx +0 -3
  146. package/test/typecheck/route-ids.tsx +0 -7
  147. 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 {Invitation} from '#core/invitation.js';
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<Invitation[]> {
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 type {ListMembersResponseDto} from '@shipfox/api-workspaces-dto';
2
- import {apiRequest} from '@shipfox/client-api';
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<ListMembersResponseDto> {
9
- return await apiRequest<ListMembersResponseDto>(`/workspaces/${workspaceId}/members`);
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 useListMembers(workspaceId: string) {
13
- return useQuery({
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 {apiRequest} from '@shipfox/client-api';
1
+ import {checkedApiRequest, emptyResponseSchema} from '@shipfox/client-api';
2
2
  import {useMutation, useQueryClient} from '@tanstack/react-query';
3
- import {listMembersQueryKey} from './list-members.js';
3
+ import type {RemoveWorkspaceMemberCommand} from '#core/membership.js';
4
+ import {listMembersQueryOptions} from './list-members.js';
4
5
 
5
- async function removeMember(params: {workspaceId: string; userId: string}) {
6
- await apiRequest<void>(`/workspaces/${params.workspaceId}/members/${params.userId}`, {
7
- method: 'DELETE',
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: (userId: string) => removeMember({workspaceId, userId}),
17
+ mutationFn: (command: RemoveWorkspaceMemberCommand) => removeMember({workspaceId, command}),
15
18
  onSuccess: async () => {
16
- await queryClient.invalidateQueries({queryKey: listMembersQueryKey(workspaceId)});
19
+ await queryClient.invalidateQueries(listMembersQueryOptions(workspaceId));
17
20
  },
18
21
  });
19
22
  }
@@ -1,17 +1,22 @@
1
- import {apiRequest} from '@shipfox/client-api';
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; invitationId: string}) {
6
- await apiRequest<void>(`/workspaces/${params.workspaceId}/invitations/${params.invitationId}`, {
7
- method: 'DELETE',
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: (invitationId: string) => revokeInvitation({workspaceId, invitationId}),
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
- name: null,
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
  };