diff --git a/apps/mobile/apps/client/lib/main.dart b/apps/mobile/apps/client/lib/main.dart index ba82fce4..27f4d77d 100644 --- a/apps/mobile/apps/client/lib/main.dart +++ b/apps/mobile/apps/client/lib/main.dart @@ -56,8 +56,7 @@ class AppWidget extends StatelessWidget { Widget build(BuildContext context) { return BlocProvider( create: (BuildContext context) => - Modular.get() - ..add(const core_localization.LoadLocale()), + Modular.get(), child: BlocBuilder< core_localization.LocaleBloc, diff --git a/apps/mobile/packages/core_localization/lib/src/bloc/locale_bloc.dart b/apps/mobile/packages/core_localization/lib/src/bloc/locale_bloc.dart index 48d7683f..e0187a14 100644 --- a/apps/mobile/packages/core_localization/lib/src/bloc/locale_bloc.dart +++ b/apps/mobile/packages/core_localization/lib/src/bloc/locale_bloc.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import '../domain/usecases/get_default_locale_use_case.dart'; import '../domain/usecases/get_locale_use_case.dart'; +import '../domain/usecases/get_supported_locales_use_case.dart'; import '../domain/usecases/set_locale_use_case.dart'; import '../l10n/strings.g.dart'; import 'locale_event.dart'; @@ -12,8 +14,12 @@ import 'locale_state.dart'; /// using [SetLocaleUseCase] and [GetLocaleUseCase]. class LocaleBloc extends Bloc { /// Creates a [LocaleBloc] with the required use cases. - LocaleBloc({required this.getLocaleUseCase, required this.setLocaleUseCase}) - : super(LocaleState.initial()) { + LocaleBloc({ + required this.getLocaleUseCase, + required this.setLocaleUseCase, + required this.getSupportedLocalesUseCase, + required this.getDefaultLocaleUseCase, + }) : super(LocaleState.initial()) { on(_onChangeLocale); on(_onLoadLocale); @@ -27,6 +33,12 @@ class LocaleBloc extends Bloc { /// Use case for saving the selected locale. final SetLocaleUseCase setLocaleUseCase; + /// Use case for retrieving supported locales. + final GetSupportedLocalesUseCase getSupportedLocalesUseCase; + + /// Use case for retrieving the default locale. + final GetDefaultLocaleUseCase getDefaultLocaleUseCase; + /// Handles the [ChangeLocale] event by saving it via the use case and emitting new state. Future _onChangeLocale( ChangeLocale event, @@ -53,10 +65,16 @@ class LocaleBloc extends Bloc { Emitter emit, ) async { final Locale? savedLocale = await getLocaleUseCase(); - final Locale locale = savedLocale ?? const Locale('es'); + final Locale defaultLocale = getDefaultLocaleUseCase(); + final List supportedLocales = getSupportedLocalesUseCase(); + + final Locale locale = savedLocale ?? defaultLocale; await LocaleSettings.setLocaleRaw(locale.languageCode); - emit(LocaleState(locale: locale, supportedLocales: state.supportedLocales)); + emit(LocaleState( + locale: locale, + supportedLocales: supportedLocales, + )); } } diff --git a/apps/mobile/packages/core_localization/lib/src/bloc/locale_state.dart b/apps/mobile/packages/core_localization/lib/src/bloc/locale_state.dart index 33219cd1..a37288ed 100644 --- a/apps/mobile/packages/core_localization/lib/src/bloc/locale_state.dart +++ b/apps/mobile/packages/core_localization/lib/src/bloc/locale_state.dart @@ -1,20 +1,21 @@ import 'package:flutter/material.dart'; + import '../l10n/strings.g.dart'; /// Represents the current state of the application's localization. class LocaleState { + /// Creates a [LocaleState] with the specified [locale]. + const LocaleState({required this.locale, required this.supportedLocales}); + + /// The initial state of the application, defaulting to English. + factory LocaleState.initial() => LocaleState( + locale: AppLocaleUtils.findDeviceLocale().flutterLocale, + supportedLocales: AppLocaleUtils.supportedLocales, + ); + /// The current active locale. final Locale locale; /// The list of supported locales for the application. final List supportedLocales; - - /// Creates a [LocaleState] with the specified [locale]. - const LocaleState({required this.locale, required this.supportedLocales}); - - /// The initial state of the application, defaulting to English. - factory LocaleState.initial() => LocaleState( - locale: const Locale('es'), - supportedLocales: AppLocaleUtils.supportedLocales, - ); } diff --git a/apps/mobile/packages/core_localization/lib/src/data/repositories_impl/locale_repository_impl.dart b/apps/mobile/packages/core_localization/lib/src/data/repositories_impl/locale_repository_impl.dart index 2711edb2..4d8e73a5 100644 --- a/apps/mobile/packages/core_localization/lib/src/data/repositories_impl/locale_repository_impl.dart +++ b/apps/mobile/packages/core_localization/lib/src/data/repositories_impl/locale_repository_impl.dart @@ -1,4 +1,6 @@ import 'dart:ui'; +import 'package:core_localization/src/l10n/strings.g.dart'; + import '../../domain/repositories/locale_repository_interface.dart'; import '../datasources/locale_local_data_source.dart'; @@ -18,11 +20,19 @@ class LocaleRepositoryImpl implements LocaleRepositoryInterface { } @override - Future getSavedLocale() async { + Future getSavedLocale() async { + return getDefaultLocale(); + + /// TODO: FEATURE_NOT_IMPLEMENTED: Implement saved locale retrieval later final String? languageCode = await localDataSource.getLanguageCode(); if (languageCode != null) { return Locale(languageCode); } - return null; } + + @override + Locale getDefaultLocale() => AppLocaleUtils.findDeviceLocale().flutterLocale; + + @override + List getSupportedLocales() => AppLocaleUtils.supportedLocales; } diff --git a/apps/mobile/packages/core_localization/lib/src/domain/repositories/locale_repository_interface.dart b/apps/mobile/packages/core_localization/lib/src/domain/repositories/locale_repository_interface.dart index 604c2d41..34dffa1c 100644 --- a/apps/mobile/packages/core_localization/lib/src/domain/repositories/locale_repository_interface.dart +++ b/apps/mobile/packages/core_localization/lib/src/domain/repositories/locale_repository_interface.dart @@ -14,4 +14,10 @@ abstract interface class LocaleRepositoryInterface { /// /// Returns `null` if no locale has been previously saved. Future getSavedLocale(); + + /// Retrieves the default [Locale] for the application. + Locale getDefaultLocale(); + + /// Retrieves the list of supported [Locale]s. + List getSupportedLocales(); } diff --git a/apps/mobile/packages/core_localization/lib/src/domain/usecases/get_default_locale_use_case.dart b/apps/mobile/packages/core_localization/lib/src/domain/usecases/get_default_locale_use_case.dart new file mode 100644 index 00000000..e416d1cd --- /dev/null +++ b/apps/mobile/packages/core_localization/lib/src/domain/usecases/get_default_locale_use_case.dart @@ -0,0 +1,15 @@ +import 'dart:ui'; +import '../repositories/locale_repository_interface.dart'; + +/// Use case to retrieve the default locale. +class GetDefaultLocaleUseCase { + final LocaleRepositoryInterface _repository; + + /// Creates a [GetDefaultLocaleUseCase] with the required [LocaleRepositoryInterface]. + GetDefaultLocaleUseCase(this._repository); + + /// Retrieves the default locale. + Locale call() { + return _repository.getDefaultLocale(); + } +} diff --git a/apps/mobile/packages/core_localization/lib/src/domain/usecases/get_supported_locales_use_case.dart b/apps/mobile/packages/core_localization/lib/src/domain/usecases/get_supported_locales_use_case.dart new file mode 100644 index 00000000..8840b196 --- /dev/null +++ b/apps/mobile/packages/core_localization/lib/src/domain/usecases/get_supported_locales_use_case.dart @@ -0,0 +1,15 @@ +import 'dart:ui'; +import '../repositories/locale_repository_interface.dart'; + +/// Use case to retrieve the list of supported locales. +class GetSupportedLocalesUseCase { + final LocaleRepositoryInterface _repository; + + /// Creates a [GetSupportedLocalesUseCase] with the required [LocaleRepositoryInterface]. + GetSupportedLocalesUseCase(this._repository); + + /// Retrieves the supported locales. + List call() { + return _repository.getSupportedLocales(); + } +} diff --git a/apps/mobile/packages/core_localization/lib/src/localization_module.dart b/apps/mobile/packages/core_localization/lib/src/localization_module.dart index 13177b1c..42dd5b71 100644 --- a/apps/mobile/packages/core_localization/lib/src/localization_module.dart +++ b/apps/mobile/packages/core_localization/lib/src/localization_module.dart @@ -3,7 +3,9 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'data/datasources/locale_local_data_source.dart'; import 'data/repositories_impl/locale_repository_impl.dart'; import 'domain/repositories/locale_repository_interface.dart'; +import 'domain/usecases/get_default_locale_use_case.dart'; import 'domain/usecases/get_locale_use_case.dart'; +import 'domain/usecases/get_supported_locales_use_case.dart'; import 'domain/usecases/set_locale_use_case.dart'; import 'bloc/locale_bloc.dart'; @@ -34,12 +36,20 @@ class LocalizationModule extends Module { i.addLazySingleton( () => SetLocaleUseCase(i.get()), ); + i.addLazySingleton( + () => GetSupportedLocalesUseCase(i.get()), + ); + i.addLazySingleton( + () => GetDefaultLocaleUseCase(i.get()), + ); // BLoCs i.add( () => LocaleBloc( getLocaleUseCase: i.get(), setLocaleUseCase: i.get(), + getSupportedLocalesUseCase: i.get(), + getDefaultLocaleUseCase: i.get(), ), ); }