Skip to content

Commit d5db27c

Browse files
authored
Merge pull request #45 from twodayslate/safari-swipe
Allow swipe back for in-app safari
2 parents 4877ddb + 8c62db7 commit d5db27c

File tree

8 files changed

+44
-42
lines changed

8 files changed

+44
-42
lines changed

claw/ActiveSheet.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Foundation
22

3-
enum ActiveSheet: Identifiable {
3+
enum ActiveSheet: Identifiable, Equatable {
44
case share(URL)
55
case safari(URL)
66
case story(id:String)

claw/ContentView.swift

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ struct ContentView: View {
8686

8787
@Environment(\.sizeCategory) var sizeCategory
8888

89-
@ObservedObject var observableSheet = ObservableActiveSheet()
90-
@ObservedObject var urlToOpen = ObservableURL()
89+
@StateObject var observableSheet = ObservableActiveSheet()
90+
@StateObject var urlToOpen = ObservableURL()
9191

9292
var body: some View {
9393
let selection = Binding(get: { self._selection },
@@ -125,7 +125,8 @@ struct ContentView: View {
125125
Image(systemName: "gear")
126126
Text("Settings")
127127
}).environmentObject(settings).environment(\.managedObjectContext, viewContext)
128-
}.environment(\.didReselect, didReselect.eraseToAnyPublisher()).accentColor(settings.accentColor).font(Font(.body, sizeModifier: CGFloat(settings.textSizeModifier))).onOpenURL(perform: { url in
128+
}.environment(\.didReselect, didReselect.eraseToAnyPublisher())
129+
.onOpenURL(perform: { url in
129130
let _ = print(url)
130131
let openAction = {
131132
if url.host == "open", let comps = URLComponents(url: url, resolvingAgainstBaseURL: false), let items = comps.queryItems, let item = items.first, item.name == "url", let itemValue = item.value, let lobsters_url = URL(string: itemValue), lobsters_url.host == "lobste.rs" {
@@ -160,20 +161,20 @@ struct ContentView: View {
160161
openAction()
161162
}
162163
})
163-
.sheet(item: self.observableSheet.bindingSheet, content: { item in
164+
.sheet(item: self.$observableSheet.sheet, content: { item in
164165
switch item {
165166
case .story(let id):
166167
EZPanel{
167-
StoryView(id)
168-
}
168+
StoryView(id).id(id)
169+
}.id(id)
169170
.environmentObject(urlToOpen)
170171
.environmentObject(settings)
171172
.environmentObject(self.observableSheet)
172173
.environment(\.managedObjectContext, viewContext)
173174
case .user(let username):
174175
EZPanel{
175-
UserView(username)
176-
}
176+
UserView(username).id(username)
177+
}.id(username)
177178
.environmentObject(urlToOpen)
178179
.environmentObject(settings)
179180
.environmentObject(self.observableSheet)
@@ -205,6 +206,8 @@ struct ContentView: View {
205206
.environment(\.managedObjectContext, viewContext)
206207
.environmentObject(self.observableSheet)
207208
.environmentObject(urlToOpen)
209+
.accentColor(settings.accentColor)
210+
.font(Font(.body, sizeModifier: CGFloat(settings.textSizeModifier)))
208211
}
209212
}
210213

claw/ObservableURL.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,4 @@ import SwiftUI
33

44
public class ObservableURL: ObservableObject {
55
@Published var url: URL? = nil
6-
7-
var bindingUrl: Binding<URL?> {
8-
return Binding(get: {
9-
return self.url
10-
}, set: { newValue in
11-
self.url = newValue
12-
})
13-
}
146
}

claw/Settings/SettingsLinkView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ struct SettingsLinkView: View {
2323
ZZLabel(iconBackgroundColor: iconColor, iconColor: .white, systemImage: systemImage, image: image, text: text)
2424
})
2525
// this is necessary until multiple sheets can be displayed at one time. See #22
26-
.fullScreenCover(item: urlToOpen.bindingUrl, content: { url in
26+
.safariView(item: $urlToOpen.url, content: { url in
2727
SafariView(
2828
url: url,
2929
configuration: SafariView.Configuration(

claw/Stories/Story.swift

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ struct Story: GenericStory, Codable, Hashable, Identifiable {
1212
var id: String {
1313
return short_id
1414
}
15+
1516
var short_id: String
1617
var short_id_url: String
1718
var created_at: String
@@ -85,9 +86,9 @@ struct Comment: Codable, Hashable, Identifiable {
8586
class StoryFetcher: ObservableObject {
8687
@Published var story: Story? = nil
8788

88-
var short_id: String
89+
public var short_id: String? = nil
8990

90-
init(_ short_id: String) {
91+
init(_ short_id: String? = nil) {
9192
self.short_id = short_id
9293
}
9394

@@ -104,13 +105,25 @@ class StoryFetcher: ObservableObject {
104105
self.isReloading = true
105106
self.load()
106107
}
108+
109+
func loadIfEmpty() {
110+
if let _ = self.story {
111+
return
112+
}
113+
self.load()
114+
}
107115

108116
func load() {
109-
if let cachedStory = StoryFetcher.cachedStories.first(where: {$0.short_id == self.short_id}) {
117+
guard let short_id = self.short_id else {
118+
return
119+
}
120+
if let cachedStory = StoryFetcher.cachedStories.first(where: {$0.short_id == short_id}) {
110121
self.story = cachedStory
111122
}
112123
let url = URL(string: "https://lobste.rs/s/\(short_id).json")!
113-
124+
125+
self.session?.cancel()
126+
114127
self.session = URLSession.shared.dataTask(with: url) {(data,response,error) in
115128
DispatchQueue.main.async {
116129
self.isReloading = false
@@ -120,7 +133,7 @@ class StoryFetcher: ObservableObject {
120133
let decodedLists = try JSONDecoder().decode(Story.self, from: d)
121134
DispatchQueue.main.async {
122135
self.story = decodedLists
123-
StoryFetcher.cachedStories.removeAll(where: {$0.short_id == self.short_id})
136+
StoryFetcher.cachedStories.removeAll(where: {$0.short_id == short_id})
124137
StoryFetcher.cachedStories.append(decodedLists)
125138
if StoryFetcher.cachedStories.count > 10 {
126139
StoryFetcher.cachedStories.removeFirst()

claw/Stories/StoryListCellView.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,6 @@ import SwiftUI
33

44
public class ObservableActiveSheet: ObservableObject {
55
@Published var sheet: ActiveSheet? = nil
6-
7-
var bindingSheet: Binding<ActiveSheet?> {
8-
return Binding(get: {
9-
return self.sheet
10-
}, set: { newValue in
11-
self.sheet = newValue
12-
})
13-
}
146
}
157

168
struct StoryListCellView: View {

claw/Stories/StoryView.swift

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,19 @@ struct StoryView: View {
66
var from_newest: NewestStory?
77
@Environment(\.didReselect) var didReselect
88
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
9-
@ObservedObject var story: StoryFetcher
9+
@StateObject var story = StoryFetcher()
1010

1111
init(_ short_id: String) {
1212
self.short_id = short_id
13-
self.story = StoryFetcher(short_id)
1413
}
1514

1615
init(_ story: NewestStory) {
1716
self.from_newest = story
1817
self.short_id = story.short_id
19-
self.story = StoryFetcher(short_id)
2018
}
2119

2220
var title: String {
23-
if let story = story.story{
21+
if let story = self.story.story{
2422
if story.comment_count == 1 {
2523
return "1 comment"
2624
}
@@ -50,7 +48,7 @@ struct StoryView: View {
5048

5149
@EnvironmentObject var urlToOpen: ObservableURL
5250
@EnvironmentObject var observableSheet: ObservableActiveSheet
53-
51+
5452
var body: some View {
5553
ScrollViewReader { scrollReader in
5654

@@ -140,12 +138,13 @@ struct StoryView: View {
140138
}
141139
}
142140
}.onAppear(perform: {
141+
self.story.short_id = self.short_id
143142
self.story.load()
144143
let contains = viewedItems.contains { element in
145144
element.short_id == story.short_id && element.isStory
146145
}
147146
if !contains {
148-
viewContext.insert(ViewedItem(context: viewContext, short_id: story.short_id, isStory: true, isComment: false))
147+
viewContext.insert(ViewedItem(context: viewContext, short_id: story.short_id!, isStory: true, isComment: false))
149148
try? viewContext.save()
150149
}
151150
}).navigationBarItems(trailing: Button(action: {self.story.reload() }, label: {
@@ -155,16 +154,19 @@ struct StoryView: View {
155154
Image(systemName: "arrow.clockwise")
156155
}
157156
}))
158-
}
159-
// this is necessary until multiple sheets can be displayed at one time. See #22
160-
.fullScreenCover(item: urlToOpen.bindingUrl, content: { url in
157+
} // scrollviewreader
158+
.safariView(item: $urlToOpen.url,
159+
content:
160+
{ url in
161161
SafariView(
162162
url: url,
163163
configuration: SafariView.Configuration(
164164
entersReaderIfAvailable: settings.readerModeEnabled,
165165
barCollapsingEnabled: true
166166
)
167-
).preferredControlAccentColor(settings.accentColor).dismissButtonStyle(.close)
167+
)
168+
.preferredControlAccentColor(settings.accentColor)
169+
.dismissButtonStyle(.close)
168170
})
169171
}
170172
}

claw/User/UserView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ struct UserView: View {
110110
self.userFetcher.load()
111111
})
112112
// this is necessary until multiple sheets can be displayed at one time. See #22
113-
.fullScreenCover(item: urlToOpen.bindingUrl, content: { url in
113+
.safariView(item: $urlToOpen.url, content: { url in
114114
SafariView(
115115
url: url,
116116
configuration: SafariView.Configuration(

0 commit comments

Comments
 (0)