Skip to content

[GIT-254] Refactor: Store consolidation to @core/store#9271

Open
codingwolf-at wants to merge 10 commits into
git-248/components-consolidation-core-componentsfrom
git-254/store-consolidation-core-store
Open

[GIT-254] Refactor: Store consolidation to @core/store#9271
codingwolf-at wants to merge 10 commits into
git-248/components-consolidation-core-componentsfrom
git-254/store-consolidation-core-store

Conversation

@codingwolf-at

@codingwolf-at codingwolf-at commented Jun 19, 2026

Copy link
Copy Markdown

Description

Moved stores from apps/web/ce/store to apps/web/core/store

Type of Change

  • Code refactoring

Summary by CodeRabbit

  • Bug Fixes

    • Improved issue, workspace, member, and timeline behavior by aligning store usage and updating how several views resolve data.
    • Fixed a few internal data paths so common screens and hooks continue working with the latest structure.
  • Refactor

    • Streamlined store foundations and shared hooks for better consistency across the app.
    • Cleaned up import organization and removed outdated compatibility layers.
  • Chores

    • Updated project configuration to use the current module resolution paths.

@CLAassistant

CLAassistant commented Jun 19, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

@coderabbitai

coderabbitai Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: fe97e50a-7744-4d32-9ccc-e0b1eb51f2e4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR makes several core store base classes concrete, rewires root/page/member/timeline stores to the new @/store/... paths, updates issue store contracts and helper behavior around project-based issue stores, and removes the old CE store re-export surface and @/plane-web/* alias.

Changes

Store migration and store contract updates

Layer / File(s) Summary
Base stores become concrete
apps/web/core/store/analytics.store.ts, apps/web/core/store/base-command-palette.store.ts, apps/web/core/store/base-power-k.store.ts, apps/web/core/store/member/project/base-project-member.store.ts, apps/web/core/store/user/base-permissions.store.ts, apps/web/core/store/workspace/index.ts
Concrete implementations replace abstract base stores, and compatibility aliases are exported from the base store modules.
Core root and page wiring
apps/web/core/store/root.store.ts, apps/web/core/store/member/index.ts, apps/web/core/store/member/workspace/workspace-member.store.ts, apps/web/core/store/pages/*, apps/web/core/store/state.store.ts, apps/web/core/store/timeline/*, apps/web/core/lib/store-context.tsx, apps/web/core/store/user/index.ts
Core store imports now point at the new store modules, and the root store passes itself directly into child store constructors.
Issue store contracts and detail wiring
apps/web/core/store/issue/root.store.ts, apps/web/core/store/issue/issue-details/*, apps/web/core/hooks/store/use-issues.ts, apps/web/core/hooks/store/use-issue-detail.ts
Issue root-store types and constructor wiring now use project-based issue stores, and issue detail stores import the local activity store implementation.
Issue sorting and display filters
apps/web/core/store/issue/helpers/*
issuesSortWithOrderBy returns direct issue IDs in the default branch, computedDisplayFilters returns computed filters directly, and related lint suppressions were added around issue update flows.
Store path imports
apps/web/core/hooks/store/use-*.ts, apps/web/core/hooks/store/estimates/use-estimate.ts, apps/web/core/hooks/use-timeline-chart.ts, apps/web/core/store/estimates/*, apps/web/ce/store/*, apps/web/tsconfig.json
Hook and estimate imports now resolve from the new store modules, and the legacy @/plane-web/* alias and CE store entrypoints are removed.
Component import cleanup
apps/web/app/(all)/[workspaceSlug]/(projects)/extended-sidebar.tsx, apps/web/core/components/issues/**/*, apps/web/core/components/project/create/common-attributes.tsx
Import comments and import ordering are normalized across sidebar, issue, relation, layout, and project-create component files.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested labels

🌐frontend

Suggested reviewers

  • sriramveeraghanta
  • Palanikannan1437

Poem

A bunny hopped through store paths bright,
From old trails into @/store light.
Concrete paws and tidy lines,
Carrots hum in code redesigns 🐰

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main refactor: consolidating stores into the core store layer.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch git-254/store-consolidation-core-store

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jun 19, 2026

Copy link
Copy Markdown

React Doctor found 24 issues in 9 files · 24 warnings · score 86 / 100 (Great) · vs git-248/components-consolidation-core-components

24 warnings

