FastComments.com

Add Comments to Your iOS App

Αυτή είναι η επίσημη βιβλιοθήκη iOS για το FastComments.

Ενσωματώστε widgets για ζωντανά σχόλια, συνομιλία και αξιολογήσεις στην εφαρμογή iOS σας.

Αποθετήριο

Προβολή στο GitHub


Χαρακτηριστικά Internal Link

  • Δέντρα σχολίων με εμφωλευμένες απαντήσεις και σελιδοποίηση
  • Κοινωνική ροή με δημιουργία αναρτήσεων, αντιδράσεις και συνημμένα πολυμέσων
  • Λειτουργία ζωντανής συνομιλίας με αυτόματη κύλιση και διαχωριστικά ημερομηνιών
  • Ενημερώσεις σε πραγματικό χρόνο μέσω WebSocket (νέα σχόλια, ψήφοι, παρουσία)
  • Single Sign-On (Simple SSO για δοκιμές, Secure SSO για παραγωγή)
  • Επεξεργασία μορφοποιημένου κειμένου με έντονη γραφή, πλάγια, μορφοποίηση κώδικα και @mentions
  • Ψηφοφορία με ρυθμιζόμενα στυλ (βέλη πάνω/κάτω ή καρδιές)
  • Ενέργειες εποπτείας: αναφορά, καρφίτσωμα, κλείδωμα, αποκλεισμός
  • Εκτενής θεματοποίηση με προεπιλογές και πλήρη προσαρμογή
  • Προσαρμοσμένα κουμπιά γραμμής εργαλείων για σχόλια και δημιουργία αναρτήσεων στη ροή
  • Ανέβασμα εικόνων
  • Υποστήριξη περιοχής ΕΕ
  • Παρουσία χρηστών (ενδείκτες σε σύνδεση/εκτός σύνδεσης)
  • Φιλτράρισμα ροής βάσει ετικετών
  • Υποστήριξη τοπικοποίησης

Απαιτήσεις Internal Link

  • iOS 16+ ή macOS 14+
  • Swift 5.9+
  • SwiftUI

Εγκατάσταση Internal Link

Προσθέστε το FastCommentsUI στο έργο σας χρησιμοποιώντας το Swift Package Manager.

Στο Xcode: File > Add Package Dependencies, στη συνέχεια εισάγετε το URL του αποθετηρίου.

Ή προσθέστε το στο Package.swift σας:

dependencies: [
    .package(url: "https://github.com/fastcomments/fastcomments-ios.git", from: "1.0.0")
]

Στη συνέχεια προσθέστε το προϊόν στο target σας:

.target(
    name: "YourApp",
    dependencies: [
        .product(name: "FastCommentsUI", package: "fastcomments-ios")
    ]
)

Εισάγετε και τα δύο modules όπου χρειάζεται:

import FastCommentsUI
import FastCommentsSwift

Γρήγορη εκκίνηση Internal Link

Η ελάχιστη ρύθμιση για την εμφάνιση ενός widget σχολίων:

import SwiftUI
import FastCommentsUI

struct ContentView: View {
    @StateObject private var sdk = FastCommentsSDK(
        config: FastCommentsWidgetConfig(
            tenantId: "demo",
            urlId: "my-page-1",
            url: "https://example.com/page-1",
            pageTitle: "My Page"
        )
    )

    var body: some View {
        FastCommentsView(sdk: sdk)
            .task {
                try? await sdk.load()
            }
    }
}

Αντικαταστήστε το "demo" με το tenant ID του FastComments σας. Το urlId προσδιορίζει τη σελίδα ή την συζήτηση (thread) όπου αποθηκεύονται τα σχόλια.



Έλεγχος ταυτότητας (SSO) Internal Link

FastComments supports three authentication modes:

  1. Anonymous -- χωρίς SSO token; οι χρήστες λαμβάνουν ταυτότητες με βάση τη συνεδρία
  2. Simple SSO -- token στην πλευρά του πελάτη για παρουσιάσεις και τοπικές δοκιμές (μη ασφαλές)
  3. Secure SSO -- token υπογεγραμμένο από διακομιστή για παραγωγή

Simple SSO

Χρήσιμο για παρουσιάσεις και τοπικές δοκιμές. Ο οποιοσδήποτε μπορεί να προσποιηθεί οποιονδήποτε χρήστη με το Simple SSO, οπότε μην το χρησιμοποιείτε σε παραγωγή.

