fui-material 2.6.13 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,13 @@
1
+ import { ReactNode } from 'react';
2
+ import { AxiosRequestConfig } from 'axios';
3
+ export interface ILibApiService {
4
+ request: <T>(url: string, config: AxiosRequestConfig) => Promise<T>;
5
+ }
6
+ export interface LibraryConfig {
7
+ apiService: ILibApiService;
8
+ }
9
+ export declare const LibraryProvider: ({ children, config }: {
10
+ children: ReactNode;
11
+ config: LibraryConfig;
12
+ }) => import("react/jsx-runtime").JSX.Element;
13
+ export declare const useLibraryContext: () => LibraryConfig;
@@ -1 +1,4 @@
1
1
  export { default as useFApi } from "./useFApi";
2
+ export { default as useApiMutation } from "./useApiMutation";
3
+ export { default as useApiQuery } from "./useApiQuery";
4
+ export { default as useManualApiQuery } from "./useManualApiQuery";
@@ -0,0 +1,13 @@
1
+ import { AxiosError } from "axios";
2
+ export interface ExtraOptions {
3
+ onErrorNotification?: boolean;
4
+ onErrorLog?: boolean;
5
+ onLoadingLog?: boolean;
6
+ onSuccessNotification?: boolean;
7
+ notificationTitle?: string;
8
+ notificationBody?: (error: AxiosError | null) => string;
9
+ loadingNotificationTitle?: string;
10
+ loadingNotificationBody?: string;
11
+ successNotificationTitle?: string;
12
+ successNotificationBody?: string;
13
+ }
@@ -0,0 +1 @@
1
+ export { default } from "./useApiMutation";
@@ -0,0 +1,75 @@
1
+ import { AxiosError, AxiosRequestConfig } from "axios";
2
+ import { MutateOptions, QueryKey, UseMutationOptions, UseMutationResult } from "@tanstack/react-query";
3
+ import { ExtraOptions } from "../types";
4
+ /**
5
+ * Возвращаемый тип кастомной мутации с удобной сигнатурой вызова `mutate` и `mutateAsync`
6
+ */
7
+ export type CustomMutationResult<TData, TError, TVariables, TContext> = Omit<UseMutationResult<TData, TError, {
8
+ data?: TVariables;
9
+ urlParams?: Record<string, string | number>;
10
+ }, TContext>, 'mutate' | 'mutateAsync'> & {
11
+ /**
12
+ * Функция для запуска мутации.
13
+ * @param data Данные для отправки (тело POST/PUT запроса или FormData)
14
+ * @param urlParams Параметры для подстановки в URL (заменяет `:param` на значение)
15
+ */
16
+ mutate: (data?: TVariables, urlParams?: Record<string, string | number>, options?: MutateOptions<TData, TError, {
17
+ data?: TVariables;
18
+ urlParams?: Record<string, string | number>;
19
+ }, TContext>) => void;
20
+ /**
21
+ * Асинхронная функция для запуска мутации. Возвращает Promise с результатом запроса.
22
+ * @param data Данные для отправки (тело POST/PUT запроса или FormData)
23
+ * @param urlParams Параметры для подстановки в URL (заменяет `:param` на значение)
24
+ */
25
+ mutateAsync: (data?: TVariables, urlParams?: Record<string, string | number>, options?: MutateOptions<TData, TError, {
26
+ data?: TVariables;
27
+ urlParams?: Record<string, string | number>;
28
+ }, TContext>) => Promise<TData>;
29
+ };
30
+ /**
31
+ * Хук для выполнения мутаций (POST, PUT, DELETE) с поддержкой динамических параметров в URL и автоматической инвалидацией кэша.
32
+ *
33
+ * @template TQueryFnData - Тип ответа от сервера
34
+ * @template TVariables - Тип отправляемых данных (тело запроса)
35
+ *
36
+ * @param url - URL эндпоинта. Поддерживает динамические параметры, например `/api/v1/users/:id/roles`
37
+ * @param config - Конфигурация Axios
38
+ * @param options - Расширенные опции useMutation + `queryKeyToInvalidate` для автоматического сброса кэша и опции нотификаций.
39
+ *
40
+ * @example
41
+ * // 1. Простая отправка формы (синхронная):
42
+ * const { mutate, isPending } = useApiMutation<IUser, ICreateUserDto>(
43
+ * '/api/v1/users',
44
+ * undefined,
45
+ * {
46
+ * queryKeyToInvalidate: ['users'],
47
+ * onErrorNotification: true
48
+ * }
49
+ * );
50
+ *
51
+ * const handleSubmit = (formData: ICreateUserDto) => {
52
+ * mutate(formData);
53
+ * };
54
+ *
55
+ * @example
56
+ * // 2. Запрос с динамическим URL и async/await:
57
+ * const { mutateAsync } = useApiMutation<void, IRoleDto>('/api/v1/users/:userId/roles/:roleId');
58
+ *
59
+ * const handleAssignRole = async () => {
60
+ * try {
61
+ * await mutateAsync({ permissions: ['read'] }, { userId: 42, roleId: 5 });
62
+ * toast.success('Роль успешно назначена!');
63
+ * } catch (e) {
64
+ * // Обработка ошибки
65
+ * }
66
+ * };
67
+ */
68
+ export declare const useApiMutation: <TQueryFnData, TVariables = unknown>(url: string, config?: AxiosRequestConfig, options?: Omit<UseMutationOptions<TQueryFnData, AxiosError, {
69
+ data?: TVariables;
70
+ urlParams?: Record<string, string | number>;
71
+ }, unknown>, "mutationFn"> & {
72
+ /** Ключ кэша TanStack Query, который нужно автоматически инвалидировать (обновить) при успехе */
73
+ queryKeyToInvalidate?: QueryKey;
74
+ } & ExtraOptions) => CustomMutationResult<TQueryFnData, AxiosError, TVariables, unknown>;
75
+ export default useApiMutation;
@@ -0,0 +1 @@
1
+ export { default } from "./useApiQuery";
@@ -0,0 +1,38 @@
1
+ import { AxiosError, AxiosRequestConfig } from "axios";
2
+ import { QueryKey, UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
3
+ import { ExtraOptions } from "../types";
4
+ /**
5
+ * Хук для автоматических декларативных запросов (GET/POST).
6
+ * Параметры запроса автоматически извлекаются из последнего элемента `queryKey`, если это объект.
7
+ * Запрос запускается автоматически при монтировании и изменении `queryKey`.
8
+ *
9
+ * @template TQueryFnData - Тип данных, которые возвращает сервер
10
+ * @template TData - Тип возвращаемых данных (после возможной трансформации через `select`). По умолчанию = TQueryFnData.
11
+ *
12
+ * @param queryKey - Ключ кэширования. Если последний элемент - объект, он передается как `params` (GET) или `data` (POST).
13
+ * @param url - URL эндпоинта.
14
+ * @param config - Конфигурация Axios (заголовки, таймауты и т.д., кроме `params`, `data`, `method`).
15
+ * @param options - Расширенные опции TanStack Query (`enabled`, `staleTime`, `select` и т.д.) + опции нотификаций.
16
+ *
17
+ * @returns Стандартный результат `useQuery` (`data`, `isLoading`, `isError`, `refetch` и т.д.).
18
+ *
19
+ * @example
20
+ * // 1. Простой GET-запрос параметров:
21
+ * const { data, isLoading } = useApiQuery<IUser[]>(
22
+ * ['users', { page: 1, limit: 10 }],
23
+ * '/api/v1/users'
24
+ * );
25
+ *
26
+ * @example
27
+ * // 2. POST-запрос справочника с нотификацией об ошибке:
28
+ * const { data, error } = useApiQuery<IDirectoryResponse>(
29
+ * ['dictionary', { category: 'cities' }],
30
+ * '/api/v1/dictionary',
31
+ * undefined,
32
+ * { method: 'POST', onErrorNotification: true }
33
+ * );
34
+ */
35
+ declare const useApiQuery: <TQueryFnData, TData = TQueryFnData>(queryKey: QueryKey, url: string, config?: Omit<AxiosRequestConfig, "params" | "data" | "method">, options?: Omit<UseQueryOptions<TQueryFnData, AxiosError, TData>, "queryKey" | "queryFn"> & {
36
+ method?: "GET" | "POST";
37
+ } & ExtraOptions) => UseQueryResult<TData, AxiosError>;
38
+ export default useApiQuery;
@@ -0,0 +1 @@
1
+ export { default } from "./useManualApiQuery";
@@ -0,0 +1,65 @@
1
+ import { AxiosError, AxiosRequestConfig } from "axios";
2
+ import { UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
3
+ import { ExtraOptions } from "../types";
4
+ /**
5
+ * Параметры для функции `run`, запускающей запрос вручную.
6
+ * @template T - Тип передаваемых параметров запроса (тело POST или GET-параметры)
7
+ */
8
+ export interface IUseManualApiQueryRun<T> {
9
+ /** Новые основные параметры запроса (передаются как `data` в POST или `params` в GET) */
10
+ newParams?: T;
11
+ /** Дополнительные URL-параметры (query string) */
12
+ newUrlParams?: Record<string, unknown>;
13
+ /** Если `true`, сохраняет предыдущие `params`, если `newParams` не был передан */
14
+ preserveParams?: boolean;
15
+ /** Добавочный суффикс к URL (например, `/export` или `/:id`) */
16
+ dopUrl?: string;
17
+ /** Если `true`, объединяет новые `newUrlParams` со старыми вместо перезаписи */
18
+ preserveUrlParams?: boolean;
19
+ }
20
+ /**
21
+ * Тип возвращаемого значения хука `useManualApiQuery` с описанием функции `run` для подсказок IDE
22
+ */
23
+ export type UseManualApiQueryResult<TData, TVariables> = UseQueryResult<TData, AxiosError> & {
24
+ /**
25
+ * Асинхронная функция для ручного запуска HTTP-запроса.
26
+ * Обновляет параметры, выполняет запрос, сохраняет результат в кэш TanStack Query и возвращает его.
27
+ *
28
+ * @param options Параметры запуска (новые params, urlParams, dopUrl и флаги сохранения)
29
+ * @returns Promise с данными ответа сервера (TData)
30
+ *
31
+ * @example
32
+ * // Вызов с новыми параметрами:
33
+ * const data = await run({ newParams: { page: 1 } });
34
+ *
35
+ * @example
36
+ * // Повторный вызов с текущими параметрами:
37
+ * await run();
38
+ */
39
+ run: (options?: IUseManualApiQueryRun<TVariables>) => Promise<TData>;
40
+ /** Текущие основные параметры запроса */
41
+ params: TVariables | undefined;
42
+ /** Текущие дополнительные URL-параметры (query string) */
43
+ urlParams: Record<string, unknown> | undefined;
44
+ };
45
+ /**
46
+ * Обновленный хук-надстройка над TanStack Query (`useQuery`) для ручного запуска HTTP-запросов с динамическими параметрами.
47
+ * Подходит для сложных фильтров, экспорта или получения справочников (в т.ч. через POST) с поддержкой кэширования.
48
+ *
49
+ * @template TQueryFnData - Тип данных, которые возвращает сервер
50
+ * @template TData - Тип возвращаемых данных (после возможной трансформации через `select`). По умолчанию = TQueryFnData.
51
+ * @template TVariables - Тип параметров запроса (body или query params)
52
+ *
53
+ * @param queryKey - Базовый ключ кэширования TanStack Query.
54
+ * @param url - URL эндпоинта.
55
+ * @param initialParams - Начальные параметры запроса (опционально).
56
+ * @param config - Конфиг Axios (заголовки, таймауты и т.д., за исключением `data`, `params`, `method`).
57
+ * @param options - Расширенные опции TanStack Query + дополнительные параметры (`method`, `onErrorNotification` и др.).
58
+ *
59
+ * @returns Объект `useQuery` + функция `run` (возвращает `Promise<TData>`) и текущие параметры (`params`, `urlParams`).
60
+ */
61
+ declare function useManualApiQuery<TQueryFnData, TData = TQueryFnData, TVariables = unknown>(queryKey: string, url: string, initialParams?: TVariables, config?: Omit<AxiosRequestConfig, 'params' | 'data' | 'method'>, options?: Omit<UseQueryOptions<TQueryFnData, AxiosError, TData>, 'queryKey' | 'queryFn'> & {
62
+ method?: 'GET' | 'POST';
63
+ urlParams?: Record<string, unknown>;
64
+ } & ExtraOptions): UseManualApiQueryResult<TData, TVariables>;
65
+ export default useManualApiQuery;
package/package.json CHANGED
@@ -1,81 +1,82 @@
1
- {
2
- "name": "fui-material",
3
- "version": "2.6.13",
4
- "type": "module",
5
- "publishConfig": {
6
- "access": "public",
7
- "registry": "https://registry.npmjs.org/"
8
- },
9
- "author": "Allori",
10
- "license": "ISC",
11
- "private": false,
12
- "scripts": {
13
- "dev": "vite",
14
- "build:types": "tsc --project tsconfig.build.json",
15
- "build": "vite build && npm run build:types",
16
- "build-publish": "vite build && npm run build:types && npm publish",
17
- "lint": "eslint .",
18
- "preview": "vite preview",
19
- "storybook": "storybook dev -p 6006",
20
- "deploy-storybook": "storybook build && gh-pages -d storybook-static --repo https://github.com/Allorion/fui-storybook.git",
21
- "build-storybook": "storybook build"
22
- },
23
- "dependencies": {
24
- "allorion-exporting-html-to-docx": "1.4.1",
25
- "allorion-exporting-html-to-xlsx": "1.9.0",
26
- "axios": "^1.7.4",
27
- "jszip": "^3.10.1"
28
- },
29
- "peerDependencies": {
30
- "react": ">=18.0.0",
31
- "react-dom": ">=18.0.0"
32
- },
33
- "devDependencies": {
34
- "@chromatic-com/storybook": "^3.2.6",
35
- "@eslint/js": "^9.25.0",
36
- "@rollup/plugin-image": "^3.0.3",
37
- "@storybook/addon-docs": "8.6.12",
38
- "@storybook/addon-essentials": "^8.6.12",
39
- "@storybook/addon-interactions": "^8.6.12",
40
- "@storybook/addon-onboarding": "^8.6.12",
41
- "@storybook/addon-styling-webpack": "^1.0.1",
42
- "@storybook/blocks": "^8.6.12",
43
- "@storybook/react": "^8.6.12",
44
- "@storybook/react-vite": "^8.6.12",
45
- "@storybook/test": "^8.6.12",
46
- "@types/minimatch": "^6.0.0",
47
- "@types/node": "^22.4.1",
48
- "@types/react": "^18.3.3",
49
- "@types/react-dom": "^18.3.0",
50
- "@vitejs/plugin-react": "^4.4.1",
51
- "@vitest/browser": "^3.1.3",
52
- "@vitest/coverage-v8": "^3.1.3",
53
- "eslint": "^9.25.0",
54
- "eslint-plugin-react-hooks": "^5.2.0",
55
- "eslint-plugin-react-refresh": "^0.4.19",
56
- "eslint-plugin-storybook": "^0.12.0",
57
- "gh-pages": "6.3.0",
58
- "globals": "^16.0.0",
59
- "playwright": "^1.52.0",
60
- "rollup-plugin-copy": "^3.5.0",
61
- "sass": "1.88.0",
62
- "storybook": "^8.6.12",
63
- "typescript": "~5.8.3",
64
- "typescript-eslint": "^8.30.1",
65
- "vite": "^6.3.5",
66
- "vite-plugin-lib-inject-css": "^2.1.1",
67
- "vitest": "^3.1.3"
68
- },
69
- "main": "dist/f-ui-kit.umd.js",
70
- "module": "dist/f-ui-kit.es.js",
71
- "types": "dist/types/index.d.ts",
72
- "files": [
73
- "dist",
74
- "dist/types"
75
- ],
76
- "eslintConfig": {
77
- "extends": [
78
- "plugin:storybook/recommended"
79
- ]
80
- }
1
+ {
2
+ "name": "fui-material",
3
+ "version": "2.7.0",
4
+ "type": "module",
5
+ "publishConfig": {
6
+ "access": "public",
7
+ "registry": "https://registry.npmjs.org/"
8
+ },
9
+ "author": "Allori",
10
+ "license": "ISC",
11
+ "private": false,
12
+ "scripts": {
13
+ "dev": "vite",
14
+ "build:types": "tsc --project tsconfig.build.json",
15
+ "build": "vite build && npm run build:types",
16
+ "build-publish": "vite build && npm run build:types && npm publish",
17
+ "lint": "eslint .",
18
+ "preview": "vite preview",
19
+ "storybook": "storybook dev -p 6006",
20
+ "deploy-storybook": "storybook build && gh-pages -d storybook-static --repo https://github.com/Allorion/fui-storybook.git",
21
+ "build-storybook": "storybook build"
22
+ },
23
+ "dependencies": {
24
+ "@tanstack/react-query": "^5.101.4",
25
+ "allorion-exporting-html-to-docx": "1.4.1",
26
+ "allorion-exporting-html-to-xlsx": "1.9.0",
27
+ "axios": "^1.7.4",
28
+ "jszip": "^3.10.1"
29
+ },
30
+ "peerDependencies": {
31
+ "react": ">=18.0.0",
32
+ "react-dom": ">=18.0.0"
33
+ },
34
+ "devDependencies": {
35
+ "@chromatic-com/storybook": "^3.2.6",
36
+ "@eslint/js": "^9.25.0",
37
+ "@rollup/plugin-image": "^3.0.3",
38
+ "@storybook/addon-docs": "8.6.12",
39
+ "@storybook/addon-essentials": "^8.6.12",
40
+ "@storybook/addon-interactions": "^8.6.12",
41
+ "@storybook/addon-onboarding": "^8.6.12",
42
+ "@storybook/addon-styling-webpack": "^1.0.1",
43
+ "@storybook/blocks": "^8.6.12",
44
+ "@storybook/react": "^8.6.12",
45
+ "@storybook/react-vite": "^8.6.12",
46
+ "@storybook/test": "^8.6.12",
47
+ "@types/minimatch": "^6.0.0",
48
+ "@types/node": "^22.4.1",
49
+ "@types/react": "^18.3.3",
50
+ "@types/react-dom": "^18.3.0",
51
+ "@vitejs/plugin-react": "^4.4.1",
52
+ "@vitest/browser": "^3.1.3",
53
+ "@vitest/coverage-v8": "^3.1.3",
54
+ "eslint": "^9.25.0",
55
+ "eslint-plugin-react-hooks": "^5.2.0",
56
+ "eslint-plugin-react-refresh": "^0.4.19",
57
+ "eslint-plugin-storybook": "^0.12.0",
58
+ "gh-pages": "6.3.0",
59
+ "globals": "^16.0.0",
60
+ "playwright": "^1.52.0",
61
+ "rollup-plugin-copy": "^3.5.0",
62
+ "sass": "1.88.0",
63
+ "storybook": "^8.6.12",
64
+ "typescript": "~5.8.3",
65
+ "typescript-eslint": "^8.30.1",
66
+ "vite": "^6.3.5",
67
+ "vite-plugin-lib-inject-css": "^2.1.1",
68
+ "vitest": "^3.1.3"
69
+ },
70
+ "main": "dist/f-ui-kit.umd.js",
71
+ "module": "dist/f-ui-kit.es.js",
72
+ "types": "dist/types/index.d.ts",
73
+ "files": [
74
+ "dist",
75
+ "dist/types"
76
+ ],
77
+ "eslintConfig": {
78
+ "extends": [
79
+ "plugin:storybook/recommended"
80
+ ]
81
+ }
81
82
  }