diff --git a/package.json b/package.json index 9ce0d55..bd8f3f3 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "next": "^15.3.5", "next-themes": "^0.2.1", "react": "^18.2.0", + "react-countup": "^6.5.3", "react-dom": "^18.2.0", "react-icons": "^4.11.0" }, diff --git a/src/app/checkout/[service]/[plan]/page.tsx b/src/app/checkout/[service]/[plan]/page.tsx index c09d307..917e97c 100644 --- a/src/app/checkout/[service]/[plan]/page.tsx +++ b/src/app/checkout/[service]/[plan]/page.tsx @@ -1,7 +1,7 @@ "use client"; -import { useContext, useEffect, useState } from "react"; -import { useRouter } from "next/navigation"; +import { useContext, useEffect, useState, Suspense } from "react"; +import { useRouter, useSearchParams, useParams } from "next/navigation"; import { FaServer, FaMemory, @@ -13,6 +13,7 @@ import { FaTag, FaTimes, FaSpinner, + FaRegClock, } from "react-icons/fa"; import { motion } from "framer-motion"; import config from "../../../../../config.json"; @@ -103,11 +104,45 @@ interface Promotion { notes: string; } -const CheckoutPage = ({ - params, -}: { - params: Promise<{ service: string; plan: string }>; -}) => { +const CountdownTimer = ({ initialMinutes = 20 }: { initialMinutes: number }) => { + const [timeLeft, setTimeLeft] = useState(initialMinutes * 60); + + useEffect(() => { + if (timeLeft <= 0) return; + const intervalId = setInterval(() => { + setTimeLeft(prevTime => prevTime - 1); + }, 1000); + return () => clearInterval(intervalId); + }, [timeLeft]); + + const minutes = Math.floor(timeLeft / 60); + const seconds = timeLeft % 60; + + return ( +
+ {String(minutes).padStart(2, '0')}:{String(seconds).padStart(2, '0')} +
++ Carregando detalhes do seu pedido... +
+- Verificando autenticação... -
-- Redirecionando para login... -
-- Carregando informações do plano... -
-{error}
- -- Estamos processando sua solicitação. Por favor, aguarde... -
+Estamos processando sua solicitação. Por favor, aguarde...
- Complete suas informações para prosseguir para o pagamento + Revise os detalhes e configure seu novo serviço.
- Cupom "{appliedCoupon.code}" aplicado! -
-- {appliedCoupon.type === "Percentage" - ? `${appliedCoupon.value}% de desconto` - : `R$ ${parseFloat(appliedCoupon.value).toFixed(2).replace(".", ",")} de desconto` - } -
+Cupom "{appliedCoupon.code}" aplicado!
+{appliedCoupon.type === "Percentage" ? `${appliedCoupon.value}% de desconto` : `R$ ${parseFloat(appliedCoupon.value).toFixed(2).replace(".", ",")} de desconto`}
Seus dados são protegidos com criptografia de ponta.
+Verificando link mágico...
+- Envie-nos uma mensagem no Telegram. + Abra um chamado no nosso Discord para suporte técnico.
Precisa de um plano personalizado? - + Entre em contato conosco
diff --git a/src/app/services/page.tsx b/src/app/services/page.tsx index 7c5ef90..aa350cd 100644 --- a/src/app/services/page.tsx +++ b/src/app/services/page.tsx @@ -20,6 +20,7 @@ const services = [ link: "/services/minecraft", icon: SiMinecraft, features: [ + "AMD Ryzen 9 7900X 5,6 GHz", "Hardware de Alta Performance", "Proteção DDoS Avançada", "Painel de Controle Intuitivo", @@ -35,6 +36,7 @@ const services = [ link: "/services/vps", icon: FiCpu, features: [ + "AMD Ryzen 9 7900X 5,6 GHz", "Acesso Root Completo", "Armazenamento SSD NVMe", "Painel de Controle Virtualizor", diff --git a/src/components/dashboard/SecurityContent.tsx b/src/components/dashboard/SecurityContent.tsx index 4ef5e06..a7b476c 100644 --- a/src/components/dashboard/SecurityContent.tsx +++ b/src/components/dashboard/SecurityContent.tsx @@ -9,17 +9,43 @@ import { FaEyeSlash, FaLink, FaSpinner, + FaCheck, + FaTimes, + FaUnlink, } from "react-icons/fa"; -import { useState } from "react"; +import { useState, useEffect } from "react"; import { useAuth } from "@/contexts/AuthContext"; +import { useSearchParams } from "next/navigation"; +import { getCookie } from "@/utils/cookies"; export default function SecurityContent() { - const { accessKey } = useAuth(); + const { accessKey: contextAccessKey } = useAuth(); + const [accessKey, setAccessKey] = useState(contextAccessKey || getCookie("access_key")); const [showNewPassword, setShowNewPassword] = useState(false); + + useEffect(() => { + const token = contextAccessKey || getCookie("access_key"); + setAccessKey(token); + + if (!token) { + console.warn("Authentication token not found in context or cookies"); + } else { + console.log("Authentication token loaded successfully", { source: token === contextAccessKey ? 'context' : 'cookie' }); + } + }, [contextAccessKey]); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState{error}
@@ -93,7 +375,6 @@ export default function SecurityContent() {