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

Add privacy icon to space blocks #7171

Merged
merged 5 commits into from
Nov 11, 2024

Conversation

reactoholic
Copy link
Contributor

@reactoholic reactoholic commented Nov 11, 2024

Add privacy icon to space blocks

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced a PrivacyIcon in the JourneyCard to visually indicate privacy status.
    • Enhanced the JourneyTile to conditionally display the PrivacyIcon based on the new isPrivate property.
  • Bug Fixes

    • Corrected spelling errors in success messages across various components for improved clarity.
    • Improved error handling in DashboardSpaces by adding checks for undefined properties.
  • Chores

    • Simplified import statements in several components for improved readability.

Signed-off-by: reactoholic <petar.georgiev.kolev@gmail.com>
Signed-off-by: reactoholic <petar.georgiev.kolev@gmail.com>
Copy link

coderabbitai bot commented Nov 11, 2024

Walkthrough

The changes involve modifications to several components, primarily focusing on the addition of a PrivacyIcon in the JourneyCard and JourneyTile components, which visually indicates the privacy status of a journey. The JourneyTile component has been updated to include an isPrivate prop, while the DashboardSpaces component has received enhancements to check for undefined properties to prevent errors. Minor adjustments were made in the ExploreSpacesView component, primarily related to import statements. Additionally, several translation files have been updated to correct spelling errors in success message keys.

Changes

File Path Change Summary
src/domain/journey/common/JourneyCard/JourneyCard.tsx Added PrivacyIcon component; updated JourneyCard to conditionally render PrivacyIcon based on isPrivate prop. Added sx prop to ContributeCard.
src/domain/journey/common/JourneyTile/JourneyTile.tsx Simplified React import; transformed JourneyTileProps interface to a type, adding optional isPrivate property; updated component logic to render PrivacyIcon.
src/main/topLevelPages/myDashboard/DashboardWithMemberships/DashboardSpaces/DashboardSpaces.tsx Added checks for undefined space and subSpace objects; modified onClick handler for Paper component.
src/main/topLevelPages/myDashboard/ExploreSpaces/ExploreSpacesView.tsx Altered import statement to only import useState; no changes to component logic or structure.
src/core/i18n/ach/translation.ach.json Corrected spelling of keys updated-successfuly and deleted-successfuly to updated-successfully and deleted-successfully.
src/core/i18n/bg/translation.bg.json Corrected spelling of keys updated-successfuly and deleted-successfuly to updated-successfully and deleted-successfully.
src/core/i18n/de/translation.de.json Corrected spelling of keys updated-successfully and deleted-successfully in the operations section.
src/core/i18n/en/translation.en.json Corrected spelling of keys updated-successfully and deleted-successfully in the operations section.
src/core/i18n/es/translation.es.json Corrected spelling of keys updated-successfully and deleted-successfully in the operations section.
src/core/i18n/fr/translation.fr.json Corrected spelling of keys updated-successfully and deleted-successfully in the operations section.
src/core/i18n/nl/translation.nl.json Corrected spelling of keys updated-successfully and deleted-successfully in the operations section.
src/core/i18n/pt/translation.pt.json Corrected spelling of keys updated-successfully and deleted-successfully in the operations section.
src/core/i18n/ua/translation.ua.json Corrected spelling of keys updated-successfully and deleted-successfully in the operations section.
src/domain/platform/admin/components/Group/GroupPage.tsx Updated success message key in onCompleted callback from updated-successfuly to updated-successfully.
src/domain/platform/admin/components/Group/useDeleteUserGroup.ts Updated success message key in onCompleted callback from deleted-successfuly to deleted-successfully.

Possibly related PRs

  • Actions menu in Subspace List * #6885: The changes in this PR involve modifications to the JourneyTile component, which is directly related to the JourneyCard component in the main PR, as both components are concerned with displaying journey-related information and have been updated to include the PrivacyIcon functionality.
  • [Simple Homepage] Explore spaces  #7097: This PR introduces a new optional property columns to the JourneyTileProps interface, enhancing the layout capabilities of the JourneyTile component, which is relevant to the changes made in the main PR regarding the JourneyCard component.
  • [Simple Homepage] Dashboard Menu + Activity Components #7107: The updates in this PR include modifications to the dashboard menu and activity components, which may interact with the JourneyCard and JourneyTile components in terms of displaying user activities related to journeys, thus connecting it to the main PR's focus on journey representation.
  • [Simple Homepage] Activity view - Recent Spaces + mobile support #7116: This PR addresses the Recent Spaces feature, which is directly related to the JourneyCard and JourneyTile components as they both deal with displaying journey information, enhancing the overall user experience in the dashboard context.

