import 'package:flutter/material.dart'; import '/components/custom_title_bar.dart'; import '/components/flash_message.dart'; import '/database/models/conversations.dart'; import '/exceptions/update_data_exception.dart'; import '/services/conversations_service.dart'; class ConversationPermissions extends StatefulWidget { const ConversationPermissions({ Key? key, required this.conversation, }) : super(key: key); final Conversation conversation; @override _ConversationPermissionsState createState() => _ConversationPermissionsState(); } class _ConversationPermissionsState extends State { Map> perms = { 'admin_add_members': { 'title': 'Add Members', 'desc': 'Restrict adding members to admins', }, 'admin_edit_info': { 'title': 'Edit Info', 'desc': 'Restrict editing the conversation information to admins', }, 'admin_send_messages': { 'title': 'Send Messages', 'desc': 'Restrict sending messages to admins', }, }; @override Widget build(BuildContext context) { return Scaffold( appBar: CustomTitleBar( title: const Text( 'Permissions', style: TextStyle( fontSize: 28, fontWeight: FontWeight.bold ) ), beforeBack: () async { ConversationsService.updateConversation(widget.conversation) .catchError((error) { String message = error.toString(); if (error.runtimeType != UpdateDataException) { message = 'An error occured, please try again later'; } showMessage(message, context); }); }, showBack: true, backgroundColor: Colors.transparent, ), body: Padding( padding: const EdgeInsets.only(top: 30), child: _list(), ), ); } Widget _list() { return ListView.builder( itemCount: perms.length, shrinkWrap: true, itemBuilder: (context, i) { String key = perms.keys.elementAt(i); return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { _setValue(key); }, child: Padding( padding: const EdgeInsets.only(left: 30, right: 20, top: 8, bottom: 8), child: Row( children: [ _getValue(key) ? const Icon(Icons.check) : const SizedBox(width: 24), const SizedBox(width: 16), Expanded( child: Align( alignment: Alignment.centerLeft, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( perms[key]!['title'] ?? '', textAlign: TextAlign.left, style: const TextStyle( fontSize: 20, fontWeight: FontWeight.normal, ), ), const SizedBox(height: 5), Text( perms[key]!['desc'] ?? '', textAlign: TextAlign.left, style: const TextStyle( fontSize: 14, fontWeight: FontWeight.w200, ), ), ] ) ) ) ], ) ) ); } ); } bool _getValue(String key) { switch (key) { case 'admin_add_members': { return widget.conversation.adminAddMembers; } case 'admin_edit_info': { return widget.conversation.adminEditInfo; } case 'admin_send_messages': { return widget.conversation.adminSendMessages; } default: { return false; } } } void _setValue(String key) { switch (key) { case 'admin_add_members': { setState(() { widget.conversation.adminAddMembers = !widget.conversation.adminAddMembers; }); break; } case 'admin_edit_info': { setState(() { widget.conversation.adminEditInfo = !widget.conversation.adminEditInfo; }); break; } case 'admin_send_messages': { setState(() { widget.conversation.adminSendMessages = !widget.conversation.adminSendMessages; }); break; } } } }