로그 수정 #849

Merged
ysCha merged 1 commits from dev into dev-deploy 2026-05-14 14:50:41 +09:00
2 changed files with 116 additions and 0 deletions

View File

@ -0,0 +1,88 @@
'use client'
// [MODAL-TRACKER 2026-05-14] QModal / PopupManager / contextPopup atom
// · /id . .
import { useEffect, useRef } from 'react'
import { useRecoilValue } from 'recoil'
import { modalState, modalContent } from '@/store/modalAtom'
import { popupState, contextPopupState } from '@/store/popupAtom'
import { logger } from '@/util/logger'
const TRACK_ENABLED = process.env.NEXT_PUBLIC_ENABLE_LOGGING === 'true'
const BADGE_OPEN = 'background:#7b1fa2;color:#fff;padding:2px 8px;border-radius:3px;font-weight:bold'
const BADGE_CLOSE = 'background:#9e9e9e;color:#fff;padding:2px 8px;border-radius:3px'
const BADGE_POPUP = 'background:#00897b;color:#fff;padding:2px 8px;border-radius:3px;font-weight:bold'
const BADGE_CTX = 'background:#ef6c00;color:#fff;padding:2px 8px;border-radius:3px;font-weight:bold'
function describeNode(node) {
if (!node) return 'null'
if (Array.isArray(node)) return `Array(${node.length})`
const t = node?.type
if (!t) return typeof node
return typeof t === 'string' ? t : t.displayName || t.name || 'Anonymous'
}
export default function ModalTracker() {
const open = useRecoilValue(modalState)
const content = useRecoilValue(modalContent)
const popup = useRecoilValue(popupState)
const ctx = useRecoilValue(contextPopupState)
const firstModal = useRef(true)
const prevPopupIds = useRef({ config: [], other: [] })
const prevCtx = useRef(null)
// QModal open/close
useEffect(() => {
if (!TRACK_ENABLED) return
if (firstModal.current) {
firstModal.current = false
return
}
if (open) {
logger.info(`%c[MODAL OPEN] ${describeNode(content)}`, BADGE_OPEN)
} else {
logger.info(`%c[MODAL CLOSE]`, BADGE_CLOSE)
}
}, [open])
// PopupManager push/pop (config + other )
useEffect(() => {
if (!TRACK_ENABLED) return
const prev = prevPopupIds.current
for (const bucket of ['config', 'other']) {
const cur = popup?.[bucket] || []
const curIds = cur.map((p) => p.id)
const prevIds = prev[bucket] || []
curIds
.filter((id) => !prevIds.includes(id))
.forEach((id) => {
const item = cur.find((p) => p.id === id)
logger.info(`%c[POPUP+ ${bucket}] ${describeNode(item?.component)} (id=${id})`, BADGE_POPUP)
})
prevIds
.filter((id) => !curIds.includes(id))
.forEach((id) => {
logger.info(`%c[POPUP- ${bucket}] (id=${id})`, BADGE_CLOSE)
})
}
prevPopupIds.current = {
config: (popup?.config || []).map((p) => p.id),
other: (popup?.other || []).map((p) => p.id),
}
}, [popup])
// contextPopup ( )
useEffect(() => {
if (!TRACK_ENABLED) return
if (ctx && !prevCtx.current) {
logger.info(`%c[CTX POPUP+] ${describeNode(ctx)}`, BADGE_CTX)
} else if (!ctx && prevCtx.current) {
logger.info(`%c[CTX POPUP-]`, BADGE_CLOSE)
}
prevCtx.current = ctx
}, [ctx])
return null
}

View File

@ -0,0 +1,28 @@
'use client'
// [PAGE-TRACKER 2026-05-14] + document.title .
// production NEXT_PUBLIC_ENABLE_LOGGING=false logger.info .
import { useEffect } from 'react'
import { usePathname } from 'next/navigation'
import { logger } from '@/util/logger'
const TRACK_ENABLED = process.env.NEXT_PUBLIC_ENABLE_LOGGING === 'true'
export default function PageTracker() {
const pathname = usePathname()
useEffect(() => {
if (!TRACK_ENABLED || !pathname) return
logger.info(
`%c[PAGE] ${pathname}`,
'background:#1e88e5;color:#fff;padding:2px 8px;border-radius:3px;font-weight:bold',
)
if (typeof document !== 'undefined') {
document.title = `${pathname} · HANASYS DESIGN`
}
}, [pathname])
return null
}