@react-hookz/web
Version:
React hooks done right, for browser and SSR.
37 lines (36 loc) • 993 B
JavaScript
import { useMemo } from 'react';
import { useList } from '../useList/index.js';
import { useSyncedRef } from '../useSyncedRef/index.js';
/**
* A state hook implementing FIFO queue.
*
* @param initialValue The initial value. Defaults to an empty array.
*/
export function useQueue(initialValue = []) {
const [list, { removeAt, push }] = useList(initialValue);
const listRef = useSyncedRef(list);
return useMemo(() => ({
add(value) {
push(value);
},
remove() {
const value = listRef.current[0];
removeAt(0);
return value;
},
get first() {
return listRef.current.at(0);
},
get last() {
return listRef.current.at(-1);
},
get size() {
return listRef.current.length;
},
get items() {
return listRef.current;
},
}),
// eslint-disable-next-line react-hooks/exhaustive-deps
[]);
}