FastComments.com

अपने iOS ऐप में टिप्पणियाँ जोड़ें

यह FastComments की आधिकारिक iOS लाइब्रेरी है।

अपने iOS ऐप में लाइव कमेंटिंग, चैट और रिव्यू विजेट एम्बेड करें।

रिपॉज़िटरी

GitHub पर देखें

AI कोडिंग एजेंट Internal Link

skills.sh

अपने कोडिंग एजेंट को FastComments का वह संदर्भ दें जिसकी उसे आवश्यकता है - विजेट्स, कॉन्फ़िगरेशन, Secure SSO, REST API, और SDKs:

npx skills add fastcomments/skills

यह Claude Code, Codex, Cursor, Copilot, Gemini, और skills CLI द्वारा समर्थित हर अन्य एजेंट के साथ काम करता है।

विशेषताएँ Internal Link

  • नेस्टेड रिप्लाई और पेजिनेशन के साथ थ्रेडेड कमेंट ट्री
  • पोस्ट निर्माण, रिएक्शन और मीडिया अटैचमेंट के साथ सोशल फ़ीड
  • ऑटो-स्क्रॉल और तारीख विभाजकों के साथ लाइव चैट मोड
  • WebSocket के माध्यम से रीयल-टाइम अपडेट (नए कमेंट, वोट, प्रेज़ेंस)
  • Single Sign-On (टेस्टिंग के लिए Simple SSO, प्रोडक्शन के लिए Secure SSO)
  • बोल्ड, इटैलिक, कोड और @mentions के साथ रिच टेक्स्ट एडिटिंग
  • कॉन्फ़िगर करने योग्य स्टाइल के साथ वोटिंग (अप/डाउन एरो या हार्ट्स)
  • मॉडरेशन क्रियाएँ: फ्लैग, पिन, लॉक, ब्लॉक
  • प्रीसेट और पूर्ण कस्टमाइज़ेशन के साथ व्यापक थीमिंग
  • कमेंट और फ़ीड पोस्ट निर्माण के लिए कस्टम टूलबार बटन
  • इमेज अपलोड
  • EU क्षेत्र समर्थन
  • यूज़र प्रेज़ेंस (ऑनलाइन/ऑफलाइन संकेतक)
  • टैग-आधारित फ़ीड फ़िल्टरिंग
  • लोकलाइज़ेशन समर्थन

आवश्यकताएँ Internal Link

  • iOS 16+ या macOS 14+
  • Swift 5.9+
  • SwiftUI

इंस्टॉलेशन Internal Link

Swift Package Manager का उपयोग करके अपने प्रोजेक्ट में FastCommentsUI जोड़ें।

Xcode में: File > Add Package Dependencies, फिर रिपॉज़िटरी URL दर्ज करें।

या इसे अपने Package.swift में जोड़ें:

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

फिर अपने टारगेट में प्रोडक्ट जोड़ें:

.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" को अपनी FastComments tenant ID से बदलें। 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 -- उपयोगकर्ता ID (सेट न होने पर डिफ़ॉल्ट रूप से ईमेल)
  • displayName -- अलग डिस्प्ले नाम
  • displayLabel -- नाम के आगे दिखाया जाने वाला कस्टम लेबल (जैसे "VIP")
  • websiteUrl -- उपयोगकर्ता के नाम पर लिंक
  • locale -- लोकेल कोड
  • isProfileActivityPrivate -- प्रोफ़ाइल गतिविधि छिपाएँ (डिफ़ॉल्ट रूप से true)

Secure SSO

प्रोडक्शन में, आपका बैकएंड आपके API सीक्रेट का उपयोग करके एक साइन्ड SSO टोकन जनरेट करता है। 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()
// यह टोकन अपने API के माध्यम से अपने iOS ऐप को लौटाएँ

अपने 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 {
            // अपने बैकएंड से टोकन प्राप्त करें
            let token = try? await fetchSSOTokenFromYourBackend()
            // टोकन के साथ एक नया कॉन्फ़िग बनाएँ, या लोड से पहले सेट करें
            isLoadingToken = false
            try? await sdk.load()
        }
    }
}

SecureSSOUserData अतिरिक्त फ़ील्ड का समर्थन करता है:

  • optedInNotifications -- ईमेल नोटिफिकेशन ऑप्ट-इन
  • displayLabel -- कस्टम लेबल
  • displayName -- डिस्प्ले नाम
  • websiteUrl -- वेबसाइट URL
  • 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)
