Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@
"@metamask/contract-metadata": "^2.5.0",
"@metamask/controller-utils": "^11.9.0",
"@metamask/delegation-controller": "^0.4.0",
"@metamask/delegation-core": "0.1.0",
"@metamask/delegation-deployments": "^0.11.0",
"@metamask/design-tokens": "^7.1.0",
"@metamask/ens-controller": "^15.0.2",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import { getNetworkConfigurationsByChainId } from '../../../../../../shared/modu
import { getGatorPermissionByPermissionTypeAndChainId } from '../../../../../selectors/gator-permissions/gator-permissions';
import { extractNetworkName } from '../gator-permissions-page-helper';
import { ReviewGatorAssetItem } from '../components';
import { useRevokeGatorPermissions } from '../../../../../hooks/gator-permissions/useRevokeGatorPermissions';

export const ReviewTokenStreamsPage = () => {
const t = useI18nContext();
Expand All @@ -35,6 +36,10 @@ export const ReviewTokenStreamsPage = () => {
const [networkName, setNetworkName] = useState('');
const [totalTokenStreams, setTotalTokenStreams] = useState(0);

const { revokeGatorPermission } = useRevokeGatorPermissions({
chainId,
});

const networks = useSelector(getNetworkConfigurationsByChainId);
const nativeTokenStreams = useSelector((state) =>
getGatorPermissionByPermissionTypeAndChainId(
Expand All @@ -56,17 +61,11 @@ export const ReviewTokenStreamsPage = () => {
setTotalTokenStreams(nativeTokenStreams.length + erc20TokenStreams.length);
}, [chainId, nativeTokenStreams, erc20TokenStreams, networks]);

const handleNativeTokenStreamRevokeClick = (nativeTokenStream) => {
// TODO: Implement revoke logic
console.log('nativeTokenStream to revoke:', nativeTokenStream);
};

const handleErc20TokenStreamRevokeClick = (erc20TokenStream) => {
// TODO: Implement revoke logic
console.log('erc20TokenStream to revoke:', erc20TokenStream);
const handleRevokeClick = async (stream) => {
await revokeGatorPermission(stream);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Bug: Async Function Error Handling Missing

The async handleRevokeClick function in ReviewTokenSubscriptionsPage and ReviewTokenStreamsPage lacks error handling. When revokeGatorPermission is called, any errors (e.g., from validation or transaction failures) result in unhandled promise rejections. This can lead to UI crashes, an inconsistent state, or silent failures without user feedback on failed revoke operations.

Additional Locations (1)
Fix in Cursor Fix in Web

};

const renderTokenStreams = (streams, clickHandler) =>
const renderTokenStreams = (streams) =>
streams.map((stream) => {
const { permissionResponse, siteOrigin } = stream;
const fullNetworkName = extractNetworkName(
Expand All @@ -82,7 +81,7 @@ export const ReviewTokenStreamsPage = () => {
networkName={fullNetworkName}
permissionType={permissionResponse.permission.type}
siteOrigin={siteOrigin}
onRevokeClick={() => clickHandler(stream)}
onRevokeClick={() => handleRevokeClick(stream)}
/>
);
});
Expand Down Expand Up @@ -114,14 +113,8 @@ export const ReviewTokenStreamsPage = () => {
<Box ref={headerRef}></Box>
{totalTokenStreams > 0 ? (
<>
{renderTokenStreams(
nativeTokenStreams,
handleNativeTokenStreamRevokeClick,
)}
{renderTokenStreams(
erc20TokenStreams,
handleErc20TokenStreamRevokeClick,
)}
{renderTokenStreams(nativeTokenStreams)}
{renderTokenStreams(erc20TokenStreams)}
</>
) : (
<Box
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import { getNetworkConfigurationsByChainId } from '../../../../../../shared/modu
import { getGatorPermissionByPermissionTypeAndChainId } from '../../../../../selectors/gator-permissions/gator-permissions';
import { extractNetworkName } from '../gator-permissions-page-helper';
import { ReviewGatorAssetItem } from '../components';
import { useRevokeGatorPermissions } from '../../../../../hooks/gator-permissions/useRevokeGatorPermissions';

export const ReviewTokenSubscriptionsPage = () => {
const t = useI18nContext();
Expand All @@ -43,15 +44,33 @@ export const ReviewTokenSubscriptionsPage = () => {
chainId,
),
);
const erc20TokenPeriodicPermissions = useSelector((state) =>
getGatorPermissionByPermissionTypeAndChainId(
state,
'erc20-token-periodic',
chainId,
),
);

const { revokeGatorPermission } = useRevokeGatorPermissions({
chainId,
});

useEffect(() => {
setNetworkName(extractNetworkName(networks, chainId));
setTotalTokenSubscriptions(nativeTokenPeriodicPermissions.length);
}, [chainId, nativeTokenPeriodicPermissions, networks]);
const totalSubscriptionsCount =
nativeTokenPeriodicPermissions.length +
erc20TokenPeriodicPermissions.length;
setTotalTokenSubscriptions(totalSubscriptionsCount);
}, [
chainId,
nativeTokenPeriodicPermissions,
erc20TokenPeriodicPermissions,
networks,
]);

const handleRevokeClick = (subscription) => {
// TODO: Implement revoke logic
console.log('subscription to revoke:', subscription);
const handleRevokeClick = async (stream) => {
await revokeGatorPermission(stream);
};

const renderTokenSubscriptions = (subscriptions) =>
Expand Down Expand Up @@ -103,7 +122,10 @@ export const ReviewTokenSubscriptionsPage = () => {
<Content padding={0}>
<Box ref={headerRef}></Box>
{totalTokenSubscriptions > 0 ? (
renderTokenSubscriptions(nativeTokenPeriodicPermissions)
<>
{renderTokenSubscriptions(nativeTokenPeriodicPermissions)}
{renderTokenSubscriptions(erc20TokenPeriodicPermissions)}
</>
) : (
<Box
data-testid="no-connections"
Expand Down
Loading
Loading