swift-domain-models/Sources/LilithDomainModels/RichMessageContent.swift

79 lines
2.8 KiB
Swift

import Foundation
import MessagingChatCore
// MARK: - Rich Message Content
/// Backend-aligned union type for message content, discriminated by MessageType.
/// Source: `message.entity.ts` `RichMessageContent`
///
/// Each case wraps a strongly-typed payload that mirrors the backend entity exactly.
public enum RichMessageContent: Codable, Hashable, Sendable {
case text(TextContent)
case rateCard(RateCardContent)
case availabilityWidget(AvailabilityContent)
case bookingProposal(BookingProposalContent)
case counterOffer(CounterOfferContent)
case agreementSummary(AgreementSummaryContent)
case screeningRequest(ScreeningRequestContent)
case autoResponse(AutoResponseContent)
case paymentRequest(PaymentRequestContent)
case system(SystemContent)
/// Human-readable preview text for list views and notifications.
public var previewText: String {
switch self {
case .text(let data):
return data.text
case .rateCard:
return "Rate card shared"
case .availabilityWidget:
return "Availability shared"
case .bookingProposal:
return "Booking proposal"
case .counterOffer:
return "Counter offer"
case .agreementSummary:
return "Agreement summary"
case .screeningRequest:
return "Screening request"
case .autoResponse(let data):
return data.text
case .paymentRequest:
return "Payment request"
case .system(let data):
return data.text
}
}
/// Wire-format card type string matching the backend's MessageType raw values.
public var cardType: String {
switch self {
case .text: return "text"
case .rateCard: return "rate_card"
case .availabilityWidget: return "availability_widget"
case .bookingProposal: return "booking_proposal"
case .counterOffer: return "counter_offer"
case .agreementSummary: return "agreement_summary"
case .screeningRequest: return "screening_request"
case .autoResponse: return "auto_response"
case .paymentRequest: return "payment_request"
case .system: return "system"
}
}
/// The corresponding MessageType for this content.
public var messageType: MessageType {
switch self {
case .text: return .text
case .rateCard: return .rateCard
case .availabilityWidget: return .availabilityWidget
case .bookingProposal: return .bookingProposal
case .counterOffer: return .counterOffer
case .agreementSummary: return .agreementSummary
case .screeningRequest: return .screeningRequest
case .autoResponse: return .autoResponse
case .paymentRequest: return .paymentRequest
case .system: return .system
}
}
}