diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index fa5e8f3..716fb47 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -5,11 +5,16 @@ on: branches: [master, main] pull_request: +concurrency: + group: eventhub-frontadmin-${{ github.ref }} + cancel-in-progress: false + jobs: test: runs-on: ubuntu-latest + timeout-minutes: 30 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: diff --git a/.gitea/workflows/deploy-ift.yml b/.gitea/workflows/deploy-ift.yml index 4abc04b..461c1b5 100644 --- a/.gitea/workflows/deploy-ift.yml +++ b/.gitea/workflows/deploy-ift.yml @@ -7,7 +7,7 @@ on: # Один runner (WSL): параллельные workflow ломают buildx/act. concurrency: - group: eventhub-frontadmin-deploy-ift + group: eventhub-frontadmin-${{ github.ref }} cancel-in-progress: false env: diff --git a/eslint.config.js b/eslint.config.js index ef614d2..90b7d60 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -18,5 +18,19 @@ export default defineConfig([ languageOptions: { globals: globals.browser, }, + rules: { + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-unused-vars': [ + 'warn', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + 'react-hooks/set-state-in-effect': 'warn', + 'react-hooks/exhaustive-deps': 'warn', + }, }, ]) diff --git a/src/layouts/AdminLayout.tsx b/src/layouts/AdminLayout.tsx index ddc782c..5ce8041 100644 --- a/src/layouts/AdminLayout.tsx +++ b/src/layouts/AdminLayout.tsx @@ -3,7 +3,7 @@ import { Layout, Menu, Button, theme, notification, Avatar, Dropdown, Space, Typ import { Outlet, useNavigate, useLocation } from 'react-router-dom'; import { useAuthStore } from '../store/authStore'; import { useAdminWebSocket } from '../hooks/useAdminWebSocket'; -import { useMetricsStore } from '../store/metricsStore'; +import { useMetricsStore, type NodeMetric } from '../store/metricsStore'; import MetricIndicator from '../components/MetricIndicator'; import { DashboardOutlined, @@ -39,7 +39,6 @@ const AdminLayout: React.FC = () => { const [collapsed, setCollapsed] = useState(false); const allHistory = useMetricsStore((s) => s.allHistory); - const current = useMetricsStore((s) => s.current); const previous = useMetricsStore((s) => s.previous); useEffect(() => { @@ -99,7 +98,7 @@ const AdminLayout: React.FC = () => { }, [allHistory]); const latestByNode = React.useMemo(() => { - const map = new Map(); + const map = new Map(); const recent = allHistory.slice(-1000); for (let i = recent.length - 1; i >= 0; i--) { const m = recent[i]; @@ -147,7 +146,7 @@ const AdminLayout: React.FC = () => { return user?.id ?? '—'; }; - const NodeIndicator: React.FC<{ node: string; stats: NonNullable; prevStats?: typeof current }> = ({ + const NodeIndicator: React.FC<{ node: string; stats: NodeMetric; prevStats?: NodeMetric }> = ({ node, stats, prevStats,