import 'package:comunic/helpers/groups_helper.dart'; import 'package:comunic/models/group.dart'; import 'package:comunic/ui/widgets/safe_state.dart'; import 'package:comunic/utils/intl_utils.dart'; import 'package:comunic/utils/ui_utils.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; /// Group membership information widget /// /// @author Pierre Hubert class GroupMembershipWidget extends StatefulWidget { final Group group; final Function() onUpdated; const GroupMembershipWidget({ @required this.group, this.onUpdated, }) : assert(group != null); @override _GroupMembershipWidgetState createState() => _GroupMembershipWidgetState(); } class _GroupMembershipWidgetState extends SafeState { Group get group => widget.group; int get _id => group.id; GroupMembershipLevel get _level => group.membershipLevel; @override Widget build(BuildContext context) { switch (_level) { case GroupMembershipLevel.ADMINISTRATOR: return Text(tr("Administrator")); case GroupMembershipLevel.MODERATOR: return Text(tr("Moderator")); case GroupMembershipLevel.MEMBER: return Text(tr("Member")); case GroupMembershipLevel.INVITED: // TODO: Handle this case. break; case GroupMembershipLevel.PENDING: return _buildPendingState(); case GroupMembershipLevel.VISITOR: return _buildVisitorState(); } } /// Build pending state Widget _buildPendingState() { return RichText( text: TextSpan(children: [ TextSpan(text: tr("Requested") + " "), TextSpan( text: tr("Cancel"), style: TextStyle(color: Colors.blue), recognizer: TapGestureRecognizer()..onTap = () => _cancelRequest()), ]), ); } /// Cancel group membership request void _cancelRequest() async { if (!await GroupsHelper().cancelRequest(_id)) showSimpleSnack(context, tr("Could not cancel your membership request!")); else { // Refresh state group.membershipLevel = GroupMembershipLevel.VISITOR; this.setState(() {}); if (this.widget.onUpdated != null) this.widget.onUpdated(); } } /// Build visitor state Widget _buildVisitorState() { return RichText( text: TextSpan( text: tr("Request membership"), style: TextStyle(color: Colors.blue), recognizer: TapGestureRecognizer() ..onTap = () => _requestMembership()), ); } /// Create new membership request void _requestMembership() async { if (!await GroupsHelper().sendRequest(_id)) showSimpleSnack(context, tr("Could not send your membership request!")); else { // Refresh state group.membershipLevel = GroupMembershipLevel.PENDING; this.setState(() {}); if (this.widget.onUpdated != null) this.widget.onUpdated(); } } }