Skip to content

Instantly share code, notes, and snippets.

@mecid
Created February 15, 2021 17:34
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mecid/e4ba0c194b3c4eb42ea16e53d8777755 to your computer and use it in GitHub Desktop.
Save mecid/e4ba0c194b3c4eb42ea16e53d8777755 to your computer and use it in GitHub Desktop.
SwiftUI Sidebar example
import SwiftUI
struct Mail: Identifiable, Hashable {
let id = UUID()
let date: Date
let subject: String
let body: String
var isFavorited = false
}
final class MailStore: ObservableObject {
@Published var allMails: [String: [Mail]] = [
"Inbox": [ .init(date: Date(), subject: "Subject1", body: "Very long body...") ],
"Sent": [ .init(date: Date(), subject: "Subject2", body: "Very long body...") ],
]
}
struct Sidebar: View {
@ObservedObject var store: MailStore
@Binding var selectedFolder: String?
@Binding var selectedMail: Mail?
var body: some View {
List {
ForEach(Array(store.allMails.keys), id: \.self) { folder in
NavigationLink(
destination: FolderView(
title: folder,
mails: store.allMails[folder, default: []],
selectedMail: $selectedMail
),
tag: folder,
selection: $selectedFolder
) {
Text(folder).font(.headline)
}
}
}.listStyle(SidebarListStyle())
}
}
struct FolderView: View {
let title: String
let mails: [Mail]
@Binding var selectedMail: Mail?
var body: some View {
List {
ForEach(mails) { mail in
NavigationLink(
destination: MailView(mail: mail),
tag: mail,
selection: $selectedMail
) {
VStack(alignment: .leading) {
Text(mail.subject)
Text(mail.date, style: .date)
}
}
}
}.navigationTitle(title)
}
}
struct MailView: View {
let mail: Mail
var body: some View {
VStack(alignment: .leading) {
Text(mail.subject)
.font(.headline)
Text(mail.date, style: .date)
Text(mail.body)
}
}
}
@main
struct TestProjectApp: App {
@StateObject var store = MailStore()
@State private var selectedLabel: String? = "Inbox"
@State private var selectedMail: Mail?
var body: some Scene {
WindowGroup {
NavigationView {
Sidebar(
store: store,
selectedFolder: $selectedLabel,
selectedMail: $selectedMail
)
Text("Select label...")
Text("Select mail...")
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment