From fca1d0c293025783b1f2b5ed2c4dc331274a458d Mon Sep 17 00:00:00 2001 From: Keven Date: Mon, 15 Dec 2025 19:45:29 -0300 Subject: [PATCH] refactor(): Ajustes diversos na tela de pedidos --- .../TPessoa/TPessoaTableFormSubview.tsx | 52 ++++------- .../TServicoItemPedidoList.tsx | 7 +- .../TServicoItemPedidoResumo.tsx | 83 ------------------ .../TServicoPedido/TServicoPedidoDetails.tsx | 9 +- .../TServicoPedidoDetailsPagamento.tsx | 28 ++---- .../useTServicoPedidoDetailsControllerHook.ts | 37 ++++++++ .../useTServicoPedidoFormHook.ts | 2 +- .../components/biometria/BiometriaButton.tsx | 48 ++++++++++ .../interfaces/BiometriaButtonInterface.ts | 4 + .../ServicosPedidosSituacoesBadge.tsx | 87 ++----------------- .../enums/ServicosPedidosSituacoesBadgeMap.ts | 24 +++++ ...icosPedidosSituacoesBadgeControllerHook.ts | 35 ++++++++ .../ServicosPedidosSituacoesBadgeInterface.ts | 8 ++ .../data/fingertech/FingerTechCaptureData.ts | 2 + .../enums/ServicosPedidosSituacoesEnum.ts | 6 +- .../FingerTech/useFingerTechCaptureHook.ts | 7 +- 16 files changed, 206 insertions(+), 233 deletions(-) delete mode 100644 src/packages/servicos/components/TServicoItemPedido/TServicoItemPedidoResumo.tsx create mode 100644 src/packages/servicos/hooks/TServicoPedido/useTServicoPedidoDetailsControllerHook.ts create mode 100644 src/shared/components/biometria/BiometriaButton.tsx create mode 100644 src/shared/components/biometria/interfaces/BiometriaButtonInterface.ts create mode 100644 src/shared/components/servicosPedidosSituacoes/enums/ServicosPedidosSituacoesBadgeMap.ts create mode 100644 src/shared/components/servicosPedidosSituacoes/hooks/useServicosPedidosSituacoesBadgeControllerHook.ts create mode 100644 src/shared/components/servicosPedidosSituacoes/interfaces/ServicosPedidosSituacoesBadgeInterface.ts diff --git a/src/packages/administrativo/components/TPessoa/TPessoaTableFormSubview.tsx b/src/packages/administrativo/components/TPessoa/TPessoaTableFormSubview.tsx index 6e24740..87029d8 100644 --- a/src/packages/administrativo/components/TPessoa/TPessoaTableFormSubview.tsx +++ b/src/packages/administrativo/components/TPessoa/TPessoaTableFormSubview.tsx @@ -1,5 +1,5 @@ -import { FingerprintIcon, WebcamIcon } from 'lucide-react'; -import { memo, useCallback, useMemo, useState } from 'react'; +import { WebcamIcon } from 'lucide-react'; +import { memo, useCallback, useState } from 'react'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Button } from '@/components/ui/button'; @@ -11,12 +11,11 @@ import { ItemMedia, ItemTitle, } from '@/components/ui/item'; +import TPessoaTableFormSubviewInterface from '@/packages/administrativo/interfaces/TPessoa/TPessoaTableFormSubviewInterface'; import TPessoaCartaoForm from '@/packages/servicos/components/TPessoaCartao/TPessoaCartaoForm'; import GetNameInitials from '@/shared/actions/text/GetNameInitials'; +import BiometriaButton from '@/shared/components/biometria/BiometriaButton'; import WebCamDialog from '@/shared/components/webcam/WebCamDialog'; -import { useFingerTechCaptureHook } from '@/shared/hooks/FingerTech/useFingerTechCaptureHook'; - -import TPessoaTableFormSubviewInterface from '@/packages/administrativo/interfaces/TPessoa/TPessoaTableFormSubviewInterface'; function TPessoaTableFormSubview({ item_index, @@ -24,28 +23,17 @@ function TPessoaTableFormSubview({ params, form, }: TPessoaTableFormSubviewInterface) { + const [isWebCamOpenDialog, setIsWebCamOpenDialog] = useState(false); - const { base64, captureFingerTech } = useFingerTechCaptureHook(); + const [statusBiometria, setStatusBiometria] = useState(0) - // Chama o leitor biométrico - const handleBiometria = useCallback(() => { - console.log(captureFingerTech()); - }, []); + const handleCaptureSuccess = useCallback(async (base64: string) => { - const biometriaButtonClass = useMemo(() => { - const status = 1 as number; // força tipo number + console.log(base64) - switch (status) { - case 0: - return 'bg-amber-100 text-amber-700 border border-amber-300 hover:bg-amber-200 hover:text-amber-800'; - case 1: - return 'bg-green-100 text-green-700 border border-green-300 hover:bg-green-200 hover:text-green-800'; - case 2: - return 'bg-red-100 text-red-700 border border-red-300 hover:bg-red-200 hover:text-red-800'; - default: - return ''; - } - }, []); + setStatusBiometria(1) + + }, []) return (
@@ -69,18 +57,10 @@ function TPessoaTableFormSubview({ {data?.servico?.requer_biometria === 'S' && ( - + )} {data?.servico?.requer_biometria && ( + ); +}; + +export default memo(BiometriaButton); \ No newline at end of file diff --git a/src/shared/components/biometria/interfaces/BiometriaButtonInterface.ts b/src/shared/components/biometria/interfaces/BiometriaButtonInterface.ts new file mode 100644 index 0000000..a00782a --- /dev/null +++ b/src/shared/components/biometria/interfaces/BiometriaButtonInterface.ts @@ -0,0 +1,4 @@ +export default interface BiometriaButtonInterface { + status?: number; // 0: pendente, 1: sucesso, 2: erro + onCaptureSuccess: (base64: string) => void; +} \ No newline at end of file diff --git a/src/shared/components/servicosPedidosSituacoes/ServicosPedidosSituacoesBadge.tsx b/src/shared/components/servicosPedidosSituacoes/ServicosPedidosSituacoesBadge.tsx index c55dd4c..e5c45a8 100644 --- a/src/shared/components/servicosPedidosSituacoes/ServicosPedidosSituacoesBadge.tsx +++ b/src/shared/components/servicosPedidosSituacoes/ServicosPedidosSituacoesBadge.tsx @@ -1,100 +1,31 @@ 'use client'; -import { AlertCircleIcon, BadgeCheckIcon, CheckIcon } from 'lucide-react'; -import * as React from 'react'; - import { Badge } from '@/components/ui/badge'; import { cn } from '@/lib/utils'; -import { ServicosPedidosSituacoesEnum } from '@/shared/enums/ServicosPedidosSituacoesEnum'; +import ServicosPedidosSituacoesBadgeInterface from '@/shared/components/servicosPedidosSituacoes/interfaces/ServicosPedidosSituacoesBadgeInterface'; -type Situacao = keyof typeof ServicosPedidosSituacoesEnum; - -type Props = { - situacao?: Situacao | null; // 'A' | 'F' | 'C' - showLabel?: boolean; // exibir texto? (default: true) - compact?: boolean; // menor altura/tamanho (default: false) - className?: string; // classes extras -}; - -type Cfg = { - label: string; - icon: React.ComponentType>; - bgClass: string; // fundo "subtle" - textClass: string; // cor do texto/ícone -}; - -const CONFIG: Record = { - A: { - label: ServicosPedidosSituacoesEnum.A, // Aberto - icon: AlertCircleIcon, - bgClass: 'bg-blue-50 dark:bg-blue-900/20', - textClass: 'text-blue-700 dark:text-blue-300', - }, - F: { - label: ServicosPedidosSituacoesEnum.F, // Fechado - icon: BadgeCheckIcon, - bgClass: 'bg-emerald-50 dark:bg-emerald-900/20', - textClass: 'text-emerald-700 dark:text-emerald-300', - }, - C: { - label: ServicosPedidosSituacoesEnum.C, // Cancelado - icon: CheckIcon, // troque por XIcon se preferir - bgClass: 'bg-red-50 dark:bg-red-900/20', - textClass: 'text-red-700 dark:text-red-300', - }, -}; +import { useServicosPedidosSituacoesBadgeControllerHook } from './hooks/useServicosPedidosSituacoesBadgeControllerHook'; export function ServicosPedidosSituacoesBadge({ situacao, showLabel = true, compact = false, className, -}: Props) { - if (!situacao || !(situacao in CONFIG)) { - return ( - - - {showLabel ? ( - - Indefinido - - ) : ( - Indefinido - )} - - ); - } +}: ServicosPedidosSituacoesBadgeInterface) { - const { label, icon: Icon, bgClass, textClass } = CONFIG[situacao]; + const { label, Icon, color, bg, size, iconSize } = useServicosPedidosSituacoesBadgeControllerHook(situacao, compact); return ( " - 'gap-1.5 rounded-md border border-gray-100 text-gray-900 dark:border-gray-700 dark:text-gray-50', - bgClass, - compact ? 'h-5 px-2 text-[11px]' : 'h-6 px-2.5 text-xs', + 'gap-1.5 rounded-md border border-gray-100 dark:border-gray-700', + bg, + size, className, )} > - {/* Ícone e label com cor semântica, como "" */} - - {showLabel ? ( - {label} - ) : ( - {label} - )} + + {showLabel && {label}} ); } diff --git a/src/shared/components/servicosPedidosSituacoes/enums/ServicosPedidosSituacoesBadgeMap.ts b/src/shared/components/servicosPedidosSituacoes/enums/ServicosPedidosSituacoesBadgeMap.ts new file mode 100644 index 0000000..cbad65e --- /dev/null +++ b/src/shared/components/servicosPedidosSituacoes/enums/ServicosPedidosSituacoesBadgeMap.ts @@ -0,0 +1,24 @@ +import { AlertCircleIcon, BadgeCheckIcon, XIcon } from "lucide-react"; + +import { ServicosPedidosSituacoesEnum } from "@/shared/enums/ServicosPedidosSituacoesEnum"; + +export const ServicosPedidosSituacoesBadgeMap = { + [ServicosPedidosSituacoesEnum.ABERTO]: { + label: 'Aberto', + icon: AlertCircleIcon, + color: 'text-blue-700 dark:text-blue-300', + bg: 'bg-blue-50 dark:bg-blue-900/20', + }, + [ServicosPedidosSituacoesEnum.FECHADO]: { + label: 'Fechado', + icon: BadgeCheckIcon, + color: 'text-emerald-700 dark:text-emerald-300', + bg: 'bg-emerald-50 dark:bg-emerald-900/20', + }, + [ServicosPedidosSituacoesEnum.CANCELADO]: { + label: 'Cancelado', + icon: XIcon, + color: 'text-red-700 dark:text-red-300', + bg: 'bg-red-50 dark:bg-red-900/20', + }, +} as const; diff --git a/src/shared/components/servicosPedidosSituacoes/hooks/useServicosPedidosSituacoesBadgeControllerHook.ts b/src/shared/components/servicosPedidosSituacoes/hooks/useServicosPedidosSituacoesBadgeControllerHook.ts new file mode 100644 index 0000000..8990d3f --- /dev/null +++ b/src/shared/components/servicosPedidosSituacoes/hooks/useServicosPedidosSituacoesBadgeControllerHook.ts @@ -0,0 +1,35 @@ +'use client'; + +import { AlertCircleIcon } from 'lucide-react'; + +import { ServicosPedidosSituacoesEnum } from '@/shared/enums/ServicosPedidosSituacoesEnum'; + +import { ServicosPedidosSituacoesBadgeMap } from '../enums/ServicosPedidosSituacoesBadgeMap'; + +export const useServicosPedidosSituacoesBadgeControllerHook = ( + situacao?: ServicosPedidosSituacoesEnum | null, + compact?: boolean, +) => { + const config = + situacao && ServicosPedidosSituacoesBadgeMap[situacao] + ? ServicosPedidosSituacoesBadgeMap[situacao] + : { + label: 'Indefinido', + icon: AlertCircleIcon, + color: 'text-gray-600 dark:text-gray-200', + bg: 'bg-gray-50 dark:bg-gray-800/50', + }; + + const Icon = config.icon; + const size = compact ? 'h-5 px-2 text-[11px]' : 'h-6 px-2.5 text-xs'; + const iconSize = compact ? 'h-3.5 w-3.5' : 'h-4 w-4'; + + return { + label: config.label, + Icon, + color: config.color, + bg: config.bg, + size, + iconSize, + }; +}; diff --git a/src/shared/components/servicosPedidosSituacoes/interfaces/ServicosPedidosSituacoesBadgeInterface.ts b/src/shared/components/servicosPedidosSituacoes/interfaces/ServicosPedidosSituacoesBadgeInterface.ts new file mode 100644 index 0000000..1d38335 --- /dev/null +++ b/src/shared/components/servicosPedidosSituacoes/interfaces/ServicosPedidosSituacoesBadgeInterface.ts @@ -0,0 +1,8 @@ +import { ServicosPedidosSituacoesEnum } from "@/shared/enums/ServicosPedidosSituacoesEnum"; + +export default interface ServicosPedidosSituacoesBadgeInterface { + situacao?: ServicosPedidosSituacoesEnum | null; + showLabel?: boolean; + compact?: boolean; + className?: string; +} \ No newline at end of file diff --git a/src/shared/data/fingertech/FingerTechCaptureData.ts b/src/shared/data/fingertech/FingerTechCaptureData.ts index ed02f28..f7a1fe5 100644 --- a/src/shared/data/fingertech/FingerTechCaptureData.ts +++ b/src/shared/data/fingertech/FingerTechCaptureData.ts @@ -13,6 +13,8 @@ async function executeFingerTechCaptureData() { method: 'GET', }); + console.log(response) + return await response.text(); } diff --git a/src/shared/enums/ServicosPedidosSituacoesEnum.ts b/src/shared/enums/ServicosPedidosSituacoesEnum.ts index 0ebc674..8a12e08 100644 --- a/src/shared/enums/ServicosPedidosSituacoesEnum.ts +++ b/src/shared/enums/ServicosPedidosSituacoesEnum.ts @@ -1,5 +1,5 @@ export enum ServicosPedidosSituacoesEnum { - A = 'Aberto', - F = 'Fechado', - C = 'Cancelado', + ABERTO = 'A', + FECHADO = 'F', + CANCELADO = 'C', } diff --git a/src/shared/hooks/FingerTech/useFingerTechCaptureHook.ts b/src/shared/hooks/FingerTech/useFingerTechCaptureHook.ts index 48630b2..12c54f0 100644 --- a/src/shared/hooks/FingerTech/useFingerTechCaptureHook.ts +++ b/src/shared/hooks/FingerTech/useFingerTechCaptureHook.ts @@ -5,16 +5,17 @@ import { useState } from 'react'; import { FingerTechCaptureService } from '@/shared/services/FingerTech/FingerTechCaptureService'; export const useFingerTechCaptureHook = () => { + const [base64, setBase64] = useState(''); const captureFingerTech = async () => { + const response = await FingerTechCaptureService(); - const base64Data = response?.data ?? ''; - - setBase64(base64Data); + setBase64('123123'); return response; + }; return {