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

feat(synapse-interface): upgrade maintenance #2844

Merged
merged 33 commits into from
Jul 29, 2024

Conversation

bigboydiamonds
Copy link
Collaborator

@bigboydiamonds bigboydiamonds commented Jul 3, 2024

Requires #2859 to be merged in order to utilize github pages urls.

Summary by CodeRabbit

  • New Features

    • Introduced a new maintenance management system with enhanced state handling for displaying maintenance banners, warning messages, and progress bars.
    • Added a new bridge module pausing feature to manage bridge maintenance state effectively.
    • Implemented hooks for fetching and managing maintenance-related data at regular intervals.
  • Refactor

    • Refactored existing maintenance state management functions and variables for improved readability and efficiency.
  • Chores

    • Removed redundant console logging for gas data fetching operations.

03bf5f5: synapse-interface preview link
a97fff0: synapse-interface preview link
cf93a17: synapse-interface preview link
d1ee8e8: synapse-interface preview link
8b7f4ba: synapse-interface preview link
5225d99: synapse-interface preview link
efa74eb: synapse-interface preview link
91e37d7: synapse-interface preview link
3f33dd0: synapse-interface preview link

Copy link
Contributor

coderabbitai bot commented Jul 3, 2024

Walkthrough

The changes involve a comprehensive refactor of the maintenance state management system within the synapse-interface package. Key updates include the introduction of new hooks for maintenance data retrieval (useMaintenanceData), progress bars (useEventCountdownProgressBar), and overall maintenance logic (useMaintenance). Utility functions were added for fetching JSON data, validating bridge modules, and managing paused chains and modules. Additionally, Redux slices and hooks were implemented to centralize maintenance state management.

Changes

File(s) Change Summary
Maintenance.tsx Refactored maintenance state management; renamed useMaintenanceCountdownProgressBar to useEventCountdownProgressBar; introduced useMaintenanceData and useMaintenance. Updated logic for banners and warnings. Added BridgeModulePause interface and functions for validating and naming modules.
functions/fetchJsonData.ts, getFurthestFutureDate.ts, getSynapsePauseData.ts, isValidBridgeModule.ts Added functions for fetching JSON data with retry logic, getting the furthest future date, retrieving synapse pause data, and validating bridge modules.
BackgroundListenerProvider.tsx Imported and used useMaintenanceListener hook.
slices/maintenance/hooks.ts, slices/maintenance/reducer.ts Introduced useMaintenanceState for accessing maintenance state from Redux store and added a Redux slice for managing maintenance state, including initial state and reducers for paused chains and modules.
utils/getBridgeModuleNames.ts Introduced function for retrieving bridge module names based on input parameters.
utils/hooks/useFetchGasDataOnInterval.ts Removed a console log statement from the useFetchGasDataOnInterval function.
utils/hooks/useMaintenanceListener.ts Added useMaintenanceListener hook to trigger regular maintenance data fetches using useIntervalTimer.

Sequence Diagram(s)

sequenceDiagram
    participant MaintenanceComponent
    participant useMaintenance
    participant useMaintenanceData
    participant fetchJsonData
    participant ReduxStore

    MaintenanceComponent->>useMaintenance: Call useMaintenance()
    useMaintenance->>useMaintenanceData: Call useMaintenanceData()
    useMaintenanceData->>fetchJsonData: Fetch data from URL
    fetchJsonData-->>useMaintenanceData: Return JSON data
    useMaintenanceData->>ReduxStore: Set paused chains/modules data
    useMaintenance-->>MaintenanceComponent: Return maintenance state
    MaintenanceComponent->>useMaintenance: Display banners and warnings
Loading

Poem

Amid the code so bright and clear,
Maintenance logic shifts, oh dear!
Hooks and slices, nicely tamed,
Bridge modules aptly named.
JSON fetches, retries strong,
Synapse pauses, can't go wrong.
CodeRabbit cheers with glee,
For changes made so brilliantly! 🎉


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>.
    • 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 generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @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 as 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.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

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.

@bigboydiamonds bigboydiamonds marked this pull request as draft July 3, 2024 23:50
@github-actions github-actions bot added the size/m label Jul 3, 2024
@bigboydiamonds bigboydiamonds changed the title feat(synapse-interface): upgrade maintenance [wip] feat(synapse-interface): upgrade maintenance Jul 3, 2024
Copy link

cloudflare-workers-and-pages bot commented Jul 3, 2024

Deploying sanguine-fe with  Cloudflare Pages  Cloudflare Pages

Latest commit: 88b7a9a
Status: ✅  Deploy successful!
Preview URL: https://19133062.sanguine-fe.pages.dev
Branch Preview URL: https://fe-maintenance-read-method.sanguine-fe.pages.dev

View logs

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 9

Outside diff range and nitpick comments (3)
packages/synapse-interface/slices/maintenance/reducer.ts (2)

3-3: Consider adding JSDoc comments for the MaintenanceState interface.

Adding JSDoc comments can improve the readability and maintainability of the code by providing context and descriptions for the interface.

/**
 * Interface representing the maintenance state.
 */
export interface MaintenanceState {
  pausedChainsData: any;
  pausedModulesData: any;
}

26-26: Ensure consistent export formatting.

For better readability and consistency, format the export statement on a single line.

export const { setPausedChainsData, setPausedModulesData } = maintenanceSlice.actions;
packages/synapse-interface/store/reducer.ts (1)

11-11: Ensure import order consistency.

For better readability and maintainability, consider grouping and ordering imports logically (e.g., external libraries first, then internal modules).