Suggested reviewers

  • bobbykolev

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

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

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

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

CodeRabbit Commands (Invoked using PR comments)

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

Other keywords and placeholders

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

Documentation and Community

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

Copy link

@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 (5)
src/domain/journey/common/JourneyTile/JourneyTile.tsx (2)

1-1: Consider moving PrivacyIcon to a shared components directory.

Importing PrivacyIcon from another component file (JourneyCard) suggests tight coupling. Consider moving PrivacyIcon to a shared components directory to improve modularity and reusability.

Also applies to: 14-14


37-37: Enhance accessibility and user experience for privacy status.

While the privacy icon implementation works, consider these improvements:

  1. Add ARIA attributes to convey privacy status to screen readers
  2. Add a tooltip to explain what the privacy icon means
  3. Ensure the icon placement doesn't overlap with other content

Example implementation:

- {isPrivate && <PrivacyIcon />}
+ {isPrivate && (
+   <Box
+     role="status"
+     aria-label="Private journey"
+     title="This journey is private"
+   >
+     <PrivacyIcon />
+   </Box>
+ )}

Also applies to: 54-55

src/domain/journey/common/JourneyCard/JourneyCard.tsx (1)

67-67: Consider using type-safe sx prop spreading

While the implementation works, consider using type-safe sx prop spreading to prevent potential runtime issues:

-<ContributeCard {...containerProps} sx={{ ...containerProps.sx, position: 'relative' }}>
+<ContributeCard 
+  {...containerProps} 
+  sx={theme => ({
+    position: 'relative',
+    ...(typeof containerProps.sx === 'function' 
+      ? containerProps.sx(theme) 
+      : containerProps.sx),
+  })}
+>
src/main/topLevelPages/myDashboard/ExploreSpaces/ExploreSpacesView.tsx (2)

Line range hint 42-46: Consider memoizing callback functions.

Functions like onFilterChange are recreated on every render. Consider using useCallback to optimize performance, especially since they're passed as props to child components.

- const onFilterChange = (filter: string) => {
+ const onFilterChange = useCallback((filter: string) => {
    setSelectedFilter(filter);
-  };
+  }, [setSelectedFilter]);

Line range hint 15-15: Consider extracting magic numbers into named constants.

The DEFAULT_ITEMS_LIMIT is defined, but other magic numbers like itemsPerRow = 4 could also be extracted into named constants at the top of the file for better maintainability.

+ const DEFAULT_ITEMS_PER_ROW = 4;
+ const DEFAULT_COLUMNS_DIVISION = 4; // for cardColumns calculation
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between d12ab4b and 0ff0ced.

📒 Files selected for processing (4)
  • src/domain/journey/common/JourneyCard/JourneyCard.tsx (3 hunks)
  • src/domain/journey/common/JourneyTile/JourneyTile.tsx (4 hunks)
  • src/main/topLevelPages/myDashboard/DashboardWithMemberships/DashboardSpaces/DashboardSpaces.tsx (0 hunks)
  • src/main/topLevelPages/myDashboard/ExploreSpaces/ExploreSpacesView.tsx (1 hunks)
💤 Files with no reviewable changes (1)
  • src/main/topLevelPages/myDashboard/DashboardWithMemberships/DashboardSpaces/DashboardSpaces.tsx
🧰 Additional context used
📓 Path-based instructions (3)
src/domain/journey/common/JourneyCard/JourneyCard.tsx (1)

Pattern src/**/*.{ts,tsx,js}: Review the React.js/TypeScript/JavaScript code for best practices and potential bugs.
Ensure that the code adheres to TypeScript's typing system and modern standards.
Ensure sufficient error handling and logging is present.
Check for common security vulnerabilities such as:

  • SQL Injection
  • XSS (Cross-Site Scripting)
  • CSRF (Cross-Site Request Forgery)
  • Insecure dependencies
  • Sensitive data exposure
src/domain/journey/common/JourneyTile/JourneyTile.tsx (1)

