~ knotless Search/
↑↓ move↵ open⇧↵ all results

grain.social/grain-ios

1 collaborator
0
1
main
50 lines · 1.5 KB Raw History
import Foundation

@Observable
@MainActor
final class GalleryDetailViewModel {
    var gallery: GrainGallery?
    var comments: [GrainComment] = []
    var isLoading = false
    var error: Error?

    private var commentCursor: String?
    private var hasMoreComments = true
    private let client: XRPCClient

    init(client: XRPCClient) {
        self.client = client
    }

    func load(uri: String, auth: AuthContext? = nil) async {
        isLoading = true
        error = nil

        do {
            let galleryResult = try await client.getGallery(uri: uri, auth: auth)
            let commentsResult = try await client.getCommentThread(subject: uri, auth: auth)
            gallery = galleryResult.gallery
            comments = commentsResult.comments
            commentCursor = commentsResult.cursor
            hasMoreComments = commentsResult.cursor != nil
        } catch {
            self.error = error
        }
        isLoading = false
    }

    func loadMoreComments(galleryUri: String, auth: AuthContext? = nil) async {
        guard !isLoading, hasMoreComments, let cursor = commentCursor else { return }
        isLoading = true

        do {
            let response = try await client.getCommentThread(subject: galleryUri, cursor: cursor, auth: auth)
            comments.append(contentsOf: response.comments)
            commentCursor = response.cursor
            hasMoreComments = response.cursor != nil
        } catch {
            self.error = error
        }
        isLoading = false
    }
}