@shipfox/client-workspace-settings 22.0.3 → 23.0.0
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 +12 -0
- package/dist/components/show-setup-guide-link.d.ts +4 -0
- package/dist/components/show-setup-guide-link.d.ts.map +1 -0
- package/dist/components/show-setup-guide-link.js +59 -0
- package/dist/components/show-setup-guide-link.js.map +1 -0
- package/dist/hooks/api/list-invitations.d.ts +4 -8
- 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 +4 -8
- package/dist/hooks/api/list-members.d.ts.map +1 -1
- package/dist/hooks/api/list-members.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/pages/general-settings-page.d.ts.map +1 -1
- package/dist/pages/general-settings-page.js +4 -0
- package/dist/pages/general-settings-page.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/components/show-setup-guide-link.test.tsx +69 -0
- package/src/components/show-setup-guide-link.tsx +66 -0
- package/src/hooks/api/list-invitations.ts +9 -2
- package/src/hooks/api/list-members.ts +9 -2
- package/src/index.ts +2 -0
- package/src/pages/general-settings-page.tsx +3 -0
- package/src/public-api.test.ts +27 -0
- package/tsconfig.build.tsbuildinfo +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
$ shipfox-swc
|
|
2
|
-
Successfully compiled:
|
|
2
|
+
Successfully compiled: 20 files with swc (495.31ms)
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @shipfox/client-workspace-settings
|
|
2
2
|
|
|
3
|
+
## 23.0.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 8f6b6e5: Exports the membership and invitation query options (and their query keys) from the package surface, and adds a "Show the setup guide" re-entry link to the general settings page that clears the shell-owned setup-checklist dismissal flag.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [693e656]
|
|
12
|
+
- @shipfox/client-shell@23.0.0
|
|
13
|
+
- @shipfox/client-auth@23.0.0
|
|
14
|
+
|
|
3
15
|
## 22.0.3
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show-setup-guide-link.d.ts","sourceRoot":"","sources":["../../src/components/show-setup-guide-link.tsx"],"names":[],"mappings":"AASA,wBAAgB,kBAAkB,CAAC,EAAC,WAAW,EAAC,EAAE;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,sCAwDtE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { clearWorkspaceSetupChecklistDismissal, isWorkspaceSetupChecklistDismissed } from '@shipfox/client-shell/runtime';
|
|
3
|
+
import { ButtonLink } from '@shipfox/react-ui/button';
|
|
4
|
+
import { useEffect, useRef, useState } from 'react';
|
|
5
|
+
const SETUP_GUIDE_REOPENED_MESSAGE = 'The setup guide will appear on the Projects page.';
|
|
6
|
+
export function ShowSetupGuideLink({ workspaceId }) {
|
|
7
|
+
const [dismissed, setDismissed] = useState(()=>isWorkspaceSetupChecklistDismissed(workspaceId));
|
|
8
|
+
const [statusMessage, setStatusMessage] = useState();
|
|
9
|
+
const statusRef = useRef(null);
|
|
10
|
+
useEffect(()=>{
|
|
11
|
+
const refreshDismissal = ()=>{
|
|
12
|
+
const nextDismissed = isWorkspaceSetupChecklistDismissed(workspaceId);
|
|
13
|
+
setDismissed(nextDismissed);
|
|
14
|
+
if (nextDismissed) setStatusMessage(undefined);
|
|
15
|
+
};
|
|
16
|
+
refreshDismissal();
|
|
17
|
+
window.addEventListener('focus', refreshDismissal);
|
|
18
|
+
window.addEventListener('storage', refreshDismissal);
|
|
19
|
+
return ()=>{
|
|
20
|
+
window.removeEventListener('focus', refreshDismissal);
|
|
21
|
+
window.removeEventListener('storage', refreshDismissal);
|
|
22
|
+
};
|
|
23
|
+
}, [
|
|
24
|
+
workspaceId
|
|
25
|
+
]);
|
|
26
|
+
useEffect(()=>{
|
|
27
|
+
if (statusMessage) statusRef.current?.focus();
|
|
28
|
+
}, [
|
|
29
|
+
statusMessage
|
|
30
|
+
]);
|
|
31
|
+
if (!dismissed && !statusMessage) return null;
|
|
32
|
+
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
33
|
+
children: [
|
|
34
|
+
dismissed ? /*#__PURE__*/ _jsx(ButtonLink, {
|
|
35
|
+
asChild: true,
|
|
36
|
+
variant: "interactive",
|
|
37
|
+
underline: true,
|
|
38
|
+
children: /*#__PURE__*/ _jsx("button", {
|
|
39
|
+
type: "button",
|
|
40
|
+
onClick: ()=>{
|
|
41
|
+
clearWorkspaceSetupChecklistDismissal(workspaceId);
|
|
42
|
+
setDismissed(false);
|
|
43
|
+
setStatusMessage(SETUP_GUIDE_REOPENED_MESSAGE);
|
|
44
|
+
},
|
|
45
|
+
children: "Show the setup guide"
|
|
46
|
+
})
|
|
47
|
+
}) : null,
|
|
48
|
+
statusMessage ? /*#__PURE__*/ _jsx("p", {
|
|
49
|
+
ref: statusRef,
|
|
50
|
+
role: "status",
|
|
51
|
+
tabIndex: -1,
|
|
52
|
+
className: "text-sm text-foreground-neutral-muted outline-none",
|
|
53
|
+
children: statusMessage
|
|
54
|
+
}) : null
|
|
55
|
+
]
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=show-setup-guide-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/show-setup-guide-link.tsx"],"sourcesContent":["import {\n clearWorkspaceSetupChecklistDismissal,\n isWorkspaceSetupChecklistDismissed,\n} from '@shipfox/client-shell/runtime';\nimport {ButtonLink} from '@shipfox/react-ui/button';\nimport {useEffect, useRef, useState} from 'react';\n\nconst SETUP_GUIDE_REOPENED_MESSAGE = 'The setup guide will appear on the Projects page.';\n\nexport function ShowSetupGuideLink({workspaceId}: {workspaceId: string}) {\n const [dismissed, setDismissed] = useState(() => isWorkspaceSetupChecklistDismissed(workspaceId));\n const [statusMessage, setStatusMessage] = useState<string>();\n const statusRef = useRef<HTMLParagraphElement>(null);\n\n useEffect(() => {\n const refreshDismissal = () => {\n const nextDismissed = isWorkspaceSetupChecklistDismissed(workspaceId);\n setDismissed(nextDismissed);\n if (nextDismissed) setStatusMessage(undefined);\n };\n\n refreshDismissal();\n window.addEventListener('focus', refreshDismissal);\n window.addEventListener('storage', refreshDismissal);\n\n return () => {\n window.removeEventListener('focus', refreshDismissal);\n window.removeEventListener('storage', refreshDismissal);\n };\n }, [workspaceId]);\n\n useEffect(() => {\n if (statusMessage) statusRef.current?.focus();\n }, [statusMessage]);\n\n if (!dismissed && !statusMessage) return null;\n\n return (\n <>\n {dismissed ? (\n <ButtonLink asChild variant=\"interactive\" underline>\n <button\n type=\"button\"\n onClick={() => {\n clearWorkspaceSetupChecklistDismissal(workspaceId);\n setDismissed(false);\n setStatusMessage(SETUP_GUIDE_REOPENED_MESSAGE);\n }}\n >\n Show the setup guide\n </button>\n </ButtonLink>\n ) : null}\n {statusMessage ? (\n <p\n ref={statusRef}\n role=\"status\"\n tabIndex={-1}\n className=\"text-sm text-foreground-neutral-muted outline-none\"\n >\n {statusMessage}\n </p>\n ) : null}\n </>\n );\n}\n"],"names":["clearWorkspaceSetupChecklistDismissal","isWorkspaceSetupChecklistDismissed","ButtonLink","useEffect","useRef","useState","SETUP_GUIDE_REOPENED_MESSAGE","ShowSetupGuideLink","workspaceId","dismissed","setDismissed","statusMessage","setStatusMessage","statusRef","refreshDismissal","nextDismissed","undefined","window","addEventListener","removeEventListener","current","focus","asChild","variant","underline","button","type","onClick","p","ref","role","tabIndex","className"],"mappings":";AAAA,SACEA,qCAAqC,EACrCC,kCAAkC,QAC7B,gCAAgC;AACvC,SAAQC,UAAU,QAAO,2BAA2B;AACpD,SAAQC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAO,QAAQ;AAElD,MAAMC,+BAA+B;AAErC,OAAO,SAASC,mBAAmB,EAACC,WAAW,EAAwB;IACrE,MAAM,CAACC,WAAWC,aAAa,GAAGL,SAAS,IAAMJ,mCAAmCO;IACpF,MAAM,CAACG,eAAeC,iBAAiB,GAAGP;IAC1C,MAAMQ,YAAYT,OAA6B;IAE/CD,UAAU;QACR,MAAMW,mBAAmB;YACvB,MAAMC,gBAAgBd,mCAAmCO;YACzDE,aAAaK;YACb,IAAIA,eAAeH,iBAAiBI;QACtC;QAEAF;QACAG,OAAOC,gBAAgB,CAAC,SAASJ;QACjCG,OAAOC,gBAAgB,CAAC,WAAWJ;QAEnC,OAAO;YACLG,OAAOE,mBAAmB,CAAC,SAASL;YACpCG,OAAOE,mBAAmB,CAAC,WAAWL;QACxC;IACF,GAAG;QAACN;KAAY;IAEhBL,UAAU;QACR,IAAIQ,eAAeE,UAAUO,OAAO,EAAEC;IACxC,GAAG;QAACV;KAAc;IAElB,IAAI,CAACF,aAAa,CAACE,eAAe,OAAO;IAEzC,qBACE;;YACGF,0BACC,KAACP;gBAAWoB,OAAO;gBAACC,SAAQ;gBAAcC,SAAS;0BACjD,cAAA,KAACC;oBACCC,MAAK;oBACLC,SAAS;wBACP3B,sCAAsCQ;wBACtCE,aAAa;wBACbE,iBAAiBN;oBACnB;8BACD;;iBAID;YACHK,8BACC,KAACiB;gBACCC,KAAKhB;gBACLiB,MAAK;gBACLC,UAAU,CAAC;gBACXC,WAAU;0BAETrB;iBAED;;;AAGV"}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
+
import { type UseQueryOptions } from '@tanstack/react-query';
|
|
1
2
|
import type { PendingInvitation } from '#core/membership.js';
|
|
2
3
|
export declare const listInvitationsQueryKey: (workspaceId: string) => readonly ['workspaces', string, 'invitations'];
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} & {
|
|
6
|
-
queryKey: readonly ["workspaces", string, "invitations"] & {
|
|
7
|
-
[dataTagSymbol]: PendingInvitation[];
|
|
8
|
-
[dataTagErrorSymbol]: Error;
|
|
9
|
-
};
|
|
10
|
-
};
|
|
4
|
+
type ListInvitationsQueryOptions = UseQueryOptions<PendingInvitation[], Error, PendingInvitation[], ReturnType<typeof listInvitationsQueryKey>>;
|
|
5
|
+
export declare function listInvitationsQueryOptions(workspaceId: string): ListInvitationsQueryOptions;
|
|
11
6
|
export declare function useListInvitations(workspaceId: string): import("@tanstack/react-query").UseQueryResult<NoInfer<PendingInvitation[]>, Error>;
|
|
7
|
+
export {};
|
|
12
8
|
//# sourceMappingURL=list-invitations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-invitations.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/list-invitations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-invitations.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/list-invitations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,eAAe,EAAW,MAAM,uBAAuB,CAAC;AACnF,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AAG3D,eAAO,MAAM,uBAAuB,gBAAiB,MAAM,eACxD,YAAY,UAAe,aAAa,CAAU,CAAC;AAEtD,KAAK,2BAA2B,GAAG,eAAe,CAChD,iBAAiB,EAAE,EACnB,KAAK,EACL,iBAAiB,EAAE,EACnB,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAC3C,CAAC;AAUF,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,2BAA2B,CAK5F;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,uFAErD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/api/list-invitations.ts"],"sourcesContent":["import {listInvitationsResponseSchema} from '@shipfox/api-workspaces-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {queryOptions, useQuery} from '@tanstack/react-query';\nimport type {PendingInvitation} from '#core/membership.js';\nimport {toInvitation} from './invitation-mapper.js';\n\nexport const listInvitationsQueryKey = (workspaceId: string) =>\n ['workspaces', workspaceId, 'invitations'] as const;\n\nasync function listInvitations(workspaceId: string): Promise<PendingInvitation[]> {\n const response = await checkedApiRequest(\n listInvitationsResponseSchema,\n `/workspaces/${workspaceId}/invitations`,\n );\n return response.invitations.map(toInvitation);\n}\n\nexport function listInvitationsQueryOptions(workspaceId: string) {\n return queryOptions({\n queryKey: listInvitationsQueryKey(workspaceId),\n queryFn: () => listInvitations(workspaceId),\n });\n}\n\nexport function useListInvitations(workspaceId: string) {\n return useQuery(listInvitationsQueryOptions(workspaceId));\n}\n"],"names":["listInvitationsResponseSchema","checkedApiRequest","queryOptions","useQuery","toInvitation","listInvitationsQueryKey","workspaceId","listInvitations","response","invitations","map","listInvitationsQueryOptions","queryKey","queryFn","useListInvitations"],"mappings":"AAAA,SAAQA,6BAA6B,QAAO,8BAA8B;AAC1E,SAAQC,iBAAiB,QAAO,sBAAsB;AACtD,SAAQC,YAAY,
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/api/list-invitations.ts"],"sourcesContent":["import {listInvitationsResponseSchema} from '@shipfox/api-workspaces-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {queryOptions, type UseQueryOptions, useQuery} from '@tanstack/react-query';\nimport type {PendingInvitation} from '#core/membership.js';\nimport {toInvitation} from './invitation-mapper.js';\n\nexport const listInvitationsQueryKey = (workspaceId: string) =>\n ['workspaces', workspaceId, 'invitations'] as const;\n\ntype ListInvitationsQueryOptions = UseQueryOptions<\n PendingInvitation[],\n Error,\n PendingInvitation[],\n ReturnType<typeof listInvitationsQueryKey>\n>;\n\nasync function listInvitations(workspaceId: string): Promise<PendingInvitation[]> {\n const response = await checkedApiRequest(\n listInvitationsResponseSchema,\n `/workspaces/${workspaceId}/invitations`,\n );\n return response.invitations.map(toInvitation);\n}\n\nexport function listInvitationsQueryOptions(workspaceId: string): ListInvitationsQueryOptions {\n return queryOptions({\n queryKey: listInvitationsQueryKey(workspaceId),\n queryFn: () => listInvitations(workspaceId),\n });\n}\n\nexport function useListInvitations(workspaceId: string) {\n return useQuery(listInvitationsQueryOptions(workspaceId));\n}\n"],"names":["listInvitationsResponseSchema","checkedApiRequest","queryOptions","useQuery","toInvitation","listInvitationsQueryKey","workspaceId","listInvitations","response","invitations","map","listInvitationsQueryOptions","queryKey","queryFn","useListInvitations"],"mappings":"AAAA,SAAQA,6BAA6B,QAAO,8BAA8B;AAC1E,SAAQC,iBAAiB,QAAO,sBAAsB;AACtD,SAAQC,YAAY,EAAwBC,QAAQ,QAAO,wBAAwB;AAEnF,SAAQC,YAAY,QAAO,yBAAyB;AAEpD,OAAO,MAAMC,0BAA0B,CAACC,cACtC;QAAC;QAAcA;QAAa;KAAc,CAAU;AAStD,eAAeC,gBAAgBD,WAAmB;IAChD,MAAME,WAAW,MAAMP,kBACrBD,+BACA,CAAC,YAAY,EAAEM,YAAY,YAAY,CAAC;IAE1C,OAAOE,SAASC,WAAW,CAACC,GAAG,CAACN;AAClC;AAEA,OAAO,SAASO,4BAA4BL,WAAmB;IAC7D,OAAOJ,aAAa;QAClBU,UAAUP,wBAAwBC;QAClCO,SAAS,IAAMN,gBAAgBD;IACjC;AACF;AAEA,OAAO,SAASQ,mBAAmBR,WAAmB;IACpD,OAAOH,SAASQ,4BAA4BL;AAC9C"}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
+
import { type UseQueryOptions } from '@tanstack/react-query';
|
|
1
2
|
import type { WorkspaceMember } from '#core/membership.js';
|
|
2
3
|
export declare const listMembersQueryKey: (workspaceId: string) => readonly ['workspaces', string, 'members'];
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} & {
|
|
6
|
-
queryKey: readonly ["workspaces", string, "members"] & {
|
|
7
|
-
[dataTagSymbol]: WorkspaceMember[];
|
|
8
|
-
[dataTagErrorSymbol]: Error;
|
|
9
|
-
};
|
|
10
|
-
};
|
|
4
|
+
type ListMembersQueryOptions = UseQueryOptions<WorkspaceMember[], Error, WorkspaceMember[], ReturnType<typeof listMembersQueryKey>>;
|
|
5
|
+
export declare function listMembersQueryOptions(workspaceId: string): ListMembersQueryOptions;
|
|
11
6
|
export declare function useListMembers(workspaceId: string): import("@tanstack/react-query").UseQueryResult<NoInfer<WorkspaceMember[]>, Error>;
|
|
7
|
+
export {};
|
|
12
8
|
//# sourceMappingURL=list-members.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-members.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/list-members.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-members.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/list-members.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,eAAe,EAAW,MAAM,uBAAuB,CAAC;AACnF,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,qBAAqB,CAAC;AAGzD,eAAO,MAAM,mBAAmB,gBAAiB,MAAM,eACpD,YAAY,UAAe,SAAS,CAAU,CAAC;AAElD,KAAK,uBAAuB,GAAG,eAAe,CAC5C,eAAe,EAAE,EACjB,KAAK,EACL,eAAe,EAAE,EACjB,UAAU,CAAC,OAAO,mBAAmB,CAAC,CACvC,CAAC;AAUF,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,uBAAuB,CAKpF;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,qFAEjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/api/list-members.ts"],"sourcesContent":["import {listMembersResponseSchema} from '@shipfox/api-workspaces-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {queryOptions, useQuery} from '@tanstack/react-query';\nimport type {WorkspaceMember} from '#core/membership.js';\nimport {toWorkspaceMember} from './membership-mapper.js';\n\nexport const listMembersQueryKey = (workspaceId: string) =>\n ['workspaces', workspaceId, 'members'] as const;\n\nasync function listMembers(workspaceId: string): Promise<WorkspaceMember[]> {\n const response = await checkedApiRequest(\n listMembersResponseSchema,\n `/workspaces/${workspaceId}/members`,\n );\n return response.members.map(toWorkspaceMember);\n}\n\nexport function listMembersQueryOptions(workspaceId: string) {\n return queryOptions({\n queryKey: listMembersQueryKey(workspaceId),\n queryFn: () => listMembers(workspaceId),\n });\n}\n\nexport function useListMembers(workspaceId: string) {\n return useQuery(listMembersQueryOptions(workspaceId));\n}\n"],"names":["listMembersResponseSchema","checkedApiRequest","queryOptions","useQuery","toWorkspaceMember","listMembersQueryKey","workspaceId","listMembers","response","members","map","listMembersQueryOptions","queryKey","queryFn","useListMembers"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,8BAA8B;AACtE,SAAQC,iBAAiB,QAAO,sBAAsB;AACtD,SAAQC,YAAY,
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/api/list-members.ts"],"sourcesContent":["import {listMembersResponseSchema} from '@shipfox/api-workspaces-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {queryOptions, type UseQueryOptions, useQuery} from '@tanstack/react-query';\nimport type {WorkspaceMember} from '#core/membership.js';\nimport {toWorkspaceMember} from './membership-mapper.js';\n\nexport const listMembersQueryKey = (workspaceId: string) =>\n ['workspaces', workspaceId, 'members'] as const;\n\ntype ListMembersQueryOptions = UseQueryOptions<\n WorkspaceMember[],\n Error,\n WorkspaceMember[],\n ReturnType<typeof listMembersQueryKey>\n>;\n\nasync function listMembers(workspaceId: string): Promise<WorkspaceMember[]> {\n const response = await checkedApiRequest(\n listMembersResponseSchema,\n `/workspaces/${workspaceId}/members`,\n );\n return response.members.map(toWorkspaceMember);\n}\n\nexport function listMembersQueryOptions(workspaceId: string): ListMembersQueryOptions {\n return queryOptions({\n queryKey: listMembersQueryKey(workspaceId),\n queryFn: () => listMembers(workspaceId),\n });\n}\n\nexport function useListMembers(workspaceId: string) {\n return useQuery(listMembersQueryOptions(workspaceId));\n}\n"],"names":["listMembersResponseSchema","checkedApiRequest","queryOptions","useQuery","toWorkspaceMember","listMembersQueryKey","workspaceId","listMembers","response","members","map","listMembersQueryOptions","queryKey","queryFn","useListMembers"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,8BAA8B;AACtE,SAAQC,iBAAiB,QAAO,sBAAsB;AACtD,SAAQC,YAAY,EAAwBC,QAAQ,QAAO,wBAAwB;AAEnF,SAAQC,iBAAiB,QAAO,yBAAyB;AAEzD,OAAO,MAAMC,sBAAsB,CAACC,cAClC;QAAC;QAAcA;QAAa;KAAU,CAAU;AASlD,eAAeC,YAAYD,WAAmB;IAC5C,MAAME,WAAW,MAAMP,kBACrBD,2BACA,CAAC,YAAY,EAAEM,YAAY,QAAQ,CAAC;IAEtC,OAAOE,SAASC,OAAO,CAACC,GAAG,CAACN;AAC9B;AAEA,OAAO,SAASO,wBAAwBL,WAAmB;IACzD,OAAOJ,aAAa;QAClBU,UAAUP,oBAAoBC;QAC9BO,SAAS,IAAMN,YAAYD;IAC7B;AACF;AAEA,OAAO,SAASQ,eAAeR,WAAmB;IAChD,OAAOH,SAASQ,wBAAwBL;AAC1C"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './pages/members-settings-page.js';\n"],"names":[],"mappings":"AAAA,cAAc,mCAAmC"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './hooks/api/list-invitations.js';\nexport * from './hooks/api/list-members.js';\nexport * from './pages/members-settings-page.js';\n"],"names":[],"mappings":"AAAA,cAAc,kCAAkC;AAChD,cAAc,8BAA8B;AAC5C,cAAc,mCAAmC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"general-settings-page.d.ts","sourceRoot":"","sources":["../../src/pages/general-settings-page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"general-settings-page.d.ts","sourceRoot":"","sources":["../../src/pages/general-settings-page.tsx"],"names":[],"mappings":"AA6BA,wBAAgB,mBAAmB,gCAWlC"}
|
|
@@ -12,6 +12,7 @@ import { useForm } from '@tanstack/react-form';
|
|
|
12
12
|
import { useNavigate } from '@tanstack/react-router';
|
|
13
13
|
import { useState } from 'react';
|
|
14
14
|
import { workspaceGeneralErrorToFormError } from '#components/general/form-errors.js';
|
|
15
|
+
import { ShowSetupGuideLink } from '#components/show-setup-guide-link.js';
|
|
15
16
|
import { WorkspaceSettingsShell } from '#components/workspace-settings-shell.js';
|
|
16
17
|
function isSlugValid(value) {
|
|
17
18
|
return createWorkspaceBodySchema.shape.slug.safeParse(value).success;
|
|
@@ -170,6 +171,9 @@ function WorkspaceGeneralForm({ workspace }) {
|
|
|
170
171
|
})
|
|
171
172
|
]
|
|
172
173
|
})
|
|
174
|
+
}),
|
|
175
|
+
/*#__PURE__*/ _jsx(ShowSetupGuideLink, {
|
|
176
|
+
workspaceId: workspace.id
|
|
173
177
|
})
|
|
174
178
|
]
|
|
175
179
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pages/general-settings-page.tsx"],"sourcesContent":["import {createWorkspaceBodySchema} from '@shipfox/api-workspaces-dto';\nimport {\n checkWorkspaceSlugAvailability,\n type useActiveWorkspace,\n useUpdateWorkspaceMutation,\n} from '@shipfox/client-auth';\nimport {displayNameFieldError, SlugChangeWarning, SlugField} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {Panel, PanelBody} from '@shipfox/react-ui/panel';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Header} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useNavigate} from '@tanstack/react-router';\nimport {useState} from 'react';\nimport {workspaceGeneralErrorToFormError} from '#components/general/form-errors.js';\nimport {WorkspaceSettingsShell} from '#components/workspace-settings-shell.js';\n\ninterface WorkspaceGeneralValues {\n name: string;\n slug: string;\n}\n\nfunction isSlugValid(value: string): boolean {\n return createWorkspaceBodySchema.shape.slug.safeParse(value).success;\n}\n\nexport function GeneralSettingsPage() {\n return (\n <WorkspaceSettingsShell>\n {(workspace) => (\n <WorkspaceGeneralForm\n key={`${workspace.id}:${workspace.name}:${workspace.slug}`}\n workspace={workspace}\n />\n )}\n </WorkspaceSettingsShell>\n );\n}\n\nfunction WorkspaceGeneralForm({workspace}: {workspace: ReturnType<typeof useActiveWorkspace>}) {\n const updateWorkspace = useUpdateWorkspaceMutation();\n const navigate = useNavigate();\n const [warningOpen, setWarningOpen] = useState(false);\n const [pendingValues, setPendingValues] = useState<WorkspaceGeneralValues>();\n const [formError, setFormError] = useState<string>();\n\n const form = useForm({\n defaultValues: {name: workspace.name, slug: workspace.slug},\n onSubmit: async ({value}) => {\n if (value.slug !== workspace.slug) {\n setPendingValues(value);\n setWarningOpen(true);\n return;\n }\n await save(value);\n },\n });\n\n async function save(values: WorkspaceGeneralValues) {\n setFormError(undefined);\n const nameChanged = values.name !== workspace.name;\n const slugChanged = values.slug !== workspace.slug;\n if (!nameChanged && !slugChanged) return;\n const command = {\n workspaceId: workspace.id,\n ...(nameChanged ? {name: values.name} : {}),\n ...(slugChanged ? {slug: values.slug} : {}),\n };\n\n try {\n const updated = await updateWorkspace.mutateAsync(command);\n setPendingValues(undefined);\n setWarningOpen(false);\n toast.success('Workspace settings saved.');\n await navigate({\n to: '/w/$workspaceSlug/settings/general',\n params: {workspaceSlug: updated.slug},\n });\n } catch (error) {\n setPendingValues(undefined);\n setWarningOpen(false);\n const mapped = workspaceGeneralErrorToFormError(error);\n if (mapped.kind === 'field') {\n form.setFieldMeta(mapped.field, (previous) => ({\n ...previous,\n errorMap: {...previous.errorMap, onServer: mapped.message},\n }));\n } else {\n setFormError(mapped.message);\n }\n }\n }\n\n return (\n <>\n <div className=\"flex min-w-0 flex-col gap-section\">\n <Header variant=\"h1\">General</Header>\n\n <Panel>\n <PanelBody className=\"gap-group p-panel\">\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n {formError}\n </Callout>\n ) : null}\n\n <form\n className=\"flex w-full max-w-[560px] flex-col gap-group\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n onSubmit: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n }}\n >\n {(field) => (\n <FormField\n label=\"Workspace name\"\n id=\"workspace-settings-name\"\n error={fieldError(field)}\n >\n <FormFieldInput\n name=\"name\"\n type=\"text\"\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n\n <form.Field\n name=\"slug\"\n validators={{\n onBlur: createWorkspaceBodySchema.shape.slug,\n onSubmit: createWorkspaceBodySchema.shape.slug,\n }}\n >\n {(field) => (\n <SlugField\n id=\"workspace-settings-slug\"\n label=\"Workspace slug\"\n name=\"slug\"\n value={field.state.value}\n onChange={(value) => field.handleChange(value)}\n onBlur={field.handleBlur}\n error={fieldError(field)}\n description={\n <span className=\"break-all font-code\">/w/{field.state.value}</span>\n }\n placeholder=\"acme\"\n className=\"font-code\"\n currentSlug={workspace.slug}\n checkEnabled\n isValid={isSlugValid}\n checkAvailability={checkWorkspaceSlugAvailability}\n />\n )}\n </form.Field>\n\n <Button type=\"submit\" isLoading={updateWorkspace.isPending} className=\"self-start\">\n Save changes\n </Button>\n </form>\n </PanelBody>\n </Panel>\n </div>\n\n <SlugChangeWarning\n open={warningOpen}\n onOpenChange={setWarningOpen}\n entityLabel=\"workspace\"\n isLoading={updateWorkspace.isPending}\n onConfirm={() => {\n if (pendingValues) void save(pendingValues);\n }}\n />\n </>\n );\n}\n"],"names":["createWorkspaceBodySchema","checkWorkspaceSlugAvailability","useUpdateWorkspaceMutation","displayNameFieldError","SlugChangeWarning","SlugField","Button","Callout","FormField","FormFieldInput","fieldError","Panel","PanelBody","toast","Header","useForm","useNavigate","useState","workspaceGeneralErrorToFormError","WorkspaceSettingsShell","isSlugValid","value","shape","slug","safeParse","success","GeneralSettingsPage","workspace","WorkspaceGeneralForm","id","name","updateWorkspace","navigate","warningOpen","setWarningOpen","pendingValues","setPendingValues","formError","setFormError","form","defaultValues","onSubmit","save","values","undefined","nameChanged","slugChanged","command","workspaceId","updated","mutateAsync","to","params","workspaceSlug","error","mapped","kind","setFieldMeta","field","previous","errorMap","onServer","message","div","className","variant","role","type","noValidate","event","preventDefault","stopPropagation","handleSubmit","Field","validators","onBlur","label","state","onChange","handleChange","target","handleBlur","description","span","placeholder","currentSlug","checkEnabled","isValid","checkAvailability","isLoading","isPending","open","onOpenChange","entityLabel","onConfirm"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/pages/general-settings-page.tsx"],"sourcesContent":["import {createWorkspaceBodySchema} from '@shipfox/api-workspaces-dto';\nimport {\n checkWorkspaceSlugAvailability,\n type useActiveWorkspace,\n useUpdateWorkspaceMutation,\n} from '@shipfox/client-auth';\nimport {displayNameFieldError, SlugChangeWarning, SlugField} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {Panel, PanelBody} from '@shipfox/react-ui/panel';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Header} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useNavigate} from '@tanstack/react-router';\nimport {useState} from 'react';\nimport {workspaceGeneralErrorToFormError} from '#components/general/form-errors.js';\nimport {ShowSetupGuideLink} from '#components/show-setup-guide-link.js';\nimport {WorkspaceSettingsShell} from '#components/workspace-settings-shell.js';\n\ninterface WorkspaceGeneralValues {\n name: string;\n slug: string;\n}\n\nfunction isSlugValid(value: string): boolean {\n return createWorkspaceBodySchema.shape.slug.safeParse(value).success;\n}\n\nexport function GeneralSettingsPage() {\n return (\n <WorkspaceSettingsShell>\n {(workspace) => (\n <WorkspaceGeneralForm\n key={`${workspace.id}:${workspace.name}:${workspace.slug}`}\n workspace={workspace}\n />\n )}\n </WorkspaceSettingsShell>\n );\n}\n\nfunction WorkspaceGeneralForm({workspace}: {workspace: ReturnType<typeof useActiveWorkspace>}) {\n const updateWorkspace = useUpdateWorkspaceMutation();\n const navigate = useNavigate();\n const [warningOpen, setWarningOpen] = useState(false);\n const [pendingValues, setPendingValues] = useState<WorkspaceGeneralValues>();\n const [formError, setFormError] = useState<string>();\n\n const form = useForm({\n defaultValues: {name: workspace.name, slug: workspace.slug},\n onSubmit: async ({value}) => {\n if (value.slug !== workspace.slug) {\n setPendingValues(value);\n setWarningOpen(true);\n return;\n }\n await save(value);\n },\n });\n\n async function save(values: WorkspaceGeneralValues) {\n setFormError(undefined);\n const nameChanged = values.name !== workspace.name;\n const slugChanged = values.slug !== workspace.slug;\n if (!nameChanged && !slugChanged) return;\n const command = {\n workspaceId: workspace.id,\n ...(nameChanged ? {name: values.name} : {}),\n ...(slugChanged ? {slug: values.slug} : {}),\n };\n\n try {\n const updated = await updateWorkspace.mutateAsync(command);\n setPendingValues(undefined);\n setWarningOpen(false);\n toast.success('Workspace settings saved.');\n await navigate({\n to: '/w/$workspaceSlug/settings/general',\n params: {workspaceSlug: updated.slug},\n });\n } catch (error) {\n setPendingValues(undefined);\n setWarningOpen(false);\n const mapped = workspaceGeneralErrorToFormError(error);\n if (mapped.kind === 'field') {\n form.setFieldMeta(mapped.field, (previous) => ({\n ...previous,\n errorMap: {...previous.errorMap, onServer: mapped.message},\n }));\n } else {\n setFormError(mapped.message);\n }\n }\n }\n\n return (\n <>\n <div className=\"flex min-w-0 flex-col gap-section\">\n <Header variant=\"h1\">General</Header>\n\n <Panel>\n <PanelBody className=\"gap-group p-panel\">\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n {formError}\n </Callout>\n ) : null}\n\n <form\n className=\"flex w-full max-w-[560px] flex-col gap-group\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n <form.Field\n name=\"name\"\n validators={{\n onBlur: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n onSubmit: ({value}) =>\n displayNameFieldError(\n value,\n 'Workspace name',\n createWorkspaceBodySchema.shape.name,\n ),\n }}\n >\n {(field) => (\n <FormField\n label=\"Workspace name\"\n id=\"workspace-settings-name\"\n error={fieldError(field)}\n >\n <FormFieldInput\n name=\"name\"\n type=\"text\"\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n\n <form.Field\n name=\"slug\"\n validators={{\n onBlur: createWorkspaceBodySchema.shape.slug,\n onSubmit: createWorkspaceBodySchema.shape.slug,\n }}\n >\n {(field) => (\n <SlugField\n id=\"workspace-settings-slug\"\n label=\"Workspace slug\"\n name=\"slug\"\n value={field.state.value}\n onChange={(value) => field.handleChange(value)}\n onBlur={field.handleBlur}\n error={fieldError(field)}\n description={\n <span className=\"break-all font-code\">/w/{field.state.value}</span>\n }\n placeholder=\"acme\"\n className=\"font-code\"\n currentSlug={workspace.slug}\n checkEnabled\n isValid={isSlugValid}\n checkAvailability={checkWorkspaceSlugAvailability}\n />\n )}\n </form.Field>\n\n <Button type=\"submit\" isLoading={updateWorkspace.isPending} className=\"self-start\">\n Save changes\n </Button>\n </form>\n </PanelBody>\n </Panel>\n\n <ShowSetupGuideLink workspaceId={workspace.id} />\n </div>\n\n <SlugChangeWarning\n open={warningOpen}\n onOpenChange={setWarningOpen}\n entityLabel=\"workspace\"\n isLoading={updateWorkspace.isPending}\n onConfirm={() => {\n if (pendingValues) void save(pendingValues);\n }}\n />\n </>\n );\n}\n"],"names":["createWorkspaceBodySchema","checkWorkspaceSlugAvailability","useUpdateWorkspaceMutation","displayNameFieldError","SlugChangeWarning","SlugField","Button","Callout","FormField","FormFieldInput","fieldError","Panel","PanelBody","toast","Header","useForm","useNavigate","useState","workspaceGeneralErrorToFormError","ShowSetupGuideLink","WorkspaceSettingsShell","isSlugValid","value","shape","slug","safeParse","success","GeneralSettingsPage","workspace","WorkspaceGeneralForm","id","name","updateWorkspace","navigate","warningOpen","setWarningOpen","pendingValues","setPendingValues","formError","setFormError","form","defaultValues","onSubmit","save","values","undefined","nameChanged","slugChanged","command","workspaceId","updated","mutateAsync","to","params","workspaceSlug","error","mapped","kind","setFieldMeta","field","previous","errorMap","onServer","message","div","className","variant","role","type","noValidate","event","preventDefault","stopPropagation","handleSubmit","Field","validators","onBlur","label","state","onChange","handleChange","target","handleBlur","description","span","placeholder","currentSlug","checkEnabled","isValid","checkAvailability","isLoading","isPending","open","onOpenChange","entityLabel","onConfirm"],"mappings":"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"}
|