Pattern src/**/*.{ts,tsx,js}: Review the React.js/TypeScript/JavaScript code for best practices and potential bugs.
Ensure that the code adheres to TypeScript's typing system and modern standards.
Ensure sufficient error handling and logging is present.
Check for common security vulnerabilities such as:

  • SQL Injection
  • XSS (Cross-Site Scripting)
  • CSRF (Cross-Site Request Forgery)
  • Insecure dependencies
  • Sensitive data exposure
src/main/topLevelPages/myDashboard/ExploreSpaces/ExploreSpacesView.tsx (1)

Pattern src/**/*.{ts,tsx,js}: Review the React.js/TypeScript/JavaScript code for best practices and potential bugs.
Ensure that the code adheres to TypeScript's typing system and modern standards.
Ensure sufficient error handling and logging is present.
Check for common security vulnerabilities such as:

  • SQL Injection
  • XSS (Cross-Site Scripting)
  • CSRF (Cross-Site Request Forgery)
  • Insecure dependencies
  • Sensitive data exposure
🔇 Additional comments (4)
src/domain/journey/common/JourneyTile/JourneyTile.tsx (2)

Line range hint 16-30: LGTM! Type definitions are well-structured.

The type definition is clear and properly typed with TypeScript, including the optional isPrivate property.


54-55: Verify PrivacyIcon positioning and styling.

Since the component uses absolute positioning for the title box at the bottom, ensure that the PrivacyIcon's positioning doesn't conflict with other absolutely positioned elements.

✅ Verification successful

Let me check the actual implementation and styling of PrivacyIcon in both components to make a proper comparison.


No positioning conflicts with PrivacyIcon implementation

The PrivacyIcon is properly implemented in JourneyTile, being imported from JourneyCard. The PrivacyIcon component uses absolute positioning (top: 10, right: 10) which doesn't conflict with the title box positioning at the bottom. The implementation is consistent across both JourneyCard and JourneyTile components.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for PrivacyIcon styling in JourneyCard to compare positioning
rg -l "PrivacyIcon" src/domain/journey/common/JourneyCard/

Length of output: 112


Script:

#!/bin/bash
# Get the implementation details of both components
echo "=== JourneyTile.tsx ==="
rg -A 10 "PrivacyIcon" src/domain/journey/common/JourneyTile/JourneyTile.tsx

echo -e "\n=== JourneyCard.tsx ==="
rg -A 10 "PrivacyIcon" src/domain/journey/common/JourneyCard/JourneyCard.tsx

# Check for any styled components or CSS related to PrivacyIcon
echo -e "\n=== Styled components or CSS for PrivacyIcon ==="
rg "PrivacyIcon.*styled|styled.*PrivacyIcon" src/domain/journey/common/

Length of output: 1774

src/domain/journey/common/JourneyCard/JourneyCard.tsx (1)

Line range hint 29-29: LGTM: Clean prop addition

The optional boolean prop follows TypeScript best practices.

src/main/topLevelPages/myDashboard/ExploreSpaces/ExploreSpacesView.tsx (1)

1-1: LGTM! Import optimization looks good.

The change to import only the required useState hook follows React best practices by reducing bundle size through tree-shaking.

Signed-off-by: reactoholic <petar.georgiev.kolev@gmail.com>
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 (3)
src/domain/platform/admin/components/Group/useDeleteUserGroup.ts (1)

Line range hint 1-47: Consider enhancing error handling and type safety.

While the hook implementation is solid, there are a few improvements that could make it more robust:

  1. The error callback in the mutation options could be simplified
  2. The success message should handle the case when displayName is undefined
  3. The Options type could be more strictly typed

