mirror of
https://github.com/1SecondEveryday/MemoryTree.git
synced 2026-03-25 08:55:47 +00:00
144 lines
3.5 KiB
Swift
144 lines
3.5 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 {
|
|
return "TreeLeafy"
|
|
} else {
|
|
return "TreeLeafier"
|
|
}
|
|
}
|
|
|
|
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 ? .top : .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(.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: "Marion berries"),
|
|
Entry(text: "Burritos"),
|
|
])
|
|
.previewDisplayName("Leafier")
|
|
}
|
|
.tint(.white)
|
|
}
|
|
}
|