// SPDX-FileCopyrightText: 2019-Present Christian Kußowski // SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat // // SPDX-License-Identifier: AGPL-3.0-or-later import 'package:tatchat/config/themes.dart'; import 'package:tatchat/l10n/l10n.dart'; import 'package:tatchat/pages/new_group/new_group.dart'; import 'package:tatchat/utils/localized_exception_extension.dart'; import 'package:tatchat/widgets/avatar.dart'; import 'package:tatchat/widgets/layouts/max_width_body.dart'; import 'package:material_ui/material_ui.dart'; class NewGroupView extends StatelessWidget { final NewGroupController controller; const NewGroupView(this.controller, {super.key}); bool get isGroup => controller.createGroupType == CreateGroupType.group; bool get isSpace => controller.createGroupType == CreateGroupType.space; bool get isCanal => controller.createGroupType == CreateGroupType.canal; bool get isMural => controller.createGroupType == CreateGroupType.mural; @override Widget build(BuildContext context) { final theme = Theme.of(context); final avatar = controller.avatar; final error = controller.error; return Scaffold( appBar: AppBar( leading: Center( child: BackButton( onPressed: controller.loading ? null : Navigator.of(context).pop, ), ), title: Text( isSpace ? L10n.of(context).newSpace : isCanal ? L10n.of(context).newCanal : isMural ? L10n.of(context).newMural : L10n.of(context).createGroup, ), ), body: MaxWidthBody( child: Column( mainAxisSize: .min, children: [ Padding( padding: const EdgeInsets.all(16.0), child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: SegmentedButton( selected: {controller.createGroupType}, onSelectionChanged: controller.setCreateGroupType, segments: [ ButtonSegment( value: CreateGroupType.group, label: Text(L10n.of(context).group), ), ButtonSegment( value: CreateGroupType.space, label: Text(L10n.of(context).space), ), ButtonSegment( value: CreateGroupType.canal, label: Text(L10n.of(context).canal), ), ButtonSegment( value: CreateGroupType.mural, label: Text(L10n.of(context).mural), ), ], ), ), ), const SizedBox(height: 16), InkWell( borderRadius: BorderRadius.circular(90), onTap: controller.loading ? null : controller.selectPhoto, child: CircleAvatar( radius: Avatar.defaultSize, child: avatar == null ? const Icon(Icons.add_a_photo_outlined) : ClipRRect( borderRadius: BorderRadius.circular(90), child: Image.memory( avatar, width: Avatar.defaultSize * 2, height: Avatar.defaultSize * 2, fit: BoxFit.cover, ), ), ), ), const SizedBox(height: 32), Padding( padding: const EdgeInsets.symmetric(horizontal: 24.0), child: TextField( autofocus: true, controller: controller.nameController, autocorrect: false, readOnly: controller.loading, decoration: InputDecoration( prefixIcon: const Icon(Icons.people_outlined), labelText: isSpace ? L10n.of(context).spaceName : isCanal ? L10n.of(context).canalName : isMural ? L10n.of(context).muralName : L10n.of(context).groupName, ), ), ), const SizedBox(height: 16), SwitchListTile.adaptive( contentPadding: const EdgeInsets.symmetric(horizontal: 32), secondary: const Icon(Icons.public_outlined), title: Text( isSpace ? L10n.of(context).spaceIsPublic : isCanal ? L10n.of(context).canalIsPublic : isMural ? L10n.of(context).muralIsPublic : L10n.of(context).groupIsPublic, ), value: controller.publicGroup, onChanged: controller.loading ? null : controller.setPublicGroup, ), AnimatedSize( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, child: controller.publicGroup ? SwitchListTile.adaptive( contentPadding: const EdgeInsets.symmetric( horizontal: 32, ), secondary: const Icon(Icons.search_outlined), title: Text(L10n.of(context).groupCanBeFoundViaSearch), value: controller.groupCanBeFound, onChanged: controller.loading ? null : controller.setGroupCanBeFound, ) : const SizedBox.shrink(), ), AnimatedSize( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, child: controller.createGroupType == CreateGroupType.space ? const SizedBox.shrink() : SwitchListTile.adaptive( contentPadding: const EdgeInsets.symmetric( horizontal: 32, ), secondary: Icon( Icons.lock_outlined, color: theme.colorScheme.onSurface, ), title: Text( L10n.of(context).enableEncryption, style: TextStyle(color: theme.colorScheme.onSurface), ), value: !controller.publicGroup, onChanged: null, ), ), AnimatedSize( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, child: !isGroup ? ListTile( contentPadding: const EdgeInsets.symmetric( horizontal: 32, ), trailing: const Padding( padding: EdgeInsets.symmetric(horizontal: 16.0), child: Icon(Icons.info_outlined), ), subtitle: Text( isSpace ? L10n.of(context).newSpaceDescription : isCanal ? L10n.of(context).newCanalDescription : L10n.of(context).newMuralDescription, ), ) : const SizedBox.shrink(), ), AnimatedSize( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, child: isCanal ? ListTile( contentPadding: const EdgeInsets.symmetric( horizontal: 32, ), leading: Icon( Icons.admin_panel_settings_outlined, color: theme.colorScheme.onSurface, ), subtitle: Text(L10n.of(context).canalOnlyAdminCanPost), ) : const SizedBox.shrink(), ), Padding( padding: const EdgeInsets.all(16.0), child: SizedBox( width: double.infinity, child: ElevatedButton( onPressed: controller.loading ? null : controller.submitAction, child: controller.loading ? const LinearProgressIndicator() : Text( isSpace ? L10n.of(context).createNewSpace : isCanal ? L10n.of(context).createCanalAndInviteUsers : isMural ? L10n.of(context) .createMuralAndInviteUsers : L10n.of(context) .createGroupAndInviteUsers, ), ), ), ), AnimatedSize( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, child: error == null ? const SizedBox.shrink() : ListTile( leading: Icon( Icons.warning_outlined, color: theme.colorScheme.error, ), title: Text( error.toLocalizedString(context), style: TextStyle(color: theme.colorScheme.error), ), ), ), ], ), ), ); } }