Populate skills from props instead of state

We're essentially ensuring consistency between the backend by frontend by using the backend as more of a source of truth.
This commit is contained in:
Justin Edmund 2022-12-01 05:36:57 -08:00
parent ca4b2e9149
commit fdebea27ae
2 changed files with 83 additions and 34 deletions

View file

@ -10,7 +10,7 @@ import JobSection from "~components/JobSection"
import CharacterUnit from "~components/CharacterUnit" import CharacterUnit from "~components/CharacterUnit"
import CharacterConflictModal from "~components/CharacterConflictModal" import CharacterConflictModal from "~components/CharacterConflictModal"
import type { SearchableObject } from "~types" import type { JobSkillObject, SearchableObject } from "~types"
import api from "~utils/api" import api from "~utils/api"
import { appState } from "~utils/appState" import { appState } from "~utils/appState"
@ -48,6 +48,15 @@ const CharacterGrid = (props: Props) => {
const [conflicts, setConflicts] = useState<GridCharacter[]>([]) const [conflicts, setConflicts] = useState<GridCharacter[]>([])
const [position, setPosition] = useState(0) const [position, setPosition] = useState(0)
// Set up state for data
const [job, setJob] = useState<Job | undefined>()
const [jobSkills, setJobSkills] = useState<JobSkillObject>({
0: undefined,
1: undefined,
2: undefined,
3: undefined,
})
// Create a temporary state to store previous character uncap values // Create a temporary state to store previous character uncap values
const [previousUncapValues, setPreviousUncapValues] = useState<{ const [previousUncapValues, setPreviousUncapValues] = useState<{
[key: number]: number | undefined [key: number]: number | undefined
@ -64,6 +73,13 @@ const CharacterGrid = (props: Props) => {
else appState.party.editable = false else appState.party.editable = false
}, [props.new, accountData, party]) }, [props.new, accountData, party])
useEffect(() => {
console.log("In useeffect")
console.log(party.jobSkills)
setJob(party.job)
setJobSkills(party.jobSkills)
}, [party])
// Initialize an array of current uncap values for each characters // Initialize an array of current uncap values for each characters
useEffect(() => { useEffect(() => {
let initialPreviousUncapValues: { [key: number]: number } = {} let initialPreviousUncapValues: { [key: number]: number } = {}
@ -167,14 +183,22 @@ const CharacterGrid = (props: Props) => {
// Methods: Saving job and job skills // Methods: Saving job and job skills
const saveJob = function (job: Job) { const saveJob = function (job: Job) {
const payload = {
party: { job_id: job ? job.id : "" },
}
if (party.id && appState.party.editable) { if (party.id && appState.party.editable) {
api.endpoints.parties.update( api.endpoints.parties
party.id, .update(party.id, payload, headers)
{ .then((response) => {
party: { job_id: job ? job.id : "" }, const newParty = response.data.party
},
headers setJob(newParty.job)
) appState.party.job = newParty.job
setJobSkills(newParty.job_skills)
appState.party.jobSkills = newParty.job_skills
})
} }
} }
@ -184,6 +208,7 @@ const CharacterGrid = (props: Props) => {
let skillObject: { let skillObject: {
[key: string]: string | undefined [key: string]: string | undefined
skill0_id?: string
skill1_id?: string skill1_id?: string
skill2_id?: string skill2_id?: string
skill3_id?: string skill3_id?: string
@ -292,6 +317,8 @@ const CharacterGrid = (props: Props) => {
<div> <div>
<div id="CharacterGrid"> <div id="CharacterGrid">
<JobSection <JobSection
job={job}
jobSkills={jobSkills}
editable={party.editable} editable={party.editable}
saveJob={saveJob} saveJob={saveJob}
saveSkill={saveJobSkill} saveSkill={saveJobSkill}

View file

@ -8,12 +8,14 @@ import SearchModal from "~components/SearchModal"
import { appState } from "~utils/appState" import { appState } from "~utils/appState"
import type { SearchableObject } from "~types" import type { JobSkillObject, SearchableObject } from "~types"
import "./index.scss" import "./index.scss"
// Props // Props
interface Props { interface Props {
job?: Job
jobSkills: JobSkillObject
editable: boolean editable: boolean
saveJob: (job: Job) => void saveJob: (job: Job) => void
saveSkill: (skill: JobSkill, position: number) => void saveSkill: (skill: JobSkill, position: number) => void
@ -25,15 +27,32 @@ const JobSection = (props: Props) => {
const [job, setJob] = useState<Job>() const [job, setJob] = useState<Job>()
const [imageUrl, setImageUrl] = useState("") const [imageUrl, setImageUrl] = useState("")
const { party } = useSnapshot(appState) const { party, jobSkills } = useSnapshot(appState)
const [numSkills, setNumSkills] = useState(4) const [numSkills, setNumSkills] = useState(4)
const [skills, setSkills] = useState<JobSkill[]>([]) const [skills, setSkills] = useState<{ [key: number]: JobSkill | undefined }>(
[]
)
const selectRef = React.createRef<HTMLSelectElement>()
useEffect(() => { useEffect(() => {
console.log("party has changed")
// Set current job based on ID // Set current job based on ID
if (party.job) setJob(party.job) console.log(props.jobSkills)
}, [])
if (props.job) {
setJob(props.job)
setSkills({
0: props.jobSkills[0],
1: props.jobSkills[1],
2: props.jobSkills[2],
3: props.jobSkills[3],
})
if (selectRef.current) selectRef.current.value = props.job.id
}
}, [props])
useEffect(() => { useEffect(() => {
generateImageUrl() generateImageUrl()
@ -41,8 +60,9 @@ const JobSection = (props: Props) => {
useEffect(() => { useEffect(() => {
if (job) { if (job) {
appState.party.job = job if (job.id != party.job.id) appState.party.job = job
setBaseSkills(job) if (job.row === "1") setNumSkills(3)
else setNumSkills(4)
} }
}, [job]) }, [job])
@ -50,20 +70,6 @@ const JobSection = (props: Props) => {
if (job) { if (job) {
setJob(job) setJob(job)
props.saveJob(job) props.saveJob(job)
setBaseSkills(job)
}
}
function setBaseSkills(job?: Job) {
if (job) {
const baseSkills = appState.jobSkills.filter(
(skill) => skill.job.id === job.id && skill.main
)
if (job.row === "1") setNumSkills(3)
else setNumSkills(4)
setSkills(baseSkills)
} }
} }
@ -80,11 +86,19 @@ const JobSection = (props: Props) => {
setImageUrl(imgSrc) setImageUrl(imgSrc)
} }
const canEditSkill = (skill?: JobSkill) => {
if (job && skill) {
if (skill.job.id === job.id && skill.main && !skill.sub) return false
}
return props.editable
}
const skillItem = (index: number, editable: boolean) => { const skillItem = (index: number, editable: boolean) => {
return ( return (
<JobSkillItem <JobSkillItem
skill={skills[index]} skill={skills[index]}
editable={!skills[index]?.main && editable} editable={canEditSkill(skills[index])}
key={`skill-${index}`} key={`skill-${index}`}
hasJob={job != undefined && job.id != "-1"} hasJob={job != undefined && job.id != "-1"}
/> />
@ -98,16 +112,20 @@ const JobSection = (props: Props) => {
fromPosition={index} fromPosition={index}
object="job_skills" object="job_skills"
job={job} job={job}
send={updateObject} send={saveJobSkill}
> >
{skillItem(index, true)} {skillItem(index, true)}
</SearchModal> </SearchModal>
) )
} }
function updateObject(object: SearchableObject, position: number) { function saveJobSkill(object: SearchableObject, position: number) {
const skill = object as JobSkill const skill = object as JobSkill
const newSkills = skills
newSkills[position] = skill
setSkills(newSkills)
props.saveSkill(skill, position) props.saveSkill(skill, position)
} }
@ -119,11 +137,15 @@ const JobSection = (props: Props) => {
<div className="Overlay" /> <div className="Overlay" />
</div> </div>
<div className="JobDetails"> <div className="JobDetails">
<JobDropdown currentJob={party.job?.id} onChange={receiveJob} /> <JobDropdown
currentJob={party.job?.id}
onChange={receiveJob}
ref={selectRef}
/>
<ul className="JobSkills"> <ul className="JobSkills">
{[...Array(numSkills)].map((e, i) => ( {[...Array(numSkills)].map((e, i) => (
<li key={`job-${i}`}> <li key={`job-${i}`}>
{job && job.id != "-1" && !skills[i]?.main && props.editable {canEditSkill(skills[i])
? editableSkillItem(i) ? editableSkillItem(i)
: skillItem(i, false)} : skillItem(i, false)}
</li> </li>