स्टाइलरूप
._0शुद्ध गिनती के साथ ऊपर/नीचे तीर बटन
._1गिनती के साथ एकल हार्ट बटन

इवेंट कॉलबैक

उपयोगकर्ता इंटरैक्शन को संभालने के लिए मॉडिफ़ायर-स्टाइल कॉलबैक का उपयोग करें:

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 इन कॉलबैक का समर्थन करता है:

  • .onCommentPosted -- जब उपयोगकर्ता संदेश भेजता है तो सक्रिय होता है
  • .onCommentDeleted -- जब कोई संदेश हटाया जाता है तो सक्रिय होता है
  • .onUserClick -- जब किसी उपयोगकर्ता के नाम या अवतार पर टैप किया जाता है तो सक्रिय होता है


सोशल फ़ीड 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.loadIfNeeded()
            }
    }
}

फ़ीड व्यू में पुल-टू-रिफ्रेश और इनफिनिट स्क्रॉल स्वचालित रूप से शामिल हैं। स्क्रीन लाइफ़साइकिल में पुनः प्रवेश के लिए loadIfNeeded() का उपयोग करें ताकि कोई मौजूदा या पुनर्स्थापित फ़ीड पेज 1 पर रीसेट न हो जाए।

पोस्ट बनाना

पोस्ट निर्माण फ़ॉर्म प्रस्तुत करने के लिए FeedPostCreateView का उपयोग करें:

@State private var showCreatePost = false

// अपने व्यू बॉडी में:
.sheet(isPresented: $showCreatePost) {
    FeedPostCreateView(
        sdk: sdk,
        onPostCreated: { post in
            showCreatePost = false
            Task { try? await sdk.refresh() }
        },
        onCancelled: {
            showCreatePost = false
        }
    )
}

पोस्ट पर प्रतिक्रिया देना

SDK ऑप्टिमिस्टिक अपडेट के साथ प्रतिक्रियाओं को संभालता है:

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

// प्रतिक्रिया स्थिति जाँचें
let hasLiked = sdk.hasUserReacted(postId: post.id, reactType: "l")
let likeCount = sdk.getLikeCount(postId: post.id)

किसी पोस्ट पर टिप्पणियाँ खोलना

फ़ीड पोस्ट के लिए टिप्पणियाँ दिखाने के लिए CommentsSheet का उपयोग करें। यह फ़ीड SDK के कॉन्फ़िग का उपयोग करके आंतरिक रूप से एक FastCommentsSDK इंस्टेंस बनाता है:

.sheet(item: $commentsPost) { post in
    CommentsSheet(post: post, feedSDK: sdk, onUserClick: { context, userInfo, source in
        // यूज़र क्लिक को संभालें
    })
}

नोट: .sheet(item:) के लिए FeedPost को Identifiable के अनुरूप होना चाहिए। यह एक्सटेंशन जोड़ें:

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()
// बाद में...
sdk.restorePaginationState(state)
try? await sdk.loadIfNeeded()

यदि आपकी स्क्रीन अस्थायी रूप से गायब हो जाती है, तो फ़ीड व्यू लाइव अपडेट को स्वचालित रूप से रोक देता है और लोड की गई पोस्ट साफ़ किए बिना पुनः दिखने पर उन्हें फिर से शुरू कर देता है। sdk.cleanup() को केवल तब कॉल करें जब आप SDK इंस्टेंस के साथ वास्तव में काम पूरा कर चुके हों।

पोस्ट हटाना

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         // वोट परिवर्तन पर स्प्रिंग एनिमेशन

थीम लागू करना

दो तरीके:

// SwiftUI environment के माध्यम से (व्यू हायरार्की के लिए अनुशंसित)
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}"
    }

    // वैकल्पिक ओवरराइड (डिफ़ॉल्ट 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

सभी उपयोगकर्ताओं के लिए उपलब्ध क्रियाएँ

  • Flag/Unflag -- समीक्षा के लिए किसी टिप्पणी की रिपोर्ट करें
try await sdk.flagComment(commentId: commentId)
try await sdk.unflagComment(commentId: commentId)
  • Block/Unblock -- किसी उपयोगकर्ता की सभी टिप्पणियाँ छिपाएँ (प्रति-दर्शक)
