@opexa/portal-components 0.0.716 → 0.0.717
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/components/Messages/Messages.lazy.js +7 -2
- package/dist/components/Messages/MessagesPopup.js +4 -1
- package/dist/components/Messages/utils.d.ts +1 -1
- package/dist/components/Messages/utils.js +20 -2
- package/dist/services/queries.d.ts +1 -1
- package/dist/services/queries.js +15 -0
- package/package.json +1 -1
|
@@ -12,6 +12,7 @@ import { useLocaleInfo } from '../../client/hooks/useLocaleInfo.js';
|
|
|
12
12
|
import { useMarkAllMessagesAsReadMutation } from '../../client/hooks/useMarkAllMessagesAsReadMutation.js';
|
|
13
13
|
import { useMarkMessageAsReadMutation } from '../../client/hooks/useMarkMessageAsReadMutation.js';
|
|
14
14
|
import { useMessagesQuery } from '../../client/hooks/useMessagesQuery.js';
|
|
15
|
+
import { useSessionQuery } from '../../client/hooks/useSessionQuery.js';
|
|
15
16
|
import { useUnreadMessagesCountQuery } from '../../client/hooks/useUnreadMessagesCountQuery.js';
|
|
16
17
|
import { NotifExitIcon } from '../../icons/NotifExitIcon.js';
|
|
17
18
|
import { SpinnerIcon } from '../../icons/SpinnerIcon.js';
|
|
@@ -69,6 +70,8 @@ function Message() {
|
|
|
69
70
|
message: ctx.message,
|
|
70
71
|
})));
|
|
71
72
|
const markMessageAsReadMutation = useMarkMessageAsReadMutation();
|
|
73
|
+
const sessionQuery = useSessionQuery();
|
|
74
|
+
const session = sessionQuery.data;
|
|
72
75
|
return (_jsxs("button", { type: "button", className: "flex h-auto flex-shrink-0 cursor-pointer flex-col rounded-xs border border-border-secondary bg-bg-secondary px-3.5 py-2.5 text-left", onClick: () => {
|
|
73
76
|
globalStore.messages.setOpen(false);
|
|
74
77
|
globalStore.message.setOpen(true);
|
|
@@ -78,7 +81,7 @@ function Message() {
|
|
|
78
81
|
}
|
|
79
82
|
}, children: [_jsxs("div", { className: "flex items-center space-x-2", children: [_jsx("p", { className: "font-normal text-text-tertiary-600 text-xs", children: format(new Date(message.dateTimeCreated), 'M/d/yyyy - h:mma', {
|
|
80
83
|
in: tz(localeInfo.timezone),
|
|
81
|
-
}) }), !message.markedAsRead && (_jsx("span", { className: "block size-2.5 rounded-full bg-utility-success-500" }))] }), _jsxs("div", { className: "flex items-center space-x-2", children: [_jsx(MessageIcon, { type: message.icon, className: "size-5 text-brand-400" }), _jsx("h2", { className: "font-semibold text-sm text-text-primary-brand", children: message.title })] }), message.content && (_jsx("div", { className: "mt-2 line-clamp-3 text-wrap font-normal text-sm", dangerouslySetInnerHTML: { __html: message.content } })), message.actions.length > 0 && (_jsx("div", { className: "mt-2 flex flex-wrap items-center justify-end gap-2", children: message.actions.map((action, index) => (_jsx(Link, { className: "rounded-md border border-button-secondary-border px-3 py-2 text-button-secondary-fg text-sm", href: normalizeActionUrl(action.url, {
|
|
84
|
+
}) }), !message.markedAsRead && (_jsx("span", { className: "block size-2.5 rounded-full bg-utility-success-500" }))] }), _jsxs("div", { className: "flex items-center space-x-2", children: [_jsx(MessageIcon, { type: message.icon, className: "size-5 text-brand-400" }), _jsx("h2", { className: "font-semibold text-sm text-text-primary-brand", children: message.title })] }), message.content && (_jsx("div", { className: "mt-2 line-clamp-3 text-wrap font-normal text-sm", dangerouslySetInnerHTML: { __html: message.content } })), message.actions.length > 0 && (_jsx("div", { className: "mt-2 flex flex-wrap items-center justify-end gap-2", children: message.actions.map((action, index) => (_jsx(Link, { className: "rounded-md border border-button-secondary-border px-3 py-2 text-button-secondary-fg text-sm", href: normalizeActionUrl(action.url, session?.token || '', {
|
|
82
85
|
transactionsPageUrl,
|
|
83
86
|
questsPageUrl,
|
|
84
87
|
}), onClick: (e) => {
|
|
@@ -104,11 +107,13 @@ export function MessageDetails() {
|
|
|
104
107
|
}
|
|
105
108
|
return content;
|
|
106
109
|
};
|
|
110
|
+
const sessionQuery = useSessionQuery();
|
|
111
|
+
const session = sessionQuery.data;
|
|
107
112
|
return (_jsx(Dialog.Root, { lazyMount: true, unmountOnExit: true, open: globalStore.message.open, onOpenChange: (details) => {
|
|
108
113
|
globalStore.message.setOpen(details.open);
|
|
109
114
|
}, closeOnEscape: false, closeOnInteractOutside: false, children: _jsxs(Portal, { children: [_jsx(Dialog.Backdrop, { className: "!z-[calc(var(--z-dialog)+1)]" }), _jsx(Dialog.Positioner, { className: "!z-[calc(var(--z-dialog)+2)] flex items-center justify-center", children: _jsxs(Dialog.Content, { className: "mx-auto max-h-[80vh] min-w-[21.438rem] max-w-[21.438rem] overflow-y-auto rounded-xl p-3xl lg:min-w-[25rem] lg:max-w-[25rem]", children: [_jsx(Dialog.CloseTrigger, { children: _jsx(XIcon, {}) }), _jsx("div", { className: "mx-auto flex size-12 items-center justify-center rounded-full bg-bg-brand-secondary text-text-brand", children: _jsx(MessageIcon, { type: message?.icon ?? 'INFO', className: "size-6" }) }), _jsx(Dialog.Title, { className: "mt-lg text-center font-semibold text-lg lg:mt-xl", children: message?.title }), message?.content && (_jsx(Dialog.Description, { className: "mt-xs pb-5 text-center text-sm text-text-secondary-700 [&_li]:mb-1 [&_ol]:list-decimal [&_ol]:pl-5 [&_ol]:text-left [&_ul]:list-disc [&_ul]:pl-5 [&_ul]:text-left", dangerouslySetInnerHTML: {
|
|
110
115
|
__html: transformContent(message?.content),
|
|
111
|
-
} })), message?.image && (_jsx("div", { className: "mt-5 pb-5", children: _jsx(Image, { src: message?.image, alt: "", width: 400, height: 250, loading: "lazy", unoptimized: true, className: "h-auto w-full rounded-sm" }) })), message?.actions.length ? (_jsx("div", { className: "mt-3xl flex flex-col gap-2 text-center lg:mt-4xl", children: message?.actions.map((action, index) => (_jsx(Button, { asChild: true, children: _jsx(Link, { href: normalizeActionUrl(action.url, {
|
|
116
|
+
} })), message?.image && (_jsx("div", { className: "mt-5 pb-5", children: _jsx(Image, { src: message?.image, alt: "", width: 400, height: 250, loading: "lazy", unoptimized: true, className: "h-auto w-full rounded-sm" }) })), message?.actions.length ? (_jsx("div", { className: "mt-3xl flex flex-col gap-2 text-center lg:mt-4xl", children: message?.actions.map((action, index) => (_jsx(Button, { asChild: true, children: _jsx(Link, { href: normalizeActionUrl(action.url, session?.token || '', {
|
|
112
117
|
transactionsPageUrl,
|
|
113
118
|
questsPageUrl,
|
|
114
119
|
}), onClick: (e) => {
|
|
@@ -8,6 +8,7 @@ import { useDisclosure } from '../../client/hooks/useDisclosure.js';
|
|
|
8
8
|
import { useGlobalStore } from '../../client/hooks/useGlobalStore.js';
|
|
9
9
|
import { useMarkMessageAsReadMutation } from '../../client/hooks/useMarkMessageAsReadMutation.js';
|
|
10
10
|
import { useMessagesQuery } from '../../client/hooks/useMessagesQuery.js';
|
|
11
|
+
import { useSessionQuery } from '../../client/hooks/useSessionQuery.js';
|
|
11
12
|
import { ChevronLeftIcon } from '../../icons/ChevronLeftIcon.js';
|
|
12
13
|
import { ChevronRightIcon } from '../../icons/ChevronRightIcon.js';
|
|
13
14
|
import { XIcon } from '../../icons/XIcon.js';
|
|
@@ -108,6 +109,8 @@ export function MessagesPopup() {
|
|
|
108
109
|
}
|
|
109
110
|
return content;
|
|
110
111
|
};
|
|
112
|
+
const sessionQuery = useSessionQuery();
|
|
113
|
+
const session = sessionQuery.data;
|
|
111
114
|
return (_jsx(Dialog.Root, { open: disclosure.open &&
|
|
112
115
|
!paused &&
|
|
113
116
|
!globalStore.kyc.open &&
|
|
@@ -117,7 +120,7 @@ export function MessagesPopup() {
|
|
|
117
120
|
setIndex(details.page);
|
|
118
121
|
}, slideCount: messages.length, allowMouseDrag: true, autoplay: false, children: [_jsx(Carousel.ItemGroup, { children: messages.map((message, index) => (_jsxs(Carousel.Item, { index: index, className: "select-none", children: [_jsx("div", { className: "mx-auto flex size-12 items-center justify-center rounded-full bg-bg-brand-secondary text-text-brand", children: _jsx(MessageIcon, { type: message.icon, className: "size-6" }) }), _jsx("h2", { className: "mt-lg text-center font-semibold text-lg xl:mt-xl", children: message.title }), message.content && (_jsx("div", { dangerouslySetInnerHTML: {
|
|
119
122
|
__html: transformContent(message.content),
|
|
120
|
-
}, className: "mt-xs pb-5 text-left text-sm text-text-secondary-700 [&_li>ol]:list-decimal [&_li>ol]:pl-5 [&_li>ul]:list-disc [&_li>ul]:pl-5 [&_li]:mb-1 [&_ol]:list-decimal [&_ol]:pl-5 [&_ul]:list-disc [&_ul]:pl-5" })), message.image && (_jsx("div", { className: "mt-5 pb-5", children: _jsx(Image, { src: message.image, alt: "", width: 400, height: 250, loading: "lazy", unoptimized: true, className: "h-auto w-full rounded-sm" }) })), message.actions.length ? (_jsx("div", { className: "mt-3xl flex flex-col gap-2 text-center lg:mt-4xl", children: message.actions.map((action, index) => (_jsx(Button, { asChild: true, children: _jsx(Link, { href: normalizeActionUrl(action.url, {
|
|
123
|
+
}, className: "mt-xs pb-5 text-left text-sm text-text-secondary-700 [&_li>ol]:list-decimal [&_li>ol]:pl-5 [&_li>ul]:list-disc [&_li>ul]:pl-5 [&_li]:mb-1 [&_ol]:list-decimal [&_ol]:pl-5 [&_ul]:list-disc [&_ul]:pl-5" })), message.image && (_jsx("div", { className: "mt-5 pb-5", children: _jsx(Image, { src: message.image, alt: "", width: 400, height: 250, loading: "lazy", unoptimized: true, className: "h-auto w-full rounded-sm" }) })), message.actions.length ? (_jsx("div", { className: "mt-3xl flex flex-col gap-2 text-center lg:mt-4xl", children: message.actions.map((action, index) => (_jsx(Button, { asChild: true, children: _jsx(Link, { href: normalizeActionUrl(action.url, session?.token || '', {
|
|
121
124
|
questsPageUrl,
|
|
122
125
|
transactionsPageUrl,
|
|
123
126
|
}), onClick: () => {
|
|
@@ -2,5 +2,5 @@ interface NormalizeActionUrlOptions {
|
|
|
2
2
|
transactionsPageUrl: string;
|
|
3
3
|
questsPageUrl: string;
|
|
4
4
|
}
|
|
5
|
-
export declare function normalizeActionUrl(value: string, options: NormalizeActionUrlOptions): string;
|
|
5
|
+
export declare function normalizeActionUrl(value: string, token: string, options: NormalizeActionUrlOptions): string;
|
|
6
6
|
export {};
|
|
@@ -1,4 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
const QUEST_MILESTONE_LINK_REGEX = /^https:\/\/api\.trigger\.(?:development\.)?opexa\.io\/v1\/quests\/([^/]+)\/milestones\/([^/]+)\/link\/?$/;
|
|
2
|
+
function isQuestMilestoneLink(url) {
|
|
3
|
+
const m = url.match(QUEST_MILESTONE_LINK_REGEX);
|
|
4
|
+
if (!m)
|
|
5
|
+
return { match: false };
|
|
6
|
+
return { match: true, questId: m[1], milestoneId: m[2] };
|
|
7
|
+
}
|
|
8
|
+
function appendTokenIfCustomLinkMilestone(url, token) {
|
|
9
|
+
if (!token)
|
|
10
|
+
return url;
|
|
11
|
+
if (!isQuestMilestoneLink(url).match)
|
|
12
|
+
return url;
|
|
13
|
+
const u = new URL(url);
|
|
14
|
+
if (!u.searchParams.has('token')) {
|
|
15
|
+
u.searchParams.set('token', token);
|
|
16
|
+
}
|
|
17
|
+
return u.toString();
|
|
18
|
+
}
|
|
19
|
+
export function normalizeActionUrl(value, token, options) {
|
|
2
20
|
const searchParams = new URLSearchParams(value);
|
|
3
21
|
if (value === 'quests') {
|
|
4
22
|
return options.questsPageUrl;
|
|
@@ -13,5 +31,5 @@ export function normalizeActionUrl(value, options) {
|
|
|
13
31
|
return `${options.transactionsPageUrl}?tab=withdrawals&id=${searchParams.get('id')}`;
|
|
14
32
|
}
|
|
15
33
|
}
|
|
16
|
-
return value;
|
|
34
|
+
return appendTokenIfCustomLinkMilestone(value, token);
|
|
17
35
|
}
|
|
@@ -14,7 +14,7 @@ export declare const END_GAME_SESSION = "\n mutation EndGameSession($input: End
|
|
|
14
14
|
export declare const END_GAME_SESSION__LEGACY = "\n mutation EndGameSession($input: EndGameSessionInput!) {\n endGameSession(input: $input) {\n ... on GameSessionDoesNotExistError {\n name: __typename\n message\n }\n ... on GameSessionAlreadyClosedError {\n name: __typename\n message\n }\n ... on GameProviderError {\n name: __typename\n message\n }\n }\n }\n";
|
|
15
15
|
export declare const RECOMMENDED_GAMES = "\n query RecommendedGames {\n recommendedGames {\n id\n name\n type\n provider\n }\n }\n";
|
|
16
16
|
export declare const ANNOUNCEMENTS = "\n query Announcements(\n $first: Int\n $after: Cursor\n $filter: AnnouncementFilterInput\n ) {\n announcements(first: $first, after: $after, filter: $filter) {\n edges {\n cursor\n node {\n ... on Announcement {\n id\n type\n title\n status\n message\n activationStartDateTime\n activationEndDateTime\n dateTimeCreated\n dateTimeLastUpdated\n }\n }\n }\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n";
|
|
17
|
-
export declare const WITHDRAWAL_RECORDS = "\n query WithdrawalRecords(\n $first: Int\n $after: Cursor\n $filter: WithdrawalRecordFilterInput\n ) {\n member {\n withdrawalRecords(first: $first, after: $after, filter: $filter) {\n edges {\n cursor\n node {\n ... on BankWithdrawalRecord {\n id\n type\n bank\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on GCashWithdrawalRecord {\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n recipientMobileNumber\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on ManualWithdrawalRecord {\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on MayaAppWithdrawalRecord {\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on InstapayWithdrawalRecord {\n id\n type\n fee\n netAmount\n bankName\n reference\n accountName\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on ManualUPIWithdrawalRecord {\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on ManualBankWithdrawalRecord {\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on VentajaDisbursementWithdrawalRecord {\n bankName\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on PisoPayRemittanceWithdrawalRecord {\n bankName\n id\n type\n fee\n accountName\n accountNumber\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n }\n }\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n";
|
|
17
|
+
export declare const WITHDRAWAL_RECORDS = "\n query WithdrawalRecords(\n $first: Int\n $after: Cursor\n $filter: WithdrawalRecordFilterInput\n ) {\n member {\n withdrawalRecords(first: $first, after: $after, filter: $filter) {\n edges {\n cursor\n node {\n ... on BankWithdrawalRecord {\n id\n type\n bank\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on GCashWithdrawalRecord {\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n recipientMobileNumber\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on ManualWithdrawalRecord {\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on MayaAppWithdrawalRecord {\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on InstapayWithdrawalRecord {\n id\n type\n fee\n netAmount\n bankName\n reference\n accountName\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on ManualUPIWithdrawalRecord {\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on ManualBankWithdrawalRecord {\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on VentajaDisbursementWithdrawalRecord {\n bankName\n id\n type\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on PisoPayRemittanceWithdrawalRecord {\n bankName\n id\n type\n fee\n accountName\n accountNumber\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n ... on GCashStandardCashInWithdrawalRecord {\n id\n type\n bank\n fee\n netAmount\n reference\n amount\n status\n error\n withdrawalNumber\n serialCode\n dateTimeCreated\n dateTimeLastUpdated\n }\n }\n }\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n";
|
|
18
18
|
export declare const CREATE_GCASH_WITHDRAWAL = "\n mutation CreateGCashWithdrawal($input: CreateGCashWithdrawalInput!) {\n createGCashWithdrawal(input: $input) {\n ... on AccountNotVerifiedError {\n name: __typename\n message\n }\n ... on InvalidTransactionPasswordError {\n name: __typename\n message\n }\n ... on InvalidWithdrawalAmountError {\n name: __typename\n message\n }\n ... on MobileNumberNotVerifiedError {\n name: __typename\n message\n }\n ... on NotEnoughBalanceError {\n name: __typename\n message\n }\n ... on WithdrawalDailyLimitExceededError {\n name: __typename\n message\n }\n ... on ReCAPTCHAVerificationFailedError {\n name: __typename\n message\n }\n ... on WalletDoesNotExistError {\n name: __typename\n message\n }\n ... on TransactionPasswordNotSetError {\n name: __typename\n message\n }\n ... on TurnoverRequirementNotYetFulfilledError {\n name: __typename\n message\n }\n }\n }\n";
|
|
19
19
|
export declare const CREATE_GCASH_STANDARD_CASH_IN_WITHDRAWAL = "\n mutation CreateGCashStandardCashInWithdrawal(\n $input: CreateGCashStandardCashInWithdrawalInput!\n ) {\n createGCashStandardCashInWithdrawal(input: $input) {\n ... on AccountNotVerifiedError {\n name: __typename\n message\n }\n ... on InvalidTransactionPasswordError {\n name: __typename\n message\n }\n ... on InvalidWithdrawalAmountError {\n name: __typename\n message\n }\n ... on MobileNumberNotVerifiedError {\n name: __typename\n message\n }\n ... on NotEnoughBalanceError {\n name: __typename\n message\n }\n ... on WithdrawalDailyLimitExceededError {\n name: __typename\n message\n }\n ... on ReCAPTCHAVerificationFailedError {\n name: __typename\n message\n }\n ... on WalletDoesNotExistError {\n name: __typename\n message\n }\n ... on TransactionPasswordNotSetError {\n name: __typename\n message\n }\n ... on TurnoverRequirementNotYetFulfilledError {\n name: __typename\n message\n }\n }\n }\n";
|
|
20
20
|
export declare const CREATE_MAYA_WITHDRAWAL = "\n mutation CreateMayaWithdrawal($input: CreateMayaWithdrawalInput!) {\n createMayaWithdrawal(input: $input) {\n ... on AccountNotVerifiedError {\n name: __typename\n message\n }\n ... on InvalidTransactionPasswordError {\n name: __typename\n message\n }\n ... on InvalidWithdrawalAmountError {\n name: __typename\n message\n }\n ... on MobileNumberNotVerifiedError {\n name: __typename\n message\n }\n ... on NotEnoughBalanceError {\n name: __typename\n message\n }\n ... on WithdrawalDailyLimitExceededError {\n name: __typename\n message\n }\n ... on TurnoverRequirementNotYetFulfilledError {\n name: __typename\n message\n }\n }\n }\n";
|
package/dist/services/queries.js
CHANGED
|
@@ -379,6 +379,21 @@ export const WITHDRAWAL_RECORDS = /* GraphQL */ `
|
|
|
379
379
|
dateTimeCreated
|
|
380
380
|
dateTimeLastUpdated
|
|
381
381
|
}
|
|
382
|
+
... on GCashStandardCashInWithdrawalRecord {
|
|
383
|
+
id
|
|
384
|
+
type
|
|
385
|
+
bank
|
|
386
|
+
fee
|
|
387
|
+
netAmount
|
|
388
|
+
reference
|
|
389
|
+
amount
|
|
390
|
+
status
|
|
391
|
+
error
|
|
392
|
+
withdrawalNumber
|
|
393
|
+
serialCode
|
|
394
|
+
dateTimeCreated
|
|
395
|
+
dateTimeLastUpdated
|
|
396
|
+
}
|
|
382
397
|
}
|
|
383
398
|
}
|
|
384
399
|
totalCount
|