import { Container, Card, Title, Text, Button, Divider, Tabs, Accordion, Stack, Timeline, Group, Modal, Box, LoadingOverlay, rem, Paper, Image, } from '@mantine/core'; import { IconCheck, IconCircle, IconLayoutGrid, IconPencilBolt, IconSettings, IconWorld, IconX, } from '@tabler/icons-react'; import OverView from './OverView'; import { CookieBanner } from './CookieBanner'; import { runtimeConfig } from '../config'; import { useState, useEffect } from 'react'; import { finalConsentConfig, COLORS } from '../utils/utils'; import { Welcome } from './Welcome'; import classes from './OnBoardPanel.module.css'; import CookieIcon from '../assets/logo-icon.svg'; function OnBoardPanel() { const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState('dashboard'); // Default to dashboard const [openedItems, setOpenedItems] = useState(['description']); const [consentConfig, setConsentConfig] = useState(finalConsentConfig); const [tempToken, setTempToken] = useState(''); const [isOnBoardCompleted, setIsOnBoardCompleted] = useState(false); const [showFirstTimeScreen, setShowFirstTimeScreen] = useState(false); const [isConnected, setIsConnected] = useState(false); const [userDetails, setUserDetails] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [isWebsiteConnecting, setIsWebsiteConnecting] = useState(false); const [disconnectMessage, setDisconnectMessage] = useState( null ); const handleOpenModal = () => { setIsModalOpen(true); }; const handleCloseModal = () => { setIsModalOpen(false); }; const handleCloseAccordion = () => { setOpenedItems([]); }; useEffect(() => { const checkConnectionStatus = async () => { try { const response = await runtimeConfig.apiFetch({ path: '/cookiex/v1/connection-status', method: 'GET', }); if (response.connected) { setIsConnected(true); setShowFirstTimeScreen(false); } else { setIsConnected(false); } setLoading(false); } catch (error) { console.error('Error checking connection status:', error); setLoading(false); } }; // Check connection status once when the component loads checkConnectionStatus(); }, [isConnected, showFirstTimeScreen]); useEffect(() => { const fetchUserDetails = async () => { try { const response = await runtimeConfig.apiFetch({ path: '/cookiex/v1/user-details', method: 'GET', headers: { accept: 'application/json' }, }); if (response) { setUserDetails(response.data); } } catch (error) { console.error('Error fetching user details:', error); } }; if (isConnected) { fetchUserDetails(); } }, [isConnected]); const openCMP = async (selectedOpt: 'login' | 'register' | null) => { setIsWebsiteConnecting(true); const currentUrl = window.location.href; const urlObject = new URL(currentUrl); const domainUrl = urlObject.origin; const tokenRes = (await validateTempToken()) || tempToken; const token = window.btoa(tokenRes); if (selectedOpt) { const url = `${runtimeConfig.cmpRedirectUrl}/connect?website=${consentConfig?.domainUrl || domainUrl}&mode=${selectedOpt}&token=${token}`; window.open(url, '_blank', 'noopener,noreferrer'); setIsModalOpen(false); // Poll for connection status every 15 seconds const interval = setInterval(async () => { try { const statusResponse = await runtimeConfig.apiFetch({ path: '/cookiex/v1/connection-status', method: 'GET', }); if (statusResponse?.connected) { setIsWebsiteConnecting(false); setIsConnected(true); setShowFirstTimeScreen(true); clearInterval(interval); } } catch (error) { console.error('Error fetching connection status:', error); } }, 15000); } }; async function validateTempToken() { try { const response = await runtimeConfig.apiFetch({ path: '/cookiex/v1/validate-temp-token', method: 'GET', }); if (response) { return response; } console.error('Token validation failed:', response); return null; } catch (error) { console.error('Error validating temp token:', error); return null; } } const handleOnboardingComplete = (token: string) => { setIsOnBoardCompleted(false); setTempToken(token); }; useEffect(() => { runtimeConfig .apiFetch({ path: '/cookiex/v1/welcome-status' }) .then((response) => { // Convert string "1"/"0" or "true"/"false" to boolean const isCompleted = response.show_welcome === '1' || response.show_welcome === 1 || response.show_welcome === true; setIsOnBoardCompleted(isCompleted); }) .catch((error) => { console.error('Failed to fetch welcome status', error); }); }, [isOnBoardCompleted]); useEffect(() => { fetchSettings(); }, []); const fetchSettings = async () => { try { setLoading(true); runtimeConfig .apiFetch({ path: '/cookiex/v1/settings', }) .then((res: any) => { if (res.status) { setIsOnBoardCompleted(false); const parsedData = { ...res.data, theme: typeof res.data.theme === 'string' ? JSON.parse(res.data.theme) : res.data.theme, }; setConsentConfig(parsedData); } }); setLoading(false); } catch (error) { console.error('Failed to fetch settings:', error); setLoading(false); } }; const handleDisconnect = async () => { try { const response = await runtimeConfig.apiFetch({ path: '/cookiex/v1/disconnect', method: 'POST', }); if (response.status === 'success') { setDisconnectMessage( response.message || 'Successfully disconnected.' ); setIsConnected(false); setTimeout(function () { setActiveTab('dashboard'); }, 1000); } else { setDisconnectMessage('Failed to disconnect. Please try again.'); } } catch (error) { console.error('Error disconnecting:', error); setDisconnectMessage('An error occurred while disconnecting.'); } }; const RenderConntectedSection = () => { return ( Your website is connected to CookieX Web App You can access all the plugin settings (Cookie Banner, Cookie Manager, Languages, and Policy Generators) on the web app and unlock new features like Cookie Scanner and Consent Log. ); }; return ( <> {loading && ( )} {isConnected && showFirstTimeScreen ? (
) : ( <> } > Dashboard {!isOnBoardCompleted && ( } > Consent Banner )} {isConnected && ( } > Site Settings )}
{disconnectMessage && ( {disconnectMessage} )} Details of the Company/User {userDetails && (
Name: {' '} {userDetails.name || 'N/A'}
Email: {' '} {userDetails.email || 'N/A'}
Email Verified: {' '} {userDetails.emailVerified ? 'Yes' : 'No'}
Joined On: {' '} {userDetails.joinedOn || 'N/A'}
)}
{isConnected && !showFirstTimeScreen ? ( ) : ( <> { 'Get started with CookieX' } { "Welcome to CookieX. To become legally compliant for your use of cookies, here's what you need to do." } {isOnBoardCompleted && ( )} {!isOnBoardCompleted && ( <> } > Well done! 🎉 You have successfully implemented a cookie banner on your website. } > To initiate an automatic cookie scan, you need to connect to the CookieYes web app. By connecting you can: )} )} {!isOnBoardCompleted && ( <> Overview )} {consentConfig && ( )}
Logo Connect to Web App Already have a CookieX account ? If you have an existing web app account, simply login and connect to get started seamlessly Don’t have CookieX account ? Join Cookiex to take control of your website’s compliance effortlessly. Register now to get started with consent management. )}
); } export default OnBoardPanel;