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

Pr/siddesh7/1186 #1265

Merged
merged 22 commits into from
May 10, 2024
Merged
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
9c4901f
feat(chat-bubble): adds frames support
Siddesh7 Mar 26, 2024
70773ff
fix: fix body req
Siddesh7 Mar 27, 2024
4efd775
fix(\): use proxy server
Siddesh7 Mar 27, 2024
e46ee4f
feat(uiweb): add trustedData to outgoing frame request
Siddesh7 Apr 4, 2024
63faa43
Merge branch 'main' into Frames
Siddesh7 Apr 4, 2024
70c3adb
feat(uiweb): handle different frame spec
Siddesh7 Apr 5, 2024
108ad88
chore: merge remote-tracking branch 'origin/Frames' into Frames
Siddesh7 Apr 5, 2024
57b9750
fix(uiweb): make og:image optional
Siddesh7 Apr 5, 2024
3bfcec0
chore(merge): merge remote-tracking branch 'origin' into Frames
Siddesh7 Apr 5, 2024
eaeabb8
fix(uiweb): fix req body
Siddesh7 Apr 8, 2024
ef39716
fix(uiweb): fix minor issues
Siddesh7 Apr 9, 2024
d980e00
merged from main
HarshRajat May 3, 2024
12c4997
fix: merge branch 'Frames' into pr/Siddesh7/1186
Siddesh7 May 7, 2024
5a11923
Added og:frame support, cleaned up code, added url support for messag…
HarshRajat May 8, 2024
c19bcd5
Added css tweaks
HarshRajat May 8, 2024
80eae44
Added frames css design
HarshRajat May 8, 2024
04a2e4b
removed nonused dependencies from PreviewRenderer, FrameRenderer and …
HarshRajat May 8, 2024
2ea7f64
adjusted CSS, added youtube support
HarshRajat May 9, 2024
c7a8bc3
added preview loading for video and og tags
HarshRajat May 9, 2024
df42c30
merged from main and readded blur
HarshRajat May 9, 2024
0b7633c
fix(uiweb frames): fix switch chain handler in frames
Siddesh7 May 10, 2024
d9220fb
style(uiweb frames): edit frame button style
Siddesh7 May 10, 2024
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
Prev Previous commit
Next Next commit
fix(uiweb): fix minor issues
Siddesh7 committed Apr 9, 2024
commit ef39716674f7ef6d3a4d3edbc83251fc68b5683f
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
import {
ReactElement,
ReactNode,
useContext,
useEffect,
useState,
} from 'react';
import { ReactNode, useContext, useEffect, useState } from 'react';

import moment from 'moment';
import styled from 'styled-components';
@@ -14,17 +8,12 @@ import { Section, Span, Image } from '../../reusables';
import useToast from '../reusables/NewToast';
import { checkTwitterUrl } from '../helpers/twitter';
import { ChatDataContext } from '../../../context';
import { useAccount, useChatData } from '../../../hooks';
import { useChatData } from '../../../hooks';
import { ThemeContext } from '../theme/ThemeProvider';

