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 anotherProps?: Record<string, any> | undefined | null, 74) { 75 return props 76 ? { 77 ...mediaItem, 78 ...props, 79 ...(anotherProps ?? {}), 80 id: mediaItem.id, 81 platform: mediaItem.platform, 82 } 83 : mediaItem; 84} 85 86export enum InternalDataType { 87 LOCALPATH = 'localPath', 88} 89 90export function setInternalData<T extends ICommon.IMediaBase>( 91 mediaItem: T, 92 key: InternalDataType, 93 value: string | number | undefined | null, 94): T { 95 return produce(mediaItem, draft => { 96 objectPath.set(draft, `${internalSerializeKey}.${key}`, value); 97 }); 98} 99 100export function getInternalData<T>( 101 mediaItem: ICommon.IMediaBase | null | undefined, 102 key: InternalDataType, 103): T | undefined { 104 if (!mediaItem) { 105 return undefined; 106 } 107 return objectPath.get(mediaItem, `${internalSerializeKey}.${key}`); 108} 109