Skip to content

Commit

Permalink
Refactor for improved code readability (#10)
Browse files Browse the repository at this point in the history
* Refactor

* Remove useless Interface
  • Loading branch information
yu6hooke authored Mar 25, 2024
1 parent be26083 commit 9312662
Show file tree
Hide file tree
Showing 10 changed files with 80 additions and 84 deletions.
64 changes: 57 additions & 7 deletions lib/core/data/repository/todo/todo_repository.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,66 @@
import 'package:collection/collection.dart';
import 'package:flutter_architecture_blueprint/core/data/network/fake_todo_api_client.dart';
import 'package:flutter_architecture_blueprint/core/model/user_task.dart';

import 'package:flutter_architecture_blueprint/core/util/stream_extensions.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:rxdart/subjects.dart';

part 'todo_repository.freezed.dart';

abstract class TodoRepository {
Stream<List<UserTask>> get taskList;
final todoRepositoryProvider = Provider<TodoRepository>(
(ref) => TodoRepository(ref.read(todoApiClient)),
);

class TodoRepository {
TodoRepository(FakeTodoApiClient apiClient) : _apiClient = apiClient;

final FakeTodoApiClient _apiClient;
final _taskList = BehaviorSubject<List<UserTask>>.seeded([]);

Stream<List<UserTask>> get taskList => _taskList.stream;

Future<void> fetchTaskList() async {
try {
final taskList = await _apiClient.getTaskList();
_taskList.add(taskList);
} on Exception catch (e) {
throw TodoRepositoryException.other(e);
}
}

Future<void> addTask({required UserTask task}) async {
try {
await _apiClient.postTask(task: task);
_taskList.update((value) => value.appending(task));
} on Exception catch (e) {
throw TodoRepositoryException.other(e);
}
}

Future<void> updateTask({required UserTask task}) async {
if (_taskList.value.none((t) => t.id == task.id)) {
throw const TodoRepositoryException.taskNotFound();
}
try {
await _apiClient.patchTask(task: task);
_taskList.update((value) => value.replaced(task));
} on Exception catch (e) {
throw TodoRepositoryException.other(e);
}
}

Future<void> fetchTaskList();
Future<void> addTask({required UserTask task});
Future<void> updateTask({required UserTask task});
Future<void> removeTask({required String id});
Future<void> removeTask({required String id}) async {
if (_taskList.value.none((t) => t.id == id)) {
throw const TodoRepositoryException.taskNotFound();
}
try {
await _apiClient.deleteTask(id: id);
_taskList.update((value) => value.deletedBy(id));
} on Exception catch (e) {
throw TodoRepositoryException.other(e);
}
}
}

@freezed
Expand Down
67 changes: 0 additions & 67 deletions lib/core/data/repository/todo/todo_repository_impl.dart

This file was deleted.

7 changes: 4 additions & 3 deletions lib/core/domain/todo/edit_task_usecase.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'package:flutter_architecture_blueprint/core/data/repository/todo/todo_repository.dart'
as todo_repository;
import 'package:flutter_architecture_blueprint/core/data/repository/todo/todo_repository_impl.dart';
import 'package:flutter_architecture_blueprint/core/domain/model/editable_user_task.dart';
import 'package:flutter_architecture_blueprint/core/util/alert_state.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
Expand All @@ -10,7 +9,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
part 'edit_task_usecase.freezed.dart';

final editTaskUseCaseProvider = Provider.autoDispose((ref) {
return EditTaskUseCase(ref.watch(todoRepositoryProvider));
return EditTaskUseCase(ref.watch(todo_repository.todoRepositoryProvider));
});

class EditTaskUseCase {
Expand Down Expand Up @@ -59,7 +58,9 @@ class EditTaskUseCase {
}

@freezed
sealed class EditTaskUseCaseException with _$EditTaskUseCaseException {
sealed class EditTaskUseCaseException
with _$EditTaskUseCaseException
implements Exception {
const factory EditTaskUseCaseException.alert({
required AlertState state,
}) = Alert;
Expand Down
7 changes: 4 additions & 3 deletions lib/core/domain/todo/task_list_usecase.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'package:flutter_architecture_blueprint/core/data/repository/todo/todo_repository.dart'
as todo_repository;
import 'package:flutter_architecture_blueprint/core/data/repository/todo/todo_repository_impl.dart';
import 'package:flutter_architecture_blueprint/core/domain/model/editable_user_task.dart';
import 'package:flutter_architecture_blueprint/core/util/alert_state.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
Expand All @@ -9,7 +8,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
part 'task_list_usecase.freezed.dart';

final taskListUseCaseProvider = Provider.autoDispose((ref) {
return TaskListUseCase(ref.watch(todoRepositoryProvider));
return TaskListUseCase(ref.watch(todo_repository.todoRepositoryProvider));
});

class TaskListUseCase {
Expand All @@ -34,7 +33,9 @@ class TaskListUseCase {
}

@freezed
sealed class TaskListUseCaseException with _$TaskListUseCaseException {
sealed class TaskListUseCaseException
with _$TaskListUseCaseException
implements Exception {
const factory TaskListUseCaseException.alert({
required AlertState state,
}) = Alert;
Expand Down
9 changes: 7 additions & 2 deletions lib/feature/todo/edit_task/edit_task_notifier.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ import 'edit_task_contract.dart';
part 'edit_task_notifier.g.dart';

final editTaskArgsProvider =
StateProvider<EditableUserTask>((_) => throw UnimplementedError());

StateProvider<EditableUserTask>((ref) => throw UnimplementedError());
final editTaskEffectProvider =
StateProvider((ref) => const EditTaskEffect.none());

Expand All @@ -37,12 +36,16 @@ class EditTaskNotifier extends _$EditTaskNotifier implements EditTaskContract {
switch (action) {
case OnTitleChanged():
state = state.copyWith.item(title: action.newValue);

case OnDescriptionChanged():
state = state.copyWith.item(description: action.newValue);

case CompleteButtonTapped():
state = state.copyWith.item(isCompleted: true);

case UncompleteButtonTapped():
state = state.copyWith.item(isCompleted: false);

case AddButtonTapped():
assert(state.isSubmitButtonEnabled);
assert(state.isNewTask);
Expand All @@ -52,6 +55,7 @@ class EditTaskNotifier extends _$EditTaskNotifier implements EditTaskContract {
} on edit_task.Alert catch (e) {
_updateEffect(EditTaskEffect.showAlert(state: e.state));
}

case UpdateButtonTapped():
assert(state.isSubmitButtonEnabled);
assert(!state.isNewTask);
Expand All @@ -62,6 +66,7 @@ class EditTaskNotifier extends _$EditTaskNotifier implements EditTaskContract {
} on edit_task.Alert catch (e) {
_updateEffect(EditTaskEffect.showAlert(state: e.state));
}

case DeleteButtonTapped():
assert(!state.isNewTask);
try {
Expand Down
2 changes: 2 additions & 0 deletions lib/feature/todo/edit_task/edit_task_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,11 @@ class _EditTaskPage extends HookConsumerWidget with AlertStateCompatible {
switch (effect) {
case None():
break;

case Close():
ref.notifier.consume();
context.router.back();

case ShowAlert():
ref.notifier.consume();
handleAlertState(context, effect.state);
Expand Down
4 changes: 4 additions & 0 deletions lib/feature/todo/task_list/task_list_notifier.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,20 @@ class TaskListNotifier extends _$TaskListNotifier implements TaskListContract {
} on task_list.Alert catch (e) {
_updateEffect(TaskListEffect.showAlert(state: e.state));
}

case NewTaskButtonTapped():
_updateEffect(const TaskListEffect.goDetail(task: null));

case TaskTapped():
_updateEffect(TaskListEffect.goDetail(task: action.task));

case ToggleIsCompleted():
try {
await _editTaskUseCase.toggleIsCompleted(action.task);
} on edit_task.Alert catch (e) {
_updateEffect(TaskListEffect.showAlert(state: e.state));
}

case OnTaskSwiped():
try {
await _editTaskUseCase.deleteTask(id: action.task.id);
Expand Down
2 changes: 2 additions & 0 deletions lib/feature/todo/task_list/task_list_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,11 @@ class TaskListPage extends HookConsumerWidget with AlertStateCompatible {
switch (effect) {
case None():
break;

case GoDetail():
ref.notifier.consume();
context.router.push(EditTaskRoute(task: effect.task));

case ShowAlert():
ref.notifier.consume();
handleAlertState(context, effect.state);
Expand Down
1 change: 0 additions & 1 deletion test/todo/edit_task_notifier_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import 'package:collection/collection.dart';
import 'package:fake_async/fake_async.dart';
import 'package:flutter_architecture_blueprint/core/data/repository/todo/fake_todo_repository.dart';
import 'package:flutter_architecture_blueprint/core/data/repository/todo/todo_repository.dart';
import 'package:flutter_architecture_blueprint/core/data/repository/todo/todo_repository_impl.dart';
import 'package:flutter_architecture_blueprint/core/domain/model/editable_user_task.dart';
import 'package:flutter_architecture_blueprint/core/util/alert_state.dart';
import 'package:flutter_architecture_blueprint/core/util/stream_extensions.dart';
Expand Down
1 change: 0 additions & 1 deletion test/todo/task_list_notifier_test.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:collection/collection.dart';
import 'package:flutter_architecture_blueprint/core/data/repository/todo/fake_todo_repository.dart';
import 'package:flutter_architecture_blueprint/core/data/repository/todo/todo_repository.dart';
import 'package:flutter_architecture_blueprint/core/data/repository/todo/todo_repository_impl.dart';
import 'package:flutter_architecture_blueprint/core/domain/model/editable_user_task.dart';
import 'package:flutter_architecture_blueprint/core/model/user_task.dart';
import 'package:flutter_architecture_blueprint/core/util/alert_state.dart';
Expand Down

0 comments on commit 9312662

Please sign in to comment.