Replace instances hook with context

This commit is contained in:
2025-07-22 21:58:42 +02:00
parent 3ecfedea81
commit 63f77d8d9a
4 changed files with 35 additions and 10 deletions

View File

@@ -3,7 +3,7 @@ import Header from '@/components/Header'
import InstanceList from '@/components/InstanceList' import InstanceList from '@/components/InstanceList'
import InstanceModal from '@/components/InstanceModal' import InstanceModal from '@/components/InstanceModal'
import { CreateInstanceOptions, Instance } from '@/types/instance' import { CreateInstanceOptions, Instance } from '@/types/instance'
import { useInstances } from '@/hooks/useInstances' import { useInstances } from '@/contexts/InstancesContext'
function App() { function App() {
const [isModalOpen, setIsModalOpen] = useState(false) const [isModalOpen, setIsModalOpen] = useState(false)

View File

@@ -1,4 +1,4 @@
import { useInstances } from '@/hooks/useInstances' import { useInstances } from '@/contexts/InstancesContext'
import InstanceCard from '@/components/InstanceCard' import InstanceCard from '@/components/InstanceCard'
import { Instance } from '@/types/instance' import { Instance } from '@/types/instance'

View File

@@ -1,14 +1,14 @@
import { useState, useEffect, useCallback } from 'react' import { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react'
import { CreateInstanceOptions, Instance } from '@/types/instance' import { CreateInstanceOptions, Instance } from '@/types/instance'
import { instancesApi } from '@/lib/api' import { instancesApi } from '@/lib/api'
interface UseInstancesState { interface InstancesContextState {
instances: Instance[] instances: Instance[]
loading: boolean loading: boolean
error: string | null error: string | null
} }
interface UseInstancesActions { interface InstancesContextActions {
fetchInstances: () => Promise<void> fetchInstances: () => Promise<void>
createInstance: (name: string, options: CreateInstanceOptions) => Promise<void> createInstance: (name: string, options: CreateInstanceOptions) => Promise<void>
updateInstance: (name: string, options: CreateInstanceOptions) => Promise<void> updateInstance: (name: string, options: CreateInstanceOptions) => Promise<void>
@@ -19,7 +19,15 @@ interface UseInstancesActions {
clearError: () => void clearError: () => void
} }
export const useInstances = (): UseInstancesState & UseInstancesActions => { type InstancesContextType = InstancesContextState & InstancesContextActions
const InstancesContext = createContext<InstancesContextType | undefined>(undefined)
interface InstancesProviderProps {
children: ReactNode
}
export const InstancesProvider = ({ children }: InstancesProviderProps) => {
const [instances, setInstances] = useState<Instance[]>([]) const [instances, setInstances] = useState<Instance[]>([])
const [loading, setLoading] = useState(true) const [loading, setLoading] = useState(true)
const [error, setError] = useState<string | null>(null) const [error, setError] = useState<string | null>(null)
@@ -44,7 +52,7 @@ export const useInstances = (): UseInstancesState & UseInstancesActions => {
const createInstance = useCallback(async (name: string, options: CreateInstanceOptions) => { const createInstance = useCallback(async (name: string, options: CreateInstanceOptions) => {
try { try {
setError(null) setError(null)
await instancesApi.create( name, options ) await instancesApi.create(name, options)
// Refresh the list to include the new instance // Refresh the list to include the new instance
await fetchInstances() await fetchInstances()
} catch (err) { } catch (err) {
@@ -112,7 +120,7 @@ export const useInstances = (): UseInstancesState & UseInstancesActions => {
fetchInstances() fetchInstances()
}, [fetchInstances]) }, [fetchInstances])
return { const value: InstancesContextType = {
// State // State
instances, instances,
loading, loading,
@@ -127,4 +135,18 @@ export const useInstances = (): UseInstancesState & UseInstancesActions => {
deleteInstance, deleteInstance,
clearError, clearError,
} }
return (
<InstancesContext.Provider value={value}>
{children}
</InstancesContext.Provider>
)
}
export const useInstances = (): InstancesContextType => {
const context = useContext(InstancesContext)
if (context === undefined) {
throw new Error('useInstances must be used within an InstancesProvider')
}
return context
} }

View File

@@ -1,10 +1,13 @@
import React from 'react' import React from 'react'
import ReactDOM from 'react-dom/client' import ReactDOM from 'react-dom/client'
import App from './App' import App from './App'
import { InstancesProvider } from './contexts/InstancesContext'
import './index.css' import './index.css'
ReactDOM.createRoot(document.getElementById('root')!).render( ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode> <React.StrictMode>
<InstancesProvider>
<App /> <App />
</InstancesProvider>
</React.StrictMode>, </React.StrictMode>,
) )