import 'package:flutter/material.dart'; import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:go_router/go_router.dart'; import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/intro/flows/restore_backup_flow.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; import 'package:fluffychat/widgets/matrix.dart'; class IntroPage extends StatelessWidget { final bool isLoading, hasPresetHomeserver; final String? loggingInToHomeserver, welcomeText; final VoidCallback login; const IntroPage({ required this.isLoading, required this.loggingInToHomeserver, super.key, required this.hasPresetHomeserver, required this.welcomeText, required this.login, }); @override Widget build(BuildContext context) { final theme = Theme.of(context); final addMultiAccount = Matrix.of( context, ).widget.clients.any((client) => client.isLogged()); final loggingInToHomeserver = this.loggingInToHomeserver; return LoginScaffold( appBar: AppBar( centerTitle: true, title: Text( addMultiAccount ? L10n.of(context).addAccount : L10n.of(context).login, ), actions: [ PopupMenuButton( useRootNavigator: true, itemBuilder: (_) => [ PopupMenuItem( onTap: isLoading ? null : () => restoreBackupFlow(context), child: Row( mainAxisSize: .min, children: [ const Icon(Icons.import_export_outlined), const SizedBox(width: 12), Text(L10n.of(context).hydrate), ], ), ), PopupMenuItem( onTap: () => launchUrlString(AppSettings.privacyPolicy.value), child: Row( mainAxisSize: .min, children: [ const Icon(Icons.privacy_tip_outlined), const SizedBox(width: 12), Text(L10n.of(context).privacy), ], ), ), PopupMenuItem( onTap: () => PlatformInfos.showDialog(context), child: Row( mainAxisSize: .min, children: [ const Icon(Icons.info_outlined), const SizedBox(width: 12), Text(L10n.of(context).about), ], ), ), ], ), ], ), body: isLoading ? Center( child: Column( mainAxisAlignment: .center, children: [ CircularProgressIndicator.adaptive(), if (loggingInToHomeserver != null) Text(L10n.of(context).logInTo(loggingInToHomeserver)), ], ), ) : LayoutBuilder( builder: (context, constraints) { return SingleChildScrollView( child: ConstrainedBox( constraints: BoxConstraints( minHeight: constraints.maxHeight, ), child: IntrinsicHeight( child: Column( children: [ Container( alignment: Alignment.center, padding: const EdgeInsets.symmetric( horizontal: 8.0, ), child: Hero( tag: 'info-logo', child: Image.asset( './assets/banner_transparent.png', fit: BoxFit.fitWidth, ), ), ), const SizedBox(height: 32), Padding( padding: const EdgeInsets.symmetric( horizontal: 32.0, ), child: SelectableLinkify( text: welcomeText ?? L10n.of(context).appIntro, textScaleFactor: MediaQuery.textScalerOf( context, ).scale(1), textAlign: TextAlign.center, linkStyle: TextStyle( color: theme.colorScheme.secondary, decorationColor: theme.colorScheme.secondary, ), onOpen: (link) => launchUrlString(link.url), ), ), const Spacer(), Padding( padding: const EdgeInsets.all(32.0), child: Column( mainAxisSize: .min, crossAxisAlignment: .stretch, children: [ if (!hasPresetHomeserver) ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: theme.colorScheme.secondary, foregroundColor: theme.colorScheme.onSecondary, ), onPressed: () => context.go( '${GoRouterState.of(context).uri.path}/sign_up', ), child: Text( L10n.of(context).createNewAccount, ), ), SizedBox(height: 16), ElevatedButton( onPressed: login, child: Text(L10n.of(context).signIn), ), if (!hasPresetHomeserver) TextButton( onPressed: () async { final client = await Matrix.of( context, ).getLoginClient(); context.go( '${GoRouterState.of(context).uri.path}/login', extra: client, ); }, child: Text( L10n.of(context).loginWithMatrixId, ), ), ], ), ), ], ), ), ), ); }, ), ); } }