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 { 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 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 = 'Loading...'; const [users, setUsers] = React.useState(loadingMessage); const [roles, setRoles] = React.useState(loadingMessage); const [permissions, setPermissions] = React.useState(loadingMessage); const [refresh_tokens, setRefresh_tokens] = React.useState(loadingMessage); const [categories, setCategories] = React.useState(loadingMessage); const [locations, setLocations] = React.useState(loadingMessage); const [businesses, setBusinesses] = React.useState(loadingMessage); const [business_photos, setBusiness_photos] = React.useState(loadingMessage); const [business_categories, setBusiness_categories] = React.useState(loadingMessage); const [service_prices, setService_prices] = React.useState(loadingMessage); const [business_badges, setBusiness_badges] = React.useState(loadingMessage); const [verification_submissions, setVerification_submissions] = React.useState(loadingMessage); const [verification_evidences, setVerification_evidences] = React.useState(loadingMessage); const [leads, setLeads] = React.useState(loadingMessage); const [lead_photos, setLead_photos] = React.useState(loadingMessage); const [lead_matches, setLead_matches] = React.useState(loadingMessage); const [messages, setMessages] = React.useState(loadingMessage); const [lead_events, setLead_events] = React.useState(loadingMessage); const [reviews, setReviews] = React.useState(loadingMessage); const [disputes, setDisputes] = React.useState(loadingMessage); const [audit_logs, setAudit_logs] = React.useState(loadingMessage); const [badge_rules, setBadge_rules] = React.useState(loadingMessage); const [trust_adjustments, setTrust_adjustments] = 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); async function loadData() { const entities = ['users','roles','permissions','refresh_tokens','categories','locations','businesses','business_photos','business_categories','service_prices','business_badges','verification_submissions','verification_evidences','leads','lead_photos','lead_matches','messages','lead_events','reviews','disputes','audit_logs','badge_rules','trust_adjustments',]; const fns = [setUsers,setRoles,setPermissions,setRefresh_tokens,setCategories,setLocations,setBusinesses,setBusiness_photos,setBusiness_categories,setService_prices,setBusiness_badges,setVerification_submissions,setVerification_evidences,setLeads,setLead_photos,setLead_matches,setMessages,setLead_events,setReviews,setDisputes,setAudit_logs,setBadge_rules,setTrust_adjustments,]; 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 ( <> {getPageTitle('Overview')} {''} {hasPermission(currentUser, 'CREATE_ROLES') && } {!!rolesWidgets.length && hasPermission(currentUser, 'CREATE_ROLES') && (

{`${widgetsRole?.role?.label || 'Users'}'s widgets`}

)}
{(isFetchingQuery || loading) && (
{' '} Loading widgets...
)} { rolesWidgets && rolesWidgets.map((widget) => ( ))}
{!!rolesWidgets.length &&
}
{hasPermission(currentUser, 'READ_USERS') &&
Users
{users}
} {hasPermission(currentUser, 'READ_ROLES') &&
Roles
{roles}
} {hasPermission(currentUser, 'READ_PERMISSIONS') &&
Permissions
{permissions}
} {hasPermission(currentUser, 'READ_REFRESH_TOKENS') &&
Refresh tokens
{refresh_tokens}
} {hasPermission(currentUser, 'READ_CATEGORIES') &&
Categories
{categories}
} {hasPermission(currentUser, 'READ_LOCATIONS') &&
Locations
{locations}
} {hasPermission(currentUser, 'READ_BUSINESSES') &&
Businesses
{businesses}
} {hasPermission(currentUser, 'READ_BUSINESS_PHOTOS') &&
Business photos
{business_photos}
} {hasPermission(currentUser, 'READ_BUSINESS_CATEGORIES') &&
Business categories
{business_categories}
} {hasPermission(currentUser, 'READ_SERVICE_PRICES') &&
Service prices
{service_prices}
} {hasPermission(currentUser, 'READ_BUSINESS_BADGES') &&
Business badges
{business_badges}
} {hasPermission(currentUser, 'READ_VERIFICATION_SUBMISSIONS') &&
Verification submissions
{verification_submissions}
} {hasPermission(currentUser, 'READ_VERIFICATION_EVIDENCES') &&
Verification evidences
{verification_evidences}
} {hasPermission(currentUser, 'READ_LEADS') &&
Leads
{leads}
} {hasPermission(currentUser, 'READ_LEAD_PHOTOS') &&
Lead photos
{lead_photos}
} {hasPermission(currentUser, 'READ_LEAD_MATCHES') &&
Lead matches
{lead_matches}
} {hasPermission(currentUser, 'READ_MESSAGES') &&
Messages
{messages}
} {hasPermission(currentUser, 'READ_LEAD_EVENTS') &&
Lead events
{lead_events}
} {hasPermission(currentUser, 'READ_REVIEWS') &&
Reviews
{reviews}
} {hasPermission(currentUser, 'READ_DISPUTES') &&
Disputes
{disputes}
} {hasPermission(currentUser, 'READ_AUDIT_LOGS') &&
Audit logs
{audit_logs}
} {hasPermission(currentUser, 'READ_BADGE_RULES') &&
Badge rules
{badge_rules}
} {hasPermission(currentUser, 'READ_TRUST_ADJUSTMENTS') &&
Trust adjustments
{trust_adjustments}
}
) } Dashboard.getLayout = function getLayout(page: ReactElement) { return {page} } export default Dashboard