gerador-prompts-hoteis/components/Wizard.tsx

132 lines
4.8 KiB
TypeScript

import CategoryStep from "./CategoryStep";
import type { Category } from "@/lib/categories";
import StepIndicator from "./StepIndicator";
type WizardProps = {
step: number;
categories: Category[];
answers: Record<string, string>;
isComplete: boolean;
onAnswerChange: (id: string, value: string) => void;
onNext: () => void;
onPrev: () => void;
onReset: () => void;
};
export default function Wizard({
step,
categories,
answers,
isComplete,
onAnswerChange,
onNext,
onPrev,
onReset
}: WizardProps) {
const currentCategory = categories[step];
return (
<div className="mx-auto flex w-full max-w-5xl flex-col gap-8">
<StepIndicator
current={step}
total={categories.length}
isComplete={isComplete}
/>
{isComplete ? (
<div className="grid gap-6">
<div className="rounded-3xl border border-slate-200/80 bg-white/90 p-8 shadow-[0_24px_60px_-40px_rgba(15,23,42,0.6)]">
<p className="text-xs font-semibold uppercase tracking-[0.2em] text-slate-500">
Resumo
</p>
<h2 className="mt-2 text-3xl font-semibold text-slate-900">
Todas as respostas estão prontas
</h2>
<p className="mt-3 text-base text-slate-600">
Revise abaixo e, se necessário, volte para ajustar antes de gerar o
prompt final.
</p>
<div className="mt-6 flex flex-wrap gap-3">
<button
className="rounded-full bg-slate-900 px-6 py-3 text-sm font-semibold text-white shadow-lg shadow-slate-900/30 transition hover:-translate-y-0.5"
onClick={onReset}
type="button"
>
Editar respostas
</button>
</div>
</div>
<div className="grid gap-4 md:grid-cols-2">
{categories.map((category) => (
<div
key={category.id}
className="rounded-3xl border border-slate-200/80 bg-white/90 p-5 shadow-[0_20px_50px_-40px_rgba(15,23,42,0.6)]"
>
<p className="text-xs font-semibold uppercase tracking-[0.2em] text-slate-500">
{category.title}
</p>
<p className="mt-2 text-base text-slate-900">
{answers[category.id] || "(Sem resposta)"}
</p>
</div>
))}
</div>
</div>
) : currentCategory ? (
<div className="grid gap-6 lg:grid-cols-[1.2fr_0.8fr]">
<CategoryStep
category={currentCategory}
value={answers[currentCategory.id] ?? ""}
onChange={(value) => onAnswerChange(currentCategory.id, value)}
/>
<div className="flex flex-col gap-6">
<div className="rounded-3xl border border-slate-900 bg-slate-900 p-6 text-white shadow-[0_24px_60px_-40px_rgba(15,23,42,0.6)]">
<p className="text-xs font-semibold uppercase tracking-[0.2em] text-slate-300">
Dica rápida
</p>
<h3 className="mt-2 text-2xl font-semibold">
Pense no impacto direto
</h3>
<p className="mt-3 text-sm text-slate-200">
Cada etapa deve informar uma decisão de comunicação. Se não
influenciar o resultado final, simplifique.
</p>
</div>
<div className="rounded-3xl border border-slate-200/80 bg-white/90 p-6 shadow-[0_24px_60px_-40px_rgba(15,23,42,0.6)]">
<p className="text-xs font-semibold uppercase tracking-[0.2em] text-slate-500">
Etapa atual
</p>
<p className="mt-2 text-lg font-semibold text-slate-900">
{currentCategory.title}
</p>
<p className="mt-3 text-sm text-slate-600">
{currentCategory.tip}
</p>
</div>
</div>
</div>
) : null}
{!isComplete ? (
<div className="flex flex-wrap items-center justify-between gap-4">
<button
className="rounded-full border border-slate-300 bg-white px-5 py-3 text-sm font-semibold text-slate-700 transition hover:-translate-y-0.5 hover:border-slate-900"
onClick={onPrev}
type="button"
disabled={step === 0}
>
Voltar
</button>
<button
className="rounded-full bg-slate-900 px-6 py-3 text-sm font-semibold text-white shadow-lg shadow-slate-900/30 transition hover:-translate-y-0.5"
onClick={onNext}
type="button"
>
{step === categories.length - 1 ? "Concluir" : "Continuar"}
</button>
</div>
) : null}
</div>
);
}