refactor: proper layer archtecture

This commit is contained in:
idubnori
2025-12-10 01:06:07 +09:00
parent f874c12bee
commit 7473b959dc
12 changed files with 392 additions and 176 deletions
@@ -1,53 +1,51 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:immich_mobile/providers/app_settings.provider.dart';
import 'package:immich_mobile/services/app_settings.service.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/services/quick_action.service.dart';
import 'package:immich_mobile/infrastructure/repositories/action_button_order.repository.dart';
import 'package:immich_mobile/utils/action_button.utils.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'viewer_quick_action_order.provider.g.dart';
final actionButtonOrderRepositoryProvider = Provider<ActionButtonOrderRepository>(
(ref) => const ActionButtonOrderRepository(),
);
@Riverpod(keepAlive: true)
class ViewerQuickActionOrder extends _$ViewerQuickActionOrder {
final quickActionServiceProvider = Provider<QuickActionService>(
(ref) => QuickActionService(ref.watch(actionButtonOrderRepositoryProvider)),
);
final viewerQuickActionOrderProvider = StateNotifierProvider<ViewerQuickActionOrderNotifier, List<ActionButtonType>>(
(ref) => ViewerQuickActionOrderNotifier(ref.watch(quickActionServiceProvider)),
);
class ViewerQuickActionOrderNotifier extends StateNotifier<List<ActionButtonType>> {
final QuickActionService _service;
StreamSubscription<List<ActionButtonType>>? _subscription;
ViewerQuickActionOrderNotifier(this._service) : super(_service.get()) {
_subscription = _service.watch().listen((order) {
state = order;
});
}
@override
List<ActionButtonType> build() {
final service = ref.watch(appSettingsServiceProvider);
final initial = ActionButtonBuilder.normalizeQuickActionOrder(
service.getSetting(AppSettingsEnum.viewerQuickActionOrder),
);
_subscription ??= service.watchSetting(AppSettingsEnum.viewerQuickActionOrder).listen((order) {
state = ActionButtonBuilder.normalizeQuickActionOrder(order);
});
ref.onDispose(() {
_subscription?.cancel();
_subscription = null;
});
return initial;
void dispose() {
_subscription?.cancel();
super.dispose();
}
Future<void> setOrder(List<ActionButtonType> order) async {
final normalized = ActionButtonBuilder.normalizeQuickActionOrder(order);
if (listEquals(state, normalized)) {
if (listEquals(state, order)) {
return;
}
final previous = state;
state = normalized;
state = order;
try {
await ref.read(appSettingsServiceProvider).setSetting(AppSettingsEnum.viewerQuickActionOrder, normalized);
await _service.set(order);
} catch (error) {
state = previous;
rethrow;
}
}
}
/// Mock class for testing
abstract class ViewerQuickActionOrderInternal extends _$ViewerQuickActionOrder {}
@@ -1,27 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'viewer_quick_action_order.provider.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$viewerQuickActionOrderHash() =>
r'd539bc6ba5fae4fa07a7c30c42d9f6aee1488f97';
/// See also [ViewerQuickActionOrder].
@ProviderFor(ViewerQuickActionOrder)
final viewerQuickActionOrderProvider =
NotifierProvider<ViewerQuickActionOrder, List<ActionButtonType>>.internal(
ViewerQuickActionOrder.new,
name: r'viewerQuickActionOrderProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$viewerQuickActionOrderHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$ViewerQuickActionOrder = Notifier<List<ActionButtonType>>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package