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

162 lines
4 KiB
Swift

//
// ContentView.swift
// MemoryTree
//
// Created by Work on 2023-02-05.
//
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
}
}
struct ContentView: View {
@State var isEditing = false
@State var entries: [Entry] = []
@State var entryText = ""
var treeImageName: String {
switch entries.count {
case 0:
return "TreeBare"
case 1:
return "TreeLeafy"
case 2:
return "TreeLeafier"
case 3:
return "TreeLeafierAnimals"
default:
return "TreeLeafierBlossoms"
}
}
var treeHeight: Double {
switch entries.count {
case 0:
return 100 // bare
case 1:
return 300 // leafy
default:
return 400 // leafier
}
}
var body: some View {
NavigationStack {
VStack(spacing: 0) {
windButton
Spacer()
treeView
formView
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.edgesIgnoringSafeArea(isEditing ? [] : .bottom)
.background(Color("Sky"))
}
}
@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)
.resizable()
.scaledToFit()
.foregroundColor(.white)
}
.frame(maxHeight: treeHeight)
Color("Grass")
.frame(height: 80)
}
@ViewBuilder var formView: some View {
Form {
TextField("What are you grateful for today?", text: $entryText)
.background(Color.white)
.tint(Color.blue)
.submitLabel(.done)
}
.onSubmit {
if !entryText.isEmpty {
withAnimation {
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"),
])
.previewDisplayName("Leafier")
ContentView(entries: [
Entry(text: "Coffee"),
Entry(text: "Burritos"),
])
.previewDisplayName("Leafier - Adding Entry")
ContentView(entries: [
Entry(text: "Coffee"),
Entry(text: "Burritos"),
Entry(text: "Mountains"),
])
.previewDisplayName("Leafier with Animals")
ContentView(entries: [
Entry(text: "Coffee"),
Entry(text: "Burritos"),
Entry(text: "Mountains"),
Entry(text: "Trees"),
])
.previewDisplayName("Leafier with Blossoms")
}
.tint(.white)
.previewLayout(.sizeThatFits)
}
}