mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
25ce505628
* remove thunk for receivedOpenApiSchema and use RTK query instead. add loading state for exposed fields * clean up * ignore any * fix(ui): do not log on canceled openapi.json queries - Rely on RTK Query for the `loadSchema` query by providing a custom `jsonReplacer` in our `dynamicBaseQuery`, so we don't need to manage error state. - Detect when the query was canceled and do not log the error message in those situations. * feat(ui): `utilitiesApi.endpoints.loadSchema` -> `appInfoApi.endpoints.getOpenAPISchema` - Utilities is for server actions, move this to `appInfo` bc it fits better there. - Rename to match convention for HTTP GET queries. - Fix inverted logic in the `matchRejected` listener (typo'd this) --------- Co-authored-by: Mary Hipp <maryhipp@Marys-MacBook-Air.local> Co-authored-by: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
111 lines
3.3 KiB
TypeScript
111 lines
3.3 KiB
TypeScript
import type { FetchBaseQueryArgs } from '@reduxjs/toolkit/dist/query/fetchBaseQuery';
|
|
import type { BaseQueryFn, FetchArgs, FetchBaseQueryError, TagDescription } from '@reduxjs/toolkit/query/react';
|
|
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
|
|
import { $authToken } from 'app/store/nanostores/authToken';
|
|
import { $baseUrl } from 'app/store/nanostores/baseUrl';
|
|
import { $projectId } from 'app/store/nanostores/projectId';
|
|
|
|
export const tagTypes = [
|
|
'AppVersion',
|
|
'AppConfig',
|
|
'Board',
|
|
'BoardImagesTotal',
|
|
'BoardAssetsTotal',
|
|
'Image',
|
|
'ImageNameList',
|
|
'ImageList',
|
|
'ImageMetadata',
|
|
'ImageWorkflow',
|
|
'ImageMetadataFromFile',
|
|
'IntermediatesCount',
|
|
'SessionQueueItem',
|
|
'SessionQueueStatus',
|
|
'SessionProcessorStatus',
|
|
'CurrentSessionQueueItem',
|
|
'NextSessionQueueItem',
|
|
'BatchStatus',
|
|
'InvocationCacheStatus',
|
|
'Model',
|
|
'T2IAdapterModel',
|
|
'MainModel',
|
|
'VaeModel',
|
|
'IPAdapterModel',
|
|
'TextualInversionModel',
|
|
'ControlNetModel',
|
|
'LoRAModel',
|
|
'SDXLRefinerModel',
|
|
'Workflow',
|
|
'WorkflowsRecent',
|
|
'Schema',
|
|
// This is invalidated on reconnect. It should be used for queries that have changing data,
|
|
// especially related to the queue and generation.
|
|
'FetchOnReconnect',
|
|
] as const;
|
|
export type ApiTagDescription = TagDescription<(typeof tagTypes)[number]>;
|
|
export const LIST_TAG = 'LIST';
|
|
|
|
const dynamicBaseQuery: BaseQueryFn<string | FetchArgs, unknown, FetchBaseQueryError> = async (
|
|
args,
|
|
api,
|
|
extraOptions
|
|
) => {
|
|
const baseUrl = $baseUrl.get();
|
|
const authToken = $authToken.get();
|
|
const projectId = $projectId.get();
|
|
|
|
const fetchBaseQueryArgs: FetchBaseQueryArgs = {
|
|
baseUrl: baseUrl ? `${baseUrl}/api/v1` : `${window.location.href.replace(/\/$/, '')}/api/v1`,
|
|
prepareHeaders: (headers) => {
|
|
if (authToken) {
|
|
headers.set('Authorization', `Bearer ${authToken}`);
|
|
}
|
|
if (projectId) {
|
|
headers.set('project-id', projectId);
|
|
}
|
|
|
|
return headers;
|
|
},
|
|
};
|
|
|
|
// When fetching the openapi.json, we need to remove circular references from the JSON.
|
|
if (
|
|
(args instanceof Object && args.url.includes('openapi.json')) ||
|
|
(typeof args === 'string' && args.includes('openapi.json'))
|
|
) {
|
|
fetchBaseQueryArgs.jsonReplacer = getCircularReplacer();
|
|
}
|
|
|
|
const rawBaseQuery = fetchBaseQuery(fetchBaseQueryArgs);
|
|
|
|
return rawBaseQuery(args, api, extraOptions);
|
|
};
|
|
|
|
export const api = createApi({
|
|
baseQuery: dynamicBaseQuery,
|
|
reducerPath: 'api',
|
|
tagTypes,
|
|
endpoints: () => ({}),
|
|
});
|
|
|
|
function getCircularReplacer() {
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
const ancestors: Record<string, any>[] = [];
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
return function (key: string, value: any) {
|
|
if (typeof value !== 'object' || value === null) {
|
|
return value;
|
|
}
|
|
// `this` is the object that value is contained in, i.e., its direct parent.
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
// @ts-ignore don't think it's possible to not have TS complain about this...
|
|
while (ancestors.length > 0 && ancestors.at(-1) !== this) {
|
|
ancestors.pop();
|
|
}
|
|
if (ancestors.includes(value)) {
|
|
return '[Circular]';
|
|
}
|
|
ancestors.push(value);
|
|
return value;
|
|
};
|
|
}
|