Skip to content

Commit 4477068

Browse files
committed
feat: store history in local sqlite database
1 parent 6908ae6 commit 4477068

24 files changed

+1817
-22
lines changed

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"request": "launch",
2929
"type": "dart",
3030
"program": "lib/main_production.dart",
31-
"args": ["--flavor", "production", "--target", "lib/main_production.dart"]
31+
"args": ["--flavor", "production", "--target", "lib/main_production.dart", "--release", "--verbose"]
3232
}
3333
]
3434
}

build.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ targets:
44
drift_dev:
55
options:
66
# Use ISO 8601 strings
7-
store_date_time_values_as_text: true
7+
store_date_time_values_as_text: true
8+
sqlite_modules:
9+
- fts5
10+
- json1

lib/app/view/app.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,25 @@ import 'package:qack/presentation/settings/bloc/settings_bloc.dart';
1212
import 'package:qack/presentation/settings/respository/settings_repository.dart';
1313
import 'package:qack/theme/colors.dart';
1414
import 'package:qack/theme/themes/light_theme.dart';
15+
import 'package:qack/utils/database/database.dart';
1516

1617
class App extends StatelessWidget {
1718
const App({
1819
required this.secureStorage,
1920
required this.settingsBloc,
21+
required this.appDatabase,
2022
super.key,
2123
});
2224

2325
final FlutterSecureStorage secureStorage;
2426
final SettingsBloc settingsBloc;
27+
final AppDatabase appDatabase;
2528

2629
@override
2730
Widget build(BuildContext context) {
2831
return MultiRepositoryProvider(
2932
providers: [
33+
RepositoryProvider(create: (context) => appDatabase),
3034
RepositoryProvider(
3135
create: (context) => SettingsRepository(
3236
storage: secureStorage,
@@ -54,6 +58,7 @@ class _App extends StatelessWidget {
5458
create: (context) => HomeBloc(
5559
homeRepository: context.read<HomeRepository>(),
5660
settingsBloc: settingsBloc,
61+
appDatabase: context.read<AppDatabase>(),
5762
),
5863
),
5964
BlocProvider(create: (context) => BottomNavigationBarCubit()),
@@ -77,8 +82,7 @@ class _AppViewState extends State<AppView> {
7782
Widget build(BuildContext context) {
7883
const theme = LightTheme();
7984
return Listener(
80-
onPointerDown: (_) =>
81-
WidgetsBinding.instance.focusManager.primaryFocus?.unfocus(),
85+
onPointerDown: (_) => FocusManager().primaryFocus?.unfocus(),
8286
child: MaterialApp(
8387
debugShowCheckedModeBanner: false,
8488
theme: ThemeData(

lib/bootstrap.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:http_client/http_client.dart';
99
import 'package:qack/constants/key_name.dart';
1010
import 'package:qack/presentation/settings/bloc/settings_bloc.dart';
1111
import 'package:qack/presentation/settings/respository/settings_repository.dart';
12+
import 'package:qack/utils/database/database.dart';
1213
import 'package:sentry_flutter/sentry_flutter.dart';
1314

1415
class AppBlocObserver extends BlocObserver {
@@ -37,6 +38,7 @@ Future<void> bootstrap(
3738
FutureOr<Widget> Function(
3839
FlutterSecureStorage secureStorage,
3940
SettingsBloc settingsBloc,
41+
AppDatabase appDatabase,
4042
) builder,
4143
) async {
4244
FlutterError.onError = (details) {
@@ -49,7 +51,7 @@ Future<void> bootstrap(
4951
};
5052

5153
// Initialize local storage repository
52-
// final localStorage = LocalStorage(sharedPreferences);
54+
final appDatabase = AppDatabase();
5355

5456
final secureStorageBinding = span.startChild(
5557
'retrieve secure storage values',
@@ -88,5 +90,5 @@ Future<void> bootstrap(
8890

8991
Bloc.observer = const AppBlocObserver();
9092

91-
runApp(await builder(secureStorage, settingsBloc));
93+
runApp(await builder(secureStorage, settingsBloc, appDatabase));
9294
}

lib/gen/assets.gen.dart

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/main_development.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:qack/app/view/app.dart';
44
import 'package:qack/bootstrap.dart';
55
import 'package:qack/constants/key_name.dart';
66
import 'package:qack/presentation/settings/bloc/settings_bloc.dart';
7+
import 'package:qack/utils/database/database.dart';
78
import 'package:sentry_flutter/sentry_flutter.dart';
89

910
Future<void> main() async {
@@ -32,10 +33,12 @@ Future<void> main() async {
3233
await bootstrap(transaction, (
3334
FlutterSecureStorage secureStorage,
3435
SettingsBloc settingsBloc,
36+
AppDatabase appDatabase,
3537
) async {
3638
return App(
3739
secureStorage: secureStorage,
3840
settingsBloc: settingsBloc,
41+
appDatabase: appDatabase,
3942
);
4043
});
4144
} catch (exception) {

lib/main_production.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:qack/app/view/app.dart';
44
import 'package:qack/bootstrap.dart';
55
import 'package:qack/constants/constants.dart';
66
import 'package:qack/presentation/settings/bloc/settings_bloc.dart';
7+
import 'package:qack/utils/database/database.dart';
78
import 'package:sentry_flutter/sentry_flutter.dart';
89

910
Future<void> main() async {
@@ -31,10 +32,12 @@ Future<void> main() async {
3132
await bootstrap(transaction, (
3233
FlutterSecureStorage secureStorage,
3334
SettingsBloc settingsBloc,
35+
AppDatabase appDatabase,
3436
) async {
3537
return App(
3638
secureStorage: secureStorage,
3739
settingsBloc: settingsBloc,
40+
appDatabase: appDatabase,
3841
);
3942
});
4043
} catch (exception) {

lib/main_staging.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:qack/app/view/app.dart';
44
import 'package:qack/bootstrap.dart';
55
import 'package:qack/constants/constants.dart';
66
import 'package:qack/presentation/settings/bloc/settings_bloc.dart';
7+
import 'package:qack/utils/database/database.dart';
78
import 'package:sentry_flutter/sentry_flutter.dart';
89

910
Future<void> main() async {
@@ -31,10 +32,12 @@ Future<void> main() async {
3132
await bootstrap(transaction, (
3233
FlutterSecureStorage secureStorage,
3334
SettingsBloc settingsBloc,
35+
AppDatabase appDatabase,
3436
) async {
3537
return App(
3638
secureStorage: secureStorage,
3739
settingsBloc: settingsBloc,
40+
appDatabase: appDatabase,
3841
);
3942
});
4043
} catch (exception) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import 'package:bloc/bloc.dart';
2+
import 'package:equatable/equatable.dart';
3+
import 'package:freezed_annotation/freezed_annotation.dart';
4+
import 'package:qack/presentation/history/models/history.dart';
5+
import 'package:qack/presentation/history/repositories/repositories.dart';
6+
7+
part 'history_event.dart';
8+
part 'history_state.dart';
9+
10+
class HistoryBloc extends Bloc<HistoryEvent, HistoryState> {
11+
HistoryBloc(this.historyRepository) : super(const HistoryState()) {
12+
on<HistoryFetched>(_onHistoryFetched);
13+
}
14+
final HistoryRepository historyRepository;
15+
16+
Future<void> _onHistoryFetched(
17+
HistoryFetched event,
18+
Emitter<HistoryState> emit,
19+
) async {
20+
try {
21+
emit(state.loading());
22+
// Fetch history from the database
23+
final history = await historyRepository.fetchTranslationHistory();
24+
emit(state.success(history));
25+
} on Exception catch (e) {
26+
emit(state.error(e));
27+
}
28+
}
29+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
part of 'history_bloc.dart';
2+
3+
@immutable
4+
sealed class HistoryEvent extends Equatable {
5+
const HistoryEvent();
6+
7+
@override
8+
List<Object?> get props => [];
9+
}
10+
11+
final class HistoryFetched extends HistoryEvent {
12+
const HistoryFetched();
13+
14+
@override
15+
List<Object?> get props => [];
16+
}
17+
18+
final class HistoryDeleted extends HistoryEvent {
19+
const HistoryDeleted(this.historyId);
20+
final int historyId;
21+
22+
@override
23+
List<Object?> get props => [historyId];
24+
}

0 commit comments

Comments
 (0)