// import react
import React, { memo, useEffect, useState } from 'react';
import { Masonry, useInfiniteLoader } from 'masonic';
// import local dependencies
import Loading from '../../Loading';
import ApiSignal from '../../../signals/Api';
import useResults from '../../../hooks/useResults';
import NodeListItem from './Item';
import { useSignal } from '../../../signal';
import { current as TeamSignal } from '../../../signals/Teams';
/**
* render item
*
* @param param0
*/
const ComponentNodeListItem = memo(({ index, data }) => {
// return jsx
return (
);
});
/**
* component nodes
*
* @param props
*/
const ComponentNodeList = (props = {}) => {
// signals
const [api] = useSignal(ApiSignal);
const [team] = useSignal(TeamSignal);
// state
const [ready, setReady] = useState(false);
// items
const {
key,
resetting,
items : nodes,
loadNext,
} = useResults(api.Node.list, 'nodes', {
sort : props.sort,
team : team?.id,
search : props.search,
disable : !team?.id,
}, null, props.onResult);
// maybe load more
const maybeLoadMore = useInfiniteLoader(() => loadNext(), {
isItemLoaded : (index, items) => !!items[index],
});
// use effect
useEffect(() => {
// ready
setReady(true);
}, [])
// return jsx
return (
{(ready && !resetting) ? (
{
// return item
return {
item,
};
})}
render={ComponentNodeListItem}
itemKey={(data, index) => data?.brain?.id || index}
onRender={props.nodes ? undefined : maybeLoadMore}
columnWidth={384}
columnGutter={16}
/>
) : (
)}
);
};
// export default
export default ComponentNodeList;