gh-1SecondEveryday-MemoryTree/MemoryTree/ContentView.swift

156 lines
4 KiB
Swift

//
// ContentView.swift
// MemoryTree
//
// Created by Work on 2023-02-05.
//
import Boutique
import SwiftUI
struct Entry: Hashable, Identifiable, Codable {
let id: UUID
let text: String
init(id: UUID = UUID(), text: String) {
self.id = id
self.text = text
}
}
extension Store where Item == Entry {
static let entriesStore = Store<Entry>(
storage: SQLiteStorageEngine.default(appendingPath: "Entries")
)
}
struct ContentView: View {
@State var isEditing = false
// @Stored(in: .entriesStore) var entries
@State var entries: [Entry] = []
@State var entryText = ""
var treeImageName: String {
if entries.isEmpty {
return "TreeBare"
} else if entries.count < 3 { // 1-2
return "TreeLeafy"
} else if entries.count < 5 { // 3-4
return "TreeLeafier"
} else { // 5+
return "TreeLeafierAnimals"
}
}
var treeHeight: Double {
if entries.isEmpty {
return 100
} else if entries.count < 3 {
return 300
} else {
return 400
}
}
var body: some View {
NavigationStack {
VStack(spacing: 0) {
windButton
Spacer()
treeView
formView
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.edgesIgnoringSafeArea(isEditing ? [] : .bottom)
.background(Color.blue)
}
}
@ViewBuilder var windButton: some View {
NavigationLink(destination: CloudView(entries: $entries)) {
Image(systemName: "wind.snow")
.imageScale(.large)
.foregroundColor(.white)
}
.padding()
.frame(maxWidth: .infinity, alignment: .trailing)
.opacity(entries.isEmpty ? 0 : 1)
}
@ViewBuilder var treeView: some View {
Button {
isEditing.toggle()
} label: {
Image(treeImageName)
.renderingMode(entries.count > 0 ? .original : .template)
.resizable()
.scaledToFit()
.foregroundColor(.white)
}
.frame(maxHeight: treeHeight)
Color.green
.frame(height: 80)
}
@ViewBuilder var formView: some View {
Form {
TextField("What are you grateful for today?", text: $entryText)
.background(Color.white)
.tint(Color.blue)
}
.onSubmit {
// Task {
// try await $entries.insert(Entry(text: entryText))
// }
if !entryText.isEmpty {
entries.append(Entry(text: entryText))
}
entryText = ""
isEditing = false
}
.frame(maxHeight: isEditing ? 120 : 0)
.animation(.easeInOut.speed(2), value: isEditing)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
Group {
ContentView()
.previewDisplayName("Bare")
ContentView(isEditing: true)
.previewDisplayName("Adding Entry")
ContentView(entries: [Entry(text: "Coffee")])
.previewDisplayName("Leafy")
ContentView(isEditing: true, entries: [Entry(text: "Coffee")])
.previewDisplayName("Leafy - Adding Entry")
ContentView(entries: [
Entry(text: "Coffee"),
Entry(text: "Burritos"),
Entry(text: "Mountains"),
])
.previewDisplayName("Leafier")
ContentView(entries: [
Entry(text: "Coffee"),
Entry(text: "Burritos"),
Entry(text: "Mountains"),
Entry(text: "Trees"),
Entry(text: "Clean Water"),
])
.previewDisplayName("Leafier with Animals")
}
.tint(.white)
.previewLayout(.sizeThatFits)
}
}