import React, { useEffect, useState } from 'react' import classNames from 'classnames' import { axData } from '~utils/axData' import './index.scss' interface Props { axType: number currentSkills?: SimpleAxSkill[], sendValues: (primaryAxModifier: number, primaryAxValue: number, secondaryAxModifier: number, secondaryAxValue: number) => void } const AXSelect = (props: Props) => { // Refs const primaryAxModifierSelect = React.createRef() const primaryAxValueInput = React.createRef() const secondaryAxModifierSelect = React.createRef() const secondaryAxValueInput = React.createRef() // States const [primaryAxModifier, setPrimaryAxModifier] = useState(-1) const [secondaryAxModifier, setSecondaryAxModifier] = useState(-1) const [primaryAxValue, setPrimaryAxValue] = useState(0.0) const [secondaryAxValue, setSecondaryAxValue] = useState(0.0) useEffect(() => { if (props.currentSkills && props.currentSkills[0]) { if (props.currentSkills[0].modifier != null) setPrimaryAxModifier(props.currentSkills[0].modifier) setPrimaryAxValue(props.currentSkills[0].strength) } if (props.currentSkills && props.currentSkills[1]) { if (props.currentSkills[1].modifier != null) setSecondaryAxModifier(props.currentSkills[1].modifier) setSecondaryAxValue(props.currentSkills[1].strength) } }, [props.currentSkills]) useEffect(() => { props.sendValues(primaryAxModifier, primaryAxValue, secondaryAxModifier, secondaryAxValue) }, [primaryAxModifier, primaryAxValue, secondaryAxModifier, secondaryAxValue]) // Classes const secondarySetClasses = classNames({ 'AXSet': true, 'hidden': primaryAxModifier < 0 }) function generateOptions(modifierSet: number) { const axOptions = axData[props.axType - 1] let axOptionElements: React.ReactNode[] = [] if (modifierSet == 0) { axOptionElements = axOptions.map((ax, i) => { return ( ) }) } else { // If we are loading data from the server, state doesn't set before render, // so our defaultValue is undefined. let modifier = -1; if (primaryAxModifier >= 0) modifier = primaryAxModifier else if (props.currentSkills) modifier = props.currentSkills[0].modifier if (modifier >= 0 && axOptions[modifier]) { const primarySkill = axOptions[modifier] if (primarySkill.secondary) { const secondaryAxOptions = primarySkill.secondary axOptionElements = secondaryAxOptions.map((ax, i) => { return ( ) }) } } } axOptionElements?.unshift() return axOptionElements } function handleSelectChange(event: React.ChangeEvent) { const value = parseInt(event.target.value) if (primaryAxModifierSelect.current == event.target) { setPrimaryAxModifier(value) if (primaryAxValueInput.current && secondaryAxModifierSelect.current && secondaryAxValueInput.current) { setupInput(axData[props.axType - 1][value], primaryAxValueInput.current) secondaryAxModifierSelect.current.value = "-1" secondaryAxValueInput.current.value = "" } } else { setSecondaryAxModifier(value) const primaryAxSkill = axData[props.axType - 1][primaryAxModifier] const currentAxSkill = (primaryAxSkill.secondary) ? primaryAxSkill.secondary.find(skill => skill.id == value) : undefined if (secondaryAxValueInput.current) setupInput(currentAxSkill, secondaryAxValueInput.current) } } function handleInputChange(event: React.ChangeEvent) { if (primaryAxValueInput.current == event.target) { setPrimaryAxValue(parseFloat(event.target.value)) } else { setSecondaryAxValue(parseFloat(event.target.value)) } } function setupInput(ax: AxSkill | undefined, element: HTMLInputElement) { if (ax) { const rangeString = `${ax.minValue}~${ax.maxValue}${ax.suffix || ''}` element.disabled = false element.placeholder = rangeString element.min = `${ax.minValue}` element.max = `${ax.maxValue}` element.step = (ax.suffix) ? "0.5" : "1" } else { if (primaryAxValueInput.current && secondaryAxValueInput.current) { if (primaryAxValueInput.current == element) { primaryAxValueInput.current.disabled = true primaryAxValueInput.current.placeholder = '' } secondaryAxValueInput.current.disabled = true secondaryAxValueInput.current.placeholder = '' } } } return (
) } export default AXSelect