Skip to content

Conversation

@Ronan-Fernandes
Copy link
Contributor

@Ronan-Fernandes Ronan-Fernandes commented Jan 24, 2025

  • __package_name__ package update - v __package_version__
    • changelog_info
    • changelog_info

Summary by CodeRabbit

  • New Features

    • Added Markdown rendering support with syntax highlighting
    • Introduced Lazy Load Image component for optimized image loading
    • Enhanced message input with Markdown editor capabilities
  • Improvements

    • Updated text input components to support Markdown editing
    • Improved image rendering with lazy loading and aspect ratio control
  • Design System Updates

    • Added new Markdown and LazyLoadImage components
    • Expanded input component flexibility

@changeset-bot
Copy link

changeset-bot bot commented Jan 24, 2025

⚠️ No Changeset found

Latest commit: 88d0f9d

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai
Copy link

coderabbitai bot commented Jan 24, 2025

Warning

There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure.

🔧 eslint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

packages/components/modules/messages/MessageUpdate/index.tsx

Oops! Something went wrong! :(

ESLint: 8.57.1

Error: Cannot read config file: /packages/components/.eslintrc.js
Error: Cannot find module '@baseapp-frontend/config/.eslintrc.js'
Require stack:

  • /packages/components/.eslintrc.js
  • /node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs
  • /node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/cli-engine/cli-engine.js
  • /node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/eslint/eslint.js
  • /node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/eslint/index.js
  • /node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/cli.js
  • /node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/bin/eslint.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1248:15)
    at Module._load (node:internal/modules/cjs/loader:1074:27)
    at TracingChannel.traceSync (node:diagnostics_channel:315:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:217:24)
    at Module.require (node:internal/modules/cjs/loader:1339:12)
    at require (node:internal/modules/helpers:135:16)
    at Object. (/packages/components/.eslintrc.js:1:18)
    at Module._compile (node:internal/modules/cjs/loader:1546:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)
    at Module.load (node:internal/modules/cjs/loader:1317:32)

Walkthrough

This pull request introduces a comprehensive enhancement to the messaging system by integrating Markdown support across multiple components. The changes span the design system and messaging modules, adding new components like LazyLoadImage, MarkdownEditor, and Markdown. These additions provide more flexible text rendering, syntax highlighting, and improved image loading capabilities. The modifications enable richer text formatting, lazy image loading, and a more dynamic user interface for message creation and display.

Changes

File Change Summary
packages/components/modules/messages/* Added Markdown rendering and MarkdownEditor support in MessageUpdate, MessagesList, and SendMessage components
packages/design-system/components/Markdown/* New Markdown component with syntax highlighting, custom rendering for links and images
packages/design-system/components/images/LazyLoadImage/* New LazyLoadImage component with aspect ratio support and lazy loading
packages/design-system/components/inputs/MarkdownEditor/* New MarkdownEditor component with customizable markdown editing
packages/design-system/components/inputs/SocialTextField/* Modified to support dynamic TextField rendering

Sequence Diagram

sequenceDiagram
    participant User
    participant SendMessage
    participant MarkdownEditor
    participant Markdown
    participant MessagesList

    User->>SendMessage: Compose message
    SendMessage->>MarkdownEditor: Input markdown text
    MarkdownEditor-->>SendMessage: Processed markdown
    SendMessage->>MessagesList: Send message
    MessagesList->>Markdown: Render message
    Markdown-->>MessagesList: Formatted message
Loading

Possibly related PRs

Suggested reviewers

  • anicioalexandre
  • deboracosilveira
  • pt-tsl

Poem

🐰 Markdown magic, bits of delight,
Rendering text with technical might
Lazy images dance, editors gleam
A rabbit's code is a programmer's dream!
Hop, hop, hooray for clean design! 🚀

✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

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 generate docstrings to generate docstrings for this PR. (Beta)
  • @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.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

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

@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

🧹 Nitpick comments (13)
packages/design-system/components/Markdown/highlight.ts (2)

4-8: Global declaration of hljs
Defining hljs on the global window object can lead to potential conflicts or shadowing in certain environments. Consider abstracting the highlight logic instead of adding it to the global scope.


14-16: Conditional attachment to the window object
While checking typeof window !== 'undefined' for SSR compatibility is helpful, you may still want to isolate hljs usage in a dedicated utility for improved testability and reduced global pollution.

packages/design-system/components/images/LazyLoadImage/utils.ts (1)

3-15: Provide a fallback or error for unrecognized ratio.

Currently, this function returns undefined if a non-predefined ratio is passed, which may break layouts if the calling code doesn't handle undefined. Consider providing a meaningful fallback or throwing an error for unrecognized ratios.

Example refactor:

-export function getRatio(ratio = '1/1') {
-  return {
-    '4/3': 'calc(100% / 4 * 3)',
-    '3/4': 'calc(100% / 3 * 4)',
-    '6/4': 'calc(100% / 6 * 4)',
-    '4/6': 'calc(100% / 4 * 6)',
-    '16/9': 'calc(100% / 16 * 9)',
-    '9/16': 'calc(100% / 9 * 16)',
-    '21/9': 'calc(100% / 21 * 9)',
-    '9/21': 'calc(100% / 9 * 21)',
-    '1/1': '100%',
-  }[ratio]
+export function getRatio(ratio = '1/1'): string {
+  const ratioMap: Record<string, string> = {
+    '4/3': 'calc(100% / 4 * 3)',
+    '3/4': 'calc(100% / 3 * 4)',
+    '6/4': 'calc(100% / 6 * 4)',
+    '4/6': 'calc(100% / 4 * 6)',
+    '16/9': 'calc(100% / 16 * 9)',
+    '9/16': 'calc(100% / 9 * 16)',
+    '21/9': 'calc(100% / 21 * 9)',
+    '9/21': 'calc(100% / 9 * 21)',
+    '1/1': '100%',
+  }
+  return ratioMap[ratio] || ratioMap['1/1']
}
packages/design-system/components/images/LazyLoadImage/types.ts (1)

1-20: Unify ratio definitions with the logic in getRatio.

Ensure that the string literals in LazyLoadImageRatio always match the explicit keys handled by getRatio to avoid runtime mismatches. Consider centralizing these values in a single script or shared enum.

packages/design-system/components/images/LazyLoadImage/index.tsx (2)

14-36: Provide clearer naming & doc-block for clarity on forwarded ref usage.

While using forwardRef here is appropriate, adding a short JSDoc-style comment describing the forwarded ref purpose will help other developers understand how to interact with the component.

+/**
+ * LazyLoadImage component uses forwardRef to pass a ref to the underlying container.
+ * This can be especially useful in scenarios where parent components need direct access
+ * to DOM elements for measurements or scroll events.
+ */
 const LazyLoadImage = forwardRef<HTMLSpanElement, LazyLoadImageProps>(
   ...
 )

41-52: Overlay logic is implemented neatly; consider layering options to handle complex backgrounds.

Everything looks organized. If you anticipate gradient overlays or additional styling, expand the overlay logic with more flexible props or a new prop interface (e.g., overlayProps).

packages/components/modules/messages/SendMessage/index.tsx (1)

6-6: Check if dynamic imports are needed for performance.

Importing MarkdownEditor on demand could improve initial load times if large dependencies are involved. Consider using a dynamic import if performance metrics show the need for lazy loading.

packages/design-system/components/Markdown/styled.ts (3)

16-20: Pause on styling <br> as a grid element.
Styling the <br> tag with display: 'grid' and adding content can break standard line-break semantics in certain contexts. Consider verifying it in cross-browser scenarios to ensure it doesn’t create unexpected spacing issues.


42-70: Check blockquote’s large font size for consistency.
A fontSize of 1.5em for blockquotes may be significantly larger than the surrounding text, which can disrupt reading flow in some designs. Confirm the design intention or consider adjusting it if it looks out of place in the final UI.


106-140: Improve keyboard accessibility for custom checkboxes.
The custom styling for checkboxes is visually appealing, but ensure keyboard navigation, focus styling, and ARIA attributes remain intact. You may need additional :focus or :focus-visible styles for better accessibility compliance.

packages/design-system/package.json (2)

54-54: Revisit the re-addition of @baseapp-frontend/tsconfig.
Removing and re-adding the same version might indicate a version mismatch or a prior installation issue. Double-check that this dev dependency is at the correct version to maintain consistent type definitions across all packages.


66-70: Ensure correct type definitions batch import.
The type definitions for highlight.js and react-lazy-load-image-component are pinned to specific versions. If those libraries update, these type definitions might lag behind. Keep an eye on new library releases to maintain compatibility.

packages/design-system/components/inputs/SocialTextField/types.ts (1)

15-15: Consider a more robust type strategy to avoid potential mismatches.

By using a union type for FC<TextareaFieldProps> | FC<MarkdownEditorProps>, it’s possible to introduce runtime type mismatches if the parent incorrectly passes markdown-based components expecting text-area props, or vice versa. Consider introducing a safe fallback or a discriminated union to guarantee correct usage.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e2e807c and 678baec.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (20)
  • packages/components/modules/messages/MessageUpdate/index.tsx (2 hunks)
  • packages/components/modules/messages/MessagesList/MessagesGroup/UserMessage/MessageItem/index.tsx (2 hunks)
  • packages/components/modules/messages/SendMessage/index.tsx (2 hunks)
  • packages/design-system/components/Markdown/highlight.ts (1 hunks)
  • packages/design-system/components/Markdown/index.tsx (1 hunks)
  • packages/design-system/components/Markdown/styled.ts (1 hunks)
  • packages/design-system/components/Markdown/types.ts (1 hunks)
  • packages/design-system/components/images/LazyLoadImage/__storybook__/stories.tsx (1 hunks)
  • packages/design-system/components/images/LazyLoadImage/index.tsx (1 hunks)
  • packages/design-system/components/images/LazyLoadImage/types.ts (1 hunks)
  • packages/design-system/components/images/LazyLoadImage/utils.ts (1 hunks)
  • packages/design-system/components/images/index.ts (1 hunks)
  • packages/design-system/components/inputs/MarkdownEditor/MarkdownEditorStyles.css (1 hunks)
  • packages/design-system/components/inputs/MarkdownEditor/index.tsx (1 hunks)
  • packages/design-system/components/inputs/MarkdownEditor/types.ts (1 hunks)
  • packages/design-system/components/inputs/SocialTextField/index.tsx (2 hunks)
  • packages/design-system/components/inputs/SocialTextField/types.ts (1 hunks)
  • packages/design-system/components/inputs/index.ts (1 hunks)
  • packages/design-system/index.ts (1 hunks)
  • packages/design-system/package.json (3 hunks)
✅ Files skipped from review due to trivial changes (1)
  • packages/design-system/components/inputs/MarkdownEditor/MarkdownEditorStyles.css
🧰 Additional context used
🪛 GitHub Actions: Main Workflow
packages/design-system/components/inputs/SocialTextField/index.tsx

[error] 51-51: Type mismatch error: The provided type for component props is not assignable to the expected type. This appears to be related to Control and MDEditorProps type definitions.

packages/design-system/components/Markdown/index.tsx

[error] 2-2: CommonJS module imports will produce 'require' calls but referenced file is an ECMAScript module and cannot be imported with 'require'

🪛 Biome (1.9.4)
packages/design-system/components/Markdown/index.tsx

[error] 20-20: Avoid the delete operator which can impact performance.

Unsafe fix: Use an undefined assignment instead.

(lint/performance/noDelete)

🔇 Additional comments (21)
packages/design-system/components/images/index.ts (1)

3-3: Add new export for LazyLoadImage
This addition looks consistent with the existing pattern of exporting image components in this index file.

packages/design-system/components/Markdown/types.ts (1)

1-6: Interface extension approach looks good
By extending Options from react-markdown and adding a flexible sx prop, you keep styling concerns cleanly separated while retaining all base Markdown options.

packages/design-system/components/inputs/MarkdownEditor/types.ts (1)

1-11: MarkdownEditorProps type structure
Combining MDEditorProps and FormControl along with optional handlers (e.g. onKeyDown) and placeholders appears both flexible and consistent with common form patterns in this codebase.

packages/design-system/components/Markdown/highlight.ts (2)

1-2: Importing Highlight.js and applying a theme
The chosen tomorrow-night.css theme ensures a dark code syntax highlight. This is a sound default for improved readability.


10-12: Whitelisted languages for config
Specifically configuring only necessary languages helps optimize performance while still offering robust highlighting. This targeted approach is good practice.

packages/design-system/components/inputs/index.ts (1)

1-2: Re-exporting MarkdownEditor and types looks good.

This approach provides a consistent entry point for consumers of the design-system, keeping import statements clean and well-organized.

packages/design-system/components/images/LazyLoadImage/__storybook__/stories.tsx (1)

1-28: Code structure and Storybook usage look great!

All newly introduced lines in this Storybook file appear well-structured, with clear separation of the default story variant. The usage of Meta, StoryFn, and StoryObj from @storybook/react adheres to best practices, making it straightforward to add additional story variations in the future.

packages/design-system/components/inputs/MarkdownEditor/index.tsx (1)

12-36: Integration with @uiw/react-md-editor is properly implemented.

The Markdown editor setup is intuitive, especially the usage of onKeyDown for custom controls. The container class approach is concise, and the custom placeholder logic in textareaProps is a nice touch.

packages/design-system/index.ts (1)

47-49: Exporting the Markdown component via index.ts is consistent with other exports.

This follows the existing pattern and improves discoverability by allowing consumers to import the Markdown component and its types directly from the design-system index. No further issues identified.

packages/components/modules/messages/MessagesList/MessagesGroup/UserMessage/MessageItem/index.tsx (2)

4-4: Importing the Markdown component is a good step towards rendering rich text.

This addition cleanly reuses the design-system’s Markdown component. Just verify that there aren’t any unused imports left in the file, and ensure that you are bundling only relevant icons.


40-41: Replacing raw text with the Markdown component is an excellent move.

You have commented out the raw text usage in Typography and introduced <Markdown>. This is a clean approach, preserving formatting while also supporting additional features such as links and bold/italic text.

packages/design-system/components/images/LazyLoadImage/index.tsx (2)

54-72: Ensure placeholders exist and are optimized.

You’re correctly handling placeholders by providing a transparent image or a blur effect. If you expect large images, consider using a lightweight placeholder (e.g., a small low-resolution or base64-encoded image) to optimize page performance.


86-115: Excellent ratio-based styling approach.

Using the getRatio helper for aspect ratios is clean. Keep in mind that if you handle videos or unusual image sizes, you may need to expand logic to avoid content shifting.

packages/components/modules/messages/SendMessage/index.tsx (1)

128-130: Introducing the MarkdownEditor is a nice enhancement.

Passing MarkdownEditor to SocialTextFieldProps is straightforward and cleanly encapsulated. Ensure you thoroughly test the user experience, especially around editor initialization times or in lower-bandwidth scenarios.

packages/design-system/components/Markdown/styled.ts (2)

3-4: Consider clarifying the fallback for dark mode.
You’re assigning lightMode based on theme.palette.mode === 'light', but there’s no direct check for theme.palette.mode === 'dark'. If another mode is introduced or if the theme mode is set differently in some contexts, the style logic may produce unexpected behavior.


72-91: Ensure consistent code highlighting background in dark mode.
backgroundColor: lightMode ? theme.palette.grey[900] : alpha(theme.palette.grey[500], 0.16) yields a dark background even when not in dark mode. Verify that this color difference is intentional for the code blocks in dark themes.

packages/components/modules/messages/MessageUpdate/index.tsx (1)

149-151: Confirm fallback behavior for non-Markdown inputs.
Setting TextField to MarkdownEditor within SocialTextFieldProps is a nice integration. However, verify if other areas of the app that rely on plain text editing still work properly, or if they also default to Markdown.