import FastCommentsSwift

let userData = SimpleSSOUserData(
    username: "Jane Doe",
    email: "jane@example.com",
    avatar: "https://example.com/avatar.jpg"
)
let sso = FastCommentsSSO.createSimple(simpleSSOUserData: userData)
let token = try? sso.prepareToSend()

let config = FastCommentsWidgetConfig(
    tenantId: "YOUR_TENANT_ID",
    urlId: "my-page-1",
    sso: token
)
let sdk = FastCommentsSDK(config: config)

SimpleSSOUserData also supports optional fields:

  • id -- user ID (defaults to email if not set) -> id -- αναγνωριστικό χρήστη (εξ ορισμού το email αν δεν οριστεί)
  • displayName -- separate display name -> displayName -- ξεχωριστό εμφανιζόμενο όνομα
  • displayLabel -- custom label shown next to the name (e.g. "VIP") -> displayLabel -- προσαρμοσμένη ετικέτα που εμφανίζεται δίπλα στο όνομα (π.χ. "VIP")
  • websiteUrl -- link on the user's name -> websiteUrl -- σύνδεσμος στο όνομα του χρήστη
  • locale -- locale code -> locale -- κωδικός τοπικής ρύθμισης
  • isProfileActivityPrivate -- hide profile activity (defaults to true) -> isProfileActivityPrivate -- απόκρυψη δραστηριότητας προφίλ (εξ ορισμού true)

Secure SSO

Σε παραγωγή, το backend σας δημιουργεί ένα υπογεγραμμένο SSO token χρησιμοποιώντας το API secret σας. Η εφαρμογή iOS ανακτά αυτό το token από τον διακομιστή σας και το περνάει στο config.

On your backend (using the FastComments Swift SDK or any language):

let userData = SecureSSOUserData(
    id: "user-123",
    email: "user@example.com",
    username: "Display Name",
    avatar: "https://example.com/avatar.jpg"
)
let sso = try FastCommentsSSO.createSecure(apiKey: "YOUR_API_KEY", secureSSOUserData: userData)
let token = try sso.prepareToSend()
// Επιστρέψτε αυτό το token στην εφαρμογή iOS μέσω του API σας

In your iOS app:

struct MyView: View {
    @StateObject private var sdk = FastCommentsSDK(
        config: FastCommentsWidgetConfig(
            tenantId: "YOUR_TENANT_ID",
            urlId: "my-page-1"
        )
    )
    @State private var isLoadingToken = true

    var body: some View {
        Group {
            if isLoadingToken {
                ProgressView("Loading...")
            } else {
                FastCommentsView(sdk: sdk)
            }
        }
        .task {
            // Ανακτήστε το token από το backend σας
            let token = try? await fetchSSOTokenFromYourBackend()
            // Δημιουργήστε ένα νέο config με το token, ή ορίστε το πριν το φόρτωμα
            isLoadingToken = false
            try? await sdk.load()
        }
    }
}

SecureSSOUserData supports additional fields:

  • optedInNotifications -- email notification opt-in -> optedInNotifications -- επιλογή λήψης ειδοποιήσεων μέσω email
  • displayLabel -- custom label -> displayLabel -- προσαρμοσμένη ετικέτα
  • displayName -- display name -> displayName -- εμφανιζόμενο όνομα
  • websiteUrl -- website URL -> websiteUrl -- URL ιστότοπου
  • groupIds -- group memberships -> groupIds -- συμμετοχές σε ομάδες
  • isAdmin -- admin privileges -> isAdmin -- προνόμια διαχειριστή
  • isModerator -- moderator privileges -> isModerator -- προνόμια συντονιστή
  • isProfileActivityPrivate -- profile privacy -> isProfileActivityPrivate -- ιδιωτικότητα δραστηριότητας προφίλ


Σχόλια με νήματα Internal Link

Βασική Χρήση

struct CommentsPage: View {
    @StateObject private var sdk = FastCommentsSDK(
        config: FastCommentsWidgetConfig(
            tenantId: "YOUR_TENANT_ID",
            urlId: "article-42",
            url: "https://example.com/article/42",
            pageTitle: "Article Title"
        )
    )

    var body: some View {
        FastCommentsView(sdk: sdk)
            .task {
                try? await sdk.load()
            }
    }
}

