FastComments.com

Add Comments to Your iOS App

ื–ื•ื”ื™ ื”ืกืคืจื™ื™ื” ื”ืจืฉืžื™ืช ืœ-iOS ืฉืœ FastComments.

ื”ื˜ืžื™ืขื• ื•ื•ื™ื“ื’'ื˜ื™ื ืฉืœ ืชื’ื•ื‘ื•ืช ื‘ื–ืžืŸ ืืžืช, ืฆ'ืื˜ ื•ื‘ื™ืงื•ืจื•ืช ื‘ืืคืœื™ืงืฆื™ื™ืช ื”-iOS ืฉืœื›ื.

ืžืื’ืจ

ืฆืคื” ื‘-GitHub


ืชื›ื•ื ื•ืช Internal Link

  • ืขืฆื™ ืชื’ื•ื‘ื•ืช ืžืกื•ื“ืจื™ื ืขื ืชื’ื•ื‘ื•ืช ืžืงื•ื ื ื•ืช ื•ื—ืœื•ืงื” ืœื“ืคื™ื
  • ืคื™ื“ ื—ื‘ืจืชื™ ืขื ื™ืฆื™ืจืช ืคื•ืกื˜ื™ื, ืชื’ื•ื‘ื•ืช ื•ื”ืฆืžื“ื™ื ืฉืœ ืžื“ื™ื”
  • ืžืฆื‘ ืฆ'ืื˜ ื—ื™ ืขื ื’ืœื™ืœื” ืื•ื˜ื•ืžื˜ื™ืช ื•ืžืคืจื™ื“ื™ ืชืืจื™ื›ื™ื
  • ืขื“ื›ื•ื ื™ื ื‘ื–ืžืŸ ืืžืช ื‘ืืžืฆืขื•ืช WebSocket (ืชื’ื•ื‘ื•ืช ื—ื“ืฉื•ืช, ื”ืฆื‘ืขื•ืช, ื ื•ื›ื—ื•ืช)
  • ื›ื ื™ืกื” ื—ื“-ืคืขืžื™ืช (SSO ืคืฉื•ื˜ ืœื‘ื“ื™ืงื•ืช, SSO ืžืื•ื‘ื˜ื— ืœืกื‘ื™ื‘ืช ื™ื™ืฆื•ืจ)
  • ืขืจื™ื›ืช ื˜ืงืกื˜ ืขืฉื™ืจ ืขื ื”ื“ื’ืฉื”, ื ื˜ื•ื™, ืงื•ื“ ื•-@mentions
  • ื”ืฆื‘ืขื” ืขื ืกื’ื ื•ื ื•ืช ื ื™ืชื ื™ื ืœื”ืชืืžื” (ื—ื™ืฆื™ื ืœืžืขืœื”/ืœืžื˜ื” ืื• ืœื‘ื‘ื•ืช)
  • ืคืขื•ืœื•ืช ืžื•ื“ืจืฆื™ื”: ื“ื™ื•ื•ื—, ื ืขื™ืฆื”, ื ืขื™ืœื”, ื—ืกื™ืžื”
  • ืขื™ืฆื•ื‘ ืžืงื™ืฃ ืขื ืชื‘ื ื™ื•ืช ื•ื”ืชืืžื” ืื™ืฉื™ืช ืžืœืื”
  • ื›ืคืชื•ืจื™ื ืžื•ืชืืžื™ื ื‘ืกืจื’ืœ ื”ื›ืœื™ื ืœื™ืฆื™ืจืช ืชื’ื•ื‘ื•ืช ื•ืคื•ืกื˜ื™ื ื‘ืคื™ื“
  • ื”ืขืœืื•ืช ืชืžื•ื ื•ืช
  • ืชืžื™ื›ื” ื‘ืื–ื•ืจ ื”ืื™ื—ื•ื“ ื”ืื™ืจื•ืคื™
  • ื ื•ื›ื—ื•ืช ืžืฉืชืžืฉ (ืกื™ืžื•ื ื™ ืžืงื•ื•ืŸ/ืœื ืžืงื•ื•ืŸ)
  • ืกื™ื ื•ืŸ ืคื™ื“ ืžื‘ื•ืกืก ืชื’ื™ื•ืช
  • ืชืžื™ื›ื” ื‘ืœื•ืงืœื™ื–ืฆื™ื”

