@jbrowse/core
Version:
JBrowse 2 core libraries used by plugins
100 lines (99 loc) • 4.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.stateModelFactory = stateModelFactory;
const mobx_1 = require("mobx");
const mobx_state_tree_1 = require("mobx-state-tree");
const configuration_1 = require("../configuration");
const util_1 = require("../util");
const model_1 = require("./SequenceFeatureDetails/model");
const util_2 = require("./util");
const mst_1 = require("../util/types/mst");
function stateModelFactory(pluginManager) {
return mobx_state_tree_1.types
.model('BaseFeatureWidget', {
id: mst_1.ElementId,
type: mobx_state_tree_1.types.literal('BaseFeatureWidget'),
featureData: mobx_state_tree_1.types.frozen(),
formattedFields: mobx_state_tree_1.types.frozen(),
unformattedFeatureData: mobx_state_tree_1.types.frozen(),
view: mobx_state_tree_1.types.safeReference(pluginManager.pluggableMstType('view', 'stateModel')),
track: mobx_state_tree_1.types.safeReference(pluginManager.pluggableMstType('track', 'stateModel')),
trackId: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
trackType: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
maxDepth: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.number),
sequenceFeatureDetails: mobx_state_tree_1.types.optional((0, model_1.SequenceFeatureDetailsF)(), {}),
descriptions: mobx_state_tree_1.types.frozen(),
})
.volatile(() => ({
error: undefined,
}))
.actions(self => ({
setFeatureData(featureData) {
self.unformattedFeatureData = featureData;
},
clearFeatureData() {
self.featureData = undefined;
},
setFormattedData(feat) {
self.featureData = feat;
},
setExtra(type, trackId, maxDepth) {
self.trackId = trackId;
self.trackType = type;
self.maxDepth = maxDepth;
},
setError(e) {
self.error = e;
},
}))
.actions(self => ({
afterCreate() {
(0, mobx_state_tree_1.addDisposer)(self, (0, mobx_1.autorun)(() => {
try {
const { unformattedFeatureData, track } = self;
const session = (0, util_1.getSession)(self);
if (track) {
self.setExtra(track.type, track.configuration.trackId, (0, configuration_1.getConf)(track, ['formatDetails', 'maxDepth']));
}
if (unformattedFeatureData) {
const feature = structuredClone(unformattedFeatureData);
const combine = (arg2, feature) => ({
...(0, configuration_1.getConf)(session, ['formatDetails', arg2], { feature }),
...(0, configuration_1.getConf)(track, ['formatDetails', arg2], { feature }),
});
if (track) {
feature.__jbrowsefmt = combine('feature', feature);
(0, util_2.formatSubfeatures)(feature, (0, configuration_1.getConf)(track, ['formatDetails', 'depth']), sub => {
sub.__jbrowsefmt = combine('subfeatures', sub);
});
}
self.setFormattedData(feature);
}
}
catch (e) {
console.error(e);
self.setError(e);
}
}));
},
}))
.preProcessSnapshot(snap => {
const { featureData, finalizedFeatureData, ...rest } = snap;
return {
unformattedFeatureData: featureData,
featureData: finalizedFeatureData,
...rest,
};
})
.postProcessSnapshot(snap => {
const { unformattedFeatureData, featureData, ...rest } = snap;
const s2 = JSON.stringify(featureData, (_, v) => v === undefined ? null : v);
const featureTooLargeToBeSerialized = !s2 || s2.length > 2000000;
return {
finalizedFeatureData: featureTooLargeToBeSerialized
? undefined
: JSON.parse(s2),
...rest,
};
});
}