react-firebase-ql 2.3.0 → 4.0.0

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.
@@ -0,0 +1,12 @@
1
+ import { ReactNode, Context } from 'react';
2
+ import { Auth, User } from 'firebase/auth';
3
+ interface AUTHSTATE {
4
+ FBUser?: User;
5
+ }
6
+ export declare const AUTHContext: Context<AUTHSTATE>;
7
+ type AUTHProviderProps = {
8
+ children: ReactNode;
9
+ auth: Auth;
10
+ };
11
+ export declare const AUTHProvider: ({ children, auth }: AUTHProviderProps) => import("react/jsx-runtime").JSX.Element;
12
+ export {};
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AUTHProvider = exports.AUTHContext = void 0;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const auth_1 = require("firebase/auth");
8
+ const firebase_client_ql_1 = require("firebase-client-ql");
9
+ var AUTHACTIONTYPE;
10
+ (function (AUTHACTIONTYPE) {
11
+ AUTHACTIONTYPE["SETFBUSER"] = "SETFBUSER";
12
+ })(AUTHACTIONTYPE || (AUTHACTIONTYPE = {}));
13
+ const initialAUTHState = {};
14
+ const AUTHReducer = (state, action) => {
15
+ const { type, payload } = action;
16
+ switch (type) {
17
+ case 'SETFBUSER':
18
+ return { ...state, FBUser: payload };
19
+ default:
20
+ return state;
21
+ }
22
+ };
23
+ const initialDispatch = () => { };
24
+ exports.AUTHContext = (0, react_1.createContext)(initialAUTHState);
25
+ const AUTHDispatch = (0, react_1.createContext)(initialDispatch);
26
+ const AUTHProvider = ({ children, auth }) => {
27
+ const [AUTHState, dispatch] = (0, react_1.useReducer)(AUTHReducer, initialAUTHState);
28
+ (0, react_1.useEffect)(() => {
29
+ const unsubscribe = (0, auth_1.onAuthStateChanged)(auth, (authUser) => {
30
+ try {
31
+ dispatch({
32
+ type: AUTHACTIONTYPE.SETFBUSER,
33
+ payload: authUser !== null && authUser !== void 0 ? authUser : undefined,
34
+ });
35
+ }
36
+ catch (error) {
37
+ (0, firebase_client_ql_1.errorLogger)('User Authentication error:', error);
38
+ }
39
+ });
40
+ return unsubscribe;
41
+ }, [auth]);
42
+ return ((0, jsx_runtime_1.jsx)(exports.AUTHContext.Provider, { value: AUTHState, children: (0, jsx_runtime_1.jsx)(AUTHDispatch.Provider, { value: dispatch, children: children }) }));
43
+ };
44
+ exports.AUTHProvider = AUTHProvider;
45
+ //# sourceMappingURL=AuthProvider.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthProvider.provider.js","sourceRoot":"","sources":["../../../src/client/providers/AuthProvider.provider.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;AAEb,iCAOe;AAEf,wCAA+D;AAC/D,2DAAiD;AAEjD,IAAK,cAEJ;AAFD,WAAK,cAAc;IACf,yCAAuB,CAAA;AAC3B,CAAC,EAFI,cAAc,KAAd,cAAc,QAElB;AAgBD,MAAM,gBAAgB,GAAc,EAAE,CAAA;AAEtC,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAE,MAAkB,EAAa,EAAE;IAEpE,MAAM,EAAC,IAAI,EAAE,OAAO,EAAC,GAAG,MAAM,CAAA;IAE9B,QAAQ,IAAI,EAAE,CAAC;QAEX,KAAK,WAAW;YACZ,OAAO,EAAC,GAAG,KAAK,EAAE,MAAM,EAAE,OAAe,EAAE,CAAA;QAE/C;YACI,OAAO,KAAK,CAAA;IACpB,CAAC;AACL,CAAC,CAAA;AAGD,MAAM,eAAe,GAAyB,GAAG,EAAE,GAAE,CAAC,CAAC;AAE1C,QAAA,WAAW,GACtB,IAAA,qBAAa,EAAC,gBAAgB,CAAC,CAAC;AAElC,MAAM,YAAY,GAChB,IAAA,qBAAa,EAAC,eAAe,CAAC,CAAC;AAO1B,MAAM,YAAY,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAqB,EAAE,EAAE;IACpE,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,IAAA,kBAAU,EACtC,WAAW,EACX,gBAAgB,CACjB,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,IAAA,yBAAkB,EACpC,IAAI,EACJ,CAAC,QAAqB,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,QAAQ,CAAC;oBACP,IAAI,EAAE,cAAc,CAAC,SAAS;oBAC9B,OAAO,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,SAAS;iBAC/B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAA,gCAAW,EAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CACF,CAAC;QAEF,OAAO,WAAW,CAAC;IACrB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,CACL,uBAAC,mBAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,SAAS,YACpC,uBAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ,YACnC,QAAQ,GACa,GACH,CACxB,CAAC;AACJ,CAAC,CAAC;AA/BW,QAAA,YAAY,gBA+BvB"}
@@ -1,6 +1,11 @@
1
1
  import { BaseModel, whereClause } from 'firebase-client-ql';
