|
import SwiftUI |
|
|
|
public enum TypeChat: String { |
|
case SEND = "SEND" |
|
case RECEIVE = "RECEIVE" |
|
case WIDGET = "WIDGET" |
|
} |
|
|
|
public enum TypeWidget: String { |
|
case EMPTY = "EMPTY" |
|
case CONTACT = "CONTACT" |
|
case IMAGE = "IMAGE" |
|
} |
|
|
|
struct ChatMessage: Hashable { |
|
let type: TypeChat |
|
let message: String |
|
let widgetType: TypeWidget |
|
let widgetDesc: String |
|
} |
|
|
|
struct ChatBubble: Shape { |
|
func path(in rect: CGRect) -> Path { |
|
let path = UIBezierPath(roundedRect: rect, |
|
byRoundingCorners: [.allCorners], |
|
cornerRadii: CGSize(width: 9, height: 9)) |
|
return Path(path.cgPath) |
|
} |
|
} |
|
|
|
struct ChatMessageRow: View { |
|
let chatItem: ChatMessage |
|
|
|
var body: some View { |
|
HStack { |
|
switch chatItem.type { |
|
case TypeChat.SEND: |
|
Spacer() |
|
Text(chatItem.message) |
|
.font(.system(size: 15)) |
|
.foregroundColor(.white) |
|
.padding(5) |
|
.background(Color.green) |
|
.clipShape(ChatBubble()) |
|
case TypeChat.RECEIVE: |
|
Text(chatItem.message) |
|
.font(.system(size: 15)) |
|
.foregroundColor(.black) |
|
.padding(5) |
|
.background(Color.primary) |
|
.clipShape(ChatBubble()) |
|
Spacer() |
|
case TypeChat.WIDGET: |
|
switch chatItem.widgetType { |
|
case TypeWidget.CONTACT: |
|
let contact = convertStringToContact(jsonData: chatItem.widgetDesc) |
|
NavigationLink(destination: ContactView(contact: contact)){ |
|
ContactRow(contact: contact) |
|
} |
|
case TypeWidget.IMAGE: |
|
ImageRow() |
|
default: |
|
EmptyView() |
|
} |
|
} |
|
}.padding(5) |
|
} |
|
} |
|
|
|
func convertStringToContact(jsonData: String) -> Contact { |
|
do { |
|
let jsonData = jsonData.data(using: .utf8)! |
|
let contact = try JSONDecoder().decode(Contact.self, from: jsonData) |
|
|
|
return contact |
|
} catch { |
|
print("Error converting JSON string to object: \(error)") |
|
} |
|
return Contact(contactId: "", displayName: "Empty", phoneNumbers: []) |
|
} |
|
|
|
struct ChatMessageRow_Previews: PreviewProvider { |
|
static var previews: some View { |
|
ChatMessageRow(chatItem:ChatMessage( |
|
type: TypeChat.WIDGET, |
|
message: "Hello!", |
|
widgetType: TypeWidget.IMAGE, |
|
widgetDesc: "Nothing" |
|
) |
|
) |
|
} |
|
} |
|
|