diff --git a/eslint.config.js b/eslint.config.js index 7e3b8ef7d..710ddf486 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -61,7 +61,7 @@ export default [ // TypeScript strict rules '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/no-explicit-any': 'error', - '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_' }], '@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports', fixStyle: 'inline-type-imports' }], '@typescript-eslint/no-non-null-assertion': 'warn', '@typescript-eslint/naming-convention': [ @@ -110,7 +110,7 @@ export default [ ...typescript.configs.recommended.rules, // E2E tem fixtures, helpers e selectors — relaxar regras de produção: '@typescript-eslint/no-explicit-any': 'warn', - '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], + '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_' }], '@typescript-eslint/no-non-null-assertion': 'off', 'no-console': 'off', 'no-empty-pattern': 'off', // Playwright fixtures: ({}, testInfo) => ... @@ -175,7 +175,7 @@ export default [ 'react/react-in-jsx-scope': 'off', 'react/prop-types': 'off', '@typescript-eslint/no-explicit-any': 'warn', - '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], + '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_' }], '@typescript-eslint/no-non-null-assertion': 'off', 'no-console': 'off', // Tests podem usar mocks/stubs com nomes não convencionais diff --git a/scripts/codemod-unused-vars.mjs b/scripts/codemod-unused-vars.mjs new file mode 100644 index 000000000..d808e791d --- /dev/null +++ b/scripts/codemod-unused-vars.mjs @@ -0,0 +1,329 @@ +#!/usr/bin/env node +/** + * Codemod for `@typescript-eslint/no-unused-vars`. Walks the ESLint + * output, locates each unused identifier in source, and applies the + * right transform per declaration kind: + * + * - Unused IMPORT named specifiers → removed from the import (the + * entire import is dropped if it becomes empty). + * - Unused IMPORT default → import line removed. + * - Unused FUNCTION PARAMETERS → renamed to `_name` to satisfy the + * `argsIgnorePattern: '^_'` config (cannot be removed without + * breaking arity for callers). + * - Unused DESTRUCTURED VARIABLES → renamed to `_name` for the same + * reason (siblings in the destructure pattern may be used). + * - Unused LOCAL VARIABLES (`const`/`let`) → renamed to `_name` (safer + * than removal: the right-hand side may have intentional side + * effects; a manual review pass can drop them later). + * + * Skipped: identifiers that look already-prefixed (`_name`); identifiers + * inside JSX attributes (rare false positive of TS inference). + * + * Usage: + * node scripts/codemod-unused-vars.mjs # rewrite src/ + * node scripts/codemod-unused-vars.mjs --check # exit 1 if any + * # remaining unused + * node scripts/codemod-unused-vars.mjs --dry-run # log what would + * # change without + * # writing + */ +import { readFile, writeFile } from 'node:fs/promises'; +import { spawnSync } from 'node:child_process'; + +const args = new Set(process.argv.slice(2)); +const CHECK_ONLY = args.has('--check'); +const DRY_RUN = args.has('--dry-run'); + +/** + * Run eslint and return all `@typescript-eslint/no-unused-vars` errors + * grouped by file. Each entry: { file, errors: [{ line, column, name }] }. + */ +function gatherErrors() { + const proc = spawnSync( + 'npx', + ['eslint', 'src', '--max-warnings=500', '--format=json'], + { encoding: 'utf8', maxBuffer: 200 * 1024 * 1024 }, + ); + // eslint exits non-zero when there are violations — that's expected. + let parsed; + try { + parsed = JSON.parse(proc.stdout); + } catch (e) { + console.error('eslint did not produce valid JSON output'); + console.error(proc.stderr); + process.exit(2); + } + const byFile = new Map(); + for (const result of parsed) { + for (const msg of result.messages) { + if (msg.ruleId !== '@typescript-eslint/no-unused-vars') continue; + // Extract the identifier name from the message text: + // "'foo' is defined but never used. ..." + // "'foo' is assigned a value but never used. ..." + const m = msg.message.match(/^'([^']+)'\s+is\s+(defined|assigned)/); + if (!m) continue; + const name = m[1]; + if (!byFile.has(result.filePath)) byFile.set(result.filePath, []); + byFile.get(result.filePath).push({ + line: msg.line, + column: msg.column, + name, + }); + } + } + return byFile; +} + +/** + * Locate the identifier `name` starting at (line, column) — 1-based — in + * the file source. Returns the absolute character index or -1. + */ +function findIdentifier(src, line, column, name) { + const lines = src.split('\n'); + if (line - 1 >= lines.length) return -1; + const offsetInLine = column - 1; + // ESLint columns can occasionally point at the keyword (let/const/import) + // rather than the identifier itself; search for the name on the line if + // the direct lookup misses. + let lineStart = 0; + for (let i = 0; i < line - 1; i++) lineStart += lines[i].length + 1; + if (lines[line - 1].slice(offsetInLine, offsetInLine + name.length) === name) { + return lineStart + offsetInLine; + } + const found = lines[line - 1].indexOf(name, offsetInLine); + if (found !== -1) return lineStart + found; + // Fall back: search the whole line + const found2 = lines[line - 1].indexOf(name); + return found2 === -1 ? -1 : lineStart + found2; +} + +/** + * Determine the declaration kind from the source surrounding the + * identifier. Returns one of: 'import-named' | 'import-default' | + * 'param' | 'destructure' | 'local' | 'unknown'. + */ +function classify(src, idx, name) { + // Find the line containing idx + const lineStart = src.lastIndexOf('\n', idx - 1) + 1; + const lineEnd = src.indexOf('\n', idx); + const lineText = src.slice(lineStart, lineEnd === -1 ? src.length : lineEnd); + + // import line — single-line OR multi-line (`import { Foo,\n Bar } from "x"`) + // Look back from idx for the start of the statement (max 800 chars). + const back = src.slice(Math.max(0, idx - 800), idx); + // Find the LAST 'import' before idx, then check if a 'from' has appeared + // after it (which would mean the import is closed and we're past it). + const lastImportRel = back.lastIndexOf('import '); + const lastFromRel = back.lastIndexOf('from '); + const insideImport = + lastImportRel !== -1 && (lastFromRel === -1 || lastImportRel > lastFromRel); + if (insideImport || /^\s*import\b/.test(lineText)) { + // Inside braces? → named import + // Use the same look-back to find the most recent `{`/`}` and decide. + const lastOpenBrace = back.lastIndexOf('{'); + const lastCloseBrace = back.lastIndexOf('}'); + if (lastOpenBrace !== -1 && lastOpenBrace > lastCloseBrace) { + return 'import-named'; + } + return 'import-default'; + } + + // Look back (within the same statement) for a destructure opener. + // Heuristic: in the 200 chars before idx, was there a `{` or `[` not + // matched by a `}` or `]`? + const window = src.slice(Math.max(0, idx - 400), idx); + const opens = (window.match(/[{[]/g) || []).length; + const closes = (window.match(/[}\]]/g) || []).length; + const inDestructure = opens > closes; + + // Function param? Look backward for `(` not matched and not preceded + // by something that suggests a call (identifier). + // Heuristic: in the same 400-char window, more `(` than `)`? + const opensP = (window.match(/\(/g) || []).length; + const closesP = (window.match(/\)/g) || []).length; + const inParens = opensP > closesP; + + // const/let/var declaration on the same line (immediately before idx)? + if (/\b(?:const|let|var)\b\s+(?:\{[^}]*|\[[^\]]*)?$/.test(lineText.slice(0, idx - lineStart)) + || /^\s*(?:const|let|var)\b/.test(lineText)) { + if (inDestructure) return 'destructure'; + return 'local'; + } + + if (inDestructure) return 'destructure'; + if (inParens) return 'param'; + return 'unknown'; +} + +const stats = { import: 0, param: 0, local: 0, destructure: 0, skipped: 0 }; + +const byFile = gatherErrors(); +if (CHECK_ONLY) { + let total = 0; + for (const errors of byFile.values()) total += errors.length; + if (total > 0) { + console.error(`✖ ${total} unused identifier(s) across ${byFile.size} file(s).`); + console.error('Run: node scripts/codemod-unused-vars.mjs'); + process.exit(1); + } + console.log('✅ no @typescript-eslint/no-unused-vars violations.'); + process.exit(0); +} + +let filesChanged = 0; + +for (const [file, errors] of byFile) { + let src = await readFile(file, 'utf8'); + // Process from highest line/column to lowest so edits don't invalidate + // earlier coordinates. + errors.sort((a, b) => (b.line - a.line) || (b.column - a.column)); + + let mutated = false; + + for (const err of errors) { + if (err.name.startsWith('_')) { + stats.skipped++; + continue; + } + const idx = findIdentifier(src, err.line, err.column, err.name); + if (idx === -1) { + stats.skipped++; + continue; + } + const kind = classify(src, idx, err.name); + + if (kind === 'import-named') { + // Drop this named specifier from the import. If the import becomes + // empty (no default, no named, no namespace), drop the entire line. + const newSrc = removeImportNamedSpec(src, idx, err.name); + if (newSrc === null) { + stats.skipped++; + continue; + } + src = newSrc; + stats.import++; + mutated = true; + } else if (kind === 'import-default') { + // Drop the entire import line. + const newSrc = removeImportLine(src, idx); + if (newSrc === null) { + stats.skipped++; + continue; + } + src = newSrc; + stats.import++; + mutated = true; + } else if (kind === 'param' || kind === 'destructure' || kind === 'local') { + // Prefix with `_`. Safe: matches the eslint argsIgnorePattern / + // varsIgnorePattern. Need to ensure we only rename the binding, + // not other occurrences elsewhere — the binding lives at idx and + // is exactly `err.name.length` chars long. + src = src.slice(0, idx) + '_' + src.slice(idx); + stats[kind === 'destructure' ? 'destructure' : kind === 'param' ? 'param' : 'local']++; + mutated = true; + } else { + stats.skipped++; + } + } + + if (mutated) { + if (DRY_RUN) { + console.log(`would write ${file}`); + } else { + await writeFile(file, src, 'utf8'); + } + filesChanged++; + } +} + +console.log(''); +console.log( + `Files changed: ${filesChanged}. Edits — imports: ${stats.import}, ` + + `params: ${stats.param}, destructure: ${stats.destructure}, ` + + `locals: ${stats.local}, skipped: ${stats.skipped}.`, +); + +/** + * Remove the named specifier `name` from the import statement that contains + * `idx`. Returns the new source, or null if the parse failed. + * + * Handles: + * import { Foo, Bar } from "x" → import { Bar } from "x" + * import { Foo, type T } from "x" → import { type T } from "x" + * import { Foo as F } from "x" → removes the alias clause + * import Default, { Foo } from "x" → removes only the {Foo}; if braces + * become empty, drops the whole brace + * group but keeps the default import. + */ +function removeImportNamedSpec(src, idx, name) { + // Find the brace containing idx (back to nearest `{`, forward to `}`). + const openBrace = src.lastIndexOf('{', idx); + const closeBrace = src.indexOf('}', idx); + if (openBrace === -1 || closeBrace === -1) return null; + + const body = src.slice(openBrace + 1, closeBrace); + const specs = body.split(',').map((s) => s.trim()).filter(Boolean); + + // Match the specifier whose binding name (post-`as`) equals `name`. + // For `Foo as Bar`, the binding is `Bar`. For `type Foo`, the binding + // is `Foo`. + const idxOfMatch = specs.findIndex((s) => { + const trimmed = s.replace(/^type\s+/, '').trim(); + const asMatch = trimmed.match(/\bas\s+([A-Za-z0-9_$]+)$/); + const local = asMatch ? asMatch[1] : trimmed; + return local === name; + }); + if (idxOfMatch === -1) return null; + + specs.splice(idxOfMatch, 1); + + // Find the import statement bounds. + const importStart = src.lastIndexOf('import', openBrace); + let importEnd = src.indexOf(';', closeBrace); + if (importEnd === -1) importEnd = src.indexOf('\n', closeBrace); + if (importEnd === -1) importEnd = src.length; + + const importLine = src.slice(importStart, importEnd + 1); + + // Was there a default import or namespace alongside the braces? + const beforeBrace = src.slice(importStart, openBrace); + const hasDefault = /import\s+[A-Za-z0-9_$]+\s*,\s*\{/.test(beforeBrace) || + /import\s+[A-Za-z0-9_$]+\s*,\s*\*/.test(beforeBrace); + const hasNamespace = /\*\s+as\s+[A-Za-z0-9_$]+/.test(importLine); + + if (specs.length === 0) { + if (hasDefault || hasNamespace) { + // Drop the {} group and its leading comma. + // Find the comma after the default ident. + const trimmedBefore = beforeBrace.replace(/,\s*$/, ' '); + const newImport = trimmedBefore + src.slice(closeBrace + 1, importEnd + 1); + return src.slice(0, importStart) + newImport.trimEnd().replace(/\s+/g, ' ').replace(/^\s*import\s+/, 'import ') + src.slice(importEnd + 1); + } + // No default/namespace — drop the whole import line. + return removeImportLine(src, importStart); + } + + // Rebuild the brace body. + const newBody = ` ${specs.join(', ')} `; + return src.slice(0, openBrace + 1) + newBody + src.slice(closeBrace); +} + +/** + * Remove the import statement that contains `idx`. Drops trailing newline. + */ +function removeImportLine(src, idx) { + const lineStart = src.lastIndexOf('\n', idx - 1) + 1; + // Statement may span lines; find the terminating `;` or end-of-line that + // closes a single-line import. + let lineEnd = src.indexOf(';', idx); + if (lineEnd === -1 || lineEnd > src.indexOf('\n', idx) && src.indexOf('\n', idx) !== -1 && !src.slice(idx, src.indexOf('\n', idx)).includes('{')) { + // Single-line import without trailing semicolon + lineEnd = src.indexOf('\n', idx); + if (lineEnd === -1) return null; + } else { + lineEnd += 1; // include the `;` + } + // Include the trailing newline if present + if (src[lineEnd] === '\n') lineEnd += 1; + return src.slice(0, lineStart) + src.slice(lineEnd); +} diff --git a/src/App.tsx b/src/App.tsx index 395af1dbe..127231904 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState, type FC } from "react"; +import { useEffect, useState } from "react"; import { Toaster } from "@/components/ui/toaster"; import { Toaster as Sonner } from "@/components/ui/sonner"; import { TooltipProvider } from "@/components/ui/tooltip"; @@ -15,7 +15,6 @@ import { DevRoute } from "@/components/layout/DevRoute"; import { DeprecatedRoute } from "@/components/layout/DeprecatedRoute"; import { AppProviders } from "@/components/providers/AppProviders"; import { AccessibilityProvider, AriaLiveProvider } from "@/components/a11y"; -import LoadingScreen from "@/components/LoadingScreen"; import { useGlobalErrorCatcher } from "@/hooks/useErrorHandler"; import { markBootSuccessful } from "@/lib/chunk-recovery"; import { getFallback } from "@/components/layout/SkeletonLoaders"; @@ -154,7 +153,7 @@ function RouteSuspense({ children }: { children: React.ReactNode }) { } const App = () => { - const [isOnline, setIsOnline] = useState(navigator.onLine); + const [_isOnline, setIsOnline] = useState(navigator.onLine); useGlobalErrorCatcher(); // Apply saved theme on boot (ThemeInitializer handles re-apply on mode change) diff --git a/src/components/admin/DiscountApprovalHeaderBadge.tsx b/src/components/admin/DiscountApprovalHeaderBadge.tsx index 37b07be31..6b2b03169 100644 --- a/src/components/admin/DiscountApprovalHeaderBadge.tsx +++ b/src/components/admin/DiscountApprovalHeaderBadge.tsx @@ -1,4 +1,4 @@ -import { forwardRef, useEffect } from "react"; +import { useEffect } from "react"; import { Shield } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { useQuery, useQueryClient } from "@tanstack/react-query"; diff --git a/src/components/admin/GroupPersonalizationManager.tsx b/src/components/admin/GroupPersonalizationManager.tsx index be2e42f15..b16a5c4d2 100644 --- a/src/components/admin/GroupPersonalizationManager.tsx +++ b/src/components/admin/GroupPersonalizationManager.tsx @@ -23,7 +23,7 @@ export function GroupPersonalizationManager() { selectedGroup, setSelectedGroup, groups, groupsLoading, components, componentsLoading, - locations, techniques, locationTechniques, + locations, techniques, _locationTechniques, addComponent, updateComponent, deleteComponent, addLocation, updateLocation, deleteLocation, addTechnique, updateTechnique, deleteTechnique, diff --git a/src/components/admin/PasswordResetApproval.tsx b/src/components/admin/PasswordResetApproval.tsx index 7f3c26f12..b6ade781a 100644 --- a/src/components/admin/PasswordResetApproval.tsx +++ b/src/components/admin/PasswordResetApproval.tsx @@ -17,7 +17,7 @@ import { import { usePasswordResetRequests, type PasswordResetRequest } from '@/hooks/usePasswordResetRequests'; export function PasswordResetApproval() { - const { requests, isLoading, approveRequest, rejectRequest, refetch } = usePasswordResetRequests(); + const { requests, isLoading, approveRequest, rejectRequest, _refetch } = usePasswordResetRequests(); const [selectedRequest, setSelectedRequest] = useState(null); const [action, setAction] = useState<'approve' | 'reject' | null>(null); const [notes, setNotes] = useState(''); diff --git a/src/components/admin/ProductPersonalizationManager.tsx b/src/components/admin/ProductPersonalizationManager.tsx index 6be85c95d..6bb8b8f0a 100644 --- a/src/components/admin/ProductPersonalizationManager.tsx +++ b/src/components/admin/ProductPersonalizationManager.tsx @@ -71,7 +71,7 @@ export function ProductPersonalizationManager() { const handleAddTechnique = () => { if (!selectedLocationId || !newTechniqueId) return; - const location = getLocationsForComponent("").length ? undefined : undefined; // lookup below + const _location = getLocationsForComponent("").length ? undefined : undefined; // lookup below const allLocs = components?.flatMap(c => getLocationsForComponent(c.id)) || []; const loc = allLocs.find(l => l.id === selectedLocationId); const comp = components?.find(c => c.id === loc?.component_id); diff --git a/src/components/admin/connections/ConnectionsPulseBar.tsx b/src/components/admin/connections/ConnectionsPulseBar.tsx index 09449acec..6696fc469 100644 --- a/src/components/admin/connections/ConnectionsPulseBar.tsx +++ b/src/components/admin/connections/ConnectionsPulseBar.tsx @@ -9,7 +9,7 @@ * * Tom de voz: híbrido com tradução (termo técnico + explicação curta). */ -import { Activity, AlertTriangle, AlertOctagon, CheckCircle2, RefreshCw, Webhook, Clock, XCircle } from "lucide-react"; +import { type Activity, AlertTriangle, AlertOctagon, CheckCircle2, RefreshCw, Webhook, Clock, XCircle } from "lucide-react"; import { formatDistanceToNow } from "date-fns"; import { ptBR } from "date-fns/locale"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; diff --git a/src/components/admin/connections/EventsMultiSelect.tsx b/src/components/admin/connections/EventsMultiSelect.tsx index 8b7d6df4f..0f4e79662 100644 --- a/src/components/admin/connections/EventsMultiSelect.tsx +++ b/src/components/admin/connections/EventsMultiSelect.tsx @@ -3,7 +3,6 @@ * Multi-select agrupado por categoria com busca, "todos do grupo" e suporte a eventos legacy. */ import { useMemo, useState } from "react"; -import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Check, Search, X } from "lucide-react"; diff --git a/src/components/admin/connections/InboundEventsPanel.tsx b/src/components/admin/connections/InboundEventsPanel.tsx index d4670ca1a..70e0deb9b 100644 --- a/src/components/admin/connections/InboundEventsPanel.tsx +++ b/src/components/admin/connections/InboundEventsPanel.tsx @@ -85,7 +85,7 @@ export function InboundEventsPanel() { setLoading(false); }; - useEffect(() => { load(); /* eslint-disable-next-line react-hooks/exhaustive-deps */ }, [period, endpointFilter, onlyInvalid, onlyUnprocessed]); + useEffect(() => { load(); }, [period, endpointFilter, onlyInvalid, onlyUnprocessed]); const epMap = useMemo(() => new Map(endpoints.map((e) => [e.id, e])), [endpoints]); diff --git a/src/components/admin/connections/IntegrationsHealthCard.tsx b/src/components/admin/connections/IntegrationsHealthCard.tsx index 433d84be6..83ac03af5 100644 --- a/src/components/admin/connections/IntegrationsHealthCard.tsx +++ b/src/components/admin/connections/IntegrationsHealthCard.tsx @@ -30,7 +30,7 @@ import { toast } from "sonner"; import { useCredentialsSourceFilter, resolveSource, - type CredentialSource, + type _CredentialSource, } from "./CredentialsSourceFilterContext"; import type { SecretStatus } from "@/hooks/useSecretsManager"; diff --git a/src/components/admin/connections/KeysValidationTab.tsx b/src/components/admin/connections/KeysValidationTab.tsx index 618daba06..5433738a0 100644 --- a/src/components/admin/connections/KeysValidationTab.tsx +++ b/src/components/admin/connections/KeysValidationTab.tsx @@ -13,7 +13,7 @@ import { Briefcase, Workflow, Plug, - Webhook, + _Webhook, } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; diff --git a/src/components/admin/connections/SecretField.tsx b/src/components/admin/connections/SecretField.tsx index 6b79af87f..61c5d44e8 100644 --- a/src/components/admin/connections/SecretField.tsx +++ b/src/components/admin/connections/SecretField.tsx @@ -1,7 +1,7 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { AlertCircle, Check, CheckCircle2, Eye, EyeOff, Loader2, RefreshCw, RotateCw, Save, ShieldAlert, Sparkles } from "lucide-react"; import { validateSecret, getMinLength, MIN_SUFFIX_LENGTH } from "./secretValidators"; -import { formatMaskedSuffix, normalizeMaskedSuffix, diagnoseMaskedSuffix } from "@/lib/masked-suffix"; +import { formatMaskedSuffix, normalizeMaskedSuffix } from "@/lib/masked-suffix"; import { MaskedSuffixBadge } from "./MaskedSuffixBadge"; import { normalizeSecret } from "./secretNormalizers"; import { validateSecretName } from "./secretWhitelist"; diff --git a/src/components/admin/connections/SmokeTestChecklist.tsx b/src/components/admin/connections/SmokeTestChecklist.tsx index 2337bee56..95e82b8ae 100644 --- a/src/components/admin/connections/SmokeTestChecklist.tsx +++ b/src/components/admin/connections/SmokeTestChecklist.tsx @@ -146,7 +146,7 @@ export function SmokeTestChecklist({ availableSecrets = [] }: Props) { detail: rotateResult.error?.message ?? "Falha desconhecida", durationMs: took, }); - // eslint-disable-next-line no-console + console.error("[smoke-test] step 1 FAILED", rotateResult.error); setRunning(false); updateStep("history", { status: "skipped", detail: "Pulado (rotação falhou)" }); @@ -163,7 +163,7 @@ export function SmokeTestChecklist({ availableSecrets = [] }: Props) { detail: `Sufixo esperado ${formatMaskedSuffix(expectedSuffix)}, recebido ${formatMaskedSuffix(rotateResult.masked_suffix)}`, durationMs: took, }); - // eslint-disable-next-line no-console + console.error("[smoke-test] step 1 mismatch", { expectedSuffix, got: rotateResult.masked_suffix }); } else { updateStep("rotate", { @@ -181,7 +181,7 @@ export function SmokeTestChecklist({ availableSecrets = [] }: Props) { detail: err instanceof Error ? err.message : "Erro inesperado", durationMs: took, }); - // eslint-disable-next-line no-console + console.error("[smoke-test] step 1 EXCEPTION", err); setRunning(false); // eslint-disable-next-line no-console @@ -204,7 +204,7 @@ export function SmokeTestChecklist({ availableSecrets = [] }: Props) { detail: `Nenhum registro com sufixo ${formatMaskedSuffix(expectedSuffix)} encontrado (${entries.length} entradas vistas).`, durationMs: took, }); - // eslint-disable-next-line no-console + console.error("[smoke-test] step 2 missing entry", { expectedSuffix, total: entries.length }); } else { const author = matching.rotated_by_email ?? matching.rotated_by ?? "desconhecido"; @@ -223,7 +223,7 @@ export function SmokeTestChecklist({ availableSecrets = [] }: Props) { detail: err instanceof Error ? err.message : "Erro ao consultar histórico", durationMs: took, }); - // eslint-disable-next-line no-console + console.error("[smoke-test] step 2 EXCEPTION", err); } @@ -240,7 +240,7 @@ export function SmokeTestChecklist({ availableSecrets = [] }: Props) { detail: "Secret não retornou na listagem após reload.", durationMs: took, }); - // eslint-disable-next-line no-console + console.error("[smoke-test] step 3 missing in list"); } else if (normalizeMaskedSuffix(target.masked_suffix) !== expectedSuffix) { updateStep("reload", { @@ -248,7 +248,7 @@ export function SmokeTestChecklist({ availableSecrets = [] }: Props) { detail: `Sufixo divergente após reload: esperado ${formatMaskedSuffix(expectedSuffix)}, recebido ${formatMaskedSuffix(target.masked_suffix)}`, durationMs: took, }); - // eslint-disable-next-line no-console + console.error("[smoke-test] step 3 suffix mismatch after reload", target); } else { const sourceTag = target.source ? ` • source=${target.source}` : ""; @@ -267,7 +267,7 @@ export function SmokeTestChecklist({ availableSecrets = [] }: Props) { detail: err instanceof Error ? err.message : "Erro ao recarregar", durationMs: took, }); - // eslint-disable-next-line no-console + console.error("[smoke-test] step 3 EXCEPTION", err); } diff --git a/src/components/admin/connections/TestProgressIndicator.tsx b/src/components/admin/connections/TestProgressIndicator.tsx index b6d2cb41a..49c938ab4 100644 --- a/src/components/admin/connections/TestProgressIndicator.tsx +++ b/src/components/admin/connections/TestProgressIndicator.tsx @@ -50,7 +50,7 @@ export function TestProgressIndicator({ const isRunning = phase === "running"; const isOk = phase === "completed"; - const isFail = phase === "failed"; + const _isFail = phase === "failed"; const Icon = isRunning ? Loader2 : isOk ? CheckCircle2 : XCircle; const tone = isRunning diff --git a/src/components/admin/connections/ZoneCommandPalette.tsx b/src/components/admin/connections/ZoneCommandPalette.tsx index 9e2812660..ee302279f 100644 --- a/src/components/admin/connections/ZoneCommandPalette.tsx +++ b/src/components/admin/connections/ZoneCommandPalette.tsx @@ -13,7 +13,7 @@ * âncora própria (ex: tabs do "Conexões"). */ import { useEffect, useMemo, useState } from "react"; -import { Activity, Settings2, Network, Search, Layers } from "lucide-react"; +import { Activity, Settings2, Network, Layers } from "lucide-react"; import { CommandDialog, CommandEmpty, diff --git a/src/components/admin/connections/secretNormalizers.ts b/src/components/admin/connections/secretNormalizers.ts index 573a3c8cd..2bc6854b1 100644 --- a/src/components/admin/connections/secretNormalizers.ts +++ b/src/components/admin/connections/secretNormalizers.ts @@ -118,7 +118,7 @@ function normalizeBitrixDomain(raw: string): NormalizationResult { function normalizeDigitsOnly(raw: string): NormalizationResult { const changes: string[] = []; - let v = trimEdges(raw, changes); + const v = trimEdges(raw, changes); const stripped = v.replace(/\D+/g, ""); if (stripped !== v) changes.push("caracteres não-numéricos removidos"); return { value: stripped, changes }; diff --git a/src/components/admin/personalization/ProductSelector.tsx b/src/components/admin/personalization/ProductSelector.tsx index 7344ff522..9a906a3ca 100644 --- a/src/components/admin/personalization/ProductSelector.tsx +++ b/src/components/admin/personalization/ProductSelector.tsx @@ -1,5 +1,4 @@ import { useState } from "react"; -import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; diff --git a/src/components/admin/personalization/usePersonalizationData.ts b/src/components/admin/personalization/usePersonalizationData.ts index f475fc62b..a619c598a 100644 --- a/src/components/admin/personalization/usePersonalizationData.ts +++ b/src/components/admin/personalization/usePersonalizationData.ts @@ -1,4 +1,3 @@ -import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { supabase } from "@/integrations/supabase/client"; import { untypedFrom } from "@/lib/supabase-untyped"; diff --git a/src/components/admin/products/BulkImportDialog.tsx b/src/components/admin/products/BulkImportDialog.tsx index ac2cd0e56..477bc0d95 100644 --- a/src/components/admin/products/BulkImportDialog.tsx +++ b/src/components/admin/products/BulkImportDialog.tsx @@ -12,7 +12,7 @@ import { type ImportMode, type ImportRow, type BatchImportProgress, type BatchImportResult, checkExistingSkus, executeBatchImport, } from '@/lib/external-db/batch-import'; -import { TARGET_FIELDS, type Step, type ColumnMapping, type ValidationResult, type TargetFieldKey } from './bulk-import/types'; +import { TARGET_FIELDS, type Step, type ColumnMapping, type ValidationResult } from './bulk-import/types'; import { StepUpload } from './bulk-import/StepUpload'; import { StepMapping } from './bulk-import/StepMapping'; import { StepPreview } from './bulk-import/StepPreview'; @@ -36,7 +36,7 @@ export function BulkImportDialog({ open, onOpenChange, onComplete }: BulkImportD const [progress, setProgress] = useState(null); const [importResult, setImportResult] = useState(null); const [isCheckingSkus, setIsCheckingSkus] = useState(false); - const [existingSkus, setExistingSkus] = useState>(new Set()); + const [_existingSkus, setExistingSkus] = useState>(new Set()); const reset = useCallback(() => { setStep('upload'); diff --git a/src/components/admin/products/CategoryCascadeSelector.tsx b/src/components/admin/products/CategoryCascadeSelector.tsx index 9202966f6..0737c8289 100644 --- a/src/components/admin/products/CategoryCascadeSelector.tsx +++ b/src/components/admin/products/CategoryCascadeSelector.tsx @@ -2,7 +2,7 @@ * CategoryCascadeSelector — Seleção de categoria com cascata de 2+ níveis, * breadcrumb persistente e navegação em árvore via dialog. */ -import { useMemo, useState, useCallback } from 'react'; +import { useMemo, useState } from 'react'; import { useExternalCategoriesQuery, type ExternalCategory } from '@/hooks/useExternalCategoriesQuery'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Button } from '@/components/ui/button'; diff --git a/src/components/admin/products/NewSupplierDialog.tsx b/src/components/admin/products/NewSupplierDialog.tsx index 32e754464..5e4fdda35 100644 --- a/src/components/admin/products/NewSupplierDialog.tsx +++ b/src/components/admin/products/NewSupplierDialog.tsx @@ -7,7 +7,7 @@ import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Switch } from '@/components/ui/switch'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { Trash2, X } from 'lucide-react'; +import { Trash2 } from 'lucide-react'; import { applyPixMask, pixPlaceholder, validatePixKey } from '@/utils/pixMask'; import { type NewSupplierDialogProps } from './new-supplier/types'; import { useNewSupplierForm } from './new-supplier/useNewSupplierForm'; diff --git a/src/components/admin/products/ProductFormFullscreen.tsx b/src/components/admin/products/ProductFormFullscreen.tsx index 00684a1c2..89c1b3009 100644 --- a/src/components/admin/products/ProductFormFullscreen.tsx +++ b/src/components/admin/products/ProductFormFullscreen.tsx @@ -13,13 +13,7 @@ import { ProductFormStepContent } from './ProductFormStepContent'; import { useProductFormDraft } from './hooks/useProductFormDraft'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; -import { - Loader2, Package, Tag, ImageIcon, Layers, Megaphone, Paintbrush, - AlertCircle, FileText, Save, X, - PanelRightClose, PanelRightOpen, - ChevronLeft, ChevronRight, Info, Boxes, Wand2, -} from 'lucide-react'; -import { cn } from '@/lib/utils'; +import { Loader2, Package, Tag, ImageIcon, Layers, Megaphone, Paintbrush, AlertCircle, FileText, Save, X, PanelRightClose, PanelRightOpen, ChevronLeft, ChevronRight, Info, Boxes } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; import { useSkuValidation } from './hooks/useSkuValidation'; import { useProductSeoAI } from '@/hooks/useProductSeoAI'; diff --git a/src/components/admin/products/ProductFormStepContent.tsx b/src/components/admin/products/ProductFormStepContent.tsx index 19841e2fd..ea0f21026 100644 --- a/src/components/admin/products/ProductFormStepContent.tsx +++ b/src/components/admin/products/ProductFormStepContent.tsx @@ -8,7 +8,7 @@ import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { Switch } from '@/components/ui/switch'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; -import { Loader2, Package, Layers, Info, Boxes, Wand2 } from 'lucide-react'; +import { Loader2, Package, Layers, Info, Wand2 } from 'lucide-react'; import { cn } from '@/lib/utils'; import { SectionCard } from './ProductFormHelpers'; import { CategoryCascadeSelector } from './CategoryCascadeSelector'; diff --git a/src/components/admin/products/ProductMaterialsSection.tsx b/src/components/admin/products/ProductMaterialsSection.tsx index d2ee08dfb..3a9372616 100644 --- a/src/components/admin/products/ProductMaterialsSection.tsx +++ b/src/components/admin/products/ProductMaterialsSection.tsx @@ -9,11 +9,10 @@ import { materialService, type MaterialType } from '@/services/materialService'; import { supabase } from '@/integrations/supabase/client'; import { MaterialBadge } from '@/components/materials/MaterialBadge'; import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Skeleton } from '@/components/ui/skeleton'; import { Button } from '@/components/ui/button'; -import { Loader2, X, Search, Gem, Save, Pencil } from 'lucide-react'; +import { X, Search, Gem, Save, Pencil } from 'lucide-react'; import { toast } from 'sonner'; import { cn } from '@/lib/utils'; import { MaterialGroupTree } from './MaterialGroupTree'; @@ -238,7 +237,7 @@ export function ProductMaterialsSection({ productId }: ProductMaterialsSectionPr ) : typesByGroup; - const visibleGroups = [...groups] + const _visibleGroups = [...groups] .filter(g => !search || g.group_name.toLowerCase().includes(searchLower) || diff --git a/src/components/admin/products/bulk-import/types.ts b/src/components/admin/products/bulk-import/types.ts index 4451f87ec..239f84561 100644 --- a/src/components/admin/products/bulk-import/types.ts +++ b/src/components/admin/products/bulk-import/types.ts @@ -1,4 +1,4 @@ -import type { ImportMode, ImportRow, BatchImportProgress, BatchImportResult } from '@/lib/external-db/batch-import'; +import type { ImportRow } from '@/lib/external-db/batch-import'; export type Step = 'upload' | 'mapping' | 'preview' | 'importing' | 'complete'; diff --git a/src/components/admin/products/image-gallery/ImageFilterBar.tsx b/src/components/admin/products/image-gallery/ImageFilterBar.tsx index 552eb9326..93df5f929 100644 --- a/src/components/admin/products/image-gallery/ImageFilterBar.tsx +++ b/src/components/admin/products/image-gallery/ImageFilterBar.tsx @@ -1,7 +1,7 @@ import { Badge } from '@/components/ui/badge'; import { cn } from '@/lib/utils'; import { Filter, Palette } from 'lucide-react'; -import type { ExternalImage, FilterMode, VariantInfo, GalleryStats } from './types'; +import type { FilterMode, VariantInfo, GalleryStats } from './types'; import { IMAGE_TYPES } from './types'; interface Props { diff --git a/src/components/admin/products/image-gallery/ProductImageGallery.tsx b/src/components/admin/products/image-gallery/ProductImageGallery.tsx index 2a4d64347..bd5aef079 100644 --- a/src/components/admin/products/image-gallery/ProductImageGallery.tsx +++ b/src/components/admin/products/image-gallery/ProductImageGallery.tsx @@ -3,7 +3,7 @@ * All logic extracted to useProductImageGallery hook. * All UI sections extracted to sub-components. */ -import { Filter, Loader2, ImageIcon, Info } from 'lucide-react'; +import { Filter, Loader2 } from 'lucide-react'; import { useProductImageGallery } from './useProductImageGallery'; import { ImageFilterBar } from './ImageFilterBar'; import { ImageBulkToolbar } from './ImageBulkToolbar'; diff --git a/src/components/admin/products/kit-components/ComponentMediaManager.tsx b/src/components/admin/products/kit-components/ComponentMediaManager.tsx index 5cb556734..2ca5fb733 100644 --- a/src/components/admin/products/kit-components/ComponentMediaManager.tsx +++ b/src/components/admin/products/kit-components/ComponentMediaManager.tsx @@ -27,7 +27,7 @@ interface Props { componentName: string; } -export function ComponentMediaManager({ componentId, productId, componentName }: Props) { +export function ComponentMediaManager({ componentId, _productId, _componentName }: Props) { const queryClient = useQueryClient(); const [isOpen, setIsOpen] = useState(false); diff --git a/src/components/admin/products/kit-components/PrintAreasManager.tsx b/src/components/admin/products/kit-components/PrintAreasManager.tsx index 750e06ebb..c4a760789 100644 --- a/src/components/admin/products/kit-components/PrintAreasManager.tsx +++ b/src/components/admin/products/kit-components/PrintAreasManager.tsx @@ -15,7 +15,7 @@ import { fetchPrintAreas, createPrintArea, updatePrintArea, deletePrintArea } fr import type { PrintArea, PrintAreaFormData } from './types'; import { EMPTY_PRINT_AREA } from './types'; -export function PrintAreasManager({ componentId, componentName }: { componentId: string; componentName: string }) { +export function PrintAreasManager({ componentId, _componentName }: { componentId: string; componentName: string }) { const queryClient = useQueryClient(); const [isOpen, setIsOpen] = useState(false); const [isCreating, setIsCreating] = useState(false); diff --git a/src/components/admin/products/new-supplier/useNewSupplierForm.ts b/src/components/admin/products/new-supplier/useNewSupplierForm.ts index dd148b67b..a23d42c52 100644 --- a/src/components/admin/products/new-supplier/useNewSupplierForm.ts +++ b/src/components/admin/products/new-supplier/useNewSupplierForm.ts @@ -3,7 +3,7 @@ import { searchCrm } from '@/lib/crm-db'; import { applyPixMask, validatePixKey } from '@/utils/pixMask'; import { toast } from 'sonner'; import { supabase } from '@/integrations/supabase/client'; -import { maskCnpj, maskPhone, validateCnpj, maskCep } from '@/utils/masks'; +import { validateCnpj, maskCep } from '@/utils/masks'; import { fetchAddressByCep } from '@/utils/viacep'; import { fetchCnpjData } from '@/utils/cnpj-lookup'; import { logger } from '@/lib/logger'; diff --git a/src/components/admin/products/sections/ProductDimensionsSection.tsx b/src/components/admin/products/sections/ProductDimensionsSection.tsx index cc5e78c81..b1f1a607e 100644 --- a/src/components/admin/products/sections/ProductDimensionsSection.tsx +++ b/src/components/admin/products/sections/ProductDimensionsSection.tsx @@ -10,7 +10,7 @@ interface Props extends FormSectionProps { isBoxProduct: boolean; } -export function ProductDimensionsSection({ register, numericProps, isBoxProduct }: Props) { +export function ProductDimensionsSection({ _register, numericProps, isBoxProduct }: Props) { return (
diff --git a/src/components/admin/products/sections/ProductFlagsSection.tsx b/src/components/admin/products/sections/ProductFlagsSection.tsx index 06c19d8b7..ae6fb9cf3 100644 --- a/src/components/admin/products/sections/ProductFlagsSection.tsx +++ b/src/components/admin/products/sections/ProductFlagsSection.tsx @@ -8,7 +8,7 @@ import { ShieldCheck, Info, Clock } from 'lucide-react'; import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; import { cn } from '@/lib/utils'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { addDays, format } from 'date-fns'; +import { addDays } from 'date-fns'; import type { UseFormSetValue } from 'react-hook-form'; import type { ProductFormData } from '../ProductFormSchema'; diff --git a/src/components/admin/products/sections/ProductInfoSection.tsx b/src/components/admin/products/sections/ProductInfoSection.tsx index dadd8372f..24d2c141e 100644 --- a/src/components/admin/products/sections/ProductInfoSection.tsx +++ b/src/components/admin/products/sections/ProductInfoSection.tsx @@ -26,7 +26,7 @@ export function ProductInfoSection({ const supplierRefValue = watch('supplier_reference') || ''; const descValue = watch('description') || ''; const shortDescValue = watch('short_description') || ''; - const categoryId = watch('category_id'); + const _categoryId = watch('category_id'); return ( diff --git a/src/components/admin/products/sections/ProductPackagingSection.tsx b/src/components/admin/products/sections/ProductPackagingSection.tsx index fb1b54c52..75d71b3a5 100644 --- a/src/components/admin/products/sections/ProductPackagingSection.tsx +++ b/src/components/admin/products/sections/ProductPackagingSection.tsx @@ -23,7 +23,7 @@ const PACKAGING_FLAGS = [ { key: 'has_commercial_packaging' as const, label: 'Embalagem Nativa', hint: 'O produto já vem com embalagem comercial do fabricante' }, ]; -export function ProductPackagingSection({ register, numericProps, watch, setValue }: Props) { +export function ProductPackagingSection({ _register, numericProps, watch, setValue }: Props) { const packingType = watch?.('packing_type') || ''; const packagingMaterial = watch?.('packaging_material') || ''; const packagingColor = watch?.('packaging_color') || ''; diff --git a/src/components/admin/products/sections/ProductSupplierSection.tsx b/src/components/admin/products/sections/ProductSupplierSection.tsx index 39059bc7f..aa0c22722 100644 --- a/src/components/admin/products/sections/ProductSupplierSection.tsx +++ b/src/components/admin/products/sections/ProductSupplierSection.tsx @@ -4,7 +4,6 @@ import { useState } from 'react'; import { SupplierSelect } from '../SupplierSelect'; import { NewSupplierDialog } from '../NewSupplierDialog'; -import { SectionCard } from '../ProductFormHelpers'; import { SupplierFiscalInfo } from '../SupplierFiscalInfo'; import { Card } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; @@ -20,7 +19,7 @@ import { AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@/components/ui/alert-dialog'; import { - Truck, Plus, Star, Trash2, PackageCheck, Clock, DollarSign, Loader2, Users + Truck, Plus, Star, Trash2, _PackageCheck, Clock, DollarSign, Loader2, Users } from 'lucide-react'; import { useProductSupplierSources, type SupplierSourceInput } from '@/hooks/useProductSupplierSources'; import { cn } from '@/lib/utils'; @@ -48,7 +47,7 @@ const emptyForm = { export function ProductSupplierSection({ supplierId, onSupplierChange, setValue, errors, - productId, isEdit, primarySupplierName, + productId, _isEdit, _primarySupplierName, }: Props) { const { sources, isLoading, addSource, removeSource, setPreferred } = useProductSupplierSources(productId); const [pendingSources, setPendingSources] = useState>([]); diff --git a/src/components/admin/products/sections/engraving/EngravingAreaCard.tsx b/src/components/admin/products/sections/engraving/EngravingAreaCard.tsx index 370e0d200..e17f84eca 100644 --- a/src/components/admin/products/sections/engraving/EngravingAreaCard.tsx +++ b/src/components/admin/products/sections/engraving/EngravingAreaCard.tsx @@ -3,7 +3,7 @@ */ import { Badge } from '@/components/ui/badge'; import { Switch } from '@/components/ui/switch'; -import { GripVertical, Trash2, ChevronDown, ChevronUp, Ruler, Palette, DollarSign, MapPin } from 'lucide-react'; +import { GripVertical, Trash2, ChevronDown, ChevronUp, Ruler, Palette, DollarSign } from 'lucide-react'; import { cn } from '@/lib/utils'; import type { EnrichedArea } from './types'; import { getTechniqueIcon, getTechniqueColor } from './types'; diff --git a/src/components/admin/products/video-gallery/VideoMetaEditor.tsx b/src/components/admin/products/video-gallery/VideoMetaEditor.tsx index c8d75961d..78565ff77 100644 --- a/src/components/admin/products/video-gallery/VideoMetaEditor.tsx +++ b/src/components/admin/products/video-gallery/VideoMetaEditor.tsx @@ -2,7 +2,6 @@ import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { cn } from '@/lib/utils'; import { Save, X } from 'lucide-react'; import type { ExternalVideo } from './types'; import { VIDEO_TYPES } from './types'; diff --git a/src/components/admin/products/video-gallery/VideoUploadArea.tsx b/src/components/admin/products/video-gallery/VideoUploadArea.tsx index 24b83a84d..1b47a4f23 100644 --- a/src/components/admin/products/video-gallery/VideoUploadArea.tsx +++ b/src/components/admin/products/video-gallery/VideoUploadArea.tsx @@ -2,7 +2,7 @@ import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { cn } from '@/lib/utils'; -import { Upload, Loader2, Plus, FileVideo, Film, Palette, Youtube } from 'lucide-react'; +import { Upload, Loader2, Plus, FileVideo, Palette, Youtube } from 'lucide-react'; import type { VideoVariant } from './types'; import { VIDEO_TYPES } from './types'; @@ -35,7 +35,7 @@ export function VideoUploadArea({ handleDragOverZone, handleDragLeaveZone, handleDropZone, youtubeUrl, setYoutubeUrl, addYoutubeVideo, isAddingYoutube, }: Props) { - const activeType = VIDEO_TYPES.find(t => t.value === uploadVideoType); + const _activeType = VIDEO_TYPES.find(t => t.value === uploadVideoType); return (
g.last) g.last = r.created_at; } // Compute distinct IPs per group - for (const [key, g] of map.entries()) { + for (const [_key, g] of map.entries()) { const ips = new Set(rows.filter((r) => r.resource_id === g.resource_id && r.resource_type === g.resource_type).map((r) => r.ip_address)); g.distinctIps = ips.size; } diff --git a/src/components/admin/security/keys/audit/McpAuditRow.tsx b/src/components/admin/security/keys/audit/McpAuditRow.tsx index 3a8dbad26..a2e4f3f02 100644 --- a/src/components/admin/security/keys/audit/McpAuditRow.tsx +++ b/src/components/admin/security/keys/audit/McpAuditRow.tsx @@ -3,7 +3,7 @@ * Mostra ator, ação, prefixo, IP e diff resumido para eventos `updated`. */ import { Badge } from "@/components/ui/badge"; -import { ShieldAlert, KeyRound, RotateCw, Pencil, XCircle, AlertTriangle } from "lucide-react"; +import { KeyRound, RotateCw, Pencil, XCircle, AlertTriangle } from "lucide-react"; import { format } from "date-fns"; import { ptBR } from "date-fns/locale"; import type { AuditFeedRow } from "./useMcpAuditFeed"; diff --git a/src/components/admin/security/keys/audit/useMcpAuditFeed.ts b/src/components/admin/security/keys/audit/useMcpAuditFeed.ts index b95e9b1ae..caf97f535 100644 --- a/src/components/admin/security/keys/audit/useMcpAuditFeed.ts +++ b/src/components/admin/security/keys/audit/useMcpAuditFeed.ts @@ -90,7 +90,7 @@ export function useMcpAuditFeed() { const base = (data ?? []) as AuditFeedRow[]; const userIds = Array.from(new Set(base.map((r) => r.user_id).filter(Boolean))) as string[]; - let profiles: Record = {}; + const profiles: Record = {}; if (userIds.length > 0) { const { data: profs } = await supabase .from("profiles") diff --git a/src/components/admin/suppliers-manager/SupplierFormDialog.tsx b/src/components/admin/suppliers-manager/SupplierFormDialog.tsx index 5a1979976..78f60251f 100644 --- a/src/components/admin/suppliers-manager/SupplierFormDialog.tsx +++ b/src/components/admin/suppliers-manager/SupplierFormDialog.tsx @@ -7,7 +7,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Building2, Phone, DollarSign, Settings2, MapPin, Globe, UserPlus, Landmark, Loader2, Plus, Trash2, ImagePlus, X, Search, Truck } from 'lucide-react'; -import { maskCnpj, maskPhone, maskCep, ESTADOS_BR } from '@/utils/masks'; +import { maskCnpj, maskPhone, ESTADOS_BR } from '@/utils/masks'; import { applyPixMask, pixPlaceholder, validatePixKey } from '@/utils/pixMask'; import type { Supplier, SupplierContact, PixKey } from './types'; import { CONTACT_ROLES } from './types'; @@ -66,7 +66,7 @@ export function SupplierFormDialog({ foneFixo1, setFoneFixo1, foneFixo2, setFoneFixo2, inscricaoEstadual, setInscricaoEstadual, regimeTributario, setRegimeTributario, estadoFaturamento, setEstadoFaturamento, - transportadoraPadrao, setTransportadoraPadrao, transportadoraId, setTransportadoraId, + transportadoraPadrao, setTransportadoraPadrao, _transportadoraId, setTransportadoraId, carrierSearch, setCarrierSearch, carrierResults, searchingCarriers, showCarrierDropdown, setShowCarrierDropdown, searchCarriers, carrierSearchTimeout, logoInputRef, diff --git a/src/components/admin/suppliers-manager/useSuppliersManager.ts b/src/components/admin/suppliers-manager/useSuppliersManager.ts index dd9f166ba..97a6eee5e 100644 --- a/src/components/admin/suppliers-manager/useSuppliersManager.ts +++ b/src/components/admin/suppliers-manager/useSuppliersManager.ts @@ -1,10 +1,10 @@ import { useState, useEffect, useMemo, useCallback, useRef } from 'react'; -import { applyPixMask, pixPlaceholder, validatePixKey } from '@/utils/pixMask'; +import { applyPixMask, validatePixKey } from '@/utils/pixMask'; import { invokeExternalDb, invokeExternalDbSingle, invokeExternalDbDelete } from '@/lib/external-db'; -import { selectCrm, searchCrm } from '@/lib/crm-db'; +import { searchCrm } from '@/lib/crm-db'; import { supabase } from '@/integrations/supabase/client'; import { toast } from 'sonner'; -import { maskCnpj, maskPhone, validateCnpj, maskCep } from '@/utils/masks'; +import { validateCnpj, maskCep } from '@/utils/masks'; import { fetchAddressByCep } from '@/utils/viacep'; import { fetchCnpjData } from '@/utils/cnpj-lookup'; import { logger } from "@/lib/logger"; diff --git a/src/components/ai/AIMockupAssistant.tsx b/src/components/ai/AIMockupAssistant.tsx index 135a97f70..8374e4d22 100644 --- a/src/components/ai/AIMockupAssistant.tsx +++ b/src/components/ai/AIMockupAssistant.tsx @@ -11,7 +11,7 @@ import { Palette, Ruler, Target, - ChevronDown, + _ChevronDown, } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; @@ -61,7 +61,7 @@ const INITIAL_MESSAGES: Message[] = [ export function AIMockupAssistant({ productName, techniqueName, - onSuggestionApply, + _onSuggestionApply, className, }: AIMockupAssistantProps) { const [isOpen, setIsOpen] = useState(false); diff --git a/src/components/auth/ForgotPasswordForm.tsx b/src/components/auth/ForgotPasswordForm.tsx index ee8cbc0af..d1f228af4 100644 --- a/src/components/auth/ForgotPasswordForm.tsx +++ b/src/components/auth/ForgotPasswordForm.tsx @@ -2,7 +2,7 @@ import { useState } from 'react'; import { z } from 'zod'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; -import { Mail, Loader2, ArrowLeft, CheckCircle, Clock } from 'lucide-react'; +import { Mail, Loader2, ArrowLeft, Clock } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; @@ -49,7 +49,7 @@ export function ForgotPasswordForm({ onBack }: ForgotPasswordFormProps) { title: 'Solicitação enviada!', description: result.message, }); - } catch (error) { + } catch (_error) { toast({ variant: 'destructive', title: 'Erro inesperado', diff --git a/src/components/auth/PasswordStrengthIndicator.tsx b/src/components/auth/PasswordStrengthIndicator.tsx index 9cdf6e37b..236a829ba 100644 --- a/src/components/auth/PasswordStrengthIndicator.tsx +++ b/src/components/auth/PasswordStrengthIndicator.tsx @@ -1,4 +1,4 @@ -import { useMemo, useEffect, useState, useCallback } from 'react'; +import { useMemo, useEffect, useState } from 'react'; import { cn } from '@/lib/utils'; import { Check, X, AlertTriangle, Loader2, Shield } from 'lucide-react'; import { usePasswordBreachCheck } from '@/hooks/usePasswordBreachCheck'; diff --git a/src/components/auth/StepUpAuthDialog.tsx b/src/components/auth/StepUpAuthDialog.tsx index 5d7795959..e5b8da960 100644 --- a/src/components/auth/StepUpAuthDialog.tsx +++ b/src/components/auth/StepUpAuthDialog.tsx @@ -5,7 +5,7 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { ShieldCheck, Mail, KeyRound, Loader2 } from "lucide-react"; -import { useStepUpAuth, StepUpAction } from "@/hooks/useStepUpAuth"; +import { useStepUpAuth, type StepUpAction } from "@/hooks/useStepUpAuth"; interface Props { open: boolean; diff --git a/src/components/bi/BIAiCopilot.tsx b/src/components/bi/BIAiCopilot.tsx index b20676026..c5cee9e8d 100644 --- a/src/components/bi/BIAiCopilot.tsx +++ b/src/components/bi/BIAiCopilot.tsx @@ -118,7 +118,7 @@ export function BIAiCopilot({ open, onOpenChange, clientId, clientName, ramoAtiv if (error) throw error; const answer = (data as { answer?: string })?.answer ?? "Não consegui processar agora."; setMessages((prev) => [...prev, { role: "assistant", content: answer }]); - } catch (e) { + } catch (_e) { toast.error("Erro ao consultar o copiloto. Tente novamente."); setMessages((prev) => [ ...prev, diff --git a/src/components/bi/ClientAffinityProducts.tsx b/src/components/bi/ClientAffinityProducts.tsx index 716b38694..47a4c2227 100644 --- a/src/components/bi/ClientAffinityProducts.tsx +++ b/src/components/bi/ClientAffinityProducts.tsx @@ -18,7 +18,7 @@ interface Props { export function ClientAffinityProducts({ clientId }: Props) { const { data, isLoading } = useClientAffinity(clientId); - const { focusedSlug, focusedLabel } = useBICategoryFocus(); + const { focusedSlug, _focusedLabel } = useBICategoryFocus(); const visibleCategories = useMemo(() => { const cats = data?.categories ?? []; diff --git a/src/components/bi/ClientComparator.tsx b/src/components/bi/ClientComparator.tsx index f217a6d93..93f419cae 100644 --- a/src/components/bi/ClientComparator.tsx +++ b/src/components/bi/ClientComparator.tsx @@ -4,7 +4,6 @@ */ import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { CheckCircle2, AlertTriangle, X, Trophy, Minus } from "lucide-react"; import { cn } from "@/lib/utils"; diff --git a/src/components/bi/ExecutiveSummaryButton.tsx b/src/components/bi/ExecutiveSummaryButton.tsx index 47f4f75d1..61bc156ce 100644 --- a/src/components/bi/ExecutiveSummaryButton.tsx +++ b/src/components/bi/ExecutiveSummaryButton.tsx @@ -12,7 +12,7 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Copy, Loader2, FileText, Sparkles, Presentation } from "lucide-react"; +import { Copy, Loader2, Sparkles, Presentation } from "lucide-react"; import { toast } from "sonner"; import { useClientHealthScore } from "@/hooks/bi/useClientHealthScore"; import { useClientBI } from "@/hooks/bi/useClientBI"; diff --git a/src/components/cart/CartCompanyPicker.tsx b/src/components/cart/CartCompanyPicker.tsx index 2bde09d5d..098e5bfa4 100644 --- a/src/components/cart/CartCompanyPicker.tsx +++ b/src/components/cart/CartCompanyPicker.tsx @@ -5,7 +5,7 @@ import { useState, useMemo, useCallback, useRef, useEffect } from "react"; import { useQuery } from "@tanstack/react-query"; import Fuse from "fuse.js"; -import { Building2, Search, Loader2, Plus } from "lucide-react"; +import { Building2, Search, Loader2 } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; diff --git a/src/components/cart/CartHeaderButton.tsx b/src/components/cart/CartHeaderButton.tsx index 5458ecee9..4c3b09116 100644 --- a/src/components/cart/CartHeaderButton.tsx +++ b/src/components/cart/CartHeaderButton.tsx @@ -11,7 +11,7 @@ import { ScrollArea } from "@/components/ui/scroll-area"; import { useSellerCartContext } from "@/contexts/SellerCartContext"; import { CartCompanyPicker } from "./CartCompanyPicker"; import { cn } from "@/lib/utils"; -import { useState, useEffect, useCallback } from "react"; +import { useState, useEffect } from "react"; import { motion, AnimatePresence } from "framer-motion"; function formatCurrency(value: number) { @@ -174,7 +174,7 @@ export function CartHeaderButton() {
{carts.map((cart) => { const isActive = cart.id === activeCartId; - const cartSubtotal = cart.items.reduce( + const _cartSubtotal = cart.items.reduce( (sum, item) => sum + item.product_price * item.quantity, 0 ); diff --git a/src/components/cart/CartUtilComponents.tsx b/src/components/cart/CartUtilComponents.tsx index 1c6fd51e3..e44fc4691 100644 --- a/src/components/cart/CartUtilComponents.tsx +++ b/src/components/cart/CartUtilComponents.tsx @@ -6,8 +6,6 @@ import { useMemo } from "react"; import { Card } from "@/components/ui/card"; -import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { cn } from "@/lib/utils"; diff --git a/src/components/catalog/CatalogContent.tsx b/src/components/catalog/CatalogContent.tsx index 5cdee1e0b..e0574318c 100644 --- a/src/components/catalog/CatalogContent.tsx +++ b/src/components/catalog/CatalogContent.tsx @@ -1,7 +1,7 @@ import { useRef, useCallback, useEffect, useState, useMemo } from "react"; import type { ActiveColorFilter } from "@/utils/color-image-resolver"; import { useVirtualizer } from "@tanstack/react-virtual"; -import { Loader2, ArrowUp } from "lucide-react"; +import { ArrowUp } from "lucide-react"; import { Skeleton } from "@/components/ui/skeleton"; import { AnimatePresence, motion } from "framer-motion"; import { ProductCard } from "@/components/products/ProductCard"; diff --git a/src/components/catalog/CatalogHeader.tsx b/src/components/catalog/CatalogHeader.tsx index e6a581e42..9c75f73bc 100644 --- a/src/components/catalog/CatalogHeader.tsx +++ b/src/components/catalog/CatalogHeader.tsx @@ -20,7 +20,7 @@ export function CatalogHeader({ shouldShowCatalogSkeleton, totalEstimate, filteredCount, - hasNextPage, + _hasNextPage, onSelect, searchQuery = "", onReset, diff --git a/src/components/categories/CategorySidebarPanel.tsx b/src/components/categories/CategorySidebarPanel.tsx index 91500db85..ce90df0d9 100644 --- a/src/components/categories/CategorySidebarPanel.tsx +++ b/src/components/categories/CategorySidebarPanel.tsx @@ -1,5 +1,5 @@ import { useState, useCallback, type MouseEvent } from 'react'; -import { ChevronRight, ChevronDown, Folder, FolderOpen, X, ChevronLeft, Layers } from 'lucide-react'; +import { ChevronRight, Folder, X, ChevronLeft, Layers } from 'lucide-react'; import { useCategoriesTree, type CategoryNode, type CategoryTreeItem } from '@/hooks/useCategoriesTree'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; diff --git a/src/components/collections/CollectionDetailHeader.tsx b/src/components/collections/CollectionDetailHeader.tsx index bccb10697..5af9780ba 100644 --- a/src/components/collections/CollectionDetailHeader.tsx +++ b/src/components/collections/CollectionDetailHeader.tsx @@ -4,7 +4,7 @@ */ import { motion } from "framer-motion"; import { - ArrowLeft, Monitor, Package, FileText, Clock, Users, Share2, + _ArrowLeft, Monitor, Package, FileText, Clock, Users, Share2, ArrowRight, } from "lucide-react"; import { Button } from "@/components/ui/button"; @@ -43,7 +43,7 @@ export function CollectionDetailHeader({ products, variantMap, notesMap, - onBack, + _onBack, onCreateQuote, onPresent, onShare, diff --git a/src/components/collections/CollectionListItem.tsx b/src/components/collections/CollectionListItem.tsx index 205c73c3f..58eff5438 100644 --- a/src/components/collections/CollectionListItem.tsx +++ b/src/components/collections/CollectionListItem.tsx @@ -4,7 +4,7 @@ */ import { motion } from "framer-motion"; import { - FolderOpen, MoreVertical, Pencil, Copy, Star, + _FolderOpen, MoreVertical, Pencil, Copy, Star, Trash2, Package, Clock, } from "lucide-react"; import { Button } from "@/components/ui/button"; diff --git a/src/components/collections/CollectionTableView.tsx b/src/components/collections/CollectionTableView.tsx index ca4b80124..29ee40741 100644 --- a/src/components/collections/CollectionTableView.tsx +++ b/src/components/collections/CollectionTableView.tsx @@ -22,7 +22,7 @@ type SortKey = "name" | "products" | "featured" | "updated"; type SortDir = "asc" | "desc"; type FilterType = "all" | "featured" | "with-products" | "empty"; -const FILTER_OPTIONS: { value: FilterType; label: string; icon?: React.ReactNode }[] = [ +const _FILTER_OPTIONS: { value: FilterType; label: string; icon?: React.ReactNode }[] = [ { value: "all", label: "Todas" }, { value: "featured", label: "Destacadas", icon: }, { value: "with-products", label: "Com produtos", icon: }, @@ -70,7 +70,7 @@ interface CollectionTableRowProps { } function CollectionTableRow({ - collection, products, isSelected, isSelectionMode, + collection, products, isSelected, _isSelectionMode, onToggleSelect, onNavigate, onEdit, onClone, onToggleFeatured, onDelete, updatedAgo, index, }: CollectionTableRowProps) { diff --git a/src/components/common/BulkActionsBar.tsx b/src/components/common/BulkActionsBar.tsx index 7dfcbe1a6..b377c1e9f 100644 --- a/src/components/common/BulkActionsBar.tsx +++ b/src/components/common/BulkActionsBar.tsx @@ -1,6 +1,6 @@ import { type ReactNode } from "react"; import { Button } from "@/components/ui/button"; -import { Trash2, X, Download, RefreshCw } from "lucide-react"; +import { X } from "lucide-react"; import { motion, AnimatePresence } from "framer-motion"; export interface BulkAction { diff --git a/src/components/common/EnhancedSpotlight.tsx b/src/components/common/EnhancedSpotlight.tsx index 35116686f..f00da4d97 100644 --- a/src/components/common/EnhancedSpotlight.tsx +++ b/src/components/common/EnhancedSpotlight.tsx @@ -4,7 +4,6 @@ import { motion, AnimatePresence } from "framer-motion"; import Fuse from "fuse.js"; import { Search, ArrowRight, Command, Clock, Zap } from "lucide-react"; import { cn } from "@/lib/utils"; -import { Badge } from "@/components/ui/badge"; import { buildSpotlightItems, type SpotlightItem } from "./spotlight/SpotlightItems"; import { useAuth } from "@/contexts/AuthContext"; import { filterByRoutePermission } from "@/lib/navigation/filter-restricted-items"; @@ -26,7 +25,7 @@ export function EnhancedSpotlight() { if (stored) { try { setRecentActions(JSON.parse(stored)); - } catch (e) { + } catch (_e) { // Ignore parse errors } } diff --git a/src/components/common/ImageWithFallback.tsx b/src/components/common/ImageWithFallback.tsx index e18c091a2..c5958f347 100644 --- a/src/components/common/ImageWithFallback.tsx +++ b/src/components/common/ImageWithFallback.tsx @@ -34,7 +34,7 @@ export const ImageWithFallback = forwardRef string; } -export function ExportComparisonButton({ products, targetSelector = "#compare-export-area", formatCurrency }: Props) { +export function ExportComparisonButton({ products, targetSelector = "#compare-export-area", _formatCurrency }: Props) { const [busy, setBusy] = useState(false); const exportCSV = () => { diff --git a/src/components/compare/FloatingCompareBar.tsx b/src/components/compare/FloatingCompareBar.tsx index c65afb984..2d092cc1c 100644 --- a/src/components/compare/FloatingCompareBar.tsx +++ b/src/components/compare/FloatingCompareBar.tsx @@ -9,7 +9,7 @@ import { useProductsContextSafe } from "@/contexts/ProductsContext"; import { cn } from "@/lib/utils"; export const FloatingCompareBar = React.forwardRef( - function FloatingCompareBar(_props, ref) { + function FloatingCompareBar(_props, _ref) { const navigate = useNavigate(); const { compareItems, removeByIndex, clearCompare, compareCount } = useComparisonStore(); diff --git a/src/components/compare/SortableColumnWrapper.tsx b/src/components/compare/SortableColumnWrapper.tsx index a89ee3aa0..3b7c45895 100644 --- a/src/components/compare/SortableColumnWrapper.tsx +++ b/src/components/compare/SortableColumnWrapper.tsx @@ -2,10 +2,10 @@ * SortableColumnWrapper (C6 #4) — Wrapper com drag-and-drop horizontal para reordenar colunas. * Usa @dnd-kit/sortable; persiste ordem via callback onReorder. */ -import { ReactNode } from "react"; +import { type ReactNode } from "react"; import { DndContext, closestCenter, KeyboardSensor, PointerSensor, - useSensor, useSensors, DragEndEvent, + useSensor, useSensors, type DragEndEvent, } from "@dnd-kit/core"; import { arrayMove, SortableContext, horizontalListSortingStrategy, diff --git a/src/components/compare/SupplierComparisonModal.tsx b/src/components/compare/SupplierComparisonModal.tsx index f90bc8ebd..47af3c07f 100644 --- a/src/components/compare/SupplierComparisonModal.tsx +++ b/src/components/compare/SupplierComparisonModal.tsx @@ -16,16 +16,7 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; -import { - Building2, - TrendingDown, - TrendingUp, - Package, - Check, - Crown, - ArrowRight, - Minus, -} from "lucide-react"; +import { Building2, TrendingDown, TrendingUp, Package, Crown, ArrowRight, Minus } from "lucide-react"; import { cn } from "@/lib/utils"; import { useSupplierComparison } from "@/hooks/useSupplierComparison"; import type { Product } from "@/hooks/useProducts"; @@ -39,7 +30,7 @@ interface SupplierComparisonModalProps { export function SupplierComparisonModal({ product, - productId, + _productId, open, onOpenChange, }: SupplierComparisonModalProps) { diff --git a/src/components/dashboard/QuickActionsPanel.tsx b/src/components/dashboard/QuickActionsPanel.tsx index c979c223c..6ba61490c 100644 --- a/src/components/dashboard/QuickActionsPanel.tsx +++ b/src/components/dashboard/QuickActionsPanel.tsx @@ -1,14 +1,14 @@ -import { useEffect, useState, useMemo } from "react"; +import { useMemo } from "react"; import { Skeleton } from "@/components/ui/skeleton"; import { useNavigate } from "react-router-dom"; import { FilePlus, Clock, - CheckCircle2, - XCircle, + _CheckCircle2, + _XCircle, TrendingUp, FileText, - ArrowRight, + _ArrowRight, DollarSign, Target, BarChart3, @@ -16,7 +16,7 @@ import { import { Card, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; -import { useQuotes, Quote } from "@/hooks/useQuotes"; +import { useQuotes } from "@/hooks/useQuotes"; import { useAuth } from "@/contexts/AuthContext"; import { startOfMonth, endOfMonth, parseISO, isWithinInterval } from "date-fns"; @@ -27,7 +27,7 @@ function formatCurrency(value: number): string { export function QuickActionsPanel() { const navigate = useNavigate(); const { quotes, isLoading } = useQuotes(); - const { user } = useAuth(); + const { _user } = useAuth(); const stats = useMemo(() => { if (!quotes.length) return { pending: 0, approved: 0, rejected: 0, monthTotal: 0, monthCount: 0, conversionRate: 0 }; diff --git a/src/components/dashboard/RecentKitsWidget.tsx b/src/components/dashboard/RecentKitsWidget.tsx index 44077462a..480441ac6 100644 --- a/src/components/dashboard/RecentKitsWidget.tsx +++ b/src/components/dashboard/RecentKitsWidget.tsx @@ -5,7 +5,7 @@ import { useQuery } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; -import { Package, Pencil, Clock, ArrowRight } from 'lucide-react'; +import { Package, Clock, ArrowRight } from 'lucide-react'; import { supabase } from '@/integrations/supabase/client'; import { useAuth } from '@/contexts/AuthContext'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; diff --git a/src/components/engraving/PricingPanel.tsx b/src/components/engraving/PricingPanel.tsx index 1d5cb7140..ec43f5bde 100644 --- a/src/components/engraving/PricingPanel.tsx +++ b/src/components/engraving/PricingPanel.tsx @@ -50,7 +50,7 @@ export function PricingPanel() { const [searchQuery, setSearchQuery] = useState(""); const [filterTecnica, setFilterTecnica] = useState("all"); const [expandedTables, setExpandedTables] = useState>(new Set()); - const [simuladorQtd, setSimuladorQtd] = useState>({}); + const [simuladorQtd, _setSimuladorQtd] = useState>({}); // Construir filtros const filtros: TabelaPrecoFiltros = useMemo(() => { diff --git a/src/components/expert/ExpertChatDialog.tsx b/src/components/expert/ExpertChatDialog.tsx index d6d4d5af8..e80d501a9 100644 --- a/src/components/expert/ExpertChatDialog.tsx +++ b/src/components/expert/ExpertChatDialog.tsx @@ -3,7 +3,7 @@ * Original: 1418 lines → Now: ~80 lines (orchestrator only) */ import { Dialog, DialogContent } from "@/components/ui/dialog"; -import { FlowFilterPanel, defaultFlowFilters } from "./FlowFilterPanel"; +import { FlowFilterPanel } from "./FlowFilterPanel"; import { useExpertChat } from "./chat/useExpertChat"; import { ChatHeader } from "./chat/ChatHeader"; import { ChatHistoryPanel } from "./chat/ChatHistoryPanel"; diff --git a/src/components/filters/ColorGroupFilter.tsx b/src/components/filters/ColorGroupFilter.tsx index e873e6266..02e6d4d5d 100644 --- a/src/components/filters/ColorGroupFilter.tsx +++ b/src/components/filters/ColorGroupFilter.tsx @@ -15,7 +15,7 @@ import { CollapsibleTrigger, } from '@/components/ui/collapsible'; import { cn } from '@/lib/utils'; -import { useColorSystem, ColorGroup, ColorNuance, isLightColor } from '@/hooks/useColorSystem'; +import { useColorSystem, isLightColor } from '@/hooks/useColorSystem'; // ===================================================== // TIPOS diff --git a/src/components/filters/CommemorativeDateFilter.tsx b/src/components/filters/CommemorativeDateFilter.tsx index 6092656ef..c5843d584 100644 --- a/src/components/filters/CommemorativeDateFilter.tsx +++ b/src/components/filters/CommemorativeDateFilter.tsx @@ -1,7 +1,6 @@ import { useActiveCommemorativeDates, type CommemorativeDate } from "@/hooks/useCommemorativeDates"; import { cn } from "@/lib/utils"; import { Skeleton } from "@/components/ui/skeleton"; -import { ScrollArea } from "@/components/ui/scroll-area"; interface CommemorativeDateFilterProps { selectedDates: string[]; diff --git a/src/components/filters/ExternalCategoryFilter.tsx b/src/components/filters/ExternalCategoryFilter.tsx index 53bfb02a8..fec385b3c 100644 --- a/src/components/filters/ExternalCategoryFilter.tsx +++ b/src/components/filters/ExternalCategoryFilter.tsx @@ -3,7 +3,6 @@ import { ChevronDown, ChevronRight, Search, X, Layers, RefreshCw } from "lucide- import { Checkbox } from "@/components/ui/checkbox"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; -import { ScrollArea } from "@/components/ui/scroll-area"; import { Skeleton } from "@/components/ui/skeleton"; import { Badge } from "@/components/ui/badge"; import { cn } from "@/lib/utils"; diff --git a/src/components/filters/FilterPanel.tsx b/src/components/filters/FilterPanel.tsx index 2c5cd9ab5..9f92f6d0d 100644 --- a/src/components/filters/FilterPanel.tsx +++ b/src/components/filters/FilterPanel.tsx @@ -27,11 +27,10 @@ import { QuickOptionsFilter, } from "./filter-panel/sections/SimpleFilters"; import { SizeFilter } from "./filter-panel/sections/SizeFilter"; -import { GenderBadge } from "@/components/products/GenderBadge"; export function FilterPanel({ filters, onFilterChange, onReset, activeFiltersCount, - products = [], viewMode, onViewModeChange, gridColumns, onGridColumnsChange, filteredResultsCount, + products = [], _viewMode, _onViewModeChange, _gridColumns, _onGridColumnsChange, _filteredResultsCount, }: FilterPanelProps) { const state = useFilterPanelState(filters, onFilterChange, products); diff --git a/src/components/filters/filter-panel/sections/SizeFilter.tsx b/src/components/filters/filter-panel/sections/SizeFilter.tsx index b7a8c8d7e..47853e23d 100644 --- a/src/components/filters/filter-panel/sections/SizeFilter.tsx +++ b/src/components/filters/filter-panel/sections/SizeFilter.tsx @@ -3,10 +3,9 @@ * Extrai size_codes únicos das variações dos produtos carregados. */ import { useMemo, useState } from "react"; -import { Ruler, Search, X } from "lucide-react"; +import { Search, X } from "lucide-react"; import { cn } from "@/lib/utils"; import { Input } from "@/components/ui/input"; -import { Badge } from "@/components/ui/badge"; const SIZE_ORDER = [ "PP", "P", "M", "G", "GG", "XG", "XXG", "EG", "EGG", diff --git a/src/components/intelligence/IntelligenceFilterBar.tsx b/src/components/intelligence/IntelligenceFilterBar.tsx index 282826dc0..189b17a95 100644 --- a/src/components/intelligence/IntelligenceFilterBar.tsx +++ b/src/components/intelligence/IntelligenceFilterBar.tsx @@ -1,4 +1,4 @@ -import { useState, useMemo, useCallback } from "react"; +import { useState, useMemo } from "react"; import { Filter, X, ChevronDown, Package, Search } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; diff --git a/src/components/intelligence/MarketIntelligenceChart.tsx b/src/components/intelligence/MarketIntelligenceChart.tsx index 4514e56f6..52101dac8 100644 --- a/src/components/intelligence/MarketIntelligenceChart.tsx +++ b/src/components/intelligence/MarketIntelligenceChart.tsx @@ -100,7 +100,7 @@ function generateMockMarketData(days: number) { return { daily, kpis, suppliers: mockSuppliers, supplierIds: mockSuppliers.map(s => s.supplierId), supplierNames: mockSupplierNames }; } -export function MarketIntelligenceChart({ days: defaultDays = 30, supplierId, productId }: Props) { +export function MarketIntelligenceChart({ days: defaultDays = 30, supplierId, _productId }: Props) { const [period, setPeriod] = useState(String(defaultDays)); const [selectedSupplier, setSelectedSupplier] = useState('all'); const days = Number(period); diff --git a/src/components/intelligence/RankingFilterToolbar.tsx b/src/components/intelligence/RankingFilterToolbar.tsx index 811db29ff..7660f15b6 100644 --- a/src/components/intelligence/RankingFilterToolbar.tsx +++ b/src/components/intelligence/RankingFilterToolbar.tsx @@ -1,4 +1,4 @@ -import { useState, useMemo, useCallback } from "react"; +import { useState, useMemo } from "react"; import { Search, Filter, ChevronDown, X, Tag, Hash } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; diff --git a/src/components/intelligence/RealtimeBadge.tsx b/src/components/intelligence/RealtimeBadge.tsx index b2cecffb6..6e7ca9f05 100644 --- a/src/components/intelligence/RealtimeBadge.tsx +++ b/src/components/intelligence/RealtimeBadge.tsx @@ -11,7 +11,7 @@ const WINDOW_MS = 5 * 60 * 1000; export function RealtimeBadge() { const [count, setCount] = useState(0); - const [events, setEvents] = useState([]); + const [_events, setEvents] = useState([]); useEffect(() => { const channel = supabase diff --git a/src/components/intelligence/SalesOverviewChart.tsx b/src/components/intelligence/SalesOverviewChart.tsx index e969fc199..69042cde6 100644 --- a/src/components/intelligence/SalesOverviewChart.tsx +++ b/src/components/intelligence/SalesOverviewChart.tsx @@ -29,8 +29,8 @@ interface Props { productId?: string | null; } -export function SalesOverviewChart({ days = 30, productId }: Props) { - const { data, isLoading, error } = useSalesHistoryMacro(days); +export function SalesOverviewChart({ days = 30, _productId }: Props) { + const { data, isLoading, _error } = useSalesHistoryMacro(days); const chartData = useMemo(() => { if (!data?.daily?.length) return []; diff --git a/src/components/intelligence/SegmentAnalysis.tsx b/src/components/intelligence/SegmentAnalysis.tsx index 67262f377..d15afec71 100644 --- a/src/components/intelligence/SegmentAnalysis.tsx +++ b/src/components/intelligence/SegmentAnalysis.tsx @@ -2,7 +2,6 @@ import { PieChart, Building2 } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { useSegmentAnalysis } from "@/hooks/useCommercialIntelligence"; -import { cn } from "@/lib/utils"; export function SegmentAnalysis({ days = 30, categoryId, supplierId }: { days?: number; categoryId?: string | null; supplierId?: string | null }) { const { data: segments, isLoading } = useSegmentAnalysis(days, categoryId, supplierId); diff --git a/src/components/inventory/StockAlertDialogs.tsx b/src/components/inventory/StockAlertDialogs.tsx index 7cdc72a3d..0797919ff 100644 --- a/src/components/inventory/StockAlertDialogs.tsx +++ b/src/components/inventory/StockAlertDialogs.tsx @@ -1,5 +1,5 @@ import { useMemo } from "react"; -import { AlertTriangle, TrendingDown, X, CheckCircle2, Package, XCircle, Truck } from "lucide-react"; +import { AlertTriangle, TrendingDown, X, CheckCircle2, XCircle } from "lucide-react"; import { Dialog, DialogContent, diff --git a/src/components/inventory/StockAlertsIndicator.tsx b/src/components/inventory/StockAlertsIndicator.tsx index 936374009..00c2fc9b6 100644 --- a/src/components/inventory/StockAlertsIndicator.tsx +++ b/src/components/inventory/StockAlertsIndicator.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, forwardRef, useMemo, useRef } from "react"; +import { useState, useEffect, forwardRef, useMemo } from "react"; import { useNavigate } from "react-router-dom"; import { motion, AnimatePresence } from "framer-motion"; import { diff --git a/src/components/inventory/StockCategoryTreeSelect.tsx b/src/components/inventory/StockCategoryTreeSelect.tsx index 1d634c923..ded99f5a1 100644 --- a/src/components/inventory/StockCategoryTreeSelect.tsx +++ b/src/components/inventory/StockCategoryTreeSelect.tsx @@ -5,7 +5,6 @@ import { useState, useMemo } from "react"; import { ChevronRight, FolderTree, Search, X } from "lucide-react"; import { Input } from "@/components/ui/input"; -import { ScrollArea } from "@/components/ui/scroll-area"; import { cn } from "@/lib/utils"; import { useCategoriesTree, type CategoryNode } from "@/hooks/useCategoriesTree"; import { motion } from "framer-motion"; diff --git a/src/components/inventory/StockDashboard.tsx b/src/components/inventory/StockDashboard.tsx index 3bb489a2d..d2591a43b 100644 --- a/src/components/inventory/StockDashboard.tsx +++ b/src/components/inventory/StockDashboard.tsx @@ -100,7 +100,7 @@ export function StockDashboard() { return Math.round((healthy / summary.totalProducts) * 100); }, [summary]); - const healthColor = healthScore >= 80 ? 'text-success' : healthScore >= 50 ? 'text-warning' : 'text-destructive'; + const _healthColor = healthScore >= 80 ? 'text-success' : healthScore >= 50 ? 'text-warning' : 'text-destructive'; // Future stock total const futureStockTotal = useMemo( diff --git a/src/components/inventory/StockFilterToolbar.tsx b/src/components/inventory/StockFilterToolbar.tsx index ba0b87082..9018a1e5b 100644 --- a/src/components/inventory/StockFilterToolbar.tsx +++ b/src/components/inventory/StockFilterToolbar.tsx @@ -47,7 +47,7 @@ interface StockFilterToolbarProps { filteredCount: number; } -const STATUS_OPTIONS: { value: StockStatus | 'all'; label: string; icon: React.ReactNode; color: string }[] = [ +const _STATUS_OPTIONS: { value: StockStatus | 'all'; label: string; icon: React.ReactNode; color: string }[] = [ { value: 'all', label: 'Todos', icon: , color: 'text-foreground' }, { value: 'in_stock', label: 'Em Estoque', icon: , color: 'text-success' }, { value: 'low_stock', label: 'Baixo', icon: , color: 'text-warning' }, @@ -58,7 +58,7 @@ const STATUS_OPTIONS: { value: StockStatus | 'all'; label: string; icon: React.R export function StockFilterToolbar({ filters, onUpdateFilter, onResetFilters, - categories, suppliers, colors, colorGroups, + _categories, suppliers, _colors, _colorGroups, totalProducts, filteredCount, }: StockFilterToolbarProps) { const [localSearch, setLocalSearch] = useState(filters.search); diff --git a/src/components/inventory/risk/ProductRiskDetail.tsx b/src/components/inventory/risk/ProductRiskDetail.tsx index 9f0f2952a..1fa6bb2b4 100644 --- a/src/components/inventory/risk/ProductRiskDetail.tsx +++ b/src/components/inventory/risk/ProductRiskDetail.tsx @@ -62,7 +62,7 @@ interface ProductRiskDetailProps { productSku?: string; } -export function ProductRiskDetail({ productId, productName, productSku }: ProductRiskDetailProps) { +export function ProductRiskDetail({ productId, productName, _productSku }: ProductRiskDetailProps) { const navigate = useNavigate(); const [period, setPeriod] = useState('30'); const [chartExpanded, setChartExpanded] = useState(false); diff --git a/src/components/kit-builder/BoxSelector.tsx b/src/components/kit-builder/BoxSelector.tsx index 52da7ece5..b95f7402d 100644 --- a/src/components/kit-builder/BoxSelector.tsx +++ b/src/components/kit-builder/BoxSelector.tsx @@ -14,7 +14,7 @@ import { ScrollArea } from '@/components/ui/scroll-area'; import { Slider } from '@/components/ui/slider'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; +import { Collapsible, CollapsibleContent } from '@/components/ui/collapsible'; import { cn } from '@/lib/utils'; import { formatVolume, formatDimensions, formatCurrency } from '@/lib/kit-builder'; import type { KitBox, BoxFilters } from '@/lib/kit-builder'; diff --git a/src/components/kit-builder/DiscontinuedItemsAlert.tsx b/src/components/kit-builder/DiscontinuedItemsAlert.tsx index 7265c6424..04fbc1808 100644 --- a/src/components/kit-builder/DiscontinuedItemsAlert.tsx +++ b/src/components/kit-builder/DiscontinuedItemsAlert.tsx @@ -3,10 +3,9 @@ * Checks if any items in a kit are marked inactive and alerts the user */ -import { AlertTriangle, ExternalLink } from 'lucide-react'; +import { AlertTriangle } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; -import { Button } from '@/components/ui/button'; import type { KitItem } from '@/lib/kit-builder'; import { useQuery } from '@tanstack/react-query'; import { supabase } from '@/integrations/supabase/client'; diff --git a/src/components/kit-builder/KitIsometricPreview.tsx b/src/components/kit-builder/KitIsometricPreview.tsx index 6f7b5618b..3296385ac 100644 --- a/src/components/kit-builder/KitIsometricPreview.tsx +++ b/src/components/kit-builder/KitIsometricPreview.tsx @@ -211,7 +211,7 @@ export function KitIsometricPreview({ kitState, className }: KitIsometricPreview {/* Itens empilhados */} {sorted.map((p) => { - const c000 = iso(p.x, p.y, 0); + const _c000 = iso(p.x, p.y, 0); const c100 = iso(p.x + p.w, p.y, 0); const c101 = iso(p.x + p.w, p.y, p.d); const c001 = iso(p.x, p.y, p.d); diff --git a/src/components/kit-builder/KitSummary.tsx b/src/components/kit-builder/KitSummary.tsx index 978045d0a..3fd16c529 100644 --- a/src/components/kit-builder/KitSummary.tsx +++ b/src/components/kit-builder/KitSummary.tsx @@ -3,7 +3,6 @@ * Sub-components extracted to ./kit-summary/ */ import { Card, CardContent } from '@/components/ui/card'; -import { Badge } from '@/components/ui/badge'; import { AlertTriangle } from 'lucide-react'; import { KitMarginSimulator } from './KitMarginSimulator'; import { KitVisualPreview } from './KitVisualPreview'; diff --git a/src/components/kit-builder/SelectedItemsBadges.tsx b/src/components/kit-builder/SelectedItemsBadges.tsx index 8b67adf0e..980ef425c 100644 --- a/src/components/kit-builder/SelectedItemsBadges.tsx +++ b/src/components/kit-builder/SelectedItemsBadges.tsx @@ -14,7 +14,7 @@ import { type DragEndEvent, } from '@dnd-kit/core'; import { - arrayMove, + _arrayMove, SortableContext, sortableKeyboardCoordinates, useSortable, diff --git a/src/components/kit-builder/SimilarKitsWidget.tsx b/src/components/kit-builder/SimilarKitsWidget.tsx index a971ad04e..ffdbbdb16 100644 --- a/src/components/kit-builder/SimilarKitsWidget.tsx +++ b/src/components/kit-builder/SimilarKitsWidget.tsx @@ -6,7 +6,6 @@ import { useNavigate } from 'react-router-dom'; import * as Lucide from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; -import { Button } from '@/components/ui/button'; import { Skeleton } from '@/components/ui/skeleton'; import { useSimilarKits } from '@/hooks/useSimilarKits'; import { formatCurrency } from '@/lib/kit-builder'; diff --git a/src/components/kit-builder/VariantSelector.tsx b/src/components/kit-builder/VariantSelector.tsx index cf24ec0f5..702054f08 100644 --- a/src/components/kit-builder/VariantSelector.tsx +++ b/src/components/kit-builder/VariantSelector.tsx @@ -58,7 +58,7 @@ function sizeSort(a: string, b: string): number { export function VariantSelector({ itemId, - itemName, + _itemName, allowedVariantIds, selectedColor, selectedSize, diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index 5eb6e0dcb..977cbe8aa 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -1,4 +1,4 @@ -import { User, Menu, Sun, Moon, Heart, GitCompare, Search, LogOut, Settings, HelpCircle, Shield, MoreHorizontal, Palette, RotateCcw } from "lucide-react"; +import { User, Menu, Sun, Moon, Heart, GitCompare, Search, LogOut, HelpCircle, MoreHorizontal, Palette, RotateCcw } from "lucide-react"; import { useTheme } from "@/contexts/ThemeContext"; import { useNavigate } from "react-router-dom"; import { Button } from "@/components/ui/button"; @@ -36,13 +36,13 @@ interface HeaderProps { onSearchChange: (query: string) => void; } -export function Header({ onMenuToggle, searchQuery, onSearchChange }: HeaderProps) { +export function Header({ onMenuToggle, _searchQuery, _onSearchChange }: HeaderProps) { const { theme, actualTheme, setTheme, toggleTheme } = useTheme(); const navigate = useNavigate(); const { toast } = useToast(); const favoriteCount = useFavoritesStore((s) => s.favoriteCount); const compareCount = useComparisonStore((s) => s.compareCount); - const { user, profile, role, isAdmin, signOut } = useAuth(); + const { user, profile, role, _isAdmin, signOut } = useAuth(); const currentSection = useCurrentSection(); const { restartTour, hasCompletedTour, isLoading: onboardingLoading } = useOnboardingContext(); @@ -66,7 +66,7 @@ export function Header({ onMenuToggle, searchQuery, onSearchChange }: HeaderProp }; const displayName = profile?.full_name || user?.email?.split("@")[0] || "Usuário"; - const roleLabel = getRoleLabel(role); + const _roleLabel = getRoleLabel(role); // #10 — Truncate inteligente: "Joaquim Ataides" → "Joaquim A." const truncatedName = (() => { diff --git a/src/components/layout/MainLayout.tsx b/src/components/layout/MainLayout.tsx index b9c5f8fb0..fa4901650 100644 --- a/src/components/layout/MainLayout.tsx +++ b/src/components/layout/MainLayout.tsx @@ -3,7 +3,6 @@ import { useLocation } from "react-router-dom"; import { useScrollLockFix } from "@/hooks/useScrollLockFix"; import { useGlobalShortcuts } from "@/hooks/useGlobalShortcuts"; import { SkipToContent } from "@/components/common/SkipToContent"; -import { BackButton } from "@/components/common/BackButton"; import { PersistentBreadcrumbs } from "@/components/common/PersistentBreadcrumbs"; import { lazyWithRetry } from "@/lib/lazyWithRetry"; @@ -18,7 +17,7 @@ import { OnboardingProvider } from "@/contexts/OnboardingContext"; // Lazy-loaded non-critical UI components const OnboardingTour = lazyWithRetry(() => import("@/components/onboarding/OnboardingTour").then(m => ({ default: m.OnboardingTour }))); -const ExpertChatButton = lazyWithRetry(() => import("@/components/expert/ExpertChatButton").then(m => ({ default: m.ExpertChatButton }))); +const _ExpertChatButton = lazyWithRetry(() => import("@/components/expert/ExpertChatButton").then(m => ({ default: m.ExpertChatButton }))); const EnhancedSpotlight = lazyWithRetry(() => import("@/components/common/EnhancedSpotlight").then(m => ({ default: m.EnhancedSpotlight }))); const SmartMobileNav = lazyWithRetry(() => import("@/components/mobile/SmartMobileNav").then(m => ({ default: m.SmartMobileNav }))); const QuickQuoteFAB = lazyWithRetry(() => import("@/components/quote/QuickQuoteFAB").then(m => ({ default: m.QuickQuoteFAB }))); @@ -35,7 +34,7 @@ export function MainLayout({ children }: MainLayoutProps) { const [sidebarOpen, setSidebarOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const location = useLocation(); - const isMockupGenerator = location.pathname === "/mockup-generator"; + const _isMockupGenerator = location.pathname === "/mockup-generator"; useScrollLockFix(); useGlobalShortcuts(); diff --git a/src/components/layout/SidebarReorganized.tsx b/src/components/layout/SidebarReorganized.tsx index 772a6de50..6d3c87ad1 100644 --- a/src/components/layout/SidebarReorganized.tsx +++ b/src/components/layout/SidebarReorganized.tsx @@ -1,44 +1,7 @@ import React, { useState, useMemo, useEffect, useCallback } from "react"; import { useQuery } from "@tanstack/react-query"; import { useLocation, useNavigate } from "react-router-dom"; -import { - Package, - Users, - Filter, - Heart, - GitCompare, - FolderOpen, - ChevronLeft, - ChevronRight, - ShieldCheck, - Calculator, - Wand2, - Sparkles, - FileText, - ShoppingCart, - Wrench, - Zap, - RefreshCw, - DollarSign, - Plus, - Activity, - Gauge, - Truck, - Palette, - Brain, - Workflow, - Layers, - SlidersHorizontal, - Boxes, - ImagePlus, - BarChart3, - Crosshair, - ChevronsDownUp, - Settings, - Percent, - Plug, - X, -} from "lucide-react"; +import { Package, Users, _Filter, Heart, GitCompare, FolderOpen, ChevronLeft, ChevronRight, ShieldCheck, Calculator, _Wand2, Sparkles, FileText, ShoppingCart, Wrench, Zap, RefreshCw, DollarSign, Plus, Activity, Gauge, Truck, Palette, Brain, Workflow, Layers, SlidersHorizontal, Boxes, ImagePlus, BarChart3, Crosshair, _ChevronsDownUp, Settings, Plug, X } from "lucide-react"; import { cn } from "@/lib/utils"; import { supabase } from "@/integrations/supabase/client"; import { Button } from "@/components/ui/button"; diff --git a/src/components/magic-up/AdImageResult.tsx b/src/components/magic-up/AdImageResult.tsx index ccbeea878..92c5e2bcf 100644 --- a/src/components/magic-up/AdImageResult.tsx +++ b/src/components/magic-up/AdImageResult.tsx @@ -8,9 +8,9 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { - Download, Share2, RotateCcw, ImageIcon, Loader2, - Heart, Copy, FileImage, FileText, Star, - Clock, Trash2, ChevronLeft, ChevronRight, + Download, Share2, RotateCcw, ImageIcon, _Loader2, + Heart, Copy, FileImage, FileText, _Star, + Clock, Trash2, _ChevronLeft, _ChevronRight, } from "lucide-react"; import { cn } from "@/lib/utils"; import type { MagicUpCopyPack, MagicUpCurationStatus, MagicUpQualityDiagnosis, MagicUpQualityScore } from "@/pages/magic-up/magicUpStrategy"; diff --git a/src/components/magic-up/PromptBank.tsx b/src/components/magic-up/PromptBank.tsx index 039ee11d8..1e5364a72 100644 --- a/src/components/magic-up/PromptBank.tsx +++ b/src/components/magic-up/PromptBank.tsx @@ -110,7 +110,7 @@ const SCENE_PROMPTS: ScenePrompt[] = [ { id: "edu-02", category: "educacao", title: "Formatura", prompt: "Graduate in cap and gown proudly holding the product as a graduation gift, university campus in background, celebratory moment, achievement photography" }, ]; -export function PromptBank({ selectedPrompt, onSelect, productName, clientSegment }: PromptBankProps) { +export function PromptBank({ selectedPrompt, onSelect, _productName, clientSegment }: PromptBankProps) { const [activeCategory, setActiveCategory] = useState("all"); const [search, setSearch] = useState(""); diff --git a/src/components/magic-up/PromptGenerator.tsx b/src/components/magic-up/PromptGenerator.tsx index 62361dd65..53c337f74 100644 --- a/src/components/magic-up/PromptGenerator.tsx +++ b/src/components/magic-up/PromptGenerator.tsx @@ -12,11 +12,7 @@ import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; -import { - Wand2, Loader2, Sparkles, Target, - Users, CalendarDays, RefreshCw, Check, - Lightbulb, MapPin, Paintbrush, Ruler, -} from "lucide-react"; +import { Wand2, Loader2, Sparkles, Target, Users, CalendarDays, RefreshCw, Check, Lightbulb, _MapPin, _Ruler } from "lucide-react"; import { cn } from "@/lib/utils"; import { supabase } from "@/integrations/supabase/client"; import { toast } from "sonner"; diff --git a/src/components/materials/MaterialBadge.tsx b/src/components/materials/MaterialBadge.tsx index 6520e61e5..fc425a88e 100644 --- a/src/components/materials/MaterialBadge.tsx +++ b/src/components/materials/MaterialBadge.tsx @@ -25,7 +25,7 @@ interface MaterialBadgeProps { export function MaterialBadge({ name, groupName, - hexCode, + _hexCode, size = "md", variant = "default", showGroup = false, @@ -41,7 +41,7 @@ export function MaterialBadge({ lg: "text-sm px-3 py-1.5 gap-2", }; - const colorDotSizes = { + const _colorDotSizes = { sm: "w-2 h-2", md: "w-2.5 h-2.5", lg: "w-3 h-3", diff --git a/src/components/mobile/MobileProductActions.tsx b/src/components/mobile/MobileProductActions.tsx index c23c029a0..5823995c6 100644 --- a/src/components/mobile/MobileProductActions.tsx +++ b/src/components/mobile/MobileProductActions.tsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { Heart, Share2, Calculator, FileText, ShoppingCart } from "lucide-react"; +import { Heart, Share2, FileText } from "lucide-react"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; import { useNavigate } from "react-router-dom"; diff --git a/src/components/mobile/SmartMobileNav.tsx b/src/components/mobile/SmartMobileNav.tsx index d2ffbfd4a..354abbc3d 100644 --- a/src/components/mobile/SmartMobileNav.tsx +++ b/src/components/mobile/SmartMobileNav.tsx @@ -9,21 +9,19 @@ import { Plus, Heart, Wand2, - BarChart3, + _BarChart3, ShoppingCart, - Settings, - Sparkles, + _Settings, + _Sparkles, Calculator, FolderOpen, X, - Sun, - Moon, + _Sun, + _Moon, } from "lucide-react"; -import { useTheme } from "@/contexts/ThemeContext"; import { cn } from "@/lib/utils"; import { useState, useEffect, forwardRef } from "react"; import { motion, AnimatePresence } from "framer-motion"; -import { VisuallyHidden } from "@/components/a11y/VisuallyHidden"; interface NavItem { icon: typeof Home; @@ -173,7 +171,7 @@ export const SmartMobileNav = forwardRef(function SmartMobileNav style={{ paddingBottom: 'max(env(safe-area-inset-bottom), 0.5rem)' }} >
- {mainNavItems.map((item, index) => { + {mainNavItems.map((item, _index) => { const Icon = item.icon; const active = isActive(item.href); const isFab = item.href === "#fab"; diff --git a/src/components/mockup/LogoColorAnalyzer.tsx b/src/components/mockup/LogoColorAnalyzer.tsx index 87c9af3b0..5bb0065b4 100644 --- a/src/components/mockup/LogoColorAnalyzer.tsx +++ b/src/components/mockup/LogoColorAnalyzer.tsx @@ -12,7 +12,7 @@ import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover import { Input } from '@/components/ui/input'; import { ScrollArea } from '@/components/ui/scroll-area'; import { cn } from '@/lib/utils'; -import { searchPantone, type PantoneColor } from '@/data/pantone-coated'; +import { searchPantone } from '@/data/pantone-coated'; import type { DetectedColor } from '@/hooks/useLogoColorAnalysis'; interface LogoColorAnalyzerProps { diff --git a/src/components/mockup/MockupHistoryPanel.tsx b/src/components/mockup/MockupHistoryPanel.tsx index 54893f468..dfb92cef5 100644 --- a/src/components/mockup/MockupHistoryPanel.tsx +++ b/src/components/mockup/MockupHistoryPanel.tsx @@ -3,7 +3,7 @@ * Refatorado: Lightbox extraído para MockupLightbox.tsx */ -import { useState, useMemo, useCallback } from "react"; +import { useState, useMemo } from "react"; import { cn } from "@/lib/utils"; import { LayoutPopover } from "@/components/products/LayoutPopover"; import { getDefaultColumns, type ColumnCount } from "@/components/products/ColumnSelector"; diff --git a/src/components/mockup/MockupProductSelector.tsx b/src/components/mockup/MockupProductSelector.tsx index 95d6f9482..e3d561c79 100644 --- a/src/components/mockup/MockupProductSelector.tsx +++ b/src/components/mockup/MockupProductSelector.tsx @@ -10,12 +10,11 @@ import { useState, useMemo, useRef, useCallback } from "react"; import { useDebounce } from "@/hooks/useDebounce"; import Fuse from "fuse.js"; import { useVirtualizer } from "@tanstack/react-virtual"; -import { Search, Package, X, SearchX, ArrowLeft, AlertTriangle, Loader2 } from "lucide-react"; +import { Search, X, SearchX } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Skeleton } from "@/components/ui/skeleton"; -import { cn } from "@/lib/utils"; import { useProductsLightweight, type ProductLightweight } from "@/hooks/useProductsLightweight"; import { type Product } from "@/hooks/useProducts"; import { type ExternalVariantStock } from "@/hooks/useExternalVariantStock"; diff --git a/src/components/mockup/MockupResultCard.tsx b/src/components/mockup/MockupResultCard.tsx index 728272050..0ad98148c 100644 --- a/src/components/mockup/MockupResultCard.tsx +++ b/src/components/mockup/MockupResultCard.tsx @@ -15,7 +15,6 @@ import { X, ArrowLeftRight, } from "lucide-react"; -import { toast } from "sonner"; import confetti from "canvas-confetti"; import { Dialog, diff --git a/src/components/mockup/MockupWizard.tsx b/src/components/mockup/MockupWizard.tsx index d48d5a92e..26b2e717b 100644 --- a/src/components/mockup/MockupWizard.tsx +++ b/src/components/mockup/MockupWizard.tsx @@ -113,7 +113,7 @@ export const MockupWizard = forwardRef(functi style={{ width: `${progressPercent * 0.9}%` }} /> - {steps.map((step, index) => { + {steps.map((step, _index) => { // Allow clicking completed steps or the current active step's next const isClickable = onStepClick && (step.isCompleted || step.id <= currentStep); return ( diff --git a/src/components/navigation/DynamicBreadcrumbs.tsx b/src/components/navigation/DynamicBreadcrumbs.tsx index 7f9cb950e..4f3dc5eef 100644 --- a/src/components/navigation/DynamicBreadcrumbs.tsx +++ b/src/components/navigation/DynamicBreadcrumbs.tsx @@ -57,7 +57,7 @@ const routeLabels: Record = { export function DynamicBreadcrumbs({ customItems, className }: DynamicBreadcrumbsProps) { const location = useLocation(); - const params = useParams(); + const _params = useParams(); const { isDev, isAdmin } = useAuth(); const breadcrumbs = useMemo(() => { diff --git a/src/components/notifications/NotificationDrawer.tsx b/src/components/notifications/NotificationDrawer.tsx index 09d6c3e2b..25fcf031b 100644 --- a/src/components/notifications/NotificationDrawer.tsx +++ b/src/components/notifications/NotificationDrawer.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useRef, useState } from "react"; -import { Bell, Check, CheckCheck, Trash2, Info, AlertTriangle, CheckCircle2, XCircle, ExternalLink, Loader2 } from "lucide-react"; +import { Bell, CheckCheck, Trash2, Info, AlertTriangle, CheckCircle2, XCircle, ExternalLink, Loader2 } from "lucide-react"; import { motion, AnimatePresence } from "framer-motion"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; diff --git a/src/components/notifications/NotificationsBadgeStatsPanel.tsx b/src/components/notifications/NotificationsBadgeStatsPanel.tsx index f93e47206..c7917625f 100644 --- a/src/components/notifications/NotificationsBadgeStatsPanel.tsx +++ b/src/components/notifications/NotificationsBadgeStatsPanel.tsx @@ -320,7 +320,7 @@ export function NotificationsBadgeStatsPanel() { // Defer revoke so Safari has a tick to honor the download. setTimeout(() => URL.revokeObjectURL(url), 1000); } catch (err) { - // eslint-disable-next-line no-console + console.error("[NotificationsBadgeStatsPanel] export failed", err); } }; diff --git a/src/components/onboarding/OnboardingTour.tsx b/src/components/onboarding/OnboardingTour.tsx index c388e0159..98399f0eb 100644 --- a/src/components/onboarding/OnboardingTour.tsx +++ b/src/components/onboarding/OnboardingTour.tsx @@ -1,12 +1,9 @@ import { useEffect, useState, useCallback } from "react"; import { motion, AnimatePresence } from "framer-motion"; -import { X, ChevronLeft, ChevronRight, SkipForward, Sparkles, Play, Pause } from "lucide-react"; +import { X, ChevronLeft, ChevronRight, SkipForward, Sparkles } from "lucide-react"; import { Button } from "@/components/ui/button"; -import { Progress } from "@/components/ui/progress"; -import { ONBOARDING_STEPS } from "@/hooks/useOnboarding"; import { useOnboardingContext } from "@/contexts/OnboardingContext"; import { useNavigate, useLocation } from "react-router-dom"; -import { cn } from "@/lib/utils"; interface TooltipPosition { top?: number; left?: number; diff --git a/src/components/pdf/PropostaComercialTailwind.tsx b/src/components/pdf/PropostaComercialTailwind.tsx index 86eabde8e..86b59fcfa 100644 --- a/src/components/pdf/PropostaComercialTailwind.tsx +++ b/src/components/pdf/PropostaComercialTailwind.tsx @@ -35,7 +35,7 @@ const PAGE_H = 1123; const FIRST_HEADER_H = 128; const CONT_HEADER_H = 60; const CONT_CLIENT_H = 60; // compact client bar on continuation pages -const FULL_FOOTER_H = 220; // last page: totals + signature + notes + green bar +const _FULL_FOOTER_H = 220; // last page: totals + signature + notes + green bar const SIMPLE_FOOTER_H = 30; // page number + green bar only const NOTES_FOOTER_H = 230; // notes block (conditions + terms) on every page const CONTENT_PAD = 36; diff --git a/src/components/pdf/proposal/LogoWithTransparentBg.tsx b/src/components/pdf/proposal/LogoWithTransparentBg.tsx index 4b8be035d..781e0d609 100644 --- a/src/components/pdf/proposal/LogoWithTransparentBg.tsx +++ b/src/components/pdf/proposal/LogoWithTransparentBg.tsx @@ -17,7 +17,7 @@ export function processLogoTransparent(src: string): Promise { .then((res) => res.blob()) .then( (blob) => - new Promise((resolve, reject) => { + new Promise((resolve, _reject) => { const objectUrl = URL.createObjectURL(blob); const img = new Image(); img.onload = () => { diff --git a/src/components/pdf/proposal/ProposalFooter.tsx b/src/components/pdf/proposal/ProposalFooter.tsx index d9f537bd0..1f1454d25 100644 --- a/src/components/pdf/proposal/ProposalFooter.tsx +++ b/src/components/pdf/proposal/ProposalFooter.tsx @@ -8,7 +8,7 @@ interface Props { totalPages: number; } -export function ProposalFooter({ data, isLastPage, pageNumber, totalPages }: Props) { +export function ProposalFooter({ _data, _isLastPage, pageNumber, totalPages }: Props) { const printDate = new Date().toLocaleDateString("pt-BR", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit" }); return ( diff --git a/src/components/personalization/TechniqueSelector.tsx b/src/components/personalization/TechniqueSelector.tsx index 4cb5d5bd9..77a056121 100644 --- a/src/components/personalization/TechniqueSelector.tsx +++ b/src/components/personalization/TechniqueSelector.tsx @@ -17,7 +17,7 @@ import { Zap, AlertTriangle, CheckCircle2, - DollarSign, + _DollarSign, Package, Filter, X, diff --git a/src/components/pricing/ProductPriceSimulator.tsx b/src/components/pricing/ProductPriceSimulator.tsx index 097842386..8dff517a4 100644 --- a/src/components/pricing/ProductPriceSimulator.tsx +++ b/src/components/pricing/ProductPriceSimulator.tsx @@ -1,4 +1,4 @@ -import { useState, useCallback, useMemo, useEffect } from 'react'; +import { useState, useCallback, useMemo } from 'react'; import { useQuery } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; import { Button } from '@/components/ui/button'; diff --git a/src/components/pricing/QuantityPriceCalculator.tsx b/src/components/pricing/QuantityPriceCalculator.tsx index 0137e24f4..c6ea96376 100644 --- a/src/components/pricing/QuantityPriceCalculator.tsx +++ b/src/components/pricing/QuantityPriceCalculator.tsx @@ -27,7 +27,7 @@ interface QuantityPriceCalculatorProps { className?: string; } -export function QuantityPriceCalculator({ productBasePrice = 0, productName, onSelectTechnique, className }: QuantityPriceCalculatorProps) { +export function QuantityPriceCalculator({ _productBasePrice = 0, _productName, _onSelectTechnique, className }: QuantityPriceCalculatorProps) { const navigate = useNavigate(); const { isLoading: pricingLoading } = useCustomizationPricing(); diff --git a/src/components/pricing/simulator/CustomizationOptions.tsx b/src/components/pricing/simulator/CustomizationOptions.tsx index 8298f4f8f..66ce14bb4 100644 --- a/src/components/pricing/simulator/CustomizationOptions.tsx +++ b/src/components/pricing/simulator/CustomizationOptions.tsx @@ -32,7 +32,7 @@ export function CustomizationOptions({ colorOptions, sizeOptions, hasPriceByColor, - hasPriceByArea, + _hasPriceByArea, isLoading, error, findMatchingTable, diff --git a/src/components/pricing/simulator/EngravingList.tsx b/src/components/pricing/simulator/EngravingList.tsx index 2575fd60f..d91096bc7 100644 --- a/src/components/pricing/simulator/EngravingList.tsx +++ b/src/components/pricing/simulator/EngravingList.tsx @@ -4,7 +4,6 @@ import { Badge } from '@/components/ui/badge'; import { Plus, Trash2, Paintbrush, Palette, Ruler, GripVertical } from 'lucide-react'; import { cn } from '@/lib/utils'; import type { ConfiguredEngraving } from './types'; -import { formatCurrency } from './utils'; interface EngravingListProps { engravings: ConfiguredEngraving[]; diff --git a/src/components/pricing/simulator/MultiEngravingResult.tsx b/src/components/pricing/simulator/MultiEngravingResult.tsx index a1c9a91a6..b10bf4f6c 100644 --- a/src/components/pricing/simulator/MultiEngravingResult.tsx +++ b/src/components/pricing/simulator/MultiEngravingResult.tsx @@ -7,7 +7,7 @@ * - Código de orçamento automático */ -import { useMemo, useState, useEffect } from 'react'; +import { useState, useEffect } from 'react'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Slider } from '@/components/ui/slider'; @@ -52,7 +52,7 @@ export function MultiEngravingResult({ quantity, onQuantityChange, }: MultiEngravingResultProps) { - const { calculatePrice, loading: priceLoading } = useCustomizationPriceLegacy(); + const { calculatePrice, loading: _priceLoading } = useCustomizationPriceLegacy(); const [calculations, setCalculations] = useState([]); const [isCalculating, setIsCalculating] = useState(false); const [copied, setCopied] = useState(null); diff --git a/src/components/pricing/simulator/PriceResultV51.tsx b/src/components/pricing/simulator/PriceResultV51.tsx index afeed28e9..2b3a702ea 100644 --- a/src/components/pricing/simulator/PriceResultV51.tsx +++ b/src/components/pricing/simulator/PriceResultV51.tsx @@ -8,7 +8,6 @@ * - Código de orçamento: {TECNICA_CURTO}01-{FAIXA}-{AREA}-{CORES} */ -import { useMemo } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Separator } from '@/components/ui/separator'; @@ -16,7 +15,7 @@ import { Calculator, Clock, TrendingDown, - AlertCircle, + _AlertCircle, Package, Paintbrush, Copy, diff --git a/src/components/pricing/simulator/QuantityAndResult.tsx b/src/components/pricing/simulator/QuantityAndResult.tsx index 06ca05909..c17121cb6 100644 --- a/src/components/pricing/simulator/QuantityAndResult.tsx +++ b/src/components/pricing/simulator/QuantityAndResult.tsx @@ -7,12 +7,11 @@ * - Código de orçamento automático */ -import { useMemo, useState, useEffect } from 'react'; +import { useState, useEffect } from 'react'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Slider } from '@/components/ui/slider'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; -import { Badge } from '@/components/ui/badge'; import { Calculator, Clock, @@ -27,7 +26,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/comp import { cn } from '@/lib/utils'; import { useCustomizationPriceLegacy, - useFaixasPrecoOficial, + _useFaixasPrecoOficial, type CustomizationPriceV2 } from '@/hooks/useGravacaoV2'; import { formatCurrency, formatNumber } from './utils'; @@ -47,11 +46,11 @@ export function QuantityAndResult({ product, technique, colors, - sizeModifier, + _sizeModifier, quantity, onQuantityChange, }: QuantityAndResultProps) { - const { calculatePrice, loading: priceLoading } = useCustomizationPriceLegacy(); + const { calculatePrice, loading: _priceLoading } = useCustomizationPriceLegacy(); const [priceData, setPriceData] = useState(null); const [isCalculating, setIsCalculating] = useState(false); const [error, setError] = useState(null); diff --git a/src/components/product-registration/BulkImportPanel.tsx b/src/components/product-registration/BulkImportPanel.tsx index 6d4bb4037..1d1d96bdb 100644 --- a/src/components/product-registration/BulkImportPanel.tsx +++ b/src/components/product-registration/BulkImportPanel.tsx @@ -3,7 +3,7 @@ * UI-only: delegates file parsing/mapping logic to the hook. */ import { useEffect } from 'react'; -import { Upload, Download, FileSpreadsheet, FileUp, Table as TableIcon } from 'lucide-react'; +import { Download, FileSpreadsheet, FileUp, Table as TableIcon } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; diff --git a/src/components/products/BulkActionBar.tsx b/src/components/products/BulkActionBar.tsx index e74da682b..be9ff3f6b 100644 --- a/src/components/products/BulkActionBar.tsx +++ b/src/components/products/BulkActionBar.tsx @@ -10,7 +10,7 @@ * - Responsivo: labels escondidos em mobile, apenas ícones */ import { memo } from "react"; -import { Heart, GitCompare, FolderPlus, X, CheckSquare, ShoppingBag, FileText, Sparkles } from "lucide-react"; +import { Heart, GitCompare, FolderPlus, X, CheckSquare, ShoppingBag, FileText } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; diff --git a/src/components/products/PackagingModal.tsx b/src/components/products/PackagingModal.tsx index 17eb62dcb..f344fd1e2 100644 --- a/src/components/products/PackagingModal.tsx +++ b/src/components/products/PackagingModal.tsx @@ -2,7 +2,7 @@ * PackagingModal - Modal com detalhes da embalagem especial do produto */ import { useState } from "react"; -import { Gift, Package, Ruler, Scale, Boxes, Info, X } from "lucide-react"; +import { Gift, Package, Ruler, Scale, Boxes, Info } from "lucide-react"; import { Dialog, DialogContent, diff --git a/src/components/products/ProductCard.tsx b/src/components/products/ProductCard.tsx index a7370e506..7d3413a89 100644 --- a/src/components/products/ProductCard.tsx +++ b/src/components/products/ProductCard.tsx @@ -7,7 +7,6 @@ import { GenderBadge } from "./GenderBadge"; import { Building2, Package, FolderTree } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { getCdnUrl, getSrcSet } from "@/utils/image-utils"; -import { Badge } from "@/components/ui/badge"; import { cn } from "@/lib/utils"; import type { Product } from "@/hooks/useProducts"; import { toast } from "sonner"; @@ -49,7 +48,7 @@ export interface ProductCardProps { } export const ProductCard = memo(forwardRef(function ProductCard({ - product, onClick, onView, onShare, onFavorite, highlightColors, + product, onClick, _onView, onShare, _onFavorite, highlightColors, isFavorited = false, onToggleFavorite, isInCompare = false, onToggleCompare, canAddToCompare = true, hideCategoryBadges = false, isNovelty = false, noveltyDaysRemaining, diff --git a/src/components/products/ProductCategoryBadges.tsx b/src/components/products/ProductCategoryBadges.tsx index 64a5d1070..269863a40 100644 --- a/src/components/products/ProductCategoryBadges.tsx +++ b/src/components/products/ProductCategoryBadges.tsx @@ -33,14 +33,14 @@ export function ProductCategoryBadges({ category, groups, className, - showLabels = false, + _showLabels = false, categoryUuid, productId, productName, productSku, productPrice, productImageUrl, - productMinQuantity, + _productMinQuantity, showPersonalizationLink = true, isKit = false, }: ProductCategoryBadgesProps) { diff --git a/src/components/products/ProductCustomizationOptions.tsx b/src/components/products/ProductCustomizationOptions.tsx index 2c4262039..360a3d42b 100644 --- a/src/components/products/ProductCustomizationOptions.tsx +++ b/src/components/products/ProductCustomizationOptions.tsx @@ -8,7 +8,7 @@ */ import { useState, useCallback, useRef } from "react"; -import { Paintbrush, Loader2 } from "lucide-react"; +import { Paintbrush } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Skeleton } from "@/components/ui/skeleton"; import { cn } from "@/lib/utils"; diff --git a/src/components/products/ProductGallery.tsx b/src/components/products/ProductGallery.tsx index 5df2a10ff..eaf7a89f4 100644 --- a/src/components/products/ProductGallery.tsx +++ b/src/components/products/ProductGallery.tsx @@ -1,4 +1,4 @@ -import { useState, useRef, useCallback, useEffect, useMemo } from "react"; +import { useState, useRef, useCallback, useEffect } from "react"; import { ChevronLeft, ChevronRight, Play, Maximize2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; diff --git a/src/components/products/ProductInfoBar.tsx b/src/components/products/ProductInfoBar.tsx index d3945a4db..892cc83b6 100644 --- a/src/components/products/ProductInfoBar.tsx +++ b/src/components/products/ProductInfoBar.tsx @@ -21,7 +21,7 @@ export function ProductInfoBar({ supplierId, onOpenFutureStock, onOpenSupplierComparison, - hasFutureStock = true, + _hasFutureStock = true, }: ProductInfoBarProps) { const navigate = useNavigate(); diff --git a/src/components/products/ProductIntelligence.tsx b/src/components/products/ProductIntelligence.tsx index 33259dea8..d0f358a0c 100644 --- a/src/components/products/ProductIntelligence.tsx +++ b/src/components/products/ProductIntelligence.tsx @@ -1,6 +1,6 @@ import { - Eye, - Users, + _Eye, + _Users, BarChart3, Package, Target, @@ -18,7 +18,7 @@ interface ProductIntelligenceProps { productName?: string; } -export function ProductIntelligence({ productId, productSku, productName }: ProductIntelligenceProps) { +export function ProductIntelligence({ productId, productSku, _productName }: ProductIntelligenceProps) { const navigate = useNavigate(); const { data: insights, isLoading: insightsLoading } = useProductInsights(productId, productSku); const { frequentlyBoughtTogether } = useProductRecommendations(productId, productSku); diff --git a/src/components/products/ProductListItem.tsx b/src/components/products/ProductListItem.tsx index 7298bf52c..fd36542a2 100644 --- a/src/components/products/ProductListItem.tsx +++ b/src/components/products/ProductListItem.tsx @@ -13,14 +13,12 @@ * Favoritar, Comparar, Coleção, Share, Orçamento, Carrinho, QuickView */ import { memo, useState, useCallback, useRef, useEffect } from "react"; -import { Heart, GitCompare, Share2, Package, Building2, FolderPlus, Eye, FileText } from "lucide-react"; +import { Package, Building2 } from "lucide-react"; import { NoveltyBadge } from "./NoveltyBadge"; import { ListItemActions } from "./list-item/ListItemActions"; import { useNavigate } from "react-router-dom"; import { getCdnUrl } from "@/utils/image-utils"; import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { cn } from "@/lib/utils"; import type { Product } from "@/hooks/useProducts"; import { toast } from "sonner"; @@ -32,7 +30,6 @@ import { PriceFreshnessBadge } from "./PriceFreshnessBadge"; import { isLightColor } from "@/hooks/useColorSystem"; import { resolveAllMatchingColors } from "@/utils/color-variant-carousel"; import { showUndoToast, showErrorToast } from "@/utils/undoToast"; -import { QuickAddToQuote } from "./QuickAddToQuote"; import { AddToCollectionModal } from "@/components/collections/AddToCollectionModal"; import { ProductQuickView } from "./ProductQuickView"; import { SharePreviewDialog } from "./share/SharePreviewDialog"; diff --git a/src/components/products/ProductPersonalizationRules.tsx b/src/components/products/ProductPersonalizationRules.tsx index facda6b64..93f5dd5f6 100644 --- a/src/components/products/ProductPersonalizationRules.tsx +++ b/src/components/products/ProductPersonalizationRules.tsx @@ -73,7 +73,7 @@ interface ComponentInfo { locations: LocationInfo[]; } -export function ProductPersonalizationRules({ productId, productSku, productName }: ProductPersonalizationRulesProps) { +export function ProductPersonalizationRules({ _productId, productSku, productName }: ProductPersonalizationRulesProps) { // Check if product uses group rules or has custom rules const { data: productData, isLoading: loadingProduct } = useQuery({ queryKey: ["product-personalization-source", productSku], diff --git a/src/components/products/ProductQuickView.tsx b/src/components/products/ProductQuickView.tsx index d26b273d0..776c532c1 100644 --- a/src/components/products/ProductQuickView.tsx +++ b/src/components/products/ProductQuickView.tsx @@ -1,4 +1,4 @@ -import { useState, useMemo, useCallback, useEffect, forwardRef } from "react"; +import { useState, useMemo, useEffect, forwardRef } from "react"; // framer-motion removido — transição via CSS animate-fade-in import { Heart, @@ -7,21 +7,20 @@ import { ShoppingCart, Package, Truck, - ChevronLeft, - ChevronRight, + _ChevronLeft, + _ChevronRight, ExternalLink, - Sparkles, - Layers, + _Sparkles, + _Layers, Plus, Minus, - Ruler, - Weight, - ImageOff, + _Ruler, + _Weight, + _ImageOff, } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { Dialog, DialogContent, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { VisuallyHidden } from "@/components/a11y/VisuallyHidden"; @@ -32,7 +31,7 @@ import { QuickViewGallery } from "./quick-view/QuickViewGallery"; import { ProductColorSelector, type ProductColor } from "./ProductColorSelector"; import { sortByColorGroup } from "@/utils/colorSorting"; import { toast } from "sonner"; -import { useProductImages, type ProductImage } from "@/hooks/useProductImages"; +import { useProductImages } from "@/hooks/useProductImages"; import { getCdnUrl, getSrcSet, getColorImages, type ProductImageMeta } from "@/utils/image-utils"; import { PriceFreshnessBadge } from "@/components/products/PriceFreshnessBadge"; @@ -62,7 +61,7 @@ export const ProductQuickView = forwardRef(null); // imageLoaded removido — transição instantânea sem skeleton intermediário - const [imageError, setImageError] = useState(false); + const [_imageError, setImageError] = useState(false); // Hook: buscar imagens do produto via BD externo (Briefing v3) const { data: productImages = [] } = useProductImages(open && product ? product.id : null); @@ -169,22 +168,22 @@ export const ProductQuickView = forwardRef { + const _handlePrevImage = () => { setImageError(false); setCurrentImageIndex((prev) => prev === 0 ? displayImages.length - 1 : prev - 1 ); }; - const handleNextImage = () => { + const _handleNextImage = () => { setImageError(false); setCurrentImageIndex((prev) => prev === displayImages.length - 1 ? 0 : prev + 1 diff --git a/src/components/products/ProductSparkline.tsx b/src/components/products/ProductSparkline.tsx index 7503fd75d..7348aecb4 100644 --- a/src/components/products/ProductSparkline.tsx +++ b/src/components/products/ProductSparkline.tsx @@ -1,7 +1,7 @@ import { useMemo, useRef, useState, useCallback } from "react"; import { cn } from "@/lib/utils"; import { useSparklineData } from "@/hooks/useSparklineSales"; -import { TrendingUp, TrendingDown, Minus, BarChart3, Zap, Activity } from "lucide-react"; +import { TrendingUp, TrendingDown, Minus, Zap, Activity } from "lucide-react"; interface ProductSparklineProps { productId: string; @@ -89,7 +89,7 @@ export function ProductSparkline({ productId, className }: ProductSparklineProps setTooltipPos({ x: e.clientX - rect.left, y: e.clientY - rect.top }); }, [points.length]); - const handleMouseEnter = useCallback((e: React.MouseEvent) => { + const handleMouseEnter = useCallback((_e: React.MouseEvent) => { if (hoverIndex === null) { const container = containerRef.current; if (!container) return; diff --git a/src/components/products/ProductStickyHeader.tsx b/src/components/products/ProductStickyHeader.tsx index bcc046bf1..77ecfd63a 100644 --- a/src/components/products/ProductStickyHeader.tsx +++ b/src/components/products/ProductStickyHeader.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { motion, AnimatePresence } from "framer-motion"; -import { ShoppingCart, Heart, FileText } from "lucide-react"; +import { Heart, FileText } from "lucide-react"; import { Button } from "@/components/ui/button"; import { QuickAddToQuote } from "./QuickAddToQuote"; import { BulkVariantWizard } from "@/components/catalog/BulkVariantWizard"; diff --git a/src/components/products/ProductTableView.tsx b/src/components/products/ProductTableView.tsx index 50f76c2e7..074c3ceb8 100644 --- a/src/components/products/ProductTableView.tsx +++ b/src/components/products/ProductTableView.tsx @@ -13,7 +13,6 @@ import { resolveColorImage, resolveColorStock, getActiveColorName, type ActiveCo import { resolveHighlightHex } from "@/utils/color-group-hex"; // Table view shows all color dots inline — no carousel needed import { useNavigate } from "react-router-dom"; -import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { cn } from "@/lib/utils"; @@ -24,13 +23,12 @@ import { VariantPickerDialog, type VariantActionMode } from "./VariantPickerDial import { AddToCollectionModal } from "@/components/collections/AddToCollectionModal"; import { ProductQuickView } from "./ProductQuickView"; import { SharePreviewDialog } from "./share/SharePreviewDialog"; -import { QuickAddToQuote } from "./QuickAddToQuote"; import { useFavoritesStore } from "@/stores/useFavoritesStore"; import { useComparisonStore } from "@/stores/useComparisonStore"; import type { ExternalVariantStock } from "@/hooks/useExternalVariantStock"; import { PriceFreshnessBadge } from "./PriceFreshnessBadge"; import { toast } from "sonner"; -import { showUndoToast, showErrorToast } from "@/utils/undoToast"; +import { showErrorToast } from "@/utils/undoToast"; interface ProductTableViewProps { products: Product[]; diff --git a/src/components/products/QuickAddToQuote.tsx b/src/components/products/QuickAddToQuote.tsx index 04e74d8ba..438495739 100644 --- a/src/components/products/QuickAddToQuote.tsx +++ b/src/components/products/QuickAddToQuote.tsx @@ -1,5 +1,5 @@ import { useState } from "react"; -import { Plus, Check, ShoppingCart, ShoppingBag, X, Minus } from "lucide-react"; +import { Plus, Check, ShoppingCart, ShoppingBag, X } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; diff --git a/src/components/products/RecentlyViewedBar.tsx b/src/components/products/RecentlyViewedBar.tsx index 5dc223b8d..283a3f479 100644 --- a/src/components/products/RecentlyViewedBar.tsx +++ b/src/components/products/RecentlyViewedBar.tsx @@ -1,7 +1,7 @@ import { useMemo } from "react"; import { useNavigate } from "react-router-dom"; import { motion, AnimatePresence } from "framer-motion"; -import { Clock, ChevronRight, X, Trash2 } from "lucide-react"; +import { Clock, X, Trash2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { useRecentlyViewedStore } from "@/stores/useRecentlyViewedStore"; diff --git a/src/components/products/SalesHistoryChart.tsx b/src/components/products/SalesHistoryChart.tsx index 82c0c52da..73aca5e73 100644 --- a/src/components/products/SalesHistoryChart.tsx +++ b/src/components/products/SalesHistoryChart.tsx @@ -42,7 +42,7 @@ interface SalesHistoryChartProps { // ---------- Main Component ---------- -export function SalesHistoryChart({ productId, productSku, productName }: SalesHistoryChartProps) { +export function SalesHistoryChart({ productId, productSku, _productName }: SalesHistoryChartProps) { const [period, setPeriod] = useState('30'); const days = Number(period); diff --git a/src/components/products/SingleVariantPicker.tsx b/src/components/products/SingleVariantPicker.tsx index 4080df1d4..b90e74513 100644 --- a/src/components/products/SingleVariantPicker.tsx +++ b/src/components/products/SingleVariantPicker.tsx @@ -6,7 +6,6 @@ import { useMemo } from 'react'; import { cn } from '@/lib/utils'; import { Package, AlertTriangle, SkipForward } from 'lucide-react'; import { Skeleton } from '@/components/ui/skeleton'; -import { Badge } from '@/components/ui/badge'; import { useExternalVariantStock, type ExternalVariantStock } from '@/hooks/useExternalVariantStock'; import { useEffect } from 'react'; diff --git a/src/components/products/SupplierComparisonCards.tsx b/src/components/products/SupplierComparisonCards.tsx index 10de1ce9d..be28dbcd4 100644 --- a/src/components/products/SupplierComparisonCards.tsx +++ b/src/components/products/SupplierComparisonCards.tsx @@ -5,7 +5,6 @@ import { Badge } from "@/components/ui/badge"; import { cn } from "@/lib/utils"; import { TrendingUp, TrendingDown, Minus, Package } from "lucide-react"; import type { StockVelocity } from "@/hooks/useStockHistory"; -import { formatCurrency } from "@/lib/format"; interface SupplierComparisonCardsProps { velocities: StockVelocity[]; @@ -41,7 +40,7 @@ export function SupplierComparisonCards({ velocities, supplierNames }: SupplierC const name = supplierNames.get(v.supplier_id) ?? `Fornecedor ${v.supplier_id.slice(0, 6)}`; const trend = v.velocity_trend; const isBest = idx === 0 && sorted.length > 1; - const sharePercent = bestVelocity > 0 + const _sharePercent = bestVelocity > 0 ? Math.round((v.avg_daily_depletion_7d / bestVelocity) * 100) : 0; diff --git a/src/components/products/VariantPickerDialog.tsx b/src/components/products/VariantPickerDialog.tsx index dc3f7fe40..a04eaa5f6 100644 --- a/src/components/products/VariantPickerDialog.tsx +++ b/src/components/products/VariantPickerDialog.tsx @@ -4,7 +4,6 @@ * Mesmo fluxo usado para Carrinho e Orçamento. */ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; -import { Badge } from '@/components/ui/badge'; import { cn } from '@/lib/utils'; import { Heart, GitCompare, FolderPlus, MessageCircle, FileText } from 'lucide-react'; import { SingleVariantPicker } from '@/components/products/SingleVariantPicker'; diff --git a/src/components/products/customization/ConfigurationPanel.tsx b/src/components/products/customization/ConfigurationPanel.tsx index 9fd16d091..d4275d52e 100644 --- a/src/components/products/customization/ConfigurationPanel.tsx +++ b/src/components/products/customization/ConfigurationPanel.tsx @@ -9,7 +9,6 @@ import { useState, useEffect, useCallback, useMemo, useRef } from "react"; import { Loader2, Palette, Clock, Ruler, AlertCircle, Check } from "lucide-react"; -import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { cn } from "@/lib/utils"; diff --git a/src/components/products/customization/ConfigurationPanelV6.tsx b/src/components/products/customization/ConfigurationPanelV6.tsx index 42435d5cc..b032f7aff 100644 --- a/src/components/products/customization/ConfigurationPanelV6.tsx +++ b/src/components/products/customization/ConfigurationPanelV6.tsx @@ -7,7 +7,7 @@ */ import { useState, useEffect, useMemo, useRef } from "react"; -import { Loader2, Palette, Clock, Ruler, AlertCircle, Check } from "lucide-react"; +import { Loader2, Palette, Ruler, AlertCircle, Check } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { cn } from "@/lib/utils"; diff --git a/src/components/products/customization/LocationCard.tsx b/src/components/products/customization/LocationCard.tsx index 0f2730ca9..37f3a99e4 100644 --- a/src/components/products/customization/LocationCard.tsx +++ b/src/components/products/customization/LocationCard.tsx @@ -15,7 +15,6 @@ import { CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible"; -import { Badge } from "@/components/ui/badge"; import { cn } from "@/lib/utils"; import { TechniqueOption } from "./TechniqueOption"; import { VariationSelector } from "./VariationSelector"; diff --git a/src/components/products/gallery/GalleryFullscreen.tsx b/src/components/products/gallery/GalleryFullscreen.tsx index 2983c9c74..034cb5afa 100644 --- a/src/components/products/gallery/GalleryFullscreen.tsx +++ b/src/components/products/gallery/GalleryFullscreen.tsx @@ -35,7 +35,7 @@ interface GalleryFullscreenProps { } export function GalleryFullscreen({ - open, onOpenChange, allMedia, selectedIndex, productName, imageCount, + open, onOpenChange, allMedia, selectedIndex, productName, _imageCount, isVideo, zoom, pan, isPanning, isImageLoading, isAnimating, onZoomIn, onZoomOut, onResetZoom, onGoNext, onGoPrevious, onSelectIndex, onMouseDown, onMouseMove, onMouseUp, onWheel, onKeyDown, diff --git a/src/components/products/share/ShareAllColorsDialog.tsx b/src/components/products/share/ShareAllColorsDialog.tsx index 60de9fd97..26a152fa6 100644 --- a/src/components/products/share/ShareAllColorsDialog.tsx +++ b/src/components/products/share/ShareAllColorsDialog.tsx @@ -1,5 +1,5 @@ import { useState, useCallback, useMemo } from "react"; -import { Palette, Send, Check, X, Eye, Pencil } from "lucide-react"; +import { Palette, Send, Check, Eye, Pencil } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Dialog, diff --git a/src/components/products/share/ShareContactSelector.tsx b/src/components/products/share/ShareContactSelector.tsx index 32600356c..947bb991c 100644 --- a/src/components/products/share/ShareContactSelector.tsx +++ b/src/components/products/share/ShareContactSelector.tsx @@ -1,6 +1,5 @@ -import { useState, useMemo, useRef, useEffect } from "react"; +import { useState, useRef, useEffect } from "react"; import { useQuery } from "@tanstack/react-query"; -import Fuse from "fuse.js"; import { Building2, User, Search, X, Loader2, Phone, Mail, Check } from "lucide-react"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; diff --git a/src/components/products/share/usePhotoDownload.ts b/src/components/products/share/usePhotoDownload.ts index 4111ee6e7..6061d580c 100644 --- a/src/components/products/share/usePhotoDownload.ts +++ b/src/components/products/share/usePhotoDownload.ts @@ -54,7 +54,7 @@ export function usePhotoDownload() { title: "Download concluído", description: `${images.length} foto(s) baixada(s)`, }); - } catch (err) { + } catch (_err) { toast({ title: "Erro no download", description: "Não foi possível baixar as fotos", diff --git a/src/components/products/useStockChartData.ts b/src/components/products/useStockChartData.ts index 92ad74be3..f60e797c2 100644 --- a/src/components/products/useStockChartData.ts +++ b/src/components/products/useStockChartData.ts @@ -14,20 +14,7 @@ import { type StockVelocity, } from "@/hooks/useStockHistory"; import { useSupplierNames } from "@/hooks/useSupplierNames"; -import { - safeVelocityTrend, - safeNumber, - generateMockStockData, - generateMockVelocity, - generateMockVelocities, - generateMockIntelligence, - generateMockSupplierNames, - formatVelocityTrendCommercial, - safeParseDateForChart, - isRealIntelligence, - safePriceChanges, - type MockIntelligenceData, -} from "@/lib/stock-chart-utils"; +import { safeVelocityTrend, safeNumber, generateMockStockData, generateMockVelocities, generateMockIntelligence, generateMockSupplierNames, formatVelocityTrendCommercial, safeParseDateForChart, isRealIntelligence, safePriceChanges, type MockIntelligenceData } from "@/lib/stock-chart-utils"; export function useStockChartData(productId: string) { const [period, setPeriod] = useState('30'); diff --git a/src/components/quote/QuickQuoteFAB.tsx b/src/components/quote/QuickQuoteFAB.tsx index 1b48c1ac4..7d45b47d9 100644 --- a/src/components/quote/QuickQuoteFAB.tsx +++ b/src/components/quote/QuickQuoteFAB.tsx @@ -4,7 +4,7 @@ import { motion, AnimatePresence } from "framer-motion"; import { FileText, Plus, - X, + _X, Wand2, Calculator, ShoppingCart, @@ -75,7 +75,7 @@ interface QuickQuoteFABProps { productName?: string; } -export function QuickQuoteFAB({ productId, productName }: QuickQuoteFABProps) { +export function QuickQuoteFAB({ productId, _productName }: QuickQuoteFABProps) { const [isOpen, setIsOpen] = useState(false); const [expertOpen, setExpertOpen] = useState(false); const [voiceInitialMessage, setVoiceInitialMessage] = useState(); diff --git a/src/components/quotes/AIRecommendationsPanel.tsx b/src/components/quotes/AIRecommendationsPanel.tsx index a13e0d60c..2da3e2d2e 100644 --- a/src/components/quotes/AIRecommendationsPanel.tsx +++ b/src/components/quotes/AIRecommendationsPanel.tsx @@ -4,7 +4,6 @@ */ import { useState, useMemo, useCallback } from "react"; import { Sparkles, Loader2, RefreshCw, Plus, Lightbulb, AlertCircle } from "lucide-react"; -import { Card } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; diff --git a/src/components/quotes/AdminTemplatesManager.tsx b/src/components/quotes/AdminTemplatesManager.tsx index 073a258a7..190e1cd71 100644 --- a/src/components/quotes/AdminTemplatesManager.tsx +++ b/src/components/quotes/AdminTemplatesManager.tsx @@ -5,7 +5,6 @@ import { useState, useMemo } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Separator } from "@/components/ui/separator"; diff --git a/src/components/quotes/DraggableQuoteItems.tsx b/src/components/quotes/DraggableQuoteItems.tsx index 5e4d7da25..38a16cf48 100644 --- a/src/components/quotes/DraggableQuoteItems.tsx +++ b/src/components/quotes/DraggableQuoteItems.tsx @@ -28,7 +28,6 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; -import { PriceFreshnessBadge } from "@/components/products/PriceFreshnessBadge"; import { cn } from "@/lib/utils"; import { motion, AnimatePresence } from "framer-motion"; diff --git a/src/components/quotes/PdfGenerationDialog.tsx b/src/components/quotes/PdfGenerationDialog.tsx index 0aacdbb8f..e9998abfd 100644 --- a/src/components/quotes/PdfGenerationDialog.tsx +++ b/src/components/quotes/PdfGenerationDialog.tsx @@ -5,7 +5,7 @@ */ import { useState, useCallback, useRef } from "react"; -import { Download, FileText, Eye, Loader2, Check, Send, Copy, Link2, MessageCircle, Mail, Printer } from "lucide-react"; +import { Download, FileText, Loader2, Check, Printer } from "lucide-react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; @@ -40,10 +40,10 @@ export function PdfGenerationDialog({ proposalData, quoteNumber, quoteStatus, - clientPhone, - approvalLink, - onWhatsApp, - onShareLink, + _clientPhone, + _approvalLink, + _onWhatsApp, + _onShareLink, trigger, }: PdfGenerationDialogProps) { const [open, setOpen] = useState(false); @@ -104,7 +104,7 @@ export function PdfGenerationDialog({ setPdfVersion((v) => v + 1); }; - const handleEmail = () => { + const _handleEmail = () => { const subject = encodeURIComponent(`Proposta Comercial ${quoteNumber || ""}`); const body = encodeURIComponent( `Olá,\n\nSegue a proposta comercial ${quoteNumber || ""}.\n\nQualquer dúvida, estou à disposição!\n\nAtt.` diff --git a/src/components/quotes/QuoteAutoSave.tsx b/src/components/quotes/QuoteAutoSave.tsx index c5f0542d4..8a61d3432 100644 --- a/src/components/quotes/QuoteAutoSave.tsx +++ b/src/components/quotes/QuoteAutoSave.tsx @@ -7,7 +7,6 @@ import { useState, useEffect, useCallback, useRef } from "react"; import { Cloud, CloudOff, Check, Loader2, AlertCircle } from "lucide-react"; import { motion, AnimatePresence } from "framer-motion"; import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, @@ -41,7 +40,7 @@ export function QuoteAutoSave({ quoteId, data, onChange, - onRestore, + _onRestore, debounceMs = 2000, className, }: QuoteAutoSaveProps) { @@ -164,7 +163,7 @@ export function QuoteAutoSave({ } }, [storageKey, quoteId]); - const handleDiscard = () => { + const _handleDiscard = () => { localStorage.removeItem(storageKey); const keysToRemove: string[] = []; diff --git a/src/components/quotes/QuoteBuilderProductSearch.tsx b/src/components/quotes/QuoteBuilderProductSearch.tsx index 14ce3e8fd..651f4479c 100644 --- a/src/components/quotes/QuoteBuilderProductSearch.tsx +++ b/src/components/quotes/QuoteBuilderProductSearch.tsx @@ -4,7 +4,6 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; -import { Badge } from "@/components/ui/badge"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { AlertTriangle, Package, PackageCheck, Search, X } from "lucide-react"; import { cn } from "@/lib/utils"; diff --git a/src/components/quotes/QuoteBuilderSummaryColumn.tsx b/src/components/quotes/QuoteBuilderSummaryColumn.tsx index 2a798eb35..a0a3a4921 100644 --- a/src/components/quotes/QuoteBuilderSummaryColumn.tsx +++ b/src/components/quotes/QuoteBuilderSummaryColumn.tsx @@ -9,11 +9,10 @@ import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from "@/components/ui/dialog"; -import { AlertTriangle, Edit, Loader2, Package, Percent, Save, Send, Shield, ShoppingCart, Trash2, CheckCircle2, X } from "lucide-react"; +import { AlertTriangle, Edit, Loader2, Package, Save, Send, Shield, ShoppingCart, Trash2, CheckCircle2, X } from "lucide-react"; import { cn } from "@/lib/utils"; import type { QuoteItem } from "@/hooks/useQuotes"; import { NegotiationMarkupCard } from "@/components/quote/NegotiationMarkupCard"; @@ -59,7 +58,7 @@ export function QuoteBuilderSummaryColumn({ discountType, setDiscountType, discountValue, setDiscountValue, discountAmount, total, isFormValid, isDraftValid, validationErrors, quotesLoading, isEditMode, formatCurrency, - calculateItemPersonalizationTotal, calculateItemTotal, onSave, + calculateItemPersonalizationTotal, _calculateItemTotal, onSave, maxDiscountPercent, isDiscountExceeded, negotiationMarkup = 0, setNegotiationMarkup, realSubtotal = 0, realDiscountPercent = 0, diff --git a/src/components/quotes/QuoteHistoryPanel.tsx b/src/components/quotes/QuoteHistoryPanel.tsx index 8c63250e0..1c4709354 100644 --- a/src/components/quotes/QuoteHistoryPanel.tsx +++ b/src/components/quotes/QuoteHistoryPanel.tsx @@ -7,12 +7,12 @@ import { Edit2, RefreshCw, Trash2, - Send, + _Send, CheckCircle, XCircle, Clock, Package, - Upload, + _Upload, FileText, AlertTriangle, Zap diff --git a/src/components/quotes/QuoteKanbanBoard.tsx b/src/components/quotes/QuoteKanbanBoard.tsx index d6b2d007e..18ce65046 100644 --- a/src/components/quotes/QuoteKanbanBoard.tsx +++ b/src/components/quotes/QuoteKanbanBoard.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState, lazy, Suspense } from "react"; +import { useMemo, useState } from "react"; import confetti from "canvas-confetti"; import { useNavigate } from "react-router-dom"; import { @@ -323,7 +323,7 @@ export function QuoteKanbanBoard({ quotes }: QuoteKanbanBoardProps) { setActiveQuote(quote || null); }; - const handleDragOver = (event: DragOverEvent) => { + const handleDragOver = (_event: DragOverEvent) => { // Handled on drag end for simplicity }; diff --git a/src/components/quotes/QuoteProductColorSelector.tsx b/src/components/quotes/QuoteProductColorSelector.tsx index ad81df24f..7efc383db 100644 --- a/src/components/quotes/QuoteProductColorSelector.tsx +++ b/src/components/quotes/QuoteProductColorSelector.tsx @@ -8,7 +8,7 @@ import { useMemo } from 'react'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Skeleton } from '@/components/ui/skeleton'; -import { ArrowLeft, Check, Package, AlertTriangle } from 'lucide-react'; +import { ArrowLeft, Package, AlertTriangle } from 'lucide-react'; import { cn } from '@/lib/utils'; import { useExternalVariantStock, type ExternalVariantStock } from '@/hooks/useExternalVariantStock'; diff --git a/src/components/quotes/QuoteStatusTimeline.tsx b/src/components/quotes/QuoteStatusTimeline.tsx index f0629972c..3dd469432 100644 --- a/src/components/quotes/QuoteStatusTimeline.tsx +++ b/src/components/quotes/QuoteStatusTimeline.tsx @@ -1,4 +1,4 @@ -import { Check, Clock, Eye, FileText, RefreshCw, Send, Shield, ThumbsDown, ThumbsUp, AlertTriangle } from "lucide-react"; +import { Check, Clock, FileText, RefreshCw, Send, Shield, ThumbsDown, AlertTriangle } from "lucide-react"; import { cn } from "@/lib/utils"; import { format } from "date-fns"; import { ptBR } from "date-fns/locale"; diff --git a/src/components/quotes/QuoteTemplatesList.tsx b/src/components/quotes/QuoteTemplatesList.tsx index 3450bc5c9..086ff8531 100644 --- a/src/components/quotes/QuoteTemplatesList.tsx +++ b/src/components/quotes/QuoteTemplatesList.tsx @@ -69,7 +69,7 @@ export function QuoteTemplatesList({ onCreateTemplate, selectionMode = false, }: QuoteTemplatesListProps) { - const { templates, allTemplates, sellers, loading, deleteTemplate, setDefaultTemplate, duplicateTemplate, cloneTemplateToSeller, isAdmin } = useQuoteTemplates(); + const { templates, _allTemplates, sellers, loading, deleteTemplate, setDefaultTemplate, duplicateTemplate, cloneTemplateToSeller, isAdmin } = useQuoteTemplates(); const [searchTerm, setSearchTerm] = useState(""); const [deleteConfirmId, setDeleteConfirmId] = useState(null); const [cloneDialogOpen, setCloneDialogOpen] = useState(false); diff --git a/src/components/quotes/QuoteValidityBanner.tsx b/src/components/quotes/QuoteValidityBanner.tsx index ac38a1fe7..f7d74d921 100644 --- a/src/components/quotes/QuoteValidityBanner.tsx +++ b/src/components/quotes/QuoteValidityBanner.tsx @@ -1,6 +1,5 @@ import { differenceInDays, parseISO, isValid } from "date-fns"; import { AlertTriangle, Clock, CheckCircle2 } from "lucide-react"; -import { cn } from "@/lib/utils"; interface QuoteValidityBannerProps { validUntil?: string; diff --git a/src/components/quotes/QuoteVersionCompare.tsx b/src/components/quotes/QuoteVersionCompare.tsx index 075c05471..ca67788cd 100644 --- a/src/components/quotes/QuoteVersionCompare.tsx +++ b/src/components/quotes/QuoteVersionCompare.tsx @@ -56,7 +56,7 @@ function DiffBadge({ oldVal, newVal, format: fmt }: { oldVal: number; newVal: nu return -{formatted}; } -export function QuoteVersionCompare({ open, onOpenChange, versions, currentQuoteId }: QuoteVersionCompareProps) { +export function QuoteVersionCompare({ open, onOpenChange, versions, _currentQuoteId }: QuoteVersionCompareProps) { const [leftId, setLeftId] = useState(""); const [rightId, setRightId] = useState(""); const [leftDetail, setLeftDetail] = useState(null); @@ -208,7 +208,7 @@ export function QuoteVersionCompare({ open, onOpenChange, versions, currentQuote {[leftDetail, rightDetail].map((detail) => (

v{detail.version}

- {detail.items.map((item, i) => { + {detail.items.map((item, _i) => { const otherDetail = detail === leftDetail ? rightDetail : leftDetail; const otherItem = otherDetail.items.find(oi => oi.product_sku === item.product_sku); const isNew = !otherItem; diff --git a/src/components/quotes/QuoteVersionHistory.tsx b/src/components/quotes/QuoteVersionHistory.tsx index b41c61b75..cc91b02f7 100644 --- a/src/components/quotes/QuoteVersionHistory.tsx +++ b/src/components/quotes/QuoteVersionHistory.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { format } from "date-fns"; import { ptBR } from "date-fns/locale"; -import { GitBranch, GitCompare, Plus, Eye, Check, Clock, FileText } from "lucide-react"; +import { GitBranch, GitCompare, Plus, Eye, Clock, FileText } from "lucide-react"; import { QuoteVersionCompare } from "./QuoteVersionCompare"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; @@ -10,7 +10,7 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { ScrollArea } from "@/components/ui/scroll-area"; -import { useQuoteVersions, type QuoteVersion } from "@/hooks/useQuoteVersions"; +import { useQuoteVersions } from "@/hooks/useQuoteVersions"; import { QUOTE_STATUS_CONFIG } from "@/lib/quote-status-config"; interface QuoteVersionHistoryProps { diff --git a/src/components/quotes/SaveAsTemplateButton.tsx b/src/components/quotes/SaveAsTemplateButton.tsx index 58d6fcb54..76335520d 100644 --- a/src/components/quotes/SaveAsTemplateButton.tsx +++ b/src/components/quotes/SaveAsTemplateButton.tsx @@ -38,7 +38,7 @@ export function SaveAsTemplateButton({ onSaved?.(); }; - const initialTemplate = { + const _initialTemplate = { name: "", description: "", is_default: false, diff --git a/src/components/ramo-atividade/RamoAtividadeBadge.tsx b/src/components/ramo-atividade/RamoAtividadeBadge.tsx index 27e197134..729bb8a15 100644 --- a/src/components/ramo-atividade/RamoAtividadeBadge.tsx +++ b/src/components/ramo-atividade/RamoAtividadeBadge.tsx @@ -1,6 +1,6 @@ import React from "react"; import { cn } from "@/lib/utils"; -import { X, Building2 } from "lucide-react"; +import { X } from "lucide-react"; import { Tooltip, TooltipContent, @@ -26,8 +26,8 @@ interface RamoAtividadeBadgeProps { export function RamoAtividadeBadge({ name, ramoName, - hexCode, - icon, + _hexCode, + _icon, size = "md", variant = "default", showRamo = false, @@ -43,7 +43,7 @@ export function RamoAtividadeBadge({ lg: "text-sm px-3 py-1.5 gap-2", }; - const colorDotSizes = { + const _colorDotSizes = { sm: "w-2 h-2", md: "w-2.5 h-2.5", lg: "w-3 h-3", diff --git a/src/components/ramo-atividade/RamoAtividadeGroupAccordion.tsx b/src/components/ramo-atividade/RamoAtividadeGroupAccordion.tsx index a98944b2e..874c901dc 100644 --- a/src/components/ramo-atividade/RamoAtividadeGroupAccordion.tsx +++ b/src/components/ramo-atividade/RamoAtividadeGroupAccordion.tsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { ChevronDown, Building2, Check } from "lucide-react"; +import { ChevronDown, Check } from "lucide-react"; import { Checkbox } from "@/components/ui/checkbox"; import { cn } from "@/lib/utils"; import type { RamoAtividadeGroup, SegmentoComplete } from "@/types/ramo-atividade"; @@ -29,7 +29,7 @@ export function RamoAtividadeGroupAccordion({ onRamoToggle, onSegmentoToggle, defaultOpen = false, - showProductCounts = true, + _showProductCounts = true, compact = false, productCountsByRamo, }: RamoAtividadeGroupAccordionProps) { diff --git a/src/components/ramo-atividade/SegmentoCheckbox.tsx b/src/components/ramo-atividade/SegmentoCheckbox.tsx index 817044d0b..e398cece5 100644 --- a/src/components/ramo-atividade/SegmentoCheckbox.tsx +++ b/src/components/ramo-atividade/SegmentoCheckbox.tsx @@ -15,7 +15,7 @@ export function SegmentoCheckbox({ segmento, isSelected, onToggle, - ramoHexCode, + _ramoHexCode, compact = false, }: SegmentoCheckboxProps) { if (compact) { diff --git a/src/components/reports/ScheduledReportsManager.tsx b/src/components/reports/ScheduledReportsManager.tsx index 605bda581..c674a7e0f 100644 --- a/src/components/reports/ScheduledReportsManager.tsx +++ b/src/components/reports/ScheduledReportsManager.tsx @@ -1,7 +1,7 @@ import { useState } from 'react'; import { format } from 'date-fns'; import { ptBR } from 'date-fns/locale'; -import { CalendarClock, Plus, Trash2, Pause, Play, Mail, Clock, FileBarChart } from 'lucide-react'; +import { CalendarClock, Plus, Trash2, Mail, Clock, FileBarChart } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; @@ -10,7 +10,6 @@ import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; -import { Separator } from '@/components/ui/separator'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@/components/ui/alert-dialog'; import { useScheduledReports, diff --git a/src/components/search/AdvancedSearch.tsx b/src/components/search/AdvancedSearch.tsx index 15966f4a9..923e9a233 100644 --- a/src/components/search/AdvancedSearch.tsx +++ b/src/components/search/AdvancedSearch.tsx @@ -31,7 +31,7 @@ interface AdvancedSearchProps { export function AdvancedSearch({ onSearch, onVisualSearchResults, className }: AdvancedSearchProps) { const navigate = useNavigate(); - const { toast } = useToast(); + const { _toast } = useToast(); const { trackSearch } = useProductAnalytics(); const { query, diff --git a/src/components/search/GlobalSearch.tsx b/src/components/search/GlobalSearch.tsx index d466a17dd..e04243d79 100644 --- a/src/components/search/GlobalSearch.tsx +++ b/src/components/search/GlobalSearch.tsx @@ -5,13 +5,13 @@ import { X, ArrowRight, Clock, - Star, + _Star, TrendingUp, Package, FileText, Users, ShoppingCart, - Settings, + _Settings, Sparkles, Filter, Keyboard, diff --git a/src/components/search/GlobalSearchHelpers.tsx b/src/components/search/GlobalSearchHelpers.tsx index 6fba2754d..32f381d47 100644 --- a/src/components/search/GlobalSearchHelpers.tsx +++ b/src/components/search/GlobalSearchHelpers.tsx @@ -6,7 +6,7 @@ import { Badge } from "@/components/ui/badge"; import { CommandItem, } from "@/components/ui/command"; -import { Trophy, Medal, ArrowUpRight, ChevronRight } from "lucide-react"; +import { Trophy, Medal, ArrowUpRight } from "lucide-react"; import { cn } from "@/lib/utils"; export const paletteItemStateClass = diff --git a/src/components/search/GlobalSearchIdleState.tsx b/src/components/search/GlobalSearchIdleState.tsx index 8a1caa91e..f755f47ae 100644 --- a/src/components/search/GlobalSearchIdleState.tsx +++ b/src/components/search/GlobalSearchIdleState.tsx @@ -5,7 +5,7 @@ import React from "react"; import { Badge } from "@/components/ui/badge"; import { - CommandGroup, CommandItem, + _CommandGroup, CommandItem, } from "@/components/ui/command"; import { Clock, Flame, X, Sparkles, Eye, Zap, Compass, @@ -67,7 +67,7 @@ function RankBadge({ index }: { index: number }) { } /* ── Quick Actions ── */ -const quickActions = [ +const _quickActions = [ { id: "new-quote", title: "Novo Orçamento", description: "Criar um novo orçamento", icon: , href: "/orcamentos/novo", shortcut: "N", highlight: true }, { id: "products", title: "Catálogo de Produtos", description: "Ver todos os produtos", icon: , href: "/" }, ]; diff --git a/src/components/search/GlobalSearchPalette.tsx b/src/components/search/GlobalSearchPalette.tsx index 951338592..fbe24dd7c 100644 --- a/src/components/search/GlobalSearchPalette.tsx +++ b/src/components/search/GlobalSearchPalette.tsx @@ -4,8 +4,8 @@ */ import React, { lazy, Suspense, useEffect, useCallback } from "react"; import { - CommandDialog, CommandEmpty, CommandGroup, CommandInput, - CommandItem, CommandList, CommandSeparator, + CommandDialog, _CommandEmpty, CommandGroup, CommandInput, + CommandItem, CommandList, _CommandSeparator, } from "@/components/ui/command"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; @@ -18,7 +18,7 @@ import { cn } from "@/lib/utils"; import { useGlobalSearch } from "./useGlobalSearch"; import { typeConfig } from "./search-types"; import { GlobalSearchIdleState } from "./GlobalSearchIdleState"; -import { paletteItemStateClass, NavCard, staggerStyle, type QuickAction } from "./GlobalSearchHelpers"; +import { paletteItemStateClass, staggerStyle, type QuickAction } from "./GlobalSearchHelpers"; import { HighlightMatch } from "./HighlightMatch"; import { EmptySearchState } from "./EmptySearchState"; diff --git a/src/components/search/SearchResultGroups.tsx b/src/components/search/SearchResultGroups.tsx index 7d2a895ee..d1b7d00ed 100644 --- a/src/components/search/SearchResultGroups.tsx +++ b/src/components/search/SearchResultGroups.tsx @@ -4,7 +4,7 @@ import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { - Search, Package, Folder, Building2, Zap, ArrowRight, + _Search, Package, Folder, Building2, Zap, ArrowRight, } from "lucide-react"; import { cn } from "@/lib/utils"; import { HighlightMatch } from "./HighlightMatch"; diff --git a/src/components/search/SmartSuggestions.tsx b/src/components/search/SmartSuggestions.tsx index 62880ed26..f47f0a6d9 100644 --- a/src/components/search/SmartSuggestions.tsx +++ b/src/components/search/SmartSuggestions.tsx @@ -5,10 +5,10 @@ import { Sparkles, TrendingUp, Clock, - Star, - Package, - FileText, - Users, + _Star, + _Package, + _FileText, + _Users, Lightbulb, ArrowRight, Tag, diff --git a/src/components/search/VoiceSearchOverlay.tsx b/src/components/search/VoiceSearchOverlay.tsx index 19f51960a..f624efda7 100644 --- a/src/components/search/VoiceSearchOverlay.tsx +++ b/src/components/search/VoiceSearchOverlay.tsx @@ -46,7 +46,7 @@ export const VoiceSearchOverlay = React.forwardRef>("companies", "razao_social", searchTerm, { select: "id, razao_social, nome_fantasia, ramo", limit: 5 }); diff --git a/src/components/security/PushNotificationSettings.tsx b/src/components/security/PushNotificationSettings.tsx index eb853c6a8..ecf8d5571 100644 --- a/src/components/security/PushNotificationSettings.tsx +++ b/src/components/security/PushNotificationSettings.tsx @@ -3,20 +3,9 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/com import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Switch } from '@/components/ui/switch'; -import { Label } from '@/components/ui/label'; import { useNotifications } from '@/hooks/useNotifications'; import { useToast } from '@/hooks/use-toast'; -import { - Bell, - BellOff, - BellRing, - CheckCircle2, - XCircle, - AlertTriangle, - Smartphone, - Volume2, - VolumeX -} from 'lucide-react'; +import { Bell, BellOff, BellRing, CheckCircle2, XCircle, AlertTriangle, Smartphone, _Volume2 } from 'lucide-react'; export function PushNotificationSettings() { const { diff --git a/src/components/simulator/MockupPreview.tsx b/src/components/simulator/MockupPreview.tsx index 25b3e2220..cc263fe29 100644 --- a/src/components/simulator/MockupPreview.tsx +++ b/src/components/simulator/MockupPreview.tsx @@ -16,17 +16,8 @@ import { Card, CardContent, } from "@/components/ui/card"; -import { - Eye, - Image as ImageIcon, - Package, - Palette, - Move, - ZoomIn, - ZoomOut, -} from "lucide-react"; +import { Eye, Image as ImageIcon, Package, Palette, Move, ZoomIn } from "lucide-react"; import { Slider } from "@/components/ui/slider"; -import { cn } from "@/lib/utils"; import type { SimulationOption, Product } from "@/types/simulation"; interface MockupPreviewProps { diff --git a/src/components/simulator/NicheRecommendationBadge.tsx b/src/components/simulator/NicheRecommendationBadge.tsx index ac7404e1f..08c264ed7 100644 --- a/src/components/simulator/NicheRecommendationBadge.tsx +++ b/src/components/simulator/NicheRecommendationBadge.tsx @@ -4,7 +4,7 @@ import { useMemo } from "react"; import { Badge } from "@/components/ui/badge"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; -import { Sparkles, Target, TrendingUp } from "lucide-react"; +import { Sparkles, Target } from "lucide-react"; import { cn } from "@/lib/utils"; // Mapeamento de nichos/ramos para técnicas recomendadas diff --git a/src/components/simulator/ScenarioComparison.tsx b/src/components/simulator/ScenarioComparison.tsx index f814121e1..04a28b681 100644 --- a/src/components/simulator/ScenarioComparison.tsx +++ b/src/components/simulator/ScenarioComparison.tsx @@ -50,7 +50,7 @@ export function ScenarioComparison({ onSaveAsScenario, onClearScenario, }: ScenarioComparisonProps) { - const [selectedView, setSelectedView] = useState<'compare' | 'details'>('compare'); + const [_selectedView, _setSelectedView] = useState<'compare' | 'details'>('compare'); const canSave = currentSimulation.options.length > 0; diff --git a/src/components/simulator/TechniqueCard.tsx b/src/components/simulator/TechniqueCard.tsx index 8a0a4cedb..b83be82cb 100644 --- a/src/components/simulator/TechniqueCard.tsx +++ b/src/components/simulator/TechniqueCard.tsx @@ -6,7 +6,6 @@ * * Refatorado: helpers/preview/style extraídos para TechniqueCardHelpers.tsx */ -import { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Badge } from '@/components/ui/badge'; import { Input } from '@/components/ui/input'; diff --git a/src/components/simulator/wizard/ComparisonCard.tsx b/src/components/simulator/wizard/ComparisonCard.tsx index 038ecd742..3e7b901ec 100644 --- a/src/components/simulator/wizard/ComparisonCard.tsx +++ b/src/components/simulator/wizard/ComparisonCard.tsx @@ -6,7 +6,7 @@ import { useState } from 'react'; import { Badge } from '@/components/ui/badge'; import { - Trophy, Zap, Clock, DollarSign, AlertTriangle, Check, ChevronDown, + Trophy, Zap, Clock, DollarSign, _AlertTriangle, Check, ChevronDown, } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; import { cn } from '@/lib/utils'; @@ -23,7 +23,7 @@ interface ComparisonCardProps { } export function ComparisonCard({ - result, onSelect, quantity, isFirst, maxPrice, isSelected, + result, onSelect, _quantity, isFirst, maxPrice, isSelected, }: ComparisonCardProps) { const [showDetails, setShowDetails] = useState(false); const isBestValue = result.isCheapest; diff --git a/src/components/simulator/wizard/ConfirmedSummary.tsx b/src/components/simulator/wizard/ConfirmedSummary.tsx index 4e2a4728f..caf76b0ba 100644 --- a/src/components/simulator/wizard/ConfirmedSummary.tsx +++ b/src/components/simulator/wizard/ConfirmedSummary.tsx @@ -12,7 +12,6 @@ import { Repeat, Undo2, Redo2, AlertCircle, } from 'lucide-react'; import { motion } from 'framer-motion'; -import { cn } from '@/lib/utils'; import { formatCurrency } from '@/lib/format'; import { toast } from 'sonner'; import type { UseSimulatorWizardReturn } from '@/hooks/simulator/useSimulatorWizard'; diff --git a/src/components/simulator/wizard/MobilePersonalizationSummary.tsx b/src/components/simulator/wizard/MobilePersonalizationSummary.tsx index 557d1acf6..54a6d861e 100644 --- a/src/components/simulator/wizard/MobilePersonalizationSummary.tsx +++ b/src/components/simulator/wizard/MobilePersonalizationSummary.tsx @@ -12,7 +12,7 @@ import { ShoppingCart, ChevronUp, FileText, - Plus, + _Plus, } from 'lucide-react'; import { motion } from 'framer-motion'; import { formatCurrency } from '@/lib/format'; diff --git a/src/components/simulator/wizard/PersonalizationSummary.tsx b/src/components/simulator/wizard/PersonalizationSummary.tsx index 19036fe97..4ed35b612 100644 --- a/src/components/simulator/wizard/PersonalizationSummary.tsx +++ b/src/components/simulator/wizard/PersonalizationSummary.tsx @@ -17,7 +17,7 @@ import { FileText, Copy, Trash2, - MoreHorizontal, + _MoreHorizontal, } from 'lucide-react'; import { AlertDialog, diff --git a/src/components/simulator/wizard/PersonalizationTabs.tsx b/src/components/simulator/wizard/PersonalizationTabs.tsx index b467ea1f6..916621603 100644 --- a/src/components/simulator/wizard/PersonalizationTabs.tsx +++ b/src/components/simulator/wizard/PersonalizationTabs.tsx @@ -4,12 +4,11 @@ import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; -import { Plus, X, Copy } from 'lucide-react'; +import { Plus, X } from 'lucide-react'; import { motion } from 'framer-motion'; import type { UseSimulatorWizardReturn } from '@/hooks/simulator/useSimulatorWizard'; import { RemovePersonalizationDialog } from './RemovePersonalizationDialog'; import { formatCurrency } from '@/lib/format'; -import { toast } from 'sonner'; interface PersonalizationTabsProps { wizard: UseSimulatorWizardReturn; diff --git a/src/components/simulator/wizard/StepComparison.tsx b/src/components/simulator/wizard/StepComparison.tsx index c965b75dd..905639289 100644 --- a/src/components/simulator/wizard/StepComparison.tsx +++ b/src/components/simulator/wizard/StepComparison.tsx @@ -24,7 +24,7 @@ interface StepComparisonProps { export function StepComparison({ wizard }: StepComparisonProps) { const navigate = useNavigate(); - const { comparisonResults, selectedComparison, selectedLocation, engravingSpecs } = wizard; + const { comparisonResults, _selectedComparison, _selectedLocation, _engravingSpecs } = wizard; const [selectedIds, setSelectedIds] = useState>(new Set()); const availableResults = comparisonResults.filter(r => r.isAvailable); diff --git a/src/components/simulator/wizard/StepLocation.tsx b/src/components/simulator/wizard/StepLocation.tsx index b098dd49b..732a0d640 100644 --- a/src/components/simulator/wizard/StepLocation.tsx +++ b/src/components/simulator/wizard/StepLocation.tsx @@ -10,13 +10,13 @@ import { Skeleton } from '@/components/ui/skeleton'; import { MapPin, Ruler, - Maximize2, + _Maximize2, Palette, ChevronRight, ChevronLeft, CheckCircle2, Layers, - AlertTriangle, + _AlertTriangle, } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; import { cn } from '@/lib/utils'; diff --git a/src/components/simulator/wizard/StepProduct.tsx b/src/components/simulator/wizard/StepProduct.tsx index 697d9744d..411f0354c 100644 --- a/src/components/simulator/wizard/StepProduct.tsx +++ b/src/components/simulator/wizard/StepProduct.tsx @@ -17,7 +17,7 @@ import { Sparkles, Clock, } from 'lucide-react'; -import { motion, AnimatePresence } from 'framer-motion'; +import { motion } from 'framer-motion'; import { cn } from '@/lib/utils'; import { useVirtualizer } from '@tanstack/react-virtual'; import { useExternalProductSearch } from '@/hooks/useExternalSimulator'; diff --git a/src/components/simulator/wizard/StepSpecs.tsx b/src/components/simulator/wizard/StepSpecs.tsx index 34d5afd26..3c356f0da 100644 --- a/src/components/simulator/wizard/StepSpecs.tsx +++ b/src/components/simulator/wizard/StepSpecs.tsx @@ -12,7 +12,6 @@ import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Slider } from '@/components/ui/slider'; import { Badge } from '@/components/ui/badge'; -import { Skeleton } from '@/components/ui/skeleton'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; import { SlidersHorizontal, diff --git a/src/components/simulator/wizard/WizardContextBar.tsx b/src/components/simulator/wizard/WizardContextBar.tsx index 83020b378..1699c89a1 100644 --- a/src/components/simulator/wizard/WizardContextBar.tsx +++ b/src/components/simulator/wizard/WizardContextBar.tsx @@ -10,7 +10,6 @@ import { Badge } from '@/components/ui/badge'; import { Input } from '@/components/ui/input'; import { Package, Hash, MapPin, Palette, Ruler, Pencil, Check } from 'lucide-react'; import { motion } from 'framer-motion'; -import { cn } from '@/lib/utils'; import { formatCurrency } from '@/lib/format'; import type { UseSimulatorWizardReturn } from '@/hooks/simulator/useSimulatorWizard'; diff --git a/src/components/ui/LoadingButton.tsx b/src/components/ui/LoadingButton.tsx index 060494b7b..5afb941b9 100644 --- a/src/components/ui/LoadingButton.tsx +++ b/src/components/ui/LoadingButton.tsx @@ -1,6 +1,6 @@ import { forwardRef } from "react"; import { Loader2 } from "lucide-react"; -import { Button, type ButtonProps, buttonVariants } from "./button"; +import { Button, type ButtonProps } from "./button"; import { cn } from "@/lib/utils"; import { motion, AnimatePresence } from "framer-motion"; diff --git a/src/components/ui/LoadingState.tsx b/src/components/ui/LoadingState.tsx index 8af5d8826..b0959c49f 100644 --- a/src/components/ui/LoadingState.tsx +++ b/src/components/ui/LoadingState.tsx @@ -1,4 +1,4 @@ -import { Loader2, LucideIcon } from "lucide-react"; +import { Loader2 } from "lucide-react"; import { cn } from "@/lib/utils"; import { Skeleton } from "@/components/ui/skeleton"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; diff --git a/src/data/mock-match-products.ts b/src/data/mock-match-products.ts index eb11694a9..93d65b21d 100644 --- a/src/data/mock-match-products.ts +++ b/src/data/mock-match-products.ts @@ -4,7 +4,7 @@ */ import type { Product } from '@/types/product-catalog'; -const img = (name: string) => `/placeholder.svg`; +const img = (_name: string) => `/placeholder.svg`; export const MOCK_MATCH_PRODUCTS: Product[] = [ // ── CHURRASCO cluster ── diff --git a/src/hooks/mockup/mockupGenerationService.ts b/src/hooks/mockup/mockupGenerationService.ts index 702f16a74..dc6b44946 100644 --- a/src/hooks/mockup/mockupGenerationService.ts +++ b/src/hooks/mockup/mockupGenerationService.ts @@ -4,7 +4,6 @@ */ import { supabase } from "@/integrations/supabase/client"; import { uploadLogoToStorage, downloadImageAsPdfFromUrl } from "@/lib/mockup-storage"; -import { showMockupSuccessToast } from "@/components/mockup/MockupSuccessToast"; import { toast } from "sonner"; import type { PersonalizationArea } from "@/components/mockup/MultiAreaManager"; diff --git a/src/hooks/simulator/useUndoRedo.ts b/src/hooks/simulator/useUndoRedo.ts index c1738bb42..fdaf7a16c 100644 --- a/src/hooks/simulator/useUndoRedo.ts +++ b/src/hooks/simulator/useUndoRedo.ts @@ -5,7 +5,7 @@ * Only meaningful actions are tracked (not UI-only state changes). */ -import { useReducer, useCallback, useRef } from 'react'; +import { useReducer, useCallback } from 'react'; interface HistoryState { past: S[]; diff --git a/src/hooks/simulator/useWizardPersistence.ts b/src/hooks/simulator/useWizardPersistence.ts index 033b07789..09c551c9d 100644 --- a/src/hooks/simulator/useWizardPersistence.ts +++ b/src/hooks/simulator/useWizardPersistence.ts @@ -2,7 +2,7 @@ * useWizardPersistence - localStorage session management for simulator wizard */ -import { useEffect, useRef } from 'react'; +import { useEffect } from 'react'; import type { SimulatorWizardState } from '@/types/domain/simulator-wizard'; const STORAGE_KEY = 'simulator_wizard_session'; diff --git a/src/hooks/simulator/useWizardPricing.ts b/src/hooks/simulator/useWizardPricing.ts index 7fef26a06..99db66dfd 100644 --- a/src/hooks/simulator/useWizardPricing.ts +++ b/src/hooks/simulator/useWizardPricing.ts @@ -5,14 +5,14 @@ import { useCallback, useEffect, useRef } from 'react'; import { toast } from 'sonner'; import { invokeExternalRpc } from '@/lib/external-rpc'; -import type { CustomizationPriceResponse, CustomizationPriceFlat } from '@/hooks/useGravacaoPriceV2'; +import type { CustomizationPriceResponse } from '@/hooks/useGravacaoPriceV2'; import { adaptPriceResponse } from '@/lib/personalization/adapters'; import type { SimulatorWizardState, WizardAction, TechniqueComparisonResult, Personalization, - AvailableTechnique, + _AvailableTechnique, } from '@/types/domain/simulator-wizard'; import { logger } from "@/lib/logger"; diff --git a/src/hooks/tecnicas/usePrecoCalculation.ts b/src/hooks/tecnicas/usePrecoCalculation.ts index dbb3238d6..a809ff3ff 100644 --- a/src/hooks/tecnicas/usePrecoCalculation.ts +++ b/src/hooks/tecnicas/usePrecoCalculation.ts @@ -238,7 +238,7 @@ export function usePrecoCalculation() { * Hook para simulador de preços */ export function usePriceSimulator(productBasePrice: number = 0) { - const { tabelas, isLoading, error, calculateAllPrices } = usePrecoCalculation(); + const { _tabelas, isLoading, error, calculateAllPrices } = usePrecoCalculation(); const [quantity, setQuantity] = useState(100); const [selectedTechniqueCode, setSelectedTechniqueCode] = useState(null); diff --git a/src/hooks/use-toast.ts b/src/hooks/use-toast.ts index ca1316d67..2914739e9 100644 --- a/src/hooks/use-toast.ts +++ b/src/hooks/use-toast.ts @@ -12,7 +12,7 @@ type ToasterToast = ToastProps & { action?: ToastActionElement; }; -const actionTypes = { +const _actionTypes = { ADD_TOAST: "ADD_TOAST", UPDATE_TOAST: "UPDATE_TOAST", DISMISS_TOAST: "DISMISS_TOAST", diff --git a/src/hooks/useCatalogRealStats.ts b/src/hooks/useCatalogRealStats.ts index 3bb00ba3c..051585051 100644 --- a/src/hooks/useCatalogRealStats.ts +++ b/src/hooks/useCatalogRealStats.ts @@ -4,7 +4,6 @@ */ import { useQuery } from '@tanstack/react-query'; import { invokeExternalDb } from '@/lib/external-db/bridge'; -import { invokeBatchBridge } from '@/lib/external-db/bridge'; export interface CatalogRealStats { totalVariants: number; diff --git a/src/hooks/useCatalogState.ts b/src/hooks/useCatalogState.ts index f34cb55ed..6f6f6b832 100644 --- a/src/hooks/useCatalogState.ts +++ b/src/hooks/useCatalogState.ts @@ -4,7 +4,7 @@ import { useState, useMemo, useEffect, useRef, useCallback } from "react"; import { useColorEnrichment } from "@/hooks/useColorEnrichment"; import { useNavigate, useSearchParams } from "react-router-dom"; -import { Package, Heart, Users, Layers, Palette, FolderTree } from "lucide-react"; +import { Package, Heart, Users, Palette, FolderTree } from "lucide-react"; import React from "react"; import { defaultFilters, type FilterState } from "@/components/filters/FilterPanel"; @@ -90,7 +90,7 @@ export function useCatalogState() { }, [gridColumns]); const [filterSheetOpen, setFilterSheetOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(searchQueryFromUrl); - const [isSearching, setIsSearching] = useState(false); + const [_isSearching, setIsSearching] = useState(false); const [displayCount, setDisplayCount] = useState(ITEMS_PER_PAGE); const [isLoadingMore, setIsLoadingMore] = useState(false); @@ -123,7 +123,7 @@ export function useCatalogState() { if (realProducts.length > 0) registerProducts(realProducts); }, [realProducts, registerProducts]); - const { suggestions, quickSuggestions, history, addToHistory } = useSearch(realProducts); + const { _suggestions, _quickSuggestions, _history, addToHistory } = useSearch(realProducts); // Material filter hook const { productIds: materialFilteredProductIds, hasFilter: hasMaterialFilter, isLoading: isLoadingMaterialFilter } = useProductsByMaterial({ @@ -137,7 +137,7 @@ export function useCatalogState() { includeDescendants: true, }); - const { data: externalCategories = [] } = useExternalCategoriesQuery(); + const { data: _externalCategories = [] } = useExternalCategoriesQuery(); const { data: realStats } = useCatalogRealStats(); const isLoading = isLoadingProducts || isLoadingMaterialFilter || isLoadingCategoryFilter; @@ -289,7 +289,7 @@ export function useCatalogState() { // Stats — contextual to filtered products const statBadges = useMemo(() => { const hasActiveFilters = activeFiltersCount > 0 || searchQuery.trim().length > 0; - const isFullCatalogLoaded = !hasNextPage; + const _isFullCatalogLoaded = !hasNextPage; // BUG-004/EDGE-004: deduplicate products by ID const seen = new Set(); diff --git a/src/hooks/useColorEnrichment.ts b/src/hooks/useColorEnrichment.ts index e27863666..b29c86ed5 100644 --- a/src/hooks/useColorEnrichment.ts +++ b/src/hooks/useColorEnrichment.ts @@ -11,7 +11,6 @@ import { useQuery } from '@tanstack/react-query'; import { useRef, useMemo, useEffect } from 'react'; import { invokeBatchBridge } from '@/lib/external-db'; -import type { Product } from '@/types/product-catalog'; import { logger } from '@/lib/logger'; interface ColorEnrichmentData { diff --git a/src/hooks/useCommemorativeDates.ts b/src/hooks/useCommemorativeDates.ts index eac85461f..040d15335 100644 --- a/src/hooks/useCommemorativeDates.ts +++ b/src/hooks/useCommemorativeDates.ts @@ -1,4 +1,4 @@ -import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; +import { useQuery } from "@tanstack/react-query"; import { supabase } from "@/integrations/supabase/client"; // Tipos baseados nas respostas das RPCs diff --git a/src/hooks/useCrmCompanies.ts b/src/hooks/useCrmCompanies.ts index 56299a006..3855025c1 100644 --- a/src/hooks/useCrmCompanies.ts +++ b/src/hooks/useCrmCompanies.ts @@ -5,8 +5,8 @@ import { useQuery } from "@tanstack/react-query"; import { selectCrm, selectCrmById, searchCrm } from "@/lib/crm-db"; -import { type CrmCompany, type CrmCompanyFilters, type CrmCustomer, toLegacyClient, getCompanyDisplayName, type LegacyClientFormat } from "@/types/crm"; -import { DEMO_CLIENT_ID, DEMO_COMPANY, isDemoClient } from "@/lib/bi/demoClient"; +import { type CrmCompany, type CrmCompanyFilters, type CrmCustomer, toLegacyClient, getCompanyDisplayName } from "@/types/crm"; +import { DEMO_COMPANY, isDemoClient } from "@/lib/bi/demoClient"; /** * Lista empresas do CRM com filtros opcionais diff --git a/src/hooks/useFavoriteLists.ts b/src/hooks/useFavoriteLists.ts index ea7a506a4..efff392c5 100644 --- a/src/hooks/useFavoriteLists.ts +++ b/src/hooks/useFavoriteLists.ts @@ -71,7 +71,7 @@ export function useFavoriteLists() { // Counts em paralelo const ids = (data ?? []).map((l) => l.id); - let counts: Record = {}; + const counts: Record = {}; if (ids.length) { const { data: rows } = await supabase .from("favorite_items") diff --git a/src/hooks/useFavoriteQuickAdd.ts b/src/hooks/useFavoriteQuickAdd.ts index 10f1fba69..c3e651ad4 100644 --- a/src/hooks/useFavoriteQuickAdd.ts +++ b/src/hooks/useFavoriteQuickAdd.ts @@ -3,7 +3,7 @@ import { useQuery, useQueryClient } from "@tanstack/react-query"; import { supabase } from "@/integrations/supabase/client"; import { useAuth } from "@/contexts/AuthContext"; import { useFavoritesStore, type FavoriteVariantInfo } from "@/stores/useFavoritesStore"; -import { useFavoriteLists, useFavoriteListItems } from "@/hooks/useFavoriteLists"; +import { useFavoriteLists } from "@/hooks/useFavoriteLists"; import type { Product } from "@/types/product"; import { toast } from "sonner"; diff --git a/src/hooks/useFavoriteReactions.ts b/src/hooks/useFavoriteReactions.ts index 3f51e6251..f032f260b 100644 --- a/src/hooks/useFavoriteReactions.ts +++ b/src/hooks/useFavoriteReactions.ts @@ -2,7 +2,7 @@ * useFavoriteReactions — hook leve para registrar reactions anônimas no public list page. * Anon ID é mantido em cookie/localStorage por 30 dias. */ -import { useCallback, useEffect, useState } from "react"; +import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { supabase } from "@/integrations/supabase/client"; diff --git a/src/hooks/useKitAutoSave.ts b/src/hooks/useKitAutoSave.ts index 5c85e1cef..66bff3fb0 100644 --- a/src/hooks/useKitAutoSave.ts +++ b/src/hooks/useKitAutoSave.ts @@ -8,7 +8,6 @@ import { useEffect, useRef, useCallback, useState } from 'react'; import { supabase } from '@/integrations/supabase/client'; import { useAuth } from '@/contexts/AuthContext'; import type { KitState } from '@/lib/kit-builder'; -import { toast } from 'sonner'; import { logger } from '@/lib/logger'; const AUTO_SAVE_DELAY_MS = 5000; diff --git a/src/hooks/useKitBuilderQueries.ts b/src/hooks/useKitBuilderQueries.ts index 9b0956af2..829bdbdb3 100644 --- a/src/hooks/useKitBuilderQueries.ts +++ b/src/hooks/useKitBuilderQueries.ts @@ -66,13 +66,13 @@ export function useKitBuilderQueries() { const setBoxFilters = useCallback((filters: BoxFilters) => { setBoxSearchInput(filters.search || ''); - const { search, ...rest } = filters; + const { _search, ...rest } = filters; setBoxDimFilters(rest); }, []); const setItemFilters = useCallback((filters: ItemFilters) => { setItemSearchInput(filters.search || ''); - const { search, ...rest } = filters; + const { _search, ...rest } = filters; setItemExtraFilters(rest); }, []); diff --git a/src/hooks/useMagicUpState.ts b/src/hooks/useMagicUpState.ts index 82659fe89..b5ee30d39 100644 --- a/src/hooks/useMagicUpState.ts +++ b/src/hooks/useMagicUpState.ts @@ -11,7 +11,7 @@ import type { Tables, TablesInsert, TablesUpdate } from "@/integrations/supabase import { useAuth } from "@/contexts/AuthContext"; import { useAriaLive } from "@/components/a11y"; import { useProductCustomizationOptionsForMockup } from "@/hooks/useMockupTechniques"; -import { searchCrm, selectCrmById } from "@/lib/crm-db"; +import { searchCrm } from "@/lib/crm-db"; import { getCompanyDisplayName, type CrmCompany } from "@/types/crm"; import type { PrintAreaWithTechniques } from "@/types/gravacao"; import type { ScenePrompt } from "@/components/magic-up/PromptBank"; diff --git a/src/hooks/useMaterialTypes.ts b/src/hooks/useMaterialTypes.ts index f0c235102..14b179ff3 100644 --- a/src/hooks/useMaterialTypes.ts +++ b/src/hooks/useMaterialTypes.ts @@ -101,7 +101,7 @@ export interface UseMaterialSearchReturn { } export function useMaterialSearch() { - const { data, isLoading, error, refetch } = useQuery({ + const { data, isLoading, error, _refetch } = useQuery({ queryKey: ['material-search'], queryFn: () => Promise.resolve({ types: [], count: 0, search: '' }), enabled: false, diff --git a/src/hooks/useMockupDraft.ts b/src/hooks/useMockupDraft.ts index 0d24c6925..4acf9436a 100644 --- a/src/hooks/useMockupDraft.ts +++ b/src/hooks/useMockupDraft.ts @@ -1,7 +1,6 @@ import { useState, useEffect, useCallback, useRef } from "react"; import { supabase } from "@/integrations/supabase/client"; import { useAuth } from "@/contexts/AuthContext"; -import { toast } from "sonner"; import { type PersonalizationArea } from "@/components/mockup/MultiAreaManager"; const LOCAL_STORAGE_KEY = "mockup_draft_v1"; @@ -136,7 +135,7 @@ export function useMockupDraft(options: UseMockupDraftOptions = {}) { if (upsertError) { // If FK violation or conflict, try update-only as fallback if (upsertError.code === "23503" || upsertError.code === "409") { - const { product_id, technique_id, client_id, ...safePayload } = payload as Record; + const { _product_id, _technique_id, _client_id, ...safePayload } = payload as Record; const { error: updateError } = await supabase .from("mockup_drafts") .update({ diff --git a/src/hooks/useMockupGenerator.ts b/src/hooks/useMockupGenerator.ts index d0620043f..f6c30559b 100644 --- a/src/hooks/useMockupGenerator.ts +++ b/src/hooks/useMockupGenerator.ts @@ -6,17 +6,16 @@ import { useState, useEffect, useCallback, useRef, useMemo } from "react"; import { toast } from "sonner"; -import { logger } from "@/lib/logger"; import { needsConversion, ensureSupportedFormat } from "@/lib/image-converter"; import { useAuth } from "@/contexts/AuthContext"; -import { useMockupDraft, MockupDraftData } from "@/hooks/useMockupDraft"; +import { useMockupDraft } from "@/hooks/useMockupDraft"; import { useFilteredTechniques, useProductCustomizationOptionsForMockup, type TechniqueWithLimits } from "@/hooks/useMockupTechniques"; import { usePositionHistory } from "@/hooks/usePositionHistory"; import { useProductsContext } from "@/contexts/ProductsContext"; import { getMockupWizardStep } from "@/components/mockup/mockupWizardStep"; import { useLogoColorAnalysis } from "@/hooks/useLogoColorAnalysis"; import { showMockupSuccessToast } from "@/components/mockup/MockupSuccessToast"; -import { classifyTechnique, techniqueNeedsColorConfig, type TechniqueColorConfig } from "@/components/mockup/techniqueColorUtils"; +import { type TechniqueColorConfig } from "@/components/mockup/techniqueColorUtils"; import { invokeWithRetry, extractFunctionErrorMessage } from "@/lib/external-db/invoke"; import { adaptTabelaPrecoRows } from "@/lib/personalization/adapters"; import type { PersonalizationArea } from "@/components/mockup/MultiAreaManager"; diff --git a/src/hooks/useMockupTechniques.ts b/src/hooks/useMockupTechniques.ts index 8160b52d7..8d8b0476b 100644 --- a/src/hooks/useMockupTechniques.ts +++ b/src/hooks/useMockupTechniques.ts @@ -290,7 +290,7 @@ export function useFilteredTechniques( // Build the result — use technique_id from the RPC as the ID const result: TechniqueWithLimits[] = []; - for (const [techName, { option, locationName }] of techniqueMap.entries()) { + for (const [_techName, { option, locationName }] of techniqueMap.entries()) { result.push({ id: option.technique_id, name: option.tecnica_nome, diff --git a/src/hooks/useProductAnalytics.ts b/src/hooks/useProductAnalytics.ts index a13b48fe3..0845b7e9e 100644 --- a/src/hooks/useProductAnalytics.ts +++ b/src/hooks/useProductAnalytics.ts @@ -1,5 +1,4 @@ import { useCallback } from "react"; -import { supabase } from "@/integrations/supabase/client"; import { untypedFrom } from "@/lib/supabase-untyped"; import { useAuth } from "@/contexts/AuthContext"; diff --git a/src/hooks/useProductImages.ts b/src/hooks/useProductImages.ts index 719786062..f7a16d003 100644 --- a/src/hooks/useProductImages.ts +++ b/src/hooks/useProductImages.ts @@ -14,7 +14,7 @@ */ import { useQuery } from '@tanstack/react-query'; -import { invokeExternalDb, type InvokeResult } from '@/lib/external-db'; +import { invokeExternalDb } from '@/lib/external-db'; import { logger } from "@/lib/logger"; // ============================================ diff --git a/src/hooks/useProductIntelligenceBadges.ts b/src/hooks/useProductIntelligenceBadges.ts index 54b076b28..50e334750 100644 --- a/src/hooks/useProductIntelligenceBadges.ts +++ b/src/hooks/useProductIntelligenceBadges.ts @@ -6,7 +6,7 @@ */ import { useMemo } from 'react'; import { useProductIntelligenceData, useStockVelocity } from '@/hooks/useStockHistory'; -import { generateMockIntelligence, generateMockVelocities, isRealIntelligence } from '@/lib/stock-chart-utils'; +import { generateMockIntelligence, generateMockVelocities } from '@/lib/stock-chart-utils'; export type IntelligenceBadgeType = | 'best-seller' // ABC A diff --git a/src/hooks/useProductSupplierSources.ts b/src/hooks/useProductSupplierSources.ts index 1754d14e0..96e4496b3 100644 --- a/src/hooks/useProductSupplierSources.ts +++ b/src/hooks/useProductSupplierSources.ts @@ -113,7 +113,7 @@ export function useProductSupplierSources(productId?: string) { toast.success('Fonte removida'); await fetchSources(); return true; - } catch (err: unknown) { + } catch (_err: unknown) { toast.error('Erro ao remover fonte'); return false; } diff --git a/src/hooks/useProductsLightweight.ts b/src/hooks/useProductsLightweight.ts index d1b1f24af..1b75f5e89 100644 --- a/src/hooks/useProductsLightweight.ts +++ b/src/hooks/useProductsLightweight.ts @@ -3,7 +3,7 @@ * * Loads ~10x faster than useProducts (no color/variant enrichment). */ -import { useQuery, useInfiniteQuery, keepPreviousData } from '@tanstack/react-query'; +import { useQuery, useInfiniteQuery } from '@tanstack/react-query'; import { fetchPromobrindProductsLightweight, invokeBatchBridge, type LightweightProduct } from '@/lib/external-db'; // Re-export type for consumers diff --git a/src/hooks/useQuoteBuilderState.ts b/src/hooks/useQuoteBuilderState.ts index 9765b97aa..5b694d78e 100644 --- a/src/hooks/useQuoteBuilderState.ts +++ b/src/hooks/useQuoteBuilderState.ts @@ -91,7 +91,7 @@ export function useQuoteBuilderState() { const isEditMode = Boolean(quoteId); const { user } = useAuth(); - const { createQuote, updateQuote, fetchQuote, techniques, isLoading: quotesLoading } = useQuotes(); + const { createQuote, updateQuote, fetchQuote, _techniques, isLoading: quotesLoading } = useQuotes(); const { templates } = useQuoteTemplates(); const { myLimit: maxDiscountPercent } = useSellerDiscountLimits(); const { requestApproval } = useDiscountApproval(); @@ -140,7 +140,7 @@ export function useQuoteBuilderState() { }, [clientId, items.length, paymentTerms, deliveryTime, shippingType]); // ── Route guard ── - const hasUnsavedData = useMemo(() => { + const _hasUnsavedData = useMemo(() => { return clientId !== "" || items.length > 0 || notes !== "" || internalNotes !== ""; }, [clientId, items.length, notes, internalNotes]); diff --git a/src/hooks/useQuoteFunnel.ts b/src/hooks/useQuoteFunnel.ts index a5a1411d2..1f36ffc6c 100644 --- a/src/hooks/useQuoteFunnel.ts +++ b/src/hooks/useQuoteFunnel.ts @@ -25,7 +25,7 @@ export interface QuoteFunnelData { export function useQuoteFunnel(quotes: Quote[], viewedMap: Record): QuoteFunnelData { return useMemo(() => { const total = quotes.length; - const draft = quotes.filter((q) => q.status === "draft").length; + const _draft = quotes.filter((q) => q.status === "draft").length; const sent = quotes.filter((q) => ["sent", "pending", "pending_approval"].includes(q.status as string)).length; const approved = quotes.filter((q) => q.status === "approved").length; const converted = quotes.filter((q) => q.status === "converted").length; diff --git a/src/hooks/useQuotes.ts b/src/hooks/useQuotes.ts index 7238c42ad..9848a6742 100644 --- a/src/hooks/useQuotes.ts +++ b/src/hooks/useQuotes.ts @@ -11,8 +11,7 @@ import { useSalesScope } from "@/lib/auth/visibility-scope"; import { applySellerScope } from "@/lib/auth/apply-seller-scope"; import { createClientLogger } from "@/lib/telemetry/structuredLogger"; import { toast } from "sonner"; -import type { TablesInsert } from "@/integrations/supabase/types"; -import type { Quote, QuoteItem, QuoteItemPersonalization, PersonalizationTechnique } from "./quotes/quoteTypes"; +import type { Quote, QuoteItem, PersonalizationTechnique } from "./quotes/quoteTypes"; import { calculateQuoteTotals, buildInsertPayload, diff --git a/src/hooks/useRamoAtividade.ts b/src/hooks/useRamoAtividade.ts index fce99979c..6d106ef2c 100644 --- a/src/hooks/useRamoAtividade.ts +++ b/src/hooks/useRamoAtividade.ts @@ -1,6 +1,6 @@ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { ramoAtividadeService } from '@/services/ramoAtividadeService'; -import type { RamoAtividade, RamoAtividadeGroup } from '@/types/ramo-atividade'; +import type { RamoAtividade } from '@/types/ramo-atividade'; import { toast } from 'sonner'; // ============================================================ diff --git a/src/hooks/useScroll.ts b/src/hooks/useScroll.ts index 971588e57..18d208f21 100644 --- a/src/hooks/useScroll.ts +++ b/src/hooks/useScroll.ts @@ -10,7 +10,7 @@ interface UseScrollOptions { * Retorna informações sobre o scroll atual */ export function useScroll(options: UseScrollOptions = {}) { - const { threshold = 10, throttleMs = 16 } = options; + const { threshold = 10, _throttleMs = 16 } = options; const [scrollState, setScrollState] = useState({ scrollY: 0, diff --git a/src/hooks/useSimulation.ts b/src/hooks/useSimulation.ts index 9b42ba27a..b0397845c 100644 --- a/src/hooks/useSimulation.ts +++ b/src/hooks/useSimulation.ts @@ -13,7 +13,7 @@ import { fetchPromobrindProducts, getProductPrice, getProductImageUrl } from "@/ import { useMultipleTechniquePricing } from "./useTechniquePricingOptions"; import { useSimulatorPreferences } from "./useSimulatorPreferences"; import { fetchAllOptions } from "./simulation/simulationPriceFetcher"; -import { copyOptionToClipboard, copyAllOptionsToClipboard, formatCurrency as fmtCurrency } from "./simulation/simulationClipboard"; +import { copyOptionToClipboard, copyAllOptionsToClipboard } from "./simulation/simulationClipboard"; import type { Product, Client, Technique, TechniqueSettings, SimulationOption, SavedSimulation, SimulatorStep } from "@/types/simulation"; @@ -25,7 +25,7 @@ export function useSimulation() { const { preferences, isLoaded: preferencesLoaded, - setLastQuantity, setLastProductId, setLastTechniques, setLastTechniqueSettings, setPreferredView, saveCurrentSession, + setLastQuantity, setLastProductId, setLastTechniques, setLastTechniqueSettings, setPreferredView, _saveCurrentSession, } = useSimulatorPreferences(); // Wizard state @@ -54,8 +54,8 @@ export function useSimulation() { // Wrapped setters with persistence const setSelectedProductId = useCallback((id: string | null) => { setSelectedProductIdState(id); setLastProductId(id); }, [setLastProductId]); const setQuantity = useCallback((qty: number) => { setQuantityState(qty); setLastQuantity(qty); }, [setLastQuantity]); - const setSelectedTechniques = useCallback((techniques: string[]) => { setSelectedTechniquesState(techniques); setLastTechniques(techniques); }, [setLastTechniques]); - const setTechniqueSettings = useCallback((settings: Record) => { setTechniqueSettingsState(settings); setLastTechniqueSettings(settings); }, [setLastTechniqueSettings]); + const _setSelectedTechniques = useCallback((techniques: string[]) => { setSelectedTechniquesState(techniques); setLastTechniques(techniques); }, [setLastTechniques]); + const _setTechniqueSettings = useCallback((settings: Record) => { setTechniqueSettingsState(settings); setLastTechniqueSettings(settings); }, [setLastTechniqueSettings]); // Scenarios const [scenarioA, setScenarioA] = useState(null); diff --git a/src/hooks/useSimulatorPreferences.ts b/src/hooks/useSimulatorPreferences.ts index 7e9d98797..7fcec28c2 100644 --- a/src/hooks/useSimulatorPreferences.ts +++ b/src/hooks/useSimulatorPreferences.ts @@ -37,7 +37,7 @@ const STORAGE_KEY = "simulator_preferences"; export function useSimulatorPreferences() { const { user } = useAuth(); - const queryClient = useQueryClient(); + const _queryClient = useQueryClient(); const [preferences, setPreferencesState] = useState(DEFAULT_PREFERENCES); const [isLoaded, setIsLoaded] = useState(false); diff --git a/src/hooks/useSupplierTrust.ts b/src/hooks/useSupplierTrust.ts index 4aa5e83ff..76f1cedbc 100644 --- a/src/hooks/useSupplierTrust.ts +++ b/src/hooks/useSupplierTrust.ts @@ -5,7 +5,6 @@ */ import { useQuery } from '@tanstack/react-query'; import { invokeExternalDb } from '@/lib/external-db/bridge'; -import { invokeBatchBridge } from '@/lib/external-db'; import type { SupplierTrustData } from '@/components/common/SocialProof'; import { getMockSupplierTrust } from '@/components/common/SocialProof'; import { logger } from '@/lib/logger'; diff --git a/src/hooks/useVariantStock.ts b/src/hooks/useVariantStock.ts index 0755c7ee8..e53feec64 100644 --- a/src/hooks/useVariantStock.ts +++ b/src/hooks/useVariantStock.ts @@ -244,7 +244,7 @@ export function useVariantStock() { } export function useProductVariantStock(productId: string) { - const { productStocks, alerts, isLoading, fetchStockData, allProductStocks } = useVariantStock(); + const { _productStocks, alerts, isLoading, fetchStockData, allProductStocks } = useVariantStock(); const productStock = useMemo(() => allProductStocks.find(p => p.productId === productId), [allProductStocks, productId]); const productAlerts = useMemo(() => alerts.filter(a => a.productId === productId), [alerts, productId]); diff --git a/src/hooks/useVoiceAgent.ts b/src/hooks/useVoiceAgent.ts index e0287963f..48971cb5c 100644 --- a/src/hooks/useVoiceAgent.ts +++ b/src/hooks/useVoiceAgent.ts @@ -230,7 +230,7 @@ export function useVoiceAgent({ onAction, onError }: UseVoiceAgentOptions = {}) }, [clearResetPhaseTimer, clearSessionStartTimer, scheduleIdleReset]); // === Handle Scribe errors — try fallback === - const handleScribeError = useCallback((err: unknown) => { + const handleScribeError = useCallback((_err: unknown) => { // Invalidate cached token since connection failed invalidateScribeTokenCache(); // Only log at debug level — this is expected when ElevenLabs is unavailable diff --git a/src/hooks/useWebAuthn.ts b/src/hooks/useWebAuthn.ts index cdf9a4d8a..3d5f5eb98 100644 --- a/src/hooks/useWebAuthn.ts +++ b/src/hooks/useWebAuthn.ts @@ -308,7 +308,7 @@ export function useWebAuthn() { }); return true; - } catch (error: unknown) { + } catch (_error: unknown) { toast({ variant: "destructive", title: "Erro", diff --git a/src/lib/kit-builder/price-calculator.ts b/src/lib/kit-builder/price-calculator.ts index a99643867..e30dd68c8 100644 --- a/src/lib/kit-builder/price-calculator.ts +++ b/src/lib/kit-builder/price-calculator.ts @@ -3,7 +3,7 @@ * Cálculos de preço para kits */ -import type { KitState, KitItem, KitBox, KitPersonalization } from './types'; +import type { KitItem, KitBox, KitPersonalization } from './types'; // ============================================ // CÁLCULOS DE PREÇO diff --git a/src/lib/notifications-metrics.ts b/src/lib/notifications-metrics.ts index 53358f175..e99c94f1a 100644 --- a/src/lib/notifications-metrics.ts +++ b/src/lib/notifications-metrics.ts @@ -360,7 +360,7 @@ export const notificationsMetrics = { state.triggerToFetchTtlBreaches += 1; // Always warn on breach — even with debug OFF — since this signals // a real regression of the prefetch debounce vs TTL contract. - // eslint-disable-next-line no-console + console.warn( `[notifications-metrics] trigger→fetch exceeded TTL window (${totalMs}ms >= ${TRIGGER_TO_FETCH_TTL_MS}ms)`, full diff --git a/src/lib/personalization/adapters/schema-detection.ts b/src/lib/personalization/adapters/schema-detection.ts index 769b053f7..9c135bf3f 100644 --- a/src/lib/personalization/adapters/schema-detection.ts +++ b/src/lib/personalization/adapters/schema-detection.ts @@ -135,7 +135,7 @@ export function detectPriceSchema(resp: Record | null | undefin export function warnUnknownSchemaOnce(key: string, payload?: unknown): void { if (warnedKeys.has(key)) return; warnedKeys.add(key); - // eslint-disable-next-line no-console + console.warn( `[personalization/adapters] Payload com schema desconhecido (${key}). ` + 'Verifique se o backend mudou a estrutura — adapter está caindo no fallback v6.x-flat.', diff --git a/src/lib/personalization/rpc-validator.ts b/src/lib/personalization/rpc-validator.ts index 138059a9a..ceb261eb8 100644 --- a/src/lib/personalization/rpc-validator.ts +++ b/src/lib/personalization/rpc-validator.ts @@ -25,7 +25,7 @@ const warnedKeys = new Set(); function warnOnce(key: string, msg: string, payload?: unknown): void { if (warnedKeys.has(key)) return; warnedKeys.add(key); - // eslint-disable-next-line no-console + console.warn(`[rpc-validator] ${msg}`, payload); } diff --git a/src/lib/quote-status-config.ts b/src/lib/quote-status-config.ts index 0005c1cd2..632ef1187 100644 --- a/src/lib/quote-status-config.ts +++ b/src/lib/quote-status-config.ts @@ -3,7 +3,6 @@ * Fonte única de verdade para labels, cores e estilos de cada status. */ -import type { QuoteStatus } from "@/types/quote"; export interface QuoteStatusConfig { label: string; diff --git a/src/pages/AdvancedPriceSearchPage.tsx b/src/pages/AdvancedPriceSearchPage.tsx index a82c26b4c..9f40477d6 100644 --- a/src/pages/AdvancedPriceSearchPage.tsx +++ b/src/pages/AdvancedPriceSearchPage.tsx @@ -23,7 +23,6 @@ import { PageSEO } from '@/components/seo/PageSEO'; import { useAdvancedPriceSearch } from './advanced-price-search/useAdvancedPriceSearch'; import { ProductCardResult, ProductTableResult, ProductListResult } from './advanced-price-search/ResultViews'; import { formatCurrency, QUANTITY_OPTIONS } from './advanced-price-search/types'; -import type { SearchFilters } from './advanced-price-search/types'; function FilterSection({ title, icon: Icon, children }: { title: string; icon: React.ElementType; children: React.ReactNode }) { return ( diff --git a/src/pages/Auth.tsx b/src/pages/Auth.tsx index c4e95275a..f6f949a74 100644 --- a/src/pages/Auth.tsx +++ b/src/pages/Auth.tsx @@ -28,7 +28,7 @@ export default function Auth() { const navigate = useNavigate(); const { toast } = useToast(); const { user, isLoading: authLoading, signIn, signOut } = useAuth(); - const { validateIPForAuthenticatedUser, logLoginAttempt, fetchCurrentIP } = useIPValidation(); + const { validateIPForAuthenticatedUser, logLoginAttempt, _fetchCurrentIP } = useIPValidation(); const [showPassword, setShowPassword] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [showForgotPassword, setShowForgotPassword] = useState(false); @@ -320,7 +320,7 @@ export default function Auth() { { + onSuccess={async (_userId) => { toast({ title: "Autenticação biométrica", description: "Autenticado com sucesso via passkey!", diff --git a/src/pages/BusinessIntelligencePage.tsx b/src/pages/BusinessIntelligencePage.tsx index 91016a266..4153dd75b 100644 --- a/src/pages/BusinessIntelligencePage.tsx +++ b/src/pages/BusinessIntelligencePage.tsx @@ -7,7 +7,6 @@ import { useSearchParams, useNavigate } from "react-router-dom"; import { MainLayout } from "@/components/layout/MainLayout"; import { PageSEO } from "@/components/seo/PageSEO"; import { Brain, Building2, MapPin, Tag, FileText, Info, Sparkles, MessageSquare, Bot, GitCompare, HelpCircle, X } from "lucide-react"; -import { toast } from "sonner"; import { BICategoryFocusProvider, useBICategoryFocus } from "@/contexts/BICategoryFocusContext"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; diff --git a/src/pages/CollectionDetailPage.tsx b/src/pages/CollectionDetailPage.tsx index aa42e4096..91f525783 100644 --- a/src/pages/CollectionDetailPage.tsx +++ b/src/pages/CollectionDetailPage.tsx @@ -1,7 +1,7 @@ import { useMemo, useState, useCallback } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { - Package, Trash2, Search, TrendingDown, Share2, + Package, Trash2, Search, TrendingDown, _Share2, FileText, ArrowUpDown, ArrowRight, CheckSquare, Settings2, } from "lucide-react"; import { motion } from "framer-motion"; @@ -20,7 +20,6 @@ import { getDefaultColumns, type ColumnCount } from "@/components/products/Colum import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Skeleton } from "@/components/ui/skeleton"; -import { Badge } from "@/components/ui/badge"; import { BulkSelectionBar } from "@/components/common/BulkSelectionBar"; import { CollectionDetailHeader } from "@/components/collections/CollectionDetailHeader"; import { SortableProductItem } from "@/components/collections/SortableProductItem"; diff --git a/src/pages/ComparePage.tsx b/src/pages/ComparePage.tsx index 8733ac4c5..8fe0f3b33 100644 --- a/src/pages/ComparePage.tsx +++ b/src/pages/ComparePage.tsx @@ -16,7 +16,7 @@ import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; -import { GitCompare, X, ArrowLeft, Share2, Image as ImageIcon, List, Filter, FileText, Building2, Swords } from "lucide-react"; +import { X, ArrowLeft, Share2, Image as ImageIcon, List, Filter, FileText, Building2, Swords } from "lucide-react"; import { cn } from "@/lib/utils"; import { SyncedZoomGallery } from "@/components/compare/SyncedZoomGallery"; import { CompareTableView } from "@/components/compare/CompareTableView"; diff --git a/src/pages/CustomizableDashboard.tsx b/src/pages/CustomizableDashboard.tsx index 759292e0f..1cd5c8c89 100644 --- a/src/pages/CustomizableDashboard.tsx +++ b/src/pages/CustomizableDashboard.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useCallback } from 'react'; import { DndContext, type DragEndEvent, closestCenter, PointerSensor, useSensor, useSensors } from '@dnd-kit/core'; import { SortableContext, arrayMove, rectSortingStrategy, useSortable } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; -import { GripVertical, LayoutDashboard, TrendingUp, Users, ShoppingCart, Package, FileText, Target, Eye, EyeOff, RotateCcw, Save } from 'lucide-react'; +import { GripVertical, LayoutDashboard, ShoppingCart, FileText, Target, RotateCcw, Save } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Switch } from '@/components/ui/switch'; @@ -46,7 +46,7 @@ const DEFAULT_WIDGETS: WidgetConfig[] = [ const LAYOUT_KEY = 'dashboard_layout'; -function SortableWidget({ id, children, title }: { id: string; children: React.ReactNode; title: string }) { +function SortableWidget({ id, children, _title }: { id: string; children: React.ReactNode; title: string }) { const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id }); const style = { diff --git a/src/pages/DropboxBrowserPage.tsx b/src/pages/DropboxBrowserPage.tsx index 0eaf5b722..dadd500f2 100644 --- a/src/pages/DropboxBrowserPage.tsx +++ b/src/pages/DropboxBrowserPage.tsx @@ -1,5 +1,5 @@ -import { useState, useEffect } from "react"; -import { useDropboxFiles, DropboxEntry } from "@/hooks/useDropboxFiles"; +import { useEffect } from "react"; +import { useDropboxFiles } from "@/hooks/useDropboxFiles"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; diff --git a/src/pages/KitBuilderPage.tsx b/src/pages/KitBuilderPage.tsx index b2f282477..979db61d3 100644 --- a/src/pages/KitBuilderPage.tsx +++ b/src/pages/KitBuilderPage.tsx @@ -62,7 +62,7 @@ const KitIsometricPreview = lazy(() => import('@/components/kit-builder/KitIsome const KitPersonalizationPreview = lazy(() => import('@/components/kit-builder/KitPersonalizationPreview').then(m => ({ default: m.KitPersonalizationPreview }))); export default function KitBuilderPage() { - const { user } = useAuth(); + const { _user } = useAuth(); const navigate = useNavigate(); const [searchParams] = useSearchParams(); const kitIdParam = searchParams.get('kit'); diff --git a/src/pages/KitLibraryPage.tsx b/src/pages/KitLibraryPage.tsx index 7d2af0022..a353a86a3 100644 --- a/src/pages/KitLibraryPage.tsx +++ b/src/pages/KitLibraryPage.tsx @@ -6,14 +6,13 @@ import { useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; -import { Plus, Search, Library, Sparkles, Star, Pin, PinOff, BarChart3 } from 'lucide-react'; +import { Plus, Search, Library, Sparkles, Star, Pin } from 'lucide-react'; import { supabase } from '@/integrations/supabase/client'; import { useAuth } from '@/contexts/AuthContext'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Card, CardContent } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; -import { Badge } from '@/components/ui/badge'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, diff --git a/src/pages/MockupHistoryPage.tsx b/src/pages/MockupHistoryPage.tsx index cb99452f2..8e0b105e4 100644 --- a/src/pages/MockupHistoryPage.tsx +++ b/src/pages/MockupHistoryPage.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from "react"; +import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { supabase } from "@/integrations/supabase/client"; import { useAuth } from "@/contexts/AuthContext"; diff --git a/src/pages/OrderDetailPage.tsx b/src/pages/OrderDetailPage.tsx index b8f1d27ac..e17e7d12a 100644 --- a/src/pages/OrderDetailPage.tsx +++ b/src/pages/OrderDetailPage.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { format } from "date-fns"; import { ptBR } from "date-fns/locale"; -import { ArrowLeft, Building2, Mail, Package, Phone, Truck, User, CreditCard, Clock, MapPin, FileText } from "lucide-react"; +import { ArrowLeft, Building2, Mail, Package, Phone, User, CreditCard, Clock, FileText } from "lucide-react"; import { supabase } from "@/integrations/supabase/client"; import { MainLayout } from "@/components/layout/MainLayout"; import { PageSEO } from "@/components/seo/PageSEO"; @@ -12,7 +12,6 @@ import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { Skeleton } from "@/components/ui/skeleton"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; -import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { toast } from "sonner"; import { useAuth } from "@/contexts/AuthContext"; @@ -95,7 +94,7 @@ export default function OrderDetailPage() { setIsSaving(false); }; - const updateTracking = async () => { + const _updateTracking = async () => { setIsSaving(true); const { error } = await supabase // rls-allow: lookup por id; RLS valida ownership diff --git a/src/pages/PersonalizationSimulator.tsx b/src/pages/PersonalizationSimulator.tsx index b1698a61f..347567b8e 100644 --- a/src/pages/PersonalizationSimulator.tsx +++ b/src/pages/PersonalizationSimulator.tsx @@ -6,7 +6,6 @@ import { useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; -import { Button } from "@/components/ui/button"; import { Calculator } from "lucide-react"; import { PageSEO } from "@/components/seo/PageSEO"; diff --git a/src/pages/PriceSimulatorPage.tsx b/src/pages/PriceSimulatorPage.tsx index 0990c8158..43750af46 100644 --- a/src/pages/PriceSimulatorPage.tsx +++ b/src/pages/PriceSimulatorPage.tsx @@ -4,7 +4,7 @@ import { ProductPriceSimulator } from '@/components/pricing/ProductPriceSimulato import { QuantityPriceCalculator } from '@/components/pricing/QuantityPriceCalculator'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { - Calculator, + _Calculator, Package, BarChart3, } from 'lucide-react'; diff --git a/src/pages/ProductDetail.tsx b/src/pages/ProductDetail.tsx index 30e84f381..dd3061684 100644 --- a/src/pages/ProductDetail.tsx +++ b/src/pages/ProductDetail.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useMemo, useCallback } from "react"; +import { useState, useEffect, useMemo } from "react"; import { useParams, useNavigate, useSearchParams } from "react-router-dom"; import { Helmet } from "react-helmet-async"; import { getCdnUrl } from "@/utils/image-utils"; @@ -8,7 +8,6 @@ import { SimilarProducts } from "@/components/products/SimilarProducts"; import { SmartRecommendations } from "@/components/products/SmartRecommendations"; import { useSimilarProducts } from "@/hooks/useSimilarProducts"; import type { ProductForRecommendation } from "@/hooks/useAIRecommendations"; -import { ProductIntelligence } from "@/components/products/ProductIntelligence"; import { StockHistoryChart } from "@/components/products/StockHistoryChart"; import { SalesHistoryChart } from "@/components/products/SalesHistoryChart"; import { SupplierComparisonModal } from "@/components/compare/SupplierComparisonModal"; diff --git a/src/pages/PublicFavoriteListPage.tsx b/src/pages/PublicFavoriteListPage.tsx index 072bedc2f..80332a274 100644 --- a/src/pages/PublicFavoriteListPage.tsx +++ b/src/pages/PublicFavoriteListPage.tsx @@ -2,7 +2,7 @@ * PublicFavoriteListPage — Visualização pública (sem login) de uma lista de favoritos * compartilhada via shared_token. Cliente reage com 👍 ❤️ 🔥 💡 por item. */ -import { useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo } from "react"; import { useParams } from "react-router-dom"; import { Heart, Lock, ExternalLink } from "lucide-react"; import { supabase } from "@/integrations/supabase/client"; diff --git a/src/pages/PublicKitViewPage.tsx b/src/pages/PublicKitViewPage.tsx index 6adbf970e..b12c6c5de 100644 --- a/src/pages/PublicKitViewPage.tsx +++ b/src/pages/PublicKitViewPage.tsx @@ -6,17 +6,7 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; -import { - Package, - Loader2, - AlertTriangle, - User, - Phone, - Mail, - Box, - Layers, - Palette, -} from "lucide-react"; +import { Package, Loader2, AlertTriangle, User, Phone, Mail, Box, Layers } from "lucide-react"; import { PageSEO } from "@/components/seo/PageSEO"; interface KitPublicData { diff --git a/src/pages/QuoteBuilderPage.tsx b/src/pages/QuoteBuilderPage.tsx index 8e37db7a7..0818a6b9a 100644 --- a/src/pages/QuoteBuilderPage.tsx +++ b/src/pages/QuoteBuilderPage.tsx @@ -3,7 +3,6 @@ * Refatorado: lógica em useQuoteBuilderState, UI em sub-componentes. */ -import { useMemo } from "react"; import { MainLayout } from "@/components/layout/MainLayout"; import { PageSEO } from "@/components/seo/PageSEO"; import { cn } from "@/lib/utils"; @@ -16,10 +15,7 @@ import { Badge } from "@/components/ui/badge"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Calendar } from "@/components/ui/calendar"; -import { - FileText, Plus, Save, Send, Package, Loader2, BookTemplate, ArrowLeft, - Edit, AlertTriangle, Calendar as CalendarIcon, -} from "lucide-react"; +import { FileText, Plus, Save, Package, Loader2, BookTemplate, ArrowLeft, Edit, AlertTriangle, Calendar as CalendarIcon } from "lucide-react"; import { toast } from "sonner"; import { AIRecommendationsPanel } from "@/components/quotes/AIRecommendationsPanel"; import { format, addDays } from "date-fns"; diff --git a/src/pages/QuotesDashboardPage.tsx b/src/pages/QuotesDashboardPage.tsx index 76a9b5692..c384be024 100644 --- a/src/pages/QuotesDashboardPage.tsx +++ b/src/pages/QuotesDashboardPage.tsx @@ -1,4 +1,3 @@ -import { useState, useMemo, useEffect, useRef } from "react"; import { useNavigate } from "react-router-dom"; import { MainLayout } from "@/components/layout/MainLayout"; import { PageSEO } from "@/components/seo/PageSEO"; diff --git a/src/pages/SellerCartsPage.tsx b/src/pages/SellerCartsPage.tsx index b0a9d05db..76143abc4 100644 --- a/src/pages/SellerCartsPage.tsx +++ b/src/pages/SellerCartsPage.tsx @@ -28,7 +28,7 @@ import { DeleteConfirmDialog, ConfirmDialog } from "@/components/ui/ConfirmDialo import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; -import { motion, AnimatePresence } from "framer-motion"; +import { AnimatePresence } from "framer-motion"; import { DndContext, closestCenter } from "@dnd-kit/core"; import { SortableContext, rectSortingStrategy } from "@dnd-kit/sortable"; import { cn } from "@/lib/utils"; diff --git a/src/pages/SimuladorWizard.tsx b/src/pages/SimuladorWizard.tsx index c6a4be5c1..1588670a3 100644 --- a/src/pages/SimuladorWizard.tsx +++ b/src/pages/SimuladorWizard.tsx @@ -36,7 +36,7 @@ import { DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, - DropdownMenuSeparator, + _DropdownMenuSeparator, } from "@/components/ui/dropdown-menu"; import { Calculator, Save, FolderOpen, Trash2, Loader2, Clock } from "lucide-react"; import { motion } from "framer-motion"; diff --git a/src/pages/TrendsPage.tsx b/src/pages/TrendsPage.tsx index b370ffa90..47514f3e3 100644 --- a/src/pages/TrendsPage.tsx +++ b/src/pages/TrendsPage.tsx @@ -1,11 +1,11 @@ -import { useMemo, useState } from "react"; +import { useMemo } from "react"; import { useQuery } from "@tanstack/react-query"; import { MainLayout } from "@/components/layout/MainLayout"; import { untypedFrom } from "@/lib/supabase-untyped"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; -import { TrendingUp, Search, Package, Calendar, RefreshCw, Download, Layers } from "lucide-react"; +import { TrendingUp, Search, Package, Calendar, RefreshCw, Download } from "lucide-react"; import { format, subDays } from "date-fns"; import { ptBR } from "date-fns/locale"; import { PageSEO } from "@/components/seo/PageSEO"; diff --git a/src/pages/admin/AdminProductFormPage.tsx b/src/pages/admin/AdminProductFormPage.tsx index 85b65b85d..93ae25ca6 100644 --- a/src/pages/admin/AdminProductFormPage.tsx +++ b/src/pages/admin/AdminProductFormPage.tsx @@ -6,13 +6,13 @@ import { useState, useEffect, useCallback, Suspense } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { MainLayout } from '@/components/layout/MainLayout'; -import { invokeExternalDbSingle, invokeExternalDbDelete, fetchPromobrindProductById, getProductImageUrl, getProductPrice, getProductStock } from '@/lib/external-db'; +import { invokeExternalDbSingle, fetchPromobrindProductById, getProductImageUrl, getProductPrice, getProductStock } from '@/lib/external-db'; import { useAuditLog } from '@/hooks/useAuditLog'; import { toast } from 'sonner'; -import { type ProductFormData, defaultFormValues } from '@/components/admin/products/ProductFormSchema'; +import { type ProductFormData } from '@/components/admin/products/ProductFormSchema'; import { Loader2, ArrowLeft, History, Pencil, Copy, FileDown } from 'lucide-react'; import { Button } from '@/components/ui/button'; -import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { lazyWithRetry } from '@/lib/lazyWithRetry'; import { PageSEO } from "@/components/seo/PageSEO"; diff --git a/src/pages/admin/AdminTemasPage.tsx b/src/pages/admin/AdminTemasPage.tsx index fd496705a..5c9407908 100644 --- a/src/pages/admin/AdminTemasPage.tsx +++ b/src/pages/admin/AdminTemasPage.tsx @@ -83,7 +83,7 @@ export default function AdminTemasPage() { toast.success('Tema restaurado ao padrão'); }; - const handleImport = (imported: ThemeConfig) => { + const _handleImport = (imported: ThemeConfig) => { setConfig(imported); saveThemeConfig(imported); setSavedConfig(imported); diff --git a/src/pages/product-match/MatchCards.tsx b/src/pages/product-match/MatchCards.tsx index 7ee61c488..3a68fb0d5 100644 --- a/src/pages/product-match/MatchCards.tsx +++ b/src/pages/product-match/MatchCards.tsx @@ -10,7 +10,7 @@ import { type MatchResult } from '@/hooks/useProductMatch'; import { cn } from '@/lib/utils'; import { getCdnUrl } from '@/utils/image-utils'; import { - ExternalLink, Users, Tag, Target, Layers, Equal, Link2, FileText, + ExternalLink, Users, Tag, _Target, Layers, Equal, Link2, FileText, } from 'lucide-react'; function formatPrice(value: number) { diff --git a/src/pages/public-approval/PublicQuoteItems.tsx b/src/pages/public-approval/PublicQuoteItems.tsx index fb50d7d23..c97669e1b 100644 --- a/src/pages/public-approval/PublicQuoteItems.tsx +++ b/src/pages/public-approval/PublicQuoteItems.tsx @@ -4,7 +4,7 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; -import { Package, DollarSign, Truck, Palette, Sparkles } from "lucide-react"; +import { Package, Truck, Palette, Sparkles } from "lucide-react"; const SHIPPING_LABELS: Record = { cif: "CIF (incluso)", diff --git a/src/pages/seller-carts/useSellerCartsPage.ts b/src/pages/seller-carts/useSellerCartsPage.ts index f1e9ebe77..c6984cfaf 100644 --- a/src/pages/seller-carts/useSellerCartsPage.ts +++ b/src/pages/seller-carts/useSellerCartsPage.ts @@ -5,7 +5,7 @@ import { useState, useCallback, useMemo, useRef, useEffect, useContext } from "react"; import { useNavigate, useParams, useLocation } from "react-router-dom"; import { useSellerCartContext } from "@/contexts/SellerCartContext"; -import { type SellerCart, CartStatus } from "@/hooks/useSellerCarts"; +import { type SellerCart } from "@/hooks/useSellerCarts"; import { useCartTemplates, type CartTemplateItem } from "@/hooks/useCartTemplates"; import { ProductsContext } from "@/contexts/ProductsContext"; import { diff --git a/src/types/jspdf-autotable.d.ts b/src/types/jspdf-autotable.d.ts index 039ed961c..ec5123139 100644 --- a/src/types/jspdf-autotable.d.ts +++ b/src/types/jspdf-autotable.d.ts @@ -2,7 +2,6 @@ * Type declarations for jspdf-autotable plugin. * Eliminates doc.lastAutoTable pattern. */ -import { jsPDF } from "jspdf"; declare module "jspdf" { interface jsPDF { diff --git a/src/utils/excelExport.ts b/src/utils/excelExport.ts index dfc1b889b..38bf4e1db 100644 --- a/src/utils/excelExport.ts +++ b/src/utils/excelExport.ts @@ -1,6 +1,6 @@ // src/utils/excelExport.ts -import { formatDate, formatDateTime } from '@/lib/date-utils'; +import { formatDateTime } from '@/lib/date-utils'; const getXLSX = () => import('@e965/xlsx'); diff --git a/src/utils/kitPdfGenerator.ts b/src/utils/kitPdfGenerator.ts index 47bd8984b..a5b53ad02 100644 --- a/src/utils/kitPdfGenerator.ts +++ b/src/utils/kitPdfGenerator.ts @@ -8,7 +8,7 @@ import jsPDF from 'jspdf'; import autoTable from 'jspdf-autotable'; import { type KitState, - type KitPersonalization, + type _KitPersonalization, formatCurrency, formatVolume, formatDimensions, @@ -28,9 +28,9 @@ interface KitPdfOptions { const PRIMARY = [30, 64, 175] as const; // blue-700 const GRAY_800 = [31, 41, 55] as const; const GRAY_500 = [107, 114, 128] as const; -const GRAY_200 = [229, 231, 235] as const; +const _GRAY_200 = [229, 231, 235] as const; const WHITE = [255, 255, 255] as const; -const GREEN = [16, 185, 129] as const; +const _GREEN = [16, 185, 129] as const; function hexToRgb(hex?: string): readonly [number, number, number] | null { if (!hex) return null; diff --git a/src/utils/productPdfExport.ts b/src/utils/productPdfExport.ts index d5a7e9cea..ec980bc82 100644 --- a/src/utils/productPdfExport.ts +++ b/src/utils/productPdfExport.ts @@ -24,7 +24,7 @@ const formatBool = (value: boolean | undefined) => (value ? 'Sim' : 'Não'); const nonEmpty = (value: string | null | undefined) => value?.trim() || '—'; -export async function exportProductPdf({ formData, productImages, categoryName, supplierName }: ProductPdfOptions) { +export async function exportProductPdf({ formData, _productImages, categoryName, supplierName }: ProductPdfOptions) { const [jsPDF, autoTable] = await Promise.all([getJsPDF(), getAutoTable()]); const doc = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' }); const pageWidth = doc.internal.pageSize.getWidth(); diff --git a/src/utils/proposalPdfReactGenerator.ts b/src/utils/proposalPdfReactGenerator.ts index 43841858d..e2b48bad8 100644 --- a/src/utils/proposalPdfReactGenerator.ts +++ b/src/utils/proposalPdfReactGenerator.ts @@ -11,7 +11,6 @@ import React from "react"; import ReactDOM from "react-dom/client"; import { type ProposalTemplateData } from "@/components/pdf/ProposalHtmlTemplate"; import { PropostaComercialTailwind } from "@/components/pdf/PropostaComercialTailwind"; -import { processLogoTransparent } from "@/components/pdf/proposal/LogoWithTransparentBg"; export async function generateProposalPDFv2(data: ProposalTemplateData, options?: { isDraft?: boolean }): Promise {