fluffychat/lib/pages/intro/intro_page.dart
2026-03-10 15:51:33 +01:00

192 lines
7.5 KiB
Dart

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