mirror of
https://gitlab.com/comunic/comunicmobile
synced 2025-06-19 16:25:17 +00:00
Can request to join a Forez group
This commit is contained in:
19
lib/forez/helpers/forez_group_helper.dart
Normal file
19
lib/forez/helpers/forez_group_helper.dart
Normal file
@ -0,0 +1,19 @@
|
||||
import 'package:comunic/helpers/preferences_helper.dart';
|
||||
|
||||
/// Forez group helper
|
||||
///
|
||||
/// Contains the ID of the currently selected Forez group
|
||||
///
|
||||
/// @author Pierre Hubert
|
||||
|
||||
class ForezGroupHelper {
|
||||
static Future<void> setId(int groupID) async {
|
||||
(await PreferencesHelper.getInstance())
|
||||
.setInt(PreferencesKeyList.FOREZ_GROUP, groupID);
|
||||
}
|
||||
|
||||
static Future<int> getId() async {
|
||||
return (await PreferencesHelper.getInstance())
|
||||
.getInt(PreferencesKeyList.FOREZ_GROUP);
|
||||
}
|
||||
}
|
@ -15,7 +15,7 @@ const _JOIN_GROUP_KEY_ID = 1;
|
||||
|
||||
List<Widget> buildTour(TourRouteState state) {
|
||||
if (!state.pubKeys.containsKey(_JOIN_GROUP_KEY_ID))
|
||||
state.pubKeys[_JOIN_GROUP_KEY_ID] = GlobalKey();
|
||||
state.pubKeys[_JOIN_GROUP_KEY_ID] = GlobalKey<JoinGroupPaneBodyState>();
|
||||
|
||||
return [
|
||||
FirstTourPane(
|
||||
|
@ -1,8 +1,13 @@
|
||||
import 'package:comunic/forez/helpers/forez_group_helper.dart';
|
||||
import 'package:comunic/helpers/forez_groups_helper.dart';
|
||||
import 'package:comunic/helpers/groups_helper.dart';
|
||||
import 'package:comunic/models/group.dart';
|
||||
import 'package:comunic/ui/dialogs/alert_dialog.dart';
|
||||
import 'package:comunic/ui/widgets/async_screen_widget.dart';
|
||||
import 'package:comunic/ui/widgets/tour/presentation_pane.dart';
|
||||
import 'package:comunic/utils/intl_utils.dart';
|
||||
import 'package:comunic/utils/log_utils.dart';
|
||||
import 'package:comunic/utils/ui_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
/// Ask the user to join a Forez group
|
||||
@ -12,14 +17,16 @@ import 'package:flutter/material.dart';
|
||||
class JoinGroupPane extends PresentationPane {
|
||||
JoinGroupPane({
|
||||
@required Function() onUpdated,
|
||||
@required GlobalKey key,
|
||||
@required GlobalKey<JoinGroupPaneBodyState> key,
|
||||
}) : super(
|
||||
icon: Icons.login,
|
||||
title: tr("Join a group"),
|
||||
title: tr("Join a Forez group"),
|
||||
child: (c) => _JoinGroupPaneBody(
|
||||
key: key,
|
||||
onUpdated: onUpdated,
|
||||
),
|
||||
canGoNext: key?.currentState?.canGoNext ?? false,
|
||||
onTapNext: (c) => key.currentState.validateChoice(),
|
||||
);
|
||||
}
|
||||
|
||||
@ -33,14 +40,20 @@ class _JoinGroupPaneBody extends StatefulWidget {
|
||||
super(key: key);
|
||||
|
||||
@override
|
||||
__JoinGroupPaneBodyState createState() => __JoinGroupPaneBodyState();
|
||||
JoinGroupPaneBodyState createState() => JoinGroupPaneBodyState();
|
||||
}
|
||||
|
||||
class __JoinGroupPaneBodyState extends State<_JoinGroupPaneBody> {
|
||||
class JoinGroupPaneBodyState extends State<_JoinGroupPaneBody> {
|
||||
List<Group> _groups;
|
||||
int _currChoice;
|
||||
|
||||
bool get canGoNext => _currChoice != null && _currChoice > 0;
|
||||
|
||||
Group get _currGroup => _groups.firstWhere((e) => e.id == _currChoice);
|
||||
|
||||
Future<void> _load() async {
|
||||
_groups = await ForezGroupsHelper.getForezGroups();
|
||||
_currChoice = _groups[0].id;
|
||||
}
|
||||
|
||||
@override
|
||||
@ -49,18 +62,60 @@ class __JoinGroupPaneBodyState extends State<_JoinGroupPaneBody> {
|
||||
onBuild: onBuild,
|
||||
errorMessage: tr("Failed to load the list of Forez groups!"));
|
||||
|
||||
List<Widget> get _initialWidgets => [
|
||||
Text(tr("Please choose now the Forez group you want to join...")),
|
||||
];
|
||||
Widget onBuild() => ConstrainedBox(
|
||||
constraints: BoxConstraints(maxWidth: 300),
|
||||
child: Column(
|
||||
children: [
|
||||
Text(tr("Please choose now the Forez group you want to join...")),
|
||||
]..addAll(_groups.map((e) => RadioListTile(
|
||||
value: e.id,
|
||||
groupValue: _currChoice,
|
||||
onChanged: (v) => setState(() => _currChoice = _currChoice),
|
||||
title: Text(e.name),
|
||||
subtitle: Text(e.membershipText),
|
||||
))),
|
||||
),
|
||||
);
|
||||
|
||||
Widget onBuild() => Flexible(
|
||||
child: ListView.builder(
|
||||
itemCount: _initialWidgets.length + _groups.length,
|
||||
itemBuilder: (c, i) {
|
||||
if (i < _initialWidgets.length) return _initialWidgets[i];
|
||||
Future<bool> validateChoice() async {
|
||||
try {
|
||||
switch (_currGroup.membershipLevel) {
|
||||
case GroupMembershipLevel.VISITOR:
|
||||
if (!await GroupsHelper.sendRequest(_currGroup.id))
|
||||
throw Exception("Failed to send group membership request!");
|
||||
break;
|
||||
|
||||
final group = _groups[i - _initialWidgets.length];
|
||||
return ListTile();
|
||||
},
|
||||
));
|
||||
case GroupMembershipLevel.INVITED:
|
||||
if (!await GroupsHelper.respondInvitation(_currGroup.id, true))
|
||||
throw Exception(
|
||||
"Failed to respond to group membership invitation!");
|
||||
break;
|
||||
|
||||
case GroupMembershipLevel.PENDING:
|
||||
break;
|
||||
|
||||
case GroupMembershipLevel.ADMINISTRATOR:
|
||||
case GroupMembershipLevel.MODERATOR:
|
||||
case GroupMembershipLevel.MEMBER:
|
||||
break;
|
||||
}
|
||||
|
||||
// Check if the user can not access yet the group
|
||||
if ((_currGroup.membershipLevel == GroupMembershipLevel.VISITOR &&
|
||||
_currGroup.registrationLevel != GroupRegistrationLevel.OPEN) ||
|
||||
_currGroup.membershipLevel == GroupMembershipLevel.PENDING) {
|
||||
await alert(context,
|
||||
tr("You can not access this group yet, please wait for a member of the group to accept your request. Hopefully this will not be too long. Please check back soon!"));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
await ForezGroupHelper.setId(_currGroup.id);
|
||||
return true;
|
||||
} catch (e, s) {
|
||||
logError(e, s);
|
||||
snack(context, tr("Failed to register to group!"));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user