packages/@fbcmobile-ui/Hooks/useSingleResource.js (20 lines of code) (raw):
/**
* Copyright (c) Facebook, Inc. and its affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
'use strict';
import {useEffect, useState} from 'react';
export default function(useResource: () => void) {
const [resourceAcquired, setResourceAcquired] = useState(false);
// Unlike traditional locks, operations that fail to grab lock are skipped.
useEffect(() => {
if (resourceAcquired) {
useResource();
}
}, [resourceAcquired, useResource]);
const acquireResource = () => {
setResourceAcquired(true);
};
const releaseResource = () => {
setResourceAcquired(false);
};
return {
runOrSkip: acquireResource,
release: releaseResource,
};
}