reactfire 4.0.1 → 4.2.1

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.
@@ -12,7 +12,7 @@ export declare class SuspenseSubject<T> extends Subject<T> {
12
12
  private _resolveFirstEmission;
13
13
  constructor(innerObservable: Observable<T>, _timeoutWindow: number);
14
14
  get hasValue(): boolean;
15
- get value(): T | undefined;
15
+ get value(): T;
16
16
  get firstEmission(): Promise<void>;
17
17
  private _next;
18
18
  private _reset;
@@ -0,0 +1,12 @@
1
+ import { ReactFireOptions, ObservableStatus } from './';
2
+ import type { HttpsCallableOptions } from 'firebase/functions';
3
+ /**
4
+ * Calls a callable function.
5
+ *
6
+ * @param functionName - The name of the function to call
7
+ * @param options
8
+ */
9
+ export declare function useCallableFunctionResponse<RequestData, ResponseData>(functionName: string, options?: ReactFireOptions<ResponseData> & {
10
+ httpsCallableOptions?: HttpsCallableOptions;
11
+ data?: RequestData;
12
+ }): ObservableStatus<ResponseData>;
package/dist/index.d.ts CHANGED
@@ -28,6 +28,7 @@ export * from './auth';
28
28
  export * from './database';
29
29
  export * from './firebaseApp';
30
30
  export * from './firestore';
31
+ export * from './functions';
31
32
  export * from './performance';
32
33
  export * from './remote-config';
33
34
  export * from './storage';
@@ -10,6 +10,7 @@ var app = require('firebase/app');
10
10
  var database = require('rxfire/database');
11
11
  var firestore = require('rxfire/firestore');
12
12
  var firestore$1 = require('firebase/firestore');
13
+ var functions = require('rxfire/functions');
13
14
  var remoteConfig = require('rxfire/remote-config');
14
15
  var storage = require('rxfire/storage');
15
16
  var storage$1 = require('firebase/storage');
@@ -962,7 +963,7 @@ var DEFAULT_APP_NAME = '[DEFAULT]';
962
963
  var FirebaseAppContext = /*#__PURE__*/React.createContext(undefined);
963
964
  var SuspenseEnabledContext = /*#__PURE__*/React.createContext(false); // @ts-expect-error: "__REACTFIRE_VERSION__" is replaced with actual ReactFire version (see babel.config.js)
964
965
 
965
- var version = "4.0.1";
966
+ var version = "4.2.1";
966
967
 
967
968
  var shallowEq = function shallowEq(a, b) {
968
969
  return a === b || [].concat(Object.keys(a), Object.keys(b)).every(function (key) {
@@ -1442,6 +1443,8 @@ var SuspenseSubject = /*#__PURE__*/function (_Subject) {
1442
1443
  // As it is now, this will burn the cache entry until the timeout fires.
1443
1444
  if (this._error) {
1444
1445
  throw this._error;
1446
+ } else if (!this.hasValue) {
1447
+ throw Error('Can only get value if SuspenseSubject has a value');
1445
1448
  }
1446
1449
 
1447
1450
  return this._value;
@@ -1481,6 +1484,39 @@ function preloadObservable(source, id) {
1481
1484
  return observable;
1482
1485
  }
1483
1486
  }
1487
+
1488
+ function reducerFactory(observable) {
1489
+ return function reducer(state, action) {
1490
+ // always make sure these values are in sync with the observable
1491
+ var newState = _extends({}, state, {
1492
+ hasEmitted: state.hasEmitted || observable.hasValue,
1493
+ error: observable.ourError,
1494
+ firstValuePromise: observable.firstEmission
1495
+ });
1496
+
1497
+ if (observable.hasValue) {
1498
+ newState.data = observable.value;
1499
+ }
1500
+
1501
+ switch (action) {
1502
+ case 'value':
1503
+ newState.status = 'success';
1504
+ return newState;
1505
+
1506
+ case 'error':
1507
+ newState.status = 'error';
1508
+ return newState;
1509
+
1510
+ case 'complete':
1511
+ newState.isComplete = true;
1512
+ return newState;
1513
+
1514
+ default:
1515
+ throw new Error("invalid action \"" + action + "\"");
1516
+ }
1517
+ };
1518
+ }
1519
+
1484
1520
  function useObservable(observableId, source, config) {
1485
1521
  var _config$initialData, _config, _config2;
1486
1522
 
@@ -1488,71 +1524,52 @@ function useObservable(observableId, source, config) {
1488
1524
  config = {};
1489
1525
  }
1490
1526
 
1527
+ // Register the observable with the cache
1491
1528
  if (!observableId) {
1492
1529
  throw new Error('cannot call useObservable without an observableId');
1493
1530
  }
1494
1531
 
1495
- var observable = preloadObservable(source, observableId);
1532
+ var observable = preloadObservable(source, observableId); // Suspend if suspense is enabled and no initial data exists
1533
+
1496
1534
  var hasInitialData = config.hasOwnProperty('initialData') || config.hasOwnProperty('startWithValue');
1535
+ var hasData = observable.hasValue || hasInitialData;
1497
1536
  var suspenseEnabled = useSuspenseEnabledFromConfigAndContext(config.suspense);
1498
1537
 
1499
- if (suspenseEnabled === true && !observable.hasValue && ((_config$initialData = !((_config = config) != null && _config.initialData)) != null ? _config$initialData : !((_config2 = config) != null && _config2.startWithValue))) {
1538
+ if (suspenseEnabled === true && !hasData) {
1500
1539
  throw observable.firstEmission;
1501
1540
  }
1502
1541
 
1503
- var _React$useState = React.useState(function () {
1504
- var _config$initialData2;
1505
-
1506
- return observable.hasValue ? observable.value : (_config$initialData2 = config.initialData) != null ? _config$initialData2 : config.startWithValue;
1507
- }),
1508
- latest = _React$useState[0],
1509
- setValue = _React$useState[1];
1510
-
1511
- var _React$useState2 = React.useState(false),
1512
- isComplete = _React$useState2[0],
1513
- setIsComplete = _React$useState2[1];
1542
+ var initialState = {
1543
+ status: hasData ? 'success' : 'loading',
1544
+ hasEmitted: hasData,
1545
+ isComplete: false,
1546
+ data: observable.hasValue ? observable.value : (_config$initialData = (_config = config) == null ? void 0 : _config.initialData) != null ? _config$initialData : (_config2 = config) == null ? void 0 : _config2.startWithValue,
1547
+ error: observable.ourError,
1548
+ firstValuePromise: observable.firstEmission
1549
+ };
1514
1550
 
1515
- var _React$useState3 = React.useState(false),
1516
- hasError = _React$useState3[0],
1517
- setHasError = _React$useState3[1];
1551
+ var _React$useReducer = React.useReducer(reducerFactory(observable), initialState),
1552
+ status = _React$useReducer[0],
1553
+ dispatch = _React$useReducer[1];
1518
1554
 
1519
1555
  React.useEffect(function () {
1520
1556
  var subscription = observable.subscribe({
1521
- next: function next(v) {
1522
- setValue(function () {
1523
- return v;
1524
- });
1557
+ next: function next() {
1558
+ dispatch('value');
1525
1559
  },
1526
1560
  error: function error(e) {
1527
- setHasError(true);
1561
+ dispatch('error');
1528
1562
  throw e;
1529
1563
  },
1530
1564
  complete: function complete() {
1531
- setIsComplete(true);
1565
+ dispatch('complete');
1532
1566
  }
1533
1567
  });
1534
1568
  return function () {
1535
1569
  return subscription.unsubscribe();
1536
1570
  };
1537
1571
  }, [observable]);
1538
- var status;
1539
-
1540
- if (hasError) {
1541
- status = 'error';
1542
- } else if (observable.hasValue || hasInitialData) {
1543
- status = 'success';
1544
- } else {
1545
- status = 'loading';
1546
- }
1547
-
1548
- return {
1549
- status: status,
1550
- hasEmitted: observable.hasValue || hasInitialData,
1551
- isComplete: isComplete,
1552
- data: latest,
1553
- error: observable.ourError,
1554
- firstValuePromise: observable.firstEmission
1555
- };
1572
+ return status;
1556
1573
  }
1557
1574
 
1558
1575
  var cachedQueries$1 = globalThis._reactFireFirestoreQueryCache || [];
@@ -1677,6 +1694,21 @@ function useFirestoreCollectionData(query, options) {
1677
1694
  return useObservable(observableId, observable$, options);
1678
1695
  }
1679
1696
 
1697
+ /**
1698
+ * Calls a callable function.
1699
+ *
1700
+ * @param functionName - The name of the function to call
1701
+ * @param options
1702
+ */
1703
+
1704
+ function useCallableFunctionResponse(functionName, options) {
1705
+ var functions$1 = useFunctions();
1706
+ var observableId = "functions:callableResponse:" + functionName + ":" + JSON.stringify(options == null ? void 0 : options.data) + ":" + JSON.stringify(options == null ? void 0 : options.httpsCallableOptions);
1707
+ var obsFactory = functions.httpsCallable(functions$1, functionName, options == null ? void 0 : options.httpsCallableOptions);
1708
+ var observable$ = obsFactory(options == null ? void 0 : options.data);
1709
+ return useObservable(observableId, observable$, options);
1710
+ }
1711
+
1680
1712
  function SuspenseWithPerf(_ref) {
1681
1713
  var _performance;
1682
1714
 
@@ -1769,30 +1801,6 @@ function useRemoteConfigAll(key) {
1769
1801
  }
1770
1802
 
1771
1803
  var _excluded = ["storage", "storagePath", "suspense", "placeHolder"];
1772
- /**
1773
- * modified version of rxFire's _fromTask
1774
- *
1775
- * @param task
1776
- */
1777
-
1778
- function _fromTask(task) {
1779
- return new rxjs.Observable(function (subscriber) {
1780
- var progress = function progress(snap) {
1781
- return subscriber.next(snap);
1782
- };
1783
-
1784
- var error = function error(e) {
1785
- return subscriber.error(e);
1786
- };
1787
-
1788
- var complete = function complete() {
1789
- return subscriber.complete();
1790
- };
1791
-
1792
- task.on('state_changed', progress, error, complete); // I REMOVED THE UNSUBSCRIBE RETURN BECAUSE IT CANCELS THE UPLOAD
1793
- // https://github.com/firebase/firebase-js-sdk/issues/1659
1794
- });
1795
- }
1796
1804
  /**
1797
1805
  * Subscribe to the progress of a storage task
1798
1806
  *
@@ -1801,12 +1809,9 @@ function _fromTask(task) {
1801
1809
  * @param options
1802
1810
  */
1803
1811
 
1804
-
1805
1812
  function useStorageTask(task, ref, options) {
1806
1813
  var observableId = "storage:task:" + ref.toString();
1807
-
1808
- var observable$ = _fromTask(task);
1809
-
1814
+ var observable$ = storage.fromTask(task);
1810
1815
  return useObservable(observableId, observable$, options);
1811
1816
  }
1812
1817
  /**
@@ -1873,10 +1878,12 @@ function StorageImage(props) {
1873
1878
  }
1874
1879
  }
1875
1880
 
1881
+ var AppCheckSdkContext = /*#__PURE__*/React.createContext(undefined);
1876
1882
  var AuthSdkContext = /*#__PURE__*/React.createContext(undefined);
1877
1883
  var AnalyticsSdkContext = /*#__PURE__*/React.createContext(undefined);
1878
1884
  var DatabaseSdkContext = /*#__PURE__*/React.createContext(undefined);
1879
1885
  var FirestoreSdkContext = /*#__PURE__*/React.createContext(undefined);
1886
+ var FunctionsSdkContext = /*#__PURE__*/React.createContext(undefined);
1880
1887
  var StorageSdkContext = /*#__PURE__*/React.createContext(undefined);
1881
1888
  var PerformanceSdkContext = /*#__PURE__*/React.createContext(undefined);
1882
1889
  var RemoteConfigSdkContext = /*#__PURE__*/React.createContext(undefined);
@@ -1920,13 +1927,18 @@ function useInitSdk(sdkName, SdkContext, sdkInitializer, options) {
1920
1927
  return useObservable("firebase-sdk:" + sdkName + ":" + firebaseApp.name, rxjs.from(initializeSdk), options);
1921
1928
  }
1922
1929
 
1930
+ var AppCheckProvider = /*#__PURE__*/getSdkProvider(AppCheckSdkContext);
1923
1931
  var AuthProvider = /*#__PURE__*/getSdkProvider(AuthSdkContext);
1924
1932
  var AnalyticsProvider = /*#__PURE__*/getSdkProvider(AnalyticsSdkContext);
1925
1933
  var DatabaseProvider = /*#__PURE__*/getSdkProvider(DatabaseSdkContext);
1926
1934
  var FirestoreProvider = /*#__PURE__*/getSdkProvider(FirestoreSdkContext);
1935
+ var FunctionsProvider = /*#__PURE__*/getSdkProvider(FunctionsSdkContext);
1927
1936
  var PerformanceProvider = /*#__PURE__*/getSdkProvider(PerformanceSdkContext);
1928
1937
  var StorageProvider = /*#__PURE__*/getSdkProvider(StorageSdkContext);
1929
1938
  var RemoteConfigProvider = /*#__PURE__*/getSdkProvider(RemoteConfigSdkContext);
1939
+ var useAppCheck = function useAppCheck() {
1940
+ return useSdk(AppCheckSdkContext);
1941
+ };
1930
1942
  var useAuth = function useAuth() {
1931
1943
  return useSdk(AuthSdkContext);
1932
1944
  };
@@ -1939,6 +1951,9 @@ var useDatabase = function useDatabase() {
1939
1951
  var useFirestore = function useFirestore() {
1940
1952
  return useSdk(FirestoreSdkContext);
1941
1953
  };
1954
+ var useFunctions = function useFunctions() {
1955
+ return useSdk(FunctionsSdkContext);
1956
+ };
1942
1957
  var usePerformance = function usePerformance() {
1943
1958
  return useSdk(PerformanceSdkContext);
1944
1959
  };
@@ -1948,6 +1963,9 @@ var useStorage = function useStorage() {
1948
1963
  var useRemoteConfig = function useRemoteConfig() {
1949
1964
  return useSdk(RemoteConfigSdkContext);
1950
1965
  };
1966
+ var useInitAppCheck = function useInitAppCheck(initializer, options) {
1967
+ return useInitSdk('appcheck', AppCheckSdkContext, initializer, options);
1968
+ };
1951
1969
  var useInitAuth = function useInitAuth(initializer, options) {
1952
1970
  return useInitSdk('auth', AuthSdkContext, initializer, options);
1953
1971
  };
@@ -1960,6 +1978,9 @@ var useInitDatabase = function useInitDatabase(initializer, options) {
1960
1978
  var useInitFirestore = function useInitFirestore(initializer, options) {
1961
1979
  return useInitSdk('firestore', FirestoreSdkContext, initializer, options);
1962
1980
  };
1981
+ var useInitFunctions = function useInitFunctions(initializer, options) {
1982
+ return useInitSdk('functions', FunctionsSdkContext, initializer, options);
1983
+ };
1963
1984
  var useInitPerformance = function useInitPerformance(initializer, options) {
1964
1985
  return useInitSdk('performance', PerformanceSdkContext, initializer, options);
1965
1986
  };
@@ -2006,17 +2027,28 @@ function checkIdField(options) {
2006
2027
  }
2007
2028
 
2008
2029
  exports.AnalyticsProvider = AnalyticsProvider;
2030
+ exports.AnalyticsSdkContext = AnalyticsSdkContext;
2031
+ exports.AppCheckProvider = AppCheckProvider;
2032
+ exports.AppCheckSdkContext = AppCheckSdkContext;
2009
2033
  exports.AuthCheck = AuthCheck;
2010
2034
  exports.AuthProvider = AuthProvider;
2035
+ exports.AuthSdkContext = AuthSdkContext;
2011
2036
  exports.ClaimsCheck = ClaimsCheck;
2012
2037
  exports.DatabaseProvider = DatabaseProvider;
2038
+ exports.DatabaseSdkContext = DatabaseSdkContext;
2013
2039
  exports.FirebaseAppProvider = FirebaseAppProvider;
2014
2040
  exports.FirestoreProvider = FirestoreProvider;
2041
+ exports.FirestoreSdkContext = FirestoreSdkContext;
2042
+ exports.FunctionsProvider = FunctionsProvider;
2043
+ exports.FunctionsSdkContext = FunctionsSdkContext;
2015
2044
  exports.PerformanceProvider = PerformanceProvider;
2045
+ exports.PerformanceSdkContext = PerformanceSdkContext;
2016
2046
  exports.ReactFireError = ReactFireError;
2017
2047
  exports.RemoteConfigProvider = RemoteConfigProvider;
2048
+ exports.RemoteConfigSdkContext = RemoteConfigSdkContext;
2018
2049
  exports.StorageImage = StorageImage;
2019
2050
  exports.StorageProvider = StorageProvider;
2051
+ exports.StorageSdkContext = StorageSdkContext;
2020
2052
  exports.SuspenseWithPerf = SuspenseWithPerf;
2021
2053
  exports.checkIdField = checkIdField;
2022
2054
  exports.checkOptions = checkOptions;
@@ -2025,7 +2057,9 @@ exports.preloadFirestoreDoc = preloadFirestoreDoc;
2025
2057
  exports.preloadObservable = preloadObservable;
2026
2058
  exports.preloadUser = preloadUser;
2027
2059
  exports.useAnalytics = useAnalytics;
2060
+ exports.useAppCheck = useAppCheck;
2028
2061
  exports.useAuth = useAuth;
2062
+ exports.useCallableFunctionResponse = useCallableFunctionResponse;
2029
2063
  exports.useDatabase = useDatabase;
2030
2064
  exports.useDatabaseList = useDatabaseList;
2031
2065
  exports.useDatabaseListData = useDatabaseListData;
@@ -2039,11 +2073,14 @@ exports.useFirestoreDoc = useFirestoreDoc;
2039
2073
  exports.useFirestoreDocData = useFirestoreDocData;
2040
2074
  exports.useFirestoreDocDataOnce = useFirestoreDocDataOnce;
2041
2075
  exports.useFirestoreDocOnce = useFirestoreDocOnce;
2076
+ exports.useFunctions = useFunctions;
2042
2077
  exports.useIdTokenResult = useIdTokenResult;
2043
2078
  exports.useInitAnalytics = useInitAnalytics;
2079
+ exports.useInitAppCheck = useInitAppCheck;
2044
2080
  exports.useInitAuth = useInitAuth;
2045
2081
  exports.useInitDatabase = useInitDatabase;
2046
2082
  exports.useInitFirestore = useInitFirestore;
2083
+ exports.useInitFunctions = useInitFunctions;
2047
2084
  exports.useInitPerformance = useInitPerformance;
2048
2085
  exports.useInitRemoteConfig = useInitRemoteConfig;
2049
2086
  exports.useInitStorage = useInitStorage;