ื“ืจื™ืฉื•ืช Internal Link

  • iOS 16+ ืื• macOS 14+
  • Swift 5.9+
  • SwiftUI

ื”ืชืงื ื” Internal Link

ื”ื•ืกืฃ ืืช FastCommentsUI ืœืคืจื•ื™ืงื˜ ืฉืœืš ื‘ืืžืฆืขื•ืช Swift Package Manager.

ื‘โ€‘Xcode: File > Add Package Dependencies, ื•ืื– ื”ื–ืŸ ืืช ื›ืชื•ื‘ืช ื”ืžืื’ืจ.

ืื• ื”ื•ืกืฃ ืื•ืชื• ืœึพ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")
    ]
)

ื™ื™ื‘ื ืืช ืฉื ื™ ื”ืžื•ื“ื•ืœื™ื ื”ื™ื›ืŸ ืฉื ื“ืจืฉ:

import FastCommentsUI
import FastCommentsSwift

ื”ืชื—ืœื” ืžื”ื™ืจื” Internal Link

ื”ื”ื’ื“ืจื” ื”ืžื™ื ื™ืžืœื™ืช ืœื”ืฆื’ืช ื•ื•ื™ื“ื’'ื˜ ืชื’ื•ื‘ื•ืช:

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 ืžื–ื”ื” ืืช ื”ืขืžื•ื“ ืื• ื”ืฉืจืฉื•ืจ ืฉื‘ื• ืžืื•ื—ืกื ื•ืช ื”ืชื’ื•ื‘ื•ืช.



ืื™ืžื•ืช (SSO) Internal Link

FastComments ืชื•ืžืš ื‘ืฉืœื•ืฉื” ืžืฆื‘ื™ ืื™ืžื•ืช:

  1. Anonymous -- ืœืœื ืืกื™ืžื•ืŸ SSO; ืœืžืฉืชืžืฉื™ื ื ื™ืชื ื•ืช ื–ื”ื•ื™ื•ืช ืžื‘ื•ืกืกื•ืช ืกืฉืŸ
  2. Simple SSO -- ืืกื™ืžื•ืŸ ื‘ืฆื“ ื”ืœืงื•ื— ืขื‘ื•ืจ ื”ื“ื’ืžื•ืช ื•ื‘ื“ื™ืงื•ืช (ืœื ืžืื•ื‘ื˜ื—)
  3. Secure SSO -- ืืกื™ืžื•ืŸ ื”ื—ืชื•ื ืขืœ ื™ื“ื™ ื”ืฉืจืช ืœืฉื™ืžื•ืฉ ื‘ื™ื™ืฆื•ืจ

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 ืชื•ืžืš ื’ื ื‘ืฉื“ื•ืช ืื•ืคืฆื™ื•ื ืœื™ื™ื:

  • id -- ืžื–ื”ื” ืžืฉืชืžืฉ (ื‘ืจื™ืจืช ืžื—ื“ืœ: ื“ื•ืืจ ืืœืงื˜ืจื•ื ื™ ืื ืœื ืžื•ื’ื“ืจ)
  • displayName -- ืฉื ืชืฆื•ื’ื” ื ืคืจื“
  • displayLabel -- ืชื•ื•ื™ืช ืžื•ืชืืžืช ืฉืžื•ืฆื’ืช ืœืฆื“ ื”ืฉื (ืœืžืฉืœ "VIP")
  • websiteUrl -- ืงื™ืฉื•ืจ ืขืœ ืฉื ื”ืžืฉืชืžืฉ
  • locale -- ืงื•ื“ ืฉืคื”/ืื–ื•ืจ
  • isProfileActivityPrivate -- ื”ืกืชืจืช ืคืขื™ืœื•ืช ื”ืคืจื•ืคื™ืœ (ื‘ืจื™ืจืช ืžื—ื“ืœ: true)

Secure SSO

ื‘ืคืจื•ื“ืงืฉืŸ, ื”-backend ืฉืœื›ื ืžื™ื™ืฆืจ ืืกื™ืžื•ืŸ SSO ื—ืชื•ื ื‘ืืžืฆืขื•ืช ืกื•ื“ ื”-API ืฉืœื›ื. ืืคืœื™ืงืฆื™ื™ืช iOS ืžืงื‘ืœืช ืืช ื”ืืกื™ืžื•ืŸ ืžื”ืฉืจืช ืฉืœื›ื ื•ืžืขื‘ื™ืจื” ืื•ืชื• ืœืงื•ื ืคื™ื’ื•ืจืฆื™ื”.

