@cranberry-money/shared-types 8.17.13 → 8.17.15
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.
|
@@ -0,0 +1,1414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blueberry-specific type definitions
|
|
3
|
+
* These interfaces are used in the Blueberry dashboard application
|
|
4
|
+
*/
|
|
5
|
+
import type { Portfolio, AssetAllocation as ImportedAssetAllocation, AssetHolding, Instrument, Trade, TargetTrade, WithdrawalRequest, WithdrawalAssetLiquidation, DashboardPerformanceData, WithdrawalSummary, BaseInstrumentFilters, CashAccount, SignupPayload, FormErrors, InvestmentPreferencePayload, MessageFieldValidation, UserProfile, TaxResidency, InvestmentPreference, Country, BaseFilters, DateRangeFilters, PortfolioTemplate, TargetAssetAllocation, UserProfilePayload, NavigationItem, TradeActionFilters, CashAccountTransaction, BadgeStyle, SimpleTradeStatus, SigninPayload, TaxResidencyPayload, WithdrawalAssetLiquidationPayload, TransactionFilters as ImportedTransactionFilters, InvestmentPreferenceFormState as ImportedInvestmentPreferenceFormState, InvestmentPreferenceFormValidation as ImportedInvestmentPreferenceFormValidation, TemplateWithAllocations as ImportedTemplateWithAllocations, RebalancingTradesGenerationResponse, Account, StockExchange, AssetHoldingSnapshot, CashAccountTransactionQueryParams as ImportedCashAccountTransactionQueryParams } from './index';
|
|
6
|
+
import type { Sector } from './reference-data';
|
|
7
|
+
import type { Industry } from './reference-data';
|
|
8
|
+
import type { TimeRange, CashAccountTransactionType, CURRENCY_CODES } from '@cranberry-money/shared-constants';
|
|
9
|
+
interface BaseFormValidation {
|
|
10
|
+
isFormValid: boolean;
|
|
11
|
+
}
|
|
12
|
+
interface BaseFieldValidation {
|
|
13
|
+
isValid: boolean;
|
|
14
|
+
isEmpty: boolean;
|
|
15
|
+
}
|
|
16
|
+
type CurrencyCode = typeof CURRENCY_CODES.AUD | typeof CURRENCY_CODES.USD;
|
|
17
|
+
/**
|
|
18
|
+
* Asset allocation interface for portfolio templates
|
|
19
|
+
* Used for backward compatibility in portfolio template services
|
|
20
|
+
*/
|
|
21
|
+
export interface AssetAllocation {
|
|
22
|
+
instrument: {
|
|
23
|
+
symbol: string;
|
|
24
|
+
name: string;
|
|
25
|
+
};
|
|
26
|
+
percentage: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Simplified allocation state for the asset allocation page
|
|
30
|
+
*/
|
|
31
|
+
export interface AllocationState {
|
|
32
|
+
searchQuery: string;
|
|
33
|
+
selectedInstruments: Set<string>;
|
|
34
|
+
allocations: Record<string, number>;
|
|
35
|
+
showFilters: boolean;
|
|
36
|
+
filters: InstrumentFilters;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Instrument filters with asset allocation specific extension
|
|
40
|
+
*/
|
|
41
|
+
export interface InstrumentFilters extends BaseInstrumentFilters {
|
|
42
|
+
showAllocatedOnly?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Available filter options derived from instruments
|
|
46
|
+
*/
|
|
47
|
+
export interface FilterOptions {
|
|
48
|
+
sectors: Sector[];
|
|
49
|
+
exchanges: StockExchange[];
|
|
50
|
+
industries: Industry[];
|
|
51
|
+
loadingSectors: boolean;
|
|
52
|
+
loadingExchanges?: boolean;
|
|
53
|
+
loadingIndustries?: boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Chart data for allocation visualization
|
|
57
|
+
*/
|
|
58
|
+
export interface AllocationChartData {
|
|
59
|
+
instrumentUuid: string;
|
|
60
|
+
symbol: string;
|
|
61
|
+
name: string;
|
|
62
|
+
percentage: number;
|
|
63
|
+
color: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Hook return type for the main asset allocation hook
|
|
67
|
+
*/
|
|
68
|
+
export interface UseAssetAllocationReturn {
|
|
69
|
+
state: AllocationState;
|
|
70
|
+
instruments: Instrument[];
|
|
71
|
+
portfolio: Portfolio | null;
|
|
72
|
+
currentAllocations: ImportedAssetAllocation[];
|
|
73
|
+
chartData: AllocationChartData[];
|
|
74
|
+
filteredInstruments: Instrument[];
|
|
75
|
+
filterOptions: FilterOptions;
|
|
76
|
+
isValid: boolean;
|
|
77
|
+
isLoading: boolean;
|
|
78
|
+
isSaving: boolean;
|
|
79
|
+
setSearchQuery: (query: string) => void;
|
|
80
|
+
toggleInstrument: (instrumentUuid: string) => void;
|
|
81
|
+
updateAllocation: (instrumentUuid: string, percentage: number) => void;
|
|
82
|
+
updateFilters: (filters: Partial<InstrumentFilters>) => void;
|
|
83
|
+
applyFilters: () => void;
|
|
84
|
+
toggleFilters: () => void;
|
|
85
|
+
closeFilters: () => void;
|
|
86
|
+
clearFilters: () => void;
|
|
87
|
+
saveAllocations: () => Promise<void>;
|
|
88
|
+
resetAllocations: () => void;
|
|
89
|
+
handleBack: () => void;
|
|
90
|
+
handleSubmit: () => Promise<void>;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Dashboard view component props (generic to support different withdrawal types)
|
|
94
|
+
*/
|
|
95
|
+
export interface DashboardViewProps<TWithdrawalRequest = WithdrawalRequest, TWithdrawalAssetLiquidation = WithdrawalAssetLiquidation> {
|
|
96
|
+
portfolio: Portfolio | undefined;
|
|
97
|
+
allocations: ImportedAssetAllocation[];
|
|
98
|
+
holdings: AssetHolding[];
|
|
99
|
+
trades: Trade[];
|
|
100
|
+
targetTrades: TargetTrade[];
|
|
101
|
+
withdrawalRequests: TWithdrawalRequest[];
|
|
102
|
+
withdrawalLiquidations: TWithdrawalAssetLiquidation[];
|
|
103
|
+
withdrawalSummary: WithdrawalSummary<TWithdrawalAssetLiquidation>;
|
|
104
|
+
performanceData: DashboardPerformanceData | null;
|
|
105
|
+
totalCashBalance: number;
|
|
106
|
+
isLoading: boolean;
|
|
107
|
+
onRefresh?: () => void;
|
|
108
|
+
onRefreshTrades?: () => void;
|
|
109
|
+
onRefreshTargetTrades?: () => void;
|
|
110
|
+
onRefreshCashTransactions?: () => void;
|
|
111
|
+
onRefreshPortfolio?: () => void;
|
|
112
|
+
onRefreshAssets?: () => void;
|
|
113
|
+
onRefreshWithdrawals?: () => void;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Dashboard hook return type (generic to support different withdrawal types)
|
|
117
|
+
*/
|
|
118
|
+
export interface UseDashboardReturn<TWithdrawalRequest = WithdrawalRequest, TWithdrawalAssetLiquidation = WithdrawalAssetLiquidation> {
|
|
119
|
+
portfolio: Portfolio | undefined;
|
|
120
|
+
allocations: ImportedAssetAllocation[];
|
|
121
|
+
holdings: AssetHolding[];
|
|
122
|
+
trades: Trade[];
|
|
123
|
+
targetTrades: TargetTrade[];
|
|
124
|
+
withdrawalRequests: TWithdrawalRequest[];
|
|
125
|
+
withdrawalLiquidations: TWithdrawalAssetLiquidation[];
|
|
126
|
+
withdrawalSummary: WithdrawalSummary<TWithdrawalAssetLiquidation>;
|
|
127
|
+
performanceData: DashboardPerformanceData | null;
|
|
128
|
+
totalCashBalance: number;
|
|
129
|
+
isLoading: boolean;
|
|
130
|
+
isError: boolean;
|
|
131
|
+
error: Error | null;
|
|
132
|
+
onRetry: () => void;
|
|
133
|
+
onRefresh: () => void;
|
|
134
|
+
onRefreshTrades: () => void;
|
|
135
|
+
onRefreshTargetTrades: () => void;
|
|
136
|
+
onRefreshCashTransactions: () => void;
|
|
137
|
+
onRefreshPortfolio: () => void;
|
|
138
|
+
onRefreshAssets: () => void;
|
|
139
|
+
onRefreshWithdrawals: () => void;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Financial summary for target trades
|
|
143
|
+
*/
|
|
144
|
+
export interface FinancialSummary {
|
|
145
|
+
availableCashBalance: number;
|
|
146
|
+
estimatedBuyCost: number;
|
|
147
|
+
estimatedSellValue: number;
|
|
148
|
+
totalWithdrawalAmount: number;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Instrument holding information for target trades
|
|
152
|
+
*/
|
|
153
|
+
export interface InstrumentHolding {
|
|
154
|
+
instrumentUuid: string;
|
|
155
|
+
instrumentSymbol: string;
|
|
156
|
+
instrumentName: string;
|
|
157
|
+
currentPrice: number;
|
|
158
|
+
currentQuantity: number;
|
|
159
|
+
targetQuantity: number;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Cash transactions summary
|
|
163
|
+
*/
|
|
164
|
+
export interface CashSummary {
|
|
165
|
+
totalBalance: number;
|
|
166
|
+
totalDeposits: number;
|
|
167
|
+
totalWithdrawals: number;
|
|
168
|
+
netTransactionAmount: number;
|
|
169
|
+
transactionCount: number;
|
|
170
|
+
availableAccounts: CashAccount[];
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Password validation state for signup forms
|
|
174
|
+
*/
|
|
175
|
+
export interface SignupPasswordValidation {
|
|
176
|
+
lengthValid: boolean;
|
|
177
|
+
notNumeric: boolean;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Props for the signup user form component
|
|
181
|
+
*/
|
|
182
|
+
export interface UserFormProps {
|
|
183
|
+
form: SignupPayload;
|
|
184
|
+
errors: FormErrors;
|
|
185
|
+
isSubmitting: boolean;
|
|
186
|
+
showPassword: boolean;
|
|
187
|
+
passwordValidation: SignupPasswordValidation;
|
|
188
|
+
onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
189
|
+
onSubmit: (e: React.FormEvent) => void;
|
|
190
|
+
onTogglePassword: () => void;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Historical data point for portfolio performance
|
|
194
|
+
*/
|
|
195
|
+
export interface HistoricalDataPoint {
|
|
196
|
+
date: string;
|
|
197
|
+
price: string;
|
|
198
|
+
change: string;
|
|
199
|
+
changePercent: string;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Instrument performance data for portfolio visualization
|
|
203
|
+
*/
|
|
204
|
+
export interface InstrumentPerformanceData {
|
|
205
|
+
instrumentUuid: string;
|
|
206
|
+
symbol: string;
|
|
207
|
+
name: string;
|
|
208
|
+
percentage: string;
|
|
209
|
+
historicalData: HistoricalDataPoint[];
|
|
210
|
+
color: string;
|
|
211
|
+
isLoading: boolean;
|
|
212
|
+
isError: boolean;
|
|
213
|
+
error?: string;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Props for portfolio performance form
|
|
217
|
+
*/
|
|
218
|
+
export interface PortfolioPerformanceFormProps {
|
|
219
|
+
portfolio: Portfolio | null;
|
|
220
|
+
allocations: ImportedAssetAllocation[];
|
|
221
|
+
instrumentData: InstrumentPerformanceData[];
|
|
222
|
+
selectedTimeRange: TimeRange;
|
|
223
|
+
isLoading: boolean;
|
|
224
|
+
isError: boolean;
|
|
225
|
+
onTimeRangeChange: (range: TimeRange) => void;
|
|
226
|
+
onRetry: () => void;
|
|
227
|
+
onContinue: () => void;
|
|
228
|
+
onBack?: () => void;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Investment preference form state extending the payload
|
|
232
|
+
*/
|
|
233
|
+
export interface InvestmentPreferenceFormState extends InvestmentPreferencePayload {
|
|
234
|
+
userProfileId: string;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Form validation for investment preferences
|
|
238
|
+
*/
|
|
239
|
+
export interface InvestmentPreferenceFormValidation extends BaseFormValidation {
|
|
240
|
+
investmentHorizon: MessageFieldValidation;
|
|
241
|
+
riskTolerance: MessageFieldValidation;
|
|
242
|
+
investmentExperience: MessageFieldValidation;
|
|
243
|
+
investmentAmount: MessageFieldValidation;
|
|
244
|
+
sourceOfFunds: MessageFieldValidation;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Props for investment preferences form
|
|
248
|
+
*/
|
|
249
|
+
export interface InvestmentPreferenceFormProps {
|
|
250
|
+
form: InvestmentPreferenceFormState;
|
|
251
|
+
errors: FormErrors;
|
|
252
|
+
isSubmitting: boolean;
|
|
253
|
+
existingPreferenceUuid: string | null;
|
|
254
|
+
formValidation?: InvestmentPreferenceFormValidation;
|
|
255
|
+
onChange: (field: keyof InvestmentPreferenceFormState, value: string | string[] | number) => void;
|
|
256
|
+
onSubmit: (e: React.FormEvent) => void;
|
|
257
|
+
onBack?: () => void;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Review data for signup completion
|
|
261
|
+
*/
|
|
262
|
+
export interface ReviewData {
|
|
263
|
+
userProfile: UserProfile | null;
|
|
264
|
+
taxResidencies: TaxResidency[];
|
|
265
|
+
investmentPreferences: InvestmentPreference | null;
|
|
266
|
+
portfolio: Portfolio | null;
|
|
267
|
+
allocations: ImportedAssetAllocation[];
|
|
268
|
+
countries: Country[];
|
|
269
|
+
citizenshipCountry: Country | null;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Props for review form component
|
|
273
|
+
*/
|
|
274
|
+
export interface ReviewFormProps<TDocumentType = string> {
|
|
275
|
+
data: ReviewData;
|
|
276
|
+
isLoading: boolean;
|
|
277
|
+
error: string | null;
|
|
278
|
+
termsAccepted: boolean;
|
|
279
|
+
onTermsChange: (accepted: boolean) => void;
|
|
280
|
+
onDocumentDownload: (type: TDocumentType) => void;
|
|
281
|
+
onCompleteSignup: () => void;
|
|
282
|
+
isSubmitting: boolean;
|
|
283
|
+
canCompleteSignup: boolean;
|
|
284
|
+
onBack?: () => void;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Return type for useReview hook
|
|
288
|
+
*/
|
|
289
|
+
export interface UseReviewReturn<TDocumentType = string> {
|
|
290
|
+
data: ReviewData;
|
|
291
|
+
isLoading: boolean;
|
|
292
|
+
error: string | null;
|
|
293
|
+
termsAccepted: boolean;
|
|
294
|
+
setTermsAccepted: (accepted: boolean) => void;
|
|
295
|
+
downloadDocument: (type: TDocumentType) => void;
|
|
296
|
+
completeSignup: () => void;
|
|
297
|
+
isSubmitting: boolean;
|
|
298
|
+
canCompleteSignup: boolean;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Props for the asset performance chart component (individual instruments)
|
|
302
|
+
*/
|
|
303
|
+
export interface AssetPerformanceChartProps {
|
|
304
|
+
instrumentData: InstrumentPerformanceData[];
|
|
305
|
+
selectedTimeRange: TimeRange;
|
|
306
|
+
isLoading: boolean;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Props for the portfolio performance chart component (aggregated portfolio)
|
|
310
|
+
*/
|
|
311
|
+
export interface PortfolioPerformanceChartProps {
|
|
312
|
+
allocations: ImportedAssetAllocation[];
|
|
313
|
+
instrumentData: InstrumentPerformanceData[];
|
|
314
|
+
selectedTimeRange: TimeRange;
|
|
315
|
+
isLoading: boolean;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Props for time range selector component
|
|
319
|
+
*/
|
|
320
|
+
export interface TimeRangeSelectorProps {
|
|
321
|
+
selectedRange: TimeRange;
|
|
322
|
+
onRangeChange: (range: TimeRange) => void;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Props for allocation summary component
|
|
326
|
+
*/
|
|
327
|
+
export interface AllocationSummaryProps {
|
|
328
|
+
allocations: ImportedAssetAllocation[];
|
|
329
|
+
instrumentData: InstrumentPerformanceData[];
|
|
330
|
+
isLoading: boolean;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Extended asset allocation with instrument details
|
|
334
|
+
*/
|
|
335
|
+
export interface AllocationWithInstrument extends ImportedAssetAllocation {
|
|
336
|
+
instrumentName: string;
|
|
337
|
+
instrumentSymbol: string;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Chart.js dataset for performance visualization
|
|
341
|
+
*/
|
|
342
|
+
export interface ChartDataset {
|
|
343
|
+
label: string;
|
|
344
|
+
data: {
|
|
345
|
+
x: string;
|
|
346
|
+
y: number;
|
|
347
|
+
}[];
|
|
348
|
+
borderColor: string;
|
|
349
|
+
backgroundColor: string;
|
|
350
|
+
fill: boolean;
|
|
351
|
+
tension: number;
|
|
352
|
+
}
|
|
353
|
+
interface NumericRangeFilters {
|
|
354
|
+
minValue?: number;
|
|
355
|
+
maxValue?: number;
|
|
356
|
+
[key: string]: unknown;
|
|
357
|
+
}
|
|
358
|
+
interface BaseSummaryPanelProps<T> {
|
|
359
|
+
readonly summary: T;
|
|
360
|
+
readonly isLoading?: boolean;
|
|
361
|
+
readonly error?: Error | null;
|
|
362
|
+
readonly onRefresh?: () => void;
|
|
363
|
+
}
|
|
364
|
+
interface BaseTradingPanelProps<TItem, TFilters> {
|
|
365
|
+
items: TItem[];
|
|
366
|
+
dialogFilters: TFilters;
|
|
367
|
+
clientSearchQuery: string;
|
|
368
|
+
isLoading?: boolean;
|
|
369
|
+
onSearch: (query: string) => void;
|
|
370
|
+
onUpdateDialogFilters: (filters: Partial<TFilters>) => void;
|
|
371
|
+
onApplyFiltersToServer: () => void;
|
|
372
|
+
onClearAllFilters: () => void;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Transaction filters for cash transactions page
|
|
376
|
+
*/
|
|
377
|
+
export interface TransactionFilters extends BaseFilters, DateRangeFilters, NumericRangeFilters {
|
|
378
|
+
transactionType?: unknown;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Trade filters interface
|
|
382
|
+
*/
|
|
383
|
+
export interface TradeFilters extends BaseFilters, DateRangeFilters, TradeActionFilters, NumericRangeFilters {
|
|
384
|
+
status?: SimpleTradeStatus;
|
|
385
|
+
settlementStartDate?: string;
|
|
386
|
+
settlementEndDate?: string;
|
|
387
|
+
currency?: string;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Cash summary panel props
|
|
391
|
+
*/
|
|
392
|
+
export interface CashSummaryPanelProps extends BaseSummaryPanelProps<CashSummary> {
|
|
393
|
+
cashSummary: CashSummary;
|
|
394
|
+
summary: CashSummary;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Transactions panel props
|
|
398
|
+
*/
|
|
399
|
+
export interface TransactionsPanelProps extends BaseTradingPanelProps<CashAccountTransaction, TransactionFilters> {
|
|
400
|
+
transactions: CashAccountTransaction[];
|
|
401
|
+
items: CashAccountTransaction[];
|
|
402
|
+
showFiltersDialog: boolean;
|
|
403
|
+
onOpenFiltersDialog: () => void;
|
|
404
|
+
onCloseFiltersDialog: () => void;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Target trade filters
|
|
408
|
+
*/
|
|
409
|
+
export interface TargetTradeFilters extends BaseFilters, DateRangeFilters, TradeActionFilters {
|
|
410
|
+
instrumentUuid?: string;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Tooltip component props
|
|
414
|
+
*/
|
|
415
|
+
export interface TooltipProps {
|
|
416
|
+
children: React.ReactNode;
|
|
417
|
+
content: string;
|
|
418
|
+
position?: 'top' | 'bottom' | 'left' | 'right';
|
|
419
|
+
className?: string;
|
|
420
|
+
disabled?: boolean;
|
|
421
|
+
delay?: number;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Badge component props extending BadgeStyle
|
|
425
|
+
*/
|
|
426
|
+
export interface BadgeProps extends BadgeStyle {
|
|
427
|
+
children: React.ReactNode;
|
|
428
|
+
onClick?: () => void;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Layout component props
|
|
432
|
+
*/
|
|
433
|
+
export interface LayoutProps {
|
|
434
|
+
children: React.ReactNode;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Recent trades component props
|
|
438
|
+
*/
|
|
439
|
+
export interface RecentTradesProps {
|
|
440
|
+
trades: Trade[];
|
|
441
|
+
isLoading: boolean;
|
|
442
|
+
onRefresh?: () => void;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Target trades component props
|
|
446
|
+
*/
|
|
447
|
+
export interface TargetTradesProps {
|
|
448
|
+
targetTrades: TargetTrade[];
|
|
449
|
+
isLoading?: boolean;
|
|
450
|
+
onRefresh?: () => void;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Cash transactions component props
|
|
454
|
+
*/
|
|
455
|
+
export interface CashTransactionsProps {
|
|
456
|
+
cashAccountUuid?: string;
|
|
457
|
+
onRefresh?: () => void;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Portfolio summary card props
|
|
461
|
+
*/
|
|
462
|
+
export interface PortfolioSummaryCardProps {
|
|
463
|
+
portfolio: Portfolio | undefined;
|
|
464
|
+
performanceData: DashboardPerformanceData | null;
|
|
465
|
+
totalCashBalance: number;
|
|
466
|
+
onRefresh?: () => void;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Recent trade item props
|
|
470
|
+
*/
|
|
471
|
+
export interface RecentTradeItemProps {
|
|
472
|
+
trade: Trade;
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Target trade item props
|
|
476
|
+
*/
|
|
477
|
+
export interface TargetTradeItemProps {
|
|
478
|
+
targetTrade: TargetTrade;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Withdrawal overview props
|
|
482
|
+
*/
|
|
483
|
+
export interface WithdrawalOverviewProps {
|
|
484
|
+
withdrawalRequests: WithdrawalRequest[];
|
|
485
|
+
withdrawalLiquidations: WithdrawalAssetLiquidation[];
|
|
486
|
+
withdrawalSummary: WithdrawalSummary;
|
|
487
|
+
isLoading: boolean;
|
|
488
|
+
onRefresh?: () => void;
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Withdrawal request item props
|
|
492
|
+
*/
|
|
493
|
+
export interface WithdrawalRequestItemProps {
|
|
494
|
+
request: WithdrawalRequest;
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Trades panel props
|
|
498
|
+
*/
|
|
499
|
+
export interface TradesPanelProps {
|
|
500
|
+
trades: Trade[];
|
|
501
|
+
dialogFilters: TradeFilters;
|
|
502
|
+
clientSearchQuery: string;
|
|
503
|
+
isLoading?: boolean;
|
|
504
|
+
onSearch: (query: string) => void;
|
|
505
|
+
onUpdateDialogFilters: (filters: Partial<TradeFilters>) => void;
|
|
506
|
+
onApplyFiltersToServer: () => void;
|
|
507
|
+
onClearAllFilters: () => void;
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Trade item props
|
|
511
|
+
*/
|
|
512
|
+
export interface TradeItemProps {
|
|
513
|
+
trade: Trade;
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Withdrawal liquidation item props
|
|
517
|
+
*/
|
|
518
|
+
export interface WithdrawalLiquidationItemProps {
|
|
519
|
+
liquidation: WithdrawalAssetLiquidation;
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Radio group field props
|
|
523
|
+
*/
|
|
524
|
+
export interface RadioGroupFieldProps {
|
|
525
|
+
label: string;
|
|
526
|
+
value: string;
|
|
527
|
+
options: Array<{
|
|
528
|
+
value: string;
|
|
529
|
+
label: string;
|
|
530
|
+
}>;
|
|
531
|
+
error?: string[];
|
|
532
|
+
onChange: (value: string) => void;
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Checkbox group field props
|
|
536
|
+
*/
|
|
537
|
+
export interface CheckboxGroupFieldProps {
|
|
538
|
+
label: string;
|
|
539
|
+
value: string[];
|
|
540
|
+
options: Array<{
|
|
541
|
+
value: string;
|
|
542
|
+
label: string;
|
|
543
|
+
}>;
|
|
544
|
+
error?: string[];
|
|
545
|
+
onChange: (values: string[]) => void;
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Instrument data for allocation visualization
|
|
549
|
+
*/
|
|
550
|
+
export interface InstrumentData {
|
|
551
|
+
instrumentUuid: string;
|
|
552
|
+
symbol: string;
|
|
553
|
+
name: string;
|
|
554
|
+
percentage: string;
|
|
555
|
+
color: string;
|
|
556
|
+
isLoading: boolean;
|
|
557
|
+
isError: boolean;
|
|
558
|
+
historicalData: HistoricalDataPoint[];
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Allocation bar props
|
|
562
|
+
*/
|
|
563
|
+
export interface AllocationBarProps {
|
|
564
|
+
instrumentData: InstrumentData[];
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Loading state props
|
|
568
|
+
*/
|
|
569
|
+
export interface LoadingStateProps {
|
|
570
|
+
message?: string;
|
|
571
|
+
className?: string;
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Error state props
|
|
575
|
+
*/
|
|
576
|
+
export interface ErrorStateProps {
|
|
577
|
+
title?: string;
|
|
578
|
+
message?: string;
|
|
579
|
+
retryLabel?: string;
|
|
580
|
+
onRetry: () => void;
|
|
581
|
+
className?: string;
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Portfolio selection state
|
|
585
|
+
*/
|
|
586
|
+
export interface PortfolioSelectionState {
|
|
587
|
+
selectedTemplateUuid: string | null;
|
|
588
|
+
viewingDetailsForUuid: string | null;
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* Template with allocations type
|
|
592
|
+
*/
|
|
593
|
+
export interface TemplateWithAllocations {
|
|
594
|
+
template: PortfolioTemplate;
|
|
595
|
+
allocations?: TargetAssetAllocation[];
|
|
596
|
+
isLoading: boolean;
|
|
597
|
+
isError: boolean;
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Portfolio selection form props
|
|
601
|
+
*/
|
|
602
|
+
export interface PortfolioSelectionFormProps {
|
|
603
|
+
templates: PortfolioTemplate[];
|
|
604
|
+
recommendedTemplateUuid: string | null;
|
|
605
|
+
selectedTemplateUuid: string | null;
|
|
606
|
+
viewingDetailsForUuid: string | null;
|
|
607
|
+
templateAllocations: Record<string, TemplateWithAllocations>;
|
|
608
|
+
errors: FormErrors;
|
|
609
|
+
isSubmitting: boolean;
|
|
610
|
+
formValidation?: unknown;
|
|
611
|
+
onSelectTemplate: (templateUuid: string) => void;
|
|
612
|
+
onViewDetails: (templateUuid: string | null) => void;
|
|
613
|
+
onSubmit: () => void;
|
|
614
|
+
onCustomize: () => void;
|
|
615
|
+
onBack?: () => void;
|
|
616
|
+
}
|
|
617
|
+
/**
|
|
618
|
+
* User profile form props
|
|
619
|
+
*/
|
|
620
|
+
export interface UserProfileFormProps {
|
|
621
|
+
form: UserProfilePayload;
|
|
622
|
+
errors: FormErrors;
|
|
623
|
+
countries: Country[];
|
|
624
|
+
isSubmitting: boolean;
|
|
625
|
+
formValidation?: unknown;
|
|
626
|
+
onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => void;
|
|
627
|
+
onSubmit: (e: React.FormEvent) => void;
|
|
628
|
+
onBack?: () => void;
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Assets overview props
|
|
632
|
+
*/
|
|
633
|
+
export interface AssetsOverviewProps {
|
|
634
|
+
allocations: ImportedAssetAllocation[];
|
|
635
|
+
holdings: AssetHolding[];
|
|
636
|
+
isLoading?: boolean;
|
|
637
|
+
onRefresh?: () => void;
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* UseNavMenuReturn interface
|
|
641
|
+
*/
|
|
642
|
+
export interface UseNavMenuReturn<TIcon = unknown> {
|
|
643
|
+
navigationItems: NavigationItem<TIcon>[];
|
|
644
|
+
handleNavigation: (path: string) => void;
|
|
645
|
+
handleSignOut: () => void;
|
|
646
|
+
isSigningOut: boolean;
|
|
647
|
+
signOutError: Error | null;
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* Chart data for allocation visualization
|
|
651
|
+
*/
|
|
652
|
+
export interface AllocationChartData {
|
|
653
|
+
instrumentUuid: string;
|
|
654
|
+
symbol: string;
|
|
655
|
+
name: string;
|
|
656
|
+
percentage: number;
|
|
657
|
+
color: string;
|
|
658
|
+
}
|
|
659
|
+
/**
|
|
660
|
+
* Allocation chart props specific to asset allocation page
|
|
661
|
+
*/
|
|
662
|
+
export interface AllocationChartProps {
|
|
663
|
+
data: AllocationChartData[];
|
|
664
|
+
onPercentageChange?: (instrumentUuid: string, percentage: number) => void;
|
|
665
|
+
disableControls?: boolean;
|
|
666
|
+
}
|
|
667
|
+
/**
|
|
668
|
+
* Email confirmation payload
|
|
669
|
+
*/
|
|
670
|
+
export interface EmailConfirmationPayload {
|
|
671
|
+
token: string;
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Token validation state
|
|
675
|
+
*/
|
|
676
|
+
export interface TokenValidation {
|
|
677
|
+
isValid: boolean;
|
|
678
|
+
isEmpty: boolean;
|
|
679
|
+
isValidFormat: boolean;
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* Email confirmation form props
|
|
683
|
+
*/
|
|
684
|
+
export interface EmailConfirmationFormProps {
|
|
685
|
+
form: EmailConfirmationPayload;
|
|
686
|
+
errors: FormErrors;
|
|
687
|
+
isSubmitting: boolean;
|
|
688
|
+
isResending: boolean;
|
|
689
|
+
tokenValidation?: TokenValidation;
|
|
690
|
+
onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
691
|
+
onSubmit: (e: React.FormEvent) => void;
|
|
692
|
+
onResendCode: () => void;
|
|
693
|
+
onBack?: () => void;
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* Signin form props
|
|
697
|
+
*/
|
|
698
|
+
export interface SigninFormProps {
|
|
699
|
+
form: SigninPayload;
|
|
700
|
+
errors: FormErrors;
|
|
701
|
+
generalError: string | null;
|
|
702
|
+
isSubmitting: boolean;
|
|
703
|
+
showPassword: boolean;
|
|
704
|
+
onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
705
|
+
onSubmit: (e: React.FormEvent) => void;
|
|
706
|
+
onTogglePassword: () => void;
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* Tax residency form data
|
|
710
|
+
*/
|
|
711
|
+
export interface TaxResidencyForm extends TaxResidencyPayload {
|
|
712
|
+
localUuid: string;
|
|
713
|
+
backendUuid?: string;
|
|
714
|
+
}
|
|
715
|
+
/**
|
|
716
|
+
* Tax residency card props
|
|
717
|
+
*/
|
|
718
|
+
export interface TaxResidencyCardProps {
|
|
719
|
+
taxResidency: TaxResidencyForm;
|
|
720
|
+
index: number;
|
|
721
|
+
countries: Country[];
|
|
722
|
+
onChange: (index: number, field: keyof TaxResidencyForm, value: string | boolean | null) => void;
|
|
723
|
+
onRemove: (index: number) => void;
|
|
724
|
+
onTogglePrimary: (index: number) => void;
|
|
725
|
+
isOnlyOne: boolean;
|
|
726
|
+
errors: Record<string, string>;
|
|
727
|
+
}
|
|
728
|
+
/**
|
|
729
|
+
* Document UUIDs mapping
|
|
730
|
+
*/
|
|
731
|
+
export interface DocumentUUIDs {
|
|
732
|
+
[key: string]: string | null;
|
|
733
|
+
}
|
|
734
|
+
/**
|
|
735
|
+
* Portfolio selection form validation
|
|
736
|
+
*/
|
|
737
|
+
export interface PortfolioSelectionFormValidation extends BaseFormValidation {
|
|
738
|
+
selectedTemplate: MessageFieldValidation;
|
|
739
|
+
}
|
|
740
|
+
/**
|
|
741
|
+
* Allocation chart props for portfolio selection
|
|
742
|
+
*/
|
|
743
|
+
export interface PortfolioSelectionAllocationChartProps {
|
|
744
|
+
templateData: TemplateWithAllocations;
|
|
745
|
+
}
|
|
746
|
+
/**
|
|
747
|
+
* User profile form validation
|
|
748
|
+
*/
|
|
749
|
+
interface ExtendedFieldValidation extends BaseFieldValidation {
|
|
750
|
+
hasValidFormat: boolean;
|
|
751
|
+
}
|
|
752
|
+
interface DateFieldValidation extends BaseFieldValidation {
|
|
753
|
+
isValidDate: boolean;
|
|
754
|
+
}
|
|
755
|
+
interface AddressFieldValidation extends BaseFieldValidation {
|
|
756
|
+
isTooShort: boolean;
|
|
757
|
+
}
|
|
758
|
+
interface PhoneFieldValidation extends BaseFieldValidation {
|
|
759
|
+
hasValidFormat: boolean;
|
|
760
|
+
}
|
|
761
|
+
export interface UserProfileFormValidation extends BaseFormValidation {
|
|
762
|
+
fullName: ExtendedFieldValidation;
|
|
763
|
+
dateOfBirth: DateFieldValidation;
|
|
764
|
+
citizenshipCountry: BaseFieldValidation;
|
|
765
|
+
residentialAddress: AddressFieldValidation;
|
|
766
|
+
phoneNumber: PhoneFieldValidation;
|
|
767
|
+
}
|
|
768
|
+
/**
|
|
769
|
+
* Target trade item props
|
|
770
|
+
*/
|
|
771
|
+
export interface TargetTradeItemComponentProps {
|
|
772
|
+
trade: TargetTrade;
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* Document types available in the system
|
|
776
|
+
*/
|
|
777
|
+
export type BlueberryDocumentType = string;
|
|
778
|
+
/**
|
|
779
|
+
* Bank account with specific account type
|
|
780
|
+
*/
|
|
781
|
+
interface BankAccount {
|
|
782
|
+
uuid: string;
|
|
783
|
+
account: string;
|
|
784
|
+
bankName: string;
|
|
785
|
+
branchName?: string;
|
|
786
|
+
accountNumber: string;
|
|
787
|
+
bsb: string;
|
|
788
|
+
accountName: string;
|
|
789
|
+
accountType: string;
|
|
790
|
+
currency: CurrencyCode;
|
|
791
|
+
swiftCode?: string;
|
|
792
|
+
iban?: string;
|
|
793
|
+
isVerified: boolean;
|
|
794
|
+
verificationDate?: string;
|
|
795
|
+
isPrimary: boolean;
|
|
796
|
+
isActive: boolean;
|
|
797
|
+
notes?: string;
|
|
798
|
+
createdAt: string;
|
|
799
|
+
updatedAt: string;
|
|
800
|
+
}
|
|
801
|
+
interface BankAccountQueryParams {
|
|
802
|
+
account?: string;
|
|
803
|
+
bankName?: string;
|
|
804
|
+
accountType?: string;
|
|
805
|
+
currency?: CurrencyCode;
|
|
806
|
+
isVerified?: boolean;
|
|
807
|
+
isPrimary?: boolean;
|
|
808
|
+
isActive?: boolean;
|
|
809
|
+
ordering?: string;
|
|
810
|
+
}
|
|
811
|
+
export interface BlueberryBankAccount extends Omit<BankAccount, 'accountType'> {
|
|
812
|
+
accountType: unknown;
|
|
813
|
+
}
|
|
814
|
+
/**
|
|
815
|
+
* Bank account query params with specific account type
|
|
816
|
+
*/
|
|
817
|
+
export interface BlueberryBankAccountQueryParams extends Omit<BankAccountQueryParams, 'accountType'> {
|
|
818
|
+
accountType?: unknown;
|
|
819
|
+
}
|
|
820
|
+
/**
|
|
821
|
+
* Withdrawal request with specific status type
|
|
822
|
+
*/
|
|
823
|
+
export interface BlueberryWithdrawalRequest extends Omit<WithdrawalRequest, 'status'> {
|
|
824
|
+
status: string;
|
|
825
|
+
}
|
|
826
|
+
/**
|
|
827
|
+
* Withdrawal asset liquidation with specific status type
|
|
828
|
+
*/
|
|
829
|
+
export interface BlueberryWithdrawalAssetLiquidation extends Omit<WithdrawalAssetLiquidation, 'liquidationStatus'> {
|
|
830
|
+
liquidationStatus: string;
|
|
831
|
+
}
|
|
832
|
+
/**
|
|
833
|
+
* Withdrawal asset liquidation payload with specific status type
|
|
834
|
+
*/
|
|
835
|
+
export interface BlueberryWithdrawalAssetLiquidationPayload extends Omit<WithdrawalAssetLiquidationPayload, 'liquidationStatus'> {
|
|
836
|
+
liquidationStatus?: string;
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* User document with string document type
|
|
840
|
+
*/
|
|
841
|
+
interface UserDocument {
|
|
842
|
+
uuid: string;
|
|
843
|
+
documentType: string;
|
|
844
|
+
createdAt: string;
|
|
845
|
+
status: string;
|
|
846
|
+
downloadUrl?: string;
|
|
847
|
+
}
|
|
848
|
+
interface GenerateDocumentPayload {
|
|
849
|
+
documentType: string;
|
|
850
|
+
}
|
|
851
|
+
interface DocumentQueryParams {
|
|
852
|
+
documentType?: string;
|
|
853
|
+
status?: string;
|
|
854
|
+
page?: number;
|
|
855
|
+
page_size?: number;
|
|
856
|
+
}
|
|
857
|
+
export interface BlueberryUserDocument extends Omit<UserDocument, 'documentType'> {
|
|
858
|
+
documentType: string;
|
|
859
|
+
}
|
|
860
|
+
/**
|
|
861
|
+
* Generate document payload with specific document type
|
|
862
|
+
*/
|
|
863
|
+
export interface BlueberryGenerateDocumentPayload extends Omit<GenerateDocumentPayload, 'documentType'> {
|
|
864
|
+
documentType: BlueberryDocumentType;
|
|
865
|
+
}
|
|
866
|
+
/**
|
|
867
|
+
* Document query params with specific document type
|
|
868
|
+
*/
|
|
869
|
+
export interface BlueberryDocumentQueryParams extends Omit<DocumentQueryParams, 'documentType'> {
|
|
870
|
+
documentType?: BlueberryDocumentType;
|
|
871
|
+
}
|
|
872
|
+
/**
|
|
873
|
+
* Page-specific allocation state for asset allocation page
|
|
874
|
+
*/
|
|
875
|
+
export interface PageAllocationState {
|
|
876
|
+
searchQuery: string;
|
|
877
|
+
selectedInstruments: Set<string>;
|
|
878
|
+
allocations: Record<string, number>;
|
|
879
|
+
showFilters: boolean;
|
|
880
|
+
filters: InstrumentFilters;
|
|
881
|
+
}
|
|
882
|
+
/**
|
|
883
|
+
* Filter options for page components
|
|
884
|
+
*/
|
|
885
|
+
export interface PageFilterOptions {
|
|
886
|
+
sectors: Sector[];
|
|
887
|
+
exchanges: StockExchange[];
|
|
888
|
+
industries: Industry[];
|
|
889
|
+
loadingSectors: boolean;
|
|
890
|
+
loadingExchanges?: boolean;
|
|
891
|
+
loadingIndustries?: boolean;
|
|
892
|
+
}
|
|
893
|
+
/**
|
|
894
|
+
* Chart data for page allocation visualization
|
|
895
|
+
*/
|
|
896
|
+
export interface PageAllocationChartData {
|
|
897
|
+
instrumentUuid: string;
|
|
898
|
+
symbol: string;
|
|
899
|
+
name: string;
|
|
900
|
+
percentage: number;
|
|
901
|
+
color: string;
|
|
902
|
+
}
|
|
903
|
+
/**
|
|
904
|
+
* Asset allocation page hook return type
|
|
905
|
+
*/
|
|
906
|
+
export interface UsePageAssetAllocationReturn {
|
|
907
|
+
state: PageAllocationState;
|
|
908
|
+
instruments: Instrument[];
|
|
909
|
+
portfolio: Portfolio | null;
|
|
910
|
+
currentAllocations: ImportedAssetAllocation[];
|
|
911
|
+
chartData: PageAllocationChartData[];
|
|
912
|
+
filteredInstruments: Instrument[];
|
|
913
|
+
filterOptions: PageFilterOptions;
|
|
914
|
+
isValid: boolean;
|
|
915
|
+
isLoading: boolean;
|
|
916
|
+
isSaving: boolean;
|
|
917
|
+
setSearchQuery: (query: string) => void;
|
|
918
|
+
toggleInstrument: (instrumentUuid: string) => void;
|
|
919
|
+
updateAllocation: (instrumentUuid: string, percentage: number) => void;
|
|
920
|
+
updateFilters: (filters: Partial<InstrumentFilters>) => void;
|
|
921
|
+
applyFilters: () => void;
|
|
922
|
+
toggleFilters: () => void;
|
|
923
|
+
closeFilters: () => void;
|
|
924
|
+
clearFilters: () => void;
|
|
925
|
+
saveAllocations: () => Promise<void>;
|
|
926
|
+
resetAllocations: () => void;
|
|
927
|
+
}
|
|
928
|
+
/**
|
|
929
|
+
* Paginated tax residencies response
|
|
930
|
+
*/
|
|
931
|
+
export interface BlueberryPaginatedTaxResidencies {
|
|
932
|
+
count: number;
|
|
933
|
+
next: string | null;
|
|
934
|
+
previous: string | null;
|
|
935
|
+
results: TaxResidency[];
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* Cash account transaction with specific transaction type
|
|
939
|
+
*/
|
|
940
|
+
export interface BlueberryCashAccountTransaction extends Omit<CashAccountTransaction, 'transactionType'> {
|
|
941
|
+
transactionType: unknown;
|
|
942
|
+
}
|
|
943
|
+
/**
|
|
944
|
+
* Transaction filters with specific transaction type
|
|
945
|
+
*/
|
|
946
|
+
export interface BlueberryTransactionFilters extends Omit<ImportedTransactionFilters, 'transactionType'> {
|
|
947
|
+
transactionType?: unknown;
|
|
948
|
+
}
|
|
949
|
+
/**
|
|
950
|
+
* Target trade filters with extended properties
|
|
951
|
+
*/
|
|
952
|
+
export interface BlueberryTargetTradeFilters extends TargetTradeFilters {
|
|
953
|
+
status?: string;
|
|
954
|
+
minValue?: number;
|
|
955
|
+
maxValue?: number;
|
|
956
|
+
}
|
|
957
|
+
/**
|
|
958
|
+
* Target trades management hook return type
|
|
959
|
+
*/
|
|
960
|
+
export interface UseTargetTradesManagementReturn {
|
|
961
|
+
financialSummary: FinancialSummary;
|
|
962
|
+
instruments: Instrument[];
|
|
963
|
+
holdings: InstrumentHolding[];
|
|
964
|
+
portfolioHoldings: InstrumentHolding[];
|
|
965
|
+
targetTrades: TargetTrade[];
|
|
966
|
+
sectors: Sector[];
|
|
967
|
+
exchanges: StockExchange[];
|
|
968
|
+
industries: Industry[];
|
|
969
|
+
dialogInstrumentFilters: InstrumentFilters;
|
|
970
|
+
serverInstrumentFilters: InstrumentFilters;
|
|
971
|
+
clientInstrumentSearchQuery: string;
|
|
972
|
+
showInstrumentFiltersDialog: boolean;
|
|
973
|
+
dialogTargetTradeFilters: BlueberryTargetTradeFilters;
|
|
974
|
+
serverTargetTradeFilters: BlueberryTargetTradeFilters;
|
|
975
|
+
clientTargetTradeSearchQuery: string;
|
|
976
|
+
showTargetTradeFiltersDialog: boolean;
|
|
977
|
+
isLoading: boolean;
|
|
978
|
+
isError: boolean;
|
|
979
|
+
isSubmitting: boolean;
|
|
980
|
+
loadingSectors: boolean;
|
|
981
|
+
loadingExchanges: boolean;
|
|
982
|
+
loadingIndustries: boolean;
|
|
983
|
+
error: Error | null;
|
|
984
|
+
onInstrumentSearch: (query: string) => void;
|
|
985
|
+
onClearInstrumentSearch: () => void;
|
|
986
|
+
onUpdateDialogInstrumentFilters: (filters: Partial<InstrumentFilters>) => void;
|
|
987
|
+
onApplyInstrumentFiltersToServer: () => void;
|
|
988
|
+
onClearAllInstrumentFilters: () => void;
|
|
989
|
+
onToggleInstrumentFiltersDialog: () => void;
|
|
990
|
+
updateDialogInstrumentFilters: (filters: Partial<InstrumentFilters>) => void;
|
|
991
|
+
applyInstrumentFiltersToServer: () => void;
|
|
992
|
+
performClientInstrumentSearch: (query: string) => void;
|
|
993
|
+
clearClientInstrumentSearch: () => void;
|
|
994
|
+
clearAllInstrumentFilters: () => void;
|
|
995
|
+
toggleInstrumentFiltersDialog: () => void;
|
|
996
|
+
onTargetTradeSearch: (query: string) => void;
|
|
997
|
+
onClearTargetTradeSearch: () => void;
|
|
998
|
+
onUpdateDialogTargetTradeFilters: (filters: Partial<BlueberryTargetTradeFilters>) => void;
|
|
999
|
+
onApplyTargetFiltersToServer: () => void;
|
|
1000
|
+
onClearAllTargetTradeFilters: () => void;
|
|
1001
|
+
onToggleTargetTradeFiltersDialog: () => void;
|
|
1002
|
+
updateDialogTargetTradeFilters: (filters: Partial<BlueberryTargetTradeFilters>) => void;
|
|
1003
|
+
applyTargetFiltersToServer: () => void;
|
|
1004
|
+
performClientTargetTradeSearch: (query: string) => void;
|
|
1005
|
+
clearClientTargetTradeSearch: () => void;
|
|
1006
|
+
clearAllTargetTradeFilters: () => void;
|
|
1007
|
+
toggleTargetTradeFiltersDialog: () => void;
|
|
1008
|
+
buyInstrument: (instrumentUuid: string) => Promise<void>;
|
|
1009
|
+
sellInstrument: (instrumentUuid: string) => Promise<void>;
|
|
1010
|
+
approveAllTrades: () => Promise<void>;
|
|
1011
|
+
cleanAllTrades: () => Promise<void>;
|
|
1012
|
+
generateRebalancingTrades: () => Promise<RebalancingTradesGenerationResponse>;
|
|
1013
|
+
onRefresh: () => void;
|
|
1014
|
+
refetch: () => void;
|
|
1015
|
+
}
|
|
1016
|
+
/**
|
|
1017
|
+
* Investment preferences form props for component
|
|
1018
|
+
*/
|
|
1019
|
+
export interface BlueberryInvestmentPreferencesFormProps {
|
|
1020
|
+
form: ImportedInvestmentPreferenceFormState;
|
|
1021
|
+
errors: FormErrors;
|
|
1022
|
+
isSubmitting: boolean;
|
|
1023
|
+
existingPreferenceUuid: string | null;
|
|
1024
|
+
formValidation?: ImportedInvestmentPreferenceFormValidation;
|
|
1025
|
+
onChange: (field: keyof ImportedInvestmentPreferenceFormState, value: string | string[] | number) => void;
|
|
1026
|
+
onSubmit: (e: React.FormEvent) => void;
|
|
1027
|
+
onBack?: () => void;
|
|
1028
|
+
}
|
|
1029
|
+
/**
|
|
1030
|
+
* Portfolio selection form props for component
|
|
1031
|
+
*/
|
|
1032
|
+
export interface BlueberryPortfolioSelectionFormProps {
|
|
1033
|
+
templates: PortfolioTemplate[];
|
|
1034
|
+
recommendedTemplateUuid: string | null;
|
|
1035
|
+
selectedTemplateUuid: string | null;
|
|
1036
|
+
viewingDetailsForUuid: string | null;
|
|
1037
|
+
templateAllocations: Record<string, ImportedTemplateWithAllocations>;
|
|
1038
|
+
errors: FormErrors;
|
|
1039
|
+
isSubmitting: boolean;
|
|
1040
|
+
formValidation?: unknown;
|
|
1041
|
+
onSelectTemplate: (templateUuid: string) => void;
|
|
1042
|
+
onViewDetails: (templateUuid: string | null) => void;
|
|
1043
|
+
onSubmit: () => void;
|
|
1044
|
+
onCustomize: () => void;
|
|
1045
|
+
onBack?: () => void;
|
|
1046
|
+
}
|
|
1047
|
+
/**
|
|
1048
|
+
* Transaction filters for cash transactions page with specific transaction type
|
|
1049
|
+
*/
|
|
1050
|
+
export interface BlueberryPageTransactionFilters extends Omit<ImportedTransactionFilters, 'transactionType'> {
|
|
1051
|
+
transactionType?: unknown;
|
|
1052
|
+
}
|
|
1053
|
+
/**
|
|
1054
|
+
* Target trade filters for target trades page with extended properties
|
|
1055
|
+
*/
|
|
1056
|
+
export interface BlueberryPageTargetTradeFilters extends TargetTradeFilters {
|
|
1057
|
+
status?: string;
|
|
1058
|
+
minValue?: number;
|
|
1059
|
+
maxValue?: number;
|
|
1060
|
+
}
|
|
1061
|
+
/**
|
|
1062
|
+
* Rebalancing trades generation response with specific error types
|
|
1063
|
+
*/
|
|
1064
|
+
export interface BlueberryRebalancingTradesGenerationResponse extends Omit<RebalancingTradesGenerationResponse, 'errorType'> {
|
|
1065
|
+
errorType?: unknown;
|
|
1066
|
+
}
|
|
1067
|
+
/**
|
|
1068
|
+
* Paginated bank accounts response
|
|
1069
|
+
*/
|
|
1070
|
+
export interface BlueberryPaginatedBankAccounts {
|
|
1071
|
+
count: number;
|
|
1072
|
+
next: string | null;
|
|
1073
|
+
previous: string | null;
|
|
1074
|
+
results: BlueberryBankAccount[];
|
|
1075
|
+
}
|
|
1076
|
+
/**
|
|
1077
|
+
* Paginated countries response
|
|
1078
|
+
*/
|
|
1079
|
+
export interface BlueberryPaginatedCountries {
|
|
1080
|
+
count: number;
|
|
1081
|
+
next: string | null;
|
|
1082
|
+
previous: string | null;
|
|
1083
|
+
results: Country[];
|
|
1084
|
+
}
|
|
1085
|
+
/**
|
|
1086
|
+
* Paginated cash accounts response
|
|
1087
|
+
*/
|
|
1088
|
+
export interface BlueberryPaginatedCashAccounts {
|
|
1089
|
+
count: number;
|
|
1090
|
+
next: string | null;
|
|
1091
|
+
previous: string | null;
|
|
1092
|
+
results: CashAccount[];
|
|
1093
|
+
}
|
|
1094
|
+
/**
|
|
1095
|
+
* Paginated instruments response
|
|
1096
|
+
*/
|
|
1097
|
+
export interface BlueberryPaginatedInstruments {
|
|
1098
|
+
count: number;
|
|
1099
|
+
next: string | null;
|
|
1100
|
+
previous: string | null;
|
|
1101
|
+
results: Instrument[];
|
|
1102
|
+
}
|
|
1103
|
+
/**
|
|
1104
|
+
* Paginated sectors response
|
|
1105
|
+
*/
|
|
1106
|
+
export interface BlueberryPaginatedSectors {
|
|
1107
|
+
count: number;
|
|
1108
|
+
next: string | null;
|
|
1109
|
+
previous: string | null;
|
|
1110
|
+
results: Sector[];
|
|
1111
|
+
}
|
|
1112
|
+
/**
|
|
1113
|
+
* Paginated accounts response
|
|
1114
|
+
*/
|
|
1115
|
+
export interface BlueberryPaginatedAccounts {
|
|
1116
|
+
count: number;
|
|
1117
|
+
next: string | null;
|
|
1118
|
+
previous: string | null;
|
|
1119
|
+
results: Account[];
|
|
1120
|
+
}
|
|
1121
|
+
/**
|
|
1122
|
+
* Paginated stock exchanges response
|
|
1123
|
+
*/
|
|
1124
|
+
export interface BlueberryPaginatedStockExchanges {
|
|
1125
|
+
count: number;
|
|
1126
|
+
next: string | null;
|
|
1127
|
+
previous: string | null;
|
|
1128
|
+
results: StockExchange[];
|
|
1129
|
+
}
|
|
1130
|
+
/**
|
|
1131
|
+
* Paginated industries response
|
|
1132
|
+
*/
|
|
1133
|
+
export interface BlueberryPaginatedIndustries {
|
|
1134
|
+
count: number;
|
|
1135
|
+
next: string | null;
|
|
1136
|
+
previous: string | null;
|
|
1137
|
+
results: Industry[];
|
|
1138
|
+
}
|
|
1139
|
+
/**
|
|
1140
|
+
* Paginated asset holdings response
|
|
1141
|
+
*/
|
|
1142
|
+
export interface BlueberryPaginatedAssetHoldings {
|
|
1143
|
+
count: number;
|
|
1144
|
+
next: string | null;
|
|
1145
|
+
previous: string | null;
|
|
1146
|
+
results: AssetHolding[];
|
|
1147
|
+
}
|
|
1148
|
+
/**
|
|
1149
|
+
* Paginated asset holding snapshots response
|
|
1150
|
+
*/
|
|
1151
|
+
export interface BlueberryPaginatedAssetHoldingSnapshots {
|
|
1152
|
+
count: number;
|
|
1153
|
+
next: string | null;
|
|
1154
|
+
previous: string | null;
|
|
1155
|
+
results: AssetHoldingSnapshot[];
|
|
1156
|
+
}
|
|
1157
|
+
/**
|
|
1158
|
+
* Paginated withdrawal requests response
|
|
1159
|
+
*/
|
|
1160
|
+
export interface BlueberryPaginatedWithdrawalRequests {
|
|
1161
|
+
count: number;
|
|
1162
|
+
next: string | null;
|
|
1163
|
+
previous: string | null;
|
|
1164
|
+
results: BlueberryWithdrawalRequest[];
|
|
1165
|
+
}
|
|
1166
|
+
/**
|
|
1167
|
+
* Paginated withdrawal asset liquidations response
|
|
1168
|
+
*/
|
|
1169
|
+
export interface BlueberryPaginatedWithdrawalAssetLiquidations {
|
|
1170
|
+
count: number;
|
|
1171
|
+
next: string | null;
|
|
1172
|
+
previous: string | null;
|
|
1173
|
+
results: BlueberryWithdrawalAssetLiquidation[];
|
|
1174
|
+
}
|
|
1175
|
+
/**
|
|
1176
|
+
* Cash account transaction query parameters with specific transaction type
|
|
1177
|
+
*/
|
|
1178
|
+
export interface BlueberryCashAccountTransactionQueryParams extends Omit<ImportedCashAccountTransactionQueryParams, 'transactionType'> {
|
|
1179
|
+
transactionType?: CashAccountTransactionType;
|
|
1180
|
+
}
|
|
1181
|
+
/**
|
|
1182
|
+
* Instrument filters with asset allocation specific extension
|
|
1183
|
+
*/
|
|
1184
|
+
export interface BlueberryAssetAllocationInstrumentFilters extends BaseInstrumentFilters {
|
|
1185
|
+
showAllocatedOnly?: boolean;
|
|
1186
|
+
}
|
|
1187
|
+
/**
|
|
1188
|
+
* Enhanced allocation state with server filters
|
|
1189
|
+
*/
|
|
1190
|
+
export interface EnhancedAllocationState extends AllocationState {
|
|
1191
|
+
serverFilters: InstrumentFilters;
|
|
1192
|
+
}
|
|
1193
|
+
/**
|
|
1194
|
+
* Financial summary panel props
|
|
1195
|
+
*/
|
|
1196
|
+
export interface FinancialSummaryPanelProps {
|
|
1197
|
+
financialSummary: FinancialSummary;
|
|
1198
|
+
isLoading?: boolean;
|
|
1199
|
+
error?: Error | null;
|
|
1200
|
+
onRefresh?: () => void;
|
|
1201
|
+
}
|
|
1202
|
+
/**
|
|
1203
|
+
* Search target trades field props
|
|
1204
|
+
*/
|
|
1205
|
+
export interface SearchTargetTradesFieldProps {
|
|
1206
|
+
value: string;
|
|
1207
|
+
onSearch: (query: string) => void;
|
|
1208
|
+
onClear: () => void;
|
|
1209
|
+
placeholder?: string;
|
|
1210
|
+
}
|
|
1211
|
+
/**
|
|
1212
|
+
* Review allocation data structure for signup review
|
|
1213
|
+
*/
|
|
1214
|
+
export interface ReviewAllocation {
|
|
1215
|
+
uuid: string;
|
|
1216
|
+
instrumentName: string;
|
|
1217
|
+
instrumentSymbol: string;
|
|
1218
|
+
percentage: string;
|
|
1219
|
+
}
|
|
1220
|
+
/**
|
|
1221
|
+
* Review allocation summary props
|
|
1222
|
+
*/
|
|
1223
|
+
export interface ReviewAllocationSummaryProps {
|
|
1224
|
+
allocations: ReviewAllocation[];
|
|
1225
|
+
}
|
|
1226
|
+
/**
|
|
1227
|
+
* Instruments panel props for target trades
|
|
1228
|
+
*/
|
|
1229
|
+
export interface InstrumentsPanelProps {
|
|
1230
|
+
instruments: Instrument[];
|
|
1231
|
+
holdings: InstrumentHolding[];
|
|
1232
|
+
sectors: Sector[];
|
|
1233
|
+
exchanges: StockExchange[];
|
|
1234
|
+
industries: Industry[];
|
|
1235
|
+
isLoading: boolean;
|
|
1236
|
+
isSubmitting: boolean;
|
|
1237
|
+
loadingSectors: boolean;
|
|
1238
|
+
loadingExchanges: boolean;
|
|
1239
|
+
loadingIndustries: boolean;
|
|
1240
|
+
filters: InstrumentFilters;
|
|
1241
|
+
showFiltersDialog: boolean;
|
|
1242
|
+
onSearch: (query: string) => void;
|
|
1243
|
+
onClear: () => void;
|
|
1244
|
+
onUpdateFilters: (filters: Partial<InstrumentFilters>) => void;
|
|
1245
|
+
onApplyFilters: () => void;
|
|
1246
|
+
onClearFilters: () => void;
|
|
1247
|
+
onToggleFiltersDialog: () => void;
|
|
1248
|
+
onBuyInstrument: (instrumentUuid: string) => void;
|
|
1249
|
+
onSellInstrument: (instrumentUuid: string) => void;
|
|
1250
|
+
onRefresh?: () => void;
|
|
1251
|
+
}
|
|
1252
|
+
/**
|
|
1253
|
+
* Instruments table props for asset allocation
|
|
1254
|
+
*/
|
|
1255
|
+
export interface AssetAllocationInstrumentsTableProps {
|
|
1256
|
+
instruments: Instrument[];
|
|
1257
|
+
selectedInstruments: Set<string>;
|
|
1258
|
+
onToggleInstrument: (instrumentUuid: string) => void;
|
|
1259
|
+
isLoading?: boolean;
|
|
1260
|
+
isSubmitting?: boolean;
|
|
1261
|
+
}
|
|
1262
|
+
/**
|
|
1263
|
+
* Target trades panel props
|
|
1264
|
+
*/
|
|
1265
|
+
export interface TargetTradesPanelProps {
|
|
1266
|
+
targetTrades: TargetTrade[];
|
|
1267
|
+
isLoading: boolean;
|
|
1268
|
+
onRefresh?: () => void;
|
|
1269
|
+
dialogTargetTradeFilters: TargetTradeFilters;
|
|
1270
|
+
clientTargetTradeSearchQuery: string;
|
|
1271
|
+
showTargetTradeFiltersDialog: boolean;
|
|
1272
|
+
onTargetTradeSearch: (query: string) => void;
|
|
1273
|
+
onClearTargetTradeSearch: () => void;
|
|
1274
|
+
onUpdateDialogTargetTradeFilters: (filters: Partial<TargetTradeFilters>) => void;
|
|
1275
|
+
onApplyTargetFiltersToServer: () => void;
|
|
1276
|
+
onClearAllTargetTradeFilters: () => void;
|
|
1277
|
+
onToggleTargetTradeFiltersDialog: () => void;
|
|
1278
|
+
}
|
|
1279
|
+
/**
|
|
1280
|
+
* Search instruments field props
|
|
1281
|
+
*/
|
|
1282
|
+
export interface SearchInstrumentsFieldProps {
|
|
1283
|
+
value: string;
|
|
1284
|
+
onSearch: (query: string) => void;
|
|
1285
|
+
onClear: () => void;
|
|
1286
|
+
placeholder?: string;
|
|
1287
|
+
}
|
|
1288
|
+
/**
|
|
1289
|
+
* Allocation bar props for signup portfolio performance
|
|
1290
|
+
*/
|
|
1291
|
+
export interface SignupAllocationBarProps {
|
|
1292
|
+
instrumentData: InstrumentPerformanceData[];
|
|
1293
|
+
}
|
|
1294
|
+
/**
|
|
1295
|
+
* Search trades field props
|
|
1296
|
+
*/
|
|
1297
|
+
export interface SearchTradesFieldProps {
|
|
1298
|
+
initialValue?: string;
|
|
1299
|
+
onSearch: (query: string) => void;
|
|
1300
|
+
placeholder?: string;
|
|
1301
|
+
}
|
|
1302
|
+
/**
|
|
1303
|
+
* Extended allocation state for signup allocation hooks
|
|
1304
|
+
*/
|
|
1305
|
+
export interface SignupExtendedAllocationState extends AllocationState {
|
|
1306
|
+
serverFilters: InstrumentFilters;
|
|
1307
|
+
}
|
|
1308
|
+
/**
|
|
1309
|
+
* Parameters for allocation data hook
|
|
1310
|
+
*/
|
|
1311
|
+
export interface UseAllocationDataParams {
|
|
1312
|
+
portfolio: Portfolio | null;
|
|
1313
|
+
}
|
|
1314
|
+
/**
|
|
1315
|
+
* Return type for allocation data hook
|
|
1316
|
+
*/
|
|
1317
|
+
export interface UseAllocationDataReturn {
|
|
1318
|
+
state: AllocationState;
|
|
1319
|
+
instruments: Instrument[];
|
|
1320
|
+
filteredInstruments: Instrument[];
|
|
1321
|
+
chartData: AllocationChartData[];
|
|
1322
|
+
currentAllocations: ImportedAssetAllocation[];
|
|
1323
|
+
totalAllocation: number;
|
|
1324
|
+
isValid: boolean;
|
|
1325
|
+
isLoading: boolean;
|
|
1326
|
+
isSaving: boolean;
|
|
1327
|
+
setSearchQuery: (query: string) => void;
|
|
1328
|
+
toggleInstrument: (instrumentUuid: string) => void;
|
|
1329
|
+
updateAllocation: (instrumentUuid: string, percentage: number) => void;
|
|
1330
|
+
updateFilters: (filters: Partial<InstrumentFilters>) => void;
|
|
1331
|
+
applyFilters: () => void;
|
|
1332
|
+
toggleFilters: () => void;
|
|
1333
|
+
closeFilters: () => void;
|
|
1334
|
+
clearFilters: () => void;
|
|
1335
|
+
saveAllocations: () => Promise<void>;
|
|
1336
|
+
resetAllocations: () => void;
|
|
1337
|
+
}
|
|
1338
|
+
/**
|
|
1339
|
+
* Return type for signup flow hook
|
|
1340
|
+
*/
|
|
1341
|
+
export interface UseSignupFlowReturn {
|
|
1342
|
+
portfolio: Portfolio | null;
|
|
1343
|
+
isLoading: boolean;
|
|
1344
|
+
isSaving: boolean;
|
|
1345
|
+
navigate: unknown;
|
|
1346
|
+
}
|
|
1347
|
+
/**
|
|
1348
|
+
* Instruments table props for signup asset allocation
|
|
1349
|
+
*/
|
|
1350
|
+
export interface SignupInstrumentsTableProps {
|
|
1351
|
+
instruments: Instrument[];
|
|
1352
|
+
selectedInstruments: Set<string>;
|
|
1353
|
+
onToggleInstrument: (instrumentUuid: string) => void;
|
|
1354
|
+
isLoading?: boolean;
|
|
1355
|
+
isSubmitting?: boolean;
|
|
1356
|
+
}
|
|
1357
|
+
/**
|
|
1358
|
+
* Search field props for asset allocation page
|
|
1359
|
+
*/
|
|
1360
|
+
export interface AssetAllocationSearchFieldProps {
|
|
1361
|
+
value: string;
|
|
1362
|
+
onChange: (value: string) => void;
|
|
1363
|
+
placeholder?: string;
|
|
1364
|
+
showFilters: boolean;
|
|
1365
|
+
filters: InstrumentFilters;
|
|
1366
|
+
filterOptions: FilterOptions;
|
|
1367
|
+
onToggleFilters: () => void;
|
|
1368
|
+
onCloseFilters: () => void;
|
|
1369
|
+
onUpdateFilters: (filters: Partial<InstrumentFilters>) => void;
|
|
1370
|
+
onApplyFilters: () => void;
|
|
1371
|
+
onClearFilters: () => void;
|
|
1372
|
+
}
|
|
1373
|
+
/**
|
|
1374
|
+
* Allocation chart props for signup
|
|
1375
|
+
*/
|
|
1376
|
+
export interface SignupAllocationChartProps {
|
|
1377
|
+
data: AllocationChartData[];
|
|
1378
|
+
onPercentageChange?: (instrumentUuid: string, percentage: number) => void;
|
|
1379
|
+
disableControls?: boolean;
|
|
1380
|
+
}
|
|
1381
|
+
/**
|
|
1382
|
+
* Search field props for signup asset allocation
|
|
1383
|
+
*/
|
|
1384
|
+
export interface SignupAssetAllocationSearchFieldProps {
|
|
1385
|
+
value: string;
|
|
1386
|
+
onChange: (value: string) => void;
|
|
1387
|
+
placeholder?: string;
|
|
1388
|
+
showFilters: boolean;
|
|
1389
|
+
filters: InstrumentFilters;
|
|
1390
|
+
filterOptions: FilterOptions;
|
|
1391
|
+
onToggleFilters: () => void;
|
|
1392
|
+
onCloseFilters: () => void;
|
|
1393
|
+
onUpdateFilters: (filters: Partial<InstrumentFilters>) => void;
|
|
1394
|
+
onApplyFilters: () => void;
|
|
1395
|
+
onClearFilters: () => void;
|
|
1396
|
+
}
|
|
1397
|
+
/**
|
|
1398
|
+
* Portfolio performance panel props for signup
|
|
1399
|
+
*/
|
|
1400
|
+
export interface PortfolioPerformancePanelProps {
|
|
1401
|
+
portfolio: Portfolio | null;
|
|
1402
|
+
allocations: ImportedAssetAllocation[];
|
|
1403
|
+
instrumentData: InstrumentPerformanceData[];
|
|
1404
|
+
selectedTimeRange: TimeRange;
|
|
1405
|
+
isLoading: boolean;
|
|
1406
|
+
isError: boolean;
|
|
1407
|
+
onTimeRangeChange: (timeRange: TimeRange) => void;
|
|
1408
|
+
onRetry: () => void;
|
|
1409
|
+
onContinue: () => void;
|
|
1410
|
+
onBackToPortfolioSelection: () => void;
|
|
1411
|
+
onBackToAssetAllocation: () => void;
|
|
1412
|
+
}
|
|
1413
|
+
export {};
|
|
1414
|
+
//# sourceMappingURL=blueberry.d.ts.map
|