Skip to content

Commit

Permalink
Merge branch 'main' into main-analytics
Browse files Browse the repository at this point in the history
  • Loading branch information
Luis Ciber committed Sep 27, 2021
2 parents 57911fe + 8446be1 commit 7c9ec79
Show file tree
Hide file tree
Showing 25 changed files with 518 additions and 112 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ run:

.PHONY: build
build:
flutter build apk --flavor production --target lib/main_production.dart
flutter build apk --flavor production --target lib/main_production.dart --target-platform=android-arm

.PHONY: run-prod
run-prod:
flutter run --flavor production --target lib/main_production.dart

.PHONY: build-dev
build-dev:
flutter build apk --flavor development --target lib/main_development.dart
flutter build apk --flavor development --target lib/main_development.dart --target-platform=android-arm

.PHONY: splash
splash:
Expand Down
25 changes: 17 additions & 8 deletions file_structure.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ lib/
│   │   │   │   │   │   ├── http_browser_adapter.dart
│   │   │   │   │   │   ├── http_native_adapter.dart
│   │   │   │   │   │   └── http_stub_adapter.dart
│   │   │   │   │   └── http_client.dart
│   │   │   │   │   ├── http_client.dart
│   │   │   │   │   └── http_logger.dart
│   │   │   │   ├── platform_channels.dart
│   │   │   │   └── platform.dart
│   │   │   ├── result
Expand All @@ -40,6 +41,7 @@ lib/
│   │   │   ├── ussd_assets_datasource.dart
│   │   │   ├── ussd.dart
│   │   │   ├── ussd_local_datasource.dart
│   │   │   ├── ussd_recent_datasource.dart
│   │   │   └── ussd_remote_datasource.dart
│   │   ├── models
│   │   │   ├── models.dart
Expand Down Expand Up @@ -100,20 +102,27 @@ lib/
├── settings
│   ├── bloc
│   │   ├── bloc.dart
│   │   └── settings
│   │   ├── settings_bloc.dart
│   │   ├── settings_bloc.freezed.dart
│   │   ├── settings_event.dart
│   │   └── settings_state.dart
│   │   ├── settings
│   │   │   ├── settings_bloc.dart
│   │   │   ├── settings_bloc.freezed.dart
│   │   │   ├── settings_event.dart
│   │   │   └── settings_state.dart
│   │   └── update_ussd
│   │   ├── update_ussd_bloc.dart
│   │   ├── update_ussd_bloc.freezed.dart
│   │   ├── update_ussd_event.dart
│   │   └── update_ussd_state.dart
│   ├── router
│   │   ├── disclaimer_page.dart
│   │   ├── router.dart
│   │   ├── settings_location.dart
│   │   └── settings_page.dart
│   │   ├── settings_page.dart
│   │   └── update_ussd_page.dart
│   ├── settings.dart
│   ├── view
│   │   ├── disclaimer_view.dart
│   │   ├── settings_view.dart
│   │   ├── update_ussd_view.dart
│   │   └── view.dart
│   └── widgets
│   ├── settings_button.dart
Expand Down Expand Up @@ -143,4 +152,4 @@ lib/
├── ussd_item_widget.dart
└── widgets.dart

