Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/components/admin/ImageUploadButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ export function ImageUploadButton({
let retryCount = 0;
const maxRetries = 3;
let uploadSuccess = false;
let lastError: any = null;
let lastError: unknown = null;

while (retryCount < maxRetries && !uploadSuccess) {
try {
Expand All @@ -77,7 +77,7 @@ export function ImageUploadButton({
onUpload(data.url);
toast.success("Imagem enviada com segurança!");
uploadSuccess = true;
} catch (error: any) {
} catch (error: unknown) {
lastError = error;

// Se for bloqueio de segurança (403), interrompe as tentativas
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ interface GroupComponentCardProps {
locations: GroupLocation[];
techniques: Technique[] | undefined;
locationTechniques: GroupLocationTechnique[];
onUpdateComponent: (data: { id: string; [key: string]: any }) => void;
onUpdateComponent: (data: { id: string; [key: string]: unknown }) => void;
onDeleteComponent: (id: string) => void;
onAddLocation: (data: { group_component_id: string; location_code: string; location_name: string; max_width_cm?: number; max_height_cm?: number; max_area_cm2?: number }) => void;
addLocationPending: boolean;
onUpdateLocation: (data: { id: string; [key: string]: any }) => void;
onUpdateLocation: (data: { id: string; [key: string]: unknown }) => void;
onDeleteLocation: (id: string) => void;
onAddTechnique: (data: { group_location_id: string; technique_id: string; max_colors?: number }) => void;
addTechniquePending: boolean;
onUpdateTechnique: (data: { id: string; [key: string]: any }) => void;
onUpdateTechnique: (data: { id: string; [key: string]: unknown }) => void;
onDeleteTechnique: (id: string) => void;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ interface GroupLocationCardProps {
selectedGroup: string | null;
techniques: Technique[] | undefined;
locationTechniques: GroupLocationTechnique[];
onUpdateLocation: (data: { id: string; [key: string]: any }) => void;
onUpdateLocation: (data: { id: string; [key: string]: unknown }) => void;
onDeleteLocation: (id: string) => void;
onAddTechnique: (data: { group_location_id: string; technique_id: string; max_colors?: number }) => void;
addTechniquePending: boolean;
onUpdateTechnique: (data: { id: string; [key: string]: any }) => void;
onUpdateTechnique: (data: { id: string; [key: string]: unknown }) => void;
onDeleteTechnique: (id: string) => void;
}

Expand Down
6 changes: 3 additions & 3 deletions src/components/admin/hooks/useGroupPersonalization.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ export function useGroupPersonalization() {
});

const updateComponent = useMutation({
mutationFn: async ({ id, ...data }: { id: string; [key: string]: any }) => {
mutationFn: async ({ id, ...data }: { id: string; [key: string]: unknown }) => {
const { error } = await untypedFrom("product_group_components").update(data).eq("id", id);
if (error) throw error;
},
Expand Down Expand Up @@ -192,7 +192,7 @@ export function useGroupPersonalization() {
});

const updateLocation = useMutation({
mutationFn: async ({ id, ...data }: { id: string; [key: string]: any }) => {
mutationFn: async ({ id, ...data }: { id: string; [key: string]: unknown }) => {
const { error } = await untypedFrom("product_group_locations").update(data).eq("id", id);
if (error) throw error;
},
Expand Down Expand Up @@ -228,7 +228,7 @@ export function useGroupPersonalization() {
});

const updateTechnique = useMutation({
mutationFn: async ({ id, ...data }: { id: string; [key: string]: any }) => {
mutationFn: async ({ id, ...data }: { id: string; [key: string]: unknown }) => {
const { error } = await untypedFrom("product_group_location_techniques").update(data).eq("id", id);
if (error) throw error;
},
Expand Down
6 changes: 3 additions & 3 deletions src/components/admin/products/BulkImportDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ interface BulkImportDialogProps {

export function BulkImportDialog({ open, onOpenChange, onComplete }: BulkImportDialogProps) {
const [step, setStep] = useState<Step>('upload');
const [rawData, setRawData] = useState<Record<string, any>[]>([]);
const [rawData, setRawData] = useState<Record<string, unknown>[]>([]);
const [headers, setHeaders] = useState<string[]>([]);
const [fileName, setFileName] = useState('');
const [mapping, setMapping] = useState<ColumnMapping>({});
Expand All @@ -52,7 +52,7 @@ export function BulkImportDialog({ open, onOpenChange, onComplete }: BulkImportD
}, []);

// ── Upload complete handler ──
const handleFileProcessed = useCallback((h: string[], rows: Record<string, any>[], name: string, m: ColumnMapping) => {
const handleFileProcessed = useCallback((h: string[], rows: Record<string, unknown>[], name: string, m: ColumnMapping) => {
setHeaders(h);
setRawData(rows);
setFileName(name);
Expand All @@ -71,7 +71,7 @@ export function BulkImportDialog({ open, onOpenChange, onComplete }: BulkImportD
const row = rawData[i];
const errors: string[] = [];
const warnings: string[] = [];
const mapped: Record<string, any> = {};
const mapped: Record<string, unknown> = {};

for (const [sourceCol, targetField] of Object.entries(mapping)) {
if (targetField) mapped[targetField] = row[sourceCol];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ interface StepCompleteProps {
importMode: string;
invalidCount: number;
validationResults: ValidationResult[];
rawData: Record<string, any>[];
rawData: Record<string, unknown>[];
onReset: () => void;
onClose: () => void;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { TARGET_FIELDS, type ColumnMapping, type TargetFieldKey } from './types'

interface StepMappingProps {
headers: string[];
rawData: Record<string, any>[];
rawData: Record<string, unknown>[];
mapping: ColumnMapping;
setMapping: (fn: (prev: ColumnMapping) => ColumnMapping) => void;
requiredMapped: boolean;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import type { ValidationResult, ColumnMapping } from './types';

interface StepPreviewProps {
validationResults: ValidationResult[];
rawData: Record<string, any>[];
rawData: Record<string, unknown>[];
mapping: ColumnMapping;
importMode: ImportMode;
setImportMode: (mode: ImportMode) => void;
Expand Down
6 changes: 3 additions & 3 deletions src/components/admin/products/bulk-import/StepUpload.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { toast } from 'sonner';
import { MAX_ROWS, TARGET_FIELDS, TEMPLATE_EXAMPLES, ALIAS_MAP, type ColumnMapping } from './types';

interface StepUploadProps {
onFileProcessed: (headers: string[], rows: Record<string, any>[], fileName: string, mapping: ColumnMapping) => void;
onFileProcessed: (headers: string[], rows: Record<string, unknown>[], fileName: string, mapping: ColumnMapping) => void;
}

const normalizeStr = (s: string) => s.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[^a-z0-9]/g, '');
Expand Down Expand Up @@ -56,7 +56,7 @@ export function StepUpload({ onFileProcessed }: StepUploadProps) {
const ext = file.name.split('.').pop()?.toLowerCase();
try {
let parsedHeaders: string[] = [];
let parsedRows: Record<string, any>[] = [];
let parsedRows: Record<string, unknown>[] = [];

if (ext === 'csv') {
const text = await file.text();
Expand All @@ -68,7 +68,7 @@ export function StepUpload({ onFileProcessed }: StepUploadProps) {
const buffer = await file.arrayBuffer();
const wb = XLSX.read(buffer, { type: 'array' });
const sheet = wb.Sheets[wb.SheetNames[0]];
const json = XLSX.utils.sheet_to_json<Record<string, any>>(sheet, { defval: '' });
const json = XLSX.utils.sheet_to_json<Record<string, unknown>>(sheet, { defval: '' });
if (json.length === 0) { toast.error('Planilha vazia'); return; }
parsedHeaders = Object.keys(json[0]);
parsedRows = json;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export function useProductFormDraft(
keys.forEach((key) => {
const val = draft.formData[key];
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if (val !== undefined) setValue(key, val as any);
if (val !== undefined) setValue(key, val as unknown);
});
if (draft.images?.length) setImages(draft.images);
if (typeof draft.stepIndex === 'number') setStepIndex(draft.stepIndex);
Expand Down
2 changes: 1 addition & 1 deletion src/components/admin/products/hooks/useSkuValidation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export function useSkuValidation(currentSku: string, isEdit: boolean, originalSk
const { fetchPromobrindProducts } = await import('@/lib/external-db');
const existing = await fetchPromobrindProducts({ search: currentSku, limit: 5 });
const products = Array.isArray(existing) ? existing : (existing as Record<string, unknown>).products || [];
const dup = products.find((p: any) => p.sku?.toLowerCase() === currentSku.toLowerCase());
const dup = products.find((p: unknown) => p.sku?.toLowerCase() === currentSku.toLowerCase());
if (dup) { setStatus('duplicate'); setDuplicateName(dup.name || ''); }
else { setStatus('valid'); setDuplicateName(''); }
} catch { setStatus('idle'); }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { maskCep, ESTADOS_BR } from '@/utils/masks';
const fieldClass = "mt-1.5 h-9";

interface AddressTabProps {
form: Record<string, any>;
form: Record<string, unknown>;
}

export function AddressTab({ form }: AddressTabProps) {
Expand Down Expand Up @@ -75,7 +75,7 @@ export function AddressTab({ form }: AddressTabProps) {
{form.searchingCarriers && <Loader2 className="absolute right-3 top-1/2 -translate-y-1/2 h-3.5 w-3.5 animate-spin text-muted-foreground" />}
{form.showCarrierDropdown && form.carrierResults.length > 0 && (
<div className="absolute z-50 w-full mt-1 max-h-48 overflow-y-auto rounded-md border bg-popover shadow-lg">
{form.carrierResults.map((c: any) => (
{form.carrierResults.map((c: unknown) => (
<button key={c.id} type="button" className="w-full text-left px-3 py-2 text-sm hover:bg-accent/50 transition-colors" onMouseDown={(e) => { e.preventDefault(); form.setTransportadoraPadrao(c.nome_fantasia || c.razao_social); form.setTransportadoraId(c.id); form.setCarrierSearch(''); form.setShowCarrierDropdown(false); }}>
<span className="font-medium">{c.nome_fantasia || c.razao_social}</span>
{c.nome_fantasia && c.razao_social && <span className="text-xs text-muted-foreground ml-2">({c.razao_social})</span>}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { maskCnpj, maskPhone, ESTADOS_BR } from '@/utils/masks';
const fieldClass = "mt-1.5 h-9";

interface BasicDataTabProps {
form: Record<string, any>;
form: Record<string, unknown>;
}

export function BasicDataTab({ form }: BasicDataTabProps) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export function useProductVideoGallery(productId?: string) {
});
if (error) return [];
const records = data?.data?.records || [];
return records.map((r: any) => ({
return records.map((r: unknown) => ({
id: String(r.id),
name: String(r.name ?? r.color_name ?? 'Variação'),
color_name: r.color_name ?? null,
Expand Down Expand Up @@ -323,7 +323,7 @@ export function useProductVideoGallery(productId?: string) {
});
queryClient.invalidateQueries({ queryKey: ['product-videos-ext', productId] });
toast.success('Thumbnail regenerada!');
} catch (err: any) { toast.error('Erro ao regenerar thumbnail: ' + (err.message || 'desconhecido')); } finally { setRegeneratingId(null); }
} catch (err: unknown) { toast.error('Erro ao regenerar thumbnail: ' + (err.message || 'desconhecido')); } finally { setRegeneratingId(null); }
}, [productId, queryClient]);

const bulkRegenerateThumbnails = useCallback(async () => {
Expand Down
6 changes: 3 additions & 3 deletions src/components/admin/security/SecureUploadManager.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import { format } from "date-fns";
import { ptBR } from "date-fns/locale";

export function SecureUploadManager() {
const [logs, setLogs] = useState<any[]>([]);
const [logs, setLogs] = useState<unknown[]>([]);
const [isLoading, setIsLoading] = useState(true);
const [isUploading, setIsUploading] = useState(false);
const [searchTerm, setSearchTerm] = useState("");
Expand All @@ -39,7 +39,7 @@ export function SecureUploadManager() {

if (error) throw error;
setLogs(data || []);
} catch (error: any) {
} catch (error: unknown) {
console.error("Error fetching logs:", error);
toast.error("Erro ao carregar logs de auditoria");
} finally {
Expand Down Expand Up @@ -76,7 +76,7 @@ export function SecureUploadManager() {

toast.success("Upload realizado com sucesso e verificado!");
fetchLogs();
} catch (error: any) {
} catch (error: unknown) {
console.error("Test upload error:", error);
toast.error("Erro ao realizar upload de teste");
} finally {
Expand Down
8 changes: 4 additions & 4 deletions src/components/admin/users/useUserManagement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ export function useUserManagement() {
toast.success("Usuário criado com sucesso");
await fetchUsers();
return true;
} catch (error: any) {
} catch (error: unknown) {
const msg = error.message || "";
if (msg.toLowerCase().includes("already been registered") || msg.toLowerCase().includes("already exists")) {
toast.error("Este e-mail já está cadastrado", { description: "Já existe um usuário com este e-mail no sistema." });
Expand All @@ -105,7 +105,7 @@ export function useUserManagement() {
toast.success("Usuário excluído com sucesso");
setUsers((prev) => prev.filter((u) => u.user_id !== userId));
return true;
} catch (error: any) {
} catch (error: unknown) {
console.error("Error deleting user:", error);
toast.error("Erro ao excluir usuário", { description: error.message });
return false;
Expand All @@ -130,7 +130,7 @@ export function useUserManagement() {
);
toast.success("Usuário atualizado com sucesso");
return true;
} catch (error: any) {
} catch (error: unknown) {
console.error("Error updating user:", error);
toast.error("Erro ao atualizar usuário", { description: error.message });
return false;
Expand All @@ -153,7 +153,7 @@ export function useUserManagement() {
setUsers((prev) => prev.map((u) => u.user_id === userId ? { ...u, avatar_url: publicUrl } : u));
toast.success("Foto atualizada com sucesso");
return publicUrl;
} catch (error: any) {
} catch (error: unknown) {
console.error("Error uploading avatar:", error);
toast.error("Erro ao enviar foto", { description: error.message });
return null;
Expand Down
2 changes: 1 addition & 1 deletion src/components/ai/AIMockupAssistant.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ interface QuickAction {
interface AIMockupAssistantProps {
productName?: string;
techniqueName?: string;
onSuggestionApply?: (type: string, value: any) => void;
onSuggestionApply?: (type: string, value: unknown) => void;
className?: string;
}

Expand Down
4 changes: 2 additions & 2 deletions src/components/audit/AuditHistory.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ const fieldLabels: Record<string, string> = {
notes: "Observações"
};

function formatFieldValue(value: any): string {
function formatFieldValue(value: unknown): string {
if (value === null || value === undefined) return "—";
if (typeof value === "boolean") return value ? "Sim" : "Não";
if (typeof value === "number") {
Expand All @@ -83,7 +83,7 @@ function formatFieldValue(value: any): string {
return String(value);
}

function FieldChange({ field, oldValue, newValue }: { field: string; oldValue: any; newValue: any }) {
function FieldChange({ field, oldValue, newValue }: { field: string; oldValue: unknown; newValue: unknown }) {
const label = fieldLabels[field] || field;

return (
Expand Down
2 changes: 1 addition & 1 deletion src/components/cart/BundleSuggestionCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export function BundleSuggestionCard({ productId, onAdd, className }: BundleSugg
enabled: !!productId,
queryFn: async (): Promise<BundleSuggestion[]> => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const { data, error } = await (supabase.rpc as any)("get_bundle_suggestions", {
const { data, error } = await (supabase.rpc as unknown)("get_bundle_suggestions", {
_product_id: productId,
});
if (error) {
Expand Down
2 changes: 1 addition & 1 deletion src/components/catalog/CatalogToolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ interface CatalogToolbarProps {
resetFilters: () => void;
sortBy: SortOption;
setSortBy: (s: SortOption) => void;
statBadges: any[];
statBadges: unknown[];
viewMode: ViewMode;
setViewMode: (m: ViewMode) => void;
gridColumns: ColumnCount;
Expand Down
4 changes: 2 additions & 2 deletions src/components/collections/CollectionTableView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ function SortHeader({ label, sortKey, currentKey, currentDir, onSort, className

interface CollectionTableRowProps {
collection: Collection;
products: any[];
products: unknown[];
isSelected: boolean;
isSelectionMode: boolean;
onToggleSelect: () => void;
Expand Down Expand Up @@ -162,7 +162,7 @@ function CollectionTableRow({

interface CollectionTableViewProps {
collections: Collection[];
getCollectionProducts: (id: string) => any[];
getCollectionProducts: (id: string) => unknown[];
selectedCollectionIds: Set<string>;
isSelectionMode: boolean;
onToggleSelect: (id: string) => void;
Expand Down
6 changes: 3 additions & 3 deletions src/components/compare/AIComparisonAdvisor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { supabase } from "@/integrations/supabase/client";
import { toast } from "sonner";

interface AIComparisonAdvisorProps {
products: any[];
products: unknown[];
}

interface AdvisorResult {
Expand All @@ -21,7 +21,7 @@ interface AdvisorResult {

const CACHE_TTL_MS = 30 * 60 * 1000;

function cacheKey(products: any[]): string {
function cacheKey(products: unknown[]): string {
return "cmp-ai-" + products.map(p => p.id).sort().join("|");
}

Expand Down Expand Up @@ -81,7 +81,7 @@ export function AIComparisonAdvisor({ products }: AIComparisonAdvisorProps) {
};
writeCache(key, advice);
setResult(advice);
} catch (e: any) {
} catch (e: unknown) {
const msg = e?.message ?? "Falha ao consultar IA";
if (msg.includes("429") || msg.toLowerCase().includes("rate")) {
toast.error("Muitas requisições. Tente novamente em 1 minuto.");
Expand Down
4 changes: 2 additions & 2 deletions src/components/compare/CompareEmptyStateSmart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@ export function CompareEmptyStateSmart() {
try {
const { data } = await supabase.rpc("get_top_compared_products", { p_limit: 6 });
if (cancelled) return;
const ids = (data ?? []).map((r: any) => r.product_id);
const ids = (data ?? []).map((r: unknown) => r.product_id);
setTopIds(ids);
if (ids.length === 0) {
logger.warn("[CompareEmptyStateSmart] RPC retornou 0 ids — fallback acionado");
}
} catch (err) {
logger.warn("[CompareEmptyStateSmart] RPC falhou — fallback acionado", err as any);
logger.warn("[CompareEmptyStateSmart] RPC falhou — fallback acionado", err as unknown);
} finally {
if (!cancelled) setLoading(false);
}
Expand Down
Loading
Loading