Changeset View
Changeset View
Standalone View
Standalone View
lib/handlers/db-ops-handler.react.js
// @flow | // @flow | ||||
import * as React from 'react'; | import * as React from 'react'; | ||||
import { opsProcessingFinishedActionType } from '../actions/db-ops-actions.js'; | import { opsProcessingFinishedActionType } from '../actions/db-ops-actions.js'; | ||||
import type { DBOpsEntry } from '../types/db-ops-types.js'; | |||||
import type { StoreOperations } from '../types/store-ops-types.js'; | |||||
import { useDispatch, useSelector } from '../utils/redux-utils.js'; | import { useDispatch, useSelector } from '../utils/redux-utils.js'; | ||||
function DBOpsHandler(): React.Node { | type Props = { | ||||
+processDBStoreOperations: StoreOperations => Promise<mixed>, | |||||
}; | |||||
function DBOpsHandler(props: Props): React.Node { | |||||
const { processDBStoreOperations } = props; | |||||
const queueFront = useSelector(state => state.dbOpsStore.queuedOps[0]); | const queueFront = useSelector(state => state.dbOpsStore.queuedOps[0]); | ||||
const prevQueueFront = React.useRef<?DBOpsEntry>(null); | |||||
const dispatch = useDispatch(); | const dispatch = useDispatch(); | ||||
React.useEffect(() => { | React.useEffect(() => { | ||||
if (!queueFront) { | if (!queueFront || prevQueueFront.current === queueFront) { | ||||
return; | return; | ||||
} | } | ||||
if (!queueFront.ops) { | prevQueueFront.current = queueFront; | ||||
const ops = queueFront.ops; | |||||
void (async () => { | |||||
if (ops) { | |||||
await processDBStoreOperations(ops); | |||||
} | |||||
dispatch({ | dispatch({ | ||||
type: opsProcessingFinishedActionType, | type: opsProcessingFinishedActionType, | ||||
}); | }); | ||||
} | })(); | ||||
}, [queueFront, dispatch]); | }, [queueFront, dispatch, processDBStoreOperations]); | ||||
return null; | return null; | ||||
} | } | ||||
export { DBOpsHandler }; | export { DBOpsHandler }; |