에디터 미디어 선택 대상 계산 분리

This commit is contained in:
2026-07-24 18:18:12 +09:00
parent 408d4aa420
commit fe1a390699
7 changed files with 127 additions and 52 deletions

View File

@@ -130,6 +130,77 @@ export const isUploadFileAllowedForMediaTarget = (file, target) => {
return !type.startsWith('image/') && !type.startsWith('video/') && !type.startsWith('audio/')
}
/**
* 미디어 선택 대상이 갤러리 다중 선택인지 반환한다.
* @param {string} target - 선택 대상
* @returns {boolean} 갤러리 다중 선택 여부
*/
export const isGalleryMediaPickerTarget = (target) => target === 'gallery' || target === 'active-gallery'
/**
* 미디어 선택 대상에 맞는 파일 입력 accept 값을 반환한다.
* @param {string} target - 선택 대상
* @returns {string} 파일 입력 accept 값
*/
export const getMediaPickerAcceptForTarget = (target) => {
if (['image', 'gallery', 'active-gallery'].includes(target)) {
return 'image/*'
}
if (target === 'video') {
return 'video/*'
}
if (target === 'audio') {
return 'audio/*'
}
return '.pdf,.zip,.txt,.csv,.docx,.xlsx,.pptx'
}
/**
* 미디어 선택 대상에 맞는 미디어 API kind 값을 반환한다.
* @param {string} target - 선택 대상
* @returns {string} API kind 값
*/
export const getMediaPickerKindForTarget = (target) => {
if (['image', 'gallery', 'active-gallery'].includes(target)) {
return 'image'
}
if (['video', 'audio', 'file'].includes(target)) {
return target
}
return 'all'
}
/**
* 미디어 선택 대상별 업로드 안내 문구를 만든다.
* @param {string} target - 선택 대상
* @param {{ image: number, video: number, audio: number, document: number }} uploadSizeLimits - 종류별 업로드 한도
* @returns {string} 업로드 안내 문구
*/
export const buildMediaPickerUploadHint = (target, uploadSizeLimits) => {
if (isGalleryMediaPickerTarget(target)) {
return `여러 이미지를 한 번에 선택할 수 있습니다. (최대 ${formatUploadSizeLimit(uploadSizeLimits.image)})`
}
if (target === 'video') {
return `MP4, WebM, MOV 비디오를 업로드할 수 있습니다. (최대 ${formatUploadSizeLimit(uploadSizeLimits.video)})`
}
if (target === 'audio') {
return `MP3, WAV, OGG, M4A 오디오를 업로드할 수 있습니다. (최대 ${formatUploadSizeLimit(uploadSizeLimits.audio)})`
}
if (target === 'file') {
return `PDF, ZIP, 문서 파일을 업로드할 수 있습니다. (최대 ${formatUploadSizeLimit(uploadSizeLimits.document)})`
}
return `단일 이미지가 본문에 삽입됩니다. (최대 ${formatUploadSizeLimit(uploadSizeLimits.image)})`
}
/**
* 미디어 항목으로 Prose 미디어 블록을 만든다.
* @param {'video'|'audio'|'file'} blockType - 블록 유형