Skip to content

Commit

Permalink
fix(database): correctly name useObject & useObjectOnce
Browse files Browse the repository at this point in the history
  • Loading branch information
andipaetzold committed Oct 15, 2021
1 parent 359e98a commit 4c7b83e
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 42 deletions.
42 changes: 13 additions & 29 deletions src/database/useObject.ts
Original file line number Diff line number Diff line change
@@ -1,50 +1,34 @@
import { DataSnapshot, get, Query } from "firebase/database";
import { DataSnapshot, Query } from "firebase/database";
import { useEffect, useMemo } from "react";
import { ValueHookResult } from "../common";
import { useIsMounted } from "../util/useIsMounted";
import { useLoadingValue } from "../util/useLoadingValue";
import { useStableQuery } from "./internal";

export type UseObjectOnceResult = ValueHookResult<DataSnapshot, Error>;
export type UseObjectResult = ValueHookResult<DataSnapshot, Error>;

/**
* Returns and updates the DataSnapshot of the Realtime Database query
* Returns the DataSnapshot of the Realtime Database query
*
* @param {Query | undefined | null} query Realtime Database query
* @returns {UseObjectOnceResult} User, loading state, and error
* @returns {UseObjectResult} User, loading state, and error
* * value: DataSnapshot; `undefined` if query is currently being fetched, or an error occurred
* * loading: `true` while fetching the query; `false` if the query was fetched successfully or an error occurred
* * error: `undefined` if no error occurred
*/
export function useObjectOnce(query: Query | undefined | null): UseObjectOnceResult {
const isMounted = useIsMounted();
export function useObject(query: Query | undefined | null): UseObjectResult {
const { error, loading, setLoading, setError, setValue, value } = useLoadingValue<DataSnapshot, Error>();

const stableQuery = useStableQuery(query ?? undefined);

useEffect(() => {
(async () => {
if (stableQuery === undefined) {
setValue();
} else {
setLoading();

try {
const snap = await get(stableQuery);
if (!isMounted.current) {
return;
}

setValue(snap);
} catch (e) {
if (!isMounted.current) {
return;
}

setError(e as Error);
}
}
})();
if (stableQuery === undefined) {
setValue();
} else {
setLoading();

const unsubscribe = onValue(stableQuery, setValue, setError);
return () => unsubscribe();
}
}, [stableQuery]);

return useMemo(() => [value, loading, error], [value, loading, error]);
Expand Down
42 changes: 29 additions & 13 deletions src/database/useObjectOnce.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,50 @@
import { DataSnapshot, onValue, Query } from "firebase/database";
import { DataSnapshot, get, Query } from "firebase/database";
import { useEffect, useMemo } from "react";
import { ValueHookResult } from "../common";
import { useIsMounted } from "../util/useIsMounted";
import { useLoadingValue } from "../util/useLoadingValue";
import { useStableQuery } from "./internal";

export type UseObjectResult = ValueHookResult<DataSnapshot, Error>;
export type UseObjectOnceResult = ValueHookResult<DataSnapshot, Error>;

/**
* Returns the DataSnapshot of the Realtime Database query. Does not update the DataSnapshot once initially fetched
* Returns and updates the DataSnapshot of the Realtime Database query. Does not update the DataSnapshot once initially fetched
*
* @param {Query | undefined | null} query Realtime Database query
* @returns {UseObjectResult} User, loading state, and error
* @returns {UseObjectOnceResult} User, loading state, and error
* * value: DataSnapshot; `undefined` if query is currently being fetched, or an error occurred
* * loading: `true` while fetching the query; `false` if the query was fetched successfully or an error occurred
* * error: `undefined` if no error occurred
*/
export function useObject(query: Query | undefined | null): UseObjectResult {
export function useObjectOnce(query: Query | undefined | null): UseObjectOnceResult {
const isMounted = useIsMounted();
const { error, loading, setLoading, setError, setValue, value } = useLoadingValue<DataSnapshot, Error>();

const stableQuery = useStableQuery(query ?? undefined);

useEffect(() => {
if (stableQuery === undefined) {
setValue();
} else {
setLoading();

const unsubscribe = onValue(stableQuery, setValue, setError);
return () => unsubscribe();
}
(async () => {
if (stableQuery === undefined) {
setValue();
} else {
setLoading();

try {
const snap = await get(stableQuery);
if (!isMounted.current) {
return;
}

setValue(snap);
} catch (e) {
if (!isMounted.current) {
return;
}

setError(e as Error);
}
}
})();
}, [stableQuery]);

return useMemo(() => [value, loading, error], [value, loading, error]);
Expand Down

0 comments on commit 4c7b83e

Please sign in to comment.