import application from '@/slices/application/reducer';
import _transactions from '@/slices/_transactions/reducer';
import bridge from '@/slices/bridge/reducer';
import portfolio from '@/slices/portfolio/reducer';
import swap from '@/slices/swap/reducer';
import transactions from '@/slices/transactions/reducer';
import maintenance from '@/slices/maintenance/reducer'; // Move this import up to maintain order
import bridgeDisplay from '@/slices/bridgeDisplaySlice';
import poolData from '@/slices/poolDataSlice';
import poolDeposit from '@/slices/poolDepositSlice';
import poolUserData from '@/slices/poolUserDataSlice';
import poolWithdraw from '@/slices/poolWithdrawSlice';
import priceData from '@/slices/priceDataSlice';
import gasData from '@/slices/gasDataSlice';
import { api } from '@/slices/api/slice';
import { RootActions } from '@/slices/application/actions';
Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between b705577 and 22bd327.

Files selected for processing (13)
  • packages/synapse-interface/components/Maintenance/Maintenance.tsx (2 hunks)
  • packages/synapse-interface/components/Maintenance/components/EventCountdownProgressBar.tsx (5 hunks)
  • packages/synapse-interface/components/Maintenance/functions/fetchJsonData.ts (1 hunks)
  • packages/synapse-interface/components/Maintenance/functions/getSynapsePauseData.ts (1 hunks)
  • packages/synapse-interface/components/layouts/LandingPageWrapper/index.tsx (1 hunks)
  • packages/synapse-interface/contexts/MaintenanceProvider.tsx (1 hunks)
  • packages/synapse-interface/pages/_app.tsx (2 hunks)
  • packages/synapse-interface/pages/state-managed-bridge/index.tsx (7 hunks)
  • packages/synapse-interface/pages/swap/index.tsx (5 hunks)
  • packages/synapse-interface/slices/maintenance/hooks.ts (1 hunks)
  • packages/synapse-interface/slices/maintenance/reducer.ts (1 hunks)
  • packages/synapse-interface/store/reducer.ts (2 hunks)
  • packages/synapse-interface/utils/isChainIncluded.tsx (1 hunks)
Additional comments not posted (17)
packages/synapse-interface/utils/isChainIncluded.tsx (1)

10-10: LGTM!

The update to handle null or undefined values in hasChains is correct and improves robustness.

packages/synapse-interface/store/reducer.ts (1)

41-41: LGTM!

The integration of the new maintenance slice reducer looks good.

packages/synapse-interface/pages/_app.tsx (2)

16-16: LGTM!

The integration of the MaintenanceProvider looks good.


55-55: LGTM!

The usage of MaintenanceProvider to wrap the application components looks good.

packages/synapse-interface/components/Maintenance/components/EventCountdownProgressBar.tsx (3)

16-16: Optional parameter hideProgress added.

The addition of the hideProgress parameter allows conditional rendering of the progress bar. This is a good enhancement for flexibility.


46-46: Conditional rendering of the progress bar.

The progress bar is conditionally rendered based on the hideProgress parameter. This ensures that the progress bar is only displayed when needed.


104-104: Null checks added to getCountdownTimeStatus.

The addition of null checks ensures that the function handles cases where startDate and endDate are not provided, preventing potential runtime errors.

packages/synapse-interface/components/Maintenance/Maintenance.tsx (7)

3-3: Import statement for useEventCountdownProgressBar added.

The import statement ensures that the useEventCountdownProgressBar hook is available for use in this file.


6-6: Import statement for useMaintanceState added.

The import statement ensures that the useMaintanceState hook is available for use in this file.


27-27: New useMaintenanceData function added.

The useMaintenanceData function retrieves and processes maintenance data, transforming it into a usable format. This is a well-structured and necessary addition for managing maintenance data.


72-72: New MaintenanceBanners component added.

The MaintenanceBanners component uses useMaintenanceData to display active maintenance banners, enhancing the user interface by providing relevant maintenance information.


99-99: New useMaintenance hook added.

The useMaintenance hook manages maintenance logic, including active maintenance pauses and displaying progress bars and warning messages. This is a comprehensive and well-implemented addition for maintenance state management.


193-193: New getFurthestFutureDate function added.

The getFurthestFutureDate function compares two dates and returns the furthest future date. This is a useful utility function for date comparisons.


202-202: New getBridgeModuleNames function added.

The getBridgeModuleNames function returns the names of bridge modules based on the provided module type. This is a useful utility function for managing bridge module names.

packages/synapse-interface/components/layouts/LandingPageWrapper/index.tsx (1)

28-28: Import statement for MaintenanceBanners and useMaintenance added.

The import statement ensures that the MaintenanceBanners component and useMaintenance hook are available for use in this file.

packages/synapse-interface/pages/swap/index.tsx (1)

44-44: Import statement for useMaintenance added.

The import statement ensures that the useMaintenance hook is available for use in this file.

packages/synapse-interface/pages/state-managed-bridge/index.tsx (1)

97-97: Verify the correctness of the useMaintenance hook usage and JSX integration.

Ensure that the useMaintenance hook is used correctly to retrieve maintenance-related data and components, and that these are integrated properly into the JSX.

Verification successful

Verified the correctness of the useMaintenance hook usage and JSX integration.

The values returned by the useMaintenance hook (fromChainId, toChainId, fromToken, toToken, bridgeQuote) are correctly integrated into the component's logic, particularly within the useEffect hook and other parts of the component.

  • useMaintenance is used to retrieve necessary values.
  • These values are utilized within the component's logic.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the correctness of the `useMaintenance` hook usage and JSX integration.

