Skip to content

Commit

Permalink
Merge pull request #6 from muslimpack/dependency-injection
Browse files Browse the repository at this point in the history
Dependency injection
  • Loading branch information
7Eltantawy authored Dec 16, 2024
2 parents 128f81f + 00bc573 commit ae5d60a
Show file tree
Hide file tree
Showing 28 changed files with 580 additions and 392 deletions.
15 changes: 6 additions & 9 deletions alazkar/lib/app.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:alazkar/src/core/di/dependency_injection.dart';
import 'package:alazkar/src/core/extension/extension_platform.dart';
import 'package:alazkar/src/core/utils/scroll_behavior.dart';
import 'package:alazkar/src/features/home/presentation/controller/home/home_bloc.dart';
Expand All @@ -19,17 +20,13 @@ class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider(create: (_) => SettingsCubit()),
BlocProvider(create: (_) => ThemeCubit()),
BlocProvider(create: (_) => ZikrSourceFilterCubit()..start()),
BlocProvider(create: (_) => sl<SettingsCubit>()),
BlocProvider(create: (_) => sl<ThemeCubit>()),
BlocProvider(create: (_) => sl<ZikrSourceFilterCubit>()..start()),
BlocProvider(
create: (context) => HomeBloc(
zikrSourceFilterCubit: context.read<ZikrSourceFilterCubit>(),
),
),
BlocProvider(
create: (context) => SearchCubit(context.read<HomeBloc>()),
create: (context) => sl<HomeBloc>()..add(HomeStartEvent()),
),
BlocProvider(create: (context) => sl<SearchCubit>()),
],
child: BlocBuilder<ThemeCubit, ThemeState>(
builder: (context, state) {
Expand Down
62 changes: 37 additions & 25 deletions alazkar/lib/services.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import 'package:alazkar/src/core/constants/const.dart';
import 'package:alazkar/src/core/di/dependency_injection.dart'
as service_locator;
import 'package:alazkar/src/core/di/dependency_injection.dart';
import 'package:alazkar/src/core/extension/extension_platform.dart';
import 'package:alazkar/src/core/helpers/azkar_helper.dart';
import 'package:alazkar/src/core/helpers/bookmarks_helper.dart';
import 'package:alazkar/src/core/utils/app_bloc_observer.dart';
import 'package:alazkar/src/core/utils/app_print.dart';
import 'package:alazkar/src/core/utils/show_toast.dart';
import 'package:alazkar/src/features/quran/data/repository/uthmani_repository.dart';
import 'package:alazkar/src/features/settings/data/repository/settings_storage.dart';
import 'package:alazkar/src/features/ui/data/repository/ui_repo.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
Expand All @@ -18,13 +20,9 @@ Future initServices() async {
WidgetsFlutterBinding.ensureInitialized();
Bloc.observer = AppBlocObserver();

SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(statusBarColor: Colors.transparent),
);
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
service_locator.initSL();

phoneDeviceBars();

if (PlatformExtension.isDesktopOrWeb) {
sqfliteFfiInit();
Expand All @@ -35,26 +33,40 @@ Future initServices() async {

await GetStorage.init(kGetStorageName);

if (PlatformExtension.isDesktop) {
await windowManager.ensureInitialized();
appPrint(SettingsStorage.desktopWindowSize);
final WindowOptions windowOptions = WindowOptions(
size: SettingsStorage.desktopWindowSize,
center: true,
);
windowManager.waitUntilReadyToShow(windowOptions, () async {
await windowManager.setTitleBarStyle(
TitleBarStyle.hidden,
windowButtonVisibility: false,
);
await windowManager.show();
await windowManager.focus();
});
}
initWindowsManager();

// if(kDebugMode) await viewStatistics();
}

Future phoneDeviceBars() async {
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(statusBarColor: Colors.transparent),
);
await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
}

Future initWindowsManager() async {
if (!PlatformExtension.isDesktop) return;

await windowManager.ensureInitialized();

final WindowOptions windowOptions = WindowOptions(
size: sl<UIRepo>().desktopWindowSize,
center: true,
);
await windowManager.waitUntilReadyToShow(windowOptions, () async {
await windowManager.setTitleBarStyle(
TitleBarStyle.hidden,
windowButtonVisibility: false,
);
await windowManager.show();
await windowManager.focus();
});
}

Future initDBs() async {
try {
return Future.wait([
Expand Down
5 changes: 5 additions & 0 deletions alazkar/lib/src/core/constants/const.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,8 @@ const Iterable<int> kArabicDiacriticsChar = [

String kGetStorageName =
PlatformExtension.isDesktop ? "alazkar_storage" : "GetStorage";

const double kFontChangeBy = 2;
const double kFontDefault = 30;
const double kFontMin = 15;
const double kFontMax = 45;
54 changes: 54 additions & 0 deletions alazkar/lib/src/core/di/dependency_injection.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import 'package:alazkar/src/core/constants/const.dart';
import 'package:alazkar/src/core/helpers/bookmarks_helper.dart';
import 'package:alazkar/src/core/manager/volume_button_manager.dart';
import 'package:alazkar/src/features/home/presentation/controller/home/home_bloc.dart';
import 'package:alazkar/src/features/quran/data/repository/uthmani_repository.dart';
import 'package:alazkar/src/features/search/presentation/controller/cubit/search_cubit.dart';
import 'package:alazkar/src/features/settings/data/repository/settings_storage.dart';
import 'package:alazkar/src/features/settings/data/repository/zikr_text_repo.dart';
import 'package:alazkar/src/features/settings/presentation/controller/cubit/settings_cubit.dart';
import 'package:alazkar/src/features/share_as_image/data/repository/share_image_repo.dart';
import 'package:alazkar/src/features/share_as_image/presentation/controller/share_as_image/share_as_image_bloc.dart';
import 'package:alazkar/src/features/theme/domain/repository/theme_storage.dart';
import 'package:alazkar/src/features/theme/presentation/controller/cubit/theme_cubit.dart';
import 'package:alazkar/src/features/ui/data/repository/ui_repo.dart';
import 'package:alazkar/src/features/zikr_content_viewer/presentation/controller/bloc/zikr_content_viewer_bloc.dart';
import 'package:alazkar/src/features/zikr_source_filter/data/repository/zikr_filter_storage.dart';
import 'package:alazkar/src/features/zikr_source_filter/presentation/controller/cubit/zikr_source_filter_cubit.dart';
import 'package:get_it/get_it.dart';
import 'package:get_storage/get_storage.dart';

final sl = GetIt.instance;

Future<void> initSL() async {
///MARK: Init storages
sl.registerLazySingleton(() => GetStorage(kGetStorageName));
sl.registerLazySingleton(() => UIRepo(sl()));
sl.registerLazySingleton(() => ThemeStorage(sl()));
sl.registerLazySingleton(() => ZikrFilterStorage(sl()));
sl.registerLazySingleton(() => SettingsStorage(sl()));
sl.registerLazySingleton(() => ShareAsImageRepo(sl()));
sl.registerLazySingleton(() => ZikrTextRepo(sl()));

///MARK: Init Repo
sl.registerLazySingleton(() => UthmaniRepository());
sl.registerLazySingleton(() => BookmarksDBHelper());

///MARK: Init Manager
sl.registerFactory(() => VolumeButtonManager());

///MARK: Init BLOC
/// Singleton BLoC
sl.registerLazySingleton(() => ThemeCubit(sl(), sl()));
sl.registerLazySingleton(() => HomeBloc(sl(), sl()));
sl.registerLazySingleton(() => SearchCubit(sl(), sl()));
sl.registerLazySingleton(() => SettingsCubit(sl()));
sl.registerLazySingleton(() => ZikrSourceFilterCubit(sl()));

/// Factory BLoC
sl.registerFactory(() => ShareAsImageBloc(sl()));
sl.registerFactory(
() => ZikrContentViewerBloc(sl(), sl(), sl()),
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@ part 'home_state.dart';

class HomeBloc extends Bloc<HomeEvent, HomeState> {
final ZikrSourceFilterCubit zikrSourceFilterCubit;
final ZikrFilterStorage zikrFilterStorage;
late StreamSubscription zikrSourceFilterCubitStram;
HomeBloc({required this.zikrSourceFilterCubit}) : super(HomeLoadingState()) {
HomeBloc(this.zikrSourceFilterCubit, this.zikrFilterStorage)
: super(HomeLoadingState()) {
zikrSourceFilterCubitStram =
zikrSourceFilterCubit.stream.listen(zikrSourceFilterCubitChanged);

Expand All @@ -31,8 +33,6 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
on<HomeBookmarksChangedEvent>(_bookmarksChanged);
on<HomeToggleFilterEvent>(_toggleFreqFilter);
on<HomeFiltersChange>(_handleSettingsFiltersChanges);

add(HomeStartEvent());
}

FutureOr<void> _start(
Expand Down Expand Up @@ -62,7 +62,7 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
.toList();

///
final freq = ZikrFilterStorage.getTitlesFreqFilterStatus();
final freq = zikrFilterStorage.getTitlesFreqFilterStatus();

/// Filters
titlesToSet = await applyFiltersOnTitels(titlesWithBookmarkedData, freq);
Expand Down Expand Up @@ -94,7 +94,7 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
/// Handle titles with no content after applying zikr filters
final List<ZikrTitle> reducedTitles = List.of([]);
final List<Filter> filters =
zikrFilters ?? ZikrFilterStorage.getAllFilters();
zikrFilters ?? zikrFilterStorage.getAllFilters();
for (var i = 0; i < filterdFreqTitles.length; i++) {
final title = filterdFreqTitles[i];
final azkarFromDB = await azkarDBHelper.getContentByTitleId(title.id);
Expand Down Expand Up @@ -203,7 +203,7 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
newFreq,
);

await ZikrFilterStorage.setTitlesFreqFilterStatus(newFreq);
await zikrFilterStorage.setTitlesFreqFilterStatus(newFreq);

emit(
state.copyWith(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ part 'search_state.dart';

class SearchCubit extends Cubit<SearchState> {
final HomeBloc homeBloc;
SearchCubit(this.homeBloc)
final ZikrFilterStorage zikrFilterStorage;
SearchCubit(this.homeBloc, this.zikrFilterStorage)
: super(
const SearchState(
searchText: "",
Expand Down Expand Up @@ -54,7 +55,7 @@ class SearchCubit extends Cubit<SearchState> {
final searchedZikr = await azkarDBHelper.getContentsByName(searchText);

/// Get Filtered Zikr
final List<Filter> filters = ZikrFilterStorage.getAllFilters();
final List<Filter> filters = zikrFilterStorage.getAllFilters();
final filteredZikr = filters.getFilteredZikr(searchedZikr);

// Get Titles with favorites
Expand Down
Original file line number Diff line number Diff line change
@@ -1,55 +1,22 @@
import 'dart:convert';

import 'package:alazkar/src/core/constants/const.dart';
import 'package:alazkar/src/core/utils/app_print.dart';
import 'package:flutter/material.dart';
import 'package:get_storage/get_storage.dart';

class SettingsStorage {
static final _box = GetStorage(kGetStorageName);
final GetStorage _box;
SettingsStorage(this._box);

static const String _settingsPrefixNameKey = "SettingsStorage";

/// Titles Freq filters
/// showTextInBrackets
static const String _showTextInBrackets =
"${_settingsPrefixNameKey}showTextInBrackets";

/// Filters for zikr source
static bool showTextInBrackets() {
bool showTextInBrackets() {
final bool? data = _box.read(_showTextInBrackets);

return data ?? true;
}

/// Filters for zikr source
static Future setShowTextInBrackets(bool showTextInBrackets) async {
Future setShowTextInBrackets(bool showTextInBrackets) async {
return _box.write(_showTextInBrackets, showTextInBrackets);
}

///* ******* desktop Window Size ******* */
static const String desktopWindowSizeKey = "desktopWindowSize";
static Size? get desktopWindowSize {
try {
final data =
jsonDecode(_box.read(desktopWindowSizeKey) as String? ?? "{}")
as Map<String, dynamic>;

final double width = (data['width'] as num).toDouble();
final double height = (data['height'] as num).toDouble();

return Size(width, height);
} catch (e) {
appPrint(e);
}
return const Size(400, 800);
}

static Future<void> changeDesktopWindowSize(Size value) async {
final screenSize = {
'width': value.width,
'height': value.height,
};
final String data = jsonEncode(screenSize);
return _box.write(desktopWindowSizeKey, data);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:alazkar/src/core/constants/const.dart';
import 'package:get_storage/get_storage.dart';

class ZikrTextRepo {
final GetStorage box;
ZikrTextRepo(this.box);

///MARK: Font
/* ******* Font Size ******* */
static const String fontSizeKey = 'ThemeFontSize';
double get fontSize => box.read<double>(fontSizeKey) ?? kFontDefault;

Future<void> changFontSize(double value) async {
final double tempValue = value.clamp(kFontMin, kFontMax);
await box.write(fontSizeKey, tempValue);
}

void resetFontSize() {
changFontSize(kFontDefault);
}

void increaseFontSize() {
changFontSize(fontSize + kFontChangeBy);
}

void decreaseFontSize() {
changFontSize(fontSize - kFontChangeBy);
}

/* ******* Diacritics ******* */

bool get showDiacritics => box.read('showDiacritics') ?? true;

Future<void> changDiacriticsStatus({required bool value}) async =>
box.write('tashkel_status', value);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,17 @@ import 'package:equatable/equatable.dart';
part 'settings_state.dart';

class SettingsCubit extends Cubit<SettingsState> {
SettingsCubit()
final SettingsStorage settingsStorage;
SettingsCubit(this.settingsStorage)
: super(
SettingsState(
showTextInBrackets: SettingsStorage.showTextInBrackets(),
showTextInBrackets: settingsStorage.showTextInBrackets(),
),
);

Future toggleShowTextInBrackets() async {
final bool showTextInBrackets = !state.showTextInBrackets;
await SettingsStorage.setShowTextInBrackets(showTextInBrackets);
await settingsStorage.setShowTextInBrackets(showTextInBrackets);
emit(state.copyWith(showTextInBrackets: showTextInBrackets));
}
}
Loading

0 comments on commit ae5d60a

Please sign in to comment.