90 lines
2.1 KiB
TypeScript
90 lines
2.1 KiB
TypeScript
import { isProductPackageType } from '@/lib/material-type-mapper'
|
|
|
|
type TaskDetailAssetLike = {
|
|
assetType?: string | null
|
|
}
|
|
|
|
type TaskDetailUploadGroups = {
|
|
main?: ArrayLike<unknown> | null
|
|
sku?: ArrayLike<unknown> | null
|
|
detail?: ArrayLike<unknown> | null
|
|
}
|
|
|
|
const TASK_DETAIL_FULL_SET_GROUPS = {
|
|
main: new Set(['main-preview', 'main']),
|
|
sku: new Set(['sku-preview', 'sku']),
|
|
detail: new Set(['detail-preview', 'detail']),
|
|
} as const
|
|
|
|
function hasUploadItems(items: ArrayLike<unknown> | null | undefined): boolean {
|
|
return Boolean(items && typeof items.length === 'number' && items.length > 0)
|
|
}
|
|
|
|
export function isTaskDetailFullSetFromUploadGroups(
|
|
groups: TaskDetailUploadGroups | null | undefined,
|
|
): boolean {
|
|
return (
|
|
hasUploadItems(groups?.main) &&
|
|
hasUploadItems(groups?.sku) &&
|
|
hasUploadItems(groups?.detail)
|
|
)
|
|
}
|
|
|
|
export function isTaskDetailFullSetFromAssetTypes(
|
|
assetTypes: Array<string | null | undefined>,
|
|
): boolean {
|
|
let hasMain = false
|
|
let hasSku = false
|
|
let hasDetail = false
|
|
|
|
for (const assetType of assetTypes) {
|
|
if (!assetType) {
|
|
continue
|
|
}
|
|
|
|
if (TASK_DETAIL_FULL_SET_GROUPS.main.has(assetType as 'main-preview' | 'main')) {
|
|
hasMain = true
|
|
}
|
|
|
|
if (TASK_DETAIL_FULL_SET_GROUPS.sku.has(assetType as 'sku-preview' | 'sku')) {
|
|
hasSku = true
|
|
}
|
|
|
|
if (TASK_DETAIL_FULL_SET_GROUPS.detail.has(assetType as 'detail-preview' | 'detail')) {
|
|
hasDetail = true
|
|
}
|
|
|
|
if (hasMain && hasSku && hasDetail) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
export function isTaskDetailFullSetFromAssets(
|
|
assets: TaskDetailAssetLike[] | null | undefined,
|
|
): boolean {
|
|
if (!Array.isArray(assets) || assets.length === 0) {
|
|
return false
|
|
}
|
|
|
|
return isTaskDetailFullSetFromAssetTypes(assets.map((asset) => asset?.assetType))
|
|
}
|
|
|
|
export function deriveTaskDetailIsFullSet(
|
|
materialType: string | null | undefined,
|
|
assets: TaskDetailAssetLike[] | null | undefined,
|
|
fallback = false,
|
|
): boolean {
|
|
if (!isProductPackageType(materialType || '')) {
|
|
return false
|
|
}
|
|
|
|
if (Array.isArray(assets)) {
|
|
return isTaskDetailFullSetFromAssets(assets)
|
|
}
|
|
|
|
return Boolean(fallback)
|
|
}
|