# Test: Check for the usage of `useMaintenance` and its returned values in the codebase.
rg --type tsx $'useMaintenance' '@/components/Maintenance/Maintenance.tsx'

Length of output: 99


Script:

#!/bin/bash
# Description: Verify the correctness of the `useMaintenance` hook usage and JSX integration.

# Test: Check for the usage of `useMaintenance` and its returned values in the codebase.
rg 'useMaintenance' packages/synapse-interface/pages/state-managed-bridge/index.tsx

Length of output: 176


Script:

#!/bin/bash
# Description: Verify the integration of the values returned by `useMaintenance` into the JSX.

# Test: Check for the usage of the destructured values from `useMaintenance` in the JSX.
rg '} = useMaintenance' -A 10 packages/synapse-interface/pages/state-managed-bridge/index.tsx

Length of output: 341


Script:

#!/bin/bash
# Description: Verify the integration of the values returned by `useMaintenance` into the JSX.

# Test: Check for the usage of the values returned by `useMaintenance` in the JSX.
rg 'useMaintenance' -A 20 packages/synapse-interface/pages/state-managed-bridge/index.tsx

Length of output: 1213

Copy link

cloudflare-workers-and-pages bot commented Jul 3, 2024

Deploying sanguine with  Cloudflare Pages  Cloudflare Pages

Latest commit: 88b7a9a
Status: ✅  Deploy successful!
Preview URL: https://dcb890df.sanguine.pages.dev
Branch Preview URL: https://fe-maintenance-read-method.sanguine.pages.dev

View logs

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

PR Summary

  • Upgraded Maintenance.tsx to use dynamic state hooks for paused chains and bridge modules.
  • Added fetchJSONData and getSynapsePauseData utility functions for fetching and managing maintenance data.
  • Introduced MaintenanceProvider context for regular maintenance data fetching.
  • Integrated useMaintenance hook in state-managed-bridge/index.tsx and swap/index.tsx.
  • Added new Redux slice for maintenance state in slices/maintenance/reducer.ts and updated global state management in store/reducer.ts.

14 file(s) reviewed, 4 comment(s)
Edit PR Review Bot Settings

Copy link

codecov bot commented Jul 3, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 90.48563%. Comparing base (8e30911) to head (88b7a9a).

Additional details and impacted files
@@                 Coverage Diff                  @@
##              master       #2844          +/-   ##
====================================================
+ Coverage   25.39826%   90.48563%   +65.08736%     
====================================================
  Files            785          54         -731     
  Lines          56559        1009       -55550     
  Branches          80          80                  
====================================================
- Hits           14365         913       -13452     
+ Misses         40713          93       -40620     
+ Partials        1481           3        -1478     
Flag Coverage Δ
agents ?
cctp-relayer ?
core ?
ethergo ?
explorer ?
git-changes-action ?
omnirpc ?
opbot ?
packages 90.48563% <ø> (ø)
promexporter ?
rfq ?
screener-api ?
scribe ?
tools ?

Flags with carried forward coverage won't be shown. Click here to find out more.

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

<Component {...pageProps} />
</BackgroundListenerProvider>
<CustomToaster />
<MaintenanceProvider>
Copy link
Collaborator

Choose a reason for hiding this comment

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

We have a BackgroundListenerProvider to handle background jobs so we don't have to create a new Context & Provider for each one. Let's move all the logic in MaintenanceProvider into its own hook and then call it in BackgroundListenerProvider.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Sounds good! That makes more sense

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Shifted logic from MaintenanceProvider into useMaintenanceListener hook in 62589b3

@bigboydiamonds bigboydiamonds marked this pull request as ready for review July 8, 2024 16:09
@bigboydiamonds bigboydiamonds changed the title [wip] feat(synapse-interface): upgrade maintenance feat(synapse-interface): upgrade maintenance Jul 8, 2024
Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

PR Summary

(updates since last review)

  • Introduced useMaintenance hook and MaintenanceProvider component for centralized maintenance state management (packages/synapse-interface/components/Maintenance/Maintenance.tsx).
  • Added unit tests for fetchJsonData function focusing on retry logic (packages/synapse-interface/components/Maintenance/functions/fetchJsonData.test.ts).
  • Implemented retry logic with exponential backoff in fetchJsonData function (packages/synapse-interface/components/Maintenance/functions/fetchJsonData.ts).
  • Updated URLs for fetching paused chains and modules data to use a CDN with a fallback to local JSON files (packages/synapse-interface/components/Maintenance/functions/getSynapsePauseData.ts).
  • Added useMaintenanceListener hook to BackgroundListenerProvider for periodic maintenance data fetching (packages/synapse-interface/contexts/BackgroundListenerProvider.tsx).

15 file(s) reviewed, 4 comment(s)
Edit PR Review Bot Settings

@bigboydiamonds bigboydiamonds changed the title feat(synapse-interface): upgrade maintenance [wip] feat(synapse-interface): upgrade maintenance Jul 8, 2024
@bigboydiamonds bigboydiamonds marked this pull request as draft July 8, 2024 23:32
@bigboydiamonds bigboydiamonds marked this pull request as ready for review July 11, 2024 02:39
Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

PR Summary

(updates since last review)

  • Added 'cache: no-store' option to fetch request (packages/synapse-interface/components/Maintenance/functions/fetchJsonData.ts)
  • Updated URLs to GitHub Pages for paused chains/modules data (packages/synapse-interface/components/Maintenance/functions/getSynapsePauseData.ts)
  • Refactored data fetching logic to use Redux for state management (packages/synapse-interface/components/Maintenance/functions/getSynapsePauseData.ts)

