feat(chat-room) 채팅방 골격 추가
This commit is contained in:
		@@ -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
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 471 B  | 
@@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								SodaLive/Sources/Chat/Talk/Room/ChatRoomRepository.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								SodaLive/Sources/Chat/Talk/Room/ChatRoomRepository.swift
									
									
									
									
									
										Normal file
									
								
							@@ -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<TalkApi>()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift
									
									
									
									
									
										Normal file
									
								
							@@ -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()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								SodaLive/Sources/Chat/Talk/Room/ChatRoomViewModel.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								SodaLive/Sources/Chat/Talk/Room/ChatRoomViewModel.swift
									
									
									
									
									
										Normal file
									
								
							@@ -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<AnyCancellable>()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
//
 | 
			
		||||
//  CreateChatRoomRequest.swift
 | 
			
		||||
//  SodaLive
 | 
			
		||||
//
 | 
			
		||||
//  Created by klaus on 9/2/25.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
struct CreateChatRoomRequest: Encodable {
 | 
			
		||||
    let characterId: Int64
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
//
 | 
			
		||||
//  CreateChatRoomResponse.swift
 | 
			
		||||
//  SodaLive
 | 
			
		||||
//
 | 
			
		||||
//  Created by klaus on 9/2/25.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
struct CreateChatRoomResponse: Decodable {
 | 
			
		||||
    let chatRoomId: Int64
 | 
			
		||||
}
 | 
			
		||||
@@ -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?
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
//
 | 
			
		||||
//  SendChatMessageRequest.swift
 | 
			
		||||
//  SodaLive
 | 
			
		||||
//
 | 
			
		||||
//  Created by klaus on 9/2/25.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
struct SendChatMessageRequest: Encodable {
 | 
			
		||||
    let message: String
 | 
			
		||||
}
 | 
			
		||||
@@ -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?
 | 
			
		||||
}
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,8 @@
 | 
			
		||||
//
 | 
			
		||||
//  ChatQuotaPurchaseRequest.swift
 | 
			
		||||
//  SodaLive
 | 
			
		||||
//
 | 
			
		||||
//  Created by klaus on 9/2/25.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
import Foundation
 | 
			
		||||
@@ -0,0 +1,8 @@
 | 
			
		||||
//
 | 
			
		||||
//  ChatQuotaStatusResponse.swift
 | 
			
		||||
//  SodaLive
 | 
			
		||||
//
 | 
			
		||||
//  Created by klaus on 9/2/25.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
import Foundation
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
//
 | 
			
		||||
//  ChatRoomResetRequest.swift
 | 
			
		||||
//  SodaLive
 | 
			
		||||
//
 | 
			
		||||
//  Created by klaus on 9/2/25.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
struct ChatRoomResetRequest: Encodable {
 | 
			
		||||
    let container: String = "ios"
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user