prototype 1.0
This commit is contained in:
111
src/App.tsx
111
src/App.tsx
@@ -1,82 +1,39 @@
|
||||
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(),
|
||||
};
|
||||
import React from 'react';
|
||||
import { Admin, Resource } from 'react-admin';
|
||||
import { authProvider } from './authProvider';
|
||||
import { dataProvider } from './dataProvider';
|
||||
import Dashboard from './resources/dashboard/Dashboard';
|
||||
import { UserList, UserEdit } from './resources/users';
|
||||
import { ReportList, ReportEdit } from './resources/reports';
|
||||
import { TicketList, TicketEdit } from './resources/tickets';
|
||||
import { AdminList, AdminEdit } from './resources/admins';
|
||||
import { BannedWordList, BannedWordEdit } from './resources/banned-words';
|
||||
import { SubscriptionList, SubscriptionEdit } from './resources/subscriptions';
|
||||
import { ReviewList, ReviewEdit } from './resources/reviews';
|
||||
import { AuditList } from './resources/audit';
|
||||
|
||||
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>
|
||||
<Admin
|
||||
dashboard={Dashboard}
|
||||
authProvider={authProvider}
|
||||
dataProvider={dataProvider}
|
||||
requireAuth
|
||||
>
|
||||
{(permissions) => [
|
||||
// Доступно всем администраторам
|
||||
<Resource name="users" list={UserList} edit={UserEdit} />,
|
||||
<Resource name="reports" list={ReportList} edit={ReportEdit} />,
|
||||
<Resource name="tickets" list={TicketList} edit={TicketEdit} />,
|
||||
<Resource name="banned-words" list={BannedWordList} edit={BannedWordEdit} />,
|
||||
<Resource name="subscriptions" list={SubscriptionList} edit={SubscriptionEdit} />,
|
||||
<Resource name="reviews" list={ReviewList} edit={ReviewEdit} />,
|
||||
<Resource name="audit" list={AuditList} />,
|
||||
// Только superadmin
|
||||
permissions === 'superadmin' ? (
|
||||
<Resource name="admins" list={AdminList} edit={AdminEdit} />
|
||||
) : null,
|
||||
]}
|
||||
</Admin>
|
||||
);
|
||||
|
||||
export default App;
|
||||
Reference in New Issue
Block a user