app/(all)/[workspaceSlug]/(projects)/extended-sidebar.tsx

  • ⚠️ L38 Chained array iterations js-combine-iterations
  • ⚠️ L68 Pure function rebuilt every render prefer-module-scope-pure-function

core/components/issues/delete-issue-modal.tsx

  • ⚠️ L45 Derived state stored in an effect no-derived-state-effect

core/components/issues/issue-detail-widgets/relations/content.tsx

  • ⚠️ L109 Chained array iterations js-combine-iterations

core/components/issues/issue-detail-widgets/relations/quick-action-button.tsx

  • ⚠️ L60 Array index used as a key no-array-index-as-key

core/components/issues/issue-detail/issue-activity/activity/actions/relation.tsx

  • ⚠️ L15 Import from a barrel file no-barrel-import

core/components/issues/issue-layouts/kanban/kanban-group.tsx

  • ⚠️ L47 Import from a barrel file no-barrel-import
  • ⚠️ L130 Multiple setState calls in one effect no-cascading-set-state
  • ⚠️ L187 Missing effect dependencies exhaustive-deps
  • ⚠️ L265 Click handler missing keyboard handler click-events-have-key-events
  • ⚠️ L265 Interaction on static element no-static-element-interactions

core/components/issues/issue-layouts/list/headers/group-by-card.tsx

  • ⚠️ L114 Click handler missing keyboard handler click-events-have-key-events
  • ⚠️ L114 Interaction on static element no-static-element-interactions
  • ⚠️ L149 Click handler missing keyboard handler click-events-have-key-events
  • ⚠️ L149 Interaction on static element no-static-element-interactions

core/components/issues/issue-layouts/list/list-group.tsx

  • ⚠️ L38 Import from a barrel file no-barrel-import
  • ⚠️ L135 Click handler missing keyboard handler click-events-have-key-events
  • ⚠️ L135 Interaction on static element no-static-element-interactions
  • ⚠️ L179 Multiple setState calls in one effect no-cascading-set-state
  • ⚠️ L240 Missing effect dependencies exhaustive-deps
  • ⚠️ L242 Missing effect dependencies exhaustive-deps

core/lib/store-context.tsx

  • ⚠️ L12 Non-component export in component file only-export-components
  • ⚠️ L14 Non-component export in component file only-export-components
  • ⚠️ L23 Non-component export in component file only-export-components

Reviewed by React Doctor for commit 27d66d7. See inline comments for fixes.

@makeplane

makeplane Bot commented Jun 19, 2026

Copy link
Copy Markdown

Linked to Plane Work Item(s)

This comment was auto-generated by Plane

@prateekshourya29

Copy link
Copy Markdown
Member

@coderabbitai, review these changes. Most of the files have just been moved, so ignore them and review the rest. We are also cleaning things up as part of this refactor.

@coderabbitai

coderabbitai Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

@prateekshourya29 I'll review the PR and focus on substantive cleanup/refactor changes, ignoring files that were only moved or renamed.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web/core/store/member/workspace/workspace-member.store.ts`:
- Around line 326-327: The optimistic revert snapshot in
workspaceMemberInvitations handling is unsafe because spreading
this.workspaceMemberInvitations?.[workspaceSlug] can throw before the try block
when the list is undefined. Update the snapshot logic in updateMemberInvitation
(and any similar workspace-member mutation paths) to default to an empty array
when the lookup is missing, and remove the no-unsafe-optional-chaining
suppression instead of hiding the issue.

In `@apps/web/core/store/pages/extended-base-page.ts`:
- Around line 16-17: The constructor in extended-base-page.ts uses two separate
oxlint-disable-next-line directives in one comment, so the no-unused-vars
suppression is not applied correctly. Update the suppressing comment on the
ExtendedBasePage constructor to use a single oxlint-disable-next-line directive
with a comma-separated list of rules, and keep it attached to the constructor
declaration so both no-useless-constructor and no-unused-vars are disabled
properly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a52579f7-285c-4398-a5b0-fd569e40c17c

📥 Commits

Reviewing files that changed from the base of the PR and between 00273d8 and 09b373e.

