This commit is contained in:
David Arranz 2026-03-31 20:48:29 +02:00
parent c055b8f9df
commit 7f6dc09b7e
4 changed files with 19 additions and 61 deletions

View File

@ -18,7 +18,7 @@ export const useCustomerSummaryPanelController = ({
const panelState = useRightPanelState({ const panelState = useRightPanelState({
defaultMode: initialMode, defaultMode: initialMode,
defaultVisibility: initialOpen ? "temporary" : "hidden", defaultVisibility: initialOpen ? "visible" : "hidden",
}); });
const query = useCustomerGetQuery(customerId, { const query = useCustomerGetQuery(customerId, {
@ -26,16 +26,11 @@ export const useCustomerSummaryPanelController = ({
}); });
const openCustomerPanel = useCallback( const openCustomerPanel = useCallback(
(nextCustomerId: string, mode: RightPanelMode = "view") => { (id: string, mode: RightPanelMode = "view") => {
setCustomerId(nextCustomerId); setCustomerId(id);
panelState.open(mode);
if (panelState.isPinned) {
panelState.openPersistent(mode);
} else {
panelState.openTemporary(mode);
}
}, },
[panelState.isPinned, panelState.openTemporary, panelState.openPersistent] [panelState.open]
); );
const closePanel = useCallback(() => { const closePanel = useCallback(() => {

View File

@ -2,7 +2,7 @@ import { RightPanel } from "@repo/rdx-ui/components";
import type { RightPanelMode, RightPanelVisibility } from "@repo/rdx-ui/hooks"; import type { RightPanelMode, RightPanelVisibility } from "@repo/rdx-ui/hooks";
import { Button } from "@repo/shadcn-ui/components"; import { Button } from "@repo/shadcn-ui/components";
import { cn } from "@repo/shadcn-ui/lib/utils"; import { cn } from "@repo/shadcn-ui/lib/utils";
import { PencilIcon, PinIcon, PinOffIcon } from "lucide-react"; import { PencilIcon } from "lucide-react";
import type { Customer } from "../../../../shared"; import type { Customer } from "../../../../shared";
@ -51,7 +51,6 @@ interface CustomerSummaryPanelProps {
mode: RightPanelMode; mode: RightPanelMode;
onOpenChange: (open: boolean) => void; onOpenChange: (open: boolean) => void;
onTogglePinned: () => void;
onEdit?: (customer: Customer) => void; onEdit?: (customer: Customer) => void;
className?: string; className?: string;
@ -63,12 +62,9 @@ export const CustomerSummaryPanel = ({
visibility, visibility,
mode, mode,
onOpenChange, onOpenChange,
onTogglePinned,
onEdit, onEdit,
className, className,
}: CustomerSummaryPanelProps) => { }: CustomerSummaryPanelProps) => {
const isPinned = visibility === "persistent";
const titleMap: Record<RightPanelMode, string> = { const titleMap: Record<RightPanelMode, string> = {
view: "Ficha de cliente", view: "Ficha de cliente",
edit: "Editar cliente", edit: "Editar cliente",
@ -80,16 +76,6 @@ export const CustomerSummaryPanel = ({
className={cn("bg-transparent", className)} className={cn("bg-transparent", className)}
headerActions={ headerActions={
<> <>
<Button
aria-label={isPinned ? "Desfijar panel" : "Fijar panel"}
aria-pressed={isPinned}
onClick={onTogglePinned}
size="icon-sm"
variant="ghost"
>
{isPinned ? <PinOffIcon className="size-4" /> : <PinIcon className="size-4" />}
</Button>
{customer ? ( {customer ? (
<Button <Button
aria-label="Editar cliente" aria-label="Editar cliente"

View File

@ -110,7 +110,6 @@ export const ListCustomersPage = () => {
panelCtrl.panelState.onOpenChange(true); panelCtrl.panelState.onOpenChange(true);
}} }}
onTogglePinned={panelCtrl.panelState.togglePinned}
open={panelCtrl.panelState.isOpen} open={panelCtrl.panelState.isOpen}
visibility={panelCtrl.panelState.visibility} visibility={panelCtrl.panelState.visibility}
/> />

View File

@ -1,7 +1,7 @@
import { useCallback, useState } from "react"; import { useCallback, useState } from "react";
export type RightPanelMode = "view" | "edit" | "create"; export type RightPanelMode = "view" | "edit" | "create";
export type RightPanelVisibility = "hidden" | "temporary" | "persistent"; export type RightPanelVisibility = "hidden" | "visible";
export interface RightPanelStateOptions { export interface RightPanelStateOptions {
defaultMode?: RightPanelMode; defaultMode?: RightPanelMode;
@ -12,14 +12,11 @@ export interface RightPanelState {
mode: RightPanelMode; mode: RightPanelMode;
visibility: RightPanelVisibility; visibility: RightPanelVisibility;
isOpen: boolean; isOpen: boolean;
isPinned: boolean;
} }
export interface RightPanelStateActions { export interface RightPanelStateActions {
onOpenChange: (next: boolean) => void; onOpenChange: (open: boolean) => void;
openTemporary: (mode?: RightPanelMode) => void; open: (mode?: RightPanelMode) => void;
openPersistent: (mode?: RightPanelMode) => void;
togglePinned: () => void;
close: () => void; close: () => void;
reset: () => void; reset: () => void;
} }
@ -37,35 +34,19 @@ export const useRightPanelState = (
const [mode, setMode] = useState<RightPanelMode>(defaultMode); const [mode, setMode] = useState<RightPanelMode>(defaultMode);
const [visibility, setVisibility] = useState<RightPanelVisibility>(defaultVisibility); const [visibility, setVisibility] = useState<RightPanelVisibility>(defaultVisibility);
const isOpen = visibility !== "hidden"; const isOpen = visibility === "visible";
const isPinned = visibility === "persistent";
const open = useCallback((nextMode: RightPanelMode = DEFAULT_MODE) => {
setMode(nextMode);
setVisibility("visible");
}, []);
const close = useCallback(() => { const close = useCallback(() => {
setVisibility("hidden"); setVisibility("hidden");
}, []); }, []);
const onOpenChange = useCallback((next: boolean) => { const onOpenChange = useCallback((open: boolean) => {
setVisibility((prev) => { setVisibility(open ? "visible" : "hidden");
if (!next) return "hidden";
return prev === "persistent" ? "persistent" : "temporary";
});
}, []);
const openTemporary = useCallback((nextMode: RightPanelMode = DEFAULT_MODE) => {
setMode(nextMode);
setVisibility("temporary");
}, []);
const openPersistent = useCallback((nextMode: RightPanelMode = DEFAULT_MODE) => {
setMode(nextMode);
setVisibility("persistent");
}, []);
const togglePinned = useCallback(() => {
setVisibility((prev) => {
if (prev === "hidden") return prev;
return prev === "persistent" ? "temporary" : "persistent";
});
}, []); }, []);
const reset = useCallback(() => { const reset = useCallback(() => {
@ -77,12 +58,9 @@ export const useRightPanelState = (
mode, mode,
visibility, visibility,
isOpen, isOpen,
isPinned, open,
onOpenChange,
openTemporary,
openPersistent,
togglePinned,
close, close,
onOpenChange,
reset, reset,
}; };
}; };