ื‘ืฆื“ ื”ืฉืจืช ืฉืœื›ื (ื‘ืืžืฆืขื•ืช ื”-FastComments Swift SDK ืื• ื‘ื›ืœ ืฉืคื”):

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()
// Return this token to your iOS app via your API

ื‘ื™ื™ืฉื•ื ื”-iOS ืฉืœื›ื:

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 {
            // Fetch the token from your backend
            let token = try? await fetchSSOTokenFromYourBackend()
            // Create a new config with the token, or set it before load
            isLoadingToken = false
            try? await sdk.load()
        }
    }
}

SecureSSOUserData ืชื•ืžืš ื‘ืฉื“ื•ืช ื ื•ืกืคื™ื:

  • optedInNotifications -- ื”ืกื›ืžื” ืœืงื‘ืœืช ื”ืชืจืื•ืช ื‘ื“ื•ืืจ ืืœืงื˜ืจื•ื ื™
  • displayLabel -- ืชื•ื•ื™ืช ืžื•ืชืืžืช
  • displayName -- ืฉื ืชืฆื•ื’ื”
  • websiteUrl -- ื›ืชื•ื‘ืช ื”ืืชืจ
  • groupIds -- ืฉื™ื™ื›ื•ืช ืœืงื‘ื•ืฆื•ืช
  • isAdmin -- ื”ืจืฉืื•ืช ืžื ื”ืœ
  • isModerator -- ื”ืจืฉืื•ืช ืžื•ื“ืจื˜ื•ืจ
  • 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)
Style Appearance
._0 Up/down arrow buttons with net count
._1 Single heart button with count

ืงืจื™ืื•ืช ื—ื–ืจื” ืฉืœ ืื™ืจื•ืขื™ื

ื”ืฉืชืžืฉ ื‘ืงืจื™ืื•ืช ื—ื–ืจื” ื‘ืกื’ื ื•ืŸ 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
        // ื”ืžืงื•ืจ ื”ื•ื .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 ืชื•ืžืš ื‘ืงืจื™ืื•ืช ื—ื–ืจื” ืืœื”:

  • .onCommentPosted -- ื ืงืจื ื›ืืฉืจ ื”ืžืฉืชืžืฉ ืฉื•ืœื— ื”ื•ื“ืขื”
  • .onCommentDeleted -- ื ืงืจื ื›ืืฉืจ ื”ื•ื“ืขื” ื ืžื—ืงืช
  • .onUserClick -- ื ืงืจื ื›ืืฉืจ ื ืœื—ืฅ ืฉื ื”ืžืฉืชืžืฉ ืื• ืชืžื•ื ืช ื”ืคืจื•ืคื™ืœ ืฉืœื•


ืคื™ื“ ื—ื‘ืจืชื™ Internal Link

The feed system is a separate SDK (FastCommentsFeedSDK) with its own view.

ื˜ืขื™ื ื” ื•ื”ืฆื’ืช ื”ืคื™ื“

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
                // Present share sheet
            }
            .onUserClick { context, userInfo, source in
                // Navigate to user profile
            }
            .onMediaClick { mediaItem, index in
                // Present full-screen image viewer
            }
            .task {
                try? await sdk.load()
            }
    }
}

ืชืฆื•ื’ืช ื”ืคื™ื“ ื›ื•ืœืœืช ืžืฉื™ื›ื” ืœืจืขื ื•ืŸ ื•ื’ืœื™ืœื” ืื™ื ืกื•ืคื™ืช ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™.

ื™ืฆื™ืจืช ืคื•ืกื˜ื™ื

Use FeedPostCreateView to present a post creation form:

@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
        }
    )
}

ืชื’ื•ื‘ื•ืช ืœืคื•ืกื˜ื™ื

The SDK handles reactions with 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)

ืคืชื™ื—ืช ืชื’ื•ื‘ื•ืช ืœืคื•ืกื˜

Use CommentsSheet to display comments for a feed post. It creates a FastCommentsSDK instance internally using the feed SDK's config:

