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

fix: FE loading button on login page, resolves #1122 #1219

Merged
merged 4 commits into from
Dec 2, 2024

Conversation

ajhollid
Copy link
Collaborator

@ajhollid ajhollid commented Nov 27, 2024

This PR replaces the regular button on the login page with a LoadingButton to indicate loading is in progress.

  • Replace Button with LoadingButton
    • Use auth slice's loading state with the LoadingButton to indicate loading
  • Update theme to selectively apply button styling, ignore loading button
Screencast.from.2024-11-27.13-58-56.webm

Copy link

coderabbitai bot commented Nov 27, 2024

Walkthrough

The changes in the Login.jsx component enhance the login process by introducing a loading state. A LoadingButton from @mui/lab is now used for the submission action, providing visual feedback during login requests. The component accesses the authentication state via the useSelector hook, allowing it to reflect the loading status. Minor adjustments ensure the new button maintains the previous visual style, while the overall structure of the login steps remains unchanged.

Changes

File Path Change Summary
Client/src/Pages/Auth/Login.jsx - Added LoadingButton for login submission.
- Integrated useSelector to access authState.
- Minor adjustments to button properties for visual consistency.
Client/src/Utils/Theme/globalTheme.js - Modified MuiButton style overrides for disabled state to exclude buttons with loadingIndicator class.
- Improved organization by separating MuiButton styles from MuiIconButton styles.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant StepTwo
    participant ReduxStore

    User->>StepTwo: Click Login
    StepTwo->>ReduxStore: Dispatch login action
    ReduxStore-->>StepTwo: Update authState.isLoading to true
    StepTwo->>User: Show LoadingButton
    Note over StepTwo: Login request in progress
    ReduxStore-->>StepTwo: Update authState.isLoading to false
    StepTwo->>User: Hide LoadingButton
Loading

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:

‼️ IMPORTANT
Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged.

  • 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

@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 (2)
Client/src/Pages/Auth/Login.jsx (2)

7-7: Yo dawg, these imports and hooks are solid but could use some organization!

The LoadingButton import and auth state selector are correctly implemented, but consider grouping related imports together:

  • Material-UI components (@mui/material, @mui/lab)
  • React and Redux hooks
  • Local imports

Also applies to: 235-235


Line range hint 307-323: Mom's spaghetti alert! We've got dead code lying around!

Remove the commented-out LoadingButton implementation. If needed, this code can be retrieved from version control history.

-{/* <LoadingButton
-  variant="contained"
-  color="primary"
-  type="submit"
-  loading={authState.isLoading}
-  disabled={errors.password && true}
-  sx={{
-    width: "30%",
-    "&.Mui-focusVisible": {
-      outline: `2px solid ${theme.palette.primary.main}`,
-      outlineOffset: `2px`,
-      boxShadow: `none`,
-    },
-  }}
->
-  Continue
-</LoadingButton> */}
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between bff18fb and 2c6b1d0.

📒 Files selected for processing (1)
  • Client/src/Pages/Auth/Login.jsx (5 hunks)

