Files
sori.studio/lib/analytics-display.js

46 lines
1.8 KiB
JavaScript

/**
* 통계 수치에 한국어 천 단위 구분을 적용한다.
* @param {unknown} value - 표시할 수치
* @returns {string} 구분 기호가 있는 숫자
*/
export const formatAnalyticsCount = (value) => {
const number = Number(value || 0)
return new Intl.NumberFormat('ko-KR').format(Number.isFinite(number) ? number : 0)
}
/**
* 접속 페이지의 표시 제목을 반환한다.
* @param {Object} page - 활성 페이지
* @returns {string} 페이지 제목
*/
export const getActivePageTitle = (page) => page.postTitle || page.pageTitle || (page.path === '/' ? '홈' : page.path) || '알 수 없음'
/**
* 접속 페이지의 사이트 내부 공개 경로를 반환한다.
* @param {Object} page - 활성 페이지
* @returns {string} 바로가기 경로
*/
export const getActivePageHref = (page) => {
if (page.postSlug) return `/post/${encodeURIComponent(page.postSlug)}`
if (page.pageSlug) return `/pages/${encodeURIComponent(page.pageSlug)}`
const path = String(page.path || '').trim()
return path.startsWith('/') && !path.startsWith('//') && !path.includes('\\') && !/^\/admin(?:[/?#]|$)/.test(path) ? path : ''
}
/**
* 열린 페이지를 최근 확인 순으로 정렬하고 같은 경로를 중복 제거한다.
* @param {Object} session - 묶인 접속자
* @returns {Array<Object>} 최신 페이지부터의 고유 목록
*/
export const getRealtimePages = (session) => {
const pages = session.pages?.length ? session.pages : [session]
const ordered = [...pages].sort((left, right) => (Date.parse(right.lastSeenAt) || 0) - (Date.parse(left.lastSeenAt) || 0))
const seen = new Set()
return ordered.filter((page) => {
const key = getActivePageHref(page) || page.path || page.key || ''
if (seen.has(key)) return false
seen.add(key)
return true
})
}