mirror of
https://github.com/supabase/supabase.git
synced 2026-10-14 21:59:16 +03:00
77 lines
2.5 KiB
TypeScript
77 lines
2.5 KiB
TypeScript
import { createContext, useContext, useState, ReactNode, useCallback } from 'react'
|
|
|
|
export enum PipelineStatusRequestStatus {
|
|
None = 'None',
|
|
EnableRequested = 'EnableRequested',
|
|
DisableRequested = 'DisableRequested',
|
|
}
|
|
|
|
interface PipelineRequestStatusContextType {
|
|
requestStatus: Record<number, PipelineStatusRequestStatus>
|
|
setRequestStatus: (pipelineId: number, status: PipelineStatusRequestStatus) => void
|
|
getRequestStatus: (pipelineId: number) => PipelineStatusRequestStatus
|
|
updatePipelineStatus: (pipelineId: number, backendStatus: string | undefined) => void
|
|
}
|
|
|
|
interface PipelineRequestStatusProviderProps {
|
|
children: ReactNode
|
|
}
|
|
|
|
const PipelineRequestStatusContext = createContext<PipelineRequestStatusContextType | undefined>(
|
|
undefined
|
|
)
|
|
|
|
export const PipelineRequestStatusProvider = ({ children }: PipelineRequestStatusProviderProps) => {
|
|
const [requestStatus, setRequestStatusState] = useState<
|
|
Record<number, PipelineStatusRequestStatus>
|
|
>({})
|
|
|
|
const setRequestStatus = (pipelineId: number, status: PipelineStatusRequestStatus) => {
|
|
setRequestStatusState((prev) => ({
|
|
...prev,
|
|
[pipelineId]: status,
|
|
}))
|
|
}
|
|
|
|
const getRequestStatus = (pipelineId: number): PipelineStatusRequestStatus => {
|
|
return requestStatus[pipelineId] || PipelineStatusRequestStatus.None
|
|
}
|
|
|
|
const updatePipelineStatus = useCallback(
|
|
(pipelineId: number, backendStatus: string | undefined) => {
|
|
const currentRequestStatus = requestStatus[pipelineId] || PipelineStatusRequestStatus.None
|
|
|
|
if (
|
|
(currentRequestStatus === PipelineStatusRequestStatus.EnableRequested &&
|
|
(backendStatus === 'started' || backendStatus === 'failed')) ||
|
|
(currentRequestStatus === PipelineStatusRequestStatus.DisableRequested &&
|
|
(backendStatus === 'stopped' || backendStatus === 'failed'))
|
|
) {
|
|
setRequestStatus(pipelineId, PipelineStatusRequestStatus.None)
|
|
}
|
|
},
|
|
[requestStatus, setRequestStatus]
|
|
)
|
|
|
|
return (
|
|
<PipelineRequestStatusContext.Provider
|
|
value={{
|
|
requestStatus,
|
|
setRequestStatus,
|
|
getRequestStatus,
|
|
updatePipelineStatus,
|
|
}}
|
|
>
|
|
{children}
|
|
</PipelineRequestStatusContext.Provider>
|
|
)
|
|
}
|
|
|
|
export const usePipelineRequestStatus = () => {
|
|
const context = useContext(PipelineRequestStatusContext)
|
|
if (context === undefined) {
|
|
throw new Error('usePipelineRequestStatus must be used within a PipelineRequestStatusProvider')
|
|
}
|
|
return context
|
|
}
|