2
+ type UseStreamResult<T> = {
3
+ data: T[];
4
+ loading: boolean;
5
+ error: unknown;
6
+ };
2
7
  export declare const useStream: <T extends BaseModel>(param: {
3
- model: T | any;
8
+ model: any;
4
9
  where?: whereClause[];
5
10
  reference?: string;
6
11
  filter?: {
@@ -10,4 +15,5 @@ export declare const useStream: <T extends BaseModel>(param: {
10
15
  };
11
16
  offset?: string;
12
17
  };
13
- }, callback: (data: any) => void) => void;
18
+ }) => UseStreamResult<T>;
19
+ export {};
@@ -4,40 +4,48 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.useStream = void 0;
5
5
  const firebase_client_ql_1 = require("firebase-client-ql");
6
6
  const react_1 = require("react");
7
- const useStream = (param, callback) => {
7
+ const useStream = (param) => {
8
+ const [data, setData] = (0, react_1.useState)([]);
9
+ const [loading, setLoading] = (0, react_1.useState)(true);
10
+ const [error, setError] = (0, react_1.useState)(null);
8
11
  (0, react_1.useEffect)(() => {
9
12
  let unsubscribe;
13
+ setLoading(true);
10
14
  try {
11
15
  const { model, reference, where, filter } = param;
12
16
  if (reference) {
13
- unsubscribe = model.stream((data) => {
14
- if (data)
15
- callback(data);
17
+ unsubscribe = model.stream((result) => {
18
+ setData(result !== null && result !== void 0 ? result : []);
19
+ setLoading(false);
16
20
  }, reference);
17
21
  }
18
22
  else if (where) {
19
- if (where.length > 0) {
20
- const allInvalid = where.every((item) => item.value === undefined);
21
- if (allInvalid) {
22
- callback([]);
23
- return;
24
- }
23
+ if (where.length > 0 && where.every(w => w.value === undefined)) {
24
+ setData([]);
25
+ setLoading(false);
26
+ return;
25
27
  }
26
- unsubscribe = model.streamWhere(where, (data) => {
27
- if (data)
28
- callback(data);
28
+ unsubscribe = model.streamWhere(where, (result) => {
29
+ setData(result !== null && result !== void 0 ? result : []);
30
+ setLoading(false);
29
31
  }, 100, filter === null || filter === void 0 ? void 0 : filter.orderBy, filter === null || filter === void 0 ? void 0 : filter.offset);
30
32
  }
31
33
  }
32
- catch (error) {
33
- (0, firebase_client_ql_1.errorLogger)('useStream error:', error);
34
+ catch (err) {
35
+ (0, firebase_client_ql_1.errorLogger)('useStream error:', err);
36
+ setError(err);
37
+ setLoading(false);
34
38
  }
35
39
  return () => {
36
- if (typeof unsubscribe === 'function') {
40
+ if (typeof unsubscribe === 'function')
37
41
  unsubscribe();
38
- }
39
42
  };
40
- }, [JSON.stringify(param.where), JSON.stringify(param.filter), param.reference]);
43
+ }, [
44
+ JSON.stringify(param.where),
45
+ JSON.stringify(param.filter),
46
+ param.reference,
47
+ ]);
48
+ return { data, loading, error };
41
49
  };
42
50
  exports.useStream = useStream;
43
51
  //# sourceMappingURL=useStream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStream.js","sourceRoot":"","sources":["../../src/client/useStream.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;AAEb,2DAAyE;AACzE,iCAAkC;AAG3B,MAAM,SAAS,GAAG,CACvB,KAQC,EACD,QAA6B,EACvB,EAAE;IAER,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,WAAqC,CAAC;QAE1C,IAAI,CAAC;YACH,MAAM,EAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YAEjD,IAAI,SAAS,EAAE,CAAC;gBACd,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE;oBACvC,IAAI,IAAI;wBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC,EAAE,SAAS,CAAC,CAAC;YAChB,CAAC;iBAAM,IAAI,KAAK,EAAE,CAAC;gBACjB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;oBACnE,IAAI,UAAU,EAAE,CAAC;wBACf,QAAQ,CAAC,EAAE,CAAC,CAAC;wBACb,OAAO;oBACT,CAAC;gBACL,CAAC;gBACD,WAAW,GAAG,KAAK,CAAC,WAAW,CAC7B,KAAK,EACL,CAAC,IAAS,EAAE,EAAE;oBACZ,IAAI,IAAI;wBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC,EACD,GAAG,EACH,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EACf,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CACf,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,gCAAW,EAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAGD,OAAO,GAAG,EAAE;YACV,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE,CAAC;gBACtC,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AACnF,CAAC,CAAC;AApDW,QAAA,SAAS,aAoDpB"}
1
+ {"version":3,"file":"useStream.js","sourceRoot":"","sources":["../../src/client/useStream.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;AAEb,2DAAyE;AACzE,iCAA4C;AAQrC,MAAM,SAAS,GAAG,CACvB,KAQC,EACmB,EAAE;IACtB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAM,EAAE,CAAC,CAAC;IAC1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAU,IAAI,CAAC,CAAC;IAElD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,WAAqC,CAAC;QAC1C,UAAU,CAAC,IAAI,CAAC,CAAC;QAEjB,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YAElD,IAAI,SAAS,EAAE,CAAC;gBACd,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAW,EAAE,EAAE;oBACzC,OAAO,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;oBACtB,UAAU,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC,EAAE,SAAS,CAAC,CAAC;YAChB,CAAC;iBACI,IAAI,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;oBAChE,OAAO,CAAC,EAAE,CAAC,CAAC;oBACZ,UAAU,CAAC,KAAK,CAAC,CAAC;oBAClB,OAAO;gBACT,CAAC;gBAED,WAAW,GAAG,KAAK,CAAC,WAAW,CAC7B,KAAK,EACL,CAAC,MAAW,EAAE,EAAE;oBACd,OAAO,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;oBACtB,UAAU,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC,EACD,GAAG,EACH,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EACf,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CACf,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,gCAAW,EAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;YACrC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACd,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,GAAG,EAAE;YACV,IAAI,OAAO,WAAW,KAAK,UAAU;gBAAE,WAAW,EAAE,CAAC;QACvD,CAAC,CAAC;IACJ,CAAC,EAAE;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;QAC5B,KAAK,CAAC,SAAS;KAChB,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC,CAAC;AA9DW,QAAA,SAAS,aA8DpB"}
@@ -0,0 +1,41 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useReducer, createContext, useEffect, } from 'react';
4
+ import { onAuthStateChanged } from 'firebase/auth';
5
+ import { errorLogger } from 'firebase-client-ql';
6
+ var AUTHACTIONTYPE;
7
+ (function (AUTHACTIONTYPE) {
8
+ AUTHACTIONTYPE["SETFBUSER"] = "SETFBUSER";
9
+ })(AUTHACTIONTYPE || (AUTHACTIONTYPE = {}));
10
+ const initialAUTHState = {};
11
+ const AUTHReducer = (state, action) => {
12
+ const { type, payload } = action;
13
+ switch (type) {
14
+ case 'SETFBUSER':
15
+ return { ...state, FBUser: payload };
16
+ default:
17
+ return state;
18
+ }
19
+ };
20
+ const initialDispatch = () => { };
21
+ export const AUTHContext = createContext(initialAUTHState);
22
+ const AUTHDispatch = createContext(initialDispatch);
23
+ export const AUTHProvider = ({ children, auth }) => {
24
+ const [AUTHState, dispatch] = useReducer(AUTHReducer, initialAUTHState);
25
+ useEffect(() => {
26
+ const unsubscribe = onAuthStateChanged(auth, (authUser) => {
27
+ try {
28
+ dispatch({
29
+ type: AUTHACTIONTYPE.SETFBUSER,
30
+ payload: authUser !== null && authUser !== void 0 ? authUser : undefined,
31
+ });
32
+ }
33
+ catch (error) {
34
+ errorLogger('User Authentication error:', error);
35
+ }
36
+ });
37
+ return unsubscribe;
38
+ }, [auth]);
39
+ return (_jsx(AUTHContext.Provider, { value: AUTHState, children: _jsx(AUTHDispatch.Provider, { value: dispatch, children: children }) }));
40
+ };
41
+ //# sourceMappingURL=AuthProvider.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthProvider.provider.js","sourceRoot":"","sources":["../../../src/client/providers/AuthProvider.provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAGL,UAAU,EAEV,aAAa,EACb,SAAS,GACV,MAAM,OAAO,CAAC;AAEf,OAAO,EAAc,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,IAAK,cAEJ;AAFD,WAAK,cAAc;IACf,yCAAuB,CAAA;AAC3B,CAAC,EAFI,cAAc,KAAd,cAAc,QAElB;AAgBD,MAAM,gBAAgB,GAAc,EAAE,CAAA;AAEtC,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAE,MAAkB,EAAa,EAAE;IAEpE,MAAM,EAAC,IAAI,EAAE,OAAO,EAAC,GAAG,MAAM,CAAA;IAE9B,QAAQ,IAAI,EAAE,CAAC;QAEX,KAAK,WAAW;YACZ,OAAO,EAAC,GAAG,KAAK,EAAE,MAAM,EAAE,OAAe,EAAE,CAAA;QAE/C;YACI,OAAO,KAAK,CAAA;IACpB,CAAC;AACL,CAAC,CAAA;AAGD,MAAM,eAAe,GAAyB,GAAG,EAAE,GAAE,CAAC,CAAC;AAEvD,MAAM,CAAC,MAAM,WAAW,GACtB,aAAa,CAAC,gBAAgB,CAAC,CAAC;AAElC,MAAM,YAAY,GAChB,aAAa,CAAC,eAAe,CAAC,CAAC;AAOjC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAqB,EAAE,EAAE;IACpE,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,UAAU,CACtC,WAAW,EACX,gBAAgB,CACjB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,kBAAkB,CACpC,IAAI,EACJ,CAAC,QAAqB,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,QAAQ,CAAC;oBACP,IAAI,EAAE,cAAc,CAAC,SAAS;oBAC9B,OAAO,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,SAAS;iBAC/B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,WAAW,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CACF,CAAC;QAEF,OAAO,WAAW,CAAC;IACrB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,CACL,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,SAAS,YACpC,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ,YACnC,QAAQ,GACa,GACH,CACxB,CAAC;AACJ,CAAC,CAAC"}
@@ -1,39 +1,47 @@
1
1
  'use client';
2
2
  import { errorLogger } from 'firebase-client-ql';
3
- import { useEffect } from 'react';
4
- export const useStream = (param, callback) => {
3
+ import { useEffect, useState } from 'react';
4
+ export const useStream = (param) => {
5
+ const [data, setData] = useState([]);
6
+ const [loading, setLoading] = useState(true);
7
+ const [error, setError] = useState(null);
5
8
  useEffect(() => {
6
9
  let unsubscribe;
10
+ setLoading(true);
7
11
  try {
8
12
  const { model, reference, where, filter } = param;
9
13
  if (reference) {
10
- unsubscribe = model.stream((data) => {
11
- if (data)
12
- callback(data);
14
+ unsubscribe = model.stream((result) => {
15
+ setData(result !== null && result !== void 0 ? result : []);
16
+ setLoading(false);
13
17
  }, reference);
14
18
  }
15
19
  else if (where) {
16
- if (where.length > 0) {
17
- const allInvalid = where.every((item) => item.value === undefined);
18
- if (allInvalid) {
19
- callback([]);
20
- return;
21
- }
20
+ if (where.length > 0 && where.every(w => w.value === undefined)) {
21
+ setData([]);
22
+ setLoading(false);
23
+ return;
22
24
  }
23
- unsubscribe = model.streamWhere(where, (data) => {
24
- if (data)
25
- callback(data);
25
+ unsubscribe = model.streamWhere(where, (result) => {
26
+ setData(result !== null && result !== void 0 ? result : []);
27
+ setLoading(false);
26
28
  }, 100, filter === null || filter === void 0 ? void 0 : filter.orderBy, filter === null || filter === void 0 ? void 0 : filter.offset);
27
29
  }
28
30
  }
29
- catch (error) {
30
- errorLogger('useStream error:', error);
31
+ catch (err) {
32
+ errorLogger('useStream error:', err);
33
+ setError(err);
34
+ setLoading(false);
31
35
  }
32
36
  return () => {
33
- if (typeof unsubscribe === 'function') {
37
+ if (typeof unsubscribe === 'function')
34
38
  unsubscribe();
35
- }
36
39
  };
37
- }, [JSON.stringify(param.where), JSON.stringify(param.filter), param.reference]);
40
+ }, [
41
+ JSON.stringify(param.where),
42
+ JSON.stringify(param.filter),
43
+ param.reference,
44
+ ]);
45
+ return { data, loading, error };
38
46
  };
39
47
  //# sourceMappingURL=useStream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStream.js","sourceRoot":"","sources":["../../src/client/useStream.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAa,WAAW,EAAe,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlC,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,KAQC,EACD,QAA6B,EACvB,EAAE;IAER,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAqC,CAAC;QAE1C,IAAI,CAAC;YACH,MAAM,EAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YAEjD,IAAI,SAAS,EAAE,CAAC;gBACd,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE;oBACvC,IAAI,IAAI;wBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC,EAAE,SAAS,CAAC,CAAC;YAChB,CAAC;iBAAM,IAAI,KAAK,EAAE,CAAC;gBACjB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;oBACnE,IAAI,UAAU,EAAE,CAAC;wBACf,QAAQ,CAAC,EAAE,CAAC,CAAC;wBACb,OAAO;oBACT,CAAC;gBACL,CAAC;gBACD,WAAW,GAAG,KAAK,CAAC,WAAW,CAC7B,KAAK,EACL,CAAC,IAAS,EAAE,EAAE;oBACZ,IAAI,IAAI;wBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC,EACD,GAAG,EACH,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EACf,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CACf,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAGD,OAAO,GAAG,EAAE;YACV,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE,CAAC;gBACtC,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AACnF,CAAC,CAAC"}
1
+ {"version":3,"file":"useStream.js","sourceRoot":"","sources":["../../src/client/useStream.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAa,WAAW,EAAe,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQ5C,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,KAQC,EACmB,EAAE;IACtB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAM,EAAE,CAAC,CAAC;IAC1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAU,IAAI,CAAC,CAAC;IAElD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAqC,CAAC;QAC1C,UAAU,CAAC,IAAI,CAAC,CAAC;QAEjB,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YAElD,IAAI,SAAS,EAAE,CAAC;gBACd,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAW,EAAE,EAAE;oBACzC,OAAO,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;oBACtB,UAAU,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC,EAAE,SAAS,CAAC,CAAC;YAChB,CAAC;iBACI,IAAI,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;oBAChE,OAAO,CAAC,EAAE,CAAC,CAAC;oBACZ,UAAU,CAAC,KAAK,CAAC,CAAC;oBAClB,OAAO;gBACT,CAAC;gBAED,WAAW,GAAG,KAAK,CAAC,WAAW,CAC7B,KAAK,EACL,CAAC,MAAW,EAAE,EAAE;oBACd,OAAO,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;oBACtB,UAAU,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC,EACD,GAAG,EACH,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,EACf,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CACf,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;YACrC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACd,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,GAAG,EAAE;YACV,IAAI,OAAO,WAAW,KAAK,UAAU;gBAAE,WAAW,EAAE,CAAC;QACvD,CAAC,CAAC;IACJ,CAAC,EAAE;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;QAC5B,KAAK,CAAC,SAAS;KAChB,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-firebase-ql",
3
- "version": "2.3.0",
3
+ "version": "4.0.0",
4
4
  "description": "A React helper library that simplifies using Firebase with side effects and live queries.",
5
5
  "main": "dist/index.js",
6
6
  "module": "esm/index.js",
@@ -0,0 +1,94 @@
1
+ 'use client';
2
+
3
+ import {
4
+ Dispatch,
5
+ ReactNode,
6
+ useReducer,
7
+ Context,
8
+ createContext,
9
+ useEffect,
10
+ } from 'react';
11
+
12
+ import { Auth, User, onAuthStateChanged } from 'firebase/auth';
13
+ import { errorLogger } from 'firebase-client-ql';
14
+
15
+ enum AUTHACTIONTYPE {
16
+ SETFBUSER = "SETFBUSER",
17
+ }
18
+
19
+ /**
20
+ * AUTH state maintained accross
21
+ * all components
22
+ */
23
+ interface AUTHSTATE {
24
+ FBUser?: User
25
+ }
26
+
27
+ interface AUTHACTION {
28
+ type: AUTHACTIONTYPE,
29
+ payload: User | undefined
30
+ }
31
+
32
+
33
+ const initialAUTHState: AUTHSTATE = {}
34
+
35
+ const AUTHReducer = (state: AUTHSTATE, action: AUTHACTION): AUTHSTATE => {
36
+
37
+ const {type, payload} = action
38
+
39
+ switch (type) {
40
+
41
+ case 'SETFBUSER':
42
+ return {...state, FBUser: payload as User }
43
+
44
+ default:
45
+ return state
46
+ }
47
+ }
48
+
49
+
50
+ const initialDispatch: Dispatch<AUTHACTION> = () => {};
51
+
52
+ export const AUTHContext: Context<AUTHSTATE> =
53
+ createContext(initialAUTHState);
54
+
55
+ const AUTHDispatch: Context<Dispatch<AUTHACTION>> =
56
+ createContext(initialDispatch);
57
+
58
+ type AUTHProviderProps = {
59
+ children: ReactNode;
60
+ auth: Auth;
61
+ };
62
+
63
+ export const AUTHProvider = ({ children, auth }: AUTHProviderProps) => {
64
+ const [AUTHState, dispatch] = useReducer(
65
+ AUTHReducer,
66
+ initialAUTHState
67
+ );
68
+
69
+ useEffect(() => {
70
+ const unsubscribe = onAuthStateChanged(
71
+ auth,
72
+ (authUser: User | null) => {
73
+ try {
74
+ dispatch({
75
+ type: AUTHACTIONTYPE.SETFBUSER,
76
+ payload: authUser ?? undefined,
77
+ });
78
+ } catch (error) {
79
+ errorLogger('User Authentication error:', error);
80
+ }
81
+ }
82
+ );
83
+
84
+ return unsubscribe;
85
+ }, [auth]);
86
+
87
+ return (
88
+ <AUTHContext.Provider value={AUTHState}>
89
+ <AUTHDispatch.Provider value={dispatch}>
90
+ {children}
91
+ </AUTHDispatch.Provider>
92
+ </AUTHContext.Provider>
93
+ );
94
+ };
@@ -1,59 +1,74 @@
1
1
  'use client';
2
2
 
3
3
  import { BaseModel, errorLogger, whereClause } from 'firebase-client-ql';
4
- import { useEffect } from 'react';
4
+ import { useEffect, useState } from 'react';
5
5
 
6
+ type UseStreamResult<T> = {
7
+ data: T[];
8
+ loading: boolean;
9
+ error: unknown;
10
+ };
6
11
 
7
12
  export const useStream = <T extends BaseModel>(
8
13
  param: {
9
- model: T | any;
14
+ model: any;
10
15
  where?: whereClause[];
11
16
  reference?: string;
12
17
  filter?: {
13
18
  orderBy?: { parameter: string; direction?: 'asc' | 'desc' };
14
19
  offset?: string;
15
20
  };
16
- },
17
- callback: (data: any) => void
18
- ): void => {
21
+ }
22
+ ): UseStreamResult<T> => {
23
+ const [data, setData] = useState<T[]>([]);
24
+ const [loading, setLoading] = useState(true);
25
+ const [error, setError] = useState<unknown>(null);
19
26
 
20
27
  useEffect(() => {
21
28
  let unsubscribe: (() => void) | undefined;
29
+ setLoading(true);
22
30
 
23
31
  try {
24
- const {model, reference, where, filter } = param;
32
+ const { model, reference, where, filter } = param;
25
33
 
26
34
  if (reference) {
27
- unsubscribe = model.stream((data: any) => {
28
- if (data) callback(data);
35
+ unsubscribe = model.stream((result: T[]) => {
36
+ setData(result ?? []);
37
+ setLoading(false);
29
38
  }, reference);
30
- } else if (where) {
31
- if (where.length > 0) {
32
- const allInvalid = where.every((item) => item.value === undefined);
33
- if (allInvalid) {
34
- callback([]);
35
- return;
36
- }
39
+ }
40
+ else if (where) {
41
+ if (where.length > 0 && where.every(w => w.value === undefined)) {
42
+ setData([]);
43
+ setLoading(false);
44
+ return;
37
45
  }
46
+
38
47
  unsubscribe = model.streamWhere(
39
48
  where,
40
- (data: any) => {
41
- if (data) callback(data);
49
+ (result: T[]) => {
50
+ setData(result ?? []);
51
+ setLoading(false);
42
52
  },
43
53
  100,
44
54
  filter?.orderBy,
45
55
  filter?.offset
46
56
  );
47
57
  }
48
- } catch (error) {
49
- errorLogger('useStream error:', error);
58
+ } catch (err) {
59
+ errorLogger('useStream error:', err);
60
+ setError(err);
61
+ setLoading(false);
50
62
  }
51
63
 
52
- // Proper cleanup
53
64
  return () => {
54
- if (typeof unsubscribe === 'function') {
55
- unsubscribe();
56
- }
65
+ if (typeof unsubscribe === 'function') unsubscribe();
57
66
  };
58
- }, [JSON.stringify(param.where), JSON.stringify(param.filter), param.reference]);
67
+ }, [
68
+ JSON.stringify(param.where),
69
+ JSON.stringify(param.filter),
70
+ param.reference,
71
+ ]);
72
+
73
+ return { data, loading, error };
59
74
  };