UNPKG

@jbrowse/core

Version:

JBrowse 2 core libraries used by plugins

100 lines (99 loc) 4.34 kB
"use strict"; 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, }; }); }