@zeniai/client-epic-state 4.19.97-betaRR0 → 4.19.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/lib/entity/account/accountPayload.d.ts +0 -2
  2. package/lib/entity/account/accountPayload.js +0 -2
  3. package/lib/entity/account/accountState.d.ts +0 -2
  4. package/lib/entity/depositAccount/depositAccount.d.ts +1 -1
  5. package/lib/entity/depositAccount/depositAccount.js +1 -8
  6. package/lib/entity/reimbursement/reimbursementPayload.d.ts +0 -2
  7. package/lib/entity/reimbursement/reimbursementPayload.js +0 -7
  8. package/lib/entity/reimbursement/reimbursementState.d.ts +0 -2
  9. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  10. package/lib/entity/snackbar/snackbarTypes.js +0 -1
  11. package/lib/entity/task/taskPayload.d.ts +0 -1
  12. package/lib/entity/task/taskPayload.js +0 -1
  13. package/lib/entity/task/taskState.d.ts +0 -1
  14. package/lib/epic.d.ts +1 -17
  15. package/lib/epic.js +1 -17
  16. package/lib/esm/entity/account/accountPayload.js +0 -2
  17. package/lib/esm/entity/depositAccount/depositAccount.js +1 -8
  18. package/lib/esm/entity/reimbursement/reimbursementPayload.js +0 -7
  19. package/lib/esm/entity/snackbar/snackbarTypes.js +0 -1
  20. package/lib/esm/entity/task/taskPayload.js +0 -1
  21. package/lib/esm/epic.js +1 -17
  22. package/lib/esm/index.js +5 -14
  23. package/lib/esm/reducer.js +0 -9
  24. package/lib/esm/view/expenseAutomationView/epics/accountRecon/saveReconciliationReviewEpic.js +3 -8
  25. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/uploadMissingReceiptSuccessEpic.js +5 -7
  26. package/lib/esm/view/expenseAutomationView/payload/missingReceiptsPayload.js +1 -189
  27. package/lib/esm/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +2 -433
  28. package/lib/esm/view/expenseAutomationView/reducers/transactionsViewReducer.js +1 -23
  29. package/lib/esm/view/expenseAutomationView/selectors/missingReceiptsSelector.js +1 -244
  30. package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +1 -2
  31. package/lib/esm/view/expenseAutomationView/types/missingReceiptsViewState.js +0 -44
  32. package/lib/esm/view/expenseAutomationView/types/transactionsViewState.js +1 -2
  33. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/chargeCardListReducer.js +1 -14
  34. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +1 -1
  35. package/lib/esm/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +0 -1
  36. package/lib/esm/view/taskManager/taskListView/taskListSelector.js +1 -3
  37. package/lib/esm/view/userListView/fetchUserListByTypeEpic.js +0 -11
  38. package/lib/esm/zeniAPI.js +2 -0
  39. package/lib/index.d.ts +6 -14
  40. package/lib/index.js +32 -95
  41. package/lib/reducer.d.ts +0 -9
  42. package/lib/reducer.js +0 -9
  43. package/lib/view/expenseAutomationView/epics/accountRecon/saveReconciliationReviewEpic.js +3 -8
  44. package/lib/view/expenseAutomationView/epics/missingReceipts/uploadMissingReceiptSuccessEpic.js +5 -7
  45. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  46. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.d.ts +0 -118
  47. package/lib/view/expenseAutomationView/payload/missingReceiptsPayload.js +0 -201
  48. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.d.ts +3 -76
  49. package/lib/view/expenseAutomationView/reducers/missingReceiptsViewReducer.js +2 -434
  50. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +3 -11
  51. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.js +2 -24
  52. package/lib/view/expenseAutomationView/selectorTypes/missingReceiptsSelectorTypes.d.ts +1 -69
  53. package/lib/view/expenseAutomationView/selectorTypes/transactionsViewSelectorTypes.d.ts +0 -1
  54. package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.d.ts +1 -1
  55. package/lib/view/expenseAutomationView/selectors/missingReceiptsSelector.js +0 -243
  56. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +1 -2
  57. package/lib/view/expenseAutomationView/types/missingReceiptsViewState.d.ts +0 -142
  58. package/lib/view/expenseAutomationView/types/missingReceiptsViewState.js +1 -54
  59. package/lib/view/expenseAutomationView/types/transactionsViewState.d.ts +1 -2
  60. package/lib/view/expenseAutomationView/types/transactionsViewState.js +1 -2
  61. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListReducer.d.ts +1 -4
  62. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardListReducer.js +2 -15
  63. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +1 -1
  64. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.d.ts +0 -1
  65. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +0 -1
  66. package/lib/view/taskManager/taskListView/taskListSelector.d.ts +0 -2
  67. package/lib/view/taskManager/taskListView/taskListSelector.js +1 -3
  68. package/lib/view/userListView/fetchUserListByTypeEpic.d.ts +1 -3
  69. package/lib/view/userListView/fetchUserListByTypeEpic.js +0 -11
  70. package/lib/view/userListView/userListViewPayload.d.ts +0 -2
  71. package/lib/zeniAPI.js +2 -0
  72. package/package.json +2 -2
  73. package/lib/entity/userGroups/userGroupsPayload.d.ts +0 -7
  74. package/lib/entity/userGroups/userGroupsPayload.js +0 -10
  75. package/lib/entity/userGroups/userGroupsReducer.d.ts +0 -8
  76. package/lib/entity/userGroups/userGroupsReducer.js +0 -29
  77. package/lib/entity/userGroups/userGroupsSelector.d.ts +0 -4
  78. package/lib/entity/userGroups/userGroupsSelector.js +0 -12
  79. package/lib/entity/userGroups/userGroupsState.d.ts +0 -9
  80. package/lib/entity/userGroups/userGroupsState.js +0 -2
  81. package/lib/esm/entity/userGroups/userGroupsPayload.js +0 -7
  82. package/lib/esm/entity/userGroups/userGroupsReducer.js +0 -25
  83. package/lib/esm/entity/userGroups/userGroupsSelector.js +0 -8
  84. package/lib/esm/entity/userGroups/userGroupsState.js +0 -1
  85. package/lib/esm/view/expenseAutomationView/bulkUploadTiming.js +0 -10
  86. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +0 -29
  87. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic.js +0 -49
  88. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +0 -40
  89. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +0 -47
  90. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +0 -61
  91. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js +0 -33
  92. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +0 -56
  93. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +0 -77
  94. package/lib/esm/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +0 -79
  95. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/uploadTransactionReceiptSuccessEpic.js +0 -24
  96. package/lib/esm/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingDataRequests.js +0 -58
  97. package/lib/esm/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingPayload.js +0 -1
  98. package/lib/esm/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingReducer.js +0 -103
  99. package/lib/esm/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingSelector.js +0 -63
  100. package/lib/esm/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingState.js +0 -5
  101. package/lib/esm/view/spendManagement/chargeCards/cardsOnboarding/createAllAiRecommendedCardsEpic.js +0 -62
  102. package/lib/esm/view/spendManagement/chargeCards/cardsOnboarding/fetchAiCardRecommendationEpic.js +0 -4
  103. package/lib/esm/view/spendManagement/chargeCards/cardsOnboarding/fetchChainOfThoughtsForAiCardRecommendationEpic.js +0 -4
  104. package/lib/esm/view/spendManagement/chargeCards/cardsOnboarding/startAiCardAgentDrawerDataLoadEpic.js +0 -10
  105. package/lib/esm/view/spendManagement/chargeCards/chargeCardList/fetchCardsOnboardingPageEpic.js +0 -36
  106. package/lib/esm/view/userGroupListView/userGroupListViewReducer.js +0 -65
  107. package/lib/esm/view/userGroupListView/userGroupListViewSelector.js +0 -16
  108. package/lib/esm/view/userGroupListView/userGroupListViewState.js +0 -1
  109. package/lib/view/expenseAutomationView/bulkUploadTiming.d.ts +0 -10
  110. package/lib/view/expenseAutomationView/bulkUploadTiming.js +0 -13
  111. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.d.ts +0 -18
  112. package/lib/view/expenseAutomationView/epics/missingReceipts/bulkUploadReceiptsEpic.js +0 -33
  113. package/lib/view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic.d.ts +0 -7
  114. package/lib/view/expenseAutomationView/epics/missingReceipts/confirmBulkUploadMatchEpic.js +0 -53
  115. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.d.ts +0 -8
  116. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchDetailsEpic.js +0 -44
  117. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.d.ts +0 -7
  118. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchBulkUploadBatchesEpic.js +0 -51
  119. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.d.ts +0 -8
  120. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchCompletedTransactionsEpic.js +0 -65
  121. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.d.ts +0 -8
  122. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMoreBatchDetailsEpic.js +0 -37
  123. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.d.ts +0 -9
  124. package/lib/view/expenseAutomationView/epics/missingReceipts/fetchMultipleBatchDetailsEpic.js +0 -61
  125. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.d.ts +0 -14
  126. package/lib/view/expenseAutomationView/epics/missingReceipts/searchTransactionsForManualMatchEpic.js +0 -81
  127. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.d.ts +0 -25
  128. package/lib/view/expenseAutomationView/epics/missingReceipts/watchBulkUploadBatchStatusEpic.js +0 -85
  129. package/lib/view/expenseAutomationView/epics/transactionCategorization/uploadTransactionReceiptSuccessEpic.d.ts +0 -7
  130. package/lib/view/expenseAutomationView/epics/transactionCategorization/uploadTransactionReceiptSuccessEpic.js +0 -28
  131. package/lib/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingDataRequests.d.ts +0 -7
  132. package/lib/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingDataRequests.js +0 -62
  133. package/lib/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingPayload.d.ts +0 -34
  134. package/lib/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingPayload.js +0 -2
  135. package/lib/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingReducer.d.ts +0 -7
  136. package/lib/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingReducer.js +0 -107
  137. package/lib/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingSelector.d.ts +0 -16
  138. package/lib/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingSelector.js +0 -67
  139. package/lib/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingState.d.ts +0 -63
  140. package/lib/view/spendManagement/chargeCards/cardsOnboarding/cardsOnboardingState.js +0 -8
  141. package/lib/view/spendManagement/chargeCards/cardsOnboarding/createAllAiRecommendedCardsEpic.d.ts +0 -20
  142. package/lib/view/spendManagement/chargeCards/cardsOnboarding/createAllAiRecommendedCardsEpic.js +0 -66
  143. package/lib/view/spendManagement/chargeCards/cardsOnboarding/fetchAiCardRecommendationEpic.d.ts +0 -8
  144. package/lib/view/spendManagement/chargeCards/cardsOnboarding/fetchAiCardRecommendationEpic.js +0 -8
  145. package/lib/view/spendManagement/chargeCards/cardsOnboarding/fetchChainOfThoughtsForAiCardRecommendationEpic.d.ts +0 -13
  146. package/lib/view/spendManagement/chargeCards/cardsOnboarding/fetchChainOfThoughtsForAiCardRecommendationEpic.js +0 -8
  147. package/lib/view/spendManagement/chargeCards/cardsOnboarding/startAiCardAgentDrawerDataLoadEpic.d.ts +0 -13
  148. package/lib/view/spendManagement/chargeCards/cardsOnboarding/startAiCardAgentDrawerDataLoadEpic.js +0 -14
  149. package/lib/view/spendManagement/chargeCards/chargeCardList/fetchCardsOnboardingPageEpic.d.ts +0 -12
  150. package/lib/view/spendManagement/chargeCards/chargeCardList/fetchCardsOnboardingPageEpic.js +0 -40
  151. package/lib/view/userGroupListView/userGroupListViewReducer.d.ts +0 -23
  152. package/lib/view/userGroupListView/userGroupListViewReducer.js +0 -69
  153. package/lib/view/userGroupListView/userGroupListViewSelector.d.ts +0 -7
  154. package/lib/view/userGroupListView/userGroupListViewSelector.js +0 -20
  155. package/lib/view/userGroupListView/userGroupListViewState.d.ts +0 -8
  156. package/lib/view/userGroupListView/userGroupListViewState.js +0 -2
