diff --git a/app/_layout.tsx b/app/_layout.tsx index 07b90d8..caa3c29 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -9,9 +9,9 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import * as Notifications from 'expo-notifications'; import * as SystemUI from 'expo-system-ui'; -import { registerNotificationPresentationHandler } from '../src/services/notificationPreferences'; -import { api } from '../src/services/api'; -import { wsService } from '../src/services/wsService'; +import { registerNotificationPresentationHandler } from '@/services/notification'; +import { api } from '@/services/core'; +import { wsService } from '@/services/core'; import { EventSubscriber } from '../src/infrastructure/EventSubscriber'; import { ThemeBootstrap, @@ -22,9 +22,9 @@ import { import { AppBackButton } from '../src/components/common'; import AppPromptBar from '../src/components/common/AppPromptBar'; import AppDialogHost from '../src/components/common/AppDialogHost'; -import { installAlertOverride } from '../src/services/alertOverride'; +import { installAlertOverride } from '@/services/ui'; import { useAuthStore } from '../src/stores'; -import { checkForAPKUpdate } from '../src/services/apkUpdateService'; +import { checkForAPKUpdate } from '@/services/platform'; import { CallScreen, IncomingCallModal, FloatingCallWindow } from '../src/components/call'; registerNotificationPresentationHandler(); @@ -122,11 +122,11 @@ function NotificationBootstrap() { useEffect(() => { const initNotifications = async () => { - const { loadNotificationPreferences } = await import('../src/services/notificationPreferences'); + const { loadNotificationPreferences } = await import('@/services/notification'); await loadNotificationPreferences(); - const { systemNotificationService } = await import('../src/services/systemNotificationService'); + const { systemNotificationService } = await import('@/services/notification'); await systemNotificationService.initialize(); - const { initBackgroundService } = await import('../src/services/backgroundService'); + const { initBackgroundService } = await import('@/services/background'); await initBackgroundService(); const subscription = AppState.addEventListener('change', (nextAppState) => { diff --git a/metro.config.js b/metro.config.js index d54c108..f84ee65 100644 --- a/metro.config.js +++ b/metro.config.js @@ -1,5 +1,6 @@ /** @type {import('expo/metro-config').MetroConfig} */ const { getDefaultConfig } = require('expo/metro-config'); +const path = require('path'); const config = getDefaultConfig(__dirname); @@ -10,6 +11,11 @@ config.resolver.assetExts.push('wasm'); // The package doesn't properly export "./index" in its exports field config.resolver.unstable_enablePackageExports = false; +// Support TypeScript path aliases (@/ -> ./src/) +config.resolver.alias = { + '@': path.resolve(__dirname, 'src'), +}; + // NOTE: enhanceMiddleware is marked as deprecated in Metro's types, // but there's currently no official alternative for custom dev server headers. // For production, configure COEP/COOP headers on your hosting platform. diff --git a/src/components/business/ReportDialog/ReportDialog.tsx b/src/components/business/ReportDialog/ReportDialog.tsx index 7f75478..de42492 100644 --- a/src/components/business/ReportDialog/ReportDialog.tsx +++ b/src/components/business/ReportDialog/ReportDialog.tsx @@ -20,7 +20,7 @@ import { import { MaterialCommunityIcons } from '@expo/vector-icons'; import { useAppColors } from '../../../theme'; import { spacing, borderRadius, fontSizes, shadows } from '../../../theme'; -import reportService, { ReportReason, ReportTargetType, REPORT_REASONS } from '../../../services/reportService'; +import { reportService, ReportReason, ReportTargetType, REPORT_REASONS } from '@/services/post'; import { blurActiveElement } from '../../../infrastructure/platform'; import Text from '../../common/Text'; diff --git a/src/components/common/AppDialogHost.tsx b/src/components/common/AppDialogHost.tsx index 7e0d1ad..727e2c7 100644 --- a/src/components/common/AppDialogHost.tsx +++ b/src/components/common/AppDialogHost.tsx @@ -4,7 +4,7 @@ import type { AlertButton } from 'react-native'; import { MaterialCommunityIcons } from '@expo/vector-icons'; import { LinearGradient } from 'expo-linear-gradient'; -import { bindDialogListener, DialogPayload } from '../../services/dialogService'; +import { bindDialogListener, DialogPayload } from '@/services/ui'; import { borderRadius, shadows, spacing, useAppColors, type AppColors } from '../../theme'; import { blurActiveElement } from '../../infrastructure/platform'; diff --git a/src/components/common/AppPromptBar.tsx b/src/components/common/AppPromptBar.tsx index 66a94d0..ca4b202 100644 --- a/src/components/common/AppPromptBar.tsx +++ b/src/components/common/AppPromptBar.tsx @@ -3,7 +3,7 @@ import { Animated, StyleSheet, Text, TouchableOpacity, View } from 'react-native import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { MaterialCommunityIcons } from '@expo/vector-icons'; -import { bindPromptListener, PromptPayload, PromptType } from '../../services/promptService'; +import { bindPromptListener, PromptPayload, PromptType } from '@/services/ui'; import { borderRadius, shadows, spacing, useAppColors, type AppColors } from '../../theme'; interface PromptState extends PromptPayload { diff --git a/src/data/datasources/ApiDataSource.ts b/src/data/datasources/ApiDataSource.ts index 07009d0..ab7f224 100644 --- a/src/data/datasources/ApiDataSource.ts +++ b/src/data/datasources/ApiDataSource.ts @@ -3,7 +3,7 @@ * 封装所有 API 调用,统一错误处理和请求拦截 */ -import { api, ApiResponse, ApiError } from '../../services/api'; +import { api, ApiResponse, ApiError } from '@/services/core'; import { IApiDataSource, DataSourceError } from './interfaces'; export class ApiDataSource implements IApiDataSource { diff --git a/src/data/datasources/WSClient.ts b/src/data/datasources/WSClient.ts index 598bf04..fa23531 100644 --- a/src/data/datasources/WSClient.ts +++ b/src/data/datasources/WSClient.ts @@ -14,7 +14,7 @@ import { WSGroupTypingMessage, WSGroupNoticeMessage, WSMessageType, -} from '../../services/wsService'; +} from '@/services/core'; // 事件处理器类型 type EventHandler = (data: T) => void; diff --git a/src/data/repositories/MaterialRepository.ts b/src/data/repositories/MaterialRepository.ts index a94c179..e5ada1a 100644 --- a/src/data/repositories/MaterialRepository.ts +++ b/src/data/repositories/MaterialRepository.ts @@ -7,7 +7,7 @@ import type { MaterialFile, MaterialFileType, } from '../../types/material'; -import { api } from '../../services/api'; +import { api } from '@/services/core'; // ==================== 接口定义 ==================== diff --git a/src/hooks/useDifferentialPosts.ts b/src/hooks/useDifferentialPosts.ts index 6185406..1888891 100644 --- a/src/hooks/useDifferentialPosts.ts +++ b/src/hooks/useDifferentialPosts.ts @@ -14,8 +14,8 @@ import { PostBatcherOptions, createPostUpdateBatcher, } from '../infrastructure/diff/PostUpdateBatcher'; -import { postSyncService } from '../services/post/PostSyncService'; -import type { PostsState } from '../services/post/PostSyncService'; +import { postSyncService } from '@/services/post'; +import type { PostsState } from '@/services/post'; import { usePostListStore } from '../stores/post/postListStore'; import type { Post } from '../core/entities/Post'; diff --git a/src/screens/auth/ForgotPasswordScreen.tsx b/src/screens/auth/ForgotPasswordScreen.tsx index 3be3711..421636c 100644 --- a/src/screens/auth/ForgotPasswordScreen.tsx +++ b/src/screens/auth/ForgotPasswordScreen.tsx @@ -27,8 +27,8 @@ import { SafeAreaView } from 'react-native-safe-area-context'; import { useRouter } from 'expo-router'; import { MaterialCommunityIcons } from '@expo/vector-icons'; import { useAppColors, useResolvedColorScheme, type AppColors } from '../../theme'; -import { authService, resolveAuthApiError } from '../../services/authService'; -import { showPrompt } from '../../services/promptService'; +import { authService, resolveAuthApiError } from '@/services/auth'; +import { showPrompt } from '@/services/ui'; export const ForgotPasswordScreen: React.FC = () => { const colors = useAppColors(); diff --git a/src/screens/auth/LoginScreen.tsx b/src/screens/auth/LoginScreen.tsx index fc4b792..42d8410 100644 --- a/src/screens/auth/LoginScreen.tsx +++ b/src/screens/auth/LoginScreen.tsx @@ -30,7 +30,7 @@ import { useAppColors, useResolvedColorScheme, type AppColors } from '../../them import { useAuthStore } from '../../stores'; import * as hrefs from '../../navigation/hrefs'; import { useResponsive } from '../../hooks'; -import { showPrompt } from '../../services/promptService'; +import { showPrompt } from '@/services/ui'; diff --git a/src/screens/auth/QRCodeConfirmScreen.tsx b/src/screens/auth/QRCodeConfirmScreen.tsx index dfe9e94..ec8c427 100644 --- a/src/screens/auth/QRCodeConfirmScreen.tsx +++ b/src/screens/auth/QRCodeConfirmScreen.tsx @@ -11,7 +11,7 @@ import { import { SafeAreaView } from 'react-native-safe-area-context'; import { MaterialCommunityIcons } from '@expo/vector-icons'; import { useRouter, useLocalSearchParams } from 'expo-router'; -import { qrcodeApi } from '../../services/authService'; +import { qrcodeApi } from '@/services/auth'; import { spacing, fontSizes, borderRadius, useAppColors, type AppColors } from '../../theme'; import { AppBackButton } from '../../components/common'; diff --git a/src/screens/auth/RegisterScreen.tsx b/src/screens/auth/RegisterScreen.tsx index ab88991..399396a 100644 --- a/src/screens/auth/RegisterScreen.tsx +++ b/src/screens/auth/RegisterScreen.tsx @@ -26,7 +26,7 @@ import { SafeAreaView } from 'react-native-safe-area-context'; import { useRouter } from 'expo-router'; import { MaterialCommunityIcons } from '@expo/vector-icons'; import { useAppColors, useResolvedColorScheme, type AppColors } from '../../theme'; -import { authService, resolveAuthApiError } from '../../services/authService'; +import { authService, resolveAuthApiError } from '@/services/auth'; import { useAuthStore } from '../../stores'; import { useRegisterStore, @@ -35,7 +35,7 @@ import { useRegisterCountdown, } from '../../stores/registerStore'; import * as hrefs from '../../navigation/hrefs'; -import { showPrompt } from '../../services/promptService'; +import { showPrompt } from '@/services/ui'; import { RegisterStepIndicator } from '../../components/common'; import { RegisterStepProps, RegisterStep } from './types'; import { RegisterStep1Email } from './RegisterStep1Email'; diff --git a/src/screens/auth/VerificationFormScreen.tsx b/src/screens/auth/VerificationFormScreen.tsx index dd55aef..083641b 100644 --- a/src/screens/auth/VerificationFormScreen.tsx +++ b/src/screens/auth/VerificationFormScreen.tsx @@ -22,8 +22,8 @@ import { MaterialCommunityIcons } from '@expo/vector-icons'; import * as ImagePicker from 'expo-image-picker'; import { useAppColors, type AppColors } from '../../theme'; import { useVerificationStore } from '../../stores/verificationStore'; -import { showPrompt } from '../../services/promptService'; -import { uploadService } from '../../services/uploadService'; +import { showPrompt } from '@/services/ui'; +import { uploadService } from '@/services/upload'; import type { UserIdentity } from '../../types/dto'; const IDENTITY_CONFIG: Record = { diff --git a/src/screens/create/CreatePostScreen.tsx b/src/screens/create/CreatePostScreen.tsx index 0318b4d..f1630ae 100644 --- a/src/screens/create/CreatePostScreen.tsx +++ b/src/screens/create/CreatePostScreen.tsx @@ -35,8 +35,8 @@ import { } from '../../theme'; import { Text, ResponsiveContainer } from '../../components/common'; import { channelService, postService, showPrompt, voteService } from '../../services'; -import { ApiError } from '../../services/api'; -import { uploadService } from '../../services/uploadService'; +import { ApiError } from '@/services/core'; +import { uploadService } from '@/services/upload'; import VoteEditor from '../../components/business/VoteEditor'; import { useResponsive, useResponsiveValue } from '../../hooks'; import * as hrefs from '../../navigation/hrefs'; diff --git a/src/screens/home/HomeScreen.tsx b/src/screens/home/HomeScreen.tsx index 25e19aa..f04657c 100644 --- a/src/screens/home/HomeScreen.tsx +++ b/src/screens/home/HomeScreen.tsx @@ -34,7 +34,7 @@ import type { PostCardAction } from '../../components/business/PostCard'; import { Loading, EmptyState, Text, ImageGallery, ImageGridItem, ResponsiveGrid } from '../../components/common'; import { useResponsive, useResponsiveSpacing } from '../../hooks/useResponsive'; import { useDifferentialPosts } from '../../hooks/useDifferentialPosts'; -import { postSyncService } from '../../services/post/PostSyncService'; +import { postSyncService } from '@/services/post'; import { SearchScreen } from './SearchScreen'; import { CreatePostScreen } from '../create/CreatePostScreen'; import * as hrefs from '../../navigation/hrefs'; diff --git a/src/screens/home/PostDetailScreen.tsx b/src/screens/home/PostDetailScreen.tsx index ba78614..3191d4e 100644 --- a/src/screens/home/PostDetailScreen.tsx +++ b/src/screens/home/PostDetailScreen.tsx @@ -37,12 +37,12 @@ import { Post, Comment, VoteResultDTO, VoteOptionDTO } from '../../types'; import { useUserStore } from '../../stores'; import { useCurrentUser } from '../../stores/authStore'; import { postService, commentService, uploadService, authService, showPrompt, voteService } from '../../services'; -import { postSyncService } from '../../services/post/PostSyncService'; +import { postSyncService } from '@/services/post'; import { useCursorPagination } from '../../hooks/useCursorPagination'; import { CommentItem, VoteCard, ReportDialog } from '../../components/business'; import { Avatar, Button, Loading, EmptyState, Text, ImageGallery, ImageGrid, ImageGridItem, AdaptiveLayout, AppBackButton } from '../../components/common'; import { useResponsive, useResponsiveValue, useResponsiveSpacing } from '../../hooks/useResponsive'; -import { handleError } from '../../services/errorHandler'; +import { handleError } from '@/services/core'; import * as hrefs from '../../navigation/hrefs'; function togglePostField( diff --git a/src/screens/home/SearchScreen.tsx b/src/screens/home/SearchScreen.tsx index 9d0e968..272ae18 100644 --- a/src/screens/home/SearchScreen.tsx +++ b/src/screens/home/SearchScreen.tsx @@ -20,7 +20,7 @@ import { spacing, fontSizes, borderRadius, useAppColors, type AppColors } from ' import { Post, User } from '../../types'; import { useUserStore } from '../../stores'; import { postService, authService } from '../../services'; -import { postSyncService } from '../../services/post/PostSyncService'; +import { postSyncService } from '@/services/post'; import { PostCard, TabBar, SearchBar } from '../../components/business'; import type { PostCardAction } from '../../components/business/PostCard'; import { Avatar, EmptyState, Text, ResponsiveGrid, Loading } from '../../components/common'; diff --git a/src/screens/message/CreateGroupScreen.tsx b/src/screens/message/CreateGroupScreen.tsx index ae4c743..905a95f 100644 --- a/src/screens/message/CreateGroupScreen.tsx +++ b/src/screens/message/CreateGroupScreen.tsx @@ -22,8 +22,8 @@ import { MaterialCommunityIcons } from '@expo/vector-icons'; import { blurActiveElement } from '../../infrastructure/platform'; import * as ImagePicker from 'expo-image-picker'; import { spacing, fontSizes, borderRadius, shadows, useAppColors, type AppColors } from '../../theme'; -import { groupService } from '../../services/groupService'; -import { uploadService } from '../../services/uploadService'; +import { groupService } from '@/services/message'; +import { uploadService } from '@/services/upload'; import { Avatar, Text, Button, Loading } from '../../components/common'; import { User } from '../../types'; import MutualFollowSelectorModal from './components/MutualFollowSelectorModal'; diff --git a/src/screens/message/GroupInfoScreen.tsx b/src/screens/message/GroupInfoScreen.tsx index e9c0ad3..7823c33 100644 --- a/src/screens/message/GroupInfoScreen.tsx +++ b/src/screens/message/GroupInfoScreen.tsx @@ -34,9 +34,9 @@ import { type AppColors, } from '../../theme'; import { useAuthStore } from '../../stores'; -import { groupService } from '../../services/groupService'; -import { uploadService } from '../../services/uploadService'; -import { messageService } from '../../services/messageService'; +import { groupService } from '@/services/message'; +import { uploadService } from '@/services/upload'; +import { messageService } from '@/services/message'; import { Avatar, Text, Button, Loading, Divider } from '../../components/common'; import { useResponsive, useBreakpointGTE } from '../../hooks/useResponsive'; import { diff --git a/src/screens/message/GroupInviteDetailScreen.tsx b/src/screens/message/GroupInviteDetailScreen.tsx index eb36ef2..a903afc 100644 --- a/src/screens/message/GroupInviteDetailScreen.tsx +++ b/src/screens/message/GroupInviteDetailScreen.tsx @@ -6,7 +6,7 @@ import { MaterialCommunityIcons } from '@expo/vector-icons'; import { spacing, borderRadius, fontSizes, useAppColors, type AppColors } from '../../theme'; import { Avatar, Text } from '../../components/common'; import { routePayloadCache } from '../../stores/routePayloadCache'; -import { groupService } from '../../services/groupService'; +import { groupService } from '@/services/message'; import { groupManager } from '../../stores/groupManager'; import { GroupMemberResponse } from '../../types/dto'; import { GroupInfoSummaryCard, DecisionFooter } from './components/GroupRequestShared'; diff --git a/src/screens/message/GroupMembersScreen.tsx b/src/screens/message/GroupMembersScreen.tsx index 4b73a28..74cb4a9 100644 --- a/src/screens/message/GroupMembersScreen.tsx +++ b/src/screens/message/GroupMembersScreen.tsx @@ -25,7 +25,7 @@ import { MaterialCommunityIcons } from '@expo/vector-icons'; import { blurActiveElement } from '../../infrastructure/platform'; import { spacing, fontSizes, borderRadius, useAppColors, type AppColors } from '../../theme'; import { useAuthStore } from '../../stores'; -import { groupService } from '../../services/groupService'; +import { groupService } from '@/services/message'; import { createRemoteGroupMemberListSource, GroupMemberListSourceKind, diff --git a/src/screens/message/GroupRequestDetailScreen.tsx b/src/screens/message/GroupRequestDetailScreen.tsx index 5764b49..c5e6290 100644 --- a/src/screens/message/GroupRequestDetailScreen.tsx +++ b/src/screens/message/GroupRequestDetailScreen.tsx @@ -8,7 +8,7 @@ import { spacing, borderRadius, shadows, useAppColors, type AppColors } from '.. import { Avatar, Text } from '../../components/common'; import * as hrefs from '../../navigation/hrefs'; import { routePayloadCache } from '../../stores/routePayloadCache'; -import { groupService } from '../../services/groupService'; +import { groupService } from '@/services/message'; import { groupManager } from '../../stores/groupManager'; import { userManager } from '../../stores/userManager'; import { GroupInfoSummaryCard, DecisionFooter } from './components/GroupRequestShared'; diff --git a/src/screens/message/JoinGroupScreen.tsx b/src/screens/message/JoinGroupScreen.tsx index c8fba59..4bdc0de 100644 --- a/src/screens/message/JoinGroupScreen.tsx +++ b/src/screens/message/JoinGroupScreen.tsx @@ -16,7 +16,7 @@ import { MaterialCommunityIcons } from '@expo/vector-icons'; import { spacing, borderRadius, fontSizes, useAppColors, type AppColors } from '../../theme'; import Avatar from '../../components/common/Avatar'; import Text from '../../components/common/Text'; -import { groupService } from '../../services/groupService'; +import { groupService } from '@/services/message'; import { groupManager } from '../../stores/groupManager'; import { GroupResponse, JoinType } from '../../types/dto'; import { useCursorPagination } from '../../hooks/useCursorPagination'; diff --git a/src/screens/message/NotificationsScreen.tsx b/src/screens/message/NotificationsScreen.tsx index 3841fb6..0985dfa 100644 --- a/src/screens/message/NotificationsScreen.tsx +++ b/src/screens/message/NotificationsScreen.tsx @@ -30,8 +30,8 @@ import { useRouter } from 'expo-router'; import { MaterialCommunityIcons } from '@expo/vector-icons'; import { spacing, borderRadius, useAppColors, useResolvedColorScheme, type AppColors } from '../../theme'; import { SystemMessageResponse } from '../../types/dto'; -import { messageService } from '../../services/messageService'; -import { commentService } from '../../services/commentService'; +import { messageService } from '@/services/message'; +import { commentService } from '@/services/post'; import { SystemMessageItem } from '../../components/business'; import { Text, ResponsiveContainer } from '../../components/common'; import { useCursorPagination } from '../../hooks/useCursorPagination'; diff --git a/src/screens/message/PrivateChatInfoScreen.tsx b/src/screens/message/PrivateChatInfoScreen.tsx index 18c3d96..f0bfb52 100644 --- a/src/screens/message/PrivateChatInfoScreen.tsx +++ b/src/screens/message/PrivateChatInfoScreen.tsx @@ -18,9 +18,9 @@ import { useRouter, useLocalSearchParams } from 'expo-router'; import { MaterialCommunityIcons } from '@expo/vector-icons'; import { spacing, borderRadius, shadows, useAppColors, type AppColors } from '../../theme'; import { useAuthStore } from '../../stores'; -import { authService } from '../../services/authService'; -import { messageService } from '../../services/messageService'; -import { ApiError } from '../../services/api'; +import { authService } from '@/services/auth'; +import { messageService } from '@/services/message'; +import { ApiError } from '@/services/core'; import { messageRepository, conversationRepository } from '@/database'; import { messageManager } from '../../stores/messageManager'; import { userManager } from '../../stores/userManager'; diff --git a/src/screens/message/components/ChatScreen/EmojiPanel.tsx b/src/screens/message/components/ChatScreen/EmojiPanel.tsx index 6422b97..0ffd5a8 100644 --- a/src/screens/message/components/ChatScreen/EmojiPanel.tsx +++ b/src/screens/message/components/ChatScreen/EmojiPanel.tsx @@ -13,7 +13,7 @@ import { Text } from '../../../../components/common'; import { useChatScreenStyles } from './styles'; import { useResponsive, useBreakpointGTE } from '../../../../hooks/useResponsive'; import { EMOJIS } from './constants'; -import { CustomSticker, getCustomStickers, batchDeleteStickers, addStickerFromUrl } from '../../../../services/stickerService'; +import { CustomSticker, getCustomStickers, batchDeleteStickers, addStickerFromUrl } from '@/services/message'; import { useAppColors, spacing } from '../../../../theme'; import { blurActiveElement } from '../../../../infrastructure/platform'; diff --git a/src/screens/message/components/ChatScreen/GroupInfoPanel.tsx b/src/screens/message/components/ChatScreen/GroupInfoPanel.tsx index aad0407..72d77b5 100644 --- a/src/screens/message/components/ChatScreen/GroupInfoPanel.tsx +++ b/src/screens/message/components/ChatScreen/GroupInfoPanel.tsx @@ -21,7 +21,7 @@ import { useAppColors, spacing, fontSizes, shadows, type AppColors } from '../.. import { GroupMemberResponse, GroupResponse, GroupAnnouncementResponse } from '../../../../types/dto'; import { useBreakpointGTE } from '../../../../hooks/useResponsive'; import { groupManager } from '../../../../stores/groupManager'; -import { groupService } from '../../../../services/groupService'; +import { groupService } from '@/services/message'; const { width: screenWidth } = Dimensions.get('window'); const PANEL_WIDTH = 360; diff --git a/src/screens/message/components/ChatScreen/GroupInfoPanel.web.tsx b/src/screens/message/components/ChatScreen/GroupInfoPanel.web.tsx index e6759a6..8dbe339 100644 --- a/src/screens/message/components/ChatScreen/GroupInfoPanel.web.tsx +++ b/src/screens/message/components/ChatScreen/GroupInfoPanel.web.tsx @@ -21,7 +21,7 @@ import { useAppColors, spacing, fontSizes, shadows, borderRadius, type AppColors import { GroupMemberResponse, GroupResponse, GroupAnnouncementResponse } from '../../../../types/dto'; import { useBreakpointGTE } from '../../../../hooks/useResponsive'; import { groupManager } from '../../../../stores/groupManager'; -import { groupService } from '../../../../services/groupService'; +import { groupService } from '@/services/message'; const { width: screenWidth } = Dimensions.get('window'); const PANEL_WIDTH = 360; diff --git a/src/screens/message/components/ChatScreen/LongPressMenu.tsx b/src/screens/message/components/ChatScreen/LongPressMenu.tsx index dfc4554..eef96b5 100644 --- a/src/screens/message/components/ChatScreen/LongPressMenu.tsx +++ b/src/screens/message/components/ChatScreen/LongPressMenu.tsx @@ -19,7 +19,7 @@ import { useChatScreenStyles } from './styles'; import { LongPressMenuProps } from './types'; import { RECALL_TIME_LIMIT } from './constants'; import { extractTextFromSegments, ImageSegmentData } from '../../../../types/dto'; -import { isStickerExists, addStickerFromUrl } from '../../../../services/stickerService'; +import { isStickerExists, addStickerFromUrl } from '@/services/message'; import { blurActiveElement } from '../../../../infrastructure/platform'; const { width: SCREEN_WIDTH, height: SCREEN_HEIGHT } = Dimensions.get('window'); diff --git a/src/screens/message/components/ChatScreen/useChatScreen.ts b/src/screens/message/components/ChatScreen/useChatScreen.ts index 84b02bd..af849df 100644 --- a/src/screens/message/components/ChatScreen/useChatScreen.ts +++ b/src/screens/message/components/ChatScreen/useChatScreen.ts @@ -22,12 +22,12 @@ import { formatDistanceToNow } from 'date-fns'; import { zhCN } from 'date-fns/locale'; import * as ImagePicker from 'expo-image-picker'; import { GroupMemberResponse, MessageSegment, TextSegmentData, ImageSegmentData, AtSegmentData, ReplySegmentData, MessageStatus } from '../../../../types/dto'; -import { messageService } from '../../../../services/messageService'; -import { uploadService } from '../../../../services/uploadService'; -import { ApiError } from '../../../../services/api'; +import { messageService } from '@/services/message'; +import { uploadService } from '@/services/upload'; +import { ApiError } from '@/services/core'; // 【新架构】使用 MessageManager import { useChat, useGroupTyping, useGroupMuted, messageManager, callStore } from '../../../../stores'; -import { groupService } from '../../../../services/groupService'; +import { groupService } from '@/services/message'; import { userManager } from '../../../../stores/userManager'; import { groupManager } from '../../../../stores/groupManager'; import * as hrefs from '../../../../navigation/hrefs'; diff --git a/src/screens/message/components/MutualFollowSelectorModal.tsx b/src/screens/message/components/MutualFollowSelectorModal.tsx index 308d1d8..c666417 100644 --- a/src/screens/message/components/MutualFollowSelectorModal.tsx +++ b/src/screens/message/components/MutualFollowSelectorModal.tsx @@ -13,7 +13,7 @@ import { import { MaterialCommunityIcons } from '@expo/vector-icons'; import { spacing, fontSizes, borderRadius, useAppColors, type AppColors } from '../../../theme'; -import { authService } from '../../../services/authService'; +import { authService } from '@/services/auth'; import { useAuthStore } from '../../../stores'; import { Avatar, EmptyState, Loading, Text } from '../../../components/common'; import { blurActiveElement } from '../../../infrastructure/platform'; diff --git a/src/screens/profile/AboutScreen.tsx b/src/screens/profile/AboutScreen.tsx index d407453..107298b 100644 --- a/src/screens/profile/AboutScreen.tsx +++ b/src/screens/profile/AboutScreen.tsx @@ -28,7 +28,7 @@ import { } from '../../theme'; import { Text } from '../../components/common'; import { useResponsive, useResponsiveSpacing } from '../../hooks'; -import { checkForAPKUpdate, type VersionCheckResult } from '../../services/apkUpdateService'; +import { checkForAPKUpdate, type VersionCheckResult } from '@/services/platform'; import * as hrefs from '../../navigation/hrefs'; const CONTENT_MAX_WIDTH = 720; diff --git a/src/screens/profile/AccountSecurityScreen.tsx b/src/screens/profile/AccountSecurityScreen.tsx index 907a924..20555a7 100644 --- a/src/screens/profile/AccountSecurityScreen.tsx +++ b/src/screens/profile/AccountSecurityScreen.tsx @@ -16,8 +16,8 @@ import { useResponsive, useResponsiveSpacing } from '../../hooks'; // 内容最大宽度 const CONTENT_MAX_WIDTH = 720; -import { authService, resolveAuthApiError } from '../../services/authService'; -import { showPrompt } from '../../services/promptService'; +import { authService, resolveAuthApiError } from '@/services/auth'; +import { showPrompt } from '@/services/ui'; import { useAuthStore } from '../../stores'; export const AccountSecurityScreen: React.FC = () => { diff --git a/src/screens/profile/NotificationSettingsScreen.tsx b/src/screens/profile/NotificationSettingsScreen.tsx index 1aca70f..eb16454 100644 --- a/src/screens/profile/NotificationSettingsScreen.tsx +++ b/src/screens/profile/NotificationSettingsScreen.tsx @@ -22,9 +22,9 @@ import { setPushNotificationsPreference, setSoundPreference, setVibrationPreference, -} from '../../services/notificationPreferences'; +} from '@/services/notification'; import { useResponsive, useResponsiveSpacing } from '../../hooks'; -import { backgroundSyncManager, BackgroundSyncMode } from '../../services/BackgroundSyncManager'; +import { backgroundSyncManager, BackgroundSyncMode } from '@/services/background'; // 内容最大宽度 const CONTENT_MAX_WIDTH = 720; diff --git a/src/screens/profile/VerificationSettingsScreen.tsx b/src/screens/profile/VerificationSettingsScreen.tsx index 77cee0b..97d8255 100644 --- a/src/screens/profile/VerificationSettingsScreen.tsx +++ b/src/screens/profile/VerificationSettingsScreen.tsx @@ -23,7 +23,7 @@ import { useVerificationStatus, useVerificationLoading, } from '../../stores/verificationStore'; -import { showPrompt } from '../../services/promptService'; +import { showPrompt } from '@/services/ui'; import * as hrefs from '../../navigation/hrefs'; const STATUS_CONFIG = { diff --git a/src/screens/profile/useUserProfile.ts b/src/screens/profile/useUserProfile.ts index c2444da..976062a 100644 --- a/src/screens/profile/useUserProfile.ts +++ b/src/screens/profile/useUserProfile.ts @@ -12,7 +12,7 @@ import { Post, User } from '../../types'; import { useUserStore } from '../../stores'; import { useCurrentUser } from '../../stores/authStore'; import { postService, authService, messageService } from '../../services'; -import { postSyncService } from '../../services/post/PostSyncService'; +import { postSyncService } from '@/services/post'; import { userManager } from '../../stores/userManager'; import * as hrefs from '../../navigation/hrefs'; import { PostCardAction } from '../../components/business/PostCard'; diff --git a/src/screens/schedule/CourseDetailScreen.tsx b/src/screens/schedule/CourseDetailScreen.tsx index 27fcc09..36791c1 100644 --- a/src/screens/schedule/CourseDetailScreen.tsx +++ b/src/screens/schedule/CourseDetailScreen.tsx @@ -6,7 +6,7 @@ import { MaterialCommunityIcons } from '@expo/vector-icons'; import { spacing, borderRadius, fontSizes, shadows, useAppColors, type AppColors } from '../../theme'; import { routePayloadCache } from '../../stores/routePayloadCache'; -import { scheduleService } from '../../services/scheduleService'; +import { scheduleService } from '@/services/platform'; const WEEKDAY_NAMES = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']; const getMergedSectionIndex = (section: number) => Math.ceil(section / 2); diff --git a/src/screens/schedule/ScheduleScreen.tsx b/src/screens/schedule/ScheduleScreen.tsx index 9e344a4..d481e69 100644 --- a/src/screens/schedule/ScheduleScreen.tsx +++ b/src/screens/schedule/ScheduleScreen.tsx @@ -43,7 +43,7 @@ import { } from '../../types/schedule'; import * as hrefs from '../../navigation/hrefs'; import { routePayloadCache } from '../../stores/routePayloadCache'; -import { scheduleService } from '../../services/scheduleService'; +import { scheduleService } from '@/services/platform'; const { width: SCREEN_WIDTH } = Dimensions.get('window'); diff --git a/src/services/authService.ts b/src/services/auth/authService.ts similarity index 95% rename from src/services/authService.ts rename to src/services/auth/authService.ts index 2985f8b..43958a5 100644 --- a/src/services/authService.ts +++ b/src/services/auth/authService.ts @@ -3,8 +3,9 @@ * 处理用户登录、注册、登出等认证功能 */ -import { api } from './api'; -import { User } from '../types'; +import { api } from '../core/api'; +import { User } from '@/types'; +import type { PrivacySettingsDTO, PrivacySettingsRequestDTO, DeletionStatusDTO } from '@/types/dto'; export function resolveAuthApiError(error: any, fallback = '操作失败,请稍后重试'): string { const code: number = error?.code ?? 0; @@ -160,6 +161,7 @@ class AuthService { if (refreshToken) { await api.setRefreshToken(refreshToken); } + api.resetAuthState(); return response.data; } @@ -178,6 +180,7 @@ class AuthService { if (refreshToken) { await api.setRefreshToken(refreshToken); } + api.resetAuthState(); return response.data; } @@ -457,9 +460,9 @@ class AuthService { } // 隐私设置 - async getPrivacySettings(): Promise { + async getPrivacySettings(): Promise { try { - const response = await api.get('/users/me/privacy'); + const response = await api.get('/users/me/privacy'); return response.data; } catch (error) { console.error('获取隐私设置失败:', error); @@ -467,7 +470,7 @@ class AuthService { } } - async updatePrivacySettings(settings: import('../types/dto').PrivacySettingsRequestDTO): Promise { + async updatePrivacySettings(settings: PrivacySettingsRequestDTO): Promise { try { await api.put('/users/me/privacy', settings); return true; @@ -478,9 +481,9 @@ class AuthService { } // 账号注销 - async requestAccountDeletion(password: string): Promise { + async requestAccountDeletion(password: string): Promise { try { - const response = await api.post('/users/me/deactivate', { + const response = await api.post('/users/me/deactivate', { password, }); return response.data; @@ -500,9 +503,9 @@ class AuthService { } } - async getDeletionStatus(): Promise { + async getDeletionStatus(): Promise { try { - const response = await api.get('/users/me/deletion-status'); + const response = await api.get('/users/me/deletion-status'); return response.data; } catch (error) { console.error('获取注销状态失败:', error); diff --git a/src/services/auth/index.ts b/src/services/auth/index.ts new file mode 100644 index 0000000..da49030 --- /dev/null +++ b/src/services/auth/index.ts @@ -0,0 +1,18 @@ +export { authService, resolveAuthApiError, qrcodeApi } from './authService'; +export type { + LoginRequest, + RegisterRequest, + SendEmailCodeRequest, + ResetPasswordRequest, + VerifyCurrentUserEmailRequest, + AuthResponse, + RefreshTokenResponse, + UpdateUserRequest, + BlockedUserListResponse, + BlockStatusResponse, + QRCodeSession, + ScanResponse, +} from './authService'; + +export { verificationService } from './verificationService'; +export type { SubmitVerificationResponse } from './verificationService'; diff --git a/src/services/verificationService.ts b/src/services/auth/verificationService.ts similarity index 97% rename from src/services/verificationService.ts rename to src/services/auth/verificationService.ts index d1a1ee4..b1d2f23 100644 --- a/src/services/verificationService.ts +++ b/src/services/auth/verificationService.ts @@ -3,13 +3,13 @@ * 处理用户身份认证申请、状态查询等功能 */ -import { api } from './api'; +import { api } from '../core/api'; import { VerificationStatusDTO, VerificationRecordDTO, SubmitVerificationRequest, PaginatedData, -} from '../types/dto'; +} from '@/types/dto'; // 提交认证响应 export interface SubmitVerificationResponse { diff --git a/src/services/BackgroundSyncManager.ts b/src/services/background/BackgroundSyncManager.ts similarity index 99% rename from src/services/BackgroundSyncManager.ts rename to src/services/background/BackgroundSyncManager.ts index c97823f..f27b647 100644 --- a/src/services/BackgroundSyncManager.ts +++ b/src/services/background/BackgroundSyncManager.ts @@ -7,7 +7,7 @@ import { AppState, AppStateStatus, Platform } from 'react-native'; import { ForegroundServiceModule } from './ForegroundServiceModule'; -import { wsService } from './wsService'; +import { wsService } from '../core/wsService'; import AsyncStorage from '@react-native-async-storage/async-storage'; /** diff --git a/src/services/ForegroundServiceModule.ts b/src/services/background/ForegroundServiceModule.ts similarity index 100% rename from src/services/ForegroundServiceModule.ts rename to src/services/background/ForegroundServiceModule.ts diff --git a/src/services/backgroundService.ts b/src/services/background/backgroundService.ts similarity index 96% rename from src/services/backgroundService.ts rename to src/services/background/backgroundService.ts index d7da22e..047082a 100644 --- a/src/services/backgroundService.ts +++ b/src/services/background/backgroundService.ts @@ -15,8 +15,8 @@ import { backgroundSyncManager, BackgroundSyncMode, } from './BackgroundSyncManager'; -import { messageService } from './messageService'; -import { api } from './api'; +import { messageService } from '../message/messageService'; +import { api } from '../core/api'; // 后台任务名称 const BACKGROUND_SYNC_TASK = 'background-sync-task'; @@ -215,7 +215,7 @@ export { setVibrationConfig, getVibrationConfig, setVibrationEnabled, -} from './messageVibrationService'; +} from '../platform/messageVibrationService'; // 重新导出类型 export { BackgroundSyncMode }; @@ -230,7 +230,7 @@ export const backgroundService = { checkStatus: checkBackgroundStatus, // 震动相关 vibrate: async () => { - const { triggerVibration } = await import('./messageVibrationService'); + const { triggerVibration } = await import('../platform/messageVibrationService'); triggerVibration(); }, }; diff --git a/src/services/background/index.ts b/src/services/background/index.ts new file mode 100644 index 0000000..29c2a50 --- /dev/null +++ b/src/services/background/index.ts @@ -0,0 +1,19 @@ +export { + backgroundService, + initBackgroundService, + stopBackgroundService, + triggerVibration, + vibrateOnMessage, + setVibrationConfig, + getVibrationConfig, + setVibrationEnabled, + checkBackgroundStatus, + setBackgroundSyncMode, + getBackgroundSyncMode, + syncNow, +} from './backgroundService'; + +export { BackgroundSyncMode, backgroundSyncManager } from './BackgroundSyncManager'; + +export { ForegroundServiceModule } from './ForegroundServiceModule'; +export type { ForegroundServiceOptions } from './ForegroundServiceModule'; \ No newline at end of file diff --git a/src/services/api.ts b/src/services/core/api.ts similarity index 92% rename from src/services/api.ts rename to src/services/core/api.ts index e4834da..21f793e 100644 --- a/src/services/api.ts +++ b/src/services/core/api.ts @@ -75,6 +75,7 @@ class ApiClient { private baseUrl: string; private verificationModalShown = false; private refreshLock: Promise | null = null; + private isAuthFailed = false; // 全局认证失败标志,防止无限重试 constructor(baseUrl: string) { this.baseUrl = baseUrl; @@ -90,10 +91,17 @@ class ApiClient { } private navigateToLogin() { + this.isAuthFailed = true; // 设置全局失败标志 eventBus.emit({ type: 'NAVIGATE', payload: { path: '/(auth)/login' } }); eventBus.emit({ type: 'AUTH_LOGOUT' }); } + // 重置认证状态(登录成功后调用) + resetAuthState() { + this.isAuthFailed = false; + this.refreshLock = null; + } + private parseJwt(token: string): JwtPayload | null { try { const parts = token.split('.'); @@ -167,13 +175,22 @@ class ApiClient { } } + // 不需要认证的路径前缀 + private static PUBLIC_PATHS = ['/auth/login', '/auth/register', '/auth/password/', '/auth/check-username', '/auth/qrcode', '/auth/refresh']; + // 统一请求方法 private async request( method: string, path: string, params?: Record, - body?: any + body?: any, + _retryCount = 0, ): Promise> { + // 认证已失败,仅放行公开路径(登录、注册等) + if (this.isAuthFailed && !ApiClient.PUBLIC_PATHS.some(p => path.startsWith(p))) { + throw new ApiError(401, '登录已过期,请重新登录'); + } + const url = new URL(`${this.baseUrl}${path}`); // 添加查询参数 @@ -226,6 +243,11 @@ class ApiClient { // 处理 401 未授权 if (response.status === 401) { + if (_retryCount >= 1) { + await this.clearToken(); + this.navigateToLogin(); + throw new ApiError(401, '登录已过期,请重新登录'); + } const refreshed = await this.refreshToken(); if (!refreshed) { await this.clearToken(); @@ -233,7 +255,7 @@ class ApiClient { throw new ApiError(401, '登录已过期,请重新登录'); } - return this.request(method, path, params, body); + return this.request(method, path, params, body, _retryCount + 1); } // 解析响应(兼容非 JSON 返回,避免 SyntaxError 被误判为网络错误) diff --git a/src/services/errorHandler.ts b/src/services/core/errorHandler.ts similarity index 99% rename from src/services/errorHandler.ts rename to src/services/core/errorHandler.ts index a1c0d03..d622ab0 100644 --- a/src/services/errorHandler.ts +++ b/src/services/core/errorHandler.ts @@ -10,7 +10,7 @@ * 替代散落在代码中的 console.error + 手动 Alert 模式 */ -import { showPrompt } from './promptService'; +import { showPrompt } from '../ui/promptService'; export enum AppErrorCode { NETWORK_ERROR = 'NETWORK_ERROR', diff --git a/src/services/core/index.ts b/src/services/core/index.ts new file mode 100644 index 0000000..57616d4 --- /dev/null +++ b/src/services/core/index.ts @@ -0,0 +1,39 @@ +export { api, WS_URL, TOKEN_KEY, REFRESH_TOKEN_KEY } from './api'; +export { ApiError } from './api'; +export type { ApiResponse, PaginatedData } from './api'; + +export { wsService } from './wsService'; +export type { + WSMessage, + WSMessageType, + WSChatMessage, + WSReadMessage, + WSTypingMessage, + WSRecallMessage, + WSNotificationMessage, + WSAnnouncementMessage, + WSGroupChatMessage, + WSGroupTypingMessage, + GroupNoticeType, + WSGroupNoticeMessage, + WSGroupMentionMessage, + WSGroupReadMessage, + WSGroupRecallMessage, + WSCallIncomingMessage, + WSCallAcceptedMessage, + WSCallRejectedMessage, + WSCallBusyMessage, + WSCallEndedMessage, + WSCallSDPMessage, + WSCallICEMessage, + WSCallPeerMutedMessage, + WSCallInvitedMessage, + WSCallAnsweredElsewhereMessage, + WSErrorMessage, + WSServerMessage, + ICEServerConfig, +} from './wsService'; + +export { handleError, createErrorHandler, safeAsync, createAppError } from './errorHandler'; +export type { AppError, ErrorHandlerOptions } from './errorHandler'; +export { AppErrorCode } from './errorHandler'; diff --git a/src/services/wsService.ts b/src/services/core/wsService.ts similarity index 99% rename from src/services/wsService.ts rename to src/services/core/wsService.ts index d067d5f..15a7461 100644 --- a/src/services/wsService.ts +++ b/src/services/core/wsService.ts @@ -2,8 +2,8 @@ import { AppState, AppStateStatus } from 'react-native'; import { api, WS_URL } from './api'; import { eventBus } from '@/core/events/EventBus'; -import { MessageCategory, SystemMessageType, SystemMessageExtraData, MessageSegment } from '../types/dto'; -import { systemNotificationService } from './systemNotificationService'; +import { MessageCategory, SystemMessageType, SystemMessageExtraData, MessageSegment } from '@/types/dto'; +import { systemNotificationService } from '../notification/systemNotificationService'; export type WSMessageType = | 'chat' diff --git a/src/services/index.ts b/src/services/index.ts index 593a7e8..c61edb6 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -1,54 +1,6 @@ -/** - * 服务导出 - * 统一导出所有API服务 - */ - -// API 客户端 -export { api, WS_URL, TOKEN_KEY, REFRESH_TOKEN_KEY } from './api'; -export type { ApiResponse, PaginatedData, ApiError } from './api'; - -// 认证服务 -export { authService } from './authService'; -export { resolveAuthApiError } from './authService'; -export type { - LoginRequest, - RegisterRequest, - SendEmailCodeRequest, - ResetPasswordRequest, - VerifyCurrentUserEmailRequest, - AuthResponse, - RefreshTokenResponse, - UpdateUserRequest, - BlockedUserListResponse, - BlockStatusResponse, -} from './authService'; - -// 帖子服务 -export { postService } from './postService'; - -// 评论服务 -export { commentService } from './commentService'; - -// 消息服务 -export { messageService } from './messageService'; - -// 通知服务 -export { notificationService } from './notificationService'; - -// 文件上传服务 -export { uploadService } from './uploadService'; -export type { UploadResponse } from './uploadService'; - -// 推送服务 -export { pushService, registerDevice, getDevices, unregisterDevice, updateDeviceToken, getPushRecords } from './pushService'; - -// 投票服务 -export { voteService } from './voteService'; -export { channelService } from './channelService'; -export type { ChannelItem } from './channelService'; - -// WebSocket 实时服务 -export { wsService } from './wsService'; +export { api, WS_URL, TOKEN_KEY, REFRESH_TOKEN_KEY, ApiError } from './core'; +export type { ApiResponse, PaginatedData } from './core'; +export { wsService } from './core'; export type { WSMessage, WSMessageType, @@ -64,15 +16,32 @@ export type { WSGroupNoticeMessage, WSGroupMentionMessage, WSGroupReadMessage, - WSGroupRecallMessage -} from './wsService'; + WSGroupRecallMessage, +} from './core'; +export { handleError, createErrorHandler, safeAsync, createAppError, AppErrorCode } from './core'; +export type { AppError, ErrorHandlerOptions } from './core'; -// 系统通知服务 -export { systemNotificationService, getNotificationTitle } from './systemNotificationService'; -export type { AppNotificationType } from './systemNotificationService'; +export { authService, resolveAuthApiError } from './auth'; +export type { + LoginRequest, + RegisterRequest, + SendEmailCodeRequest, + ResetPasswordRequest, + VerifyCurrentUserEmailRequest, + AuthResponse, + RefreshTokenResponse, + UpdateUserRequest, + BlockedUserListResponse, + BlockStatusResponse, +} from './auth'; +export { verificationService } from './auth'; +export type { SubmitVerificationResponse } from './auth'; -// 群组服务 -export { groupService } from './groupService'; +export { postService, commentService, voteService, channelService, reportService } from './post'; +export type { ChannelItem } from './post'; + +export { messageService } from './message'; +export { groupService } from './message'; export type { GroupResponse, GroupMemberResponse, @@ -88,13 +57,16 @@ export type { SetMuteAllRequest, SetJoinTypeRequest, CreateAnnouncementRequest, -} from './groupService'; +} from './message'; -// 课表服务 -export { scheduleService } from './scheduleService'; -export type { CreateScheduleCourseRequest } from './scheduleService'; +export { notificationService } from './notification'; +export { systemNotificationService, getNotificationTitle } from './notification'; +export type { AppNotificationType } from './notification'; +export { pushService, registerDevice, getDevices, unregisterDevice, updateDeviceToken, getPushRecords } from './notification'; + +export { uploadService } from './upload'; +export type { UploadResponse } from './upload'; -// 后台保活服务 export { backgroundService, initBackgroundService, @@ -105,21 +77,12 @@ export { getVibrationConfig, setVibrationEnabled, checkBackgroundStatus, -} from './backgroundService'; +} from './background'; -// 统一提示/弹窗服务 -export { showPrompt } from './promptService'; -export { showConfirm } from './dialogService'; +export { showPrompt } from './ui'; +export { showConfirm } from './ui'; -// 统一错误处理服务 -export { handleError, createErrorHandler, safeAsync, createAppError } from './errorHandler'; -export type { AppError, ErrorHandlerOptions } from './errorHandler'; -export { AppErrorCode } from './errorHandler'; - -// APK 更新检查服务 -export { apkUpdateService, checkForAPKUpdate, manualCheckForUpdate } from './apkUpdateService'; -export type { APKVersionInfo, VersionCheckResult } from './apkUpdateService'; - -// 身份认证服务 -export { verificationService } from './verificationService'; -export type { SubmitVerificationResponse } from './verificationService'; +export { apkUpdateService, checkForAPKUpdate, manualCheckForUpdate } from './platform'; +export type { APKVersionInfo, VersionCheckResult } from './platform'; +export { scheduleService } from './platform'; +export type { CreateScheduleCourseRequest } from './platform'; diff --git a/src/services/groupService.ts b/src/services/message/groupService.ts similarity index 99% rename from src/services/groupService.ts rename to src/services/message/groupService.ts index bf35a95..27a34a1 100644 --- a/src/services/groupService.ts +++ b/src/services/message/groupService.ts @@ -4,7 +4,7 @@ * 使用 RESTful API: /api/v1/groups */ -import { api } from './api'; +import { api } from '../core/api'; import { GroupResponse, GroupMemberResponse, @@ -25,7 +25,7 @@ import { HandleGroupRequestAction, CursorPaginationRequest, CursorPaginationResponse, -} from '../types/dto'; +} from '@/types/dto'; function asGroupId(raw: unknown): string { return String(raw); diff --git a/src/services/message/index.ts b/src/services/message/index.ts new file mode 100644 index 0000000..7b856b9 --- /dev/null +++ b/src/services/message/index.ts @@ -0,0 +1,42 @@ +export { messageService } from './messageService'; +export type { RemoteConversationListPageResult } from './messageService'; +export type { + ConversationListResponse, + ConversationResponse, + ConversationDetailResponse, + MessageListResponse, + MessageResponse, + SendMessageRequest, + UnreadCountResponse, + ConversationUnreadCountResponse, + SystemMessageListResponse, + SystemUnreadCountResponse, +} from './messageService'; + +export { groupService } from './groupService'; +export type { + GroupResponse, + GroupMemberResponse, + GroupAnnouncementResponse, + GroupListResponse, + GroupMemberListResponse, + GroupAnnouncementListResponse, + CreateGroupRequest, + InviteMembersRequest, + TransferOwnerRequest, + SetRoleRequest, + SetNicknameRequest, + SetMuteAllRequest, + SetJoinTypeRequest, + CreateAnnouncementRequest, +} from './groupService'; + +export type { CustomSticker } from './stickerService'; +export { + getCustomStickers, + addStickerFromUrl, + deleteSticker, + isStickerExists, + reorderStickers, + batchDeleteStickers, +} from './stickerService'; diff --git a/src/services/messageService.ts b/src/services/message/messageService.ts similarity index 99% rename from src/services/messageService.ts rename to src/services/message/messageService.ts index 893e79e..784d660 100644 --- a/src/services/messageService.ts +++ b/src/services/message/messageService.ts @@ -4,8 +4,8 @@ * 使用新的 API 接口: /api/v1/conversations (RESTful action 风格) */ -import { api } from './api'; -import { wsService } from './wsService'; +import { api } from '../core/api'; +import { wsService } from '../core/wsService'; import { ConversationListResponse, ConversationResponse, @@ -21,7 +21,7 @@ import { MessageSegment, CursorPaginationRequest, CursorPaginationResponse, -} from '../types/dto'; +} from '@/types/dto'; import { conversationRepository, userCacheRepository } from '@/database'; /** 远端会话列表分页(offset / cursor)统一结果:拉取成功后均已执行本地缓存同步 */ diff --git a/src/services/stickerService.ts b/src/services/message/stickerService.ts similarity index 97% rename from src/services/stickerService.ts rename to src/services/message/stickerService.ts index 12c6ea5..7135d25 100644 --- a/src/services/stickerService.ts +++ b/src/services/message/stickerService.ts @@ -3,8 +3,8 @@ * 管理用户自定义添加的表情包(云端存储) */ -import { api } from './api'; -import { uploadService } from './uploadService'; +import { api } from '../core/api'; +import { uploadService } from '../upload/uploadService'; // 自定义表情类型 export interface CustomSticker { diff --git a/src/services/notification/index.ts b/src/services/notification/index.ts new file mode 100644 index 0000000..f0527a6 --- /dev/null +++ b/src/services/notification/index.ts @@ -0,0 +1,17 @@ +export { notificationService } from './notificationService'; + +export { systemNotificationService, getNotificationTitle } from './systemNotificationService'; +export type { AppNotificationType } from './systemNotificationService'; + +export { + NOTIFICATION_PREF_KEYS, + getNotificationPreferencesSync, + loadNotificationPreferences, + setVibrationPreference, + setPushNotificationsPreference, + setSoundPreference, + registerNotificationPresentationHandler, +} from './notificationPreferences'; +export type { NotificationPrefs } from './notificationPreferences'; + +export { pushService, registerDevice, getDevices, unregisterDevice, updateDeviceToken, getPushRecords } from './pushService'; \ No newline at end of file diff --git a/src/services/notificationPreferences.ts b/src/services/notification/notificationPreferences.ts similarity index 97% rename from src/services/notificationPreferences.ts rename to src/services/notification/notificationPreferences.ts index 8751067..c199941 100644 --- a/src/services/notificationPreferences.ts +++ b/src/services/notification/notificationPreferences.ts @@ -5,7 +5,7 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; import * as Notifications from 'expo-notifications'; -import { setVibrationEnabled } from './messageVibrationService'; +import { setVibrationEnabled } from '../platform/messageVibrationService'; export const NOTIFICATION_PREF_KEYS = { /** 与历史版本保持一致 */ diff --git a/src/services/notificationService.ts b/src/services/notification/notificationService.ts similarity index 98% rename from src/services/notificationService.ts rename to src/services/notification/notificationService.ts index 99a912d..7fd8203 100644 --- a/src/services/notificationService.ts +++ b/src/services/notification/notificationService.ts @@ -3,9 +3,9 @@ * 处理系统通知、互动通知等功能 */ -import { api, PaginatedData } from './api'; -import { Notification, NotificationBadge, NotificationType } from '../types'; -import { CursorPaginationRequest, CursorPaginationResponse } from '../types/dto'; +import { api, PaginatedData } from '../core/api'; +import { Notification, NotificationBadge, NotificationType } from '@/types'; +import { CursorPaginationRequest, CursorPaginationResponse } from '@/types/dto'; // 通知列表响应 interface NotificationListResponse { diff --git a/src/services/pushService.ts b/src/services/notification/pushService.ts similarity index 98% rename from src/services/pushService.ts rename to src/services/notification/pushService.ts index 6a6b3ce..3e380e5 100644 --- a/src/services/pushService.ts +++ b/src/services/notification/pushService.ts @@ -2,12 +2,12 @@ * 推送服务 - 管理设备Token和推送记录 */ -import { api } from './api'; +import { api } from '../core/api'; import { DeviceTokenResponse, RegisterDeviceRequest, PushRecordResponse -} from '../types/dto'; +} from '@/types/dto'; // 推送服务类 class PushService { diff --git a/src/services/systemNotificationService.ts b/src/services/notification/systemNotificationService.ts similarity index 97% rename from src/services/systemNotificationService.ts rename to src/services/notification/systemNotificationService.ts index d617e3a..4a2fe1b 100644 --- a/src/services/systemNotificationService.ts +++ b/src/services/notification/systemNotificationService.ts @@ -6,10 +6,10 @@ import * as Notifications from 'expo-notifications'; import { Platform, AppState, AppStateStatus } from 'react-native'; -import type { WSChatMessage, WSNotificationMessage, WSAnnouncementMessage } from './wsService'; -import { extractTextFromSegments } from '../types/dto'; +import type { WSChatMessage, WSNotificationMessage, WSAnnouncementMessage } from '../core/wsService'; +import { extractTextFromSegments } from '@/types/dto'; import { getNotificationPreferencesSync } from './notificationPreferences'; -import { vibrateOnMessage } from './messageVibrationService'; +import { vibrateOnMessage } from '../platform/messageVibrationService'; // 通知渠道配置 const CHANNEL_ID = 'default'; diff --git a/src/services/apkUpdateService.ts b/src/services/platform/apkUpdateService.ts similarity index 99% rename from src/services/apkUpdateService.ts rename to src/services/platform/apkUpdateService.ts index 5995ec7..35c7d0b 100644 --- a/src/services/apkUpdateService.ts +++ b/src/services/platform/apkUpdateService.ts @@ -6,7 +6,7 @@ import { Platform, Linking, Alert } from 'react-native'; import Constants from 'expo-constants'; import AsyncStorage from '@react-native-async-storage/async-storage'; -import { showConfirm } from './dialogService'; +import { showConfirm } from '../ui/dialogService'; // 条件导入原生模块(仅在 Android 上可用) // eslint-disable-next-line @typescript-eslint/no-var-requires diff --git a/src/services/platform/index.ts b/src/services/platform/index.ts new file mode 100644 index 0000000..4d9000b --- /dev/null +++ b/src/services/platform/index.ts @@ -0,0 +1,13 @@ +export { apkUpdateService, checkForAPKUpdate, manualCheckForUpdate } from './apkUpdateService'; +export type { APKVersionInfo, VersionCheckResult } from './apkUpdateService'; + +export { scheduleService } from './scheduleService'; +export type { CreateScheduleCourseRequest, SyncScheduleRequest } from './scheduleService'; + +export { + triggerVibration, + vibrateOnMessage, + setVibrationConfig, + getVibrationConfig, + setVibrationEnabled, +} from './messageVibrationService'; \ No newline at end of file diff --git a/src/services/messageVibrationService.ts b/src/services/platform/messageVibrationService.ts similarity index 100% rename from src/services/messageVibrationService.ts rename to src/services/platform/messageVibrationService.ts diff --git a/src/services/scheduleService.ts b/src/services/platform/scheduleService.ts similarity index 96% rename from src/services/scheduleService.ts rename to src/services/platform/scheduleService.ts index 875d20c..24cb65b 100644 --- a/src/services/scheduleService.ts +++ b/src/services/platform/scheduleService.ts @@ -1,5 +1,5 @@ -import { api } from './api'; -import { Course } from '../types/schedule'; +import { api } from '../core/api'; +import { Course } from '@/types/schedule'; interface ScheduleCourseDTO { id: string; diff --git a/src/services/channelService.ts b/src/services/post/channelService.ts similarity index 94% rename from src/services/channelService.ts rename to src/services/post/channelService.ts index 5ed927f..b10681a 100644 --- a/src/services/channelService.ts +++ b/src/services/post/channelService.ts @@ -1,4 +1,4 @@ -import { api } from './api'; +import { api } from '../core/api'; export interface ChannelItem { id: string; diff --git a/src/services/commentService.ts b/src/services/post/commentService.ts similarity index 98% rename from src/services/commentService.ts rename to src/services/post/commentService.ts index 698c0b7..b746dde 100644 --- a/src/services/commentService.ts +++ b/src/services/post/commentService.ts @@ -3,9 +3,9 @@ * 处理评论的增删改查、点赞等功能 */ -import { api, PaginatedData } from './api'; -import { Comment, CreateCommentInput } from '../types'; -import { CursorPaginationRequest, CursorPaginationResponse, CommentDTO } from '../types/dto'; +import { api, PaginatedData } from '../core/api'; +import { Comment, CreateCommentInput } from '@/types'; +import { CursorPaginationRequest, CursorPaginationResponse, CommentDTO } from '@/types/dto'; // 评论列表响应 interface CommentListResponse { diff --git a/src/services/post/index.ts b/src/services/post/index.ts new file mode 100644 index 0000000..6c25329 --- /dev/null +++ b/src/services/post/index.ts @@ -0,0 +1,15 @@ +export { postService } from './postService'; + +export { commentService } from './commentService'; + +export { voteService } from './voteService'; + +export { channelService } from './channelService'; +export type { ChannelItem } from './channelService'; + +export { reportService, REPORT_REASONS } from './reportService'; +export type { ReportReason, ReportTargetType, ReportResponse } from './reportService'; + +export { postSyncService } from './PostSyncService'; +export type { PostDetailState, PostsState } from './PostSyncService'; +export { mergePostListWithFastPath, mergeRefreshWindow } from './postMerge'; \ No newline at end of file diff --git a/src/services/postService.ts b/src/services/post/postService.ts similarity index 98% rename from src/services/postService.ts rename to src/services/post/postService.ts index 922956f..5ca4325 100644 --- a/src/services/postService.ts +++ b/src/services/post/postService.ts @@ -3,9 +3,9 @@ * 互动操作(点赞、收藏)请使用 postSyncService */ -import { api, PaginatedData } from './api'; -import { Post, CreatePostInput } from '../types'; -import { CursorPaginationRequest, CursorPaginationResponse } from '../types/dto'; +import { api, PaginatedData } from '../core/api'; +import { Post, CreatePostInput } from '@/types'; +import { CursorPaginationRequest, CursorPaginationResponse } from '@/types/dto'; // 帖子列表响应 interface PostListResponse { diff --git a/src/services/reportService.ts b/src/services/post/reportService.ts similarity index 98% rename from src/services/reportService.ts rename to src/services/post/reportService.ts index 2cf1b4e..f1edadb 100644 --- a/src/services/reportService.ts +++ b/src/services/post/reportService.ts @@ -3,7 +3,7 @@ * 处理帖子、评论、消息的举报功能 */ -import { api } from './api'; +import { api } from '../core/api'; // 举报原因类型 export type ReportReason = 'spam' | 'inappropriate' | 'harassment' | 'misinformation' | 'other'; diff --git a/src/services/voteService.ts b/src/services/post/voteService.ts similarity index 96% rename from src/services/voteService.ts rename to src/services/post/voteService.ts index 6861c7d..491930e 100644 --- a/src/services/voteService.ts +++ b/src/services/post/voteService.ts @@ -3,8 +3,8 @@ * 处理投票相关的API调用 */ -import { api } from './api'; -import { Post, VoteResultDTO, CreateVotePostRequest } from '../types'; +import { api } from '../core/api'; +import { Post, VoteResultDTO, CreateVotePostRequest } from '@/types'; // 投票响应 interface VoteResponse { diff --git a/src/services/alertOverride.ts b/src/services/ui/alertOverride.ts similarity index 100% rename from src/services/alertOverride.ts rename to src/services/ui/alertOverride.ts diff --git a/src/services/dialogService.ts b/src/services/ui/dialogService.ts similarity index 100% rename from src/services/dialogService.ts rename to src/services/ui/dialogService.ts diff --git a/src/services/ui/index.ts b/src/services/ui/index.ts new file mode 100644 index 0000000..c540e69 --- /dev/null +++ b/src/services/ui/index.ts @@ -0,0 +1,16 @@ +export { + showPrompt, + bindPromptListener, + PromptType, + PromptPayload, +} from './promptService'; + +export { + showDialog, + bindDialogListener, + showConfirm, + DialogPayload, + ConfirmOptions, +} from './dialogService'; + +export { installAlertOverride } from './alertOverride'; \ No newline at end of file diff --git a/src/services/promptService.ts b/src/services/ui/promptService.ts similarity index 100% rename from src/services/promptService.ts rename to src/services/ui/promptService.ts diff --git a/src/services/upload/index.ts b/src/services/upload/index.ts new file mode 100644 index 0000000..0612075 --- /dev/null +++ b/src/services/upload/index.ts @@ -0,0 +1,2 @@ +export { uploadService } from './uploadService'; +export type { UploadResponse } from './uploadService'; \ No newline at end of file diff --git a/src/services/uploadService.ts b/src/services/upload/uploadService.ts similarity index 99% rename from src/services/uploadService.ts rename to src/services/upload/uploadService.ts index 8b4b3b6..a664ac5 100644 --- a/src/services/uploadService.ts +++ b/src/services/upload/uploadService.ts @@ -3,7 +3,7 @@ * 处理图片、视频等文件上传功能 */ -import { api } from './api'; +import { api } from '../core/api'; /** * 根据 URI 扩展名和 mimeType 推断正确的文件信息 diff --git a/src/stores/authStore.ts b/src/stores/authStore.ts index b650b10..0b421ba 100644 --- a/src/stores/authStore.ts +++ b/src/stores/authStore.ts @@ -14,7 +14,7 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; import { create } from 'zustand'; import { User } from '../types'; import { authService, resolveAuthApiError, LoginRequest, RegisterRequest } from '../services'; -import { wsService } from '../services/wsService'; +import { wsService } from '@/services/core'; import { callStore } from './callStore'; import { useSessionStore } from './sessionStore'; import { diff --git a/src/stores/callStore.ts b/src/stores/callStore.ts index 0aa23e9..6bd6584 100644 --- a/src/stores/callStore.ts +++ b/src/stores/callStore.ts @@ -6,8 +6,8 @@ import { WSCallSDPMessage, WSCallICEMessage, WSErrorMessage, -} from '../services/wsService'; -import { webrtcManager, ICEServer } from '../services/webrtc'; +} from '@/services/core'; +import { webrtcManager, ICEServer } from '@/services/webrtc'; import { getCurrentUserId } from './sessionStore'; import { useUserStore } from './userStore'; import { userManager } from './userManager'; diff --git a/src/stores/conversationListSources.ts b/src/stores/conversationListSources.ts index a1d5e14..83fb2b7 100644 --- a/src/stores/conversationListSources.ts +++ b/src/stores/conversationListSources.ts @@ -3,7 +3,7 @@ */ import { ConversationResponse } from '../types/dto'; -import { messageService } from '../services/messageService'; +import { messageService } from '@/services/message'; import { conversationRepository } from '@/database'; export const CONVERSATION_LIST_PAGE_SIZE = 20; diff --git a/src/stores/group/GroupManager.ts b/src/stores/group/GroupManager.ts index e4b9a94..c910834 100644 --- a/src/stores/group/GroupManager.ts +++ b/src/stores/group/GroupManager.ts @@ -4,7 +4,7 @@ import type { GroupMemberResponse, GroupResponse, } from '../../types/dto'; -import { groupService } from '../../services/groupService'; +import { groupService } from '@/services/message'; import { groupCacheRepository, userCacheRepository } from '@/database'; import { useGroupManagerStore } from './groupStore'; import { createCacheEntry, isCacheExpired, DEFAULT_TTL } from '../utils/cache'; diff --git a/src/stores/groupListSources.ts b/src/stores/groupListSources.ts index e701f74..ef04a5f 100644 --- a/src/stores/groupListSources.ts +++ b/src/stores/groupListSources.ts @@ -9,7 +9,7 @@ import { GroupMemberListResponse, CursorPaginationRequest, } from '../types/dto'; -import { groupService } from '../services/groupService'; +import { groupService } from '@/services/message'; import { groupCacheRepository } from '@/database'; export const GROUP_LIST_PAGE_SIZE = 20; diff --git a/src/stores/groupMemberListSources.ts b/src/stores/groupMemberListSources.ts index 06e490b..2e08bee 100644 --- a/src/stores/groupMemberListSources.ts +++ b/src/stores/groupMemberListSources.ts @@ -1,4 +1,4 @@ -import { groupService } from '../services/groupService'; +import { groupService } from '@/services/message'; import { CursorPaginationResponse, GroupMemberResponse } from '../types/dto'; export const GROUP_MEMBER_LIST_PAGE_SIZE = 50; diff --git a/src/stores/message/services/ConversationOperations.ts b/src/stores/message/services/ConversationOperations.ts index 2ac2fbc..3b6c715 100644 --- a/src/stores/message/services/ConversationOperations.ts +++ b/src/stores/message/services/ConversationOperations.ts @@ -8,7 +8,7 @@ */ import type { ConversationResponse } from '../../../types/dto'; -import { messageService } from '../../../services/messageService'; +import { messageService } from '@/services/message'; import { conversationRepository } from '@/database'; import type { IConversationOperations } from '../types'; import { useMessageStore, normalizeConversationId } from '../store'; diff --git a/src/stores/message/services/MessageSendService.ts b/src/stores/message/services/MessageSendService.ts index 5a924bf..4bfe214 100644 --- a/src/stores/message/services/MessageSendService.ts +++ b/src/stores/message/services/MessageSendService.ts @@ -8,7 +8,7 @@ */ import type { MessageResponse, MessageSegment, ConversationResponse } from '../../../types/dto'; -import { messageService } from '../../../services/messageService'; +import { messageService } from '@/services/message'; import { messageRepository } from '@/database'; import type { IMessageSendService } from '../types'; import { useMessageStore, mergeMessagesById } from '../store'; diff --git a/src/stores/message/services/MessageSyncService.ts b/src/stores/message/services/MessageSyncService.ts index dac0dc9..e5ed0f4 100644 --- a/src/stores/message/services/MessageSyncService.ts +++ b/src/stores/message/services/MessageSyncService.ts @@ -8,7 +8,7 @@ */ import type { ConversationResponse, MessageResponse } from '../../../types/dto'; -import { messageService } from '../../../services/messageService'; +import { messageService } from '@/services/message'; import { messageRepository, conversationRepository } from '@/database'; import { MessageMapper } from '@/data/mappers'; import { diff --git a/src/stores/message/services/ReadReceiptManager.ts b/src/stores/message/services/ReadReceiptManager.ts index 9d474ef..52b66fb 100644 --- a/src/stores/message/services/ReadReceiptManager.ts +++ b/src/stores/message/services/ReadReceiptManager.ts @@ -8,7 +8,7 @@ */ import type { ConversationResponse } from '../../../types/dto'; -import { messageService } from '../../../services/messageService'; +import { messageService } from '@/services/message'; import { messageRepository, conversationRepository } from '@/database'; import type { ReadStateRecord, IReadReceiptManager } from '../types'; import { READ_STATE_PROTECTION_DELAY } from '../constants'; diff --git a/src/stores/message/services/UserCacheService.ts b/src/stores/message/services/UserCacheService.ts index 7d4f22a..9b95cb1 100644 --- a/src/stores/message/services/UserCacheService.ts +++ b/src/stores/message/services/UserCacheService.ts @@ -4,7 +4,7 @@ */ import type { MessageResponse, UserDTO } from '../../../types/dto'; -import { api } from '../../../services/api'; +import { api } from '@/services/core'; import { userCacheRepository } from '@/database'; import type { IUserCacheService } from '../types'; diff --git a/src/stores/message/services/WSMessageHandler.ts b/src/stores/message/services/WSMessageHandler.ts index 58e34b8..e7c7848 100644 --- a/src/stores/message/services/WSMessageHandler.ts +++ b/src/stores/message/services/WSMessageHandler.ts @@ -16,8 +16,8 @@ import type { WSGroupRecallMessage, WSGroupTypingMessage, WSGroupNoticeMessage, -} from '../../../services/wsService'; -import { wsService, GroupNoticeType } from '../../../services/wsService'; +} from '@/services/core'; +import { wsService, GroupNoticeType } from '@/services/core'; import { eventBus } from '@/core/events/EventBus'; import { messageRepository } from '@/database'; import type { MessageResponse, ConversationResponse } from '../../../types/dto'; diff --git a/src/stores/post/PostManager.ts b/src/stores/post/PostManager.ts index 948f56a..4b05d3e 100644 --- a/src/stores/post/PostManager.ts +++ b/src/stores/post/PostManager.ts @@ -6,7 +6,7 @@ */ import type { Post } from '../../types'; -import { postService } from '../../services/postService'; +import { postService } from '@/services/post'; import { usePostManagerStore } from './postStore'; import { createCacheEntry, isCacheExpired, DEFAULT_TTL } from '../utils/cache'; import { createDedupe } from '../utils/requestDedupe'; diff --git a/src/stores/postListSources.ts b/src/stores/postListSources.ts index 48dd1bd..e0dc59f 100644 --- a/src/stores/postListSources.ts +++ b/src/stores/postListSources.ts @@ -3,7 +3,7 @@ */ import { Post } from '../types'; -import { postService } from '../services/postService'; +import { postService } from '@/services/post'; import type { CursorPaginationRequest } from '../types/dto'; export const POST_LIST_PAGE_SIZE = 20; diff --git a/src/stores/user/UserManager.ts b/src/stores/user/UserManager.ts index 9958570..431246e 100644 --- a/src/stores/user/UserManager.ts +++ b/src/stores/user/UserManager.ts @@ -6,7 +6,7 @@ */ import type { UserDTO } from '../../types/dto'; -import { authService } from '../../services/authService'; +import { authService } from '@/services/auth'; import { userCacheRepository } from '@/database'; import { useUserManagerStore } from './userStore'; import { createCacheEntry, isCacheExpired, DEFAULT_TTL } from '../utils/cache'; diff --git a/src/stores/userStore.ts b/src/stores/userStore.ts index a0a0960..8e220b8 100644 --- a/src/stores/userStore.ts +++ b/src/stores/userStore.ts @@ -6,7 +6,7 @@ import { create } from 'zustand'; import { User, Post, Notification, NotificationBadge } from '../types'; -import { PaginatedData } from '../services/api'; +import { PaginatedData } from '@/services/core'; import { authService, postService, diff --git a/src/stores/verificationStore.ts b/src/stores/verificationStore.ts index 67f0580..2b5b707 100644 --- a/src/stores/verificationStore.ts +++ b/src/stores/verificationStore.ts @@ -4,7 +4,7 @@ */ import { create } from 'zustand'; -import { verificationService } from '../services/verificationService'; +import { verificationService } from '@/services/auth'; import { VerificationStatusDTO, VerificationRecordDTO,