فیدگاه
شروع کار

پیکربندی SDK (SDK Configuration)

راهنمای کامل اتریبیوت‌های SDK فیدگاه، روش‌های یکپارچه‌سازی و نمونه کد برای فریم‌ورک‌های محبوب JavaScript.

SDK فیدگاه از طریق اتریبیوت‌های HTML پیکربندی می‌شود. این اتریبیوت‌ها را می‌توانید به دو شکل متفاوت اعمال کنید تا رفتار ابزارک را دقیقاً مطابق نیاز خود تنظیم کنید.


روش‌های استفاده از اتریبیوت‌ها

روش اول — تگ <script> اصلی (تنظیمات سراسری)

اتریبیوت‌هایی که مستقیماً روی تگ اسکریپت تعریف می‌کنید، به‌عنوان تنظیمات پیش‌فرض برای کل سایت اعمال می‌شوند.

<script
  src="https://fidegah.ir/api/sdk.js"
  data-sdk-token="YOUR_WORKSPACE_TOKEN"
  data-layout="sidebar"
  data-position="right"
  data-theme="light"
  data-size="default"
  data-blur="false"
  data-button="true"
></script>

روش دوم — دکمه‌های سفارشی (تنظیمات محلی)

هر عنصر HTML که دارای اتریبیوت data-fidegah-toggle باشد می‌تواند تنظیمات مختص خودش را داشته باشد. این تنظیمات محلی همیشه بر تنظیمات سراسری اسکریپت اولویت دارند.

<button
  data-fidegah-toggle
  data-layout="modal"
  data-position="right"
  data-theme="dark"
>
  ارسال بازخورد
</button>

این مکانیزم Override به شما اجازه می‌دهد در بخش‌های مختلف سایت، ابزارک را با ظاهر و رفتار متفاوت باز کنید؛ بدون اینکه تنظیمات سراسری را تغییر دهید.


فهرست اتریبیوت‌ها

data-sdk-token

توکن فضای‌کاری (Workspace) شما برای احراز هویت در فیدگاه. این اتریبیوت اجباری است و بدون آن SDK بارگذاری نمی‌شود.

ویژگیمقدار
محل استفادهفقط روی تگ <script> اصلی
اجباریبله
نوع مقداررشته — توکن دریافتی از پنل مدیریت
<script
  src="https://fidegah.ir/api/sdk.js"
  data-sdk-token="fg_sdk_xxxxxxxxxxxxxxxx"
></script>

توکن SDK با کلید مخفی (Secret Key) فرق دارد و برای استفاده در فرانت‌اند طراحی شده است. با این حال از قرار دادن آن در مخازن عمومی Git خودداری کنید.

برای دریافت SDK Token مراحل زیر را دنبال کنید :

وارد داشبورد مدیریت فیدگاه شوید و به مسیر تنظیمات > فضاهای‌کاری > تنظیمات SDK بروید.

SDK Token را کپی کنید.

ثبت دامنه‌های مجاز

برای جلوگیری از سوءاستفاده از توکن شما، حتماً باید دامنه‌های وب‌سایت خود را در پنل ثبت کنید. در غیر این صورت، درخواست‌های SDK از طرف وب‌سایت شما رد خواهند شد.

اگر دامنه‌ای در این بخش ثبت نشده باشد، SDK در آن وب‌سایت بارگذاری نخواهد شد و با خطای عدم دسترسی مواجه می‌شوید.

برای اضافه کردن دامنه‌های مجاز از همان صفحه تنطیمات SDK اقدام کنید.

نکته برای محیط توسعه

شما می‌توانید آدرس‌های محلی مانند localhost یا IP های محلی (به همراه پورت مربوطه، مثلاً localhost:3000) را نیز در لیست دامنه‌های مجاز وارد کنید تا در فرآیند پیاده‌سازی و تست روی سیستم خود دچار مشکل نشوید.


data-layout

شکل کلی و چیدمان هندسی ابزارک را تعیین می‌کند. روی موبایل، ابزارک همیشه به صورت تمام‌صفحه نمایش داده می‌شود و این تنظیم تأثیری ندارد.

ویژگیمقدار
پیش‌فرضsidebar
مقادیر مجازsidebar | floating | modal
مقداررفتار
sidebarمنوی کشویی تمام‌قد که از کناره صفحه وارد می‌شود
floatingکارت شناور مدرن با لبه‌های گرد و فاصله از کناره‌ها
modalباکس متمرکز در وسط صفحه با پس‌زمینه تاریک
<script src="https://fidegah.ir/api/sdk.js" data-layout="floating" ...></script>

data-position

