devonthesofa_obsidian-note-.../components/FileExplorer/FileExplorerIcon.tsx

81 lines
2 KiB
TypeScript
Raw Normal View History

import { StatusIconPreview } from "@/components/atoms/StatusIconPreview";
2025-07-15 15:30:17 +00:00
import { GroupedStatuses } from "@/types/noteStatus";
import React, { FC, memo } from "react";
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;
unknownStatusConfig?: {
icon: string;
2025-11-21 08:30:10 +00:00
lucideIcon?: string;
color: string;
};
iconFrameMode?: "always" | "never";
2025-11-17 18:41:48 +00:00
iconColorMode?: "status" | "theme";
2025-07-15 15:30:17 +00:00
};
export const FileExplorerIcon: FC<Props> = memo(
({
statuses,
onMouseLeave,
onMouseEnter,
hideUnknownStatus,
unknownStatusConfig,
iconFrameMode = "never",
2025-11-17 18:41:48 +00:00
iconColorMode = "status",
}) => {
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";
const getStatusColor = (color?: string) =>
(color && color.trim()) || "var(--text-accent)";
if (totalStatuses === 0) {
2025-07-19 16:11:41 +00:00
if (hideUnknownStatus) return null;
const icon = unknownStatusConfig?.icon || "❓";
2025-11-17 18:41:48 +00:00
const color = useStatusColors
? unknownStatusConfig?.color?.trim() || "#8b949e"
: undefined;
return (
<StatusIconPreview
icon={icon}
2025-11-21 08:30:10 +00:00
lucideIcon={unknownStatusConfig?.lucideIcon}
color={color}
iconColorMode={iconColorMode}
iconFrameMode={iconFrameMode}
onMouseEnter={() => onMouseEnter({})}
onMouseLeave={() => onMouseLeave({})}
/>
);
}
2025-07-15 15:30:17 +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
return (
<StatusIconPreview
icon={primaryStatus.icon}
2025-11-21 07:04:30 +00:00
lucideIcon={primaryStatus.lucideIcon}
color={iconColor}
count={totalStatuses}
iconFrameMode={iconFrameMode}
iconColorMode={iconColorMode}
onMouseEnter={() => onMouseEnter(statuses)}
onMouseLeave={() => onMouseLeave(statuses)}
/>
);
},
);