diff --git a/app/(auth)/login.tsx b/app/(auth)/login.tsx index 33b1e64..dc33038 100644 --- a/app/(auth)/login.tsx +++ b/app/(auth)/login.tsx @@ -9,7 +9,7 @@ import { z } from "zod"; import { queries } from "@/entities"; import { signIn, Role, type UserInfo, setLocalUserInfo } from "@/entities/user"; -import { registerFcmTokenToServer, retryPendingDeactivate } from "@/shared/lib/fcm"; +import { registerFcmTokenToServer, retryPendingDeactivate } from "@/entities/fcm"; import { Button } from "@/shared/ui/buttons"; import { LoginInput } from "@/shared/ui/input"; diff --git a/app/(tabs-care)/account.tsx b/app/(tabs-care)/account.tsx index 236d2b3..f1f00cb 100644 --- a/app/(tabs-care)/account.tsx +++ b/app/(tabs-care)/account.tsx @@ -4,7 +4,7 @@ import { ActivityIndicator, Alert, Text, View } from "react-native"; import { queries } from "@/entities"; import { removeLocalUserInfo } from "@/entities/user"; -import { deactivateFcmTokenFromServer } from "@/shared/lib/fcm"; +import { deactivateFcmTokenFromServer } from "@/entities/fcm"; import { Button, GradientBanner, Icon, MainHeader, MainLayout } from "@/shared/ui"; export default function AccountScreen( diff --git a/app/(tabs-care)/diary-list/analysis.tsx b/app/(tabs-care)/diary-list/analysis.tsx index d1b1c05..5cb0d3d 100644 --- a/app/(tabs-care)/diary-list/analysis.tsx +++ b/app/(tabs-care)/diary-list/analysis.tsx @@ -3,7 +3,7 @@ import { ScrollView, Text, View } from "react-native"; import { queries } from "@/entities"; import { Role } from "@/entities/user"; -import { MonthlyFrequencyStatistics, WeeklyStatistics } from "@/shared/lib/emotions"; +import { MonthlyFrequencyStatistics, WeeklyStatistics } from "@/widgets/statistics"; import { BackHeader, HelpButton, MainLayout } from "@/shared/ui"; export default function DiaryAnalysisScreen() { diff --git a/app/(tabs-care)/home.tsx b/app/(tabs-care)/home.tsx index 1a745b3..df33984 100644 --- a/app/(tabs-care)/home.tsx +++ b/app/(tabs-care)/home.tsx @@ -4,7 +4,8 @@ import { useState } from "react"; import { RefreshControl, ScrollView, Text, TouchableOpacity, View } from "react-native"; import { queries } from "@/entities"; -import { emotionKorMap, EmotionIconComponent, MonthlyFrequencyStatistics, WeeklyStatistics } from "@/shared/lib/emotions"; +import { emotionKorMap, EmotionIconComponent } from "@/shared/lib/emotions"; +import { MonthlyFrequencyStatistics, WeeklyStatistics } from "@/widgets/statistics"; import { Footer, GradientBanner, MainHeader, MainLayout, RingButton } from "@/shared/ui"; import { Icon } from "@/shared/ui/svg"; diff --git a/app/(tabs-care)/report.tsx b/app/(tabs-care)/report.tsx index 6659ede..e77bf07 100644 --- a/app/(tabs-care)/report.tsx +++ b/app/(tabs-care)/report.tsx @@ -1,5 +1,5 @@ import { queries } from "@/entities"; -import { MonthlyFrequencyStatistics, WeeklyStatistics } from "@/shared/lib/emotions/components"; +import { MonthlyFrequencyStatistics, WeeklyStatistics } from "@/widgets/statistics"; import { Footer, MainHeader, MainLayout } from "@/shared/ui"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { useState } from "react"; diff --git a/app/(tabs-user)/account.tsx b/app/(tabs-user)/account.tsx index 5c6b132..afd6e4d 100644 --- a/app/(tabs-user)/account.tsx +++ b/app/(tabs-user)/account.tsx @@ -5,7 +5,7 @@ import { ActivityIndicator, Alert, Text, View } from "react-native"; import { queries } from "@/entities"; import { removeLocalUserInfo } from "@/entities/user"; -import { deactivateFcmTokenFromServer } from "@/shared/lib/fcm"; +import { deactivateFcmTokenFromServer } from "@/entities/fcm"; import { Button, HelpButton, Icon, MainHeader, MainLayout } from "@/shared/ui"; export default function AccountScreen() { diff --git a/app/(tabs-user)/chat-list/[id].tsx b/app/(tabs-user)/chat-list/[id].tsx index 56c3fdf..6153cd2 100644 --- a/app/(tabs-user)/chat-list/[id].tsx +++ b/app/(tabs-user)/chat-list/[id].tsx @@ -12,12 +12,14 @@ import { } from "react-native"; import { queries } from "@/entities"; -import { getChatHistory, type ChatHistoryResponse, type ChatMessage } from "@/entities/chatbot"; import { + getChatHistory, + type ChatHistoryResponse, + type ChatMessage, cleanupExpiredPendingChatMessages, getPendingChatMessages, removePendingChatMessage, -} from "@/shared/lib/chat-pending"; +} from "@/entities/chatbot"; import { normalizeEmotion } from "@/shared/lib/emotions"; import { BackHeader, MainLayout } from "@/shared/ui"; import { ChatBubble, ChatInput, DiaryBottomSheet, VoiceMessageModal, VoicePlaybackModal } from "@/widgets/chat"; diff --git a/app/(tabs-user)/chat-list/index.tsx b/app/(tabs-user)/chat-list/index.tsx index 0338992..7d80a3e 100644 --- a/app/(tabs-user)/chat-list/index.tsx +++ b/app/(tabs-user)/chat-list/index.tsx @@ -12,8 +12,7 @@ import { } from "react-native"; import { queries } from "@/entities"; -import { type ChatSessionItem } from "@/entities/chatbot"; -import { getPendingChatMessages } from "@/shared/lib/chat-pending"; +import { type ChatSessionItem, getPendingChatMessages } from "@/entities/chatbot"; import { EmotionComponentWithText, normalizeEmotion } from "@/shared/lib/emotions"; import { cleanupExpiredPendingSessions, diff --git a/app/(tabs-user)/diary-list/analysis.tsx b/app/(tabs-user)/diary-list/analysis.tsx index 33fac7d..d7b12e3 100644 --- a/app/(tabs-user)/diary-list/analysis.tsx +++ b/app/(tabs-user)/diary-list/analysis.tsx @@ -1,6 +1,6 @@ import { queries } from "@/entities"; import { Role } from "@/entities/user/api/schema"; -import { MonthlyFrequencyStatistics, WeeklyStatistics } from "@/shared/lib/emotions/components"; +import { MonthlyFrequencyStatistics, WeeklyStatistics } from "@/widgets/statistics"; import { BackHeader, HelpButton, MainLayout } from "@/shared/ui"; import { WeeklyStory } from "@/widgets/chat/report"; import { useQueryClient, useSuspenseQuery } from "@tanstack/react-query"; diff --git a/app/_layout.tsx b/app/_layout.tsx index cfadec7..c8e4193 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -14,7 +14,7 @@ import { SafeAreaProvider } from "react-native-safe-area-context"; import { queries } from "@/entities"; import { type UserInfo, Role, getLocalUserInfo } from "@/entities/user"; -import { FcmProvider } from "@/shared/lib/fcm"; +import { FcmProvider } from "@/entities/fcm"; import { useInAppUpdates } from "@/shared/lib/useInAppUpdates"; import "../index.css"; diff --git a/entities/chatbot/api/schema.ts b/entities/chatbot/api/schema.ts index a847442..03652d6 100644 --- a/entities/chatbot/api/schema.ts +++ b/entities/chatbot/api/schema.ts @@ -1,4 +1,4 @@ -import { Emotion } from "@/entities/voices/api"; +import { type Emotion } from "@/shared/types/emotion"; // Search API Types export interface SearchRequest { diff --git a/entities/chatbot/index.ts b/entities/chatbot/index.ts index 3ddaf61..312d4b7 100644 --- a/entities/chatbot/index.ts +++ b/entities/chatbot/index.ts @@ -3,4 +3,5 @@ import { mergeQueryKeys } from "@lukemorales/query-key-factory"; import { chatbotQueries } from "./api"; export * from "./api"; +export * from "./lib"; export const queries = mergeQueryKeys(chatbotQueries); diff --git a/shared/lib/chat-pending/__tests__/chat-pending-storage.test.ts b/entities/chatbot/lib/__tests__/chat-pending-storage.test.ts similarity index 99% rename from shared/lib/chat-pending/__tests__/chat-pending-storage.test.ts rename to entities/chatbot/lib/__tests__/chat-pending-storage.test.ts index cb78ec0..51b0129 100644 --- a/shared/lib/chat-pending/__tests__/chat-pending-storage.test.ts +++ b/entities/chatbot/lib/__tests__/chat-pending-storage.test.ts @@ -1,4 +1,4 @@ -import { ChatMessage } from "@/entities/chatbot/api/schema"; +import { type ChatMessage } from "../../api/schema"; import AsyncStorage from "@react-native-async-storage/async-storage"; import { addPendingChatMessage, diff --git a/shared/lib/chat-pending/chat-pending-storage.ts b/entities/chatbot/lib/chat-pending-storage.ts similarity index 99% rename from shared/lib/chat-pending/chat-pending-storage.ts rename to entities/chatbot/lib/chat-pending-storage.ts index 3fa5710..101af79 100644 --- a/shared/lib/chat-pending/chat-pending-storage.ts +++ b/entities/chatbot/lib/chat-pending-storage.ts @@ -1,4 +1,4 @@ -import { ChatMessage } from "@/entities/chatbot/api/schema"; +import { type ChatMessage } from "../api/schema"; import AsyncStorage from "@react-native-async-storage/async-storage"; const CHAT_PENDING_KEY = "chat-pending-messages"; diff --git a/shared/lib/chat-pending/index.ts b/entities/chatbot/lib/index.ts similarity index 100% rename from shared/lib/chat-pending/index.ts rename to entities/chatbot/lib/index.ts diff --git a/entities/fcm/index.ts b/entities/fcm/index.ts index cb372d3..cf1d1c7 100644 --- a/entities/fcm/index.ts +++ b/entities/fcm/index.ts @@ -3,5 +3,5 @@ import { mergeQueryKeys } from "@lukemorales/query-key-factory"; import { fcmQueries } from "./api"; export * from "./api"; +export * from "./lib"; export const queries = mergeQueryKeys(fcmQueries); - diff --git a/shared/lib/fcm/fcm-processes.ts b/entities/fcm/lib/fcm-processes.ts similarity index 100% rename from shared/lib/fcm/fcm-processes.ts rename to entities/fcm/lib/fcm-processes.ts diff --git a/shared/lib/fcm/fcm-provider.tsx b/entities/fcm/lib/fcm-provider.tsx similarity index 98% rename from shared/lib/fcm/fcm-provider.tsx rename to entities/fcm/lib/fcm-provider.tsx index 941d10e..0afe3a9 100644 --- a/shared/lib/fcm/fcm-provider.tsx +++ b/entities/fcm/lib/fcm-provider.tsx @@ -1,4 +1,4 @@ -import { ProcessManager } from '@/shared/util/process'; +import { ProcessManager } from "@/shared/util/process"; import messaging from '@react-native-firebase/messaging'; import { type EventSubscription } from 'expo-modules-core'; import * as Notifications from 'expo-notifications'; diff --git a/shared/lib/fcm/index.ts b/entities/fcm/lib/index.ts similarity index 100% rename from shared/lib/fcm/index.ts rename to entities/fcm/lib/index.ts diff --git a/shared/lib/fcm/token-management.ts b/entities/fcm/lib/token-management.ts similarity index 97% rename from shared/lib/fcm/token-management.ts rename to entities/fcm/lib/token-management.ts index 0802a47..59a1868 100644 --- a/shared/lib/fcm/token-management.ts +++ b/entities/fcm/lib/token-management.ts @@ -1,4 +1,4 @@ -import { registerFcmToken } from "@/entities/fcm/api"; +import { registerFcmToken } from "../api"; import AsyncStorage from "@react-native-async-storage/async-storage"; import Constants from "expo-constants"; import * as Notifications from "expo-notifications"; @@ -95,7 +95,7 @@ export const deactivateFcmTokenFromServer = async ( username: string ): Promise<{ success: boolean; error?: Error }> => { try { - const { deactivateFcmToken } = await import("@/entities/fcm/api"); + const { deactivateFcmToken } = await import("../api"); const deviceId = await getStoredDeviceId(); await deactivateFcmToken({ diff --git a/entities/voices/api/schema.ts b/entities/voices/api/schema.ts index a637d94..810dfb4 100644 --- a/entities/voices/api/schema.ts +++ b/entities/voices/api/schema.ts @@ -1,18 +1,13 @@ +import { type Emotion } from "@/shared/types/emotion"; + +export type { Emotion }; + // Common file type for React Native FormData export interface RNFileParam { uri: string; type: string; name: string; } - -export type Emotion = - | "unknown" - | "surprise" - | "neutral" - | "happy" - | "sad" - | "anxiety" - | "angry"; // Upload voice with question (multipart/form-data + optional username query) export interface UploadVoiceWithQuestionRequest { file: RNFileParam; diff --git a/shared/lib/emotions/components/EmotionComponentWithText.tsx b/shared/lib/emotions/components/EmotionComponentWithText.tsx index 897f90c..a763ca7 100644 --- a/shared/lib/emotions/components/EmotionComponentWithText.tsx +++ b/shared/lib/emotions/components/EmotionComponentWithText.tsx @@ -1,4 +1,4 @@ -import { Emotion } from "@/entities/voices/api/schema"; +import { type Emotion } from "@/shared/types/emotion"; import { cn } from "@/shared/util/style"; import React from "react"; import { Text, View } from "react-native"; diff --git a/shared/lib/emotions/components/EmotionIconComponent.tsx b/shared/lib/emotions/components/EmotionIconComponent.tsx index 4e8bc5f..fb760ec 100644 --- a/shared/lib/emotions/components/EmotionIconComponent.tsx +++ b/shared/lib/emotions/components/EmotionIconComponent.tsx @@ -1,4 +1,4 @@ -import { Emotion } from "@/entities/voices/api/schema"; +import { type Emotion } from "@/shared/types/emotion"; import { Icon } from "@/shared/ui/svg"; import React from "react"; diff --git a/shared/lib/emotions/components/index.ts b/shared/lib/emotions/components/index.ts index 84d6172..4389980 100644 --- a/shared/lib/emotions/components/index.ts +++ b/shared/lib/emotions/components/index.ts @@ -1,4 +1,2 @@ export * from "./EmotionComponentWithText"; export * from "./EmotionIconComponent"; -export * from "./MonthlyFrequencyStatistics"; -export * from "./WeeklyStatistics"; diff --git a/shared/lib/emotions/constant.ts b/shared/lib/emotions/constant.ts index 7e43d98..4db1a5d 100644 --- a/shared/lib/emotions/constant.ts +++ b/shared/lib/emotions/constant.ts @@ -1,4 +1,4 @@ -import { Emotion } from "@/entities/voices/api/schema"; +import { type Emotion } from "@/shared/types/emotion"; export const emotionKorMap: Record = { happy: "즐거움", neutral: "안정", diff --git a/shared/lib/emotions/mock.ts b/shared/lib/emotions/mock.ts index 3ea3119..fcf867c 100644 --- a/shared/lib/emotions/mock.ts +++ b/shared/lib/emotions/mock.ts @@ -1,4 +1,4 @@ -import { Emotion } from "@/entities/voices/api/schema"; +import { type Emotion } from "@/shared/types/emotion"; export const emotionCharacteristics: Record = { unknown: ["데이터가 없습니다."], diff --git a/shared/lib/emotions/util.ts b/shared/lib/emotions/util.ts index b893f8f..5b1825f 100644 --- a/shared/lib/emotions/util.ts +++ b/shared/lib/emotions/util.ts @@ -1,4 +1,4 @@ -import { Emotion } from "@/entities/voices/api/schema"; +import { type Emotion } from "@/shared/types/emotion"; export const normalizeEmotion = (raw?: string | null): Emotion | null => { if (!raw) return null; const v = String(raw).trim().toLowerCase(); diff --git a/shared/lib/index.ts b/shared/lib/index.ts index a0841e9..8b13789 100644 --- a/shared/lib/index.ts +++ b/shared/lib/index.ts @@ -1 +1 @@ -export * from "./fcm"; + diff --git a/shared/lib/session-pending/index.ts b/shared/lib/session-pending/index.ts index 7ad82ae..85e1a61 100644 --- a/shared/lib/session-pending/index.ts +++ b/shared/lib/session-pending/index.ts @@ -1,2 +1 @@ export * from "./session-pending-storage"; -export * from "./useSessionPending"; diff --git a/shared/types/emotion.ts b/shared/types/emotion.ts new file mode 100644 index 0000000..074bdc0 --- /dev/null +++ b/shared/types/emotion.ts @@ -0,0 +1,8 @@ +export type Emotion = + | "unknown" + | "surprise" + | "neutral" + | "happy" + | "sad" + | "anxiety" + | "angry"; diff --git a/shared/types/index.ts b/shared/types/index.ts new file mode 100644 index 0000000..6a3c0af --- /dev/null +++ b/shared/types/index.ts @@ -0,0 +1 @@ +export * from "./emotion"; diff --git a/widgets/chat/model/useSendMessage.ts b/widgets/chat/model/useSendMessage.ts index 3997405..0b6a0f6 100644 --- a/widgets/chat/model/useSendMessage.ts +++ b/widgets/chat/model/useSendMessage.ts @@ -16,7 +16,7 @@ import { cleanupExpiredPendingChatMessages, getPendingChatMessages, removePendingChatMessage, -} from "@/shared/lib/chat-pending"; +} from "@/entities/chatbot"; type SendMessageOptions = { sessionId: string; diff --git a/widgets/statistics/index.ts b/widgets/statistics/index.ts new file mode 100644 index 0000000..4aedf59 --- /dev/null +++ b/widgets/statistics/index.ts @@ -0,0 +1 @@ +export * from "./ui"; diff --git a/shared/lib/emotions/components/MonthlyFrequencyStatistics.tsx b/widgets/statistics/ui/MonthlyFrequencyStatistics.tsx similarity index 97% rename from shared/lib/emotions/components/MonthlyFrequencyStatistics.tsx rename to widgets/statistics/ui/MonthlyFrequencyStatistics.tsx index 6aa6112..8095b29 100644 --- a/shared/lib/emotions/components/MonthlyFrequencyStatistics.tsx +++ b/widgets/statistics/ui/MonthlyFrequencyStatistics.tsx @@ -1,17 +1,14 @@ +import { useQuery } from "@tanstack/react-query"; +import React, { useCallback, useMemo, useState } from "react"; +import { ActivityIndicator, Text, TouchableOpacity, View } from "react-native"; + import { queries } from "@/entities"; import type { MonthlyFrequencyResponse as CareMonthlyFrequencyResponse } from "@/entities/care/api/schema"; import { Role } from "@/entities/user/api/schema"; import type { MonthlyFrequencyResponse as UserMonthlyFrequencyResponse } from "@/entities/user/api/schema"; -import type { Emotion } from "@/entities/voices/api/schema"; -import { - emotionKorMap, - emotionRawColorMap, -} from "@/shared/lib/emotions/constant"; +import { emotionKorMap, emotionRawColorMap, toPercent } from "@/shared/lib/emotions"; +import { type Emotion } from "@/shared/types/emotion"; import { formatYearMonth } from "@/shared/util/format"; -import { useQuery } from "@tanstack/react-query"; -import React, { useCallback, useMemo, useState } from "react"; -import { ActivityIndicator, Text, TouchableOpacity, View } from "react-native"; -import { toPercent } from "../util"; const EMOTIONS_FOR_BAR: Emotion[] = [ "happy", diff --git a/shared/lib/emotions/components/WeeklyStatistics.tsx b/widgets/statistics/ui/WeeklyStatistics.tsx similarity index 98% rename from shared/lib/emotions/components/WeeklyStatistics.tsx rename to widgets/statistics/ui/WeeklyStatistics.tsx index b50f899..5ff9167 100644 --- a/shared/lib/emotions/components/WeeklyStatistics.tsx +++ b/widgets/statistics/ui/WeeklyStatistics.tsx @@ -1,8 +1,14 @@ +import { useQuery } from "@tanstack/react-query"; +import { useFocusEffect } from "@react-navigation/native"; +import React, { useCallback, useMemo, useState } from "react"; +import { ActivityIndicator, Text, TouchableOpacity, View } from "react-native"; + import { queries } from "@/entities"; import type { WeeklySummaryResponse as CareWeeklySummaryResponse } from "@/entities/care/api/schema"; import { Role } from "@/entities/user/api/schema"; import type { WeeklySummaryResponse as UserWeeklySummaryResponse } from "@/entities/user/api/schema"; -import { Emotion } from "@/entities/voices/api/schema"; +import { EmotionIconComponent, normalizeEmotion, toPercent } from "@/shared/lib/emotions"; +import { type Emotion } from "@/shared/types/emotion"; import { formatDateRange, formatYearMonth, @@ -10,12 +16,6 @@ import { getWeekRange, } from "@/shared/util/format"; import { cn } from "@/shared/util/style"; -import { useFocusEffect } from "@react-navigation/native"; -import { useQuery } from "@tanstack/react-query"; -import React, { useCallback, useMemo, useState } from "react"; -import { ActivityIndicator, Text, TouchableOpacity, View } from "react-native"; -import { normalizeEmotion, toPercent } from "../util"; -import { EmotionIconComponent } from "./EmotionIconComponent"; const WEEK_DAYS = ["일", "월", "화", "수", "목", "금", "토"] as const; const WEEKDAYS_ORDER: number[] = [0, 1, 2, 3, 4, 5, 6]; diff --git a/widgets/statistics/ui/index.ts b/widgets/statistics/ui/index.ts new file mode 100644 index 0000000..c7c0892 --- /dev/null +++ b/widgets/statistics/ui/index.ts @@ -0,0 +1,2 @@ +export * from "./WeeklyStatistics"; +export * from "./MonthlyFrequencyStatistics";