Files
web-temp/layers/utils/commonUtil.ts
clkim d5e783113d refactor. 패키지 및 의존성 업데이트
- @pinia/nuxt 및 pinia 버전 업데이트
- app.vue에서 favicon 링크 생성 로직 개선
- error.vue에서 불필요한 console.log 제거
- pageData.global.ts에서 API URL 수정 및 에러 처리 로직 개선
- init-game-data.server.ts에서 언어 코드 설정 로직 개선
- gameData.ts에서 경로 필터링 로직 수정
- commonUtil.ts에서 정적 파일 확인 정규 표현식 개선
2026-03-26 18:24:17 +09:00

178 lines
4.1 KiB
TypeScript

import type { ParsedCustomLinkOptions } from '#layers/types/Common'
/**
* 페이지 - 유효성 체크
*
* @param {number} page - 페이지
* @param {number} totalPage - 총 페이지 수
*/
const checkPageValidation = (page: number, totalPage: number) => {
// 최소, 최대 범위 체크
if (page < 1) {
page = 1
} else if (page > totalPage) {
page = totalPage
}
return page
}
/**
* 파일 다운로드 함수
*
* @param {string} fileUrl - 다운로드할 파일의 URL
* @param {string} fileName - 저장할 파일 이름 (옵션)
*/
const csrDownloadFile = (fileUrl: string, fileName?: string) => {
const link = document.createElement('a')
link.href = fileUrl
// 파일 이름이 제공되면 다운로드 이름 설정
if (fileName) {
link.download = fileName
}
// 링크를 클릭하여 다운로드 트리거
document.body.appendChild(link)
link.click()
// DOM에서 링크 제거
document.body.removeChild(link)
}
/**
* 마케팅 코드 조회
*/
const csrGetMarketingCode = () => {
const route = useRoute()
const mcode = Number(
`${route.query.mcode != null && route.query.mcode !== '' ? route.query.mcode : ''}`
)
return isNaN(mcode) ? undefined : mcode
}
/**
* 외부 링크 이동 (새 창)
*
* @param {string} link - 이동할 외부 링크
*/
const csrGoExternalLink = (link: string = '') => {
window.open(link, '_blank')
}
/**
* QA용 국가 코드 조회
*/
const csrGetQc = () => {
const route = useRoute()
const qc = `${route.query.qc != null && route.query.qc !== '' ? route.query.qc : ''}`
return qc
}
/**
* 문자열이 숫자인지 확인
*
* @param {string} str - 확인할 문자열
*/
const isNumeric = (str: string): boolean => {
return /^-?\d+(\.\d+)?$/.test(str)
}
/**
* 가공된 링크 파싱
*
* @param {string} link - 원본 링크
* @param {Function} tm - i18n의 tm 함수 (예: (key) => ({ txt: string }))
* @param {any} query - 추가 쿼리 파라미터
*/
const getParsedCustomLink = (
link: string,
{ tm, query = {} }: ParsedCustomLinkOptions
) => {
const runtimeConfig = useRuntimeConfig()
let result = `${link || ''}`
// @c{key} 패턴 치환 (예: @c{stoveCommunityUrl})
if (link.includes('@c')) {
result = result.replace(/@c\{(.*?)\}/g, (_, key) => {
// runtimeConfig.public에서 해당 key 값을 찾아 치환
return typeof runtimeConfig.public[key] === 'string'
? runtimeConfig.public[key]
: ''
})
}
// @m{key} 패턴 치환 (예: @m{Community_Channel_Key})
if (link.includes('@m')) {
result = result.replace(/@m\{(.*?)\}/g, (_, key) => {
// tm 함수로 변환하여 치환
return tm(key)?.txt ?? ''
})
}
// @q{key} 패턴 치환 (예: @q{ppid})
if (link.includes('@q')) {
result = result.replace(/@q\{(.*?)\}/g, (_, key) => {
let q = ''
if (query[key]) {
q += result.includes('?') ? '&' : '?'
q += `${key}=${query[key]}`
}
return q
})
}
return result
}
/**
* 쿠키 설정 - 만료기간 하루 단위 셋팅
*
* @param {string} name - 쿠키 이름
* @param {string} value - 쿠키 값
* @param {number} exp - 만료기간 (옵션)
*/
const setCookieForDay = (name: string, value: string, exp?: number) => {
const date = new Date()
if (!exp) {
exp = 1
}
date.setTime(date.getTime() + exp * 24 * 60 * 60 * 1000)
const setCookie = useCookie(name, {
expires: new Date(date),
path: '/',
})
setCookie.value = value
}
// 정적 파일인지 확인하는 함수
const isStaticFile = (path: string): boolean => {
return /\.(js|css|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2|ttf|eot|scss)$/i.test(
path
)
}
/**
* 기준값이 최솟값 ~ 최댓값에 속하는지 확인
*
* @param {number} ref - 기준값
* @param {number} min - 최솟값
* @param {number} max - 최댓값
*/
const isInRange = (ref: number, min: number, max: number): boolean => {
return ref >= min && ref <= max
}
export {
checkPageValidation,
csrDownloadFile,
csrGetMarketingCode,
csrGoExternalLink,
csrGetQc,
isNumeric,
getParsedCustomLink,
setCookieForDay,
isStaticFile,
isInRange,
}