| import { useMemo } from "react"; |
| import type { Position } from "./usePosition.js"; |
|
|
| export type Visibility = "full" | "partial" | "hidden"; |
|
|
| export interface VisibilityInfo { |
| position: Position; |
| terminalWidth: number; |
| terminalHeight: number; |
| defaultVisibility: Visibility; |
| } |
|
|
| export type GetVisibility = (info: VisibilityInfo) => Visibility; |
|
|
| export function defaultVisibility( |
| position: Position, |
| terminalHeight: number, |
| terminalWidth: number, |
| ): Visibility { |
| const viewportStartRow = terminalHeight - position.appHeight + position.row; |
| const viewportEndRow = viewportStartRow + position.height; |
| const inAppStartRow = position.row; |
| const inAppEndRow = inAppStartRow + position.height; |
|
|
| if ( |
| viewportEndRow <= 0 || |
| inAppEndRow <= 0 || |
| viewportStartRow >= terminalHeight || |
| inAppStartRow >= position.appHeight |
| ) { |
| return "hidden"; |
| } |
|
|
| const viewportEndCol = position.col + position.width; |
| if ( |
| viewportEndCol <= 0 || |
| position.col >= terminalWidth || |
| position.col >= position.appWidth |
| ) { |
| return "hidden"; |
| } |
|
|
| if ( |
| viewportStartRow < 0 || |
| inAppStartRow < 0 || |
| viewportEndRow > terminalHeight || |
| inAppEndRow > position.appHeight || |
| position.col < 0 || |
| viewportEndCol > terminalWidth || |
| viewportEndCol > position.appWidth |
| ) { |
| return "partial"; |
| } |
|
|
| return "full"; |
| } |
|
|
| export function useVisibility( |
| position: Position | undefined, |
| terminalHeight: number, |
| terminalWidth: number, |
| getVisibility?: GetVisibility, |
| ): Visibility { |
| return useMemo(() => { |
| if (!position) return "hidden"; |
|
|
| const visibility = defaultVisibility( |
| position, |
| terminalHeight, |
| terminalWidth, |
| ); |
|
|
| if (getVisibility) { |
| return getVisibility({ |
| position, |
| terminalWidth, |
| terminalHeight, |
| defaultVisibility: visibility, |
| }); |
| } |
|
|
| return visibility; |
| }, [position, terminalHeight, terminalWidth, getVisibility]); |
| } |
|
|