.sheet(item: $commentsPost) { post in
    CommentsSheet(post: post, feedSDK: sdk, onUserClick: { context, userInfo, source in
        // Handle user click
    })
}

ื”ืขืจื”: FeedPost ื—ื™ื™ื‘ ืœื”ืชืื™ื ืœืคืจื•ื˜ื•ืงื•ืœ Identifiable ืขื‘ื•ืจ .sheet(item:). ื”ื•ืกืฃ ืืช ื”ื”ืจื—ื‘ื” ื”ื–ื•:

extension FeedPost: @retroactive Identifiable {}

ืกื™ื ื•ืŸ ืคื™ื“ ืžื‘ื•ืกืก ืชื’ื™ื•ืช

Implement the TagSupplier protocol to filter feed posts by tags:

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

sdk.tagSupplier = TeamTagSupplier()

ื”ื—ื–ืจ nil ื›ื“ื™ ืœืงื‘ืœ ืคื™ื“ ื’ืœื•ื‘ืœื™ ืœืœื ืกื™ื ื•ืŸ.

ืฉืžื™ืจื” ื•ืฉื—ื–ื•ืจ ืžืฆื‘ ื”ืคื™ื“

Preserve pagination state across view lifecycle events:

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             // ืงื•ื˜ืจ ื”ืื•ื•ืื˜ืจ ืœืชื’ื•ื‘ื•ืช ืฉื•ืจืฉ
theme.replyAvatarSize = 28        // ืงื•ื˜ืจ ื”ืื•ื•ืื˜ืจ ืœืชื’ื•ื‘ื•ืช ืžืงื•ื ื ื•ืช

ืืคืงื˜ื™ื ื•ื™ื–ื•ืืœื™ื™ื

theme.showShadows = true          // ืฆืœืœื™ื ืขื“ื™ื ื™ื ืขืœ ืงืœืคื™ื
theme.showThreadLine = true       // ืงื• ืื ื›ื™ ื”ืžื—ื‘ืจ ืชื’ื•ื‘ื•ืช ืžืงื•ื ื ื•ืช
theme.animateVotes = true         // ืื ื™ืžืฆื™ื™ืช ืงืคื™ืฅ ื‘ืขืช ืฉื™ื ื•ื™ื™ ื”ืฆื‘ืขื”

ื”ื—ืœืช ืขืจื›ื•ืช ื ื•ืฉื

ืฉืชื™ ื’ื™ืฉื•ืช:

// Via SwiftUI environment (recommended for view hierarchy)
FastCommentsView(sdk: sdk)
    .fastCommentsTheme(theme)

// Directly on the 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}"
    }

    // ืืคืฉืจื•ื™ื•ืช ื‘ืจื™ืจืช ืžื—ื“ืœ ืฉื ื™ืชื ื•ืช ืœื”ื—ืœืคื” (ื‘ืจื™ืจืช ืžื—ื“ืœ 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: { }
)

ืื• ื”ื’ื“ืจ ืื•ืชื ื’ืœื•ื‘ืœื™ืช ื‘-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)

ื›ืœ ืคืขื•ืœื•ืช ื”ืžื•ื“ืจืฆื™ื” ื–ืžื™ื ื•ืช ื’ื ื“ืจืš ืชืคืจื™ื˜ ื”ื”ืงืฉืจ ืฉืœ ืชื’ื•ื‘ื” ื‘ืžืžืฉืง ื”ืžืฉืชืžืฉ. ืคืขื•ืœื•ืช ืžื ื”ืœ ืžื•ืคื™ืขื•ืช ืจืง ื›ืืฉืจ ื”ืžืฉืชืžืฉ ื”ื ื•ื›ื—ื™ ื”ื•ื ืžื ื”ืœ ื”ืืชืจ (ื ืงื‘ืข ื‘ืืžืฆืขื•ืช ื“ื’ืœ SSO isAdmin ืื• ื‘ื”ื’ื“ืจื•ืช ืœื•ื— ื”ื‘ืงืจื”).



ืขื“ื›ื•ื ื™ื ื‘ื–ืžืŸ ืืžืช Internal Link

