Spaces:
Build error
Build error
/** | |
* src/components/Characters/index.jsx | |
* create and display characters | |
* | |
* created by Lynchee on 7/16/23 | |
*/ | |
// Characters | |
import React, { useEffect, useState } from 'react'; | |
import './style.css'; | |
import raiden from '../../assets/images/raiden.png'; | |
import loki from '../../assets/svgs/loki.svg'; | |
import aiHelper from '../../assets/images/ai_helper.png'; | |
import pi from '../../assets/images/pi.jpeg'; | |
import elon from '../../assets/images/elon.png'; | |
import bruce from '../../assets/images/bruce.png'; | |
import steve from '../../assets/images/jobs.png'; | |
import realchar from '../../assets/svgs/realchar.svg'; | |
import sam from '../../assets/images/sam.png'; | |
// create character groups | |
const createCharacterGroups = (message) => { | |
const options = message.split('\n').slice(1); | |
const imageMap = { | |
'Raiden Shogun And Ei': raiden, | |
'Loki': loki, | |
'Ai Character Helper': aiHelper, | |
'Reflection Pi': pi, | |
'Elon Musk': elon, | |
'Bruce Wayne': bruce, | |
'Steve Jobs': steve, | |
'Sam Altman': sam | |
}; | |
const newCharacterGroups = []; | |
options.forEach(option => { | |
const match = option.match(/^(\d+)\s-\s(.+)$/); | |
if (match) { | |
let src = imageMap[match[2]]; | |
if (!src) { | |
src = {realchar}; | |
} | |
newCharacterGroups.push({ | |
id: match[1], | |
name: match[2], | |
imageSrc: src | |
}); | |
} | |
}); | |
return newCharacterGroups; | |
} | |
const Characters = ({ characterGroups, selectedCharacter, setSelectedCharacter, isPlaying, characterConfirmed }) => { | |
const [pulseAnimation, setPulseAnimation] = useState(null); | |
// when the character is talking, show animation | |
useEffect(() => { | |
if (isPlaying) { | |
setPulseAnimation(Math.random() > 0.5 ? "pulse-animation-1" : "pulse-animation-2"); | |
} else { | |
setPulseAnimation(null); | |
} | |
}, [isPlaying]); | |
const handleCharacterSelection = (e) => { | |
setSelectedCharacter(e.target.value); | |
}; | |
return ( | |
<div className="main-container"> | |
<div className='radio-buttons'> | |
{characterGroups.map(group => ( | |
(!characterConfirmed || group.id === selectedCharacter) && ( | |
<label key={group.id} className="custom-radio"> | |
<input | |
type='radio' | |
name='radio' | |
value={group.id} | |
onChange={handleCharacterSelection} | |
/> | |
<span className={`radio-btn ${group.id === selectedCharacter ? pulseAnimation : ''}`}> | |
<div className='hobbies-icon'> | |
<img src={group.imageSrc} alt={group.name}/> | |
<h4>{group.name}</h4> | |
</div> | |
</span> | |
</label> | |
) | |
))} | |
</div> | |
</div> | |
) | |
} | |
export { Characters, createCharacterGroups }; | |