1import {internalSerializeKey} from '@/constants/commonConst'; 2import produce from 'immer'; 3import objectPath from 'object-path'; 4 5/** 获取mediakey */ 6export function getMediaKey(mediaItem: ICommon.IMediaBase) { 7 return `${mediaItem.platform}@${mediaItem.id}`; 8} 9 10/** 解析mediakey */ 11export function parseMediaKey(key: string): ICommon.IMediaBase { 12 try { 13 const str = JSON.parse(key.trim()); 14 let platform, id; 15 if (typeof str === 'string') { 16 [platform, id] = str.split('@'); 17 } else { 18 platform = str?.platform; 19 id = str?.id; 20 } 21 if (!platform || !id) { 22 throw new Error('mediakey不完整'); 23 } 24 return { 25 platform, 26 id, 27 }; 28 } catch (e: any) { 29 throw e; 30 } 31} 32 33/** 比较两media是否相同 */ 34export function isSameMediaItem( 35 a: ICommon.IMediaBase | null | undefined, 36 b: ICommon.IMediaBase | null | undefined, 37) { 38 return a && b && a.id === b.id && a.platform === b.platform; 39} 40 41/** 查找是否存在 */ 42export function includesMedia( 43 a: ICommon.IMediaBase[] | null | undefined, 44 b: ICommon.IMediaBase | null | undefined, 45) { 46 if (!a || !b) { 47 return false; 48 } 49 return a.findIndex(_ => isSameMediaItem(_, b)) !== -1; 50} 51 52/** 获取复位的mediaItem */ 53export function resetMediaItem<T extends ICommon.IMediaBase>( 54 mediaItem: T, 55 platform?: string, 56 newObj?: boolean, 57): T { 58 if (!newObj) { 59 mediaItem.platform = platform ?? mediaItem.platform; 60 mediaItem[internalSerializeKey] = undefined; 61 return mediaItem; 62 } else { 63 return produce(mediaItem, _ => { 64 _.platform = platform ?? mediaItem.platform; 65 _[internalSerializeKey] = undefined; 66 }); 67 } 68} 69 70export function mergeProps( 71 mediaItem: ICommon.IMediaBase, 72 props: Record<string, any> | undefined, 73) { 74 return props 75 ? { 76 ...mediaItem, 77 ...props, 78 } 79 : mediaItem; 80} 81 82export enum InternalDataType { 83 LOCALPATH = 'localPath', 84} 85 86export function setInternalData<T extends ICommon.IMediaBase>( 87 mediaItem: T, 88 key: InternalDataType, 89 value: string | number | undefined | null, 90): T { 91 return produce(mediaItem, draft => { 92 objectPath.set(draft, `${internalSerializeKey}.${key}`, value); 93 }); 94} 95 96export function getInternalData<T>( 97 mediaItem: ICommon.IMediaBase | null | undefined, 98 key: InternalDataType, 99): T | undefined { 100 if (!mediaItem) { 101 return undefined; 102 } 103 return objectPath.get(mediaItem, `${internalSerializeKey}.${key}`); 104} 105