Στυλ Ψήφων

Το προεπιλεγμένο στυλ ψήφου εμφανίζει βέλη πάνω/κάτω. Χρησιμοποιήστε ._1 για ψήφους τύπου καρδιάς:

FastCommentsView(sdk: sdk, voteStyle: ._1)
Στυλ Εμφάνιση
._0 Κουμπιά βέλους πάνω/κάτω με καθαρό σύνολο
._1 Ενιαίο κουμπί καρδιάς με μέτρηση

Κλήσεις επιστροφής συμβάντων

Χρησιμοποιήστε κλήσεις επιστροφής σε μορφή modifier για να χειριστείτε τις αλληλεπιδράσεις του χρήστη:

FastCommentsView(sdk: sdk)
    .onCommentPosted { comment in
        print("New comment: \(comment.commentHTML)")
    }
    .onReplyClick { renderableComment in
        print("Replying to: \(renderableComment.comment.id)")
    }
    .onUserClick { context, userInfo, source in
        // source είναι .name ή .avatar
        print("Tapped \(userInfo.displayName)")
    }

Εφαρμογή Θέματος

Περάστε ένα θέμα μέσω του περιβάλλοντος SwiftUI:

FastCommentsView(sdk: sdk)
    .fastCommentsTheme(myTheme)
    .task { try? await sdk.load() }

Ή ορίστε το απευθείας στο SDK:

sdk.theme = FastCommentsTheme.modern

Κατεύθυνση Ταξινόμησης

sdk.defaultSortDirection = .nf  // Πρώτα τα πιο πρόσφατα (προεπιλογή)
sdk.defaultSortDirection = .of  // Πρώτα τα παλαιότερα
sdk.defaultSortDirection = .mr  // Πιο σχετικά

Ζωντανή συνομιλία Internal Link

LiveChatView παρέχει εμπειρία συνομιλίας σε πραγματικό χρόνο με αυτόματο κύλισμα, διαχωριστικά ημερομηνιών και συμπαγή διάταξη. Διαμορφώνει αυτόματα το SDK για ταξινόμηση από τα παλαιότερα προς τα νεότερα και άμεση ζωντανή εμφάνιση.

struct ChatView: View {
    @StateObject private var sdk: FastCommentsSDK = {
        let config = FastCommentsWidgetConfig(
            tenantId: "YOUR_TENANT_ID",
            urlId: "chat-room-1",
            sso: ssoToken  // Συνιστάται SSO ώστε οι χρήστες να έχουν ονόματα
        )
        return FastCommentsSDK(config: config)
    }()

    var body: some View {
        LiveChatView(sdk: sdk)
            .onCommentPosted { comment in
                print("Sent: \(comment.commentHTML)")
            }
            .task {
                try? await sdk.load()
            }
    }
}

LiveChatView υποστηρίζει τις ακόλουθες callbacks:

  • .onCommentPosted -- εκτελείται όταν ο χρήστης στέλνει ένα μήνυμα
  • .onCommentDeleted -- εκτελείται όταν ένα μήνυμα διαγράφεται
  • .onUserClick -- εκτελείται όταν πατηθεί το όνομα ή το avatar ενός χρήστη


Κοινωνική ροή Internal Link

Το σύστημα ροής είναι ένα ξεχωριστό SDK (FastCommentsFeedSDK) με τη δική του προβολή.

Φόρτωση και Εμφάνιση της Ροής

struct FeedPage: View {
    @StateObject private var sdk: FastCommentsFeedSDK = {
        let config = FastCommentsWidgetConfig(
            tenantId: "YOUR_TENANT_ID",
            urlId: "my-feed",
            sso: ssoToken
        )
        return FastCommentsFeedSDK(config: config)
    }()

    @State private var commentsPost: FeedPost?

    var body: some View {
        FastCommentsFeedView(sdk: sdk)
            .onPostSelected { post in
                commentsPost = post
            }
            .onCommentsRequested { post in
                commentsPost = post
            }
            .onSharePost { post in
                // Εμφάνιση φύλλου κοινής χρήσης
            }
            .onUserClick { context, userInfo, source in
                // Μετάβαση στο προφίλ χρήστη
            }
            .onMediaClick { mediaItem, index in
                // Εμφάνιση προβολέα εικόνων σε πλήρη οθόνη
            }
            .task {
                try? await sdk.load()
            }
    }
}

