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/refactor app #66

Merged
merged 15 commits into from
Sep 1, 2024
Merged

Feat/refactor app #66

merged 15 commits into from
Sep 1, 2024

Conversation

mehdi-torabiv
Copy link
Collaborator

@mehdi-torabiv mehdi-torabiv commented Sep 1, 2024

Summary by CodeRabbit

  • New Features

    • Introduced a custom hook for managing authentication with the Sign-In with Ethereum (SIWE) protocol, streamlining the authentication process.
    • Added a new service class for interacting with the Ethereum Attestation Service (EAS), enhancing attestation management capabilities.
    • Implemented a multi-step process for linking social media accounts to a wallet address, improving user interaction.
    • Added new components for each step of the attestation process, enhancing user experience.
  • Improvements

    • Enhanced import organization across various files for better readability and maintainability.
    • Added automatic sorting of import statements to improve code clarity.
    • Simplified authentication logic in the app component for better efficiency.
    • Improved the Identifiers component by consolidating logic for managing identifiers and attestations.
  • Bug Fixes

    • Reactivated the import of the ConnectButton in the Login component.
  • Tests

    • Introduced unit tests for the StepOne component to ensure proper rendering and functionality during user authentication.
  • Chores

    • Minor formatting adjustments and blank lines added for improved code structure and readability.

Copy link

coderabbitai bot commented Sep 1, 2024

Warning

Rate limit exceeded

@mehdi-torabiv has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 21 minutes and 25 seconds before requesting another review.

How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

Commits

Files that changed from the base of the PR and between 376a6d3 and b284d8f.

Walkthrough

The changes involve enhancements to the ESLint configuration by adding the simple-import-sort plugin for organizing imports, and the introduction of a custom hook, useSiweAuth, to streamline authentication management. Several components have been refactored, particularly for handling attestations and identifiers, with new components created for a multi-step authentication process. Minor formatting adjustments were made across various files without altering core functionality.

Changes

