You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			164 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Dart
		
	
		
		
			
		
	
	
			164 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Dart
		
	
| 
								 
											4 years ago
										 
									 | 
							
								import 'package:adaptive_dialog/adaptive_dialog.dart';
							 | 
						||
| 
								 | 
							
								import 'package:fluffychat/config/app_config.dart';
							 | 
						||
| 
								 | 
							
								import 'package:fluffychat/config/setting_keys.dart';
							 | 
						||
| 
								 | 
							
								import 'package:fluffychat/pages/views/settings_account_view.dart';
							 | 
						||
| 
								 | 
							
								import 'package:fluffychat/widgets/matrix.dart';
							 | 
						||
| 
								 | 
							
								import 'package:flutter/material.dart';
							 | 
						||
| 
								 | 
							
								import 'package:flutter_gen/gen_l10n/l10n.dart';
							 | 
						||
| 
								 | 
							
								import 'package:future_loading_dialog/future_loading_dialog.dart';
							 | 
						||
| 
								 | 
							
								import 'package:matrix/matrix.dart';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SettingsAccount extends StatefulWidget {
							 | 
						||
| 
								 | 
							
								  const SettingsAccount({Key key}) : super(key: key);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  SettingsAccountController createState() => SettingsAccountController();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SettingsAccountController extends State<SettingsAccount> {
							 | 
						||
| 
								 | 
							
								  Future<dynamic> profileFuture;
							 | 
						||
| 
								 | 
							
								  Profile profile;
							 | 
						||
| 
								 | 
							
								  bool profileUpdated = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void updateProfile() => setState(() {
							 | 
						||
| 
								 | 
							
								        profileUpdated = true;
							 | 
						||
| 
								 | 
							
								        profile = profileFuture = null;
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void setDisplaynameAction() async {
							 | 
						||
| 
								 | 
							
								    final input = await showTextInputDialog(
							 | 
						||
| 
								 | 
							
								      useRootNavigator: false,
							 | 
						||
| 
								 | 
							
								      context: context,
							 | 
						||
| 
								 | 
							
								      title: L10n.of(context).editDisplayname,
							 | 
						||
| 
								 | 
							
								      okLabel: L10n.of(context).ok,
							 | 
						||
| 
								 | 
							
								      cancelLabel: L10n.of(context).cancel,
							 | 
						||
| 
								 | 
							
								      textFields: [
							 | 
						||
| 
								 | 
							
								        DialogTextField(
							 | 
						||
| 
								 | 
							
								          initialText: profile?.displayname ??
							 | 
						||
| 
								 | 
							
								              Matrix.of(context).client.userID.localpart,
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								      ],
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								    if (input == null) return;
							 | 
						||
| 
								 | 
							
								    final matrix = Matrix.of(context);
							 | 
						||
| 
								 | 
							
								    final success = await showFutureLoadingDialog(
							 | 
						||
| 
								 | 
							
								      context: context,
							 | 
						||
| 
								 | 
							
								      future: () =>
							 | 
						||
| 
								 | 
							
								          matrix.client.setDisplayName(matrix.client.userID, input.single),
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								    if (success.error == null) {
							 | 
						||
| 
								 | 
							
								      updateProfile();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void setJitsiInstanceAction() async {
							 | 
						||
| 
								 | 
							
								    const prefix = 'https://';
							 | 
						||
| 
								 | 
							
								    final input = await showTextInputDialog(
							 | 
						||
| 
								 | 
							
								      useRootNavigator: false,
							 | 
						||
| 
								 | 
							
								      context: context,
							 | 
						||
| 
								 | 
							
								      title: L10n.of(context).editJitsiInstance,
							 | 
						||
| 
								 | 
							
								      okLabel: L10n.of(context).ok,
							 | 
						||
| 
								 | 
							
								      cancelLabel: L10n.of(context).cancel,
							 | 
						||
| 
								 | 
							
								      textFields: [
							 | 
						||
| 
								 | 
							
								        DialogTextField(
							 | 
						||
| 
								 | 
							
								          initialText: AppConfig.jitsiInstance.replaceFirst(prefix, ''),
							 | 
						||
| 
								 | 
							
								          prefixText: prefix,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								      ],
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								    if (input == null) return;
							 | 
						||
| 
								 | 
							
								    var jitsi = prefix + input.single;
							 | 
						||
| 
								 | 
							
								    if (!jitsi.endsWith('/')) {
							 | 
						||
| 
								 | 
							
								      jitsi += '/';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    final matrix = Matrix.of(context);
							 | 
						||
| 
								 | 
							
								    await matrix.store.setItem(SettingKeys.jitsiInstance, jitsi);
							 | 
						||
| 
								 | 
							
								    AppConfig.jitsiInstance = jitsi;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void logoutAction() async {
							 | 
						||
| 
								 | 
							
								    if (await showOkCancelAlertDialog(
							 | 
						||
| 
								 | 
							
								          useRootNavigator: false,
							 | 
						||
| 
								 | 
							
								          context: context,
							 | 
						||
| 
								 | 
							
								          title: L10n.of(context).areYouSureYouWantToLogout,
							 | 
						||
| 
								 | 
							
								          okLabel: L10n.of(context).yes,
							 | 
						||
| 
								 | 
							
								          cancelLabel: L10n.of(context).cancel,
							 | 
						||
| 
								 | 
							
								        ) ==
							 | 
						||
| 
								 | 
							
								        OkCancelResult.cancel) {
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    final matrix = Matrix.of(context);
							 | 
						||
| 
								 | 
							
								    await showFutureLoadingDialog(
							 | 
						||
| 
								 | 
							
								      context: context,
							 | 
						||
| 
								 | 
							
								      future: () => matrix.client.logout(),
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  void deleteAccountAction() async {
							 | 
						||
| 
								 | 
							
								    if (await showOkCancelAlertDialog(
							 | 
						||
| 
								 | 
							
								          useRootNavigator: false,
							 | 
						||
| 
								 | 
							
								          context: context,
							 | 
						||
| 
								 | 
							
								          title: L10n.of(context).warning,
							 | 
						||
| 
								 | 
							
								          message: L10n.of(context).deactivateAccountWarning,
							 | 
						||
| 
								 | 
							
								          okLabel: L10n.of(context).ok,
							 | 
						||
| 
								 | 
							
								          cancelLabel: L10n.of(context).cancel,
							 | 
						||
| 
								 | 
							
								        ) ==
							 | 
						||
| 
								 | 
							
								        OkCancelResult.cancel) {
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (await showOkCancelAlertDialog(
							 | 
						||
| 
								 | 
							
								          useRootNavigator: false,
							 | 
						||
| 
								 | 
							
								          context: context,
							 | 
						||
| 
								 | 
							
								          title: L10n.of(context).areYouSure,
							 | 
						||
| 
								 | 
							
								          okLabel: L10n.of(context).yes,
							 | 
						||
| 
								 | 
							
								          cancelLabel: L10n.of(context).cancel,
							 | 
						||
| 
								 | 
							
								        ) ==
							 | 
						||
| 
								 | 
							
								        OkCancelResult.cancel) {
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    final input = await showTextInputDialog(
							 | 
						||
| 
								 | 
							
								      useRootNavigator: false,
							 | 
						||
| 
								 | 
							
								      context: context,
							 | 
						||
| 
								 | 
							
								      title: L10n.of(context).pleaseEnterYourPassword,
							 | 
						||
| 
								 | 
							
								      okLabel: L10n.of(context).ok,
							 | 
						||
| 
								 | 
							
								      cancelLabel: L10n.of(context).cancel,
							 | 
						||
| 
								 | 
							
								      textFields: [
							 | 
						||
| 
								 | 
							
								        DialogTextField(
							 | 
						||
| 
								 | 
							
								          obscureText: true,
							 | 
						||
| 
								 | 
							
								          hintText: '******',
							 | 
						||
| 
								 | 
							
								          minLines: 1,
							 | 
						||
| 
								 | 
							
								          maxLines: 1,
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								      ],
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								    if (input == null) return;
							 | 
						||
| 
								 | 
							
								    await showFutureLoadingDialog(
							 | 
						||
| 
								 | 
							
								      context: context,
							 | 
						||
| 
								 | 
							
								      future: () => Matrix.of(context).client.deactivateAccount(
							 | 
						||
| 
								 | 
							
								            auth: AuthenticationPassword(
							 | 
						||
| 
								 | 
							
								              password: input.single,
							 | 
						||
| 
								 | 
							
								              user: Matrix.of(context).client.userID,
							 | 
						||
| 
								 | 
							
								              identifier: AuthenticationUserIdentifier(
							 | 
						||
| 
								 | 
							
								                  user: Matrix.of(context).client.userID),
							 | 
						||
| 
								 | 
							
								            ),
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  @override
							 | 
						||
| 
								 | 
							
								  Widget build(BuildContext context) {
							 | 
						||
| 
								 | 
							
								    final client = Matrix.of(context).client;
							 | 
						||
| 
								 | 
							
								    profileFuture ??= client
							 | 
						||
| 
								 | 
							
								        .getProfileFromUserId(
							 | 
						||
| 
								 | 
							
								      client.userID,
							 | 
						||
| 
								 | 
							
								      cache: !profileUpdated,
							 | 
						||
| 
								 | 
							
								      getFromRooms: !profileUpdated,
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								        .then((p) {
							 | 
						||
| 
								 | 
							
								      if (mounted) setState(() => profile = p);
							 | 
						||
| 
								 | 
							
								      return p;
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    return SettingsAccountView(this);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |