Files
CityCards_Customer_Flutter/lib/common_bloc/language_selection_bloc.dart
2026-04-15 19:06:30 +05:30

69 lines
2.6 KiB
Dart

import 'package:citycards_customer/localPreference/local_preference.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
// ─── Events ────────────────────────────────────────────────────────────────
abstract class LanguageEvent {}
/// Dispatched on app start to restore the last saved locale.
class LoadSavedLanguage extends LanguageEvent {}
/// Dispatched when the user picks a new language in the bottom sheet.
class UpdateLanguage extends LanguageEvent {
/// Display label shown in the bottom sheet (e.g. "Spanish / Español").
final String label;
/// BCP-47 locale code (e.g. "es").
final String code;
UpdateLanguage({required this.label, required this.code});
}
// ─── State ─────────────────────────────────────────────────────────────────
class LanguageState {
/// BCP-47 locale code (e.g. "en", "nl", "es").
final String code;
/// Display label shown in the UI (e.g. "English / English").
final String label;
/// The [Locale] that MaterialApp should use.
Locale get locale => Locale(code);
const LanguageState({required this.code, required this.label});
static const initial = LanguageState(
code: 'en',
label: 'English / English',
);
}
// ─── BLoC ──────────────────────────────────────────────────────────────────
class LanguageBloc extends Bloc<LanguageEvent, LanguageState> {
LanguageBloc() : super(LanguageState.initial) {
on<LoadSavedLanguage>(_onLoadSaved);
on<UpdateLanguage>(_onUpdate);
}
/// Map of BCP-47 code → display label (must match language_selection_bottomsheet).
static const Map<String, String> _codeToLabel = {
'en': 'English / English',
'nl': 'Dutch / Nederlands',
'es': 'Spanish / Español',
'fr': 'French / Français',
'ja': 'Japanese / 日本語',
};
Future<void> _onLoadSaved(
LoadSavedLanguage event,
Emitter<LanguageState> emit,
) async {
final code = await LocalPreference.getLanguage();
final label = _codeToLabel[code] ?? 'English / English';
emit(LanguageState(code: code, label: label));
}
void _onUpdate(UpdateLanguage event, Emitter<LanguageState> emit) {
emit(LanguageState(code: event.code, label: event.label));
}
}