import { useState } from 'react'; import { Button, Card, Flex, Popconfirm, Skeleton, Typography, Upload, message } from 'antd'; import type { UploadProps } from 'antd'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faImage, faTrash, faUpload } from '@fortawesome/free-solid-svg-icons'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useCompany } from '../../lib/queries/company'; import { apiFetch } from '../../lib/api-client'; const { Title, Text } = Typography; const MAX_LOGO_BYTES = 500 * 1024; // ~500KB — logo de cabeçalho não precisa mais function fileToDataUrl(file: File): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => resolve(String(reader.result)); reader.onerror = () => reject(new Error('Falha ao ler o arquivo')); reader.readAsDataURL(file); }); } export function GerConfigPage() { const { data: empresa, isLoading } = useCompany(); const qc = useQueryClient(); const [msg, msgCtx] = message.useMessage(); const [uploading, setUploading] = useState(false); const updateLogo = useMutation({ mutationFn: (logoBase64: string | null) => apiFetch('/catalog/company/logo', { method: 'PUT', body: { logoBase64 } }), onSuccess: () => qc.invalidateQueries({ queryKey: ['company'] }), }); const beforeUpload: UploadProps['beforeUpload'] = async (file) => { if (!['image/png', 'image/jpeg', 'image/webp'].includes(file.type)) { void msg.error('Use uma imagem PNG, JPG ou WebP'); return Upload.LIST_IGNORE; } if (file.size > MAX_LOGO_BYTES) { void msg.error('Imagem muito grande — use um arquivo de até 500KB'); return Upload.LIST_IGNORE; } setUploading(true); try { const dataUrl = await fileToDataUrl(file); await updateLogo.mutateAsync(dataUrl); void msg.success('Logo atualizado — já vale para as impressões de todos os representantes'); } catch { // erro já notificado pelo handler global do QueryClient } finally { setUploading(false); } return Upload.LIST_IGNORE; // upload manual — nada vai para action padrão }; async function removeLogo() { try { await updateLogo.mutateAsync(null); } catch { return; } void msg.success('Logo removido'); } return ( {msgCtx} Configurações Preferências da empresa aplicadas a todos os representantes Logo da Empresa } style={{ maxWidth: 640 }} > {isLoading ? ( ) : ( Aparece no cabeçalho da impressão do pedido (PDF) de todos os representantes da{' '} {empresa?.nomeFantasia ?? empresa?.razaoSocial ?? 'empresa'}. PNG com fundo transparente fica melhor. Máx. 500KB.
{empresa?.logoBase64 ? ( Logo da empresa ) : ( Nenhum logo cadastrado )}
{empresa?.logoBase64 && ( void removeLogo()} > )}
)} ); }