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
		
	
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);
 | 
						|
  }
 | 
						|
}
 |