2 file(s) reviewed, 1 comment(s)
Edit PR Review Bot Settings

Comment on lines 40 to 42
setTimeout(() => {
isFetching = false
}, 1000)
Copy link

Choose a reason for hiding this comment

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

🧠 logic: Potential race condition with isFetching flag. Consider using a more robust state management approach.

@bigboydiamonds bigboydiamonds changed the title [wip] feat(synapse-interface): upgrade maintenance feat(synapse-interface): upgrade maintenance Jul 15, 2024
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 14

Outside diff range, codebase verification and nitpick comments (9)
packages/synapse-interface/utils/hooks/useMaintenanceListener.ts (1)

1-2: Consider adding a comment to explain the purpose of the hook.

Adding a comment at the top of the file can help other developers understand the purpose of this hook.

// This hook sets up an interval to fetch maintenance data every 60 seconds.
packages/synapse-interface/utils/hooks/useFetchGasDataOnInterval.ts (1)

Line range hint 1-10:
Consider adding a comment to explain the purpose of the hook.

Adding a comment at the top of the file can help other developers understand the purpose of this hook.

// This hook fetches gas data for the selected chain at regular intervals.
packages/synapse-interface/contexts/BackgroundListenerProvider.tsx (1)

11-11: Consider adding a comment to explain the purpose of the useMaintenanceListener hook.

Adding a comment can help other developers understand why this hook is being used.

// This hook sets up an interval to fetch maintenance data every 60 seconds.
packages/synapse-interface/components/Maintenance/functions/fetchJsonData.ts (4)

1-1: Consider renaming the function to follow camelCase convention.

The function name fetchJsonData should be fetchJSONData to follow camelCase convention.

- export const fetchJsonData = async (url: string): Promise<any> => {
+ export const fetchJSONData = async (url: string): Promise<any> => {

7-8: Specify the type for the duration parameter in the delay function.

Specify the type for better type safety.

- const delay = (duration) =>
+ const delay = (duration: number) =>

21-21: Consider using a more specific error message to aid debugging.

Using a more specific error message can help in debugging issues.

- console.error(`Attempt ${attempt + 1}: Error fetching ${url}`, error)
+ console.error(`Attempt ${attempt + 1}: Error fetching ${url}: ${error.message}`, error)

25-25: Enhance the error message for retries failure.

Providing more context in the error message can help in debugging.

- throw new Error(`Retries failed fetching ${url}`)
+ throw new Error(`All ${maxRetries} retries failed fetching ${url}`)
packages/synapse-interface/components/Maintenance/functions/fetchJsonData.test.ts (1)

29-40: Consider reducing the timeout for the test.

The timeout of 30000ms seems excessive for this test.

- }, 30000)
+ }, 10000)
packages/synapse-interface/pages/state-managed-bridge/index.tsx (1)

Missing Implementations for Maintenance Components

The components BridgeMaintenanceProgressBar and BridgeMaintenanceWarningMessage are used in the index.tsx file but their implementations are not found in the codebase. This suggests that these components are either missing or incorrectly named.

  • Ensure that BridgeMaintenanceProgressBar and BridgeMaintenanceWarningMessage are implemented and correctly named in the codebase.
Analysis chain

Line range hint 582-602:
Ensure correct rendering of maintenance components.

Verify that the BridgeMaintenanceProgressBar and BridgeMaintenanceWarningMessage components are correctly implemented and rendered within the StateManagedBridge component.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation and rendering of maintenance components.

# Test: Search for the implementation of `BridgeMaintenanceProgressBar` and `BridgeMaintenanceWarningMessage`. Expect: Correct implementation of both components.
rg --type tsx $'export const BridgeMaintenanceProgressBar' '@/components/Maintenance/Maintenance.tsx'
rg --type tsx $'export const BridgeMaintenanceWarningMessage' '@/components/Maintenance/Maintenance.tsx'

Length of output: 260


Script:

#!/bin/bash
# Description: Verify the implementation and rendering of maintenance components.

# Search for the implementation of `BridgeMaintenanceProgressBar` and `BridgeMaintenanceWarningMessage`.
rg 'export const BridgeMaintenanceProgressBar' 
rg 'export const BridgeMaintenanceWarningMessage'

# Verify their usage in the `index.tsx` file.
rg 'BridgeMaintenanceProgressBar' packages/synapse-interface/pages/state-managed-bridge/index.tsx -A 5
rg 'BridgeMaintenanceWarningMessage' packages/synapse-interface/pages/state-managed-bridge/index.tsx -A 5

Length of output: 1093


Script:

#!/bin/bash
# Description: Search for the implementation of BridgeMaintenanceProgressBar and BridgeMaintenanceWarningMessage in the entire codebase.

rg 'export const BridgeMaintenanceProgressBar'
rg 'export const BridgeMaintenanceWarningMessage'

Length of output: 100


Script:

#!/bin/bash
# Description: Search for any component that might match the intended functionality of BridgeMaintenanceProgressBar and BridgeMaintenanceWarningMessage.

# Search for components in the entire codebase that might be related to maintenance or bridge.
rg 'export const' --glob '*Maintenance*'
rg 'export const' --glob '*Bridge*'

Length of output: 3207


Script:

#!/bin/bash
# Description: Verify the usage of MaintenanceWarningMessage and MaintenanceBanner in the index.tsx file.

