Skip to content

Commit ccf5ea1

Browse files
committed
refactor(app_configuration): replace SegmentedButton with TabBar for user role selection
- Replace SegmentedButton with TabBar for selecting AppUserRole - Implement TabController to manage tab switching - Use TabBarView to display role-specific fields - Remove conditional rendering based on selected user role - Adjust layout to accommodate horizontal tab navigation
1 parent dbe0296 commit ccf5ea1

File tree

1 file changed

+54
-69
lines changed

1 file changed

+54
-69
lines changed

lib/app_configuration/widgets/user_preference_limits_form.dart

Lines changed: 54 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -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}
1515
class 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

Comments
 (0)