@shipfox/client-projects 5.0.0 → 6.0.2
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 +74 -0
- package/dist/chrome.d.ts.map +1 -1
- package/dist/chrome.js +7 -10
- package/dist/chrome.js.map +1 -1
- package/dist/components/model-provider-reminder-banner.d.ts.map +1 -1
- package/dist/components/model-provider-reminder-banner.js +4 -2
- package/dist/components/model-provider-reminder-banner.js.map +1 -1
- package/dist/components/source-strip.d.ts +2 -2
- package/dist/components/source-strip.d.ts.map +1 -1
- package/dist/components/source-strip.js +2 -2
- package/dist/components/source-strip.js.map +1 -1
- package/dist/core/definition.d.ts +32 -0
- package/dist/core/definition.d.ts.map +1 -0
- package/dist/core/definition.js +3 -0
- package/dist/core/definition.js.map +1 -0
- package/dist/core/project.d.ts +26 -0
- package/dist/core/project.d.ts.map +1 -0
- package/dist/core/project.js +12 -0
- package/dist/core/project.js.map +1 -0
- package/dist/feature.d.ts +8 -0
- package/dist/feature.d.ts.map +1 -1
- package/dist/feature.js +11 -10
- package/dist/feature.js.map +1 -1
- package/dist/hooks/api/definitions.d.ts +12 -88
- package/dist/hooks/api/definitions.d.ts.map +1 -1
- package/dist/hooks/api/definitions.js +18 -10
- package/dist/hooks/api/definitions.js.map +1 -1
- package/dist/hooks/api/mappers.d.ts +17 -0
- package/dist/hooks/api/mappers.d.ts.map +1 -0
- package/dist/hooks/api/mappers.js +56 -0
- package/dist/hooks/api/mappers.js.map +1 -0
- package/dist/hooks/api/projects.d.ts +18 -84
- package/dist/hooks/api/projects.d.ts.map +1 -1
- package/dist/hooks/api/projects.js +72 -29
- package/dist/hooks/api/projects.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/pages/create-project-page.d.ts.map +1 -1
- package/dist/pages/create-project-page.js +12 -37
- package/dist/pages/create-project-page.js.map +1 -1
- package/dist/pages/create-project-page.stories.js +3 -1
- package/dist/pages/create-project-page.stories.js.map +1 -1
- package/dist/pages/home-router.d.ts +4 -1
- package/dist/pages/home-router.d.ts.map +1 -1
- package/dist/pages/home-router.js +4 -2
- package/dist/pages/home-router.js.map +1 -1
- package/dist/pages/projects-hub-page.d.ts +3 -1
- package/dist/pages/projects-hub-page.d.ts.map +1 -1
- package/dist/pages/projects-hub-page.js +26 -30
- package/dist/pages/projects-hub-page.js.map +1 -1
- package/dist/routes/home.d.ts +3 -2
- package/dist/routes/home.d.ts.map +1 -1
- package/dist/routes/home.js +7 -2
- package/dist/routes/home.js.map +1 -1
- package/dist/routes/inputs.d.ts +6 -0
- package/dist/routes/inputs.d.ts.map +1 -0
- package/dist/routes/inputs.js +14 -0
- package/dist/routes/inputs.js.map +1 -0
- package/dist/routes/search.d.ts +5 -0
- package/dist/routes/search.d.ts.map +1 -0
- package/dist/routes/search.js +8 -0
- package/dist/routes/search.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +14 -15
- package/src/chrome.tsx +11 -6
- package/src/components/model-provider-reminder-banner.tsx +12 -10
- package/src/components/project-switcher.test.tsx +2 -1
- package/src/components/source-strip.tsx +5 -5
- package/src/core/definition.ts +31 -0
- package/src/core/project.ts +47 -0
- package/src/feature.ts +13 -11
- package/src/hooks/api/definitions.ts +54 -19
- package/src/hooks/api/mappers.ts +67 -0
- package/src/hooks/api/projects.test.ts +11 -4
- package/src/hooks/api/projects.ts +114 -39
- package/src/index.ts +9 -0
- package/src/pages/create-project-page.stories.tsx +6 -1
- package/src/pages/create-project-page.test.tsx +3 -1
- package/src/pages/create-project-page.tsx +16 -51
- package/src/pages/home-router.tsx +3 -2
- package/src/pages/projects-hub-page.test.tsx +13 -8
- package/src/pages/projects-hub-page.tsx +24 -34
- package/src/routes/home.tsx +6 -2
- package/src/routes/inputs.test.ts +14 -0
- package/src/routes/inputs.ts +15 -0
- package/src/routes/search.ts +8 -0
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/api/definitions.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/api/definitions.ts"],"sourcesContent":["import {definitionListResponseSchema} from '@shipfox/api-definitions-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {\n type InfiniteData,\n keepPreviousData,\n queryOptions,\n type UseInfiniteQueryOptions,\n type UseQueryOptions,\n useInfiniteQuery,\n useQuery,\n} from '@tanstack/react-query';\nimport type {DefinitionList} from '#core/definition.js';\nimport {toDefinitionList} from './mappers.js';\n\nexport const definitionsQueryKeys = {\n all: ['definitions'] as const,\n list: (projectId: string) => [...definitionsQueryKeys.all, 'list', projectId] as const,\n};\n\ntype DefinitionListQueryKey =\n | ReturnType<typeof definitionsQueryKeys.list>\n | readonly ['definitions', 'list'];\ntype DefinitionListInfiniteQueryOptions = UseInfiniteQueryOptions<\n DefinitionList,\n Error,\n InfiniteData<DefinitionList, string | undefined>,\n DefinitionListQueryKey,\n string | undefined\n>;\ntype DefinitionListQueryOptions = UseQueryOptions<\n DefinitionList,\n Error,\n DefinitionList,\n DefinitionListQueryKey\n>;\nexport async function listDefinitions({\n projectId,\n limit = 50,\n cursor,\n signal,\n}: {\n projectId: string;\n limit?: number;\n cursor?: string | undefined;\n signal?: AbortSignal | undefined;\n}): Promise<DefinitionList> {\n const params = new URLSearchParams({project_id: projectId, limit: String(limit)});\n if (cursor) params.set('cursor', cursor);\n return toDefinitionList(\n await checkedApiRequest(definitionListResponseSchema, `/definitions?${params.toString()}`, {\n signal,\n }),\n );\n}\nexport function definitionsInfiniteQueryOptions(\n projectId: string | undefined,\n limit = 50,\n): DefinitionListInfiniteQueryOptions {\n return {\n queryKey: projectId\n ? definitionsQueryKeys.list(projectId)\n : ([...definitionsQueryKeys.all, 'list'] as const),\n enabled: Boolean(projectId),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}: {pageParam: string | undefined; signal: AbortSignal}) =>\n listDefinitions({projectId: projectId ?? '', limit, cursor: pageParam, signal}),\n getNextPageParam: (lastPage: DefinitionList) => lastPage.nextCursor ?? undefined,\n placeholderData: keepPreviousData,\n };\n}\nexport function definitionsQueryOptions(projectId: string | undefined): DefinitionListQueryOptions {\n return queryOptions({\n queryKey: projectId\n ? definitionsQueryKeys.list(projectId)\n : ([...definitionsQueryKeys.all, 'list'] as const),\n enabled: Boolean(projectId),\n queryFn: ({signal}) => listDefinitions({projectId: projectId ?? '', signal}),\n });\n}\nexport function useDefinitionsInfiniteQuery(projectId: string | undefined, limit = 50) {\n return useInfiniteQuery(definitionsInfiniteQueryOptions(projectId, limit));\n}\nexport function useDefinitionsQuery(projectId: string | undefined) {\n return useQuery(definitionsQueryOptions(projectId));\n}\n"],"names":["definitionListResponseSchema","checkedApiRequest","keepPreviousData","queryOptions","useInfiniteQuery","useQuery","toDefinitionList","definitionsQueryKeys","all","list","projectId","listDefinitions","limit","cursor","signal","params","URLSearchParams","project_id","String","set","toString","definitionsInfiniteQueryOptions","queryKey","enabled","Boolean","initialPageParam","undefined","queryFn","pageParam","getNextPageParam","lastPage","nextCursor","placeholderData","definitionsQueryOptions","useDefinitionsInfiniteQuery","useDefinitionsQuery"],"mappings":"AAAA,SAAQA,4BAA4B,QAAO,+BAA+B;AAC1E,SAAQC,iBAAiB,QAAO,sBAAsB;AACtD,SAEEC,gBAAgB,EAChBC,YAAY,EAGZC,gBAAgB,EAChBC,QAAQ,QACH,wBAAwB;AAE/B,SAAQC,gBAAgB,QAAO,eAAe;AAE9C,OAAO,MAAMC,uBAAuB;IAClCC,KAAK;QAAC;KAAc;IACpBC,MAAM,CAACC,YAAsB;eAAIH,qBAAqBC,GAAG;YAAE;YAAQE;SAAU;AAC/E,EAAE;AAkBF,OAAO,eAAeC,gBAAgB,EACpCD,SAAS,EACTE,QAAQ,EAAE,EACVC,MAAM,EACNC,MAAM,EAMP;IACC,MAAMC,SAAS,IAAIC,gBAAgB;QAACC,YAAYP;QAAWE,OAAOM,OAAON;IAAM;IAC/E,IAAIC,QAAQE,OAAOI,GAAG,CAAC,UAAUN;IACjC,OAAOP,iBACL,MAAML,kBAAkBD,8BAA8B,CAAC,aAAa,EAAEe,OAAOK,QAAQ,IAAI,EAAE;QACzFN;IACF;AAEJ;AACA,OAAO,SAASO,gCACdX,SAA6B,EAC7BE,QAAQ,EAAE;IAEV,OAAO;QACLU,UAAUZ,YACNH,qBAAqBE,IAAI,CAACC,aACzB;eAAIH,qBAAqBC,GAAG;YAAE;SAAO;QAC1Ce,SAASC,QAAQd;QACjBe,kBAAkBC;QAClBC,SAAS,CAAC,EAACC,SAAS,EAAEd,MAAM,EAAuD,GACjFH,gBAAgB;gBAACD,WAAWA,aAAa;gBAAIE;gBAAOC,QAAQe;gBAAWd;YAAM;QAC/Ee,kBAAkB,CAACC,WAA6BA,SAASC,UAAU,IAAIL;QACvEM,iBAAiB9B;IACnB;AACF;AACA,OAAO,SAAS+B,wBAAwBvB,SAA6B;IACnE,OAAOP,aAAa;QAClBmB,UAAUZ,YACNH,qBAAqBE,IAAI,CAACC,aACzB;eAAIH,qBAAqBC,GAAG;YAAE;SAAO;QAC1Ce,SAASC,QAAQd;QACjBiB,SAAS,CAAC,EAACb,MAAM,EAAC,GAAKH,gBAAgB;gBAACD,WAAWA,aAAa;gBAAII;YAAM;IAC5E;AACF;AACA,OAAO,SAASoB,4BAA4BxB,SAA6B,EAAEE,QAAQ,EAAE;IACnF,OAAOR,iBAAiBiB,gCAAgCX,WAAWE;AACrE;AACA,OAAO,SAASuB,oBAAoBzB,SAA6B;IAC/D,OAAOL,SAAS4B,wBAAwBvB;AAC1C"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DefinitionDto, DefinitionSyncSummaryDto } from '@shipfox/api-definitions-dto';
|
|
2
|
+
import type { ProjectResponseDto } from '@shipfox/api-projects-dto';
|
|
3
|
+
import type { Definition, DefinitionList, DefinitionSyncSummary } from '#core/definition.js';
|
|
4
|
+
import type { Project, ProjectList } from '#core/project.js';
|
|
5
|
+
export declare function toProject(dto: ProjectResponseDto): Project;
|
|
6
|
+
export declare function toProjectList(dto: {
|
|
7
|
+
projects: ProjectResponseDto[];
|
|
8
|
+
next_cursor: string | null;
|
|
9
|
+
}): ProjectList;
|
|
10
|
+
export declare function toDefinition(dto: DefinitionDto): Definition;
|
|
11
|
+
export declare function toDefinitionSyncSummary(dto: DefinitionSyncSummaryDto): DefinitionSyncSummary;
|
|
12
|
+
export declare function toDefinitionList(dto: {
|
|
13
|
+
definitions: DefinitionDto[];
|
|
14
|
+
sync: DefinitionSyncSummaryDto | null;
|
|
15
|
+
next_cursor: string | null;
|
|
16
|
+
}): DefinitionList;
|
|
17
|
+
//# sourceMappingURL=mappers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/mappers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAE,wBAAwB,EAAC,MAAM,8BAA8B,CAAC;AAC1F,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAC,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAC3F,OAAO,KAAK,EAAC,OAAO,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE3D,wBAAgB,SAAS,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAY1D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE;IACjC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,WAAW,CAEd;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,UAAU,CAgB3D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,wBAAwB,GAAG,qBAAqB,CAU5F;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IACpC,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,cAAc,CAMjB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export function toProject(dto) {
|
|
2
|
+
return {
|
|
3
|
+
id: dto.id,
|
|
4
|
+
workspaceId: dto.workspace_id,
|
|
5
|
+
name: dto.name,
|
|
6
|
+
source: {
|
|
7
|
+
connectionId: dto.source.connection_id,
|
|
8
|
+
externalRepositoryId: dto.source.external_repository_id
|
|
9
|
+
},
|
|
10
|
+
createdAt: dto.created_at,
|
|
11
|
+
updatedAt: dto.updated_at
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function toProjectList(dto) {
|
|
15
|
+
return {
|
|
16
|
+
projects: dto.projects.map(toProject),
|
|
17
|
+
nextCursor: dto.next_cursor
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function toDefinition(dto) {
|
|
21
|
+
return {
|
|
22
|
+
id: dto.id,
|
|
23
|
+
projectId: dto.project_id,
|
|
24
|
+
configPath: dto.config_path,
|
|
25
|
+
source: dto.source,
|
|
26
|
+
sha: dto.sha,
|
|
27
|
+
ref: dto.ref,
|
|
28
|
+
name: dto.name,
|
|
29
|
+
workflowDocument: dto.workflow_document,
|
|
30
|
+
workflowModel: dto.workflow_model,
|
|
31
|
+
manualTrigger: dto.manual_trigger,
|
|
32
|
+
fetchedAt: dto.fetched_at,
|
|
33
|
+
createdAt: dto.created_at,
|
|
34
|
+
updatedAt: dto.updated_at
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function toDefinitionSyncSummary(dto) {
|
|
38
|
+
return {
|
|
39
|
+
ref: dto.ref,
|
|
40
|
+
status: dto.status,
|
|
41
|
+
lastSyncAt: dto.last_sync_at,
|
|
42
|
+
startedAt: dto.started_at,
|
|
43
|
+
finishedAt: dto.finished_at,
|
|
44
|
+
lastErrorCode: dto.last_error_code,
|
|
45
|
+
lastErrorMessage: dto.last_error_message
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function toDefinitionList(dto) {
|
|
49
|
+
return {
|
|
50
|
+
definitions: dto.definitions.map(toDefinition),
|
|
51
|
+
sync: dto.sync && toDefinitionSyncSummary(dto.sync),
|
|
52
|
+
nextCursor: dto.next_cursor
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=mappers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/api/mappers.ts"],"sourcesContent":["import type {DefinitionDto, DefinitionSyncSummaryDto} from '@shipfox/api-definitions-dto';\nimport type {ProjectResponseDto} from '@shipfox/api-projects-dto';\nimport type {Definition, DefinitionList, DefinitionSyncSummary} from '#core/definition.js';\nimport type {Project, ProjectList} from '#core/project.js';\n\nexport function toProject(dto: ProjectResponseDto): Project {\n return {\n id: dto.id,\n workspaceId: dto.workspace_id,\n name: dto.name,\n source: {\n connectionId: dto.source.connection_id,\n externalRepositoryId: dto.source.external_repository_id,\n },\n createdAt: dto.created_at,\n updatedAt: dto.updated_at,\n };\n}\n\nexport function toProjectList(dto: {\n projects: ProjectResponseDto[];\n next_cursor: string | null;\n}): ProjectList {\n return {projects: dto.projects.map(toProject), nextCursor: dto.next_cursor};\n}\n\nexport function toDefinition(dto: DefinitionDto): Definition {\n return {\n id: dto.id,\n projectId: dto.project_id,\n configPath: dto.config_path,\n source: dto.source,\n sha: dto.sha,\n ref: dto.ref,\n name: dto.name,\n workflowDocument: dto.workflow_document,\n workflowModel: dto.workflow_model,\n manualTrigger: dto.manual_trigger,\n fetchedAt: dto.fetched_at,\n createdAt: dto.created_at,\n updatedAt: dto.updated_at,\n };\n}\n\nexport function toDefinitionSyncSummary(dto: DefinitionSyncSummaryDto): DefinitionSyncSummary {\n return {\n ref: dto.ref,\n status: dto.status,\n lastSyncAt: dto.last_sync_at,\n startedAt: dto.started_at,\n finishedAt: dto.finished_at,\n lastErrorCode: dto.last_error_code,\n lastErrorMessage: dto.last_error_message,\n };\n}\n\nexport function toDefinitionList(dto: {\n definitions: DefinitionDto[];\n sync: DefinitionSyncSummaryDto | null;\n next_cursor: string | null;\n}): DefinitionList {\n return {\n definitions: dto.definitions.map(toDefinition),\n sync: dto.sync && toDefinitionSyncSummary(dto.sync),\n nextCursor: dto.next_cursor,\n };\n}\n"],"names":["toProject","dto","id","workspaceId","workspace_id","name","source","connectionId","connection_id","externalRepositoryId","external_repository_id","createdAt","created_at","updatedAt","updated_at","toProjectList","projects","map","nextCursor","next_cursor","toDefinition","projectId","project_id","configPath","config_path","sha","ref","workflowDocument","workflow_document","workflowModel","workflow_model","manualTrigger","manual_trigger","fetchedAt","fetched_at","toDefinitionSyncSummary","status","lastSyncAt","last_sync_at","startedAt","started_at","finishedAt","finished_at","lastErrorCode","last_error_code","lastErrorMessage","last_error_message","toDefinitionList","definitions","sync"],"mappings":"AAKA,OAAO,SAASA,UAAUC,GAAuB;IAC/C,OAAO;QACLC,IAAID,IAAIC,EAAE;QACVC,aAAaF,IAAIG,YAAY;QAC7BC,MAAMJ,IAAII,IAAI;QACdC,QAAQ;YACNC,cAAcN,IAAIK,MAAM,CAACE,aAAa;YACtCC,sBAAsBR,IAAIK,MAAM,CAACI,sBAAsB;QACzD;QACAC,WAAWV,IAAIW,UAAU;QACzBC,WAAWZ,IAAIa,UAAU;IAC3B;AACF;AAEA,OAAO,SAASC,cAAcd,GAG7B;IACC,OAAO;QAACe,UAAUf,IAAIe,QAAQ,CAACC,GAAG,CAACjB;QAAYkB,YAAYjB,IAAIkB,WAAW;IAAA;AAC5E;AAEA,OAAO,SAASC,aAAanB,GAAkB;IAC7C,OAAO;QACLC,IAAID,IAAIC,EAAE;QACVmB,WAAWpB,IAAIqB,UAAU;QACzBC,YAAYtB,IAAIuB,WAAW;QAC3BlB,QAAQL,IAAIK,MAAM;QAClBmB,KAAKxB,IAAIwB,GAAG;QACZC,KAAKzB,IAAIyB,GAAG;QACZrB,MAAMJ,IAAII,IAAI;QACdsB,kBAAkB1B,IAAI2B,iBAAiB;QACvCC,eAAe5B,IAAI6B,cAAc;QACjCC,eAAe9B,IAAI+B,cAAc;QACjCC,WAAWhC,IAAIiC,UAAU;QACzBvB,WAAWV,IAAIW,UAAU;QACzBC,WAAWZ,IAAIa,UAAU;IAC3B;AACF;AAEA,OAAO,SAASqB,wBAAwBlC,GAA6B;IACnE,OAAO;QACLyB,KAAKzB,IAAIyB,GAAG;QACZU,QAAQnC,IAAImC,MAAM;QAClBC,YAAYpC,IAAIqC,YAAY;QAC5BC,WAAWtC,IAAIuC,UAAU;QACzBC,YAAYxC,IAAIyC,WAAW;QAC3BC,eAAe1C,IAAI2C,eAAe;QAClCC,kBAAkB5C,IAAI6C,kBAAkB;IAC1C;AACF;AAEA,OAAO,SAASC,iBAAiB9C,GAIhC;IACC,OAAO;QACL+C,aAAa/C,IAAI+C,WAAW,CAAC/B,GAAG,CAACG;QACjC6B,MAAMhD,IAAIgD,IAAI,IAAId,wBAAwBlC,IAAIgD,IAAI;QAClD/B,YAAYjB,IAAIkB,WAAW;IAC7B;AACF"}
|
|
@@ -1,97 +1,31 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import {
|
|
1
|
+
import { type InfiniteData, type UseInfiniteQueryOptions, type UseQueryOptions } from '@tanstack/react-query';
|
|
2
|
+
import type { CreateProjectCommand, Project, ProjectList } from '#core/project.js';
|
|
3
3
|
export declare const projectsQueryKeys: {
|
|
4
4
|
all: readonly ["projects"];
|
|
5
5
|
list: (workspaceId: string, search?: string) => readonly ["projects", "list", string, string];
|
|
6
6
|
exists: (workspaceId: string) => readonly ["projects", "exists", string];
|
|
7
7
|
detail: (projectId: string) => readonly ["projects", "detail", string];
|
|
8
8
|
};
|
|
9
|
-
type
|
|
9
|
+
type ProjectListQueryKey = ReturnType<typeof projectsQueryKeys.list> | readonly ['projects', 'list'];
|
|
10
|
+
type ProjectExistenceQueryKey = ReturnType<typeof projectsQueryKeys.exists> | readonly ['projects', 'exists'];
|
|
11
|
+
type ProjectDetailQueryKey = ReturnType<typeof projectsQueryKeys.detail> | readonly ['projects', 'detail'];
|
|
12
|
+
type ProjectListInfiniteQueryOptions = UseInfiniteQueryOptions<ProjectList, Error, InfiniteData<ProjectList, string | undefined>, ProjectListQueryKey, string | undefined>;
|
|
13
|
+
type ProjectExistenceQueryOptions = UseQueryOptions<ProjectList, Error, ProjectList, ProjectExistenceQueryKey>;
|
|
14
|
+
type ProjectDetailQueryOptions = UseQueryOptions<Project, Error, Project, ProjectDetailQueryKey>;
|
|
10
15
|
export declare function listProjects({ workspaceId, limit, cursor, search, signal, }: {
|
|
11
16
|
workspaceId: string;
|
|
12
17
|
limit?: number;
|
|
13
18
|
cursor?: string | undefined;
|
|
14
19
|
search?: string | undefined;
|
|
15
|
-
signal?: AbortSignal;
|
|
16
|
-
}): Promise<
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
created_at: string;
|
|
26
|
-
updated_at: string;
|
|
27
|
-
}[];
|
|
28
|
-
next_cursor: string | null;
|
|
29
|
-
}>;
|
|
30
|
-
export declare function getProject(projectId: string): Promise<{
|
|
31
|
-
id: string;
|
|
32
|
-
workspace_id: string;
|
|
33
|
-
name: string;
|
|
34
|
-
source: {
|
|
35
|
-
connection_id: string;
|
|
36
|
-
external_repository_id: string;
|
|
37
|
-
};
|
|
38
|
-
created_at: string;
|
|
39
|
-
updated_at: string;
|
|
40
|
-
}>;
|
|
41
|
-
export declare function createProject(body: CreateProjectBodyDto): Promise<{
|
|
42
|
-
id: string;
|
|
43
|
-
workspace_id: string;
|
|
44
|
-
name: string;
|
|
45
|
-
source: {
|
|
46
|
-
connection_id: string;
|
|
47
|
-
external_repository_id: string;
|
|
48
|
-
};
|
|
49
|
-
created_at: string;
|
|
50
|
-
updated_at: string;
|
|
51
|
-
}>;
|
|
52
|
-
export declare function projectExistenceQueryOptions(workspaceId: string): ProjectExistenceQueryOptions;
|
|
53
|
-
export declare function useProjectsInfiniteQuery(workspaceId: string | undefined, search?: string, limit?: number): import("@tanstack/react-query").UseInfiniteQueryResult<import("@tanstack/react-query").InfiniteData<{
|
|
54
|
-
projects: {
|
|
55
|
-
id: string;
|
|
56
|
-
workspace_id: string;
|
|
57
|
-
name: string;
|
|
58
|
-
source: {
|
|
59
|
-
connection_id: string;
|
|
60
|
-
external_repository_id: string;
|
|
61
|
-
};
|
|
62
|
-
created_at: string;
|
|
63
|
-
updated_at: string;
|
|
64
|
-
}[];
|
|
65
|
-
next_cursor: string | null;
|
|
66
|
-
}, unknown>, Error>;
|
|
67
|
-
export declare function useProjectQuery(projectId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<{
|
|
68
|
-
id: string;
|
|
69
|
-
workspace_id: string;
|
|
70
|
-
name: string;
|
|
71
|
-
source: {
|
|
72
|
-
connection_id: string;
|
|
73
|
-
external_repository_id: string;
|
|
74
|
-
};
|
|
75
|
-
created_at: string;
|
|
76
|
-
updated_at: string;
|
|
77
|
-
}>, Error>;
|
|
78
|
-
export declare function useCreateProjectMutation(): import("@tanstack/react-query").UseMutationResult<{
|
|
79
|
-
id: string;
|
|
80
|
-
workspace_id: string;
|
|
81
|
-
name: string;
|
|
82
|
-
source: {
|
|
83
|
-
connection_id: string;
|
|
84
|
-
external_repository_id: string;
|
|
85
|
-
};
|
|
86
|
-
created_at: string;
|
|
87
|
-
updated_at: string;
|
|
88
|
-
}, Error, {
|
|
89
|
-
workspace_id: string;
|
|
90
|
-
name: string;
|
|
91
|
-
source: {
|
|
92
|
-
connection_id: string;
|
|
93
|
-
external_repository_id: string;
|
|
94
|
-
};
|
|
95
|
-
}, unknown>;
|
|
20
|
+
signal?: AbortSignal | undefined;
|
|
21
|
+
}): Promise<ProjectList>;
|
|
22
|
+
export declare function getProject(projectId: string): Promise<Project>;
|
|
23
|
+
export declare function createProject(command: CreateProjectCommand): Promise<Project>;
|
|
24
|
+
export declare function projectsInfiniteQueryOptions(workspaceId: string | undefined, search?: string, limit?: number): ProjectListInfiniteQueryOptions;
|
|
25
|
+
export declare function projectExistenceQueryOptions(workspaceId: string | undefined): ProjectExistenceQueryOptions;
|
|
26
|
+
export declare function projectQueryOptions(projectId: string | undefined): ProjectDetailQueryOptions;
|
|
27
|
+
export declare function useProjectsInfiniteQuery(workspaceId: string | undefined, search?: string, limit?: number): import("@tanstack/react-query").UseInfiniteQueryResult<InfiniteData<ProjectList, string | undefined>, Error>;
|
|
28
|
+
export declare function useProjectQuery(projectId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<Project>, Error>;
|
|
29
|
+
export declare function useCreateProjectMutation(): import("@tanstack/react-query").UseMutationResult<Project, Error, CreateProjectCommand, unknown>;
|
|
96
30
|
export {};
|
|
97
31
|
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/projects.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/projects.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,YAAY,EAGjB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EAKrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAC,oBAAoB,EAAE,OAAO,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAGjF,eAAO,MAAM,iBAAiB;;wBAER,MAAM;0BAEJ,MAAM;wBACR,MAAM;CAC3B,CAAC;AAEF,KAAK,mBAAmB,GACpB,UAAU,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC,GACzC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAClC,KAAK,wBAAwB,GACzB,UAAU,CAAC,OAAO,iBAAiB,CAAC,MAAM,CAAC,GAC3C,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACpC,KAAK,qBAAqB,GACtB,UAAU,CAAC,OAAO,iBAAiB,CAAC,MAAM,CAAC,GAC3C,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAEpC,KAAK,+BAA+B,GAAG,uBAAuB,CAC5D,WAAW,EACX,KAAK,EACL,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC,EAC7C,mBAAmB,EACnB,MAAM,GAAG,SAAS,CACnB,CAAC;AACF,KAAK,4BAA4B,GAAG,eAAe,CACjD,WAAW,EACX,KAAK,EACL,WAAW,EACX,wBAAwB,CACzB,CAAC;AACF,KAAK,yBAAyB,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC;AAEjG,wBAAsB,YAAY,CAAC,EACjC,WAAW,EACX,KAAU,EACV,MAAM,EACN,MAAM,EACN,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC,GAAG,OAAO,CAAC,WAAW,CAAC,CAOvB;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpE;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAYnF;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,SAAK,GACT,+BAA+B,CAmBjC;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,4BAA4B,CAS9B;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,yBAAyB,CAQ5F;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,SAAK,gHAGX;AACD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,2EAE5D;AAED,wBAAgB,wBAAwB,qGAoBvC"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { createProjectBodySchema, listProjectsResponseSchema, projectResponseSchema } from '@shipfox/api-projects-dto';
|
|
2
|
+
import { checkedApiRequest } from '@shipfox/client-api';
|
|
3
|
+
import { keepPreviousData, queryOptions, useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
4
|
+
import { toProject, toProjectList } from './mappers.js';
|
|
3
5
|
export const projectsQueryKeys = {
|
|
4
6
|
all: [
|
|
5
7
|
'projects'
|
|
6
8
|
],
|
|
7
|
-
list: (workspaceId, search)=>[
|
|
9
|
+
list: (workspaceId, search = '')=>[
|
|
8
10
|
...projectsQueryKeys.all,
|
|
9
11
|
'list',
|
|
10
12
|
workspaceId,
|
|
11
|
-
search
|
|
13
|
+
search
|
|
12
14
|
],
|
|
13
15
|
exists: (workspaceId)=>[
|
|
14
16
|
...projectsQueryKeys.all,
|
|
@@ -28,33 +30,31 @@ export async function listProjects({ workspaceId, limit = 50, cursor, search, si
|
|
|
28
30
|
});
|
|
29
31
|
if (cursor) params.set('cursor', cursor);
|
|
30
32
|
if (search) params.set('search', search);
|
|
31
|
-
return await
|
|
33
|
+
return toProjectList(await checkedApiRequest(listProjectsResponseSchema, `/projects?${params.toString()}`, {
|
|
32
34
|
signal
|
|
33
|
-
});
|
|
35
|
+
}));
|
|
34
36
|
}
|
|
35
37
|
export async function getProject(projectId) {
|
|
36
|
-
return await
|
|
38
|
+
return toProject(await checkedApiRequest(projectResponseSchema, `/projects/${projectId}`));
|
|
37
39
|
}
|
|
38
|
-
export async function createProject(
|
|
39
|
-
|
|
40
|
+
export async function createProject(command) {
|
|
41
|
+
const body = createProjectBodySchema.parse({
|
|
42
|
+
workspace_id: command.workspaceId,
|
|
43
|
+
name: command.name,
|
|
44
|
+
source: {
|
|
45
|
+
connection_id: command.source.connectionId,
|
|
46
|
+
external_repository_id: command.source.externalRepositoryId
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return toProject(await checkedApiRequest(projectResponseSchema, '/projects', {
|
|
40
50
|
method: 'POST',
|
|
41
51
|
body
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
export function projectExistenceQueryOptions(workspaceId) {
|
|
45
|
-
return queryOptions({
|
|
46
|
-
queryKey: projectsQueryKeys.exists(workspaceId),
|
|
47
|
-
queryFn: ({ signal })=>listProjects({
|
|
48
|
-
workspaceId,
|
|
49
|
-
limit: 1,
|
|
50
|
-
signal
|
|
51
|
-
}),
|
|
52
|
-
staleTime: 30_000
|
|
53
|
-
});
|
|
52
|
+
}));
|
|
54
53
|
}
|
|
55
|
-
export function
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
export function projectsInfiniteQueryOptions(workspaceId, search, limit = 50) {
|
|
55
|
+
const normalizedSearch = search?.trim() ?? '';
|
|
56
|
+
return {
|
|
57
|
+
queryKey: workspaceId ? projectsQueryKeys.list(workspaceId, normalizedSearch) : [
|
|
58
58
|
...projectsQueryKeys.all,
|
|
59
59
|
'list'
|
|
60
60
|
],
|
|
@@ -64,15 +64,30 @@ export function useProjectsInfiniteQuery(workspaceId, search, limit = 50) {
|
|
|
64
64
|
workspaceId: workspaceId ?? '',
|
|
65
65
|
limit,
|
|
66
66
|
cursor: pageParam,
|
|
67
|
-
search,
|
|
67
|
+
search: normalizedSearch || undefined,
|
|
68
68
|
signal
|
|
69
69
|
}),
|
|
70
|
-
getNextPageParam: (lastPage)=>lastPage.
|
|
70
|
+
getNextPageParam: (lastPage)=>lastPage.nextCursor ?? undefined,
|
|
71
71
|
placeholderData: keepPreviousData
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function projectExistenceQueryOptions(workspaceId) {
|
|
75
|
+
return queryOptions({
|
|
76
|
+
queryKey: workspaceId ? projectsQueryKeys.exists(workspaceId) : [
|
|
77
|
+
...projectsQueryKeys.all,
|
|
78
|
+
'exists'
|
|
79
|
+
],
|
|
80
|
+
enabled: Boolean(workspaceId),
|
|
81
|
+
queryFn: ({ signal })=>listProjects({
|
|
82
|
+
workspaceId: workspaceId ?? '',
|
|
83
|
+
limit: 1,
|
|
84
|
+
signal
|
|
85
|
+
}),
|
|
86
|
+
staleTime: 30_000
|
|
72
87
|
});
|
|
73
88
|
}
|
|
74
|
-
export function
|
|
75
|
-
return
|
|
89
|
+
export function projectQueryOptions(projectId) {
|
|
90
|
+
return queryOptions({
|
|
76
91
|
queryKey: projectId ? projectsQueryKeys.detail(projectId) : [
|
|
77
92
|
...projectsQueryKeys.all,
|
|
78
93
|
'detail'
|
|
@@ -81,9 +96,37 @@ export function useProjectQuery(projectId) {
|
|
|
81
96
|
queryFn: ()=>getProject(projectId ?? '')
|
|
82
97
|
});
|
|
83
98
|
}
|
|
99
|
+
export function useProjectsInfiniteQuery(workspaceId, search, limit = 50) {
|
|
100
|
+
return useInfiniteQuery(projectsInfiniteQueryOptions(workspaceId, search, limit));
|
|
101
|
+
}
|
|
102
|
+
export function useProjectQuery(projectId) {
|
|
103
|
+
return useQuery(projectQueryOptions(projectId));
|
|
104
|
+
}
|
|
84
105
|
export function useCreateProjectMutation() {
|
|
106
|
+
const queryClient = useQueryClient();
|
|
85
107
|
return useMutation({
|
|
86
|
-
mutationFn: createProject
|
|
108
|
+
mutationFn: createProject,
|
|
109
|
+
onSuccess: async (project)=>{
|
|
110
|
+
queryClient.setQueryData(projectsQueryKeys.detail(project.id), project);
|
|
111
|
+
queryClient.setQueryData(projectsQueryKeys.exists(project.workspaceId), {
|
|
112
|
+
projects: [
|
|
113
|
+
project
|
|
114
|
+
],
|
|
115
|
+
nextCursor: null
|
|
116
|
+
});
|
|
117
|
+
await queryClient.invalidateQueries({
|
|
118
|
+
queryKey: projectsQueryKeys.list(project.workspaceId)
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
onError: async (_error, command)=>{
|
|
122
|
+
await queryClient.invalidateQueries({
|
|
123
|
+
queryKey: projectsQueryKeys.exists(command.workspaceId),
|
|
124
|
+
refetchType: 'active'
|
|
125
|
+
});
|
|
126
|
+
await queryClient.invalidateQueries({
|
|
127
|
+
queryKey: projectsQueryKeys.list(command.workspaceId)
|
|
128
|
+
});
|
|
129
|
+
}
|
|
87
130
|
});
|
|
88
131
|
}
|
|
89
132
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/api/projects.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/api/projects.ts"],"sourcesContent":["import {\n createProjectBodySchema,\n listProjectsResponseSchema,\n projectResponseSchema,\n} from '@shipfox/api-projects-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {\n type InfiniteData,\n keepPreviousData,\n queryOptions,\n type UseInfiniteQueryOptions,\n type UseQueryOptions,\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query';\nimport type {CreateProjectCommand, Project, ProjectList} from '#core/project.js';\nimport {toProject, toProjectList} from './mappers.js';\n\nexport const projectsQueryKeys = {\n all: ['projects'] as const,\n list: (workspaceId: string, search = '') =>\n [...projectsQueryKeys.all, 'list', workspaceId, search] as const,\n exists: (workspaceId: string) => [...projectsQueryKeys.all, 'exists', workspaceId] as const,\n detail: (projectId: string) => [...projectsQueryKeys.all, 'detail', projectId] as const,\n};\n\ntype ProjectListQueryKey =\n | ReturnType<typeof projectsQueryKeys.list>\n | readonly ['projects', 'list'];\ntype ProjectExistenceQueryKey =\n | ReturnType<typeof projectsQueryKeys.exists>\n | readonly ['projects', 'exists'];\ntype ProjectDetailQueryKey =\n | ReturnType<typeof projectsQueryKeys.detail>\n | readonly ['projects', 'detail'];\n\ntype ProjectListInfiniteQueryOptions = UseInfiniteQueryOptions<\n ProjectList,\n Error,\n InfiniteData<ProjectList, string | undefined>,\n ProjectListQueryKey,\n string | undefined\n>;\ntype ProjectExistenceQueryOptions = UseQueryOptions<\n ProjectList,\n Error,\n ProjectList,\n ProjectExistenceQueryKey\n>;\ntype ProjectDetailQueryOptions = UseQueryOptions<Project, Error, Project, ProjectDetailQueryKey>;\n\nexport async function listProjects({\n workspaceId,\n limit = 50,\n cursor,\n search,\n signal,\n}: {\n workspaceId: string;\n limit?: number;\n cursor?: string | undefined;\n search?: string | undefined;\n signal?: AbortSignal | undefined;\n}): Promise<ProjectList> {\n const params = new URLSearchParams({workspace_id: workspaceId, limit: String(limit)});\n if (cursor) params.set('cursor', cursor);\n if (search) params.set('search', search);\n return toProjectList(\n await checkedApiRequest(listProjectsResponseSchema, `/projects?${params.toString()}`, {signal}),\n );\n}\n\nexport async function getProject(projectId: string): Promise<Project> {\n return toProject(await checkedApiRequest(projectResponseSchema, `/projects/${projectId}`));\n}\n\nexport async function createProject(command: CreateProjectCommand): Promise<Project> {\n const body = createProjectBodySchema.parse({\n workspace_id: command.workspaceId,\n name: command.name,\n source: {\n connection_id: command.source.connectionId,\n external_repository_id: command.source.externalRepositoryId,\n },\n });\n return toProject(\n await checkedApiRequest(projectResponseSchema, '/projects', {method: 'POST', body}),\n );\n}\n\nexport function projectsInfiniteQueryOptions(\n workspaceId: string | undefined,\n search?: string,\n limit = 50,\n): ProjectListInfiniteQueryOptions {\n const normalizedSearch = search?.trim() ?? '';\n return {\n queryKey: workspaceId\n ? projectsQueryKeys.list(workspaceId, normalizedSearch)\n : ([...projectsQueryKeys.all, 'list'] as const),\n enabled: Boolean(workspaceId),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}: {pageParam: string | undefined; signal: AbortSignal}) =>\n listProjects({\n workspaceId: workspaceId ?? '',\n limit,\n cursor: pageParam,\n search: normalizedSearch || undefined,\n signal,\n }),\n getNextPageParam: (lastPage: ProjectList) => lastPage.nextCursor ?? undefined,\n placeholderData: keepPreviousData,\n };\n}\n\nexport function projectExistenceQueryOptions(\n workspaceId: string | undefined,\n): ProjectExistenceQueryOptions {\n return queryOptions({\n queryKey: workspaceId\n ? projectsQueryKeys.exists(workspaceId)\n : ([...projectsQueryKeys.all, 'exists'] as const),\n enabled: Boolean(workspaceId),\n queryFn: ({signal}) => listProjects({workspaceId: workspaceId ?? '', limit: 1, signal}),\n staleTime: 30_000,\n });\n}\n\nexport function projectQueryOptions(projectId: string | undefined): ProjectDetailQueryOptions {\n return queryOptions({\n queryKey: projectId\n ? projectsQueryKeys.detail(projectId)\n : ([...projectsQueryKeys.all, 'detail'] as const),\n enabled: Boolean(projectId),\n queryFn: () => getProject(projectId ?? ''),\n });\n}\n\nexport function useProjectsInfiniteQuery(\n workspaceId: string | undefined,\n search?: string,\n limit = 50,\n) {\n return useInfiniteQuery(projectsInfiniteQueryOptions(workspaceId, search, limit));\n}\nexport function useProjectQuery(projectId: string | undefined) {\n return useQuery(projectQueryOptions(projectId));\n}\n\nexport function useCreateProjectMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: createProject,\n onSuccess: async (project) => {\n queryClient.setQueryData(projectsQueryKeys.detail(project.id), project);\n queryClient.setQueryData<ProjectList>(projectsQueryKeys.exists(project.workspaceId), {\n projects: [project],\n nextCursor: null,\n });\n await queryClient.invalidateQueries({queryKey: projectsQueryKeys.list(project.workspaceId)});\n },\n onError: async (_error, command) => {\n await queryClient.invalidateQueries({\n queryKey: projectsQueryKeys.exists(command.workspaceId),\n refetchType: 'active',\n });\n await queryClient.invalidateQueries({queryKey: projectsQueryKeys.list(command.workspaceId)});\n },\n });\n}\n"],"names":["createProjectBodySchema","listProjectsResponseSchema","projectResponseSchema","checkedApiRequest","keepPreviousData","queryOptions","useInfiniteQuery","useMutation","useQuery","useQueryClient","toProject","toProjectList","projectsQueryKeys","all","list","workspaceId","search","exists","detail","projectId","listProjects","limit","cursor","signal","params","URLSearchParams","workspace_id","String","set","toString","getProject","createProject","command","body","parse","name","source","connection_id","connectionId","external_repository_id","externalRepositoryId","method","projectsInfiniteQueryOptions","normalizedSearch","trim","queryKey","enabled","Boolean","initialPageParam","undefined","queryFn","pageParam","getNextPageParam","lastPage","nextCursor","placeholderData","projectExistenceQueryOptions","staleTime","projectQueryOptions","useProjectsInfiniteQuery","useProjectQuery","useCreateProjectMutation","queryClient","mutationFn","onSuccess","project","setQueryData","id","projects","invalidateQueries","onError","_error","refetchType"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export type { Definition, DefinitionList, DefinitionSyncSummary } from '#core/definition.js';
|
|
2
|
+
export { type CreateProjectCommand, type Project, type ProjectList, type ProjectSource, projectNameFromRepository, selectProjectSource, } from '#core/project.js';
|
|
1
3
|
export { ProjectBreadcrumb, ProjectLayoutGuard } from './chrome.js';
|
|
2
4
|
export { ProjectCrumb, type ProjectCrumbProps } from './components/project-crumb.js';
|
|
3
5
|
export { ProjectSwitcher, type ProjectSwitcherProps } from './components/project-switcher.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AAClE,OAAO,EAAC,YAAY,EAAE,KAAK,iBAAiB,EAAC,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAC,eAAe,EAAE,KAAK,oBAAoB,EAAC,MAAM,kCAAkC,CAAC;AAC5F,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AACzD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAC,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,iBAAiB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AAClE,OAAO,EAAC,YAAY,EAAE,KAAK,iBAAiB,EAAC,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAC,eAAe,EAAE,KAAK,oBAAoB,EAAC,MAAM,kCAAkC,CAAC;AAC5F,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AACzD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { projectNameFromRepository, selectProjectSource } from '#core/project.js';
|
|
1
2
|
export { ProjectBreadcrumb, ProjectLayoutGuard } from './chrome.js';
|
|
2
3
|
export { ProjectCrumb } from './components/project-crumb.js';
|
|
3
4
|
export { ProjectSwitcher } from './components/project-switcher.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {ProjectBreadcrumb, ProjectLayoutGuard} from './chrome.js';\nexport {ProjectCrumb, type ProjectCrumbProps} from './components/project-crumb.js';\nexport {ProjectSwitcher, type ProjectSwitcherProps} from './components/project-switcher.js';\nexport {SourceStrip} from './components/source-strip.js';\nexport * from './hooks/api/definitions.js';\nexport * from './hooks/api/projects.js';\nexport * from './pages/create-project-page.js';\nexport * from './pages/home-router.js';\nexport * from './pages/projects-hub-page.js';\nexport * from './project-error.js';\n"],"names":["ProjectBreadcrumb","ProjectLayoutGuard","ProjectCrumb","ProjectSwitcher","SourceStrip"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type {Definition, DefinitionList, DefinitionSyncSummary} from '#core/definition.js';\nexport {\n type CreateProjectCommand,\n type Project,\n type ProjectList,\n type ProjectSource,\n projectNameFromRepository,\n selectProjectSource,\n} from '#core/project.js';\nexport {ProjectBreadcrumb, ProjectLayoutGuard} from './chrome.js';\nexport {ProjectCrumb, type ProjectCrumbProps} from './components/project-crumb.js';\nexport {ProjectSwitcher, type ProjectSwitcherProps} from './components/project-switcher.js';\nexport {SourceStrip} from './components/source-strip.js';\nexport * from './hooks/api/definitions.js';\nexport * from './hooks/api/projects.js';\nexport * from './pages/create-project-page.js';\nexport * from './pages/home-router.js';\nexport * from './pages/projects-hub-page.js';\nexport * from './project-error.js';\n"],"names":["projectNameFromRepository","selectProjectSource","ProjectBreadcrumb","ProjectLayoutGuard","ProjectCrumb","ProjectSwitcher","SourceStrip"],"mappings":"AACA,SAKEA,yBAAyB,EACzBC,mBAAmB,QACd,mBAAmB;AAC1B,SAAQC,iBAAiB,EAAEC,kBAAkB,QAAO,cAAc;AAClE,SAAQC,YAAY,QAA+B,gCAAgC;AACnF,SAAQC,eAAe,QAAkC,mCAAmC;AAC5F,SAAQC,WAAW,QAAO,+BAA+B;AACzD,cAAc,6BAA6B;AAC3C,cAAc,0BAA0B;AACxC,cAAc,iCAAiC;AAC/C,cAAc,yBAAyB;AACvC,cAAc,+BAA+B;AAC7C,cAAc,qBAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-project-page.d.ts","sourceRoot":"","sources":["../../src/pages/create-project-page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-project-page.d.ts","sourceRoot":"","sources":["../../src/pages/create-project-page.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,iBAAiB,gCAiShC"}
|
|
@@ -10,21 +10,19 @@ import { FullPageLoader } from '@shipfox/react-ui/loader';
|
|
|
10
10
|
import { toast } from '@shipfox/react-ui/toast';
|
|
11
11
|
import { Header, Text } from '@shipfox/react-ui/typography';
|
|
12
12
|
import { useForm } from '@tanstack/react-form';
|
|
13
|
-
import { useQueryClient } from '@tanstack/react-query';
|
|
14
13
|
import { Link, Navigate, useNavigate } from '@tanstack/react-router';
|
|
15
14
|
import { useEffect, useRef, useState } from 'react';
|
|
16
15
|
import { ModelProviderReminderBanner } from '#components/model-provider-reminder-banner.js';
|
|
17
|
-
import {
|
|
16
|
+
import { projectNameFromRepository } from '#core/project.js';
|
|
17
|
+
import { useCreateProjectMutation } from '#hooks/api/projects.js';
|
|
18
18
|
import { projectErrorCopy } from '#project-error.js';
|
|
19
|
-
const REPOSITORY_NAME_SPLIT_RE = /[/-]/;
|
|
20
19
|
export function CreateProjectPage() {
|
|
21
20
|
const workspace = useMaybeActiveWorkspace();
|
|
22
|
-
const queryClient = useQueryClient();
|
|
23
21
|
const navigate = useNavigate();
|
|
24
22
|
const createProject = useCreateProjectMutation();
|
|
25
23
|
const errorRef = useRef(null);
|
|
26
24
|
const connectionsQuery = useSourceConnectionsQuery(workspace?.id);
|
|
27
|
-
const connections = connectionsQuery.data
|
|
25
|
+
const connections = connectionsQuery.data ?? [];
|
|
28
26
|
const [selectedConnectionId, setSelectedConnectionId] = useState();
|
|
29
27
|
const singleConnectionId = connections.length === 1 ? connections[0]?.id : undefined;
|
|
30
28
|
const effectiveSelectedConnectionId = selectedConnectionId ?? singleConnectionId;
|
|
@@ -47,13 +45,13 @@ export function CreateProjectPage() {
|
|
|
47
45
|
const [selectedRepositoryId, setSelectedRepositoryId] = useState();
|
|
48
46
|
useEffect(()=>{
|
|
49
47
|
if (!selectedRepositoryId && repositories[0]) {
|
|
50
|
-
setSelectedRepositoryId(repositories[0].
|
|
48
|
+
setSelectedRepositoryId(repositories[0].externalRepositoryId);
|
|
51
49
|
}
|
|
52
50
|
}, [
|
|
53
51
|
repositories,
|
|
54
52
|
selectedRepositoryId
|
|
55
53
|
]);
|
|
56
|
-
const selectedRepository = repositories.find((repository)=>repository.
|
|
54
|
+
const selectedRepository = repositories.find((repository)=>repository.externalRepositoryId === selectedRepositoryId);
|
|
57
55
|
const [nameTouched, setNameTouched] = useState(false);
|
|
58
56
|
const defaultProjectName = projectNameFromRepository(selectedRepository?.name ?? selectedRepositoryId ?? '');
|
|
59
57
|
const [formError, setFormError] = useState();
|
|
@@ -111,20 +109,15 @@ export function CreateProjectPage() {
|
|
|
111
109
|
return;
|
|
112
110
|
}
|
|
113
111
|
try {
|
|
114
|
-
const
|
|
115
|
-
|
|
112
|
+
const command = {
|
|
113
|
+
workspaceId: workspace.id,
|
|
116
114
|
name: projectName,
|
|
117
115
|
source: {
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
connectionId: selectedConnection.id,
|
|
117
|
+
externalRepositoryId: selectedRepository.externalRepositoryId
|
|
120
118
|
}
|
|
121
|
-
}
|
|
122
|
-
const project = await createProject.mutateAsync(
|
|
123
|
-
setWorkspaceProjectExists(queryClient, workspace.id, project);
|
|
124
|
-
queryClient.setQueryData(projectsQueryKeys.detail(project.id), project);
|
|
125
|
-
await queryClient.invalidateQueries({
|
|
126
|
-
queryKey: projectsQueryKeys.list(workspace.id)
|
|
127
|
-
});
|
|
119
|
+
};
|
|
120
|
+
const project = await createProject.mutateAsync(command);
|
|
128
121
|
toast.success('Project created.');
|
|
129
122
|
await navigate({
|
|
130
123
|
to: '/workspaces/$wid/projects/$pid',
|
|
@@ -136,13 +129,6 @@ export function CreateProjectPage() {
|
|
|
136
129
|
} catch (error) {
|
|
137
130
|
const copy = projectErrorCopy(error);
|
|
138
131
|
if (copy.existingProjectId) {
|
|
139
|
-
await queryClient.invalidateQueries({
|
|
140
|
-
queryKey: projectsQueryKeys.exists(workspace.id),
|
|
141
|
-
refetchType: 'active'
|
|
142
|
-
});
|
|
143
|
-
await queryClient.invalidateQueries({
|
|
144
|
-
queryKey: projectsQueryKeys.list(workspace.id)
|
|
145
|
-
});
|
|
146
132
|
toast.info('Project already exists.');
|
|
147
133
|
await navigate({
|
|
148
134
|
to: '/workspaces/$wid/projects/$pid',
|
|
@@ -321,7 +307,7 @@ export function CreateProjectPage() {
|
|
|
321
307
|
}) : null,
|
|
322
308
|
/*#__PURE__*/ _jsx(ProjectSummary, {
|
|
323
309
|
connection: selectedConnection,
|
|
324
|
-
repositoryName: selectedRepository?.
|
|
310
|
+
repositoryName: selectedRepository?.fullName
|
|
325
311
|
}),
|
|
326
312
|
/*#__PURE__*/ _jsx(form.Field, {
|
|
327
313
|
name: "name",
|
|
@@ -380,9 +366,6 @@ function ProjectSummary({ connection, repositoryName }) {
|
|
|
380
366
|
]
|
|
381
367
|
});
|
|
382
368
|
}
|
|
383
|
-
function projectNameFromRepository(repositoryId) {
|
|
384
|
-
return repositoryId.trim().split(REPOSITORY_NAME_SPLIT_RE).filter(Boolean).map((part)=>part.charAt(0).toUpperCase() + part.slice(1)).join(' ');
|
|
385
|
-
}
|
|
386
369
|
function useDebouncedValue(value, delayMs) {
|
|
387
370
|
const [debounced, setDebounced] = useState(value);
|
|
388
371
|
useEffect(()=>{
|
|
@@ -394,13 +377,5 @@ function useDebouncedValue(value, delayMs) {
|
|
|
394
377
|
]);
|
|
395
378
|
return debounced;
|
|
396
379
|
}
|
|
397
|
-
function setWorkspaceProjectExists(queryClient, workspaceId, project) {
|
|
398
|
-
queryClient.setQueryData(projectsQueryKeys.exists(workspaceId), {
|
|
399
|
-
projects: [
|
|
400
|
-
project
|
|
401
|
-
],
|
|
402
|
-
next_cursor: null
|
|
403
|
-
});
|
|
404
|
-
}
|
|
405
380
|
|
|
406
381
|
//# sourceMappingURL=create-project-page.js.map
|