chore(frontend): add eslint quality gate

This commit is contained in:
cesnimda
2026-08-30 00:19:51 +02:00
parent 7318b02e11
commit a74daa7aa4
21 changed files with 3729 additions and 82 deletions
@@ -11,14 +11,10 @@ import {
DialogContent,
DialogTitle,
Divider,
FormControl,
InputLabel,
List,
ListItemButton,
ListItemText,
MenuItem,
Paper,
Select,
Tab,
Tabs,
TextField,
@@ -190,7 +186,7 @@ export default function Correspondence({ jobId, jobContext }: { jobId: number; j
} finally {
setGmailMatchesLoading(false);
}
}, [jobId, toast]);
}, [jobId, t, toast]);
const loadAvailableJobs = useCallback(async (query?: string) => {
try {
@@ -19,7 +19,7 @@ type State = {
class ErrorBoundaryInner extends React.Component<ErrorBoundaryInnerProps, State> {
state: State = { hasError: false };
static getDerivedStateFromError(_: any) {
static getDerivedStateFromError() {
return { hasError: true };
}
@@ -30,7 +30,7 @@ import { emptyTailoredCvDraft, joinLines, normalizeTailoredCvDraft, splitLines }
import Correspondence from "./Correspondence";
import Attachments from "./Attachments";
import JobInsightTabs from "./JobInsightTabs";
import { DraftCard, ListCard, MatchScoreCard, PaperRow, SectionChips, TwoColumnSection, WorkspaceDraftCard } from "./JobDetailsPanels";
import { ListCard, PaperRow, WorkspaceDraftCard } from "./JobDetailsPanels";
import JobFlowBar from "./JobFlowBar";
import GradientButton from "./GradientButton";
import { useI18n } from "../i18n/I18nProvider";
@@ -81,10 +81,6 @@ function getFitLevel(candidateFit: CandidateFit | null): { label: string; color:
return { label: candidateFit.fitLevel, color: "default" };
}
function copyLines(items: string[]) {
return navigator.clipboard.writeText(items.map((item) => `${item}`).join("\n"));
}
function getWorkspaceStatus(currentValue: string, savedValue: string) {
const current = currentValue.trim();
const saved = savedValue.trim();
@@ -1,8 +1,7 @@
import React, { useEffect, useState } from "react";
import React, { useCallback, useEffect, useState } from "react";
import {
Alert,
Box,
Button,
Dialog,
DialogActions,
@@ -44,7 +43,7 @@ export default function SessionsSettingsCard() {
const [error, setError] = useState<string | null>(null);
const [confirmRevokeOthers, setConfirmRevokeOthers] = useState(false);
const loadSessions = () => {
const loadSessions = useCallback(() => {
setLoading(true);
setError(null);
api
@@ -52,9 +51,9 @@ export default function SessionsSettingsCard() {
.then((r) => setSessions(r.data))
.catch((e) => setError(apiErrorMessage(e, t)))
.finally(() => setLoading(false));
};
}, [t]);
useEffect(() => { loadSessions(); }, []);
useEffect(() => { loadSessions(); }, [loadSessions]);
async function revokeSession(id: string, isCurrentSession: boolean) {
try {
@@ -1,4 +1,4 @@
import React, { useEffect, useState } from "react";
import React, { useCallback, useEffect, useState } from "react";
import {
Alert,
@@ -69,11 +69,11 @@ export default function TwoFactorSettingsCard() {
const [devicesLoading, setDevicesLoading] = useState(false);
const [devicesError, setDevicesError] = useState<string | null>(null);
const loadStatus = () => {
const loadStatus = useCallback(() => {
api.get<Status>("/auth/2fa/status").then((r) => setStatus(r.data)).catch(() => setStatus(null));
};
}, []);
const loadDevices = () => {
const loadDevices = useCallback(() => {
setDevicesLoading(true);
setDevicesError(null);
api
@@ -81,9 +81,9 @@ export default function TwoFactorSettingsCard() {
.then((r) => setDevices(r.data))
.catch((e) => setDevicesError(apiErrorMessage(e, t)))
.finally(() => setDevicesLoading(false));
};
}, [t]);
useEffect(() => { loadStatus(); loadDevices(); }, []);
useEffect(() => { loadStatus(); loadDevices(); }, [loadDevices, loadStatus]);
async function revokeDevice(id: number) {
try {