Η προβολή ροής περιλαμβάνει αυτόματα σύρσιμο για ανανέωση (pull-to-refresh) και απεριόριστη κύλιση.

Δημιουργία Αναρτήσεων

Χρησιμοποιήστε το FeedPostCreateView για να εμφανίσετε μια φόρμα δημιουργίας ανάρτησης:

@State private var showCreatePost = false

// In your view body:
.sheet(isPresented: $showCreatePost) {
    FeedPostCreateView(
        sdk: sdk,
        onPostCreated: { post in
            showCreatePost = false
            Task { try? await sdk.refresh() }
        },
        onCancelled: {
            showCreatePost = false
        }
    )
}

Αντιδράσεις σε Αναρτήσεις

Το SDK χειρίζεται τις αντιδράσεις με αισιόδοξες ενημερώσεις (optimistic updates):

try await sdk.reactPost(postId: post.id, reactionType: "l")

// Check reaction state
let hasLiked = sdk.hasUserReacted(postId: post.id, reactType: "l")
let likeCount = sdk.getLikeCount(postId: post.id)

Άνοιγμα Σχολίων σε Ανάρτηση

Χρησιμοποιήστε το CommentsSheet για να εμφανίσετε σχόλια για μια ανάρτηση ροής. Αυτό δημιουργεί εσωτερικά ένα στιγμιότυπο FastCommentsSDK χρησιμοποιώντας τη διαμόρφωση (config) του feed SDK:

.sheet(item: $commentsPost) { post in
    CommentsSheet(post: post, feedSDK: sdk, onUserClick: { context, userInfo, source in
        // Χειρισμός κλικ χρήστη
    })
}

Σημείωση: FeedPost πρέπει να συμμορφώνεται με Identifiable για .sheet(item:). Προσθέστε αυτήν την επέκταση:

extension FeedPost: @retroactive Identifiable {}

Φιλτράρισμα ροής βάσει ετικετών

Υλοποιήστε το πρωτόκολλο TagSupplier για να φιλτράρετε τις αναρτήσεις της ροής βάσει ετικετών:

struct TeamTagSupplier: TagSupplier {
    func getTags(currentUser: UserSessionInfo?) -> [String]? {
        guard let user = currentUser else { return nil }
        return ["team:\(user.id ?? "")", "public"]
    }
}

sdk.tagSupplier = TeamTagSupplier()

Επιστρέψτε nil για μια μη φιλτραρισμένη παγκόσμια ροή.

Αποθήκευση και Επαναφορά Κατάστασης Ροής

Διατηρήστε την κατάσταση σελιδοποίησης κατά τη διάρκεια των γεγονότων του κύκλου ζωής της προβολής:

let state = sdk.savePaginationState()
// Later...
sdk.restorePaginationState(state)

Διαγραφή Αναρτήσεων

sdk.onPostDeleted = { postId in
    print("Post \(postId) was deleted")
}


Θεματοποίηση Internal Link

Προεπιλογές Θέματος

Τέσσερις ενσωματωμένες προεπιλογές είναι διαθέσιμες:

// Προεπιλογές συστήματος
sdk.theme = FastCommentsTheme.default

// Κάρτες με σκιές και μεγάλες στρογγυλεμένες γωνίες
sdk.theme = FastCommentsTheme.modern

// Επίπεδο, χωρίς σκιές, μικρή ακτίνα γωνίας, χωρίς γραμμές συνομιλίας
sdk.theme = FastCommentsTheme.minimal

// Ορισμός όλων των χρωμάτων ενεργειών σε ένα μόνο χρώμα μάρκας
sdk.theme = FastCommentsTheme.allPrimary(.indigo)

Στυλ εμφάνισης σχολίων

var theme = FastCommentsTheme()
theme.commentStyle = .flat    // Επίπεδη λίστα με διαχωριστικά (προεπιλογή)
theme.commentStyle = .card    // Στρογγυλεμένες κάρτες με σκιές
theme.commentStyle = .bubble  // Στυλ φυσαλίδας συνομιλίας

Χρώματα

Όλες οι ιδιότητες χρώματος είναι προαιρετικές. Οι μη ορισμένες τιμές επανέρχονται σε λογικές προεπιλογές του συστήματος.

var theme = FastCommentsTheme()