Files Change Summary
.eslintrc.cjs Added simple-import-sort plugin and rule for organizing imports.
src/App.tsx Reorganized imports and simplified authentication logic with useSiweAuth hook.
src/components/pages/attestations/*.tsx Introduced new components (StepOne, StepTwo, StepThree) for handling authentication steps.
src/pages/Identifiers/*.tsx, src/pages/Identifiers/index.ts Refactored identifier handling and changed export/import syntax for Identifiers.
src/services/eas.service.ts Introduced EASService class for managing interactions with the Ethereum Attestation Service.
src/services/api/auth/index.ts Introduced PlatformAuthenticationParams interface for type safety in authentication parameters.
src/enums/index.ts Added Provider enum to standardize provider types.
src/interfaces/index.ts, src/libs/oci/index.ts Added new interface IAttestation and restructured imports.
src/libs/*.ts, src/setupTests.ts Minor formatting adjustments; no changes to functionality.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant App
    participant AuthService

    User->>App: Initiates login
    App->>AuthService: Calls useSiweAuth
    AuthService->>AuthService: getNonce()
    AuthService->>User: Returns nonce
    User->>AuthService: Signs message with nonce
    AuthService->>AuthService: verify()
    AuthService->>User: Returns JWT token
    User->>App: Authenticated
Loading

🐰 In the code, I hop and play,
🐇 With imports neat, I dance all day!
🎉 New hooks to help me sign and cheer,
🌟 A tidy space, my code is clear!
🥕 Let’s celebrate, with joy we’ll sing,
🎈 For every change, a happy spring!


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 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.

CodeRabbit Configuration File (.coderabbit.yaml)

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

Documentation and Community

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

Copy link

cloudflare-workers-and-pages bot commented Sep 1, 2024

Deploying identity-on-chain-platform with  Cloudflare Pages  Cloudflare Pages

Latest commit: b284d8f
Status: ✅  Deploy successful!
Preview URL: https://1286f42f.identity-on-chain-platform.pages.dev
Branch Preview URL: https://feat-refactor-app.identity-on-chain-platform.pages.dev

View logs

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, codebase verification and nitpick comments (3)
src/hooks/useSiweAuth.tsx (3)

42-42: Consider using a more specific prefix for the token key in local storage.

To avoid potential conflicts with other keys in local storage, consider using a more specific prefix for the token key. For example, you could use APP_NAME_OCI_TOKEN instead of OCI_TOKEN.

- localStorage.setItem('OCI_TOKEN', data.jwt);
+ localStorage.setItem('APP_NAME_OCI_TOKEN', data.jwt);

35-39: Consider adding error handling for API calls.

To improve the robustness of the hook, consider adding error handling for the API calls. You can catch any errors that occur during the API requests and handle them appropriately, such as displaying an error message to the user or logging the error for debugging purposes.

try {
  const { data } = await api.post('auth/siwe/verify', {
    message,
    signature,
    chainId: 11155111,
  });
  // ...
} catch (error) {
  console.error('Error during SIWE verification:', error);
  // Handle the error appropriately
}

38-38: Consider using a constant for the chain ID.

To improve readability and maintainability, consider defining the chain ID as a constant at the top of the file or in a separate configuration file. This way, if the chain ID needs to be changed in the future, you only need to update it in one place.

+ const CHAIN_ID = 11155111;

// ...

const { data } = await api.post('auth/siwe/verify', {
  message,
  signature,
- chainId: 11155111,
+ chainId: CHAIN_ID,
});
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between f16afe1 and 08b9687.

Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
Files selected for processing (37)
  • .eslintrc.cjs (1 hunks)
  • package.json (1 hunks)
  • src/App.tsx (2 hunks)
  • src/ProtectedRoute.tsx (1 hunks)
  • src/components/layouts/AccountPopover.spec.tsx (1 hunks)
  • src/components/layouts/AccountPopover.tsx (1 hunks)
  • src/components/layouts/AppbarApp.spec.tsx (1 hunks)
  • src/components/layouts/SidebarApp.spec.tsx (1 hunks)
  • src/components/layouts/SidebarApp.tsx (1 hunks)
  • src/components/shared/AccessControlButton.spec.tsx (1 hunks)
  • src/components/shared/AccessControlButton.tsx (1 hunks)
  • src/components/shared/CustomSnackbar.tsx (1 hunks)
  • src/components/shared/CustomStepper.tsx (1 hunks)
  • src/components/shared/CustomTable.tsx (1 hunks)
  • src/components/shared/StepperComponent.test.tsx (1 hunks)
  • src/hooks/LitProvider.tsx (1 hunks)
  • src/hooks/useSessionSigs.tsx (1 hunks)
  • src/hooks/useSiweAuth.tsx (1 hunks)
  • src/layouts/DefaultLayout.tsx (1 hunks)
  • src/libs/constants.ts (1 hunks)
  • src/libs/oci/index.ts (1 hunks)
  • src/libs/theme.tsx (1 hunks)
  • src/main.tsx (1 hunks)
  • src/pages/Auth/Login/Login.tsx (1 hunks)
  • src/pages/Auth/Login/index.ts (1 hunks)
  • src/pages/Callback/Callback.tsx (1 hunks)
  • src/pages/Dashboard/Dashboard.spec.tsx (1 hunks)
  • src/pages/Dashboard/index.ts (1 hunks)
  • src/pages/Identifiers/Attestation/Attestation.tsx (1 hunks)
  • src/pages/Identifiers/Identifiers.tsx (1 hunks)
  • src/pages/Permissions/Permissions.tsx (2 hunks)
  • src/services/api/auth/index.ts (1 hunks)
  • src/services/api/eas/query.ts (1 hunks)
  • src/services/api/index.ts (1 hunks)
  • src/services/eas/query.ts (1 hunks)
  • src/setupTests.ts (1 hunks)
  • src/utils/eas-wagmi-utils.ts (1 hunks)
Files skipped from review due to trivial changes (33)
  • package.json
  • src/ProtectedRoute.tsx
  • src/components/layouts/AccountPopover.spec.tsx
  • src/components/layouts/AccountPopover.tsx
  • src/components/layouts/AppbarApp.spec.tsx
  • src/components/layouts/SidebarApp.spec.tsx
  • src/components/layouts/SidebarApp.tsx
  • src/components/shared/AccessControlButton.spec.tsx
  • src/components/shared/AccessControlButton.tsx
  • src/components/shared/CustomSnackbar.tsx
  • src/components/shared/CustomTable.tsx
  • src/components/shared/StepperComponent.test.tsx
  • src/hooks/LitProvider.tsx
  • src/hooks/useSessionSigs.tsx
  • src/layouts/DefaultLayout.tsx
  • src/libs/constants.ts
  • src/libs/oci/index.ts
  • src/libs/theme.tsx
  • src/main.tsx
  • src/pages/Auth/Login/Login.tsx
  • src/pages/Auth/Login/index.ts
  • src/pages/Callback/Callback.tsx
  • src/pages/Dashboard/Dashboard.spec.tsx
  • src/pages/Dashboard/index.ts
  • src/pages/Identifiers/Attestation/Attestation.tsx
  • src/pages/Identifiers/Identifiers.tsx
  • src/pages/Permissions/Permissions.tsx
  • src/services/api/auth/index.ts
  • src/services/api/eas/query.ts
  • src/services/api/index.ts
  • src/services/eas/query.ts
  • src/setupTests.ts
  • src/utils/eas-wagmi-utils.ts
Additional context used
Biome
src/components/shared/CustomStepper.tsx

[error] 13-13: Shouldn't redeclare 'Step'. Consider to delete it or rename it.

'Step' is defined here:

(lint/suspicious/noRedeclare)

Additional comments not posted (7)
.eslintrc.cjs (1)

Line range hint 1-53: LGTM!

The changes to the ESLint configuration are well-structured and follow best practices:

  • The simple-import-sort plugin has been added to organize import statements.
  • A new rule simple-import-sort/imports has been added to specify the grouping of imports. The rule defines a clear and logical structure for sorting imports.
  • Minor formatting changes have been made to the project array for consistency.

Overall, the changes enhance the linting capabilities and improve the organization of import statements. No issues found.

src/hooks/useSiweAuth.tsx (1)

1-72: LGTM! The useSiweAuth hook is well-structured and follows best practices.

The hook encapsulates the authentication logic using the SIWE protocol and provides a clean interface for managing the authentication status and handling sign in/out. The implementation is clear and easy to understand. No major issues found.

src/components/shared/CustomStepper.tsx (2)

1-103: LGTM! The formatting changes improve code readability.

The changes in this file are primarily focused on formatting and organization, such as:

  • Consolidating imports from @mui/material.
  • Adjusting indentation and alignment of properties in styled components.
  • Reformatting function parameters and JSX.

These changes enhance the clarity and maintainability of the code without altering the core logic or functionality of the component. The code remains clean and well-structured.

Tools
Biome

[error] 13-13: Shouldn't redeclare 'Step'. Consider to delete it or rename it.

'Step' is defined here:

(lint/suspicious/noRedeclare)


13-13: False positive: The Step interface is not a redeclaration.

The static analysis tool Biome has flagged a potential issue with the redeclaration of Step. However, this appears to be a false positive. The Step interface defined in this file is separate from the Step component imported from @mui/material. There is no actual redeclaration occurring.

Tools
Biome

[error] 13-13: Shouldn't redeclare 'Step'. Consider to delete it or rename it.

'Step' is defined here:

(lint/suspicious/noRedeclare)

src/App.tsx (3)

3-5: LGTM!

The reorganization of import statements improves readability without affecting functionality.


48-48: LGTM!

The transition to the custom hook useSiweAuth simplifies the component's logic by encapsulating authentication handling, enhancing readability and maintainability.


7-24: LGTM! But verify if the removed imports are no longer used.

The reorganization of import statements reflects the modifications in the authentication logic and the addition of a new Callback page, improving readability and maintainability.

Run the following script to verify if the removed imports are no longer used in the file:

Verification successful

Verification Successful: Removed Imports Are No Longer Used

The functions createAuthenticationAdapter and getAddress are not present in src/App.tsx, confirming that their removal from the import statements is appropriate. The reorganization of imports reflects the updated authentication logic and improves code maintainability.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify if the removed imports are no longer used in the file.

# Test: Search for the usage of `createAuthenticationAdapter` function. Expect: No occurrences.
rg --type typescript $'createAuthenticationAdapter' src/App.tsx

# Test: Search for the usage of `getAddress` function. Expect: No occurrences.
rg --type typescript $'getAddress' src/App.tsx

Length of output: 178


Script:

#!/bin/bash
# Description: Verify if the removed imports are no longer used in the file.

# Test: Search for the usage of `createAuthenticationAdapter` function. Expect: No occurrences.
rg 'createAuthenticationAdapter' src/App.tsx

# Test: Search for the usage of `getAddress` function. Expect: No occurrences.
rg 'getAddress' src/App.tsx

Length of output: 72

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 08b9687 and cc347c2.

Files selected for processing (1)
  • src/ProtectedRoute.tsx (2 hunks)
Additional comments not posted (2)
src/ProtectedRoute.tsx (2)

3-4: LGTM! The reordering of import statements improves readability.

Sorting imports alphabetically or grouping them by their origin is a good practice for better code organization and readability.


18-30: LGTM! The changes in the useEffect hook simplify the authentication logic and streamline the code.

The modifications in the useEffect hook directly check the isConnected state to determine the authentication status and manage the local storage token accordingly. The removal of the second useEffect and integration of its functionality into the first useEffect reduces redundancy and improves code efficiency.

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, codebase verification and nitpick comments (1)
src/pages/Identifiers/Identifiers.tsx (1)

211-653: Remove commented-out code.

The commented-out code at the end of the file should be removed to improve code cleanliness and maintainability. If the code is no longer needed, it should be deleted. If it needs to be kept for reference or future use, it should be moved to a separate file or version control system.

Apply this diff to remove the commented-out code:

-// /* eslint-disable @typescript-eslint/no-explicit-any */
-// /* eslint-disable react-hooks/exhaustive-deps */
-// import React, { useCallback, useEffect, useState } from 'react';
-// import {
-//   DelegatedRevocationRequest,
-//   EAS,
-// } from '@ethereum-attestation-service/eas-sdk';
-// import VerifiedIcon from '@mui/icons-material/Verified';
-// import VisibilityIcon from '@mui/icons-material/Visibility';
-// import VisibilityOffIcon from '@mui/icons-material/VisibilityOff';
-// import {
-//   Avatar,
-//   Backdrop,
-//   Box,
-//   Button,
-//   CircularProgress,
-//   Divider,
-//   IconButton,
-//   List,
-//   ListItem,
-//   ListItemSecondaryAction,
-//   ListItemText,
-//   Paper,
-//   Stack,
-//   Typography,
-// } from '@mui/material';
-// import clsx from 'clsx';
-// import { FaDiscord, FaGoogle } from 'react-icons/fa';
-// import { useNavigate } from 'react-router-dom';
-// import { Address } from 'viem';
-// import { useAccount } from 'wagmi';
-//
-// import { RevokePayload } from '../../interfaces';
-// import { decodeAttestationData, IAttestation } from '../../libs/oci';
-// import {
-//   useDecryptAttestationsSecretMutation,
-//   useRevokeIdentifierMutation,
-// } from '../../services/api/eas/query';
-// import { useGetAttestations } from '../../services/eas/query';
-// import useSnackbarStore from '../../store/useSnackbarStore';
-// import sepoliaChain from '../../utils/contracts/eas/sepoliaChain.json';
-// import { useSigner } from '../../utils/eas-wagmi-utils';
-// import { convertStringsToBigInts } from '../../utils/helper';
-//
-// interface IdentifierItemProps {
-//   identifier: {
-//     name: string;
-//     icon: React.ElementType;
-//     verified: boolean;
-//     uid: string;
-//   };
-//   onRevoke: (uid: string) => void;
-//   onConnect: (name: string) => void;
-//   isLoading: boolean;
-//   isRevealedPending: boolean;
-//   isRevealed: string;
-//   onReveal: () => void;
-// }
-//
-// const IdentifierItem: React.FC<IdentifierItemProps> = ({
-//   identifier,
-//   onRevoke,
-//   onConnect,
-//   isLoading,
-//   isRevealedPending,
-//   isRevealed,
-//   onReveal,
-// }) => (
-//   <Box mb={2}>
-//     <Paper elevation={1} className="rounded-xl py-2">
-//       <ListItem>
-//         <Avatar>
-//           <identifier.icon
-//             size={28}
-//             className={clsx({
-//               'text-black': identifier.verified,
-//               'text-white': !identifier.verified,
-//             })}
-//           />
-//         </Avatar>
-//         <ListItemText
-//           primary={
-//             <div className="flex items-center">
-//               {identifier.verified && (
-//                 <VerifiedIcon sx={{ color: 'blue', mr: 1 }} />
-//               )}
-//               <Typography>{identifier.name}</Typography>
-//               {identifier.verified && (
-//                 <div className="ml-3">
-//                   {isRevealedPending ? (
-//                     <CircularProgress size={24} />
-//                   ) : (
-//                     <>
-//                       {isRevealed !== '*********' ? isRevealed : '*********'}
-//                       <IconButton onClick={onReveal} sx={{ ml: 1 }}>
-//                         {isRevealed !== '*********' ? (
-//                           <VisibilityOffIcon />
-//                         ) : (
-//                           <VisibilityIcon />
-//                         )}
-//                       </IconButton>
-//                     </>
-//                   )}
-//                 </div>
-//               )}
-//             </div>
-//           }
-//           sx={{ ml: 2 }}
-//         />
-//         <ListItemSecondaryAction>
-//           {identifier.verified ? (
-//             <Button
-//               variant="outlined"
-//               color="inherit"
-//               onClick={() => onRevoke(identifier.uid)}
-//               disabled={isLoading}
-//               startIcon={isLoading ? <CircularProgress size={16} /> : null}
-//             >
-//               {isLoading ? 'Revoking...' : 'Revoke'}
-//             </Button>
-//           ) : (
-//             <Button
-//               variant="contained"
-//               color="primary"
-//               onClick={() => onConnect(identifier.name)}
-//             >
-//               Connect
-//             </Button>
-//           )}
-//         </ListItemSecondaryAction>
-//       </ListItem>
-//     </Paper>
-//   </Box>
-// );
-//
-// export function Identifiers() {
-//   const { showSnackbar } = useSnackbarStore();
-//   const { chainId, address } = useAccount();
-//   const navigate = useNavigate();
-//
-//   const signer = useSigner();
-//
-//   const [identifiers, setIdentifiers] = useState([
-//     {
-//       name: 'Discord',
-//       icon: FaDiscord,
-//       verified: false,
-//       uid: '',
-//     },
-//     { name: 'Google', icon: FaGoogle, verified: false, uid: '' },
-//   ]);
-//
-//   const [attestations, setAttestations] = useState<
-//     (IAttestation & { provider?: string; id?: string })[]
-//   >([]);
-//   const {
-//     data: attestationsResponse,
-//     refetch,
-//     isLoading,
-//   } = useGetAttestations(address as `0x${string}`);
-//
-//   const { mutate: mutateRevokeIdentifier, data: revokeIdentifierResponse } =
-//     useRevokeIdentifierMutation();
-//
-//   const { mutate: mutateDecryptAttestationsSecret } =
-//     useDecryptAttestationsSecretMutation();
-//
-//   const [loadingIdentifiers, setLoadingIdentifiers] = useState<{
-//     [uid: string]: boolean;
-//   }>({});
-//
-//   const [revealedIdentifiers, setRevealedIdentifiers] = useState<{
-//     [uid: string]: string;
-//   }>({});
-//
-//   const [revealing, setRevealing] = useState<{ [uid: string]: boolean }>({});
-//
-//   useEffect(() => {
-//     const processAttestations = () => {
-//       if (!attestationsResponse) {
-//         return;
-//       }
-//
-//       const attestationsData = attestationsResponse.map((attestation) => {
-//         const decodedData = decodeAttestationData(attestation.data);
-//
-//         const providerData = decodedData.find(
-//           (data) => data.name === 'provider'
-//         );
-//
-//         return {
-//           ...attestation,
-//           provider:
-//             typeof providerData?.value.value === 'string'
-//               ? providerData.value.value
-//               : undefined,
-//           decodedData,
-//         };
-//       });
-//
-//       setAttestations(attestationsData);
-//     };
-//
-//     processAttestations();
-//   }, [attestationsResponse]);
-//
-//   useEffect(() => {
-//     const updatedIdentifiers = identifiers.map((identifier) => {
-//       const matchingAttestation = attestations.find(
-//         (attestation) =>
-//           (attestation.provider as string)?.toLowerCase() ===
-//           identifier.name.toLowerCase()
-//       );
-//
-//       return {
-//         ...identifier,
-//         verified: !!matchingAttestation,
-//         uid: matchingAttestation?.id || '',
-//       };
-//     });
-//
-//     setIdentifiers(updatedIdentifiers);
-//
-//     const initialRevealedState = updatedIdentifiers.reduce(
-//       (acc, identifier) => {
-//         acc[identifier.uid] = '*********';
-//         return acc;
-//       },
-//       {} as { [uid: string]: string }
-//     );
-//
-//     setRevealedIdentifiers(initialRevealedState);
-//   }, [attestations]);
-//
-//   const handleRevoke = useCallback(
-//     (uid: string) => {
-//       const siweJwt = localStorage.getItem('OCI_TOKEN');
-//
-//       if (!siweJwt) throw new Error('OCI SIWE token not found');
-//
-//       setLoadingIdentifiers((prev) => ({ ...prev, [uid]: true }));
-//
-//       mutateRevokeIdentifier({
-//         uid,
-//         siweJwt,
-//         chainId,
-//       });
-//     },
-//     [mutateRevokeIdentifier, chainId]
-//   );
-//
-//   const handleConnect = useCallback(
-//     (identifier: string) => {
-//       navigate(`/identifiers/${identifier.toLowerCase()}/attestation`);
-//

