Files
infinite-craft/src/context/ElementsContext.tsx
T
2025-01-20 11:06:58 -05:00

61 lines
1.7 KiB
TypeScript

'use client'
import React, { createContext, useContext, useState, useCallback } from 'react'
interface Element {
type: string
emoji: string
text: string
}
interface ElementsContextType {
elements: Map<string, Element>
addElement: (type: string, emoji: string) => void
getElementContent: (type: string) => string
}
const ElementsContext = createContext<ElementsContextType | undefined>(undefined)
export function ElementsProvider({ children }: { children: React.ReactNode }) {
const [elements, setElements] = useState<Map<string, Element>>(new Map([
['water', { type: 'water', emoji: '💧', text: 'Water' }],
['fire', { type: 'fire', emoji: '🔥', text: 'Fire' }],
['earth', { type: 'earth', emoji: '🌎', text: 'Earth' }],
['wind', { type: 'wind', emoji: '💨', text: 'Wind' }],
]))
const addElement = useCallback((type: string, emoji: string) => {
setElements(prev => {
const newElements = new Map(prev)
if (!newElements.has(type)) {
newElements.set(type, {
type,
emoji,
text: type.charAt(0).toUpperCase() + type.slice(1)
})
}
return newElements
})
}, [])
const getElementContent = useCallback((type: string) => {
const element = Array.from(elements.values()).find(el => el.type === type)
return element ? `${element.emoji} ${element.text}` : type
}, [elements])
return (
<ElementsContext.Provider value={{ elements, addElement, getElementContent }}>
{children}
</ElementsContext.Provider>
)
}
export function useElements() {
const context = useContext(ElementsContext)
if (context === undefined) {
throw new Error('useElements must be used within a ElementsProvider')
}
return context
}