Skip to content

Comments

[WEB-4320] refactor: migrate emoji reactions to propel#8039

Merged
pushya22 merged 18 commits intopreviewfrom
refactor-emoji-reaction-propel-migration
Nov 6, 2025
Merged

[WEB-4320] refactor: migrate emoji reactions to propel#8039
pushya22 merged 18 commits intopreviewfrom
refactor-emoji-reaction-propel-migration

Conversation

@anmolsinghbhatia
Copy link
Collaborator

@anmolsinghbhatia anmolsinghbhatia commented Oct 30, 2025

📦 Summary

Migrates all emoji reaction components from custom implementations to @plane/propel/emoji-reaction, providing enhanced UI/UX with animated counters, better tooltips, and consistent styling across web and space applications.

🎯 Motivation

  • Centralization: Make @plane/propel the single source of truth for emoji reaction components
  • Consistency: Unify emoji reaction UI/UX across web app and space app
  • Enhancement: Leverage Propel's built-in features (animated counters, formatted tooltips, reacted state highlighting)
  • Deduplication: Remove duplicate ReactionSelector implementations in both web and space apps
  • Maintainability: Single component to update instead of maintaining multiple implementations
  • Better UX: Search-enabled emoji picker, smooth animations, and improved accessibility

🔄 Changes

Web App (apps/web)

  • IssueReaction (3 files): Migrated issue reactions to EmojiReactionGroup + EmojiReactionPicker
    • issue-detail/reactions/issue.tsx - Issue emoji reactions
    • issue-detail/reactions/issue-comment.tsx - Comment emoji reactions
    • comments/comment-reaction.tsx - Activity comment reactions
  • Cleanup: Deleted ReactionSelector component and updated exports

Space App (apps/space)

  • IssueEmojiReactions (2 files): Migrated public workspace reactions to Propel components
    • issues/reactions/issue-emoji-reactions.tsx - Public issue reactions
    • peek-overview/comment/comment-reactions.tsx - Public comment reactions
  • Cleanup: Deleted ReactionSelector from UI components and updated exports

Propel Package (packages/propel)

  • AddReactionIcon: Created new icon component (smiley + plus) for emoji picker button
  • Icon Registry: Added AddReactionIcon to actions icon map
  • Internal Imports: Fixed relative icon imports in calendar, menu, and emoji-picker components
  • UX Polish: Removed hover scale animation from reaction button for consistency
  • Bug Fix: Removed duplicate @plane/propel dependency from editor/package.json

🌄 Media

Before After
before after
Screenshot
ss1
ss2
ss3

✅ Outcome

  • Single source: All emoji reactions now use @plane/propel/emoji-reaction
  • Enhanced UX: Animated counters, formatted tooltips, reacted state highlighting
  • Code reduction: Net -109 lines of code across 15 files
  • Zero breaking changes: 100% backward compatible (pure refactor)
  • Preserved functionality: All features work identically (add/remove reactions, tooltips, auth checks, iframe detection)
  • Build verified: ✅ Type checks pass, ✅ Builds successful
  • Data compatibility: Emoji storage format unchanged (decimal strings like "128077")

Summary by CodeRabbit

  • New Features

    • Unified picker-driven emoji reactions: single compact add‑reaction picker replaces per‑reaction buttons across comments and issues.
  • Refactor

    • Standardized logo and emoji picker usage across the app for consistent visuals.
    • Updated reaction visuals and add‑reaction icon for a more uniform appearance.
  • Chores

    • Consolidated emoji/logo exports into a shared package and removed legacy picker helpers/components.

@makeplane
Copy link

makeplane bot commented Oct 30, 2025

Linked to Plane Work Item(s)

This comment was auto-generated by Plane

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 30, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Refactors reaction UIs to use Propel's EmojiReactionPicker/EmojiReactionGroup, removes legacy ReactionSelector and many @plane/ui emoji picker modules, migrates Logo and picker imports to @plane/propel/emoji-icon-picker, and standardizes emoji payload handling as decimal-string across components.

Changes

Cohort / File(s) Summary
Reaction UI Refactor
apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx, apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx, apps/web/core/components/comments/comment-reaction.tsx, apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx, apps/web/core/components/issues/issue-detail/reactions/issue.tsx
Replaced per-reaction buttons/Tooltip UIs with EmojiReactionPicker + EmojiReactionGroup; added isPickerOpen state, memoized mapping to EmojiReactionType[], and unified handlers converting emoji to decimal-string payloads; preserved unauthenticated routing logic.
Removed ReactionSelector(s)
apps/space/core/components/ui/reaction-selector.tsx, apps/web/core/components/issues/issue-detail/reactions/reaction-selector.tsx
Deleted Popover-based ReactionSelector components and associated selection UI.
UI barrel & exports
apps/space/core/components/ui/index.ts, apps/web/core/components/issues/issue-detail/reactions/index.ts, packages/ui/src/index.ts
Removed legacy re-exports of reaction/emoji modules; adjusted reaction index (removed reaction-selector, restored/exported issue-comment).
Logo import migration (many files)
apps/web/.../*.tsx (23+ files; examples: apps/web/ce/components/breadcrumbs/project.tsx, apps/web/core/components/analytics/*, apps/web/core/components/home/*, apps/web/core/components/project/*, apps/web/core/components/views/*, apps/web/core/components/workspace/*, etc.)
Replaced local or @plane/ui Logo imports with import { Logo } from "@plane/propel/emoji-icon-picker" across numerous components; usage unchanged.
Emoji picker migration & usage changes
apps/web/core/components/pages/editor/header/logo-picker.tsx, apps/web/core/components/pages/editor/header/root.tsx, apps/web/core/components/pages/modals/page-form.tsx, apps/web/core/components/project/form.tsx, apps/web/core/components/views/form.tsx, apps/web/core/components/pages/editor/header/root.tsx
Replaced old EmojiIconPicker with EmojiPicker from @plane/propel/emoji-icon-picker; consolidated picker/type imports and changed emoji handling to use raw decimal-string with url = undefined for emoji logos.
Store & editor type updates
apps/web/core/store/pages/base-page.ts, packages/editor/src/core/extensions/callout/logo-selector.tsx, packages/editor/src/core/extensions/callout/utils.ts
Updated types and flows: switched to new logo types (e.g., TLogoProps/moved TChangeHandlerProps), removed convertHexEmojiToDecimal usage, and adjusted how emoji/logo values are serialized and stored.
Propel emoji/icon additions & tweaks
packages/propel/src/emoji-icon-picker/*, packages/propel/src/emoji-reaction/*, packages/propel/src/icons/*, packages/propel/src/animated-counter/animated-counter.tsx
Added logo re-export, adjusted local helper imports, added AddReactionIcon, registered it in icon registry/constants, removed size props from emoji-reaction components, and updated some styling and icon import paths.
Deleted UI emoji ecosystem
packages/ui/src/emoji/* (many files: emoji-icon-helper.tsx, emoji-icon-picker-new.tsx, emoji-icon-picker.tsx, helpers.ts, icons-list.tsx, logo.tsx, lucide-icons-list.tsx)
Removed legacy emoji/icon picker components, helpers, icon lists, and Logo implementation from @plane/ui; removed emoji-picker-react dependency from packages/ui/package.json.
Misc / Other
packages/editor/package.json, packages/propel/src/calendar/root.tsx, apps/space/.../issue-layouts/kanban/block-reactions.tsx, storybook updates, etc.
Minor dependency ordering, import path adjustments, call-site updates removing now-removed size prop, and Storybook args additions/cleanup.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant CommentUI
    participant EmojiPicker
    participant API
    participant Auth

    User->>CommentUI: open reactions UI
    CommentUI->>EmojiPicker: render label (EmojiReactionGroup) + control
    User->>EmojiPicker: click/select emoji
    alt authenticated
        EmojiPicker->>CommentUI: onChange / onReactionClick (emoji)
        CommentUI->>CommentUI: normalize emoji -> decimal-string
        CommentUI->>API: POST reaction with decimal-string
        API-->>CommentUI: success
        CommentUI->>User: updated reactions
    else unauthenticated
        EmojiPicker->>CommentUI: interaction
        CommentUI->>Auth: navigate to login/next_path
    end
Loading
sequenceDiagram
    participant Editor
    participant OldPicker as Old EmojiIconPicker
    participant NewPicker as Propel EmojiPicker
    participant Store

    Editor->>OldPicker: (old) returned unified hex
    OldPicker-->>Editor: unified hex
    Editor->>Editor: convertHexEmojiToDecimal(unified) -> decimal + imageUrl
    Editor->>Store: update logo { value: decimal, url: imageUrl }

    Editor->>NewPicker: (new) returns decimal-string
    NewPicker-->>Editor: { value: decimalString }
    Editor->>Editor: use raw value.value, set url = undefined
    Editor->>Store: update logo { value: decimalString, url: undefined }
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

  • Large coordinated refactor touching many files, public API surface changes (exports removed/added), and type/value-shape migrations.
  • Focus review on:
    • Reaction handlers and decimal-string conversions in reaction components.
    • Store/editor flows that serialize logo values (ensure no regressions).
    • Exports from @plane/propel/emoji-icon-picker (Logo, EmojiPicker, types) and removal of @plane/ui emoji exports.
    • Emoji-reaction component API changes (size prop removal) and call-site updates.

Possibly related PRs

Suggested labels

🌐frontend, 🌟improvement, ready to merge

Suggested reviewers

  • prateekshourya29

Poem

🐰 I nibbled old pickers, soft and slow,

New Propel hops in — a brighter glow,
Logos leapt lanes, reactions found their song,
AddReaction chimed, the icons moved along,
A rabbit cheers this tidy refactor, strong!

Pre-merge checks and finishing touches

✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The PR title '[WEB-4320] refactor: migrate emoji reactions to propel' is clear, concise, and directly summarizes the main change in the changeset. It accurately captures that this is a refactoring effort focused on migrating emoji reaction components to use the @plane/propel package. The title includes the ticket identifier and is specific enough for developers to understand the primary purpose without needing to read the full description.
Description check ✅ Passed The PR description is comprehensive and well-structured. It includes: a detailed summary of the migration, clear motivation for the changes, organized breakdown of changes across web app, space app, and propel package, before/after screenshots, and outcomes highlighting the benefits. The description follows the repository template with sections covering Type of Change (code refactoring), motivation, detailed changes, media, and outcomes. All key information is present and clearly articulated.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor-emoji-reaction-propel-migration

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 93c5418 and 3a58bb1.

📒 Files selected for processing (1)
  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx (4 hunks)
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx
📚 Learning: 2025-10-21T17:22:05.204Z
Learnt from: lifeiscontent
Repo: makeplane/plane PR: 7989
File: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx:45-46
Timestamp: 2025-10-21T17:22:05.204Z
Learning: In the makeplane/plane repository, the refactor from useParams() to params prop is specifically scoped to page.tsx and layout.tsx files in apps/web/app (Next.js App Router pattern). Other components (hooks, regular client components, utilities) should continue using the useParams() hook as that is the correct pattern for non-route components.

Applied to files:

  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx
📚 Learning: 2025-09-02T08:14:49.260Z
Learnt from: sriramveeraghanta
Repo: makeplane/plane PR: 7697
File: apps/web/app/(all)/[workspaceSlug]/(projects)/header.tsx:12-13
Timestamp: 2025-09-02T08:14:49.260Z
Learning: The star-us-link.tsx file in apps/web/app/(all)/[workspaceSlug]/(projects)/ already has "use client" directive at the top, making it a proper Client Component for hook usage.

Applied to files:

  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx
🧬 Code graph analysis (1)
apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx (1)
packages/propel/src/emoji-icon-picker/helper.tsx (1)
  • stringToEmoji (143-154)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Build and lint web apps
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (3)
apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx (3)

41-47: Previous issue resolved: guard against missing peek details.

The guard for details[peekId] has been properly implemented, preventing the TypeError mentioned in the previous review. The code now safely returns an empty array when peek details are not yet loaded.


105-110: Previous issue resolved: undefined code points filtered.

The undefined handling from codePointAt(0) has been properly implemented with a type guard on line 107. While an empty emojiCodePoints array would result in an empty string being passed to the API (edge case for invalid emojis), this is acceptable since valid emojis always produce code points and the API would reject malformed payloads gracefully.


121-139: Clean Propel migration with correct prop wiring.

The refactoring successfully migrates to Propel's EmojiReactionPicker and EmojiReactionGroup components. The component hierarchy is well-structured with the reaction group serving as the picker's label, and all interactive callbacks are correctly wired to maintain the existing functionality (authentication checks, iframe detection, add/remove reactions).


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 and usage tips.

@anmolsinghbhatia anmolsinghbhatia marked this pull request as ready for review October 30, 2025 10:16
Copilot AI review requested due to automatic review settings October 30, 2025 10:16
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR removes the emoji-picker-react dependency and associated emoji functionality from the @plane/ui package, consolidating emoji picker capabilities in the @plane/propel package. It also introduces new emoji reaction components using Propel's design system.

Key changes:

  • Removed emoji-picker-react dependency and all emoji-related exports from @plane/ui package
  • Updated emoji conversion to use decimal string format instead of convertHexEmojiToDecimal utility
  • Replaced custom ReactionSelector components with new Propel EmojiReactionGroup and EmojiReactionPicker components
  • Added new AddReactionIcon to the Propel icon set

Reviewed Changes

Copilot reviewed 62 out of 63 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
packages/ui/package.json Removed emoji-picker-react dependency
packages/ui/src/emoji/* Deleted all emoji-related components from ui package
packages/propel/src/icons/actions/add-reaction-icon.tsx Added new AddReactionIcon component
packages/propel/src/emoji-reaction/* Updated to use decimal emoji string format
packages/editor/src/core/extensions/callout/* Updated to use TLogoProps from types package and new emoji format
apps/web/core/components/issues/issue-detail/reactions/* Migrated to Propel emoji reaction components
apps/web/core/store/pages/base-page.ts Updated emoji handling to use decimal format directly
apps/space/core/components/issues/reactions/* Migrated to Propel emoji reaction components
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx (1)

62-70: Await the removal API call to keep error handling intact

The removeCommentReaction promise is no longer awaited, so the try/catch never sees failures and we still show a success toast even if the API rejects (plus the rejection becomes unhandled). Please restore the await so errors propagate correctly.

-          removeCommentReaction(workspaceSlug, projectId, commentId, reaction, currentUser.id);
+          await removeCommentReaction(workspaceSlug, projectId, commentId, reaction, currentUser.id);
🧹 Nitpick comments (1)
apps/web/ce/components/breadcrumbs/project.tsx (1)

29-30: Remove orphaned comment.

The comment // store hooks on line 29 has no associated code below it and appears to be leftover from a previous refactor.

Apply this diff to remove the orphaned comment:

   const currentProjectDetails = getPartialProjectById(projectId);
-
-  // store hooks
-
+
   if (!currentProjectDetails) return null;
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e8bdc47 and 15fced3.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (62)
  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx (3 hunks)
  • apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx (3 hunks)
  • apps/space/core/components/ui/index.ts (0 hunks)
  • apps/space/core/components/ui/reaction-selector.tsx (0 hunks)
  • apps/web/ce/components/breadcrumbs/project.tsx (1 hunks)
  • apps/web/ce/hooks/work-item-filters/use-work-item-filters-config.tsx (2 hunks)
  • apps/web/core/components/analytics/overview/active-project-item.tsx (1 hunks)
  • apps/web/core/components/analytics/select/project.tsx (1 hunks)
  • apps/web/core/components/analytics/work-items/workitems-insight-table.tsx (1 hunks)
  • apps/web/core/components/comments/comment-reaction.tsx (2 hunks)
  • apps/web/core/components/common/switcher-label.tsx (1 hunks)
  • apps/web/core/components/cycles/list/cycle-list-project-group-header.tsx (1 hunks)
  • apps/web/core/components/dropdowns/project/base.tsx (1 hunks)
  • apps/web/core/components/home/widgets/recents/page.tsx (1 hunks)
  • apps/web/core/components/home/widgets/recents/project.tsx (1 hunks)
  • apps/web/core/components/issues/issue-detail/reactions/index.ts (1 hunks)
  • apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx (4 hunks)
  • apps/web/core/components/issues/issue-detail/reactions/issue.tsx (4 hunks)
  • apps/web/core/components/issues/issue-detail/reactions/reaction-selector.tsx (0 hunks)
  • apps/web/core/components/issues/issue-layouts/filters/applied-filters/project.tsx (1 hunks)
  • apps/web/core/components/issues/issue-layouts/filters/header/filters/project.tsx (1 hunks)
  • apps/web/core/components/issues/issue-layouts/utils.tsx (1 hunks)
  • apps/web/core/components/pages/editor/header/logo-picker.tsx (2 hunks)
  • apps/web/core/components/pages/editor/header/root.tsx (2 hunks)
  • apps/web/core/components/pages/list/block.tsx (1 hunks)
  • apps/web/core/components/pages/modals/page-form.tsx (3 hunks)
  • apps/web/core/components/power-k/menus/projects.tsx (1 hunks)
  • apps/web/core/components/profile/sidebar.tsx (1 hunks)
  • apps/web/core/components/project/card.tsx (1 hunks)
  • apps/web/core/components/project/create/header.tsx (1 hunks)
  • apps/web/core/components/project/form.tsx (1 hunks)
  • apps/web/core/components/project/multi-select-modal.tsx (1 hunks)
  • apps/web/core/components/project/project-feature-update.tsx (1 hunks)
  • apps/web/core/components/settings/project/sidebar/root.tsx (1 hunks)
  • apps/web/core/components/views/form.tsx (1 hunks)
  • apps/web/core/components/views/view-list-item.tsx (1 hunks)
  • apps/web/core/components/workspace/sidebar/favorites/favorite-items/common/helper.tsx (1 hunks)
  • apps/web/core/components/workspace/sidebar/projects-list-item.tsx (1 hunks)
  • apps/web/core/store/pages/base-page.ts (2 hunks)
  • packages/editor/package.json (1 hunks)
  • packages/editor/src/core/extensions/callout/logo-selector.tsx (4 hunks)
  • packages/editor/src/core/extensions/callout/utils.ts (3 hunks)
  • packages/propel/src/calendar/root.tsx (1 hunks)
  • packages/propel/src/emoji-icon-picker/index.ts (1 hunks)
  • packages/propel/src/emoji-icon-picker/logo.tsx (1 hunks)
  • packages/propel/src/emoji-icon-picker/lucide-icons.tsx (1 hunks)
  • packages/propel/src/emoji-reaction/emoji-reaction.tsx (3 hunks)
  • packages/propel/src/icons/actions/add-reaction-icon.tsx (1 hunks)
  • packages/propel/src/icons/actions/index.ts (1 hunks)
  • packages/propel/src/icons/constants.tsx (1 hunks)
  • packages/propel/src/icons/registry.ts (2 hunks)
  • packages/propel/src/menu/menu.tsx (1 hunks)
  • packages/ui/package.json (0 hunks)
  • packages/ui/src/emoji/emoji-icon-helper.tsx (0 hunks)
  • packages/ui/src/emoji/emoji-icon-picker-new.tsx (0 hunks)
  • packages/ui/src/emoji/emoji-icon-picker.tsx (0 hunks)
  • packages/ui/src/emoji/helpers.ts (0 hunks)
  • packages/ui/src/emoji/icons-list.tsx (0 hunks)
  • packages/ui/src/emoji/index.ts (0 hunks)
  • packages/ui/src/emoji/logo.tsx (0 hunks)
  • packages/ui/src/emoji/lucide-icons-list.tsx (0 hunks)
  • packages/ui/src/index.ts (0 hunks)
💤 Files with no reviewable changes (13)
  • packages/ui/src/index.ts
  • apps/space/core/components/ui/index.ts
  • packages/ui/src/emoji/emoji-icon-picker-new.tsx
  • packages/ui/src/emoji/icons-list.tsx
  • packages/ui/package.json
  • apps/web/core/components/issues/issue-detail/reactions/reaction-selector.tsx
  • packages/ui/src/emoji/index.ts
  • packages/ui/src/emoji/emoji-icon-picker.tsx
  • apps/space/core/components/ui/reaction-selector.tsx
  • packages/ui/src/emoji/lucide-icons-list.tsx
  • packages/ui/src/emoji/helpers.ts
  • packages/ui/src/emoji/emoji-icon-helper.tsx
  • packages/ui/src/emoji/logo.tsx
🧰 Additional context used
🧠 Learnings (13)
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
PR: makeplane/plane#7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • packages/propel/src/emoji-reaction/emoji-reaction.tsx
  • packages/propel/src/calendar/root.tsx
  • apps/web/core/components/power-k/menus/projects.tsx
  • apps/web/ce/components/breadcrumbs/project.tsx
  • apps/web/core/components/pages/editor/header/logo-picker.tsx
  • apps/web/core/components/common/switcher-label.tsx
  • apps/web/core/components/profile/sidebar.tsx
  • apps/web/core/components/analytics/select/project.tsx
  • apps/web/core/components/issues/issue-layouts/utils.tsx
  • apps/web/core/components/project/create/header.tsx
  • apps/web/core/components/project/project-feature-update.tsx
  • apps/web/ce/hooks/work-item-filters/use-work-item-filters-config.tsx
  • apps/web/core/components/issues/issue-detail/reactions/issue.tsx
  • apps/web/core/components/analytics/work-items/workitems-insight-table.tsx
  • packages/editor/src/core/extensions/callout/utils.ts
  • apps/web/core/components/home/widgets/recents/project.tsx
  • apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx
  • apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx
  • apps/web/core/components/issues/issue-layouts/filters/applied-filters/project.tsx
  • apps/web/core/components/analytics/overview/active-project-item.tsx
  • apps/web/core/components/settings/project/sidebar/root.tsx
  • apps/web/core/components/dropdowns/project/base.tsx
  • apps/web/core/components/views/view-list-item.tsx
  • packages/editor/src/core/extensions/callout/logo-selector.tsx
  • apps/web/core/components/project/form.tsx
  • packages/propel/src/emoji-icon-picker/logo.tsx
  • apps/web/core/components/cycles/list/cycle-list-project-group-header.tsx
  • apps/web/core/components/pages/editor/header/root.tsx
  • packages/propel/src/menu/menu.tsx
  • apps/web/core/components/workspace/sidebar/projects-list-item.tsx
  • apps/web/core/store/pages/base-page.ts
  • apps/web/core/components/comments/comment-reaction.tsx
  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx
  • apps/web/core/components/pages/list/block.tsx
  • apps/web/core/components/pages/modals/page-form.tsx
📚 Learning: 2025-10-09T22:12:26.424Z
Learnt from: lifeiscontent
PR: makeplane/plane#7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T22:12:26.424Z
Learning: When `types/react` is installed in a TypeScript project (which is standard for React + TypeScript codebases), React types (React.FC, React.ReactNode, React.ComponentProps, etc.) are globally available by design. These type annotations can and should be used without explicitly importing the React namespace. This is a TypeScript/DefinitelyTyped feature, not codebase-specific configuration.

Applied to files:

  • packages/propel/src/emoji-reaction/emoji-reaction.tsx
  • apps/web/core/components/power-k/menus/projects.tsx
  • apps/web/core/components/issues/issue-detail/reactions/issue.tsx
  • apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx
  • apps/web/core/components/comments/comment-reaction.tsx
  • apps/web/core/components/pages/list/block.tsx
📚 Learning: 2025-10-01T15:30:17.605Z
Learnt from: lifeiscontent
PR: makeplane/plane#7888
File: packages/propel/src/avatar/avatar.stories.tsx:2-3
Timestamp: 2025-10-01T15:30:17.605Z
Learning: In the makeplane/plane repository, avoid suggesting inline type imports (e.g., `import { Avatar, type TAvatarSize }`) due to bundler compatibility issues. Keep type imports and value imports as separate statements.

Applied to files:

  • apps/web/core/components/project/multi-select-modal.tsx
  • apps/web/core/components/power-k/menus/projects.tsx
  • apps/web/ce/components/breadcrumbs/project.tsx
  • apps/web/core/components/home/widgets/recents/page.tsx
  • apps/web/core/components/pages/editor/header/logo-picker.tsx
  • apps/web/core/components/common/switcher-label.tsx
  • apps/web/core/components/views/form.tsx
  • apps/web/core/components/profile/sidebar.tsx
  • apps/web/core/components/analytics/select/project.tsx
  • apps/web/core/components/issues/issue-layouts/utils.tsx
  • apps/web/core/components/issues/issue-layouts/filters/header/filters/project.tsx
  • apps/web/core/components/project/create/header.tsx
  • apps/web/core/components/project/project-feature-update.tsx
  • apps/web/ce/hooks/work-item-filters/use-work-item-filters-config.tsx
  • apps/web/core/components/workspace/sidebar/favorites/favorite-items/common/helper.tsx
  • apps/web/core/components/analytics/work-items/workitems-insight-table.tsx
  • packages/editor/src/core/extensions/callout/utils.ts
  • apps/web/core/components/home/widgets/recents/project.tsx
  • apps/web/core/components/analytics/overview/active-project-item.tsx
  • apps/web/core/components/settings/project/sidebar/root.tsx
  • apps/web/core/components/dropdowns/project/base.tsx
  • apps/web/core/components/views/view-list-item.tsx
  • packages/editor/src/core/extensions/callout/logo-selector.tsx
  • apps/web/core/components/project/form.tsx
  • packages/propel/src/emoji-icon-picker/logo.tsx
  • apps/web/core/components/pages/editor/header/root.tsx
  • apps/web/core/components/workspace/sidebar/projects-list-item.tsx
  • apps/web/core/store/pages/base-page.ts
  • packages/editor/package.json
  • apps/web/core/components/pages/list/block.tsx
  • apps/web/core/components/project/card.tsx
  • apps/web/core/components/pages/modals/page-form.tsx
📚 Learning: 2025-05-14T13:16:23.323Z
Learnt from: vamsikrishnamathala
PR: makeplane/plane#7061
File: web/core/components/workspace-notifications/root.tsx:18-18
Timestamp: 2025-05-14T13:16:23.323Z
Learning: In the Plane project codebase, the path alias `@/plane-web` resolves to the `ce` directory, making imports like `@/plane-web/hooks/use-notification-preview` correctly resolve to files in `web/ce/hooks/`.

Applied to files:

  • apps/web/core/components/power-k/menus/projects.tsx
  • apps/web/ce/components/breadcrumbs/project.tsx
  • apps/web/core/components/common/switcher-label.tsx
  • apps/web/core/components/profile/sidebar.tsx
  • apps/web/core/components/analytics/select/project.tsx
  • apps/web/core/components/issues/issue-layouts/utils.tsx
  • apps/web/core/components/issues/issue-layouts/filters/header/filters/project.tsx
  • apps/web/core/components/project/create/header.tsx
  • apps/web/core/components/project/project-feature-update.tsx
  • apps/web/ce/hooks/work-item-filters/use-work-item-filters-config.tsx
  • apps/web/core/components/analytics/work-items/workitems-insight-table.tsx
  • apps/web/core/components/analytics/overview/active-project-item.tsx
  • apps/web/core/components/settings/project/sidebar/root.tsx
  • apps/web/core/components/dropdowns/project/base.tsx
  • apps/web/core/components/project/form.tsx
  • apps/web/core/components/workspace/sidebar/projects-list-item.tsx
  • packages/editor/package.json
  • apps/web/core/components/project/card.tsx
📚 Learning: 2025-10-21T17:22:05.204Z
Learnt from: lifeiscontent
PR: makeplane/plane#7989
File: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx:45-46
Timestamp: 2025-10-21T17:22:05.204Z
Learning: In the makeplane/plane repository, the refactor from useParams() to params prop is specifically scoped to page.tsx and layout.tsx files in apps/web/app (Next.js App Router pattern). Other components (hooks, regular client components, utilities) should continue using the useParams() hook as that is the correct pattern for non-route components.

Applied to files:

  • apps/web/core/components/power-k/menus/projects.tsx
  • apps/web/ce/components/breadcrumbs/project.tsx
  • apps/web/core/components/home/widgets/recents/page.tsx
  • apps/web/core/components/pages/editor/header/logo-picker.tsx
  • apps/web/core/components/views/form.tsx
  • apps/web/core/components/profile/sidebar.tsx
  • apps/web/core/components/analytics/select/project.tsx
  • apps/web/core/components/issues/issue-layouts/utils.tsx
  • apps/web/core/components/project/create/header.tsx
  • apps/web/core/components/project/project-feature-update.tsx
  • apps/web/core/components/analytics/work-items/workitems-insight-table.tsx
  • apps/web/core/components/home/widgets/recents/project.tsx
  • apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx
  • apps/web/core/components/settings/project/sidebar/root.tsx
  • apps/web/core/components/dropdowns/project/base.tsx
  • apps/web/core/components/views/view-list-item.tsx
  • apps/web/core/components/project/form.tsx
  • apps/web/core/components/workspace/sidebar/projects-list-item.tsx
  • apps/web/core/store/pages/base-page.ts
  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx
  • apps/web/core/components/pages/list/block.tsx
  • apps/web/core/components/project/card.tsx
  • apps/web/core/components/pages/modals/page-form.tsx
📚 Learning: 2025-06-18T09:46:08.566Z
Learnt from: prateekshourya29
PR: makeplane/plane#7188
File: web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/header.tsx:40-45
Timestamp: 2025-06-18T09:46:08.566Z
Learning: When reviewing breadcrumb components that accept projectId or similar props, check if empty strings are being passed during loading states, which can result in invalid URLs. The preferred approach is to handle these loading states internally within the component rather than requiring each consumer to manage the loading logic.

Applied to files:

  • apps/web/ce/components/breadcrumbs/project.tsx
📚 Learning: 2025-09-02T08:14:49.260Z
Learnt from: sriramveeraghanta
PR: makeplane/plane#7697
File: apps/web/app/(all)/[workspaceSlug]/(projects)/header.tsx:12-13
Timestamp: 2025-09-02T08:14:49.260Z
Learning: The star-us-link.tsx file in apps/web/app/(all)/[workspaceSlug]/(projects)/ already has "use client" directive at the top, making it a proper Client Component for hook usage.

Applied to files:

  • apps/web/ce/components/breadcrumbs/project.tsx
  • apps/web/core/components/profile/sidebar.tsx
  • apps/web/core/components/analytics/select/project.tsx
  • apps/web/core/components/workspace/sidebar/favorites/favorite-items/common/helper.tsx
  • apps/web/core/components/analytics/work-items/workitems-insight-table.tsx
  • apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx
  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx
📚 Learning: 2025-01-24T09:37:19.339Z
Learnt from: mathalav55
PR: makeplane/plane#6452
File: web/helpers/issue.helper.ts:6-6
Timestamp: 2025-01-24T09:37:19.339Z
Learning: In the Plane codebase, `ISSUE_DISPLAY_FILTERS_BY_LAYOUT` and `ISSUE_DISPLAY_FILTERS_BY_PAGE` are two distinct constants serving different purposes - one for layout-level filters and another for page-level filters. They are not interchangeable and should coexist.

Applied to files:

  • apps/web/core/components/views/form.tsx
📚 Learning: 2025-10-09T20:43:07.762Z
Learnt from: lifeiscontent
PR: makeplane/plane#7922
File: apps/admin/core/components/new-user-popup.tsx:4-6
Timestamp: 2025-10-09T20:43:07.762Z
Learning: The `next-themes` library is React-compatible and can be used outside of Next.js applications. It's not Next.js-specific despite its name.

Applied to files:

  • apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx
📚 Learning: 2025-10-06T01:44:38.472Z
Learnt from: lifeiscontent
PR: makeplane/plane#7888
File: packages/propel/src/collapsible/collapsible.stories.tsx:4-4
Timestamp: 2025-10-06T01:44:38.472Z
Learning: In Storybook v9, imports use bare paths instead of scoped packages. For example, `import { useArgs } from "storybook/preview-api"` is correct (not `storybook/preview-api`). This applies to other Storybook modules as well - the scoped storybook/* packages were consolidated into bare "storybook/*" imports.

Applied to files:

  • apps/web/core/components/project/form.tsx
📚 Learning: 2024-11-28T07:02:54.664Z
Learnt from: mathalav55
PR: makeplane/plane#6107
File: web/ce/components/workspace-notifications/sidebar/notification-card/options/archive.tsx:11-14
Timestamp: 2024-11-28T07:02:54.664Z
Learning: When components are still located in `core`, it's appropriate for files to import them using `@/components/...`, and the migration to the new import paths is not necessary in such cases.

Applied to files:

  • apps/web/core/components/project/form.tsx
  • apps/web/core/components/project/card.tsx
📚 Learning: 2025-03-11T19:42:41.769Z
Learnt from: janreges
PR: makeplane/plane#6743
File: packages/i18n/src/store/index.ts:160-161
Timestamp: 2025-03-11T19:42:41.769Z
Learning: In the Plane project, the file 'packages/i18n/src/store/index.ts' already includes support for Polish language translations with the case "pl".

Applied to files:

  • apps/web/core/components/project/form.tsx
📚 Learning: 2025-08-29T08:45:15.953Z
Learnt from: sriramveeraghanta
PR: makeplane/plane#7672
File: pnpm-workspace.yaml:8-9
Timestamp: 2025-08-29T08:45:15.953Z
Learning: The makeplane/plane repository uses pnpm v10.12.1, which supports onlyBuiltDependencies configuration in pnpm-workspace.yaml files.

Applied to files:

  • packages/editor/package.json
🧬 Code graph analysis (13)
packages/propel/src/emoji-reaction/emoji-reaction.tsx (1)
packages/propel/src/icons/actions/add-reaction-icon.tsx (1)
  • AddReactionIcon (6-21)
packages/propel/src/icons/constants.tsx (1)
packages/propel/src/icons/icon.tsx (1)
  • Icon (10-13)
apps/web/core/components/pages/editor/header/logo-picker.tsx (1)
packages/propel/src/emoji-icon-picker/emoji-picker.tsx (1)
  • EmojiPicker (10-136)
packages/propel/src/icons/actions/add-reaction-icon.tsx (1)
packages/propel/src/icons/icon-wrapper.tsx (1)
  • IconWrapper (11-42)
packages/propel/src/icons/registry.ts (1)
packages/propel/src/icons/actions/add-reaction-icon.tsx (1)
  • AddReactionIcon (6-21)
apps/web/core/components/issues/issue-detail/reactions/issue.tsx (1)
packages/propel/src/emoji-icon-picker/helper.tsx (1)
  • stringToEmoji (143-154)
apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx (1)
packages/propel/src/emoji-icon-picker/helper.tsx (1)
  • stringToEmoji (143-154)
apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx (1)
packages/propel/src/emoji-icon-picker/helper.tsx (1)
  • stringToEmoji (143-154)
packages/editor/src/core/extensions/callout/logo-selector.tsx (2)
packages/propel/src/emoji-icon-picker/emoji-picker.tsx (1)
  • EmojiPicker (10-136)
packages/editor/src/core/extensions/callout/utils.ts (1)
  • DEFAULT_CALLOUT_BLOCK_ATTRIBUTES (12-20)
apps/web/core/components/pages/editor/header/root.tsx (1)
packages/propel/src/emoji-icon-picker/emoji-picker.tsx (1)
  • EmojiPicker (10-136)
apps/web/core/components/comments/comment-reaction.tsx (1)
packages/propel/src/emoji-icon-picker/helper.tsx (1)
  • stringToEmoji (143-154)
apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx (1)
packages/propel/src/emoji-icon-picker/helper.tsx (1)
  • stringToEmoji (143-154)
apps/web/core/components/pages/modals/page-form.tsx (1)
packages/propel/src/emoji-icon-picker/emoji-picker.tsx (1)
  • EmojiPicker (10-136)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: CodeQL analysis (javascript-typescript)
🔇 Additional comments (41)
packages/editor/package.json (1)

46-47: Verify the duplicate dependency removal mentioned in PR objectives.

The PR objectives state "removal of a duplicate dependency in editor/package.json," but the only visible change is the reordering of @plane/utils to appear after @plane/propel. I don't see any duplicate dependency or a removal in the provided code.

Can you clarify:

  1. Was a duplicate dependency actually removed, or was only the order changed?
  2. If removed, what was the duplicate entry (e.g., was @plane/utils listed twice)?

This will help confirm the completeness of the changes in this file.

apps/web/ce/components/breadcrumbs/project.tsx (1)

4-4: LGTM! Import migration aligns with refactor goals.

The Logo component import has been successfully migrated to @plane/propel/emoji-icon-picker as part of the centralization effort. The usage pattern on line 55 remains unchanged, and the component interface appears fully compatible.

apps/web/core/components/workspace/sidebar/projects-list-item.tsx (1)

18-18: LGTM! Clean migration to the propel package.

The Logo import has been successfully migrated from a local module to @plane/propel/emoji-icon-picker as part of the broader refactoring effort. The component usage remains unchanged throughout the file, preserving existing behavior.

apps/web/core/components/project/project-feature-update.tsx (1)

10-10: LGTM! Logo import successfully migrated to propel.

The import path change centralizes Logo to the @plane/propel/emoji-icon-picker package while preserving all existing functionality and usage patterns.

apps/web/core/components/dropdowns/project/base.tsx (1)

9-9: LGTM! Logo import migrated correctly.

The centralized Logo import is used consistently throughout the component at lines 105, 146, and 165 with no functional changes.

apps/web/core/components/issues/issue-layouts/filters/header/filters/project.tsx (1)

7-7: LGTM! Consistent Logo import migration.

Import successfully migrated to the propel package, preserving existing rendering behavior.

apps/web/core/components/cycles/list/cycle-list-project-group-header.tsx (1)

7-7: LGTM! Logo import migration complete.

Import path updated to use the centralized propel package, maintaining existing functionality.

packages/propel/src/menu/menu.tsx (1)

4-4: LGTM! Relative icon imports corrected.

The change from absolute to relative imports for Chevron icons within the propel package aligns with the PR's objective to fix relative icon imports. This improves internal module resolution without affecting functionality.

packages/propel/src/calendar/root.tsx (1)

5-5: LGTM! Relative import fix applied.

Consistent with the icon import corrections across the propel package, this change improves internal module resolution.

apps/web/core/components/project/multi-select-modal.tsx (1)

9-9: LGTM! Logo import migrated successfully.

The centralized Logo import is used correctly at lines 108 and 157 with no functional changes.

packages/propel/src/icons/actions/add-reaction-icon.tsx (1)

1-21: LGTM! New AddReactionIcon implementation looks solid.

The component follows established icon patterns with proper use of React.useId() for unique clip paths, IconWrapper integration, and appropriate prop handling. The SVG correctly renders a smiley face with a plus sign as intended.

packages/editor/src/core/extensions/callout/logo-selector.tsx (3)

2-4: LGTM! Import migration is clean.

The imports have been successfully migrated to use the centralized @plane/propel/emoji-icon-picker package with the updated TLogoProps type.


21-31: LGTM! Type migration is correct.

The logoValue construction correctly uses the new TLogoProps type and appropriately converts the emoji unicode to a string format.


89-92: LGTM! Default props logic is correct.

The defaultIconColor and defaultOpen props correctly derive their values from the logoValue state, ensuring the picker opens to the appropriate tab with the right color preselected.

apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx (4)

3-9: LGTM! Import migration is complete.

The imports correctly include the new Propel emoji reaction components and helpers, with proper separation of type imports per the codebase conventions.


67-86: LGTM! Reaction transformation is well-structured.

The memoized transformation correctly converts internal reaction data to the Propel EmojiReactionType format, includes a sensible limit of 1000 users to prevent memory issues, and properly tracks the current user's reaction state.


100-107: LGTM! Picker selection handler is correct.

The handler correctly assumes that EmojiReactionPicker provides the emoji in decimal string format, which aligns with the Propel API contract. The inline comment is helpful for maintainability.


109-127: LGTM! New emoji reaction UI is well-integrated.

The migration to EmojiReactionPicker and EmojiReactionGroup is complete and correct. The component properly handles iframe detection, authentication state, and user interactions while providing a cleaner, more maintainable implementation.

packages/propel/src/emoji-icon-picker/lucide-icons.tsx (1)

154-154: LGTM! Icon import path updated for module consolidation.

The change from an absolute package import to a relative import ("../icons") aligns with the PR's goal of consolidating icon and emoji resources within the emoji-icon-picker module. This is an internal refactor with no functional impact.

apps/web/core/components/project/card.tsx (1)

12-12: LGTM! Logo import successfully migrated.

The Logo component import has been updated to use the centralized @plane/propel/emoji-icon-picker package, consistent with the broader refactoring effort across the codebase.

apps/web/core/components/analytics/work-items/workitems-insight-table.tsx (1)

8-8: LGTM! Logo import path updated.

The Logo import has been successfully migrated to the centralized package. The component usage in the analytics table remains unchanged and correct.

apps/web/core/components/workspace/sidebar/favorites/favorite-items/common/helper.tsx (1)

3-3: LGTM! Logo import migrated for favorites helper.

The Logo import has been updated to use the centralized package. The conditional rendering logic for different logo types (material vs lucide) based on entity type remains correct.

apps/web/core/components/common/switcher-label.tsx (1)

2-2: LGTM! Logo import updated in switcher component.

The Logo import has been successfully migrated to the centralized package, maintaining the existing conditional rendering logic for project/workspace switchers.

apps/web/ce/hooks/work-item-filters/use-work-item-filters-config.tsx (1)

4-4: LGTM! Logo import updated for filter configuration.

The Logo import has been successfully migrated to the centralized package. The separate Avatar import from @plane/ui is correctly maintained, following the codebase pattern of keeping value imports separated.

packages/propel/src/icons/registry.ts (1)

1-1: LGTM! Clean addition to the icon registry.

The new AddReactionIcon import and registry entry follow the existing patterns correctly. The icon component implementation exists and is properly structured.

Also applies to: 116-116

apps/web/core/components/profile/sidebar.tsx (1)

16-16: LGTM! Proper migration to centralized Logo component.

The Logo import has been correctly migrated from the local path to the centralized @plane/propel/emoji-icon-picker package. The usage pattern at line 164 remains unchanged, preserving backward compatibility.

packages/propel/src/emoji-icon-picker/index.ts (1)

3-3: LGTM! Proper API extension.

The logo module export correctly extends the public API of the emoji-icon-picker package, enabling the Logo component to be imported by consumers across the codebase.

apps/web/core/components/home/widgets/recents/project.tsx (1)

3-3: LGTM! Consistent Logo migration.

The Logo import has been properly migrated to the centralized package. The usage at line 35 with the size={16} prop remains consistent with the existing API.

apps/web/core/components/pages/list/block.tsx (1)

6-6: LGTM! Clean Logo migration with proper prop usage.

The Logo import has been correctly migrated to the centralized package. The usage at line 44 properly specifies both size={16} and type="lucide" props, maintaining consistency with the logo system.

apps/web/core/components/views/view-list-item.tsx (1)

7-7: LGTM! Proper Logo component migration.

The Logo import has been correctly updated to use the centralized package. The usage at line 37 with size={16} and type="lucide" props maintains consistency across view-related components.

apps/web/core/components/power-k/menus/projects.tsx (1)

5-5: LGTM! Consistent Logo migration for menu context.

The Logo import has been properly migrated to the centralized package. The usage at line 22 with size={14} is appropriately sized for the menu context.

apps/web/core/components/settings/project/sidebar/root.tsx (1)

5-5: LGTM! Final Logo migration complete.

The Logo import has been correctly migrated to the centralized package. The usage at line 28 relies on the default size, which is appropriate for the settings sidebar context.

packages/propel/src/emoji-icon-picker/logo.tsx (1)

10-12: LGTM! Circular import properly resolved.

The change from barrel imports to local relative imports is correct. Since this file is part of the emoji-icon-picker package, importing from the package's own barrel export (@plane/propel/emoji-icon-picker) would create a circular dependency.

apps/web/core/components/issues/issue-layouts/filters/applied-filters/project.tsx (1)

4-4: LGTM! Import path updated correctly.

The Logo component import has been successfully migrated to the centralized @plane/propel/emoji-icon-picker package, aligning with the PR's objective to consolidate emoji/icon components.

apps/web/core/components/analytics/overview/active-project-item.tsx (1)

2-3: LGTM! Imports migrated correctly.

Both Logo and ProjectIcon imports have been updated to use the centralized propel packages, maintaining consistency with the broader refactoring effort.

apps/web/core/components/issues/issue-layouts/utils.tsx (1)

9-9: LGTM! Import source updated correctly.

The Logo component import has been migrated to the centralized package, consistent with the PR's refactoring objectives.

packages/propel/src/icons/actions/index.ts (1)

2-2: LGTM! New icon export added correctly.

The AddReactionIcon export follows the established pattern and is properly ordered between the existing action icon exports.

apps/web/core/components/project/create/header.tsx (1)

6-6: LGTM! Emoji picker imports consolidated.

The imports have been successfully consolidated to use the centralized @plane/propel/emoji-icon-picker package for all emoji/icon picker functionality, aligning with the PR's objective to standardize these components.

apps/web/core/components/project/form.tsx (1)

11-11: LGTM! Emoji picker imports centralized correctly.

All emoji/icon picker related components are now imported from the centralized @plane/propel/emoji-icon-picker package, maintaining clean separation from other UI components.

packages/propel/src/icons/constants.tsx (1)

4-4: Icon registration verified and complete.

The AddReactionIcon has been properly registered in both the ActionsIconsMap (constants.tsx:4) and the icon registry (registry.ts:116) with correct import statement. Naming conventions and pattern consistency confirmed across all locations.

apps/web/core/components/comments/comment-reaction.tsx (1)

68-83: Smooth EmojiReactionPicker integration

Nice job translating the comment reaction flow onto the shared EmojiReactionPicker/Group primitives. The memoized aggregation keeps tooltip data intact while the new handlers preserve the decimal payload expected by activityOperations.react, so the UX stays consistent with the old selector without bespoke UI code.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

♻️ Duplicate comments (2)
apps/web/core/components/issues/issue-detail/reactions/issue.tsx (1)

13-13: Remove the unused import.

The formatTextList import is no longer used after the refactoring to Propel components.

Apply this diff:

-import { cn, formatTextList } from "@plane/utils";
+import { cn } from "@plane/utils";
apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx (1)

87-105: Keep next_path intact when forwarding unauthenticated users.

The redirect builds /?next_path=${pathName}?${queryParam}. If queryParam contains & (e.g., multiple filters), everything after the first & is parsed as a separate top-level query parameter, breaking the full path preservation through login.

Apply this diff to URL-encode the full next path:

+  const redirectToLogin = () => {
+    const nextPath = queryParam ? `${pathName}?${queryParam}` : pathName;
+    router.push(`/?next_path=${encodeURIComponent(nextPath)}`);
+  };
+
   const handleEmojiClick = (emoji: string) => {
     if (!user) {
-      router.push(`/?next_path=${pathName}?${queryParam}`);
+      redirectToLogin();
       return;
     }
     const emojiCodePoints = Array.from(emoji).map((char) => char.codePointAt(0));
     const reactionString = emojiCodePoints.join("-");
     handleReactionClick(reactionString);
   };

   const handleEmojiSelect = (emoji: string) => {
     if (!user) {
-      router.push(`/?next_path=${pathName}?${queryParam}`);
+      redirectToLogin();
       return;
     }
     handleReactionClick(emoji);
   };
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d1e746f and 93c5418.

📒 Files selected for processing (12)
  • apps/space/core/components/issues/issue-layouts/kanban/block-reactions.tsx (1 hunks)
  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx (4 hunks)
  • apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx (3 hunks)
  • apps/web/core/components/comments/comment-reaction.tsx (2 hunks)
  • apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx (4 hunks)
  • apps/web/core/components/issues/issue-detail/reactions/issue.tsx (4 hunks)
  • packages/propel/src/animated-counter/animated-counter.tsx (2 hunks)
  • packages/propel/src/emoji-icon-picker/emoji-picker.tsx (1 hunks)
  • packages/propel/src/emoji-reaction/emoji-reaction-picker.stories.tsx (8 hunks)
  • packages/propel/src/emoji-reaction/emoji-reaction-picker.tsx (1 hunks)
  • packages/propel/src/emoji-reaction/emoji-reaction.stories.tsx (5 hunks)
  • packages/propel/src/emoji-reaction/emoji-reaction.tsx (5 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx
🧰 Additional context used
🧠 Learnings (6)
📚 Learning: 2025-10-09T20:42:31.843Z
Learnt from: lifeiscontent
PR: makeplane/plane#7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T20:42:31.843Z
Learning: In the makeplane/plane repository, React types are globally available through TypeScript configuration. Type annotations like React.FC, React.ReactNode, etc. can be used without explicitly importing the React namespace. The codebase uses the modern JSX transform, so React imports are not required for JSX or type references.

Applied to files:

  • apps/web/core/components/comments/comment-reaction.tsx
  • apps/web/core/components/issues/issue-detail/reactions/issue.tsx
  • packages/propel/src/emoji-reaction/emoji-reaction.tsx
  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx
  • apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx
📚 Learning: 2025-10-09T22:12:26.424Z
Learnt from: lifeiscontent
PR: makeplane/plane#7922
File: apps/admin/app/(all)/(dashboard)/ai/form.tsx:19-19
Timestamp: 2025-10-09T22:12:26.424Z
Learning: When `types/react` is installed in a TypeScript project (which is standard for React + TypeScript codebases), React types (React.FC, React.ReactNode, React.ComponentProps, etc.) are globally available by design. These type annotations can and should be used without explicitly importing the React namespace. This is a TypeScript/DefinitelyTyped feature, not codebase-specific configuration.

Applied to files:

  • apps/web/core/components/comments/comment-reaction.tsx
  • apps/web/core/components/issues/issue-detail/reactions/issue.tsx
  • packages/propel/src/emoji-reaction/emoji-reaction.tsx
📚 Learning: 2025-10-06T01:44:38.472Z
Learnt from: lifeiscontent
PR: makeplane/plane#7888
File: packages/propel/src/collapsible/collapsible.stories.tsx:4-4
Timestamp: 2025-10-06T01:44:38.472Z
Learning: In Storybook v9, imports use bare paths instead of scoped packages. For example, `import { useArgs } from "storybook/preview-api"` is correct (not `storybook/preview-api`). This applies to other Storybook modules as well - the scoped storybook/* packages were consolidated into bare "storybook/*" imports.

Applied to files:

  • packages/propel/src/emoji-reaction/emoji-reaction-picker.stories.tsx
📚 Learning: 2025-10-21T17:22:05.204Z
Learnt from: lifeiscontent
PR: makeplane/plane#7989
File: apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/[pageId]/page.tsx:45-46
Timestamp: 2025-10-21T17:22:05.204Z
Learning: In the makeplane/plane repository, the refactor from useParams() to params prop is specifically scoped to page.tsx and layout.tsx files in apps/web/app (Next.js App Router pattern). Other components (hooks, regular client components, utilities) should continue using the useParams() hook as that is the correct pattern for non-route components.

Applied to files:

  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx
  • apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx
📚 Learning: 2025-09-02T08:14:49.260Z
Learnt from: sriramveeraghanta
PR: makeplane/plane#7697
File: apps/web/app/(all)/[workspaceSlug]/(projects)/header.tsx:12-13
Timestamp: 2025-09-02T08:14:49.260Z
Learning: The star-us-link.tsx file in apps/web/app/(all)/[workspaceSlug]/(projects)/ already has "use client" directive at the top, making it a proper Client Component for hook usage.

Applied to files:

  • apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx
  • apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx
📚 Learning: 2025-10-09T20:43:07.762Z
Learnt from: lifeiscontent
PR: makeplane/plane#7922
File: apps/admin/core/components/new-user-popup.tsx:4-6
Timestamp: 2025-10-09T20:43:07.762Z
Learning: The `next-themes` library is React-compatible and can be used outside of Next.js applications. It's not Next.js-specific despite its name.

Applied to files:

  • apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx
🧬 Code graph analysis (6)
apps/web/core/components/comments/comment-reaction.tsx (1)
packages/propel/src/emoji-icon-picker/helper.tsx (1)
  • stringToEmoji (143-154)
apps/web/core/components/issues/issue-detail/reactions/issue.tsx (1)
packages/propel/src/emoji-icon-picker/helper.tsx (1)
  • stringToEmoji (143-154)
packages/propel/src/emoji-reaction/emoji-reaction.tsx (2)
packages/propel/src/animated-counter/animated-counter.tsx (1)
  • AnimatedCounter (16-95)
packages/propel/src/icons/actions/add-reaction-icon.tsx (1)
  • AddReactionIcon (6-21)
apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx (2)
packages/utils/src/emoji.ts (1)
  • groupReactions (53-79)
packages/propel/src/emoji-icon-picker/helper.tsx (1)
  • stringToEmoji (143-154)
apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx (1)
packages/propel/src/emoji-icon-picker/helper.tsx (1)
  • stringToEmoji (143-154)
apps/space/core/components/issues/issue-layouts/kanban/block-reactions.tsx (1)
apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx (1)
  • IssueEmojiReactions (22-123)
🔇 Additional comments (6)
packages/propel/src/animated-counter/animated-counter.tsx (2)

10-14: LGTM! Content-based sizing improves flexibility.

Simplifying sizeClasses to text-only sizes makes the counter more adaptable to different contexts. The content-driven approach should work well with the emoji reaction components.

Optionally verify that reaction counters render correctly across all usage contexts (issue reactions, comment reactions, etc.) to ensure the removal of explicit dimensions doesn't cause any layout shifts in edge cases.


47-47: Nice addition for animation stability.

The min-w-2 constraint prevents the container from collapsing during slide transitions, ensuring smooth animations even when counts change between different digit widths.

apps/web/core/components/issues/issue-detail/reactions/issue.tsx (1)

114-125: LGTM! Emoji conversion logic is sound.

The handlers correctly convert between emoji characters and decimal-string format for the API. handleReactionClick converts the display emoji back to the stored format, while handleEmojiSelect receives the decimal format directly from the picker.

packages/propel/src/emoji-reaction/emoji-reaction.stories.tsx (1)

36-39: LGTM! Story args initialization improves Storybook experience.

Adding initial args to the interactive stories provides better default values in Storybook controls while preserving the render logic.

Also applies to: 83-86, 127-130, 141-144, 183-186

packages/propel/src/emoji-reaction/emoji-reaction.tsx (2)

88-107: LGTM! AddReactionIcon integration is clean.

The new AddReactionIcon provides a semantically appropriate icon for the add reaction button with consistent sizing (h-6 w-6) and styling.


15-37: Based on my search of the codebase, I found no external usage of the size prop on EmojiReaction, EmojiReactionGroup, or EmojiReactionButton components. The only size prop usage found in the emoji-reaction file is on the internal AnimatedCounter component (line 76), which is a separate component.

This means while removing size from the public interface definitions is technically a breaking API change, it appears to have zero practical impact because no consumers were actually using it. The prop was likely unused or internal-only.

Clarify PR description: removing unused size prop has no practical breaking changes.

The PR description stating "No breaking changes (pure refactor)" is accurate in practice. While the size prop was removed from EmojiReactionProps, EmojiReactionGroupProps, and EmojiReactionButtonProps, the codebase shows no external consumers relied on this prop. This is a safe simplification rather than a true breaking change to dependencies.

@pushya22 pushya22 merged commit fd38b9b into preview Nov 6, 2025
6 checks passed
@pushya22 pushya22 deleted the refactor-emoji-reaction-propel-migration branch November 6, 2025 12:55
ClarenceChen0627 pushed a commit to ClarenceChen0627/plane that referenced this pull request Dec 5, 2025
ClarenceChen0627 pushed a commit to ClarenceChen0627/plane that referenced this pull request Dec 5, 2025
ClarenceChen0627 pushed a commit to ClarenceChen0627/plane that referenced this pull request Dec 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants