feat: Implement handleSubscribe function
Adds a function to handle subscription requests to Mercado Pago, including POST request setup, error handling, and redirection on success.
This commit is contained in:
parent
363e5ac6a4
commit
ee0236123c
@ -15,15 +15,65 @@ import {
|
|||||||
} from "@/components/ui/card";
|
} from "@/components/ui/card";
|
||||||
import { format } from "date-fns";
|
import { format } from "date-fns";
|
||||||
import { ptBR } from "date-fns/locale";
|
import { ptBR } from "date-fns/locale";
|
||||||
|
import { toast } from "sonner";
|
||||||
|
|
||||||
const Configuracoes = () => {
|
const Configuracoes = () => {
|
||||||
const [tab, setTab] = useState("visao-geral");
|
const [tab, setTab] = useState("visao-geral");
|
||||||
|
const [isSubscribing, setIsSubscribing] = useState(false);
|
||||||
const [subscription] = useState({
|
const [subscription] = useState({
|
||||||
active: true,
|
active: true,
|
||||||
planName: "Plano Mensal Finance Home",
|
planName: "Plano Mensal Finance Home",
|
||||||
expires_at: new Date(new Date().getFullYear(), new Date().getMonth() + 1, 15),
|
expires_at: new Date(new Date().getFullYear(), new Date().getMonth() + 1, 15),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const handleSubscribe = async () => {
|
||||||
|
setIsSubscribing(true);
|
||||||
|
// TODO: O e-mail do usuário deve ser obtido dinamicamente do estado de autenticação.
|
||||||
|
const userEmail = "test@example.com";
|
||||||
|
|
||||||
|
const body = {
|
||||||
|
reason: "Plano Mensal Finance Home",
|
||||||
|
auto_recurring: {
|
||||||
|
frequency: 1,
|
||||||
|
frequency_type: "months",
|
||||||
|
transaction_amount: 14.99,
|
||||||
|
currency_id: "BRL"
|
||||||
|
},
|
||||||
|
back_url: "https://meusite.com/sucesso",
|
||||||
|
payer_email: userEmail
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch("https://api.mercadopago.com/preapproval", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
// ATENÇÃO: O ideal é que este token não esteja no código do frontend.
|
||||||
|
// Deve ser movido para uma variável de ambiente segura no backend.
|
||||||
|
"Authorization": "Bearer APP_USR-7056966967213571-061515-4157ceccce3dbae552ddee5cd5ec685e-163267528",
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
body: JSON.stringify(body)
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(data.message || "Erro ao criar a assinatura.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.init_point) {
|
||||||
|
window.location.href = data.init_point;
|
||||||
|
} else {
|
||||||
|
throw new Error("URL de checkout não foi encontrada na resposta.");
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error: any) {
|
||||||
|
toast.error(error.message || "Ocorreu um erro inesperado. Tente novamente mais tarde.");
|
||||||
|
} finally {
|
||||||
|
setIsSubscribing(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="p-6">
|
<div className="p-6">
|
||||||
<div className="flex items-center gap-4 mb-4">
|
<div className="flex items-center gap-4 mb-4">
|
||||||
@ -91,7 +141,13 @@ const Configuracoes = () => {
|
|||||||
<Button variant="outline" className="w-full sm:w-auto">
|
<Button variant="outline" className="w-full sm:w-auto">
|
||||||
Ver Detalhes
|
Ver Detalhes
|
||||||
</Button>
|
</Button>
|
||||||
<Button className="w-full sm:w-auto">Assinar Agora</Button>
|
<Button
|
||||||
|
className="w-full sm:w-auto"
|
||||||
|
onClick={handleSubscribe}
|
||||||
|
disabled={isSubscribing}
|
||||||
|
>
|
||||||
|
{isSubscribing ? 'Processando...' : 'Assinar Agora'}
|
||||||
|
</Button>
|
||||||
</CardFooter>
|
</CardFooter>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user