import * as icon from '@mdi/js'; import Head from 'next/head'; import React from 'react'; import axios from 'axios'; import type { ReactElement } from 'react'; import LayoutAuthenticated from '../layouts/Authenticated'; import SectionMain from '../components/SectionMain'; import SectionTitleLineWithButton from '../components/SectionTitleLineWithButton'; import BaseIcon from '../components/BaseIcon'; import { getPageTitle } from '../config'; import Link from 'next/link'; import { useTranslation } from 'next-i18next'; import { hasPermission } from '../helpers/userPermissions'; import { fetchWidgets } from '../stores/roles/rolesSlice'; import { WidgetCreator } from '../components/WidgetCreator/WidgetCreator'; import { SmartWidget } from '../components/SmartWidget/SmartWidget'; import { useAppDispatch, useAppSelector } from '../stores/hooks'; const Dashboard = () => { const { t } = useTranslation('common'); const dispatch = useAppDispatch(); const iconsColor = useAppSelector((state) => state.style.iconsColor); const corners = useAppSelector((state) => state.style.corners); const cardsStyle = useAppSelector((state) => state.style.cardsStyle); const loadingMessage = t('pages.dashboard.loading', { defaultValue: 'Loading...', }); const [users, setUsers] = React.useState(loadingMessage); const [activities, setActivities] = React.useState(loadingMessage); const [appraisals, setAppraisals] = React.useState(loadingMessage); const [clients, setClients] = React.useState(loadingMessage); const [invoices, setInvoices] = React.useState(loadingMessage); const [messages, setMessages] = React.useState(loadingMessage); const [notifications, setNotifications] = React.useState(loadingMessage); const [orders, setOrders] = React.useState(loadingMessage); const [properties, setProperties] = React.useState(loadingMessage); const [roles, setRoles] = React.useState(loadingMessage); const [permissions, setPermissions] = React.useState(loadingMessage); const [organizations, setOrganizations] = React.useState(loadingMessage); const [widgetsRole, setWidgetsRole] = React.useState({ role: { value: '', label: '' }, }); const { currentUser } = useAppSelector((state) => state.auth); const { isFetchingQuery } = useAppSelector((state) => state.openAi); const { rolesWidgets, loading } = useAppSelector((state) => state.roles); const organizationId = currentUser?.organizations?.id; async function loadData() { const entities = [ 'users', 'activities', 'appraisals', 'clients', 'invoices', 'messages', 'notifications', 'orders', 'properties', 'roles', 'permissions', 'organizations', ]; const fns = [ setUsers, setActivities, setAppraisals, setClients, setInvoices, setMessages, setNotifications, setOrders, setProperties, setRoles, setPermissions, setOrganizations, ]; const requests = entities.map((entity, index) => { if (hasPermission(currentUser, `READ_${entity.toUpperCase()}`)) { return axios.get(`/${entity.toLowerCase()}/count`); } else { fns[index](null); return Promise.resolve({ data: { count: null } }); } }); Promise.allSettled(requests).then((results) => { results.forEach((result, i) => { if (result.status === 'fulfilled') { fns[i](result.value.data.count); } else { fns[i](result.reason.message); } }); }); } async function getWidgets(roleId) { await dispatch(fetchWidgets(roleId)); } React.useEffect(() => { if (!currentUser) return; loadData().then(); setWidgetsRole({ role: { value: currentUser?.app_role?.id, label: currentUser?.app_role?.name, }, }); }, [currentUser]); React.useEffect(() => { if (!currentUser || !widgetsRole?.role?.value) return; getWidgets(widgetsRole?.role?.value || '').then(); }, [widgetsRole?.role?.value]); return ( <>
Welcome to VRES, {currentUser.first_name}!
)} {hasPermission(currentUser, 'CREATE_ROLES') && ({`${widgetsRole?.role?.label || 'Users'}'s widgets`}
)}