Lilkijin2004/veracity-anchor-plus
0
1// Veracity Anchor Plus - Shared Scripts2 3// Utility functions4const utils = {5 generateId: (prefix = 'id') => {6 return `${prefix}_${Math.random().toString(36).substr(2, 6)}`;7 },8 9 formatTimestamp: (isoString) => {10 const date = new Date(isoString);11 return date.toLocaleString();12 },13 14 truncate: (str, length = 20) => {15 return str.length > length ? str.substring(0, length) + '...' : str;16 },17 18 copyToClipboard: async (text) => {19 try {20 await navigator.clipboard.writeText(text);21 return true;22 } catch (err) {23 console.error('Failed to copy:', err);24 return false;25 }26 },27 28 generateCID: () => {29 return 'Qm' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);30 },31 32 debounce: (func, wait) => {33 let timeout;34 return function executedFunction(...args) {35 const later = () => {36 clearTimeout(timeout);37 func(...args);38 };39 clearTimeout(timeout);40 timeout = setTimeout(later, wait);41 };42 },43 44 formatNumber: (num) => {45 if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M';46 if (num >= 1000) return (num / 1000).toFixed(1) + 'K';47 return num.toString();48 }49};50 51// Theme Toggle functionality (preparation for light/dark mode)52const themeManager = {53 init() {54 // Check for saved preference or system preference55 if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {56 document.documentElement.classList.add('dark');57 } else {58 document.documentElement.classList.remove('dark');59 }60 },61 62 toggle() {63 if (document.documentElement.classList.contains('dark')) {64 document.documentElement.classList.remove('dark');65 localStorage.theme = 'light';66 } else {67 document.documentElement.classList.add('dark');68 localStorage.theme = 'dark';69 }70 }71};72 73// Real-time stats updater (simulation)74const statsUpdater = {75 init() {76 const elements = {77 attestations: document.getElementById('stat-attestations'),78 safety: document.getElementById('stat-safety'),79 latency: document.getElementById('stat-latency'),80 fraud: document.getElementById('stat-fraud')81 };82 83 if (Object.values(elements).some(el => el)) {84 setInterval(() => this.updateRandomStat(elements), 5000);85 }86 },87 88 updateRandomStat(elements) {89 const keys = Object.keys(elements).filter(k => elements[k]);90 if (keys.length === 0) return;91 92 const key = keys[Math.floor(Math.random() * keys.length)];93 const element = elements[key];94 95 // Simulate slight variations96 if (key === 'latency') {97 const base = 42;98 const variation = Math.floor(Math.random() * 10 - 5);99 element.textContent = `${base + variation}ms`;100 } else if (key === 'attestations') {101 // Increment slightly102 const current = parseFloat(element.textContent);103 if (!isNaN(current)) {104 element.textContent = (current + 0.1).toFixed(1) + 'M+';105 }106 }107 }108};109 110// Initialize on DOM ready111document.addEventListener('DOMContentLoaded', () => {112 themeManager.init();113 statsUpdater.init();114});115 116// Export for module usage if needed117if (typeof module !== 'undefined' && module.exports) {118 module.exports = { utils, themeManager, statsUpdater };119}