</blockquote></details>

</blockquote></details>

<details>
<summary>Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**

<details>
<summary>Commits</summary>

Files that changed from the base of the PR and between cc347c2ed5a80fd7961d7172c2d66d827c5ef40a and 79b7e1de58dae328ba40b87682515085efd41d3f.

</details>


<details>
<summary>Files selected for processing (9)</summary>

* .eslintrc.cjs (1 hunks)
* src/hooks/useAttestations.tsx (1 hunks)
* src/interfaces/index.ts (1 hunks)
* src/libs/oci/index.ts (1 hunks)
* src/libs/theme.tsx (1 hunks)
* src/pages/Identifiers/Identifiers.tsx (2 hunks)
* src/pages/Identifiers/index.ts (1 hunks)
* src/services/eas.service.ts (1 hunks)
* vite.config.ts (1 hunks)

</details>






<details>
<summary>Files skipped from review due to trivial changes (1)</summary>

* vite.config.ts

</details>

<details>
<summary>Files skipped from review as they are similar to previous changes (3)</summary>

* .eslintrc.cjs
* src/libs/oci/index.ts
* src/libs/theme.tsx

</details>


<details>
<summary>Additional comments not posted (11)</summary><blockquote>

<details>
<summary>src/pages/Identifiers/index.ts (1)</summary><blockquote>

