mirror of
https://github.com/lordmathis/llamactl.git
synced 2025-11-06 17:14:28 +00:00
Replace instances hook with context
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
@@ -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>,
|
||||||
)
|
)
|
||||||
Reference in New Issue
Block a user