init commit,
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
//
|
||||
// PostUIView.swift
|
||||
// watchapp Watch App
|
||||
//
|
||||
// Created by Alexander Harding on 8/2/23.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct PostUIView: View {
|
||||
let postView: PostView
|
||||
|
||||
var post: Post {
|
||||
get {
|
||||
return postView.post
|
||||
}
|
||||
}
|
||||
|
||||
private let sessionManager = WatchSessionManager.shared
|
||||
|
||||
@Binding var tabSelection: Int
|
||||
var isLastPage: Bool
|
||||
|
||||
let requestConnectedInstance: String?
|
||||
|
||||
@State private var showingAlert = false
|
||||
@State private var saved: Bool?
|
||||
@State var error: Error? = nil
|
||||
|
||||
@State private var isImageLoading = false
|
||||
|
||||
var body: some View {
|
||||
ScrollView {
|
||||
LazyVStack(alignment: .leading) {
|
||||
Text(post.name)
|
||||
.font(.headline)
|
||||
.padding()
|
||||
|
||||
if let imageURL = post.thumbnailUrl, let url = URL(string: "\(imageURL)?format=jpg") {
|
||||
AsyncImage(url: url, scale: 1, transaction: Transaction(animation: .easeInOut)) { phase in
|
||||
switch phase {
|
||||
case .empty:
|
||||
ProgressView().frame(height: 100)
|
||||
case .success(let image):
|
||||
image
|
||||
.resizable()
|
||||
.scaledToFit() // Use scaledToFit() to maintain the original aspect ratio of the image
|
||||
.frame(width: WKInterfaceDevice.current().screenBounds.width) // Set image width to full screen width
|
||||
case .failure:
|
||||
Image(systemName: "wifi.slash").frame(
|
||||
width: WKInterfaceDevice.current().screenBounds.width,
|
||||
height: 100,
|
||||
alignment: .center
|
||||
)
|
||||
@unknown default:
|
||||
EmptyView()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Use a spacer to push the content to the top if the post content is smaller than the screen height
|
||||
Spacer()
|
||||
|
||||
if let body = post.body {
|
||||
Text(.init(body))
|
||||
.padding(.horizontal)
|
||||
.accentColor(.white)
|
||||
}
|
||||
|
||||
Button(saved ?? postView.saved ? "Saved" : "Save") {
|
||||
error = nil
|
||||
|
||||
guard let authToken = sessionManager.authToken, sessionManager.loggedIn, !isStaleFeed() else {
|
||||
showingAlert = true
|
||||
return
|
||||
}
|
||||
|
||||
APIManager.shared.setup(instanceHostname: requestConnectedInstance ?? "")
|
||||
|
||||
APIManager.shared.savePost(withID: postView.post.id, authToken: authToken) { result in
|
||||
switch result {
|
||||
case .success:
|
||||
saved = true
|
||||
showingAlert = true
|
||||
// Handle success and show the alert here
|
||||
case .failure(let _error):
|
||||
error = _error
|
||||
showingAlert = true
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
.padding(.top, 20)
|
||||
.alert(getSaveMessage(), isPresented: $showingAlert) {
|
||||
Button("Got it!", role: .cancel) { }
|
||||
}
|
||||
|
||||
if (!isLastPage) {
|
||||
Button("Next Post") {
|
||||
self.tabSelection += 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If connectedInstance changes, don't allow saving
|
||||
*/
|
||||
private func isStaleFeed() -> Bool {
|
||||
if (requestConnectedInstance == sessionManager.connectedInstance) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private func getSaveMessage() -> String {
|
||||
if error != nil {
|
||||
return "Error saving post, please try again."
|
||||
}
|
||||
|
||||
if isStaleFeed() {
|
||||
return "Account changed, please go back to refresh your feed."
|
||||
}
|
||||
|
||||
if sessionManager.loggedIn {
|
||||
return "Post saved to Lemmy account"
|
||||
}
|
||||
|
||||
return "Please login with the Voyager app on your phone to save posts"
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user