rg 'MaintenanceWarningMessage' packages/synapse-interface/pages/state-managed-bridge/index.tsx -A 5
rg 'MaintenanceBanner' packages/synapse-interface/pages/state-managed-bridge/index.tsx -A 5

Length of output: 616

Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 22bd327 and af40763.

Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
Files selected for processing (13)
  • packages/synapse-interface/components/Maintenance/Maintenance.tsx (1 hunks)
  • packages/synapse-interface/components/Maintenance/functions/fetchJsonData.test.ts (1 hunks)
  • packages/synapse-interface/components/Maintenance/functions/fetchJsonData.ts (1 hunks)
  • packages/synapse-interface/components/Maintenance/functions/getFurthestFutureDate.ts (1 hunks)
  • packages/synapse-interface/components/Maintenance/functions/getSynapsePauseData.ts (1 hunks)
  • packages/synapse-interface/components/Maintenance/functions/isValidBridgeModule.ts (1 hunks)
  • packages/synapse-interface/contexts/BackgroundListenerProvider.tsx (1 hunks)
  • packages/synapse-interface/pages/state-managed-bridge/index.tsx (6 hunks)
  • packages/synapse-interface/slices/maintenance/hooks.ts (1 hunks)
  • packages/synapse-interface/slices/maintenance/reducer.ts (1 hunks)
  • packages/synapse-interface/utils/getBridgeModuleNames.ts (1 hunks)
  • packages/synapse-interface/utils/hooks/useFetchGasDataOnInterval.ts (1 hunks)
  • packages/synapse-interface/utils/hooks/useMaintenanceListener.ts (1 hunks)
Additional comments not posted (12)
packages/synapse-interface/components/Maintenance/functions/isValidBridgeModule.ts (1)

2-2: Use a more specific type instead of any for the module parameter.

Using a specific type improves code readability and helps catch potential errors during development.

-  module: any
+  module: string

Likely invalid or redundant comment.

packages/synapse-interface/slices/maintenance/hooks.ts (1)

4-6: LGTM!

The function useMaintenanceState is correctly implemented.

packages/synapse-interface/components/Maintenance/functions/getFurthestFutureDate.ts (1)

1-9: LGTM!

The function getFurthestFutureDate is correctly implemented.

packages/synapse-interface/slices/maintenance/reducer.ts (2)

4-5: Use specific types instead of any for better type safety.

The pausedChainsData and pausedModulesData fields use the any type, which can lead to potential type safety issues. Consider defining specific types for these fields.

export interface MaintenanceState {
  pausedChainsData: PausedChainsDataType;
  pausedModulesData: PausedModulesDataType;
}

// Define the types PausedChainsDataType and PausedModulesDataType appropriately.

17-22: Ensure proper type for PayloadAction.

The PayloadAction type should be specific to the data being dispatched. Define and use appropriate types for the payload.

setPausedChainsData: (state, action: PayloadAction<PausedChainsDataType>) => {
  state.pausedChainsData = action.payload;
},
setPausedModulesData: (state, action: PayloadAction<PausedModulesDataType>) => {
  state.pausedModulesData = action.payload;
},
packages/synapse-interface/contexts/BackgroundListenerProvider.tsx (1)

Line range hint 16-24:
Ensure proper cleanup of listeners.

Ensure that all listeners set up by the hooks are properly cleaned up when the component unmounts.

useEffect(() => {
  useMaintenanceListener()
  useApplicationListener()
  usePortfolioListener()
  useTransactionListener()
  use_TransactionsListener()
  useBridgeListener()
  useRiskEvent()
  useFetchPricesOnInterval()
  useFetchGasDataOnInterval()

  return () => {
    // Add cleanup logic for each listener here
  }
}, [])
packages/synapse-interface/components/Maintenance/Maintenance.tsx (2)

161-174: **


6-6: Fix typo in import statement.

The import statement useMaintanceState should be useMaintenanceState.

- import { useMaintanceState } from '@/slices/maintenance/hooks'
+ import { useMaintenanceState } from '@/slices/maintenance/hooks'

Likely invalid or redundant comment.

packages/synapse-interface/pages/state-managed-bridge/index.tsx (4)

170-174: Verify the logic for filtering paused bridge modules.

Ensure that the pausedModulesList and getBridgeModuleNames are used appropriately to filter paused bridge modules.

Verification successful

Verify the logic for filtering paused bridge modules.

The pausedModulesList and getBridgeModuleNames are used appropriately to filter paused bridge modules in the codebase. The pausedModulesList is correctly filtered based on chainId, and getBridgeModuleNames is used to map the filtered modules.

  • pausedModulesList is defined and used in packages/synapse-interface/pages/state-managed-bridge/index.tsx.
  • getBridgeModuleNames is defined in packages/synapse-interface/utils/getBridgeModuleNames.ts and used in packages/synapse-interface/pages/state-managed-bridge/index.tsx.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the logic for filtering paused bridge modules.

# Test: Search for the usage of `pausedModulesList` and `getBridgeModuleNames`. Expect: Correct usage of both variables.
rg --type tsx $'pausedModulesList' '@/components/Maintenance/Maintenance.tsx'
rg --type tsx $'getBridgeModuleNames' '@/utils/getBridgeModuleNames.ts'

Length of output: 199


Script:

#!/bin/bash
# Description: Verify the logic for filtering paused bridge modules.

# Test: Search for the usage of `pausedModulesList` and `getBridgeModuleNames` within the codebase.
rg 'pausedModulesList'
rg 'getBridgeModuleNames'

Length of output: 1974


66-67: Verify the correctness of the import statements.

