@zeniai/client-epic-state 5.0.69-betaML2 → 5.0.69-betaML31

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 (96) hide show
  1. package/lib/commonStateTypes/viewAndReport/viewAndReport.d.ts +2 -2
  2. package/lib/commonStateTypes/viewAndReport/viewAndReport.js +0 -2
  3. package/lib/entity/account/accountSelector.d.ts +0 -9
  4. package/lib/entity/account/accountSelector.js +1 -14
  5. package/lib/entity/account/accountState.d.ts +1 -1
  6. package/lib/entity/accountGroup/accountGroupState.d.ts +1 -1
  7. package/lib/entity/class/classReducer.d.ts +4 -4
  8. package/lib/entity/class/classState.d.ts +1 -1
  9. package/lib/entity/forecast/forecastState.d.ts +1 -1
  10. package/lib/entity/sectionAccountsView/sectionAccountsView.d.ts +1 -1
  11. package/lib/entity/sectionClassesViewV2/sectionClassesView.d.ts +1 -1
  12. package/lib/entity/sectionClassesViewV2/sectionClassesViewReducer.d.ts +2 -2
  13. package/lib/entity/sectionProjectView/sectionProjectView.d.ts +1 -1
  14. package/lib/entity/sectionProjectView/sectionProjectViewReducer.d.ts +2 -2
  15. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  16. package/lib/entity/snackbar/snackbarTypes.js +0 -2
  17. package/lib/entity/transaction/payloadTypes/transactionPayload.d.ts +0 -4
  18. package/lib/entity/transaction/payloadTypes/transactionPayload.js +0 -10
  19. package/lib/entity/transaction/stateTypes/transaction.d.ts +0 -3
  20. package/lib/epic.d.ts +2 -3
  21. package/lib/epic.js +2 -3
  22. package/lib/esm/commonStateTypes/viewAndReport/viewAndReport.js +0 -2
  23. package/lib/esm/entity/account/accountSelector.js +0 -11
  24. package/lib/esm/entity/snackbar/snackbarTypes.js +0 -2
  25. package/lib/esm/entity/transaction/payloadTypes/transactionPayload.js +0 -10
  26. package/lib/esm/epic.js +2 -3
  27. package/lib/esm/index.js +8 -9
  28. package/lib/esm/reducer.js +0 -3
  29. package/lib/esm/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +0 -8
  30. package/lib/esm/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +21 -1
  31. package/lib/esm/view/expenseAutomationView/reducers/transactionsViewReducer.js +117 -26
  32. package/lib/esm/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +59 -9
  33. package/lib/esm/view/recommendation/fetchEntityRecommendationsForLineUpdateEpic.js +83 -0
  34. package/lib/esm/view/recommendation/recommendationHelper.js +29 -0
  35. package/lib/esm/view/recommendation/recommendationReducer.js +36 -1
  36. package/lib/esm/view/transactionDetail/epics/transactionDetailEpic.js +2 -14
  37. package/lib/esm/view/transactionDetail/transactionDetailReducer.js +122 -8
  38. package/lib/esm/view/transactionDetail/transactionDetailSelector.js +24 -7
  39. package/lib/index.d.ts +9 -9
  40. package/lib/index.js +36 -43
  41. package/lib/reducer.d.ts +0 -3
  42. package/lib/reducer.js +0 -3
  43. package/lib/tsconfig.typecheck.tsbuildinfo +1 -0
  44. package/lib/view/auditReportView/auditReportViewState.d.ts +1 -1
  45. package/lib/view/billPayCard/billPayCardSelector.d.ts +1 -1
  46. package/lib/view/cardBalance/cardBalanceSelector.d.ts +1 -1
  47. package/lib/view/cashBalance/cashBalanceSelector.d.ts +1 -1
  48. package/lib/view/cashInCashOut/cashInCashOutSelector.d.ts +1 -1
  49. package/lib/view/cashPosition/cashPositionSelector.d.ts +1 -1
  50. package/lib/view/dashboard/dashboardReducer.d.ts +2 -2
  51. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.d.ts +1 -2
  52. package/lib/view/expenseAutomationView/epics/transactionCategorization/fetchTransactionCategorizationViewEpic.js +0 -8
  53. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +2 -1
  54. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +23 -2
  55. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.d.ts +15 -4
  56. package/lib/view/expenseAutomationView/reducers/transactionsViewReducer.js +117 -26
  57. package/lib/view/expenseAutomationView/selectorTypes/transactionsViewSelectorTypes.d.ts +3 -4
  58. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.d.ts +3 -1
  59. package/lib/view/expenseAutomationView/selectors/transactionCategorizationSelector.js +61 -11
  60. package/lib/view/expenseAutomationView/types/transactionsViewState.d.ts +1 -0
  61. package/lib/view/financeStatement/financeStatementReducer.d.ts +1 -1
  62. package/lib/view/globalMerchantView/globalMerchantViewReducer.d.ts +2 -2
  63. package/lib/view/recommendation/fetchEntityRecommendationsForLineUpdateEpic.d.ts +9 -0
  64. package/lib/view/recommendation/fetchEntityRecommendationsForLineUpdateEpic.js +87 -0
  65. package/lib/view/recommendation/recommendationHelper.d.ts +9 -0
  66. package/lib/view/recommendation/recommendationHelper.js +31 -1
  67. package/lib/view/recommendation/recommendationReducer.d.ts +18 -1
  68. package/lib/view/recommendation/recommendationReducer.js +37 -2
  69. package/lib/view/reimbursementCard/reimbursementCardSelector.d.ts +1 -1
  70. package/lib/view/reportsResync/reportsResyncReducer.d.ts +2 -2
  71. package/lib/view/tasksCard/tasksCardSelector.d.ts +1 -1
  72. package/lib/view/topEx/topExSelector.d.ts +1 -1
  73. package/lib/view/transactionDetail/epics/transactionDetailEpic.d.ts +1 -2
  74. package/lib/view/transactionDetail/epics/transactionDetailEpic.js +2 -14
  75. package/lib/view/transactionDetail/transactionDetailPayload.d.ts +1 -1
  76. package/lib/view/transactionDetail/transactionDetailReducer.d.ts +12 -3
  77. package/lib/view/transactionDetail/transactionDetailReducer.js +123 -9
  78. package/lib/view/transactionDetail/transactionDetailSelector.d.ts +3 -6
  79. package/lib/view/transactionDetail/transactionDetailSelector.js +25 -7
  80. package/lib/view/transactionDetail/transactionDetailTypes.d.ts +1 -0
  81. package/package.json +1 -1
  82. package/lib/esm/view/createTransferEntry/createTransferEntryReducer.js +0 -56
  83. package/lib/esm/view/createTransferEntry/createTransferEntrySelector.js +0 -63
  84. package/lib/esm/view/createTransferEntry/createTransferEntryState.js +0 -17
  85. package/lib/esm/view/createTransferEntry/epics/createTransferEntryEpic.js +0 -112
  86. package/lib/esm/view/createTransferEntry/epics/fetchTransferAccountsEpic.js +0 -36
  87. package/lib/view/createTransferEntry/createTransferEntryReducer.d.ts +0 -32
  88. package/lib/view/createTransferEntry/createTransferEntryReducer.js +0 -60
  89. package/lib/view/createTransferEntry/createTransferEntrySelector.d.ts +0 -38
  90. package/lib/view/createTransferEntry/createTransferEntrySelector.js +0 -68
  91. package/lib/view/createTransferEntry/createTransferEntryState.d.ts +0 -30
  92. package/lib/view/createTransferEntry/createTransferEntryState.js +0 -20
  93. package/lib/view/createTransferEntry/epics/createTransferEntryEpic.d.ts +0 -11
  94. package/lib/view/createTransferEntry/epics/createTransferEntryEpic.js +0 -116
  95. package/lib/view/createTransferEntry/epics/fetchTransferAccountsEpic.d.ts +0 -14
  96. package/lib/view/createTransferEntry/epics/fetchTransferAccountsEpic.js +0 -40