جهت قرارگیری ابزارک روی صفحه و جهت انیمیشن ورود آن را مشخص می‌کند. در حالت modal این تنظیم روی جهت انیمیشن ورود تأثیر ندارد و ابزارک همیشه از مرکز بزرگ می‌شود.

ویژگیمقدار
پیش‌فرضright
مقادیر مجازright | left | top | bottom
مقداررفتار
rightابزارک در سمت راست قرار می‌گیرد، انیمیشن از راست به چپ
leftابزارک در سمت چپ قرار می‌گیرد، انیمیشن از چپ به راست
topابزارک به سقف صفحه متصل می‌شود، انیمیشن از بالا به پایین
bottomابزارک به کف صفحه متصل می‌شود، انیمیشن از پایین به بالا
<script src="https://fidegah.ir/api/sdk.js" data-position="left" ...></script>

data-theme

رنگ‌بندی کلی ابزارک را با پوسته سایت میزبان هماهنگ می‌کند.

ویژگیمقدار
پیش‌فرضlight
مقادیر مجازlight | dark
مقداررفتار
lightپس‌زمینه روشن با کادرها و متن‌های کم‌رنگ
darkپس‌زمینه تیره دودی، مناسب برای سایت‌هایی با Dark Mode
<script src="https://fidegah.ir/api/sdk.js" data-theme="dark" ...></script>

data-size

پهنا یا ارتفاع ابزارک را در حالت‌های sidebar و modal کنترل می‌کند. در حالت floating این تنظیم تأثیری ندارد.

ویژگیمقدار
پیش‌فرضdefault
مقادیر مجازdefault | half | full
مقداررفتار
defaultابعاد استاندارد — عرض ۴۵۰ پیکسل
halfنیمی از صفحه — 50vw برای sidebar و 50vh برای modal
fullتمام‌صفحه — 100vw یا 100vh
<script src="https://fidegah.ir/api/sdk.js" data-size="half" ...></script>

data-blur

یک افکت شیشه‌ای روی محتوای پشت ابزارک اعمال می‌کند تا توجه کاربر روی ابزارک متمرکز شود.

ویژگیمقدار
پیش‌فرضfalse
مقادیر مجازtrue | false
مقداررفتار
falseمحتوای پشتی فقط کمی تاریک می‌شود
trueافکت Backdrop Blur فعال می‌شود و پس‌زمینه مات می‌شود
<script src="https://fidegah.ir/api/sdk.js" data-blur="true" ...></script>

data-button

یک دکمه شناور آماده را در گوشه صفحه رندر می‌کند. اگر می‌خواهید دکمه باز‌کننده ابزارک را خودتان طراحی کنید، این گزینه را روی false نگه دارید.

ویژگیمقدار
محل استفادهفقط روی تگ <script> اصلی
پیش‌فرضfalse
مقادیر مجازtrue | false
مقداررفتار
falseهیچ دکمه‌ای به صفحه اضافه نمی‌شود
trueدکمه «ثبت بازخورد» با انیمیشن هاور در گوشه صفحه ظاهر می‌شود
<script src="https://fidegah.ir/api/sdk.js" data-button="true" ...></script>

data-fidegah-toggle

هر عنصر HTML را به دکمه باز و بسته‌کننده ابزارک تبدیل می‌کند. این اتریبیوت مقداری دریافت نمی‌کند و صرف وجودش روی عنصر کافی است.

ویژگیمقدار
نوعFlag — نیازی به مقدار ندارد
محل استفادهروی هر عنصر HTML دلخواه
<!-- دکمه معمولی -->
<button data-fidegah-toggle>ثبت بازخورد</button>

<!-- لینک -->
<a href="#" data-fidegah-toggle>ارسال نظر</a>

<!-- هر عنصر دلخواه -->
<span data-fidegah-toggle>
  <svg ... />
</span>

نمونه‌های یکپارچه‌سازی در فریم‌ورک‌ها

یک کامپوننت مجزا برای بارگذاری SDK بسازید و آن را در root اپ خود قرار دهید. با این رویکرد، اسکریپت فقط یک بار لود می‌شود و با تغییر کاربر لاگین‌شده، هویت به‌روزرسانی می‌شود.

src/components/FidegahSDK.tsx
import { useEffect } from "react";

interface FidegahSDKProps {
  userId?: string;
  userName?: string;
  userEmail?: string;
  userToken?: string;
}

