UNPKG

10.6 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.add = add;
7exports.set = set;
8exports.get = get;
9exports.update = update;
10exports.deleteRef = deleteRef;
11exports.setListener = setListener;
12exports.setListeners = setListeners;
13exports.unsetListener = unsetListener;
14exports.unsetListeners = unsetListeners;
15exports.runTransaction = runTransaction;
16exports.default = void 0;
17
18var _every2 = _interopRequireDefault(require("lodash/every"));
19
20var _actions = require("../utils/actions");
21
22var _constants = require("../constants");
23
24var _query = require("../utils/query");
25
26function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
28function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
29
30function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
31
32function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
33
34var pathListenerCounts = {};
35
36function add(firebase, dispatch, queryOption) {
37 for (var _len = arguments.length, args = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
38 args[_key - 3] = arguments[_key];
39 }
40
41 var meta = (0, _query.getQueryConfig)(queryOption);
42 return (0, _actions.wrapInDispatch)(dispatch, {
43 ref: (0, _query.firestoreRef)(firebase, meta),
44 method: 'add',
45 meta: meta,
46 args: args,
47 types: [_constants.actionTypes.ADD_REQUEST, {
48 type: _constants.actionTypes.ADD_SUCCESS,
49 payload: function payload(snap) {
50 var obj = {
51 id: snap.id,
52 data: args[0]
53 };
54
55 _query.snapshotCache.set(obj, snap);
56
57 return obj;
58 }
59 }, _constants.actionTypes.ADD_FAILURE]
60 });
61}
62
63function set(firebase, dispatch, queryOption) {
64 var meta = (0, _query.getQueryConfig)(queryOption);
65
66 for (var _len2 = arguments.length, args = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {
67 args[_key2 - 3] = arguments[_key2];
68 }
69
70 return (0, _actions.wrapInDispatch)(dispatch, {
71 ref: (0, _query.firestoreRef)(firebase, meta),
72 method: 'set',
73 meta: meta,
74 args: args,
75 types: [_constants.actionTypes.SET_REQUEST, _constants.actionTypes.SET_SUCCESS, _constants.actionTypes.SET_FAILURE]
76 });
77}
78
79function get(firebase, dispatch, queryOption) {
80 var meta = (0, _query.getQueryConfig)(queryOption);
81
82 var _ref = firebase._.config || {},
83 mergeOrdered = _ref.mergeOrdered,
84 mergeOrderedDocUpdates = _ref.mergeOrderedDocUpdates,
85 mergeOrderedCollectionUpdates = _ref.mergeOrderedCollectionUpdates;
86
87 return (0, _actions.wrapInDispatch)(dispatch, {
88 ref: (0, _query.firestoreRef)(firebase, meta),
89 method: 'get',
90 meta: meta,
91 types: [_constants.actionTypes.GET_REQUEST, {
92 type: _constants.actionTypes.GET_SUCCESS,
93 payload: function payload(snap) {
94 return {
95 data: (0, _query.dataByIdSnapshot)(snap),
96 ordered: (0, _query.orderedFromSnap)(snap)
97 };
98 },
99 merge: {
100 docs: mergeOrdered && mergeOrderedDocUpdates,
101 collections: mergeOrdered && mergeOrderedCollectionUpdates
102 }
103 }, _constants.actionTypes.GET_FAILURE]
104 });
105}
106
107function update(firebase, dispatch, queryOption) {
108 var meta = (0, _query.getQueryConfig)(queryOption);
109
110 for (var _len3 = arguments.length, args = new Array(_len3 > 3 ? _len3 - 3 : 0), _key3 = 3; _key3 < _len3; _key3++) {
111 args[_key3 - 3] = arguments[_key3];
112 }
113
114 return (0, _actions.wrapInDispatch)(dispatch, {
115 ref: (0, _query.firestoreRef)(firebase, meta),
116 method: 'update',
117 meta: meta,
118 args: args,
119 types: [_constants.actionTypes.UPDATE_REQUEST, _constants.actionTypes.UPDATE_SUCCESS, _constants.actionTypes.UPDATE_FAILURE]
120 });
121}
122
123function deleteRef(firebase, dispatch, queryOption) {
124 var meta = (0, _query.getQueryConfig)(queryOption);
125 var config = firebase._.config;
126
127 if (!meta.doc || meta.subcollections && !(0, _every2.default)(meta.subcollections, 'doc')) {
128 if (typeof config.onAttemptCollectionDelete === 'function') {
129 return config.onAttemptCollectionDelete(queryOption, dispatch, firebase);
130 }
131
132 return Promise.reject(new Error('Only documents can be deleted.'));
133 }
134
135 return (0, _actions.wrapInDispatch)(dispatch, {
136 ref: (0, _query.firestoreRef)(firebase, meta),
137 method: 'delete',
138 meta: meta,
139 types: [_constants.actionTypes.DELETE_REQUEST, {
140 type: _constants.actionTypes.DELETE_SUCCESS,
141 preserve: firebase._.config.preserveOnDelete
142 }, _constants.actionTypes.DELETE_FAILURE]
143 });
144}
145
146function setListener(firebase, dispatch, queryOpts, successCb, errorCb) {
147 var meta = (0, _query.getQueryConfig)(queryOpts);
148 var unsubscribe = (0, _query.firestoreRef)(firebase, meta).onSnapshot(function (docData) {
149 if (!meta.populates) {
150 (0, _query.dispatchListenerResponse)({
151 dispatch: dispatch,
152 docData: docData,
153 meta: meta,
154 firebase: firebase
155 });
156 if (typeof successCb === 'function') successCb(docData);
157 return;
158 }
159
160 (0, _query.getPopulateActions)({
161 firebase: firebase,
162 docData: docData,
163 meta: meta
164 }).then(function (populateActions) {
165 populateActions.forEach(function (populateAction) {
166 dispatch(_objectSpread({}, populateAction, {
167 type: _constants.actionTypes.LISTENER_RESPONSE,
168 timestamp: Date.now()
169 }));
170 });
171 (0, _query.dispatchListenerResponse)({
172 dispatch: dispatch,
173 docData: docData,
174 meta: meta,
175 firebase: firebase
176 });
177 }).catch(function (populateErr) {
178 var _ref2 = firebase._.config || {},
179 logListenerError = _ref2.logListenerError;
180
181 if (logListenerError !== false) {
182 if (logListenerError !== false && !!console && typeof console.error === 'function') {
183 console.error('redux-firestore error populating:', populateErr);
184 }
185 }
186
187 if (typeof errorCb === 'function') errorCb(populateErr);
188 });
189 }, function (err) {
190 var _ref3 = firebase._.config || {},
191 mergeOrdered = _ref3.mergeOrdered,
192 mergeOrderedDocUpdates = _ref3.mergeOrderedDocUpdates,
193 mergeOrderedCollectionUpdates = _ref3.mergeOrderedCollectionUpdates,
194 logListenerError = _ref3.logListenerError,
195 preserveOnListenerError = _ref3.preserveOnListenerError;
196
197 if (logListenerError !== false && !!console && typeof console.error === 'function') {
198 console.error('redux-firestore listener error:', err);
199 }
200
201 dispatch({
202 type: _constants.actionTypes.LISTENER_ERROR,
203 meta: meta,
204 payload: err,
205 merge: {
206 docs: mergeOrdered && mergeOrderedDocUpdates,
207 collections: mergeOrdered && mergeOrderedCollectionUpdates
208 },
209 preserve: preserveOnListenerError
210 });
211 if (typeof errorCb === 'function') errorCb(err);
212 });
213 (0, _query.attachListener)(firebase, dispatch, meta, unsubscribe);
214 return unsubscribe;
215}
216
217function setListeners(firebase, dispatch, listeners) {
218 if (!Array.isArray(listeners)) {
219 throw new Error('Listeners must be an Array of listener configs (Strings/Objects).');
220 }
221
222 var config = firebase._.config;
223
224 if (config.oneListenerPerPath) {
225 listeners.forEach(function (listener) {
226 var path = (0, _query.getQueryName)(listener);
227 var oldListenerCount = pathListenerCounts[path] || 0;
228 pathListenerCounts[path] = oldListenerCount + 1;
229
230 if (oldListenerCount > 0) {
231 return;
232 }
233
234 setListener(firebase, dispatch, listener);
235 });
236 } else {
237 var allowMultipleListeners = config.allowMultipleListeners;
238 listeners.forEach(function (listener) {
239 var path = (0, _query.getQueryName)(listener);
240 var oldListenerCount = pathListenerCounts[path] || 0;
241 var multipleListenersEnabled = typeof allowMultipleListeners === 'function' ? allowMultipleListeners(listener, firebase._.listeners) : allowMultipleListeners;
242 pathListenerCounts[path] = oldListenerCount + 1;
243
244 if (oldListenerCount === 0 || multipleListenersEnabled) {
245 setListener(firebase, dispatch, listener);
246 }
247 });
248 }
249}
250
251function unsetListener(firebase, dispatch, meta) {
252 return (0, _query.detachListener)(firebase, dispatch, (0, _query.getQueryConfig)(meta));
253}
254
255function unsetListeners(firebase, dispatch, listeners) {
256 if (!Array.isArray(listeners)) {
257 throw new Error('Listeners must be an Array of listener configs (Strings/Objects).');
258 }
259
260 var config = firebase._.config;
261 var allowMultipleListeners = config.allowMultipleListeners;
262 listeners.forEach(function (listener) {
263 var path = (0, _query.getQueryName)(listener);
264 var listenerExists = pathListenerCounts[path] >= 1;
265 var multipleListenersEnabled = typeof allowMultipleListeners === 'function' ? allowMultipleListeners(listener, firebase._.listeners) : allowMultipleListeners;
266
267 if (listenerExists) {
268 pathListenerCounts[path] -= 1;
269
270 if (pathListenerCounts[path] === 0 || multipleListenersEnabled) {
271 unsetListener(firebase, dispatch, listener);
272 }
273 }
274 });
275}
276
277function runTransaction(firebase, dispatch, transactionPromise) {
278 return (0, _actions.wrapInDispatch)(dispatch, {
279 ref: firebase.firestore(),
280 method: 'runTransaction',
281 args: [transactionPromise],
282 types: [_constants.actionTypes.TRANSACTION_START, _constants.actionTypes.TRANSACTION_SUCCESS, _constants.actionTypes.TRANSACTION_FAILURE]
283 });
284}
285
286var _default = {
287 get: get,
288 firestoreRef: _query.firestoreRef,
289 add: add,
290 update: update,
291 setListener: setListener,
292 setListeners: setListeners,
293 unsetListener: unsetListener,
294 unsetListeners: unsetListeners,
295 runTransaction: runTransaction
296};
297exports.default = _default;
\No newline at end of file