import {
FileMessageContent,
FrameButton,
FrameDetails,
IFrame,
} from '../../../types';
import { FileMessageContent, FrameButton, IFrame } from '../../../types';
import { IMessagePayload, TwitterFeedReturnType } from '../exportedTypes';
import { allowedNetworks, ENV, FILE_ICON } from '../../../config';
import { allowedNetworks, FILE_ICON } from '../../../config';
import {
formatFileSize,
getPfp,
@@ -46,6 +35,8 @@ import {
ChatMainStateContext,
ChatMainStateContextType,
} from '../../../context/chatAndNotification/chat/chatMainStateContext';
import { ethers } from 'ethers';
import { useConnectWallet, useSetChain } from '@web3-onboard/react';

const SenderMessageAddress = ({ chat }: { chat: IMessagePayload }) => {
const { account } = useContext(ChatDataContext);
@@ -142,11 +133,14 @@ const FrameRenderer = ({
messageId: string;
}) => {
const { env, user, pgpPrivateKey } = useChatData();
const { chainId, switchChain, provider } = useAccount({ env });

const [{ wallet }] = useConnectWallet();
const [{ connectedChain }, setChain] = useSetChain();

const { selectedChatId } =
useContext<ChatMainStateContextType>(ChatMainStateContext);
const frameRenderer = useToast();
const proxyServer = 'http://localhost:5004/';
const proxyServer = 'https://proxy.push.org';
const [FrameData, setFrameData] = useState<IFrame>({} as IFrame);
const [inputText, setInputText] = useState<string>('');
const [imageLoadingError, setImageLoadingError] = useState<boolean>(false);
@@ -167,7 +161,6 @@ const FrameRenderer = ({

const frameDetails: IFrame = getFormattedMetadata(url, htmlText);

console.log('Frame Details:', FrameData);
setFrameData(frameDetails);
} catch (err) {
console.error('Error fetching meta tags for rendering frame:', err);
@@ -279,14 +272,19 @@ const FrameRenderer = ({
);
}
};
// Function to subscribe to a channel
const subscribeToChannel = async (channel: string, desiredChain: any) => {
if (!user) return { status: 'failure', message: 'User not initialised' };

if (chainId !== Number(desiredChain)) {
if (allowedNetworks[env].some((chain) => chain === Number(desiredChain)))
switchChain(Number(desiredChain));
else {
const handleChainChange = async (desiredChainId: string) => {
if (Number(connectedChain?.id) !== Number(desiredChainId.slice(7))) {
if (
allowedNetworks[env].some(
(chain) => chain === Number(desiredChainId.slice(7))
)
) {
await setChain({
chainId: ethers.utils.hexValue(Number(desiredChainId.slice(7))),
});
return { status: 'success', message: 'Chain switched' };
} else {
frameRenderer.showMessageToast({
toastTitle: 'Error',
toastMessage: 'Chain not supported',
@@ -296,11 +294,19 @@ const FrameRenderer = ({
return { status: 'failure', message: 'Chain not supported' };
}
}
return { status: 'success', message: 'Chain switch not required' };
};
// Function to subscribe to a channel
const subscribeToChannel = async (button: FrameButton) => {
if (!user) return { status: 'failure', message: 'User not initialized' };
const { status, message } = await handleChainChange(button.action!);
if (status === 'failure') return { status: 'failure', message };
try {
const response = await user.notification.subscribe(
`eip155:${desiredChain}:${channel}`
`${button.action}:${button.target}`
);
if (response.status === 204)

if (response.status === 204) {
frameRenderer.showMessageToast({
toastTitle: 'Success',
toastMessage: 'Subscribed Successfully',
@@ -309,41 +315,47 @@ const FrameRenderer = ({
<FaRegThumbsUp size={size} color="green" />
),
});
return { status: 'success', message: 'Subscribed' };
return { status: 'success', message: 'Subscribed' };
} else {
frameRenderer.showMessageToast({
toastTitle: 'Error',
toastMessage:
JSON.stringify(response.message) ?? 'Subscription failed',
toastType: 'ERROR',
getToastIcon: (size: any) => <MdError size={size} color="red" />,
});
return {
status: 'failure',
message: JSON.stringify(response.message) ?? 'Subscription failed',
};
}
} catch (error) {
frameRenderer.showMessageToast({
toastTitle: 'Error',
toastMessage: 'Chain not supported',
toastMessage: 'Something went wrong',
toastType: 'ERROR',
getToastIcon: (size: any) => <MdError size={size} color="red" />,
});
return { status: 'failure', message: 'Something went wrong' };
}
return { status: 'failure', message: 'Unexpected error' };
};

// Function to trigger a transaction
const TriggerTx = async (data: any, provider: any) => {
if (chainId !== Number(data.chainId.slice(7))) {
if (
allowedNetworks[env].some(
(chain) => chain === Number(data.chainId.slice(7))
)
)
switchChain(Number(data.chainId.slice(7)));
else {
frameRenderer.showMessageToast({
toastTitle: 'Error',
toastMessage: 'Chain not supported',
toastType: 'ERROR',
getToastIcon: (size: any) => <MdError size={size} color="red" />,
});
return { status: 'failure', message: 'Chain not supported' };
}
}
const TriggerTx = async (data: any) => {
if (!data || !data.params || !data.chainId)
return { status: 'failure', message: 'Invalid data' };

const { status, message } = await handleChainChange(data.chainId);
if (status === 'failure') return { status: 'failure', message };
if (!wallet) return { status: 'failure', message: 'Wallet not connected' };
let hash = undefined;
try {
const signer = provider.getUncheckedSigner();
const provider = new ethers.providers.Web3Provider(
wallet.provider,
'any'
);

const signer = provider.getSigner();
const tx = await signer.sendTransaction({
from: account,
to: data.params.to,
@@ -353,17 +365,17 @@ const FrameRenderer = ({
});
hash = tx.hash;
return { hash, status: 'success', message: 'Transaction sent' };
} catch (error) {
} catch (error: any) {
frameRenderer.showMessageToast({
toastTitle: 'Error',
toastMessage: 'Something went wrong',
toastMessage: error?.data?.message ?? error?.message ?? 'Failed',
toastType: 'ERROR',
getToastIcon: (size: any) => <MdError size={size} color="red" />,
});
return {
hash: 'Failed',
status: 'failure',
message: 'Something went wrong',
message: error?.data?.message ?? error?.message ?? 'Failed',
};
}
};
@@ -387,7 +399,7 @@ const FrameRenderer = ({
unixTimestamp: Date.now().toString(),
buttonIndex: Number(button.index),
inputText: FrameData.frameDetails?.inputText ? inputText : 'undefined',
state: FrameData.frameDetails?.state ?? 'undefined',
state: FrameData.frameDetails?.state ?? '',
transactionId: hash ?? '',
address: account,
messageId: messageId,
@@ -408,9 +420,7 @@ const FrameRenderer = ({

// If the button action is subscribe, subscribes to the channel and then makes a POST call to the Frame server
if (button.action?.includes('subscribe')) {
const desiredChainId = button.action?.split(':')[1];

const response = await subscribeToChannel(button.target!, desiredChainId);
const response = await subscribeToChannel(button);
if (response.status === 'failure') {
return;
}
@@ -433,7 +443,7 @@ const FrameRenderer = ({
inputText: FrameData.frameDetails?.inputText
? inputText
: 'undefined',
state: FrameData.frameDetails?.state ?? 'undefined',
state: FrameData.frameDetails?.state ?? '',
transactionId: hash ?? '',
address: account,
messageId: messageId,
@@ -447,11 +457,12 @@ const FrameRenderer = ({
},
}),
});
if (!response.ok) return;

const data = await response.json();

const { hash: txid, status } = await TriggerTx(data, provider);
const { hash: txid, status } = await TriggerTx(data);
hash = txid;

if (!txid || status === 'failure') return;
}

@@ -482,7 +493,7 @@ const FrameRenderer = ({
inputText: FrameData.frameDetails?.inputText
? inputText
: 'undefined',
state: FrameData.frameDetails?.state ?? 'undefined',
state: FrameData.frameDetails?.state ?? '',
transactionId: hash ?? '',
address: account,
messageId: messageId,
@@ -524,19 +535,22 @@ const FrameRenderer = ({
}}
>
<a href={url} target="blank">
<img
src={
FrameData.frameDetails?.image ?? FrameData.frameDetails?.ogImage
}
alt="Frame Fallback"
style={{
borderRadius: '12px 12px 0px 0px',
width: '100%',
}}
onError={() => {
setImageLoadingError(true);
}}
/>
{!imageLoadingError && (
<img
src={
FrameData.frameDetails?.image ??
FrameData.frameDetails?.ogImage
}
alt="Frame Fallback"
style={{
borderRadius: '12px 12px 0px 0px',
width: '100%',
}}
onError={() => {
setImageLoadingError(true);
}}
/>
)}
{imageLoadingError && (
<div
style={{