Files
tatuchat/lib/widgets/tatu_chat_app.dart
Welton Moura 9382a1f946 feat: usar a cor escolhida tal e qual e opcao de suavizar
- TatuPalette.scheme aceita softenPrimary e passa a usar a seed como primary, onPrimary por contraste e surfaceTint, em vez da paleta tonal do Material 3
- nova opcao AppSettings.softenThemeColor (default false, ou seja cor exacta)
- interruptor 'Suavizar cor do tema' em Configuracoes > Aparencia, com l10n en/pt
- a opcao e sincronizada via account data (soften_theme_color) e mantida localmente como fallback, tal como a cor do tema
- setApplicationAccountColor e updateApplicationAccountConfig preservam o novo campo
- um unico sync de account data actualiza cor e opcao
- testes de serializacao e round-trip para o novo campo
2026-09-25 13:46:00 -03:00

113 lines
3.8 KiB
Dart

// SPDX-FileCopyrightText: 2019-Present Christian Kußowski
// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat
//
// SPDX-License-Identifier: AGPL-3.0-or-later
import 'package:cupertino_ui/cupertino_ui.dart';
import 'package:tatchat/config/app_config.dart';
import 'package:tatchat/config/routes.dart';
import 'package:tatchat/config/setting_keys.dart';
import 'package:tatchat/config/themes.dart';
import 'package:tatchat/l10n/l10n.dart';
import 'package:tatchat/widgets/app_lock.dart';
import 'package:tatchat/widgets/layouts/call_overlay.dart';
import 'package:tatchat/widgets/theme_builder.dart';
import 'package:go_router/go_router.dart';
import 'package:material_ui/material_ui.dart';
import 'package:matrix/matrix.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../utils/custom_scroll_behaviour.dart';
import 'matrix.dart';
class TatuChatApp extends StatelessWidget {
final Widget? testWidget;
final List<Client> clients;
final ({String? pincode, bool useBiometrics}) appLockSettings;
final SharedPreferences store;
const TatuChatApp({
super.key,
this.testWidget,
required this.clients,
required this.store,
required this.appLockSettings,
});
/// getInitialLink may rereturn the value multiple times if this view is
/// opened multiple times for example if the user logs out after they logged
/// in with qr code or magic link.
static bool gotInitialLink = false;
// Router must be outside of build method so that hot reload does not reset
// the current path.
static final GoRouter router = GoRouter(
routes: AppRoutes.routes,
debugLogDiagnostics: true,
redirect: (context, state) {
// Workaround for content sharings passed to go router:
if ({
'content',
'sharemedia-im.tatuchat.app',
}.contains(state.uri.scheme)) {
Logs().d('Ignore content sharing handling in go router', state.uri);
return '/';
}
// Pass deep links to app:
if (state.uri.toString().startsWith(AppConfig.deepLinkPrefix)) {
return '/rooms/newprivatechat#${state.uri}';
}
return null;
},
);
@override
Widget build(BuildContext context) {
return ThemeBuilder(
builder: (context, themeMode, primaryColor, themeController) =>
MaterialApp.router(
title: AppSettings.applicationName.value,
themeMode: themeMode,
theme: FluffyThemes.buildTheme(
context,
Brightness.light,
primaryColor,
themeController.softenPrimaryColor,
),
darkTheme: FluffyThemes.buildTheme(
context,
Brightness.dark,
primaryColor,
themeController.softenPrimaryColor,
),
scrollBehavior: CustomScrollBehavior(),
localizationsDelegates: [
...L10n.localizationsDelegates,
...GlobalMaterialLocalizations.delegates,
...GlobalCupertinoLocalizations.delegates,
],
supportedLocales: L10n.supportedLocales,
routerConfig: router,
builder: (context, child) => AppLockWidget(
pincode: appLockSettings.pincode,
useBiometrics: appLockSettings.useBiometrics,
isLoggedIn: clients.any((client) => client.isLogged()),
// Need a navigator above the Matrix widget for
// displaying dialogs
child: Matrix(
clients: clients,
store: store,
onActiveClientChanged: (client) {
themeController.setAccountClient(client);
},
child: CallOverlay(
child: testWidget ?? child ?? const SizedBox.shrink(),
),
),
),
),
);
}
}