`1-1`: **LGTM! But verify the usage of the `Identifiers` module in other files.**

The code changes are approved. The import statement has been correctly modified to match the default export of the `Identifiers` module.

However, ensure that all import statements for the `Identifiers` module in other files are updated to use the default import syntax.


Run the following script to verify the usage of the `Identifiers` module:

<details>
<summary>Verification successful</summary>



---

<!-- [monologue]
[task verification_1/1]
Verify the usage of the `Identifiers` module in other files.
[observations]
- The search for the named import syntax returned no results, indicating that there are no occurrences of the old named import syntax.
- The search for the default import syntax returned one result, which is the expected import statement in `src/pages/Identifiers/index.ts`.
- No other files were found importing `Identifiers`, suggesting that the change to default import syntax is consistent across the codebase.
[analysis]
- The absence of the named import syntax confirms that the change to default import syntax has been applied correctly.
- The presence of the default import syntax only in the expected file indicates that the codebase is consistent with the new import style.
[actions]
- Conclude the verification process by confirming that the import statement change is correctly applied and consistent across the codebase.
-->

**Verification Successful: Import Statement Updated Correctly**

The import statement for the `Identifiers` module has been successfully updated to use the default import syntax across the codebase. No instances of the old named import syntax were found. 

- The default import syntax is correctly used in `src/pages/Identifiers/index.ts`.



