Files
Zero/apps/mail/components/ui/recursive-folder.tsx
Adam 277f476575 cleanup on isle zero (#1699)
Ran oxc (https://oxc.rs/docs/guide/usage/linter.html#vscode-extension) and fixed all the issues that came up, set it up to run as a PR check and added steps to the README.md asking users to use it.

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

* **New Features**
  * Introduced JavaScript linting using oxlint in development guidelines and CI workflow for improved code quality.
  * Added oxlint configuration and dependencies to the project.

* **Bug Fixes**
  * Improved error logging in various components and utilities for better debugging.
  * Enhanced React list rendering by updating keys to use unique values instead of array indices, reducing rendering issues.
  * Replaced browser alerts with toast notifications for a smoother user experience.

* **Refactor**
  * Simplified component logic and state management by removing unused code, imports, props, and components across multiple files.
  * Updated function and component signatures for clarity and maintainability.
  * Improved efficiency of certain operations by switching from arrays to sets for membership checks.

* **Chores**
  * Cleaned up and reorganized import statements throughout the codebase.
  * Removed deprecated files, components, and middleware to streamline the codebase.

* **Documentation**
  * Updated contribution guidelines to include linting requirements for code submissions.

* **Style**
  * Minor formatting and readability improvements in JSX and code structure.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-07-10 10:59:40 -07:00

91 lines
2.4 KiB
TypeScript

import { LabelSidebarContextMenu } from '../context/label-sidebar-context';
import type { Label, Label as LabelType } from '@/types';
import { useSidebar } from '../context/sidebar-context';
import useSearchLabels from '@/hooks/use-labels-search';
import { Folder } from '../magicui/file-tree';
import { useNavigate } from 'react-router';
import { useCallback } from 'react';
import * as React from 'react';
export const RecursiveFolder = ({
label,
activeAccount,
count,
}: {
label: Label & { originalLabel?: Label };
activeAccount?: any;
count?: number;
}) => {
const { labels, setLabels } = useSearchLabels();
const isActive = labels?.includes(label.id);
const isFolderActive = isActive || window.location.pathname.includes(`/mail/label/${label.id}`);
const navigate = useNavigate();
const { setOpenMobile, isMobile } = useSidebar();
const handleFilterByLabel = useCallback(
(labelToFilter: LabelType) => {
if (labels?.includes(labelToFilter.id)) {
setLabels(labels.filter((l) => l !== labelToFilter.id));
} else {
setLabels([...(labels ?? []), labelToFilter.id]);
}
},
[labels, setLabels],
);
const handleFolderClick = useCallback(
(id: string) => {
if (!activeAccount) return;
if (id.startsWith('group-')) {
return;
}
const labelToUse = label;
if (activeAccount.providerId === 'microsoft') {
navigate(`/mail/${id}`);
} else {
handleFilterByLabel(labelToUse);
}
if (isMobile) {
setOpenMobile(false);
}
},
[navigate, handleFilterByLabel, activeAccount, label, isMobile, setOpenMobile],
);
const hasChildren = label.labels && label.labels.length > 0;
return (
<LabelSidebarContextMenu
labelId={label.id}
key={label.id}
hide={activeAccount?.providerId === 'microsoft' || hasChildren}
>
<Folder
element={label.name}
value={label.id}
key={label.id}
hasChildren={hasChildren}
onFolderClick={handleFolderClick}
isSelect={isFolderActive}
count={count || 0}
className="max-w-[192px]"
>
{label.labels?.map((childLabel: any) => (
<RecursiveFolder
key={childLabel.id}
label={childLabel}
activeAccount={activeAccount}
count={count}
/>
))}
</Folder>
</LabelSidebarContextMenu>
);
};