export function FidegahSDK({
  userId,
  userName,
  userEmail,
  userToken,
}: FidegahSDKProps) {
  useEffect(() => {
    if (typeof window === "undefined") return;

    const script = document.createElement("script");
    script.src = "https://fidegah.ir/api/sdk.js";
    script.setAttribute("data-sdk-token", process.env.REACT_APP_FIDEGAH_TOKEN!);
    script.setAttribute("data-layout", "sidebar");
    script.setAttribute("data-position", "right");
    script.setAttribute("data-theme", "light");
    script.setAttribute("data-button", "true");

    const identifyUser = () => {
      if (userId && (window as any).Fidegah) {
        (window as any).Fidegah.identify({
          id: userId,
          name: userName,
          email: userEmail,
          token: userToken,
        });
      }
    };

    script.onload = identifyUser;
    document.body.appendChild(script);

    // اگر اسکریپت قبلاً لود شده و کاربر تغییر کرده باشد
    if ((window as any).Fidegah) {
      identifyUser();
    }

    return () => {
      document.body.removeChild(script);
    };
  }, [userId, userName, userEmail, userToken]);

  return null;
}
src/App.tsx
import { FidegahSDK } from "./components/FidegahSDK";
import { useAuth } from "./hooks/useAuth";

export default function App() {
  const { user } = useAuth();

  return (
    <>
      <FidegahSDK
        userId={user?.id}
        userName={user?.name}
        userEmail={user?.email}
        userToken={user?.fidegahToken}
      />
      {/* بقیه اپ */}
    </>
  );
}

در Next.js از کامپوننت بومی <Script> استفاده کنید و شناسایی کاربر را در یک کامپوننت کلاینت مجزا مدیریت کنید تا با لود ناهمگام اسکریپت تداخلی نداشته باشد.

components/FidegahIdentify.tsx
"use client";

import { useEffect } from "react";
import { useSession } from "next-auth/react";

export function FidegahIdentify() {
  const { data: session } = useSession();

  useEffect(() => {
    if (!session?.user) return;

    const identify = () => {
      if ((window as any).Fidegah) {
        (window as any).Fidegah.identify({
          id: session.user.id,
          name: session.user.name,
          email: session.user.email,
          token: session.user.fidegahToken,
        });
      }
    };

    // اجرای احراز هویت (اگر اسکریپت لود شده باشد)
    identify();

    // برای اطمینان در صورتی که اسکریپت بعداً لود شود
    window.addEventListener("load", identify);
    return () => window.removeEventListener("load", identify);
  }, [session]);

  return null;
}
app/layout.tsx
import Script from "next/script";
import { FidegahIdentify } from "@/components/FidegahIdentify";

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="fa" dir="rtl">
      <body>
        <FidegahIdentify />
        {children}
        <Script
          src="https://fidegah.ir/api/sdk.js"
          data-sdk-token={process.env.NEXT_PUBLIC_FIDEGAH_TOKEN}
          data-layout="sidebar"
          data-position="right"
          data-theme="light"
          data-button="true"
          strategy="lazyOnload"
        />
      </body>
    </html>
  );
}

توکن امضا (fidegahToken) را از یک Server Action یا API Route دریافت کنید تا FIDEGAH_SECRET_KEY هرگز به فرانت‌اند نرسد.

در Vue 3، اسکریپت را به صورت پویا بارگذاری کنید. با این کار از عدم اجرای کدهای مربوط به مرورگر در محیط SSR مطمئن می‌شوید.

src/App.vue
<template>
  <RouterView />
</template>

<script setup lang="ts">
import { onMounted, watch } from "vue";
import { useAuthStore } from "@/stores/auth";

const authStore = useAuthStore();

function loadFidegah() {
  if (typeof window === "undefined") return;

  const script = document.createElement("script");
  script.src = "https://fidegah.ir/api/sdk.js";
  script.setAttribute("data-sdk-token", import.meta.env.VITE_FIDEGAH_TOKEN);
  script.setAttribute("data-layout", "floating");
  script.setAttribute("data-position", "right");
  script.setAttribute("data-theme", "light");
  script.setAttribute("data-button", "true");

  script.onload = () => identifyUser();
  document.body.appendChild(script);

  // اگر اسکریپت از قبل لود شده باشد (مثلاً در سناریوهای خاص ناوبری)
  if ((window as any).Fidegah) {
    identifyUser();
  }
}

function identifyUser() {
  const user = authStore.currentUser;
  if (!user || !(window as any).Fidegah) return;

  (window as any).Fidegah.identify({
    id: user.id,
    name: user.name,
    email: user.email,
    token: user.fidegahToken,
  });
}

onMounted(() => loadFidegah());

// با تغییر اطلاعات کاربر، هویت او مجدداً به SDK اعلام می‌شود
watch(
  () => authStore.currentUser,
  () => identifyUser(),
  { deep: true },
);
</script>

در Nuxt 3 بهترین روش ایجاد یک Client Plugin برای تزریق اسکریپت و صدا زدن متد شناسایی در لایوت اصلی با رعایت شروط SSR است.

plugins/fidegah.client.ts
export default defineNuxtPlugin(() => {
  const config = useRuntimeConfig();

  useHead({
    script: [
      {
        src: "https://fidegah.ir/api/sdk.js",
        "data-sdk-token": config.public.fidegahToken,
        "data-layout": "sidebar",
        "data-position": "right",
        "data-theme": "light",
        "data-button": "true",
        tagPosition: "bodyClose",
      },
    ],
  });
});
nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    fidegahSecretKey: process.env.FIDEGAH_SECRET_KEY, // فقط در سمت سرور
    public: {
      fidegahToken: process.env.NUXT_PUBLIC_FIDEGAH_TOKEN, // در دسترس فرانت‌اند
    },
  },
});
layouts/default.vue
<script setup lang="ts">
import { watchEffect } from "vue";

const { data: session } = useAuth();

function identifyUser() {
  if (
    typeof window === "undefined" ||
    !(window as any).Fidegah ||
    !session.value?.user
  )
    return;

  (window as any).Fidegah.identify({
    id: session.value.user.id,
    name: session.value.user.name,
    email: session.value.user.email,
    token: session.value.user.fidegahToken,
  });
}

// گوش دادن به تغییرات وضعیت لاگین کاربر و وضعیت لود شدن کامل صفحه
watchEffect(() => {
  if (session.value?.user) {
    identifyUser();

    // اگر اسکریپت هنوز لود نشده، به محض لود کامل پنجره دوباره تلاش کن
    if (typeof window !== "undefined" && !(window as any).Fidegah) {
      window.addEventListener("load", identifyUser);
    }
  }
});
</script>

<template>
  <slot />
</template>

در SvelteKit، اسکریپت را در +layout.svelte بارگذاری کنید و توکن امضا را در +layout.server.ts تولید کنید تا Secret Key هیچ‌وقت به مرورگر نرسد.

src/routes/+layout.svelte
<script lang="ts">
  import { onMount } from "svelte";

  let { data, children } = $props();

  function identifyUser() {
    if (typeof window !== "undefined" && data.user && (window as any).Fidegah) {
      (window as any).Fidegah.identify({
        id: data.user.id,
        name: data.user.name,
        email: data.user.email,
        token: data.user.fidegahToken,
      });
    }
  }

  onMount(() => {
    const script = document.createElement("script");
    script.src = "https://fidegah.ir/api/sdk.js";
    script.setAttribute("data-sdk-token", import.meta.env.PUBLIC_FIDEGAH_TOKEN);
    script.setAttribute("data-layout", "sidebar");
    script.setAttribute("data-position", "right");
    script.setAttribute("data-theme", "light");
    script.setAttribute("data-button", "true");

    script.onload = identifyUser;
    document.body.appendChild(script);

    if ((window as any).Fidegah) {
      identifyUser();
    }

    return () => {
      document.body.removeChild(script);
    };
  });

  $effect(() => {
    if (data.user) identifyUser();
  });
</script>

{@render children()}
src/routes/+layout.server.ts
export async function load({ locals }) {
  const user = locals.session?.user;
  if (!user) return { user: null };

  const fidegahToken = generateFidegahToken(user.id);
  return { user: { ...user, fidegahToken } };
}

ترکیب دکمه‌های سفارشی

با استفاده از data-fidegah-toggle می‌توانید در بخش‌های مختلف سایت، ابزارک را با ظاهر و رفتار متفاوت باز کنید:

<!-- دکمه پیش‌فرض — از تنظیمات سراسری اسکریپت پیروی می‌کند -->
<button data-fidegah-toggle>بازخورد کلی</button>

<!-- مودال تاریک با blur برای گزارش باگ -->
<button
  data-fidegah-toggle
  data-layout="modal"
  data-theme="dark"
  data-blur="true"
>
  گزارش مشکل
</button>

<!-- sidebar در سمت چپ برای پیشنهاد قابلیت -->
<button data-fidegah-toggle data-layout="sidebar" data-position="left">
  پیشنهاد قابلیت
</button>

خلاصه اتریبیوت‌ها

اتریبیوتپیش‌فرضمقادیر مجازمحل استفاده
data-sdk-tokenرشته توکنفقط <script>
data-layoutsidebarsidebar | floating | modalهر دو
data-positionrightright | left | top | bottomهر دو
data-themelightlight | darkهر دو
data-sizedefaultdefault | half | fullهر دو
data-blurfalsetrue | falseهر دو
data-buttonfalsetrue | falseفقط <script>
data-fidegah-toggleFlag (بدون مقدار)دکمه‌های سفارشی

On this page