packages/design-system/package.json (1)

28-40: Validate newly added Markdown dependencies.
You’ve added @uiw/react-md-editor, highlight.js, react-markdown, and related plugins. Confirm that your bundling process, minification, and tree-shaking properly handle these new libraries to avoid bloating the final bundle.

packages/design-system/components/inputs/SocialTextField/types.ts (3)

1-1: Glad to see FC being used for typed functional components.

This import from React is standard for ensuring type safety on custom functional components.


5-5: Import of MarkdownEditorProps looks correct.

The referencing of MarkdownEditorProps is necessary for supporting Markdown editor components.


7-7: TextareaFieldProps import is correctly placed.

No issues with this import; it aligns well with the existing structure.

@@ -0,0 +1,47 @@
import Link from '@mui/material/Link'
import ReactMarkdown from 'react-markdown'
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Resolve pipeline failure for ESM imports vs. CommonJS.

A pipeline error indicates that CommonJS imports produce require calls, conflicting with ESM modules. Ensure your build config or bundler settings handle ESM imports properly. You may need to adjust your tsconfig.json or Babel configuration to enable ESM for react-markdown or vice versa.

🧰 Tools
🪛 GitHub Actions: Main Workflow

[error] 2-2: CommonJS module imports will produce 'require' calls but referenced file is an ECMAScript module and cannot be imported with 'require'

Comment on lines 19 to 21
// eslint-disable-next-line no-param-reassign
delete props.target
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Avoid using the delete operator on function parameters.

Deleting properties from an object can degrade performance and trigger deoptimizations. Instead, consider assigning undefined to remove target.

Here's how you could refactor:

-  delete props.target
+  props.target = undefined
📝 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
// eslint-disable-next-line no-param-reassign
delete props.target
}
// eslint-disable-next-line no-param-reassign
props.target = undefined
}
🧰 Tools
🪛 Biome (1.9.4)

[error] 20-20: Avoid the delete operator which can impact performance.

Unsafe fix: Use an undefined assignment instead.

(lint/performance/noDelete)

isReply,
replyTargetName,
onCancelReply,
TextField = TextareaField,
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 type mismatch introduced by the TextField prop.

The pipeline reports that the provided props type for TextField is not assignable. Ensure that the union of TextareaFieldProps and MarkdownEditorProps is handled properly in SocialTextFieldProps, or provide a type guard. For instance:

-  TextField?: FC<TextareaFieldProps> | FC<MarkdownEditorProps>
+  TextField?: FC<TextareaFieldProps & Partial<MarkdownEditorProps>>

or maintain a strict union with type narrowing inside SocialTextField:

if (isMarkdownEditor(TextField)) {
  // handle MarkdownEditorProps
} else {
  // handle TextareaFieldProps
}

Adjusting these definitions and usage will resolve the TS error and pipeline failure.

Also applies to: 51-51

@Ronan-Fernandes Ronan-Fernandes force-pushed the BA-2167-FE-markdown-editor branch from 678baec to 1f141a4 Compare February 13, 2025 16:37
@Ronan-Fernandes Ronan-Fernandes force-pushed the BA-2167-FE-markdown-editor branch 2 times, most recently from e801459 to a21158f Compare February 17, 2025 16:06
@priscilladeroode
Copy link
Contributor

@anicioalexandre and @Ronan-Fernandes does this PR still makes sense? If no, can we close it? If yes, can you please rebase @Ronan-Fernandes ?

@anicioalexandre anicioalexandre added the needs review PR needs to be reviewed. label Mar 12, 2025
Fixes after rebase
@Ronan-Fernandes Ronan-Fernandes force-pushed the BA-2167-FE-markdown-editor branch from aed2b4f to 88d0f9d Compare March 20, 2025 11:33
@sonarqubecloud
Copy link

@anicioalexandre anicioalexandre added needs changes PR was reviewed, and changes are required. and removed needs review PR needs to be reviewed. labels Mar 26, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs changes PR was reviewed, and changes are required.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants