+
-
+
-
-
-
+
-
-
- {theme.direction === 'rtl' ? : }
-
+
+
+
+
+
+ {pageState === 'login' && (
+
setPageState('invite')} />
+ )}
+ {pageState === 'invite' && (
+ setPageState('congratulation')} />
+ )}
+ {pageState === 'congratulation' && (
+ setPageState('profile')} />
+ )}
+ {pageState === 'profile' && setPageState('wallet')} />}
+ {pageState === 'wallet' && setPageState('profile')} />}
-
-
-
-
- {['Inbox', 'Starred', 'Send email'].map((text, index) => (
-
- {index % 2 === 0 ? : }
-
-
- ))}
-
-
- {['All mail', 'Trash', 'Spam'].map((text, index) => (
-
- {index % 2 === 0 ? : }
-
-
- ))}
-
-
+
);
}
diff --git a/src/content/index.tsx b/src/content/index.tsx
index 62c464e..129b295 100644
--- a/src/content/index.tsx
+++ b/src/content/index.tsx
@@ -5,55 +5,59 @@ import { Store } from '@eduardoac-skimlinks/webext-redux';
import { proxyStore as store } from '../app/proxyStore';
+import { addPriceComponent, addVoteComponent } from './addToTwitter';
import Content from './Content';
+const addTwitterComponent = () => {
+ const thirdElement = document.querySelectorAll(
+ '#react-root > div > div > div > main > div > div > div > div > div > div > div'
+ )[3];
+
+ // 现有元素的处理逻辑
+ const targetElements = thirdElement.querySelectorAll('section > div > div > div');
+ targetElements.forEach(function (element, index) {
+ const anchorElements = element.querySelectorAll('a');
+ const hrefs = Array.from(anchorElements).map((anchor) => anchor.href);
+ const twitterUrlString = hrefs[hrefs.length - 1];
+ if (twitterUrlString !== undefined) {
+ const urlObject = new URL(twitterUrlString);
+ const pathSegments = urlObject.pathname.split('/');
+ const username = pathSegments[1];
+ const tweetId = pathSegments[3];
+
+ // 判断是否存在已经插入的元素
+ const existingPriceElement = document.getElementById('xfans-price-' + tweetId);
+ const existingVoteElement = document.getElementById('xfans-vote-' + tweetId);
+
+ if (!existingPriceElement) {
+ addPriceComponent(element, tweetId);
+ } else {
+ // console.log('Element already exists for tweetId:', tweetId);
+ }
+
+ if (!existingVoteElement) {
+ addVoteComponent(element, tweetId, username);
+ } else {
+ // console.log('Element already exists for tweetId:', tweetId);
+ }
+ }
+ });
+};
+
withProxyStore(
, store).then((component) => {
const container = document.createElement('my-extension-root');
document.body.append(container);
createRoot(container).render(component);
- // 延迟执行的代码
+ // 延迟执行的代码 3000毫秒后执行,即3秒
setTimeout(() => {
- const thirdElement = document.querySelectorAll(
- '#react-root > div > div > div > main > div > div > div > div > div > div > div'
- )[3];
-
- // 创建 MutationObserver 实例并传入回调函数
- const observer = new MutationObserver((mutationsList, observer) => {
- mutationsList.forEach((mutation) => {
- if (mutation.type === 'childList') {
- mutation.addedNodes.forEach((node) => {
- // 确保 node 是一个 Element 类型
- if (node.nodeType === Node.ELEMENT_NODE) {
- const elementNode = node as Element;
- const newAnchorElements = elementNode.querySelectorAll('a');
-
- // 遍历并获取 href 属性
- const newHrefs = Array.from(newAnchorElements).map((anchor) => {
- // 明确 anchor 是 HTMLAnchorElement 类型
- return (anchor as HTMLAnchorElement).href;
- });
-
- // 处理新的 hrefs
- console.log('New hrefs:', newHrefs);
- }
- });
- }
- });
- });
-
- // 开始观察 thirdElement 的子元素
- observer.observe(thirdElement, { childList: true });
-
- // 现有元素的处理逻辑
- const targetElements = thirdElement.querySelectorAll('section > div > div > div');
- targetElements.forEach(function (element, index) {
- // const htmlElement = element as HTMLElement;
- const anchorElements = element.querySelectorAll('a');
- const hrefs = Array.from(anchorElements).map((anchor) => anchor.href);
- console.log('Element ' + (index + 1) + ' links: ', hrefs);
- });
- }, 3000); // 3000毫秒后执行,即3秒
+ setInterval(() => {
+ addTwitterComponent();
+ }, 1000); // 每秒执行一次
+
+ // 也可以根据需要设置 clearInterval
+ // clearInterval(intervalId);
+ }, 3000);
});
async function withProxyStore(children: ReactElement, proxyStore: Store): Promise
{
diff --git a/src/content/loginPage/congratulationPage.tsx b/src/content/loginPage/congratulationPage.tsx
new file mode 100644
index 0000000..2db5844
--- /dev/null
+++ b/src/content/loginPage/congratulationPage.tsx
@@ -0,0 +1,71 @@
+import React, { FC } from 'react';
+
+import { NextButton, VerifyButton } from '../../components/buttons/loginButton';
+
+import '../../tailwind.css';
+
+interface CongratulationPageProps {
+ handleButtonClick: () => void; // 定义一个函数类型的属性
+}
+
+const CongratulationPage: FC = ({ handleButtonClick }) => {
+ return (
+
+
+ Congration!
+
+
+ Complete the following tasks to activate your account
+
+
+
+
+
+
+ Follow @Letsmeme on Twitter
+
+
undefined}>
+ verify
+
+
+
+
+
+
+
+
+ Follow @Letsmeme on Twitter
+
+
undefined}>
+ GO
+
+
+
+ Start
+
+
+ );
+};
+
+export default CongratulationPage;
diff --git a/src/content/loginPage/invitePage.tsx b/src/content/loginPage/invitePage.tsx
new file mode 100644
index 0000000..8f7b365
--- /dev/null
+++ b/src/content/loginPage/invitePage.tsx
@@ -0,0 +1,72 @@
+import React, { FC, useState } from 'react';
+import { styled } from '@mui/material/styles';
+import TextField from '@mui/material/TextField';
+
+import { NextButton } from '../../components/buttons/loginButton';
+
+import '../../tailwind.css';
+
+const InviteCodeInput = styled(TextField)({
+ width: '302px',
+ '& label.Mui-focused': {
+ color: '#A0AAB4',
+ },
+ '& .MuiInput-underline:after': {
+ borderBottomColor: '#B2BAC2',
+ },
+ '& .MuiOutlinedInput-root': {
+ '& fieldset': {
+ borderColor: '#E0E3E7',
+ borderRadius: '12px',
+ },
+ '&:hover fieldset': {
+ borderColor: '#B2BAC2',
+ borderRadius: '12px',
+ },
+ '&.Mui-focused fieldset': {
+ borderColor: '#6F7E8C',
+ borderRadius: '12px',
+ },
+ },
+});
+
+interface InvitePageProps {
+ handleButtonClick: (inviteCode: string) => void; // 修改函数类型以接收邀请码作为参数
+}
+
+const InvitePage: FC = ({ handleButtonClick }) => {
+ const [inviteCode, setInviteCode] = useState(''); // 添加状态来存储邀请码
+
+ const handleNextButtonClick = () => {
+ // 在点击事件中获取输入值并调用传入的函数
+ if (inviteCode.trim() !== '') {
+ handleButtonClick(inviteCode); // 传递邀请码给父组件的函数
+ } else {
+ // 如果邀请码为空,可以在这里添加提示或者错误处理
+ alert('Invite code is required.');
+ }
+ };
+ return (
+
+
+ Invite Code
+
+
+ To complete the registration you need to enter an invitation code, we released a small
+ number of invitation codes during the beta period, see our tweets
+
+
) => setInviteCode(e.target.value)}
+ label="Please enter the invitation code"
+ id="custom-css-outlined-input"
+ />
+
+
+ Next
+
+
+ );
+};
+
+export default InvitePage;
diff --git a/src/content/loginPage/signInWithXPage.tsx b/src/content/loginPage/signInWithXPage.tsx
new file mode 100644
index 0000000..d8bf2a9
--- /dev/null
+++ b/src/content/loginPage/signInWithXPage.tsx
@@ -0,0 +1,57 @@
+import React, { FC } from 'react';
+
+import { NextButton } from '../../components/buttons/loginButton';
+
+import '../../tailwind.css';
+
+interface SignInWithXPageProps {
+ handleButtonClick: () => void; // 定义一个函数类型的属性
+}
+
+const SignInWithXPage: FC = ({ handleButtonClick }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+ Log in to your account
+
+
+ Grow with Creators, Win Wealth Together.
+
+
+ Sign in with X
+
+
+ );
+};
+
+export default SignInWithXPage;
diff --git a/src/manifest.ts b/src/manifest.ts
index bf62d40..b325254 100644
--- a/src/manifest.ts
+++ b/src/manifest.ts
@@ -10,11 +10,11 @@ const manifest: ManifestV3Export = {
},
content_scripts: [
{
- matches: ['http://*/*', 'https://*/*', 'file:///*'],
+ matches: ['https://twitter.com/*'],
js: ['src/content/index.tsx'],
},
],
- host_permissions: [''],
+ host_permissions: ['https://twitter.com/*', 'https://x.com/*'],
options_ui: {
page: 'src/options/options.html',
open_in_tab: true,
@@ -25,7 +25,7 @@ const manifest: ManifestV3Export = {
// this file is web accessible; it supports HMR b/c it's declared in `rollupOptions.input`
'src/welcome/welcome.html',
],
- matches: [''],
+ matches: ['https://twitter.com/*', 'https://x.com/*'],
},
],
action: {
diff --git a/src/welcome/Profile/Claim.tsx b/src/welcome/Profile/Claim.tsx
new file mode 100644
index 0000000..977b4bd
--- /dev/null
+++ b/src/welcome/Profile/Claim.tsx
@@ -0,0 +1,229 @@
+import React from 'react';
+import { Divider } from '@mui/material';
+import Table from '@mui/material/Table';
+import TableBody from '@mui/material/TableBody';
+import TableCell from '@mui/material/TableCell';
+import TableContainer from '@mui/material/TableContainer';
+import TableHead from '@mui/material/TableHead';
+import TableRow from '@mui/material/TableRow';
+import { useToggle } from 'ahooks';
+
+import { BasicButton, PrimaryButton } from '../../components/Button';
+import Modal from '../../components/Modal';
+
+const Icon = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+const rows = [
+ {
+ date: '2023/02/01',
+ creator: 'Devon Lane',
+ rank: '#2',
+ total: (
+
+
+ 0.234
+
+ ),
+ reward: (
+
+
+ 0.001
+
+ ),
+ },
+ {
+ date: '2023/02/01',
+ creator: 'Devon Lane',
+ rank: '#2',
+ total: (
+
+
+ 0.234
+
+ ),
+ reward: (
+
+
+ 0.001
+
+ ),
+ },
+ {
+ date: '2023/02/01',
+ creator: 'Devon Lane',
+ rank: '#2',
+ total: (
+
+
+ 0.234
+
+ ),
+ reward: (
+
+
+ 0.001
+
+ ),
+ },
+];
+
+const Claim = () => {
+ const [isOpen, { setLeft: close, setRight: open }] = useToggle(false);
+
+ return (
+ <>
+
+ Claim
+
+
+
+
Claim Reward
+
+
+
+
+
+
+
+
+
+
+
+ Date
+
+
+ Creator
+
+
+ Rank
+
+
+ Total Reward
+
+
+ Your Reward
+
+
+
+
+ {rows.map((row, i) => (
+
+
+ {row.date}
+
+
+ {row.creator}
+
+
+ {row.rank}
+
+
+ {row.total}
+
+
+ {row.reward}
+
+
+ ))}
+
+
+
+
+
+ >
+ );
+};
+
+export default Claim;
diff --git a/src/welcome/Profile/Explore.tsx b/src/welcome/Profile/Explore.tsx
new file mode 100644
index 0000000..eadcd9e
--- /dev/null
+++ b/src/welcome/Profile/Explore.tsx
@@ -0,0 +1,261 @@
+import React from 'react';
+import TabContext from '@mui/lab/TabContext';
+import TabList from '@mui/lab/TabList';
+import TabPanel from '@mui/lab/TabPanel';
+import Box from '@mui/material/Box';
+import Tab from '@mui/material/Tab';
+
+const Icon = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+const Explore = () => {
+ const list = Array(7).fill('');
+
+ const [value, setValue] = React.useState('1');
+
+ const handleChange = (event: React.SyntheticEvent, newValue: string) => {
+ setValue(newValue);
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ {list.map((item, i) => (
+
+ 1
+
+
+
+ JamesXYC@MAP Protocol -Bitcoin
+ @IDOC
+
+
+
+
+ Price
+
+ 2.34
+
+
+
+ Tweet Avg Rank:
+ #3
+
+
+
+
+ ))}
+
+
+
+
+ {list.map((item, i) => (
+
+ 1
+
+
+
+ JamesXYC@MAP Protocol -Bitcoin
+ @IDOC
+
+
+
+
+ Price
+
+ 2.34
+
+
+
+ Tweet Avg Rank:
+ #3
+
+
+
+
+ ))}
+
+
+
+
+ {list.map((item, i) => (
+
+ 1
+
+
+
+ JamesXYC@MAP Protocol -Bitcoin
+ @IDOC
+
+
+
+
+ Price
+
+ 2.34
+
+
+
+ Tweet Avg Rank:
+ #3
+
+
+
+
+ ))}
+
+
+
+
+ {list.map((item, i) => (
+
+ 2024/01/10 12:14
+
+
+
+
+
@Devon
+
+
+
Bought
+
+
+
+
@Devon
+
+
+
+
+
+2 Shares
+
+
+ - 0.2025
+
+
+
+
+ ))}
+
+
+
+
+ );
+};
+
+export default Explore;
diff --git a/src/welcome/Profile/History.tsx b/src/welcome/Profile/History.tsx
new file mode 100644
index 0000000..cb7ac03
--- /dev/null
+++ b/src/welcome/Profile/History.tsx
@@ -0,0 +1,228 @@
+import React from 'react';
+import { Divider } from '@mui/material';
+import Table from '@mui/material/Table';
+import TableBody from '@mui/material/TableBody';
+import TableCell from '@mui/material/TableCell';
+import TableContainer from '@mui/material/TableContainer';
+import TableHead from '@mui/material/TableHead';
+import TableRow from '@mui/material/TableRow';
+import { useToggle } from 'ahooks';
+
+import { BasicButton } from '../../components/Button';
+import Modal from '../../components/Modal';
+
+const Icon = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+const rows = [
+ {
+ date: '2023/02/01',
+ creator: 'Devon Lane',
+ rank: '#2',
+ total: (
+
+
+ 0.234
+
+ ),
+ reward: (
+
+
+ 0.001
+
+ ),
+ },
+ {
+ date: '2023/02/01',
+ creator: 'Devon Lane',
+ rank: '#2',
+ total: (
+
+
+ 0.234
+
+ ),
+ reward: (
+
+
+ 0.001
+
+ ),
+ },
+ {
+ date: '2023/02/01',
+ creator: 'Devon Lane',
+ rank: '#2',
+ total: (
+
+
+ 0.234
+
+ ),
+ reward: (
+
+
+ 0.001
+
+ ),
+ },
+];
+
+const History = () => {
+ const [isOpen, { setLeft: close, setRight: open }] = useToggle(false);
+
+ return (
+ <>
+
+ History
+
+
+
+
Claim History
+
+
+
+
+
+
+
+
+
+
+
+ Date
+
+
+ Creator
+
+
+ Rank
+
+
+ Total Reward
+
+
+ Your Reward
+
+
+
+
+ {rows.map((row, i) => (
+
+
+ {row.date}
+
+
+ {row.creator}
+
+
+ {row.rank}
+
+
+ {row.total}
+
+
+ {row.reward}
+
+
+ ))}
+
+
+
+
+
+ >
+ );
+};
+
+export default History;
diff --git a/src/welcome/Profile/Reward.tsx b/src/welcome/Profile/Reward.tsx
new file mode 100644
index 0000000..89eb817
--- /dev/null
+++ b/src/welcome/Profile/Reward.tsx
@@ -0,0 +1,191 @@
+import React from 'react';
+import TabContext from '@mui/lab/TabContext';
+import TabList from '@mui/lab/TabList';
+import TabPanel from '@mui/lab/TabPanel';
+import { Divider } from '@mui/material';
+import Box from '@mui/material/Box';
+import Tab from '@mui/material/Tab';
+
+import Claim from './Claim';
+import History from './History';
+
+const Icon = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+const Reward = () => {
+ const list = Array(7).fill('');
+ const [value, setValue] = React.useState('1');
+
+ const handleChange = (event: React.SyntheticEvent, newValue: string) => {
+ setValue(newValue);
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+
+ 0.4
+
+
Your Reward
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export default Reward;
diff --git a/src/welcome/Profile/index.tsx b/src/welcome/Profile/index.tsx
new file mode 100644
index 0000000..ae47752
--- /dev/null
+++ b/src/welcome/Profile/index.tsx
@@ -0,0 +1,136 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+import React, { useState } from 'react';
+
+import Explore from './Explore';
+import Reward from './Reward';
+
+const Profile = (props: { handleButtonClick?: () => void }) => {
+ const [key, setKey] = useState('explore');
+
+ const tapMap = [
+ {
+ title: 'explore',
+ onClick: () => setKey('explore'),
+ },
+ {
+ title: 'community',
+ onClick: () => setKey('community'),
+ },
+ {
+ title: 'reward',
+ onClick: () => setKey('reward'),
+ },
+ ];
+
+ const componentMap: Record = {
+ explore: ,
+ reward: ,
+ };
+
+ return (
+
+
+
+
+
+
Holding:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
0.02
+
+
+
props.handleButtonClick?.()}
+ className="px-4 py-1 flex items-center justify-center rounded-full border border-black text-[15px] font-medium cursor-pointer"
+ >
+ Wallet
+
+
+
+
+ {tapMap.map((item, i) => (
+
+ {item.title}
+
+ ))}
+
+
+ {componentMap[key]}
+
+ );
+};
+
+export default Profile;
diff --git a/src/welcome/Wallet/BuyModal.tsx b/src/welcome/Wallet/BuyModal.tsx
new file mode 100644
index 0000000..2ba5f2a
--- /dev/null
+++ b/src/welcome/Wallet/BuyModal.tsx
@@ -0,0 +1,163 @@
+import React from 'react';
+import { Divider } from '@mui/material';
+import { useToggle } from 'ahooks';
+
+import { BasicButton, PrimaryButton } from '../../components/Button';
+import Modal from '../../components/Modal';
+
+const Icon = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+const Left = () => (
+
+
+
+
+);
+
+const BuyModal = () => {
+ const [isOpen, { setLeft: close, setRight: open }] = useToggle(false);
+
+ return (
+ <>
+
+ Buy
+
+
+
+
Buy Shares of Willaim
+
+
+
+ Price:
+
+ 0.2
+
+
+
+ Amount
+ 2
+
+
+
+ Minimum unit:
+ 0.1
+
+
+
+
+
+
+ From
+ 0x41...64fd
+
+
+ To
+ 0x41...64fd
+
+
+
Transaction Fee
+
+
+ 0.002
+
+
+
+
Est. Gas Fee
+
+
+ 0.002
+
+
+
+
+
+
+
+
+
You Pay(Including Fees)
+
+
+ 0.052
+
+
+
+
Wallet Balance
+
+
+ 20.2928
+
+
+
+
+
+
+
+
+ Go Back
+
+
+
+ Buy
+
+
+
+
+ >
+ );
+};
+
+export default BuyModal;
diff --git a/src/welcome/Wallet/Deposit.tsx b/src/welcome/Wallet/Deposit.tsx
new file mode 100644
index 0000000..73fae20
--- /dev/null
+++ b/src/welcome/Wallet/Deposit.tsx
@@ -0,0 +1,91 @@
+import React from 'react';
+import { useToggle } from 'ahooks';
+
+import { BasicButton, PrimaryButton } from '../../components/Button';
+import Modal from '../../components/Modal';
+
+const Left = () => (
+
+
+
+
+);
+
+const Deposit = () => {
+ const [isOpen, { setLeft: close, setRight: open }] = useToggle(false);
+
+ return (
+ <>
+
+ Deposit
+
+
+
+
Deposit
+
+
+
+
+
+
Address
+
+ 0x415eB....c2764fd
+
+
+
+
+
+
+
+
+ Go Back
+
+
+
+ Transfer
+
+
+
+
+ >
+ );
+};
+
+export default Deposit;
diff --git a/src/welcome/Wallet/InviteFriends.tsx b/src/welcome/Wallet/InviteFriends.tsx
new file mode 100644
index 0000000..02c86cc
--- /dev/null
+++ b/src/welcome/Wallet/InviteFriends.tsx
@@ -0,0 +1,132 @@
+import React from 'react';
+import Table from '@mui/material/Table';
+import TableBody from '@mui/material/TableBody';
+import TableCell from '@mui/material/TableCell';
+import TableContainer from '@mui/material/TableContainer';
+import TableHead from '@mui/material/TableHead';
+import TableRow from '@mui/material/TableRow';
+import { useToggle } from 'ahooks';
+
+import { BasicButton } from '../../components/Button';
+import Modal from '../../components/Modal';
+
+const Copy = () => (
+
+
+
+
+);
+
+const rows = [
+ {
+ time: 'Jan 05 2024, 14:32',
+ user: 'Cody Fisher',
+ value: 0.001,
+ },
+ {
+ time: 'Jan 05 2024, 14:32',
+ user: 'Cody Fisher',
+ value: 0.001,
+ },
+ {
+ time: 'Jan 05 2024, 14:32',
+ user: 'Cody Fisher',
+ value: 0.001,
+ },
+];
+
+const InviteFriends = () => {
+ const [isOpen, { setLeft: close, setRight: open }] = useToggle(false);
+
+ return (
+ <>
+
+ Invite Friends
+
+
+
+
Invite Friends
+
+
+
+
+
+
+
+
+ Invite Points
+ 0.05
+
+
+
+
+
+
+
+ 0x415eB....c2764fd
+
+
+
+ Copy Invite Code
+
+
+
+
+
+
+
+
+
+ Holder
+ Hold shares
+ Shares Value
+
+
+
+ {rows.map((row, i) => (
+
+
+ {row.time}
+
+ {row.user}
+ {row.value}
+
+ ))}
+
+
+
+
+
+ >
+ );
+};
+
+export default InviteFriends;
diff --git a/src/welcome/Wallet/Profile.tsx b/src/welcome/Wallet/Profile.tsx
new file mode 100644
index 0000000..f53c8d6
--- /dev/null
+++ b/src/welcome/Wallet/Profile.tsx
@@ -0,0 +1,198 @@
+import React, { useState } from 'react';
+import Table from '@mui/material/Table';
+import TableBody from '@mui/material/TableBody';
+import TableCell from '@mui/material/TableCell';
+import TableContainer from '@mui/material/TableContainer';
+import TableHead from '@mui/material/TableHead';
+import TableRow from '@mui/material/TableRow';
+import { useToggle } from 'ahooks';
+
+import { BasicButton } from '../../components/Button';
+import Modal from '../../components/Modal';
+
+import BuyModal from './BuyModal';
+import SellModal from './SellModal';
+
+const Icon = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+const rows = [
+ {
+ holder: (
+
+
+
Devon Lane
+
+ ),
+ shares: 1,
+ value: (
+
+
+ 0.002
+
+ ),
+ },
+ {
+ holder: (
+
+
+
Devon Lane
+
+ ),
+ shares: 1,
+ value: (
+
+
+ 0.002
+
+ ),
+ },
+ {
+ holder: (
+
+
+
Devon Lane
+
+ ),
+ shares: 1,
+ value: (
+
+
+ 0.002
+
+ ),
+ },
+];
+
+const ProfileModal = () => {
+ const [isOpen, { setLeft: close, setRight: open }] = useToggle(false);
+ const [key, setKey] = useState(0);
+ const list = [
+ {
+ text: 'Holders (20)',
+ },
+ {
+ text: 'Holders (16)',
+ },
+ {
+ text: ' Tweet Ranking',
+ },
+ ];
+
+ return (
+ <>
+
+ Profile
+
+
+
+
Profile
+
+
+
+
+
+
+
+ Devonkokl
+
+
@Idoc
+
+ Floor Price:
+
+ 0.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {list.map((item, i) => (
+
setKey(i)}
+ key={item.text}
+ className={`rounded-full py-2 px-[18px] font-medium leading-[18px] border border-[#0F1419] ${
+ key === i ? 'bg-[#2C2A2A] text-white' : 'text-[#0F1419] bg-white cursor-pointer'
+ }`}
+ >
+ {item.text}
+
+ ))}
+
+
+
+
+
+
+ Holder
+ Hold shares
+ Shares Value
+
+
+
+ {rows.map((row, i) => (
+
+
+ {row.holder}
+
+ {row.shares}
+ {row.value}
+
+ ))}
+
+
+
+
+
+ >
+ );
+};
+
+export default ProfileModal;
diff --git a/src/welcome/Wallet/SellModal.tsx b/src/welcome/Wallet/SellModal.tsx
new file mode 100644
index 0000000..b94f22c
--- /dev/null
+++ b/src/welcome/Wallet/SellModal.tsx
@@ -0,0 +1,170 @@
+import React from 'react';
+import { Divider } from '@mui/material';
+import { useToggle } from 'ahooks';
+
+import { BasicButton, PrimaryButton } from '../../components/Button';
+import Modal from '../../components/Modal';
+
+const Icon = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+const Left = () => (
+
+
+
+
+);
+
+const SellModal = () => {
+ const [isOpen, { setLeft: close, setRight: open }] = useToggle(false);
+
+ return (
+ <>
+
+ Sell
+
+
+
+
Sell Shares of Willaim
+
+
+
+
+ Price:
+
+ 0.2
+
+
+
+ You Own:
+ 5
+
+
+
+
+ Amount
+ 2
+
+
+
+ Minimum unit:
+ 0.1
+
+
+
+
+
+
+ From
+ 0x41...64fd
+
+
+ To
+ 0x41...64fd
+
+
+
Transaction Fee
+
+
+ 0.002
+
+
+
+
Est. Gas Fee
+
+
+ 0.002
+
+
+
+
+
+
+
+
+
You Pay(Including Fees)
+
+
+ 0.052
+
+
+
+
Wallet Balance
+
+
+ 20.2928
+
+
+
+
+
+
+
+
+ Go Back
+
+
+
+ Buy
+
+
+
+
+ >
+ );
+};
+
+export default SellModal;
diff --git a/src/welcome/Wallet/WithDraw.tsx b/src/welcome/Wallet/WithDraw.tsx
new file mode 100644
index 0000000..a1d3984
--- /dev/null
+++ b/src/welcome/Wallet/WithDraw.tsx
@@ -0,0 +1,126 @@
+import React from 'react';
+import { styled, TextField as MTextField } from '@mui/material';
+import { useToggle } from 'ahooks';
+
+import { BasicButton, PrimaryButton } from '../../components/Button';
+import Modal from '../../components/Modal';
+
+const Icon = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+const TextField = styled(MTextField)({
+ width: '493px',
+ '& label.Mui-focused': {
+ color: '#A0AAB4',
+ },
+ '& .MuiOutlinedInput-root': {
+ '& fieldset': {
+ borderColor: '#E0E3E7',
+ borderRadius: '8px',
+ },
+ '&:hover fieldset': {
+ borderColor: '#9A6CF9',
+ borderRadius: '8px',
+ },
+ '&.Mui-focused fieldset': {
+ borderColor: '#9A6CF9',
+ borderRadius: '8px',
+ },
+ },
+});
+
+const Left = () => (
+
+
+
+
+);
+
+const WithDraw = () => {
+ const [isOpen, { setLeft: close, setRight: open }] = useToggle(false);
+
+ return (
+ <>
+
+ Withdraw
+
+
+
+
Withdraw
+
+
+ Send your ETH to another wallet address on the blast network
+
+
+
+
+
+
+
+
+
Wallet Balance:
+
+
+ 0.02
+
+
+
+
+
+
+ Go Back
+
+
+
+ Transfer
+
+
+
+
+ >
+ );
+};
+
+export default WithDraw;
diff --git a/src/welcome/Wallet/index.tsx b/src/welcome/Wallet/index.tsx
new file mode 100644
index 0000000..24442e2
--- /dev/null
+++ b/src/welcome/Wallet/index.tsx
@@ -0,0 +1,238 @@
+import React from 'react';
+
+import Deposit from './Deposit';
+import InviteFriends from './InviteFriends';
+import WithDraw from './WithDraw';
+
+const Copy = () => (
+
+
+
+
+);
+
+const Network = () => (
+
+
+
+
+
+
+
+
+
+
+);
+
+const WalletIcon = () => (
+
+
+
+
+
+
+);
+
+const Fire = () => (
+
+
+
+);
+
+const Gift = () => (
+
+
+
+
+
+
+
+);
+
+const Icon = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+const GoBack = () => (
+
+
+
+
+);
+
+const Wallet = (props: { handleButtonClick?: () => void }) => {
+ return (
+
+
+
props.handleButtonClick?.()}>
+
+
+
Home
+
+
+
+
+
+
+
@Deovokoejhdnad
+
+ #919099
+
+
+
+ Network:Blast
+
+
+
+
+
+
+
+
+
+
+
+
+ Wallet Balance
+
+
+
+ 390
+
+
+
+
+
+
+ Transaction Fee Earned
+
+
+
+ 0.289
+
+
+
+
+
+
+ Reward Earned
+
+
+
+ 22.9092
+
+
+
+
+
+
+ {/*
*/}
+
+
+
+
+
+
+ Log Out
+
+
+
+
+ );
+};
+
+export default Wallet;
diff --git a/src/welcome/Welcome.tsx b/src/welcome/Welcome.tsx
index 6ce57e7..b2895d2 100644
--- a/src/welcome/Welcome.tsx
+++ b/src/welcome/Welcome.tsx
@@ -1,9 +1,11 @@
import React, { ReactElement } from 'react';
+import Profile from './Profile';
+
const Welcome = (): ReactElement => {
return (
-
-
Welcome
+
);
};
diff --git a/src/welcome/assets/avatar.png b/src/welcome/assets/avatar.png
new file mode 100644
index 0000000..7e288d5
Binary files /dev/null and b/src/welcome/assets/avatar.png differ
diff --git a/src/welcome/index.tsx b/src/welcome/index.tsx
index bebf642..c1d5af2 100644
--- a/src/welcome/index.tsx
+++ b/src/welcome/index.tsx
@@ -1,12 +1,13 @@
import React from 'react';
import { createRoot } from 'react-dom/client';
-import Welcome from './Welcome';
+import Wallet from './Wallet';
import '../tailwind.css';
createRoot(document.getElementById('root') as HTMLElement).render(
-
+ {/* */}
+
);