41 directories, 102 files
42 directories, 110 files
45 changes: 28 additions & 17 deletions lib/app/app_router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:beamer/beamer.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:todo/app/app.dart';
import 'package:todo/app/bloc/bloc.dart';
import 'package:todo/app/theme/theme.dart';
import 'package:todo/home/home.dart';
Expand All @@ -14,23 +15,33 @@ class AppRouter extends StatelessWidget {

@override
Widget build(BuildContext context) {
return BlocBuilder<ThemeBloc, ThemeState>(
builder: (context, themeState) {
return MaterialApp.router(
title: 'TODO',
theme: lightTheme,
darkTheme: darkTheme,
themeMode: themeState.themeMode,
routeInformationParser: BeamerParser(),
routerDelegate: routerDelegate,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
debugShowCheckedModeBanner: false,
);
},
return MultiBlocProvider(
providers: [
BlocProvider<UssdCodeBloc>(
create: (context) => getIt(),
),
BlocProvider<ThemeBloc>(
create: (context) => getIt(),
),
],
child: BlocBuilder<ThemeBloc, ThemeState>(
builder: (context, themeState) {
return MaterialApp.router(
title: 'TODO',
theme: lightTheme,
darkTheme: darkTheme,
themeMode: themeState.themeMode,
routeInformationParser: BeamerParser(),
routerDelegate: routerDelegate,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
debugShowCheckedModeBanner: false,
);
},
),
);
}

Expand Down
1 change: 1 addition & 0 deletions lib/app/data/datasources/ussd/ussd.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export 'ussd_assets_datasource.dart';
export 'ussd_local_datasource.dart';
export 'ussd_recent_datasource.dart';
export 'ussd_remote_datasource.dart';
14 changes: 13 additions & 1 deletion lib/app/data/datasources/ussd/ussd_local_datasource.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ class UssdLocalDatasource {

final SharedPreferences _storage;

Future<int?> getDay() async {
return _storage.getInt('day');
}

Future<void> updateDay() async {
await _storage.setInt('day', DateTime.now().day);
}

Future<List<UssdItem>> getUssdCodes() async {
final jsonString = _storage.getString(USSD_CODES_KEY);

Expand All @@ -35,6 +43,8 @@ class UssdLocalDatasource {
}

Future<void> saveUssdCodes(List<UssdItem> items, String hash) async {
await updateDay();

final data = json.encode({
'items': items.map((e) {
if (e.type == 'code') {
Expand All @@ -45,6 +55,8 @@ class UssdLocalDatasource {
}).toList()
});

_storage..setString(USSD_CODES_KEY, data)..setString(USSD_CODES_HASH, hash);
_storage
..setString(USSD_CODES_KEY, data)
..setString(USSD_CODES_HASH, hash);
}
}
71 changes: 71 additions & 0 deletions lib/app/data/datasources/ussd/ussd_recent_datasource.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import 'dart:convert';

import 'package:injectable/injectable.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:todo/app/app.dart';

const USSD_CODES_RECENT_KEY = 'recent_codes';

@injectable
class UssdRecentDatasource {
const UssdRecentDatasource(this._storage);

final SharedPreferences _storage;

Future<List<UssdItem>> getUssdCodes() async {
final jsonString = _storage.getString(USSD_CODES_RECENT_KEY);

if (jsonString != null) {
final parsedJson = await parseJson(jsonString);

parsedJson['name'] = '';
parsedJson['description'] = '';
parsedJson['icon'] = '';
parsedJson['type'] = 'category';

return UssdCategory.fromJson(parsedJson).items;
} else {
return [];
}
}

Future<List<UssdItem>> putUssdItem(UssdItem item) async {
final codes = (await getUssdCodes()).reversed.toList();

var itemIndex = -1;

for (var i = 0; i < codes.length; i++) {
final e = codes[i];
if (e.key == item.key) {
itemIndex = i;
break;
}
}

if (itemIndex >= 0) {
codes.removeAt(itemIndex);
}

if (codes.length >= 8) {
codes.remove(codes.first);
}

codes.add(item);

final result = codes.reversed.toList();

final data = json.encode({
'items': result.map((e) {
if (e.type == 'code') {
return (e as UssdCode).toJson();
} else if (e.type == 'category') {
return (e as UssdCategory).toJson();
}
}).toList()
});

await _storage.setString(USSD_CODES_RECENT_KEY, data);

return result;
}
}
2 changes: 2 additions & 0 deletions lib/app/data/models/ussd/ussd_item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ abstract class UssdItem extends Equatable {
final String icon;
final String type;

String get key => '$name-$description';

@override
List<Object> get props => [
name,
Expand Down
48 changes: 45 additions & 3 deletions lib/app/data/repositories/ussd_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,44 @@ class UssdRepository {
this._assetsDatasource,
this._localDatasource,
this._remoteDatasource,
this._recentDatasource,
);

final UssdAssetsDatasource _assetsDatasource;
final UssdLocalDatasource _localDatasource;
final UssdRemoteDatasource _remoteDatasource;
final UssdRecentDatasource _recentDatasource;

Future<Result<List<UssdItem>>> getUssdCodes() async {
try {
final ussdItems = await _localDatasource.getUssdCodes();
final lastDay = await _localDatasource.getDay();
final actualDay = DateTime.now().day;

return Result.success(data: ussdItems);
if (lastDay != actualDay) {
return getUssdCodesRemote();
} else {
final ussdItems = await _localDatasource.getUssdCodes();

return Result.success(data: ussdItems);
}
} on UssdCodesServerException {
try {
final ussdItems = await _localDatasource.getUssdCodes();

return Result.success(data: ussdItems);
} on UssdCodesCacheException {
try {
final ussdItems = await _assetsDatasource.getUssdCodes();

await _localDatasource.saveUssdCodes(ussdItems, '');

return Result.success(data: ussdItems);
} on Exception {
return const Result.error(
message: 'Error al cargar los códigos ussd',
);
}
}
} on UssdCodesCacheException {
try {
final ussdItems = await _assetsDatasource.getUssdCodes();
Expand All @@ -26,7 +53,9 @@ class UssdRepository {

return Result.success(data: ussdItems);
} on Exception {
return const Result.error(message: 'Error al cargar los códigos ussd');
return const Result.error(
message: 'Error al cargar los códigos ussd',
);
}
}
}
Expand All @@ -44,6 +73,7 @@ class UssdRepository {
return Result.success(data: remoteCodes);
} else {
final localCodes = await _localDatasource.getUssdCodes();
await _localDatasource.updateDay();

return Result.success(data: localCodes);
}
Expand All @@ -57,4 +87,16 @@ class UssdRepository {
);
}
}

Future<Result<List<UssdItem>>> getUssdCodesRecent() async {
final ussdItems = await _recentDatasource.getUssdCodes();

return Result.success(data: ussdItems);
}

Future<Result<List<UssdItem>>> putRecentUssdItem(UssdItem item) async {
final ussdItems = await _recentDatasource.putUssdItem(item);

return Result.success(data: ussdItems);
}
}
18 changes: 11 additions & 7 deletions lib/app/dependencies/dependencies.config.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion lib/app/widgets/app_tab_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class AppTabBar extends StatelessWidget {
height: 64,
width: 68,
child: Icon(
Icons.data_usage_rounded,
Icons.history,
size: 38,
),
),
Expand Down
Loading

0 comments on commit 7c9ec79

Please sign in to comment.