fdback.iofdback.io

React Integration

React components and hooks for fdback.io

npm install @fdback.io/sdk react

Setup Provider

Wrap your app with the FdbackProvider:

// app/providers.tsx or app/layout.tsx
import { FdbackProvider } from "@fdback.io/sdk/react";

export function Providers({ children }: { children: React.ReactNode }) {
  return (
    <FdbackProvider
      workspaceId="your-workspace-id"
      signEndpoint="/api/fdback/sign"
    >
      {children}
    </FdbackProvider>
  );
}

FeedbackButton Component

The easiest way to add feedback - a ready-to-use button:

"use client";
import { FeedbackButton } from "@fdback.io/sdk/react";

export function Header() {
  const user = useCurrentUser(); // Your auth hook

  return (
    <FeedbackButton
      user={{ email: user.email, name: user.name }}
      className="btn btn-primary"
      onOpen={(win) => console.log("Opened!", win)}
      onError={(err) => console.error(err)}
    >
      Give Feedback
    </FeedbackButton>
  );
}

useFdbackLogin Hook

For custom implementations with loading and error states:

"use client";
import { useFdbackLogin } from "@fdback.io/sdk/react";

export function CustomFeedback() {
  const { login, isLoading, error } = useFdbackLogin();

  const handleClick = async () => {
    await login(
      { email: "user@example.com", name: "John" },
      { mode: "popup" }
    );
  };

  return (
    <button onClick={handleClick} disabled={isLoading}>
      {isLoading ? "Opening..." : "Feedback"}
    </button>
  );
}

useFdback Hook

Access the Fdback context directly:

"use client";
import { useFdback } from "@fdback.io/sdk/react";

export function FeedbackStatus() {
  const { isOpen, getBoardUrl, workspaceId } = useFdback();

  return (
    <div>
      <p>Workspace: {workspaceId}</p>
      <p>Board URL: {getBoardUrl()}</p>
      <p>Popup open: {isOpen ? "Yes" : "No"}</p>
    </div>
  );
}

API Reference

ExportTypeDescription
FdbackProviderComponentContext provider with workspace config
FeedbackButtonComponentReady-to-use button with built-in signing
useFdbackHookAccess context (client, isOpen, etc.)
useFdbackLoginHookLogin + open with loading/error state

FdbackProvider Props

interface FdbackProviderProps {
  workspaceId: string;      // Your workspace ID
  signEndpoint?: string;    // API endpoint for signing (e.g., "/api/fdback/sign")
  baseUrl?: string;         // Custom base URL
  children: React.ReactNode;
}

FeedbackButton Props

interface FeedbackButtonProps {
  user: FdbackUser;                    // User data to sign
  mode?: "popup" | "tab" | "redirect"; // How to open (default: "popup")
  onOpen?: (window: Window | null) => void;
  onError?: (error: Error) => void;
  className?: string;
  children?: React.ReactNode;
}

On this page