sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
48 lines (40 loc) • 1.2 kB
text/typescript
import {
isValidationErrorMarker,
isValidationWarningMarker,
type ValidationMarker,
} from '@sanity/types'
import {type ButtonTone} from '@sanity/ui'
import {useMemo} from 'react'
import {type ValidationStatus} from '../types'
export const EMPTY_VALIDATION_STATUS: ValidationStatus = {
validation: [],
isValidating: false,
}
interface ValidationState {
markers: ValidationMarker[]
validationTone: ButtonTone
hasError: boolean
hasWarning: boolean
}
export function getValidationState(
validationMarkers: ValidationMarker[] = EMPTY_VALIDATION_STATUS.validation,
): ValidationState {
const hasError = validationMarkers.filter(isValidationErrorMarker).length > 0
const hasWarning = validationMarkers.filter(isValidationWarningMarker).length > 0
let validationTone: ButtonTone = 'default'
if (hasWarning) {
validationTone = 'default' //not using 'caution' for now
}
if (hasError) {
validationTone = 'critical'
}
return {
markers: validationMarkers,
validationTone,
hasError,
hasWarning,
}
}
export function useValidationState(markers: ValidationMarker[]): ValidationState {
return useMemo(() => getValidationState(markers), [markers])
}