Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | 'use client' import { createContext, type ReactNode, useContext } from 'react' import type { Piece, RelationKind } from '../types' /** * Layout information for the capture dialog */ export interface CaptureLayout { targetPos: { x: number; y: number } cellSize: number gap: number padding: number } /** * Pieces involved in the current capture attempt */ export interface CapturePieces { mover: Piece target: Piece helper: Piece | null } /** * Context value for the capture dialog subsystem */ export interface CaptureContextValue { // Layout (calculated once, shared by all capture components) layout: CaptureLayout // Pieces involved in capture pieces: CapturePieces // Capture state selectedRelation: RelationKind | null closing: boolean // All pieces on the board (for validation) allPieces: Piece[] // For pyramid pieces, maps relation to which face value to use pyramidFaceValues: Map<RelationKind, number> | null // Helper functions findValidHelpers: (moverValue: number, targetValue: number, relation: RelationKind) => Piece[] // Actions selectRelation: (relation: RelationKind) => void selectHelper: (pieceId: string) => void dismissDialog: () => void } const CaptureContext = createContext<CaptureContextValue | null>(null) /** * Hook to access capture context */ export function useCaptureContext(): CaptureContextValue { const context = useContext(CaptureContext) if (!context) { throw new Error('useCaptureContext must be used within CaptureProvider') } return context } /** * Provider for capture dialog context */ export function CaptureProvider({ children, value, }: { children: ReactNode value: CaptureContextValue }) { return <CaptureContext.Provider value={value}>{children}</CaptureContext.Provider> } |