## 收藏(Gitea #42~#45) - `FetchFavoritesRequest` / `DeleteFavoriteRequest`:ApiRequestable,对齐 iOS FavouriteService - `FetchFavoritesUseCase`:GET 分页拉取 → upsert FavoriteRepository - `DeleteFavoriteUseCase`:POST delete → 同步删本地 DB - `FavoritesViewModel`:分页/刷新/加载更多/删除,DB Stream 驱动 - `FavoritesPage`:列表 + RefreshIndicator + Dismissible 左滑删除 + 类型图标 + 空状态 - `AppRouteName.settingsFavorites` + 路由注册 + auth guard - `settings_page.dart` 收藏行 onTap 接入导航 ## 最近呼叫(框架,API 对接待续) - `CallLogRequest` / `FetchCallLogsUseCase` / `RecentCallsViewModel` - `RecentCallsPage`:双 Tab(全部/未接)+ _CallLogTile(图标/时长/时间) - `AppRouteName.settingsRecentCalls` + 路由注册 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
98 lines
4.4 KiB
Dart
98 lines
4.4 KiB
Dart
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||
|
||
import 'package:im_app/app/di/network_provider.dart';
|
||
import 'package:im_app/app/di/db_provider.dart';
|
||
import 'package:im_app/core/services/socket_manager.dart';
|
||
import 'package:im_app/features/login/di/auth_providers.dart';
|
||
import 'package:im_app/features/app_tab/di/favorite_provider.dart';
|
||
import 'package:im_app/data/repositories/call_log_repository_impl.dart';
|
||
import 'package:im_app/domain/repositories/call_log_repository.dart';
|
||
import 'package:im_app/features/settings/usecases/set_theme_usecase.dart';
|
||
import 'package:im_app/features/settings/usecases/fetch_profile_usecase.dart';
|
||
import 'package:im_app/features/settings/usecases/fetch_call_logs_usecase.dart';
|
||
import 'package:im_app/features/settings/usecases/logout_usecase.dart';
|
||
import 'package:im_app/features/settings/usecases/update_profile_usecase.dart';
|
||
import 'package:im_app/features/settings/usecases/fetch_favorites_use_case.dart';
|
||
import 'package:im_app/features/settings/usecases/delete_favorite_use_case.dart';
|
||
import 'package:im_app/features/settings/presentation/favorites_view_model.dart';
|
||
|
||
/// Settings feature DI 装配
|
||
///
|
||
/// ```
|
||
/// SettingsViewModel
|
||
/// → fetchProfileUseCaseProvider → GET /app/api/user/profile
|
||
/// → logoutUseCaseProvider → POST /app/api/auth/logout + WS + DB
|
||
///
|
||
/// EditProfileViewModel
|
||
/// → updateProfileUseCaseProvider → POST /app/api/user/update-profile
|
||
///
|
||
/// ThemeViewModel
|
||
/// → setThemeUseCaseProvider → ThemeModeNotifier(内存 + 持久化 TODO)
|
||
/// ```
|
||
|
||
// ── Theme ─────────────────────────────────────────────────────────────────────
|
||
|
||
/// 设置主题用例 Provider
|
||
final setThemeUseCaseProvider = Provider<SetThemeUseCase>(
|
||
(_) => const SetThemeUseCase(),
|
||
);
|
||
|
||
// ── Profile ────────────────────────────────────────────────────────────────────
|
||
|
||
/// 获取当前用户资料用例 Provider
|
||
final fetchProfileUseCaseProvider = Provider<FetchProfileUseCase>((ref) {
|
||
return FetchProfileUseCase(client: ref.read(networkSdkApiProvider));
|
||
});
|
||
|
||
/// 更新用户资料用例 Provider
|
||
final updateProfileUseCaseProvider = Provider<UpdateProfileUseCase>((ref) {
|
||
return UpdateProfileUseCase(client: ref.read(networkSdkApiProvider));
|
||
});
|
||
|
||
// ── Favorites ─────────────────────────────────────────────────────────────────
|
||
|
||
final fetchFavoritesUseCaseProvider = Provider<FetchFavoritesUseCase>((ref) {
|
||
return FetchFavoritesUseCase(
|
||
client: ref.read(networkSdkApiProvider),
|
||
repository: ref.read(favoriteRepositoryProvider),
|
||
);
|
||
});
|
||
|
||
final deleteFavoriteUseCaseProvider = Provider<DeleteFavoriteUseCase>((ref) {
|
||
return DeleteFavoriteUseCase(
|
||
client: ref.read(networkSdkApiProvider),
|
||
repository: ref.read(favoriteRepositoryProvider),
|
||
);
|
||
});
|
||
|
||
final favoritesViewModelProvider =
|
||
NotifierProvider<FavoritesViewModel, FavoritesState>(
|
||
FavoritesViewModel.new,
|
||
);
|
||
|
||
// ── Call Logs ─────────────────────────────────────────────────────────────────
|
||
|
||
/// 通话记录仓储 Provider(Settings feature 内部使用)
|
||
final callLogRepositoryProvider = Provider<CallLogRepository>((ref) {
|
||
return CallLogRepositoryImpl(ref.read(storageSdkProvider));
|
||
});
|
||
|
||
/// 拉取通话记录用例 Provider
|
||
final fetchCallLogsUseCaseProvider = Provider<FetchCallLogsUseCase>((ref) {
|
||
return FetchCallLogsUseCase(
|
||
client: ref.read(networkSdkApiProvider),
|
||
repo: ref.read(callLogRepositoryProvider),
|
||
);
|
||
});
|
||
|
||
// ── Auth ───────────────────────────────────────────────────────────────────────
|
||
|
||
/// 退出登录用例 Provider
|
||
final logoutUseCaseProvider = Provider<LogoutUseCase>((ref) {
|
||
return LogoutUseCase(
|
||
authRepository: ref.read(authRepositoryProvider),
|
||
socketManager: ref.read(socketManagerProvider),
|
||
storageApi: ref.read(storageSdkProvider),
|
||
);
|
||
});
|