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