79 lines
2.8 KiB
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
|
|
}
|
|
}
|
|
}
|