.
This commit is contained in:
parent
c055b8f9df
commit
7f6dc09b7e
@ -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(() => {
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -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,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user