From 08f32586156eed103dab79a4cb08e7cda88846fa Mon Sep 17 00:00:00 2001 From: NaiJi Date: Sat, 22 Jul 2023 11:15:43 -0300 Subject: [PATCH] feat(graphql): Implement Accept-Language header for GraphQL API map --- .../graphql_maps/graphql_api_map.dart | 10 +++- lib/logic/get_it/api_config.dart | 8 +++ lib/main.dart | 60 ++++++++++--------- 3 files changed, 49 insertions(+), 29 deletions(-) diff --git a/lib/logic/api_maps/graphql_maps/graphql_api_map.dart b/lib/logic/api_maps/graphql_maps/graphql_api_map.dart index 2c11c127..f91fc7a7 100644 --- a/lib/logic/api_maps/graphql_maps/graphql_api_map.dart +++ b/lib/logic/api_maps/graphql_maps/graphql_api_map.dart @@ -71,6 +71,7 @@ abstract class GraphQLApiMap { 'https://api.$rootAddress/graphql', httpClient: ioClient, parser: ResponseLoggingParser(), + defaultHeaders: {'Accept-Language': _locale}, ); final String token = _getApiToken(); @@ -101,7 +102,12 @@ abstract class GraphQLApiMap { 'ws://api.$rootAddress/graphql', config: SocketClientConfig( autoReconnect: true, - headers: token.isEmpty ? null : {'Authorization': 'Bearer $token'}, + headers: token.isEmpty + ? null + : { + 'Authorization': 'Bearer $token', + 'Accept-Language': _locale, + }, ), ); @@ -111,6 +117,8 @@ abstract class GraphQLApiMap { ); } + String get _locale => getIt.get().localeCode ?? 'en'; + String _getApiToken() { String token = ''; final serverDetails = getIt().serverDetails; diff --git a/lib/logic/get_it/api_config.dart b/lib/logic/get_it/api_config.dart index 18c8a02c..ac889dcc 100644 --- a/lib/logic/get_it/api_config.dart +++ b/lib/logic/get_it/api_config.dart @@ -9,6 +9,7 @@ class ApiConfigModel { final Box _box = Hive.box(BNames.serverInstallationBox); ServerHostingDetails? get serverDetails => _serverDetails; + String? get localeCode => _localeCode; String? get serverProviderKey => _serverProviderKey; String? get serverLocation => _serverLocation; String? get serverType => _serverType; @@ -20,6 +21,7 @@ class ApiConfigModel { ServerDomain? get serverDomain => _serverDomain; BackblazeBucket? get backblazeBucket => _backblazeBucket; + String? _localeCode; String? _serverProviderKey; String? _serverLocation; String? _dnsProviderKey; @@ -31,6 +33,10 @@ class ApiConfigModel { ServerDomain? _serverDomain; BackblazeBucket? _backblazeBucket; + Future setLocaleCode(final String value) async { + _localeCode = value; + } + Future storeServerProviderType(final ServerProviderType value) async { await _box.put(BNames.serverProvider, value); _serverProvider = value; @@ -82,6 +88,7 @@ class ApiConfigModel { } void clear() { + _localeCode = null; _serverProviderKey = null; _dnsProvider = null; _serverLocation = null; @@ -95,6 +102,7 @@ class ApiConfigModel { } void init() { + _localeCode = 'en'; _serverProviderKey = _box.get(BNames.hetznerKey); _serverLocation = _box.get(BNames.serverLocation); _dnsProviderKey = _box.get(BNames.cloudFlareKey); diff --git a/lib/main.dart b/lib/main.dart index e6358ba7..7ba0114a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -71,34 +71,38 @@ class SelfprivacyApp extends StatelessWidget { builder: ( final BuildContext context, final AppSettingsState appSettings, - ) => - MaterialApp.router( - routeInformationParser: _appRouter.defaultRouteParser(), - routerDelegate: _appRouter.delegate(), - scaffoldMessengerKey: - getIt.get().scaffoldMessengerKey, - localizationsDelegates: context.localizationDelegates, - supportedLocales: context.supportedLocales, - locale: context.locale, - debugShowCheckedModeBanner: false, - title: 'SelfPrivacy', - theme: lightThemeData, - darkTheme: darkThemeData, - themeMode: appSettings.isAutoDarkModeOn - ? ThemeMode.system - : appSettings.isDarkModeOn - ? ThemeMode.dark - : ThemeMode.light, - builder: (final BuildContext context, final Widget? widget) { - Widget error = const Text('...rendering error...'); - if (widget is Scaffold || widget is Navigator) { - error = Scaffold(body: Center(child: error)); - } - ErrorWidget.builder = - (final FlutterErrorDetails errorDetails) => error; - return widget!; - }, - ), + ) { + getIt.get().setLocaleCode( + context.locale.languageCode, + ); + return MaterialApp.router( + routeInformationParser: _appRouter.defaultRouteParser(), + routerDelegate: _appRouter.delegate(), + scaffoldMessengerKey: + getIt.get().scaffoldMessengerKey, + localizationsDelegates: context.localizationDelegates, + supportedLocales: context.supportedLocales, + locale: context.locale, + debugShowCheckedModeBanner: false, + title: 'SelfPrivacy', + theme: lightThemeData, + darkTheme: darkThemeData, + themeMode: appSettings.isAutoDarkModeOn + ? ThemeMode.system + : appSettings.isDarkModeOn + ? ThemeMode.dark + : ThemeMode.light, + builder: (final BuildContext context, final Widget? widget) { + Widget error = const Text('...rendering error...'); + if (widget is Scaffold || widget is Navigator) { + error = Scaffold(body: Center(child: error)); + } + ErrorWidget.builder = + (final FlutterErrorDetails errorDetails) => error; + return widget!; + }, + ); + }, ), ), );