ืœืื—ืจ ืงืจื™ืื” ืœ-sdk.load(), ื”-SDK ื ืจืฉื ืื•ื˜ื•ืžื˜ื™ืช ืœืื™ืจื•ืขื™ WebSocket ืขื‘ื•ืจ urlId ื”ืžื•ื’ื“ืจ. ื”ืื™ืจื•ืขื™ื ื”ื‘ืื™ื ืžื˜ื•ืคืœื™ื:

  • ืชื’ื•ื‘ื•ืช ื—ื“ืฉื•ืช, ืขืจื™ื›ื•ืช ื•ืžื—ื™ืงื•ืช
  • ื”ืฆื‘ืขื•ืช (ื”ื•ืกืคื” ื•ื”ืกืจื”)
  • ืฉื™ื ื•ื™ื™ื ื‘ืžืฆื‘ ื ืขื™ืฆื”, ื ืขื™ืœื”, ื“ื’ืœ ื•ื—ืกื™ืžื”
  • ื ื•ื›ื—ื•ืช ืžืฉืชืžืฉ (ื”ืฆื˜ืจืคื•ืช/ืขื–ื™ื‘ื”)
  • ืคืชื™ื—ื”/ืกื’ื™ืจื” ืฉืœ ืฉืจืฉื•ืจ
  • ื”ืขื ืงืช ืชื’ื™ื
  • ืขื“ื›ื•ื ื™ ืชืฆื•ืจืช ื”ืฉืจืช

ืฉืœื™ื˜ื” ื‘ืชืฆื•ื’ื” ื”ื—ื™ื”

ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ืชื’ื•ื‘ื•ืช ื—ื“ืฉื•ืช ืžืžืฉืชืžืฉื™ื ืื—ืจื™ื ืžื•ืคื™ืขื•ืช ืžื™ื“:

sdk.showLiveRightAway = true   // ื›ื‘ืจื™ืจืช ืžื—ื“ืœ: ื”ืฆื’ ืžื™ื“

ื”ื’ื“ืจ ื–ืืช ืœ-false ื›ื“ื™ ืœืื’ืจ ืชื’ื•ื‘ื•ืช ื—ื“ืฉื•ืช ืžืื—ื•ืจื™ ื›ืคืชื•ืจ "N ืชื’ื•ื‘ื•ืช ื—ื“ืฉื•ืช", ืžื” ืฉืžืืคืฉืจ ืœืžืฉืชืžืฉ ืœื‘ื—ื•ืจ ืžืชื™ ืœื—ืฉื•ืฃ ืื•ืชืŸ:

sdk.showLiveRightAway = false

ื ื•ื›ื—ื•ืช ืžืฉืชืžืฉ

ืžื—ื•ื•ื ื™ ืžืงื•ื•ืŸ/ืœื ืžืงื•ื•ืŸ ืžื•ืคื™ืขื™ื ืื•ื˜ื•ืžื˜ื™ืช ืขืœ ื”ืื•ื•ื˜ืจื™ื ืฉืœ ื”ืžืฉืชืžืฉื™ื ื›ืืฉืจ ื”ืฉืจืช ืžืืคืฉืจ ืžืขืงื‘ ื ื•ื›ื—ื•ืช. ืื™ืŸ ืฆื•ืจืš ื‘ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ื ื•ืกืคืช ื‘ืฆื“ ื”ืœืงื•ื—.



ืขื™ืžื•ื“ Internal Link

ื’ื•ื“ืœ ืขืžื•ื“

// ืชื’ื•ื‘ื•ืช: ื‘ืจื™ืจืช ืžื—ื“ืœ 30
sdk.pageSize = 50

// ืคื™ื“: ื‘ืจื™ืจืช ืžื—ื“ืœ 10
feedSDK.pageSize = 20

ื˜ืขื™ื ืช ืชื’ื•ื‘ื•ืช ื ื•ืกืคื•ืช

ืžืžืฉืง ื”ืžืฉืชืžืฉ ืžืฆื™ื’ ืื•ื˜ื•ืžื˜ื™ืช ื‘ืงืจื™ ืขื™ืžื•ื“. ื ื™ืชืŸ ื’ื ืœื”ืคืขื™ืœ ืขื™ืžื•ื“ ื‘ืื•ืคืŸ ืชื›ื ื•ืชื™:

// ื˜ืขืŸ ืืช ื”ืขืžื•ื“ ื”ื‘ื
try await sdk.loadMore()

