96 lines
2.3 KiB
JavaScript
96 lines
2.3 KiB
JavaScript
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,
|
|
},
|
|
],
|
|
});
|
|
};
|