UNPKG

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