Consider these improvements:

 type Options = {
-  onComplete?: (data: DeleteGroupMutation) => void;
-  onError?: (error: ApolloError) => void;
+  onComplete?: (data: NonNullable<DeleteGroupMutation>) => void;
+  onError?: (error: ApolloError) => void;
 };

 export const useDeleteUserGroup = (options?: Options) => {
   const { t } = useTranslation();
   const notify = useNotification();

   const success = (message: string) => notify(message, 'success');

   const [deleteGroup, { loading, error }] = useDeleteGroupMutation({
     onCompleted: data => {
-      success(t('operations.user-group.deleted-successfully', { name: data.deleteUserGroup.profile?.displayName }));
+      const displayName = data.deleteUserGroup.profile?.displayName ?? t('common.unnamed');
+      success(t('operations.user-group.deleted-successfully', { name: displayName }));
       options && options.onComplete && options.onComplete(data);
     },
-    onError: options && options.onError && options.onError,
+    onError: options?.onError,
🧰 Tools
🪛 Biome

[error] 21-21: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 23-23: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

src/domain/journey/common/JourneyCard/JourneyCard.tsx (2)

119-120: Use consistent theme spacing units

The division by 10 in theme spacing calculations seems arbitrary. MUI's theme spacing is typically in units of 8px, so dividing by 8 would be more conventional.

-          top: theme.spacing(top / 10),
-          right: theme.spacing(right / 10),
+          top: theme.spacing(top / 8),
+          right: theme.spacing(right / 8),

111-138: Enhance component maintainability

Consider these improvements:

  1. Add display name for debugging
  2. Extract default values to named constants
  3. Add prop-types validation if not using TypeScript strict mode
+const DEFAULT_SIZE = 25;
+const DEFAULT_POSITION = 10;
+const DEFAULT_ARIA_LABEL = 'Private journey';
+
 export const PrivacyIcon = memo(
-  ({ top = 10, size = 25, right = 10, ariaLabel = 'Private journey' }: PrivacyIconProps) => {
+  ({ 
+    top = DEFAULT_POSITION,
+    size = DEFAULT_SIZE,
+    right = DEFAULT_POSITION,
+    ariaLabel = DEFAULT_ARIA_LABEL
+  }: PrivacyIconProps) => {
     // ... component implementation ...
-  }
+  }
+);
+
+PrivacyIcon.displayName = 'PrivacyIcon';
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 0ff0ced and bb16eaa.

📒 Files selected for processing (13)
  • src/core/i18n/ach/translation.ach.json (1 hunks)
  • src/core/i18n/bg/translation.bg.json (1 hunks)
  • src/core/i18n/de/translation.de.json (1 hunks)
  • src/core/i18n/en/translation.en.json (2 hunks)
  • src/core/i18n/es/translation.es.json (1 hunks)
  • src/core/i18n/fr/translation.fr.json (1 hunks)
  • src/core/i18n/nl/translation.nl.json (1 hunks)
  • src/core/i18n/pt/translation.pt.json (1 hunks)
  • src/core/i18n/ua/translation.ua.json (1 hunks)
  • src/domain/journey/common/JourneyCard/JourneyCard.tsx (3 hunks)
  • src/domain/journey/common/JourneyTile/JourneyTile.tsx (4 hunks)
  • src/domain/platform/admin/components/Group/GroupPage.tsx (1 hunks)
  • src/domain/platform/admin/components/Group/useDeleteUserGroup.ts (1 hunks)
✅ Files skipped from review due to trivial changes (10)
  • src/core/i18n/ach/translation.ach.json
  • src/core/i18n/bg/translation.bg.json
  • src/core/i18n/de/translation.de.json
  • src/core/i18n/en/translation.en.json
  • src/core/i18n/es/translation.es.json
  • src/core/i18n/fr/translation.fr.json
  • src/core/i18n/nl/translation.nl.json
  • src/core/i18n/pt/translation.pt.json
  • src/core/i18n/ua/translation.ua.json
  • src/domain/platform/admin/components/Group/GroupPage.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/domain/journey/common/JourneyTile/JourneyTile.tsx
🧰 Additional context used
📓 Path-based instructions (2)
src/domain/journey/common/JourneyCard/JourneyCard.tsx (1)

Pattern src/**/*.{ts,tsx,js}: Review the React.js/TypeScript/JavaScript code for best practices and potential bugs.
Ensure that the code adheres to TypeScript's typing system and modern standards.
Ensure sufficient error handling and logging is present.
Check for common security vulnerabilities such as:

  • SQL Injection
  • XSS (Cross-Site Scripting)
  • CSRF (Cross-Site Request Forgery)
  • Insecure dependencies
  • Sensitive data exposure
src/domain/platform/admin/components/Group/useDeleteUserGroup.ts (1)

Pattern src/**/*.{ts,tsx,js}: Review the React.js/TypeScript/JavaScript code for best practices and potential bugs.
Ensure that the code adheres to TypeScript's typing system and modern standards.
Ensure sufficient error handling and logging is present.
Check for common security vulnerabilities such as:

  • SQL Injection
  • XSS (Cross-Site Scripting)
  • CSRF (Cross-Site Request Forgery)
  • Insecure dependencies
  • Sensitive data exposure
🔇 Additional comments (2)
src/domain/platform/admin/components/Group/useDeleteUserGroup.ts (1)

20-20: LGTM! Spelling correction in success message.

The spelling correction from "deleted-successfuly" to "deleted-successfully" aligns with the broader effort to fix these typographical errors across translation files.

src/domain/journey/common/JourneyCard/JourneyCard.tsx (1)

67-67: LGTM: Clean implementation of ContributeCard styling

The implementation correctly uses the sx prop for positioning, following the recommended pattern from previous reviews.

Signed-off-by: reactoholic <petar.georgiev.kolev@gmail.com>
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)
src/domain/journey/common/JourneyCard/JourneyCard.tsx (1)

104-138: Enhance PrivacyIcon implementation with better theme integration and prop validation

The component could benefit from the following improvements:

  1. Use theme.spacing consistently for size
  2. Use theme constants for padding
  3. Add prop validation for negative values

Consider applying these changes:

 type PrivacyIconProps = {
-  size?: number;
-  top?: number;
-  right?: number;
+  size?: number & { __brand: 'positive' };
+  top?: number & { __brand: 'nonNegative' };
+  right?: number & { __brand: 'nonNegative' };
   ariaLabel?: string;
 };

 export const PrivacyIcon = memo(
-  ({ top = 10, size = 25, right = 10, ariaLabel = 'Private journey' }: PrivacyIconProps) => {
+  ({ top = 1, size = 3, right = 1, ariaLabel = 'Private journey' }: PrivacyIconProps) => {
     return (
       <Paper
         elevation={3}
         sx={theme => ({
           position: 'absolute',
           zIndex: theme.zIndex.fab,
-          top: theme.spacing(top / 10),
-          right: theme.spacing(right / 10),
+          top: theme.spacing(top),
+          right: theme.spacing(right),
 
           display: 'flex',
           alignItems: 'center',
           justifyContent: 'center',
 
-          width: size,
-          height: size,
+          width: theme.spacing(size),
+          height: theme.spacing(size),
           borderRadius: '50%',
-          padding: theme.spacing(1.8),
+          padding: theme.spacing(2),
           backgroundColor: theme.palette.background.paper,
         })}
         aria-label={ariaLabel}
       >
         <LockOutlined fontSize="medium" color="primary" />
       </Paper>
     );
   }
 );
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between bb16eaa and 55aaeba.

📒 Files selected for processing (2)
  • src/domain/journey/common/JourneyCard/JourneyCard.tsx (3 hunks)
  • src/domain/journey/common/JourneyTile/JourneyTile.tsx (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/domain/journey/common/JourneyTile/JourneyTile.tsx
🧰 Additional context used
📓 Path-based instructions (1)
src/domain/journey/common/JourneyCard/JourneyCard.tsx (1)

Pattern src/**/*.{ts,tsx,js}: Review the React.js/TypeScript/JavaScript code for best practices and potential bugs.
Ensure that the code adheres to TypeScript's typing system and modern standards.
Ensure sufficient error handling and logging is present.
Check for common security vulnerabilities such as:

  • SQL Injection
  • XSS (Cross-Site Scripting)
  • CSRF (Cross-Site Request Forgery)
  • Insecure dependencies
  • Sensitive data exposure
📓 Learnings (1)
src/domain/journey/common/JourneyCard/JourneyCard.tsx (1)
Learnt from: bobbykolev
PR: alkem-io/client-web#7171
File: src/domain/journey/common/JourneyCard/JourneyCard.tsx:68-68
Timestamp: 2024-11-11T12:41:24.682Z
Learning: When adding `sx` properties to a component, avoid explicitly merging `containerProps.sx`; instead, set the `sx` prop and spread `...containerProps` to simplify the code and allow `containerProps.sx` to override if necessary.

@valentinyanakiev valentinyanakiev merged commit 900cacc into develop Nov 11, 2024
2 of 3 checks passed
@valentinyanakiev valentinyanakiev deleted the client-web/7156-add-privacy-icon branch November 11, 2024 13:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants