import { ConverterSet, ConverterType } from '../domain.js'; import { alignIfLegacy, decodeText, encodeText, WIX_PROTOCOL, } from './converters-utils.js'; export function createMediaConverter< T extends { id?: string | null; url?: string | null; filename?: string | null; }, >(fieldType: string, commonType: string): ConverterSet { return { types: [commonType], [ConverterType.FROM_JSON]: { transform: (val: T) => { if (!val) { return; } let fileName = ''; if (val?.filename) { fileName = `/${encodeText(val.filename)}`; } return val.id ? `wix:${fieldType}://v1/${val.id}${fileName}` : val.url; }, }, [ConverterType.TO_JSON]: { transform: (val: string): T | undefined => { if (!val) { return; } const alignedUrl = alignIfLegacy(val, fieldType); const { protocol, pathname } = new URL(alignedUrl); const [id, filename] = pathname .replace(`${fieldType}://v1/`, '') .split('/'); if (protocol === WIX_PROTOCOL) { if (!filename) { return { id } as T; } return { id, filename: decodeText(filename), } as T; } return { url: val } as T; }, }, }; }