@solibo/solibo-query 1.22.4 → 1.26.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/dist/api/commands/conversation/createConversationMessage.d.ts +2 -2
- package/dist/api/commands/conversation/createConversationMessage.js +48 -20
- package/dist/api/commands/conversation/createConversationMessage.js.map +1 -1
- package/dist/api/commands/issue/createIssueToMeeting.js +21 -23
- package/dist/api/commands/issue/createIssueToMeeting.js.map +1 -1
- package/dist/api/commands/issue/meetingIssueCache.d.ts +13 -0
- package/dist/api/commands/issue/meetingIssueCache.js +46 -0
- package/dist/api/commands/issue/meetingIssueCache.js.map +1 -0
- package/dist/api/commands/issue/removeIssueFromMeeting.d.ts +1 -1
- package/dist/api/commands/issue/removeIssueFromMeeting.js +19 -42
- package/dist/api/commands/issue/removeIssueFromMeeting.js.map +1 -1
- package/dist/api/queries/conversation/conversation.d.ts +1 -1
- package/dist/api/queries/conversation/conversation.js +11 -1
- package/dist/api/queries/conversation/conversation.js.map +1 -1
- package/dist/api/queries/invoicing/upcomingInvoicing.d.ts +4 -2
- package/dist/api/queries/invoicing/upcomingInvoicing.js +3 -0
- package/dist/api/queries/invoicing/upcomingInvoicing.js.map +1 -1
- package/dist/api/queries/residentsAndSections/sectionStatus.d.ts +8 -4
- package/dist/api/queries/residentsAndSections/sectionStatus.js +5 -2
- package/dist/api/queries/residentsAndSections/sectionStatus.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { CreateMessageCommandProps, Id, SdkInput, SoliboClient } from "@solibo/solibo-sdk";
|
|
1
|
+
import { CreateMessageCommandProps, Id, MessageInConversation, SdkInput, SoliboClient } from "@solibo/solibo-sdk";
|
|
2
2
|
import type { QueryClient } from "@tanstack/query-core";
|
|
3
3
|
export declare function createConversationMessageMutationOptions(sdk: SoliboClient, queryClient: QueryClient): {
|
|
4
4
|
mutationFn: (params: {
|
|
5
5
|
companyId: Id;
|
|
6
6
|
conversationId: Id;
|
|
7
7
|
cmd: SdkInput<CreateMessageCommandProps>;
|
|
8
|
-
}) => Promise<
|
|
8
|
+
}) => Promise<MessageInConversation>;
|
|
9
9
|
onSuccess: (_: any, params: any) => Promise<[void, void]>;
|
|
10
10
|
onError: (_: any, params: any) => Promise<[void, void]>;
|
|
11
11
|
};
|
|
@@ -1,29 +1,57 @@
|
|
|
1
1
|
import { conversationKeys } from "../../queries/conversation/conversations.js";
|
|
2
2
|
import { userKeys } from "../../queries/user/user.js";
|
|
3
|
+
// The conversation detail prefix also matches
|
|
4
|
+
// conversationMessageHistoryQueryOptions, whose data is a message's edit
|
|
5
|
+
// history rather than a conversation.
|
|
6
|
+
const isConversation = (data) => typeof data === "object" && data !== null && "messages" in data;
|
|
7
|
+
// Negative, so a placeholder never matches a stored message, and unique, so
|
|
8
|
+
// two pending messages never share a list key.
|
|
9
|
+
let lastOptimisticMessageId = 0n;
|
|
10
|
+
// Shaped like a fetched message, with null where only the server knows the
|
|
11
|
+
// value, so it renders like the message that replaces it on refetch.
|
|
12
|
+
const toOptimisticMessage = (cmd, personId) => ({
|
|
13
|
+
id: --lastOptimisticMessageId,
|
|
14
|
+
content: cmd.content,
|
|
15
|
+
// Fetched instants stringify to ISO 8601, as SoliboInstant declares.
|
|
16
|
+
sentAt: new Date().toISOString(),
|
|
17
|
+
sentBy: null,
|
|
18
|
+
sentById: personId ?? -1n,
|
|
19
|
+
sentByCurrentUser: true,
|
|
20
|
+
// An EMAIL message also needs the email content and recipients the
|
|
21
|
+
// server returns, so the type waits for the refetch too.
|
|
22
|
+
type: null,
|
|
23
|
+
deletedAt: null,
|
|
24
|
+
deliverability: null,
|
|
25
|
+
documents: null,
|
|
26
|
+
editedAt: null,
|
|
27
|
+
emailContent: null,
|
|
28
|
+
emailRecipients: null,
|
|
29
|
+
origin: null,
|
|
30
|
+
renderedContent: null,
|
|
31
|
+
});
|
|
3
32
|
export function createConversationMessageMutationOptions(sdk, queryClient) {
|
|
4
|
-
const doOptimisticUpdate = (params,
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
...params.cmd,
|
|
17
|
-
createdBy: user || { id: "", username: "ANONYMOUS" },
|
|
18
|
-
createdAt: new Date(),
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
});
|
|
33
|
+
const doOptimisticUpdate = (params, personId) => {
|
|
34
|
+
const message = toOptimisticMessage(params.cmd, personId);
|
|
35
|
+
// conversationQueryOptions appends its parameters to the wrapped key, so
|
|
36
|
+
// update every cached copy under the prefix; an exact key finds none.
|
|
37
|
+
// SDK results hold their fields as own properties, so the spread keeps
|
|
38
|
+
// them; TypeScript only sees the declared getters, hence the cast.
|
|
39
|
+
queryClient.setQueriesData({ queryKey: [conversationKeys.detail(params.conversationId)] }, (conversation) => isConversation(conversation)
|
|
40
|
+
? {
|
|
41
|
+
...conversation,
|
|
42
|
+
messages: [...(conversation.messages ?? []), message],
|
|
43
|
+
}
|
|
44
|
+
: undefined);
|
|
22
45
|
};
|
|
23
46
|
return {
|
|
24
47
|
mutationFn: async (params) => {
|
|
25
|
-
|
|
26
|
-
|
|
48
|
+
// userQueryOptions keys the user as [userKeys.current(), fields], and a
|
|
49
|
+
// projection can leave out personId.
|
|
50
|
+
const personId = queryClient
|
|
51
|
+
.getQueriesData({ queryKey: [userKeys.current()] })
|
|
52
|
+
.map(([, user]) => user?.personId)
|
|
53
|
+
.find((personId) => personId != null);
|
|
54
|
+
doOptimisticUpdate(params, personId);
|
|
27
55
|
return sdk.api.conversations.createMessage({
|
|
28
56
|
companyId: params.companyId,
|
|
29
57
|
conversationId: params.conversationId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createConversationMessage.js","sourceRoot":"","sources":["../../../../src/api/commands/conversation/createConversationMessage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"createConversationMessage.js","sourceRoot":"","sources":["../../../../src/api/commands/conversation/createConversationMessage.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,8CAA8C;AAC9C,yEAAyE;AACzE,sCAAsC;AACtC,MAAM,cAAc,GAAG,CAAC,IAAa,EAAwB,EAAE,CAC7D,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,UAAU,IAAI,IAAI,CAAC;AAClE,4EAA4E;AAC5E,+CAA+C;AAC/C,IAAI,uBAAuB,GAAG,EAAE,CAAC;AACjC,2EAA2E;AAC3E,qEAAqE;AACrE,MAAM,mBAAmB,GAAG,CAC1B,GAAwC,EACxC,QAAiB,EACM,EAAE,CACzB,CAAC;IACC,EAAE,EAAE,EAAE,uBAAuB;IAC7B,OAAO,EAAE,GAAG,CAAC,OAAO;IACpB,qEAAqE;IACrE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IAChC,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,QAAQ,IAAI,CAAC,EAAE;IACzB,iBAAiB,EAAE,IAAI;IACvB,mEAAmE;IACnE,yDAAyD;IACzD,IAAI,EAAE,IAAI;IACV,SAAS,EAAE,IAAI;IACf,cAAc,EAAE,IAAI;IACpB,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,IAAI;IACd,YAAY,EAAE,IAAI;IAClB,eAAe,EAAE,IAAI;IACrB,MAAM,EAAE,IAAI;IACZ,eAAe,EAAE,IAAI;CACtB,CAAqC,CAAC;AACzC,MAAM,UAAU,wCAAwC,CACtD,GAAiB,EACjB,WAAwB;IAExB,MAAM,kBAAkB,GAAG,CACzB,MAIC,EACD,QAAiB,EACjB,EAAE;QACF,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1D,yEAAyE;QACzE,sEAAsE;QACtE,uEAAuE;QACvE,mEAAmE;QACnE,WAAW,CAAC,cAAc,CACxB,EAAE,QAAQ,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,EAC9D,CAAC,YAAY,EAAE,EAAE,CACf,cAAc,CAAC,YAAY,CAAC;YAC1B,CAAC,CAAE;gBACC,GAAG,YAAY;gBACf,QAAQ,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC;aACrC;YACpB,CAAC,CAAC,SAAS,CAChB,CAAC;IACJ,CAAC,CAAC;IACF,OAAO;QACL,UAAU,EAAE,KAAK,EAAE,MAIlB,EAAE,EAAE;YACH,wEAAwE;YACxE,qCAAqC;YACrC,MAAM,QAAQ,GAAG,WAAW;iBACzB,cAAc,CAAO,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;iBACxD,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;iBACjC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;YACxC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACrC,OAAO,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC;gBACzC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,KAAK,EAAE,MAAM,CAAC,GAAG;aAClB,CAAC,CAAC;QACL,CAAC;QACD,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACvB,OAAO,CAAC,GAAG,CAAC;YACV,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;aAC3D,CAAC;YACF,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aACpD,CAAC;SACH,CAAC;QACJ,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACrB,OAAO,CAAC,GAAG,CAAC;YACV,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;aAC3D,CAAC;YACF,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aACpD,CAAC;SACH,CAAC;KACL,CAAC;AACJ,CAAC","sourcesContent":["import {\n Conversation,\n CreateMessageCommandProps,\n Id,\n MessageInConversation,\n SdkInput,\n SoliboClient,\n PersonUser as User,\n} from \"@solibo/solibo-sdk\";\nimport type { QueryClient } from \"@tanstack/query-core\";\nimport { conversationKeys } from \"../../queries/conversation/conversations.js\";\nimport { userKeys } from \"../../queries/user/user.js\";\n// The conversation detail prefix also matches\n// conversationMessageHistoryQueryOptions, whose data is a message's edit\n// history rather than a conversation.\nconst isConversation = (data: unknown): data is Conversation =>\n typeof data === \"object\" && data !== null && \"messages\" in data;\n// Negative, so a placeholder never matches a stored message, and unique, so\n// two pending messages never share a list key.\nlet lastOptimisticMessageId = 0n;\n// Shaped like a fetched message, with null where only the server knows the\n// value, so it renders like the message that replaces it on refetch.\nconst toOptimisticMessage = (\n cmd: SdkInput<CreateMessageCommandProps>,\n personId?: bigint,\n): MessageInConversation =>\n ({\n id: --lastOptimisticMessageId,\n content: cmd.content,\n // Fetched instants stringify to ISO 8601, as SoliboInstant declares.\n sentAt: new Date().toISOString(),\n sentBy: null,\n sentById: personId ?? -1n,\n sentByCurrentUser: true,\n // An EMAIL message also needs the email content and recipients the\n // server returns, so the type waits for the refetch too.\n type: null,\n deletedAt: null,\n deliverability: null,\n documents: null,\n editedAt: null,\n emailContent: null,\n emailRecipients: null,\n origin: null,\n renderedContent: null,\n }) as unknown as MessageInConversation;\nexport function createConversationMessageMutationOptions(\n sdk: SoliboClient,\n queryClient: QueryClient,\n) {\n const doOptimisticUpdate = (\n params: {\n companyId: Id;\n conversationId: Id;\n cmd: SdkInput<CreateMessageCommandProps>;\n },\n personId?: bigint,\n ) => {\n const message = toOptimisticMessage(params.cmd, personId);\n // conversationQueryOptions appends its parameters to the wrapped key, so\n // update every cached copy under the prefix; an exact key finds none.\n // SDK results hold their fields as own properties, so the spread keeps\n // them; TypeScript only sees the declared getters, hence the cast.\n queryClient.setQueriesData<Conversation>(\n { queryKey: [conversationKeys.detail(params.conversationId)] },\n (conversation) =>\n isConversation(conversation)\n ? ({\n ...conversation,\n messages: [...(conversation.messages ?? []), message],\n } as Conversation)\n : undefined,\n );\n };\n return {\n mutationFn: async (params: {\n companyId: Id;\n conversationId: Id;\n cmd: SdkInput<CreateMessageCommandProps>;\n }) => {\n // userQueryOptions keys the user as [userKeys.current(), fields], and a\n // projection can leave out personId.\n const personId = queryClient\n .getQueriesData<User>({ queryKey: [userKeys.current()] })\n .map(([, user]) => user?.personId)\n .find((personId) => personId != null);\n doOptimisticUpdate(params, personId);\n return sdk.api.conversations.createMessage({\n companyId: params.companyId,\n conversationId: params.conversationId,\n input: params.cmd,\n });\n },\n onSuccess: (_, params) =>\n Promise.all([\n queryClient.invalidateQueries({\n queryKey: [conversationKeys.detail(params.conversationId)],\n }),\n queryClient.invalidateQueries({\n queryKey: [conversationKeys.list(params.companyId)],\n }),\n ]),\n onError: (_, params) =>\n Promise.all([\n queryClient.invalidateQueries({\n queryKey: [conversationKeys.detail(params.conversationId)],\n }),\n queryClient.invalidateQueries({\n queryKey: [conversationKeys.list(params.companyId)],\n }),\n ]),\n };\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import { IssueStatus, MeetingStatus, } from "@solibo/solibo-sdk";
|
|
|
2
2
|
import { issueKeys } from "../../queries/issue/issues.js";
|
|
3
3
|
import { meetingKeys } from "../../queries/meeting/meetings.js";
|
|
4
4
|
import { userKeys } from "../../queries/user/user.js";
|
|
5
|
+
import { findCachedIssue, setCachedIssueStatus, updateCachedMeetingIssues, } from "./meetingIssueCache.js";
|
|
5
6
|
const toOptimisticIssueInMeeting = (issue, params, user) => ({
|
|
6
7
|
...issue,
|
|
7
8
|
meetingId: BigInt(params.meetingId).valueOf(),
|
|
@@ -30,34 +31,31 @@ const toOptimisticIssueInMeeting = (issue, params, user) => ({
|
|
|
30
31
|
export const isOptimisticUpdateOfIssueInMeeting = (issue) => issue.sequence === 999;
|
|
31
32
|
export function createIssueToMeetingMutationOptions(sdk, queryClient) {
|
|
32
33
|
const doOptimisticUpdate = (params, user) => {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
queryClient
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
...meetingBefore,
|
|
50
|
-
issues: [
|
|
51
|
-
...issuesInMeeting.slice(0, Number(params.cmd.beforeIndex)),
|
|
52
|
-
toOptimisticIssueInMeeting(issue, { meetingId: params.meetingId, issueId: params.issueId }, user),
|
|
53
|
-
...issuesInMeeting.slice(Number(params.cmd.beforeIndex)),
|
|
54
|
-
],
|
|
34
|
+
const issue = findCachedIssue(queryClient, params.companyId, params.issueId);
|
|
35
|
+
setCachedIssueStatus(queryClient, params.companyId, params.issueId, IssueStatus.InMeeting);
|
|
36
|
+
// Without a cached issue there is nothing to show in the meeting until it is refetched.
|
|
37
|
+
if (!issue)
|
|
38
|
+
return;
|
|
39
|
+
const issueInMeeting = toOptimisticIssueInMeeting(issue, { meetingId: params.meetingId, issueId: params.issueId }, user);
|
|
40
|
+
updateCachedMeetingIssues(queryClient, params.meetingId, (issues) => {
|
|
41
|
+
// beforeIndex is optional; without one, show the issue last until the meeting is refetched.
|
|
42
|
+
const beforeIndex = params.cmd.beforeIndex == null
|
|
43
|
+
? issues.length
|
|
44
|
+
: Number(params.cmd.beforeIndex);
|
|
45
|
+
return [
|
|
46
|
+
...issues.slice(0, beforeIndex),
|
|
47
|
+
issueInMeeting,
|
|
48
|
+
...issues.slice(beforeIndex),
|
|
49
|
+
];
|
|
55
50
|
});
|
|
56
51
|
};
|
|
57
52
|
return {
|
|
58
53
|
mutationFn: (params) => {
|
|
59
54
|
if (!params.withoutOptimisticUpdate) {
|
|
60
|
-
|
|
55
|
+
// userQueryOptions keys the user as [userKeys.current(), fields].
|
|
56
|
+
const user = queryClient
|
|
57
|
+
.getQueriesData({ queryKey: [userKeys.current()] })
|
|
58
|
+
.find(([, cached]) => cached != null)?.[1];
|
|
61
59
|
doOptimisticUpdate(params, user);
|
|
62
60
|
}
|
|
63
61
|
return sdk.api.meeting.createMeetingIssue({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createIssueToMeeting.js","sourceRoot":"","sources":["../../../../src/api/commands/issue/createIssueToMeeting.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,WAAW,
|
|
1
|
+
{"version":3,"file":"createIssueToMeeting.js","sourceRoot":"","sources":["../../../../src/api/commands/issue/createIssueToMeeting.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AttachIssueToMeetingCommandProps,\n Id,\n Issue,\n IssueInMeeting,\n IssueStatus,\n MeetingStatus,\n SdkInput,\n SoliboClient,\n PersonUser as User,\n} from \"@solibo/solibo-sdk\";\nimport type { QueryClient } from \"@tanstack/query-core\";\nimport { issueKeys } from \"../../queries/issue/issues.js\";\nimport { meetingKeys } from \"../../queries/meeting/meetings.js\";\nimport { userKeys } from \"../../queries/user/user.js\";\nimport {\n findCachedIssue,\n setCachedIssueStatus,\n updateCachedMeetingIssues,\n} from \"./meetingIssueCache.js\";\nconst toOptimisticIssueInMeeting = (\n issue: Issue,\n params: {\n meetingId: Id;\n issueId: Id;\n },\n user?: User,\n): IssueInMeeting =>\n ({\n ...issue,\n meetingId: BigInt(params.meetingId).valueOf(),\n issueId: issue.id,\n sequence: 999,\n followUp: false,\n status: MeetingStatus.InProgress,\n issueStatus: IssueStatus.InMeeting,\n documents: [],\n attachedToMeetingBy: user || {\n id: \"\",\n username: \"ANONYMOUS\",\n personId: -1n,\n name: { given: \"\", family: \"\" },\n profileUrl: \"\",\n roles: [],\n },\n attachedToMeetingAt: new Date(),\n createdById: -1n,\n createdAt: new Date(),\n updatedById: -1n,\n updatedAt: new Date(),\n resolved: false,\n responsibleId: issue.responsible?.id,\n }) as unknown as IssueInMeeting;\nexport const isOptimisticUpdateOfIssueInMeeting = (\n issue: IssueInMeeting,\n): boolean => issue.sequence === 999;\nexport function createIssueToMeetingMutationOptions(\n sdk: SoliboClient,\n queryClient: QueryClient,\n) {\n const doOptimisticUpdate = (\n params: {\n companyId: Id;\n meetingId: Id;\n issueId: Id;\n cmd: SdkInput<AttachIssueToMeetingCommandProps>;\n },\n user?: User,\n ) => {\n const issue = findCachedIssue(\n queryClient,\n params.companyId,\n params.issueId,\n );\n setCachedIssueStatus(\n queryClient,\n params.companyId,\n params.issueId,\n IssueStatus.InMeeting,\n );\n // Without a cached issue there is nothing to show in the meeting until it is refetched.\n if (!issue) return;\n const issueInMeeting = toOptimisticIssueInMeeting(\n issue,\n { meetingId: params.meetingId, issueId: params.issueId },\n user,\n );\n updateCachedMeetingIssues(queryClient, params.meetingId, (issues) => {\n // beforeIndex is optional; without one, show the issue last until the meeting is refetched.\n const beforeIndex =\n params.cmd.beforeIndex == null\n ? issues.length\n : Number(params.cmd.beforeIndex);\n return [\n ...issues.slice(0, beforeIndex),\n issueInMeeting,\n ...issues.slice(beforeIndex),\n ];\n });\n };\n return {\n mutationFn: (params: {\n companyId: Id;\n meetingId: Id;\n issueId: Id;\n cmd: SdkInput<AttachIssueToMeetingCommandProps>;\n withoutOptimisticUpdate: boolean;\n }) => {\n if (!params.withoutOptimisticUpdate) {\n // userQueryOptions keys the user as [userKeys.current(), fields].\n const user = queryClient\n .getQueriesData<User>({ queryKey: [userKeys.current()] })\n .find(([, cached]) => cached != null)?.[1];\n doOptimisticUpdate(params, user);\n }\n return sdk.api.meeting.createMeetingIssue({\n companyId: params.companyId,\n meetingId: params.meetingId,\n issueId: params.issueId,\n input: params.cmd,\n });\n },\n onSuccess: (\n _: unknown,\n params: {\n companyId: Id;\n meetingId: Id;\n issueId: Id;\n },\n ) =>\n Promise.all([\n queryClient.invalidateQueries({\n queryKey: [issueKeys.list(params.companyId)],\n }),\n queryClient.invalidateQueries({ queryKey: [issueKeys.all] }),\n queryClient.invalidateQueries({\n queryKey: [meetingKeys.detail(params.meetingId)],\n }),\n queryClient.invalidateQueries({\n queryKey: [issueKeys.detail(params.issueId)],\n }),\n ]),\n onError: (\n _: unknown,\n params: {\n companyId: Id;\n meetingId: Id;\n issueId: Id;\n },\n ) =>\n Promise.all([\n queryClient.invalidateQueries({\n queryKey: [issueKeys.list(params.companyId)],\n }),\n queryClient.invalidateQueries({ queryKey: [issueKeys.all] }),\n queryClient.invalidateQueries({\n queryKey: [meetingKeys.detail(params.meetingId)],\n }),\n queryClient.invalidateQueries({\n queryKey: [issueKeys.detail(params.issueId)],\n }),\n ]),\n };\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Id, Issue, IssueInMeeting, IssueStatus } from "@solibo/solibo-sdk";
|
|
2
|
+
import type { QueryClient } from "@tanstack/query-core";
|
|
3
|
+
/** Compares ids across bigint, number and string. */
|
|
4
|
+
export declare const sameId: (id: Id | null | undefined, other: Id) => boolean;
|
|
5
|
+
/** Finds an issue in any cached page of the company's issue lists. */
|
|
6
|
+
export declare function findCachedIssue(queryClient: QueryClient, companyId: Id, issueId: Id): Issue | undefined;
|
|
7
|
+
/** Sets an issue's status in every cached page of the company's issue lists. */
|
|
8
|
+
export declare function setCachedIssueStatus(queryClient: QueryClient, companyId: Id, issueId: Id, status: IssueStatus): void;
|
|
9
|
+
/**
|
|
10
|
+
* Replaces the issues of every cached copy of a meeting with what `update`
|
|
11
|
+
* returns for them. Returning undefined leaves that copy untouched.
|
|
12
|
+
*/
|
|
13
|
+
export declare function updateCachedMeetingIssues(queryClient: QueryClient, meetingId: Id, update: (issues: readonly IssueInMeeting[]) => IssueInMeeting[] | undefined): void;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { issueKeys } from "../../queries/issue/issues.js";
|
|
2
|
+
import { meetingKeys } from "../../queries/meeting/meetings.js";
|
|
3
|
+
/** Compares ids across bigint, number and string. */
|
|
4
|
+
export const sameId = (id, other) => id != null && String(id) === String(other);
|
|
5
|
+
// The meeting detail prefix also matches meetingKeys.summonsPdf, whose data
|
|
6
|
+
// is the PDF rather than a meeting.
|
|
7
|
+
const isMeeting = (data) => typeof data === "object" && data !== null && "issues" in data;
|
|
8
|
+
/** Finds an issue in any cached page of the company's issue lists. */
|
|
9
|
+
export function findCachedIssue(queryClient, companyId, issueId) {
|
|
10
|
+
return queryClient
|
|
11
|
+
.getQueriesData({ queryKey: [issueKeys.list(companyId)] })
|
|
12
|
+
.flatMap(([, data]) => data?.pages ?? [])
|
|
13
|
+
.flatMap((page) => page?.items ?? [])
|
|
14
|
+
.find((issue) => sameId(issue.id, issueId));
|
|
15
|
+
}
|
|
16
|
+
/** Sets an issue's status in every cached page of the company's issue lists. */
|
|
17
|
+
export function setCachedIssueStatus(queryClient, companyId, issueId, status) {
|
|
18
|
+
const matches = (issue) => sameId(issue.id, issueId);
|
|
19
|
+
queryClient.setQueriesData({ queryKey: [issueKeys.list(companyId)] }, (data) => {
|
|
20
|
+
if (!data?.pages?.some((page) => page?.items?.some(matches))) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
...data,
|
|
25
|
+
pages: data.pages.map((page) => page?.items?.some(matches)
|
|
26
|
+
? {
|
|
27
|
+
...page,
|
|
28
|
+
items: page.items.map((issue) => matches(issue) ? { ...issue, status } : issue),
|
|
29
|
+
}
|
|
30
|
+
: page),
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Replaces the issues of every cached copy of a meeting with what `update`
|
|
36
|
+
* returns for them. Returning undefined leaves that copy untouched.
|
|
37
|
+
*/
|
|
38
|
+
export function updateCachedMeetingIssues(queryClient, meetingId, update) {
|
|
39
|
+
queryClient.setQueriesData({ queryKey: [meetingKeys.detail(meetingId)] }, (meeting) => {
|
|
40
|
+
if (!isMeeting(meeting))
|
|
41
|
+
return undefined;
|
|
42
|
+
const issues = update(meeting.issues ?? []);
|
|
43
|
+
return issues && { ...meeting, issues };
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=meetingIssueCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meetingIssueCache.js","sourceRoot":"","sources":["../../../../src/api/commands/issue/meetingIssueCache.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Id,\n Issue,\n IssueInMeeting,\n IssueStatus,\n MeetingDetails,\n} from \"@solibo/solibo-sdk\";\nimport type { InfiniteData, QueryClient } from \"@tanstack/query-core\";\nimport type { PagedPage } from \"../../../utils/pageUtils.js\";\nimport { issueKeys } from \"../../queries/issue/issues.js\";\nimport { meetingKeys } from \"../../queries/meeting/meetings.js\";\n\n// Optimistic updates for moving issues in and out of meetings. The list and\n// detail queries append their parameters to the wrapped key, so these helpers\n// read and write every entry under the prefix; an exact getQueryData or\n// setQueryData lookup finds none of them. An updater that returns undefined\n// leaves that entry untouched.\n\ntype IssuePages = InfiniteData<PagedPage<Issue>>;\n\n/** Compares ids across bigint, number and string. */\nexport const sameId = (id: Id | null | undefined, other: Id): boolean =>\n id != null && String(id) === String(other);\n\n// The meeting detail prefix also matches meetingKeys.summonsPdf, whose data\n// is the PDF rather than a meeting.\nconst isMeeting = (data: unknown): data is MeetingDetails =>\n typeof data === \"object\" && data !== null && \"issues\" in data;\n\n/** Finds an issue in any cached page of the company's issue lists. */\nexport function findCachedIssue(\n queryClient: QueryClient,\n companyId: Id,\n issueId: Id,\n): Issue | undefined {\n return queryClient\n .getQueriesData<IssuePages>({ queryKey: [issueKeys.list(companyId)] })\n .flatMap(([, data]) => data?.pages ?? [])\n .flatMap((page) => page?.items ?? [])\n .find((issue) => sameId(issue.id, issueId));\n}\n\n/** Sets an issue's status in every cached page of the company's issue lists. */\nexport function setCachedIssueStatus(\n queryClient: QueryClient,\n companyId: Id,\n issueId: Id,\n status: IssueStatus,\n) {\n const matches = (issue: Issue) => sameId(issue.id, issueId);\n queryClient.setQueriesData<IssuePages>(\n { queryKey: [issueKeys.list(companyId)] },\n (data) => {\n if (!data?.pages?.some((page) => page?.items?.some(matches))) {\n return undefined;\n }\n return {\n ...data,\n pages: data.pages.map((page) =>\n page?.items?.some(matches)\n ? {\n ...page,\n items: page.items.map((issue) =>\n matches(issue) ? ({ ...issue, status } as Issue) : issue,\n ),\n }\n : page,\n ),\n };\n },\n );\n}\n\n/**\n * Replaces the issues of every cached copy of a meeting with what `update`\n * returns for them. Returning undefined leaves that copy untouched.\n */\nexport function updateCachedMeetingIssues(\n queryClient: QueryClient,\n meetingId: Id,\n update: (issues: readonly IssueInMeeting[]) => IssueInMeeting[] | undefined,\n) {\n queryClient.setQueriesData<MeetingDetails>(\n { queryKey: [meetingKeys.detail(meetingId)] },\n (meeting) => {\n if (!isMeeting(meeting)) return undefined;\n const issues = update(meeting.issues ?? []);\n return issues && ({ ...meeting, issues } as MeetingDetails);\n },\n );\n}\n"]}
|
|
@@ -6,6 +6,6 @@ export declare function removeIssueFromMeetingMutationOptions(sdk: SoliboClient,
|
|
|
6
6
|
meetingId: Id;
|
|
7
7
|
issueId: Id;
|
|
8
8
|
}) => Promise<void>;
|
|
9
|
-
onSuccess: (
|
|
9
|
+
onSuccess: (_: any, params: any) => Promise<[void, void, void, void]>;
|
|
10
10
|
onError: (_: any, params: any) => Promise<[void, void, void, void]>;
|
|
11
11
|
};
|
|
@@ -1,26 +1,14 @@
|
|
|
1
1
|
import { IssueStatus, } from "@solibo/solibo-sdk";
|
|
2
2
|
import { issueKeys } from "../../queries/issue/issues.js";
|
|
3
3
|
import { meetingKeys } from "../../queries/meeting/meetings.js";
|
|
4
|
+
import { sameId, setCachedIssueStatus, updateCachedMeetingIssues, } from "./meetingIssueCache.js";
|
|
4
5
|
export function removeIssueFromMeetingMutationOptions(sdk, queryClient) {
|
|
5
6
|
const doOptimisticUpdate = (params) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
...meetingBefore,
|
|
12
|
-
issues: issuesInMeeting.filter((issue) => issue.issueId !== params.issueId && issue.id !== params.issueId),
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
// Update issue status back to Open in issue list cache
|
|
16
|
-
const issuesBefore = queryClient.getQueryData([
|
|
17
|
-
issueKeys.list(params.companyId),
|
|
18
|
-
]);
|
|
19
|
-
if (issuesBefore) {
|
|
20
|
-
queryClient.setQueryData([issueKeys.list(params.companyId)], issuesBefore.map((issue) => issue.id === params.issueId
|
|
21
|
-
? { ...issue, status: IssueStatus.Open }
|
|
22
|
-
: issue));
|
|
23
|
-
}
|
|
7
|
+
const matches = (issue) => sameId(issue.issueId, params.issueId);
|
|
8
|
+
updateCachedMeetingIssues(queryClient, params.meetingId, (issues) => issues.some(matches)
|
|
9
|
+
? issues.filter((issue) => !matches(issue))
|
|
10
|
+
: undefined);
|
|
11
|
+
setCachedIssueStatus(queryClient, params.companyId, params.issueId, IssueStatus.Open);
|
|
24
12
|
};
|
|
25
13
|
return {
|
|
26
14
|
mutationFn: (params) => {
|
|
@@ -31,30 +19,19 @@ export function removeIssueFromMeetingMutationOptions(sdk, queryClient) {
|
|
|
31
19
|
issueId: params.issueId,
|
|
32
20
|
});
|
|
33
21
|
},
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
queryKey: [issueKeys.list(params.companyId)],
|
|
48
|
-
}),
|
|
49
|
-
queryClient.invalidateQueries({ queryKey: [issueKeys.all] }),
|
|
50
|
-
queryClient.invalidateQueries({
|
|
51
|
-
queryKey: [issueKeys.detail(params.issueId)],
|
|
52
|
-
}),
|
|
53
|
-
queryClient.invalidateQueries({
|
|
54
|
-
queryKey: [meetingKeys.detail(params.meetingId)],
|
|
55
|
-
}),
|
|
56
|
-
]);
|
|
57
|
-
},
|
|
22
|
+
// The response is empty; the optimistic update already reopened the issue.
|
|
23
|
+
onSuccess: (_, params) => Promise.all([
|
|
24
|
+
queryClient.invalidateQueries({
|
|
25
|
+
queryKey: [issueKeys.list(params.companyId)],
|
|
26
|
+
}),
|
|
27
|
+
queryClient.invalidateQueries({ queryKey: [issueKeys.all] }),
|
|
28
|
+
queryClient.invalidateQueries({
|
|
29
|
+
queryKey: [issueKeys.detail(params.issueId)],
|
|
30
|
+
}),
|
|
31
|
+
queryClient.invalidateQueries({
|
|
32
|
+
queryKey: [meetingKeys.detail(params.meetingId)],
|
|
33
|
+
}),
|
|
34
|
+
]),
|
|
58
35
|
onError: (_, params) => Promise.all([
|
|
59
36
|
queryClient.invalidateQueries({
|
|
60
37
|
queryKey: [issueKeys.list(params.companyId)],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"removeIssueFromMeeting.js","sourceRoot":"","sources":["../../../../src/api/commands/issue/removeIssueFromMeeting.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,
|
|
1
|
+
{"version":3,"file":"removeIssueFromMeeting.js","sourceRoot":"","sources":["../../../../src/api/commands/issue/removeIssueFromMeeting.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,GAEZ,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EACL,MAAM,EACN,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,MAAM,UAAU,qCAAqC,CACnD,GAAiB,EACjB,WAAwB;IAExB,MAAM,kBAAkB,GAAG,CAAC,MAI3B,EAAE,EAAE;QACH,MAAM,OAAO,GAAG,CAAC,KAAqB,EAAE,EAAE,CACxC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,yBAAyB,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAClE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAClB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC,CAAC,SAAS,CACd,CAAC;QACF,oBAAoB,CAClB,WAAW,EACX,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,OAAO,EACd,WAAW,CAAC,IAAI,CACjB,CAAC;IACJ,CAAC,CAAC;IACF,OAAO;QACL,UAAU,EAAE,CAAC,MAAqD,EAAE,EAAE;YACpE,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC;gBACxC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;QACL,CAAC;QACD,2EAA2E;QAC3E,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACvB,OAAO,CAAC,GAAG,CAAC;YACV,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aAC7C,CAAC;YACF,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5D,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aAC7C,CAAC;YACF,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aACjD,CAAC;SACH,CAAC;QACJ,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACrB,OAAO,CAAC,GAAG,CAAC;YACV,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aAC7C,CAAC;YACF,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5D,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aAC7C,CAAC;YACF,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aACjD,CAAC;SACH,CAAC;KACL,CAAC;AACJ,CAAC","sourcesContent":["import {\n Id,\n IssueInMeeting,\n IssueStatus,\n SoliboClient,\n} from \"@solibo/solibo-sdk\";\nimport type { QueryClient } from \"@tanstack/query-core\";\nimport { issueKeys } from \"../../queries/issue/issues.js\";\nimport { meetingKeys } from \"../../queries/meeting/meetings.js\";\nimport {\n sameId,\n setCachedIssueStatus,\n updateCachedMeetingIssues,\n} from \"./meetingIssueCache.js\";\nexport function removeIssueFromMeetingMutationOptions(\n sdk: SoliboClient,\n queryClient: QueryClient,\n) {\n const doOptimisticUpdate = (params: {\n companyId: Id;\n meetingId: Id;\n issueId: Id;\n }) => {\n const matches = (issue: IssueInMeeting) =>\n sameId(issue.issueId, params.issueId);\n updateCachedMeetingIssues(queryClient, params.meetingId, (issues) =>\n issues.some(matches)\n ? issues.filter((issue) => !matches(issue))\n : undefined,\n );\n setCachedIssueStatus(\n queryClient,\n params.companyId,\n params.issueId,\n IssueStatus.Open,\n );\n };\n return {\n mutationFn: (params: { companyId: Id; meetingId: Id; issueId: Id }) => {\n doOptimisticUpdate(params);\n return sdk.api.meeting.deleteMeetingIssue({\n companyId: params.companyId,\n meetingId: params.meetingId,\n issueId: params.issueId,\n });\n },\n // The response is empty; the optimistic update already reopened the issue.\n onSuccess: (_, params) =>\n Promise.all([\n queryClient.invalidateQueries({\n queryKey: [issueKeys.list(params.companyId)],\n }),\n queryClient.invalidateQueries({ queryKey: [issueKeys.all] }),\n queryClient.invalidateQueries({\n queryKey: [issueKeys.detail(params.issueId)],\n }),\n queryClient.invalidateQueries({\n queryKey: [meetingKeys.detail(params.meetingId)],\n }),\n ]),\n onError: (_, params) =>\n Promise.all([\n queryClient.invalidateQueries({\n queryKey: [issueKeys.list(params.companyId)],\n }),\n queryClient.invalidateQueries({ queryKey: [issueKeys.all] }),\n queryClient.invalidateQueries({\n queryKey: [issueKeys.detail(params.issueId)],\n }),\n queryClient.invalidateQueries({\n queryKey: [meetingKeys.detail(params.meetingId)],\n }),\n ]),\n };\n}\n"]}
|
|
@@ -8,6 +8,6 @@ export declare function conversationQueryOptions(sdk: SoliboClient, params: {
|
|
|
8
8
|
queryKey: (Id | readonly ["conversations", "detail", string | number | null | undefined] | null | undefined)[];
|
|
9
9
|
queryFn: () => Promise<import("@solibo/solibo-sdk").Conversation>;
|
|
10
10
|
refetchInterval: number;
|
|
11
|
-
retry: (failureCount:
|
|
11
|
+
retry: (failureCount: number, err: any) => boolean;
|
|
12
12
|
enabled: boolean;
|
|
13
13
|
};
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { seconds } from "../../../utils/dateTime.js";
|
|
2
2
|
import { conversationKeys } from "./conversations.js";
|
|
3
|
+
// The SDK rejects with a SoliboApiError that carries the HTTP status on `status`. Asking again
|
|
4
|
+
// will not change a 4xx, except a timeout (408), "too early" (425), or a rate limit (429).
|
|
5
|
+
function isDefinitiveRejection(err) {
|
|
6
|
+
const status = err?.status;
|
|
7
|
+
return (typeof status === "number" &&
|
|
8
|
+
status >= 400 &&
|
|
9
|
+
status < 500 &&
|
|
10
|
+
![408, 425, 429].includes(status));
|
|
11
|
+
}
|
|
3
12
|
export function conversationQueryOptions(sdk, params) {
|
|
4
13
|
return {
|
|
5
14
|
queryKey: [
|
|
@@ -17,8 +26,9 @@ export function conversationQueryOptions(sdk, params) {
|
|
|
17
26
|
fields: params.fields,
|
|
18
27
|
}),
|
|
19
28
|
refetchInterval: seconds(20),
|
|
29
|
+
// `err: any` keeps the error type useQuery infers from these options as it was.
|
|
20
30
|
retry: (failureCount, err) => {
|
|
21
|
-
if (err
|
|
31
|
+
if (isDefinitiveRejection(err))
|
|
22
32
|
return false;
|
|
23
33
|
return failureCount < 3;
|
|
24
34
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../../../src/api/queries/conversation/conversation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../../../src/api/queries/conversation/conversation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,+FAA+F;AAC/F,2FAA2F;AAC3F,SAAS,qBAAqB,CAAC,GAAY;IACzC,MAAM,MAAM,GAAI,GAAmC,EAAE,MAAM,CAAC;IAC5D,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,IAAI,GAAG;QACb,MAAM,GAAG,GAAG;QACZ,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,GAAiB,EACjB,MAKC;IAED,OAAO;QACL,QAAQ,EAAE;YACR,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;YAC9C,MAAM,CAAC,SAAS;YAChB,MAAM,CAAC,oBAAoB;YAC3B,MAAM,CAAC,MAAM;SACd;QACD,OAAO,EAAE,GAAG,EAAE,CACZ,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,gBAAgB,CAAC;YACrC,SAAS,EAAE,MAAM,CAAC,SAAU;YAC5B,cAAc,EAAE,MAAM,CAAC,cAAe;YACtC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;gBAC/C,CAAC,CAAC,MAAM,CAAC,oBAAoB;gBAC7B,CAAC,CAAC,SAAS;YACb,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;QACJ,eAAe,EAAE,OAAO,CAAC,EAAE,CAAC;QAC5B,gFAAgF;QAChF,KAAK,EAAE,CAAC,YAAoB,EAAE,GAAQ,EAAE,EAAE;YACxC,IAAI,qBAAqB,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC7C,OAAO,YAAY,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc;KACvD,CAAC;AACJ,CAAC","sourcesContent":["import { Id, SoliboClient } from \"@solibo/solibo-sdk\";\nimport { seconds } from \"../../../utils/dateTime.js\";\nimport { conversationKeys } from \"./conversations.js\";\n\n// The SDK rejects with a SoliboApiError that carries the HTTP status on `status`. Asking again\n// will not change a 4xx, except a timeout (408), \"too early\" (425), or a rate limit (429).\nfunction isDefinitiveRejection(err: unknown): boolean {\n const status = (err as { status?: unknown } | null)?.status;\n return (\n typeof status === \"number\" &&\n status >= 400 &&\n status < 500 &&\n ![408, 425, 429].includes(status)\n );\n}\n\nexport function conversationQueryOptions(\n sdk: SoliboClient,\n params: {\n companyId?: Id | null | undefined;\n conversationId?: Id | null | undefined;\n translateToCountryId?: Id | null;\n fields?: string;\n },\n) {\n return {\n queryKey: [\n conversationKeys.detail(params.conversationId),\n params.companyId,\n params.translateToCountryId,\n params.fields,\n ],\n queryFn: () =>\n sdk.api.conversations.showConversation({\n companyId: params.companyId!,\n conversationId: params.conversationId!,\n translateToCountryId: params.translateToCountryId\n ? params.translateToCountryId\n : undefined,\n fields: params.fields,\n }),\n refetchInterval: seconds(20),\n // `err: any` keeps the error type useQuery infers from these options as it was.\n retry: (failureCount: number, err: any) => {\n if (isDefinitiveRejection(err)) return false;\n return failureCount < 3;\n },\n enabled: !!params.companyId && !!params.conversationId,\n };\n}\n"]}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import { SoliboClient } from "@solibo/solibo-sdk";
|
|
1
|
+
import { Id, SoliboClient } from "@solibo/solibo-sdk";
|
|
2
2
|
import { nextPageParam, prevPageParam } from "../../../utils/pageUtils.js";
|
|
3
3
|
export declare function upcomingInvoicingQueryOptions(sdk: SoliboClient, params?: {
|
|
4
|
+
/** Companies to include. Omit it to include every company you can access. */
|
|
5
|
+
companyIds?: Id[] | null;
|
|
4
6
|
fields?: string;
|
|
5
7
|
pageToken?: string;
|
|
6
8
|
autoPaginate?: boolean | null;
|
|
7
9
|
count?: number;
|
|
8
10
|
}): {
|
|
9
11
|
initialPageParam: string | undefined;
|
|
10
|
-
queryKey: (string | number | readonly [
|
|
12
|
+
queryKey: (string | number | readonly string[] | null | undefined)[];
|
|
11
13
|
queryFn: ({ pageParam }: {
|
|
12
14
|
pageParam: any;
|
|
13
15
|
}) => Promise<import("@solibo/solibo-sdk").PagedListGlobalPreview>;
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { nextPageParam, prevPageParam } from "../../../utils/pageUtils.js";
|
|
2
|
+
import { canonicalQueryIds } from "../residentsAndSections/queryIdentity.js";
|
|
2
3
|
import { invoicingKeys } from "./invoicingKeys.js";
|
|
3
4
|
export function upcomingInvoicingQueryOptions(sdk, params) {
|
|
4
5
|
return {
|
|
5
6
|
initialPageParam: params?.pageToken,
|
|
6
7
|
queryKey: [
|
|
7
8
|
invoicingKeys.upcomingInvoicing(),
|
|
9
|
+
canonicalQueryIds(params?.companyIds),
|
|
8
10
|
params?.fields,
|
|
9
11
|
params?.count,
|
|
10
12
|
],
|
|
11
13
|
queryFn: ({ pageParam }) => sdk.api.invoicing.indexUpcomingInvoicing({
|
|
14
|
+
companyIds: params?.companyIds,
|
|
12
15
|
fields: params?.fields,
|
|
13
16
|
pageToken: pageParam,
|
|
14
17
|
autoPaginate: params?.autoPaginate,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upcomingInvoicing.js","sourceRoot":"","sources":["../../../../src/api/queries/invoicing/upcomingInvoicing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,MAAM,UAAU,6BAA6B,CAC3C,GAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"upcomingInvoicing.js","sourceRoot":"","sources":["../../../../src/api/queries/invoicing/upcomingInvoicing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,MAAM,UAAU,6BAA6B,CAC3C,GAAiB,EACjB,MAOC;IAED,OAAO;QACL,gBAAgB,EAAE,MAAM,EAAE,SAAS;QACnC,QAAQ,EAAE;YACR,aAAa,CAAC,iBAAiB,EAAE;YACjC,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC;YACrC,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,KAAK;SACd;QACD,OAAO,EAAE,CAAC,EAAE,SAAS,EAAsB,EAAE,EAAE,CAC7C,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC;YACvC,UAAU,EAAE,MAAM,EAAE,UAAU;YAC9B,MAAM,EAAE,MAAM,EAAE,MAAM;YACtB,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,MAAM,EAAE,YAAY;YAClC,KAAK,EAAE,MAAM,EAAE,KAAK;SACrB,CAAC;QACJ,gBAAgB,EAAE,aAAa;QAC/B,oBAAoB,EAAE,aAAa;KACpC,CAAC;AACJ,CAAC","sourcesContent":["import { Id, SoliboClient } from \"@solibo/solibo-sdk\";\nimport { nextPageParam, prevPageParam } from \"../../../utils/pageUtils.js\";\nimport { canonicalQueryIds } from \"../residentsAndSections/queryIdentity.js\";\nimport { invoicingKeys } from \"./invoicingKeys.js\";\nexport function upcomingInvoicingQueryOptions(\n sdk: SoliboClient,\n params?: {\n /** Companies to include. Omit it to include every company you can access. */\n companyIds?: Id[] | null;\n fields?: string;\n pageToken?: string;\n autoPaginate?: boolean | null;\n count?: number;\n },\n) {\n return {\n initialPageParam: params?.pageToken,\n queryKey: [\n invoicingKeys.upcomingInvoicing(),\n canonicalQueryIds(params?.companyIds),\n params?.fields,\n params?.count,\n ],\n queryFn: ({ pageParam }: { pageParam: any }) =>\n sdk.api.invoicing.indexUpcomingInvoicing({\n companyIds: params?.companyIds,\n fields: params?.fields,\n pageToken: pageParam,\n autoPaginate: params?.autoPaginate,\n count: params?.count,\n }),\n getNextPageParam: nextPageParam,\n getPreviousPageParam: prevPageParam,\n };\n}\n"]}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import { Id, SectionState, SoliboClient } from "@solibo/solibo-sdk";
|
|
1
|
+
import { Id, SectionState, SectionStatusSectionStatusMapValue, SoliboClient } from "@solibo/solibo-sdk";
|
|
2
|
+
/** A section's statuses, keyed by section id and then by status state. */
|
|
3
|
+
export type SectionStatusesBySection = {
|
|
4
|
+
[sectionId: string]: {
|
|
5
|
+
[state: string]: readonly SectionStatusSectionStatusMapValue[];
|
|
6
|
+
};
|
|
7
|
+
};
|
|
2
8
|
export declare function sectionStatusQueryOptions(sdk: SoliboClient, params: {
|
|
3
9
|
companyId?: Id | null | undefined;
|
|
4
10
|
sectionId?: Id | null | undefined;
|
|
@@ -6,9 +12,7 @@ export declare function sectionStatusQueryOptions(sdk: SoliboClient, params: {
|
|
|
6
12
|
fields?: string;
|
|
7
13
|
}): {
|
|
8
14
|
queryKey: (string | SectionState | readonly ["sections", "status", string | number | null | undefined, string | number | null | undefined] | null | undefined)[];
|
|
9
|
-
queryFn: () => Promise<
|
|
10
|
-
[k: string]: import("@solibo/solibo-sdk").SectionStatusSectionStatusMapValue[];
|
|
11
|
-
}>;
|
|
15
|
+
queryFn: () => Promise<SectionStatusesBySection>;
|
|
12
16
|
enabled: boolean;
|
|
13
17
|
};
|
|
14
18
|
export declare function sectionStatusesQueryOptions(sdk: SoliboClient, params: {
|
|
@@ -13,8 +13,11 @@ export function sectionStatusQueryOptions(sdk, params) {
|
|
|
13
13
|
statusType: params.statusType,
|
|
14
14
|
fields: params.fields,
|
|
15
15
|
});
|
|
16
|
-
const
|
|
17
|
-
|
|
16
|
+
const result = {};
|
|
17
|
+
for (const [sectionId, byState] of statuses) {
|
|
18
|
+
result[sectionId] = Object.fromEntries(byState);
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
18
21
|
},
|
|
19
22
|
enabled: !!params.companyId && !!params.sectionId,
|
|
20
23
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sectionStatus.js","sourceRoot":"","sources":["../../../../src/api/queries/residentsAndSections/sectionStatus.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sectionStatus.js","sourceRoot":"","sources":["../../../../src/api/queries/residentsAndSections/sectionStatus.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAO5C,MAAM,UAAU,yBAAyB,CACvC,GAAiB,EACjB,MAKC;IAED,OAAO;QACL,QAAQ,EAAE;YACR,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;YACtD,MAAM,CAAC,UAAU;YACjB,MAAM,CAAC,MAAM;SACd;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBACxD,SAAS,EAAE,MAAM,CAAC,SAAU;gBAC5B,SAAS,EAAE,MAAM,CAAC,SAAU;gBAC5B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CAAC;YACH,MAAM,MAAM,GAA6B,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAC5C,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS;KAClD,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,2BAA2B,CACzC,GAAiB,EACjB,MAMC;IAED,OAAO;QACL,QAAQ,EAAE;YACR,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;YACtC,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,SAAS;YAChB,MAAM,CAAC,YAAY,IAAI,KAAK;YAC5B,MAAM,CAAC,KAAK;SACb;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBACzD,SAAS,EAAE,MAAM,CAAC,SAAU;gBAC5B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK;gBAC1C,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC","sourcesContent":["import {\n Id,\n SectionState,\n SectionStatusSectionStatusMapValue,\n SoliboClient,\n} from \"@solibo/solibo-sdk\";\nimport { sectionKeys } from \"./sections.js\";\n/** A section's statuses, keyed by section id and then by status state. */\nexport type SectionStatusesBySection = {\n [sectionId: string]: {\n [state: string]: readonly SectionStatusSectionStatusMapValue[];\n };\n};\nexport function sectionStatusQueryOptions(\n sdk: SoliboClient,\n params: {\n companyId?: Id | null | undefined;\n sectionId?: Id | null | undefined;\n statusType?: SectionState | null;\n fields?: string;\n },\n) {\n return {\n queryKey: [\n sectionKeys.status(params.companyId, params.sectionId),\n params.statusType,\n params.fields,\n ],\n queryFn: async () => {\n const statuses = await sdk.api.sections.showSectionStatus({\n companyId: params.companyId!,\n sectionId: params.sectionId!,\n statusType: params.statusType,\n fields: params.fields,\n });\n const result: SectionStatusesBySection = {};\n for (const [sectionId, byState] of statuses) {\n result[sectionId] = Object.fromEntries(byState);\n }\n return result;\n },\n enabled: !!params.companyId && !!params.sectionId,\n };\n}\nexport function sectionStatusesQueryOptions(\n sdk: SoliboClient,\n params: {\n companyId?: Id | null | undefined;\n fields?: string;\n pageToken?: string;\n autoPaginate?: boolean | null;\n count?: number;\n },\n) {\n return {\n queryKey: [\n sectionKeys.statuses(params.companyId),\n params.fields,\n params.pageToken,\n params.autoPaginate ?? false,\n params.count,\n ],\n queryFn: async () => {\n const statuses = await sdk.api.sections.indexSectionStatus({\n companyId: params.companyId!,\n fields: params.fields,\n pageToken: params.pageToken,\n autoPaginate: params.autoPaginate ?? false,\n count: params.count,\n });\n return statuses.items;\n },\n enabled: !!params.companyId,\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solibo/solibo-query",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.26.0",
|
|
4
4
|
"description": "Framework-agnostic TanStack Query options for the Solibo Home SDK. Solibo Home is the platform for owning and managing homes in Norway.",
|
|
5
5
|
"homepage": "https://sdk.solibo.no",
|
|
6
6
|
"repository": {
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"buffer": "^6.0.3",
|
|
41
41
|
"hash-wasm": "^4.12.0",
|
|
42
42
|
"mime-types": "^3.0.2",
|
|
43
|
-
"@solibo/solibo-sdk": "1.
|
|
43
|
+
"@solibo/solibo-sdk": "1.26.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@eslint/js": "^10.0.1",
|