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 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 }