199 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
| import 'package:flutter/material.dart';
 | |
| 
 | |
| import 'package:extera_next/generated/l10n/l10n.dart';
 | |
| 
 | |
| import 'package:extera_next/config/themes.dart';
 | |
| import 'package:extera_next/pages/new_group/new_group.dart';
 | |
| import 'package:extera_next/utils/localized_exception_extension.dart';
 | |
| import 'package:extera_next/widgets/avatar.dart';
 | |
| import 'package:extera_next/widgets/layouts/max_width_body.dart';
 | |
| 
 | |
| class NewGroupView extends StatelessWidget {
 | |
|   final NewGroupController controller;
 | |
| 
 | |
|   const NewGroupView(this.controller, {super.key});
 | |
| 
 | |
|   @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(
 | |
|           controller.createGroupType == CreateGroupType.space
 | |
|               ? L10n.of(context).newSpace
 | |
|               : L10n.of(context).createGroup,
 | |
|         ),
 | |
|       ),
 | |
|       body: MaxWidthBody(
 | |
|         child: Column(
 | |
|           mainAxisSize: MainAxisSize.min,
 | |
|           children: <Widget>[
 | |
|             Padding(
 | |
|               padding: const EdgeInsets.all(16.0),
 | |
|               child: SegmentedButton<CreateGroupType>(
 | |
|                 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),
 | |
|                   ),
 | |
|                 ],
 | |
|               ),
 | |
|             ),
 | |
|             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: controller.createGroupType == CreateGroupType.space
 | |
|                       ? L10n.of(context).spaceName
 | |
|                       : L10n.of(context).groupName,
 | |
|                 ),
 | |
|               ),
 | |
|             ),
 | |
|             const SizedBox(height: 16),
 | |
|             SwitchListTile.adaptive(
 | |
|               contentPadding: const EdgeInsets.symmetric(horizontal: 32),
 | |
|               secondary: const Icon(Icons.public_outlined),
 | |
|               title: Text(
 | |
|                 controller.createGroupType == CreateGroupType.space
 | |
|                     ? L10n.of(context).spaceIsPublic
 | |
|                     : 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.enableEncryption,
 | |
|                       onChanged: controller.loading
 | |
|                           ? null
 | |
|                           : controller.setEnableEncryption,
 | |
|                     ),
 | |
|             ),
 | |
|             AnimatedSize(
 | |
|               duration: FluffyThemes.animationDuration,
 | |
|               curve: FluffyThemes.animationCurve,
 | |
|               child: controller.createGroupType == CreateGroupType.space
 | |
|                   ? ListTile(
 | |
|                       contentPadding:
 | |
|                           const EdgeInsets.symmetric(horizontal: 32),
 | |
|                       trailing: const Padding(
 | |
|                         padding: EdgeInsets.symmetric(horizontal: 16.0),
 | |
|                         child: Icon(Icons.info_outlined),
 | |
|                       ),
 | |
|                       subtitle: Text(L10n.of(context).newSpaceDescription),
 | |
|                     )
 | |
|                   : 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(
 | |
|                           controller.createGroupType == CreateGroupType.space
 | |
|                               ? L10n.of(context).createNewSpace
 | |
|                               : 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,
 | |
|                         ),
 | |
|                       ),
 | |
|                     ),
 | |
|             ),
 | |
|           ],
 | |
|         ),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 |