try await sdk.blockUser(commentId: commentId)
try await sdk.unblockUser(commentId: commentId)

केवल एडमिन के लिए क्रियाएँ

  • Pin/Unpin -- किसी टिप्पणी को थ्रेड के शीर्ष पर पिन करें
try await sdk.pinComment(commentId: commentId)
try await sdk.unpinComment(commentId: commentId)
  • Lock/Unlock -- किसी टिप्पणी पर नए उत्तरों को रोकें, और अनलॉक होने तक संपादन और हटाने को ब्लॉक करें (यह सभी पर लागू होता है, मॉडरेटर्स सहित)
try await sdk.lockComment(commentId: commentId)
try await sdk.unlockComment(commentId: commentId)

सभी मॉडरेशन क्रियाएँ UI में टिप्पणी संदर्भ मेनू के माध्यम से भी उपलब्ध हैं। एडमिन क्रियाएँ केवल तब दिखाई देती हैं जब वर्तमान उपयोगकर्ता साइट एडमिन हो (SSO isAdmin फ्लैग या डैशबोर्ड कॉन्फ़िगरेशन के माध्यम से सेट)।

रीयल-टाइम अपडेट Internal Link

sdk.load() को कॉल करने के बाद, SDK कॉन्फ़िगर किए गए urlId के लिए स्वचालित रूप से WebSocket इवेंट्स की सदस्यता ले लेता है। निम्नलिखित इवेंट्स हैंडल किए जाते हैं:

  • नई टिप्पणियाँ, संपादन और डिलीशन
  • वोट (नए और हटाए गए)
  • पिन, लॉक, फ्लैग और ब्लॉक स्थिति में परिवर्तन
  • यूज़र प्रेज़ेंस (जॉइन/लीव)
  • थ्रेड खुलना/बंद होना
  • बैज पुरस्कार
  • सर्वर कॉन्फ़िगरेशन अपडेट

लाइव डिस्प्ले को नियंत्रित करना

डिफ़ॉल्ट रूप से, अन्य उपयोगकर्ताओं की नई टिप्पणियाँ तुरंत दिखाई देती हैं:

sdk.showLiveRightAway = true   // Default: show instantly

नई टिप्पणियों को एक "N नई टिप्पणियाँ" बटन के पीछे बफर करने के लिए इसे false सेट करें, जिससे उपयोगकर्ता चुन सके कि उन्हें कब दिखाना है:

sdk.showLiveRightAway = false

यूज़र प्रेज़ेंस

जब सर्वर प्रेज़ेंस ट्रैकिंग सक्षम करता है, तो ऑनलाइन/ऑफलाइन संकेतक स्वचालित रूप से उपयोगकर्ता अवतारों पर दिखाई देते हैं। क्लाइंट पर किसी अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं है।


पेजिनेशन Internal Link

पेज साइज़

// Comments: default 30
sdk.pageSize = 50

// Feed: default 10
feedSDK.pageSize = 20

अधिक कमेंट्स लोड करना

UI पेजिनेशन कंट्रोल्स अपने आप दिखाता है। आप प्रोग्रामेटिक रूप से भी पेजिनेशन ट्रिगर कर सकते हैं:

// Load next page
try await sdk.loadMore()

// Load all remaining (disabled if >2000 comments for performance)
try await sdk.loadAll()

// Check state
sdk.hasMore            // Whether more pages exist
sdk.shouldShowLoadAll()
sdk.getCountRemainingToShow()

चाइल्ड कमेंट पेजिनेशन

नेस्टेड रिप्लाई लेज़ी लोड होते हैं। जब कोई यूज़र एक थ्रेड खोलता है, तो पहले 5 चाइल्ड कमेंट्स लोड होते हैं। यदि और रिप्लाई मौजूद हैं तो एक "load more replies" कंट्रोल दिखाई देता है। यह UI द्वारा अपने आप हैंडल किया जाता है।


स्थिति और ऑब्ज़र्वेबिलिटी Internal Link

FastCommentsSDK और FastCommentsFeedSDK दोनों @Published प्रॉपर्टीज़ वाली ObservableObject क्लासेस हैं। आप अपने SwiftUI व्यूज़ में इन्हें रिएक्टिव UI अपडेट्स के लिए observe कर सकते हैं।

FastCommentsSDK Published Properties

