hensei-web/src/lib/utils/jobSkills.ts
Justin Edmund 149f30c538
Make parties more DRY (#444)
We extracted utility functions from the Party.svelte component in order
to make things more DRY.
2025-11-29 03:29:28 -08:00

66 lines
1.7 KiB
TypeScript

/**
* Job skills transformation utilities
* Handles converting between object and array formats for job skills
*/
import type { JobSkill } from '$lib/types/api/entities'
export interface JobSkillsMap {
[slot: string]: JobSkill | null | undefined
}
export interface JobSkillPayload {
id: string
slot: number
}
/**
* Converts job skills object to API array format
* Filters out null/undefined values and adds slot numbers
*
* @param skillsMap - Object mapping slot numbers to job skills
* @returns Array of job skill payloads ready for API submission
*
* @example
* ```typescript
* const skillsMap = { '0': skill1, '1': skill2, '2': null }
* const payload = transformSkillsToArray(skillsMap)
* // Returns: [{ id: 'skill1-id', slot: 0 }, { id: 'skill2-id', slot: 1 }]
* ```
*/
export function transformSkillsToArray(skillsMap: JobSkillsMap): JobSkillPayload[] {
return Object.entries(skillsMap)
.filter(([_, skill]) => skill !== null && skill !== undefined)
.map(([slotKey, skill]) => ({
id: skill!.id,
slot: parseInt(slotKey)
}))
}
/**
* Updates a skill in a specific slot (returns new object, immutable)
*
* @param currentSkills - Current job skills map
* @param slot - Slot number to update
* @param skill - Job skill to set, or null to remove
* @returns New skills map with the update applied
*
* @example
* ```typescript
* const updated = updateSkillInSlot(currentSkills, 0, newSkill)
* const removed = updateSkillInSlot(currentSkills, 1, null)
* ```
*/
export function updateSkillInSlot(
currentSkills: JobSkillsMap,
slot: number,
skill: JobSkill | null
): JobSkillsMap {
const updated = { ...currentSkills }
if (skill === null) {
delete updated[String(slot)]
} else {
updated[String(slot)] = skill
}
return updated
}