- let { serverURL, script_name, website_id, option, UV_PV } = theme.umami_analytics - const isServerURL = !!serverURL - const baseURL = serverURL ? serverURL.replace(/\/$/, '') : 'https://cloud.umami.is' - const apiUrl = serverURL ? serverURL.replace(/\/$/, '') + '/api' : 'https://api.umami.is/v1' script. (() => { const option = !{JSON.stringify(option)} const config = !{JSON.stringify(UV_PV)} const runTrack = () => { if (typeof umami !== 'undefined' && typeof umami.track === 'function') { umami.track(props => ({ ...props, url: window.location.pathname, title: GLOBAL_CONFIG_SITE.title })) } else { console.warn('Umami Analytics: umami.track is not available') } } const loadUmamiJS = () => { btf.getScript('!{baseURL}/!{script_name}', { 'data-website-id': '!{website_id}', 'data-auto-track': 'false', ...option }).then(() => { runTrack() }).catch(error => { console.error('Umami Analytics: Error loading script', error) }) } const extractValue = stat => (stat && typeof stat.value !== 'undefined') ? stat.value : stat const getData = async (isPost) => { try { const now = Date.now() const pathQuery = isPost ? `&url=${window.location.pathname}&path=${window.location.pathname}` : '' const headers = { 'Accept': 'application/json', [!{isServerURL} ? 'Authorization' : 'x-umami-api-key']: !{isServerURL} ? `Bearer ${config.token}` : config.token } const res = await fetch(`!{apiUrl}/websites/!{website_id}/stats?startAt=0000000000&endAt=${now}${pathQuery}`, { method: 'GET', headers }) if (!res.ok) { throw new Error(`HTTP error! status: ${res.status}`) } return await res.json() } catch (error) { console.error('Umami Analytics: Failed to fetch data', error) throw error } } const insertData = async () => { try { const tasks = [] if (GLOBAL_CONFIG_SITE.pageType === 'post' && config.page_pv) { tasks.push((async () => { const pagePV = document.getElementById('umamiPV') if (pagePV) { const data = await getData(true) if (data && data.pageviews) { pagePV.textContent = extractValue(data.pageviews) } else { console.warn('Umami Analytics: Invalid page view data received') } } })()) } if (config.site_uv || config.site_pv) { tasks.push((async () => { const data = await getData(false) if (config.site_uv) { const siteUV = document.getElementById('umami-site-uv') if (siteUV && data && data.visitors) { siteUV.textContent = extractValue(data.visitors) } else if (siteUV) { console.warn('Umami Analytics: Invalid site UV data received') } } if (config.site_pv) { const sitePV = document.getElementById('umami-site-pv') if (sitePV && data && data.pageviews) { sitePV.textContent = extractValue(data.pageviews) } else if (sitePV) { console.warn('Umami Analytics: Invalid site PV data received') } } })()) } await Promise.all(tasks) } catch (error) { console.error('Umami Analytics: Failed to insert data', error) } } btf.addGlobalFn('pjaxComplete', runTrack, 'umami_analytics_run_track') btf.addGlobalFn('pjaxComplete', insertData, 'umami_analytics_insert') loadUmamiJS() if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', insertData) } else { setTimeout(insertData, 100) } })()