prototype

This commit is contained in:
2026-05-05 18:41:51 +03:00
parent d4c42061ba
commit 5ddc23210b
23 changed files with 4920 additions and 1 deletions

82
src/App.tsx Normal file
View File

@@ -0,0 +1,82 @@
import { Admin, Resource, ListGuesser, fetchUtils } from 'react-admin';
import simpleRestProvider from 'ra-data-simple-rest';
// Кастомный httpClient, добавляющий X-Total-Count, если его нет
const httpClient = (url: string, options: any = {}) => {
// Добавляем JWT токен
const token = localStorage.getItem('token');
if (token) {
options.headers = new Headers({
...options.headers,
Authorization: `Bearer ${token}`,
});
}
return fetchUtils.fetchJson(url, options).then((response) => {
const { headers, json } = response;
// Если это GET-запрос и ответ - массив, добавляем X-Total-Count
if (
!options.method || options.method === 'GET'
) {
if (Array.isArray(json)) {
// Создаём новый объект Response с добавленным заголовком
const newHeaders = new Headers(headers);
if (!newHeaders.has('X-Total-Count')) {
newHeaders.set('X-Total-Count', json.length.toString());
}
return Promise.resolve({
status: response.status,
headers: newHeaders,
body: json,
json: json,
});
}
}
return response;
});
};
const dataProvider = simpleRestProvider('/api', httpClient);
const authProvider = {
login: ({ username, password }: any) => {
return fetch('/v1/admin/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: username, password }),
})
.then((res) => {
if (res.ok) return res.json();
throw new Error(res.statusText);
})
.then((data) => {
localStorage.setItem('token', data.token);
return Promise.resolve();
});
},
logout: () => {
localStorage.removeItem('token');
return Promise.resolve();
},
checkAuth: () =>
localStorage.getItem('token') ? Promise.resolve() : Promise.reject(),
checkError: (error: any) => {
if (error.status === 401) {
localStorage.removeItem('token');
return Promise.reject();
}
return Promise.resolve();
},
getPermissions: () => Promise.resolve(),
};
const App = () => (
<Admin dataProvider={dataProvider} authProvider={authProvider}>
<Resource name="users" list={ListGuesser} />
<Resource name="events" list={ListGuesser} />
<Resource name="complaints" list={ListGuesser} />
<Resource name="bugs" list={ListGuesser} />
</Admin>
);
export default App;