import { useEffect, useState } from 'react'; import syncedImg from '../assets/syncStatus/synced.webp'; import syncedMintingImg from '../assets/syncStatus/synced_minting.webp'; import syncingImg from '../assets/syncStatus/syncing.webp'; import { getBaseApiReact } from '../App'; import '../styles/CoreSyncStatus.css'; import { Box, useTheme } from '@mui/material'; import { useTranslation } from 'react-i18next'; import { manifestData } from './NotAuthenticated'; export const CoreSyncStatus = () => { const [nodeInfos, setNodeInfos] = useState({}); const [coreInfos, setCoreInfos] = useState({}); const [isUsingGateway, setIsUsingGateway] = useState(false); const { t } = useTranslation([ 'auth', 'core', 'group', 'question', 'tutorial', ]); const theme = useTheme(); useEffect(() => { const getNodeInfos = async () => { try { setIsUsingGateway(getBaseApiReact()?.includes('ext-node.qortal.link')); const url = `${getBaseApiReact()}/admin/status`; const response = await fetch(url, { method: 'GET', headers: { 'Content-Type': 'application/json', }, }); const data = await response.json(); setNodeInfos(data); } catch (error) { console.error('Request failed', error); } }; const getCoreInfos = async () => { try { const url = `${getBaseApiReact()}/admin/info`; const response = await fetch(url, { method: 'GET', headers: { 'Content-Type': 'application/json', }, }); const data = await response.json(); setCoreInfos(data); } catch (error) { console.error('Request failed', error); } }; getNodeInfos(); getCoreInfos(); const interval = setInterval(() => { getNodeInfos(); getCoreInfos(); }, 30000); return () => clearInterval(interval); }, []); const renderSyncStatusIcon = () => { const { isSynchronizing = false, syncPercent = 0, isMintingPossible = false, height = 0, numberOfConnections = 0, } = nodeInfos; const buildVersion = coreInfos?.buildVersion ? coreInfos?.buildVersion.substring(0, 12) : ''; let imagePath = syncingImg; let message: string = ''; if (isUsingGateway) { imagePath = syncingImg; message = `${t('core:minting.status.no_status')}`; } else if (isMintingPossible) { if (isSynchronizing) { imagePath = syncingImg; message = `${t(`core:minting.status.synchronizing`, { percent: syncPercent, postProcess: 'capitalizeFirstChar' })} ${t('core:minting.status.minting')}`; } else { imagePath = syncedMintingImg; message = `${t(`core:minting.status.synchronized`, { percent: syncPercent, postProcess: 'capitalizeFirstChar' })} ${t('core:minting.status.minting')}`; } } else if (!isMintingPossible) { if (syncPercent == 100) { imagePath = syncedImg; message = `${t(`core:minting.status.synchronized`, { percent: syncPercent, postProcess: 'capitalizeFirstChar' })} ${t('core:minting.status.not_minting')}`; } else { imagePath = syncingImg; message = `${t(`core:minting.status.synchronizing`, { percent: syncPercent, postProcess: 'capitalizeFirstChar' })} ${t('core:minting.status.not_minting')}`; } } return ( sync status

{t('core:core.information', { postProcess: 'capitalizeFirstChar' })}

{t('core:core.version', { postProcess: 'capitalizeFirstChar' })}:{' '} {buildVersion}

{message}

{t('core:core.block_height', { postProcess: 'capitalizeFirstChar', })} : {height || ''}

{t('core:core.peers', { postProcess: 'capitalizeFirstChar' })}:{' '} {numberOfConnections || ''}

{t('auth:node.using_public', { postProcess: 'capitalizeFirstChar', })} :{' '} {isUsingGateway?.toString()}

{t('core:ui.version', { postProcess: 'capitalizeFirstChar' })}:{' '} {manifestData.version}

); }; return {renderSyncStatusIcon()}; };