import { uniqueId } from 'lodash'; import { SNIPPET_BLOB_ACTION_CREATE, SNIPPET_BLOB_ACTION_UPDATE, SNIPPET_BLOB_ACTION_MOVE, SNIPPET_BLOB_ACTION_DELETE, SNIPPET_LEVELS_MAP, SNIPPET_VISIBILITY, } from '../constants'; import { performanceMarkAndMeasure } from '~/performance/utils'; import { SNIPPET_MARK_BLOBS_CONTENT, SNIPPET_MEASURE_BLOBS_CONTENT } from '~/performance/constants'; const createLocalId = () => uniqueId('blob_local_'); export const decorateBlob = blob => ({ ...blob, id: createLocalId(), isLoaded: false, content: '', }); export const createBlob = () => ({ id: createLocalId(), content: '', path: '', isLoaded: true, }); const diff = ({ content, path }, origBlob) => { if (!origBlob) { return { action: SNIPPET_BLOB_ACTION_CREATE, previousPath: path, content, filePath: path, }; } else if (origBlob.path !== path || origBlob.content !== content) { return { action: origBlob.path === path ? SNIPPET_BLOB_ACTION_UPDATE : SNIPPET_BLOB_ACTION_MOVE, previousPath: origBlob.path, content, filePath: path, }; } return null; }; /** * This function returns an array of diff actions (to be sent to the BE) based on the current vs. original blobs * * @param {Object} blobs * @param {Object} origBlobs */ export const diffAll = (blobs, origBlobs) => { const deletedEntries = Object.values(origBlobs) .filter(x => !blobs[x.id]) .map(({ path, content }) => ({ action: SNIPPET_BLOB_ACTION_DELETE, previousPath: path, filePath: path, content, })); const newEntries = Object.values(blobs) .map(blob => diff(blob, origBlobs[blob.id])) .filter(x => x); return [...deletedEntries, ...newEntries]; }; export const defaultSnippetVisibilityLevels = arr => { if (Array.isArray(arr)) { return arr.map(l => { const translatedLevel = SNIPPET_LEVELS_MAP[l]; return { value: translatedLevel, ...SNIPPET_VISIBILITY[translatedLevel], }; }); } return []; }; export const markBlobPerformance = () => { performanceMarkAndMeasure({ mark: SNIPPET_MARK_BLOBS_CONTENT, measures: [ { name: SNIPPET_MEASURE_BLOBS_CONTENT, start: undefined, end: SNIPPET_MARK_BLOBS_CONTENT, }, ], }); };