@haniffalab/cherita-react 0.1.12-dev.2024-02-12.20ce0bfd → 0.1.12-dev.2024-02-12.b016d286

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -64,16 +64,20 @@ function ObsColsList() {
64
64
  _useState4 = _slicedToArray(_useState3, 2),
65
65
  obs = _useState4[0],
66
66
  setObs = _useState4[1];
67
- var _useState5 = (0, _react.useState)(null),
67
+ var _useState5 = (0, _react.useState)(false),
68
68
  _useState6 = _slicedToArray(_useState5, 2),
69
- active = _useState6[0],
70
- setActive = _useState6[1];
71
- var _useState7 = (0, _react.useState)({
69
+ updatedObsColsList = _useState6[0],
70
+ setUpdatedObsColsList = _useState6[1];
71
+ var _useState7 = (0, _react.useState)(null),
72
+ _useState8 = _slicedToArray(_useState7, 2),
73
+ active = _useState8[0],
74
+ setActive = _useState8[1];
75
+ var _useState9 = (0, _react.useState)({
72
76
  url: dataset.url
73
77
  }),
74
- _useState8 = _slicedToArray(_useState7, 2),
75
- params = _useState8[0],
76
- setParams = _useState8[1];
78
+ _useState10 = _slicedToArray(_useState9, 2),
79
+ params = _useState10[0],
80
+ setParams = _useState10[1];
77
81
  var colorHelper = new _color.ColorHelper();
78
82
  (0, _react.useEffect)(function () {
79
83
  setParams(function (p) {
@@ -88,6 +92,17 @@ function ObsColsList() {
88
92
  fetchedData = _useFetch.fetchedData,
89
93
  isPending = _useFetch.isPending,
90
94
  serverError = _useFetch.serverError;
95
+ var validateSelection = (0, _react.useCallback)(function (selectedObs) {
96
+ if (updatedObsColsList) {
97
+ if (!_lodash.default.some(obsColsList, selectedObs)) {
98
+ setActive(null);
99
+ dispatch({
100
+ type: "obsSelected",
101
+ obs: null
102
+ });
103
+ }
104
+ }
105
+ }, [dispatch, obsColsList, updatedObsColsList]);
91
106
  (0, _react.useEffect)(function () {
92
107
  if (!isPending && !serverError) {
93
108
  setObs(fetchedData.reduce(function (result, key) {
@@ -118,13 +133,15 @@ function ObsColsList() {
118
133
  }
119
134
  return d;
120
135
  }));
136
+ setUpdatedObsColsList(true);
121
137
  }
122
138
  }, [fetchedData, isPending, serverError]);
123
139
  (0, _react.useEffect)(function () {
124
140
  if (dataset.selectedObs) {
141
+ validateSelection(dataset.selectedObs);
125
142
  setActive(dataset.selectedObs.name);
126
143
  }
127
- }, [dataset.selectedObs]);
144
+ }, [dataset.selectedObs, validateSelection]);
128
145
  (0, _react.useEffect)(function () {
129
146
  dispatch({
130
147
  type: "set.obs",
@@ -113,20 +113,24 @@ function VarNamesList(_ref2) {
113
113
  _useState8 = _slicedToArray(_useState7, 2),
114
114
  varNames = _useState8[0],
115
115
  setVarNames = _useState8[1];
116
- var _useState9 = (0, _react.useState)(mode ? mode === _constants.SELECTION_MODES.SINGLE ? [dataset.selectVar] : dataset.selectedMultiVar : []),
116
+ var _useState9 = (0, _react.useState)(false),
117
117
  _useState10 = _slicedToArray(_useState9, 2),
118
- varButtons = _useState10[0],
119
- setVarButtons = _useState10[1];
120
- var _useState11 = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? null : []),
118
+ updatedVarNames = _useState10[0],
119
+ setUpdatedVarNames = _useState10[1];
120
+ var _useState11 = (0, _react.useState)(mode ? mode === _constants.SELECTION_MODES.SINGLE ? [dataset.selectVar] : dataset.selectedMultiVar : []),
121
121
  _useState12 = _slicedToArray(_useState11, 2),
122
- active = _useState12[0],
123
- setActive = _useState12[1];
124
- var _useState13 = (0, _react.useState)({
122
+ varButtons = _useState12[0],
123
+ setVarButtons = _useState12[1];
124
+ var _useState13 = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? dataset.selectVar : dataset.selectedMultiVar),
125
+ _useState14 = _slicedToArray(_useState13, 2),
126
+ active = _useState14[0],
127
+ setActive = _useState14[1];
128
+ var _useState15 = (0, _react.useState)({
125
129
  url: dataset.url
126
130
  }),
127
- _useState14 = _slicedToArray(_useState13, 2),
128
- params = _useState14[0],
129
- setParams = _useState14[1];
131
+ _useState16 = _slicedToArray(_useState15, 2),
132
+ params = _useState16[0],
133
+ setParams = _useState16[1];
130
134
  (0, _react.useEffect)(function () {
131
135
  setParams(function (p) {
132
136
  return _objectSpread(_objectSpread({}, p), {}, {
@@ -140,23 +144,49 @@ function VarNamesList(_ref2) {
140
144
  fetchedData = _useFetch.fetchedData,
141
145
  isPending = _useFetch.isPending,
142
146
  serverError = _useFetch.serverError;
147
+ var validateSelection = (0, _react.useCallback)(function (selectedVar, mode) {
148
+ if (updatedVarNames) {
149
+ if (mode === _constants.SELECTION_MODES.SINGLE) {
150
+ if (selectedVar && !_lodash.default.some(varNames, selectedVar)) {
151
+ setActive(null);
152
+ dispatch({
153
+ type: "varSelected",
154
+ var: null
155
+ });
156
+ }
157
+ } else {
158
+ if (selectedVar.length && !_lodash.default.every(selectedVar, function (v) {
159
+ return _lodash.default.some(varNames, v);
160
+ })) {
161
+ setActive([]);
162
+ dispatch({
163
+ type: "multiVarReset",
164
+ var: []
165
+ });
166
+ }
167
+ }
168
+ }
169
+ }, [dispatch, varNames, updatedVarNames]);
143
170
  (0, _react.useEffect)(function () {
144
171
  if (!isPending && !serverError) {
145
172
  setVarNames(fetchedData);
173
+ setUpdatedVarNames(true);
146
174
  }
147
175
  }, [fetchedData, isPending, serverError]);
148
176
  (0, _react.useEffect)(function () {
149
177
  if (mode === _constants.SELECTION_MODES.SINGLE && dataset.selectedVar) {
178
+ validateSelection(dataset.selectVar, mode);
150
179
  setActive(dataset.selectedVar.matrix_index);
151
180
  }
152
- }, [mode, dataset.selectedVar]);
181
+ }, [mode, dataset.selectedVar, dataset.selectVar, validateSelection]);
153
182
  (0, _react.useEffect)(function () {
154
183
  if (mode === _constants.SELECTION_MODES.MULTIPLE) {
184
+ validateSelection(dataset.selectedMultiVar, mode);
155
185
  setActive(dataset.selectedMultiVar.map(function (i) {
156
186
  return i.matrix_index;
157
187
  }));
158
188
  }
159
- }, [mode, dataset.selectedMultiVar]);
189
+ }, [mode, dataset.selectedMultiVar, validateSelection]);
160
190
  var selectVar = function selectVar(item) {
161
191
  setVarButtons(function () {
162
192
  if (varButtons[0] && varButtons.find(function (v) {
@@ -3,7 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.VIOLIN_MODES = exports.VIOLINPLOT_STANDARDSCALES = exports.SELECTION_MODES = exports.PLOTLY_COLORSCALES = exports.MATRIXPLOT_STANDARDSCALES = exports.DOTPLOT_STANDARDSCALES = exports.CHROMA_COLORSCALES = void 0;
6
+ exports.VIOLIN_MODES = exports.VIOLINPLOT_STANDARDSCALES = exports.SELECTION_MODES = exports.PLOTLY_COLORSCALES = exports.MATRIXPLOT_STANDARDSCALES = exports.LOCAL_STORAGE_KEY = exports.DOTPLOT_STANDARDSCALES = exports.CHROMA_COLORSCALES = void 0;
7
+ var LOCAL_STORAGE_KEY = "CHERITA";
8
+ exports.LOCAL_STORAGE_KEY = LOCAL_STORAGE_KEY;
7
9
  var PLOTLY_COLORSCALES = ["Blackbody", "Bluered", "Blues", "Cividis", "Earth", "Electric", "Greens", "Greys", "Hot", "Jet", "Picnic", "Portland", "Rainbow", "RdBu", "Reds", "Viridis", "YlGnBu", "YlOrRd"];
8
10
  exports.PLOTLY_COLORSCALES = PLOTLY_COLORSCALES;
9
11
  var CHROMA_COLORSCALES = {
@@ -9,9 +9,12 @@ exports.DatasetProvider = DatasetProvider;
9
9
  exports.useDataset = useDataset;
10
10
  exports.useDatasetDispatch = useDatasetDispatch;
11
11
  var _react = _interopRequireWildcard(require("react"));
12
+ var _lodash = _interopRequireDefault(require("lodash"));
12
13
  var _reactQuery = require("@tanstack/react-query");
13
14
  var _reactQueryPersistClient = require("@tanstack/react-query-persist-client");
14
15
  var _querySyncStoragePersister = require("@tanstack/query-sync-storage-persister");
16
+ var _constants = require("../constants/constants");
17
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
18
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
16
19
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
20
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
@@ -36,15 +39,17 @@ exports.DatasetDispatchContext = DatasetDispatchContext;
36
39
  var queryClient = new _reactQuery.QueryClient({
37
40
  defaultOptions: {
38
41
  queries: {
39
- gcTime: 1000 * 60 * 60 * 24
42
+ gcTime: 1000 * 60 * 60 * 24 * 7 // store for a week
40
43
  }
41
44
  },
45
+
42
46
  queryCache: new _reactQuery.QueryCache({
43
47
  onError: function onError(error, query) {
44
48
  console.error(error);
45
49
  }
46
50
  })
47
51
  });
52
+ // Type of queries to store responses
48
53
  var persistKeys = ["obs/cols", "var/names", "obsm/keys"];
49
54
  var persistOptions = {
50
55
  persister: (0, _querySyncStoragePersister.createSyncStoragePersister)({
@@ -60,38 +65,59 @@ var persistOptions = {
60
65
  return false;
61
66
  }
62
67
  }
68
+ // @TODO: add maxAge and buster (app and api version numbers as busters)
69
+ };
70
+
71
+ var initialDataset = {
72
+ obs: {},
73
+ selectedObs: null,
74
+ selectedObsm: null,
75
+ selectedVar: null,
76
+ selectedMultiObs: [],
77
+ selectedMultiVar: [],
78
+ colorEncoding: null,
79
+ controls: {
80
+ colorScale: "Viridis",
81
+ colorAxis: {
82
+ dmin: 0,
83
+ dmax: 1,
84
+ cmin: 0,
85
+ cmax: 1
86
+ },
87
+ standardScale: null,
88
+ meanOnlyExpressed: false,
89
+ expressionCutoff: 0.0
90
+ },
91
+ state: {
92
+ obs: {}
93
+ }
94
+ };
95
+ var initializer = function initializer(initialState) {
96
+ var localObj = (JSON.parse(localStorage.getItem(_constants.LOCAL_STORAGE_KEY)) || {})[initialState.url] || {};
97
+ var keys = _lodash.default.keys(initialState);
98
+ var localValues = _lodash.default.pick(localObj, keys);
99
+ return _lodash.default.assign(initialState, localValues);
63
100
  };
64
101
  function DatasetProvider(_ref2) {
65
102
  var dataset_url = _ref2.dataset_url,
66
103
  children = _ref2.children;
67
- var _useReducer = (0, _react.useReducer)(datasetReducer, {
68
- url: dataset_url,
69
- obs: {},
70
- selectedObs: null,
71
- selectedObsm: null,
72
- selectedVar: null,
73
- selectedMultiObs: [],
74
- selectedMultiVar: [],
75
- colorEncoding: null,
76
- controls: {
77
- colorScale: "Viridis",
78
- colorAxis: {
79
- dmin: 0,
80
- dmax: 1,
81
- cmin: 0,
82
- cmax: 1
83
- },
84
- standardScale: null,
85
- meanOnlyExpressed: false,
86
- expressionCutoff: 0.0
87
- },
88
- state: {
89
- obs: {}
90
- }
91
- }),
104
+ var _useReducer = (0, _react.useReducer)(datasetReducer, _objectSpread({
105
+ url: dataset_url
106
+ }, initialDataset), initializer),
92
107
  _useReducer2 = _slicedToArray(_useReducer, 2),
93
108
  dataset = _useReducer2[0],
94
109
  dispatch = _useReducer2[1];
110
+ (0, _react.useEffect)(function () {
111
+ try {
112
+ localStorage.setItem(_constants.LOCAL_STORAGE_KEY, JSON.stringify(_defineProperty({}, dataset.url, dataset)));
113
+ } catch (err) {
114
+ if (err.code === 22 || err.code === 1014 || err.name === "QuotaExceededError" || err.name === "NS_ERROR_DOM_QUOTA_REACHED") {
115
+ console.log("Browser storage quota exceeded");
116
+ } else {
117
+ console.log(err);
118
+ }
119
+ }
120
+ }, [dataset]);
95
121
  return /*#__PURE__*/_react.default.createElement(DatasetContext.Provider, {
96
122
  value: dataset
97
123
  }, /*#__PURE__*/_react.default.createElement(DatasetDispatchContext.Provider, {
@@ -163,6 +189,12 @@ function datasetReducer(dataset, action) {
163
189
  colorEncoding: action.value
164
190
  });
165
191
  }
192
+ case "multiVarReset":
193
+ {
194
+ return _objectSpread(_objectSpread({}, dataset), {}, {
195
+ selectedMultiVar: []
196
+ });
197
+ }
166
198
  case "set.controls.colorScale":
167
199
  {
168
200
  return _objectSpread(_objectSpread({}, dataset), {}, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haniffalab/cherita-react",
3
- "version": "0.1.12-dev.2024-02-12.20ce0bfd",
3
+ "version": "0.1.12-dev.2024-02-12.b016d286",
4
4
  "author": "",
5
5
  "license": "",
6
6
  "main": "dist/index.js",
@@ -78,5 +78,5 @@
78
78
  "url": "https://github.com/haniffalab/cherita-react/issues"
79
79
  },
80
80
  "homepage": "https://github.com/haniffalab/cherita-react#readme",
81
- "prereleaseSha": "20ce0bfd7d3b61f7825d8028031f9c8cb9db1b32"
81
+ "prereleaseSha": "b016d286df62d95c86e969e73dd08d268dc41a7a"
82
82
  }