// ื˜ืขืŸ ืืช ื›ืœ ื”ื ื•ืชืจื™ื (ืžื•ืฉื‘ืช ืื >2000 ืชื’ื•ื‘ื•ืช ืžื˜ืขืžื™ ื‘ื™ืฆื•ืขื™ื)
try await sdk.loadAll()

// ื‘ื“ื•ืง ืžืฆื‘
sdk.hasMore            // ื”ืื ืงื™ื™ืžื™ื ืขืžื•ื“ื™ื ื ื•ืกืคื™ื
sdk.shouldShowLoadAll()
sdk.getCountRemainingToShow()

ืขื™ืžื•ื“ ืชื’ื•ื‘ื•ืช ืžืฉื ื”

ืชืฉื•ื‘ื•ืช ืžืงื•ื ื ื•ืช ื ื˜ืขื ื•ืช ื‘ืื•ืคืŸ ืขืฆืœื ื™. ื›ืืฉืจ ืžืฉืชืžืฉ ืžืจื—ื™ื‘ ืฉืจืฉื•ืจ, ื—ืžืฉ ื”"ื™ืœื“ื™ื" ื”ืจืืฉื•ื ื™ื ื ื˜ืขื ื™ื. ื›ืคืชื•ืจ "ื˜ืขืŸ ืขื•ื“ ืชื’ื•ื‘ื•ืช" ื™ื•ืคื™ืข ืื ืงื™ื™ืžื•ืช ืชื’ื•ื‘ื•ืช ื ื•ืกืคื•ืช. ื–ื” ืžื ื•ื”ืœ ืื•ื˜ื•ืžื˜ื™ืช ืขืœ ื™ื“ื™ ืžืžืฉืง ื”ืžืฉืชืžืฉ.



ืžืฆื‘ ื•ืชืฆืคื™ืช Internal Link


ืฉื ื™ FastCommentsSDK ื•ึพFastCommentsFeedSDK ื”ื ืžื—ืœืงื•ืช ืžืกื•ื’ ObservableObject ืขื ืชื›ื•ื ื•ืช @Published. ื ื™ืชืŸ ืœืฆืคื•ืช ื‘ื”ืŸ ื‘ืชื•ืš ืชืฆื•ื’ื•ืช SwiftUI ืฉืœืš ืœืงื‘ืœืช ืขื“ื›ื•ื ื™ ืžืžืฉืง ืžืฉืชืžืฉ ืจื™ืืงื˜ื™ื‘ื™ื™ื.

ืชื›ื•ื ื•ืช Published ืฉืœ FastCommentsSDK

Property Type Description
commentCountOnServer Int ืžืกืคืจ ื›ื•ืœืœ ืฉืœ ืชื’ื•ื‘ื•ืช ื‘ืฉืจืช
newRootCommentCount Int ืชื’ื•ื‘ื•ืช ื—ื“ืฉื•ืช ืฉื”ืฆื˜ื‘ืจื• (ื›ืืฉืจ showLiveRightAway ื”ื•ื false)
currentUser UserSessionInfo? ื”ืžืฉืชืžืฉ ื”ืžืื•ืžืช ื”ื ื•ื›ื—ื™
isSiteAdmin Bool ื”ืื ื”ืžืฉืชืžืฉ ื”ื ื•ื›ื—ื™ ื”ื•ื ืžื ื”ืœ ื”ืืชืจ
isClosed Bool ื”ืื ืฉืจืฉื•ืจ ื”ืชื’ื•ื‘ื•ืช ืกื’ื•ืจ
hasBillingIssue Bool ื”ืื ืงื™ื™ืžืช ื‘ืขื™ื™ืช ืชืฉืœื•ื
isLoading Bool ื”ืื ื‘ืงืฉืช ืจืฉืช ื‘ืชื”ืœื™ืš
hasMore Bool ื”ืื ืงื™ื™ืžื™ื ืขื•ื“ ื“ืคื™ ืชื’ื•ื‘ื•ืช
blockingErrorMessage String? ืฉื’ื™ืื” ื”ื—ื•ืกืžืช ืืช ืคืขื•ืœืช ื”ืžืžืฉืง
warningMessage String? ื”ื•ื“ืขืช ืื–ื”ืจื” ืœื ื—ื•ืกืžืช
isDemo Bool ื”ืื ืคื•ืขืœ ื‘ืžืฆื‘ ื”ื“ื’ืžื”
commentsVisible Bool ืžืชื’ ืœื”ืฆื’ืช ืชื’ื•ื‘ื•ืช
toolbarEnabled Bool ื”ืื ืกืจื’ืœ ื”ืขื™ืฆื•ื‘ ืžื•ืฆื’

