134 lines
4.2 KiB
Swift
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"
|
|
}
|
|
}
|