// Χρώματα μάρκας
theme.primaryColor = .indigo
theme.primaryLightColor = .indigo.opacity(0.6)
theme.primaryDarkColor = Color(red: 0.2, green: 0.1, blue: 0.5)

// Φόντα
theme.commentBackgroundColor = Color(.secondarySystemGroupedBackground)
theme.containerBackgroundColor = Color(.systemGroupedBackground)

// Κουμπιά ενεργειών
theme.actionButtonColor = .indigo
theme.replyButtonColor = .indigo
theme.toggleRepliesButtonColor = .indigo.opacity(0.8)
theme.loadMoreButtonTextColor = .indigo

// Ψήφοι
theme.voteActiveColor = .red
theme.voteCountColor = .primary
theme.voteCountZeroColor = .secondary
theme.voteDividerColor = Color(.separator)

// Συνδέσμοι
theme.linkColor = .indigo
theme.linkColorPressed = .indigo.opacity(0.5)

// Διάλογοι
theme.dialogHeaderBackgroundColor = .indigo
theme.dialogHeaderTextColor = .white

// Γραμμή εισαγωγής
theme.inputBarBackgroundColor = Color(.systemBackground)
theme.inputBarBorderColor = Color(.separator)

// Άλλα
theme.onlineIndicatorColor = .green
theme.separatorColor = Color(.separator)
theme.badgeBackgroundColor = .gray.opacity(0.2)
theme.threadLineColor = .indigo.opacity(0.15)

Τυπογραφία

theme.commenterNameFont = .subheadline.weight(.bold)
theme.bodyFont = .body
theme.captionFont = .caption
theme.actionFont = .caption.weight(.medium)

Διάταξη και κενά

theme.cornerRadius = .large       // .none, .small, .medium, .large
theme.commentSpacing = 4          // Σημεία μεταξύ σειρών σχολίων
theme.nestingIndent = 20          // Σημεία εσοχής ανά επίπεδο εμφώλευσης
theme.avatarSize = 36             // Διάμετρος avatar για σχόλια ρίζας
theme.replyAvatarSize = 28        // Διάμετρος avatar για εμφωλευμένες απαντήσεις

Οπτικά Εφέ

theme.showShadows = true          // Διακριτικές σκιές στις κάρτες
theme.showThreadLine = true       // Κάθετη γραμμή που συνδέει εμφωλευμένες απαντήσεις
theme.animateVotes = true         // Εφέ ελατηρίου στις αλλαγές ψήφων

Εφαρμογή θεμάτων

Δύο προσεγγίσεις:

// Μέσω του περιβάλλοντος SwiftUI (συνιστάται για την ιεραρχία προβολής)
FastCommentsView(sdk: sdk)
    .fastCommentsTheme(theme)

// Άμεσα στο SDK
sdk.theme = theme


Προσαρμοσμένα κουμπιά γραμμής εργαλείων Internal Link

Κουμπιά γραμμής εργαλείων σχολίων

Υλοποιήστε το CustomToolbarButton πρωτόκολλο για να προσθέσετε κουμπιά στη γραμμή εργαλείων εισαγωγής σχολίων:

struct EmojiButton: CustomToolbarButton {
    let id = "emoji"
    let iconSystemName = "face.smiling"       // Όνομα SF Symbol
    let contentDescription = "Add Emoji"
    let badgeText: String? = nil              // Προαιρετικός μετρητής σήματος

    func onClick(text: Binding<String>) {
        text.wrappedValue += "\u{1F44D}"
    }

    // Προαιρετικά overrides (προεπιλογή true)
    func isEnabled() -> Bool { true }
    func isVisible() -> Bool { true }
}

Περάστε προσαρμοσμένα κουμπιά κατά τη δημιουργία της προβολής:

FastCommentsView(
    sdk: sdk,
    customToolbarButtons: [EmojiButton(), CodeBlockButton()]
)

Ή προσθέστε τα παγκοσμίως στο SDK (ισχύει για όλες τις παρουσίες):

sdk.addGlobalCustomToolbarButton(EmojiButton())
sdk.removeGlobalCustomToolbarButton(id: "emoji")
sdk.clearGlobalCustomToolbarButtons()

Κουμπιά γραμμής εργαλείων ροής

Υλοποιήστε το FeedCustomToolbarButton για τη φόρμα δημιουργίας δημοσίευσης:

struct HashtagButton: FeedCustomToolbarButton {
    let id = "hashtag"
    let iconSystemName = "number"
    let contentDescription = "Add Hashtag"

    func onClick(content: Binding<String>) {
        content.wrappedValue += "#"
    }
}

Περάστε τα στην προβολή δημιουργίας:

FeedPostCreateView(
    sdk: sdk,
    customToolbarButtons: [HashtagButton()],
    onPostCreated: { _ in },
    onCancelled: { }
)

Ή ορίστε τα παγκοσμίως στο feed SDK:

sdk.globalFeedToolbarButtons = [HashtagButton()]


Επιμέλεια Internal Link

Δράσεις Διαθέσιμες σε Όλους τους Χρήστες

  • Σήμανση/Αποσήμανση -- αναφορά ενός σχολίου για έλεγχο
try await sdk.flagComment(commentId: commentId)
try await sdk.unflagComment(commentId: commentId)
  • Αποκλεισμός/Κατάργηση Αποκλεισμού -- απόκρυψη όλων των σχολίων από έναν χρήστη (ανά θεατή)
try await sdk.blockUser(commentId: commentId)
try await sdk.unblockUser(commentId: commentId)

Δράσεις Μόνο για Διαχειριστές

  • Καρφίτσωμα/Αφαίρεση καρφιτσώματος -- καρφίτσωμα ενός σχολίου στην κορυφή του νήματος
try await sdk.pinComment(commentId: commentId)
try await sdk.unpinComment(commentId: commentId)
  • Κλείδωμα/Ξεκλείδωμα -- αποτροπή νέων απαντήσεων σε ένα σχόλιο
try await sdk.lockComment(commentId: commentId)
try await sdk.unlockComment(commentId: commentId)

All moderation actions are also available through the comment context menu in the UI. Admin actions only appear when the current user is a site admin (set via SSO isAdmin flag or dashboard configuration).

Ενημερώσεις σε πραγματικό χρόνο Internal Link


Μετά την κλήση του sdk.load(), το SDK εγγράφεται αυτόματα σε γεγονότα WebSocket για το διαμορφωμένο urlId. Τα παρακάτω γεγονότα διαχειρίζονται:

  • Νέα σχόλια, επεξεργασίες και διαγραφές
  • Ψήφοι (νέες και αφαιρεμένες)
  • Αλλαγές κατάστασης καρφίτσας, κλειδώματος, σηματοδότησης και αποκλεισμού
  • Παρουσία χρήστη (είσοδος/έξοδος)
  • Άνοιγμα/κλείσιμο νήματος
  • Απονομή διακριτικών
  • Ενημερώσεις ρυθμίσεων του διακομιστή

Έλεγχος της ζωντανής προβολής

Από προεπιλογή, νέα σχόλια από άλλους χρήστες εμφανίζονται αμέσως:

sdk.showLiveRightAway = true   // Προεπιλογή: εμφάνιση αμέσως

Ρυθμίστε αυτό σε false για να συγκρατείτε τα νέα σχόλια πίσω από ένα κουμπί "N νέα σχόλια", επιτρέποντας στον χρήστη να επιλέξει πότε θα τα αποκαλύψει:

sdk.showLiveRightAway = false

Παρουσία Χρηστών

Οι ενδείκτες online/offline εμφανίζονται αυτόματα στα avatar των χρηστών όταν ο διακομιστής ενεργοποιεί την παρακολούθηση παρουσίας. Δεν απαιτείται επιπλέον ρύθμιση στην πλευρά του πελάτη.



Σελιδοποίηση Internal Link

Μέγεθος Σελίδας

// Σχόλια: προεπιλογή 30
sdk.pageSize = 50

// Ροή: προεπιλογή 10
feedSDK.pageSize = 20

Φόρτωση Περισσότερων Σχολίων

Το UI εμφανίζει στοιχεία ελέγχου σελιδοποίησης αυτόματα. Μπορείτε επίσης να ενεργοποιήσετε τη σελιδοποίηση προγραμματιστικά:

// Φόρτωση επόμενης σελίδας
try await sdk.loadMore()

// Φόρτωση όλων των υπολοίπων (απενεργοποιημένο εάν >2000 σχόλια για λόγους απόδοσης)
try await sdk.loadAll()