Ensure that useMaintenance and getBridgeModuleNames are correctly exported from their respective files.

Verification successful

The import statements are correct.

Both useMaintenance and getBridgeModuleNames are correctly exported from their respective files.

  • useMaintenance is exported from:
    • packages/synapse-interface/components/Maintenance/Maintenance.tsx
    • packages/widget/src/components/Maintenance/Maintenance.tsx
  • getBridgeModuleNames is exported from:
    • packages/synapse-interface/utils/getBridgeModuleNames.ts
    • packages/widget/src/utils/getBridgeModuleNames.ts
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that `useMaintenance` and `getBridgeModuleNames` are correctly exported from their respective files.

# Test: Search for the export statements. Expect: Both functions are exported.
rg --type tsx $'export const useMaintenance' '@/components/Maintenance/Maintenance.tsx'
rg --type tsx $'export const getBridgeModuleNames' '@/utils/getBridgeModuleNames.ts'

Length of output: 226


Script:

#!/bin/bash
# Description: Verify that `useMaintenance` and `getBridgeModuleNames` are correctly exported from their respective files.

# Test: Search for the export statements. Expect: Both functions are exported.
rg 'export const useMaintenance' '@/components/Maintenance/Maintenance.tsx'
rg 'export const getBridgeModuleNames' '@/utils/getBridgeModuleNames.ts'

Length of output: 301


Script:

#!/bin/bash
# Description: Locate the files and verify that `useMaintenance` and `getBridgeModuleNames` are correctly exported from their respective files.

# Locate the files
fd 'Maintenance.tsx'
fd 'getBridgeModuleNames.ts'

# Verify the export statements within the located files
rg 'export const useMaintenance' $(fd 'Maintenance.tsx')
rg 'export const getBridgeModuleNames' $(fd 'getBridgeModuleNames.ts')

Length of output: 1049


Line range hint 1-655:
Ensure correct state management and structure.

Verify that the state management is correctly implemented and follows best practices.

Verification successful

State management and structure are correctly implemented.

The StateManagedBridge component uses the following hooks and state management tools correctly:

  • useState
  • useEffect
  • useRef
  • useSelector
  • useAppDispatch

These hooks are appropriately imported and used within the component, ensuring proper state management and structure.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the state management and structure of the `StateManagedBridge` component.

# Test: Search for the usage of state variables and hooks. Expect: Correct implementation and usage of state variables and hooks.
rg --type tsx $'useState' '@/components/StateManagedBridge/index.tsx'
rg --type tsx $'useEffect' '@/components/StateManagedBridge/index.tsx'
rg --type tsx $'useRef' '@/components/StateManagedBridge/index.tsx'
rg --type tsx $'useSelector' '@/components/StateManagedBridge/index.tsx'
rg --type tsx $'useDispatch' '@/components/StateManagedBridge/index.tsx'

Length of output: 479


Script:

#!/bin/bash
# Description: Verify the state management and structure of the `StateManagedBridge` component.

# Test: Search for the usage of state variables and hooks. Expect: Correct implementation and usage of state variables and hooks.
rg 'useState' packages/synapse-interface/pages/state-managed-bridge/index.tsx
rg 'useEffect' packages/synapse-interface/pages/state-managed-bridge/index.tsx
rg 'useRef' packages/synapse-interface/pages/state-managed-bridge/index.tsx
rg 'useSelector' packages/synapse-interface/pages/state-managed-bridge/index.tsx
rg 'useDispatch' packages/synapse-interface/pages/state-managed-bridge/index.tsx

Length of output: 911


Script:

#!/bin/bash
# Description: Verify the usage of `useAppDispatch` in the `StateManagedBridge` component.

# Test: Search for the usage of `useAppDispatch`. Expect: Correct implementation and usage of `useAppDispatch`.
rg 'useAppDispatch' packages/synapse-interface/pages/state-managed-bridge/index.tsx

Length of output: 166


97-102: Ensure correct implementation of useMaintenance hook.

Verify that the useMaintenance hook is correctly implemented and the new state variables are used appropriately.

Verification successful

The useMaintenance hook is correctly implemented.

The useMaintenance hook is properly defined in the relevant files and sets up the necessary state variables and components as expected.

  • packages/synapse-interface/components/Maintenance/Maintenance.tsx
  • packages/widget/src/components/Maintenance/Maintenance.tsx
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation of `useMaintenance` hook.

# Test: Search for the `useMaintenance` hook implementation. Expect: Correct implementation of the hook.
rg --type tsx $'export const useMaintenance' '@/components/Maintenance/Maintenance.tsx'

Length of output: 114


Script:

#!/bin/bash
# Description: Locate the file containing the `useMaintenance` hook and verify its implementation.

# Locate the file containing `useMaintenance` hook.
fd 'useMaintenance.ts'

# If the file is found, search for the `useMaintenance` hook implementation within it.
if [ -f "$(fd 'useMaintenance.ts')" ]; then
  rg 'export const useMaintenance' "$(fd 'useMaintenance.ts')"
fi

Length of output: 62


Script:

#!/bin/bash
# Description: Search for the `useMaintenance` hook implementation across all files in the repository.

# Search for the `useMaintenance` hook implementation.
rg 'export const useMaintenance'

Length of output: 470


Script:

#!/bin/bash
# Description: Extract the implementation details of the `useMaintenance` hook from both identified files.

# Extract implementation details from the first file.
rg -A 20 'export const useMaintenance' packages/synapse-interface/components/Maintenance/Maintenance.tsx