📒 Files selected for processing (81)
  • apps/web/app/(all)/[workspaceSlug]/(projects)/extended-sidebar.tsx
  • apps/web/ce/store/analytics.store.ts
  • apps/web/ce/store/command-palette.store.ts
  • apps/web/ce/store/cycle/index.ts
  • apps/web/ce/store/global-view.store.ts
  • apps/web/ce/store/issue/epic/filter.store.ts
  • apps/web/ce/store/issue/epic/index.ts
  • apps/web/ce/store/issue/epic/issue.store.ts
  • apps/web/ce/store/issue/helpers/base-issue-store.ts
  • apps/web/ce/store/issue/helpers/base-issue.store.ts
  • apps/web/ce/store/issue/helpers/filter-utils.ts
  • apps/web/ce/store/issue/issue-details/root.store.ts
  • apps/web/ce/store/issue/team-project/filter.store.ts
  • apps/web/ce/store/issue/team-project/index.ts
  • apps/web/ce/store/issue/team-project/issue.store.ts
  • apps/web/ce/store/issue/team-views/filter.store.ts
  • apps/web/ce/store/issue/team-views/index.ts
  • apps/web/ce/store/issue/team-views/issue.store.ts
  • apps/web/ce/store/issue/team/filter.store.ts
  • apps/web/ce/store/issue/team/index.ts
  • apps/web/ce/store/issue/team/issue.store.ts
  • apps/web/ce/store/issue/workspace/issue.store.ts
  • apps/web/ce/store/member/project-member.store.ts
  • apps/web/ce/store/power-k.store.ts
  • apps/web/ce/store/project-inbox.store.ts
  • apps/web/ce/store/project-view.store.ts
  • apps/web/ce/store/root.store.ts
  • apps/web/ce/store/state.store.ts
  • apps/web/ce/store/user/permission.store.ts
  • apps/web/ce/store/workspace/index.ts
  • apps/web/core/components/issues/delete-issue-modal.tsx
  • apps/web/core/components/issues/issue-detail-widgets/relations/content.tsx
  • apps/web/core/components/issues/issue-detail-widgets/relations/quick-action-button.tsx
  • apps/web/core/components/issues/issue-detail-widgets/relations/title.tsx
  • apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/relation.tsx
  • apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx
  • apps/web/core/components/issues/issue-layouts/list/headers/group-by-card.tsx
  • apps/web/core/components/issues/issue-layouts/list/list-group.tsx
  • apps/web/core/components/issues/relations/issue-list.tsx
  • apps/web/core/components/project/create/common-attributes.tsx
  • apps/web/core/hooks/store/estimates/use-estimate.ts
  • apps/web/core/hooks/store/use-analytics.ts
  • apps/web/core/hooks/store/use-command-palette.ts
  • apps/web/core/hooks/store/use-cycle.ts
  • apps/web/core/hooks/store/use-global-view.ts
  • apps/web/core/hooks/store/use-issue-detail.ts
  • apps/web/core/hooks/store/use-issues.ts
  • apps/web/core/hooks/store/use-power-k.ts
  • apps/web/core/hooks/store/use-project-inbox.ts
  • apps/web/core/hooks/store/use-project-state.ts
  • apps/web/core/hooks/store/use-project-view.ts
  • apps/web/core/hooks/store/user/user-permissions.ts
  • apps/web/core/hooks/use-timeline-chart.ts
  • apps/web/core/lib/store-context.tsx
  • apps/web/core/store/analytics.store.ts
  • apps/web/core/store/base-command-palette.store.ts
  • apps/web/core/store/base-power-k.store.ts
  • apps/web/core/store/estimates/estimate.ts
  • apps/web/core/store/estimates/project-estimate.store.ts
  • apps/web/core/store/issue/helpers/base-issues.store.ts
  • apps/web/core/store/issue/helpers/issue-filter-helper.store.ts
  • apps/web/core/store/issue/issue-details/activity.store.ts
  • apps/web/core/store/issue/issue-details/root.store.ts
  • apps/web/core/store/issue/root.store.ts
  • apps/web/core/store/member/index.ts
  • apps/web/core/store/member/project/base-project-member.store.ts
  • apps/web/core/store/member/workspace/workspace-member.store.ts
  • apps/web/core/store/pages/base-page.ts
  • apps/web/core/store/pages/extended-base-page.ts
  • apps/web/core/store/pages/project-page.store.ts
  • apps/web/core/store/pages/project-page.ts
  • apps/web/core/store/root.store.ts
  • apps/web/core/store/state.store.ts
  • apps/web/core/store/timeline/base-timeline.store.ts
  • apps/web/core/store/timeline/issues-timeline.store.ts
  • apps/web/core/store/timeline/modules-timeline.store.ts
  • apps/web/core/store/timeline/timeline.store.ts
  • apps/web/core/store/user/base-permissions.store.ts
  • apps/web/core/store/user/index.ts
  • apps/web/core/store/workspace/index.ts
  • apps/web/tsconfig.json
