Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reply functionality for Group Chat and DirectChat #2142

Merged
merged 41 commits into from
Oct 21, 2024

Conversation

disha1202
Copy link

@disha1202 disha1202 commented Jul 31, 2024

What kind of change does this PR introduce?

Issue Number:

Fixes #2103

Did you add tests for your changes?
Yes

Snapshots/Videos:

If relevant, did you update the documentation?

Summary

Does this PR introduce a breaking change?

Other information

Have you read the contributing guide?

Summary by CodeRabbit

  • New Features

    • Introduced new styles for the chat room interface, enhancing layout and user interaction.
    • Improved hover effects and animations for sent and received messages, increasing visual feedback.
    • Enhanced loading state in the user modal for adding existing users, improving user experience.
  • Bug Fixes

    • Resolved issues related to the organization selection in the group chat creation process, preventing runtime errors.
  • Style

    • Updated CSS for the chat room to improve layout, including the addition of a new user details class and enhanced message styles.
  • Tests

    • Expanded test cases for the ChatRoom component, ensuring accurate simulation of user interactions and message handling scenarios.
    • Simplified test descriptions for clarity and maintainability.

Copy link

coderabbitai bot commented Jul 31, 2024

Walkthrough

The recent changes enhance the chat room interface by introducing new CSS styles, improving layout and hover effects, and refining the message handling logic in the ChatRoom component. Updates to the test suite ensure comprehensive coverage for new functionalities, including message replies and user interactions. Additionally, the CreateGroupChat component has been updated for better type safety and user experience. Overall, these modifications focus on improving the visual presentation and interactivity of the chat functionalities.

Changes

File(s) Change Summary
src/components/UserPortal/ChatRoom/ChatRoom.module.css Added new styles, including .userDetails for layout, updated .contactImage, enhanced hover effects for .messageSent and .messageReceived, and defined @keyframes test.
src/components/UserPortal/ChatRoom/ChatRoom.test.tsx Introduced MockSubscriptionLink, expanded mock data for GraphQL queries, enhanced test cases for message sending and user interactions, and updated identifiers in mock responses.
src/components/UserPortal/ChatRoom/ChatRoom.tsx Updated useMutation and useSubscription hooks for message handling, added logic for checking incoming messages, and retained scrolling functionality.
src/components/UserPortal/CreateGroupChat/CreateGroupChat.tsx Changed id property type in chatsListRefetch from any to string, updated reset function, and refined event handling logic.
src/GraphQl/Mutations/OrganizationMutations.ts Removed multiple mutations and subscriptions related to messaging functionality, including SEND_MESSAGE_TO_CHAT, SEND_MESSAGE_TO_DIRECT_CHAT, and others.
src/GraphQl/Queries/PlugInQueries.ts Removed several queries related to direct and group chats, including DIRECT_CHAT_MESSAGES_BY_CHAT_ID and GROUP_CHAT_BY_ID.
src/GraphQl/Queries/Queries.ts Removed the export of the DIRECT_CHATS_LIST query.
src/components/UserPortal/CreateGroupChat/CreateGroupChat.test.tsx Removed several import statements and streamlined mock data for testing, while simplifying test descriptions.
src/screens/UserPortal/Chat/Chat.test.tsx Removed MESSAGE_SENT_TO_GROUP_CHAT_MOCK mock data, indicating a shift in test structure.

Assessment against linked issues