ืชื›ื•ื ื•ืช Published ืฉืœ FastCommentsFeedSDK

Property Type Description
feedPosts [FeedPost] ืคื•ืกื˜ื™ื ืฉืœ ื”-feed ืฉื˜ืขื•ื ื™ื ื›ืจื’ืข
hasMore Bool ื”ืื ืงื™ื™ืžื™ื ืขื•ื“ ื“ืคื™ื
currentUser UserSessionInfo? ื”ืžืฉืชืžืฉ ื”ืžืื•ืžืช ื”ื ื•ื›ื—ื™
blockingErrorMessage String? ื”ื•ื“ืขืช ืฉื’ื™ืื” ื—ื•ืกืžืช
isLoading Bool ื”ืื ื‘ืงืฉืช ืจืฉืช ื‘ืชื”ืœื™ืš
newPostsCount Int ืžืกืคืจ ืคื•ืกื˜ื™ื ื—ื“ืฉื™ื ืžืื– ื”ื˜ืขื™ื ื” ื”ืื—ืจื•ื ื”

ืขืฅ ื”ืชื’ื•ื‘ื•ืช

ื ื™ืชืŸ ืœื’ืฉืช ืœืขืฅ ื”ืชื’ื•ื‘ื•ืช ื“ืจืš sdk.commentsTree:

// ืจืฉื™ืžื” ืฉื˜ื•ื—ื” ืฉืœ ืฆืžืชื™ื ื’ืœื•ื™ื™ื ืœื”ืฆื’ื”
sdk.commentsTree.visibleNodes

// ื—ื™ืคื•ืฉ ืชื’ื•ื‘ื” ืœืคื™ ืžื–ื”ื”
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


ื›ืฉืชืกื™ื™ืžื• ืขื ืžื•ืคืข ืฉืœ ื”-SDK (ืœืžืฉืœ, ื›ืืฉืจ ื”ืชืฆื•ื’ื” ืžืชื‘ื˜ืœืช), ืงืจืื• ืœ-cleanup() ื›ื“ื™ ืœืกื’ื•ืจ ืืช ื—ื™ื‘ื•ืจ ื”-WebSocket ื•ืœื‘ื˜ืœ ืžืฉื™ืžื•ืช ื‘ืจืงืข:

sdk.cleanup()

ืขื‘ื•ืจ ืชืฆื•ื’ื•ืช ื”ื ื•ื”ืœื•ืช ืขืœ ื™ื“ื™ @StateObject ืฉืœ SwiftUI, ื‘ื“ืจืš ื›ืœืœ ื ืงืจื ืœื–ื” ื‘-.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

Search for users to support @mention autocomplete:

let results = try await sdk.searchUsers(query: "jan")
// ืžื—ื–ื™ืจ [UserSearchResult] ืขื userId, username, avatar ื•ื›ื•'.

The built-in CommentInputBar ืžื˜ืคืœ ื‘ื”ืฉืœืžื” ื”ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ @mention.



ืขืจื™ื›ื” ื•ืžื—ื™ืงื” ืฉืœ ืชื’ื•ื‘ื•ืช Internal Link

ืขืจื™ื›ื”

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

ื”ืฉืจืช ืžื™ื™ืฆืจ ืžื—ื“ืฉ ืืช ื”-HTML. ื”ืชื’ื•ื‘ื” ื”ืžืงื•ืžื™ืช ืžืชืขื“ื›ื ืช ืื•ื˜ื•ืžื˜ื™ืช.

ืžื—ื™ืงื”

try await sdk.deleteComment(commentId: commentId)

ืžื—ื™ืงืช ืชื’ื•ื‘ื” ืžืกื™ืจื” ื’ื ืืช ื”ืฆืืฆืื™ื ืฉืœื” ืžื”ืขืฅ ื”ืžืงื•ืžื™.

