에디터 미디어 선택 상태 로직 분리

This commit is contained in:
2026-07-24 17:51:02 +09:00
parent 401dc64238
commit 6cc820d2a2
7 changed files with 176 additions and 32 deletions

View File

@@ -151,3 +151,85 @@ export const createMediaBlockMarkdown = (blockType, item) => {
':::'
]
}
/**
* 갤러리 미디어 선택 순서를 반환한다.
* @param {string[]} selectedUrls - 선택된 URL 목록
* @param {string} url - 미디어 URL
* @returns {number} 1부터 시작하는 선택 순서, 선택되지 않았으면 0
*/
export const getGallerySelectionOrder = (selectedUrls, url) => {
const index = Array.isArray(selectedUrls) ? selectedUrls.indexOf(url) : -1
return index >= 0 ? index + 1 : 0
}
/**
* 미디어 선택 상태를 토글한다.
* @param {Object} options - 토글 옵션
* @param {string[]} options.selectedUrls - 선택된 URL 목록
* @param {Record<string, Object>} options.selectedItemMap - 선택된 미디어 항목 맵
* @param {Object} options.mediaItem - 토글 대상 미디어 항목
* @param {boolean} options.isGallery - 갤러리 다중 선택 여부
* @returns {{ selectedUrls: string[], selectedItemMap: Record<string, Object> }} 다음 선택 상태
*/
export const toggleMediaSelectionState = ({
selectedUrls,
selectedItemMap,
mediaItem,
isGallery
}) => {
const url = mediaItem?.url
if (!url) {
return {
selectedUrls: Array.isArray(selectedUrls) ? selectedUrls : [],
selectedItemMap: selectedItemMap && typeof selectedItemMap === 'object' ? selectedItemMap : {}
}
}
if (!isGallery) {
return {
selectedUrls: [url],
selectedItemMap: {
[url]: mediaItem
}
}
}
const currentUrls = Array.isArray(selectedUrls) ? selectedUrls : []
const currentMap = selectedItemMap && typeof selectedItemMap === 'object' ? selectedItemMap : {}
if (currentUrls.includes(url)) {
const nextMap = { ...currentMap }
delete nextMap[url]
return {
selectedUrls: currentUrls.filter((selectedUrl) => selectedUrl !== url),
selectedItemMap: nextMap
}
}
return {
selectedUrls: [...currentUrls, url],
selectedItemMap: {
...currentMap,
[url]: mediaItem
}
}
}
/**
* 선택된 URL 순서에 맞춰 미디어 항목 목록을 반환한다.
* @param {string[]} selectedUrls - 선택된 URL 목록
* @param {Record<string, Object>} selectedItemMap - 선택된 미디어 항목 맵
* @param {Object[]} mediaItems - 현재 미디어 목록
* @returns {Object[]} 선택된 미디어 항목 목록
*/
export const resolveSelectedMediaItems = (selectedUrls, selectedItemMap, mediaItems) => {
const itemMap = selectedItemMap && typeof selectedItemMap === 'object' ? selectedItemMap : {}
const items = Array.isArray(mediaItems) ? mediaItems : []
return (Array.isArray(selectedUrls) ? selectedUrls : [])
.map((url) => itemMap[url] || items.find((item) => item?.url === url))
.filter(Boolean)
}