diff --git a/components/Address.tsx b/components/Address.tsx index 9db174f5..50a2380a 100644 --- a/components/Address.tsx +++ b/components/Address.tsx @@ -4,6 +4,7 @@ import { classNames } from '../helpers' type AddressProps = { address: string className?: string + hacked?: boolean lookupAddress?: (address: string) => Promise } @@ -15,6 +16,7 @@ const shortAddress = (addr: string): string => const Address = ({ address, className, + hacked, lookupAddress, }: AddressProps): JSX.Element => { const [name, setName] = useState() @@ -29,6 +31,7 @@ const Address = ({ return ( + {hacked ? HACKED : null} {name || shortAddress(address)} ) diff --git a/components/AddressPill.tsx b/components/AddressPill.tsx index ea69698b..5cf5860f 100644 --- a/components/AddressPill.tsx +++ b/components/AddressPill.tsx @@ -6,11 +6,13 @@ import useWallet from '../hooks/useWallet' type addressPillProps = { address: string userIsSender: boolean + isHacked: boolean } const AddressPill = ({ address, userIsSender, + isHacked, }: addressPillProps): JSX.Element => { const { lookupAddress } = useWallet() @@ -24,10 +26,12 @@ const AddressPill = ({ 'px-2', 'py-1', 'font-bold', + 'color-red', userIsSender ? 'bg-bt-100 text-b-600' : 'bg-zinc-50', userIsSender ? 'border-bt-300' : 'border-gray-300' )} address={address} + hacked={isHacked} lookupAddress={lookupAddress} > ) diff --git a/components/Conversation/MessagesList.tsx b/components/Conversation/MessagesList.tsx index d1653a2e..6a6926fa 100644 --- a/components/Conversation/MessagesList.tsx +++ b/components/Conversation/MessagesList.tsx @@ -4,6 +4,7 @@ import Emoji from 'react-emoji-render' import Avatar from '../Avatar' import { formatTime } from '../../helpers' import AddressPill from '../AddressPill' +import useIsBurned from '../../hooks/useIsBurned' export type MessageListProps = { messages: Message[] @@ -14,6 +15,7 @@ export type MessageListProps = { type MessageTileProps = { message: Message isSender: boolean + isHacked: boolean } const isOnSameDay = (d1?: Date, d2?: Date): boolean => { @@ -23,7 +25,11 @@ const isOnSameDay = (d1?: Date, d2?: Date): boolean => { const formatDate = (d?: Date) => d?.toLocaleString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }) -const MessageTile = ({ message, isSender }: MessageTileProps): JSX.Element => ( +const MessageTile = ({ + message, + isSender, + isHacked, +}: MessageTileProps): JSX.Element => (
@@ -31,6 +37,7 @@ const MessageTile = ({ message, isSender }: MessageTileProps): JSX.Element => ( {formatTime(message.sent)} @@ -79,6 +86,9 @@ const MessagesList = ({ messagesEndRef, }: MessageListProps): JSX.Element => { let lastMessageDate: Date | undefined + const isHacked = useIsBurned( + messages[0] && (messages[0].senderAddress as string) + ) return (
@@ -91,7 +101,12 @@ const MessagesList = ({ {messages?.map((msg: Message) => { const isSender = msg.senderAddress === walletAddress const tile = ( - + ) const dateHasChanged = !isOnSameDay(lastMessageDate, msg.sent) lastMessageDate = msg.sent diff --git a/components/ConversationsList.tsx b/components/ConversationsList.tsx index 6d660767..4a1fc4ae 100644 --- a/components/ConversationsList.tsx +++ b/components/ConversationsList.tsx @@ -9,6 +9,7 @@ import { Message } from '@xmtp/xmtp-js' import useWallet from '../hooks/useWallet' import Avatar from './Avatar' import { useContext } from 'react' +import useIsBurned from '../hooks/useIsBurned' type ConversationsListProps = { conversations: Conversation[] @@ -32,6 +33,9 @@ const ConversationTile = ({ const { messages } = useConversation(conversation.peerAddress) const latestMessage = getLatestMessage(messages) const path = `/dm/${conversation.peerAddress}` + + const isHacked = useIsBurned(conversation.peerAddress) + if (!latestMessage) { return null } @@ -65,6 +69,7 @@ const ConversationTile = ({ address={conversation.peerAddress} className="text-black text-lg md:text-md font-bold place-self-start" lookupAddress={lookupAddress} + hacked={isHacked} /> { + const result = await axios.get( + `https://burnmywallet.com/api/isBurned?address=${address}&chain=${chain}` + ) + console.log('handleSearch after api call', result.data) + + const data = result.data as IsBurnedResponse + + return data.hacked +} + +const useIsBurned = (address: string) => { + const [isBurned, setIsBurned] = useState(false) + + const isHackedEffect = async (senderAddress: string) => { + const result = await checkIsBurned(senderAddress) + if (result) { + setIsBurned(result) + } + } + + useEffect(() => { + isHackedEffect(address) + }, [address]) + + return isBurned +} + +export default useIsBurned diff --git a/package-lock.json b/package-lock.json index 90f002ba..c15ecf2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@headlessui/react": "^1.4.3", "@heroicons/react": "^1.0.5", "@xmtp/xmtp-js": "^4.0.0", + "axios": "^0.27.2", "ethers": "^5.5.3", "imagemin-svgo": "^9.0.0", "next": "12.0.9", @@ -49,7 +50,7 @@ "web3modal": "^1.9.5" } }, - "../../../../xmtp-js-sdk": { + "../../xmtp-js-sdk": { "extraneous": true }, "node_modules/@ampproject/remapping": { @@ -4421,6 +4422,28 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -8348,6 +8371,25 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -21640,6 +21682,27 @@ "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", "dev": true }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -24878,6 +24941,11 @@ } } }, + "follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", diff --git a/package.json b/package.json index a834967f..8bb52e1c 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@headlessui/react": "^1.4.3", "@heroicons/react": "^1.0.5", "@xmtp/xmtp-js": "^4.0.0", + "axios": "^0.27.2", "ethers": "^5.5.3", "imagemin-svgo": "^9.0.0", "next": "12.0.9",