@@ -379,6 +390,8 @@ const Login = () => {
const [errors, setErrors] = useState({});
const [step, setStep] = useState(0);

useEffect(() => {}, [authState.isLoading]);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Yo, this useEffect ain't doing nothing but taking up space!

Remove this empty useEffect as it has no side effects and doesn't serve any purpose.

-useEffect(() => {}, [authState.isLoading]);
📝 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
useEffect(() => {}, [authState.isLoading]);

Comment on lines 324 to 331
<LoadingButton
type="submit"
variant="contained"
color="primary"
loading={authState.isLoading}
>
{"Continue"}
</LoadingButton>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Knees weak, arms are heavy - this LoadingButton's missing some props already!

The new LoadingButton implementation is missing important props and styles from the original Button:

  • disabled state based on password errors
  • width styling
  • focus outline styling

Apply this diff to restore the missing functionality:

 <LoadingButton
   type="submit"
   variant="contained"
   color="primary"
   loading={authState.isLoading}
+  disabled={errors.password && true}
+  sx={{
+    width: "30%",
+    "&.Mui-focusVisible": {
+      outline: `2px solid ${theme.palette.primary.main}`,
+      outlineOffset: `2px`,
+      boxShadow: `none`,
+    },
+  }}
 >
-  {"Continue"}
+  Continue
 </LoadingButton>
📝 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
<LoadingButton
type="submit"
variant="contained"
color="primary"
loading={authState.isLoading}
>
{"Continue"}
</LoadingButton>
<LoadingButton
type="submit"
variant="contained"
color="primary"
loading={authState.isLoading}
disabled={errors.password && true}
sx={{
width: "30%",
"&.Mui-focusVisible": {
outline: `2px solid ${theme.palette.primary.main}`,
outlineOffset: `2px`,
boxShadow: `none`,
},
}}
>
Continue
</LoadingButton>

Copy link

@llamapreview llamapreview bot left a comment

Choose a reason for hiding this comment

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

Auto Pull Request Review from LlamaPReview

1. Overview

1.1 PR Summary

  • Business value and requirements alignment: The PR aims to replace the regular button on the login page with a LoadingButton to indicate the loading state during the login process. This addresses a user experience issue where a glitch occurs between the login and monitor pages due to delayed authentication state updates.
  • Key components modified: The Login.jsx file in the Client/src/Pages/Auth directory.
  • Impact assessment: The change primarily impacts the login page and its interaction with the authentication state, enhancing the user experience by providing a clear loading indication during the login process.
  • System dependencies and integration impacts: The introduction of the LoadingButton component from the @mui/lab library and its integration with the authentication state.

1.2 Architecture Changes

  • System design modifications: The PR introduces the LoadingButton component to handle the loading state on the login page.
  • Component interactions: The LoadingButton component interacts with the authentication state to display the loading spinner.
  • Integration points: The integration points with the authentication slice and the LoadingButton component are modified to reflect the loading state.

2. Detailed Technical Analysis

2.1 Code Logic Deep-Dive

Core Logic Changes

[Client/src/Pages/Auth/Login.jsx - StepTwo]

  • Submitted PR Code:
    import LoadingButton from "@mui/lab/LoadingButton";
    const authState = useSelector((state) => state.auth);
    <LoadingButton
        type="submit"
        variant="contained"
        color="primary"
        loading={authState.isLoading}
    >
        {"Continue"}
    </LoadingButton>
    • Analysis:
      • Current logic and potential issues: The code correctly replaces the regular Button with LoadingButton and uses the authState.isLoading to indicate the loading state. However, there is a commented-out section of the code that should be removed for clarity. Additionally, the useEffect hook that depends on authState.isLoading is empty and should be removed or implemented properly.
      • Edge cases and error handling: The LoadingButton will correctly display the loading state based on authState.isLoading. However, there is no additional error handling for cases where the loading state might not be updated correctly.
      • Cross-component impact: The change impacts the login page and its interaction with the authentication state.
      • Business logic considerations: The change aligns with the business requirement to provide a loading indication during the login process.
    • LlamaPReview Suggested Improvements:
      import LoadingButton from "@mui/lab/LoadingButton";
      const authState = useSelector((state) => state.auth);
      <LoadingButton
          type="submit"
          variant="contained"
          color="primary"
          loading={authState.isLoading}
          disabled={authState.isLoading || (errors.password && true)}
      >
          {"Continue"}
      </LoadingButton>
    • Improvement rationale:
      • Technical benefits: Removing the commented-out code and the empty useEffect hook improves code clarity and maintainability.
      • Business value: Ensures that the button is disabled when loading, preventing multiple submissions.
      • Risk assessment: Low risk, as the changes are straightforward and improve the existing functionality.

2.2 Implementation Quality

  • Code Structure:

    • Organization and modularity: The code is well-organized, with the LoadingButton component correctly imported and used.
    • Design pattern adherence: The use of the LoadingButton component from the @mui/lab library adheres to the design pattern of using Material-UI components.
    • Reusability aspects: The LoadingButton component can be reused in other parts of the application where loading indicators are needed.
    • Maintainability factors: The code is maintainable, but removing the commented-out code and the empty useEffect hook will improve clarity.
  • Error Handling:

    • Exception scenarios coverage: The code handles the loading state correctly, but additional error handling for edge cases where the loading state might not be updated correctly would be beneficial.
    • Recovery mechanisms: The loading state is managed by the authentication slice, and the LoadingButton component will automatically update based on this state.
    • Logging and monitoring: There is no additional logging or monitoring for the loading state, which could be improved.
    • User experience impact: The change improves the user experience by providing a clear loading indication during the login process.
  • Performance Considerations:

    • Resource utilization: The change introduces a new dependency (LoadingButton from @mui/lab), but the impact on resource utilization is minimal.
    • Scalability aspects: The change is scalable and can be easily extended to other parts of the application.
    • Bottleneck analysis: There are no apparent bottlenecks introduced by this change.
    • Optimization opportunities: The code is already optimized for the current use case.

3. Critical Findings

3.1 Potential Issues

🔴 P0 (Must Fix):

  • Issue: Remove the commented-out code and the empty useEffect hook.
  • Impact:
    • Technical implications: Improves code clarity and maintainability.
    • Business consequences: Ensures that the code is clean and easy to understand.
    • User experience effects: No direct impact on user experience.
  • Resolution:
    • Specific code changes: Remove the commented-out code and the empty useEffect hook.
    • Configuration updates: None.
    • Testing requirements: Verify that the LoadingButton works as expected without the commented-out code and the empty useEffect hook.

3.2 Important Improvements

🟡 P1 (Should Fix):

  • Issue: Add additional error handling for edge cases where the loading state might not be updated correctly.
  • Current Impact:
    • Performance implications: Minimal.
    • Maintenance overhead: Minimal.
    • Future scalability: Improves the robustness of the loading state handling.
  • Suggested Solution:
    • Implementation approach: Add error handling to manage cases where the loading state might not be updated correctly.
    • Migration strategy: Update the LoadingButton component to include error handling.
    • Testing considerations: Test the error handling to ensure it works as expected.

3.3 Minor Suggestions

🟢 P2 (Consider):

  • Area: Add logging or monitoring for the loading state.
  • Improvement Opportunity:
    • Code quality enhancement: Adds visibility into the loading state.
    • Best practice alignment: Aligns with best practices for logging and monitoring.
    • Documentation updates: Update the documentation to reflect the logging and monitoring changes.

4. Requirements Analysis

4.1 Functional Coverage

  • Requirements mapping:
    • Implemented features: The LoadingButton component is correctly implemented to indicate the loading state during the login process.
    • Missing elements: There is no additional error handling for edge cases where the loading state might not be updated correctly.
    • Edge cases handling: The LoadingButton component handles the loading state correctly, but additional error handling would be beneficial.
  • Business Logic:
    • Use case coverage: The change covers the use case of providing a loading indication during the login process.
    • Business rule implementation: The business rule of indicating the loading state during the login process is correctly implemented.
    • Data flow correctness: The data flow from the authentication state to the LoadingButton component is correct.

4.2 Non-functional Aspects

  • Performance metrics: The change introduces a new dependency (LoadingButton from @mui/lab), but the impact on performance is minimal.
  • Security considerations: There are no apparent security considerations for this change.
  • Scalability factors: The change is scalable and can be easily extended to other parts of the application.
  • Maintainability aspects: The code is maintainable, but removing the commented-out code and the empty useEffect hook will improve clarity.

5. Testing Strategy

5.1 Test Coverage

  • Unit test analysis: Ensure that the LoadingButton component works as expected with the authentication state.
  • Integration test requirements: Test the integration of the LoadingButton component with the authentication state and the login page.
  • Edge case coverage: Validate edge cases where the loading state might not be updated correctly.

5.2 Test Recommendations

  • Suggested test cases:
    • Validate that the LoadingButton correctly displays the loading state based on authState.isLoading.
    • Test the edge cases where the loading state might not be updated correctly.
    • Ensure that the button is disabled when loading and when there are password errors.
  • Coverage improvements: Update the test coverage to include tests for the LoadingButton component.
  • Performance testing: Ensure that the introduction of the LoadingButton component does not introduce performance issues.

6. Documentation & Maintenance

6.1 Documentation

  • Documentation updates: Ensure that the documentation reflects the introduction of the LoadingButton component and its usage in the login page.
  • Long-term maintenance: Remove any commented-out code and ensure that the codebase is clean and maintainable.
  • Technical debt and monitoring: Monitor the loading state and ensure that there are no issues with the LoadingButton component.

6.2 Monitoring

  • Logging: Consider adding logging for the loading state to monitor its behavior and performance.
  • Monitoring requirements: Ensure that the loading state is monitored and that any issues are promptly addressed.

7. Deployment & Operations

7.1 Deployment Impact

  • Deployment impact: The change primarily impacts the login page and its interaction with the authentication state. Ensure that the deployment process does not introduce any issues with the LoadingButton component.
  • Deployment strategy: Deploy the change to a staging environment first and validate its functionality before rolling it out to production.

7.2 Operations

  • Key operational considerations: Ensure that the LoadingButton component works as expected in the production environment.

8. Summary & Recommendations

8.1 Key Action Items

  1. Critical Changes (P0):

    • Remove the commented-out code and the empty useEffect hook.
  2. Important Improvements (P1):

    • Add additional error handling for edge cases where the loading state might not be updated correctly.
  3. Suggested Enhancements (P2):

    • Add logging or monitoring for the loading state.

8.2 Future Considerations

  • Technical evolution path: Continuously monitor the loading state and ensure that the LoadingButton component works as expected in all environments.
  • Business capability evolution: The change enhances the user experience by providing a clear loading indication during the login process, which can be further improved based on user feedback and performance monitoring.
  • System integration impacts: Ensure that the LoadingButton component is integrated correctly with the authentication state and that any changes to the authentication state are reflected in the LoadingButton component.

💡 LlamaPReview Community
Have feedback on this AI Code review tool? Join our GitHub Discussions to share your thoughts and help shape the future of LlamaPReview.

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

🧹 Outside diff range and nitpick comments (1)
Client/src/Utils/Theme/globalTheme.js (1)

84-90: Yo, this button styling logic is straight fire! 🔥

The additional check for loadingIndicator is crucial for the LoadingButton implementation. It prevents the disabled styles from interfering with the loading state visual feedback.

However, let's make this code more readable, dawg:

-							props: (props) => {
-								return (
-									props.variant === "contained" &&
-									props.disabled &&
-									props.classes.loadingIndicator === undefined // Do not apply to loading button
-								);
-							},
+							props: (props) => 
+								props.variant === "contained" &&
+								props.disabled &&
+								!props.classes.loadingIndicator,  // Skip loading buttons
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 2c6b1d0 and bf9199a.

📒 Files selected for processing (1)
  • Client/src/Utils/Theme/globalTheme.js (2 hunks)
🔇 Additional comments (2)
Client/src/Utils/Theme/globalTheme.js (2)

110-110: Clean spacing game, fam! 👊

That extra line between MuiButton and MuiIconButton components? chef's kiss - Makes the code organization cleaner than mom's spaghetti!


84-90: Yo, let's make sure this theme plays nice with LoadingButton! 🎯

Let's verify that the LoadingButton in the login page works correctly with these theme changes.

✅ Verification successful

Yo, the LoadingButton setup is clean, no spaghetti code here! 🍝

The theme configuration is properly excluding LoadingButton from the disabled button styles by checking props.classes.loadingIndicator === undefined. The Login page implementation shows a clean LoadingButton usage without any custom style overrides that could conflict with the theme.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for LoadingButton usage and related styles
echo "Checking LoadingButton implementations:"
rg -l "LoadingButton"

echo "\nChecking for any custom LoadingButton styles:"
rg "LoadingButton" --type css

Length of output: 956


Script:

#!/bin/bash
# Let's check the actual LoadingButton implementation in the login page
echo "Checking Login.jsx LoadingButton implementation:"
rg -A 5 -B 5 "LoadingButton" "Client/src/Pages/Auth/Login.jsx"

# Let's also check if there are any specific style overrides
echo "\nChecking for style-related props on LoadingButton:"
ast-grep --pattern 'LoadingButton $$$classes={$_}$$$'

# And let's see the actual theme configuration around the loading indicator
echo "\nChecking theme configuration for loading indicator:"
rg -A 10 -B 10 "loadingIndicator" "Client/src/Utils/Theme/globalTheme.js"

Length of output: 2308

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

🧹 Outside diff range and nitpick comments (1)
Client/src/Pages/Auth/Login.jsx (1)

Line range hint 307-323: Knees weak, arms are heavy - let's make this button more accessibility ready!

The LoadingButton implementation looks solid, but we could enhance it with accessibility attributes.

Add these accessibility improvements:

 <LoadingButton
   variant="contained"
   color="primary"
   type="submit"
   loading={authState.isLoading}
   disabled={errors.password && true}
+  aria-label="Log in to your account"
+  data-testid="login-submit-button"
   sx={{
     width: "30%",
     "&.Mui-focusVisible": {
       outline: `2px solid ${theme.palette.primary.main}`,
       outlineOffset: `2px`,
       boxShadow: `none`,
     },
   }}
 >
   Continue
 </LoadingButton>
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ac4834a and 7e8cf9e.

📒 Files selected for processing (1)
  • Client/src/Pages/Auth/Login.jsx (4 hunks)
🔇 Additional comments (3)
Client/src/Pages/Auth/Login.jsx (3)

7-7: Yo, the import's looking clean!

The LoadingButton import from @mui/lab is properly placed with other MUI imports.


235-235: Mom's spaghetti says this selector's ready!

The auth state is properly accessed using useSelector and scoped appropriately for the loading status.


Line range hint 307-323: Vomit on his sweater already - let's verify this loading state is steady!

The LoadingButton implementation looks good, but let's verify the loading state handling in the auth slice.

✅ Verification successful

Yo, the loading state's steady, code's clean already!

The loading state implementation in the auth slice is properly handled:

  • isLoading is set to true in the pending action
  • isLoading is set to false in both fulfilled and rejected cases
  • The Login component correctly uses authState.isLoading from Redux store
  • No race conditions found in the async thunk implementation

The LoadingButton's disabled and loading states are properly synchronized with the auth slice state.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify loading state handling in auth slice

# Check for loading state handling in auth slice
rg -A 5 "isLoading" "src/Features/Auth"

# Check for potential race conditions in loading state
ast-grep --pattern 'export const login = createAsyncThunk(
  $$$,
  async ($_, { rejectWithValue }) => {
    $$$
  }
)'

Length of output: 217


Script:

#!/bin/bash
# Let's find where this auth state lives
fd -e js -e jsx -e ts -e tsx | xargs rg -l "isLoading.*authState" 

# Find the auth slice/reducer
fd -e js -e jsx -e ts -e tsx | xargs rg -l "createSlice.*auth"

# Let's see the actual implementation of the auth state
fd -e js -e jsx -e ts -e tsx | xargs rg -B 5 -A 10 "initialState.*=.*{.*isLoading"

Length of output: 347


Script:

#!/bin/bash
# Yo, let's find that auth state with better regex
fd -e js -e jsx -e ts -e tsx | xargs rg "const.*authState.*isLoading" -B 2 -A 2

# Search for auth slice with fixed pattern
fd -e js -e jsx -e ts -e tsx | xargs rg "createSlice\({.*name:.*['\"]auth" -A 10

# Look for loading state in reducers
fd -e js -e jsx -e ts -e tsx | xargs rg "state\.isLoading.*=.*" -B 2 -A 2

# Find the initial state declaration
fd -e js -e jsx -e ts -e tsx | xargs rg "initialState.*=.*\{" -A 5

Length of output: 47035


Script:

#!/bin/bash
# Let's find that auth slice implementation
fd -e js -e jsx -e ts -e tsx | xargs rg "login.*=.*createAsyncThunk" -B 2 -A 10

# And check for the auth state usage in Login component
fd -e js -e jsx -e ts -e tsx | xargs rg "useSelector.*auth" -B 2 -A 2

Length of output: 16218

@ajhollid ajhollid merged commit 2788dc4 into develop Dec 2, 2024
3 checks passed
@ajhollid ajhollid deleted the fix/fe/login-loading branch December 2, 2024 02:59
This was referenced Dec 17, 2024
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.

1 participant