2025-11-18 18:05:48 +00:00
|
|
|
import { StatusIconPreview } from "@/components/atoms/StatusIconPreview";
|
2025-07-15 15:30:17 +00:00
|
|
|
import { GroupedStatuses } from "@/types/noteStatus";
|
2025-07-16 16:17:06 +00:00
|
|
|
import React, { FC, memo } from "react";
|
2025-11-21 08:45:00 +00:00
|
|
|
import { StatusIcon } from "@/components/atoms/StatusIcon";
|
2025-07-15 15:30:17 +00:00
|
|
|
|
|
|
|
|
type Props = {
|
|
|
|
|
statuses: GroupedStatuses;
|
|
|
|
|
onMouseEnter: (statuses: GroupedStatuses) => void;
|
|
|
|
|
onMouseLeave: (statuses: GroupedStatuses) => void;
|
2025-07-19 16:11:41 +00:00
|
|
|
hideUnknownStatus?: boolean;
|
2025-07-20 18:02:43 +00:00
|
|
|
unknownStatusConfig?: {
|
|
|
|
|
icon: string;
|
2025-11-21 08:30:10 +00:00
|
|
|
lucideIcon?: string;
|
2025-07-20 18:02:43 +00:00
|
|
|
color: string;
|
|
|
|
|
};
|
2025-11-17 18:39:02 +00:00
|
|
|
iconFrameMode?: "always" | "never";
|
2025-11-17 18:41:48 +00:00
|
|
|
iconColorMode?: "status" | "theme";
|
2025-07-15 15:30:17 +00:00
|
|
|
};
|
|
|
|
|
|
2025-07-16 16:17:06 +00:00
|
|
|
export const FileExplorerIcon: FC<Props> = memo(
|
2025-07-20 18:02:43 +00:00
|
|
|
({
|
|
|
|
|
statuses,
|
|
|
|
|
onMouseLeave,
|
|
|
|
|
onMouseEnter,
|
|
|
|
|
hideUnknownStatus,
|
|
|
|
|
unknownStatusConfig,
|
2025-11-17 18:39:02 +00:00
|
|
|
iconFrameMode = "never",
|
2025-11-17 18:41:48 +00:00
|
|
|
iconColorMode = "status",
|
2025-07-20 18:02:43 +00:00
|
|
|
}) => {
|
2025-07-16 16:17:06 +00:00
|
|
|
const statusEntries = Object.entries(statuses);
|
|
|
|
|
const totalStatuses = statusEntries.reduce(
|
|
|
|
|
(acc, [, list]) => acc + list.length,
|
|
|
|
|
0,
|
|
|
|
|
);
|
2025-07-15 15:30:17 +00:00
|
|
|
|
2025-11-17 18:41:48 +00:00
|
|
|
const useStatusColors = iconColorMode === "status";
|
|
|
|
|
|
2025-11-17 18:21:38 +00:00
|
|
|
const getStatusColor = (color?: string) =>
|
|
|
|
|
(color && color.trim()) || "var(--text-accent)";
|
|
|
|
|
|
2025-07-19 15:54:40 +00:00
|
|
|
if (totalStatuses === 0) {
|
2025-07-19 16:11:41 +00:00
|
|
|
if (hideUnknownStatus) return null;
|
2025-07-19 15:54:40 +00:00
|
|
|
|
2025-07-20 18:02:43 +00:00
|
|
|
const icon = unknownStatusConfig?.icon || "❓";
|
2025-11-17 18:41:48 +00:00
|
|
|
const color = useStatusColors
|
|
|
|
|
? unknownStatusConfig?.color?.trim() || "#8b949e"
|
|
|
|
|
: undefined;
|
2025-07-20 18:02:43 +00:00
|
|
|
|
2025-07-19 15:54:40 +00:00
|
|
|
return (
|
2025-11-18 18:05:48 +00:00
|
|
|
<StatusIconPreview
|
2025-11-21 08:45:00 +00:00
|
|
|
icon={
|
|
|
|
|
<StatusIcon
|
|
|
|
|
icon={icon}
|
|
|
|
|
lucideIcon={unknownStatusConfig?.lucideIcon}
|
|
|
|
|
size={16}
|
|
|
|
|
/>
|
|
|
|
|
}
|
2025-11-18 18:05:48 +00:00
|
|
|
color={color}
|
|
|
|
|
iconColorMode={iconColorMode}
|
|
|
|
|
iconFrameMode={iconFrameMode}
|
|
|
|
|
onMouseEnter={() => onMouseEnter({})}
|
|
|
|
|
onMouseLeave={() => onMouseLeave({})}
|
|
|
|
|
/>
|
2025-07-19 15:54:40 +00:00
|
|
|
);
|
|
|
|
|
}
|
2025-07-15 15:30:17 +00:00
|
|
|
|
2025-07-16 16:17:06 +00:00
|
|
|
const primaryStatus = statusEntries[0]?.[1]?.[0];
|
|
|
|
|
if (!primaryStatus) return null;
|
2025-11-17 18:41:48 +00:00
|
|
|
const iconColor = useStatusColors
|
|
|
|
|
? getStatusColor(primaryStatus.color)
|
|
|
|
|
: undefined;
|
2025-07-15 15:30:17 +00:00
|
|
|
|
2025-07-16 16:17:06 +00:00
|
|
|
return (
|
2025-11-18 18:05:48 +00:00
|
|
|
<StatusIconPreview
|
2025-11-21 08:45:00 +00:00
|
|
|
icon={
|
|
|
|
|
<StatusIcon
|
|
|
|
|
icon={primaryStatus.icon}
|
|
|
|
|
lucideIcon={primaryStatus.lucideIcon}
|
|
|
|
|
size={16}
|
|
|
|
|
/>
|
|
|
|
|
}
|
2025-11-18 18:05:48 +00:00
|
|
|
color={iconColor}
|
|
|
|
|
count={totalStatuses}
|
|
|
|
|
iconFrameMode={iconFrameMode}
|
|
|
|
|
iconColorMode={iconColorMode}
|
|
|
|
|
onMouseEnter={() => onMouseEnter(statuses)}
|
|
|
|
|
onMouseLeave={() => onMouseLeave(statuses)}
|
|
|
|
|
/>
|
2025-07-16 16:17:06 +00:00
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
);
|