Vendaweb-portal/components/PrintOrderDialog.tsx

215 lines
7.4 KiB
TypeScript

import React, { useState, useEffect } from "react";
import { Button } from "./ui/button";
interface PrintOrderDialogProps {
isOpen: boolean;
onClose: () => void;
onConfirm: (model: "A" | "B" | "P") => void;
orderId: number;
includeModelP?: boolean;
}
/**
* PrintOrderDialog Component
* Diálogo para seleção do modelo de impressão do pedido
* Segue o padrão de estilização do ConfirmDialog
*/
const PrintOrderDialog: React.FC<PrintOrderDialogProps> = ({
isOpen,
onClose,
onConfirm,
orderId,
includeModelP = false,
}) => {
const [isAnimating, setIsAnimating] = useState(false);
const [shouldRender, setShouldRender] = useState(false);
const [selectedModel, setSelectedModel] = useState<"A" | "B" | "P">("A");
useEffect(() => {
if (isOpen) {
setShouldRender(true);
setTimeout(() => setIsAnimating(true), 10);
} else {
setIsAnimating(false);
const timer = setTimeout(() => setShouldRender(false), 300);
return () => clearTimeout(timer);
}
}, [isOpen]);
if (!shouldRender) return null;
const handleConfirm = () => {
setIsAnimating(false);
setTimeout(() => {
onConfirm(selectedModel);
onClose();
}, 300);
};
const handleCancel = () => {
setIsAnimating(false);
setTimeout(() => {
onClose();
}, 300);
};
return (
<div className="fixed inset-0 z-[200] flex items-center justify-center">
{/* Overlay */}
<div
className={`absolute inset-0 bg-[#001f3f]/60 backdrop-blur-sm transition-opacity duration-300 ${
isAnimating ? "opacity-100" : "opacity-0"
}`}
onClick={handleCancel}
></div>
{/* Dialog */}
<div
className={`relative bg-white rounded-3xl shadow-2xl max-w-md w-full mx-4 transform transition-all duration-300 ${
isAnimating ? "scale-100 opacity-100" : "scale-95 opacity-0"
}`}
>
{/* Header */}
<div className="p-6 bg-[#002147] text-white rounded-t-3xl relative overflow-hidden">
<div className="relative z-10">
<div className="flex items-center gap-3 mb-2">
<div className="w-12 h-12 bg-blue-500/20 rounded-2xl flex items-center justify-center">
<svg
className="w-6 h-6 text-blue-400"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2.5"
d="M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z"
/>
</svg>
</div>
<div className="flex-1">
<h3 className="text-xl font-black">
{includeModelP ? "Selecione o modelo de orçamento" : "Selecione o modelo de pedido"}
</h3>
<p className="text-xs text-blue-400 font-bold uppercase tracking-wider mt-0.5">
Impressão
</p>
</div>
<button
onClick={handleCancel}
className="p-2 text-white/70 hover:text-white hover:bg-white/10 rounded-lg transition-colors"
>
<svg
className="w-6 h-6"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
</div>
<div className="absolute right-[-10%] top-[-10%] w-32 h-32 bg-blue-400/10 rounded-full blur-2xl"></div>
</div>
{/* Content */}
<div className="p-6">
<div className="space-y-4">
<label className="block text-sm font-bold text-slate-700 mb-4">
{includeModelP ? "Selecione o modelo de orçamento" : "Selecione o modelo de pedido"}
</label>
<div className="space-y-3">
<label
className={`flex items-center p-4 border-2 rounded-xl cursor-pointer transition-all ${
selectedModel === "B"
? "bg-blue-50 border-[#002147]"
: "border-slate-300 hover:bg-slate-50 hover:border-[#002147]"
}`}
>
<input
type="radio"
name="printModel"
value="B"
checked={selectedModel === "B"}
onChange={() => setSelectedModel("B")}
className="w-5 h-5 text-[#002147] border-2 border-slate-300 focus:ring-2 focus:ring-[#002147] focus:ring-offset-2 cursor-pointer"
/>
<span className="ml-3 text-sm font-medium text-slate-700">
Bobina
</span>
</label>
{includeModelP && (
<label
className={`flex items-center p-4 border-2 rounded-xl cursor-pointer transition-all ${
selectedModel === "P"
? "bg-blue-50 border-[#002147]"
: "border-slate-300 hover:bg-slate-50 hover:border-[#002147]"
}`}
>
<input
type="radio"
name="printModel"
value="P"
checked={selectedModel === "P"}
onChange={() => setSelectedModel("P")}
className="w-5 h-5 text-[#002147] border-2 border-slate-300 focus:ring-2 focus:ring-[#002147] focus:ring-offset-2 cursor-pointer"
/>
<span className="ml-3 text-sm font-medium text-slate-700">
Bobina sem Preço
</span>
</label>
)}
<label
className={`flex items-center p-4 border-2 rounded-xl cursor-pointer transition-all ${
selectedModel === "A"
? "bg-blue-50 border-[#002147]"
: "border-slate-300 hover:bg-slate-50 hover:border-[#002147]"
}`}
>
<input
type="radio"
name="printModel"
value="A"
checked={selectedModel === "A"}
onChange={() => setSelectedModel("A")}
className="w-5 h-5 text-[#002147] border-2 border-slate-300 focus:ring-2 focus:ring-[#002147] focus:ring-offset-2 cursor-pointer"
/>
<span className="ml-3 text-sm font-medium text-slate-700">
Formulário A4
</span>
</label>
</div>
</div>
</div>
{/* Actions */}
<div className="p-6 pt-0 flex gap-3">
<Button
onClick={handleCancel}
variant="outline"
className="flex-1"
>
Cancelar
</Button>
<Button
onClick={handleConfirm}
className="flex-1"
>
Imprimir
</Button>
</div>
</div>
</div>
);
};
export default PrintOrderDialog;