관리자는 VIP·멤버만 수정 가능하도록 서버·UI 권한을 정리하고 소유자 권한 이전 API와 확인 모달을 추가했다. 추천 사이트 파비콘 캐시·URL 접두사·카드 편집 UI를 보강하고 확인 얼럿을 AdminConfirmModal로 통일했다. Co-authored-by: Cursor <cursoragent@cursor.com>
33 lines
1.1 KiB
JavaScript
33 lines
1.1 KiB
JavaScript
import { getExternalFaviconUrl } from './external-favicon-url.js'
|
|
|
|
/**
|
|
* 추천 사이트 외부 URL인지 확인한다.
|
|
* @param {string} url - 링크 URL
|
|
* @returns {boolean} 외부 URL 여부
|
|
*/
|
|
export const isExternalRecommendedSiteUrl = (url) => /^https?:\/\//i.test(String(url || '').trim())
|
|
|
|
/**
|
|
* 추천 사이트에 표시할 아이콘 URL을 반환한다.
|
|
* 수동 썸네일 > 서버 캐시 파비콘 > 외부 파비콘 프록시 순이다.
|
|
* @param {Object} item - 추천 사이트 항목
|
|
* @param {string} [item.thumbnailUrl] - 수동 썸네일 URL
|
|
* @param {string} [item.cachedFaviconUrl] - 서버에 저장된 파비콘 URL
|
|
* @param {string} [item.url] - 사이트 URL
|
|
* @param {number} [sizePx] - 외부 프록시 요청 크기(px)
|
|
* @returns {string} 아이콘 URL
|
|
*/
|
|
export const getRecommendedSiteIconUrl = (item, sizePx = 64) => {
|
|
const thumbnailUrl = String(item?.thumbnailUrl || '').trim()
|
|
if (thumbnailUrl) {
|
|
return thumbnailUrl
|
|
}
|
|
|
|
const cachedFaviconUrl = String(item?.cachedFaviconUrl || '').trim()
|
|
if (cachedFaviconUrl) {
|
|
return cachedFaviconUrl
|
|
}
|
|
|
|
return getExternalFaviconUrl(item?.url, sizePx)
|
|
}
|