// Έλεγχος κατάστασης
sdk.hasMore            // Εάν υπάρχουν περισσότερες σελίδες
sdk.shouldShowLoadAll()
sdk.getCountRemainingToShow()

Σελιδοποίηση Υποσχολίων

Οι εμφωλευμένες απαντήσεις φορτώνονται μόνο όταν χρειάζεται. Όταν ένας χρήστης επεκτείνει ένα νήμα, φορτώνονται τα πρώτα 5 υποσχόλια. Εμφανίζεται ένα στοιχείο ελέγχου "φόρτωση περισσότερων απαντήσεων" εάν υπάρχουν περισσότερα. Αυτό διαχειρίζεται αυτόματα από το UI.



Κατάσταση και Παρατηρησιμότητα Internal Link

Και τα FastCommentsSDK και FastCommentsFeedSDK είναι κλάσεις ObservableObject με ιδιότητες @Published. Μπορείτε να παρακολουθείτε αυτές στις προβολές SwiftUI σας για αντιδραστικές ενημερώσεις του UI.

FastCommentsSDK Δημοσιευμένες Ιδιότητες

Ιδιότητα Τύπος Περιγραφή
commentCountOnServer Int Συνολικός αριθμός σχολίων στον διακομιστή
newRootCommentCount Int Νέα σχόλια σε προσωρινή αποθήκευση (όταν το showLiveRightAway είναι false)
currentUser UserSessionInfo? Τρέχων αυθεντικοποιημένος χρήστης
isSiteAdmin Bool Εάν ο τρέχων χρήστης είναι διαχειριστής του ιστότοπου
isClosed Bool Εάν το νήμα σχολίων είναι κλειστό
hasBillingIssue Bool Εάν υπάρχει πρόβλημα χρέωσης
isLoading Bool Εάν βρίσκεται σε εξέλιξη ένα αίτημα δικτύου
hasMore Bool Εάν υπάρχουν περισσότερες σελίδες σχολίων
blockingErrorMessage String? Σφάλμα που εμποδίζει τη λειτουργία της διεπαφής χρήστη
warningMessage String? Μη μπλοκαριστικό μήνυμα προειδοποίησης
isDemo Bool Εάν τρέχει σε λειτουργία demo
commentsVisible Bool Εναλλαγή ορατότητας σχολίων
toolbarEnabled Bool Εάν η γραμμή εργαλείων μορφοποίησης εμφανίζεται

FastCommentsFeedSDK Δημοσιευμένες Ιδιότητες

Ιδιότητα Τύπος Περιγραφή
feedPosts [FeedPost] Αναρτήσεις feed που έχουν φορτωθεί
hasMore Bool Εάν υπάρχουν περισσότερες σελίδες
currentUser UserSessionInfo? Τρέχων αυθεντικοποιημένος χρήστης
blockingErrorMessage String? Μπλοκαριστικό μήνυμα σφάλματος
isLoading Bool Εάν βρίσκεται σε εξέλιξη ένα αίτημα δικτύου
newPostsCount Int Αριθμός νέων αναρτήσεων από την τελευταία φόρτωση

Δέντρο Σχολίων

Το δέντρο σχολίων είναι προσβάσιμο μέσω του sdk.commentsTree:

// Επίπεδη λίστα ορατών κόμβων για απόδοση
sdk.commentsTree.visibleNodes

// Εύρεση σχολίου κατά ID
sdk.commentsTree.commentsById["comment-id"]


Περιοχή ΕΕ Internal Link

Για να χρησιμοποιήσετε το κέντρο δεδομένων της ΕΕ, ορίστε το πεδίο region στη διαμόρφωσή σας:

let config = FastCommentsWidgetConfig(
    tenantId: "YOUR_TENANT_ID",
    urlId: "my-page",
    region: "eu"
)

Αυτό δρομολογεί όλα τα αιτήματα API και τις συνδέσεις WebSocket στο eu.fastcomments.com.

Καθαρισμός Internal Link


Όταν τελειώσετε με ένα instance του SDK (π.χ., η προβολή απορρίπτεται), καλέστε την cleanup() για να κλείσετε τη σύνδεση WebSocket και να ακυρώσετε τις εργασίες στο παρασκήνιο:

sdk.cleanup()

Για τις προβολές που διαχειρίζεται το SwiftUI μέσω του @StateObject, αυτό συνήθως καλείται στο .onDisappear ή όταν η προβολή αποδεσμεύεται.