# Extract implementation details from the second file.
rg -A 20 'export const useMaintenance' packages/widget/src/components/Maintenance/Maintenance.tsx

Length of output: 1800

export const isValidBridgeModule = (
module: any
): module is 'SynapseBridge' | 'SynapseRFQ' | 'SynapseCCTP' | 'ALL' => {
return ['SynapseBridge', 'SynapseRFQ', 'SynapseCCTP', 'ALL'].includes(module)
Copy link
Contributor

Choose a reason for hiding this comment

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

Use a Set for the includes check to improve performance.

Using a Set instead of an array for the includes check could improve performance slightly.

  return ['SynapseBridge', 'SynapseRFQ', 'SynapseCCTP', 'ALL'].includes(module)
+ const validModules = new Set(['SynapseBridge', 'SynapseRFQ', 'SynapseCCTP', 'ALL'])
+ return validModules.has(module)
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
return ['SynapseBridge', 'SynapseRFQ', 'SynapseCCTP', 'ALL'].includes(module)
const validModules = new Set(['SynapseBridge', 'SynapseRFQ', 'SynapseCCTP', 'ALL'])
return validModules.has(module)

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

PR Summary

(updates since last review)

  • Added 'cache: no-store' option to fetch request (packages/synapse-interface/components/Maintenance/functions/fetchJsonData.ts)
  • Updated URLs to GitHub Pages for paused chains/modules data (packages/synapse-interface/components/Maintenance/functions/getSynapsePauseData.ts)
  • Refactored data fetching logic to use Redux for state management (packages/synapse-interface/components/Maintenance/functions/getSynapsePauseData.ts)
  • Updated CONTRIBUTING.md to improve GitHub Actions setup (CONTRIBUTING.md)
  • Added carryforward: true attribute to cctp-relayer in .codecov.yml for consistent coverage metrics (.codecov.yml)

128 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

PR Summary

(updates since last review)

The pull request introduces a new maintenance management system with enhanced state handling and refactors existing functions for improved readability and efficiency.

  • New Feature: Introduced a custom hook useSynapsePauseData in packages/synapse-interface/components/Maintenance/hooks/useSynapsePauseData.ts for better state management.
  • Refactor: Updated packages/synapse-interface/utils/hooks/useMaintenanceListener.ts to use the new useSynapsePauseData hook, improving code efficiency and readability.
  • Test Update: Modified packages/synapse-interface/components/Maintenance/functions/fetchJsonData.test.ts to align with new GitHub Pages URLs, ensuring robust data fetching.
  • Chore: Removed redundant console logging for gas data fetching operations.

3 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

Copy link

codecov bot commented Jul 25, 2024

Bundle Report

Changes will increase total bundle size by 4.9MB ⬆️

Bundle name Size Change
sdk-router-@synapsecns/sdk-router-esm 252.32kB 0 bytes
synapse-interface-server-cjs 1.38MB 1.09kB ⬆️
synapse-interface-client-array-push 7.45MB 7.45MB ⬆️
sdk-router-@synapsecns/sdk-router-cjs 521.95kB 404.94kB ⬆️
synapse-interface-edge-server-array-push 83 bytes 0 bytes
widget-esm-cjs 275.25kB 0 bytes
widget-cjs-esm 273.3kB 273.3kB ⬆️
explorer-ui-server-cjs (removed) 895.87kB ⬇️
explorer-ui-edge-server-array-push (removed) 83 bytes ⬇️
explorer-ui-client-array-push (removed) 2.34MB ⬇️

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Outside diff range, codebase verification and nitpick comments (1)
packages/synapse-interface/components/Maintenance/hooks/useSynapsePauseData.ts (1)

41-43: Consider reducing the timeout duration.

The timeout duration of 1000ms might be unnecessary. Consider reducing it to improve responsiveness.

-  }, 1000)
+  }, 500)
Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between af40763 and 88b7a9a.

Files selected for processing (4)
  • packages/synapse-interface/components/Maintenance/functions/fetchJsonData.test.ts (1 hunks)
  • packages/synapse-interface/components/Maintenance/hooks/useSynapsePauseData.ts (1 hunks)
  • packages/synapse-interface/pages/state-managed-bridge/index.tsx (6 hunks)
  • packages/synapse-interface/utils/hooks/useMaintenanceListener.ts (1 hunks)
Additional comments not posted (9)
packages/synapse-interface/utils/hooks/useMaintenanceListener.ts (1)

8-8: Ensure error handling for fetchMaintenanceData.

Consider adding error handling for fetchMaintenanceData to manage potential failures.

const fetchMaintenanceData = async () => {
  try {
    await getSynapsePauseData()
  } catch (error) {
    console.error('Failed to fetch maintenance data:', error)
  }
}
packages/synapse-interface/components/Maintenance/functions/fetchJsonData.test.ts (2)

14-27: Test case approved.

The test case correctly verifies that the function retries on failure and eventually succeeds.


29-40: Test case approved.

The test case correctly verifies that the function retries the maximum number of times and fails.

packages/synapse-interface/components/Maintenance/hooks/useSynapsePauseData.ts (1)

25-40: Function approved.

The function correctly handles fetching, error handling, and state management.

packages/synapse-interface/pages/state-managed-bridge/index.tsx (5)

66-67: Verify the correctness of the import statement for getBridgeModuleNames.

The getBridgeModuleNames function is imported from @/utils/getBridgeModuleNames. Ensure that this function is correctly exported from the mentioned path.

Verification successful

The import statement for getBridgeModuleNames is correct.

