151 lines
4.6 KiB
JavaScript
151 lines
4.6 KiB
JavaScript
import { ref } from 'vue'
|
|
|
|
/**
|
|
* 관리자 미디어 화면의 썸네일 재생성 상태와 액션을 만든다.
|
|
* @param {Object} options - 재생성 옵션
|
|
* @param {Function} options.refresh - 미디어 목록 새로고침 함수
|
|
* @param {Object} options.selectedMediaUrl - 선택된 미디어 URL ref
|
|
* @param {Function} options.showToast - 관리자 토스트 표시 함수
|
|
* @returns {Object} 썸네일 생성 가능 판별과 재생성 액션
|
|
*/
|
|
export const useAdminMediaThumbnailRegeneration = ({
|
|
refresh,
|
|
selectedMediaUrl,
|
|
showToast
|
|
}) => {
|
|
const regeneratingThumbnailUrl = ref('')
|
|
const regeneratingBodyThumbnailUrl = ref('')
|
|
|
|
/**
|
|
* 카드 썸네일을 생성할 수 있는 원본 이미지인지 확인한다.
|
|
* @param {Object} item - 미디어 항목
|
|
* @returns {boolean} 생성 가능 여부
|
|
*/
|
|
const canRegeneratePostThumbnail = (item) => (
|
|
item?.thumbnailStatus?.role === 'original'
|
|
&& item?.thumbnailStatus?.variant !== 'pageCover'
|
|
&& (item.thumbnailStatus.isFallbackActive || item.thumbnailStatus.hasThumbnail)
|
|
)
|
|
|
|
/**
|
|
* 페이지 커버 썸네일을 생성할 수 있는 원본 이미지인지 확인한다.
|
|
* @param {Object} item - 미디어 항목
|
|
* @returns {boolean} 생성 가능 여부
|
|
*/
|
|
const canRegeneratePageCoverThumbnail = (item) => (
|
|
item?.thumbnailStatus?.role === 'original'
|
|
&& item?.thumbnailStatus?.variant === 'pageCover'
|
|
&& (item.thumbnailStatus.isFallbackActive || item.thumbnailStatus.hasThumbnail)
|
|
)
|
|
|
|
/**
|
|
* 본문 표시용 이미지를 생성할 수 있는 원본 이미지인지 확인한다.
|
|
* @param {Object} item - 미디어 항목
|
|
* @returns {boolean} 생성 가능 여부
|
|
*/
|
|
const canRegeneratePostBodyThumbnail = (item) => (
|
|
item?.bodyThumbnailStatus?.role === 'original'
|
|
&& (item.bodyThumbnailStatus.isFallbackActive || item.bodyThumbnailStatus.hasThumbnail)
|
|
)
|
|
|
|
/**
|
|
* 선택한 원본 이미지의 대표 이미지 파일을 다시 생성한다.
|
|
* @param {Object} item - 미디어 항목
|
|
* @returns {Promise<void>}
|
|
*/
|
|
const regeneratePostThumbnail = async (item) => {
|
|
if (!canRegeneratePostThumbnail(item)) {
|
|
return
|
|
}
|
|
|
|
regeneratingThumbnailUrl.value = item.url
|
|
|
|
try {
|
|
await $fetch('/admin/api/media/thumbnail', {
|
|
method: 'POST',
|
|
body: {
|
|
url: item.url
|
|
}
|
|
})
|
|
await refresh()
|
|
selectedMediaUrl.value = item.url
|
|
showToast('success', '대표 이미지 파일을 생성했습니다.')
|
|
} catch (error) {
|
|
showToast('error', error?.data?.message || '대표 이미지 파일을 생성하지 못했습니다.')
|
|
} finally {
|
|
regeneratingThumbnailUrl.value = ''
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 선택한 원본 이미지의 페이지 커버 썸네일을 다시 생성한다.
|
|
* @param {Object} item - 미디어 항목
|
|
* @returns {Promise<void>}
|
|
*/
|
|
const regeneratePageCoverThumbnail = async (item) => {
|
|
if (!canRegeneratePageCoverThumbnail(item)) {
|
|
return
|
|
}
|
|
|
|
regeneratingThumbnailUrl.value = item.url
|
|
|
|
try {
|
|
await $fetch('/admin/api/media/thumbnail', {
|
|
method: 'POST',
|
|
body: {
|
|
url: item.url,
|
|
kind: 'pageCover'
|
|
}
|
|
})
|
|
await refresh()
|
|
selectedMediaUrl.value = item.url
|
|
showToast('success', '페이지 커버 썸네일을 생성했습니다.')
|
|
} catch (error) {
|
|
showToast('error', error?.data?.message || '페이지 커버 썸네일을 생성하지 못했습니다.')
|
|
} finally {
|
|
regeneratingThumbnailUrl.value = ''
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 선택한 원본 이미지의 본문 표시용 이미지를 다시 생성한다.
|
|
* @param {Object} item - 미디어 항목
|
|
* @returns {Promise<void>}
|
|
*/
|
|
const regeneratePostBodyThumbnail = async (item) => {
|
|
if (!canRegeneratePostBodyThumbnail(item)) {
|
|
return
|
|
}
|
|
|
|
regeneratingBodyThumbnailUrl.value = item.url
|
|
|
|
try {
|
|
await $fetch('/admin/api/media/thumbnail', {
|
|
method: 'POST',
|
|
body: {
|
|
url: item.url,
|
|
kind: 'body'
|
|
}
|
|
})
|
|
await refresh()
|
|
selectedMediaUrl.value = item.url
|
|
showToast('success', '본문 이미지를 생성했습니다.')
|
|
} catch (error) {
|
|
showToast('error', error?.data?.message || '본문 이미지를 생성하지 못했습니다.')
|
|
} finally {
|
|
regeneratingBodyThumbnailUrl.value = ''
|
|
}
|
|
}
|
|
|
|
return {
|
|
canRegeneratePageCoverThumbnail,
|
|
canRegeneratePostBodyThumbnail,
|
|
canRegeneratePostThumbnail,
|
|
regeneratePageCoverThumbnail,
|
|
regeneratePostBodyThumbnail,
|
|
regeneratePostThumbnail,
|
|
regeneratingBodyThumbnailUrl,
|
|
regeneratingThumbnailUrl
|
|
}
|
|
}
|