diff --git a/components/filters/filter-rule-modal.tsx b/components/filters/filter-rule-modal.tsx
index 46bba450..bf56396a 100644
--- a/components/filters/filter-rule-modal.tsx
+++ b/components/filters/filter-rule-modal.tsx
@@ -1,6 +1,6 @@
"use client";
-import { useState, useCallback } from "react";
+import { useState, useCallback, useMemo } from "react";
import { useTranslations } from "next-intl";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
@@ -16,6 +16,7 @@ import type {
FilterActionType,
} from "@/lib/jmap/sieve-types";
import type { Mailbox } from "@/lib/jmap/types";
+import { buildMailboxTree, flattenMailboxTree } from "@/lib/utils";
interface FilterRuleModalProps {
rule?: FilterRule;
@@ -70,6 +71,11 @@ export function FilterRuleModal({
const modalRef = useFocusTrap({ isActive: true, onEscape: onClose });
+ const hierarchicalMailboxes = useMemo(
+ () => flattenMailboxTree(buildMailboxTree(mailboxes.filter((mb) => !mb.isShared))),
+ [mailboxes]
+ );
+
const handleSave = useCallback(() => {
const trimmedName = name.trim();
if (!trimmedName) {
@@ -331,9 +337,9 @@ export function FilterRuleModal({
aria-label={t("move_to_folder")}
>
- {mailboxes.map((mb) => (
+ {hierarchicalMailboxes.map((mb) => (
))}