feat(derivatives): fix Trade Republic derivative pagination streaming and picker modal

This commit is contained in:
2026-08-15 19:30:15 +02:00
parent 7e18257e3e
commit 882d24a316
7 changed files with 1045 additions and 26 deletions
@@ -0,0 +1,95 @@
import 'package:equatable/equatable.dart';
class DerivativeItemModel extends Equatable {
final String isin;
final String name;
final String optionType;
final String productCategoryName;
final String nextGenProductCategoryName;
final double strike;
final double barrier;
final double leverage;
final double? size;
final double? factor;
final double? delta;
final String currency;
final String? expiry;
final String issuer;
final String issuerDisplayName;
final String? issuerImageId;
final String underlyingIsin;
const DerivativeItemModel({
required this.isin,
this.name = '',
this.optionType = 'Long',
this.productCategoryName = '',
this.nextGenProductCategoryName = '',
this.strike = 0.0,
this.barrier = 0.0,
this.leverage = 1.0,
this.size,
this.factor,
this.delta,
this.currency = 'EUR',
this.expiry,
this.issuer = '',
this.issuerDisplayName = '',
this.issuerImageId,
this.underlyingIsin = '',
});
bool get isLong => optionType.toLowerCase().contains('long') || optionType.toLowerCase().contains('call');
double distanceToBarrier(double currentUnderlyingPrice) {
if (barrier <= 0 || currentUnderlyingPrice <= 0) return 0.0;
return ((currentUnderlyingPrice - barrier).abs() / currentUnderlyingPrice) * 100.0;
}
factory DerivativeItemModel.fromJson(Map<String, dynamic> json) {
double parseDbl(dynamic val) {
if (val == null) return 0.0;
if (val is num) return val.toDouble();
return double.tryParse(val.toString()) ?? 0.0;
}
double? parseOptDbl(dynamic val) {
if (val == null) return null;
if (val is num) return val.toDouble();
return double.tryParse(val.toString());
}
return DerivativeItemModel(
isin: json['isin']?.toString() ?? '',
name: json['name']?.toString() ?? '',
optionType: json['optionType']?.toString() ?? 'Long',
productCategoryName: json['productCategoryName']?.toString() ?? '',
nextGenProductCategoryName: json['nextGenProductCategoryName']?.toString() ?? '',
strike: parseDbl(json['strike']),
barrier: parseDbl(json['barrier']),
leverage: parseDbl(json['leverage']),
size: parseOptDbl(json['size']),
factor: parseOptDbl(json['factor']),
delta: parseOptDbl(json['delta']),
currency: json['currency']?.toString() ?? 'EUR',
expiry: json['expiry']?.toString(),
issuer: json['issuer']?.toString() ?? '',
issuerDisplayName: json['issuerDisplayName']?.toString() ?? (json['issuer']?.toString() ?? ''),
issuerImageId: json['issuerImageId']?.toString(),
underlyingIsin: json['underlyingIsin']?.toString() ?? '',
);
}
@override
List<Object?> get props => [
isin,
name,
optionType,
productCategoryName,
strike,
barrier,
leverage,
issuer,
underlyingIsin,
];
}