Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import React, { useCallback } from "react";
import React, { useCallback, useMemo } from "react";
import { observer } from "mobx-react";
import { useParams, useSearchParams } from "next/navigation";
import useSWR from "swr";
// plane imports
import { GLOBAL_VIEW_TRACKER_ELEMENTS, ISSUE_DISPLAY_FILTERS_BY_PAGE } from "@plane/constants";
import { EIssuesStoreType, EIssueLayoutTypes } from "@plane/types";
import { EIssuesStoreType, EIssueLayoutTypes, STATIC_VIEW_TYPES } from "@plane/types";
// components
import { EmptyState } from "@/components/common/empty-state";
import { IssuePeekOverview } from "@/components/issues/peek-overview";
Expand Down Expand Up @@ -45,14 +45,22 @@ export const AllIssueLayoutRoot: React.FC<Props> = observer((props: Props) => {
const viewDetails = globalViewId ? getViewDetailsById(globalViewId) : undefined;
const workItemFilters = globalViewId ? filters?.[globalViewId] : undefined;
const activeLayout: EIssueLayoutTypes | undefined = workItemFilters?.displayFilters?.layout;
const initialWorkItemFilters = viewDetails
? {
displayFilters: workItemFilters?.displayFilters,
displayProperties: workItemFilters?.displayProperties,
kanbanFilters: workItemFilters?.kanbanFilters,
richFilters: viewDetails?.rich_filters ?? {},
}
: undefined;
// Determine initial work item filters based on view type and availability
const initialWorkItemFilters = useMemo(() => {
if (!globalViewId) return undefined;

const isStaticView = STATIC_VIEW_TYPES.includes(globalViewId);
const hasViewDetails = Boolean(viewDetails);

if (!isStaticView && !hasViewDetails) return undefined;

return {
displayFilters: workItemFilters?.displayFilters,
displayProperties: workItemFilters?.displayProperties,
kanbanFilters: workItemFilters?.kanbanFilters,
richFilters: viewDetails?.rich_filters ?? {},
};
}, [globalViewId, viewDetails, workItemFilters]);

Comment on lines +48 to 64
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

MobX reactivity hazard + richFilters precedence.

  • useMemo may not recompute when nested observable fields change, causing stale filters.
  • Prefer store richFilters before viewDetails.rich_filters to preserve user state.

Apply:

-  // Determine initial work item filters based on view type and availability
-  const initialWorkItemFilters = useMemo(() => {
-    if (!globalViewId) return undefined;
-
-    const isStaticView = STATIC_VIEW_TYPES.includes(globalViewId);
-    const hasViewDetails = Boolean(viewDetails);
-
-    if (!isStaticView && !hasViewDetails) return undefined;
-
-    return {
-      displayFilters: workItemFilters?.displayFilters,
-      displayProperties: workItemFilters?.displayProperties,
-      kanbanFilters: workItemFilters?.kanbanFilters,
-      richFilters: viewDetails?.rich_filters ?? {},
-    };
-  }, [globalViewId, viewDetails, workItemFilters]);
+  // Determine initial work item filters based on view type and availability
+  const isStaticView = globalViewId ? STATIC_VIEW_TYPES.includes(globalViewId) : false;
+  const hasViewDetails = Boolean(viewDetails);
+  const initialWorkItemFilters =
+    !globalViewId
+      ? undefined
+      : !isStaticView && !hasViewDetails
+      ? undefined
+      : {
+          displayFilters: workItemFilters?.displayFilters,
+          displayProperties: workItemFilters?.displayProperties,
+          kanbanFilters: workItemFilters?.kanbanFilters,
+          // Prefer in-store richFilters; fall back to view details; then empty object.
+          richFilters: workItemFilters?.richFilters ?? viewDetails?.rich_filters ?? {},
+        };
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Determine initial work item filters based on view type and availability
const initialWorkItemFilters = useMemo(() => {
if (!globalViewId) return undefined;
const isStaticView = STATIC_VIEW_TYPES.includes(globalViewId);
const hasViewDetails = Boolean(viewDetails);
if (!isStaticView && !hasViewDetails) return undefined;
return {
displayFilters: workItemFilters?.displayFilters,
displayProperties: workItemFilters?.displayProperties,
kanbanFilters: workItemFilters?.kanbanFilters,
richFilters: viewDetails?.rich_filters ?? {},
};
}, [globalViewId, viewDetails, workItemFilters]);
// Determine initial work item filters based on view type and availability
const isStaticView = globalViewId ? STATIC_VIEW_TYPES.includes(globalViewId) : false;
const hasViewDetails = Boolean(viewDetails);
const initialWorkItemFilters =
!globalViewId
? undefined
: !isStaticView && !hasViewDetails
? undefined
: {
displayFilters: workItemFilters?.displayFilters,
displayProperties: workItemFilters?.displayProperties,
kanbanFilters: workItemFilters?.kanbanFilters,
// Prefer in-store richFilters; fall back to view details; then empty object.
richFilters: workItemFilters?.richFilters ?? viewDetails?.rich_filters ?? {},
};
🤖 Prompt for AI Agents
In apps/web/core/components/issues/issue-layouts/roots/all-issue-layout-root.tsx
around lines 48-64, the current useMemo can produce stale values because it
closes over nested MobX observables and doesn't recompute when those change;
also richFilters should prefer the store value over viewDetails.rich_filters.
Fix by removing the useMemo (or if you must keep it, add the observable store
fields to the dependency array) and compute initialWorkItemFilters from live
values so MobX reactivity works: derive richFilters as storeRichFilters ??
viewDetails?.rich_filters, preserve
displayFilters/displayProperties/kanbanFilters from the store, and only return
undefined when globalViewId is falsy or when a non-static view lacks
viewDetails.

// Custom hooks
useWorkspaceIssueProperties(workspaceSlug);
Expand Down
Loading