Next.js
Интеграция с Next.js (Pages Router и App Router)
Интеграция с Next.js
Fitting Widget работает как с Pages Router, так и с App Router.
App Router (рекомендуется)
Используйте компонент Next.js Script с strategy="afterInteractive".
Шаг 1 — Загрузка скриптов в layout.tsx или page.tsx
import Script from 'next/script';
export default function ProductLayout({ children }: { children: React.ReactNode }) {
return (
<>
{children}
<Script
src="https://widget.try-on.ru/fitting-widget-bundle.js"
strategy="afterInteractive"
id="fitting-widget-bundle"
/>
<Script
strategy="afterInteractive"
id="fitting-init"
>
{`
window.fitting = window.fitting || function() {
(window.fitting.q = window.fitting.q || []).push(arguments);
};
window.fitting('init', {
apiKey: '${process.env.NEXT_PUBLIC_TRY_ON_API_KEY}'
});
`}
</Script>
</>
);
}
Шаг 2 — Создание кнопки виджета
'use client';
interface TryonItem {
productName: string;
url: string;
}
declare global {
interface Window {
fitting: (command: string, options?: unknown) => void;
}
}
export function TryOnButton({ items }: { items: TryonItem[] }) {
const handleClick = () => {
window.fitting('create', {
targetElementId: 'widget-container',
model: 'balanced',
tryonItems: items,
});
};
return (
<>
<div id="widget-container" style={{ width: '100%', maxWidth: 600, aspectRatio: '3/4' }} />
<button onClick={handleClick}>Примерка</button>
</>
);
}
Шаг 3 — Использование на странице товара
import { TryOnButton } from '@/components/TryOnButton';
export default async function ProductPage({ params }: { params: { slug: string } }) {
const product = await getProduct(params.slug);
return (
<div>
<h1>{product.name}</h1>
<img src={product.image} alt={product.name} />
<TryOnButton
items={[
{
productName: product.name,
url: product.image,
},
]}
/>
</div>
);
}
Переменная окружения
Добавьте ваш API-ключ в .env.local:
NEXT_PUBLIC_TRY_ON_API_KEY=pk_live_xxx