에디터 미디어 선택 상태 로직 분리
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user