@@ -1,32 +0,0 @@
1
- import { ID } from '../../commonStateTypes/common';
2
- import { TransactionID } from '../../entity/transaction/stateTypes/transaction';
3
- import { TransactionType } from '../../entity/transaction/stateTypes/transactionType';
4
- import { CreateTransferEntryState, TransferAccountsFetchType } from './createTransferEntryState';
5
- export declare const initialState: CreateTransferEntryState;
6
- export declare const fetchAccountsForTransferFlow: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
7
- kind: TransferAccountsFetchType;
8
- }, "createTransferEntry/fetchAccountsForTransferFlow">, updateAccountsForTransferFlow: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
9
- accountIds: ID[];
10
- kind: TransferAccountsFetchType;
11
- }, "createTransferEntry/updateAccountsForTransferFlow">, updateAccountsForTransferFlowFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
12
- kind: TransferAccountsFetchType;
13
- }, "createTransferEntry/updateAccountsForTransferFlowFailure">, createTransferEntry: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[payload: {
14
- creditAccountIntegrationId: string;
15
- debitAccountIntegrationId: string;
16
- memo: string;
17
- sourceTransactionType: TransactionType;
18
- transactionId: ID;
19
- transactionType: TransactionType;
20
- }], {
21
- creditAccountIntegrationId: string;
22
- debitAccountIntegrationId: string;
23
- memo: string;
24
- sourceTransactionType: TransactionType;
25
- transactionId: ID;
26
- transactionType: TransactionType;
27
- }, "createTransferEntry/createTransferEntry", never, never>, createTransferEntrySuccess: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"createTransferEntry/createTransferEntrySuccess">, createTransferEntryFailure: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"createTransferEntry/createTransferEntryFailure">, resetCreateTransferEntryStatus: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"createTransferEntry/resetCreateTransferEntryStatus">, createTransferEntryReplacedTransaction: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[previousTransactionId: TransactionID, newTransactionId: TransactionID], {
28
- newTransactionId: TransactionID;
29
- previousTransactionId: TransactionID;
30
- }, "createTransferEntry/createTransferEntryReplacedTransaction", never, never>, clearTransferEntryRouteReplacement: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"createTransferEntry/clearTransferEntryRouteReplacement">;
31
- declare const _default: import("redux").Reducer<CreateTransferEntryState>;
32
- export default _default;
@@ -1,60 +0,0 @@
1
- "use strict";
2
- var _a;
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.clearTransferEntryRouteReplacement = exports.createTransferEntryReplacedTransaction = exports.resetCreateTransferEntryStatus = exports.createTransferEntryFailure = exports.createTransferEntrySuccess = exports.createTransferEntry = exports.updateAccountsForTransferFlowFailure = exports.updateAccountsForTransferFlow = exports.fetchAccountsForTransferFlow = exports.initialState = void 0;
5
- const toolkit_1 = require("@reduxjs/toolkit");
6
- const createTransferEntryState_1 = require("./createTransferEntryState");
7
- exports.initialState = createTransferEntryState_1.initialCreateTransferEntryState;
8
- const createTransferEntrySlice = (0, toolkit_1.createSlice)({
9
- name: 'createTransferEntry',
10
- initialState: exports.initialState,
11
- reducers: {
12
- fetchAccountsForTransferFlow(draft, action) {
13
- draft.transferAccountsByType[action.payload.kind].fetchState =
14
- 'In-Progress';
15
- },
16
- updateAccountsForTransferFlow(draft, action) {
17
- const slice = draft.transferAccountsByType[action.payload.kind];
18
- slice.fetchState = 'Completed';
19
- slice.accountIds = action.payload.accountIds;
20
- },
21
- updateAccountsForTransferFlowFailure(draft, action) {
22
- draft.transferAccountsByType[action.payload.kind].fetchState = 'Error';
23
- },
24
- createTransferEntry: {
25
- prepare(payload) {
26
- return { payload };
27
- },
28
- reducer(draft) {
29
- draft.createTransferEntryStatus = 'In-Progress';
30
- },
31
- },
32
- createTransferEntrySuccess(draft) {
33
- draft.createTransferEntryStatus = 'Completed';
34
- },
35
- createTransferEntryFailure(draft) {
36
- draft.createTransferEntryStatus = 'Error';
37
- },
38
- resetCreateTransferEntryStatus(draft) {
39
- draft.createTransferEntryStatus = 'Not-Started';
40
- },
41
- createTransferEntryReplacedTransaction: {
42
- prepare(previousTransactionId, newTransactionId) {
43
- return { payload: { newTransactionId, previousTransactionId } };
44
- },
45
- reducer(draft, action) {
46
- draft.lastTransferEntryReplacement = action.payload;
47
- },
48
- },
49
- /**
50
- * One-shot acknowledgement: the host has consumed the route-replacement
51
- * signal and navigated to the new transaction url, so we can drop the
52
- * record. Re-dispatching is idempotent.
53
- */
54
- clearTransferEntryRouteReplacement(draft) {
55
- draft.lastTransferEntryReplacement = undefined;
56
- },
57
- },
58
- });
59
- _a = createTransferEntrySlice.actions, exports.fetchAccountsForTransferFlow = _a.fetchAccountsForTransferFlow, exports.updateAccountsForTransferFlow = _a.updateAccountsForTransferFlow, exports.updateAccountsForTransferFlowFailure = _a.updateAccountsForTransferFlowFailure, exports.createTransferEntry = _a.createTransferEntry, exports.createTransferEntrySuccess = _a.createTransferEntrySuccess, exports.createTransferEntryFailure = _a.createTransferEntryFailure, exports.resetCreateTransferEntryStatus = _a.resetCreateTransferEntryStatus, exports.createTransferEntryReplacedTransaction = _a.createTransferEntryReplacedTransaction, exports.clearTransferEntryRouteReplacement = _a.clearTransferEntryRouteReplacement;
60
- exports.default = createTransferEntrySlice.reducer;
@@ -1,38 +0,0 @@
1
- import { AccountBase } from '../../entity/account/accountState';
2
- import { RootState } from '../../reducer';
3
- import { TransferEntryRouteReplacement } from './createTransferEntryState';
4
- export declare function getCreateTransferEntryStatus(state: RootState): import("../..").FetchState;
5
- export declare function getLastTransferEntryReplacement(state: RootState): TransferEntryRouteReplacement | undefined;
6
- /**
7
- * Shared resolver for the credit/debit dropdowns in the transfer drawer.
8
- *
9
- * Resolution policy (intentional):
10
- * 1. Prefer the dedicated API fetch results (`transfer_eligible` for the debit
11
- * pool, `credit_card_only` for the credit-card-payment credit pool).
12
- * 2. If the dedicated fetch returns an empty list while the COA is loaded,
13
- * fall back to the COA: the full account list for `transfer_eligible`, and
14
- * COA accounts filtered to `credit_card` for `credit_card_only`. This keeps
15
- * the dropdown populated for older tenants where the dedicated endpoints
16
- * haven't been backfilled yet.
17
- *
18
- * Intent — what this selector deliberately does NOT do:
19
- * - Does NOT distinguish "fetch in-flight" / "fetch errored" / "fetch returned
20
- * empty" — all three collapse to the COA fallback. The product preference
21
- * is "always show something selectable" over "show a spinner that may never
22
- * resolve". Loading/error UI belongs in the view layer; if you need a
23
- * spinner, observe the `fetchState` on `transferAccountsByType[kind]`
24
- * separately rather than changing the resolution policy here.
25
- * - Does NOT enforce "API result is authoritative even if empty" — a tenant
26
- * whose dedicated endpoint is correctly returning `[]` (e.g. no eligible
27
- * transfer destinations) will still see the COA. That trade-off is
28
- * accepted because the alternative blocks the user from picking anything;
29
- * the backend distinguishes "no result" from "endpoint not implemented" by
30
- * surfacing an error response, which the view layer handles separately.
31
- *
32
- * Memoized with reselect so consuming view-models don't recompute on every
33
- * unrelated state change.
34
- */
35
- export declare const getResolvedTransferAccounts: (state: RootState) => {
36
- creditCardAccountsForTransferList: AccountBase[];
37
- transferAccountsList: AccountBase[];
38
- };
@@ -1,68 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getResolvedTransferAccounts = void 0;
4
- exports.getCreateTransferEntryStatus = getCreateTransferEntryStatus;
5
- exports.getLastTransferEntryReplacement = getLastTransferEntryReplacement;
6
- const toolkit_1 = require("@reduxjs/toolkit");
7
- const accountSelector_1 = require("../../entity/account/accountSelector");
8
- const accountListSelector_1 = require("../accountList/accountListSelector");
9
- function getCreateTransferEntryStatus(state) {
10
- return state.createTransferEntryState.createTransferEntryStatus;
11
- }
12
- function getLastTransferEntryReplacement(state) {
13
- return state.createTransferEntryState.lastTransferEntryReplacement;
14
- }
15
- /**
16
- * Shared resolver for the credit/debit dropdowns in the transfer drawer.
17
- *
18
- * Resolution policy (intentional):
19
- * 1. Prefer the dedicated API fetch results (`transfer_eligible` for the debit
20
- * pool, `credit_card_only` for the credit-card-payment credit pool).
21
- * 2. If the dedicated fetch returns an empty list while the COA is loaded,
22
- * fall back to the COA: the full account list for `transfer_eligible`, and
23
- * COA accounts filtered to `credit_card` for `credit_card_only`. This keeps
24
- * the dropdown populated for older tenants where the dedicated endpoints
25
- * haven't been backfilled yet.
26
- *
27
- * Intent — what this selector deliberately does NOT do:
28
- * - Does NOT distinguish "fetch in-flight" / "fetch errored" / "fetch returned
29
- * empty" — all three collapse to the COA fallback. The product preference
30
- * is "always show something selectable" over "show a spinner that may never
31
- * resolve". Loading/error UI belongs in the view layer; if you need a
32
- * spinner, observe the `fetchState` on `transferAccountsByType[kind]`
33
- * separately rather than changing the resolution policy here.
34
- * - Does NOT enforce "API result is authoritative even if empty" — a tenant
35
- * whose dedicated endpoint is correctly returning `[]` (e.g. no eligible
36
- * transfer destinations) will still see the COA. That trade-off is
37
- * accepted because the alternative blocks the user from picking anything;
38
- * the backend distinguishes "no result" from "endpoint not implemented" by
39
- * surfacing an error response, which the view layer handles separately.
40
- *
41
- * Memoized with reselect so consuming view-models don't recompute on every
42
- * unrelated state change.
43
- */
44
- exports.getResolvedTransferAccounts = (0, toolkit_1.createSelector)([
45
- (state) => state.accountState,
46
- (state) => state.accountListState,
47
- (state) => state.createTransferEntryState.transferAccountsByType.transfer_eligible
48
- .accountIds,
49
- (state) => state.createTransferEntryState.transferAccountsByType.credit_card_only
50
- .accountIds,
51
- ], (accountState, accountListState, transferEligibleIds, creditCardOnlyIds) => {
52
- const accountList = (0, accountListSelector_1.getAccountList)(accountState, accountListState, 'accountList');
53
- const transferEligibleFromApi = transferEligibleIds
54
- .map((id) => (0, accountSelector_1.getAccountBaseForTransferAccounts)(accountState, id))
55
- .filter((account) => account != null);
56
- const coaFallbackAllAccounts = accountList.accounts
57
- .map((a) => (0, accountSelector_1.getAccountBase)(accountState, a.accountId, 'account_list'))
58
- .filter((account) => account != null);
59
- const transferAccountsList = transferEligibleFromApi.length > 0
60
- ? transferEligibleFromApi
61
- : coaFallbackAllAccounts;
62
- const creditCardFromApi = creditCardOnlyIds
63
- .map((id) => (0, accountSelector_1.getAccountBaseForCreditCardTransferAccounts)(accountState, id))
64
- .filter((account) => account != null);
65
- const coaFallbackCreditCards = coaFallbackAllAccounts.filter((a) => a.accountType === 'credit_card');
66
- const creditCardAccountsForTransferList = creditCardFromApi.length > 0 ? creditCardFromApi : coaFallbackCreditCards;
67
- return { creditCardAccountsForTransferList, transferAccountsList };
68
- });
@@ -1,30 +0,0 @@
1
- import { FetchState, ID } from '../../commonStateTypes/common';
2
- import { TransactionID } from '../../entity/transaction/stateTypes/transaction';
3
- /** Which pool `fetchAccountsForTransferFlow` / transfer-flow epic should load. */
4
- export declare const TRANSFER_ACCOUNTS_FETCH_TYPE: readonly ["transfer_eligible", "credit_card_only"];
5
- export type TransferAccountsFetchType = (typeof TRANSFER_ACCOUNTS_FETCH_TYPE)[number];
6
- export interface TransferAccountsState {
7
- accountIds: ID[];
8
- fetchState: FetchState;
9
- }
10
- export type TransferEntryRouteReplacement = {
11
- newTransactionId: TransactionID;
12
- previousTransactionId: TransactionID;
13
- };
14
- export interface CreateTransferEntryState {
15
- createTransferEntryStatus: FetchState;
16
- /**
17
- * Set when create-transfer returns a new transaction id (the source expense
18
- * has been replaced by a new transfer/credit-card-payment row). The host
19
- * navigates to the new url and then dispatches
20
- * `clearTransferEntryRouteReplacement` to clear this one-shot signal.
21
- */
22
- lastTransferEntryReplacement: TransferEntryRouteReplacement | undefined;
23
- /**
24
- * Per-type fetch state + account-id list for the dropdowns shown in the
25
- * transfer drawer (eligible accounts for `transfer`, credit-card-only
26
- * accounts for `credit_card_payment`).
27
- */
28
- transferAccountsByType: Record<TransferAccountsFetchType, TransferAccountsState>;
29
- }
30
- export declare const initialCreateTransferEntryState: CreateTransferEntryState;
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.initialCreateTransferEntryState = exports.TRANSFER_ACCOUNTS_FETCH_TYPE = void 0;
4
- /** Which pool `fetchAccountsForTransferFlow` / transfer-flow epic should load. */
5
- exports.TRANSFER_ACCOUNTS_FETCH_TYPE = [
6
- 'transfer_eligible',
7
- 'credit_card_only',
8
- ];
9
- const initialTransferAccountsState = {
10
- accountIds: [],
11
- fetchState: 'Not-Started',
12
- };
13
- exports.initialCreateTransferEntryState = {
14
- createTransferEntryStatus: 'Not-Started',
15
- lastTransferEntryReplacement: undefined,
16
- transferAccountsByType: {
17
- transfer_eligible: initialTransferAccountsState,
18
- credit_card_only: initialTransferAccountsState,
19
- },
20
- };
@@ -1,11 +0,0 @@
1
- import { ActionsObservable, StateObservable } from 'redux-observable';
2
- import { Observable } from 'rxjs';
3
- import { openSnackbar } from '../../../entity/snackbar/snackbarReducer';
4
- import { removeTransaction, updateTransaction } from '../../../entity/transaction/transactionReducer';
5
- import { RootState } from '../../../reducer';
6
- import { ZeniAPI } from '../../../zeniAPI';
7
- import { removeTransactionFromAllTabs } from '../../expenseAutomationView/reducers/transactionsViewReducer';
8
- import { initializeTransactionDetailLocalData, removeTransactionDetail } from '../../transactionDetail/transactionDetailReducer';
9
- import { clearTransferEntryRouteReplacement, createTransferEntry, createTransferEntryFailure, createTransferEntryReplacedTransaction, createTransferEntrySuccess, resetCreateTransferEntryStatus } from '../createTransferEntryReducer';
10
- export type ActionType = ReturnType<typeof openSnackbar> | ReturnType<typeof createTransferEntry> | ReturnType<typeof createTransferEntrySuccess> | ReturnType<typeof createTransferEntryFailure> | ReturnType<typeof removeTransactionFromAllTabs> | ReturnType<typeof resetCreateTransferEntryStatus> | ReturnType<typeof createTransferEntryReplacedTransaction> | ReturnType<typeof clearTransferEntryRouteReplacement> | ReturnType<typeof updateTransaction> | ReturnType<typeof initializeTransactionDetailLocalData> | ReturnType<typeof removeTransaction> | ReturnType<typeof removeTransactionDetail>;
11
- export declare const createTransferEntryEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -1,116 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createTransferEntryEpic = 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 transactionIDPayload_1 = require("../../../entity/transaction/payloadTypes/transactionIDPayload");
8
- const transactionReducer_1 = require("../../../entity/transaction/transactionReducer");
9
- const responsePayload_1 = require("../../../responsePayload");
10
- const transactionsViewReducer_1 = require("../../expenseAutomationView/reducers/transactionsViewReducer");
11
- const transactionDetailReducer_1 = require("../../transactionDetail/transactionDetailReducer");
12
- const transactionDetailState_1 = require("../../transactionDetail/transactionDetailState");
13
- const createTransferEntryReducer_1 = require("../createTransferEntryReducer");
14
- // ─── Pure helpers ────────────────────────────────────────────────────────────
15
- function transactionIdsAreEqual(a, b) {
16
- return a.id === b.id && a.type === b.type;
17
- }
18
- const successSnackbar = () => (0, snackbarReducer_1.openSnackbar)({
19
- messageSection: 'create_transfer_entry',
20
- messageText: 'success',
21
- type: 'success',
22
- });
23
- const failureSnackbar = () => (0, snackbarReducer_1.openSnackbar)({
24
- messageSection: 'create_transfer_entry',
25
- messageText: 'failed',
26
- type: 'error',
27
- });
28
- function buildFailureActions() {
29
- return [(0, createTransferEntryReducer_1.createTransferEntryFailure)(), failureSnackbar()];
30
- }
31
- function buildSuccessSideEffects(sourceTransactionId) {
32
- return [
33
- (0, createTransferEntryReducer_1.createTransferEntrySuccess)(),
34
- (0, transactionsViewReducer_1.removeTransactionFromAllTabs)(sourceTransactionId),
35
- successSnackbar(),
36
- ];
37
- }
38
- function buildPreviousTransactionCleanupActions(previousTransactionId) {
39
- return [
40
- (0, transactionReducer_1.removeTransaction)((0, transactionDetailState_1.getTransactionDetailKey)(previousTransactionId)),
41
- (0, transactionDetailReducer_1.removeTransactionDetail)(previousTransactionId),
42
- (0, createTransferEntryReducer_1.clearTransferEntryRouteReplacement)(),
43
- ];
44
- }
45
- /**
46
- * Emits `resetCreateTransferEntryStatus()` (and, on the replacement path, the
47
- * follow-up cleanup actions) one scheduler tick after the success actions.
48
- *
49
- * Why the `timer(0)` (and not synchronous emission):
50
- * On the replacement path the host (web-app-ui) watches
51
- * `lastTransferEntryReplacement`, navigates to the new transaction url, and
52
- * then sees `clearTransferEntryRouteReplacement` clear the signal. If we
53
- * dispatched the cleanup actions in the same tick as
54
- * `createTransferEntryReplacedTransaction`, redux subscribers would observe
55
- * `lastTransferEntryReplacement` flicker on then off in a single render, and
56
- * the old transaction's state (which the still-mounted detail view may be
57
- * reading) would be torn down before the host has had a chance to start
58
- * navigating. Deferring by one microtask gives the host exactly one render
59
- * pass to react before we tear down the previous transaction.
60
- */
61
- function delayedResetAndPreviousCleanup(previousTransactionId) {
62
- return (0, rxjs_1.timer)(0).pipe((0, operators_1.mergeMap)(() => {
63
- const actions = [(0, createTransferEntryReducer_1.resetCreateTransferEntryStatus)()];
64
- if (previousTransactionId != null) {
65
- actions.push(...buildPreviousTransactionCleanupActions(previousTransactionId));
66
- }
67
- return (0, rxjs_1.from)(actions);
68
- }));
69
- }
70
- // ─── Success-path branches ───────────────────────────────────────────────────
71
- function handleSuccessWithoutTransactionBody(transactionId) {
72
- return (0, rxjs_1.concat)((0, rxjs_1.from)(buildSuccessSideEffects(transactionId)), delayedResetAndPreviousCleanup(undefined));
73
- }
74
- function handleSuccessWithTransactionBody(transactionPayload, vendorPayload, previousTransactionId, sourceTransactionId) {
75
- const newTransactionId = (0, transactionIDPayload_1.toTransactionID)(transactionPayload);
76
- const replaced = !transactionIdsAreEqual(previousTransactionId, newTransactionId);
77
- const immediate = [
78
- (0, transactionReducer_1.updateTransaction)((0, transactionDetailState_1.getTransactionDetailKey)(newTransactionId), transactionPayload),
79
- (0, transactionDetailReducer_1.initializeTransactionDetailLocalData)({
80
- transactionId: newTransactionId,
81
- vendorId: vendorPayload?.[0]?.vendor_id,
82
- }),
83
- ...buildSuccessSideEffects(sourceTransactionId),
84
- ];
85
- if (replaced) {
86
- immediate.push((0, createTransferEntryReducer_1.createTransferEntryReplacedTransaction)(previousTransactionId, newTransactionId));
87
- }
88
- return (0, rxjs_1.concat)((0, rxjs_1.from)(immediate), delayedResetAndPreviousCleanup(replaced ? previousTransactionId : undefined));
89
- }
90
- // ─── Top-level epic ──────────────────────────────────────────────────────────
91
- const CREATE_TRANSFER_ENTRY_URL = `https://dev.api.zeni.ai/version/accounting/komal/1.0/transactions/transaction-type-update`;
92
- const createTransferEntryEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(createTransferEntryReducer_1.createTransferEntry.match), (0, operators_1.mergeMap)((action) => {
93
- const { transactionId, creditAccountIntegrationId, debitAccountIntegrationId, memo, transactionType, sourceTransactionType, } = action.payload;
94
- const previousTransactionId = {
95
- id: transactionId,
96
- type: sourceTransactionType,
97
- };
98
- return zeniAPI
99
- .postAndGetJSON(CREATE_TRANSFER_ENTRY_URL, {
100
- transaction_type: transactionType,
101
- transaction_id: transactionId,
102
- to_account_integration_id: creditAccountIntegrationId,
103
- from_account_integration_id: debitAccountIntegrationId,
104
- memo,
105
- })
106
- .pipe((0, operators_1.mergeMap)((response) => {
107
- if (!(0, responsePayload_1.isSuccessResponse)(response)) {
108
- return (0, rxjs_1.from)(buildFailureActions());
109
- }
110
- if (response.data?.transaction != null) {
111
- return handleSuccessWithTransactionBody(response.data.transaction, response.data.vendors, previousTransactionId, transactionId);
112
- }
113
- return handleSuccessWithoutTransactionBody(transactionId);
114
- }), (0, operators_1.catchError)(() => (0, rxjs_1.from)(buildFailureActions())));
115
- }));
116
- exports.createTransferEntryEpic = createTransferEntryEpic;
@@ -1,14 +0,0 @@
1
- import { ActionsObservable, StateObservable } from 'redux-observable';
2
- import { Observable } from 'rxjs';
3
- import { updateAccounts } from '../../../entity/account/accountReducer';
4
- import { RootState } from '../../../reducer';
5
- import { ZeniAPI } from '../../../zeniAPI';
6
- import { fetchAccountsForTransferFlow, updateAccountsForTransferFlow, updateAccountsForTransferFlowFailure } from '../createTransferEntryReducer';
7
- export type ActionType = ReturnType<typeof fetchAccountsForTransferFlow> | ReturnType<typeof updateAccountsForTransferFlow> | ReturnType<typeof updateAccountsForTransferFlowFailure> | ReturnType<typeof updateAccounts>;
8
- /**
9
- * Pools fetched concurrently: `groupBy(kind)` keeps `transfer_eligible` and
10
- * `credit_card_only` in their own streams so a back-to-back dispatch of both
11
- * does not cancel the first. Within a single type, a fresh dispatch supersedes
12
- * any in-flight request (per-group `switchMap`).
13
- */
14
- export declare const fetchTransferAccountsEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchTransferAccountsEpic = void 0;
4
- const rxjs_1 = require("rxjs");
5
- const operators_1 = require("rxjs/operators");
6
- const accountReducer_1 = require("../../../entity/account/accountReducer");
7
- const responsePayload_1 = require("../../../responsePayload");
8
- const createTransferEntryReducer_1 = require("../createTransferEntryReducer");
9
- const REPORT_ID_BY_TYPE = {
10
- transfer_eligible: 'transfer_accounts',
11
- credit_card_only: 'credit_card_transfer_accounts',
12
- };
13
- const QUERY_BY_TYPE = {
14
- transfer_eligible: { is_only_include_transfer_accounts: true },
15
- credit_card_only: { is_include_only_credit_card_accounts: true },
16
- };
17
- /**
18
- * Pools fetched concurrently: `groupBy(kind)` keeps `transfer_eligible` and
19
- * `credit_card_only` in their own streams so a back-to-back dispatch of both
20
- * does not cancel the first. Within a single type, a fresh dispatch supersedes
21
- * any in-flight request (per-group `switchMap`).
22
- */
23
- const fetchTransferAccountsEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(createTransferEntryReducer_1.fetchAccountsForTransferFlow.match), (0, operators_1.groupBy)((action) => action.payload.kind), (0, operators_1.mergeMap)((group$) => group$.pipe((0, operators_1.switchMap)((action) => {
24
- const { kind } = action.payload;
25
- const queryValue = QUERY_BY_TYPE[kind];
26
- const reportId = REPORT_ID_BY_TYPE[kind];
27
- const url = `https://dev.api.zeni.ai/version/accounting/komal/1.0/accounts?query=${encodeURIComponent(JSON.stringify(queryValue))}`;
28
- return zeniAPI.getJSON(url).pipe((0, operators_1.mergeMap)((response) => {
29
- if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
30
- const accountIds = response.data.accounts.map((account) => account.account_id);
31
- const actions = [
32
- (0, accountReducer_1.updateAccounts)(response.data.accounts, reportId),
33
- (0, createTransferEntryReducer_1.updateAccountsForTransferFlow)({ accountIds, kind }),
34
- ];
35
- return (0, rxjs_1.of)(...actions);
36
- }
37
- return (0, rxjs_1.of)((0, createTransferEntryReducer_1.updateAccountsForTransferFlowFailure)({ kind }));
38
- }), (0, operators_1.catchError)(() => (0, rxjs_1.of)((0, createTransferEntryReducer_1.updateAccountsForTransferFlowFailure)({ kind }))));
39
- }))));
40
- exports.fetchTransferAccountsEpic = fetchTransferAccountsEpic;