import { BigNumber } from '@ethersproject/bignumber' import { Row } from '@past3lle/components' import { SkillForgeW3AppConfig, SkillId, SkillRarity, useSkillForgeBalancesAtom, useSkillForgeMetadataMapReadAtom } from '@past3lle/skillforge-web3' import { convertToRomanNumerals } from '@past3lle/utils' import React, { useMemo } from 'react' import { CANVAS_CONTAINER_ID, MINIMUM_COLLECTION_BOARD_SIZE } from '../../constants/skills' import { useVectorsAtom } from '../../state/Skills' import { SkillContainerAbsolute, SkillpointHeader } from '../Common' import { Skillpoint } from '../Skillpoint' import { LightningCanvas } from './canvasApi' import { Vector } from './canvasApi/api/vector' import { SkillCanvasContainer, SkillInnerCanvasContainer } from './styleds' export interface SkillsCanvasProps { options?: SkillForgeW3AppConfig['skillOptions'] } export function SkillsCanvas(props: SkillsCanvasProps) { const [{ vectors }] = useVectorsAtom() const [metadataMap] = useSkillForgeMetadataMapReadAtom() const [{ balances }] = useSkillForgeBalancesAtom() const VectorsMap = useMemo( () => vectors.map(({ skillId, vector }) => { if (!vector) return const skillBalance = skillId && balances?.[skillId] const missingSkill = !skillBalance || !skillId const zeroBalance = !!skillBalance && BigNumber.from(skillBalance).isZero() const skillpointProps = !missingSkill ? { key: skillId, metadata: metadataMap[skillId], hasSkill: !zeroBalance } : { key: `EMPTY-${vector.X1}-${vector.Y1}`, metadata: EMPTY_METADATA, hasSkill: true } return ( ) }), [balances, metadataMap, props.options?.metadataFetchOptions?.gatewayUris, vectors] ) return ( {vectors.slice(0, MINIMUM_COLLECTION_BOARD_SIZE).map(({ vector }, idx) => { const idxToRoman = convertToRomanNumerals(idx + 1) if (!vector) return null return ( {idxToRoman} ) })} {VectorsMap} {/* CANVAS */} ) } const EMPTY_METADATA = { name: 'EMPTY_SKILL', description: 'Empty skill', image: '', properties: { id: 'EMPTY-EMPTY' as SkillId, rarity: 'common' as SkillRarity, shopifyId: '0x0', dependencies: [] } }