react-query#QueryObserver JavaScript Examples
The following examples show how to use
react-query#QueryObserver.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: Node.js From tako with MIT License | 5 votes |
Node = ({ type, name, path, parentCommitmessage, level }) => {
const { user, repo, branch } = useStore(state => state.repoDetails)
const isExpanded = useStore(state => state.expandedNodes[path] === true)
const toggleExpandNode = useStore(state => state.toggleExpandNode)
const selectedFilePath = useStore(state => state.selectedFilePath)
const setSelectedFilePath = useStore(state => state.setSelectedFilePath)
const hasNoSelectedFilePath = selectedFilePath === null
const isSelected = path === selectedFilePath
const isFolder = type === 'dir'
const childListingObserver = React.useMemo(
() =>
new QueryObserver(queryClient, {
queryKey: ['listing', { user, repo, branch, path }],
enabled: isExpanded,
}),
[branch, isExpanded, path, repo, user]
)
const isLoadingContents = useObserver(
childListingObserver,
({ isLoading }) => isLoading
)
let typeIcon = isFolder ? (
<FolderIcon
style={{
color: 'var(--color-files-explorer-icon)',
position: 'relative',
top: 1,
}}
/>
) : (
<FileIcon
style={{
color: 'var(--color-text-tertiary)',
position: 'relative',
top: 1,
}}
/>
)
typeIcon =
isLoadingContents && isExpanded ? (
<Spinner size="16px" color="var(--color-files-explorer-icon)" />
) : (
typeIcon
)
const ExpandoIcon = isFolder ? ChevronIcon : 'div'
const [isHovering, hoverProps] = useHover()
const { data: lastCommitData } = useQuery(
['last-commit', { user, repo, branch, path }],
getLastCommitForNode,
{ enabled: hasNoSelectedFilePath }
)
React.useEffect(() => {
if (isHovering) {
if (isFolder) {
queryClient
.prefetchQuery(
['listing', { user, repo, branch, path }],
markAsPrefetch(getNode)
)
.then((items = []) => {
items.forEach(({ path }) =>
queryClient.prefetchQuery(
['last-commit', { user, repo, branch, path }],
markAsPrefetch(getLastCommitForNode),
{ enabled: hasNoSelectedFilePath }
)
)
})
} else {
const fileExtension = path.split('.').slice(-1)[0].toLowerCase()
if (fileExtension === 'md') {
queryClient
.prefetchQuery(
['file', { user, repo, branch, path }],
markAsPrefetch(getFileContent)
)
.then(text => {
queryClient.prefetchQuery(
['markdown', { user, repo, text }],
getMarkdown,
{ enabled: text }
)
})
} else {
queryClient.prefetchQuery(
['file', { user, repo, branch, path }],
markAsPrefetch(getFileContent)
)
}
}
}
}, [isHovering, branch, isFolder, path, repo, user])
return (
<Fragment>
<Row highlighted={isSelected}>
<Cell
{...hoverProps}
onClick={event => {
event.stopPropagation()
if (isFolder) {
toggleExpandNode(path)
} else {
setSelectedFilePath(path)
}
}}
style={{
paddingLeft: INDENT_SIZE * level + 10,
display: 'grid',
gridTemplateColumns: '16px 26px 1fr',
alignItems: 'center',
}}
>
<ExpandoIcon
style={{
color: 'var(--color-files-explorer-icon)',
position: 'relative',
left: isExpanded ? -4 : -3,
transform: isExpanded ? 'rotate(180deg)' : 'rotate(90deg)',
}}
/>
{typeIcon}
<Truncateable
css={{
marginLeft: 5,
overflow: selectedFilePath && 'visible',
}}
>
<a
title={name}
className="link-gray-dark"
href={`https://github.com/${user}/${repo}/blob/${branch}/${path}`}
onClick={maybeHijackClick}
>
{name}
</a>
</Truncateable>
</Cell>
{!selectedFilePath &&
(lastCommitData ? (
<Fragment>
<Cell>
<Truncateable>
<a className="link-gray" href={lastCommitData.url}>
{lastCommitData.message}
</a>
</Truncateable>
</Cell>
<Cell alignRight style={{ color: 'var(--color-text-tertiary)' }}>
<Truncateable>{lastCommitData.date}</Truncateable>
</Cell>
</Fragment>
) : (
<Fragment>
<Cell>
<Truncateable>
<Placeholder
text={parentCommitmessage || 'did the foobar with the qux'}
/>
</Truncateable>
</Cell>
<Cell alignRight>
<Truncateable>
<Placeholder text="2 days ago" />
</Truncateable>
</Cell>
</Fragment>
))}
</Row>
{isExpanded && (
<Listing
path={path}
level={level + 1}
parentCommitmessage={lastCommitData && lastCommitData.message}
/>
)}
</Fragment>
)
}