mirror of
https://github.com/inventree/InvenTree.git
synced 2025-07-02 03:30:54 +00:00
Prevent multiple fetch of settings stage (#9878)
* Prevent multiple fetch of settings stage - Cached in the useSettingsState hook already * Error handling
This commit is contained in:
@ -50,6 +50,7 @@ export interface SettingsStateProps {
|
|||||||
lookup: SettingsLookup;
|
lookup: SettingsLookup;
|
||||||
fetchSettings: () => Promise<boolean>;
|
fetchSettings: () => Promise<boolean>;
|
||||||
loaded: boolean;
|
loaded: boolean;
|
||||||
|
isError: boolean;
|
||||||
endpoint: ApiEndpoints;
|
endpoint: ApiEndpoints;
|
||||||
pathParams?: PathParams;
|
pathParams?: PathParams;
|
||||||
getSetting: (key: string, default_value?: string) => string; // Return a raw setting value
|
getSetting: (key: string, default_value?: string) => string; // Return a raw setting value
|
||||||
|
@ -1,19 +1,14 @@
|
|||||||
import { t } from '@lingui/core/macro';
|
import { t } from '@lingui/core/macro';
|
||||||
import { Trans } from '@lingui/react/macro';
|
import { Trans } from '@lingui/react/macro';
|
||||||
import { Skeleton, Stack, Text } from '@mantine/core';
|
import { Alert, Skeleton, Stack, Text } from '@mantine/core';
|
||||||
import { notifications } from '@mantine/notifications';
|
import { notifications } from '@mantine/notifications';
|
||||||
import React, {
|
import React, { useCallback, useMemo, useRef, useState } from 'react';
|
||||||
useCallback,
|
|
||||||
useEffect,
|
|
||||||
useMemo,
|
|
||||||
useRef,
|
|
||||||
useState
|
|
||||||
} from 'react';
|
|
||||||
import { useStore } from 'zustand';
|
import { useStore } from 'zustand';
|
||||||
|
|
||||||
import type { ModelType } from '@lib/enums/ModelType';
|
import type { ModelType } from '@lib/enums/ModelType';
|
||||||
import { apiUrl } from '@lib/functions/Api';
|
import { apiUrl } from '@lib/functions/Api';
|
||||||
import type { Setting, SettingsStateProps } from '@lib/types/Settings';
|
import type { Setting, SettingsStateProps } from '@lib/types/Settings';
|
||||||
|
import { IconExclamationCircle } from '@tabler/icons-react';
|
||||||
import { useApi } from '../../contexts/ApiContext';
|
import { useApi } from '../../contexts/ApiContext';
|
||||||
import { useEditApiFormModal } from '../../hooks/UseForm';
|
import { useEditApiFormModal } from '../../hooks/UseForm';
|
||||||
import {
|
import {
|
||||||
@ -36,10 +31,6 @@ export function SettingList({
|
|||||||
keys?: string[];
|
keys?: string[];
|
||||||
onChange?: () => void;
|
onChange?: () => void;
|
||||||
}>) {
|
}>) {
|
||||||
useEffect(() => {
|
|
||||||
settingsState.fetchSettings();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const api = useApi();
|
const api = useApi();
|
||||||
|
|
||||||
const allKeys = useMemo(
|
const allKeys = useMemo(
|
||||||
@ -133,6 +124,14 @@ export function SettingList({
|
|||||||
[settingsState]
|
[settingsState]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (settingsState.isError) {
|
||||||
|
return (
|
||||||
|
<Alert color='red' icon={<IconExclamationCircle />} title={t`Error`}>
|
||||||
|
<Text>{t`Error loading settings`}</Text>
|
||||||
|
</Alert>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (!settingsState?.loaded) {
|
if (!settingsState?.loaded) {
|
||||||
return <Skeleton animate />;
|
return <Skeleton animate />;
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import type {
|
|||||||
SettingsLookup,
|
SettingsLookup,
|
||||||
SettingsStateProps
|
SettingsStateProps
|
||||||
} from '@lib/types/Settings';
|
} from '@lib/types/Settings';
|
||||||
|
import { useEffect } from 'react';
|
||||||
import { api } from '../App';
|
import { api } from '../App';
|
||||||
import { isTrue } from '../functions/conversion';
|
import { isTrue } from '../functions/conversion';
|
||||||
import { useUserState } from './UserState';
|
import { useUserState } from './UserState';
|
||||||
@ -22,6 +23,7 @@ export const useGlobalSettingsState = create<SettingsStateProps>(
|
|||||||
(set, get) => ({
|
(set, get) => ({
|
||||||
settings: [],
|
settings: [],
|
||||||
loaded: false,
|
loaded: false,
|
||||||
|
isError: false,
|
||||||
lookup: {},
|
lookup: {},
|
||||||
endpoint: ApiEndpoints.settings_global_list,
|
endpoint: ApiEndpoints.settings_global_list,
|
||||||
fetchSettings: async () => {
|
fetchSettings: async () => {
|
||||||
@ -30,7 +32,8 @@ export const useGlobalSettingsState = create<SettingsStateProps>(
|
|||||||
|
|
||||||
if (!isLoggedIn()) {
|
if (!isLoggedIn()) {
|
||||||
set({
|
set({
|
||||||
loaded: false
|
loaded: false,
|
||||||
|
isError: true
|
||||||
});
|
});
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
@ -40,8 +43,9 @@ export const useGlobalSettingsState = create<SettingsStateProps>(
|
|||||||
.then((response) => {
|
.then((response) => {
|
||||||
set({
|
set({
|
||||||
settings: response.data,
|
settings: response.data,
|
||||||
|
lookup: generate_lookup(response.data),
|
||||||
loaded: true,
|
loaded: true,
|
||||||
lookup: generate_lookup(response.data)
|
isError: false
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch((_error) => {
|
.catch((_error) => {
|
||||||
@ -49,7 +53,8 @@ export const useGlobalSettingsState = create<SettingsStateProps>(
|
|||||||
success = false;
|
success = false;
|
||||||
|
|
||||||
set({
|
set({
|
||||||
loaded: false
|
loaded: false,
|
||||||
|
isError: true
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -72,6 +77,7 @@ export const useUserSettingsState = create<SettingsStateProps>((set, get) => ({
|
|||||||
settings: [],
|
settings: [],
|
||||||
lookup: {},
|
lookup: {},
|
||||||
loaded: false,
|
loaded: false,
|
||||||
|
isError: false,
|
||||||
endpoint: ApiEndpoints.settings_user_list,
|
endpoint: ApiEndpoints.settings_user_list,
|
||||||
fetchSettings: async () => {
|
fetchSettings: async () => {
|
||||||
let success = true;
|
let success = true;
|
||||||
@ -124,15 +130,30 @@ export const createPluginSettingsState = ({
|
|||||||
}: CreatePluginSettingStateProps) => {
|
}: CreatePluginSettingStateProps) => {
|
||||||
const pathParams: PathParams = { plugin };
|
const pathParams: PathParams = { plugin };
|
||||||
|
|
||||||
return createStore<SettingsStateProps>()((set, get) => ({
|
const store = createStore<SettingsStateProps>()((set, get) => ({
|
||||||
settings: [],
|
settings: [],
|
||||||
lookup: {},
|
lookup: {},
|
||||||
loaded: false,
|
loaded: false,
|
||||||
|
isError: false,
|
||||||
endpoint: ApiEndpoints.plugin_setting_list,
|
endpoint: ApiEndpoints.plugin_setting_list,
|
||||||
pathParams,
|
pathParams,
|
||||||
fetchSettings: async () => {
|
fetchSettings: async () => {
|
||||||
let success = true;
|
let success = true;
|
||||||
|
|
||||||
|
if (!plugin) {
|
||||||
|
set({
|
||||||
|
loaded: false,
|
||||||
|
isError: true
|
||||||
|
});
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
set({
|
||||||
|
loaded: false,
|
||||||
|
isError: false
|
||||||
|
});
|
||||||
|
|
||||||
await api
|
await api
|
||||||
.get(apiUrl(ApiEndpoints.plugin_setting_list, undefined, { plugin }))
|
.get(apiUrl(ApiEndpoints.plugin_setting_list, undefined, { plugin }))
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
@ -140,14 +161,16 @@ export const createPluginSettingsState = ({
|
|||||||
set({
|
set({
|
||||||
settings,
|
settings,
|
||||||
lookup: generate_lookup(settings),
|
lookup: generate_lookup(settings),
|
||||||
loaded: true
|
loaded: true,
|
||||||
|
isError: false
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch((_error) => {
|
.catch((_error) => {
|
||||||
console.error(`Error fetching plugin settings for plugin ${plugin}`);
|
console.error(`Error fetching plugin settings for plugin ${plugin}`);
|
||||||
success = false;
|
success = false;
|
||||||
set({
|
set({
|
||||||
loaded: false
|
loaded: false,
|
||||||
|
isError: true
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -161,6 +184,13 @@ export const createPluginSettingsState = ({
|
|||||||
return isTrue(value);
|
return isTrue(value);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.log('fetching plugin settings for', plugin);
|
||||||
|
store.getState().fetchSettings();
|
||||||
|
}, [plugin]);
|
||||||
|
|
||||||
|
return store;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -181,6 +211,7 @@ export const createMachineSettingsState = ({
|
|||||||
settings: [],
|
settings: [],
|
||||||
lookup: {},
|
lookup: {},
|
||||||
loaded: false,
|
loaded: false,
|
||||||
|
isError: false,
|
||||||
endpoint: ApiEndpoints.machine_setting_detail,
|
endpoint: ApiEndpoints.machine_setting_detail,
|
||||||
pathParams,
|
pathParams,
|
||||||
fetchSettings: async () => {
|
fetchSettings: async () => {
|
||||||
@ -195,7 +226,8 @@ export const createMachineSettingsState = ({
|
|||||||
set({
|
set({
|
||||||
settings,
|
settings,
|
||||||
lookup: generate_lookup(settings),
|
lookup: generate_lookup(settings),
|
||||||
loaded: true
|
loaded: true,
|
||||||
|
isError: false
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
@ -205,7 +237,8 @@ export const createMachineSettingsState = ({
|
|||||||
);
|
);
|
||||||
success = false;
|
success = false;
|
||||||
set({
|
set({
|
||||||
loaded: false
|
loaded: false,
|
||||||
|
isError: true
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user