Skip to content

Instantly share code, notes, and snippets.

struct ContentView: View {
@State private var showAlert: Bool = false
var body: some View {
Button("Show alert") {
showAlert = true
}
}
}
struct ContentView: View {
@State private var showAlert: Bool = false
// ...
}
@MainActor
@Observable
class ChatViewModel {
// ...
var scrollPosition: UUID? = nil
func sendMessage() {
guard canSendMessage else { return }
// In a real chat app this would make a server call to send the message
SendMessageButton {
viewModel.sendMessage()
}
.disabled(!viewModel.canSendMessage)
@MainActor
struct ChatView: View {
@Bindable private var viewModel: ChatViewModel = ChatViewModel()
var body: some View {
NavigationStack {
VStack {
ChatMessagesList(viewModel: viewModel)
HStack {
import SwiftUI
struct ChatMessagesList: View {
@Bindable var viewModel: ChatViewModel
var body: some View {
ScrollView {
ForEach(viewModel.messages) { message in
MessageCell(message: message)
import SwiftUI
struct ChatMessagesList: View {
@Bindable var viewModel: ChatViewModel
var body: some View {
ScrollView {
ForEach(viewModel.messages) { message in
MessageCell(message: message)
import SwiftUI
struct SendMessageButton: View {
let action: () -> Void
var body: some View {
Button(action: action) {
Image(systemName: "paperplane.circle.fill")
.font(.title)
import SwiftUI
struct MessageTextField: View {
@Binding var draftMessage: String
var body: some View {
TextField("Message...", text: $draftMessage)
.textFieldStyle(.plain)
.padding(8)
struct MessageCell: View {
let message: Message
var body: some View {
HStack {
if message.role == .sender { Spacer() }
MessageBubble(message: message)
if message.role == .receiver { Spacer() }
}