169 lines
4.0 KiB
TypeScript
169 lines
4.0 KiB
TypeScript
import type { ParsedCustomLinkOptions } from '@/types/CommonType'
|
|
|
|
/**
|
|
* 페이지 - 유효성 체크
|
|
*
|
|
* @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 config = useRuntimeConfig()
|
|
let result = `${link || ''}`
|
|
|
|
// @c{key} 패턴 치환 (예: @c{stoveCommunityUrl})
|
|
if (link.includes('@c')) {
|
|
result = result.replace(/@c\{(.*?)\}/g, (_, key) => {
|
|
// config.public에서 해당 key 값을 찾아 치환
|
|
return typeof config.public[key] === 'string' ? config.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|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
|
|
}
|