feat(chat-room): 채팅방 이미지 메시지
- 구매한 이미지 터치시 구매한 이미지만 모아볼 수 있는 뷰어 추가
This commit is contained in:
		@@ -123,9 +123,13 @@ struct ChatRoomView: View {
 | 
			
		||||
                                            message: message,
 | 
			
		||||
                                            characterName: viewModel.characterName
 | 
			
		||||
                                        ) {
 | 
			
		||||
                                            if message.hasAccess {
 | 
			
		||||
                                                viewModel.showImageViewer(message.imageUrl)
 | 
			
		||||
                                            } else {
 | 
			
		||||
                                                viewModel.selectedMessage = message
 | 
			
		||||
                                                viewModel.selectedMessageIndex = index
 | 
			
		||||
                                            }
 | 
			
		||||
                                        }
 | 
			
		||||
                                        .id(index)
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
@@ -229,6 +233,12 @@ struct ChatRoomView: View {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        .sheet(isPresented: $viewModel.isShowImageViewer) {
 | 
			
		||||
            ImageViewerView(
 | 
			
		||||
                images: viewModel.ownedImageUrls,
 | 
			
		||||
                selectedIndex: $viewModel.selectedImageIndex
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
        .onAppear {
 | 
			
		||||
            viewModel.getMemberInfo()
 | 
			
		||||
            viewModel.enterRoom(roomId: roomId)
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,16 @@ final class ChatRoomViewModel: ObservableObject {
 | 
			
		||||
    @Published var selectedMessage: ServerChatMessage? = nil
 | 
			
		||||
    @Published var selectedMessageIndex: Int = -1
 | 
			
		||||
    
 | 
			
		||||
    @Published var isShowImageViewer = false
 | 
			
		||||
    @Published var selectedImageIndex: Int = 0
 | 
			
		||||
    
 | 
			
		||||
    var ownedImageUrls: [String] {
 | 
			
		||||
        return messages
 | 
			
		||||
            .filter { $0.hasAccess }
 | 
			
		||||
            .filter { $0.messageType.lowercased() == "image" && $0.imageUrl != nil && !$0.imageUrl.isNullOrBlank() }
 | 
			
		||||
            .map { $0.imageUrl! }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // MARK: - Private
 | 
			
		||||
    private let userRepository = UserRepository()
 | 
			
		||||
    private let repository = ChatRoomRepository()
 | 
			
		||||
@@ -281,6 +291,13 @@ final class ChatRoomViewModel: ObservableObject {
 | 
			
		||||
            .store(in: &subscription)
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    func showImageViewer(_ imageUrl: String?) {
 | 
			
		||||
        if let imageUrl = imageUrl {
 | 
			
		||||
            selectedImageIndex = ownedImageUrls.firstIndex(of: imageUrl) ?? 0
 | 
			
		||||
            isShowImageViewer = true
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private func checkQuotaStatus() {
 | 
			
		||||
        isLoading = true
 | 
			
		||||
        
 | 
			
		||||
 
 | 
			
		||||
@@ -103,11 +103,11 @@ struct AiMessageItemView: View {
 | 
			
		||||
                                .resizable()
 | 
			
		||||
                                .scaledToFill() // 비율 유지하며 프레임을 채움
 | 
			
		||||
                            
 | 
			
		||||
                            if let price = message.price, price > 0, !message.hasAccess {
 | 
			
		||||
                                Color.black.opacity(0.2)
 | 
			
		||||
                                    .frame(width: maxWidth, height: imageHeight)
 | 
			
		||||
                                .cornerRadius(30)
 | 
			
		||||
                                    .cornerRadius(10)
 | 
			
		||||
                                
 | 
			
		||||
                            if let price = message.price, price > 0, !message.hasAccess {
 | 
			
		||||
                                VStack(spacing: 18) {
 | 
			
		||||
                                    HStack(spacing: 4) {
 | 
			
		||||
                                        Image("ic_can")
 | 
			
		||||
@@ -123,7 +123,7 @@ struct AiMessageItemView: View {
 | 
			
		||||
                                    .background(Color(hex: "B5E7FA"))
 | 
			
		||||
                                    .cornerRadius(30)
 | 
			
		||||
                                    .overlay {
 | 
			
		||||
                                        RoundedRectangle(cornerRadius: 30)
 | 
			
		||||
                                        RoundedRectangle(cornerRadius: 10)
 | 
			
		||||
                                            .stroke(lineWidth: 1)
 | 
			
		||||
                                            .foregroundColor(.button)
 | 
			
		||||
                                    }
 | 
			
		||||
@@ -133,13 +133,13 @@ struct AiMessageItemView: View {
 | 
			
		||||
                                        .foregroundColor(.white)
 | 
			
		||||
                                }
 | 
			
		||||
                                .frame(width: maxWidth, height: imageHeight)
 | 
			
		||||
                                .onTapGesture {
 | 
			
		||||
                                    purchaseMessage()
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        .frame(width: maxWidth, height: imageHeight)
 | 
			
		||||
                        .clipShape(RoundedRectangle(cornerRadius: 10, style: .continuous))
 | 
			
		||||
                        .onTapGesture {
 | 
			
		||||
                            purchaseMessage()
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        // 텍스트 메시지 버블
 | 
			
		||||
                        HStack(spacing: 10) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user