💤 Files with no reviewable changes (33)
  • apps/web/ce/store/analytics.store.ts
  • apps/web/ce/store/issue/team-views/issue.store.ts
  • apps/web/ce/store/issue/helpers/filter-utils.ts
  • apps/web/ce/store/issue/team/filter.store.ts
  • apps/web/ce/store/command-palette.store.ts
  • apps/web/core/store/estimates/estimate.ts
  • apps/web/ce/store/issue/team-views/filter.store.ts
  • apps/web/ce/store/issue/helpers/base-issue-store.ts
  • apps/web/ce/store/root.store.ts
  • apps/web/ce/store/project-inbox.store.ts
  • apps/web/ce/store/issue/team/issue.store.ts
  • apps/web/ce/store/issue/helpers/base-issue.store.ts
  • apps/web/ce/store/issue/epic/issue.store.ts
  • apps/web/ce/store/project-view.store.ts
  • apps/web/ce/store/issue/team-project/filter.store.ts
  • apps/web/ce/store/issue/team-project/index.ts
  • apps/web/ce/store/issue/workspace/issue.store.ts
  • apps/web/ce/store/member/project-member.store.ts
  • apps/web/ce/store/issue/team-views/index.ts
  • apps/web/ce/store/workspace/index.ts
  • apps/web/ce/store/state.store.ts
  • apps/web/ce/store/power-k.store.ts
  • apps/web/core/components/issues/delete-issue-modal.tsx
  • apps/web/ce/store/issue/team/index.ts
  • apps/web/ce/store/user/permission.store.ts
  • apps/web/ce/store/issue/epic/filter.store.ts
  • apps/web/ce/store/issue/epic/index.ts
  • apps/web/ce/store/issue/team-project/issue.store.ts
  • apps/web/ce/store/global-view.store.ts
  • apps/web/ce/store/issue/issue-details/root.store.ts
  • apps/web/tsconfig.json
  • apps/web/ce/store/cycle/index.ts
  • apps/web/core/components/issues/relations/issue-list.tsx

Comment thread apps/web/core/store/member/workspace/workspace-member.store.ts Outdated
Comment thread apps/web/core/store/pages/extended-base-page.ts Outdated
Comment thread apps/web/core/components/issues/issue-layouts/list/list-group.tsx
import { useTimeLineRelationOptions } from "@/components/relations";
import type { TIssueRelationTypes } from "@plane/types";
// local helpers
import { IssueActivityBlockComponent } from "./";

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

React Doctor · react-doctor/no-barrel-import (warning)

This ships extra code to your users & slows page load. Import directly from "./helpers/activity-block".

Fix → Import from the direct path: import { Button } from './components/Button' instead of ./components

Docs

// local imports
import { GroupDragOverlay } from "../group-drag-overlay";
import type { TRenderQuickActions } from "../list/list-view-types";
import { KanbanQuickAddIssueButton, QuickAddIssueRoot } from "../quick-add";

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

React Doctor · react-doctor/no-barrel-import (warning)

This ships extra code to your users & slows page load. Import directly from: "../quick-add/button/kanban", "../quick-add/root".

Fix → Import from the direct path: import { Button } from './components/Button' instead of ./components

Docs

//
// local imports
import { GroupDragOverlay } from "../group-drag-overlay";
import { ListQuickAddIssueButton, QuickAddIssueRoot } from "../quick-add";

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

React Doctor · react-doctor/no-barrel-import (warning)

This ships extra code to your users & slows page load. Import directly from: "../quick-add/button/list", "../quick-add/root".

Fix → Import from the direct path: import { Button } from './components/Button' instead of ./components

Docs

import { RootStore } from "@/plane-web/store/root.store";
import { RootStore } from "@/store/root.store";

export let rootStore = new RootStore();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

React Doctor · react-doctor/only-export-components (warning)

This file exports non-components, so Fast Refresh can't safely preserve component state.

Fix → Move non-component exports out of component files so Fast Refresh can preserve component state instead of full-reloading.

Docs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants