Skip to main content
The React SDK provides pre-built components and hooks for displaying sustainability data in React applications.

Installation

npm install @heychocolate/react

Provider setup

Wrap your app with the HeyChocolateProvider:
import { HeyChocolateProvider } from '@heychocolate/react';

function App() {
  return (
    <HeyChocolateProvider apiKey={process.env.NEXT_PUBLIC_HC_API_KEY}>
      <YourApp />
    </HeyChocolateProvider>
  );
}
For client-side usage, use a restricted API key with read-only permissions. Sensitive operations should go through your backend.

Hooks

useProduct

import { useProduct } from '@heychocolate/react';

function ProductPage({ productId }: { productId: string }) {
  const { product, loading, error } = useProduct(productId);

  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error: {error.message}</p>;

  return (
    <div>
      <h1>{product.name}</h1>
      <p>CO2: {product.impactScore.co2Equivalent} kg</p>
      <p>MKI: {product.impactScore.mkiScore} EUR</p>
    </div>
  );
}

useImpactCalculation

import { useImpactCalculation } from '@heychocolate/react';

function Calculator({ productId }: { productId: string }) {
  const { calculate, result, loading } = useImpactCalculation();

  return (
    <div>
      <button onClick={() => calculate({
        productId,
        quantity: 100,
        transportMethod: 'TRUCK',
      })}>
        Calculate Impact
      </button>

      {result && (
        <p>{result.equivalency.description}: {result.equivalency.value}</p>
      )}
    </div>
  );
}

useCartImpact

import { useCartImpact } from '@heychocolate/react';

function CartSummary({ items }) {
  const { cartImpact, loading } = useCartImpact({
    sessionId: 'session_abc',
    items,
    shippingMethod: 'STANDARD',
    shippingAddress: { country: 'NL' },
  });

  if (loading) return <p>Calculating impact...</p>;

  return (
    <div>
      <p>Cart footprint: {cartImpact.totalCo2Equivalent} kg CO2e</p>
      <p>{cartImpact.equivalency.description}: {cartImpact.equivalency.value}</p>
    </div>
  );
}

Components

CarbonBadge

import { CarbonBadge } from '@heychocolate/react';

<CarbonBadge productId="prod_abc123" variant="compact" theme="light" />

ComparisonTable

import { ComparisonTable } from '@heychocolate/react';

<ComparisonTable
  productIds={["prod_abc123", "prod_def456", "prod_ghi789"]}
  metrics={["CO2_EQUIVALENT", "MKI_SCORE", "WATER_FOOTPRINT"]}
/>

ImpactBreakdown

import { ImpactBreakdown } from '@heychocolate/react';

<ImpactBreakdown productId="prod_abc123" animated={true} />

SupplyChainViewer

import { SupplyChainViewer } from '@heychocolate/react';

<SupplyChainViewer productId="prod_abc123" maxTier={3} interactive={true} />

Styling

All components accept className and style props. Default styles can be overridden with CSS variables:
:root {
  --hc-primary: #F83B00;
  --hc-success: #4CAF50;
  --hc-warning: #FF9800;
  --hc-danger: #F44336;
  --hc-font-family: inherit;
  --hc-border-radius: 8px;
}