@@ -9,7 +9,7 @@ import 'package:ui_kit/ui_kit.dart';
99/// {@template user_preference_limits_form}
1010/// A form widget for configuring user content preference limits based on role.
1111///
12- /// This widget uses a [SegmentedButton ] to allow selection of an [AppUserRole]
12+ /// This widget uses a [TabBar ] to allow selection of an [AppUserRole]
1313/// and then conditionally renders the relevant input fields for that role.
1414/// {@endtemplate}
1515class UserPreferenceLimitsForm extends StatefulWidget {
@@ -31,16 +31,18 @@ class UserPreferenceLimitsForm extends StatefulWidget {
3131 _UserPreferenceLimitsFormState ();
3232}
3333
34- class _UserPreferenceLimitsFormState extends State <UserPreferenceLimitsForm > {
35- AppUserRole _selectedUserRole = AppUserRole .guestUser;
34+ class _UserPreferenceLimitsFormState extends State <UserPreferenceLimitsForm >
35+ with SingleTickerProviderStateMixin {
36+ late TabController _tabController;
3637 late final Map <AppUserRole , TextEditingController >
37- _followedItemsLimitControllers;
38+ _followedItemsLimitControllers;
3839 late final Map <AppUserRole , TextEditingController >
39- _savedHeadlinesLimitControllers;
40+ _savedHeadlinesLimitControllers;
4041
4142 @override
4243 void initState () {
4344 super .initState ();
45+ _tabController = TabController (length: AppUserRole .values.length, vsync: this );
4446 _initializeControllers ();
4547 }
4648
@@ -56,35 +58,31 @@ class _UserPreferenceLimitsFormState extends State<UserPreferenceLimitsForm> {
5658 void _initializeControllers () {
5759 _followedItemsLimitControllers = {
5860 for (final role in AppUserRole .values)
59- role:
60- TextEditingController (
61- text: _getFollowedItemsLimit (
62- widget.remoteConfig.userPreferenceConfig,
63- role,
64- ).toString (),
65- )
66- ..selection = TextSelection .collapsed (
67- offset: _getFollowedItemsLimit (
68- widget.remoteConfig.userPreferenceConfig,
69- role,
70- ).toString ().length,
71- ),
61+ role: TextEditingController (
62+ text: _getFollowedItemsLimit (
63+ widget.remoteConfig.userPreferenceConfig,
64+ role,
65+ ).toString (),
66+ )..selection = TextSelection .collapsed (
67+ offset: _getFollowedItemsLimit (
68+ widget.remoteConfig.userPreferenceConfig,
69+ role,
70+ ).toString ().length,
71+ ),
7272 };
7373 _savedHeadlinesLimitControllers = {
7474 for (final role in AppUserRole .values)
75- role:
76- TextEditingController (
77- text: _getSavedHeadlinesLimit (
78- widget.remoteConfig.userPreferenceConfig,
79- role,
80- ).toString (),
81- )
82- ..selection = TextSelection .collapsed (
83- offset: _getSavedHeadlinesLimit (
84- widget.remoteConfig.userPreferenceConfig,
85- role,
86- ).toString ().length,
87- ),
75+ role: TextEditingController (
76+ text: _getSavedHeadlinesLimit (
77+ widget.remoteConfig.userPreferenceConfig,
78+ role,
79+ ).toString (),
80+ )..selection = TextSelection .collapsed (
81+ offset: _getSavedHeadlinesLimit (
82+ widget.remoteConfig.userPreferenceConfig,
83+ role,
84+ ).toString ().length,
85+ ),
8886 };
8987 }
9088
@@ -120,6 +118,7 @@ class _UserPreferenceLimitsFormState extends State<UserPreferenceLimitsForm> {
120118
121119 @override
122120 void dispose () {
121+ _tabController.dispose ();
123122 for (final controller in _followedItemsLimitControllers.values) {
124123 controller.dispose ();
125124 }
@@ -144,53 +143,39 @@ class _UserPreferenceLimitsFormState extends State<UserPreferenceLimitsForm> {
144143 ),
145144 ),
146145 const SizedBox (height: AppSpacing .lg),
146+ // Replaced SegmentedButton with TabBar for role selection
147147 Align (
148148 alignment: AlignmentDirectional .centerStart,
149- child: SegmentedButton <AppUserRole >(
150- style: SegmentedButton .styleFrom (
151- shape: const RoundedRectangleBorder (
152- borderRadius: BorderRadius .zero,
153- ),
149+ child: SizedBox (
150+ height: kTextTabBarHeight,
151+ child: TabBar (
152+ controller: _tabController,
153+ tabAlignment: TabAlignment .start,
154+ isScrollable: true ,
155+ tabs: AppUserRole .values
156+ .map ((role) => Tab (text: role.l10n (context)))
157+ .toList (),
154158 ),
155- segments: AppUserRole .values
159+ ),
160+ ),
161+ const SizedBox (height: AppSpacing .lg),
162+ // TabBarView to display role-specific fields
163+ SizedBox (
164+ height: 250 , // Fixed height for TabBarView within a ListView
165+ child: TabBarView (
166+ controller: _tabController,
167+ children: AppUserRole .values
156168 .map (
157- (role) => ButtonSegment <AppUserRole >(
158- value: role,
159- label: Text (role.l10n (context)),
169+ (role) => _buildRoleSpecificFields (
170+ context,
171+ l10n,
172+ role,
173+ userPreferenceConfig,
160174 ),
161175 )
162176 .toList (),
163- selected: {_selectedUserRole},
164- onSelectionChanged: (newSelection) {
165- setState (() {
166- _selectedUserRole = newSelection.first;
167- });
168- },
169177 ),
170178 ),
171- const SizedBox (height: AppSpacing .lg),
172- // Conditionally render fields based on selected user role
173- if (_selectedUserRole == AppUserRole .guestUser)
174- _buildRoleSpecificFields (
175- context,
176- l10n,
177- AppUserRole .guestUser,
178- userPreferenceConfig,
179- ),
180- if (_selectedUserRole == AppUserRole .standardUser)
181- _buildRoleSpecificFields (
182- context,
183- l10n,
184- AppUserRole .standardUser,
185- userPreferenceConfig,
186- ),
187- if (_selectedUserRole == AppUserRole .premiumUser)
188- _buildRoleSpecificFields (
189- context,
190- l10n,
191- AppUserRole .premiumUser,
192- userPreferenceConfig,
193- ),
194179 ],
195180 );
196181 }
0 commit comments