onDocumentVisible(fn) calls fn once with the current visibility
boolean, then again whenever the document is shown or hidden — use it
for pausing timers, stopping animations, or refreshing data when the
tab regains focus. For a reactive accessor use
useDocumentVisible. Part of
pota/use/visibility.
It must be called within a reactive scope (a component body, an
effect, a root, etc.). Internally it subscribes to
visibilitychange inside an effect and registers its teardown with
the surrounding owner; when that scope disposes, the subscription is
removed. Called with no owner there is nothing to clean up the
listener and it leaks.
| Argument | Type | Description |
|---|---|---|
fn |
(visible: boolean) => void |
Called once on subscription, then on each change. |
Returns: undefined.
Appends a timestamped entry to the log each time the tab is shown or hidden — the first entry appears immediately, from the initial call with the current value. Because the subscription is owned by the component, it is removed automatically when the component unmounts.
import { render, signal } from 'pota'
import { onDocumentVisible } from 'pota/use/visibility'
function App() {
const log = signal([])
onDocumentVisible(visible => {
log.update(entries => [
...entries,
`${new Date().toLocaleTimeString()} — ${
visible ? 'visible' : 'hidden'
}`,
])
})
return (
<div>
<p>Switch tabs to populate the log:</p>
<ul>
{() =>
log.read().map(entry => (
<li>
<code>{entry}</code>
</li>
))
}
</ul>
</div>
)
}
render(App)