From 6b445fff7c278e3b64e860e98ae4f46b81202722 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Tue, 2 Sep 2025 21:49:22 +0900 Subject: [PATCH] =?UTF-8?q?feat(chat-room)=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=20=EA=B3=A8=EA=B2=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contents.json | 21 ---------------- .../ic_message_square_777.png | Bin 471 -> 0 bytes .../Talk/Room/Character/CharacterInfo.swift | 13 ++++++++++ .../Chat/Talk/Room/ChatRoomRepository.swift | 15 ++++++++++++ .../Sources/Chat/Talk/Room/ChatRoomView.swift | 23 ++++++++++++++++++ .../Chat/Talk/Room/ChatRoomViewModel.swift | 21 ++++++++++++++++ .../Room/Create/CreateChatRoomRequest.swift | 10 ++++++++ .../Room/Create/CreateChatRoomResponse.swift | 10 ++++++++ .../Room/Enter/ChatRoomEnterResponse.swift | 16 ++++++++++++ .../Talk/Room/Message/AiMessageItemView.swift | 18 ++++++++++++++ .../Room/Message/SendChatMessageRequest.swift | 10 ++++++++ .../Message/SendChatMessageResponse.swift | 12 +++++++++ .../Talk/Room/Message/ServerChatMessage.swift | 18 ++++++++++++++ .../Message/TypingIndicatorItemView.swift | 18 ++++++++++++++ .../Room/Message/UserMessageItemView.swift | 18 ++++++++++++++ .../Room/Quota/ChatQuotaNoticeItemView.swift | 18 ++++++++++++++ .../Room/Quota/ChatQuotaPurchaseRequest.swift | 8 ++++++ .../Room/Quota/ChatQuotaStatusResponse.swift | 8 ++++++ .../Room/Reset/ChatRoomResetRequest.swift | 10 ++++++++ 19 files changed, 246 insertions(+), 21 deletions(-) delete mode 100644 SodaLive/Resources/Assets.xcassets/ic_message_square_777 1.imageset/Contents.json delete mode 100644 SodaLive/Resources/Assets.xcassets/ic_message_square_777 1.imageset/ic_message_square_777.png create mode 100644 SodaLive/Sources/Chat/Talk/Room/Character/CharacterInfo.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/ChatRoomRepository.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/ChatRoomViewModel.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Create/CreateChatRoomRequest.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Create/CreateChatRoomResponse.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Enter/ChatRoomEnterResponse.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Message/AiMessageItemView.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Message/SendChatMessageRequest.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Message/SendChatMessageResponse.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Message/ServerChatMessage.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Message/TypingIndicatorItemView.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Message/UserMessageItemView.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaNoticeItemView.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaPurchaseRequest.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaStatusResponse.swift create mode 100644 SodaLive/Sources/Chat/Talk/Room/Reset/ChatRoomResetRequest.swift diff --git a/SodaLive/Resources/Assets.xcassets/ic_message_square_777 1.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_message_square_777 1.imageset/Contents.json deleted file mode 100644 index 94a4c86..0000000 --- a/SodaLive/Resources/Assets.xcassets/ic_message_square_777 1.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "ic_message_square_777.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/SodaLive/Resources/Assets.xcassets/ic_message_square_777 1.imageset/ic_message_square_777.png b/SodaLive/Resources/Assets.xcassets/ic_message_square_777 1.imageset/ic_message_square_777.png deleted file mode 100644 index b4a2ed2ae1e56c696be9e08d087ea3a47345ec23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcmV;|0Vw{7P)@QG1^T}T)h8tc$pNF* zPqK*rC-}+O$R9xS$1%<&f*^44@(kniRaI3QMbT?l@|PfrE%CC!=D@UM*dD_$%z03B z+_;75<%kv36VswKgTC*(hGA@3=zy(r>aT=-6kD>`8fP(WItzX`$~ml?7e#TOB*_6r z#PdAcG|e5A=W+`e2p!EW%W~n$;A#2}Sdk`#NO^vc;IVFa$A_(8Ty{9d z2M=5nY~-M>zQ$x@?XogI#hNmZIw^s=bCj!P5;f zxg0U{GowU~7$T@lj<_VKRE}r~;!ffs%H@dGCPASW+_^u$Rm*Aq1>ao-gNI+T%$)!L N002ovPDHLkV1fW?$ov2R diff --git a/SodaLive/Sources/Chat/Talk/Room/Character/CharacterInfo.swift b/SodaLive/Sources/Chat/Talk/Room/Character/CharacterInfo.swift new file mode 100644 index 0000000..25a773e --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Character/CharacterInfo.swift @@ -0,0 +1,13 @@ +// +// CharacterInfo.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +struct CharacterInfo: Decodable { + let characterId: Int64 + let name: String + let profileImageUrl: String + let characterType: CharacterType +} diff --git a/SodaLive/Sources/Chat/Talk/Room/ChatRoomRepository.swift b/SodaLive/Sources/Chat/Talk/Room/ChatRoomRepository.swift new file mode 100644 index 0000000..933805e --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/ChatRoomRepository.swift @@ -0,0 +1,15 @@ +// +// ChatRoomRepository.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +import Foundation +import CombineMoya +import Combine +import Moya + +class ChatRoomRepository { + private let talkApi = MoyaProvider() +} diff --git a/SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift b/SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift new file mode 100644 index 0000000..4874900 --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift @@ -0,0 +1,23 @@ +// +// ChatRoomView.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +import SwiftUI + +struct ChatRoomView: View { + + @StateObject var viewModel = ChatRoomViewModel() + + var body: some View { + BaseView(isLoading: $viewModel.isLoading) { + + } + } +} + +#Preview { + ChatRoomView() +} diff --git a/SodaLive/Sources/Chat/Talk/Room/ChatRoomViewModel.swift b/SodaLive/Sources/Chat/Talk/Room/ChatRoomViewModel.swift new file mode 100644 index 0000000..8680046 --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/ChatRoomViewModel.swift @@ -0,0 +1,21 @@ +// +// ChatRoomViewModel.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +import Foundation +import Combine +import Moya + +final class ChatRoomViewModel: ObservableObject { + // MARK: - Published State + @Published var isLoading: Bool = false + @Published var errorMessage: String = "" + @Published var isShowPopup = false + + // MARK: - Private + private let repository = ChatRoomRepository() + private var subscription = Set() +} diff --git a/SodaLive/Sources/Chat/Talk/Room/Create/CreateChatRoomRequest.swift b/SodaLive/Sources/Chat/Talk/Room/Create/CreateChatRoomRequest.swift new file mode 100644 index 0000000..0529be1 --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Create/CreateChatRoomRequest.swift @@ -0,0 +1,10 @@ +// +// CreateChatRoomRequest.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +struct CreateChatRoomRequest: Encodable { + let characterId: Int64 +} diff --git a/SodaLive/Sources/Chat/Talk/Room/Create/CreateChatRoomResponse.swift b/SodaLive/Sources/Chat/Talk/Room/Create/CreateChatRoomResponse.swift new file mode 100644 index 0000000..7365de0 --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Create/CreateChatRoomResponse.swift @@ -0,0 +1,10 @@ +// +// CreateChatRoomResponse.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +struct CreateChatRoomResponse: Decodable { + let chatRoomId: Int64 +} diff --git a/SodaLive/Sources/Chat/Talk/Room/Enter/ChatRoomEnterResponse.swift b/SodaLive/Sources/Chat/Talk/Room/Enter/ChatRoomEnterResponse.swift new file mode 100644 index 0000000..09d0bac --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Enter/ChatRoomEnterResponse.swift @@ -0,0 +1,16 @@ +// +// ChatRoomEnterResponse.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +struct ChatRoomEnterResponse: Decodable { + let roomId: Int64 + let character: CharacterInfo + let messages: [ServerChatMessage] + let hasMoreMessages: Bool + let totalRemaining: Int + let nextRechargeAtEpoch: Int64? + let bgImageUrl: String? +} diff --git a/SodaLive/Sources/Chat/Talk/Room/Message/AiMessageItemView.swift b/SodaLive/Sources/Chat/Talk/Room/Message/AiMessageItemView.swift new file mode 100644 index 0000000..a6931d2 --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Message/AiMessageItemView.swift @@ -0,0 +1,18 @@ +// +// AiMessageItemView.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +import SwiftUI + +struct AiMessageItemView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +#Preview { + AiMessageItemView() +} diff --git a/SodaLive/Sources/Chat/Talk/Room/Message/SendChatMessageRequest.swift b/SodaLive/Sources/Chat/Talk/Room/Message/SendChatMessageRequest.swift new file mode 100644 index 0000000..8437963 --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Message/SendChatMessageRequest.swift @@ -0,0 +1,10 @@ +// +// SendChatMessageRequest.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +struct SendChatMessageRequest: Encodable { + let message: String +} diff --git a/SodaLive/Sources/Chat/Talk/Room/Message/SendChatMessageResponse.swift b/SodaLive/Sources/Chat/Talk/Room/Message/SendChatMessageResponse.swift new file mode 100644 index 0000000..abf75a0 --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Message/SendChatMessageResponse.swift @@ -0,0 +1,12 @@ +// +// SendChatMessageResponse.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +struct SendChatMessageResponse: Decodable { + let messages: [ServerChatMessage] + let totalRemaining: Int + let nextRechargeAtEpoch: Int64? +} diff --git a/SodaLive/Sources/Chat/Talk/Room/Message/ServerChatMessage.swift b/SodaLive/Sources/Chat/Talk/Room/Message/ServerChatMessage.swift new file mode 100644 index 0000000..3329eb1 --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Message/ServerChatMessage.swift @@ -0,0 +1,18 @@ +// +// ServerChatMessage.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +struct ServerChatMessage: Decodable { + let messageId: Int64 + let message: String + let profileImageUrl: String + let mine: Bool + let createdAt: Int64 + let messageType: String + let imageUrl: String? + let price: Int? + let hasAccess: Bool +} diff --git a/SodaLive/Sources/Chat/Talk/Room/Message/TypingIndicatorItemView.swift b/SodaLive/Sources/Chat/Talk/Room/Message/TypingIndicatorItemView.swift new file mode 100644 index 0000000..621ae8e --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Message/TypingIndicatorItemView.swift @@ -0,0 +1,18 @@ +// +// TypingIndicatorItemView.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +import SwiftUI + +struct TypingIndicatorItemView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +#Preview { + TypingIndicatorItemView() +} diff --git a/SodaLive/Sources/Chat/Talk/Room/Message/UserMessageItemView.swift b/SodaLive/Sources/Chat/Talk/Room/Message/UserMessageItemView.swift new file mode 100644 index 0000000..16e479c --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Message/UserMessageItemView.swift @@ -0,0 +1,18 @@ +// +// UserMessageItemView.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +import SwiftUI + +struct UserMessageItemView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +#Preview { + UserMessageItemView() +} diff --git a/SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaNoticeItemView.swift b/SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaNoticeItemView.swift new file mode 100644 index 0000000..9745453 --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaNoticeItemView.swift @@ -0,0 +1,18 @@ +// +// ChatQuotaNoticeItemView.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +import SwiftUI + +struct ChatQuotaNoticeItemView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +#Preview { + ChatQuotaNoticeItemView() +} diff --git a/SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaPurchaseRequest.swift b/SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaPurchaseRequest.swift new file mode 100644 index 0000000..7bd49e9 --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaPurchaseRequest.swift @@ -0,0 +1,8 @@ +// +// ChatQuotaPurchaseRequest.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +import Foundation diff --git a/SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaStatusResponse.swift b/SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaStatusResponse.swift new file mode 100644 index 0000000..68fd2f2 --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaStatusResponse.swift @@ -0,0 +1,8 @@ +// +// ChatQuotaStatusResponse.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +import Foundation diff --git a/SodaLive/Sources/Chat/Talk/Room/Reset/ChatRoomResetRequest.swift b/SodaLive/Sources/Chat/Talk/Room/Reset/ChatRoomResetRequest.swift new file mode 100644 index 0000000..e0e9a8f --- /dev/null +++ b/SodaLive/Sources/Chat/Talk/Room/Reset/ChatRoomResetRequest.swift @@ -0,0 +1,10 @@ +// +// ChatRoomResetRequest.swift +// SodaLive +// +// Created by klaus on 9/2/25. +// + +struct ChatRoomResetRequest: Encodable { + let container: String = "ios" +}