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:
parent
ca4b2e9149
commit
fdebea27ae
2 changed files with 83 additions and 34 deletions
|
|
@ -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}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue