Refactor Context Providers and Enhance Error Handling
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good

- Replaced NotificationProvider with ActionsProvider in App.jsx to improve context management.
- Introduced default actions in ActionsContext to streamline state handling for current objects and actions.
- Improved error logging in ApiServerContext by consolidating error response handling and ensuring robust error reporting.
This commit is contained in:
Tom Butcher 2026-11-08 22:48:12 +00:00
parent 7574e1ef5b
commit 763bbf6f6e
3 changed files with 34 additions and 17 deletions

View File

@ -92,10 +92,10 @@ const AppContent = () => {
<TooltipProvider> <TooltipProvider>
<TableStateProvider> <TableStateProvider>
<AppUpdateProvider> <AppUpdateProvider>
<NotificationProvider> <ActionsProvider>
<NotificationProvider>
<SpotlightProvider> <SpotlightProvider>
<ActionsModalProvider> <ActionsModalProvider>
<ActionsProvider>
<DashboardObjectToolsProvider> <DashboardObjectToolsProvider>
<Routes> <Routes>
<Route <Route
@ -173,10 +173,10 @@ const AppContent = () => {
/> />
</Routes> </Routes>
</DashboardObjectToolsProvider> </DashboardObjectToolsProvider>
</ActionsProvider>
</ActionsModalProvider> </ActionsModalProvider>
</SpotlightProvider> </SpotlightProvider>
</NotificationProvider> </NotificationProvider>
</ActionsProvider>
</AppUpdateProvider> </AppUpdateProvider>
</TableStateProvider> </TableStateProvider>
</TooltipProvider> </TooltipProvider>

View File

@ -24,7 +24,20 @@ import { AuthContext } from './AuthContext'
import { ElectronContext } from './ElectronContext' import { ElectronContext } from './ElectronContext'
import { useNavigationTabs } from './NavigationTabsContext' import { useNavigationTabs } from './NavigationTabsContext'
const ActionsContext = createContext() const noop = () => {}
const defaultActions = {
currentObject: null,
currentObjectType: null,
setCurrentObject: noop,
setCurrentObjectType: noop,
callAction: noop,
clearAction: noop,
setOnModalOk: noop,
ctrlDown: false
}
const ActionsContext = createContext(defaultActions)
const ActionsProvider = ({ children }) => { const ActionsProvider = ({ children }) => {
const navigate = useNavigate() const navigate = useNavigate()

View File

@ -1625,16 +1625,18 @@ const ApiServerProvider = ({ children }) => {
const showError = useCallback( const showError = useCallback(
(error, callback = null) => { (error, callback = null) => {
console.error(error) console.error(error)
console.error(error.response) const responseData = error?.response?.data
console.error(error.response.data) const data =
console.error(error.response.data.code) responseData &&
console.error(error.response.data.error) typeof responseData === 'object' &&
console.error(error.response.data.message) !(responseData instanceof Blob)
console.error(error.response.data.status) ? responseData
console.error(error.response.data.timestamp) : null
console.error(error.response.data.path) if (data) {
console.error(error.response.data.method) console.error(error.response)
const code = error.response.data.code || 'UNKNOWN' console.error(data)
}
const code = data?.code || 'UNKNOWN'
if (code == 'UNAUTHORIZED') { if (code == 'UNAUTHORIZED') {
if (token) { if (token) {
setUnauthenticated() setUnauthenticated()
@ -1655,8 +1657,8 @@ const ApiServerProvider = ({ children }) => {
return return
} }
var content = `Error ${error.code} (${error.status}): ${error.message}` var content = `Error ${error.code} (${error.status}): ${error.message}`
if (error.response?.data?.error) { if (data?.error) {
content = `${error.response?.data?.error} (${error.status})` content = `${data.error} (${error.status})`
} }
setErrorModalContent(content) setErrorModalContent(content)
setRetryCallback(() => callback) setRetryCallback(() => callback)
@ -2174,6 +2176,8 @@ const ApiServerProvider = ({ children }) => {
return fileURL return fileURL
} catch (err) { } catch (err) {
console.error(err) console.error(err)
if (err?.code === 'ERR_CANCELED') return
await normalizeAxiosBlobError(err)
showError(err, () => { showError(err, () => {
fetchFileContent(file, download, onProgress) fetchFileContent(file, download, onProgress)
}) })