Objective Addressed Explanation
Add reply to messages functionality in direct chat and group chat (#2103)

🐇 In the meadow where chats now flow,
New replies emerge, like spring's bright glow.
Users can chat, with ease they will say,
"Hoppity hop, let's chat all day!"
With every message, a joy to unfold,
In our chat world, new stories are told! 🌼

Possibly related PRs

Suggested labels

no-pr-activity

Suggested reviewers

  • DMills27

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

Our Pull Request Approval Process

We have these basic policies to make the approval process smoother for our volunteer team.

Testing Your Code

Please make sure your code passes all tests. Our test code coverage system will fail if these conditions occur:

  1. The overall code coverage drops below the target threshold of the repository
  2. Any file in the pull request has code coverage levels below the repository threshold
  3. Merge conflicts

The process helps maintain the overall reliability of the code base and is a prerequisite for getting your PR approved. Assigned reviewers regularly review the PR queue and tend to focus on PRs that are passing.

Reviewers

Do not assign reviewers. Our Queue Monitors will review your PR and assign them.
When your PR has been assigned reviewers contact them to get your code reviewed and approved via:

  1. comments in this PR or
  2. our slack channel

Reviewing Your Code

Your reviewer(s) will have the following roles:

  1. arbitrators of future discussions with other contributors about the validity of your changes
  2. point of contact for evaluating the validity of your work
  3. person who verifies matching issues by others that should be closed.
  4. person who gives general guidance in fixing your tests

CONTRIBUTING.md

Read our CONTRIBUTING.md file. Most importantly:

  1. PRs with issues not assigned to you will be closed by the reviewer
  2. Fix the first comment in the PR so that each issue listed automatically closes

Other

  1. 🎯 Please be considerate of our volunteers' time. Contacting the person who assigned the reviewers is not advised unless they ask for your input. Do not @ the person who did the assignment otherwise.
  2. Read the CONTRIBUTING.md file make

Copy link

@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: 6

Outside diff range, codebase verification and nitpick comments (4)
src/components/UserPortal/CreateGroupChat/CreateGroupChat.tsx (1)

1-31: Ensure all imports are necessary and used.

The following imports are not used in the code and should be removed to keep the code clean:

  • FormControl
  • FormControlLabel
  • FormHelperText
  • InputLabel
  • MenuItem
  • RadioGroup
  • Select
  • FormLabel
  • TableBody
  • Radio
Analysis chain

Ensure all imports are necessary and used.

Verify that all newly added imports are necessary and used in the code. Unused imports can be removed to keep the code clean.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that all newly added imports are used in the code.

# Test: Search for the usage of each imported module. Expect: All modules are used in the code.
rg --type tsx 'FormControl|FormControlLabel|FormHelperText|InputLabel|MenuItem|Paper|RadioGroup|Select|FormLabel|TableBody|Radio|SelectChangeEvent|Button|Form|Modal|styles|ApolloQueryResult|useMutation|useQuery|USER_JOINED_ORGANIZATIONS|useLocalStorage|CREATE_GROUP_CHAT|Table|TableCell|TableContainer|TableHead|TableRow|styled|InterfaceQueryUserListItem|USERS_CONNECTION_LIST|Loader|LocalPoliceTwoTone|Search|style|useTranslation' src/components/UserPortal/CreateGroupChat/CreateGroupChat.tsx

Length of output: 523


Script:

#!/bin/bash
# Description: Verify that all newly added imports are used in the code.

# Test: Search for the usage of each imported module. Expect: All modules are used in the code.
rg 'FormControl|FormControlLabel|FormHelperText|InputLabel|MenuItem|Paper|RadioGroup|Select|FormLabel|TableBody|Radio|SelectChangeEvent|Button|Form|Modal|styles|ApolloQueryResult|useMutation|useQuery|USER_JOINED_ORGANIZATIONS|useLocalStorage|CREATE_GROUP_CHAT|Table|TableCell|TableContainer|TableHead|TableRow|styled|InterfaceQueryUserListItem|USERS_CONNECTION_LIST|Loader|LocalPoliceTwoTone|Search|style|useTranslation' src/components/UserPortal/CreateGroupChat/CreateGroupChat.tsx

Length of output: 6326

src/components/UserPortal/CreateDirectChat/CreateDirectChat.test.tsx (2)

242-243: Add more specific test descriptions.

The test description "Test open and close create new direct chat modal" can be more specific to describe the exact behavior being tested.

- test('Test open and close create new direct chat modal', async () => {
+ test('Open and close the create new direct chat modal successfully', async () => {

292-293: Add more specific test descriptions.

The test description "Test create new direct chat" can be more specific to describe the exact behavior being tested.

- test('Test create new direct chat', async () => {
+ test('Create a new direct chat successfully', async () => {
src/components/UserPortal/CreateGroupChat/CreateGroupChat.test.tsx (1)

2577-2776: LGTM! Test cases are comprehensive and well-structured.

The test cases cover the main functionalities of the CreateGroupChat component. Consider adding comments to each test case for better readability.

+ // Test case for opening and closing the create new direct chat modal
test('Test open and close create new direct chat modal', async () => {
  ...
});

+ // Test case for creating a new group chat
test('Test create new group chat', async () => {
  ...
});

+ // Test case for adding and removing a user
test('Test add and remove user', async () => {
  ...
});
Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between fc70a6d and 6a628d9.

Files ignored due to path filters (2)
  • src/assets/svgs/chat.svg is excluded by !**/*.svg
  • src/assets/svgs/newChat.svg is excluded by !**/*.svg
Files selected for processing (28)
  • public/locales/en/translation.json (2 hunks)
  • schema.graphql (6 hunks)
  • src/App.tsx (2 hunks)
  • src/GraphQl/Mutations/OrganizationMutations.ts (1 hunks)
  • src/GraphQl/Queries/PlugInQueries.ts (2 hunks)
  • src/GraphQl/Queries/Queries.ts (2 hunks)
  • src/assets/css/app.css (1 hunks)
  • src/components/Avatar/Avatar.module.css (1 hunks)
  • src/components/UserPortal/ChatRoom/ChatRoom.module.css (2 hunks)
  • src/components/UserPortal/ChatRoom/ChatRoom.test.tsx (3 hunks)
  • src/components/UserPortal/ChatRoom/ChatRoom.tsx (2 hunks)
  • src/components/UserPortal/ContactCard/ContactCard.module.css (1 hunks)
  • src/components/UserPortal/ContactCard/ContactCard.test.tsx (1 hunks)
  • src/components/UserPortal/ContactCard/ContactCard.tsx (2 hunks)
  • src/components/UserPortal/CreateDirectChat/CreateDirectChat.module.css (1 hunks)
  • src/components/UserPortal/CreateDirectChat/CreateDirectChat.test.tsx (1 hunks)
  • src/components/UserPortal/CreateDirectChat/CreateDirectChat.tsx (1 hunks)
  • src/components/UserPortal/CreateGroupChat/CreateGroupChat.module.css (1 hunks)
  • src/components/UserPortal/CreateGroupChat/CreateGroupChat.test.tsx (1 hunks)
  • src/components/UserPortal/CreateGroupChat/CreateGroupChat.tsx (1 hunks)
  • src/components/UserPortal/UserSidebar/UserSidebar.module.css (2 hunks)
  • src/components/UserPortal/UserSidebar/UserSidebar.tsx (2 hunks)
  • src/index.tsx (1 hunks)
  • src/screens/UserPortal/Chat/Chat.module.css (1 hunks)
  • src/screens/UserPortal/Chat/Chat.test.tsx (8 hunks)
  • src/screens/UserPortal/Chat/Chat.tsx (1 hunks)
  • src/screens/UserPortal/Organizations/Organizations.module.css (2 hunks)
  • src/screens/UserPortal/Settings/Settings.module.css (2 hunks)
Files skipped from review due to trivial changes (6)
  • src/assets/css/app.css
  • src/components/UserPortal/CreateDirectChat/CreateDirectChat.module.css
  • src/components/UserPortal/CreateGroupChat/CreateGroupChat.module.css
  • src/components/UserPortal/UserSidebar/UserSidebar.module.css
  • src/index.tsx
  • src/screens/UserPortal/Organizations/Organizations.module.css
Additional context used
Biome
src/components/UserPortal/CreateGroupChat/CreateGroupChat.tsx

[error] 209-210: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

Additional comments not posted (112)
src/components/Avatar/Avatar.module.css (1)

2-6: Enhanced responsiveness and alignment.

The changes to the .imageContainer class improve the responsiveness and alignment of the avatar component by using fit-content for width and height, and flex for display with centered alignment.

src/components/UserPortal/ContactCard/ContactCard.module.css (4)

4-8: Verify visual impact of reduced padding and commented properties.

The reduced padding and commented out margin-bottom and border properties may affect the spacing and appearance of the contact card elements. Ensure these changes align with the desired design.


12-17: Improved image alignment and presentation.

The changes to the .contactImage class prioritize the image size and enhance the alignment and presentation of the image within its container.


24-24: Improved visual hierarchy and layout.

The addition of justify-content: center to the .contactNameContainer class improves the visual hierarchy and layout of the contact name display.


31-32: Verify visual impact of color scheme change.

The change from .bgGrey to .bgGreen alters the color scheme and may influence the overall aesthetic and user experience of the contact card. Ensure this change aligns with the desired design.

src/components/UserPortal/ContactCard/ContactCard.tsx (4)

7-13: Verify impact of restructured interface.

The restructuring of the InterfaceContactCardProps interface alters the data model for contact cards. Ensure these changes align with the desired functionality and update any dependent components or logic accordingly.


19-19: Verify impact of updated handleSelectedContactChange function.

The update to the handleSelectedContactChange function ensures that the selected contact type is correctly set. Ensure these changes align with the desired functionality and update any dependent components or logic accordingly.


34-34: Verify visual impact of background color change.

The change in background color from grey to green when the contact is selected alters the visual representation of the selected contact. Ensure this change aligns with the desired design.


42-54: Verify impact of updated displayed properties.

The update to display title and subtitle instead of name and email streamlines the information presented. Ensure these changes align with the desired functionality and update any dependent components or logic accordingly.

src/screens/UserPortal/Settings/Settings.module.css (1)

119-119: LGTM! Simplified width calculation.

The change simplifies the width calculation for the .collapseSidebarButton class, which should enhance maintainability.

src/components/UserPortal/ContactCard/ContactCard.test.tsx (1)

26-33: LGTM! Enhanced specificity and modified interaction.

The changes to the props object improve the specificity of contact representation and modify the interaction with the contact selection mechanism in the tests.

src/components/UserPortal/UserSidebar/UserSidebar.tsx (1)

91-112: LGTM! Added chat navigation link.

The addition of the chat button enhances the user experience by providing direct access to chat features. The dynamic styling based on the active state improves visual feedback for users.

src/screens/UserPortal/Chat/Chat.module.css (9)

1-3: LGTM! Consistent height across different viewport sizes.

The changes ensure that the chat interface remains user-friendly on various devices.


6-9: LGTM! Sidebar expansion with animation.

The addition of the .expand class enhances the dynamic feel of the interface.


11-14: LGTM! Sidebar contraction with animation.

The addition of the .contract class enhances the dynamic feel of the interface.


16-26: LGTM! Fixed positioning for sidebar controls.

The addition of the .collapseSidebarButton class enhances accessibility and usability.


28-32: LGTM! Hover effects for better visual feedback.

The hover effects improve visual feedback for user interactions.


33-49: LGTM! Polished appearance for the chat interface.

The updates to the .mainContainer class create a more polished appearance for the chat interface.


53-61: LGTM! Polished appearance for the chat interface.

The updates to the .chatContainer class create a more polished appearance for the chat interface.


137-144: LGTM! Transition effects for better visual feedback.

The transition effects enhance the dynamic feel of the interface.


170-207: LGTM! Responsive design for smaller screens.

The media queries ensure that the interface remains functional and aesthetically pleasing at different resolutions.

src/components/UserPortal/ChatRoom/ChatRoom.module.css (9)

4-4: LGTM! Background color commented out.

Commenting out the background color of the .chatAreaContainer class indicates a potential shift in visual design or functionality.


15-19: LGTM! Sticky header styling.

The addition of the .header class enhances the usability of the chat interface.


21-27: LGTM! Improved structure and readability of user information.

The addition of the .userInfo class improves the structure and readability of the user information section.


38-46: LGTM! Enhanced layout for sent and received messages.

The addition of the .messageSentContainer and .messageReceivedContainer classes enhances the visual distinction and layout of sent and received messages.


48-73: LGTM! Enhanced visual distinction for sent and received messages.

The updates to the .messageSent and .messageReceived classes enhance the visual distinction and readability of sent and received messages.


87-110: LGTM! Improved structure and readability of reply-to messages.

The addition of the .replyTo and .replyToMessage classes improves the structure and readability of reply-to messages.


116-123: LGTM! Enhanced readability of message timestamps.

The addition of the .messageTime class enhances the readability of message timestamps.


125-131: LGTM! Improved structure and readability of message content.

The addition of the .messageContent class improves the structure and readability of message content.


170-210: LGTM! Enhanced usability and visual feedback for toggle and close buttons.

The addition of the .customToggle and .closeBtn classes enhances the usability and visual feedback of the toggle and close buttons.

src/components/UserPortal/CreateDirectChat/CreateDirectChat.tsx (5)

1-21: LGTM! Necessary imports for functionality.

The imports are necessary for the functionality of the component.


22-32: LGTM! Improved type safety and readability.

The addition of the InterfaceCreateDirectChatProps interface improves the type safety and readability of the component.


34-48: LGTM! Enhanced visual appearance of the table.

The addition of the StyledTableCell and StyledTableRow components enhances the visual appearance of the table.


50-50: LGTM! Appropriate use of useLocalStorage hook.

The use of the useLocalStorage hook is appropriate for retrieving the user ID.


52-202: LGTM! Well-structured component function.

The groupChat function is well-structured and handles the necessary logic for creating direct chats.

src/GraphQl/Mutations/OrganizationMutations.ts (4)

77-86: LGTM!

The modification to accept an optional organizationId parameter allows for more flexible usage of the CREATE_DIRECT_CHAT mutation.


168-184: LGTM!

The CREATE_MESSAGE_CHAT mutation includes a detailed return structure and seems correct.


186-208: LGTM!

The MESSAGE_SENT_TO_DIRECT_CHAT subscription includes a detailed return structure and seems correct.


210-227: LGTM!

The MESSAGE_SENT_TO_GROUP_CHAT subscription includes a detailed return structure and seems correct.

src/App.tsx (1)

38-38: LGTM!

The addition of the Chat component to the import statements and the new route path /user/chat enhances the application's routing functionality.

Also applies to: 167-167

src/GraphQl/Queries/PlugInQueries.ts (4)

109-133: LGTM!

The DIRECT_CHAT_MESSAGES_BY_CHAT_ID query includes a detailed return structure and seems correct.


135-186: LGTM!

The DIRECT_CHAT_BY_ID query includes a detailed return structure and seems correct.


188-227: LGTM!

The GROUP_CHAT_BY_ID query includes a detailed return structure and seems correct.


294-329: LGTM!

The GROUP_CHAT_LIST query includes a detailed return structure and seems correct.

src/screens/UserPortal/Chat/Chat.tsx (11)

21-27: Interface InterfaceContactCardProps updated.

The interface now includes title, subtitle, type, and setSelectedChatType. Ensure these properties are correctly used in the ContactCard component.


52-64: Ensure correct initialization and usage of state variables.

Verify that state variables for selectedContact, contacts, groupChats, selectChatType, and modal states are correctly initialized and used.


66-77: Ensure correct handling of modal toggle functions.

The functions toggleCreateDirectChatModal and toggleCreateGroupChatModal toggle the respective modal states. Ensure these functions work as expected.


119-127: Ensure correct data handling in useEffect hooks.

The useEffect hooks update the state variables contacts and groupChats based on the fetched data. Ensure that the data handling logic is correct.


131-151: Ensure correct handling of sidebar toggle buttons.

The sidebar toggle buttons update the hideDrawer state. Ensure that these buttons work as expected and provide a smooth user experience.


154-184: Verify dropdown menu for initiating new chats.

The dropdown menu provides options for starting new direct chats and group chats. Ensure that the dropdown menu is correctly implemented and functions as expected.


187-260: Ensure correct implementation of accordion layout for displaying chats.

The accordion layout organizes direct and group chats. Ensure that the accordion layout is correctly implemented and enhances user experience.


264-285: Verify modal components for creating new chats.

The modal components for creating new direct and group chats should function as expected. Ensure that the modals are correctly implemented and enhance user experience.


1-17: Ensure all imports are necessary and used.

Verify that all newly added imports are necessary and used in the code. Unused imports can be removed to keep the code clean.

Verification successful

All imports are necessary and used.

The verification confirms that all the newly added imports are necessary and used in the code.

  • DIRECT_CHATS_LIST
  • GROUP_CHAT_LIST
  • useQuery
  • useTranslation
  • Button
  • Dropdown
  • SearchOutlined
  • Search
  • HourglassBottomIcon
  • ContactCard
  • ChatRoom
  • useLocalStorage
  • NewChat
  • Accordion
  • styles
  • UserSidebar
  • CreateGroupChat
  • CreateDirectChat
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that all newly added imports are used in the code.

# Test: Search for the usage of each imported module. Expect: All modules are used in the code.
rg --type tsx 'DIRECT_CHATS_LIST|GROUP_CHAT_LIST|useQuery|useTranslation|Button|Dropdown|SearchOutlined|Search|HourglassBottomIcon|ContactCard|ChatRoom|useLocalStorage|NewChat|Accordion|styles|UserSidebar|CreateGroupChat|CreateDirectChat' src/screens/UserPortal/Chat/Chat.tsx

Length of output: 305


Script:

#!/bin/bash
# Description: Verify that all newly added imports are used in the code.

# Test: Search for the usage of each imported module. Expect: All modules are used in the code.
rg --glob '*.tsx' 'DIRECT_CHATS_LIST|GROUP_CHAT_LIST|useQuery|useTranslation|Button|Dropdown|SearchOutlined|Search|HourglassBottomIcon|ContactCard|ChatRoom|useLocalStorage|NewChat|Accordion|styles|UserSidebar|CreateGroupChat|CreateDirectChat' src/screens/UserPortal/Chat/Chat.tsx

Length of output: 5011


32-50: Ensure correct handling of window resize events.

The handleResize function toggles the hideDrawer state based on window width. Ensure this logic works as expected and does not cause unwanted side effects.


84-98: Verify GraphQL queries and data handling.

The useQuery hooks for DIRECT_CHATS_LIST and GROUP_CHAT_LIST fetch data and update state variables. Ensure that the queries are correct and data handling is appropriate.

Verification successful

GraphQL queries and data handling are correct.

The useQuery hooks for DIRECT_CHATS_LIST and GROUP_CHAT_LIST in Chat.tsx are correctly defined and appropriately handle the data.

  • DIRECT_CHATS_LIST is defined to fetch direct chat details by user ID.
  • GROUP_CHAT_LIST is defined to fetch group chat details by user ID.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correctness of GraphQL queries and data handling.

# Test: Search for the usage of `DIRECT_CHATS_LIST` and `GROUP_CHAT_LIST` queries. Expect: Queries are correct and data handling is appropriate.
rg --type tsx 'DIRECT_CHATS_LIST|GROUP_CHAT_LIST' src/screens/UserPortal/Chat/Chat.tsx

Length of output: 116


Script:

#!/bin/bash
# Description: Verify the correctness of GraphQL queries and data handling.

# Test: Search for the usage of `DIRECT_CHATS_LIST` and `GROUP_CHAT_LIST` queries in the Chat.tsx file.
rg 'DIRECT_CHATS_LIST|GROUP_CHAT_LIST' src/screens/UserPortal/Chat/Chat.tsx

# Test: Search for the definitions of `DIRECT_CHATS_LIST` and `GROUP_CHAT_LIST` in the codebase.
rg 'DIRECT_CHATS_LIST|GROUP_CHAT_LIST' 

Length of output: 3360


Script:

#!/bin/bash
# Description: Extract the definitions of DIRECT_CHATS_LIST and GROUP_CHAT_LIST from the respective files.

# Extract the definition of DIRECT_CHATS_LIST
rg 'export const DIRECT_CHATS_LIST = gql`' -A 10 src/GraphQl/Queries/PlugInQueries.ts

# Extract the definition of GROUP_CHAT_LIST
rg 'export const GROUP_CHAT_LIST = gql`' -A 10 src/GraphQl/Queries/PlugInQueries.ts

Length of output: 614

src/GraphQl/Queries/Queries.ts (1)

Line range hint 209-210:
Ensure removal of event_title_contains parameter does not affect functionality.

The event_title_contains parameter has been removed from the ORGANIZATIONS_MEMBER_CONNECTION_LIST query. Verify that the removal does not affect the functionality of the query.

Verification successful

Removal of event_title_contains parameter does not affect functionality.

The event_title_contains parameter was not found in any of the usages of the ORGANIZATIONS_MEMBER_CONNECTION_LIST query. Therefore, its removal does not impact the functionality of the query.

  • No further action required.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that the removal of the `event_title_contains` parameter does not affect the functionality of the `ORGANIZATIONS_MEMBER_CONNECTION_LIST` query.

# Test: Search for the usage of the `ORGANIZATIONS_MEMBER_CONNECTION_LIST` query. Expect: The query is still valid and functions as expected.
rg --type ts 'ORGANIZATIONS_MEMBER_CONNECTION_LIST' src/GraphQl/Queries/Queries.ts

Length of output: 139


Script:

#!/bin/bash
# Description: Search for the usage of the `ORGANIZATIONS_MEMBER_CONNECTION_LIST` query across the codebase to verify the impact of removing the `event_title_contains` parameter.

# Find all occurrences of `ORGANIZATIONS_MEMBER_CONNECTION_LIST` in the codebase.
rg 'ORGANIZATIONS_MEMBER_CONNECTION_LIST' --type ts

Length of output: 2274


Script:

#!/bin/bash
# Description: Extract relevant lines from files to inspect the usage of the `ORGANIZATIONS_MEMBER_CONNECTION_LIST` query and check for the `event_title_contains` parameter.

# Extract lines from the files where `ORGANIZATIONS_MEMBER_CONNECTION_LIST` is used.
rg 'ORGANIZATIONS_MEMBER_CONNECTION_LIST' --type ts -A 5 -B 5

Length of output: 19829

src/components/UserPortal/CreateGroupChat/CreateGroupChat.tsx (8)

36-70: Interface InterfaceCreateGroupChatProps and InterfaceOrganization defined.

The interfaces define the props for the CreateGroupChat component and the structure of an organization object. Ensure these interfaces are correctly used in the component.


88-116: Ensure correct initialization and usage of state variables.

Verify that state variables for managing organizations, selected organization, group chat title, user IDs, and modal states are correctly initialized and used.


121-126: Ensure correct handling of useQuery for joined organizations.

The useQuery hook fetches the organizations joined by the user. Ensure that the query is correct and data handling is appropriate.


128-133: Ensure correct reset logic.

The reset function clears the state variables. Ensure that the reset logic works as expected.


135-137: Ensure correct handling of userIds state variable.

The useEffect hook updates the userIds state variable. Ensure that the data handling logic is correct.


139-151: Ensure correct implementation of handleCreateGroupChat function.

The handleCreateGroupChat function creates a new group chat and updates the state. Ensure that the function works as expected.


191-270: Verify modal component for creating group chats.

The modal component provides a form for selecting an organization and entering a group chat title. Ensure that the modal is correctly implemented and functions as expected.

Tools
Biome

[error] 209-210: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


272-388: Verify modal component for adding users to group chat.

The modal component provides a form for searching and adding users to the group chat. Ensure that the modal is correctly implemented and functions as expected.

src/components/UserPortal/ChatRoom/ChatRoom.tsx (15)

1-21: Ensure all necessary imports are used.

The import statements look correct and necessary for the functionality. Ensure that all imported modules are used in the code.


24-25: LGTM! Interface updates are appropriate.

The InterfaceChatRoomProps interface correctly includes selectedContact and selectedChatType.


28-61: LGTM! Type definitions are appropriate.

The DirectMessage and Chat types are well-defined and enhance type safety and clarity.


73-84: Ensure cleanup in useEffect.

The useEffect hook correctly sets isMountedRef.current to false on component unmount. This helps prevent memory leaks.


85-93: LGTM! State management is appropriate.

The state variables are well-defined and necessary for managing chat data and user interactions.


94-100: Handle input change correctly.

The handleNewMessageChange function correctly updates the newMessage state based on user input.


101-115: Ensure mutation variables are correctly set.

The sendMessageToDirectChat and sendMessageToGroupChat mutations correctly set the variables needed for sending messages.


117-135: Ensure queries are correctly set.

The useQuery hooks for DIRECT_CHAT_BY_ID and GROUP_CHAT_BY_ID correctly set the variables needed for fetching chat data.


137-143: Ensure data refetch on contact change.

The useEffect hook correctly refetches chat data when the selected contact or chat type changes.


145-161: Ensure direct chat data handling is correct.

The useEffect hook correctly handles setting the direct chat data and updating the chat title and subtitle based on the selected contact.


163-174: Ensure group chat data handling is correct.

The useEffect hook correctly handles setting the group chat data and updating the chat title and subtitle based on the selected contact.


176-187: Ensure message sending logic is correct.

The sendMessage function correctly handles sending messages to direct and group chats, refetching chat data, and resetting the newMessage state.


189-229: Ensure subscription handling is correct.

The useSubscription hooks correctly handle receiving new messages in direct and group chats, updating the chat view in real-time.


231-235: Ensure chat area scrolls to the latest message.

The useEffect hook correctly scrolls the chat area to the latest message.


Line range hint 238-505: Ensure rendering logic is correct.

The rendering logic correctly displays the chat messages, handles replies, and provides the input for sending new messages.

schema.graphql (5)

466-466: LGTM! Addition of title field is appropriate.

The title field has been added to the GroupChat type, enhancing the identification of group chats.


1060-1062: LGTM! Additions to Query type are appropriate.

The new fields directChatById, groupChatById, and groupChatsByUserId enhance the querying capabilities for retrieving specific chat instances and lists based on user IDs.


1158-1159: LGTM! Modifications to Subscription type are appropriate.

The modifications to messageSentToDirectChat and messageSentToGroupChat to require a userId argument enhance the relevance of messages received by users in real-time.


1554-1554: LGTM! Modification to createChatInput is appropriate.

The organizationId field has been made optional, allowing for greater flexibility when creating chat instances.


Line range hint 1053-1053: Ensure removal of organization field is intentional.

The organization field has been removed from the DirectChat type. Verify that this removal is intentional and does not affect other parts of the schema.

Verification successful

Ensure removal of organization field is intentional.

The organization field has been removed from the DirectChat type. The search results confirm that there are no references to organization within the DirectChat type in the schema.graphql file. Thus, the removal appears to be intentional and does not affect other parts of the schema.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the impact of removing the `organization` field from the `DirectChat` type.

# Test: Search for the usage of the `organization` field in the codebase. Expect: No occurrences or necessary adjustments.
rg --type graphql -A 5 $'organization'

Length of output: 69


Script:

#!/bin/bash
# Description: Verify the impact of removing the `organization` field from the `DirectChat` type.

# Test: Search for the usage of the `organization` field in the codebase. Expect: No occurrences or necessary adjustments.
rg 'organization' -g '*.graphql' -A 5

Length of output: 9808

public/locales/en/translation.json (2)

723-728: LGTM! New keys are appropriate.

The new keys under the main object enhance the user-related functionalities within the application.


875-876: LGTM! New keys in userChat section are appropriate.

The new keys for search and messages further enrich the chat functionality by providing users with options to search and view messages.

src/components/UserPortal/ChatRoom/ChatRoom.test.tsx (6)

3-9: Imports look good.

The imports from @testing-library/react and the ChatRoom component are appropriate for the testing framework.

Also applies to: 29-29


44-169: Mock definitions are comprehensive.

The mock definitions for GraphQL queries and mutations cover various scenarios for direct and group chats, ensuring thorough test coverage.

Also applies to: 171-297, 299-545, 547-927, 929-1414


1419-1438: Test case for fallback content looks good.

The test case ensures that the ChatRoom component correctly displays fallback content when no chat is active.


Line range hint 1441-1462:
Test case for direct chat looks good.

The test case ensures that the ChatRoom component correctly renders when a direct chat contact is selected.


1463-1545: Test case for sending a message in direct chat looks good.

The test case comprehensively tests the functionality of sending and replying to messages in direct chat.


1547-1566: Test cases for group chat and removing reply message look good.

The test cases ensure that the ChatRoom component correctly handles group chat interactions and the removal of reply messages.

Also applies to: 1568-1647, 1649-1725

src/components/UserPortal/CreateDirectChat/CreateDirectChat.test.tsx (2)

217-223: LGTM!

The utility function wait is correctly implemented and used.


2236-2236: LGTM!

The file ends correctly after the test cases.

src/screens/UserPortal/Chat/Chat.test.tsx (16)

2-4: LGTM! Import statements are correct.

The new imports for GraphQL queries and mutations are necessary and correctly used in the file.

Also applies to: 6-10, 16-25


27-29: LGTM! Mock data initialization is correct.

The initialization of the useLocalStorage hook is correct.


31-113: LGTM! Mock data for group and direct chats is correctly structured.

The mock data for group and direct chats is well-structured and covers various scenarios, including messages with and without replies.

Also applies to: 115-207, 209-291, 293-417, 419-545, 547-671, 673-1084, 1086-1311


1313-1389: LGTM! Mock data for messages and chat queries is correctly structured.

The mock data for messages sent to group and direct chats, as well as the queries for fetching chat data by ID, is well-structured and covers various scenarios.

Also applies to: 1391-1485, 1487-1751, 1760-2106


2108-2111: LGTM! Helper functions are correctly implemented.

The resizeWindow and wait functions are correctly implemented and useful for the test cases.

Also applies to: 2113-2119


Line range hint 2121-2138:
LGTM! Test case for rendering the chat screen is correctly structured.

The test case for rendering the chat screen is well-structured and uses the mock data appropriately.


2139-2150: LGTM! Mock data usage in test case is correct.

The usage of mock data in the test case for rendering the chat screen is correct.


2164-2175: LGTM! Test case for selecting a contact is correctly structured.

The test case for selecting a contact is well-structured and uses the mock data appropriately.


Line range hint 2175-2195:
LGTM! Mock data usage in test case is correct.

The usage of mock data in the test case for selecting a contact is correct.


2197-2207: LGTM! Test case for creating a new direct chat is correctly structured.

The test case for creating a new direct chat is well-structured and uses the mock data appropriately.


2208-2217: LGTM! Mock data usage in test case is correct.

The usage of mock data in the test case for creating a new direct chat is correct.


2237-2248: LGTM! Test case for creating a new group chat is correctly structured.

The test case for creating a new group chat is well-structured and uses the mock data appropriately.


Line range hint 2248-2271:
LGTM! Mock data usage in test case is correct.

The usage of mock data in the test case for creating a new group chat is correct.


2274-2287: LGTM! Test case for the sidebar is correctly structured.

The test case for the sidebar is well-structured and uses the mock data appropriately.


Line range hint 2287-2306:
LGTM! Mock data usage in test case is correct.

The usage of mock data in the test case for the sidebar is correct.


2308-2337: LGTM! Test case for the sidebar on small screens is correctly structured.

The test case for the sidebar on small screens is well-structured and uses the mock data appropriately.

src/components/UserPortal/CreateGroupChat/CreateGroupChat.test.tsx (2)

1-34: LGTM! Import statements are appropriate.

The import statements are well-organized and necessary for the tests.


35-2575: LGTM! Mock data and utility functions are well-defined.

The mock data arrays cover various scenarios and the wait function uses act correctly.

src/GraphQl/Mutations/OrganizationMutations.ts Outdated Show resolved Hide resolved
src/GraphQl/Mutations/OrganizationMutations.ts Outdated Show resolved Hide resolved
src/GraphQl/Mutations/OrganizationMutations.ts Outdated Show resolved Hide resolved
Copy link

@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: 0

Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 6a628d9 and caa8670.

Files selected for processing (1)
  • src/GraphQl/Queries/PlugInQueries.ts (3 hunks)
Files skipped from review as they are similar to previous changes (1)
  • src/GraphQl/Queries/PlugInQueries.ts

Copy link

codecov bot commented Jul 31, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 97.98%. Comparing base (036b92e) to head (3ea3775).
Report is 1 commits behind head on develop.

Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #2142      +/-   ##
===========================================
+ Coverage    97.94%   97.98%   +0.04%     
===========================================
  Files          244      244              
  Lines         6958     6949       -9     
  Branches      2010     1998      -12     
===========================================
- Hits          6815     6809       -6     
+ Misses         133      130       -3     
  Partials        10       10              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@disha1202
Copy link
Author

reply.mov

@palisadoes
Copy link
Contributor

@DMills27 @Kevoniat PTAL

coderabbitai[bot]
coderabbitai bot previously approved these changes Sep 22, 2024
@disha1202 disha1202 changed the title Reply functionality Reply functionality for Group Chat and DirectChat Oct 3, 2024
Copy link

This pull request did not get any activity in the past 10 days and will be closed in 180 days if no update occurs. Please verify it has no conflicts with the develop branch and rebase if needed. Mention it now if you need help or give permission to other people to finish your work.

@github-actions github-actions bot added the no-pr-activity No pull request activity label Oct 14, 2024
@palisadoes
Copy link
Contributor

@DMills27 @Kevoniat Please review

@github-actions github-actions bot removed the no-pr-activity No pull request activity label Oct 15, 2024
DMills27
DMills27 previously approved these changes Oct 20, 2024
Copy link
Member

@DMills27 DMills27 left a comment

Choose a reason for hiding this comment

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

LGTM

@DMills27
Copy link
Member

@disha1202 Please resolve the conflicting files.

Copy link

@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: 6

🧹 Outside diff range and nitpick comments (10)
src/components/UserPortal/ChatRoom/ChatRoom.module.css (2)

Line range hint 77-81: LGTM! Consider adding a text color for better accessibility.

The new .userDetails class improves the layout of user information in the chat interface. The use of flexbox for alignment is a good practice.

Consider adding a color property to ensure sufficient contrast with the background for better accessibility. For example:

.userDetails {
  /* existing properties */
  color: #333; /* or any color that provides good contrast */
}

Additional Changes Detected

The shell script execution confirmed the presence of .contactImage, .messageSent:hover, .messageReceived:hover, and @keyframes test in ChatRoom.module.css. Please ensure these changes are included in the review snippet.

🔗 Analysis chain

Line range hint 1-1: Verify completeness of changes.

The AI summary mentioned additional changes to this file, such as updates to .contactImage, hover effects for .messageSent and .messageReceived, and the addition of @keyframes test. However, these changes are not visible in the provided annotated code. Could you please confirm if there are any other changes to this file that should be reviewed?

To help verify the changes, please run the following script:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify changes in ChatRoom.module.css

# Test: Check for changes related to .contactImage, hover effects, and @keyframes
rg -n '\.contactImage|\.messageSent:hover|\.messageReceived:hover|@keyframes test' src/components/UserPortal/ChatRoom/ChatRoom.module.css

Length of output: 335

src/components/UserPortal/ChatRoom/ChatRoom.tsx (3)

Line range hint 180-185: Avoid calling chatRefetch without a dependency array in useEffect.

The useEffect that scrolls the chat area into view does not have a dependency array, causing it to run after every render, which may lead to performance issues.

Consider adding a dependency array:

 useEffect(() => {
   document
     .getElementById('chat-area')
     ?.lastElementChild?.scrollIntoView({ block: 'end' });
- });
+ }, [chat]);

Line range hint 183-183: Handle potential null references when scrolling.

Ensure that document.getElementById('chat-area') and its child elements exist before attempting to scroll, to prevent runtime errors.

Add a safety check:

 useEffect(() => {
-  document
+  const chatArea = document.getElementById('chat-area');
+  if (chatArea && chatArea.lastElementChild) {
     chatArea.lastElementChild.scrollIntoView({ block: 'end' });
+  }
 }, [chat]);

Line range hint 216-221: Improve accessibility by adding aria-label to interactive elements.

The reply button lacks an aria-label, which can hinder accessibility for users using screen readers.

Add an aria-label to the button:

 <Dropdown.Item
   onClick={() => {
     setReplyToDirectMessage(message);
   }}
   data-testid="replyBtn"
+  aria-label="Reply"
 >
   Reply
 </Dropdown.Item>
src/components/UserPortal/ChatRoom/ChatRoom.test.tsx (5)

1221-1221: Remove unnecessary console.log statement in tests

The console.log statement can clutter test output and is generally unnecessary in committed code. Consider removing it to keep the test output clean.

Apply this diff to remove the console log:

-     console.log('MESSAGES', messages);

1306-1306: Remove unnecessary console.log statement in tests

Similar to a previous comment, remove this console.log statement to avoid cluttering the test output.

Apply this diff:

-     console.log('MESSAGES', messages);

Line range hint 1262-1344: Define missing mock data for consistency

In the test 'send message direct chat when userId is different', there are references to mocks like SEND_MESSAGE_TO_DIRECT_CHAT_MOCK and DIRECT_CHAT_BY_ID_QUERY_MOCK which are not defined in the provided code. This could cause the test to fail.

Ensure that these mock data arrays are defined similarly to the other mocks, or adjust the test to use existing mocks.


Line range hint 1455-1510: Reduce code duplication in tests

There is repetitive code in setting up mocks and rendering the ChatRoom component across multiple tests. Consider refactoring to use helper functions or beforeEach blocks to DRY (Don't Repeat Yourself) up the tests.

Create common functions for rendering and mock setup to make the tests more maintainable.


Line range hint 212-272: Consolidate redundant mock data

The mock responses for CHAT_BY_ID with variables { id: '' } and { id: '1' } seem to have similar data structures. Evaluate if all these mocks are necessary or if they can be combined to simplify the test setup.

Streamline the mocks to reduce redundancy and make the tests easier to manage.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between d63eb0e and 9dbc555.

📒 Files selected for processing (4)
  • src/components/UserPortal/ChatRoom/ChatRoom.module.css (1 hunks)
  • src/components/UserPortal/ChatRoom/ChatRoom.test.tsx (12 hunks)
  • src/components/UserPortal/ChatRoom/ChatRoom.tsx (2 hunks)
  • src/components/UserPortal/CreateGroupChat/CreateGroupChat.tsx (1 hunks)
🧰 Additional context used
🔇 Additional comments (4)
src/components/UserPortal/CreateGroupChat/CreateGroupChat.tsx (1)

36-36: Approve type change and verify its impact.

The change from any to string for the id property improves type safety. This is a positive enhancement that will help prevent potential type-related errors and improve code reliability.

To ensure this change doesn't cause any issues elsewhere in the codebase, please run the following script to check for any occurrences of chatsListRefetch being called with a non-string id:

Review the results to ensure all calls to chatsListRefetch provide a string (or undefined) for the id property.

src/components/UserPortal/ChatRoom/ChatRoom.tsx (1)

170-174: Ensure correct subscription data property access.

Double-check the property path messageSubscriptionData?.data.data.messageSentToChat.chatMessageBelongsTo['_id']. Ensure that messageSentToChat contains chatMessageBelongsTo and that this is the correct way to access the chat ID.

Run the following script to verify the structure of the subscription data:

src/components/UserPortal/ChatRoom/ChatRoom.test.tsx (2)

Line range hint 152-272: Verify uniqueness of _id fields in mock data

The _id fields for messages within the CHAT_BY_ID_QUERY_MOCK are all set to '4'. If uniqueness is important for the tests, consider assigning different _id values to each message.

Double-check if the tests depend on unique message IDs and update the mock data accordingly.


1156-1164: ⚠️ Potential issue

Ensure MockSubscriptionLink is correctly integrated

While using MockSubscriptionLink with MockedProvider, ensure that it is properly configured to simulate subscription behavior in your tests. Verify that the link is correctly passed and that any required setup for subscriptions is included.

Confirm that the subscriptions are working as intended in the test environment. If you encounter issues, consider using MockLink or updating your testing approach.

@@ -119,6 +119,7 @@ export default function chatRoom(props: InterfaceChatRoomProps): JSX.Element {
},
});


Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Handle loading and error states for useQuery.

Currently, the useQuery hook does not handle loading and error conditions. Adding these will enhance the user experience and improve the robustness of your component.

Consider updating the code as follows:

 const { data: chatData, refetch: chatRefetch, loading, error } = useQuery(CHAT_BY_ID, {
   variables: {
     id: props.selectedContact,
   },
 });

+ if (loading) return <p>Loading...</p>;
+ if (error) return <p>Error: {error.message}</p>;

Committable suggestion was skipped due to low confidence.

Comment on lines 170 to 174
} else {
chatRefetch({
id: directMessageSubscriptionData?.data.data.messageSentToDirectChat
.directChatMessageBelongsTo['_id'],
});
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix the use of an undefined variable directMessageSubscriptionData.

The variable directMessageSubscriptionData is not defined in this scope. You likely intended to use messageSubscriptionData instead, as that's the parameter provided by the onData callback.

Apply this diff to correct the variable name:

 } else {
   chatRefetch({
-    id: directMessageSubscriptionData?.data.data.messageSentToDirectChat
+    id: messageSubscriptionData?.data.data.messageSentToChat
       .chatMessageBelongsTo['_id'],
   });
 }

Committable suggestion was skipped due to low confidence.

@@ -1185,8 +1183,94 @@ describe('Testing Chatroom Component [User Portal]', () => {
...GROUP_CHAT_BY_ID_QUERY_MOCK,
...SEND_MESSAGE_TO_CHAT_MOCK,
];
const link2 = new StaticMockLink(mocks, true);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

StaticMockLink is not a standard testing utility

The StaticMockLink class used here is not a standard utility provided by @apollo/react-testing or @apollo/client/testing. Ensure that StaticMockLink is properly defined or imported. If it is a custom implementation, include its definition or import statement.

If StaticMockLink is intended to be a custom link, make sure to import it from the appropriate module or define it within the test file.

...SEND_MESSAGE_TO_CHAT_MOCK,
];
const link2 = new StaticMockLink(mocks, true);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

StaticMockLink may not be defined

The use of StaticMockLink here may cause issues if it is not properly defined or imported. Ensure that StaticMockLink is available and correctly used in your tests.

If StaticMockLink is a custom implementation, include its definition or make sure it is correctly imported.

@@ -7,7 +7,7 @@
fireEvent,
waitFor,
} from '@testing-library/react';
import { MockedProvider } from '@apollo/react-testing';
import { MockSubscriptionLink, MockedProvider } from '@apollo/react-testing';
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Update import to use @apollo/client/testing

The import statement is using @apollo/react-testing, which is deprecated. The testing utilities have been moved to @apollo/client/testing in newer versions of Apollo Client. Updating the import will ensure compatibility with the latest versions.

Apply this diff to update the import:

- import { MockSubscriptionLink, MockedProvider } from '@apollo/react-testing';
+ import { MockSubscriptionLink, MockedProvider } from '@apollo/client/testing';
📝 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
import { MockSubscriptionLink, MockedProvider } from '@apollo/react-testing';
import { MockSubscriptionLink, MockedProvider } from '@apollo/client/testing';

Comment on lines 1186 to 1260
const link2 = new StaticMockLink(mocks, true);
render(
<MockedProvider addTypename={false} mocks={mocks}>
<MockedProvider addTypename={false} link={link2}>
<BrowserRouter>
<Provider store={store}>
<I18nextProvider i18n={i18nForTest}>
<ChatRoom selectedContact="1" selectedChatType="direct" />
</I18nextProvider>
</Provider>
</BrowserRouter>
</MockedProvider>,
);
await wait();

const input = (await screen.findByTestId(
'messageInput',
)) as HTMLInputElement;

act(() => {
fireEvent.change(input, { target: { value: 'Hello' } });
});
expect(input.value).toBe('Hello');

const sendBtn = await screen.findByTestId('sendMessage');

expect(sendBtn).toBeInTheDocument();
act(() => {
fireEvent.click(sendBtn);
});
await waitFor(() => {
expect(input.value).toBeFalsy();
});

const messages = await screen.findAllByTestId('directChatMsg');

console.log('MESSAGES', messages);

expect(messages.length).not.toBe(0);

act(() => {
fireEvent.mouseOver(messages[0]);
});

await waitFor(async () => {
expect(await screen.findByTestId('moreOptions')).toBeInTheDocument();
});

const moreOptionsBtn = await screen.findByTestId('dropdown');
act(() => {
fireEvent.click(moreOptionsBtn);
});

const replyBtn = await screen.findByTestId('replyBtn');

act(() => {
fireEvent.click(replyBtn);
});

const replyMsg = await screen.findByTestId('replyMsg');

await waitFor(() => {
expect(replyMsg).toBeInTheDocument();
});

act(() => {
fireEvent.change(input, { target: { value: 'Test reply message' } });
});
expect(input.value).toBe('Test reply message');

act(() => {
fireEvent.click(sendBtn);
});

await wait(400);
});
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Wrap asynchronous operations in act

When testing components that involve asynchronous state changes, it's important to wrap these operations in act to ensure that all updates are processed before making assertions. This helps maintain the integrity of the test and prevents warnings.

For example, wrap your asynchronous code like this:

- render(
+ await act(async () => {
+   render(
      // existing render code
-   );
+   );
+ });

And ensure that any awaiting of operations is properly handled.

Committable suggestion was skipped due to low confidence.

Copy link

@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

🧹 Outside diff range and nitpick comments (8)
src/components/UserPortal/ChatRoom/ChatRoom.test.tsx (3)

Line range hint 1216-1234: Enhance subscription testing in 'Selected contact is direct chat' test

The test now uses MockSubscriptionLink, which is good for testing subscription-based functionality. However, consider adding specific assertions to verify the subscription behavior.

Consider adding assertions like:

// After triggering an action that should cause a subscription update
await waitFor(() => {
  expect(link.operations.length).toBeGreaterThan(0);
  expect(link.operations[0].query).toEqual(MESSAGE_SENT_TO_CHAT);
});

1246-1320: Improve 'send message direct chat' test

The test has been enhanced with more detailed assertions and interactions, which is great for improving coverage. However, there are a couple of points to address:

  1. Remove the console.log statement used for debugging.
  2. Consider adding more specific assertions for the reply functionality.

Apply this diff to remove the console.log:

- console.log('MESSAGES', messages);

Also, consider adding more specific assertions for the reply functionality, such as:

const replyMessage = await screen.findByText('Test reply message');
expect(replyMessage).toBeInTheDocument();

Line range hint 1322-1404: Refactor duplicate code in chat tests

The new test 'send message direct chat when userId is different' contains logic similar to the previous 'send message direct chat' test. Consider refactoring common test logic into a separate function to improve maintainability and reduce code duplication.

Create a helper function for common test logic:

async function testSendMessageAndReply(userId) {
  setItem('userId', userId);
  // ... (common setup code)

  const input = await screen.findByTestId('messageInput');
  const sendBtn = await screen.findByTestId('sendMessage');

  // Test sending message
  fireEvent.change(input, { target: { value: 'Hello' } });
  fireEvent.click(sendBtn);
  await waitFor(() => expect(input.value).toBeFalsy());

  // Test replying to message
  const messages = await screen.findAllByTestId('message');
  fireEvent.mouseOver(messages[0]);
  const moreOptionsBtn = await screen.findByTestId('dropdown');
  fireEvent.click(moreOptionsBtn);
  const replyBtn = await screen.findByTestId('replyBtn');
  fireEvent.click(replyBtn);

  // ... (common assertions)
}

// Use the helper function in both tests
test('send message direct chat', async () => {
  await testSendMessageAndReply('2');
});

test('send message direct chat when userId is different', async () => {
  await testSendMessageAndReply('8');
});
src/components/UserPortal/CreateGroupChat/CreateGroupChat.test.tsx (5)

Line range hint 2231-2267: Improve test coverage and accuracy for modal opening/closing

The test case for opening and closing the create new group chat modal could be enhanced:

  1. Update the test name to accurately reflect that it's testing the group chat modal, not direct chat.
  2. Add an assertion to verify that the modal is open before attempting to close it.
  3. Add an assertion to confirm that the modal is closed after clicking the close button.

Consider applying these changes:

-  test('open and close create new direct chat modal', async () => {
+  test('open and close create new group chat modal', async () => {
     // ... existing setup code ...
     
     fireEvent.click(newGroupChatBtn);
+    
+    const modal = await screen.findByTestId('createGroupChatModal');
+    expect(modal).toBeInTheDocument();
 
     const closeButton = screen.getByRole('button', { name: /close/i });
     expect(closeButton).toBeInTheDocument();
 
     fireEvent.click(closeButton);
+    
+    await waitFor(() => {
+      expect(screen.queryByTestId('createGroupChatModal')).not.toBeInTheDocument();
+    });
   });

Line range hint 2269-2367: Refactor and improve the "create new group chat" test

This test case could benefit from some cleanup and additional assertions:

  1. Remove commented-out code and console.log statements to improve readability.
  2. Add assertions to verify the final state after creating the group chat.
  3. Optimize the use of act() and waitFor() for better test stability.

Apply these changes to improve the test:

  1. Remove commented-out code and console.log statements.
  2. Add an assertion to verify that the modal is closed after creating the group chat.
  3. Add an assertion to check if the new group chat appears in the chat list.

Here's a simplified version of how you could structure the test:

test('create new group chat', async () => {
  // ... existing setup code ...

  // Open the modal
  const dropdown = await screen.findByTestId('dropdown');
  userEvent.click(dropdown);
  const newGroupChatBtn = await screen.findByTestId('newGroupChat');
  userEvent.click(newGroupChatBtn);

  // Fill in the form
  const modal = await screen.findByTestId('createGroupChatModal');
  const groupTitleInput = within(modal).getByLabelText('Group name');
  userEvent.type(groupTitleInput, 'Test Group');

  const orgSelect = within(modal).getByLabelText('Select Organization');
  userEvent.click(orgSelect);
  const optionsPopupEl = await screen.findByRole('listbox', { name: /select organization/i });
  userEvent.click(within(optionsPopupEl).getByText(/any organization/i));

  // Navigate to the next step and create the group
  const nextBtn = within(modal).getByTestId('nextBtn');
  userEvent.click(nextBtn);
  const createBtn = await within(modal).findByTestId('createBtn');
  userEvent.click(createBtn);

  // Assert that the modal is closed and the new group chat appears in the list
  await waitFor(() => {
    expect(screen.queryByTestId('createGroupChatModal')).not.toBeInTheDocument();
  });

  const newGroupChatElement = await screen.findByText('Test Group');
  expect(newGroupChatElement).toBeInTheDocument();
});

This structure simplifies the test, removes unnecessary waits, and adds important assertions to verify the outcome of creating a new group chat.


Line range hint 2369-2461: Enhance "add and remove user" test with additional assertions

The test case for adding and removing users could be improved to provide better coverage and more meaningful assertions:

  1. Add assertions to verify the state of the user list after adding and removing users.
  2. Verify the results of the user search functionality.
  3. Assert the effects of the submit action.

Consider applying these changes to improve the test:

test('add and remove user', async () => {
  setItem('userId', '1');
  // ... existing setup code ...

  // Open the modal and navigate to the user selection step
  const dropdown = await screen.findByTestId('dropdown');
  userEvent.click(dropdown);
  const newGroupChatBtn = await screen.findByTestId('newGroupChat');
  userEvent.click(newGroupChatBtn);
  const nextBtn = await screen.findByTestId('nextBtn');
  userEvent.click(nextBtn);

  // Add a user
  const addBtns = await screen.findAllByTestId('addBtn');
  const firstUserName = await screen.findByText(/Deanne Marks/);
  userEvent.click(addBtns[0]);
  
  // Assert that the user is added to the selected list
  const removeBtn = await screen.findByText('Remove');
  expect(removeBtn).toBeInTheDocument();
  expect(firstUserName).toBeInTheDocument();

  // Remove the user
  userEvent.click(removeBtn);
  await waitFor(() => {
    expect(screen.queryByText('Remove')).not.toBeInTheDocument();
  });
  expect(addBtns[0]).toBeInTheDocument();

  // Test search functionality
  const searchInput = screen.getByTestId('searchUser');
  userEvent.type(searchInput, 'Disha');
  
  // Assert that search results are updated
  await waitFor(() => {
    expect(screen.getByText(/Disha/)).toBeInTheDocument();
    expect(screen.queryByText(/Deanne Marks/)).not.toBeInTheDocument();
  });

  // Submit the form
  const submitBtn = screen.getByTestId('submitBtn');
  userEvent.click(submitBtn);

  // Assert that the modal is closed after submission
  await waitFor(() => {
    expect(screen.queryByTestId('createGroupChatModal')).not.toBeInTheDocument();
  });

  // Optionally, assert that the new group chat appears in the list
  // This depends on how your component updates the UI after creating a group
  // const newGroupChatElement = await screen.findByText('Test Group');
  // expect(newGroupChatElement).toBeInTheDocument();
});

These changes will make the test more robust by verifying the state changes after each action and ensuring that the search and submit functionalities work as expected.


Line range hint 1-2461: Improve overall test structure and reduce redundancy

The test file for CreateGroupChat component is comprehensive but could benefit from some structural improvements:

  1. Consider extracting common setup code into a separate function or using beforeEach to reduce redundancy across tests.
  2. Standardize the use of act() and waitFor() across all tests for consistency.
  3. Consider adding more specific test cases for edge scenarios, such as validation errors or network failures.

Here's an example of how you could structure the common setup:

describe('CreateGroupChat', () => {
  const renderComponent = () => {
    const mock = [
      ...USER_JOINED_ORG_MOCK,
      ...GROUP_CHAT_BY_ID_QUERY_MOCK,
      ...MESSAGE_SENT_TO_CHAT_MOCK,
      ...CHAT_BY_ID_QUERY_MOCK,
      ...CHATS_LIST_MOCK,
      ...UserConnectionListMock,
      ...CREATE_CHAT_MUTATION,
    ];

    return render(
      <MockedProvider addTypename={false} mocks={mock}>
        <BrowserRouter>
          <Provider store={store}>
            <I18nextProvider i18n={i18nForTest}>
              <Chat />
            </I18nextProvider>
          </Provider>
        </BrowserRouter>
      </MockedProvider>
    );
  };

  const openCreateGroupChatModal = async () => {
    const dropdown = await screen.findByTestId('dropdown');
    userEvent.click(dropdown);
    const newGroupChatBtn = await screen.findByTestId('newGroupChat');
    userEvent.click(newGroupChatBtn);
  };

  // Your test cases here, using renderComponent() and openCreateGroupChatModal()
});

This structure will make your tests more maintainable and easier to read. Additionally, consider adding tests for error handling and edge cases to increase your test coverage.


Line range hint 1-2461: Optimize test utilities and setup

The test file includes some custom utilities and mocks that could be optimized:

  1. The custom wait function could be replaced with more standard testing utilities.
  2. The window.matchMedia mock could be moved to a separate setup file for better reusability.

Consider these improvements:

  1. Replace the custom wait function with waitFor from @testing-library/react:
import { waitFor } from '@testing-library/react';

// Instead of:
// await wait();

// Use:
await waitFor(() => {
  // Your expectations here
});
  1. Move the window.matchMedia mock to a separate setup file (e.g., setupTests.js):
// setupTests.js
Object.defineProperty(window, 'matchMedia', {
  writable: true,
  value: jest.fn().mockImplementation(query => ({
    matches: false,
    media: query,
    onchange: null,
    addListener: jest.fn(),
    removeListener: jest.fn(),
    addEventListener: jest.fn(),
    removeEventListener: jest.fn(),
    dispatchEvent: jest.fn(),
  })),
});

Then, in your Jest configuration (usually in package.json or jest.config.js), add:

{
  "setupFiles": ["./setupTests.js"]
}

These changes will make your tests more maintainable and aligned with testing best practices.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 9dbc555 and 3ea3775.

📒 Files selected for processing (7)
  • src/GraphQl/Mutations/OrganizationMutations.ts (0 hunks)
  • src/GraphQl/Queries/PlugInQueries.ts (0 hunks)
  • src/GraphQl/Queries/Queries.ts (0 hunks)
  • src/components/UserPortal/ChatRoom/ChatRoom.test.tsx (13 hunks)
  • src/components/UserPortal/ChatRoom/ChatRoom.tsx (1 hunks)
  • src/components/UserPortal/CreateGroupChat/CreateGroupChat.test.tsx (4 hunks)
  • src/screens/UserPortal/Chat/Chat.test.tsx (0 hunks)
💤 Files with no reviewable changes (4)
  • src/GraphQl/Mutations/OrganizationMutations.ts
  • src/GraphQl/Queries/PlugInQueries.ts
  • src/GraphQl/Queries/Queries.ts
  • src/screens/UserPortal/Chat/Chat.test.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/UserPortal/ChatRoom/ChatRoom.tsx
🧰 Additional context used
🔇 Additional comments (3)
src/components/UserPortal/ChatRoom/ChatRoom.test.tsx (3)

149-149: Verify consistency of mock data changes

The _id fields in various mock data objects have been updated. Ensure that these changes are consistent across all mocks and that they don't unintentionally break existing tests or affect the behavior of the component under test.

Run the following script to check for consistency in mock data IDs:

#!/bin/bash
# Description: Check consistency of mock data IDs

# Test: Look for inconsistencies in mock data IDs
rg -A 5 '_id: .(1|2|4|345678).' src/components/UserPortal/ChatRoom/ChatRoom.test.tsx

Also applies to: 208-208, 267-267, 803-803, 886-886, 969-969


1026-1106: Verify usage of new SEND_MESSAGE_TO_CHAT_MOCK cases

New mock cases have been added to SEND_MESSAGE_TO_CHAT_MOCK for different reply scenarios. Ensure that these new cases are utilized in the tests and that they cover all relevant use cases for replying to messages.

Run the following script to check the usage of new mock cases in tests:

#!/bin/bash
# Description: Check usage of new SEND_MESSAGE_TO_CHAT_MOCK cases in tests

# Test: Look for test cases using the new mock scenarios
rg -A 5 'Test reply message' src/components/UserPortal/ChatRoom/ChatRoom.test.tsx

10-10: ⚠️ Potential issue

Update Apollo Client testing import

The import statement is using @apollo/react-testing, which is deprecated. Consider updating to the latest Apollo Client testing utilities.

Apply this diff to update the import:

- import { MockSubscriptionLink, MockedProvider } from '@apollo/react-testing';
+ import { MockSubscriptionLink, MockedProvider } from '@apollo/client/testing';

Likely invalid or redundant comment.

Comment on lines +1515 to +1517
const link2 = new StaticMockLink(mocks, true);
render(
<MockedProvider addTypename={false} mocks={mocks}>
<MockedProvider addTypename={false} link={link2}>
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Enhance 'reply to message' test

The test now uses StaticMockLink, which provides better control over mock responses. However, consider the following improvements:

  1. Use the previously suggested helper function to reduce code duplication.
  2. Add more specific assertions for the reply functionality.

Refactor the test to use the helper function:

test('reply to message', async () => {
  await testSendMessageAndReply('1');
  
  // Add specific assertions for reply functionality
  const replyMessage = await screen.findByText('Test reply message');
  expect(replyMessage).toBeInTheDocument();
  
  // Verify that the reply is associated with the original message
  const originalMessage = await screen.findByText('Test message');
  expect(originalMessage).toHaveAttribute('data-testid', 'original-message');
  expect(replyMessage).toHaveAttribute('data-testid', 'reply-to-message');
});

@@ -20,6 +20,7 @@
} from 'GraphQl/Mutations/OrganizationMutations';
import ChatRoom from './ChatRoom';
import { useLocalStorage } from 'utils/useLocalstorage';
import { StaticMockLink } from 'utils/StaticMockLink';
Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

StaticMockLink.ts File Missing

The utils/StaticMockLink.ts file imported in ChatRoom.test.tsx does not exist. Please verify the file's location or update the import path accordingly.

  • File: src/components/UserPortal/ChatRoom/ChatRoom.test.tsx
    • Line: 23
🔗 Analysis chain

Verify StaticMockLink implementation

Ensure that the StaticMockLink utility is properly implemented in the utils/StaticMockLink file and that it provides the necessary functionality for these tests.

Run the following script to check the implementation of StaticMockLink:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation of StaticMockLink

# Test: Check if the StaticMockLink file exists and contains the expected class
rg -A 5 'class StaticMockLink' utils/StaticMockLink.ts

Length of output: 1415


Script:

#!/bin/bash
# Description: Verify the existence and export of StaticMockLink in utils/StaticMockLink.ts

# Check if the StaticMockLink.ts file exists
if [ -f utils/StaticMockLink.ts ]; then
  echo "utils/StaticMockLink.ts exists."
  
  # Search for any export named StaticMockLink
  rg 'export\s+(class|const|function|default\s+class)\s+StaticMockLink' utils/StaticMockLink.ts
else
  echo "utils/StaticMockLink.ts does not exist."
  exit 1
fi

Length of output: 134

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