@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