📄 File detail
hooks/notifs/useStartupNotification.ts
🧩 .ts📏 42 lines💾 1,278 bytes📝 text
← Back to All Files🎯 Use case
This file lives under “hooks/”, which covers reusable UI or integration hooks. On the API surface it exposes useStartupNotification — mainly functions, hooks, or classes. Dependencies touch React UI. It composes internal code from bootstrap, context, and utils (relative imports).
Generated from folder role, exports, dependency roots, and inline comments — not hand-reviewed for every path.
🧠 Inline summary
import { useEffect, useRef } from 'react' import { getIsRemoteMode } from '../../bootstrap/state.js' import { type Notification, useNotifications,
📤 Exports (heuristic)
useStartupNotification
📚 External import roots
Package roots from from "…" (relative paths omitted).
react
🖥️ Source preview
import { useEffect, useRef } from 'react'
import { getIsRemoteMode } from '../../bootstrap/state.js'
import {
type Notification,
useNotifications,
} from '../../context/notifications.js'
import { logError } from '../../utils/log.js'
type Result = Notification | Notification[] | null
/**
* Fires notification(s) once on mount. Encapsulates the remote-mode gate and
* once-per-session ref guard that was hand-rolled across 10+ notifs/ hooks.
*
* The compute fn runs exactly once on first effect. Return null to skip,
* a Notification to fire one, or an array to fire several. Sync or async.
* Rejections are routed to logError.
*/
export function useStartupNotification(
compute: () => Result | Promise<Result>,
): void {
const { addNotification } = useNotifications()
const hasRunRef = useRef(false)
const computeRef = useRef(compute)
computeRef.current = compute
useEffect(() => {
if (getIsRemoteMode() || hasRunRef.current) return
hasRunRef.current = true
void Promise.resolve()
.then(() => computeRef.current())
.then(result => {
if (!result) return
for (const n of Array.isArray(result) ? result : [result]) {
addNotification(n)
}
})
.catch(logError)
}, [addNotification])
}