@@ -1,85 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pollBulkUploadBatchStatusEpic = exports.bulkUploadAutomatchingTimeoutEpic = exports.pusherBatchStatusCompletionEpic = void 0;
4
- const rxjs_1 = require("rxjs");
5
- const operators_1 = require("rxjs/operators");
6
- const snackbarReducer_1 = require("../../../../entity/snackbar/snackbarReducer");
7
- const transactionReducer_1 = require("../../../../entity/transaction/transactionReducer");
8
- const responsePayload_1 = require("../../../../responsePayload");
9
- const bulkUploadTiming_1 = require("../../bulkUploadTiming");
10
- const missingReceiptsPayload_1 = require("../../payload/missingReceiptsPayload");
11
- const missingReceiptsViewReducer_1 = require("../../reducers/missingReceiptsViewReducer");
12
- /** First poll after upload; then interval while batch not resolved via Pusher or API. */
13
- const FALLBACK_FIRST_DELAY_MS = 30000;
14
- const FALLBACK_POLL_INTERVAL_MS = 10000;
15
- /**
16
- * On Pusher batch completion: refresh batch list (then fetchMultipleBatchDetailsEpic runs),
17
- * and request switching to the Unmatched tab. Debounced to reduce duplicate refreshes.
18
- */
19
- const pusherBatchStatusCompletionEpic = (actions$) => actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.pusherBatchStatusUpdate.match), (0, operators_1.filter)((action) => action.payload.status === 'completed'), (0, operators_1.debounceTime)(300), (0, operators_1.mergeMap)(() => (0, rxjs_1.from)([
20
- (0, missingReceiptsViewReducer_1.fetchBulkUploadBatches)({
21
- cacheOverride: true,
22
- invalidateBatchDetailsCache: true,
23
- }),
24
- (0, missingReceiptsViewReducer_1.requestMissingReceiptsTabNavigation)({ tab: 'unmatched' }),
25
- ])));
26
- exports.pusherBatchStatusCompletionEpic = pusherBatchStatusCompletionEpic;
27
- /**
28
- * If Pusher and batch-details are delayed beyond {@link BULK_UPLOAD_AUTOMATCHING_TIMEOUT_MS},
29
- * force `phase` to `completed` (dismiss automatching banner) and refresh the batch list.
30
- * Cancels when the batch completes normally, bulk state is cleared, or another upload supersedes.
31
- */
32
- const bulkUploadAutomatchingTimeoutEpic = (actions$, state$) => actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.bulkUploadReceiptsSuccess.match), (0, operators_1.mergeMap)((action) => {
33
- const { batchId } = action.payload;
34
- return (0, rxjs_1.timer)(bulkUploadTiming_1.BULK_UPLOAD_AUTOMATCHING_TIMEOUT_MS).pipe((0, operators_1.mergeMap)(() => {
35
- const bulk = state$.value.expenseAutomationMissingReceiptsViewState.bulkUpload;
36
- if (bulk.phase !== 'matching' || bulk.currentBatchId !== batchId) {
37
- return rxjs_1.EMPTY;
38
- }
39
- return (0, rxjs_1.from)([
40
- (0, missingReceiptsViewReducer_1.bulkUploadAutomatchingTimedOut)(batchId),
41
- (0, missingReceiptsViewReducer_1.fetchBulkUploadBatches)({ cacheOverride: true }),
42
- ]);
43
- }), (0, operators_1.takeUntil)((0, rxjs_1.merge)(actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.clearBulkUpload.match)), actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.pusherBatchStatusUpdate.match), (0, operators_1.filter)((a) => a.payload.batchId === batchId &&
44
- a.payload.status === 'completed')), actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.fetchBulkUploadBatchDetailsSuccess.match), (0, operators_1.filter)((a) => a.payload.batchId === batchId)))));
45
- }));
46
- exports.bulkUploadAutomatchingTimeoutEpic = bulkUploadAutomatchingTimeoutEpic;
47
- /**
48
- * Fallback polling when Pusher is slow or unavailable. Network errors on a poll tick show one
49
- * error snackbar per upload session (first failure only) so the user is not spammed every
50
- * interval; Pusher or a later successful poll still completes the flow.
51
- */
52
- const pollBulkUploadBatchStatusEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.bulkUploadReceiptsSuccess.match), (0, operators_1.mergeMap)((action) => {
53
- const { batchId } = action.payload;
54
- let pollErrorNotified = false;
55
- return (0, rxjs_1.timer)(FALLBACK_FIRST_DELAY_MS, FALLBACK_POLL_INTERVAL_MS).pipe((0, operators_1.takeUntil)((0, rxjs_1.merge)(actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.clearBulkUpload.match)), actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.pusherBatchStatusUpdate.match), (0, operators_1.filter)((action) => action.payload.batchId === batchId)), actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.fetchBulkUploadBatchDetailsSuccess.match), (0, operators_1.filter)((action) => action.payload.batchId === batchId)), actions$.pipe((0, operators_1.filter)(missingReceiptsViewReducer_1.bulkUploadAutomatchingTimedOut.match), (0, operators_1.filter)((action) => action.payload.batchId === batchId)))), (0, operators_1.switchMap)(() => zeniAPI
56
- .getJSON(`${zeniAPI.apiEndPoints.communicationAgentMicroServiceBaseUrl}/1.0/batches/${batchId}`)
57
- .pipe((0, operators_1.mergeMap)((response) => {
58
- /** Same batch-details URL; polls until `status` is completed (Pusher may win first). */
59
- if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
60
- if ((0, missingReceiptsPayload_1.isBatchDetailsApiStatusCompleted)(response.data.status)) {
61
- const actions = [];
62
- const transactionPayloads = (0, missingReceiptsPayload_1.extractTransactionPayloadsFromBatchFiles)(response.data.files);
63
- if (transactionPayloads.length > 0) {
64
- actions.push((0, transactionReducer_1.updateTransactions)(transactionPayloads, (value) => value.transaction_id));
65
- }
66
- actions.push((0, missingReceiptsViewReducer_1.fetchBulkUploadBatchDetailsSuccess)((0, missingReceiptsPayload_1.toBatchDetails)(response.data, zeniAPI.apiEndPoints.fileMicroServiceBaseUrl)));
67
- actions.push((0, missingReceiptsViewReducer_1.fetchBulkUploadBatches)({ cacheOverride: true }));
68
- actions.push((0, missingReceiptsViewReducer_1.requestMissingReceiptsTabNavigation)({ tab: 'unmatched' }));
69
- return (0, rxjs_1.from)(actions);
70
- }
71
- }
72
- return rxjs_1.EMPTY;
73
- }), (0, operators_1.catchError)(() => {
74
- if (!pollErrorNotified) {
75
- pollErrorNotified = true;
76
- return (0, rxjs_1.of)((0, snackbarReducer_1.openSnackbar)({
77
- messageSection: 'receipts_upload',
78
- messageText: 'failed',
79
- type: 'error',
80
- }));
81
- }
82
- return rxjs_1.EMPTY;
83
- }))));
84
- }));
85
- exports.pollBulkUploadBatchStatusEpic = pollBulkUploadBatchStatusEpic;
@@ -1,7 +0,0 @@
1
- import { ActionsObservable, StateObservable } from 'redux-observable';
2
- import { updateTransaction } from '../../../../entity/transaction/transactionReducer';
3
- import { RootState } from '../../../../reducer';
4
- import { fetchMonthEndCloseChecks } from '../../../monthEndCloseChecksView/monthEndCloseChecksViewReducer';
5
- import { uploadTransactionCategorizationReceiptSuccess } from '../../reducers/transactionsViewReducer';
6
- export type ActionType = ReturnType<typeof uploadTransactionCategorizationReceiptSuccess> | ReturnType<typeof fetchMonthEndCloseChecks> | ReturnType<typeof updateTransaction>;
7
- export declare const uploadTransactionReceiptSuccessEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>) => import("rxjs").Observable<ActionType>;
@@ -1,28 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.uploadTransactionReceiptSuccessEpic = void 0;
4
- const rxjs_1 = require("rxjs");
5
- const operators_1 = require("rxjs/operators");
6
- const tenantSelector_1 = require("../../../../entity/tenant/tenantSelector");
7
- const transactionReducer_1 = require("../../../../entity/transaction/transactionReducer");
8
- const monthEndCloseChecksViewReducer_1 = require("../../../monthEndCloseChecksView/monthEndCloseChecksViewReducer");
9
- const transactionsViewReducer_1 = require("../../reducers/transactionsViewReducer");
10
- const uploadTransactionReceiptSuccessEpic = (actions$, state$) => actions$.pipe((0, operators_1.filter)(transactionsViewReducer_1.uploadTransactionCategorizationReceiptSuccess.match), (0, operators_1.mergeMap)((action) => {
11
- const { transactionPayload, updateType } = action.payload;
12
- const updateActions = [];
13
- const currentTenant = (0, tenantSelector_1.getCurrentTenant)(state$.value);
14
- const selectedPeriodByTenantId = state$.value.expenseAutomationViewState.selectedPeriodByTenantId;
15
- updateActions.push((0, transactionReducer_1.updateTransaction)(transactionPayload.transaction_id, transactionPayload, updateType));
16
- if (currentTenant != null) {
17
- const monthEndChecksPeriod = selectedPeriodByTenantId[currentTenant.tenantId];
18
- if (monthEndChecksPeriod != null) {
19
- updateActions.push((0, monthEndCloseChecksViewReducer_1.fetchMonthEndCloseChecks)({
20
- tenantId: currentTenant.tenantId,
21
- period: monthEndChecksPeriod,
22
- refreshViewInBackground: true,
23
- }));
24
- }
25
- }
26
- return (0, rxjs_1.from)(updateActions);
27
- }));
28
- exports.uploadTransactionReceiptSuccessEpic = uploadTransactionReceiptSuccessEpic;
@@ -1,7 +0,0 @@
1
- import { Observable } from 'rxjs';
2
- import { ZeniAPI } from '../../../../zeniAPI';
3
- import { updateAiCardRecommendation, updateAiCardRecommendationFailure, updateChainOfThoughts, updateChainOfThoughtsFailure } from './cardsOnboardingReducer';
4
- export type ChainOfThoughtsRequestAction = ReturnType<typeof updateChainOfThoughts> | ReturnType<typeof updateChainOfThoughtsFailure>;
5
- export type AiCardRecommendationRequestAction = ReturnType<typeof updateAiCardRecommendation> | ReturnType<typeof updateAiCardRecommendationFailure>;
6
- export declare function requestChainOfThoughtsForAiCardRecommendation$(zeniAPI: ZeniAPI): Observable<ChainOfThoughtsRequestAction>;
7
- export declare function requestAiCardRecommendation$(zeniAPI: ZeniAPI): Observable<AiCardRecommendationRequestAction>;
@@ -1,62 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.requestChainOfThoughtsForAiCardRecommendation$ = requestChainOfThoughtsForAiCardRecommendation$;
4
- exports.requestAiCardRecommendation$ = requestAiCardRecommendation$;
5
- const rxjs_1 = require("rxjs");
6
- const operators_1 = require("rxjs/operators");
7
- const responsePayload_1 = require("../../../../responsePayload");
8
- const cardsOnboardingReducer_1 = require("./cardsOnboardingReducer");
9
- function isBareChainOfThoughtsPayload(value) {
10
- if (value == null || typeof value !== 'object') {
11
- return false;
12
- }
13
- const o = value;
14
- return (typeof o.analyzing === 'string' &&
15
- typeof o.thinking === 'string' &&
16
- typeof o.thought_process === 'string');
17
- }
18
- function isBareAiCardRecommendationPayload(value) {
19
- if (value == null || typeof value !== 'object') {
20
- return false;
21
- }
22
- const o = value;
23
- const pc = o.projected_coverage;
24
- return (Array.isArray(o.vendor_cards) &&
25
- Array.isArray(o.dept_cards) &&
26
- typeof o.card_recommendation_pre_text === 'string' &&
27
- (typeof pc === 'string' || typeof pc === 'number'));
28
- }
29
- function requestChainOfThoughtsForAiCardRecommendation$(zeniAPI) {
30
- const url = `${zeniAPI.apiEndPoints.cardMicroServiceBaseUrl}/1.0/chain-of-thoughts-for-ai-card-recommendation`;
31
- return zeniAPI.getJSON(url).pipe((0, operators_1.mergeMap)((response) => {
32
- if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
33
- return (0, rxjs_1.of)((0, cardsOnboardingReducer_1.updateChainOfThoughts)(response.data));
34
- }
35
- if (isBareChainOfThoughtsPayload(response)) {
36
- return (0, rxjs_1.of)((0, cardsOnboardingReducer_1.updateChainOfThoughts)(response));
37
- }
38
- if ('status' in response && response.status != null) {
39
- return (0, rxjs_1.of)((0, cardsOnboardingReducer_1.updateChainOfThoughtsFailure)(response.status));
40
- }
41
- return (0, rxjs_1.of)((0, cardsOnboardingReducer_1.updateChainOfThoughtsFailure)((0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Fetch chain of thoughts for AI card recommendation returned an invalid payload')));
42
- }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, cardsOnboardingReducer_1.updateChainOfThoughtsFailure)((0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Fetch chain of thoughts for AI card recommendation REST API call errored out' +
43
- JSON.stringify(error))))));
44
- }
45
- function requestAiCardRecommendation$(zeniAPI) {
46
- const url = `${zeniAPI.apiEndPoints.cardMicroServiceBaseUrl}/1.0/ai-card-recommendation`;
47
- return zeniAPI
48
- .getJSON(url)
49
- .pipe((0, operators_1.mergeMap)((response) => {
50
- if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
51
- return (0, rxjs_1.of)((0, cardsOnboardingReducer_1.updateAiCardRecommendation)(response.data));
52
- }
53
- if (isBareAiCardRecommendationPayload(response)) {
54
- return (0, rxjs_1.of)((0, cardsOnboardingReducer_1.updateAiCardRecommendation)(response));
55
- }
56
- if ('status' in response && response.status != null) {
57
- return (0, rxjs_1.of)((0, cardsOnboardingReducer_1.updateAiCardRecommendationFailure)(response.status));
58
- }
59
- return (0, rxjs_1.of)((0, cardsOnboardingReducer_1.updateAiCardRecommendationFailure)((0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Fetch AI card recommendation returned an invalid payload')));
60
- }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, cardsOnboardingReducer_1.updateAiCardRecommendationFailure)((0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Fetch AI card recommendation REST API call errored out' +
61
- JSON.stringify(error))))));
62
- }
@@ -1,34 +0,0 @@
1
- import { ID } from '../../../../commonStateTypes/common';
2
- import { ZeniAPIResponse } from '../../../../responsePayload';
3
- export interface ChainOfThoughtsPayload {
4
- analyzing: string;
5
- thinking: string;
6
- thought_process: string;
7
- }
8
- export type FetchChainOfThoughtsResponse = ZeniAPIResponse<ChainOfThoughtsPayload>;
9
- export interface AiCardRecommendationCardItemPayload {
10
- credit_limit: number;
11
- name: string;
12
- owner_id: string;
13
- }
14
- export interface AiCardRecommendationPayload {
15
- card_recommendation_pre_text: string;
16
- dept_cards: AiCardRecommendationCardItemPayload[];
17
- projected_coverage: string | number;
18
- vendor_cards: AiCardRecommendationCardItemPayload[];
19
- }
20
- export type FetchAiCardRecommendationResponse = ZeniAPIResponse<AiCardRecommendationPayload>;
21
- /** Edited rows from the AI recommendation UI → POST `/1.0/cards` (see `createAllAiRecommendedCardsEpic`). */
22
- export interface CreateAiRecommendedCardDraft {
23
- /** Maps to API `card_name` (recommendation `name`). */
24
- card_name: string;
25
- /** Maps to `card_holder_user_ids: [owner_id]`. */
26
- owner_id: ID;
27
- /** Maps to API `purchase_limit` (recommendation `credit_limit`). */
28
- purchase_limit: number;
29
- card_type?: string;
30
- currency_code?: string;
31
- purchase_limit_frequency?: {
32
- code: string;
33
- };
34
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,7 +0,0 @@
1
- import { ZeniAPIStatus } from '../../../../responsePayload';
2
- import { AiCardRecommendationPayload, ChainOfThoughtsPayload, CreateAiRecommendedCardDraft } from './cardsOnboardingPayload';
3
- import { CardsOnboardingState, ChainOfThoughtsRevealPhase } from './cardsOnboardingState';
4
- export declare const initialState: CardsOnboardingState;
5
- export declare const startAiCardAgentDrawerDataLoad: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cardsOnboarding/startAiCardAgentDrawerDataLoad">, fetchChainOfThoughtsForAiCardRecommendation: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cardsOnboarding/fetchChainOfThoughtsForAiCardRecommendation">, updateChainOfThoughts: import("@reduxjs/toolkit").ActionCreatorWithPayload<ChainOfThoughtsPayload, "cardsOnboarding/updateChainOfThoughts">, updateChainOfThoughtsFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "cardsOnboarding/updateChainOfThoughtsFailure">, setChainOfThoughtsRevealPhase: import("@reduxjs/toolkit").ActionCreatorWithPayload<ChainOfThoughtsRevealPhase, "cardsOnboarding/setChainOfThoughtsRevealPhase">, fetchAiCardRecommendation: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cardsOnboarding/fetchAiCardRecommendation">, updateAiCardRecommendation: import("@reduxjs/toolkit").ActionCreatorWithPayload<AiCardRecommendationPayload, "cardsOnboarding/updateAiCardRecommendation">, updateAiCardRecommendationFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "cardsOnboarding/updateAiCardRecommendationFailure">, createAllAiRecommendedCards: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[cards: CreateAiRecommendedCardDraft[]], CreateAiRecommendedCardDraft[], "cardsOnboarding/createAllAiRecommendedCards", never, never>, createAllAiRecommendedCardsSucceeded: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cardsOnboarding/createAllAiRecommendedCardsSucceeded">, createAllAiRecommendedCardsFailed: import("@reduxjs/toolkit").ActionCreatorWithPayload<ZeniAPIStatus<Record<string, unknown>>, "cardsOnboarding/createAllAiRecommendedCardsFailed">, clearCardsOnboarding: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"cardsOnboarding/clearCardsOnboarding">;
6
- declare const _default: import("redux").Reducer<CardsOnboardingState>;
7
- export default _default;
@@ -1,107 +0,0 @@
1
- "use strict";
2
- var _a;
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.clearCardsOnboarding = exports.createAllAiRecommendedCardsFailed = exports.createAllAiRecommendedCardsSucceeded = exports.createAllAiRecommendedCards = exports.updateAiCardRecommendationFailure = exports.updateAiCardRecommendation = exports.fetchAiCardRecommendation = exports.setChainOfThoughtsRevealPhase = exports.updateChainOfThoughtsFailure = exports.updateChainOfThoughts = exports.fetchChainOfThoughtsForAiCardRecommendation = exports.startAiCardAgentDrawerDataLoad = exports.initialState = void 0;
5
- const toolkit_1 = require("@reduxjs/toolkit");
6
- const resetAiCardRecommendation = (draft) => {
7
- draft.aiCardRecommendationFetchState = 'Not-Started';
8
- draft.aiCardRecommendationResponse = undefined;
9
- draft.aiCardRecommendationError = undefined;
10
- };
11
- const resetCreateAllAiRecommendedCards = (draft) => {
12
- draft.createAllAiRecommendedCardsFetchState = 'Not-Started';
13
- draft.createAllAiRecommendedCardsError = undefined;
14
- };
15
- exports.initialState = {
16
- aiCardRecommendationFetchState: 'Not-Started',
17
- chainOfThoughtsFetchState: 'Not-Started',
18
- chainOfThoughtsRevealPhase: 'none',
19
- createAllAiRecommendedCardsFetchState: 'Not-Started',
20
- aiCardRecommendationError: undefined,
21
- aiCardRecommendationResponse: undefined,
22
- chainOfThoughtsError: undefined,
23
- chainOfThoughtsResponse: undefined,
24
- createAllAiRecommendedCardsError: undefined,
25
- };
26
- const cardsOnboarding = (0, toolkit_1.createSlice)({
27
- name: 'cardsOnboarding',
28
- initialState: exports.initialState,
29
- reducers: {
30
- startAiCardAgentDrawerDataLoad(draft) {
31
- draft.chainOfThoughtsFetchState = 'In-Progress';
32
- draft.chainOfThoughtsError = undefined;
33
- draft.chainOfThoughtsRevealPhase = 'none';
34
- draft.chainOfThoughtsResponse = undefined;
35
- draft.aiCardRecommendationFetchState = 'In-Progress';
36
- draft.aiCardRecommendationError = undefined;
37
- draft.aiCardRecommendationResponse = undefined;
38
- resetCreateAllAiRecommendedCards(draft);
39
- },
40
- fetchChainOfThoughtsForAiCardRecommendation(draft) {
41
- draft.chainOfThoughtsFetchState = 'In-Progress';
42
- draft.chainOfThoughtsError = undefined;
43
- draft.chainOfThoughtsRevealPhase = 'none';
44
- resetAiCardRecommendation(draft);
45
- resetCreateAllAiRecommendedCards(draft);
46
- },
47
- updateChainOfThoughts(draft, action) {
48
- draft.chainOfThoughtsResponse = toChainOfThoughtsResponse(action.payload);
49
- draft.chainOfThoughtsFetchState = 'Completed';
50
- draft.chainOfThoughtsRevealPhase = 'analyzing';
51
- },
52
- updateChainOfThoughtsFailure(draft, action) {
53
- draft.chainOfThoughtsFetchState = 'Error';
54
- draft.chainOfThoughtsError = action.payload;
55
- draft.chainOfThoughtsRevealPhase = 'none';
56
- },
57
- setChainOfThoughtsRevealPhase(draft, action) {
58
- draft.chainOfThoughtsRevealPhase = action.payload;
59
- },
60
- fetchAiCardRecommendation(draft) {
61
- draft.aiCardRecommendationFetchState = 'In-Progress';
62
- draft.aiCardRecommendationError = undefined;
63
- },
64
- updateAiCardRecommendation(draft, action) {
65
- draft.aiCardRecommendationResponse = toAiCardRecommendationResponse(action.payload);
66
- draft.aiCardRecommendationFetchState = 'Completed';
67
- },
68
- updateAiCardRecommendationFailure(draft, action) {
69
- draft.aiCardRecommendationFetchState = 'Error';
70
- draft.aiCardRecommendationError = action.payload;
71
- },
72
- createAllAiRecommendedCards: {
73
- reducer(draft, action) {
74
- void action;
75
- draft.createAllAiRecommendedCardsFetchState = 'In-Progress';
76
- draft.createAllAiRecommendedCardsError = undefined;
77
- },
78
- prepare(cards) {
79
- return { payload: cards };
80
- },
81
- },
82
- createAllAiRecommendedCardsSucceeded(draft) {
83
- draft.createAllAiRecommendedCardsFetchState = 'Completed';
84
- draft.createAllAiRecommendedCardsError = undefined;
85
- },
86
- createAllAiRecommendedCardsFailed(draft, action) {
87
- draft.createAllAiRecommendedCardsFetchState = 'Error';
88
- draft.createAllAiRecommendedCardsError = action.payload;
89
- },
90
- clearCardsOnboarding(draft) {
91
- Object.assign(draft, exports.initialState);
92
- },
93
- },
94
- });
95
- _a = cardsOnboarding.actions, exports.startAiCardAgentDrawerDataLoad = _a.startAiCardAgentDrawerDataLoad, exports.fetchChainOfThoughtsForAiCardRecommendation = _a.fetchChainOfThoughtsForAiCardRecommendation, exports.updateChainOfThoughts = _a.updateChainOfThoughts, exports.updateChainOfThoughtsFailure = _a.updateChainOfThoughtsFailure, exports.setChainOfThoughtsRevealPhase = _a.setChainOfThoughtsRevealPhase, exports.fetchAiCardRecommendation = _a.fetchAiCardRecommendation, exports.updateAiCardRecommendation = _a.updateAiCardRecommendation, exports.updateAiCardRecommendationFailure = _a.updateAiCardRecommendationFailure, exports.createAllAiRecommendedCards = _a.createAllAiRecommendedCards, exports.createAllAiRecommendedCardsSucceeded = _a.createAllAiRecommendedCardsSucceeded, exports.createAllAiRecommendedCardsFailed = _a.createAllAiRecommendedCardsFailed, exports.clearCardsOnboarding = _a.clearCardsOnboarding;
96
- exports.default = cardsOnboarding.reducer;
97
- const toChainOfThoughtsResponse = (payload) => ({
98
- analyzing: payload.analyzing,
99
- thinking: payload.thinking,
100
- thought_process: payload.thought_process,
101
- });
102
- const toAiCardRecommendationResponse = (payload) => ({
103
- vendor_cards: payload.vendor_cards,
104
- dept_cards: payload.dept_cards,
105
- card_recommendation_pre_text: payload.card_recommendation_pre_text,
106
- projected_coverage: String(payload.projected_coverage),
107
- });
@@ -1,16 +0,0 @@
1
- import { RootState } from '../../../../reducer';
2
- import { AiCardAgentDrawerDisplayState, AiCardRecommendationDisplayView } from './cardsOnboardingState';
3
- /**
4
- * Layout hints when using `startAiCardAgentDrawerDataLoad` (parallel CoT + recommendation GETs).
5
- * - Run phased CoT after `hasChainOfThoughtContent`; end with `setChainOfThoughtsRevealPhase('complete')`.
6
- * - Show sparkle when `showRecommendationSparkle` (AI still loading).
7
- * - Render tables / pre text / coverage only when `showRecommendationSection`.
8
- */
9
- export declare function getAiCardAgentDrawerDisplayState(state: RootState): AiCardAgentDrawerDisplayState;
10
- /**
11
- * Enriches `aiCardRecommendationResponse` with owner display name and photo from `userState`.
12
- * `ownerIdsMissingFromStore` lists `owner_id`s not in `userState` after the **single** people load
13
- * (e.g. `fetchCardsOnboardingPageEpic` → `fetchPeople()`). Do not refetch people from this package;
14
- * show a fallback label or rely on the owner dropdown sourced from the same store.
15
- */
16
- export declare function getAiCardRecommendationDisplayView(state: RootState): AiCardRecommendationDisplayView | undefined;
@@ -1,67 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAiCardAgentDrawerDisplayState = getAiCardAgentDrawerDisplayState;
4
- exports.getAiCardRecommendationDisplayView = getAiCardRecommendationDisplayView;
5
- const userSelector_1 = require("../../../../entity/user/userSelector");
6
- function collectOwnerIds(rec) {
7
- const ids = new Set();
8
- for (const c of rec.vendor_cards) {
9
- ids.add(c.owner_id);
10
- }
11
- for (const c of rec.dept_cards) {
12
- ids.add(c.owner_id);
13
- }
14
- return [...ids];
15
- }
16
- function enrichCard(card, userState) {
17
- const user = (0, userSelector_1.getUserByUserId)(userState, card.owner_id);
18
- const hasOwnerDetails = user != null;
19
- return {
20
- ...card,
21
- hasOwnerDetails,
22
- ownerDisplayName: hasOwnerDetails
23
- ? (0, userSelector_1.getUserName)(user) || card.owner_id
24
- : card.owner_id,
25
- ownerProfilePhoto: user?.photo,
26
- };
27
- }
28
- /**
29
- * Layout hints when using `startAiCardAgentDrawerDataLoad` (parallel CoT + recommendation GETs).
30
- * - Run phased CoT after `hasChainOfThoughtContent`; end with `setChainOfThoughtsRevealPhase('complete')`.
31
- * - Show sparkle when `showRecommendationSparkle` (AI still loading).
32
- * - Render tables / pre text / coverage only when `showRecommendationSection`.
33
- */
34
- function getAiCardAgentDrawerDisplayState(state) {
35
- const c = state.cardsOnboardingState;
36
- const cotDone = c.chainOfThoughtsRevealPhase === 'complete';
37
- const aiDone = c.aiCardRecommendationFetchState === 'Completed' &&
38
- c.aiCardRecommendationResponse != null;
39
- return {
40
- showChainOfThoughtShimmer: c.chainOfThoughtsFetchState === 'In-Progress',
41
- hasChainOfThoughtContent: c.chainOfThoughtsFetchState === 'Completed' &&
42
- c.chainOfThoughtsResponse != null,
43
- showRecommendationSparkle: c.aiCardRecommendationFetchState === 'In-Progress',
44
- showRecommendationSection: cotDone && aiDone,
45
- };
46
- }
47
- /**
48
- * Enriches `aiCardRecommendationResponse` with owner display name and photo from `userState`.
49
- * `ownerIdsMissingFromStore` lists `owner_id`s not in `userState` after the **single** people load
50
- * (e.g. `fetchCardsOnboardingPageEpic` → `fetchPeople()`). Do not refetch people from this package;
51
- * show a fallback label or rely on the owner dropdown sourced from the same store.
52
- */
53
- function getAiCardRecommendationDisplayView(state) {
54
- const rec = state.cardsOnboardingState.aiCardRecommendationResponse;
55
- if (rec == null) {
56
- return undefined;
57
- }
58
- const { userState } = state;
59
- const ownerIdsMissingFromStore = collectOwnerIds(rec).filter((id) => userState.userByUserId[id] == null);
60
- return {
61
- card_recommendation_pre_text: rec.card_recommendation_pre_text,
62
- projected_coverage: rec.projected_coverage,
63
- vendor_cards: rec.vendor_cards.map((c) => enrichCard(c, userState)),
64
- dept_cards: rec.dept_cards.map((c) => enrichCard(c, userState)),
65
- ownerIdsMissingFromStore,
66
- };
67
- }
@@ -1,63 +0,0 @@
1
- import { FetchState, ID } from '../../../../commonStateTypes/common';
2
- import { ZeniAPIStatus } from '../../../../responsePayload';
3
- import ZeniUrl from '../../../../zeniUrl';
4
- /**
5
- * In-app path to open after a successful “Create All Cards” from AI recommendations
6
- * (e.g. `https://qa.app.zeni.ai` + this path). Routing is handled by the host app.
7
- */
8
- export declare const CREATE_ALL_AI_RECOMMENDED_CARDS_SUCCESS_APP_PATH = "/zeni.ai/cards";
9
- export type ChainOfThoughtsRevealPhase = 'none' | 'analyzing' | 'thinking' | 'thought_process' | 'complete';
10
- export interface ChainOfThoughtsResponse {
11
- analyzing: string;
12
- thinking: string;
13
- thought_process: string;
14
- }
15
- export interface AiCardRecommendationCardItem {
16
- credit_limit: number;
17
- name: string;
18
- owner_id: string;
19
- }
20
- export interface AiCardRecommendationResponse {
21
- card_recommendation_pre_text: string;
22
- dept_cards: AiCardRecommendationCardItem[];
23
- projected_coverage: string;
24
- vendor_cards: AiCardRecommendationCardItem[];
25
- }
26
- /** Vendor / department row with owner resolved from `userState` when available (see `getAiCardRecommendationDisplayView`). */
27
- export interface AiCardRecommendationCardRow extends AiCardRecommendationCardItem {
28
- /** True when `userState.userByUserId[owner_id]` exists. */
29
- hasOwnerDetails: boolean;
30
- ownerDisplayName: string;
31
- ownerProfilePhoto?: ZeniUrl;
32
- }
33
- /** UI-ready AI recommendation: enriched cards + which owner_ids still need a users fetch. */
34
- export interface AiCardRecommendationDisplayView {
35
- card_recommendation_pre_text: string;
36
- dept_cards: AiCardRecommendationCardRow[];
37
- ownerIdsMissingFromStore: ID[];
38
- projected_coverage: string;
39
- vendor_cards: AiCardRecommendationCardRow[];
40
- }
41
- /** Hints for AiCardAgentDrawer: phased CoT, sparkle while recommendations load, gated table. */
42
- export interface AiCardAgentDrawerDisplayState {
43
- /** CoT payload ready; run phased UI (`setChainOfThoughtsRevealPhase`) analyzing → thinking → thought_process → complete. */
44
- hasChainOfThoughtContent: boolean;
45
- /** Shimmer while chain-of-thoughts GET is in flight. */
46
- showChainOfThoughtShimmer: boolean;
47
- /** Show `card_recommendation_pre_text`, `projected_coverage`, vendor/dept tables only after CoT phases are `complete` and AI GET succeeded. */
48
- showRecommendationSection: boolean;
49
- /** Rotating sparkle in the recommendations block while AI recommendation GET is in flight. */
50
- showRecommendationSparkle: boolean;
51
- }
52
- export interface CardsOnboardingState {
53
- aiCardRecommendationFetchState: FetchState;
54
- chainOfThoughtsFetchState: FetchState;
55
- /** Phased CoT UI in the drawer; advance with `setChainOfThoughtsRevealPhase` to `complete` before showing recommendations (see `getAiCardAgentDrawerDisplayState`). */
56
- chainOfThoughtsRevealPhase: ChainOfThoughtsRevealPhase;
57
- createAllAiRecommendedCardsFetchState: FetchState;
58
- aiCardRecommendationError?: ZeniAPIStatus;
59
- aiCardRecommendationResponse?: AiCardRecommendationResponse;
60
- chainOfThoughtsError?: ZeniAPIStatus;
61
- chainOfThoughtsResponse?: ChainOfThoughtsResponse;
62
- createAllAiRecommendedCardsError?: ZeniAPIStatus;
63
- }
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CREATE_ALL_AI_RECOMMENDED_CARDS_SUCCESS_APP_PATH = void 0;
4
- /**
5
- * In-app path to open after a successful “Create All Cards” from AI recommendations
6
- * (e.g. `https://qa.app.zeni.ai` + this path). Routing is handled by the host app.
7
- */
8
- exports.CREATE_ALL_AI_RECOMMENDED_CARDS_SUCCESS_APP_PATH = '/zeni.ai/cards';
@@ -1,20 +0,0 @@
1
- import { ActionsObservable, StateObservable } from 'redux-observable';
2
- import { Observable } from 'rxjs';
3
- import { updateAddresses } from '../../../../entity/address/addressReducer';
4
- import { updateChargeCards } from '../../../../entity/chargeCard/chargeCardReducer';
5
- import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
6
- import { updateAllUsers } from '../../../../entity/user/userReducer';
7
- import { updateUserRoles } from '../../../../entity/userRole/userRoleReducer';
8
- import { RootState } from '../../../../reducer';
9
- import { ZeniAPI } from '../../../../zeniAPI';
10
- import { updateChargeCardList } from '../chargeCardList/chargeCardListReducer';
11
- import { updateChargeCardCount, updateDebitCardCount } from '../issueChargeCard/issueChargeCardReducer';
12
- import { createAllAiRecommendedCards, createAllAiRecommendedCardsFailed, createAllAiRecommendedCardsSucceeded } from './cardsOnboardingReducer';
13
- export type ActionType = ReturnType<typeof createAllAiRecommendedCards> | ReturnType<typeof createAllAiRecommendedCardsSucceeded> | ReturnType<typeof createAllAiRecommendedCardsFailed> | ReturnType<typeof updateChargeCards> | ReturnType<typeof updateAllUsers> | ReturnType<typeof updateUserRoles> | ReturnType<typeof updateChargeCardList> | ReturnType<typeof updateAddresses> | ReturnType<typeof updateChargeCardCount> | ReturnType<typeof updateDebitCardCount> | ReturnType<typeof openSnackbar>;
14
- /**
15
- * POST `${cardMicroServiceBaseUrl}/1.0/cards` with edited AI recommendation rows.
16
- * On success, merges issued cards into entity + list state (same pattern as issue charge card).
17
- * Host app: when `createAllAiRecommendedCardsFetchState === 'Completed'`, navigate to
18
- * `CREATE_ALL_AI_RECOMMENDED_CARDS_SUCCESS_APP_PATH`.
19
- */
20
- export declare const createAllAiRecommendedCardsEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -1,66 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createAllAiRecommendedCardsEpic = void 0;
4
- const rxjs_1 = require("rxjs");
5
- const operators_1 = require("rxjs/operators");
6
- const addressReducer_1 = require("../../../../entity/address/addressReducer");
7
- const chargeCardReducer_1 = require("../../../../entity/chargeCard/chargeCardReducer");
8
- const snackbarReducer_1 = require("../../../../entity/snackbar/snackbarReducer");
9
- const userReducer_1 = require("../../../../entity/user/userReducer");
10
- const userRoleReducer_1 = require("../../../../entity/userRole/userRoleReducer");
11
- const responsePayload_1 = require("../../../../responsePayload");
12
- const chargeCardListReducer_1 = require("../chargeCardList/chargeCardListReducer");
13
- const issueChargeCardReducer_1 = require("../issueChargeCard/issueChargeCardReducer");
14
- const cardsOnboardingReducer_1 = require("./cardsOnboardingReducer");
15
- function draftsToApiCards(drafts) {
16
- return drafts.map((d) => ({
17
- card_holder_user_ids: [d.owner_id],
18
- card_name: d.card_name,
19
- card_type: d.card_type ?? 'business_virtual_credit_card',
20
- currency_code: d.currency_code ?? 'USD',
21
- purchase_limit: d.purchase_limit,
22
- purchase_limit_frequency: d.purchase_limit_frequency ?? { code: 'monthly' },
23
- }));
24
- }
25
- /**
26
- * POST `${cardMicroServiceBaseUrl}/1.0/cards` with edited AI recommendation rows.
27
- * On success, merges issued cards into entity + list state (same pattern as issue charge card).
28
- * Host app: when `createAllAiRecommendedCardsFetchState === 'Completed'`, navigate to
29
- * `CREATE_ALL_AI_RECOMMENDED_CARDS_SUCCESS_APP_PATH`.
30
- */
31
- const createAllAiRecommendedCardsEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(cardsOnboardingReducer_1.createAllAiRecommendedCards.match), (0, operators_1.switchMap)((action) => {
32
- if (action.payload.length === 0) {
33
- return (0, rxjs_1.of)((0, cardsOnboardingReducer_1.createAllAiRecommendedCardsFailed)((0, responsePayload_1.createZeniAPIStatus)('Validation', 'No cards to create')));
34
- }
35
- const cards = draftsToApiCards(action.payload);
36
- return zeniAPI
37
- .postAndGetJSON(`${zeniAPI.apiEndPoints.cardMicroServiceBaseUrl}/1.0/cards`, { cards })
38
- .pipe((0, operators_1.mergeMap)((response) => {
39
- if ((0, responsePayload_1.isSuccessStatus)(response) && response.data != null) {
40
- const actions = [
41
- (0, chargeCardReducer_1.updateChargeCards)(response.data.cards),
42
- (0, userReducer_1.updateAllUsers)({ users: response.data.users }),
43
- (0, userRoleReducer_1.updateUserRoles)(response.data.user_roles),
44
- (0, chargeCardListReducer_1.updateChargeCardList)({
45
- chargeCardListPayload: response.data,
46
- keepExistingListItems: true,
47
- }),
48
- (0, addressReducer_1.updateAddresses)(response.data.addresses),
49
- (0, issueChargeCardReducer_1.updateChargeCardCount)(response.data?.cards_count_by_user_id ?? []),
50
- (0, issueChargeCardReducer_1.updateDebitCardCount)(response.data?.debit_cards_count_by_deposit_account_id ?? {}),
51
- (0, cardsOnboardingReducer_1.createAllAiRecommendedCardsSucceeded)(),
52
- (0, snackbarReducer_1.openSnackbar)({
53
- messageSection: 'issue_charge_cards',
54
- messageText: 'success',
55
- type: 'success',
56
- }),
57
- ];
58
- return (0, rxjs_1.from)(actions);
59
- }
60
- return (0, rxjs_1.of)((0, cardsOnboardingReducer_1.createAllAiRecommendedCardsFailed)(response.status));
61
- }), (0, operators_1.catchError)((error) => {
62
- return (0, rxjs_1.of)((0, cardsOnboardingReducer_1.createAllAiRecommendedCardsFailed)((0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Create all AI recommended cards REST API call errored out' +
63
- JSON.stringify(error))));
64
- }));
65
- }));
66
- exports.createAllAiRecommendedCardsEpic = createAllAiRecommendedCardsEpic;
@@ -1,8 +0,0 @@
1
- import { ActionsObservable, StateObservable } from 'redux-observable';
2
- import { Observable } from 'rxjs';
3
- import { RootState } from '../../../../reducer';
4
- import { ZeniAPI } from '../../../../zeniAPI';
5
- import { AiCardRecommendationRequestAction } from './cardsOnboardingDataRequests';
6
- import { fetchAiCardRecommendation } from './cardsOnboardingReducer';
7
- export type ActionType = ReturnType<typeof fetchAiCardRecommendation> | AiCardRecommendationRequestAction;
8
- export declare const fetchAiCardRecommendationEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchAiCardRecommendationEpic = void 0;
4
- const operators_1 = require("rxjs/operators");
5
- const cardsOnboardingDataRequests_1 = require("./cardsOnboardingDataRequests");
6
- const cardsOnboardingReducer_1 = require("./cardsOnboardingReducer");
7
- const fetchAiCardRecommendationEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(cardsOnboardingReducer_1.fetchAiCardRecommendation.match), (0, operators_1.switchMap)(() => (0, cardsOnboardingDataRequests_1.requestAiCardRecommendation$)(zeniAPI)));
8
- exports.fetchAiCardRecommendationEpic = fetchAiCardRecommendationEpic;