All files / web/src/arcade-games/rithmomachia/contexts CaptureContext.tsx

0% Statements 0/78
0% Branches 0/1
0% Functions 0/1
0% Lines 0/78

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>
}