Floppy/dataslate

View on GitHub
src/components/WH40k9e/Roster.tsx

Summary

Maintainability
F
5 days
Test Coverage
import React, { MouseEvent } from 'react'
import { Col, CardColumns } from 'react-bootstrap'
import { CloseButton } from '../CloseButton'
import { StratagemList } from './StratagemList'
import { Settings } from '../../types/Settings'
import Phase from './Phase'
import { AbilityList } from './AbilityList'
import { NoPhaseDetails } from './NoPhaseDetails'
import { DeploymentPhaseDetails } from './DeploymentPhaseDetails'
import { BattleRoundStartPhaseDetails } from './BattleRoundStartPhaseDetails'
import { CommandPhaseDetails } from './CommandPhaseDetails'
import { MovementPhaseDetails } from './MovementPhaseDetails'
import { PsychicPhaseDetails } from './PsychicPhaseDetails'
import { ShootingPhaseDetails } from './ShootingPhaseDetails'
import { ChargePhaseDetails } from './ChargePhaseDetails'
import { FightPhaseDetails } from './FightPhaseDetails'
import { MoralePhaseDetails } from './MoralePhaseDetails'
import { Unit, Stratagem } from '../../types/WH40k9e'
import { Ability } from '../../types/Ability'

interface Props {
  name: string
  faction: string
  subfaction: string
  units: Unit[]
  abilities: Ability[]
  stratagems: Stratagem[]
  onClose: (event: MouseEvent<HTMLButtonElement>) => void
  settings: Settings
}

export function Roster (props: Props): JSX.Element {
  const headingStyle = {
    background: '#FF6F2D',
    color: 'black',
    padding: '10px',
    width: '100%',
    display: 'flex'
  }
  return (
    <div className='WH40k9e'>
      <h1 style={headingStyle}>
        <Col>
          {props.name} <small>({[props.faction, props.subfaction].join(', ')})</small>
        </Col>
        <Col style={{ flexGrow: 0, textAlign: 'right' }}>
          <CloseButton onClose={props.onClose} />
        </Col>
      </h1>
      <p className='alert alert-info d-print-none'>
        40k support is under active development, check back soon for improvements! If you spot anything broken,
        please file a report <a href='https://github.com/floppy/dataslate/issues/new'>on GitHub</a> including
        your roster file.
      </p>
      <Phase name=''>
        {props.units.map((unit: Unit) => (
          <NoPhaseDetails key={unit.id} unit={unit} />
        ))}
        <StratagemList phase='' stratagems={props.stratagems} />
      </Phase>
      <Phase name='deployment'>
        <AbilityList abilities={props.abilities} phase='deployment' />
        <>
          {props.units.map((unit: Unit) => (
            <DeploymentPhaseDetails key={unit.id} unit={unit} />
          ))}
          <StratagemList phase='deployment' stratagems={props.stratagems} />
        </>
      </Phase>
      <Phase name='start of battle round'>
        <AbilityList abilities={props.abilities} phase='battle_round_start' />
        <>
          {props.units.map((unit: Unit) => (
            <BattleRoundStartPhaseDetails key={unit.id} unit={unit} />
          ))}
          <StratagemList phase='battle_round_start' stratagems={props.stratagems} />
        </>
      </Phase>
      <Phase name='command'>
        <AbilityList abilities={props.abilities} phase='command' />
        <>
          {props.units.map((unit: Unit) => (
            <CommandPhaseDetails key={unit.id} unit={unit} />
          ))}
        </>
        <StratagemList phase='command' stratagems={props.stratagems} />
      </Phase>
      <Phase name='movement'>
        <AbilityList abilities={props.abilities} phase='movement' />
        <CardColumns className='units'>
          {props.units.map((unit: Unit) => (
            <MovementPhaseDetails key={unit.id} unit={unit} />
          ))}
        </CardColumns>
        <StratagemList phase='movement' stratagems={props.stratagems} />
      </Phase>
      <Phase name='psychic'>
        <>
          <AbilityList abilities={props.abilities} phase='psychic' />
          {props.units.map((unit: Unit) => (
            <PsychicPhaseDetails key={unit.id} unit={unit} />
          ))}
        </>
        <StratagemList phase='psychic' stratagems={props.stratagems} />
      </Phase>
      <Phase name='shooting'>
        <AbilityList abilities={props.abilities} phase='shooting' />
        <>
          {props.units.map((unit: Unit) => (
            <ShootingPhaseDetails key={unit.id} unit={unit} />
          ))}
        </>
        <StratagemList phase='shooting' stratagems={props.stratagems} />
      </Phase>
      <Phase name='charge'>
        <AbilityList abilities={props.abilities} phase='charge' />
        <>
          {props.units.map((unit: Unit) => (
            <ChargePhaseDetails key={unit.id} unit={unit} />
          ))}
        </>
        <StratagemList phase='charge' stratagems={props.stratagems} />
      </Phase>
      <Phase name='fight'>
        <AbilityList abilities={props.abilities} phase='fight' />
        <>
          {props.units.map((unit: Unit) => (
            <FightPhaseDetails key={unit.id} unit={unit} />
          ))}
        </>
        <StratagemList phase='fight' stratagems={props.stratagems} />
      </Phase>
      <Phase name='morale'>
        <AbilityList abilities={props.abilities} phase='morale' />
        <CardColumns className='units'>
          {props.units.map((unit: Unit) => (
            <MoralePhaseDetails key={unit.id} unit={unit} />
          ))}
        </CardColumns>
        <StratagemList phase='morale' stratagems={props.stratagems} />
      </Phase>
      {props.stratagems.filter((x) => (x.phases?.includes('end_of_turn'))).length > 0
        ? (
          <Phase name='At the end of your turn'>
            <StratagemList phase='end_of_turn' stratagems={props.stratagems} />
          </Phase>
          )
        : <></>}
    </div>
  )
}