From 3fd9cd4547a6b06cfc5034e3045d3c09941b8d5d Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 22 Jun 2025 03:37:29 +0800 Subject: [PATCH] :sparkles: Leveling screen basis --- lib/models/wallet.dart | 29 ++ lib/models/wallet.freezed.dart | 220 ++++++++++++++ lib/models/wallet.g.dart | 56 ++++ lib/route.dart | 1 + lib/route.gr.dart | 471 ++++++++++++++++-------------- lib/screens/account.dart | 13 +- lib/screens/account/leveling.dart | 258 ++++++++++++++++ 7 files changed, 817 insertions(+), 231 deletions(-) create mode 100644 lib/screens/account/leveling.dart diff --git a/lib/models/wallet.dart b/lib/models/wallet.dart index df866ca..505d84a 100644 --- a/lib/models/wallet.dart +++ b/lib/models/wallet.dart @@ -56,3 +56,32 @@ sealed class SnTransaction with _$SnTransaction { factory SnTransaction.fromJson(Map json) => _$SnTransactionFromJson(json); } + +@freezed +sealed class SnWalletSubscription with _$SnWalletSubscription { + const factory SnWalletSubscription({ + required String id, + required DateTime begunAt, + required DateTime endedAt, + required String identifier, + required bool isActive, + required bool isFreeTrial, + required int status, + required String paymentMethod, + required Map paymentDetails, + required double basePrice, + required String? couponId, + required dynamic coupon, + required DateTime renewalAt, + required String accountId, + required SnAccount? account, + required bool isAvailable, + required double finalPrice, + required DateTime createdAt, + required DateTime updatedAt, + required DateTime? deletedAt, + }) = _SnWalletSubscription; + + factory SnWalletSubscription.fromJson(Map json) => + _$SnWalletSubscriptionFromJson(json); +} diff --git a/lib/models/wallet.freezed.dart b/lib/models/wallet.freezed.dart index 466aaea..71415d7 100644 --- a/lib/models/wallet.freezed.dart +++ b/lib/models/wallet.freezed.dart @@ -558,4 +558,224 @@ $SnWalletCopyWith<$Res>? get payeeWallet { } } + +/// @nodoc +mixin _$SnWalletSubscription { + + String get id; DateTime get begunAt; DateTime get endedAt; String get identifier; bool get isActive; bool get isFreeTrial; int get status; String get paymentMethod; Map get paymentDetails; double get basePrice; String? get couponId; dynamic get coupon; DateTime get renewalAt; String get accountId; SnAccount? get account; bool get isAvailable; double get finalPrice; DateTime get createdAt; DateTime get updatedAt; DateTime? get deletedAt; +/// Create a copy of SnWalletSubscription +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SnWalletSubscriptionCopyWith get copyWith => _$SnWalletSubscriptionCopyWithImpl(this as SnWalletSubscription, _$identity); + + /// Serializes this SnWalletSubscription to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SnWalletSubscription&&(identical(other.id, id) || other.id == id)&&(identical(other.begunAt, begunAt) || other.begunAt == begunAt)&&(identical(other.endedAt, endedAt) || other.endedAt == endedAt)&&(identical(other.identifier, identifier) || other.identifier == identifier)&&(identical(other.isActive, isActive) || other.isActive == isActive)&&(identical(other.isFreeTrial, isFreeTrial) || other.isFreeTrial == isFreeTrial)&&(identical(other.status, status) || other.status == status)&&(identical(other.paymentMethod, paymentMethod) || other.paymentMethod == paymentMethod)&&const DeepCollectionEquality().equals(other.paymentDetails, paymentDetails)&&(identical(other.basePrice, basePrice) || other.basePrice == basePrice)&&(identical(other.couponId, couponId) || other.couponId == couponId)&&const DeepCollectionEquality().equals(other.coupon, coupon)&&(identical(other.renewalAt, renewalAt) || other.renewalAt == renewalAt)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.account, account) || other.account == account)&&(identical(other.isAvailable, isAvailable) || other.isAvailable == isAvailable)&&(identical(other.finalPrice, finalPrice) || other.finalPrice == finalPrice)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,begunAt,endedAt,identifier,isActive,isFreeTrial,status,paymentMethod,const DeepCollectionEquality().hash(paymentDetails),basePrice,couponId,const DeepCollectionEquality().hash(coupon),renewalAt,accountId,account,isAvailable,finalPrice,createdAt,updatedAt,deletedAt]); + +@override +String toString() { + return 'SnWalletSubscription(id: $id, begunAt: $begunAt, endedAt: $endedAt, identifier: $identifier, isActive: $isActive, isFreeTrial: $isFreeTrial, status: $status, paymentMethod: $paymentMethod, paymentDetails: $paymentDetails, basePrice: $basePrice, couponId: $couponId, coupon: $coupon, renewalAt: $renewalAt, accountId: $accountId, account: $account, isAvailable: $isAvailable, finalPrice: $finalPrice, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; +} + + +} + +/// @nodoc +abstract mixin class $SnWalletSubscriptionCopyWith<$Res> { + factory $SnWalletSubscriptionCopyWith(SnWalletSubscription value, $Res Function(SnWalletSubscription) _then) = _$SnWalletSubscriptionCopyWithImpl; +@useResult +$Res call({ + String id, DateTime begunAt, DateTime endedAt, String identifier, bool isActive, bool isFreeTrial, int status, String paymentMethod, Map paymentDetails, double basePrice, String? couponId, dynamic coupon, DateTime renewalAt, String accountId, SnAccount? account, bool isAvailable, double finalPrice, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt +}); + + +$SnAccountCopyWith<$Res>? get account; + +} +/// @nodoc +class _$SnWalletSubscriptionCopyWithImpl<$Res> + implements $SnWalletSubscriptionCopyWith<$Res> { + _$SnWalletSubscriptionCopyWithImpl(this._self, this._then); + + final SnWalletSubscription _self; + final $Res Function(SnWalletSubscription) _then; + +/// Create a copy of SnWalletSubscription +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? begunAt = null,Object? endedAt = null,Object? identifier = null,Object? isActive = null,Object? isFreeTrial = null,Object? status = null,Object? paymentMethod = null,Object? paymentDetails = null,Object? basePrice = null,Object? couponId = freezed,Object? coupon = freezed,Object? renewalAt = null,Object? accountId = null,Object? account = freezed,Object? isAvailable = null,Object? finalPrice = null,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { + return _then(_self.copyWith( +id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as String,begunAt: null == begunAt ? _self.begunAt : begunAt // ignore: cast_nullable_to_non_nullable +as DateTime,endedAt: null == endedAt ? _self.endedAt : endedAt // ignore: cast_nullable_to_non_nullable +as DateTime,identifier: null == identifier ? _self.identifier : identifier // ignore: cast_nullable_to_non_nullable +as String,isActive: null == isActive ? _self.isActive : isActive // ignore: cast_nullable_to_non_nullable +as bool,isFreeTrial: null == isFreeTrial ? _self.isFreeTrial : isFreeTrial // ignore: cast_nullable_to_non_nullable +as bool,status: null == status ? _self.status : status // ignore: cast_nullable_to_non_nullable +as int,paymentMethod: null == paymentMethod ? _self.paymentMethod : paymentMethod // ignore: cast_nullable_to_non_nullable +as String,paymentDetails: null == paymentDetails ? _self.paymentDetails : paymentDetails // ignore: cast_nullable_to_non_nullable +as Map,basePrice: null == basePrice ? _self.basePrice : basePrice // ignore: cast_nullable_to_non_nullable +as double,couponId: freezed == couponId ? _self.couponId : couponId // ignore: cast_nullable_to_non_nullable +as String?,coupon: freezed == coupon ? _self.coupon : coupon // ignore: cast_nullable_to_non_nullable +as dynamic,renewalAt: null == renewalAt ? _self.renewalAt : renewalAt // ignore: cast_nullable_to_non_nullable +as DateTime,accountId: null == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable +as String,account: freezed == account ? _self.account : account // ignore: cast_nullable_to_non_nullable +as SnAccount?,isAvailable: null == isAvailable ? _self.isAvailable : isAvailable // ignore: cast_nullable_to_non_nullable +as bool,finalPrice: null == finalPrice ? _self.finalPrice : finalPrice // ignore: cast_nullable_to_non_nullable +as double,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable +as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable +as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable +as DateTime?, + )); +} +/// Create a copy of SnWalletSubscription +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnAccountCopyWith<$Res>? get account { + if (_self.account == null) { + return null; + } + + return $SnAccountCopyWith<$Res>(_self.account!, (value) { + return _then(_self.copyWith(account: value)); + }); +} +} + + +/// @nodoc +@JsonSerializable() + +class _SnWalletSubscription implements SnWalletSubscription { + const _SnWalletSubscription({required this.id, required this.begunAt, required this.endedAt, required this.identifier, required this.isActive, required this.isFreeTrial, required this.status, required this.paymentMethod, required final Map paymentDetails, required this.basePrice, required this.couponId, required this.coupon, required this.renewalAt, required this.accountId, required this.account, required this.isAvailable, required this.finalPrice, required this.createdAt, required this.updatedAt, required this.deletedAt}): _paymentDetails = paymentDetails; + factory _SnWalletSubscription.fromJson(Map json) => _$SnWalletSubscriptionFromJson(json); + +@override final String id; +@override final DateTime begunAt; +@override final DateTime endedAt; +@override final String identifier; +@override final bool isActive; +@override final bool isFreeTrial; +@override final int status; +@override final String paymentMethod; + final Map _paymentDetails; +@override Map get paymentDetails { + if (_paymentDetails is EqualUnmodifiableMapView) return _paymentDetails; + // ignore: implicit_dynamic_type + return EqualUnmodifiableMapView(_paymentDetails); +} + +@override final double basePrice; +@override final String? couponId; +@override final dynamic coupon; +@override final DateTime renewalAt; +@override final String accountId; +@override final SnAccount? account; +@override final bool isAvailable; +@override final double finalPrice; +@override final DateTime createdAt; +@override final DateTime updatedAt; +@override final DateTime? deletedAt; + +/// Create a copy of SnWalletSubscription +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$SnWalletSubscriptionCopyWith<_SnWalletSubscription> get copyWith => __$SnWalletSubscriptionCopyWithImpl<_SnWalletSubscription>(this, _$identity); + +@override +Map toJson() { + return _$SnWalletSubscriptionToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SnWalletSubscription&&(identical(other.id, id) || other.id == id)&&(identical(other.begunAt, begunAt) || other.begunAt == begunAt)&&(identical(other.endedAt, endedAt) || other.endedAt == endedAt)&&(identical(other.identifier, identifier) || other.identifier == identifier)&&(identical(other.isActive, isActive) || other.isActive == isActive)&&(identical(other.isFreeTrial, isFreeTrial) || other.isFreeTrial == isFreeTrial)&&(identical(other.status, status) || other.status == status)&&(identical(other.paymentMethod, paymentMethod) || other.paymentMethod == paymentMethod)&&const DeepCollectionEquality().equals(other._paymentDetails, _paymentDetails)&&(identical(other.basePrice, basePrice) || other.basePrice == basePrice)&&(identical(other.couponId, couponId) || other.couponId == couponId)&&const DeepCollectionEquality().equals(other.coupon, coupon)&&(identical(other.renewalAt, renewalAt) || other.renewalAt == renewalAt)&&(identical(other.accountId, accountId) || other.accountId == accountId)&&(identical(other.account, account) || other.account == account)&&(identical(other.isAvailable, isAvailable) || other.isAvailable == isAvailable)&&(identical(other.finalPrice, finalPrice) || other.finalPrice == finalPrice)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.deletedAt, deletedAt) || other.deletedAt == deletedAt)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hashAll([runtimeType,id,begunAt,endedAt,identifier,isActive,isFreeTrial,status,paymentMethod,const DeepCollectionEquality().hash(_paymentDetails),basePrice,couponId,const DeepCollectionEquality().hash(coupon),renewalAt,accountId,account,isAvailable,finalPrice,createdAt,updatedAt,deletedAt]); + +@override +String toString() { + return 'SnWalletSubscription(id: $id, begunAt: $begunAt, endedAt: $endedAt, identifier: $identifier, isActive: $isActive, isFreeTrial: $isFreeTrial, status: $status, paymentMethod: $paymentMethod, paymentDetails: $paymentDetails, basePrice: $basePrice, couponId: $couponId, coupon: $coupon, renewalAt: $renewalAt, accountId: $accountId, account: $account, isAvailable: $isAvailable, finalPrice: $finalPrice, createdAt: $createdAt, updatedAt: $updatedAt, deletedAt: $deletedAt)'; +} + + +} + +/// @nodoc +abstract mixin class _$SnWalletSubscriptionCopyWith<$Res> implements $SnWalletSubscriptionCopyWith<$Res> { + factory _$SnWalletSubscriptionCopyWith(_SnWalletSubscription value, $Res Function(_SnWalletSubscription) _then) = __$SnWalletSubscriptionCopyWithImpl; +@override @useResult +$Res call({ + String id, DateTime begunAt, DateTime endedAt, String identifier, bool isActive, bool isFreeTrial, int status, String paymentMethod, Map paymentDetails, double basePrice, String? couponId, dynamic coupon, DateTime renewalAt, String accountId, SnAccount? account, bool isAvailable, double finalPrice, DateTime createdAt, DateTime updatedAt, DateTime? deletedAt +}); + + +@override $SnAccountCopyWith<$Res>? get account; + +} +/// @nodoc +class __$SnWalletSubscriptionCopyWithImpl<$Res> + implements _$SnWalletSubscriptionCopyWith<$Res> { + __$SnWalletSubscriptionCopyWithImpl(this._self, this._then); + + final _SnWalletSubscription _self; + final $Res Function(_SnWalletSubscription) _then; + +/// Create a copy of SnWalletSubscription +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? begunAt = null,Object? endedAt = null,Object? identifier = null,Object? isActive = null,Object? isFreeTrial = null,Object? status = null,Object? paymentMethod = null,Object? paymentDetails = null,Object? basePrice = null,Object? couponId = freezed,Object? coupon = freezed,Object? renewalAt = null,Object? accountId = null,Object? account = freezed,Object? isAvailable = null,Object? finalPrice = null,Object? createdAt = null,Object? updatedAt = null,Object? deletedAt = freezed,}) { + return _then(_SnWalletSubscription( +id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable +as String,begunAt: null == begunAt ? _self.begunAt : begunAt // ignore: cast_nullable_to_non_nullable +as DateTime,endedAt: null == endedAt ? _self.endedAt : endedAt // ignore: cast_nullable_to_non_nullable +as DateTime,identifier: null == identifier ? _self.identifier : identifier // ignore: cast_nullable_to_non_nullable +as String,isActive: null == isActive ? _self.isActive : isActive // ignore: cast_nullable_to_non_nullable +as bool,isFreeTrial: null == isFreeTrial ? _self.isFreeTrial : isFreeTrial // ignore: cast_nullable_to_non_nullable +as bool,status: null == status ? _self.status : status // ignore: cast_nullable_to_non_nullable +as int,paymentMethod: null == paymentMethod ? _self.paymentMethod : paymentMethod // ignore: cast_nullable_to_non_nullable +as String,paymentDetails: null == paymentDetails ? _self._paymentDetails : paymentDetails // ignore: cast_nullable_to_non_nullable +as Map,basePrice: null == basePrice ? _self.basePrice : basePrice // ignore: cast_nullable_to_non_nullable +as double,couponId: freezed == couponId ? _self.couponId : couponId // ignore: cast_nullable_to_non_nullable +as String?,coupon: freezed == coupon ? _self.coupon : coupon // ignore: cast_nullable_to_non_nullable +as dynamic,renewalAt: null == renewalAt ? _self.renewalAt : renewalAt // ignore: cast_nullable_to_non_nullable +as DateTime,accountId: null == accountId ? _self.accountId : accountId // ignore: cast_nullable_to_non_nullable +as String,account: freezed == account ? _self.account : account // ignore: cast_nullable_to_non_nullable +as SnAccount?,isAvailable: null == isAvailable ? _self.isAvailable : isAvailable // ignore: cast_nullable_to_non_nullable +as bool,finalPrice: null == finalPrice ? _self.finalPrice : finalPrice // ignore: cast_nullable_to_non_nullable +as double,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable +as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable +as DateTime,deletedAt: freezed == deletedAt ? _self.deletedAt : deletedAt // ignore: cast_nullable_to_non_nullable +as DateTime?, + )); +} + +/// Create a copy of SnWalletSubscription +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$SnAccountCopyWith<$Res>? get account { + if (_self.account == null) { + return null; + } + + return $SnAccountCopyWith<$Res>(_self.account!, (value) { + return _then(_self.copyWith(account: value)); + }); +} +} + // dart format on diff --git a/lib/models/wallet.g.dart b/lib/models/wallet.g.dart index 1523309..9dd3904 100644 --- a/lib/models/wallet.g.dart +++ b/lib/models/wallet.g.dart @@ -100,3 +100,59 @@ Map _$SnTransactionToJson(_SnTransaction instance) => 'updated_at': instance.updatedAt.toIso8601String(), 'deleted_at': instance.deletedAt?.toIso8601String(), }; + +_SnWalletSubscription _$SnWalletSubscriptionFromJson( + Map json, +) => _SnWalletSubscription( + id: json['id'] as String, + begunAt: DateTime.parse(json['begun_at'] as String), + endedAt: DateTime.parse(json['ended_at'] as String), + identifier: json['identifier'] as String, + isActive: json['is_active'] as bool, + isFreeTrial: json['is_free_trial'] as bool, + status: (json['status'] as num).toInt(), + paymentMethod: json['payment_method'] as String, + paymentDetails: json['payment_details'] as Map, + basePrice: (json['base_price'] as num).toDouble(), + couponId: json['coupon_id'] as String?, + coupon: json['coupon'], + renewalAt: DateTime.parse(json['renewal_at'] as String), + accountId: json['account_id'] as String, + account: + json['account'] == null + ? null + : SnAccount.fromJson(json['account'] as Map), + isAvailable: json['is_available'] as bool, + finalPrice: (json['final_price'] as num).toDouble(), + createdAt: DateTime.parse(json['created_at'] as String), + updatedAt: DateTime.parse(json['updated_at'] as String), + deletedAt: + json['deleted_at'] == null + ? null + : DateTime.parse(json['deleted_at'] as String), +); + +Map _$SnWalletSubscriptionToJson( + _SnWalletSubscription instance, +) => { + 'id': instance.id, + 'begun_at': instance.begunAt.toIso8601String(), + 'ended_at': instance.endedAt.toIso8601String(), + 'identifier': instance.identifier, + 'is_active': instance.isActive, + 'is_free_trial': instance.isFreeTrial, + 'status': instance.status, + 'payment_method': instance.paymentMethod, + 'payment_details': instance.paymentDetails, + 'base_price': instance.basePrice, + 'coupon_id': instance.couponId, + 'coupon': instance.coupon, + 'renewal_at': instance.renewalAt.toIso8601String(), + 'account_id': instance.accountId, + 'account': instance.account?.toJson(), + 'is_available': instance.isAvailable, + 'final_price': instance.finalPrice, + 'created_at': instance.createdAt.toIso8601String(), + 'updated_at': instance.updatedAt.toIso8601String(), + 'deleted_at': instance.deletedAt?.toIso8601String(), +}; diff --git a/lib/route.dart b/lib/route.dart index d350e1c..fdfdd9c 100644 --- a/lib/route.dart +++ b/lib/route.dart @@ -34,6 +34,7 @@ class AppRouter extends RootStackRouter { AutoRoute(page: RelationshipRoute.page, path: 'relationships'), AutoRoute(page: AccountProfileRoute.page, path: ':name'), AutoRoute(page: UpdateProfileRoute.page, path: 'me/update'), + AutoRoute(page: LevelingRoute.page, path: 'me/leveling'), AutoRoute(page: AccountSettingsRoute.page, path: 'settings'), ], ), diff --git a/lib/route.gr.dart b/lib/route.gr.dart index bde5b1f..1376f14 100644 --- a/lib/route.gr.dart +++ b/lib/route.gr.dart @@ -9,18 +9,19 @@ // coverage:ignore-file // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'package:auto_route/auto_route.dart' as _i29; -import 'package:flutter/foundation.dart' as _i31; -import 'package:flutter/material.dart' as _i30; -import 'package:island/models/post.dart' as _i32; +import 'package:auto_route/auto_route.dart' as _i30; +import 'package:flutter/foundation.dart' as _i32; +import 'package:flutter/material.dart' as _i31; +import 'package:island/models/post.dart' as _i33; import 'package:island/screens/account.dart' as _i2; import 'package:island/screens/account/event_calendar.dart' as _i16; +import 'package:island/screens/account/leveling.dart' as _i18; import 'package:island/screens/account/me/settings.dart' as _i3; -import 'package:island/screens/account/me/update.dart' as _i27; +import 'package:island/screens/account/me/update.dart' as _i28; import 'package:island/screens/account/profile.dart' as _i1; -import 'package:island/screens/account/relationship.dart' as _i24; +import 'package:island/screens/account/relationship.dart' as _i25; import 'package:island/screens/auth/create_account.dart' as _i9; -import 'package:island/screens/auth/login.dart' as _i18; +import 'package:island/screens/auth/login.dart' as _i19; import 'package:island/screens/chat/call.dart' as _i5; import 'package:island/screens/chat/chat.dart' as _i7; import 'package:island/screens/chat/room.dart' as _i8; @@ -31,24 +32,24 @@ import 'package:island/screens/creators/publishers.dart' as _i12; import 'package:island/screens/creators/stickers/pack_detail.dart' as _i15; import 'package:island/screens/creators/stickers/stickers.dart' as _i14; import 'package:island/screens/explore.dart' as _i17; -import 'package:island/screens/notification.dart' as _i19; -import 'package:island/screens/posts/compose.dart' as _i20; +import 'package:island/screens/notification.dart' as _i20; +import 'package:island/screens/posts/compose.dart' as _i21; import 'package:island/screens/posts/compose_article.dart' as _i4; -import 'package:island/screens/posts/detail.dart' as _i21; -import 'package:island/screens/posts/pub_profile.dart' as _i22; -import 'package:island/screens/realm/detail.dart' as _i23; +import 'package:island/screens/posts/detail.dart' as _i22; +import 'package:island/screens/posts/pub_profile.dart' as _i23; +import 'package:island/screens/realm/detail.dart' as _i24; import 'package:island/screens/realm/realms.dart' as _i13; -import 'package:island/screens/settings.dart' as _i25; -import 'package:island/screens/tabs.dart' as _i26; -import 'package:island/screens/wallet.dart' as _i28; +import 'package:island/screens/settings.dart' as _i26; +import 'package:island/screens/tabs.dart' as _i27; +import 'package:island/screens/wallet.dart' as _i29; /// generated route for /// [_i1.AccountProfileScreen] -class AccountProfileRoute extends _i29.PageRouteInfo { +class AccountProfileRoute extends _i30.PageRouteInfo { AccountProfileRoute({ - _i30.Key? key, + _i31.Key? key, required String name, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( AccountProfileRoute.name, args: AccountProfileRouteArgs(key: key, name: name), @@ -58,7 +59,7 @@ class AccountProfileRoute extends _i29.PageRouteInfo { static const String name = 'AccountProfileRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -74,7 +75,7 @@ class AccountProfileRoute extends _i29.PageRouteInfo { class AccountProfileRouteArgs { const AccountProfileRouteArgs({this.key, required this.name}); - final _i30.Key? key; + final _i31.Key? key; final String name; @@ -96,11 +97,11 @@ class AccountProfileRouteArgs { /// generated route for /// [_i2.AccountScreen] -class AccountRoute extends _i29.PageRouteInfo { +class AccountRoute extends _i30.PageRouteInfo { AccountRoute({ - _i31.Key? key, + _i32.Key? key, bool isAside = false, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( AccountRoute.name, args: AccountRouteArgs(key: key, isAside: isAside), @@ -109,7 +110,7 @@ class AccountRoute extends _i29.PageRouteInfo { static const String name = 'AccountRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final args = data.argsAs( @@ -123,7 +124,7 @@ class AccountRoute extends _i29.PageRouteInfo { class AccountRouteArgs { const AccountRouteArgs({this.key, this.isAside = false}); - final _i31.Key? key; + final _i32.Key? key; final bool isAside; @@ -145,13 +146,13 @@ class AccountRouteArgs { /// generated route for /// [_i3.AccountSettingsScreen] -class AccountSettingsRoute extends _i29.PageRouteInfo { - const AccountSettingsRoute({List<_i29.PageRouteInfo>? children}) +class AccountSettingsRoute extends _i30.PageRouteInfo { + const AccountSettingsRoute({List<_i30.PageRouteInfo>? children}) : super(AccountSettingsRoute.name, initialChildren: children); static const String name = 'AccountSettingsRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { return const _i3.AccountSettingsScreen(); @@ -161,13 +162,13 @@ class AccountSettingsRoute extends _i29.PageRouteInfo { /// generated route for /// [_i2.AccountShellScreen] -class AccountShellRoute extends _i29.PageRouteInfo { - const AccountShellRoute({List<_i29.PageRouteInfo>? children}) +class AccountShellRoute extends _i30.PageRouteInfo { + const AccountShellRoute({List<_i30.PageRouteInfo>? children}) : super(AccountShellRoute.name, initialChildren: children); static const String name = 'AccountShellRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { return const _i2.AccountShellScreen(); @@ -177,11 +178,11 @@ class AccountShellRoute extends _i29.PageRouteInfo { /// generated route for /// [_i4.ArticleComposeScreen] -class ArticleComposeRoute extends _i29.PageRouteInfo { +class ArticleComposeRoute extends _i30.PageRouteInfo { ArticleComposeRoute({ - _i30.Key? key, - _i32.SnPost? originalPost, - List<_i29.PageRouteInfo>? children, + _i31.Key? key, + _i33.SnPost? originalPost, + List<_i30.PageRouteInfo>? children, }) : super( ArticleComposeRoute.name, args: ArticleComposeRouteArgs(key: key, originalPost: originalPost), @@ -190,7 +191,7 @@ class ArticleComposeRoute extends _i29.PageRouteInfo { static const String name = 'ArticleComposeRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final args = data.argsAs( @@ -207,9 +208,9 @@ class ArticleComposeRoute extends _i29.PageRouteInfo { class ArticleComposeRouteArgs { const ArticleComposeRouteArgs({this.key, this.originalPost}); - final _i30.Key? key; + final _i31.Key? key; - final _i32.SnPost? originalPost; + final _i33.SnPost? originalPost; @override String toString() { @@ -229,11 +230,11 @@ class ArticleComposeRouteArgs { /// generated route for /// [_i4.ArticleEditScreen] -class ArticleEditRoute extends _i29.PageRouteInfo { +class ArticleEditRoute extends _i30.PageRouteInfo { ArticleEditRoute({ - _i30.Key? key, + _i31.Key? key, required String id, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( ArticleEditRoute.name, args: ArticleEditRouteArgs(key: key, id: id), @@ -243,7 +244,7 @@ class ArticleEditRoute extends _i29.PageRouteInfo { static const String name = 'ArticleEditRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -258,7 +259,7 @@ class ArticleEditRoute extends _i29.PageRouteInfo { class ArticleEditRouteArgs { const ArticleEditRouteArgs({this.key, required this.id}); - final _i30.Key? key; + final _i31.Key? key; final String id; @@ -280,11 +281,11 @@ class ArticleEditRouteArgs { /// generated route for /// [_i5.CallScreen] -class CallRoute extends _i29.PageRouteInfo { +class CallRoute extends _i30.PageRouteInfo { CallRoute({ - _i30.Key? key, + _i31.Key? key, required String roomId, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( CallRoute.name, args: CallRouteArgs(key: key, roomId: roomId), @@ -294,7 +295,7 @@ class CallRoute extends _i29.PageRouteInfo { static const String name = 'CallRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -309,7 +310,7 @@ class CallRoute extends _i29.PageRouteInfo { class CallRouteArgs { const CallRouteArgs({this.key, required this.roomId}); - final _i30.Key? key; + final _i31.Key? key; final String roomId; @@ -331,11 +332,11 @@ class CallRouteArgs { /// generated route for /// [_i6.ChatDetailScreen] -class ChatDetailRoute extends _i29.PageRouteInfo { +class ChatDetailRoute extends _i30.PageRouteInfo { ChatDetailRoute({ - _i30.Key? key, + _i31.Key? key, required String id, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( ChatDetailRoute.name, args: ChatDetailRouteArgs(key: key, id: id), @@ -345,7 +346,7 @@ class ChatDetailRoute extends _i29.PageRouteInfo { static const String name = 'ChatDetailRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -360,7 +361,7 @@ class ChatDetailRoute extends _i29.PageRouteInfo { class ChatDetailRouteArgs { const ChatDetailRouteArgs({this.key, required this.id}); - final _i30.Key? key; + final _i31.Key? key; final String id; @@ -382,11 +383,11 @@ class ChatDetailRouteArgs { /// generated route for /// [_i7.ChatListScreen] -class ChatListRoute extends _i29.PageRouteInfo { +class ChatListRoute extends _i30.PageRouteInfo { ChatListRoute({ - _i30.Key? key, + _i31.Key? key, bool isAside = false, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( ChatListRoute.name, args: ChatListRouteArgs(key: key, isAside: isAside), @@ -395,7 +396,7 @@ class ChatListRoute extends _i29.PageRouteInfo { static const String name = 'ChatListRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final args = data.argsAs( @@ -409,7 +410,7 @@ class ChatListRoute extends _i29.PageRouteInfo { class ChatListRouteArgs { const ChatListRouteArgs({this.key, this.isAside = false}); - final _i30.Key? key; + final _i31.Key? key; final bool isAside; @@ -431,11 +432,11 @@ class ChatListRouteArgs { /// generated route for /// [_i8.ChatRoomScreen] -class ChatRoomRoute extends _i29.PageRouteInfo { +class ChatRoomRoute extends _i30.PageRouteInfo { ChatRoomRoute({ - _i31.Key? key, + _i32.Key? key, required String id, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( ChatRoomRoute.name, args: ChatRoomRouteArgs(key: key, id: id), @@ -445,7 +446,7 @@ class ChatRoomRoute extends _i29.PageRouteInfo { static const String name = 'ChatRoomRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -460,7 +461,7 @@ class ChatRoomRoute extends _i29.PageRouteInfo { class ChatRoomRouteArgs { const ChatRoomRouteArgs({this.key, required this.id}); - final _i31.Key? key; + final _i32.Key? key; final String id; @@ -482,13 +483,13 @@ class ChatRoomRouteArgs { /// generated route for /// [_i7.ChatShellScreen] -class ChatShellRoute extends _i29.PageRouteInfo { - const ChatShellRoute({List<_i29.PageRouteInfo>? children}) +class ChatShellRoute extends _i30.PageRouteInfo { + const ChatShellRoute({List<_i30.PageRouteInfo>? children}) : super(ChatShellRoute.name, initialChildren: children); static const String name = 'ChatShellRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { return const _i7.ChatShellScreen(); @@ -498,13 +499,13 @@ class ChatShellRoute extends _i29.PageRouteInfo { /// generated route for /// [_i9.CreateAccountScreen] -class CreateAccountRoute extends _i29.PageRouteInfo { - const CreateAccountRoute({List<_i29.PageRouteInfo>? children}) +class CreateAccountRoute extends _i30.PageRouteInfo { + const CreateAccountRoute({List<_i30.PageRouteInfo>? children}) : super(CreateAccountRoute.name, initialChildren: children); static const String name = 'CreateAccountRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { return const _i9.CreateAccountScreen(); @@ -514,11 +515,11 @@ class CreateAccountRoute extends _i29.PageRouteInfo { /// generated route for /// [_i10.CreatorHubScreen] -class CreatorHubRoute extends _i29.PageRouteInfo { +class CreatorHubRoute extends _i30.PageRouteInfo { CreatorHubRoute({ - _i30.Key? key, + _i31.Key? key, bool isAside = false, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( CreatorHubRoute.name, args: CreatorHubRouteArgs(key: key, isAside: isAside), @@ -527,7 +528,7 @@ class CreatorHubRoute extends _i29.PageRouteInfo { static const String name = 'CreatorHubRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final args = data.argsAs( @@ -541,7 +542,7 @@ class CreatorHubRoute extends _i29.PageRouteInfo { class CreatorHubRouteArgs { const CreatorHubRouteArgs({this.key, this.isAside = false}); - final _i30.Key? key; + final _i31.Key? key; final bool isAside; @@ -563,13 +564,13 @@ class CreatorHubRouteArgs { /// generated route for /// [_i10.CreatorHubShellScreen] -class CreatorHubShellRoute extends _i29.PageRouteInfo { - const CreatorHubShellRoute({List<_i29.PageRouteInfo>? children}) +class CreatorHubShellRoute extends _i30.PageRouteInfo { + const CreatorHubShellRoute({List<_i30.PageRouteInfo>? children}) : super(CreatorHubShellRoute.name, initialChildren: children); static const String name = 'CreatorHubShellRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { return const _i10.CreatorHubShellScreen(); @@ -580,11 +581,11 @@ class CreatorHubShellRoute extends _i29.PageRouteInfo { /// generated route for /// [_i11.CreatorPostListScreen] class CreatorPostListRoute - extends _i29.PageRouteInfo { + extends _i30.PageRouteInfo { CreatorPostListRoute({ - _i30.Key? key, + _i31.Key? key, required String pubName, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( CreatorPostListRoute.name, args: CreatorPostListRouteArgs(key: key, pubName: pubName), @@ -594,7 +595,7 @@ class CreatorPostListRoute static const String name = 'CreatorPostListRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -611,7 +612,7 @@ class CreatorPostListRoute class CreatorPostListRouteArgs { const CreatorPostListRouteArgs({this.key, required this.pubName}); - final _i30.Key? key; + final _i31.Key? key; final String pubName; @@ -633,8 +634,8 @@ class CreatorPostListRouteArgs { /// generated route for /// [_i7.EditChatScreen] -class EditChatRoute extends _i29.PageRouteInfo { - EditChatRoute({_i30.Key? key, String? id, List<_i29.PageRouteInfo>? children}) +class EditChatRoute extends _i30.PageRouteInfo { + EditChatRoute({_i31.Key? key, String? id, List<_i30.PageRouteInfo>? children}) : super( EditChatRoute.name, args: EditChatRouteArgs(key: key, id: id), @@ -644,7 +645,7 @@ class EditChatRoute extends _i29.PageRouteInfo { static const String name = 'EditChatRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -659,7 +660,7 @@ class EditChatRoute extends _i29.PageRouteInfo { class EditChatRouteArgs { const EditChatRouteArgs({this.key, this.id}); - final _i30.Key? key; + final _i31.Key? key; final String? id; @@ -681,11 +682,11 @@ class EditChatRouteArgs { /// generated route for /// [_i12.EditPublisherScreen] -class EditPublisherRoute extends _i29.PageRouteInfo { +class EditPublisherRoute extends _i30.PageRouteInfo { EditPublisherRoute({ - _i30.Key? key, + _i31.Key? key, String? name, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( EditPublisherRoute.name, args: EditPublisherRouteArgs(key: key, name: name), @@ -695,7 +696,7 @@ class EditPublisherRoute extends _i29.PageRouteInfo { static const String name = 'EditPublisherRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -710,7 +711,7 @@ class EditPublisherRoute extends _i29.PageRouteInfo { class EditPublisherRouteArgs { const EditPublisherRouteArgs({this.key, this.name}); - final _i30.Key? key; + final _i31.Key? key; final String? name; @@ -732,11 +733,11 @@ class EditPublisherRouteArgs { /// generated route for /// [_i13.EditRealmScreen] -class EditRealmRoute extends _i29.PageRouteInfo { +class EditRealmRoute extends _i30.PageRouteInfo { EditRealmRoute({ - _i30.Key? key, + _i31.Key? key, String? slug, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( EditRealmRoute.name, args: EditRealmRouteArgs(key: key, slug: slug), @@ -746,7 +747,7 @@ class EditRealmRoute extends _i29.PageRouteInfo { static const String name = 'EditRealmRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -761,7 +762,7 @@ class EditRealmRoute extends _i29.PageRouteInfo { class EditRealmRouteArgs { const EditRealmRouteArgs({this.key, this.slug}); - final _i30.Key? key; + final _i31.Key? key; final String? slug; @@ -784,12 +785,12 @@ class EditRealmRouteArgs { /// generated route for /// [_i14.EditStickerPacksScreen] class EditStickerPacksRoute - extends _i29.PageRouteInfo { + extends _i30.PageRouteInfo { EditStickerPacksRoute({ - _i30.Key? key, + _i31.Key? key, required String pubName, String? packId, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( EditStickerPacksRoute.name, args: EditStickerPacksRouteArgs( @@ -803,7 +804,7 @@ class EditStickerPacksRoute static const String name = 'EditStickerPacksRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -830,7 +831,7 @@ class EditStickerPacksRouteArgs { this.packId, }); - final _i30.Key? key; + final _i31.Key? key; final String pubName; @@ -856,12 +857,12 @@ class EditStickerPacksRouteArgs { /// generated route for /// [_i15.EditStickersScreen] -class EditStickersRoute extends _i29.PageRouteInfo { +class EditStickersRoute extends _i30.PageRouteInfo { EditStickersRoute({ - _i30.Key? key, + _i31.Key? key, required String packId, required String? id, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( EditStickersRoute.name, args: EditStickersRouteArgs(key: key, packId: packId, id: id), @@ -871,7 +872,7 @@ class EditStickersRoute extends _i29.PageRouteInfo { static const String name = 'EditStickersRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -898,7 +899,7 @@ class EditStickersRouteArgs { required this.id, }); - final _i30.Key? key; + final _i31.Key? key; final String packId; @@ -922,11 +923,11 @@ class EditStickersRouteArgs { /// generated route for /// [_i16.EventCalanderScreen] -class EventCalanderRoute extends _i29.PageRouteInfo { +class EventCalanderRoute extends _i30.PageRouteInfo { EventCalanderRoute({ - _i30.Key? key, + _i31.Key? key, required String name, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( EventCalanderRoute.name, args: EventCalanderRouteArgs(key: key, name: name), @@ -936,7 +937,7 @@ class EventCalanderRoute extends _i29.PageRouteInfo { static const String name = 'EventCalanderRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -952,7 +953,7 @@ class EventCalanderRoute extends _i29.PageRouteInfo { class EventCalanderRouteArgs { const EventCalanderRouteArgs({this.key, required this.name}); - final _i30.Key? key; + final _i31.Key? key; final String name; @@ -974,11 +975,11 @@ class EventCalanderRouteArgs { /// generated route for /// [_i17.ExploreScreen] -class ExploreRoute extends _i29.PageRouteInfo { +class ExploreRoute extends _i30.PageRouteInfo { ExploreRoute({ - _i30.Key? key, + _i31.Key? key, bool isAside = false, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( ExploreRoute.name, args: ExploreRouteArgs(key: key, isAside: isAside), @@ -987,7 +988,7 @@ class ExploreRoute extends _i29.PageRouteInfo { static const String name = 'ExploreRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final args = data.argsAs( @@ -1001,7 +1002,7 @@ class ExploreRoute extends _i29.PageRouteInfo { class ExploreRouteArgs { const ExploreRouteArgs({this.key, this.isAside = false}); - final _i30.Key? key; + final _i31.Key? key; final bool isAside; @@ -1023,13 +1024,13 @@ class ExploreRouteArgs { /// generated route for /// [_i17.ExploreShellScreen] -class ExploreShellRoute extends _i29.PageRouteInfo { - const ExploreShellRoute({List<_i29.PageRouteInfo>? children}) +class ExploreShellRoute extends _i30.PageRouteInfo { + const ExploreShellRoute({List<_i30.PageRouteInfo>? children}) : super(ExploreShellRoute.name, initialChildren: children); static const String name = 'ExploreShellRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { return const _i17.ExploreShellScreen(); @@ -1038,30 +1039,46 @@ class ExploreShellRoute extends _i29.PageRouteInfo { } /// generated route for -/// [_i18.LoginScreen] -class LoginRoute extends _i29.PageRouteInfo { - const LoginRoute({List<_i29.PageRouteInfo>? children}) +/// [_i18.LevelingScreen] +class LevelingRoute extends _i30.PageRouteInfo { + const LevelingRoute({List<_i30.PageRouteInfo>? children}) + : super(LevelingRoute.name, initialChildren: children); + + static const String name = 'LevelingRoute'; + + static _i30.PageInfo page = _i30.PageInfo( + name, + builder: (data) { + return const _i18.LevelingScreen(); + }, + ); +} + +/// generated route for +/// [_i19.LoginScreen] +class LoginRoute extends _i30.PageRouteInfo { + const LoginRoute({List<_i30.PageRouteInfo>? children}) : super(LoginRoute.name, initialChildren: children); static const String name = 'LoginRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { - return const _i18.LoginScreen(); + return const _i19.LoginScreen(); }, ); } /// generated route for /// [_i7.NewChatScreen] -class NewChatRoute extends _i29.PageRouteInfo { - const NewChatRoute({List<_i29.PageRouteInfo>? children}) +class NewChatRoute extends _i30.PageRouteInfo { + const NewChatRoute({List<_i30.PageRouteInfo>? children}) : super(NewChatRoute.name, initialChildren: children); static const String name = 'NewChatRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { return const _i7.NewChatScreen(); @@ -1071,13 +1088,13 @@ class NewChatRoute extends _i29.PageRouteInfo { /// generated route for /// [_i12.NewPublisherScreen] -class NewPublisherRoute extends _i29.PageRouteInfo { - const NewPublisherRoute({List<_i29.PageRouteInfo>? children}) +class NewPublisherRoute extends _i30.PageRouteInfo { + const NewPublisherRoute({List<_i30.PageRouteInfo>? children}) : super(NewPublisherRoute.name, initialChildren: children); static const String name = 'NewPublisherRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { return const _i12.NewPublisherScreen(); @@ -1087,13 +1104,13 @@ class NewPublisherRoute extends _i29.PageRouteInfo { /// generated route for /// [_i13.NewRealmScreen] -class NewRealmRoute extends _i29.PageRouteInfo { - const NewRealmRoute({List<_i29.PageRouteInfo>? children}) +class NewRealmRoute extends _i30.PageRouteInfo { + const NewRealmRoute({List<_i30.PageRouteInfo>? children}) : super(NewRealmRoute.name, initialChildren: children); static const String name = 'NewRealmRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { return const _i13.NewRealmScreen(); @@ -1104,11 +1121,11 @@ class NewRealmRoute extends _i29.PageRouteInfo { /// generated route for /// [_i14.NewStickerPacksScreen] class NewStickerPacksRoute - extends _i29.PageRouteInfo { + extends _i30.PageRouteInfo { NewStickerPacksRoute({ - _i30.Key? key, + _i31.Key? key, required String pubName, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( NewStickerPacksRoute.name, args: NewStickerPacksRouteArgs(key: key, pubName: pubName), @@ -1118,7 +1135,7 @@ class NewStickerPacksRoute static const String name = 'NewStickerPacksRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -1135,7 +1152,7 @@ class NewStickerPacksRoute class NewStickerPacksRouteArgs { const NewStickerPacksRouteArgs({this.key, required this.pubName}); - final _i30.Key? key; + final _i31.Key? key; final String pubName; @@ -1157,11 +1174,11 @@ class NewStickerPacksRouteArgs { /// generated route for /// [_i15.NewStickersScreen] -class NewStickersRoute extends _i29.PageRouteInfo { +class NewStickersRoute extends _i30.PageRouteInfo { NewStickersRoute({ - _i30.Key? key, + _i31.Key? key, required String packId, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( NewStickersRoute.name, args: NewStickersRouteArgs(key: key, packId: packId), @@ -1171,7 +1188,7 @@ class NewStickersRoute extends _i29.PageRouteInfo { static const String name = 'NewStickersRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -1187,7 +1204,7 @@ class NewStickersRoute extends _i29.PageRouteInfo { class NewStickersRouteArgs { const NewStickersRouteArgs({this.key, required this.packId}); - final _i30.Key? key; + final _i31.Key? key; final String packId; @@ -1208,31 +1225,31 @@ class NewStickersRouteArgs { } /// generated route for -/// [_i19.NotificationScreen] -class NotificationRoute extends _i29.PageRouteInfo { - const NotificationRoute({List<_i29.PageRouteInfo>? children}) +/// [_i20.NotificationScreen] +class NotificationRoute extends _i30.PageRouteInfo { + const NotificationRoute({List<_i30.PageRouteInfo>? children}) : super(NotificationRoute.name, initialChildren: children); static const String name = 'NotificationRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { - return const _i19.NotificationScreen(); + return const _i20.NotificationScreen(); }, ); } /// generated route for -/// [_i20.PostComposeScreen] -class PostComposeRoute extends _i29.PageRouteInfo { +/// [_i21.PostComposeScreen] +class PostComposeRoute extends _i30.PageRouteInfo { PostComposeRoute({ - _i30.Key? key, - _i32.SnPost? originalPost, - _i32.SnPost? repliedPost, - _i32.SnPost? forwardedPost, + _i31.Key? key, + _i33.SnPost? originalPost, + _i33.SnPost? repliedPost, + _i33.SnPost? forwardedPost, int? type, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( PostComposeRoute.name, args: PostComposeRouteArgs( @@ -1248,14 +1265,14 @@ class PostComposeRoute extends _i29.PageRouteInfo { static const String name = 'PostComposeRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final queryParams = data.queryParams; final args = data.argsAs( orElse: () => PostComposeRouteArgs(type: queryParams.optInt('type')), ); - return _i20.PostComposeScreen( + return _i21.PostComposeScreen( key: args.key, originalPost: args.originalPost, repliedPost: args.repliedPost, @@ -1275,13 +1292,13 @@ class PostComposeRouteArgs { this.type, }); - final _i30.Key? key; + final _i31.Key? key; - final _i32.SnPost? originalPost; + final _i33.SnPost? originalPost; - final _i32.SnPost? repliedPost; + final _i33.SnPost? repliedPost; - final _i32.SnPost? forwardedPost; + final _i33.SnPost? forwardedPost; final int? type; @@ -1311,12 +1328,12 @@ class PostComposeRouteArgs { } /// generated route for -/// [_i21.PostDetailScreen] -class PostDetailRoute extends _i29.PageRouteInfo { +/// [_i22.PostDetailScreen] +class PostDetailRoute extends _i30.PageRouteInfo { PostDetailRoute({ - _i30.Key? key, + _i31.Key? key, required String id, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( PostDetailRoute.name, args: PostDetailRouteArgs(key: key, id: id), @@ -1326,14 +1343,14 @@ class PostDetailRoute extends _i29.PageRouteInfo { static const String name = 'PostDetailRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; final args = data.argsAs( orElse: () => PostDetailRouteArgs(id: pathParams.getString('id')), ); - return _i21.PostDetailScreen(key: args.key, id: args.id); + return _i22.PostDetailScreen(key: args.key, id: args.id); }, ); } @@ -1341,7 +1358,7 @@ class PostDetailRoute extends _i29.PageRouteInfo { class PostDetailRouteArgs { const PostDetailRouteArgs({this.key, required this.id}); - final _i30.Key? key; + final _i31.Key? key; final String id; @@ -1362,12 +1379,12 @@ class PostDetailRouteArgs { } /// generated route for -/// [_i20.PostEditScreen] -class PostEditRoute extends _i29.PageRouteInfo { +/// [_i21.PostEditScreen] +class PostEditRoute extends _i30.PageRouteInfo { PostEditRoute({ - _i30.Key? key, + _i31.Key? key, required String id, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( PostEditRoute.name, args: PostEditRouteArgs(key: key, id: id), @@ -1377,14 +1394,14 @@ class PostEditRoute extends _i29.PageRouteInfo { static const String name = 'PostEditRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; final args = data.argsAs( orElse: () => PostEditRouteArgs(id: pathParams.getString('id')), ); - return _i20.PostEditScreen(key: args.key, id: args.id); + return _i21.PostEditScreen(key: args.key, id: args.id); }, ); } @@ -1392,7 +1409,7 @@ class PostEditRoute extends _i29.PageRouteInfo { class PostEditRouteArgs { const PostEditRouteArgs({this.key, required this.id}); - final _i30.Key? key; + final _i31.Key? key; final String id; @@ -1413,13 +1430,13 @@ class PostEditRouteArgs { } /// generated route for -/// [_i22.PublisherProfileScreen] +/// [_i23.PublisherProfileScreen] class PublisherProfileRoute - extends _i29.PageRouteInfo { + extends _i30.PageRouteInfo { PublisherProfileRoute({ - _i30.Key? key, + _i31.Key? key, required String name, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( PublisherProfileRoute.name, args: PublisherProfileRouteArgs(key: key, name: name), @@ -1429,7 +1446,7 @@ class PublisherProfileRoute static const String name = 'PublisherProfileRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -1437,7 +1454,7 @@ class PublisherProfileRoute orElse: () => PublisherProfileRouteArgs(name: pathParams.getString('name')), ); - return _i22.PublisherProfileScreen(key: args.key, name: args.name); + return _i23.PublisherProfileScreen(key: args.key, name: args.name); }, ); } @@ -1445,7 +1462,7 @@ class PublisherProfileRoute class PublisherProfileRouteArgs { const PublisherProfileRouteArgs({this.key, required this.name}); - final _i30.Key? key; + final _i31.Key? key; final String name; @@ -1466,12 +1483,12 @@ class PublisherProfileRouteArgs { } /// generated route for -/// [_i23.RealmDetailScreen] -class RealmDetailRoute extends _i29.PageRouteInfo { +/// [_i24.RealmDetailScreen] +class RealmDetailRoute extends _i30.PageRouteInfo { RealmDetailRoute({ - _i30.Key? key, + _i31.Key? key, required String slug, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( RealmDetailRoute.name, args: RealmDetailRouteArgs(key: key, slug: slug), @@ -1481,14 +1498,14 @@ class RealmDetailRoute extends _i29.PageRouteInfo { static const String name = 'RealmDetailRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; final args = data.argsAs( orElse: () => RealmDetailRouteArgs(slug: pathParams.getString('slug')), ); - return _i23.RealmDetailScreen(key: args.key, slug: args.slug); + return _i24.RealmDetailScreen(key: args.key, slug: args.slug); }, ); } @@ -1496,7 +1513,7 @@ class RealmDetailRoute extends _i29.PageRouteInfo { class RealmDetailRouteArgs { const RealmDetailRouteArgs({this.key, required this.slug}); - final _i30.Key? key; + final _i31.Key? key; final String slug; @@ -1518,13 +1535,13 @@ class RealmDetailRouteArgs { /// generated route for /// [_i13.RealmListScreen] -class RealmListRoute extends _i29.PageRouteInfo { - const RealmListRoute({List<_i29.PageRouteInfo>? children}) +class RealmListRoute extends _i30.PageRouteInfo { + const RealmListRoute({List<_i30.PageRouteInfo>? children}) : super(RealmListRoute.name, initialChildren: children); static const String name = 'RealmListRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { return const _i13.RealmListScreen(); @@ -1533,33 +1550,33 @@ class RealmListRoute extends _i29.PageRouteInfo { } /// generated route for -/// [_i24.RelationshipScreen] -class RelationshipRoute extends _i29.PageRouteInfo { - const RelationshipRoute({List<_i29.PageRouteInfo>? children}) +/// [_i25.RelationshipScreen] +class RelationshipRoute extends _i30.PageRouteInfo { + const RelationshipRoute({List<_i30.PageRouteInfo>? children}) : super(RelationshipRoute.name, initialChildren: children); static const String name = 'RelationshipRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { - return const _i24.RelationshipScreen(); + return const _i25.RelationshipScreen(); }, ); } /// generated route for -/// [_i25.SettingsScreen] -class SettingsRoute extends _i29.PageRouteInfo { - const SettingsRoute({List<_i29.PageRouteInfo>? children}) +/// [_i26.SettingsScreen] +class SettingsRoute extends _i30.PageRouteInfo { + const SettingsRoute({List<_i30.PageRouteInfo>? children}) : super(SettingsRoute.name, initialChildren: children); static const String name = 'SettingsRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { - return const _i25.SettingsScreen(); + return const _i26.SettingsScreen(); }, ); } @@ -1567,12 +1584,12 @@ class SettingsRoute extends _i29.PageRouteInfo { /// generated route for /// [_i15.StickerPackDetailScreen] class StickerPackDetailRoute - extends _i29.PageRouteInfo { + extends _i30.PageRouteInfo { StickerPackDetailRoute({ - _i30.Key? key, + _i31.Key? key, required String pubName, required String id, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( StickerPackDetailRoute.name, args: StickerPackDetailRouteArgs(key: key, pubName: pubName, id: id), @@ -1582,7 +1599,7 @@ class StickerPackDetailRoute static const String name = 'StickerPackDetailRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -1609,7 +1626,7 @@ class StickerPackDetailRouteArgs { required this.id, }); - final _i30.Key? key; + final _i31.Key? key; final String pubName; @@ -1633,11 +1650,11 @@ class StickerPackDetailRouteArgs { /// generated route for /// [_i14.StickersScreen] -class StickersRoute extends _i29.PageRouteInfo { +class StickersRoute extends _i30.PageRouteInfo { StickersRoute({ - _i30.Key? key, + _i31.Key? key, required String pubName, - List<_i29.PageRouteInfo>? children, + List<_i30.PageRouteInfo>? children, }) : super( StickersRoute.name, args: StickersRouteArgs(key: key, pubName: pubName), @@ -1647,7 +1664,7 @@ class StickersRoute extends _i29.PageRouteInfo { static const String name = 'StickersRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { final pathParams = data.inheritedPathParams; @@ -1662,7 +1679,7 @@ class StickersRoute extends _i29.PageRouteInfo { class StickersRouteArgs { const StickersRouteArgs({this.key, required this.pubName}); - final _i30.Key? key; + final _i31.Key? key; final String pubName; @@ -1683,49 +1700,49 @@ class StickersRouteArgs { } /// generated route for -/// [_i26.TabsScreen] -class TabsRoute extends _i29.PageRouteInfo { - const TabsRoute({List<_i29.PageRouteInfo>? children}) +/// [_i27.TabsScreen] +class TabsRoute extends _i30.PageRouteInfo { + const TabsRoute({List<_i30.PageRouteInfo>? children}) : super(TabsRoute.name, initialChildren: children); static const String name = 'TabsRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { - return const _i26.TabsScreen(); + return const _i27.TabsScreen(); }, ); } /// generated route for -/// [_i27.UpdateProfileScreen] -class UpdateProfileRoute extends _i29.PageRouteInfo { - const UpdateProfileRoute({List<_i29.PageRouteInfo>? children}) +/// [_i28.UpdateProfileScreen] +class UpdateProfileRoute extends _i30.PageRouteInfo { + const UpdateProfileRoute({List<_i30.PageRouteInfo>? children}) : super(UpdateProfileRoute.name, initialChildren: children); static const String name = 'UpdateProfileRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { - return const _i27.UpdateProfileScreen(); + return const _i28.UpdateProfileScreen(); }, ); } /// generated route for -/// [_i28.WalletScreen] -class WalletRoute extends _i29.PageRouteInfo { - const WalletRoute({List<_i29.PageRouteInfo>? children}) +/// [_i29.WalletScreen] +class WalletRoute extends _i30.PageRouteInfo { + const WalletRoute({List<_i30.PageRouteInfo>? children}) : super(WalletRoute.name, initialChildren: children); static const String name = 'WalletRoute'; - static _i29.PageInfo page = _i29.PageInfo( + static _i30.PageInfo page = _i30.PageInfo( name, builder: (data) { - return const _i28.WalletScreen(); + return const _i29.WalletScreen(); }, ); } diff --git a/lib/screens/account.dart b/lib/screens/account.dart index aaa3aee..7ab1acc 100644 --- a/lib/screens/account.dart +++ b/lib/screens/account.dart @@ -140,10 +140,15 @@ class AccountScreen extends HookConsumerWidget { ], ), ).padding(horizontal: 8), - LevelingProgressCard( - level: user.value!.profile.level, - experience: user.value!.profile.experience, - progress: user.value!.profile.levelingProgress, + GestureDetector( + child: LevelingProgressCard( + level: user.value!.profile.level, + experience: user.value!.profile.experience, + progress: user.value!.profile.levelingProgress, + ), + onTap: () { + context.router.push(LevelingRoute()); + }, ).padding(horizontal: 12), Row( children: [ diff --git a/lib/screens/account/leveling.dart b/lib/screens/account/leveling.dart new file mode 100644 index 0000000..c27e9e4 --- /dev/null +++ b/lib/screens/account/leveling.dart @@ -0,0 +1,258 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:island/pods/userinfo.dart'; +import 'package:island/services/responsive.dart'; +import 'package:island/widgets/app_scaffold.dart'; +import 'package:island/widgets/account/leveling_progress.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:gap/gap.dart'; +import 'package:google_fonts/google_fonts.dart'; + +@RoutePage() +class LevelingScreen extends HookConsumerWidget { + const LevelingScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final user = ref.watch(userInfoProvider); + + if (user.value == null) { + return AppScaffold( + appBar: AppBar(title: Text('levelingProgress'.tr())), + body: const Center(child: CircularProgressIndicator()), + ); + } + + final currentLevel = user.value!.profile.level; + final currentExp = user.value!.profile.experience; + final progress = user.value!.profile.levelingProgress; + + return AppScaffold( + appBar: AppBar(title: Text('levelingProgress'.tr())), + body: SingleChildScrollView( + padding: getTabbedPadding(context, horizontal: 20, vertical: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // Current Progress Card + LevelingProgressCard( + level: currentLevel, + experience: currentExp, + progress: progress, + ), + const Gap(24), + + // Level Stairs Graph + Text( + 'Level Progress', + style: Theme.of( + context, + ).textTheme.headlineSmall?.copyWith(fontWeight: FontWeight.bold), + ), + const Gap(16), + + // Stairs visualization with fixed height and horizontal scroll + _buildLevelStairs(context, currentLevel), + + const Gap(24), + + // Placeholder for unlocked content + Text( + 'Unlocked Features', + style: Theme.of( + context, + ).textTheme.headlineSmall?.copyWith(fontWeight: FontWeight.bold), + ), + const Gap(16), + Container( + height: 200, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainerLow, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: Theme.of(context).colorScheme.outline.withOpacity(0.2), + ), + ), + child: Center( + child: Text( + 'Unlocked features will be shown here', + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ), + ), + ], + ), + ), + ); + } + + Widget _buildLevelStairs(BuildContext context, int currentLevel) { + const totalLevels = 14; + const stairHeight = 20.0; + const stairWidth = 50.0; + const containerHeight = 280.0; + + return Container( + height: containerHeight, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: Theme.of(context).colorScheme.outline.withOpacity(0.2), + ), + ), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.symmetric(horizontal: 16), + child: SizedBox( + width: (totalLevels * (stairWidth + 8)) + 40, + height: containerHeight, + child: CustomPaint( + painter: LevelStairsPainter( + currentLevel: currentLevel, + totalLevels: totalLevels, + primaryColor: Theme.of(context).colorScheme.primary, + surfaceColor: Theme.of(context).colorScheme.surfaceContainerHigh, + onSurfaceColor: Theme.of(context).colorScheme.onSurface, + stairHeight: stairHeight, + stairWidth: stairWidth, + ), + child: Stack( + children: List.generate(totalLevels, (index) { + final level = index + 1; + final isCompleted = level <= currentLevel; + final isCurrent = level == currentLevel; + + // Calculate position from bottom + final bottomPosition = 0.0; + final leftPosition = 20.0 + (index * (stairWidth + 8)); + + // Make higher levels progressively taller + final progressiveHeight = + 40.0 + (index * 15.0); // Base height + progressive increase + + return Positioned( + left: leftPosition, + bottom: bottomPosition, + child: Container( + width: stairWidth, + height: progressiveHeight, + decoration: BoxDecoration( + color: + isCompleted + ? Theme.of(context).colorScheme.primary + : Theme.of( + context, + ).colorScheme.surfaceContainerHigh, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(6), + topRight: Radius.circular(6), + ), + border: + isCurrent + ? Border.all( + color: Theme.of(context).colorScheme.primary, + width: 2, + ) + : null, + boxShadow: + isCurrent + ? [ + BoxShadow( + color: Theme.of( + context, + ).colorScheme.primary.withOpacity(0.3), + blurRadius: 6, + spreadRadius: 1, + ), + ] + : null, + ), + child: Padding( + padding: const EdgeInsets.only(top: 8), + child: Column( + children: [ + Text( + level.toString(), + style: GoogleFonts.robotoMono( + fontSize: 14, + fontWeight: FontWeight.bold, + color: + isCompleted + ? Theme.of(context).colorScheme.onPrimary + : Theme.of(context).colorScheme.onSurface, + ), + ), + if (isCurrent) ...[ + const Gap(4), + Container( + width: 4, + height: 4, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.onPrimary, + shape: BoxShape.circle, + ), + ), + ], + ], + ), + ), + ), + ); + }), + ), + ), + ), + ), + ); + } +} + +class LevelStairsPainter extends CustomPainter { + final int currentLevel; + final int totalLevels; + final Color primaryColor; + final Color surfaceColor; + final Color onSurfaceColor; + final double stairHeight; + final double stairWidth; + + LevelStairsPainter({ + required this.currentLevel, + required this.totalLevels, + required this.primaryColor, + required this.surfaceColor, + required this.onSurfaceColor, + required this.stairHeight, + required this.stairWidth, + }); + + @override + void paint(Canvas canvas, Size size) { + final paint = + Paint() + ..color = surfaceColor.withOpacity(0.2) + ..strokeWidth = 1.5 + ..style = PaintingStyle.stroke; + + // Draw connecting lines between stairs + for (int i = 0; i < totalLevels - 1; i++) { + final startX = 20.0 + (i * (stairWidth + 8)) + stairWidth; + final startHeight = + 40.0 + (i * 15.0); // Progressive height for current stair + final startY = size.height - (20.0 + startHeight); + + final endX = 20.0 + ((i + 1) * (stairWidth + 8)); + final endHeight = + 40.0 + ((i + 1) * 15.0); // Progressive height for next stair + final endY = size.height - (20.0 + endHeight); + + canvas.drawLine(Offset(startX, startY), Offset(endX, endY), paint); + } + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +}