46 lines
1.8 KiB
JavaScript
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
|
|
})
|
|
}
|