We extracted utility functions from the Party.svelte component in order to make things more DRY.
66 lines
1.7 KiB
TypeScript
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
|
|
}
|