fluffychat/lib/pangea/chat_settings/pages/space_details_content.dart
ggurdin e8428783e6
Fluffychat merge 2 (#5590)
* build: Reenable shrink resources and minify in gradle

* build: (deps): bump image from 4.6.0 to 4.7.1

Bumps [image](https://github.com/brendan-duncan/image) from 4.6.0 to 4.7.1.
- [Changelog](https://github.com/brendan-duncan/image/blob/main/CHANGELOG.md)
- [Commits](https://github.com/brendan-duncan/image/commits)

---
updated-dependencies:
- dependency-name: image
  dependency-version: 4.7.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* build: (deps): bump file_picker from 10.3.7 to 10.3.8

Bumps [file_picker](https://github.com/miguelpruivo/flutter_file_picker) from 10.3.7 to 10.3.8.
- [Release notes](https://github.com/miguelpruivo/flutter_file_picker/releases)
- [Changelog](https://github.com/miguelpruivo/flutter_file_picker/blob/master/CHANGELOG.md)
- [Commits](https://github.com/miguelpruivo/flutter_file_picker/compare/v10.3.7...v10.3.8)

---
updated-dependencies:
- dependency-name: file_picker
  dependency-version: 10.3.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* feat: Improved search

* build: Use matrix sdk vom pub.dev again

* chore: Follow up better search

* build: (deps): bump image from 4.7.1 to 4.7.2

Bumps [image](https://github.com/brendan-duncan/image) from 4.7.1 to 4.7.2.
- [Changelog](https://github.com/brendan-duncan/image/blob/main/CHANGELOG.md)
- [Commits](https://github.com/brendan-duncan/image/commits)

---
updated-dependencies:
- dependency-name: image
  dependency-version: 4.7.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: Make cross signing self sign mandatory for bootstrap

* chore: Update user device keys before creating bootstrap

* fix: Better wait for secrets after verification bootstrap

* refactor: Remove native imaging and enable web worker

* refactor: Remove unused html onfocus streams

* build: (deps): bump flutter_foreground_task from 9.1.0 to 9.2.0

Bumps [flutter_foreground_task](https://github.com/Dev-hwang/flutter_foreground_task) from 9.1.0 to 9.2.0.
- [Changelog](https://github.com/Dev-hwang/flutter_foreground_task/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Dev-hwang/flutter_foreground_task/commits)

---
updated-dependencies:
- dependency-name: flutter_foreground_task
  dependency-version: 9.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore(translations): Translated using Weblate (Uzbek)

Currently translated at 99.7% (823 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/uz/

* chore(translations): Translated using Weblate (Russian)

Currently translated at 99.8% (824 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/

* chore(translations): Translated using Weblate (Norwegian Bokmål)

Currently translated at 90.9% (750 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/

* chore(translations): Translated using Weblate (Galician)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/

* chore(translations): Translated using Weblate (Basque)

Currently translated at 99.7% (823 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/eu/

* chore(translations): Translated using Weblate (Ukrainian)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/uk/

* chore(translations): Translated using Weblate (Estonian)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/

* chore(translations): Translated using Weblate (Dutch)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/

* chore(translations): Translated using Weblate (Russian)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/

* chore(translations): Translated using Weblate (Spanish)

Currently translated at 95.2% (788 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/es/

* chore(translations): Translated using Weblate (Spanish)

Currently translated at 96.3% (797 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/es/

* chore(translations): Translated using Weblate (Russian)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/

* chore(translations): Translated using Weblate (Russian)

Currently translated at 100.0% (825 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/

* fix: Broken ruzzian plurals

* chore(translations): Translated using Weblate (Norwegian Bokmål)

Currently translated at 91.2% (753 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/

* chore(translations): Translated using Weblate (Bengali)

Currently translated at 4.5% (38 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/bn/

* chore(translations): Translated using Weblate (French)

Currently translated at 82.3% (679 of 825 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/fr/

* build: (deps): bump translations_cleaner from 0.0.5 to 0.1.0

Bumps [translations_cleaner](https://github.com/Chinmay-KB/translations_cleaner) from 0.0.5 to 0.1.0.
- [Changelog](https://github.com/Chinmay-KB/translations_cleaner/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Chinmay-KB/translations_cleaner/commits)

---
updated-dependencies:
- dependency-name: translations_cleaner
  dependency-version: 0.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore(translations): Translated using Weblate (German)

Currently translated at 99.2% (821 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/

* chore(translations): Translated using Weblate (Estonian)

Currently translated at 100.0% (827 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/

* build: Bump version to 2.4.0

* build: (deps): bump sqflite_common_ffi from 2.3.6 to 2.3.7+1

Bumps [sqflite_common_ffi](https://github.com/tekartik/sqflite) from 2.3.6 to 2.3.7+1.
- [Commits](https://github.com/tekartik/sqflite/compare/sqflite_common_ffi_v2.3.6...sqflite_common_ffi/v2.3.7)

---
updated-dependencies:
- dependency-name: sqflite_common_ffi
  dependency-version: 2.3.7+1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore(translations): Translated using Weblate (Czech)

Currently translated at 66.1% (547 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/cs/

* chore(translations): Translated using Weblate (Czech)

Currently translated at 72.7% (602 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/cs/

* chore(translations): Translated using Weblate (German)

Currently translated at 99.8% (826 of 827 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/

* chore: Add security.md file

* fix: Locale unlocalized strings

* build: (deps): bump matrix from 4.1.0 to 5.0.0

Bumps [matrix](https://github.com/famedly/matrix-dart-sdk) from 4.1.0 to 5.0.0.
- [Release notes](https://github.com/famedly/matrix-dart-sdk/releases)
- [Changelog](https://github.com/famedly/matrix-dart-sdk/blob/main/CHANGELOG.md)
- [Commits](https://github.com/famedly/matrix-dart-sdk/compare/v4.1.0...v5.0.0)

---
updated-dependencies:
- dependency-name: matrix
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix: Notifications on web correctly managed when tab not focused

* chore: Add changelog for android

* chore: Remove duplicated localization

* fix: Sign in label

* chore: Versionize fcm shared isolate

* build: Remove unused packag

* build: (deps): bump package_info_plus from 8.3.1 to 9.0.0

Bumps [package_info_plus](https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus) from 8.3.1 to 9.0.0.
- [Release notes](https://github.com/fluttercommunity/plus_plugins/releases)
- [Commits](https://github.com/fluttercommunity/plus_plugins/commits/package_info_plus-v9.0.0/packages/package_info_plus)

---
updated-dependencies:
- dependency-name: package_info_plus
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* feat: Display particle animation on login page

* chore: Use fixed version of fcm shared isolate

* fix: apk crash on some platforms due new flutter version

* chore: Correct kotlin format

* fix iOS notifications

* fluffychat merge

* fluffychat merge

* fluffychat merge

* fluffychat merge

* fluffychat merge

* fluffychat merge

* add missing type annotations

* update matrix version

* fluffychat merge

* fluffychat merge

* fix notification on click actions

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Christian Kußowski <c.kussowski@famedly.com>
Co-authored-by: Krille-chan <christian-kussowski@posteo.de>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: BeMeritus <bemerituss@gmail.com>
Co-authored-by: Frank Paul Silye <frankps@gmail.com>
Co-authored-by: josé m. <correoxm@disroot.org>
Co-authored-by: xabirequejo <xabi.rn@gmail.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <jrthwlate@users.noreply.hosted.weblate.org>
Co-authored-by: Jelv <post@jelv.nl>
Co-authored-by: Дмитрий Михирев <bizdelnick@gmail.com>
Co-authored-by: Kimby <kimbyqs@gmail.com>
Co-authored-by: Christian <christian-pauly@posteo.de>
Co-authored-by: Kom nake <kominak310@svcache.com>
Co-authored-by: hugues de keyzer <komputilisto@hugues.info>
Co-authored-by: nautilusx <translate@disroot.org>
Co-authored-by: Šebestová <ka.sebestova.cz@gmail.com>
2026-02-10 08:01:12 -05:00

427 lines
16 KiB
Dart

import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
import 'package:go_router/go_router.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'package:matrix/matrix.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/chat_details/chat_details.dart';
import 'package:fluffychat/pangea/analytics_summary/learning_progress_indicators.dart';
import 'package:fluffychat/pangea/chat_settings/pages/room_details_buttons.dart';
import 'package:fluffychat/pangea/chat_settings/pages/room_participants_widget.dart';
import 'package:fluffychat/pangea/chat_settings/pages/space_details_button_row.dart';
import 'package:fluffychat/pangea/chat_settings/widgets/delete_space_dialog.dart';
import 'package:fluffychat/pangea/common/widgets/share_room_button.dart';
import 'package:fluffychat/pangea/course_chats/course_chats_page.dart';
import 'package:fluffychat/pangea/course_creation/course_info_chip_widget.dart';
import 'package:fluffychat/pangea/course_plans/courses/course_plan_room_extension.dart';
import 'package:fluffychat/pangea/course_plans/map_clipper.dart';
import 'package:fluffychat/pangea/course_settings/course_settings.dart';
import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart';
import 'package:fluffychat/pangea/instructions/instructions_enum.dart';
import 'package:fluffychat/pangea/instructions/instructions_inline_tooltip.dart';
import 'package:fluffychat/pangea/space_analytics/space_analytics.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart';
import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/future_loading_dialog.dart';
enum SpaceSettingsTabs {
chat,
course,
participants,
analytics,
more;
static SpaceSettingsTabs? fromString(String value) {
return SpaceSettingsTabs.values.firstWhereOrNull((e) => e.name == value);
}
}
class SpaceDetailsContent extends StatelessWidget {
final ChatDetailsController controller;
final Room room;
const SpaceDetailsContent(this.controller, this.room, {super.key});
SpaceSettingsTabs tab(BuildContext context) {
final defaultTab = FluffyThemes.isColumnMode(context)
? SpaceSettingsTabs.course
: SpaceSettingsTabs.chat;
final activeTab = controller.widget.activeTab;
if (activeTab != null) {
final selectedTab = SpaceSettingsTabs.fromString(activeTab);
return selectedTab ?? defaultTab;
}
return defaultTab;
}
void setSelectedTab(SpaceSettingsTabs tab, BuildContext context) {
context.go('/rooms/spaces/${room.id}/details?tab=${tab.name}');
}
List<ButtonDetails> _buttons(BuildContext context) {
final L10n l10n = L10n.of(context);
return [
ButtonDetails(
title: l10n.chats,
icon: const Icon(Icons.chat_bubble_outline, size: 30.0),
onPressed: () => setSelectedTab(SpaceSettingsTabs.chat, context),
visible: !FluffyThemes.isColumnMode(context),
tab: SpaceSettingsTabs.chat,
),
ButtonDetails(
title: l10n.coursePlan,
icon: const Icon(Icons.map_outlined, size: 30.0),
onPressed: () => setSelectedTab(SpaceSettingsTabs.course, context),
tab: SpaceSettingsTabs.course,
),
ButtonDetails(
title: l10n.participants,
icon: const Icon(Icons.group_outlined, size: 30.0),
onPressed: () =>
setSelectedTab(SpaceSettingsTabs.participants, context),
tab: SpaceSettingsTabs.participants,
),
ButtonDetails(
title: l10n.stats,
icon: const Icon(Symbols.bar_chart_4_bars, size: 30.0),
onPressed: () => setSelectedTab(SpaceSettingsTabs.analytics, context),
enabled: room.isRoomAdmin,
tab: SpaceSettingsTabs.analytics,
),
ButtonDetails(
title: l10n.invite,
description: l10n.inviteDesc,
icon: const Icon(Icons.person_add_outlined, size: 30.0),
onPressed: () {
String filter = 'knocking';
if (room.getParticipants([Membership.knock]).isEmpty) {
filter = room.pangeaSpaceParents.isNotEmpty ? 'space' : 'contacts';
}
context.go('/rooms/spaces/${room.id}/details/invite?filter=$filter');
},
enabled: room.canInvite,
showInMainView: false,
),
ButtonDetails(
title: l10n.editCourse,
description: l10n.editCourseDesc,
icon: const Icon(Icons.edit_outlined, size: 30.0),
onPressed: () => context.go('/rooms/spaces/${room.id}/details/edit'),
enabled: room.isRoomAdmin,
showInMainView: false,
),
ButtonDetails(
title: L10n.of(context).changeCourse,
description: L10n.of(context).changeCourseDesc,
icon: const Icon(Icons.assignment_outlined, size: 30.0),
onPressed: () =>
context.go('/rooms/spaces/${controller.roomId}/addcourse'),
enabled: room.isRoomAdmin,
showInMainView: false,
),
ButtonDetails(
title: L10n.of(context).teacherModeTitle,
description: L10n.of(context).teacherModeDesc,
icon: const Icon(Icons.school_outlined, size: 30.0),
onPressed: () => showFutureLoadingDialog(
context: context,
future: () => room.setTeacherMode(
room.teacherMode.copyWith(enabled: !room.isTeacherMode),
),
),
enabled: room.isRoomAdmin,
showInMainView: false,
isToggle: true,
value: room.isTeacherMode,
),
ButtonDetails(
title: L10n.of(context).activitiesToUnlockTopicTitle,
description: L10n.of(context).activitiesToUnlockTopicDesc,
icon: const Icon(Icons.lock_open_outlined, size: 30.0),
onPressed: () async {
final current = room.teacherMode.activitiesToUnlockTopic;
final resp = await showTextInputDialog(
context: context,
title: L10n.of(context).activitiesToUnlockTopicTitle,
keyboardType: TextInputType.number,
validator: (input) {
if (input.isEmpty ||
int.tryParse(input) == null ||
int.parse(input) < 0) {
return L10n.of(context).enterNumber;
}
return null;
},
initialText: current != null ? "$current" : null,
);
if (resp == null) return;
await showFutureLoadingDialog(
context: context,
future: () => room.setTeacherMode(
room.teacherMode.copyWith(
activitiesToUnlockTopic: int.parse(resp),
),
),
);
},
enabled: room.isRoomAdmin,
visible: room.isTeacherMode,
showInMainView: false,
trailing: room.teacherMode.activitiesToUnlockTopic != null
? Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
"${room.teacherMode.activitiesToUnlockTopic}",
style: Theme.of(context).textTheme.labelLarge,
),
)
: null,
),
ButtonDetails(
title: l10n.permissions,
description: l10n.permissionsDesc,
icon: const Icon(Icons.edit_attributes_outlined, size: 30.0),
onPressed: () =>
context.go('/rooms/spaces/${room.id}/details/permissions'),
enabled: room.isRoomAdmin,
showInMainView: false,
),
ButtonDetails(
title: l10n.access,
description: l10n.accessDesc,
icon: const Icon(Icons.shield_outlined, size: 30.0),
onPressed: () => context.go('/rooms/spaces/${room.id}/details/access'),
enabled: room.isRoomAdmin && room.spaceParents.isEmpty,
showInMainView: false,
),
ButtonDetails(
title: l10n.createGroupChat,
description: l10n.createGroupChatDesc,
icon: const Icon(Symbols.chat_add_on, size: 30.0),
onPressed: controller.addGroupChat,
enabled:
room.isRoomAdmin && room.canChangeStateEvent(EventTypes.SpaceChild),
showInMainView: false,
),
ButtonDetails(
title: l10n.leave,
description: l10n.leaveDesc,
icon: const Icon(Icons.logout_outlined, size: 30.0),
onPressed: () async {
final confirmed = await showOkCancelAlertDialog(
context: context,
title: L10n.of(context).areYouSure,
okLabel: L10n.of(context).leave,
cancelLabel: L10n.of(context).no,
message: L10n.of(context).leaveSpaceDescription,
isDestructive: true,
);
if (confirmed != OkCancelResult.ok) return;
final resp = await showFutureLoadingDialog(
context: context,
future: room.leaveSpace,
);
if (!resp.isError) {
context.go("/rooms");
}
},
enabled: room.membership == Membership.join,
showInMainView: false,
),
ButtonDetails(
title: l10n.delete,
description: l10n.deleteDesc,
icon: const Icon(Icons.delete_outline, size: 30.0),
onPressed: () => DeleteSpaceDialog.show(room, context),
enabled: room.isRoomAdmin,
showInMainView: false,
),
];
}
@override
Widget build(BuildContext context) {
final isColumnMode = FluffyThemes.isColumnMode(context);
final displayname = room.getLocalizedDisplayname(
MatrixLocals(L10n.of(context)),
);
return Column(
mainAxisSize: MainAxisSize.min,
children: [
if (!isColumnMode) const LearningProgressIndicators(),
Row(
crossAxisAlignment: isColumnMode
? CrossAxisAlignment.start
: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Flexible(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
if (isColumnMode) ...[
ClipPath(
clipper: MapClipper(),
child: Avatar(
mxContent: room.avatar,
name: displayname,
userId: room.directChatMatrixID,
size: 80.0,
borderRadius: BorderRadius.circular(0.0),
),
),
const SizedBox(width: 16.0),
],
Flexible(
child: Column(
spacing: isColumnMode ? 12.0 : 6.0,
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
displayname,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: isColumnMode ? 32.0 : 16.0,
fontWeight: isColumnMode
? FontWeight.normal
: FontWeight.bold,
),
),
if (room.coursePlan != null)
CourseInfoChips(
room.coursePlan!.uuid,
fontSize: 12.0,
iconSize: 12.0,
),
],
),
),
],
),
),
if (room.classCode != null)
Padding(
padding: const EdgeInsets.only(left: 16.0),
child: ShareRoomButton(room: room),
),
],
),
SizedBox(height: isColumnMode ? 24.0 : 12.0),
SpaceDetailsButtonRow(
controller: controller,
room: room,
selectedTab: tab(context),
onTabSelected: (tab) => setSelectedTab(tab, context),
buttons: _buttons(context),
),
SizedBox(height: isColumnMode ? 30.0 : 14.0),
Expanded(
child: Builder(
builder: (context) {
switch (tab(context)) {
case SpaceSettingsTabs.chat:
return CourseChats(
room.id,
activeChat: null,
client: room.client,
);
case SpaceSettingsTabs.course:
return SingleChildScrollView(
child: CourseSettings(controller: controller),
);
case SpaceSettingsTabs.participants:
return SingleChildScrollView(
child: Column(
children: [
const InstructionsInlineTooltip(
instructionsEnum:
InstructionsEnum.courseParticipantTooltip,
padding: EdgeInsets.only(
bottom: 16.0,
left: 16.0,
right: 16.0,
),
),
RoomParticipantsSection(room: room),
],
),
);
case SpaceSettingsTabs.analytics:
return SingleChildScrollView(
child: Center(child: SpaceAnalytics(roomId: room.id)),
);
case SpaceSettingsTabs.more:
final buttons = _buttons(
context,
).where((b) => !b.showInMainView && b.visible).toList();
return SingleChildScrollView(
child: Column(
children: [
if (room.topic.isNotEmpty) ...[
Text(
room.topic,
style: TextStyle(
fontSize: isColumnMode ? 16.0 : 12.0,
),
),
SizedBox(height: isColumnMode ? 30.0 : 14.0),
],
Column(
spacing: 10.0,
mainAxisSize: MainAxisSize.min,
children: buttons.map((b) {
return Opacity(
opacity: b.enabled ? 1.0 : 0.5,
child: b.isToggle
? SwitchListTile(
title: Text(b.title),
subtitle: b.description != null
? Text(b.description!)
: null,
secondary: b.icon,
value: b.value,
onChanged: b.enabled
? (value) {
b.onPressed?.call();
}
: null,
activeThumbColor:
AppConfig.activeToggleColor,
)
: ListTile(
title: Text(b.title),
subtitle: b.description != null
? Text(b.description!)
: null,
leading: b.icon,
onTap: b.enabled
? () => b.onPressed?.call()
: null,
trailing: b.trailing,
),
);
}).toList(),
),
],
),
);
}
},
),
),
],
);
}
}