Files
customer-im-client-dev/apps/im_app/lib/features/settings/di/settings_providers.dart
pp-bot 8744e2c0b7 feat(settings): 收藏列表 + 最近呼叫全量实现(#42~#45)
## 收藏(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>
2026-03-24 20:30:56 +09:00

98 lines
4.4 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 ─────────────────────────────────────────────────────────────────
/// 通话记录仓储 ProviderSettings 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),
);
});