</details>


<details>
<summary>Scripts executed</summary>

The following scripts were executed for the analysis:

Script:

```shell
#!/bin/bash
# Description: Verify all import statements for the `Identifiers` module use the default import syntax.

# Test: Search for the named import syntax. Expect: No occurrences.
rg --type typescript $'import \{ Identifiers \} from'

# Test: Search for the default import syntax. Expect: Only occurrences of the new syntax.
rg --type typescript $'import Identifiers from'

Length of output: 173


Script:

#!/bin/bash
# Description: Verify all import statements for the `Identifiers` module use the default import syntax.

# Test: Search for the named import syntax. Expect: No occurrences.
rg 'import \{ Identifiers \} from' --glob '*.ts' -A 1

# Test: Search for the default import syntax. Expect: Only occurrences of the new syntax.
rg 'import Identifiers from' --glob '*.ts' -A 1

Length of output: 209

src/hooks/useAttestations.tsx (1)

1-2: Review import statements for consistency and necessity.

The import statements are clear and seem necessary for the functionality of the hook. However, ensure that all imported modules are used within the file to avoid unnecessary imports.

Also applies to: 4-5

src/services/eas.service.ts (6)

10-120: LGTM! The EASService class is well-structured and follows good practices.

The class encapsulates the interaction with the EAS SDK and provides methods for initialization, connection, and revocation. The use of private methods for utility functions and error handling using throw statements is appreciated.


25-27: LGTM!

The initializeEAS method correctly initializes the eas property with a new instance of EAS using the provided contractAddress.


32-40: LGTM!

The connect method correctly connects the eas instance to the signer and handles potential errors by throwing appropriate error messages.


46-62: LGTM!

The convertStringsToBigInts method correctly converts string representations of numbers to BigInts and handles different types of input (strings, arrays, objects). The recursive approach ensures that nested structures are properly handled.


68-84: LGTM!

The prepareRevocationRequest method correctly prepares the DelegatedRevocationRequest object from the RevokePayload object. It checks for the presence of the revoker field and throws an error if missing. The method constructs and returns the revocation request using the appropriate payload fields.


90-109: LGTM!

The revokeByDelegation method correctly revokes an attestation by delegation. It checks for the initialization of the eas instance and throws an error if not initialized. The method uses the convertStringsToBigInts and prepareRevocationRequest methods to process the input payload before calling the revokeByDelegation method on the eas instance. The transaction is properly awaited and the result is logged. Potential errors are caught, logged, and thrown with appropriate error messages.

src/pages/Identifiers/Identifiers.tsx (3)

1-29: LGTM!

The import statements are correctly organized and follow the proper syntax. The new imports are relevant to the refactored code.


30-34: LGTM!

The Identifier interface provides a clear and consistent structure for identifier objects used throughout the component. It improves code readability and maintainability.


Line range hint 37-207: LGTM!

The refactored Identifiers component is more streamlined and easier to understand. The introduction of the matchIdentifiersWithAttestations function improves the correlation between identifiers and attestations. The updated state management and rendering logic enhance the component's maintainability. The improved error handling provides better user feedback. The encapsulation of the revocation process within the revokeDelegation function promotes separation of concerns.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 79b7e1d and ff1cd91.

Files selected for processing (2)
  • src/pages/Permissions/Permissions.tsx (2 hunks)
  • src/services/eas/query.ts (1 hunks)
Files skipped from review due to trivial changes (2)
  • src/pages/Permissions/Permissions.tsx
  • src/services/eas/query.ts

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Outside diff range, codebase verification and nitpick comments (5)
src/components/pages/attestations/StepTwo.tsx (1)

1-90: LGTM! But consider improving the naming and splitting the component into smaller components.

The code changes are approved. The component is well-structured and follows best practices. However, consider the following improvements:

  1. Use more descriptive names for variables, functions, props, interfaces, and enums. For example:

    • anyJwt -> providerJwt
    • mutateIdentifier -> linkIdentifier
    • isPending -> isLinking
    • handleGenerateSignedDelegation -> handleLinkIdentifier
    • handlePrepareAttestation -> onAttestationPrepared
    • StepTwoProps -> StepTwoComponentProps
    • AttestPayload -> AttestationPayload
    • Provider -> IdentityProvider
    • OCI_TOKEN -> SIWE_JWT
  2. Split the component into smaller components for better readability and maintainability. For example:

    • Extract the Stack component into a separate component.
    • Extract the Button component into a separate component.
    • Extract the Typography components into separate components.
src/components/pages/attestations/StepOne.tsx (2)

27-62: Consider extracting the JWT token handling logic into a separate function.

The useEffect hook contains a complex logic for handling the JWT token from the URL query parameters. To improve readability and maintainability, consider extracting this logic into a separate function.

const handleJwtToken = (jwtToken: string) => {
  try {
    const decoded: DecodedToken = jwtDecode(jwtToken);
    const { provider: jwtProvider } = decoded;

    const existingTokens: Token[] = JSON.parse(
      localStorage.getItem('OCI_PROVIDER_TOKENS') || '[]'
    );
    const updatedTokens = existingTokens.filter(
      (token) => token.provider !== jwtProvider
    );

    updatedTokens.push({
      token: jwtToken,
      exp: decoded.exp,
      provider: jwtProvider,
    });
    localStorage.setItem(
      'OCI_PROVIDER_TOKENS',
      JSON.stringify(updatedTokens)
    );

    navigate(location.pathname, { replace: true });

    hasHandledNextStep.current = true;
    handleNextStep();
  } catch (error) {
    setAuthError('Failed to decode JWT token. Please try again.');
    console.error('Invalid JWT token:', error);
  }
};

useEffect(() => {
  const searchParams = new URLSearchParams(location.search);
  const jwtToken = searchParams.get('jwt');

  if (jwtToken && !hasHandledNextStep.current) {
    handleJwtToken(jwtToken);
  }
}, [location.search, location.pathname, navigate, handleNextStep]);

57-60: Provide more specific error messages for better user feedback.

When an error occurs during the JWT token decoding process, the component displays a generic error message. Consider providing more specific error messages based on the type of error to give users more information about what went wrong.

try {
  // ...
} catch (error) {
  if (error instanceof InvalidTokenError) {
    setAuthError('The provided JWT token is invalid. Please try again.');
  } else if (error instanceof TokenExpiredError) {
    setAuthError('The provided JWT token has expired. Please try again.');
  } else {
    setAuthError('An unexpected error occurred. Please try again.');
  }
  console.error('Error decoding JWT token:', error);
}
src/services/eas.service.ts (1)

48-64: LGTM! Consider simplifying the object case using a type guard.

The convertStringsToBigInts method looks good and correctly handles the conversion of nested structures.

To simplify the object case, you can use a type guard to check if the value is an object:

-    if (typeof obj === 'object' && obj !== null) {
+    if (isObject(obj)) {
       return Object.fromEntries(
         Object.entries(obj).map(([k, v]) => [
           k,
           this.convertStringsToBigInts(v),
         ])
       );
     }

+function isObject(value: unknown): value is Record<string, unknown> {
+  return typeof value === 'object' && value !== null;
+}
src/pages/Identifiers/Attestation/Attestation.tsx (1)

69-349: Consider removing the commented out code in a future commit.

Commenting out the old code is a good practice during refactoring. It allows for easy reference and can be removed later when the refactored code is stable.

Consider removing the commented out code in a future commit to keep the codebase clean.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between ff1cd91 and 5982328.

Files selected for processing (12)
  • .eslintrc.cjs (1 hunks)
  • src/App.tsx (3 hunks)
  • src/components/pages/attestations/StepOne.tsx (1 hunks)
  • src/components/pages/attestations/StepThree.tsx (1 hunks)
  • src/components/pages/attestations/StepTwo.tsx (1 hunks)
  • src/components/shared/CustomStepper.tsx (1 hunks)
  • src/enums/index.ts (1 hunks)
  • src/pages/Identifiers/Attestation/Attestation.tsx (1 hunks)
  • src/pages/Identifiers/Attestation/index.ts (1 hunks)
  • src/services/api/auth/index.ts (1 hunks)
  • src/services/eas.service.ts (1 hunks)
  • src/utils/helper/index.ts (1 hunks)
Files skipped from review due to trivial changes (2)
  • src/enums/index.ts
  • src/utils/helper/index.ts
Files skipped from review as they are similar to previous changes (4)
  • .eslintrc.cjs
  • src/App.tsx
  • src/components/shared/CustomStepper.tsx
  • src/services/api/auth/index.ts
Additional context used
GitHub Check: test/node 17/ubuntu-latest
src/services/eas.service.ts

[failure] 150-150:
Argument of type 'DelegatedAttestationRequest' is not assignable to parameter of type 'AttestPayload'.

src/pages/Identifiers/Attestation/Attestation.tsx

[failure] 63-63:
Type 'AttestPayload | null | undefined' is not assignable to type 'AttestPayload | null'.

GitHub Check: test/node 18/ubuntu-latest
src/services/eas.service.ts

[failure] 150-150:
Argument of type 'DelegatedAttestationRequest' is not assignable to parameter of type 'AttestPayload'.

src/pages/Identifiers/Attestation/Attestation.tsx

[failure] 63-63:
Type 'AttestPayload | null | undefined' is not assignable to type 'AttestPayload | null'.

Additional comments not posted (10)
src/pages/Identifiers/Attestation/index.ts (2)

1-1: LGTM!

The code change is approved. The import statement has been correctly updated to use a default import, which is consistent with the export statement.


3-3: LGTM!

The code change is approved. The export statement has been correctly updated to export Attestation as the default export, which is consistent with the import statement.

src/components/pages/attestations/StepThree.tsx (5)

1-18: LGTM!

The import statements are well-organized and follow a consistent pattern.


19-21: LGTM!

The StepThreeProps interface is well-defined and follows the naming convention.


23-54: LGTM!

The StepThree component is well-structured and follows the React functional component pattern. The handleAttestByDelegation function handles the attestation process correctly, including error handling and loading state management.


56-87: LGTM!

The JSX for the StepThree component is well-structured and uses the MUI components correctly. The button's behavior is correctly implemented, including the dynamic text and icon based on the loading state.


90-90: LGTM!

The StepThree component is correctly exported as the default export.

src/pages/Identifiers/Attestation/Attestation.tsx (3)

1-9: LGTM!

The import statements have been reorganized and new imports have been added for the refactored code. The changes are valid and improve the code structure.


12-16: LGTM!

The updated labels in the steps array provide clearer descriptions of the steps in the attestation process, improving the code readability.


18-66: LGTM!

The refactored Attestation component is more modular and readable. The state management and step transition logic have been improved. The addition of the Alert component enhances the user experience.

Tools
GitHub Check: test/node 17/ubuntu-latest

[failure] 63-63:
Type 'AttestPayload | null | undefined' is not assignable to type 'AttestPayload | null'.

GitHub Check: test/node 18/ubuntu-latest

[failure] 63-63:
Type 'AttestPayload | null | undefined' is not assignable to type 'AttestPayload | null'.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 5982328 and 10371dc.

Files selected for processing (2)
  • src/pages/Identifiers/Attestation/Attestation.tsx (1 hunks)
  • src/services/eas.service.ts (1 hunks)
Files skipped from review as they are similar to previous changes (2)
  • src/pages/Identifiers/Attestation/Attestation.tsx
  • src/services/eas.service.ts

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: 1

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 10371dc and 2508c39.

Files selected for processing (1)
  • src/pages/Identifiers/Identifiers.tsx (2 hunks)
Additional comments not posted (4)
src/pages/Identifiers/Identifiers.tsx (4)

37-42: LGTM!

The Identifier interface provides a clear and well-structured definition for the identifier objects used in the component. The property types are appropriate, and the optional revealedSecret property is correctly marked.


Line range hint 73-89: LGTM!

The matchIdentifiersWithAttestations function is well-implemented and efficiently matches identifiers with their corresponding attestations. It updates the verified and uid properties of the identifiers based on the matching attestations.

The use of Array.prototype.map() and Array.prototype.find() is appropriate, and the function has a clear purpose, enhancing the readability and maintainability of the code.


101-112: LGTM!

The revokeDelegation function is well-implemented and handles the revocation of a delegation using the easService. It appropriately checks for the availability of the easService and throws an error if it's not available.

The error handling is suitable, logging any errors that occur during the revocation process. The function has a clear purpose and is well-structured, enhancing the readability and maintainability of the code.


222-314: LGTM!

The code segment effectively renders the list of user identifiers with their corresponding details and actions. The use of Material-UI components provides a consistent and visually appealing user interface.

The component handles user interactions appropriately, such as revealing the secret, revoking the attestation, and connecting the identifier. The code is well-structured and readable, making it easier to understand and maintain.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 2508c39 and b3da6f6.

Files selected for processing (4)
  • src/components/pages/attestations/StepThree.tsx (1 hunks)
  • src/components/pages/attestations/StepTwo.tsx (1 hunks)
  • src/hooks/useAttestations.tsx (1 hunks)
  • src/pages/Identifiers/Identifiers.tsx (2 hunks)
Files skipped from review as they are similar to previous changes (3)
  • src/components/pages/attestations/StepThree.tsx
  • src/components/pages/attestations/StepTwo.tsx
  • src/hooks/useAttestations.tsx

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between b3da6f6 and 376a6d3.

Files selected for processing (1)
  • src/components/pages/attestations/StepOne.test.tsx (1 hunks)
Additional comments not posted (1)
src/components/pages/attestations/StepOne.test.tsx (1)

1-26: LGTM!

The test case for the StepOne component is well-structured and follows best practices. It covers the essential aspects of rendering the component with the required props and making assertions on the rendered output.

The test case:

  • Imports necessary dependencies.
  • Uses describe and it blocks to organize the test.
  • Provides a clear description of what the test case is checking.
  • Uses render and screen to render the component and query the rendered output.
  • Wraps the component with MemoryRouter to provide a mock router context.
  • Passes the required props to the component.
  • Makes assertions on the rendered output using expect and toBeInTheDocument.

Great job on writing a comprehensive test case!

@mehdi-torabiv mehdi-torabiv merged commit 3ed3b06 into main Sep 1, 2024
7 checks passed
This was referenced Nov 26, 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