PropertyTypeDescription
commentCountOnServerIntसर्वर पर कुल कमेंट संख्या
newRootCommentCountIntबफ़र की गई नई कमेंट्स (जब showLiveRightAway false हो)
currentUserUserSessionInfo?वर्तमान प्रमाणित यूज़र
isSiteAdminBoolक्या वर्तमान यूज़र साइट एडमिन है
isClosedBoolक्या कमेंट थ्रेड बंद है
hasBillingIssueBoolक्या बिलिंग में कोई समस्या है
isLoadingBoolक्या कोई नेटवर्क रिक्वेस्ट चल रही है
hasMoreBoolक्या कमेंट्स के और पेज मौजूद हैं
blockingErrorMessageString?वह एरर जो UI के काम करने से रोकता है
warningMessageString?नॉन-ब्लॉकिंग चेतावनी संदेश
isDemoBoolक्या डेमो मोड में चल रहा है
commentsVisibleBoolकमेंट विज़िबिलिटी के लिए टॉगल
toolbarEnabledBoolक्या फ़ॉर्मैटिंग टूलबार दिखाया जाता है

FastCommentsFeedSDK Published Properties

PropertyTypeDescription
feedPosts[FeedPost]वर्तमान में लोड की गई फ़ीड पोस्ट्स
hasMoreBoolक्या और पेज मौजूद हैं
currentUserUserSessionInfo?वर्तमान प्रमाणित यूज़र
blockingErrorMessageString?ब्लॉकिंग एरर संदेश
isLoadingBoolक्या कोई नेटवर्क रिक्वेस्ट चल रही है
newPostsCountIntपिछली लोड के बाद नई पोस्ट्स की संख्या

Comment Tree

कमेंट ट्री को sdk.commentsTree के ज़रिए एक्सेस किया जा सकता है:

// Flat list of visible nodes for rendering
sdk.commentsTree.visibleNodes

// Lookup a comment by ID
sdk.commentsTree.commentsById["comment-id"]

EU क्षेत्र Internal Link

EU डेटा सेंटर का उपयोग करने के लिए, अपने कॉन्फ़िग में region फ़ील्ड सेट करें:

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

यह सभी API अनुरोधों और WebSocket कनेक्शनों को eu.fastcomments.com पर रूट करता है।

क्लीनअप Internal Link

जब आप किसी SDK इंस्टेंस के साथ काम पूरा कर लें (उदाहरण के लिए, व्यू को डिसमिस किया जा रहा हो), तो WebSocket कनेक्शन बंद करने और बैकग्राउंड टास्क रद्द करने के लिए cleanup() को कॉल करें:

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")
// Returns [UserSearchResult] with userId, username, avatar, etc.

बिल्ट-इन 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 की प्रॉपर्टीज़:

  • code -- API से मिला एरर कोड
  • reason -- अंग्रेज़ी में एरर विवरण
  • translatedError -- सर्वर द्वारा प्रदान किया गया स्थानीयकृत एरर संदेश

ब्लॉकिंग एरर्स sdk.blockingErrorMessage के माध्यम से भी स्वतः दिखाए जाते हैं, जिन्हें बिल्ट-इन व्यूज़ उपयोगकर्ता को प्रदर्शित करते हैं।

स्थानीयकरण Internal Link

कॉन्फ़िग में एक locale कोड पास करें ताकि सर्वर-प्रदत्त स्ट्रिंग्स का स्थानीयकरण हो सके:

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

क्लाइंट-साइड UI स्ट्रिंग्स iOS बंडल-आधारित स्थानीयकरण का उपयोग करती हैं।

उदाहरण ऐप Internal Link

रिपॉज़िटरी में ExampleApp/ पर एक पूर्ण उदाहरण ऐप शामिल है, जिसमें निम्नलिखित के प्रदर्शन हैं:

  • SSO और कस्टम थीम के साथ थ्रेडेड कमेंट्स
  • पोस्ट निर्माण और टैग फ़िल्टरिंग के साथ सोशल फ़ीड
  • लाइव चैट
  • सिंपल और सिक्योर SSO फ़्लो
  • कस्टम टूलबार बटन (कमेंट्स और फ़ीड)

सहायता चाहिए?

यदि आपको iOS Library के बारे में कोई समस्या आती है या कोई प्रश्न है, तो कृपया:

योगदान देना

योगदान का स्वागत है! कृपया योगदान दिशानिर्देशों के लिए GitHub रिपॉजिटरी देखें।