bastienrobert/la-ferme

View on GitHub
packages/mobile/src/pages/samples/Game/Popup/Skill/index.tsx

Summary

Maintainability
A
2 hrs
Test Coverage
import React, { FC, useState } from 'react'
import FastImage from 'react-native-fast-image'
import styled from 'styled-components/native'
import { Player } from '@la-ferme/shared/typings'

import { PopupProps } from '../'
import SkillContent from './SkillContent'
import SkillActions from './SkillActions'
import SkillConfirm from './SkillConfirm'
import Container from '@/components/shared/Container'
import TitleWithHashtag from '@/components/shared/TitleWithHashtag'

import CardSkillUp, {
  RATIO as CARD_SKILL_UP_RATIO
} from '@/components/cards/skill/up'
import CardSkillDown, {
  RATIO as CARD_SKILL_DOWN_RATIO
} from '@/components/cards/skill/down'

import { shadow, inner } from '@/components/cards/cards.style'
import { images } from '@/utils/helpers/skills'

const Skill: FC<PopupProps> = ({ set, player, players }) => {
  const [confirm, setConfirm] = useState<boolean>(false)

  const onConfirm = (targets?: Player[]) => {
    // map `targets` to get UUIDs
    console.log('SEND MUTATION', targets)
    setConfirm(true)
  }

  const onCancel = () => set(undefined)

  return (
    <Component>
      <TopStyledContainer style={{ aspectRatio: CARD_SKILL_UP_RATIO }}>
        <StyledCard as={CardSkillUp} />
        <TopInner>
          <BigImage
            source={images[player.skill]}
            resizeMode={FastImage.resizeMode.contain}
          />
          <TitleWithHashtag
            title="title"
            titleColor="gray"
            hashtag={['test']}
            hashtagColor="yellow"
            alignSelf="center"
          />
          {confirm ? (
            <SkillConfirm player={player} />
          ) : (
            <SkillContent
              onConfirm={onConfirm}
              player={player}
              players={players}
            />
          )}
        </TopInner>
      </TopStyledContainer>
      <BottomStyledContainer style={{ aspectRatio: CARD_SKILL_DOWN_RATIO }}>
        <StyledCard as={CardSkillDown} />
        <BottomInner>
          <SkillActions
            confirm={confirm}
            player={player}
            onConfirm={onConfirm}
            onCancel={onCancel}
          />
        </BottomInner>
      </BottomStyledContainer>
    </Component>
  )
}

const Component = styled(Container)`
  max-width: 90%;
  max-height: 100%;
  margin: auto;
  justify-content: center;
  flex-direction: column;
  align-items: center;
  aspect-ratio: ${352 / 648};
`

const TopStyledContainer = styled(Container)`
  width: 100%;
`

const TopInner = styled(Container)`
  ${inner}
  padding: 0 12px 43px;
`

const BigImage = styled(FastImage)`
  width: 100%;
  height: 50%;
  margin-bottom: 10px;
`

const BottomInner = styled(Container)`
  ${inner}
  padding: 28px 26px;
`

const BottomStyledContainer = styled(Container)`
  margin-top: -1px;
  width: 100%;
`

const StyledCard = styled(Container)`
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  ${shadow}
`

export default Skill