-
Notifications
You must be signed in to change notification settings - Fork 26
Create
In layman's terms, this code defines a component in a React application that allows users to select a character class for a game. The component fetches a list of available classes from a context, displays them in a scrollable container, and allows the user to select a class. If the class is disabled, the user cannot select it. When a class is selected, the component fetches additional information about the class and transitions to a different view. The component also plays different sounds based on user interactions, if the sound is not muted.
The component imports necessary modules and contexts at the beginning. These include React hooks, CSS styles, and several contexts that provide shared state across the application.
import React, { useEffect, useState } from "react"
import styles from "./Create.module.css"
import { ViewMode, ViewContext } from "../context/ViewContext"
import CustomButton from "../components/custom-button"
import { LanguageContext } from "../context/LanguageContext"
import { useContext } from "react"
import { SceneContext } from "../context/SceneContext"
import { SoundContext } from "../context/SoundContext"
import { AudioContext } from "../context/AudioContext"
The Create
function component takes a fetchCharacterManifest
function as a prop. This function is used to fetch additional information about a class when it is selected.
function Create({fetchCharacterManifest}) {
...
}
The component uses several pieces of state and context. The useState
hook is used to manage the classes
state, which is an array of available classes. The useContext
hook is used to access shared state from the ViewContext
, SoundContext
, AudioContext
, and SceneContext
.
const {t} = useContext(LanguageContext);
const { setViewMode } = React.useContext(ViewContext)
const { playSound } = React.useContext(SoundContext)
const { isMute } = React.useContext(AudioContext)
const { manifest } = React.useContext(SceneContext)
const [ classes, setClasses ] = useState([])
The useEffect
hook is used to update the classes
state whenever the manifest
context changes. The manifest
context contains information about the available classes.
useEffect(() => {
if (manifest != null){
const manifestClasses = manifest.map((c) => {
return {
name:c.name,
image:c.portrait,
description: c.description,
manifest: c.manifest,
icon:c.icon,
format:c.format,
disabled:false
}
})
setClasses(manifestClasses);
}
}, [manifest])
The component defines several event handlers for user interactions. The back
function is called when the user wants to go back to the previous view. The selectClass
function is called when the user selects a class. The hoverClass
function is called when the user hovers over a class.
const back = () => {
setViewMode(ViewMode.LANDING)
!isMute && playSound('backNextButton');
}
const selectClass = (index) => {
fetchCharacterManifest(index).then(()=>{
setViewMode(ViewMode.APPEARANCE)
})
!isMute && playSound('classSelect');
}
const hoverClass = () => {
!isMute && playSound('classMouseOver');
}
The render method returns the JSX that defines the component's UI. It maps over the classes
state to create a list of class options. Each class option is a div
that displays the class's image, icon, name, and description. If the class is disabled, it cannot be clicked or hovered over.
return (
<div className={`${styles.container} horizontalScroll`}>
...
<div className={styles.classContainer}>
{classes.map((characterClass, i) => {
return (
<div
key={i}
className={
!characterClass["disabled"]
? styles.class
: styles.classdisabled
}
onClick={
characterClass["disabled"]
? null
: () => selectClass(i)
}
onMouseOver={
characterClass["disabled"]
? null
: () => hoverClass()
}
>
...
</div>
)
})}
</div>
...
</div>
)