رفتن به محتوای اصلی

React Hooks

همه Hookهای صادرشده از alphana-sdk/react، رفتار هرکدام و قرارداد fallback آن‌ها در خارج از Provider.

پکیج alphana-sdk/react مجموعه‌ای از Hookها را برای استفاده مستقیم از Tracker آلفانا در کامپوننت‌های React در اختیار شما قرار می‌دهد. این Hookها دسترسی به Tracker، ثبت Pageview، ارسال Goal و Revenue، خواندن Feature Flagها، بررسی Variant آزمایش‌ها و استفاده از داده‌های Heatmap را ساده‌تر می‌کنند.

برای اینکه Hookها به instance فعال Tracker دسترسی داشته باشند، باید داخل UserTrackerProvider استفاده شوند.

اگر یک Hook خارج از Provider اجرا شود، SDK به‌جای ایجاد خطا از رفتار fallback امن استفاده می‌کند. در این حالت، useTracker() مقدار null برمی‌گرداند و Hookهایی که عملیاتی مثل ثبت Goal، Revenue یا Journey Step انجام می‌دهند به‌صورت امن no-op می‌شوند.

این رفتار کمک می‌کند نبود Provider باعث شکستن Render یا اجرای کامپوننت نشود؛ با این حال، برای ثبت واقعی داده‌ها باید Provider در سطح مناسب از درخت React قرار گرفته باشد.

Hookهای در دسترس#

Hookخروجی / رفتار
useTracker()instance فعلی UserTracker را برمی‌گرداند؛ اگر Provider در دسترس نباشد مقدار null برمی‌گرداند
usePageView(path?)با تغییر path یک Pageview ثبت می‌کند و برای ردیابی Navigation در اپلیکیشن‌های React قابل استفاده است
useHeatmapData(path?, refreshMs?)داده‌های Heatmap را به‌صورت آرایه live برمی‌گرداند و به‌طور پیش‌فرض هر ۵۰۰ms refresh می‌شود
useTrackRevenue()یک callback پایدار برای اجرای trackRevenue برمی‌گرداند
useTrackGoal()یک callback پایدار برای اجرای trackGoal برمی‌گرداند
useTrackJourneyStep()یک callback پایدار برای اجرای trackJourneyStep برمی‌گرداند
useFeatureFlags()map فعلی Feature Flagها را برمی‌گرداند و هنگام refresh شدن Flagها باعث rerender می‌شود
useFeatureFlag(key)وضعیت boolean مربوط به یک Feature Flag مشخص را برمی‌گرداند
useAbTests()map مربوط به همه assignmentهای فعلی آزمایش‌ها را در اختیار کامپوننت قرار می‌دهد
useAbVariant(key)Variant مربوط به یک آزمایش مشخص را برمی‌گرداند و در صورت نبود assignment مقدار null می‌دهد
useIsAbVariant(test, variant)بررسی می‌کند کاربر در Variant مشخص‌شده از یک آزمایش قرار گرفته است یا نه و نتیجه boolean برمی‌گرداند

استفاده از useTracker#

اگر به instance اصلی Tracker نیاز دارید، می‌توانید از useTracker() استفاده کنید:

tsx
import { useTracker } from "alphana-sdk/react";

export function DebugTracker() {
  const tracker = useTracker();

  if (!tracker) {
    return null;
  }

  return <button onClick={() => tracker.flush()}>Flush</button>;
}

در این مثال، اگر کامپوننت خارج از UserTrackerProvider قرار گرفته باشد، tracker مقدار null خواهد داشت و کامپوننت بدون ایجاد خطا Render می‌شود.

ثبت Goal با useTrackGoal#

برای رفتارهایی که یک هدف مشخص در محصول را نشان می‌دهند، می‌توانید از useTrackGoal() استفاده کنید.

tsx
import { useTrackGoal } from "alphana-sdk/react";

export function SignupDone() {
  const trackGoal = useTrackGoal();

  return (
    <button
      onClick={() =>
        trackGoal({
          key: "signup_completed",
        })
      }
    >
      ثبت
    </button>
  );
}

useTrackGoal() یک callback پایدار برمی‌گرداند؛ بنابراین می‌توانید آن را مستقیماً داخل handlerهای کامپوننت استفاده کنید.

اگر Provider در دسترس نباشد، فراخوانی این callback خطایی ایجاد نمی‌کند و به‌صورت no-op اجرا می‌شود.

ثبت Pageview#

در اپلیکیشن‌هایی که Navigation بدون reload کامل صفحه انجام می‌شود، usePageView() می‌تواند برای ثبت تغییر مسیر استفاده شود.

tsx
usePageView(path);

هر زمان مقدار path تغییر کند، Hook یک Pageview جدید ثبت می‌کند.

اگر path را به‌صورت دستی مدیریت می‌کنید، مطمئن شوید مقدار ارسال‌شده نمایانگر مسیر واقعی‌ای است که می‌خواهید در گزارش‌های آلفانا دیده شود.

Feature Flagها#

برای دسترسی به همه Flagهای فعلی می‌توانید از useFeatureFlags() استفاده کنید:

tsx
const flags = useFeatureFlags();

اگر فقط وضعیت یک Flag مشخص مهم است، useFeatureFlag(key) انتخاب ساده‌تری است:

tsx
const enabled = useFeatureFlag("new_checkout");

این Hook مقدار boolean مربوط به همان Flag را برمی‌گرداند و با refresh شدن ارزیابی Flagها، کامپوننت دوباره Render می‌شود.

A/B Test و Variantها#

برای خواندن assignmentهای آزمایش می‌توانید از useAbTests()، useAbVariant() یا useIsAbVariant() استفاده کنید.

tsx
const variant = useAbVariant("checkout_experiment");

در صورتی که assignment برای آزمایش موردنظر وجود نداشته باشد، useAbVariant() مقدار null برمی‌گرداند.

اگر فقط می‌خواهید بدانید کاربر در یک Variant مشخص قرار دارد یا نه:

tsx
const isVariantB = useIsAbVariant("checkout_experiment", "variant_b");

خروجی این Hook یک مقدار boolean است و می‌تواند مستقیماً برای کنترل Render یا رفتار کامپوننت استفاده شود.

داده‌های Heatmap#

useHeatmapData(path?, refreshMs?) داده‌های Heatmap موجود در حافظه Tracker را به‌صورت live در اختیار کامپوننت قرار می‌دهد.

به‌طور پیش‌فرض، این Hook هر 500ms داده را refresh می‌کند:

tsx
const heatmapData = useHeatmapData();

در صورت نیاز می‌توانید فاصله refresh را تغییر دهید:

tsx
const heatmapData = useHeatmapData("/pricing", 1000);

مقدار refreshMs را متناسب با نیاز کامپوننت انتخاب کنید. refresh سریع‌تر همیشه به معنای تجربه بهتر نیست و می‌تواند باعث rerenderهای بیشتر شود.

رفتار fallback خارج از Provider#

Hookهای React آلفانا طوری طراحی شده‌اند که نبود UserTrackerProvider باعث ایجاد خطای Runtime نشود.

در خارج از Provider:

  • useTracker() مقدار null برمی‌گرداند.
  • Hookهای عملیاتی مثل useTrackGoal()، useTrackRevenue() و useTrackJourneyStep() به callbackهای امن no-op تبدیل می‌شوند.
  • Hookهای وابسته به داده، در نبود Tracker از fallback امن خود استفاده می‌کنند.

این رفتار برای جلوگیری از شکستن اپلیکیشن است، نه جایگزینی برای Provider.

اگر انتظار دارید داده‌ای واقعاً در آلفانا ثبت یا ارزیابی شود، مطمئن شوید کامپوننت موردنظر در محدوده UserTrackerProvider قرار دارد.