ืฉืชื™ ื”ืคืขื•ืœื•ืช ื–ืžื™ื ื•ืช ื“ืจืš ืชืคืจื™ื˜ ื”ื”ืงืฉืจ ืฉืœ ื”ืชื’ื•ื‘ื” ื‘ืžืžืฉืง ื”ืžืฉืชืžืฉ ื›ืืฉืจ ื”ืžืฉืชืžืฉ ื”ื ื•ื›ื—ื™ ื”ื•ื ืžื—ื‘ืจ ื”ืชื’ื•ื‘ื” (ืื• ืžื ื”ืœ ื”ืืชืจ).

ื˜ื™ืคื•ืœ ื‘ืฉื’ื™ืื•ืช 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 ืžืืคื™ื™ื ื™ื:

  • code -- ืงื•ื“ ืฉื’ื™ืื” ืžื”-API
  • reason -- ืชื™ืื•ืจ ื”ืฉื’ื™ืื” ื‘ืื ื’ืœื™ืช
  • translatedError -- ื”ื•ื“ืขืช ืฉื’ื™ืื” ืžืชื•ืจื’ืžืช ื”ืžืกื•ืคืงืช ืขืœ ื™ื“ื™ ื”ืฉืจืช

ืฉื’ื™ืื•ืช ื”ื—ื•ืกืžื•ืช ื’ื ืžื•ืฆื’ื•ืช ืื•ื˜ื•ืžื˜ื™ืช ื‘ืืžืฆืขื•ืช sdk.blockingErrorMessage, ืฉื”ืชืฆื•ื’ื•ืช ื”ืžื•ื‘ื ื•ืช ืžืฆื™ื’ื•ืช ืœืžืฉืชืžืฉ.



ืœื•ืงืœื™ื–ืฆื™ื” Internal Link


ื”ืขื‘ืจ ืงื•ื“ locale ื‘ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ื›ื“ื™ ืœื‘ืฆืข ืœื•ืงืœื™ื–ืฆื™ื” ืฉืœ ืžื—ืจื•ื–ื•ืช ืฉืžืกื•ืคืงื•ืช ืขืœ ื™ื“ื™ ื”ืฉืจืช:

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

ืžื—ืจื•ื–ื•ืช ืžืžืฉืง ื”ืžืฉืชืžืฉ ื‘ืฆื“ ื”ืœืงื•ื— ืžืฉืชืžืฉื•ืช ื‘ืœื•ืงืœื™ื–ืฆื™ื” ืžื‘ื•ืกืกืช bundle ืฉืœ iOS.



ืืคืœื™ืงืฆื™ื™ืช ื“ื•ื’ืžื” Internal Link


ื”ืžืื’ืจ ื›ื•ืœืœ ืืคืœื™ืงืฆื™ื™ืช ื“ื•ื’ืžื” ืžืœืื” ื‘ึพExampleApp/ ืขื ื”ื“ื’ืžื•ืช ืฉืœ:

  • ืชื’ื•ื‘ื•ืช ืžืงื•ื ื ื•ืช ืขื SSO ื•ื ื•ืฉืื™ื ืžื•ืชืืžื™ื
  • ืคื™ื“ ื—ื‘ืจืชื™ ืขื ื™ืฆื™ืจืช ืคื•ืกื˜ื™ื ื•ืกื™ื ื•ืŸ ืœืคื™ ืชื’ื™ื•ืช
  • ืฆ'ืื˜ ื—ื™
  • ื–ืจื™ืžื•ืช SSO ืคืฉื•ื˜ื•ืช ื•ืžืื•ื‘ื˜ื—ื•ืช
  • ื›ืคืชื•ืจื™ ืกืจื’ืœ ื›ืœื™ื ืžื•ืชืืžื™ื (ืœืชื’ื•ื‘ื•ืช ื•ืœืคื™ื“)


ื–ืงื•ืงื™ื ืœืขื–ืจื”?

ืื ืชื™ืชืงืœื• ื‘ื‘ืขื™ื•ืช ืื• ื™ืฉ ืœื›ื ืฉืืœื•ืช ืœื’ื‘ื™ ืกืคืจื™ื™ืช iOS, ืื ื:

ืชืจื•ืžื•ืช

ืชืจื•ืžื•ืช ืžืชืงื‘ืœื•ืช ื‘ื‘ืจื›ื”! ืื ื ื‘ืงืจื• ื‘-ืžืื’ืจ ื”-GitHub ืœืงื‘ืœืช ื”ื ื—ื™ื•ืช ืœืชืจื•ืžื”.