mirror of
https://github.com/1SecondEveryday/MemoryTree.git
synced 2026-03-25 08:55:47 +00:00
114 lines
3.1 KiB
Swift
114 lines
3.1 KiB
Swift
//
|
|
// CloudView.swift
|
|
// MemoryTree
|
|
//
|
|
// Created by Work on 2023-02-05.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct CloudView: View {
|
|
@Binding var entries: [Entry]
|
|
|
|
@State var countedWords: [String: Int] = [:]
|
|
|
|
var words: [String] {
|
|
Array(countedWords.keys)
|
|
}
|
|
|
|
@Environment(\.dismiss) var dismiss
|
|
|
|
init(entries: Binding<[Entry]>, countedWords: [String: Int]? = nil) {
|
|
_entries = entries
|
|
if let countedWords {
|
|
_countedWords = State(wrappedValue: countedWords)
|
|
} else {
|
|
_countedWords = State(wrappedValue: countWords())
|
|
}
|
|
}
|
|
|
|
var body: some View {
|
|
var isFirst = true
|
|
words.reduce(Text("")) { cloud, word in
|
|
defer { isFirst = false }
|
|
let count = countedWords[word, default: 1]
|
|
let bullet = (isFirst ? Text("") : Text(" • "))
|
|
return cloud + bullet + Text(word)
|
|
.font(fontForCount(count))
|
|
.bold(count > 2)
|
|
}
|
|
.multilineTextAlignment(.center)
|
|
.padding()
|
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
|
.edgesIgnoringSafeArea(.bottom)
|
|
.background(Color("Sky"))
|
|
.foregroundColor(.white)
|
|
.toolbar {
|
|
ToolbarItem(placement: .destructiveAction) {
|
|
Button {
|
|
entries.removeAll()
|
|
dismiss()
|
|
} label: {
|
|
Image(systemName: "flame")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func fontForCount(_ count: Int) -> Font {
|
|
switch count {
|
|
case 0, 1: return .body
|
|
case 2: return .title3
|
|
case 3: return .title2
|
|
case 4: return .title
|
|
default: return .largeTitle
|
|
}
|
|
}
|
|
|
|
func countWords() -> [String: Int] {
|
|
let words = entries
|
|
.map(\.text)
|
|
.flatMap { $0.split(separator: " ") }
|
|
.map(String.init)
|
|
.filter { $0.count >= 3 }
|
|
return words.reduce(into: [:]) { partialResult, word in
|
|
partialResult[word, default: 0] += 1
|
|
}
|
|
}
|
|
}
|
|
|
|
struct CloudView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
Group {
|
|
NavigationStack {
|
|
CloudView(entries: .constant([]))
|
|
}
|
|
.previewDisplayName("Empty")
|
|
|
|
NavigationStack {
|
|
CloudView(entries: .constant([]), countedWords: [
|
|
"Coffee" : 2,
|
|
"Trees" : 1,
|
|
"Mountains" : 1,
|
|
])
|
|
}
|
|
.previewDisplayName("Few entries")
|
|
|
|
NavigationStack {
|
|
CloudView(entries: .constant([]), countedWords: [
|
|
"Coffee" : 4,
|
|
"Trees" : 2,
|
|
"Mountains" : 3,
|
|
"Burritos" : 1,
|
|
"Home" : 5,
|
|
"My Cat": 2,
|
|
"Love": 3,
|
|
"Clean water": 2,
|
|
"Health": 3,
|
|
])
|
|
}
|
|
.previewDisplayName("Many entries")
|
|
}
|
|
.tint(.white)
|
|
}
|
|
}
|