The getBridgeModuleNames function is exported from packages/synapse-interface/utils/getBridgeModuleNames.ts, which aligns with the import statement in packages/synapse-interface/pages/state-managed-bridge/index.tsx.

  • packages/synapse-interface/utils/getBridgeModuleNames.ts: export const getBridgeModuleNames = (module) => {
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that `getBridgeModuleNames` is correctly exported from `@/utils/getBridgeModuleNames`.

# Test: Search for the export statement. Expect: The function is exported.
rg 'export const getBridgeModuleNames' '@/utils/getBridgeModuleNames.ts'

Length of output: 144


Script:

#!/bin/bash
# Description: Search for the definition of `getBridgeModuleNames` across the repository.

# Test: Search for the export statement of `getBridgeModuleNames`.
rg 'export const getBridgeModuleNames' --glob '*.ts'

Length of output: 261


97-102: Verify the correctness of the useMaintenance hook usage.

The useMaintenance hook is used to retrieve various maintenance-related states. Ensure that the hook is correctly implemented and used.

Verification successful

The useMaintenance hook is correctly implemented and used.

The useMaintenance hook is correctly imported from @/components/Maintenance/Maintenance and used to retrieve various maintenance-related states.

  • packages/synapse-interface/pages/state-managed-bridge/index.tsx line 97
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that `useMaintenance` is correctly exported from `@/components/Maintenance/Maintenance`.

# Test: Search for the export statement. Expect: The hook is exported.
rg 'export const useMaintenance' '@/components/Maintenance/Maintenance.tsx'

Length of output: 156


Script:

#!/bin/bash
# Description: Search for the `useMaintenance` hook definition in the entire codebase.

# Test: Search for the `useMaintenance` hook definition. Expect: The hook is defined somewhere in the codebase.
rg 'const useMaintenance' --type ts

Length of output: 574


Script:

#!/bin/bash
# Description: Check the import statements in `packages/synapse-interface/pages/state-managed-bridge/index.tsx` to determine which `useMaintenance` hook is being used.

# Test: Search for the import statement for `useMaintenance`. Expect: The import statement will reveal the correct file.
rg 'useMaintenance' packages/synapse-interface/pages/state-managed-bridge/index.tsx -A 2

Length of output: 360


569-569: Verify the correctness of the BridgeMaintenanceProgressBar component usage.

The BridgeMaintenanceProgressBar component is used to display maintenance progress. Ensure that the component is correctly implemented and used.

Verification successful

The BridgeMaintenanceProgressBar component is correctly implemented and used.

The component is defined in packages/widget/src/components/Maintenance/Maintenance.tsx and used appropriately in packages/synapse-interface/pages/state-managed-bridge/index.tsx.

  • packages/widget/src/components/Maintenance/Maintenance.tsx: Component definition and export.
  • packages/synapse-interface/pages/state-managed-bridge/index.tsx: Component usage.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that `BridgeMaintenanceProgressBar` is correctly exported from `useMaintenance`.

# Test: Search for the export statement. Expect: The component is exported.
rg 'export const BridgeMaintenanceProgressBar' '@/components/Maintenance/Maintenance.tsx'

Length of output: 170


Script:

#!/bin/bash
# Search for the `BridgeMaintenanceProgressBar` component definition in the entire codebase.
rg 'BridgeMaintenanceProgressBar' --type ts --type tsx --context 10

Length of output: 95


Script:

#!/bin/bash
# Search for the `BridgeMaintenanceProgressBar` component definition in the entire codebase.
rg 'BridgeMaintenanceProgressBar' --glob '*.ts' --glob '*.tsx' --context 10

Length of output: 13601


588-588: Verify the correctness of the BridgeMaintenanceWarningMessage component usage.

The BridgeMaintenanceWarningMessage component is used to display maintenance warnings. Ensure that the component is correctly implemented and used.


170-174: Verify the correctness of the pausedModulesList usage.

The pausedModulesList is used to filter paused bridge modules. Ensure that the list is correctly implemented and used.

Comment on lines +10 to +12
useEffect(() => {
fetchMaintenanceData()
}, [interval])
Copy link
Contributor

Choose a reason for hiding this comment

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

Add cleanup for the interval timer.

Ensure the interval timer is cleared when the component using this hook unmounts.

useEffect(() => {
  fetchMaintenanceData()

+  return () => clearInterval(interval)
}, [interval])
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(() => {
fetchMaintenanceData()
}, [interval])
useEffect(() => {
fetchMaintenanceData()
return () => clearInterval(interval)
}, [interval])

Copy link

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

PR Summary

(updates since last review)

The pull request introduces a new maintenance management system with enhanced state handling and refactors existing functions for improved readability and efficiency.

  • New Feature: Added getTxAge function in contrib/opbot/botmd/commands.go to calculate transaction age, improving transaction detail reporting.
  • Refactor: Updated core/retry/retry.go to use go.uber.org/multierr for error aggregation, enhancing error reporting.
  • Dependency Update: Added github.com/samborkent/uuid across multiple go.mod files for UUID generation.
  • Chore: Removed redundant console logging in gas data fetching operations.
  • Test Enhancement: Added TestTxAge in contrib/opbot/botmd/commands_test.go to ensure accurate transaction age reporting.

106 file(s) reviewed, no comment(s)
Edit PR Review Bot Settings

@aureliusbtc aureliusbtc merged commit 78cf6ee into master Jul 29, 2024
45 checks passed
@aureliusbtc aureliusbtc deleted the fe/maintenance-read-method branch July 29, 2024 12:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants