Files
HKSingleParty/99_references/voyager-main/ios/App/VoyagerWatch Watch App/PostUIView.swift
2025-05-28 09:55:51 +08:00

134 lines
4.2 KiB
Swift

//
// 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"
}
}