Μεταφορτώσεις εικόνων Internal Link

Σχόλια

let imageUrl = try await sdk.uploadImage(imageData: jpegData, filename: "photo.jpg")

Επιστρέφει τη συμβολοσειρά URL της ανεβασμένης εικόνας.

Αναρτήσεις ροής

let mediaItem = try await feedSDK.uploadImage(imageData: jpegData, filename: "photo.jpg")

// Ανέβασμα πολλαπλών εικόνων παράλληλα
let mediaItems = try await feedSDK.uploadImages(images: [
    (jpegData1, "photo1.jpg"),
    (jpegData2, "photo2.jpg")
])


Αναφορές χρηστών Internal Link


Αναζήτηση χρηστών για υποστήριξη της αυτόματης συμπλήρωσης @mention:

let results = try await sdk.searchUsers(query: "jan")
// Επιστρέφει [UserSearchResult] με userId, username, avatar, κ.λπ.

Το ενσωματωμένο CommentInputBar χειρίζεται την αυτόματη συμπλήρωση @mention.



Επεξεργασία και διαγραφή σχολίων Internal Link

Επεξεργασία

try await sdk.editComment(commentId: commentId, newText: "Updated text")

Ο διακομιστής ξανα-αποδίδει το HTML. Το τοπικό σχόλιο ενημερώνεται αυτόματα.

Διαγραφή

try await sdk.deleteComment(commentId: commentId)

Η διαγραφή ενός σχολίου αφαιρεί επίσης τους απογόνους του από το τοπικό δέντρο.

Και οι δύο ενέργειες είναι διαθέσιμες μέσω του μενού περιβάλλοντος του σχολίου στο UI όταν ο τρέχων χρήστης είναι ο συγγραφέας του σχολίου (ή διαχειριστής του ιστότοπου).



Διαχείριση σφαλμάτων Internal Link


Οι μέθοδοι του SDK ρίχνουν FastCommentsError, το οποίο συμμορφώνεται με το LocalizedError:

do {
    try await sdk.load()
} catch let error as FastCommentsError {
    print(error.translatedError ?? error.reason ?? "Unknown error")
} catch {
    print(error.localizedDescription)
}

FastCommentsError properties:

  • code -- κωδικός σφάλματος από το API
  • reason -- περιγραφή σφάλματος στα Αγγλικά
  • translatedError -- τοπικοποιημένο μήνυμα σφάλματος που παρέχεται από τον διακομιστή

Σφάλματα αποκλεισμού εμφανίζονται επίσης αυτόματα μέσω του sdk.blockingErrorMessage, τα οποία οι ενσωματωμένες προβολές εμφανίζουν στον χρήστη.



Τοπικοποίηση Internal Link


Περάστε έναν κωδικό locale στο config για να τοπικοποιήσετε τις συμβολοσειρές που παρέχει ο διακομιστής:

let config = FastCommentsWidgetConfig(
    tenantId: "YOUR_TENANT_ID",
    urlId: "my-page",
    locale: "fr_fr"
)

Οι συμβολοσειρές του UI στην πλευρά του πελάτη χρησιμοποιούν το σύστημα τοπικοποίησης βασισμένο σε bundle του iOS.



Παράδειγμα εφαρμογής Internal Link

Το αποθετήριο περιλαμβάνει μια πλήρη εφαρμογή-παράδειγμα στο ExampleApp/ με επιδείξεις των:

  • Σπειροειδή σχόλια με SSO και προσαρμοσμένα θέματα
  • Κοινωνική ροή με δημιουργία δημοσιεύσεων και φιλτράρισμα με ετικέτες
  • Ζωντανή συνομιλία
  • Απλές και Ασφαλείς ροές SSO
  • Προσαρμοσμένα κουμπιά γραμμής εργαλείων (σχόλια και ροή)

Χρειάζεστε βοήθεια;

Εάν αντιμετωπίσετε οποιοδήποτε πρόβλημα ή έχετε ερωτήσεις σχετικά με τη βιβλιοθήκη iOS, παρακαλούμε:

Συνεισφορά

Οι συνεισφορές είναι ευπρόσδεκτες! Παρακαλούμε επισκεφθείτε το αποθετήριο GitHub για οδηγίες συνεισφοράς.