Skip to content

Commit 0978048

Browse files
committed
feat: refresh journals when panel opens
1 parent 2795d3a commit 0978048

File tree

5 files changed

+55
-61
lines changed

5 files changed

+55
-61
lines changed

Horizon/AppDelegate.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ extension AppDelegate {
8484
preferencesWindowController.show(preferencePane: .account)
8585
return
8686
}
87+
store.fetchJournals()
8788
panel.makeKeyAndOrderFront(nil)
8889
}
8990

Horizon/Models/Journal.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import Foundation
44

5-
struct Journal: Codable, Identifiable {
5+
struct Journal: Codable, Identifiable, Equatable {
66
var id: Int
77
var entryTemplate: String?
88
var entryTemplateActive: Bool

Horizon/Publish/PublishView.swift

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,15 @@ struct PublishView: View {
2424

2525
HStack {
2626
Picker(selection: $viewModel.selectedJournalId, label: Text("Journal")) {
27-
ForEach(viewModel.journals) {
27+
ForEach(store.journals) {
2828
Text($0.title)
2929
}
3030
}
3131
.disabled(viewModel.networkActive)
32-
.onChange(of: viewModel.selectedJournalId) { journalId in
33-
viewModel.maybeSetEntryToTemplate(journalId: journalId)
34-
}
35-
.onChange(of: store.token) { _ in viewModel.fetchJournals() }
36-
.onAppear(perform: viewModel.fetchJournals)
32+
.onChange(of: viewModel.selectedJournalId, perform: viewModel.maybeSetEntryToTemplate)
33+
.onChange(of: store.journals, perform: viewModel.maybeSetSelectedJournalId)
34+
.onChange(of: store.token) { _ in store.fetchJournals() }
35+
.onAppear(perform: store.fetchJournals)
3736

3837
if let fileName = viewModel.file?.name {
3938
HStack {

Horizon/Publish/PublishViewModel.swift

Lines changed: 16 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,10 @@ class PublishViewModel: ObservableObject, Identifiable {
2121
@Published
2222
var selectedJournalId: Int = 0 {
2323
didSet {
24-
previousSelectedJournal = journals.first { $0.id == oldValue }
24+
previousSelectedJournal = store.journals.first { $0.id == oldValue }
2525
}
2626
}
2727

28-
@Published
29-
var journals = [Journal]()
30-
3128
@Published
3229
var isFileBrowserOpen = false
3330

@@ -37,7 +34,7 @@ class PublishViewModel: ObservableObject, Identifiable {
3734
var disabled: Bool { networkActive || (entry.isEmpty && file == nil ) }
3835
var wordCount: Int { entry.split { $0 == " " || $0.isNewline }.count }
3936

40-
var selectedJournal: Journal? { journals.first { $0.id == self.selectedJournalId } }
37+
var selectedJournal: Journal? { store.journals.first { $0.id == self.selectedJournalId } }
4138
var previousSelectedJournal: Journal?
4239

4340
init(
@@ -52,41 +49,6 @@ class PublishViewModel: ObservableObject, Identifiable {
5249
reset()
5350
}
5451

55-
func fetchJournals() {
56-
guard let token = store.token else { return }
57-
58-
networkActive = true
59-
60-
Futureland
61-
.journals(token: token)
62-
.sink(receiveCompletion: { completion in
63-
switch completion {
64-
case .finished:
65-
break
66-
case .failure(let error):
67-
print(error)
68-
}
69-
self.networkActive = false
70-
}, receiveValue: { journals in
71-
print(journals)
72-
let sortedJournals = journals.sorted { (a, b) -> Bool in
73-
guard let lastEntryAtA = a.lastEntryAt else { return false }
74-
guard let lastEntryAtB = b.lastEntryAt else { return true }
75-
return lastEntryAtA > lastEntryAtB
76-
}
77-
self.journals = sortedJournals
78-
79-
// Check if a journal is already selected
80-
let selectedJournal = sortedJournals.first { $0.id == self.selectedJournalId }
81-
if selectedJournal != nil { return }
82-
83-
// Select first journal if none are selected
84-
guard let journal = sortedJournals.first else { return }
85-
self.selectedJournalId = journal.id
86-
})
87-
.store(in: &disposables)
88-
}
89-
9052
func publish() {
9153
guard let token = store.token else { return }
9254

@@ -171,16 +133,10 @@ extension PublishViewModel {
171133
guard fileUrl.startAccessingSecurityScopedResource() else { return }
172134

173135
// Get file data
174-
guard let data = try? Data(contentsOf: fileUrl) else {
175-
print("Unable to read data")
176-
return
177-
}
136+
guard let data = try? Data(contentsOf: fileUrl) else { return }
178137

179138
// Get mime type
180-
guard let mimeType = getMimeTypeFor(fileUrl: fileUrl) else {
181-
print("Unable to get mime type")
182-
return
183-
}
139+
guard let mimeType = getMimeTypeFor(fileUrl: fileUrl) else { return }
184140

185141
file = File(name: fileUrl.lastPathComponent, data: data, mimeType: mimeType)
186142
fileUrl.stopAccessingSecurityScopedResource()
@@ -193,13 +149,9 @@ extension PublishViewModel {
193149
// MARK: Entry template
194150
extension PublishViewModel {
195151
func maybeSetEntryToTemplate(journalId id: Int) {
196-
if entry != previousSelectedJournal?.entryTemplate ?? "" {
197-
return
198-
}
152+
if entry != previousSelectedJournal?.entryTemplate ?? "" { return }
199153

200-
guard let journal = journals.first(where: { $0.id == id }) else {
201-
return
202-
}
154+
guard let journal = store.journals.first(where: { $0.id == id }) else { return }
203155

204156
guard let template = journal.entryTemplate else {
205157
entry = ""
@@ -210,4 +162,14 @@ extension PublishViewModel {
210162
entry = template
211163
}
212164
}
165+
166+
func maybeSetSelectedJournalId(journals: [Journal]) {
167+
// Check if a journal is already selected
168+
let selectedJournal = journals.first { $0.id == self.selectedJournalId }
169+
if selectedJournal != nil { return }
170+
171+
// Select first journal if none are selected
172+
guard let journal = journals.first else { return }
173+
self.selectedJournalId = journal.id
174+
}
213175
}

Horizon/Store.swift

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// By Tom Meagher on 1/29/21 at 22:21
22

3+
import Alamofire
34
import Combine
45
import Foundation
56
import KeychainAccess
@@ -8,6 +9,11 @@ import SwiftUI
89
let keychain = Keychain()
910

1011
class Store: ObservableObject {
12+
private var disposables = Set<AnyCancellable>()
13+
14+
@Published
15+
var journals = [Journal]()
16+
1117
@Published
1218
var token: String? {
1319
didSet {
@@ -29,6 +35,32 @@ class Store: ObservableObject {
2935
guard let user: User = keychainGet(key: "User") else { return }
3036
self.user = user
3137
}
38+
39+
func fetchJournals() {
40+
guard let token = token else { return }
41+
Futureland
42+
.journals(token: token)
43+
.sink(
44+
receiveCompletion: { completion in
45+
switch completion {
46+
case .finished:
47+
break
48+
case .failure(let error):
49+
print(error)
50+
}
51+
},
52+
receiveValue: { journals in
53+
let sortedJournals = journals.sorted { (a, b) -> Bool in
54+
guard let lastEntryAtA = a.lastEntryAt else { return false }
55+
guard let lastEntryAtB = b.lastEntryAt else { return true }
56+
return lastEntryAtA > lastEntryAtB
57+
}
58+
self.journals = sortedJournals
59+
print(sortedJournals)
60+
}
61+
)
62+
.store(in: &disposables)
63+
}
3264
}
3365

3466
extension Store {

0 commit comments

Comments
 (0)