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-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-15 15:30:17 +00:00
|
|
|
};
|
|
|
|
|
|
2025-07-16 16:17:06 +00:00
|
|
|
export const FileExplorerIcon: FC<Props> = memo(
|
2025-07-19 16:11:41 +00:00
|
|
|
({ statuses, onMouseLeave, onMouseEnter, hideUnknownStatus }) => {
|
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-07-19 15:54:40 +00:00
|
|
|
if (totalStatuses === 0) {
|
2025-07-19 16:11:41 +00:00
|
|
|
// If hideUnknownStatus is enabled, don't show anything for files without status
|
|
|
|
|
if (hideUnknownStatus) return null;
|
2025-07-19 15:54:40 +00:00
|
|
|
|
|
|
|
|
// Show "no status" icon
|
|
|
|
|
return (
|
|
|
|
|
<div className="status-wrapper">
|
|
|
|
|
<div
|
|
|
|
|
className="status-minimal status-minimal--no-status"
|
|
|
|
|
onMouseEnter={() => onMouseEnter({})}
|
|
|
|
|
onMouseLeave={() => onMouseLeave({})}
|
|
|
|
|
style={
|
|
|
|
|
{
|
|
|
|
|
"--primary-color": "var(--text-muted)",
|
|
|
|
|
} as React.CSSProperties
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
<span className="status-icon">❓</span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
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-07-15 15:30:17 +00:00
|
|
|
|
2025-07-16 16:17:06 +00:00
|
|
|
return (
|
|
|
|
|
<div className="status-wrapper">
|
|
|
|
|
<div
|
|
|
|
|
className="status-minimal"
|
|
|
|
|
onMouseEnter={() => onMouseEnter(statuses)}
|
|
|
|
|
onMouseLeave={() => onMouseLeave(statuses)}
|
|
|
|
|
style={
|
|
|
|
|
{
|
|
|
|
|
"--primary-color":
|
|
|
|
|
primaryStatus.color || "var(--text-accent)",
|
|
|
|
|
} as React.CSSProperties
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
<span className="status-icon">{primaryStatus.icon}</span>
|
|
|
|
|
{totalStatuses > 1 && (
|
|
|
|
|
<span className="status-count">{totalStatuses}</span>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
2025-07-15 15:30:17 +00:00
|
|
|
</div>
|
2025-07-16 16:17:06 +00:00
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
);
|